arcie 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -6
- package/dist/agent/index.d.ts +6 -3
- package/dist/agent/index.js +6 -6
- package/dist/agent/index.js.map +1 -1
- package/dist/auth/index.d.ts +6 -5
- package/dist/auth/index.js +8 -17
- package/dist/auth/index.js.map +1 -1
- package/dist/build-TWNCPXBU.js +82 -0
- package/dist/build-TWNCPXBU.js.map +1 -0
- package/dist/channels/index.d.ts +8 -5
- package/dist/channels/index.js +10 -12
- package/dist/channels/index.js.map +1 -1
- package/dist/chunk-3CNQ6HQV.js +12 -0
- package/dist/chunk-3CNQ6HQV.js.map +1 -0
- package/dist/chunk-4L7WVCTU.js +12 -0
- package/dist/chunk-4L7WVCTU.js.map +1 -0
- package/dist/chunk-4WSILP75.js +1774 -0
- package/dist/chunk-4WSILP75.js.map +1 -0
- package/dist/chunk-6XETPLIF.js +176 -0
- package/dist/chunk-6XETPLIF.js.map +1 -0
- package/dist/chunk-CKHBEZCT.js +24 -0
- package/dist/chunk-CKHBEZCT.js.map +1 -0
- package/dist/chunk-FQ7KDNV5.js +12 -0
- package/dist/chunk-FQ7KDNV5.js.map +1 -0
- package/dist/chunk-HVBDOHTL.js +148 -0
- package/dist/chunk-HVBDOHTL.js.map +1 -0
- package/dist/chunk-HWD2Z2CH.js +742 -0
- package/dist/chunk-HWD2Z2CH.js.map +1 -0
- package/dist/chunk-KVSX4MLK.js +139 -0
- package/dist/chunk-KVSX4MLK.js.map +1 -0
- package/dist/chunk-L3BTL5FM.js +39 -0
- package/dist/chunk-L3BTL5FM.js.map +1 -0
- package/dist/chunk-LQC65UHE.js +34 -0
- package/dist/chunk-LQC65UHE.js.map +1 -0
- package/dist/chunk-N5R3TEEZ.js +15 -0
- package/dist/chunk-N5R3TEEZ.js.map +1 -0
- package/dist/chunk-PHTJLJOV.js +25 -0
- package/dist/chunk-PHTJLJOV.js.map +1 -0
- package/dist/chunk-QE46QFID.js +92 -0
- package/dist/chunk-QE46QFID.js.map +1 -0
- package/dist/chunk-SGWQZZ2A.js +54 -0
- package/dist/chunk-SGWQZZ2A.js.map +1 -0
- package/dist/chunk-WAD7VLNI.js +51 -0
- package/dist/chunk-WAD7VLNI.js.map +1 -0
- package/dist/chunk-XOFWQUOO.js +30 -0
- package/dist/chunk-XOFWQUOO.js.map +1 -0
- package/dist/chunk-ZJNHQXMO.js +20 -0
- package/dist/chunk-ZJNHQXMO.js.map +1 -0
- package/dist/cli/index.d.ts +7 -2
- package/dist/cli/index.js +171 -41
- package/dist/cli/index.js.map +1 -1
- package/dist/context/index.d.ts +14 -11
- package/dist/context/index.js +22 -37
- package/dist/context/index.js.map +1 -1
- package/dist/dev-ZZDVOWUZ.js +1967 -0
- package/dist/dev-ZZDVOWUZ.js.map +1 -0
- package/dist/discover/index.d.ts +17 -7
- package/dist/discover/index.js +6 -132
- package/dist/discover/index.js.map +1 -1
- package/dist/hooks/index.d.ts +6 -3
- package/dist/hooks/index.js +6 -6
- package/dist/hooks/index.js.map +1 -1
- package/dist/index-CElLRVTP.d.ts +136 -0
- package/dist/index.d.ts +297 -18
- package/dist/index.js +160 -13
- package/dist/index.js.map +1 -1
- package/dist/init-5F7CIVLN.js +822 -0
- package/dist/init-5F7CIVLN.js.map +1 -0
- package/dist/instructions/index.d.ts +7 -4
- package/dist/instructions/index.js +8 -32
- package/dist/instructions/index.js.map +1 -1
- package/dist/protocol/events.d.ts +47 -39
- package/dist/protocol/events.js +46 -45
- package/dist/protocol/events.js.map +1 -1
- package/dist/runner/index.d.ts +4 -18
- package/dist/runner/index.js +11 -277
- package/dist/runner/index.js.map +1 -1
- package/dist/scaffold-web-chat-OQL5C2GK.js +7 -0
- package/dist/scaffold-web-chat-OQL5C2GK.js.map +1 -0
- package/dist/schedules/index.d.ts +6 -3
- package/dist/schedules/index.js +6 -6
- package/dist/schedules/index.js.map +1 -1
- package/dist/skills/index.d.ts +7 -4
- package/dist/skills/index.js +8 -27
- package/dist/skills/index.js.map +1 -1
- package/dist/tools/index.d.ts +13 -3
- package/dist/tools/index.js +8 -9
- package/dist/tools/index.js.map +1 -1
- package/dist/types-DwxwdSa2.d.ts +151 -0
- package/docs/getting-started.md +2 -2
- package/docs/index.md +3 -2
- package/docs/project-layout.md +2 -2
- package/docs/subagents.md +95 -0
- package/package.json +15 -10
- package/templates/default/.env.local +12 -0
- package/templates/default/agent/agent.ts +2 -2
- package/templates/default/package.json +3 -3
- package/templates/web-chat/.env.local.example +4 -0
- package/templates/web-chat/README.md +51 -0
- package/templates/web-chat/app/api/chat/route.ts +43 -0
- package/templates/web-chat/app/globals.css +55 -0
- package/templates/web-chat/app/layout.tsx +15 -0
- package/templates/web-chat/app/page.tsx +9 -0
- package/templates/web-chat/components/chat.tsx +196 -0
- package/templates/web-chat/components/input-bar.tsx +74 -0
- package/templates/web-chat/components/message.tsx +63 -0
- package/templates/web-chat/components/tool-call.tsx +79 -0
- package/templates/web-chat/components/ui/button.tsx +46 -0
- package/templates/web-chat/components/ui/input.tsx +19 -0
- package/templates/web-chat/components.json +20 -0
- package/templates/web-chat/lib/stream.ts +41 -0
- package/templates/web-chat/lib/types.ts +61 -0
- package/templates/web-chat/lib/utils.ts +6 -0
- package/templates/web-chat/next.config.mjs +4 -0
- package/templates/web-chat/package.json +32 -0
- package/templates/web-chat/postcss.config.mjs +6 -0
- package/templates/web-chat/tailwind.config.ts +59 -0
- package/templates/web-chat/tsconfig.json +23 -0
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/channels/index.d.ts.map +0 -1
- package/dist/cli/banner.d.ts +0 -2
- package/dist/cli/banner.d.ts.map +0 -1
- package/dist/cli/banner.js +0 -10
- package/dist/cli/banner.js.map +0 -1
- package/dist/cli/build.d.ts +0 -5
- package/dist/cli/build.d.ts.map +0 -1
- package/dist/cli/build.js +0 -54
- package/dist/cli/build.js.map +0 -1
- package/dist/cli/dev.d.ts +0 -5
- package/dist/cli/dev.d.ts.map +0 -1
- package/dist/cli/dev.js +0 -74
- package/dist/cli/dev.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/init.d.ts +0 -4
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js +0 -75
- package/dist/cli/init.js.map +0 -1
- package/dist/context/index.d.ts.map +0 -1
- package/dist/discover/index.d.ts.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/instructions/index.d.ts.map +0 -1
- package/dist/loader.d.ts +0 -7
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -102
- package/dist/loader.js.map +0 -1
- package/dist/protocol/events.d.ts.map +0 -1
- package/dist/runner/index.d.ts.map +0 -1
- package/dist/schedules/index.d.ts.map +0 -1
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/types.d.ts +0 -118
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
|
@@ -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\nexport async function devCommand(options: DevOptions): Promise<void> {\n const agentDirPath = resolve(process.cwd(), options.agentDir);\n const port = parseInt(options.port, 10);\n\n const localApiUrl = `http://127.0.0.1:${port}/v1`;\n\n if (!process.env.CENCORI_API_KEY) {\n process.env.CENCORI_API_KEY = \"local-dev-key\";\n }\n if (!process.env.CENCORI_API_URL) {\n process.env.CENCORI_API_URL = localApiUrl;\n }\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(\"\\u2716\")} ${d.code}: ${d.message}`);\n }\n process.exit(1);\n }\n\n for (const d of diagnostics) {\n console.warn(` ${grey(\"\\u26A0\")} ${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 console.log(` ${dimmed(`http://localhost:${port}`)}`);\n console.log();\n console.log(` ${dimmed(`$ curl -X POST http://localhost:${port} \\\\`)}`);\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(\"\\u26A0\")} 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:${port}`)}`);\n console.log();\n }\n }\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 server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n console.error();\n console.error(` ${grey(\"✗\")} port ${port} is already in use`);\n console.error(` ${dimmed(`try: arcie dev --port ${port + 1}`)}`);\n console.error(` ${dimmed(`or: lsof -iTCP:${port} -sTCP:LISTEN -n -P # find and kill the holder`)}`);\n console.error();\n } else {\n console.error();\n console.error(` ${grey(\"✗\")} ${err.message}`);\n console.error();\n }\n process.exit(1);\n });\n\n if (options.input) {\n server.listen(port, () => {\n void startBlockChat({ agentDir: agentDirPath });\n });\n } else {\n server.listen(port, () => {});\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"]}
|
package/dist/discover/index.d.ts
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
interface DiscoveredSlot {
|
|
2
2
|
name: string;
|
|
3
3
|
filePath: string;
|
|
4
4
|
type: "markdown" | "module";
|
|
5
5
|
kind: "flat" | "named";
|
|
6
6
|
}
|
|
7
|
-
|
|
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 {
|
|
8
17
|
root: string;
|
|
9
18
|
agentConfig?: string;
|
|
10
19
|
instructions?: string;
|
|
@@ -14,18 +23,19 @@ export interface DiscoveredAgent {
|
|
|
14
23
|
channels: DiscoveredSlot[];
|
|
15
24
|
schedules: DiscoveredSlot[];
|
|
16
25
|
connections: DiscoveredSlot[];
|
|
17
|
-
subagents:
|
|
26
|
+
subagents: DiscoveredSubagent[];
|
|
18
27
|
lib: DiscoveredSlot[];
|
|
19
28
|
}
|
|
20
|
-
|
|
29
|
+
interface DiscoverDiagnostic {
|
|
21
30
|
code: string;
|
|
22
31
|
message: string;
|
|
23
32
|
severity: "error" | "warning";
|
|
24
33
|
filePath?: string;
|
|
25
34
|
}
|
|
26
|
-
|
|
35
|
+
interface DiscoverResult {
|
|
27
36
|
agent: DiscoveredAgent;
|
|
28
37
|
diagnostics: DiscoverDiagnostic[];
|
|
29
38
|
}
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
declare function discoverAgent(agentDir: string): DiscoverResult;
|
|
40
|
+
|
|
41
|
+
export { type DiscoverDiagnostic, type DiscoverResult, type DiscoveredAgent, type DiscoveredSlot, type DiscoveredSubagent, discoverAgent };
|
package/dist/discover/index.js
CHANGED
|
@@ -1,133 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const SUPPORTED_EXTENSIONS = new Set([".ts", ".mts", ".cts", ".js", ".mjs", ".cjs"]);
|
|
8
|
-
export function discoverAgent(agentDir) {
|
|
9
|
-
const root = resolve(agentDir);
|
|
10
|
-
const diagnostics = [];
|
|
11
|
-
if (!existsSync(root)) {
|
|
12
|
-
diagnostics.push({
|
|
13
|
-
code: "AGENT_DIR_NOT_FOUND",
|
|
14
|
-
message: `Agent directory not found: ${root}`,
|
|
15
|
-
severity: "error",
|
|
16
|
-
});
|
|
17
|
-
return { agent: { root, tools: [], skills: [], hooks: [], channels: [], schedules: [], connections: [], subagents: [], lib: [] }, diagnostics };
|
|
18
|
-
}
|
|
19
|
-
const entries = readdirSync(root, { withFileTypes: true });
|
|
20
|
-
const agent = {
|
|
21
|
-
root,
|
|
22
|
-
agentConfig: discoverFlatModule(root, "agent", entries, diagnostics),
|
|
23
|
-
instructions: discoverInstructions(root, entries, diagnostics),
|
|
24
|
-
tools: discoverNamedDirectory(root, "tools", entries, TOOL_SLUG, diagnostics),
|
|
25
|
-
skills: discoverNamedDirectory(root, "skills", entries, TOOL_SLUG, diagnostics),
|
|
26
|
-
hooks: discoverNamedDirectory(root, "hooks", entries, HOOK_SLUG, diagnostics),
|
|
27
|
-
channels: discoverNamedDirectory(root, "channels", entries, CHANNEL_SLUG, diagnostics),
|
|
28
|
-
schedules: discoverNamedDirectory(root, "schedules", entries, TOOL_SLUG, diagnostics),
|
|
29
|
-
connections: discoverNamedDirectory(root, "connections", entries, CONNECTION_SLUG, diagnostics),
|
|
30
|
-
subagents: discoverNamedDirectory(root, "subagents", entries, TOOL_SLUG, diagnostics),
|
|
31
|
-
lib: discoverNamedDirectory(root, "lib", entries, TOOL_SLUG, diagnostics),
|
|
32
|
-
};
|
|
33
|
-
return { agent, diagnostics };
|
|
34
|
-
}
|
|
35
|
-
function discoverFlatModule(root, baseName, entries, diagnostics) {
|
|
36
|
-
const candidates = [];
|
|
37
|
-
for (const entry of entries) {
|
|
38
|
-
if (!entry.isFile())
|
|
39
|
-
continue;
|
|
40
|
-
const name = entry.name;
|
|
41
|
-
const ext = extname(name);
|
|
42
|
-
if (!SUPPORTED_EXTENSIONS.has(ext))
|
|
43
|
-
continue;
|
|
44
|
-
if (basename(name, ext) !== baseName)
|
|
45
|
-
continue;
|
|
46
|
-
candidates.push(name);
|
|
47
|
-
}
|
|
48
|
-
if (candidates.length > 1) {
|
|
49
|
-
diagnostics.push({
|
|
50
|
-
code: "MODULE_SLOT_COLLISION",
|
|
51
|
-
message: `Multiple module sources for "${baseName}": ${candidates.join(", ")}`,
|
|
52
|
-
severity: "error",
|
|
53
|
-
filePath: root,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
if (candidates.length === 0)
|
|
57
|
-
return undefined;
|
|
58
|
-
return join(root, candidates[0]);
|
|
59
|
-
}
|
|
60
|
-
function discoverInstructions(root, entries, diagnostics) {
|
|
61
|
-
const mdCandidate = entries.find(e => e.isFile() && e.name.toLowerCase() === "instructions.md");
|
|
62
|
-
if (mdCandidate)
|
|
63
|
-
return join(root, mdCandidate.name);
|
|
64
|
-
const tsCandidate = entries.find(e => {
|
|
65
|
-
if (!e.isFile())
|
|
66
|
-
return false;
|
|
67
|
-
const ext = extname(e.name);
|
|
68
|
-
return SUPPORTED_EXTENSIONS.has(ext) && basename(e.name, ext) === "instructions";
|
|
69
|
-
});
|
|
70
|
-
if (tsCandidate)
|
|
71
|
-
return join(root, tsCandidate.name);
|
|
72
|
-
const legacyMdCandidate = entries.find(e => e.isFile() && e.name.toLowerCase() === "system.md");
|
|
73
|
-
if (legacyMdCandidate) {
|
|
74
|
-
diagnostics.push({
|
|
75
|
-
code: "DEPRECATED_SYSTEM_SLOT",
|
|
76
|
-
message: `"system.md" is deprecated. Rename to "instructions.md".`,
|
|
77
|
-
severity: "warning",
|
|
78
|
-
filePath: join(root, legacyMdCandidate.name),
|
|
79
|
-
});
|
|
80
|
-
return join(root, legacyMdCandidate.name);
|
|
81
|
-
}
|
|
82
|
-
return undefined;
|
|
83
|
-
}
|
|
84
|
-
function discoverNamedDirectory(root, dirName, entries, slugPattern, diagnostics) {
|
|
85
|
-
const dirEntry = entries.find(e => e.isDirectory() && e.name === dirName);
|
|
86
|
-
if (!dirEntry)
|
|
87
|
-
return [];
|
|
88
|
-
const dirPath = join(root, dirName);
|
|
89
|
-
const slots = [];
|
|
90
|
-
try {
|
|
91
|
-
const files = readdirSync(dirPath, { withFileTypes: true });
|
|
92
|
-
for (const file of files) {
|
|
93
|
-
if (!file.isFile())
|
|
94
|
-
continue;
|
|
95
|
-
const ext = extname(file.name);
|
|
96
|
-
const name = basename(file.name, ext);
|
|
97
|
-
if (file.name === ".gitkeep")
|
|
98
|
-
continue;
|
|
99
|
-
if (ext === ".md") {
|
|
100
|
-
if (!slugPattern.test(name)) {
|
|
101
|
-
diagnostics.push({
|
|
102
|
-
code: "INVALID_SLOT_NAME",
|
|
103
|
-
message: `Invalid ${dirName} name "${name}" — does not match slug pattern.`,
|
|
104
|
-
severity: "warning",
|
|
105
|
-
filePath: join(dirPath, file.name),
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
slots.push({ name, filePath: join(dirPath, file.name), type: "markdown", kind: "named" });
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
if (SUPPORTED_EXTENSIONS.has(ext)) {
|
|
112
|
-
if (!slugPattern.test(name)) {
|
|
113
|
-
diagnostics.push({
|
|
114
|
-
code: "INVALID_SLOT_NAME",
|
|
115
|
-
message: `Invalid ${dirName} name "${name}" — does not match slug pattern.`,
|
|
116
|
-
severity: "warning",
|
|
117
|
-
filePath: join(dirPath, file.name),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
slots.push({ name, filePath: join(dirPath, file.name), type: "module", kind: "named" });
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
diagnostics.push({
|
|
126
|
-
code: "DIRECTORY_READ_ERROR",
|
|
127
|
-
message: `Could not read directory: ${dirPath}`,
|
|
128
|
-
severity: "error",
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
return slots.sort((a, b) => a.name.localeCompare(b.name));
|
|
132
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
discoverAgent
|
|
3
|
+
} from "../chunk-6XETPLIF.js";
|
|
4
|
+
export {
|
|
5
|
+
discoverAgent
|
|
6
|
+
};
|
|
133
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { H as HookConfig } from '../types-DwxwdSa2.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
declare function defineHook(config: HookConfig): HookConfig;
|
|
5
|
+
|
|
6
|
+
export { defineHook };
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
defineHook
|
|
3
|
+
} from "../chunk-3CNQ6HQV.js";
|
|
4
|
+
export {
|
|
5
|
+
defineHook
|
|
6
|
+
};
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|