arcie 0.1.8 → 0.2.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/dev.ts","../src/cli/tui/renderer/start-block-chat.ts","../src/cli/agent-config.ts","../src/cli/tui/prompt-commands.ts","../src/cli/tui/tool-format.ts","../src/cli/tui/renderer/event-to-blocks.ts","../src/cli/tui/markdown.ts","../src/cli/tui/renderer/blocks.ts","../src/cli/tui/renderer/terminal-renderer.ts","../src/server/llm.ts","../src/server/index.ts"],"sourcesContent":["import { spawn, type ChildProcess } from \"node:child_process\";\nimport { createServer } from \"node:http\";\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { discoverAgents, loadAgent, loadAgentById } from \"../loader\";\nimport { discoverAgent } from \"../discover/index\";\nimport { streamAgent } from \"../runner/index\";\nimport { showHeader } from \"./banner\";\nimport { grey, dimmed } from \"./style\";\nimport { startBlockChat } from \"./tui/renderer/start-block-chat\";\nimport { handleSessionsRequest, getProviderApiKey } from \"../server/index\";\n\nexport interface DevOptions {\n port: string;\n agentDir: string;\n input?: boolean;\n /** Skip auto-starting the channels/web/ dev server even when it exists. */\n noWeb?: boolean;\n /** Skip auto-opening the browser at the web channel URL. */\n noOpen?: boolean;\n}\n\nfunction checkProviderKeys(modelId: string): string[] {\n const provider = modelId.split(\"/\")[0];\n const missing: string[] = [];\n\n const keyMap: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n groq: \"GROQ_API_KEY\",\n deepseek: \"DEEPSEEK_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n meta: \"TOGETHER_API_KEY\",\n };\n\n const envVar = keyMap[provider];\n if (envVar && !process.env[envVar] && !getProviderApiKey(provider)) {\n missing.push(envVar);\n }\n\n return missing;\n}\n\nconst MAX_PORT_ATTEMPTS = 10;\n\nfunction tryListen(server: ReturnType<typeof createServer>, port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const onError = (err: NodeJS.ErrnoException) => {\n server.removeListener(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.removeListener(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(port);\n });\n}\n\nasync function listenWithFallback(\n server: ReturnType<typeof createServer>,\n startPort: number,\n): Promise<number> {\n for (let offset = 0; offset < MAX_PORT_ATTEMPTS; offset += 1) {\n const port = startPort + offset;\n try {\n await tryListen(server, port);\n return port;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"EADDRINUSE\") throw err;\n }\n }\n throw new Error(\n `Could not find a free port in ${startPort}..${startPort + MAX_PORT_ATTEMPTS - 1}`,\n );\n}\n\nfunction isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const probe = createServer();\n probe.once(\"error\", () => resolve(false));\n probe.once(\"listening\", () => {\n probe.close(() => resolve(true));\n });\n probe.listen(port);\n });\n}\n\nasync function findFreePort(startPort: number, maxAttempts = MAX_PORT_ATTEMPTS): Promise<number> {\n for (let offset = 0; offset < maxAttempts; offset += 1) {\n const port = startPort + offset;\n if (await isPortFree(port)) return port;\n }\n throw new Error(`No free port in ${startPort}..${startPort + maxAttempts - 1}`);\n}\n\nfunction openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\" ? \"open\"\n : process.platform === \"win32\" ? \"start\"\n : \"xdg-open\";\n try {\n const child = spawn(command, [url], {\n detached: true,\n stdio: \"ignore\",\n shell: process.platform === \"win32\",\n });\n child.unref();\n } catch {\n // Non-fatal: user can copy the URL from the console.\n }\n}\n\nasync function waitForHttp(url: string, timeoutMs = 30_000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n try {\n const res = await fetch(url, { method: \"GET\" });\n if (res.status < 500) return true;\n } catch {\n // fetch throws for connection refused — keep polling\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n return false;\n}\n\ninterface WebChannelHandle {\n readonly url: string;\n readonly process: ChildProcess;\n}\n\n/**\n * Spawns the channels/web/ dev server as a child process, waits for it to\n * come up, and returns a handle the caller can kill on shutdown. Returns\n * undefined when the channel isn't scaffolded, isn't installed, or fails\n * to start in time.\n */\nasync function installWebDeps(webDir: string): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(\"npm\", [\"install\", \"--no-fund\", \"--no-audit\"], {\n cwd: webDir,\n stdio: \"ignore\",\n });\n child.once(\"exit\", (code) => resolve(code === 0));\n child.once(\"error\", () => resolve(false));\n });\n}\n\nasync function startWebChannel(\n agentDir: string,\n arcieUrl: string,\n webPort: number,\n): Promise<WebChannelHandle | undefined> {\n const webDir = join(agentDir, \"channels\", \"web\");\n if (!existsSync(join(webDir, \"package.json\"))) return undefined;\n\n if (!existsSync(join(webDir, \"node_modules\"))) {\n console.log(` ${dimmed(`web installing channels/web deps (first run)…`)}`);\n const installed = await installWebDeps(webDir);\n if (!installed) {\n console.log();\n console.log(` ${grey(\"⚠\")} channels/web install failed — try manually:`);\n console.log(` ${dimmed(` cd ${webDir} && npm install`)}`);\n console.log();\n return undefined;\n }\n }\n\n const child = spawn(\"npm\", [\"run\", \"dev\", \"--\", \"--port\", String(webPort)], {\n cwd: webDir,\n env: { ...process.env, ARCIE_URL: arcieUrl },\n stdio: \"ignore\",\n detached: false,\n });\n\n const url = `http://localhost:${webPort}`;\n const ready = await waitForHttp(url, 45_000);\n if (!ready) {\n console.log();\n console.log(` ${grey(\"⚠\")} channels/web didn't come up within 45s`);\n child.kill();\n return undefined;\n }\n\n return { url, process: child };\n}\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n const agentDirPath = resolve(process.cwd(), options.agentDir);\n const requestedPort = parseInt(options.port, 10);\n\n const streamTurn = async (\n res: import(\"node:http\").ServerResponse,\n body: string,\n agentId: string | undefined,\n ) => {\n try {\n const { message, stream } = JSON.parse(body);\n if (typeof message !== \"string\" || message.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"message is required\" }));\n return;\n }\n if (stream) {\n res.writeHead(200, {\n \"Content-Type\": \"application/x-ndjson\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n const runOpts = agentId !== undefined ? { agentId } : {};\n for await (const event of streamAgent(agentDirPath, message, runOpts)) {\n res.write(JSON.stringify(event) + \"\\n\");\n }\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n const runOpts = agentId !== undefined ? { agentId } : {};\n for await (const _event of streamAgent(agentDirPath, message, runOpts)) {}\n res.end(JSON.stringify({ status: \"ok\" }));\n }\n } catch (err) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: String(err) }));\n }\n };\n\n const listAgents = async () => {\n const discovered = discoverAgents(agentDirPath);\n const summaries = await Promise.all(\n discovered.map(async ({ id }) => {\n try {\n const loaded = await loadAgentById(agentDirPath, id);\n const { config } = loaded.manifest;\n return {\n id,\n name: config.name ?? id,\n model: config.model,\n description: config.description ?? \"\",\n };\n } catch {\n return { id, name: id, model: \"\", description: \"\" };\n }\n }),\n );\n return summaries;\n };\n\n const server = createServer(async (req, res) => {\n if (await handleSessionsRequest(req, res)) return;\n\n const method = req.method ?? \"GET\";\n const url = req.url ?? \"/\";\n\n if (method === \"GET\" && url === \"/agents\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(await listAgents()));\n return;\n }\n\n const agentsMatch = url.match(/^\\/agents\\/([^/?]+)(?:\\?.*)?$/);\n if (method === \"POST\" && agentsMatch !== null) {\n let body = \"\";\n for await (const chunk of req) body += chunk;\n await streamTurn(res, body, decodeURIComponent(agentsMatch[1]!));\n return;\n }\n\n if (method === \"POST\" && url === \"/\") {\n let body = \"\";\n for await (const chunk of req) body += chunk;\n // Route bare POST / to the primary agent for backward compatibility.\n await streamTurn(res, body, undefined);\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n let boundPort: number;\n try {\n boundPort = await listenWithFallback(server, requestedPort);\n } catch (err) {\n console.error();\n console.error(` ${grey(\"✗\")} ${err instanceof Error ? err.message : String(err)}`);\n console.error(` ${dimmed(\"try: arcie dev --port <n> # pick your own starting port\")}`);\n console.error();\n process.exit(1);\n }\n\n const localApiUrl = `http://127.0.0.1:${boundPort}/v1`;\n if (!process.env.CENCORI_API_KEY) process.env.CENCORI_API_KEY = \"local-dev-key\";\n if (!process.env.CENCORI_API_URL) process.env.CENCORI_API_URL = localApiUrl;\n\n if (!options.input) {\n showHeader();\n\n const { diagnostics } = discoverAgent(agentDirPath);\n\n if (diagnostics.some((d) => d.severity === \"error\")) {\n for (const d of diagnostics) {\n console.error(` ${grey(\"✖\")} ${d.code}: ${d.message}`);\n }\n process.exit(1);\n }\n\n for (const d of diagnostics) {\n console.warn(` ${grey(\"⚠\")} ${d.code}: ${d.message}`);\n }\n\n try {\n const agent = await loadAgent(agentDirPath);\n console.log(` ${agentDirPath} ${grey(\"\\xB7\")} ${grey(agent.manifest.config.model)}`);\n console.log();\n if (boundPort !== requestedPort) {\n console.log(\n ` ${grey(\"!\")} port ${requestedPort} was in use ${grey(\"\\xB7\")} using ${boundPort}`,\n );\n console.log();\n }\n console.log(` ${dimmed(`agent http://localhost:${boundPort}`)}`);\n\n const missing = checkProviderKeys(agent.manifest.config.model);\n if (missing.length > 0) {\n console.log();\n console.log(` ${grey(\"⚠\")} Missing API keys: ${missing.join(\", \")}`);\n console.log(` ${dimmed(\" Set them in .env.local or your environment\")}`);\n }\n } catch {\n console.log(` ${agentDirPath}`);\n console.log();\n console.log(` ${dimmed(`agent http://localhost:${boundPort}`)}`);\n }\n }\n\n let webChannel: WebChannelHandle | undefined;\n if (!options.input && options.noWeb !== true) {\n const webDir = join(agentDirPath, \"channels\", \"web\");\n if (existsSync(webDir)) {\n try {\n const webPort = await findFreePort(3001);\n console.log(` ${dimmed(`web starting on http://localhost:${webPort}…`)}`);\n webChannel = await startWebChannel(agentDirPath, `http://localhost:${boundPort}`, webPort);\n if (webChannel !== undefined) {\n console.log(` ${dimmed(`web http://localhost:${webPort}`)}`);\n if (options.noOpen !== true) openBrowser(webChannel.url);\n }\n } catch (err) {\n console.log(\n ` ${grey(\"⚠\")} could not start web channel: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n if (!options.input) {\n console.log();\n console.log(` ${dimmed(\"Ctrl+C to stop\")}`);\n console.log();\n }\n\n const shutdown = () => {\n if (webChannel !== undefined) webChannel.process.kill();\n server.close();\n process.exit(0);\n };\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n\n if (options.input) {\n void startBlockChat({ agentDir: agentDirPath });\n }\n}\n","import { watch, type FSWatcher } from \"node:fs\";\nimport { streamAgent } from \"../../../runner/index\";\nimport { loadAgent } from \"../../../loader\";\nimport { discoverAgent } from \"../../../discover/index\";\nimport {\n listChannels,\n providerKeyStatus,\n readAgentModel,\n writeAgentModel,\n} from \"../../agent-config\";\nimport { scaffoldWebChat } from \"../../scaffold-web-chat\";\nimport type { PromptCommand } from \"../prompt-commands\";\nimport { parsePromptCommand, formatPromptCommandHelp } from \"../prompt-commands\";\nimport { attachKeyStream } from \"../attach-keys\";\nimport { EventTranslator } from \"./event-to-blocks\";\nimport { TerminalRenderer } from \"./terminal-renderer\";\n\ntype ExtensionCommand = Extract<PromptCommand, { type: \"extension\" }>;\ntype LoglevelCommand = Extract<PromptCommand, { type: \"loglevel\" }>;\n\nconst VALID_LOG_MODES = new Set([\"all\", \"stderr\", \"none\"]);\n\nexport interface StartBlockChatOptions {\n readonly agentDir: string;\n readonly initialInput?: string;\n}\n\n/**\n * Runs the block-based dev TUI against a local agent directory. Returns when\n * the user submits `/exit` or presses Ctrl+C. Ownership of raw stdin is\n * scoped to this function; the caller does not need to restore terminal\n * state on exit paths.\n */\nexport async function startBlockChat(options: StartBlockChatOptions): Promise<void> {\n const { agentDir } = options;\n const renderer = new TerminalRenderer();\n const translator = new EventTranslator();\n\n const commitHeader = async () => {\n try {\n const agent = await loadAgent(agentDir);\n const model = agent.manifest.config.model;\n renderer.writeAgentHeader(`arcie · ${agentDir.split(\"/\").pop() ?? \"agent\"} · ${model}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n renderer.writeError(\"Agent load failed\", message);\n }\n };\n\n const { diagnostics } = discoverAgent(agentDir);\n const errorDiags = diagnostics.filter((d) => d.severity === \"error\");\n if (errorDiags.length > 0) {\n for (const d of errorDiags) renderer.writeError(d.code, d.message);\n renderer.stop();\n return;\n }\n\n await commitHeader();\n\n let watcher: FSWatcher | undefined;\n try {\n let reprobeTimer: ReturnType<typeof setTimeout> | undefined;\n watcher = watch(agentDir, { recursive: true }, () => {\n if (reprobeTimer !== undefined) clearTimeout(reprobeTimer);\n reprobeTimer = setTimeout(() => {\n void commitHeader();\n }, 250);\n });\n } catch {\n // A missing fs.watch (e.g. some sandboxes) is not fatal.\n }\n\n const detachKeys = attachKeyStream((key) => renderer.handleKey(key));\n\n const logLevelState = { mode: \"none\" as \"all\" | \"stderr\" | \"none\" };\n\n try {\n if (options.initialInput !== undefined && options.initialInput.length > 0) {\n await streamOneTurn(renderer, translator, agentDir, options.initialInput);\n }\n\n while (true) {\n const text = await renderer.readPrompt();\n if (text === undefined) return;\n const trimmed = text.trim();\n if (trimmed.length === 0) continue;\n\n if (trimmed.startsWith(\"/\")) {\n const command = parsePromptCommand(trimmed);\n if (command === null) {\n renderer.writeCommandInvocation(trimmed, \"error\");\n renderer.writeCommandResult(\"Unknown command — try /help\");\n continue;\n }\n\n if (command.type === \"exit\") {\n renderer.writeCommandInvocation(trimmed);\n return;\n }\n\n renderer.writeCommandInvocation(trimmed);\n\n switch (command.type) {\n case \"help\":\n renderer.writeCommandResult(formatPromptCommandHelp());\n continue;\n case \"clear\":\n case \"new\":\n for (const op of translator.reset()) renderer.apply([op]);\n await commitHeader();\n continue;\n case \"extension\": {\n const outcome = await handleExtension(command, agentDir);\n if (outcome.message.length > 0) renderer.writeCommandResult(outcome.message);\n if (outcome.refresh) await commitHeader();\n continue;\n }\n case \"loglevel\": {\n const outcome = handleLogLevel(command, logLevelState);\n renderer.writeCommandResult(outcome.message);\n continue;\n }\n }\n continue;\n }\n\n await streamOneTurn(renderer, translator, agentDir, trimmed);\n }\n } finally {\n detachKeys();\n watcher?.close();\n renderer.stop();\n }\n}\n\ninterface CommandOutcome {\n readonly message: string;\n /** When true, the caller re-commits the agent header (model / manifest changed). */\n readonly refresh?: boolean;\n}\n\nasync function handleExtension(\n command: ExtensionCommand,\n agentDir: string,\n): Promise<CommandOutcome> {\n const argument = command.argument.trim();\n switch (command.name) {\n case \"model\":\n return handleModel(argument, agentDir);\n case \"provider\":\n return handleProvider(agentDir);\n case \"channels\":\n return handleChannels(argument, agentDir);\n default:\n return { message: `/${command.name} is not supported here` };\n }\n}\n\nfunction handleModel(argument: string, agentDir: string): CommandOutcome {\n const current = readAgentModel(agentDir);\n if (argument.length === 0) {\n const lines = [\n current ? `Current model: ${current}` : \"No model configured in agent/agent.ts\",\n \"Change with: /model <provider/slug>\",\n ];\n return { message: lines.join(\"\\n\") };\n }\n if (current === argument) {\n return { message: `Model is already ${argument}` };\n }\n const changed = writeAgentModel(agentDir, argument);\n if (!changed) {\n return {\n message: \"Could not update agent/agent.ts — file missing or model field not found.\",\n };\n }\n return { message: `Model set to ${argument}`, refresh: true };\n}\n\nfunction handleProvider(agentDir: string): CommandOutcome {\n const status = providerKeyStatus(agentDir);\n const configured = status.filter((row) => row.set);\n if (configured.length === 0) {\n return {\n message: [\n \"No provider keys configured.\",\n \"Edit .env.local to add CENCORI_API_KEY or a direct provider key.\",\n ].join(\"\\n\"),\n };\n }\n const lines = [\"Provider keys:\"];\n for (const row of status) {\n if (row.set) {\n lines.push(` ${row.key} = ${row.masked} (${row.source})`);\n } else {\n lines.push(` ${row.key} — not set`);\n }\n }\n return { message: lines.join(\"\\n\") };\n}\n\nfunction handleChannels(argument: string, agentDir: string): CommandOutcome {\n if (argument.length === 0) {\n const channels = listChannels(agentDir);\n if (channels.length === 0) {\n return {\n message: [\"No channels scaffolded.\", \"Add one with: /channels add web\"].join(\"\\n\"),\n };\n }\n const lines = [\"Channels:\"];\n for (const channel of channels) lines.push(` ${channel.name} — ${channel.path}`);\n lines.push(\"Add another with: /channels add <kind>\");\n return { message: lines.join(\"\\n\") };\n }\n\n const parts = argument.split(/\\s+/);\n const subcommand = parts[0];\n const kind = parts[1];\n if (subcommand !== \"add\") {\n return { message: `Unknown subcommand '${subcommand}' — try: /channels add web` };\n }\n if (kind !== \"web\") {\n return {\n message: `Unsupported channel kind '${kind ?? \"\"}' — only 'web' is supported`,\n };\n }\n try {\n const result = scaffoldWebChat(agentDir);\n if (result.alreadyExisted) {\n return { message: `channels/web already exists at ${result.targetPath}` };\n }\n return {\n message: [\n `Scaffolded ${result.targetPath}`,\n \"Next: cd into it, npm install, npm run dev\",\n ].join(\"\\n\"),\n };\n } catch (err) {\n return {\n message: `Channel scaffold failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction handleLogLevel(\n command: LoglevelCommand,\n state: { mode: \"all\" | \"stderr\" | \"none\" },\n): CommandOutcome {\n const argument = command.argument.trim();\n if (argument.length === 0) {\n return {\n message: [\n `Log level: ${state.mode}`,\n \"Change with: /loglevel all | stderr | none\",\n \"Note: arcie does not currently capture subprocess logs.\",\n ].join(\"\\n\"),\n };\n }\n if (!VALID_LOG_MODES.has(argument)) {\n return { message: `Invalid log level '${argument}' — pick one of: all, stderr, none` };\n }\n state.mode = argument as \"all\" | \"stderr\" | \"none\";\n return {\n message: [\n `Log level: ${state.mode}`,\n \"Note: arcie does not currently capture subprocess logs.\",\n ].join(\"\\n\"),\n };\n}\n\nasync function streamOneTurn(\n renderer: TerminalRenderer,\n translator: EventTranslator,\n agentDir: string,\n message: string,\n): Promise<void> {\n let sawApproval = false;\n try {\n for await (const event of streamAgent(agentDir, message)) {\n const ops = translator.feed(event);\n renderer.apply(ops);\n if (\n event.type === \"tool.completed\" &&\n event.data.status === \"pending\" &&\n event.data.error?.code === \"needs_approval\"\n ) {\n sawApproval = true;\n }\n }\n if (sawApproval) {\n renderer.writeNotice(\n \"Tool call awaiting approval — approve via the Cencori sessions API to continue.\",\n );\n }\n } catch (err) {\n const detail = err instanceof Error ? err.stack : undefined;\n renderer.apply([\n {\n type: \"commit\",\n block: {\n kind: \"error\",\n title: \"Stream error\",\n body: err instanceof Error ? err.message : String(err),\n detail,\n },\n },\n ]);\n }\n}\n\n","import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport function agentSourcePath(agentDir: string): string {\n return join(agentDir, \"agent\", \"agent.ts\");\n}\n\nexport function envLocalPath(agentDir: string): string {\n return join(agentDir, \".env.local\");\n}\n\nexport function readAgentModel(agentDir: string): string | undefined {\n const path = agentSourcePath(agentDir);\n if (!existsSync(path)) return undefined;\n try {\n const content = readFileSync(path, \"utf-8\");\n return content.match(/model:\\s*\"([^\"]+)\"/)?.[1];\n } catch {\n return undefined;\n }\n}\n\nexport function writeAgentModel(agentDir: string, model: string): boolean {\n const path = agentSourcePath(agentDir);\n if (!existsSync(path)) return false;\n const content = readFileSync(path, \"utf-8\");\n const updated = content.replace(/model:\\s*\"[^\"]+\"/, `model: \"${model}\"`);\n if (updated === content) return false;\n writeFileSync(path, updated);\n return true;\n}\n\nexport const PROVIDER_KEYS = [\n \"CENCORI_API_KEY\",\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"GROQ_API_KEY\",\n \"DEEPSEEK_API_KEY\",\n \"MISTRAL_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"TOGETHER_API_KEY\",\n] as const;\n\nexport type ProviderKey = (typeof PROVIDER_KEYS)[number];\n\nexport interface ProviderKeyStatus {\n readonly key: string;\n readonly set: boolean;\n readonly source?: \"env\" | \"file\";\n readonly masked?: string;\n}\n\nexport function providerKeyStatus(agentDir: string): ProviderKeyStatus[] {\n const fileValues = readEnvLocal(agentDir);\n return PROVIDER_KEYS.map((key) => {\n const envValue = process.env[key];\n if (envValue && envValue.length > 0) {\n return { key, set: true, source: \"env\" as const, masked: maskSecret(envValue) };\n }\n const fileValue = fileValues[key];\n if (fileValue && fileValue.length > 0) {\n return { key, set: true, source: \"file\" as const, masked: maskSecret(fileValue) };\n }\n return { key, set: false };\n });\n}\n\nexport function readEnvLocal(agentDir: string): Record<string, string> {\n const envPath = envLocalPath(agentDir);\n if (!existsSync(envPath)) return {};\n const values: Record<string, string> = {};\n for (const line of readFileSync(envPath, \"utf-8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"#\") || !trimmed.includes(\"=\")) continue;\n const eq = trimmed.indexOf(\"=\");\n const key = trimmed.slice(0, eq).trim();\n const value = trimmed.slice(eq + 1).trim();\n if (key && value) values[key] = value;\n }\n return values;\n}\n\n/**\n * Writes `key=value` to `.env.local`, replacing an existing declaration\n * (commented or not) or appending a new line. Returns true if the file was\n * changed.\n */\nexport function upsertEnvLocal(agentDir: string, key: string, value: string): boolean {\n const envPath = envLocalPath(agentDir);\n if (!existsSync(envPath)) {\n writeFileSync(envPath, `${key}=${value}\\n`);\n return true;\n }\n const content = readFileSync(envPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n let replaced = false;\n const updated = lines.map((line) => {\n const trimmed = line.trim();\n if (trimmed.startsWith(`# ${key}=`) || trimmed.startsWith(`${key}=`)) {\n replaced = true;\n return `${key}=${value}`;\n }\n return line;\n });\n if (!replaced) updated.push(`${key}=${value}`);\n const next = updated.join(\"\\n\") + (updated.at(-1) === \"\" ? \"\" : \"\\n\");\n if (next === content) return false;\n writeFileSync(envPath, next);\n return true;\n}\n\nexport interface ChannelSummary {\n readonly name: string;\n readonly path: string;\n}\n\nexport function listChannels(agentDir: string): ChannelSummary[] {\n const channelsDir = join(agentDir, \"channels\");\n if (!existsSync(channelsDir)) return [];\n try {\n return readdirSync(channelsDir)\n .filter((entry) => {\n const full = join(channelsDir, entry);\n return statSync(full).isDirectory();\n })\n .map((name) => ({ name, path: join(channelsDir, name) }));\n } catch {\n return [];\n }\n}\n\nfunction maskSecret(value: string): string {\n if (value.length <= 8) return \"•\".repeat(value.length);\n return `${value.slice(0, 4)}${\"•\".repeat(6)}${value.slice(-4)}`;\n}\n","export type PromptCommandExtensionName = \"model\" | \"provider\" | \"channels\";\n\nexport type PromptCommand =\n | { type: \"new\" }\n | { type: \"exit\" }\n | { type: \"help\" }\n | { type: \"clear\" }\n | { type: \"loglevel\"; argument: string }\n | { type: \"extension\"; name: PromptCommandExtensionName; argument: string };\n\nexport interface PromptCommandSpec {\n readonly name: string;\n readonly aliases: readonly string[];\n readonly description: string;\n readonly argumentHint?: string;\n readonly takesArgument: boolean;\n readonly build: (argument: string) => PromptCommand;\n}\n\nconst PROMPT_COMMAND_DEFINITIONS = [\n {\n name: \"help\",\n aliases: [],\n description: \"Show available commands\",\n takesArgument: false,\n build: () => ({ type: \"help\" }),\n },\n {\n name: \"new\",\n aliases: [],\n description: \"Start a fresh session\",\n takesArgument: false,\n build: () => ({ type: \"new\" }),\n },\n {\n name: \"clear\",\n aliases: [],\n description: \"Clear the screen\",\n takesArgument: false,\n build: () => ({ type: \"clear\" }),\n },\n {\n name: \"model\",\n aliases: [],\n description: \"Show or change the agent's model\",\n argumentHint: \"[provider/slug]\",\n takesArgument: true,\n build: (argument) => ({ type: \"extension\", name: \"model\", argument }),\n },\n {\n name: \"provider\",\n aliases: [],\n description: \"Show provider API key status\",\n takesArgument: false,\n build: () => ({ type: \"extension\", name: \"provider\", argument: \"\" }),\n },\n {\n name: \"channels\",\n aliases: [],\n description: \"List or add chat channels\",\n argumentHint: \"[add web]\",\n takesArgument: true,\n build: (argument) => ({ type: \"extension\", name: \"channels\", argument }),\n },\n {\n name: \"loglevel\",\n aliases: [],\n description: \"Show or hide captured stdout/stderr logs\",\n argumentHint: \"[all|stderr|none]\",\n takesArgument: true,\n build: (argument) => ({ type: \"loglevel\", argument }),\n },\n {\n name: \"exit\",\n aliases: [\"quit\"],\n description: \"Quit the TUI\",\n takesArgument: false,\n build: () => ({ type: \"exit\" }),\n },\n] satisfies readonly PromptCommandSpec[];\n\nexport const PROMPT_COMMANDS: readonly PromptCommandSpec[] = PROMPT_COMMAND_DEFINITIONS;\n\nexport function parsePromptCommand(prompt: string): PromptCommand | null {\n const trimmed = prompt.trim();\n if (!trimmed.startsWith(\"/\")) return null;\n for (const spec of PROMPT_COMMANDS) {\n for (const alias of [spec.name, ...spec.aliases]) {\n const token = `/${alias}`;\n if (trimmed === token) return spec.build(\"\");\n if (spec.takesArgument && trimmed.startsWith(`${token} `)) {\n return spec.build(trimmed.slice(token.length).trim());\n }\n }\n }\n return null;\n}\n\nexport function isPromptControlCommand(prompt: string): boolean {\n return parsePromptCommand(prompt) !== null;\n}\n\nexport function formatPromptCommandHelp(\n commands: readonly PromptCommandSpec[] = PROMPT_COMMANDS,\n): string {\n const entries = commands.map((spec) => {\n const hint = spec.argumentHint === undefined ? \"\" : ` ${spec.argumentHint}`;\n const aliases = spec.aliases.map((alias) => ` (/${alias})`).join(\"\");\n return { invocation: `/${spec.name}${hint}${aliases}`, description: spec.description };\n });\n const column = Math.max(...entries.map((entry) => entry.invocation.length)) + 2;\n return entries.map((entry) => entry.invocation.padEnd(column) + entry.description).join(\"\\n\");\n}\n\nexport function matchingCommands(\n commands: readonly PromptCommandSpec[],\n text: string,\n): readonly PromptCommandSpec[] {\n if (!text.startsWith(\"/\") || /\\s/.test(text)) return [];\n const rest = text.slice(1);\n return commands.filter((spec) =>\n [spec.name, ...spec.aliases].some((token) => token.startsWith(rest)),\n );\n}\n","import { stripTerminalControls } from \"../ui/terminal-text\";\n\nconst ELLIPSIS = \"…\";\n\nexport function summarizeToolArgs(input: unknown, maxLength = 80): string {\n if (input === undefined || input === null) return \"\";\n\n if (typeof input !== \"object\") return truncate(formatScalar(input), maxLength);\n if (Array.isArray(input)) return truncate(`[${input.length}]`, maxLength);\n\n const entries = Object.entries(input as Record<string, unknown>);\n if (entries.length === 0) return \"\";\n\n const parts: string[] = [];\n for (const [key, value] of entries) {\n parts.push(`${stripTerminalControls(key)}=${formatInlineValue(value)}`);\n }\n\n return truncate(parts.join(\" \"), maxLength);\n}\n\nexport function summarizeToolResult(output: unknown, maxLength = 80): string {\n if (output === undefined || output === null) return \"\";\n\n if (typeof output === \"string\") {\n const firstLine = output.split(\"\\n\").find((line) => line.trim().length > 0) ?? \"\";\n return truncate(firstLine.trim(), maxLength);\n }\n\n if (typeof output !== \"object\") return truncate(formatScalar(output), maxLength);\n\n if (Array.isArray(output)) {\n return truncate(`${output.length} ${output.length === 1 ? \"item\" : \"items\"}`, maxLength);\n }\n\n const record = output as Record<string, unknown>;\n for (const key of [\"result\", \"text\", \"message\", \"summary\", \"value\", \"output\"]) {\n const value = record[key];\n if (value !== undefined && typeof value !== \"object\") {\n return truncate(`${formatScalar(value)}`, maxLength);\n }\n }\n\n const keys = Object.keys(record);\n if (keys.length === 0) return \"{}\";\n\n const inline = keys\n .slice(0, 3)\n .map((key) => `${key}=${formatInlineValue(record[key])}`)\n .join(\" \");\n return truncate(keys.length > 3 ? `${inline} ${ELLIPSIS}` : inline, maxLength);\n}\n\nexport function formatValuePretty(value: unknown): string {\n if (typeof value === \"string\") return stripTerminalControls(value);\n try {\n return stripTerminalControls(JSON.stringify(value, null, 2) ?? String(value));\n } catch {\n return stripTerminalControls(String(value));\n }\n}\n\nfunction formatInlineValue(value: unknown): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n if (typeof value === \"string\") return `\"${truncate(value, 32)}\"`;\n if (typeof value === \"object\") {\n return Array.isArray(value) ? `[${value.length}]` : \"{…}\";\n }\n return formatScalar(value);\n}\n\nfunction formatScalar(value: unknown): string {\n if (typeof value === \"string\") return stripTerminalControls(value);\n return stripTerminalControls(String(value));\n}\n\nexport function truncate(text: string, maxLength: number): string {\n const collapsed = stripTerminalControls(text).replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLength) return collapsed;\n return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}${ELLIPSIS}`;\n}\n","import type { StreamEvent } from \"../../../protocol/events\";\nimport type { Block } from \"./blocks\";\nimport { summarizeToolArgs, summarizeToolResult } from \"../tool-format\";\n\nexport type BlockOp =\n | { type: \"commit\"; block: Block }\n | { type: \"start-live\"; block: Block }\n | { type: \"update-live\"; id: string; patch: Partial<Block> }\n | { type: \"end-live\"; id: string }\n | { type: \"clear-live\"; id: string };\n\nexport interface TranslatorOptions {\n /** Auto-collapse a live reasoning block when the assistant starts speaking. Default true. */\n readonly autoCollapseReasoning?: boolean;\n}\n\n/**\n * Pure(ish) fold from `StreamEvent`s to `BlockOp`s.\n *\n * Owns just enough state to correlate stream events with live blocks: the\n * currently streaming assistant / reasoning blocks per level, an in-flight\n * tool map keyed by `callId`, and a subagent depth stack. Every method takes\n * one event and returns the ops that should be applied to the renderer's\n * block store.\n */\nexport class EventTranslator {\n readonly #autoCollapseReasoning: boolean;\n #nextId = 0;\n #currentAssistantId: string | undefined;\n #currentReasoningId: string | undefined;\n #toolIds = new Map<string, string>();\n #subagentStack: string[] = [];\n\n constructor(options: TranslatorOptions = {}) {\n this.#autoCollapseReasoning = options.autoCollapseReasoning ?? true;\n }\n\n get depth(): number {\n return this.#subagentStack.length;\n }\n\n reset(): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentAssistantId !== undefined) {\n ops.push({ type: \"end-live\", id: this.#currentAssistantId });\n }\n if (this.#currentReasoningId !== undefined) {\n ops.push({ type: \"end-live\", id: this.#currentReasoningId });\n }\n for (const [, id] of this.#toolIds) ops.push({ type: \"end-live\", id });\n for (const id of this.#subagentStack) ops.push({ type: \"end-live\", id });\n this.#currentAssistantId = undefined;\n this.#currentReasoningId = undefined;\n this.#toolIds.clear();\n this.#subagentStack = [];\n return ops;\n }\n\n feed(event: StreamEvent): BlockOp[] {\n switch (event.type) {\n case \"session.started\":\n case \"session.waiting\":\n case \"session.completed\":\n case \"turn.started\":\n case \"turn.completed\":\n case \"step.started\":\n case \"step.completed\":\n return [];\n case \"message.received\":\n return this.#onUserMessage(event.data.message);\n case \"message.appended\":\n return this.#onAssistantDelta(event.data.delta);\n case \"message.completed\":\n return this.#endAssistant(event.data.text ?? undefined);\n case \"reasoning.appended\":\n return this.#onReasoningDelta(event.data.delta);\n case \"reasoning.completed\":\n return this.#endReasoning(event.data.text);\n case \"tool.started\":\n return this.#onToolStarted(event.data.name, event.data.callId, event.data.input);\n case \"tool.completed\":\n return this.#onToolCompleted(\n event.data.callId,\n event.data.status,\n event.data.output,\n event.data.error?.message,\n event.data.error?.code,\n );\n case \"subagent.called\":\n return this.#onSubagentCalled(event.data.name, event.data.callId);\n case \"subagent.completed\":\n return this.#onSubagentCompleted(event.data.callId, event.data.output);\n case \"step.failed\":\n case \"turn.failed\":\n case \"session.failed\":\n return this.#onFailure(event.data.code, event.data.message);\n }\n }\n\n #id(prefix: string): string {\n this.#nextId += 1;\n return `${prefix}-${this.#nextId}`;\n }\n\n #onUserMessage(message: string): BlockOp[] {\n const ops = this.#closeReasoningIfLive();\n ops.push({\n type: \"commit\",\n block: { kind: \"user\", body: message, depth: this.depth },\n });\n return ops;\n }\n\n #onAssistantDelta(delta: string): BlockOp[] {\n const ops = this.#closeReasoningIfLive();\n if (this.#currentAssistantId === undefined) {\n const id = this.#id(\"assistant\");\n this.#currentAssistantId = id;\n ops.push({\n type: \"start-live\",\n block: this.#assistantKind({ kind: \"assistant\", id, body: delta, live: true, depth: this.depth }),\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: withDelta(delta),\n });\n }\n return ops;\n }\n\n #endAssistant(text: string | undefined): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentAssistantId === undefined) return ops;\n if (text !== undefined && text.length > 0) {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: { body: text, live: false },\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: { live: false },\n });\n }\n ops.push({ type: \"end-live\", id: this.#currentAssistantId });\n this.#currentAssistantId = undefined;\n return ops;\n }\n\n #onReasoningDelta(delta: string): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentReasoningId === undefined) {\n const id = this.#id(\"reasoning\");\n this.#currentReasoningId = id;\n ops.push({\n type: \"start-live\",\n block: this.#assistantKind({\n kind: \"reasoning\",\n id,\n body: delta,\n live: true,\n collapsed: false,\n depth: this.depth,\n }),\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentReasoningId,\n patch: withDelta(delta),\n });\n }\n return ops;\n }\n\n #endReasoning(text: string): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentReasoningId === undefined) return ops;\n ops.push({\n type: \"update-live\",\n id: this.#currentReasoningId,\n patch: { body: text, live: false, collapsed: this.#autoCollapseReasoning },\n });\n ops.push({ type: \"end-live\", id: this.#currentReasoningId });\n this.#currentReasoningId = undefined;\n return ops;\n }\n\n #closeReasoningIfLive(): BlockOp[] {\n if (this.#currentReasoningId === undefined || !this.#autoCollapseReasoning) return [];\n const id = this.#currentReasoningId;\n this.#currentReasoningId = undefined;\n return [\n { type: \"update-live\", id, patch: { collapsed: true, live: false } },\n { type: \"end-live\", id },\n ];\n }\n\n #onToolStarted(name: string, callId: string, input: unknown): BlockOp[] {\n const id = this.#id(\"tool\");\n this.#toolIds.set(callId, id);\n const inSubagent = this.depth > 0;\n const args = summarizeToolArgs(input, 80);\n return [\n {\n type: \"start-live\",\n block: {\n kind: inSubagent ? \"subagent-tool\" : \"tool\",\n id,\n title: name,\n subtitle: args,\n toolInput: input,\n status: \"running\",\n live: true,\n depth: this.depth,\n },\n },\n ];\n }\n\n #onToolCompleted(\n callId: string,\n status: string,\n output: unknown,\n errorMessage: string | undefined,\n errorCode: string | undefined,\n ): BlockOp[] {\n const id = this.#toolIds.get(callId);\n if (id === undefined) return [];\n const isApproval = status === \"pending\" && errorCode === \"needs_approval\";\n if (isApproval) {\n // Approval state stays live: the tool call has not resolved, and the\n // runner has yielded `session.waiting` to pause the stream. The block\n // sits with an `approval` glyph until the user resumes the session.\n return [\n {\n type: \"update-live\",\n id,\n patch: {\n status: \"approval\",\n result: errorMessage ?? \"awaiting approval\",\n },\n },\n ];\n }\n this.#toolIds.delete(callId);\n const ok = status === \"completed\";\n const patch: Partial<Block> = {\n status: ok ? \"done\" : \"error\",\n toolOutput: ok ? output : undefined,\n result: ok ? summarizeToolResult(output, 80) : errorMessage ?? \"failed\",\n live: false,\n };\n return [\n { type: \"update-live\", id, patch },\n { type: \"end-live\", id },\n ];\n }\n\n #onSubagentCalled(name: string, callId: string): BlockOp[] {\n const id = this.#id(\"subagent\");\n this.#subagentStack.push(id);\n return [\n {\n type: \"commit\",\n block: {\n kind: \"subagent\",\n id,\n title: name,\n depth: this.depth - 1,\n },\n },\n ];\n }\n\n #onSubagentCompleted(_callId: string, output: string): BlockOp[] {\n if (this.#subagentStack.length === 0) return [];\n this.#subagentStack.pop();\n if (output && output.length > 0) {\n return [\n {\n type: \"commit\",\n block: {\n kind: \"subagent-step\",\n body: output,\n depth: this.depth,\n },\n },\n ];\n }\n return [];\n }\n\n #onFailure(code: string, message: string): BlockOp[] {\n return [\n {\n type: \"commit\",\n block: {\n kind: \"error\",\n title: code,\n body: message,\n depth: this.depth,\n },\n },\n ];\n }\n\n #assistantKind<B extends Block>(block: B): B {\n return this.depth > 0 && block.kind === \"assistant\"\n ? ({ ...block, kind: \"subagent-step\" } as unknown as B)\n : block;\n }\n}\n\nconst DELTA_KEY = \"__delta\" as const;\n\nfunction withDelta(delta: string): Partial<Block> {\n return { [DELTA_KEY]: delta } as unknown as Partial<Block>;\n}\n\n/**\n * Applies a `BlockOp` to a mutable block store. The store keeps `live` blocks\n * as an insertion-ordered map (for live-region redraw) and `committed` blocks\n * as an append-only array (for scrollback). `commit` from the store is\n * whatever rows should be flushed to `LiveRegion.commit`.\n */\nexport interface BlockStore {\n readonly live: ReadonlyMap<string, Block>;\n readonly justCommitted: readonly Block[];\n apply(op: BlockOp): void;\n drainCommitted(): Block[];\n}\n\nexport function createBlockStore(): BlockStore {\n const live = new Map<string, Block>();\n let justCommitted: Block[] = [];\n\n return {\n get live() {\n return live;\n },\n get justCommitted() {\n return justCommitted;\n },\n apply(op) {\n switch (op.type) {\n case \"commit\":\n justCommitted.push(op.block);\n return;\n case \"start-live\":\n if (op.block.id === undefined) return;\n live.set(op.block.id, op.block);\n return;\n case \"update-live\": {\n const existing = live.get(op.id);\n if (existing === undefined) return;\n const patch = op.patch as Partial<Block> & { [DELTA_KEY]?: string };\n const delta = patch[DELTA_KEY];\n const rest: Partial<Block> = { ...patch };\n delete (rest as { [DELTA_KEY]?: string })[DELTA_KEY];\n const merged: Block = { ...existing, ...rest };\n if (delta !== undefined) merged.body = `${existing.body ?? \"\"}${delta}`;\n live.set(op.id, merged);\n return;\n }\n case \"end-live\": {\n const existing = live.get(op.id);\n if (existing === undefined) return;\n live.delete(op.id);\n justCommitted.push({ ...existing, live: false });\n return;\n }\n case \"clear-live\":\n live.delete(op.id);\n return;\n }\n },\n drainCommitted() {\n const out = justCommitted;\n justCommitted = [];\n return out;\n },\n };\n}\n","import { visibleLength } from \"../ui/terminal-text\";\n\ntype TableAlignment = \"left\" | \"center\" | \"right\";\n\nconst ansi = {\n bold: \"\\x1b[1m\",\n boldOff: \"\\x1b[22m\",\n italic: \"\\x1b[3m\",\n italicOff: \"\\x1b[23m\",\n};\n\nconst tableSeparator = \"─\";\n\nexport function renderMarkdown(input: string): string {\n const lines = input.split(\"\\n\");\n const output: string[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const table = parseTable(lines, index);\n if (table != null) {\n output.push(...renderTable(table));\n index = table.endIndex - 1;\n continue;\n }\n output.push(renderMarkdownLine(lines[index] ?? \"\"));\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderMarkdownLine(line: string): string {\n if (line.startsWith(\"### \")) return renderInlineMarkdown(`▶ ${line.slice(4)}`);\n if (line.startsWith(\"## \")) return renderInlineMarkdown(`■ ${line.slice(3)}`);\n if (line.startsWith(\"# \")) return renderInlineMarkdown(`█ ${line.slice(2)}`);\n\n const unorderedListItem = line.match(/^(\\s*)[-+*]\\s+(.*)$/);\n if (unorderedListItem) {\n const [, indentation, text = \"\"] = unorderedListItem;\n return renderInlineMarkdown(`${indentation}•${text.length > 0 ? ` ${text}` : \"\"}`);\n }\n\n if (/^\\d+\\. /.test(line)) return renderInlineMarkdown(line.replace(/^(\\d+)\\. /, \"$1. \"));\n if (line.startsWith(\"> \")) return renderInlineMarkdown(`│ ${line.slice(2)}`);\n return renderInlineMarkdown(line);\n}\n\nfunction renderInlineMarkdown(input: string): string {\n const urls: string[] = [];\n const shielded = input.replaceAll(/https?:\\/\\/\\S+/g, (match) => {\n const token = `${urls.length}`;\n urls.push(match);\n return token;\n });\n\n const styled = shielded\n .replaceAll(/`([^`]+)`/g, \"$1\")\n .replaceAll(/\\*\\*([^*\\n]+)\\*\\*/g, `${ansi.bold}$1${ansi.boldOff}`)\n .replaceAll(/__([^_\\n]+)__/g, `${ansi.bold}$1${ansi.boldOff}`)\n .replaceAll(/\\*([^*\\n]+)\\*/g, `${ansi.italic}$1${ansi.italicOff}`)\n .replaceAll(/_([^_\\n]+)_/g, `${ansi.italic}$1${ansi.italicOff}`);\n\n return styled.replaceAll(/(\\d+)/g, (_match, index) => urls[Number(index)] ?? \"\");\n}\n\ntype ParsedTable = {\n alignments: TableAlignment[];\n endIndex: number;\n header: string[];\n rows: string[][];\n};\n\nfunction parseTable(lines: string[], startIndex: number): ParsedTable | undefined {\n const header = parseTableCells(lines[startIndex] ?? \"\");\n if (header == null || header.length < 2) return undefined;\n\n const separatorCells = parseTableCells(lines[startIndex + 1] ?? \"\");\n if (separatorCells == null || separatorCells.length !== header.length) return undefined;\n\n const alignments = parseTableAlignments(separatorCells);\n if (alignments == null) return undefined;\n\n const rows: string[][] = [];\n let endIndex = startIndex + 2;\n\n while (endIndex < lines.length) {\n const row = parseTableCells(lines[endIndex] ?? \"\");\n if (row == null) break;\n rows.push(normalizeTableRow(row, header.length));\n endIndex += 1;\n }\n\n return { alignments, endIndex, header, rows };\n}\n\nfunction parseTableCells(line: string): string[] | undefined {\n if (!line.includes(\"|\")) return undefined;\n\n let tableLine = line.trim();\n if (tableLine.startsWith(\"|\")) tableLine = tableLine.slice(1);\n if (tableLine.endsWith(\"|\") && !tableLine.endsWith(\"\\\\|\")) {\n tableLine = tableLine.slice(0, -1);\n }\n\n const cells: string[] = [];\n let cell = \"\";\n\n for (let index = 0; index < tableLine.length; index += 1) {\n const character = tableLine[index];\n const nextCharacter = tableLine[index + 1];\n\n if (character === \"\\\\\" && nextCharacter === \"|\") {\n cell += \"|\";\n index += 1;\n continue;\n }\n if (character === \"|\") {\n cells.push(cell.trim());\n cell = \"\";\n continue;\n }\n cell += character;\n }\n\n cells.push(cell.trim());\n return cells;\n}\n\nfunction parseTableAlignments(cells: string[]): TableAlignment[] | undefined {\n const alignments: TableAlignment[] = [];\n\n for (const cell of cells) {\n const match = cell.match(/^(:)?-{3,}(:)?$/);\n if (match == null) return undefined;\n\n const [, left, right] = match;\n alignments.push(left != null && right != null ? \"center\" : right != null ? \"right\" : \"left\");\n }\n\n return alignments;\n}\n\nfunction normalizeTableRow(row: string[], length: number): string[] {\n return Array.from({ length }, (_, index) => row[index] ?? \"\");\n}\n\nfunction renderTable(table: ParsedTable): string[] {\n const header = table.header.map(\n (cell) => `${ansi.bold}${renderInlineMarkdown(cell)}${ansi.boldOff}`,\n );\n const rows = table.rows.map((row) => row.map(renderInlineMarkdown));\n const tableRows = [header, ...rows];\n const widths = table.alignments.map((_, columnIndex) =>\n Math.max(3, ...tableRows.map((row) => visibleLength(row[columnIndex] ?? \"\"))),\n );\n\n return [\n formatTableRow(header, widths, table.alignments),\n widths.map((width) => tableSeparator.repeat(width)).join(\" \"),\n ...rows.map((row) => formatTableRow(row, widths, table.alignments)),\n ];\n}\n\nfunction formatTableRow(row: string[], widths: number[], alignments: TableAlignment[]): string {\n return row\n .map((cell, index) => alignTableCell(cell, widths[index] ?? 0, alignments[index] ?? \"left\"))\n .join(\" \");\n}\n\nfunction alignTableCell(cell: string, width: number, alignment: TableAlignment): string {\n const paddingWidth = Math.max(0, width - visibleLength(cell));\n\n if (alignment === \"right\") return `${\" \".repeat(paddingWidth)}${cell}`;\n\n if (alignment === \"center\") {\n const leftPadding = Math.floor(paddingWidth / 2);\n const rightPadding = paddingWidth - leftPadding;\n return `${\" \".repeat(leftPadding)}${cell}${\" \".repeat(rightPadding)}`;\n }\n\n return `${cell}${\" \".repeat(paddingWidth)}`;\n}\n","import { renderMarkdown } from \"../markdown\";\nimport type { Theme } from \"../theme\";\nimport { isPromptControlCommand } from \"../prompt-commands\";\nimport { formatValuePretty, truncate } from \"../tool-format\";\nimport { sliceVisible, visibleLength, wrapVisibleLine } from \"../../ui/terminal-text\";\n\nexport type ToolStatus = \"running\" | \"done\" | \"error\" | \"denied\" | \"approval\";\n\nexport type BlockKind =\n | \"user\"\n | \"assistant\"\n | \"reasoning\"\n | \"tool\"\n | \"error\"\n | \"notice\"\n | \"warning\"\n | \"result\"\n | \"command\"\n | \"subagent\"\n | \"subagent-step\"\n | \"subagent-tool\"\n | \"agent-header\";\n\nexport interface Block {\n kind: BlockKind;\n id?: string;\n depth?: number;\n live?: boolean;\n\n title?: string;\n subtitle?: string;\n body?: string;\n reasoning?: string;\n result?: string;\n detail?: string;\n\n status?: ToolStatus;\n preformatted?: boolean;\n collapsed?: boolean;\n expanded?: boolean;\n toolInput?: unknown;\n toolOutput?: unknown;\n}\n\nexport interface RenderBlockContext {\n spinner: string;\n previous?: { kind: BlockKind; title?: string };\n}\n\nexport function renderBlockLines(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n const depth = block.depth ?? 0;\n const prefix = nestingPrefix(depth, theme);\n const avail = Math.max(8, width - visibleLength(prefix));\n const rows = renderBody(block, avail, theme, context);\n return rows.map((row) => `${prefix}${row}`);\n}\n\nfunction nestingPrefix(depth: number, theme: Theme): string {\n if (depth <= 0) return \"\";\n const rule = `${theme.colors.orange(theme.glyph.rule)} `;\n return rule.repeat(depth);\n}\n\nfunction renderBody(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n switch (block.kind) {\n case \"user\":\n return renderUser(block, width, theme);\n case \"assistant\":\n case \"subagent-step\":\n return renderProse(block, width, theme);\n case \"reasoning\":\n return renderReasoning(block, width, theme);\n case \"tool\":\n case \"subagent-tool\":\n return renderTool(block, width, theme, context);\n case \"error\":\n return renderError(block, width, theme);\n case \"notice\":\n return renderNotice(block, width, theme);\n case \"warning\":\n return renderWarning(block, width, theme);\n case \"result\":\n return renderResult(block, width, theme);\n case \"command\":\n return renderCommand(block, theme);\n case \"subagent\":\n return renderSubagentHeader(block, width, theme);\n case \"agent-header\":\n return (block.body ?? \"\").split(\"\\n\");\n }\n}\n\nfunction renderUser(block: Block, width: number, theme: Theme): string[] {\n const bar = theme.colors.cyan(theme.glyph.user);\n const lines = wrap(block.body ?? \"\", width - 2);\n return lines.map((line) => `${bar} ${line}`);\n}\n\nfunction renderProse(block: Block, width: number, theme: Theme): string[] {\n const rows: string[] = [];\n const isSubagent = block.kind === \"subagent-step\";\n const glyph = isSubagent ? \"\" : `${theme.colors.bold(theme.colors.white(theme.glyph.brand))} `;\n const indent = isSubagent ? \"\" : \" \";\n\n if (block.reasoning && block.reasoning.trim().length > 0) {\n rows.push(...renderReasoningLines(block.reasoning, width, theme));\n }\n\n const body = (block.body ?? \"\").trim();\n if (body.length === 0 && rows.length === 0) {\n return [`${glyph}${theme.colors.dim(`thinking${theme.glyph.ellipsis}`)}`];\n }\n\n if (body.length > 0) {\n const rendered = renderMarkdown(body)\n .split(\"\\n\")\n .flatMap((line) => wrapVisibleLine(line, width - indent.length));\n rendered.forEach((line, index) => {\n if (index === 0 && !isSubagent && rows.length === 0) {\n rows.push(`${glyph}${line}`);\n } else {\n rows.push(`${indent}${line}`);\n }\n });\n }\n\n return rows.length > 0 ? rows : [`${glyph}`];\n}\n\nfunction renderReasoning(block: Block, width: number, theme: Theme): string[] {\n if (block.collapsed) {\n return [`${theme.colors.gray(theme.glyph.reasoning)} ${theme.colors.dim(\"thinking\")}`];\n }\n return renderReasoningLines(block.body ?? \"\", width, theme, theme.glyph.reasoning);\n}\n\nfunction renderReasoningLines(\n text: string,\n width: number,\n theme: Theme,\n glyph?: string,\n): string[] {\n const pad = glyph ? 2 : 0;\n const lines = wrap(text.trim(), width - pad);\n if (lines.length === 0) return [];\n return lines.map((line, index) => {\n const prefix = glyph ? (index === 0 ? `${theme.colors.gray(glyph)} ` : \" \") : \"\";\n return `${prefix}${theme.colors.dim(theme.colors.italic(line))}`;\n });\n}\n\nfunction renderTool(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n const { icon, accent } = toolGlyph(block.status ?? \"running\", theme, context);\n const name = block.title ?? \"tool\";\n const headerWidth = width - 2;\n const namePlain = truncatePlain(name, headerWidth);\n let header = `${icon} ${theme.colors.bold(namePlain)}`;\n const argsBudget = headerWidth - namePlain.length - 2;\n const args = block.subtitle ?? \"\";\n if (args.length > 0 && argsBudget >= 6) {\n header += ` ${theme.colors.gray(truncate(args, argsBudget))}`;\n }\n\n const rows = [header];\n\n if (block.expanded) {\n rows.push(...renderToolExpanded(block, width, theme));\n } else if (block.status === \"done\" && block.result && block.result.length > 0) {\n rows.push(resultLine(theme.glyph.arrow, block.result, width, theme, accent));\n } else if (block.status === \"error\" && block.result) {\n rows.push(resultLine(theme.glyph.arrow, block.result, width, theme, theme.colors.red));\n } else if (block.status === \"denied\") {\n rows.push(resultLine(theme.glyph.arrow, \"denied\", width, theme, theme.colors.yellow));\n }\n\n return rows;\n}\n\nfunction renderToolExpanded(block: Block, width: number, theme: Theme): string[] {\n const rows: string[] = [];\n const push = (label: string, value: unknown, color: (text: string) => string) => {\n if (value === undefined) return;\n rows.push(` ${theme.colors.dim(label)}`);\n for (const line of wrap(formatValuePretty(value), width - 4)) {\n rows.push(` ${color(line)}`);\n }\n };\n push(\"input\", block.toolInput, theme.colors.gray);\n if (block.status === \"error\" && block.result) {\n push(\"error\", block.result, theme.colors.red);\n } else {\n push(\"output\", block.toolOutput, theme.colors.gray);\n }\n return rows;\n}\n\nfunction resultLine(\n marker: string,\n text: string,\n width: number,\n theme: Theme,\n color: (text: string) => string,\n): string {\n const budget = width - 4;\n return ` ${theme.colors.dim(marker)} ${color(truncate(text, budget))}`;\n}\n\nfunction toolGlyph(\n status: ToolStatus,\n theme: Theme,\n context: RenderBlockContext,\n): { icon: string; accent: (text: string) => string } {\n switch (status) {\n case \"done\":\n return { icon: theme.colors.green(theme.glyph.success), accent: theme.colors.gray };\n case \"error\":\n return { icon: theme.colors.red(theme.glyph.error), accent: theme.colors.red };\n case \"denied\":\n return { icon: theme.colors.yellow(theme.glyph.warning), accent: theme.colors.yellow };\n case \"approval\":\n return { icon: theme.colors.yellow(theme.glyph.question), accent: theme.colors.yellow };\n case \"running\":\n default:\n return { icon: theme.colors.yellow(context.spinner), accent: theme.colors.gray };\n }\n}\n\nconst ERROR_DETAIL_MAX_LINES = 12;\n\nfunction renderError(block: Block, width: number, theme: Theme): string[] {\n const icon = theme.colors.red(theme.colors.bold(theme.glyph.error));\n const title = block.title ?? \"Error\";\n const rows = [`${icon} ${theme.colors.red(theme.colors.bold(title))}`];\n for (const line of wrap(block.body ?? \"\", width - 2)) {\n rows.push(` ${colorizeError(line, theme)}`);\n }\n rows.push(...renderErrorDetail(block.detail, width, theme));\n return rows;\n}\n\nfunction renderErrorDetail(detail: string | undefined, width: number, theme: Theme): string[] {\n if (detail === undefined || detail.trim().length === 0) return [];\n const lines = detail.split(\"\\n\");\n const visible = lines.slice(0, ERROR_DETAIL_MAX_LINES);\n const rows = visible.map(\n (line) => ` ${theme.colors.dim(truncatePlain(line, Math.max(1, width - 2)))}`,\n );\n const hidden = lines.length - visible.length;\n if (hidden > 0) {\n rows.push(\n ` ${theme.colors.dim(`${theme.glyph.ellipsis} +${hidden} more line${hidden === 1 ? \"\" : \"s\"}`)}`,\n );\n }\n return rows;\n}\n\nconst URL_PATTERN = /(https?:\\/\\/\\S+)/u;\n\nfunction colorizeError(line: string, theme: Theme): string {\n if (!URL_PATTERN.test(line)) return theme.colors.red(line);\n return line\n .split(URL_PATTERN)\n .map((segment, index) =>\n index % 2 === 1 ? theme.colors.cyan(segment) : theme.colors.red(segment),\n )\n .join(\"\");\n}\n\nfunction renderNotice(block: Block, width: number, theme: Theme): string[] {\n const marker = theme.colors.dim(theme.glyph.dot);\n const lines = wrap(block.body ?? \"\", width - 2);\n if (lines.length === 0) return [marker];\n return lines.map((line) => `${marker} ${theme.colors.dim(line)}`);\n}\n\nexport function renderAttentionRows(body: string, width: number, theme: Theme): string[] {\n const marker = theme.colors.yellow(theme.glyph.warning);\n const lines = wrap(body, width - 2);\n return lines.map((line, index) => `${index === 0 ? marker : \" \"} ${paintCommands(line, theme)}`);\n}\n\nfunction renderWarning(block: Block, width: number, theme: Theme): string[] {\n return renderAttentionRows(block.body ?? \"\", width, theme);\n}\n\nfunction paintCommands(line: string, theme: Theme): string {\n return line.replace(/\\/[a-z:-]+/g, (token) =>\n isPromptControlCommand(token) ? theme.colors.blue(token) : token,\n );\n}\n\n/**\n * A slash-command invocation echoed under the user gutter. Rendered blue\n * so it's obvious it's a system-directed action, not chat content, but\n * marked with the same `▌` glyph as user messages so it visually chains\n * with the transcript. Failed commands (status: \"error\") get a leading `⨯`.\n */\nfunction renderCommand(block: Block, theme: Theme): string[] {\n const c = theme.colors;\n const status = block.status === \"error\" ? `${c.red(theme.glyph.error)} ` : \"\";\n return [`${c.cyan(theme.glyph.user)} ${status}${c.blue(block.body ?? \"\")}`];\n}\n\nfunction renderResult(block: Block, width: number, theme: Theme): string[] {\n const marker = theme.colors.dim(theme.glyph.elbow);\n const lines = wrap(block.body ?? \"\", width - 7);\n if (lines.length === 0) return [` ${marker}`];\n const dim = (line: string): string =>\n theme.colors.dim(line.replaceAll(\"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"));\n return lines.map((line, index) =>\n index === 0 ? ` ${marker} ${dim(line)}` : ` ${dim(line)}`,\n );\n}\n\nfunction renderSubagentHeader(block: Block, width: number, theme: Theme): string[] {\n const name = truncatePlain(block.title ?? \"subagent\", Math.max(8, width - 14));\n return [\n `${theme.colors.orange(theme.glyph.subagent)} ${theme.colors.bold(name)} ${theme.colors.dim(\"subagent\")}`,\n ];\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (text.trim().length === 0) return [];\n return text.split(\"\\n\").flatMap((line) => wrapVisibleLine(line, Math.max(1, width)));\n}\n\nfunction truncatePlain(text: string, maxWidth: number): string {\n if (visibleLength(text) <= maxWidth) return text;\n return sliceVisible(text, maxWidth);\n}\n","import type { Block } from \"./blocks\";\nimport { renderBlockLines, type RenderBlockContext } from \"./blocks\";\nimport { createBlockStore, type BlockOp, type BlockStore } from \"./event-to-blocks\";\nimport { LiveRegion, type TerminalOutput } from \"./live-region\";\nimport { createTheme, detectUnicode, type Theme } from \"../theme\";\nimport {\n EMPTY_LINE,\n PromptHistory,\n applyLineEditorKey,\n type LineState,\n visibleLine,\n} from \"../line-editor\";\nimport { inputTextWidth, visibleLength } from \"../../ui/terminal-text\";\nimport type { TerminalKey } from \"../key-parser\";\nimport {\n matchingCommands,\n type PromptCommandSpec,\n PROMPT_COMMANDS,\n} from \"../prompt-commands\";\n\nexport interface TerminalRendererOptions {\n readonly output?: TerminalOutput;\n readonly theme?: Theme;\n readonly commands?: readonly PromptCommandSpec[];\n readonly spinnerIntervalMs?: number;\n}\n\ninterface TypeaheadState {\n readonly matches: readonly PromptCommandSpec[];\n readonly selectedIndex: number;\n readonly dismissed: boolean;\n}\n\nconst EMPTY_TYPEAHEAD: TypeaheadState = {\n matches: [],\n selectedIndex: 0,\n dismissed: false,\n};\n\n/**\n * Terminal-side glue for the block renderer.\n *\n * Owns the LiveRegion, the block store, the line editor's `LineState`, and\n * the slash-command typeahead. External code feeds it stream events via\n * {@link apply} and key presses via {@link handleKey}; the renderer decides\n * when a prompt has been submitted and resolves the pending\n * `readPrompt` promise with its text.\n */\nexport class TerminalRenderer {\n readonly #output: TerminalOutput;\n readonly #theme: Theme;\n readonly #commands: readonly PromptCommandSpec[];\n readonly #store: BlockStore;\n readonly #region: LiveRegion;\n readonly #history = new PromptHistory();\n readonly #spinnerIntervalMs: number;\n #line: LineState = EMPTY_LINE;\n #typeahead: TypeaheadState = EMPTY_TYPEAHEAD;\n #pendingResolve: ((value: string | undefined) => void) | undefined;\n #spinnerFrame = 0;\n #spinnerTimer: ReturnType<typeof setInterval> | undefined;\n #stopped = false;\n #firstPaintDone = false;\n\n constructor(options: TerminalRendererOptions = {}) {\n this.#output = options.output ?? (process.stdout as unknown as TerminalOutput);\n this.#theme = options.theme ?? createTheme({ unicode: detectUnicode() });\n this.#commands = options.commands ?? PROMPT_COMMANDS;\n this.#spinnerIntervalMs = options.spinnerIntervalMs ?? 90;\n this.#store = createBlockStore();\n this.#region = new LiveRegion({\n output: this.#output,\n onResize: () => this.#paint(),\n });\n }\n\n apply(ops: readonly BlockOp[]): void {\n if (ops.length === 0) return;\n for (const op of ops) this.#store.apply(op);\n this.#flushCommitted();\n this.#syncSpinner();\n this.#paint();\n }\n\n writeNotice(text: string): void {\n this.apply([{ type: \"commit\", block: { kind: \"notice\", body: text } }]);\n }\n\n writeError(title: string, message: string): void {\n this.apply([\n { type: \"commit\", block: { kind: \"error\", title, body: message } },\n ]);\n }\n\n writeAgentHeader(body: string): void {\n this.apply([{ type: \"commit\", block: { kind: \"agent-header\", body } }]);\n }\n\n /**\n * Echoes a slash-command invocation to scrollback so it chains with the\n * transcript above (blue `▌ /model`) and the {@link writeCommandResult}\n * that hangs beneath it can share visual context.\n */\n writeCommandInvocation(text: string, status?: \"error\"): void {\n const block: Block = { kind: \"command\", body: text };\n if (status === \"error\") block.status = \"error\";\n this.apply([{ type: \"commit\", block }]);\n }\n\n /**\n * Writes a command outcome hung under the previous invocation with the\n * elbow connector (`⎿ message`). Multi-line messages soft-wrap under the\n * elbow.\n */\n writeCommandResult(text: string): void {\n this.apply([{ type: \"commit\", block: { kind: \"result\", body: text } }]);\n }\n\n readPrompt(): Promise<string | undefined> {\n return new Promise((resolve) => {\n this.#pendingResolve = resolve;\n this.#line = EMPTY_LINE;\n this.#typeahead = EMPTY_TYPEAHEAD;\n this.#history.begin(this.#line.text);\n this.#paint();\n });\n }\n\n handleKey(key: TerminalKey): void {\n if (this.#pendingResolve === undefined) return;\n\n if (key.type === \"ctrl-c\") {\n const resolve = this.#pendingResolve;\n this.#pendingResolve = undefined;\n this.stop();\n resolve(undefined);\n return;\n }\n\n if (this.#isTypeaheadOpen() && (key.type === \"up\" || key.type === \"down\")) {\n const delta = key.type === \"up\" ? -1 : 1;\n this.#moveTypeahead(delta);\n this.#paint();\n return;\n }\n\n if (this.#isTypeaheadOpen() && (key.type === \"tab\" || key.type === \"enter\")) {\n this.#acceptTypeahead(key.type === \"enter\");\n return;\n }\n\n if (key.type === \"escape\" && this.#isTypeaheadOpen()) {\n this.#typeahead = { ...this.#typeahead, dismissed: true };\n this.#paint();\n return;\n }\n\n if (key.type === \"enter\") {\n this.#submit();\n return;\n }\n\n if (key.type === \"up\" || key.type === \"ctrl-p\") {\n const previous = this.#history.previous(this.#line.text);\n if (previous !== undefined) {\n this.#line = { text: previous, cursor: previous.length };\n this.#refreshTypeahead();\n this.#paint();\n }\n return;\n }\n if (key.type === \"down\" || key.type === \"ctrl-n\") {\n const next = this.#history.next();\n if (next !== undefined) {\n this.#line = { text: next, cursor: next.length };\n this.#refreshTypeahead();\n this.#paint();\n }\n return;\n }\n\n const nextLine = applyLineEditorKey(this.#line, key, { multiline: false });\n if (nextLine !== undefined) {\n this.#line = nextLine;\n this.#refreshTypeahead();\n this.#paint();\n }\n }\n\n stop(): void {\n if (this.#stopped) return;\n this.#stopped = true;\n if (this.#spinnerTimer !== undefined) clearInterval(this.#spinnerTimer);\n this.#region.stop();\n }\n\n #submit(): void {\n if (this.#pendingResolve === undefined) return;\n const text = this.#line.text;\n this.#history.add(text);\n const resolve = this.#pendingResolve;\n this.#pendingResolve = undefined;\n this.#line = EMPTY_LINE;\n this.#typeahead = EMPTY_TYPEAHEAD;\n this.#region.paint([], { row: 1, col: 1 });\n resolve(text);\n }\n\n #refreshTypeahead(): void {\n const matches = matchingCommands(this.#commands, this.#line.text);\n this.#typeahead = { matches, selectedIndex: 0, dismissed: false };\n }\n\n #isTypeaheadOpen(): boolean {\n return this.#typeahead.matches.length > 0 && !this.#typeahead.dismissed;\n }\n\n #moveTypeahead(delta: number): void {\n const count = this.#typeahead.matches.length;\n if (count === 0) return;\n const selectedIndex = (this.#typeahead.selectedIndex + delta + count) % count;\n this.#typeahead = { ...this.#typeahead, selectedIndex };\n }\n\n #acceptTypeahead(submitAfter: boolean): void {\n const spec = this.#typeahead.matches[this.#typeahead.selectedIndex];\n if (spec === undefined) return;\n const text = `/${spec.name}${spec.takesArgument ? \" \" : \"\"}`;\n this.#line = { text, cursor: text.length };\n this.#typeahead = EMPTY_TYPEAHEAD;\n if (submitAfter && !spec.takesArgument) {\n this.#submit();\n } else {\n this.#paint();\n }\n }\n\n #flushCommitted(): void {\n const drained = this.#store.drainCommitted();\n if (drained.length === 0) return;\n const rows: string[] = [];\n let previous: RenderBlockContext[\"previous\"] | undefined;\n const ctx: RenderBlockContext = { spinner: this.#currentSpinner(), previous };\n for (const block of drained) {\n const blockCtx: RenderBlockContext = { spinner: this.#currentSpinner(), previous };\n rows.push(...renderBlockLines(block, this.columns, this.#theme, blockCtx));\n previous = { kind: block.kind, title: block.title };\n }\n if (rows.length > 0 && this.#firstPaintDone) rows.unshift(\"\");\n if (!this.#firstPaintDone && rows.length > 0) this.#firstPaintDone = true;\n this.#region.commit(rows);\n }\n\n #paint(): void {\n if (this.#stopped) return;\n if (this.#pendingResolve === undefined && this.#store.live.size === 0) {\n this.#region.paint([], { row: 1, col: 1 });\n return;\n }\n\n const rows: string[] = [];\n const ctx: RenderBlockContext = { spinner: this.#currentSpinner() };\n for (const block of this.#store.live.values()) {\n rows.push(...renderBlockLines(block, this.columns, this.#theme, ctx));\n }\n\n if (this.#pendingResolve !== undefined) {\n if (rows.length > 0) rows.push(\"\");\n const inputRow = this.#renderInputRow();\n const caretCol = this.#caretColumn();\n rows.push(inputRow);\n this.#region.paint(rows, { row: rows.length, col: caretCol });\n return;\n }\n\n this.#region.paint(rows, { row: rows.length, col: 1 });\n }\n\n #renderInputRow(): string {\n const c = this.#theme.colors;\n const promptGlyph = c.cyan(this.#theme.glyph.prompt);\n const promptWidth = visibleLength(`${this.#theme.glyph.prompt} `);\n const budget = Math.max(1, this.columns - promptWidth);\n const view = visibleLine(this.#line, budget);\n const before = view.before;\n const under = view.under.length === 0 ? \" \" : view.under;\n const after = view.after;\n return `${promptGlyph} ${before}${c.inverse(under)}${after}`;\n }\n\n #caretColumn(): number {\n const promptWidth = visibleLength(`${this.#theme.glyph.prompt} `);\n const view = visibleLine(this.#line, Math.max(1, this.columns - promptWidth));\n return 1 + promptWidth + inputTextWidth(view.before);\n }\n\n #currentSpinner(): string {\n return this.#theme.spinner[this.#spinnerFrame % this.#theme.spinner.length] ?? \"-\";\n }\n\n #syncSpinner(): void {\n const hasLive = [...this.#store.live.values()].some((b) => b.live === true);\n if (hasLive && this.#spinnerTimer === undefined) {\n this.#spinnerTimer = setInterval(() => {\n this.#spinnerFrame += 1;\n this.#paint();\n }, this.#spinnerIntervalMs);\n this.#spinnerTimer.unref?.();\n }\n if (!hasLive && this.#spinnerTimer !== undefined) {\n clearInterval(this.#spinnerTimer);\n this.#spinnerTimer = undefined;\n }\n }\n\n get columns(): number {\n return this.#region.columns;\n }\n}\n","import type { ModelToolDefinition } from \"../tools/index\";\n\ninterface ProviderConfig {\n baseUrl: string;\n apiKey: () => string | undefined;\n}\n\nconst PROVIDERS: Record<string, ProviderConfig> = {\n openai: {\n baseUrl: \"https://api.openai.com/v1\",\n apiKey: () => process.env.OPENAI_API_KEY,\n },\n anthropic: {\n baseUrl: \"https://api.anthropic.com/v1\",\n apiKey: () => process.env.ANTHROPIC_API_KEY,\n },\n groq: {\n baseUrl: \"https://api.groq.com/openai/v1\",\n apiKey: () => process.env.GROQ_API_KEY,\n },\n deepseek: {\n baseUrl: \"https://api.deepseek.com/v1\",\n apiKey: () => process.env.DEEPSEEK_API_KEY,\n },\n mistral: {\n baseUrl: \"https://api.mistral.ai/v1\",\n apiKey: () => process.env.MISTRAL_API_KEY,\n },\n google: {\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta\",\n apiKey: () => process.env.GOOGLE_API_KEY,\n },\n meta: {\n baseUrl: \"https://api.together.xyz/v1\",\n apiKey: () => process.env.TOGETHER_API_KEY || process.env.OPENAI_API_KEY,\n },\n};\n\nfunction parseModelId(modelId: string): { provider: string; model: string } {\n const slash = modelId.indexOf(\"/\");\n if (slash === -1) return { provider: \"\", model: modelId };\n return { provider: modelId.slice(0, slash), model: modelId.slice(slash + 1) };\n}\n\nexport interface LlmMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n}\n\nexport interface ToolResult {\n action_id: string;\n output: string;\n}\n\nexport interface LlmStreamEvent {\n type: \"delta\" | \"tool_call\" | \"done\" | \"error\";\n delta?: string;\n toolCall?: { name: string; arguments: string; id: string };\n toolCalls?: Array<{ name: string; arguments: string; id: string }>;\n finishReason?: string;\n error?: string;\n}\n\nexport function getProviderApiKey(provider: string): string | undefined {\n const cfg = PROVIDERS[provider];\n return cfg?.apiKey?.();\n}\n\nfunction flattenToolResults(model: string, results: ToolResult[]): LlmMessage[] {\n const provider = parseModelId(model).provider;\n if (provider === \"anthropic\") {\n return results.map((r) => ({\n role: \"user\" as const,\n content: JSON.stringify({ type: \"tool_result\", tool_use_id: r.action_id, content: r.output }),\n }));\n }\n return results.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.action_id,\n content: r.output,\n }));\n}\n\nexport async function* streamLlm(\n modelId: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const { provider, model } = parseModelId(modelId);\n const cfg = PROVIDERS[provider];\n\n if (!cfg) {\n yield { type: \"error\", error: `Unknown provider: ${provider}` };\n return;\n }\n\n const apiKey = cfg.apiKey();\n if (!apiKey) {\n yield { type: \"error\", error: `Missing API key for provider: ${provider}. Set ${provider.toUpperCase()}_API_KEY` };\n return;\n }\n\n if (provider === \"anthropic\") {\n yield* streamAnthropic(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n } else if (provider === \"google\") {\n yield* streamGoogle(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n } else {\n yield* streamOpenAICompatible(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n }\n}\n\nasync function* streamOpenAICompatible(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const body: Record<string, unknown> = {\n model,\n messages,\n stream: true,\n stream_options: { include_usage: false },\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools;\n }\n\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `LLM API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let accumulatedToolCalls: Map<number, { id: string; name: string; args: string }> = new Map();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const payload = line.slice(6).trim();\n if (payload === \"[DONE]\") {\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: \"stop\" };\n return;\n }\n\n try {\n const parsed = JSON.parse(payload);\n const choice = parsed.choices?.[0];\n\n if (choice?.finish_reason) {\n if (choice.finish_reason === \"tool_calls\" && accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: choice.finish_reason };\n return;\n }\n\n const delta = choice?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: \"delta\", delta: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n let existing = accumulatedToolCalls.get(idx);\n if (!existing) {\n if (!tc.function?.name) continue;\n existing = { id: tc.id ?? \"\", name: tc.function.name, args: \"\" };\n accumulatedToolCalls.set(idx, existing);\n }\n if (tc.id) existing.id = tc.id;\n if (tc.function?.name) existing.name = tc.function.name;\n if (tc.function?.arguments) existing.args += tc.function.arguments;\n }\n }\n } catch {}\n }\n }\n\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: \"stop\" };\n}\n\nasync function* streamAnthropic(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const systemMsgs = messages.filter((m) => m.role === \"system\");\n const chatMsgs = messages.filter((m) => m.role !== \"system\").map((m) => {\n if (m.role === \"tool\") {\n return {\n role: \"user\" as const,\n content: [{ type: \"tool_result\" as const, tool_use_id: m.tool_call_id!, content: m.content }],\n };\n }\n if (m.tool_calls) {\n return {\n role: \"assistant\" as const,\n content: m.tool_calls.map((tc) => ({\n type: \"tool_use\" as const,\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments || \"{}\"),\n })),\n };\n }\n return { role: m.role as \"user\" | \"assistant\", content: m.content };\n });\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: 4096,\n messages: chatMsgs,\n stream: true,\n };\n\n if (systemMsgs.length > 0) {\n body.system = systemMsgs.map((m) => ({ type: \"text\", text: m.content }));\n }\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema || { type: \"object\", properties: {} },\n }));\n }\n\n const res = await fetch(`${baseUrl}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `Anthropic API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let currentEvent = \"\";\n let accumulatedToolCalls: Map<string, { id: string; name: string; args: string }> = new Map();\n let inputJsonBuffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"event: \")) {\n currentEvent = line.slice(7);\n if (currentEvent === \"content_block_start\" || currentEvent === \"content_block_delta\") {\n inputJsonBuffer = \"\";\n }\n } else if (line.startsWith(\"data: \")) {\n const payload = line.slice(6).trim();\n if (!payload) continue;\n\n try {\n const parsed = JSON.parse(payload);\n\n if (currentEvent === \"content_block_start\" && parsed.content_block) {\n if (parsed.content_block.type === \"tool_use\") {\n accumulatedToolCalls.set(parsed.index, {\n id: parsed.content_block.id,\n name: parsed.content_block.name,\n args: \"\",\n });\n }\n } else if (currentEvent === \"content_block_delta\" && parsed.delta) {\n if (parsed.delta.type === \"text_delta\" && parsed.delta.text) {\n yield { type: \"delta\", delta: parsed.delta.text };\n } else if (parsed.delta.type === \"input_json_delta\" && parsed.delta.partial_json) {\n for (const [idx, tc] of accumulatedToolCalls) {\n if (String(parsed.index) === String(idx)) {\n tc.args += parsed.delta.partial_json;\n }\n }\n }\n } else if (currentEvent === \"message_start\") {\n } else if (currentEvent === \"message_delta\") {\n if (parsed.delta?.stop_reason === \"tool_use\" || parsed.delta?.stop_reason === \"end_turn\") {\n }\n if (parsed.delta?.stop_reason === \"end_turn\" && accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n accumulatedToolCalls.clear();\n }\n } else if (currentEvent === \"message_stop\") {\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n accumulatedToolCalls.clear();\n }\n yield { type: \"done\", finishReason: \"stop\" };\n return;\n }\n } catch {}\n }\n }\n }\n\n yield { type: \"done\", finishReason: \"stop\" };\n}\n\nasync function* streamGoogle(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const contents = messages.filter((m) => m.role !== \"system\").map((m) => {\n const role = m.role === \"assistant\" ? \"model\" : (m.role === \"tool\" ? \"user\" : m.role);\n return {\n role,\n parts: [{ text: m.content }],\n };\n });\n\n const body: Record<string, unknown> = {\n contents,\n generationConfig: { temperature: 0.7 },\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n functionDeclarations: [{\n name: t.name,\n description: t.description,\n parameters: t.input_schema || {},\n }],\n }));\n }\n\n const res = await fetch(\n `${baseUrl}/models/${model}:streamGenerateContent?key=${apiKey}&alt=sse`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `Google API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const payload = line.slice(6).trim();\n if (!payload) continue;\n\n try {\n const parsed = JSON.parse(payload);\n const candidate = parsed.candidates?.[0];\n if (!candidate) continue;\n\n const part = candidate.content?.parts?.[0];\n if (part?.text) {\n yield { type: \"delta\", delta: part.text };\n }\n\n if (candidate.finishReason) {\n yield { type: \"done\", finishReason: candidate.finishReason.toLowerCase() };\n return;\n }\n } catch {}\n }\n }\n\n yield { type: \"done\", finishReason: \"stop\" };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { streamLlm, getProviderApiKey, type LlmMessage, type ToolResult } from \"./llm\";\nimport type { ModelToolDefinition } from \"../tools/index\";\n\ninterface Session {\n id: string;\n agentId: string;\n model: string;\n instructions: string;\n messages: LlmMessage[];\n tools?: ModelToolDefinition[];\n pendingToolCalls?: Array<{ name: string; arguments: string; id: string }>;\n}\n\nconst sessions = new Map<string, Session>();\n\nlet sessionCounter = 0;\nfunction nextId(): string {\n return `local-${++sessionCounter}-${Date.now().toString(36)}`;\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n}\n\nfunction writeSSE(res: ServerResponse, event: string, data: unknown): void {\n res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`);\n}\n\nfunction parseUrl(url: string): { pathname: string } {\n const idx = url.indexOf(\"?\");\n return { pathname: idx === -1 ? url : url.slice(0, idx) };\n}\n\nexport async function handleSessionsRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<boolean> {\n const { pathname } = parseUrl(req.url ?? \"/\");\n\n const sessionMatch = pathname.match(/^\\/v1\\/sessions\\/([^/]+)\\/turns$/);\n const approveMatch = pathname.match(/^\\/v1\\/sessions\\/([^/]+)\\/approve$/);\n const createMatch = pathname === \"/v1/sessions\" && req.method === \"POST\";\n\n if (createMatch) {\n return handleCreateSession(req, res);\n }\n if (sessionMatch && req.method === \"POST\") {\n return handleTurn(req, res, sessionMatch[1]);\n }\n if (approveMatch && req.method === \"POST\") {\n return handleApprove(req, res, approveMatch[1]);\n }\n\n return false;\n}\n\nasync function handleCreateSession(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n const body = JSON.parse(await readBody(req));\n const id = nextId();\n const session: Session = {\n id,\n agentId: body.agent_id ?? \"unnamed\",\n model: body.metadata?.model ?? \"\",\n instructions: body.metadata?.instructions ?? \"\",\n messages: [],\n };\n sessions.set(id, session);\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ id }));\n return true;\n}\n\nasync function handleTurn(\n req: IncomingMessage,\n res: ServerResponse,\n sessionId: string,\n): Promise<boolean> {\n const session = sessions.get(sessionId);\n if (!session) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Session not found\" }));\n return true;\n }\n\n const body = JSON.parse(await readBody(req));\n const model = body.model || session.model;\n const input = body.input ?? \"\";\n const instructions = body.instructions || session.instructions;\n const stream = body.stream !== false;\n const pauseOnTools = body.pause_on_tool_calls !== false;\n const tools: ModelToolDefinition[] = (body.tools ?? []);\n\n session.model = model;\n session.instructions = instructions;\n if (tools.length > 0) session.tools = tools;\n\n const messages: LlmMessage[] = [];\n\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n\n for (const msg of session.messages) {\n messages.push(msg);\n }\n\n const turnNumber = session.messages.filter((m) => m.role === \"user\").length + 1;\n const userMsg: LlmMessage = { role: \"user\", content: input };\n messages.push(userMsg);\n\n if (stream) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n writeSSE(res, \"turn.started\", { turn_number: turnNumber, input_text: input });\n writeSSE(res, \"message.received\", { input_text: input, turn_number: turnNumber });\n writeSSE(res, \"step.started\", { step_number: 1, turn_number: turnNumber });\n\n let textSoFar = \"\";\n let hadToolCalls = false;\n let messagePushed = false;\n\n try {\n for await (const event of streamLlm(model, messages, tools.length > 0 ? tools : undefined)) {\n if (event.type === \"delta\" && event.delta) {\n textSoFar += event.delta;\n writeSSE(res, \"output_text.delta\", { delta: event.delta, text: textSoFar });\n }\n\n if (event.type === \"tool_call\" && event.toolCalls) {\n hadToolCalls = true;\n session.pendingToolCalls = event.toolCalls;\n\n for (const tc of event.toolCalls) {\n writeSSE(res, \"tool_call.started\", {\n tool: tc.name,\n arguments: JSON.parse(tc.arguments || \"{}\"),\n action_id: tc.id,\n });\n }\n\n const toolCallMsg: LlmMessage = {\n role: \"assistant\",\n content: textSoFar,\n tool_calls: event.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n\n if (pauseOnTools) {\n session.messages.push(toolCallMsg);\n messagePushed = true;\n writeSSE(res, \"turn.paused\", { text: textSoFar });\n res.end();\n return true;\n }\n\n session.messages.push(toolCallMsg);\n messagePushed = true;\n }\n\n if (event.type === \"done\") {\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: textSoFar });\n messagePushed = true;\n }\n writeSSE(res, \"message.completed\", {\n text: textSoFar,\n finish_reason: event.finishReason ?? \"stop\",\n step_number: 1,\n turn_number: turnNumber,\n });\n writeSSE(res, \"step.completed\", {\n finish_reason: event.finishReason ?? \"stop\",\n step_number: 1,\n turn_number: turnNumber,\n });\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n }\n\n if (event.type === \"error\") {\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n writeSSE(res, \"error\", { message: event.error });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n writeSSE(res, \"error\", { message: msg });\n }\n\n res.end();\n } else {\n let fullText = \"\";\n let messagePushed = false;\n try {\n for await (const event of streamLlm(model, messages, tools.length > 0 ? tools : undefined)) {\n if (event.type === \"delta\" && event.delta) {\n fullText += event.delta;\n }\n if (event.type === \"tool_call\" && event.toolCalls) {\n session.pendingToolCalls = event.toolCalls;\n }\n }\n } catch {}\n\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: fullText });\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ output: fullText, turn_id: sessionId }));\n }\n\n return true;\n}\n\nasync function handleApprove(\n req: IncomingMessage,\n res: ServerResponse,\n sessionId: string,\n): Promise<boolean> {\n const session = sessions.get(sessionId);\n if (!session) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Session not found\" }));\n return true;\n }\n\n const body = JSON.parse(await readBody(req));\n const toolResults: ToolResult[] = body.tool_results ?? [];\n const actionId = body.action_id ?? toolResults[0]?.action_id ?? \"\";\n\n if (!session.pendingToolCalls || session.pendingToolCalls.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"No pending tool calls\" }));\n return true;\n }\n\n const toolResultMessages = toolResults.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.action_id,\n content: r.output,\n }));\n\n for (const msg of toolResultMessages) {\n session.messages.push(msg);\n }\n\n session.pendingToolCalls = undefined;\n\n const turnNumber = session.messages.filter((m) => m.role === \"user\").length;\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n writeSSE(res, \"turn.resumed\", {});\n\n let textSoFar = \"\";\n let hadToolCalls = false;\n let messagePushed = false;\n\n try {\n for await (const event of streamLlm(\n session.model,\n session.messages,\n session.tools,\n toolResults,\n )) {\n if (event.type === \"delta\" && event.delta) {\n textSoFar += event.delta;\n writeSSE(res, \"output_text.delta\", { delta: event.delta, text: textSoFar });\n }\n\n if (event.type === \"tool_call\" && event.toolCalls) {\n hadToolCalls = true;\n session.pendingToolCalls = event.toolCalls;\n\n for (const tc of event.toolCalls) {\n writeSSE(res, \"tool_call.started\", {\n tool: tc.name,\n arguments: JSON.parse(tc.arguments || \"{}\"),\n action_id: tc.id,\n });\n }\n\n session.messages.push({\n role: \"assistant\",\n content: textSoFar,\n tool_calls: event.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n });\n messagePushed = true;\n\n writeSSE(res, \"turn.paused\", { text: textSoFar });\n res.end();\n return true;\n }\n\n if (event.type === \"done\") {\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: textSoFar });\n messagePushed = true;\n }\n writeSSE(res, \"message.completed\", {\n text: textSoFar,\n finish_reason: event.finishReason ?? \"stop\",\n });\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n }\n\n if (event.type === \"error\") {\n writeSSE(res, \"error\", { message: event.error });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n writeSSE(res, \"error\", { message: msg });\n }\n\n res.end();\n return true;\n}\n\nexport { getProviderApiKey };\n"],"mappings":"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","names":["existsSync","join","resolve","resolve","resolve","join","existsSync"]}
package/dist/index.js CHANGED
@@ -20,10 +20,10 @@ import {
20
20
  WorkingMemory,
21
21
  runAgent,
22
22
  streamAgent
23
- } from "./chunk-4WSILP75.js";
23
+ } from "./chunk-3R65GQAE.js";
24
24
  import {
25
25
  loadAgent
26
- } from "./chunk-KVSX4MLK.js";
26
+ } from "./chunk-XZPC3JSU.js";
27
27
  import {
28
28
  discoverAgent
29
29
  } from "./chunk-6XETPLIF.js";
