arcie 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_tsup-dts-rollup.d.ts +2243 -0
- package/dist/agent/index.d.ts +1 -6
- package/dist/auth/index.d.ts +4 -11
- package/dist/channels/index.d.ts +3 -8
- package/dist/cli/index.d.ts +1 -8
- package/dist/cli/index.js +14 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/context/index.d.ts +9 -14
- package/dist/{dev-ZZDVOWUZ.js → dev-A6KGOSNL.js} +86 -62
- package/dist/dev-A6KGOSNL.js.map +1 -0
- package/dist/discover/index.d.ts +6 -41
- package/dist/hooks/index.d.ts +1 -6
- package/dist/index.d.ts +113 -297
- package/dist/{init-5F7CIVLN.js → init-DNVKDUHX.js} +3 -3
- package/dist/instructions/index.d.ts +2 -7
- package/dist/protocol/events.d.ts +44 -200
- package/dist/runner/index.d.ts +4 -4
- package/dist/schedules/index.d.ts +1 -6
- package/dist/skills/index.d.ts +2 -7
- package/dist/tools/index.d.ts +3 -13
- package/package.json +2 -1
- package/templates/web-chat/app/globals.css +10 -0
- package/templates/web-chat/app/layout.tsx +1 -1
- package/templates/web-chat/app/page.tsx +1 -1
- package/templates/web-chat/components/chat.tsx +179 -156
- package/templates/web-chat/components/input-bar.tsx +146 -39
- package/templates/web-chat/components/message.tsx +90 -30
- package/templates/web-chat/components/tool-call.tsx +8 -8
- package/templates/web-chat/lib/types.ts +1 -0
- package/templates/web-chat/next.config.mjs +3 -1
- package/templates/web-chat/package.json +1 -0
- package/templates/web-chat/tailwind.config.ts +3 -1
- package/dist/dev-ZZDVOWUZ.js.map +0 -1
- package/dist/index-CElLRVTP.d.ts +0 -136
- package/dist/types-DwxwdSa2.d.ts +0 -151
- /package/dist/{init-5F7CIVLN.js.map → init-DNVKDUHX.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/dev.ts","../src/cli/tui/renderer/start-block-chat.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 { createServer } from \"node:http\";\nimport { resolve } from \"node:path\";\nimport { loadAgent } 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}\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\n/**\n * Binds `server` to the first free port starting at `startPort`, walking\n * forward one port at a time until it finds one or exhausts the attempt\n * budget. Returns the bound port. Non-EADDRINUSE errors bubble up.\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\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 server = createServer(async (req, res) => {\n if (await handleSessionsRequest(req, res)) {\n return;\n }\n\n if (req.method === \"POST\" && req.url === \"/\") {\n let body = \"\";\n for await (const chunk of req) body += chunk;\n\n try {\n const { message, stream } = JSON.parse(body);\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\n for await (const event of streamAgent(agentDirPath, message)) {\n res.write(JSON.stringify(event) + \"\\n\");\n }\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n for await (const _event of streamAgent(agentDirPath, message)) {}\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 } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\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(`http://localhost:${boundPort}`)}`);\n console.log();\n console.log(` ${dimmed(`$ curl -X POST http://localhost:${boundPort} \\\\`)}`);\n console.log(` ${dimmed(` -H \"Content-Type: application/json\" \\\\`)}`);\n console.log(` ${dimmed(` -d '{\"message\": \"hello\"}'`)}`);\n console.log();\n\n const missing = checkProviderKeys(agent.manifest.config.model);\n if (missing.length > 0) {\n console.log(` ${grey(\"⚠\")} Missing API keys: ${missing.join(\", \")}`);\n console.log(` ${dimmed(\" Set them in .env.local or your environment\")}`);\n console.log();\n }\n } catch {\n console.log(` ${agentDirPath}`);\n console.log();\n console.log(` ${dimmed(`http://localhost:${boundPort}`)}`);\n console.log();\n }\n }\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 { parsePromptCommand, formatPromptCommandHelp } from \"../prompt-commands\";\nimport { attachKeyStream } from \"../attach-keys\";\nimport { EventTranslator } from \"./event-to-blocks\";\nimport { TerminalRenderer } from \"./terminal-renderer\";\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 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.writeError(\"Unknown command\", `${trimmed} — try /help`);\n continue;\n }\n switch (command.type) {\n case \"exit\":\n return;\n case \"help\":\n for (const line of formatPromptCommandHelp().split(\"\\n\")) {\n renderer.writeNotice(line);\n }\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 renderer.writeNotice(`/${command.name} not yet implemented`);\n continue;\n case \"loglevel\":\n renderer.writeNotice(\"logs not yet implemented\");\n continue;\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\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","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: \"Configure the agent's model and provider\",\n argumentHint: \"[provider/model]\",\n takesArgument: true,\n build: (argument) => ({ type: \"extension\", name: \"model\", argument }),\n },\n {\n name: \"provider\",\n aliases: [],\n description: \"Configure provider API keys\",\n takesArgument: false,\n build: () => ({ type: \"extension\", name: \"provider\", argument: \"\" }),\n },\n {\n name: \"channels\",\n aliases: [],\n description: \"Add chat channels to the agent\",\n takesArgument: false,\n build: () => ({ 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 | \"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 \"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\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 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":["resolve","resolve","resolve"]}
|
package/dist/discover/index.d.ts
CHANGED
|
@@ -1,41 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
/** A subagent is a nested agent directory, not a flat file. */
|
|
8
|
-
interface DiscoveredSubagent {
|
|
9
|
-
id: string;
|
|
10
|
-
root: string;
|
|
11
|
-
agentConfig?: string;
|
|
12
|
-
instructions?: string;
|
|
13
|
-
tools: DiscoveredSlot[];
|
|
14
|
-
skills: DiscoveredSlot[];
|
|
15
|
-
}
|
|
16
|
-
interface DiscoveredAgent {
|
|
17
|
-
root: string;
|
|
18
|
-
agentConfig?: string;
|
|
19
|
-
instructions?: string;
|
|
20
|
-
tools: DiscoveredSlot[];
|
|
21
|
-
skills: DiscoveredSlot[];
|
|
22
|
-
hooks: DiscoveredSlot[];
|
|
23
|
-
channels: DiscoveredSlot[];
|
|
24
|
-
schedules: DiscoveredSlot[];
|
|
25
|
-
connections: DiscoveredSlot[];
|
|
26
|
-
subagents: DiscoveredSubagent[];
|
|
27
|
-
lib: DiscoveredSlot[];
|
|
28
|
-
}
|
|
29
|
-
interface DiscoverDiagnostic {
|
|
30
|
-
code: string;
|
|
31
|
-
message: string;
|
|
32
|
-
severity: "error" | "warning";
|
|
33
|
-
filePath?: string;
|
|
34
|
-
}
|
|
35
|
-
interface DiscoverResult {
|
|
36
|
-
agent: DiscoveredAgent;
|
|
37
|
-
diagnostics: DiscoverDiagnostic[];
|
|
38
|
-
}
|
|
39
|
-
declare function discoverAgent(agentDir: string): DiscoverResult;
|
|
40
|
-
|
|
41
|
-
export { type DiscoverDiagnostic, type DiscoverResult, type DiscoveredAgent, type DiscoveredSlot, type DiscoveredSubagent, discoverAgent };
|
|
1
|
+
export { discoverAgent_alias_1 as discoverAgent } from '../_tsup-dts-rollup.js';
|
|
2
|
+
export { DiscoveredSlot } from '../_tsup-dts-rollup.js';
|
|
3
|
+
export { DiscoveredSubagent } from '../_tsup-dts-rollup.js';
|
|
4
|
+
export { DiscoveredAgent } from '../_tsup-dts-rollup.js';
|
|
5
|
+
export { DiscoverDiagnostic } from '../_tsup-dts-rollup.js';
|
|
6
|
+
export { DiscoverResult } from '../_tsup-dts-rollup.js';
|
package/dist/hooks/index.d.ts
CHANGED