@@ -788,35 +788,22 @@ async function runInit(prompter, input) {
788
788
  );
789
789
  }
790
790
  await maybeScaffoldWebChat(prompter, targetDir);
791
- const action = await prompter.select({
792
- message: "How would you like to continue?",
791
+ const start = await prompter.select({
792
+ message: "Start dev server now?",
793
793
  options: [
794
- { value: "chat", label: `Start arcie dev \u2014 talk to '${name ?? "."}' in your terminal` },
795
- { value: "server", label: "Start arcie dev server" },
796
- { value: "code", label: "Open in editor" }
794
+ { value: "yes", label: "Yes \u2014 arcie dev + web UI, browser opens" },
795
+ { value: "no", label: `No \u2014 later: cd ${name ?? "."} && arcie dev` }
797
796
  ]
798
797
  });
799
- if (action === void 0) return;
800
- switch (action) {
801
- case "chat": {
802
- const { devCommand } = await import("./dev-DCPOO54H.js");
803
- prompter.stop();
804
- await devCommand({ port: "3000", agentDir: targetDir, input: true });
805
- break;
806
- }
807
- case "server": {
808
- const { devCommand } = await import("./dev-DCPOO54H.js");
809
- prompter.stop();
810
- await devCommand({ port: "3000", agentDir: targetDir, input: false });
811
- break;
812
- }
813
- case "code": {
814
- prompter.log.info(`cd ${name ?? "."} && code .`);
815
- break;
816
- }
798
+ if (start !== "yes") {
799
+ prompter.log.info(`later: cd ${name ?? "."} && arcie dev`);
800
+ return;
817
801
  }
802
+ const { devCommand } = await import("./dev-XBXOVOVE.js");
803
+ prompter.stop();
804
+ await devCommand({ port: "3000", agentDir: targetDir, input: false });
818
805
  }
819
806
  export {
820
807
  initCommand
821
808
  };
822
- //# sourceMappingURL=init-Q2GCMBCJ.js.map
809
+ //# sourceMappingURL=init-BQK2LLTM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/init.ts","../src/cli/model-catalog.ts","../src/cli/tui/diagnostics.ts","../src/cli/setup/select-input.ts","../src/cli/setup/text-input.ts","../src/cli/setup/setup-panel.ts","../src/cli/setup/tui-prompter.ts"],"sourcesContent":["import {\n copyFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { resolve, join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { exec } from \"node:child_process\";\nimport { fetchModelCatalog, type CatalogModel } from \"./model-catalog\";\nimport { checkProviderKeys, isProviderKeySet, providerEnvVar } from \"./tui/diagnostics\";\nimport { createTuiPrompter } from \"./setup/tui-prompter\";\nimport type { Prompter } from \"./setup/prompter\";\nimport { scaffoldWebChat } from \"./scaffold-web-chat\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n/**\n * Walk up from the current file to find the installed package's `templates/`\n * directory. Bundlers (tsup) may collapse `src/cli/init.ts` into a flat\n * `dist/*.js`, so `../../templates` from the source file is not a reliable\n * post-build path. The templates directory always sits at the package root\n * regardless of where the bundle lands.\n */\nfunction resolveTemplatesDir(): string {\n let current = __dirname;\n for (let i = 0; i < 6; i += 1) {\n const candidate = resolve(current, \"templates\");\n if (existsSync(candidate)) return candidate;\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return resolve(__dirname, \"../../templates\");\n}\n\nconst TEMPLATES_DIR = resolveTemplatesDir();\n\nfunction copyTemplate(src: string, dest: string): void {\n for (const entry of collectFiles(src)) {\n const relative = entry.replace(src, \"\").replace(/^\\//, \"\");\n const destPath = join(dest, relative);\n if (entry.endsWith(\".gitkeep\")) {\n const parentDir = destPath.replace(\"/.gitkeep\", \"\");\n mkdirSync(parentDir, { recursive: true });\n writeFileSync(join(parentDir, \".gitkeep\"), \"\");\n continue;\n }\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(entry, destPath);\n }\n}\n\nfunction collectFiles(dir: string): string[] {\n const results: string[] = [];\n for (const entry of readdirSync(dir)) {\n const full = join(dir, entry);\n if (statSync(full).isDirectory()) results.push(...collectFiles(full));\n else results.push(full);\n }\n return results;\n}\n\nfunction updatePackageJson(dir: string, name: string): void {\n const pkgPath = join(dir, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n pkg.name = name;\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n}\n\nfunction detectEnvKey(): string | null {\n return process.env.CENCORI_API_KEY ?? null;\n}\n\nfunction uncommentEnvLine(envPath: string, key: string, value: string): void {\n const content = readFileSync(envPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const updated = lines.map((line) => {\n const trimmed = line.trim();\n if (trimmed.startsWith(`# ${key}=`) || trimmed.startsWith(`${key}=`)) {\n return `${key}=${value}`;\n }\n return line;\n });\n if (updated.join(\"\\n\") === content) updated.push(`${key}=${value}`);\n writeFileSync(envPath, updated.join(\"\\n\") + \"\\n\");\n}\n\nfunction writeAgentModel(agentDir: string, model: string): void {\n const agentFile = join(agentDir, \"agent/agent.ts\");\n const content = readFileSync(agentFile, \"utf-8\");\n const updated = content.replace(/model:\\s*\"[^\"]+\"/, `model: \"${model}\"`);\n writeFileSync(agentFile, updated);\n}\n\nfunction runNpmInstall(cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = exec(\"npm install\", { cwd });\n proc.once(\"exit\", (code) => (code === 0 ? resolve() : reject(new Error(`npm exit ${code}`))));\n proc.once(\"error\", reject);\n });\n}\n\nconst IGNORED_DIRECTORY_ENTRIES = new Set([\".DS_Store\", \".git\", \".gitkeep\"]);\n\nfunction directoryHasMeaningfulContent(dir: string): boolean {\n try {\n return readdirSync(dir).some((entry) => !IGNORED_DIRECTORY_ENTRIES.has(entry));\n } catch {\n return false;\n }\n}\n\nfunction looksLikeArcieProject(dir: string): boolean {\n return existsSync(join(dir, \"agent\", \"agent.ts\"));\n}\n\n/**\n * Refuses to wipe a directory that is not clearly the user's project scratch\n * space. Blocks the root, the user's home, first-level system paths, and\n * anything with fewer than two non-root segments so an operator can't\n * accidentally rm-rf `/tmp` by giving init a slightly wrong argument.\n */\nfunction assertSafeToClear(dir: string): void {\n const absolute = resolve(dir);\n const home = homedir();\n if (absolute === \"/\" || absolute === home) {\n throw new Error(`Refusing to clear ${absolute}: too dangerous`);\n }\n const parts = absolute.split(\"/\").filter((part) => part.length > 0);\n if (parts.length < 2) {\n throw new Error(`Refusing to clear ${absolute}: not enough path depth`);\n }\n const dangerousFirst = new Set([\"etc\", \"var\", \"usr\", \"bin\", \"sbin\", \"System\", \"Library\"]);\n if (parts.length === 2 && dangerousFirst.has(parts[0]!)) {\n throw new Error(`Refusing to clear ${absolute}: system path`);\n }\n}\n\nfunction clearDirectoryContents(dir: string): void {\n assertSafeToClear(dir);\n for (const entry of readdirSync(dir)) {\n rmSync(join(dir, entry), { recursive: true, force: true });\n }\n}\n\nexport async function initCommand(\n name: string | undefined,\n options: { template: string },\n): Promise<void> {\n const targetDir = name ? resolve(process.cwd(), name) : resolve(process.cwd(), \".\");\n\n const templateDir = resolve(TEMPLATES_DIR, options.template);\n if (!existsSync(templateDir)) {\n console.error(` Template not found: ${options.template}`);\n process.exit(1);\n }\n\n const prompter = createTuiPrompter();\n try {\n let mode: InitMode = \"fresh\";\n if (existsSync(targetDir) && directoryHasMeaningfulContent(targetDir)) {\n const decision = await resolveExistingDirectory(prompter, targetDir);\n if (decision === \"cancel\") return;\n if (decision === \"overwrite\") {\n try {\n clearDirectoryContents(targetDir);\n prompter.log.warning(`Cleared ${targetDir}`);\n } catch (err) {\n prompter.log.error(err instanceof Error ? err.message : String(err));\n return;\n }\n } else {\n mode = \"resume\";\n }\n }\n await runInit(prompter, { targetDir, templateDir, name, mode });\n } finally {\n prompter.stop();\n }\n}\n\nasync function maybeScaffoldWebChat(prompter: Prompter, targetDir: string): Promise<void> {\n const choice = await prompter.select({\n message: \"Add a web chat UI now? (Next.js + shadcn under channels/web)\",\n options: [\n { value: \"yes\", label: \"Yes — scaffold channels/web now\" },\n { value: \"no\", label: \"No — I'll add it later with `arcie channels add web`\" },\n ],\n });\n if (choice !== \"yes\") return;\n\n try {\n const result = scaffoldWebChat(targetDir);\n if (result.alreadyExisted) {\n prompter.log.info(`channels/web already exists — left it untouched`);\n return;\n }\n prompter.log.success(`Scaffolded ${result.targetPath}`);\n prompter.section(\"Next steps\", [\n `cd ${result.targetPath.replace(process.cwd() + \"/\", \"\")}`,\n \"npm install\",\n \"cp .env.local.example .env.local\",\n \"npm run dev\",\n ]);\n } catch (err) {\n prompter.log.error(err instanceof Error ? err.message : String(err));\n }\n}\n\nasync function maybePromptProviderKey(\n prompter: Prompter,\n targetDir: string,\n modelId: string,\n): Promise<void> {\n if (process.env.CENCORI_API_KEY) return;\n const info = providerEnvVar(modelId);\n if (info === undefined) return;\n if (isProviderKeySet(targetDir, info.envVar)) return;\n\n const key = await prompter.text({\n message: `Paste your ${info.envVar} for ${info.provider} (optional — skip with Enter)`,\n mask: true,\n });\n if (key === undefined || key.length === 0) return;\n\n const envPath = join(targetDir, \".env.local\");\n uncommentEnvLine(envPath, info.envVar, key);\n process.env[info.envVar] = key;\n prompter.log.success(`Wrote ${info.envVar} to .env.local`);\n}\n\ntype InitMode = \"fresh\" | \"resume\";\ntype ExistingDirectoryDecision = \"overwrite\" | \"resume\" | \"cancel\";\n\nasync function resolveExistingDirectory(\n prompter: Prompter,\n targetDir: string,\n): Promise<ExistingDirectoryDecision> {\n const looksArcie = looksLikeArcieProject(targetDir);\n const message = looksArcie\n ? `${targetDir} already contains an arcie project.`\n : `${targetDir} is not empty.`;\n const options = looksArcie\n ? ([\n {\n value: \"resume\" as const,\n label: \"Resume — keep files, reconfigure model + API key\",\n },\n {\n value: \"overwrite\" as const,\n label: \"Overwrite — delete existing files and scaffold fresh\",\n },\n { value: \"cancel\" as const, label: \"Cancel\" },\n ])\n : ([\n {\n value: \"overwrite\" as const,\n label: \"Overwrite — delete existing files and scaffold fresh\",\n },\n {\n value: \"resume\" as const,\n label: \"Keep existing files and reconfigure\",\n },\n { value: \"cancel\" as const, label: \"Cancel\" },\n ]);\n const choice = await prompter.select({ message, options });\n return choice ?? \"cancel\";\n}\n\nasync function runInit(\n prompter: Prompter,\n input: { targetDir: string; templateDir: string; name: string | undefined; mode: InitMode },\n): Promise<void> {\n const { targetDir, templateDir, name, mode } = input;\n\n const needsScaffold = mode === \"fresh\" || !looksLikeArcieProject(targetDir);\n if (needsScaffold) {\n const scaffold = prompter.spinner(`Creating agent in ${targetDir}`);\n copyTemplate(templateDir, targetDir);\n if (name) updatePackageJson(targetDir, name);\n scaffold.stop({ kind: \"success\", message: `Created agent in ${targetDir}` });\n } else {\n prompter.log.info(`Resuming setup for ${targetDir}`);\n }\n\n const nodeModules = join(targetDir, \"node_modules\");\n if (existsSync(nodeModules)) {\n prompter.log.info(\"Dependencies already installed\");\n } else {\n const install = prompter.spinner(\"Installing dependencies\");\n try {\n await runNpmInstall(targetDir);\n install.stop({ kind: \"success\", message: \"Installed dependencies\" });\n } catch {\n install.stop({ kind: \"warning\", message: \"Dependency install skipped\" });\n }\n }\n\n if (detectEnvKey() === null) {\n const key = await prompter.text({\n message: \"Paste your CENCORI_API_KEY (optional — skip with Enter)\",\n mask: true,\n });\n if (key !== undefined && key.length > 0) {\n uncommentEnvLine(join(targetDir, \".env.local\"), \"CENCORI_API_KEY\", key);\n process.env.CENCORI_API_KEY = key;\n prompter.log.success(\"Wrote CENCORI_API_KEY to .env.local\");\n }\n }\n\n const catalogSpinner = prompter.spinner(\"Loading model catalog\");\n const catalog = await fetchModelCatalog();\n catalogSpinner.stop();\n\n const modelId = await prompter.searchableSelect({\n message: \"What model would you like to use?\",\n placeholder: \"type to filter…\",\n options: catalog.map((model: CatalogModel) => ({\n value: model.id,\n label: model.name,\n description: model.provider,\n })),\n });\n if (modelId === undefined) return;\n writeAgentModel(targetDir, modelId);\n prompter.log.success(`Set model to ${modelId}`);\n\n await maybePromptProviderKey(prompter, targetDir, modelId);\n\n const diagnostics = checkProviderKeys(targetDir, modelId);\n if (diagnostics.length > 0) {\n prompter.section(\n \"Checks\",\n diagnostics.map(\n (d) => `${d.severity === \"info\" ? \"✓\" : \"⚠\"} ${d.message}${d.fix ? ` — ${d.fix}` : \"\"}`,\n ),\n );\n }\n\n await maybeScaffoldWebChat(prompter, targetDir);\n\n const start = await prompter.select({\n message: \"Start dev server now?\",\n options: [\n { value: \"yes\", label: \"Yes — arcie dev + web UI, browser opens\" },\n { value: \"no\", label: `No — later: cd ${name ?? \".\"} && arcie dev` },\n ],\n });\n if (start !== \"yes\") {\n prompter.log.info(`later: cd ${name ?? \".\"} && arcie dev`);\n return;\n }\n\n const { devCommand } = await import(\"./dev\");\n prompter.stop();\n await devCommand({ port: \"3000\", agentDir: targetDir, input: false });\n}\n","export interface CatalogModel {\n id: string;\n name: string;\n provider: string;\n}\n\nconst MODELS: CatalogModel[] = [\n { id: \"anthropic/claude-sonnet-5\", name: \"Claude Sonnet 5\", provider: \"Anthropic\" },\n { id: \"anthropic/claude-opus-4.8\", name: \"Claude Opus 4.8\", provider: \"Anthropic\" },\n { id: \"anthropic/claude-haiku-4\", name: \"Claude Haiku 4\", provider: \"Anthropic\" },\n { id: \"openai/gpt-5.5\", name: \"GPT 5.5\", provider: \"OpenAI\" },\n { id: \"openai/gpt-5\", name: \"GPT 5\", provider: \"OpenAI\" },\n { id: \"openai/gpt-4.5\", name: \"GPT 4.5\", provider: \"OpenAI\" },\n { id: \"openai/gpt-4o\", name: \"GPT 4o\", provider: \"OpenAI\" },\n { id: \"openai/o3\", name: \"o3\", provider: \"OpenAI\" },\n { id: \"openai/o4-mini\", name: \"o4-mini\", provider: \"OpenAI\" },\n { id: \"google/gemini-2.5-pro\", name: \"Gemini 2.5 Pro\", provider: \"Google\" },\n { id: \"google/gemini-2.5-flash\", name: \"Gemini 2.5 Flash\", provider: \"Google\" },\n { id: \"google/gemini-2.0-flash\", name: \"Gemini 2.0 Flash\", provider: \"Google\" },\n { id: \"meta/llama-4\", name: \"Llama 4\", provider: \"Meta\" },\n { id: \"meta/llama-3.3-70b\", name: \"Llama 3.3 70B\", provider: \"Meta\" },\n { id: \"meta/llama-3.1-405b\", name: \"Llama 3.1 405B\", provider: \"Meta\" },\n { id: \"mistral/mistral-large-4\", name: \"Mistral Large 4\", provider: \"Mistral\" },\n { id: \"mistral/mistral-small-4\", name: \"Mistral Small 4\", provider: \"Mistral\" },\n { id: \"deepseek/deepseek-v4\", name: \"DeepSeek V4\", provider: \"DeepSeek\" },\n { id: \"deepseek/deepseek-r1\", name: \"DeepSeek R1\", provider: \"DeepSeek\" },\n { id: \"groq/llama-3.3-70b-versatile\", name: \"Llama 3.3 70B Versatile\", provider: \"Groq\" },\n { id: \"groq/llama-3.1-8b-instant\", name: \"Llama 3.1 8B Instant\", provider: \"Groq\" },\n];\n\nexport async function fetchModelCatalog(): Promise<CatalogModel[]> {\n await new Promise((r) => setTimeout(r, 600 + Math.random() * 400));\n return MODELS;\n}","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { grey, dim, yellow, green } from \"../style\";\n\nexport interface Diagnostic {\n severity: \"info\" | \"warn\" | \"error\";\n message: string;\n fix?: string;\n}\n\nconst PROVIDER_KEY_MAP: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n groq: \"GROQ_API_KEY\",\n deepseek: \"DEEPSEEK_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n meta: \"TOGETHER_API_KEY\",\n};\n\nexport function providerEnvVar(modelId: string): { provider: string; envVar: string } | undefined {\n const provider = modelId.split(\"/\")[0];\n if (!provider) return undefined;\n const envVar = PROVIDER_KEY_MAP[provider];\n return envVar ? { provider, envVar } : undefined;\n}\n\nexport function isProviderKeySet(agentDir: string, envVar: string): boolean {\n if (process.env[envVar] && process.env[envVar] !== \"\") return true;\n const envPath = join(agentDir, \"..\", \".env.local\");\n if (!existsSync(envPath)) return false;\n const content = readFileSync(envPath, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(`${envVar}=`) && !trimmed.startsWith(`#`)) return true;\n }\n return false;\n}\n\nexport function checkProviderKeys(agentDir: string, modelId: string): Diagnostic[] {\n const results: Diagnostic[] = [];\n\n const info = providerEnvVar(modelId);\n if (info === undefined) return results;\n const { provider, envVar } = info;\n\n const envPath = join(agentDir, \"..\", \".env.local\");\n let hasKey = false;\n\n if (existsSync(envPath)) {\n const content = readFileSync(envPath, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(`${envVar}=`) && !trimmed.startsWith(`#`)) {\n hasKey = true;\n break;\n }\n }\n }\n\n const inProcess = process.env[envVar] && process.env[envVar] !== \"\";\n\n if (!hasKey && !inProcess) {\n results.push({\n severity: \"warn\",\n message: `Missing ${envVar} for provider: ${provider}`,\n fix: `Add ${envVar}=your_key_here to .env.local`,\n });\n } else {\n results.push({\n severity: \"info\",\n message: `${envVar} is configured`,\n });\n }\n\n return results;\n}\n\nexport function printDiagnostics(diagnostics: Diagnostic[]): void {\n for (const d of diagnostics) {\n const icon = d.severity === \"error\" ? yellow(\"\\u26A0\")\n : d.severity === \"warn\" ? yellow(\"\\u26A0\")\n : grey(\"\\u2713\");\n const msg = d.severity === \"error\" ? yellow(d.message)\n : d.severity === \"warn\" ? yellow(d.message)\n : grey(d.message);\n console.log(` ${icon} ${msg}`);\n if (d.fix) {\n console.log(` ${dim(d.fix)}`);\n }\n }\n}\n","import type { SelectOption } from \"./prompter\";\n\nexport interface SelectState<T = string> {\n readonly options: readonly SelectOption<T>[];\n readonly matches: readonly SelectOption<T>[];\n readonly selectedIndex: number;\n readonly query: string;\n}\n\nexport interface CreateSelectStateOptions<T> {\n readonly initialValue?: T;\n readonly query?: string;\n}\n\nexport function createSelectState<T>(\n options: readonly SelectOption<T>[],\n init: CreateSelectStateOptions<T> = {},\n): SelectState<T> {\n const query = init.query ?? \"\";\n const matches = filterOptions(options, query);\n const initial = init.initialValue;\n const selectedIndex =\n initial === undefined\n ? 0\n : Math.max(\n 0,\n matches.findIndex((option) => option.value === initial),\n );\n return { options, matches, selectedIndex, query };\n}\n\nexport function setQuery<T>(state: SelectState<T>, query: string): SelectState<T> {\n if (query === state.query) return state;\n const matches = filterOptions(state.options, query);\n const carried = state.matches[state.selectedIndex];\n const carriedIndex =\n carried === undefined\n ? -1\n : matches.findIndex((option) => option.value === carried.value);\n return {\n options: state.options,\n matches,\n selectedIndex: carriedIndex >= 0 ? carriedIndex : 0,\n query,\n };\n}\n\nexport function moveUp<T>(state: SelectState<T>): SelectState<T> {\n const count = state.matches.length;\n if (count === 0) return state;\n const selectedIndex = (state.selectedIndex - 1 + count) % count;\n return { ...state, selectedIndex };\n}\n\nexport function moveDown<T>(state: SelectState<T>): SelectState<T> {\n const count = state.matches.length;\n if (count === 0) return state;\n const selectedIndex = (state.selectedIndex + 1) % count;\n return { ...state, selectedIndex };\n}\n\nexport function selected<T>(state: SelectState<T>): SelectOption<T> | undefined {\n return state.matches[state.selectedIndex];\n}\n\nfunction filterOptions<T>(\n options: readonly SelectOption<T>[],\n query: string,\n): readonly SelectOption<T>[] {\n const normalized = query.trim().toLowerCase();\n if (normalized.length === 0) return options;\n return options.filter((option) => optionMatches(option, normalized));\n}\n\nfunction optionMatches<T>(option: SelectOption<T>, query: string): boolean {\n if (option.label.toLowerCase().includes(query)) return true;\n if (option.description !== undefined && option.description.toLowerCase().includes(query)) {\n return true;\n }\n return false;\n}\n","import { EMPTY_LINE, applyLineEditorKey, lineOf, type LineState } from \"../tui/line-editor\";\nimport type { TerminalKey } from \"../tui/key-parser\";\n\nexport interface TextInputState {\n readonly line: LineState;\n readonly message: string;\n readonly placeholder?: string;\n readonly mask: boolean;\n readonly validate?: (value: string) => string | undefined;\n readonly validationError?: string;\n}\n\nexport interface CreateTextInputOptions {\n readonly message: string;\n readonly placeholder?: string;\n readonly defaultValue?: string;\n readonly mask?: boolean;\n readonly validate?: (value: string) => string | undefined;\n}\n\nexport function createTextInputState(options: CreateTextInputOptions): TextInputState {\n const line = options.defaultValue ? lineOf(options.defaultValue) : EMPTY_LINE;\n const state: TextInputState = {\n line,\n message: options.message,\n mask: options.mask ?? false,\n };\n const result: TextInputState = { ...state };\n if (options.placeholder !== undefined) (result as { placeholder?: string }).placeholder = options.placeholder;\n if (options.validate !== undefined) (result as { validate?: (v: string) => string | undefined }).validate = options.validate;\n return result;\n}\n\nexport function applyTextInputKey(\n state: TextInputState,\n key: TerminalKey,\n): TextInputState | undefined {\n const nextLine = applyLineEditorKey(state.line, key, { multiline: false });\n if (nextLine === undefined) return undefined;\n const next: TextInputState = { ...state, line: nextLine };\n if (state.validationError !== undefined) {\n (next as { validationError?: string }).validationError = undefined;\n }\n return next;\n}\n\n/**\n * Runs the caller-supplied `validate` against the current draft and returns\n * a state carrying the error message, or `undefined` when the draft is\n * accepted. Submit paths call this and only complete the promise when it\n * returns `undefined`.\n */\nexport function validateTextInput(state: TextInputState): TextInputState | undefined {\n if (state.validate === undefined) return undefined;\n const error = state.validate(state.line.text);\n if (error === undefined) return undefined;\n return { ...state, validationError: error };\n}\n","import type { Theme } from \"../tui/theme\";\nimport { maskLine, visibleLine } from \"../tui/line-editor\";\nimport { inputTextWidth, sliceVisible, visibleLength } from \"../ui/terminal-text\";\nimport type { SelectState } from \"./select-input\";\nimport type { TextInputState } from \"./text-input\";\n\nexport interface PanelCaret {\n readonly row: number;\n readonly col: number;\n}\n\nexport interface PanelFrame {\n readonly rows: string[];\n readonly caret: PanelCaret;\n}\n\n/** Maximum select options rendered at once; longer lists window around the highlight. */\nconst MAX_VISIBLE_OPTIONS = 10;\n\nexport function renderTextPanel(\n state: TextInputState,\n theme: Theme,\n width: number,\n): PanelFrame {\n const c = theme.colors;\n const rows: string[] = [renderHeader(state.message, theme, width)];\n\n const promptGlyph = c.cyan(theme.glyph.prompt);\n const promptWidth = visibleLength(`${theme.glyph.prompt} `);\n const budget = Math.max(1, width - promptWidth - 2);\n\n const displayLine = state.mask ? maskLine(state.line) : state.line;\n const view = visibleLine(displayLine, budget);\n const under = view.under.length === 0 ? \" \" : view.under;\n const inputRow = ` ${promptGlyph} ${view.before}${c.inverse(under)}${view.after}`;\n\n if (state.line.text.length === 0 && state.placeholder !== undefined) {\n const placeholder = c.dim(sliceVisible(state.placeholder, budget));\n rows.push(` ${promptGlyph} ${c.inverse(\" \")}${placeholder}`);\n } else {\n rows.push(inputRow);\n }\n\n if (state.validationError !== undefined) {\n rows.push(` ${c.red(theme.glyph.error)} ${c.red(state.validationError)}`);\n }\n\n const caretCol =\n 3 + promptWidth + inputTextWidth(state.mask ? maskLine(state.line).text.slice(0, maskLine(state.line).cursor) : view.before);\n\n return { rows, caret: { row: 2, col: caretCol } };\n}\n\nexport function renderSelectPanel<T>(\n state: SelectState<T>,\n message: string,\n theme: Theme,\n width: number,\n options: { searchable?: boolean; placeholder?: string } = {},\n): PanelFrame {\n const rows: string[] = [renderHeader(message, theme, width)];\n let caretRow = 1;\n let caretCol = 3;\n\n if (options.searchable === true) {\n const budget = Math.max(1, width - 4);\n const [filterRow, cursorCol] = renderFilterRow(state.query, budget, theme, options.placeholder);\n rows.push(filterRow);\n caretRow = 2;\n caretCol = cursorCol;\n }\n\n rows.push(...renderOptionRows(state, theme, width));\n return { rows, caret: { row: caretRow, col: caretCol } };\n}\n\nfunction renderHeader(message: string, theme: Theme, width: number): string {\n const c = theme.colors;\n const glyph = c.yellow(c.bold(theme.glyph.question));\n const trimmed = message.trim();\n const budget = Math.max(1, width - 2);\n return `${glyph} ${c.bold(sliceVisible(trimmed, budget))}`;\n}\n\nfunction renderFilterRow(\n query: string,\n budget: number,\n theme: Theme,\n placeholder: string | undefined,\n): [string, number] {\n const c = theme.colors;\n const prefix = ` ${c.dim(\"/\")} `;\n const prefixWidth = visibleLength(prefix);\n const empty = query.length === 0;\n const visible = empty\n ? placeholder !== undefined\n ? c.dim(sliceVisible(placeholder, budget))\n : c.dim(sliceVisible(\"type to filter\", budget))\n : sliceVisible(query, budget);\n const row = `${prefix}${empty ? c.inverse(\" \") : `${visible}${c.inverse(\" \")}`}`;\n const caretCol = 1 + prefixWidth + (empty ? 0 : visibleLength(visible));\n return [row, caretCol];\n}\n\nfunction renderOptionRows<T>(state: SelectState<T>, theme: Theme, width: number): string[] {\n const c = theme.colors;\n if (state.matches.length === 0) {\n return [` ${c.dim(\"no matches\")}`];\n }\n\n const count = state.matches.length;\n const viewSize = Math.min(count, MAX_VISIBLE_OPTIONS);\n const start = Math.max(\n 0,\n Math.min(state.selectedIndex - Math.floor(viewSize / 2), count - viewSize),\n );\n const end = Math.min(start + viewSize, count);\n const visible = state.matches.slice(start, end);\n\n const labelWidth = Math.min(\n Math.max(...visible.map((option) => visibleLength(option.label))),\n Math.max(8, Math.floor(width * 0.5)),\n );\n\n return visible.map((option, offset) => {\n const isCursor = start + offset === state.selectedIndex;\n const pointer = isCursor ? c.cyan(theme.glyph.selectedPointer) : \" \";\n const label = padLabel(option.label, labelWidth);\n const styledLabel = isCursor ? c.bold(label) : label;\n const description =\n option.description !== undefined ? ` ${c.dim(option.description)}` : \"\";\n return `${pointer} ${styledLabel}${description}`;\n });\n}\n\nfunction padLabel(label: string, width: number): string {\n const visible = visibleLength(label);\n if (visible >= width) return sliceVisible(label, width);\n return `${label}${\" \".repeat(width - visible)}`;\n}\n\n","import { LiveRegion, type TerminalOutput } from \"../tui/renderer/live-region\";\nimport { attachKeyStream } from \"../tui/attach-keys\";\nimport { createTheme, detectUnicode, type Theme } from \"../tui/theme\";\nimport type { TerminalKey } from \"../tui/key-parser\";\nimport { applyLineEditorKey } from \"../tui/line-editor\";\nimport { renderCliTaggedLine } from \"../ui/output\";\nimport type {\n AcknowledgePromptOptions,\n Prompter,\n SelectPromptOptions,\n SearchableSelectPromptOptions,\n SpinnerHandle,\n SpinnerOutcome,\n TextPromptOptions,\n} from \"./prompter\";\nimport {\n createSelectState,\n moveDown,\n moveUp,\n selected,\n setQuery,\n type SelectState,\n} from \"./select-input\";\nimport {\n applyTextInputKey,\n createTextInputState,\n validateTextInput,\n type TextInputState,\n} from \"./text-input\";\nimport { renderSelectPanel, renderTextPanel } from \"./setup-panel\";\n\nexport interface TuiPrompterOptions {\n readonly output?: TerminalOutput;\n readonly theme?: Theme;\n readonly spinnerIntervalMs?: number;\n}\n\nexport function createTuiPrompter(options: TuiPrompterOptions = {}): Prompter {\n return new TuiPrompter(options);\n}\n\nclass TuiPrompter implements Prompter {\n readonly #region: LiveRegion;\n readonly #theme: Theme;\n readonly #spinnerIntervalMs: number;\n #detachKeys: (() => void) | undefined;\n #spinnerTimer: ReturnType<typeof setInterval> | undefined;\n #spinnerFrame = 0;\n #spinnerMessage = \"\";\n #stopped = false;\n\n constructor(options: TuiPrompterOptions) {\n this.#theme = options.theme ?? createTheme({ unicode: detectUnicode() });\n this.#region = new LiveRegion({ output: options.output });\n this.#spinnerIntervalMs = options.spinnerIntervalMs ?? 90;\n }\n\n get log() {\n return {\n info: (message: string) => this.#writeTagged(\"info\", message, \"info\"),\n success: (message: string) => this.#writeTagged(\"ok\", message, \"success\"),\n warning: (message: string) => this.#writeTagged(\"warn\", message, \"warning\"),\n error: (message: string) => this.#writeTagged(\"error\", message, \"danger\"),\n };\n }\n\n section(title: string, lines: readonly string[]): void {\n const c = this.#theme.colors;\n const rows = [c.bold(c.cyan(title))];\n for (const line of lines) rows.push(` ${c.dim(line)}`);\n this.#region.commit(rows);\n }\n\n spinner(message: string): SpinnerHandle {\n this.#stopSpinner();\n this.#spinnerMessage = message;\n this.#spinnerFrame = 0;\n this.#paintSpinner();\n this.#spinnerTimer = setInterval(() => {\n this.#spinnerFrame += 1;\n this.#paintSpinner();\n }, this.#spinnerIntervalMs);\n this.#spinnerTimer.unref?.();\n\n return {\n update: (next: string) => {\n this.#spinnerMessage = next;\n this.#paintSpinner();\n },\n stop: (outcome: SpinnerOutcome = { kind: \"silent\" }) => {\n this.#stopSpinner();\n this.#region.paint([], { row: 1, col: 1 });\n if (outcome.kind === \"silent\") return;\n this.#writeTagged(\n outcome.kind === \"success\" ? \"ok\" : outcome.kind === \"warning\" ? \"warn\" : \"error\",\n outcome.message ?? this.#spinnerMessage,\n outcome.kind === \"success\"\n ? \"success\"\n : outcome.kind === \"warning\"\n ? \"warning\"\n : \"danger\",\n );\n },\n };\n }\n\n async text(options: TextPromptOptions): Promise<string | undefined> {\n this.#stopSpinner();\n return this.#runPrompt<string>((resolve) => {\n let state: TextInputState = createTextInputState(options);\n const paint = () => this.#paintFrame(this.#textFrame(state));\n paint();\n return (key) => {\n if (key.type === \"ctrl-c\" || key.type === \"escape\") {\n resolve(undefined);\n return \"end\";\n }\n if (key.type === \"enter\") {\n const failed = validateTextInput(state);\n if (failed !== undefined) {\n state = failed;\n paint();\n return \"continue\";\n }\n resolve(state.line.text);\n return \"end\";\n }\n const next = applyTextInputKey(state, key);\n if (next !== undefined) {\n state = next;\n paint();\n }\n return \"continue\";\n };\n });\n }\n\n async select<T>(options: SelectPromptOptions<T>): Promise<T | undefined> {\n return this.#selectImpl(options, false);\n }\n\n async searchableSelect<T>(options: SearchableSelectPromptOptions<T>): Promise<T | undefined> {\n return this.#selectImpl(options, true);\n }\n\n async acknowledge(options: AcknowledgePromptOptions): Promise<void> {\n this.#stopSpinner();\n await this.#runPrompt<void>((resolve) => {\n const c = this.#theme.colors;\n const rows = [`${c.yellow(c.bold(this.#theme.glyph.question))} ${c.bold(options.message)}`];\n for (const line of options.lines ?? []) rows.push(` ${c.dim(line)}`);\n rows.push(` ${c.dim(\"press enter to continue\")}`);\n this.#region.paint(rows, { row: rows.length, col: 1 });\n return (key) => {\n if (key.type === \"ctrl-c\" || key.type === \"escape\" || key.type === \"enter\") {\n resolve();\n return \"end\";\n }\n return \"continue\";\n };\n });\n }\n\n stop(): void {\n if (this.#stopped) return;\n this.#stopped = true;\n this.#stopSpinner();\n this.#detachKeys?.();\n this.#detachKeys = undefined;\n this.#region.stop();\n }\n\n async #selectImpl<T>(\n options: SelectPromptOptions<T> | SearchableSelectPromptOptions<T>,\n searchable: boolean,\n ): Promise<T | undefined> {\n this.#stopSpinner();\n return this.#runPrompt<T>((resolve) => {\n let state: SelectState<T> = createSelectState(options.options, {\n initialValue: options.initialValue,\n });\n const placeholder =\n \"placeholder\" in options ? (options as SearchableSelectPromptOptions<T>).placeholder : undefined;\n const paint = () =>\n this.#paintFrame(\n renderSelectPanel(state, options.message, this.#theme, this.#region.columns, {\n searchable,\n placeholder,\n }),\n );\n paint();\n return (key) => {\n if (key.type === \"ctrl-c\" || key.type === \"escape\") {\n resolve(undefined);\n return \"end\";\n }\n if (key.type === \"enter\") {\n const chosen = selected(state);\n if (chosen === undefined) return \"continue\";\n resolve(chosen.value);\n return \"end\";\n }\n if (key.type === \"up\" || key.type === \"ctrl-p\") {\n state = moveUp(state);\n paint();\n return \"continue\";\n }\n if (key.type === \"down\" || key.type === \"ctrl-n\") {\n state = moveDown(state);\n paint();\n return \"continue\";\n }\n if (searchable) {\n if (key.type === \"backspace\") {\n state = setQuery(state, state.query.slice(0, -1));\n paint();\n return \"continue\";\n }\n if (key.type === \"text\") {\n state = setQuery(state, `${state.query}${key.value}`);\n paint();\n return \"continue\";\n }\n const draft = applyLineEditorKey({ text: state.query, cursor: state.query.length }, key, {\n multiline: false,\n });\n if (draft !== undefined && draft.text !== state.query) {\n state = setQuery(state, draft.text);\n paint();\n }\n }\n return \"continue\";\n };\n });\n }\n\n #runPrompt<T>(\n setup: (resolve: (value: T | undefined) => void) => (key: TerminalKey) => \"continue\" | \"end\",\n ): Promise<T | undefined> {\n return new Promise<T | undefined>((resolve) => {\n let done = false;\n const detach = attachKeyStream((key) => {\n if (done) return;\n const outcome = onKey(key);\n if (outcome === \"end\") {\n done = true;\n this.#detachKeys?.();\n this.#detachKeys = undefined;\n this.#region.paint([], { row: 1, col: 1 });\n }\n });\n this.#detachKeys = detach;\n const onKey = setup((value) => resolve(value));\n });\n }\n\n #textFrame(state: TextInputState) {\n return renderTextPanel(state, this.#theme, this.#region.columns);\n }\n\n #paintFrame(frame: { rows: string[]; caret: { row: number; col: number } }): void {\n this.#region.paint(frame.rows, frame.caret);\n }\n\n #paintSpinner(): void {\n const glyph = this.#theme.spinner[this.#spinnerFrame % this.#theme.spinner.length] ?? \"-\";\n const row = `${this.#theme.colors.cyan(glyph)} ${this.#spinnerMessage}`;\n this.#region.paint([row], { row: 1, col: 1 });\n }\n\n #stopSpinner(): void {\n if (this.#spinnerTimer !== undefined) {\n clearInterval(this.#spinnerTimer);\n this.#spinnerTimer = undefined;\n }\n }\n\n #writeTagged(tag: string, message: string, tone: \"info\" | \"success\" | \"warning\" | \"danger\"): void {\n const themeAdapter = {\n accent: this.#theme.colors.cyan,\n color: this.#theme.color,\n danger: this.#theme.colors.red,\n heading: (t: string) => this.#theme.colors.bold(this.#theme.colors.cyan(t)),\n info: this.#theme.colors.blue,\n label: this.#theme.colors.bold,\n muted: this.#theme.colors.dim,\n plain: (t: string) => t,\n subagent: this.#theme.colors.orange,\n success: this.#theme.colors.green,\n warning: this.#theme.colors.yellow,\n };\n this.#region.commit([\n renderCliTaggedLine(themeAdapter, { message, tag, tone }),\n ]);\n }\n}\n"],"mappings":"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","names":["existsSync","readFileSync","join","resolve","existsSync","join","readFileSync","resolve"]}