arcie 0.1.8 → 0.1.9

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.
@@ -130,7 +130,7 @@ declare interface BlockCursorInput {
130
130
  readonly render?: (text: string) => string;
131
131
  }
132
132
 
133
- export declare type BlockKind = "user" | "assistant" | "reasoning" | "tool" | "error" | "notice" | "warning" | "result" | "subagent" | "subagent-step" | "subagent-tool" | "agent-header";
133
+ export declare type BlockKind = "user" | "assistant" | "reasoning" | "tool" | "error" | "notice" | "warning" | "result" | "command" | "subagent" | "subagent-step" | "subagent-tool" | "agent-header";
134
134
 
135
135
  export declare type BlockOp = {
136
136
  type: "commit";
@@ -1936,6 +1936,18 @@ export declare class TerminalRenderer {
1936
1936
  writeNotice(text: string): void;
1937
1937
  writeError(title: string, message: string): void;
1938
1938
  writeAgentHeader(body: string): void;
1939
+ /**
1940
+ * Echoes a slash-command invocation to scrollback so it chains with the
1941
+ * transcript above (blue `▌ /model`) and the {@link writeCommandResult}
1942
+ * that hangs beneath it can share visual context.
1943
+ */
1944
+ writeCommandInvocation(text: string, status?: "error"): void;
1945
+ /**
1946
+ * Writes a command outcome hung under the previous invocation with the
1947
+ * elbow connector (`⎿ message`). Multi-line messages soft-wrap under the
1948
+ * elbow.
1949
+ */
1950
+ writeCommandResult(text: string): void;
1939
1951
  readPrompt(): Promise<string | undefined>;
1940
1952
  handleKey(key: TerminalKey): void;
1941
1953
  stop(): void;
package/dist/cli/index.js CHANGED
@@ -105,7 +105,7 @@ function createCliProgram(logger) {
105
105
  });
106
106
  program.command("init [target]").description("Create a new arcie agent, or add one to an existing project directory.").option("--template <name>", "Template to use (default, agent-only)", "default").option("-y, --yes", "Accepted for compatibility; has no effect").action(async (target, options) => {
107
107
  if (options.yes) logger.error("warning: --yes has no effect for arcie init.");
108
- const { initCommand } = await import("../init-Q2GCMBCJ.js");
108
+ const { initCommand } = await import("../init-Y7VNAVF7.js");
109
109
  await initCommand(target, { template: options.template });
110
110
  });
111
111
  program.command("build").description("Compile the agent for production.").option("--agent-dir <path>", "Path to agent directory", "agent").option("--out-dir <path>", "Output directory", ".arcie").action(async (options) => {
@@ -140,7 +140,7 @@ function createCliProgram(logger) {
140
140
  "Model context window size, shown as a usage percentage",
141
141
  parseContextSizeOption
142
142
  ).option("--logs <mode>", "Which logs to show: all | stderr | none", parseLogsMode).action(async (options) => {
143
- const { devCommand } = await import("../dev-DCPOO54H.js");
143
+ const { devCommand } = await import("../dev-KO2CRPG3.js");
144
144
  await devCommand({
145
145
  port: String(options.port ?? 3e3),
146
146
  agentDir: options.agentDir,
@@ -769,6 +769,8 @@ function renderBody(block, width, theme, context) {
769
769
  return renderWarning(block, width, theme);
770
770
  case "result":
771
771
  return renderResult(block, width, theme);
772
+ case "command":
773
+ return renderCommand(block, theme);
772
774
  case "subagent":
773
775
  return renderSubagentHeader(block, width, theme);
774
776
  case "agent-header":
@@ -931,6 +933,11 @@ function paintCommands(line, theme) {
931
933
  (token) => isPromptControlCommand(token) ? theme.colors.blue(token) : token
932
934
  );
933
935
  }
936
+ function renderCommand(block, theme) {
937
+ const c = theme.colors;
938
+ const status = block.status === "error" ? `${c.red(theme.glyph.error)} ` : "";
939
+ return [`${c.cyan(theme.glyph.user)} ${status}${c.blue(block.body ?? "")}`];
940
+ }
934
941
  function renderResult(block, width, theme) {
935
942
  const marker = theme.colors.dim(theme.glyph.elbow);
936
943
  const lines = wrap(block.body ?? "", width - 7);
@@ -1005,6 +1012,24 @@ var TerminalRenderer = class {
1005
1012
  writeAgentHeader(body) {
1006
1013
  this.apply([{ type: "commit", block: { kind: "agent-header", body } }]);
1007
1014
  }
1015
+ /**
1016
+ * Echoes a slash-command invocation to scrollback so it chains with the
1017
+ * transcript above (blue `▌ /model`) and the {@link writeCommandResult}
1018
+ * that hangs beneath it can share visual context.
1019
+ */
1020
+ writeCommandInvocation(text, status) {
1021
+ const block = { kind: "command", body: text };
1022
+ if (status === "error") block.status = "error";
1023
+ this.apply([{ type: "commit", block }]);
1024
+ }
1025
+ /**
1026
+ * Writes a command outcome hung under the previous invocation with the
1027
+ * elbow connector (`⎿ message`). Multi-line messages soft-wrap under the
1028
+ * elbow.
1029
+ */
1030
+ writeCommandResult(text) {
1031
+ this.apply([{ type: "commit", block: { kind: "result", body: text } }]);
1032
+ }
1008
1033
  readPrompt() {
1009
1034
  return new Promise((resolve2) => {
1010
1035
  this.#pendingResolve = resolve2;
@@ -1232,28 +1257,35 @@ async function startBlockChat(options) {
1232
1257
  if (trimmed.startsWith("/")) {
1233
1258
  const command = parsePromptCommand(trimmed);
1234
1259
  if (command === null) {
1235
- renderer.writeError("Unknown command", `${trimmed} \u2014 try /help`);
1260
+ renderer.writeCommandInvocation(trimmed, "error");
1261
+ renderer.writeCommandResult("Unknown command \u2014 try /help");
1236
1262
  continue;
1237
1263
  }
1264
+ if (command.type === "exit") {
1265
+ renderer.writeCommandInvocation(trimmed);
1266
+ return;
1267
+ }
1268
+ renderer.writeCommandInvocation(trimmed);
1238
1269
  switch (command.type) {
1239
- case "exit":
1240
- return;
1241
1270
  case "help":
1242
- for (const line of formatPromptCommandHelp().split("\n")) {
1243
- renderer.writeNotice(line);
1244
- }
1271
+ renderer.writeCommandResult(formatPromptCommandHelp());
1245
1272
  continue;
1246
1273
  case "clear":
1247
1274
  case "new":
1248
1275
  for (const op of translator.reset()) renderer.apply([op]);
1249
1276
  await commitHeader();
1250
1277
  continue;
1251
- case "extension":
1252
- await handleExtension(command, renderer, agentDir, commitHeader);
1278
+ case "extension": {
1279
+ const outcome = await handleExtension(command, agentDir);
1280
+ if (outcome.message.length > 0) renderer.writeCommandResult(outcome.message);
1281
+ if (outcome.refresh) await commitHeader();
1253
1282
  continue;
1254
- case "loglevel":
1255
- handleLogLevel(command, renderer, logLevelState);
1283
+ }
1284
+ case "loglevel": {
1285
+ const outcome = handleLogLevel(command, logLevelState);
1286
+ renderer.writeCommandResult(outcome.message);
1256
1287
  continue;
1288
+ }
1257
1289
  }
1258
1290
  continue;
1259
1291
  }
@@ -1265,120 +1297,122 @@ async function startBlockChat(options) {
1265
1297
  renderer.stop();
1266
1298
  }
1267
1299
  }
1268
- async function handleExtension(command, renderer, agentDir, commitHeader) {
1300
+ async function handleExtension(command, agentDir) {
1269
1301
  const argument = command.argument.trim();
1270
1302
  switch (command.name) {
1271
1303
  case "model":
1272
- await handleModel(argument, renderer, agentDir, commitHeader);
1273
- return;
1304
+ return handleModel(argument, agentDir);
1274
1305
  case "provider":
1275
- handleProvider(renderer, agentDir);
1276
- return;
1306
+ return handleProvider(agentDir);
1277
1307
  case "channels":
1278
- handleChannels(argument, renderer, agentDir);
1279
- return;
1308
+ return handleChannels(argument, agentDir);
1280
1309
  default:
1281
- renderer.writeNotice(`/${command.name} is not supported here`);
1310
+ return { message: `/${command.name} is not supported here` };
1282
1311
  }
1283
1312
  }
1284
- async function handleModel(argument, renderer, agentDir, commitHeader) {
1313
+ function handleModel(argument, agentDir) {
1285
1314
  const current = readAgentModel(agentDir);
1286
1315
  if (argument.length === 0) {
1287
- renderer.writeNotice(
1288
- current ? `current model: ${current}` : "no model configured in agent/agent.ts"
1289
- );
1290
- renderer.writeNotice("change it with: /model <provider/slug>");
1291
- return;
1316
+ const lines = [
1317
+ current ? `Current model: ${current}` : "No model configured in agent/agent.ts",
1318
+ "Change with: /model <provider/slug>"
1319
+ ];
1320
+ return { message: lines.join("\n") };
1292
1321
  }
1293
1322
  if (current === argument) {
1294
- renderer.writeNotice(`model is already ${argument}`);
1295
- return;
1323
+ return { message: `Model is already ${argument}` };
1296
1324
  }
1297
1325
  const changed = writeAgentModel(agentDir, argument);
1298
1326
  if (!changed) {
1299
- renderer.writeError(
1300
- "Model not changed",
1301
- "Could not update agent/agent.ts \u2014 file missing or model field not found."
1302
- );
1303
- return;
1327
+ return {
1328
+ message: "Could not update agent/agent.ts \u2014 file missing or model field not found."
1329
+ };
1304
1330
  }
1305
- renderer.writeNotice(`model set to ${argument}`);
1306
- await commitHeader();
1331
+ return { message: `Model set to ${argument}`, refresh: true };
1307
1332
  }
1308
- function handleProvider(renderer, agentDir) {
1333
+ function handleProvider(agentDir) {
1309
1334
  const status = providerKeyStatus(agentDir);
1310
1335
  const configured = status.filter((row) => row.set);
1311
1336
  if (configured.length === 0) {
1312
- renderer.writeNotice("no provider keys configured");
1313
- renderer.writeNotice("edit .env.local to add CENCORI_API_KEY or a direct provider key");
1314
- return;
1337
+ return {
1338
+ message: [
1339
+ "No provider keys configured.",
1340
+ "Edit .env.local to add CENCORI_API_KEY or a direct provider key."
1341
+ ].join("\n")
1342
+ };
1315
1343
  }
1316
- renderer.writeNotice("provider keys:");
1344
+ const lines = ["Provider keys:"];
1317
1345
  for (const row of status) {
1318
1346
  if (row.set) {
1319
- renderer.writeNotice(` ${row.key} = ${row.masked} (${row.source})`);
1347
+ lines.push(` ${row.key} = ${row.masked} (${row.source})`);
1320
1348
  } else {
1321
- renderer.writeNotice(` ${row.key} \u2014 not set`);
1349
+ lines.push(` ${row.key} \u2014 not set`);
1322
1350
  }
1323
1351
  }
1352
+ return { message: lines.join("\n") };
1324
1353
  }
1325
- function handleChannels(argument, renderer, agentDir) {
1354
+ function handleChannels(argument, agentDir) {
1326
1355
  if (argument.length === 0) {
1327
1356
  const channels = listChannels(agentDir);
1328
1357
  if (channels.length === 0) {
1329
- renderer.writeNotice("no channels scaffolded");
1330
- renderer.writeNotice("add one with: /channels add web");
1331
- return;
1358
+ return {
1359
+ message: ["No channels scaffolded.", "Add one with: /channels add web"].join("\n")
1360
+ };
1332
1361
  }
1333
- renderer.writeNotice("channels:");
1334
- for (const channel of channels) renderer.writeNotice(` ${channel.name} \u2014 ${channel.path}`);
1335
- renderer.writeNotice("add another with: /channels add <kind>");
1336
- return;
1362
+ const lines = ["Channels:"];
1363
+ for (const channel of channels) lines.push(` ${channel.name} \u2014 ${channel.path}`);
1364
+ lines.push("Add another with: /channels add <kind>");
1365
+ return { message: lines.join("\n") };
1337
1366
  }
1338
1367
  const parts = argument.split(/\s+/);
1339
1368
  const subcommand = parts[0];
1340
1369
  const kind = parts[1];
1341
1370
  if (subcommand !== "add") {
1342
- renderer.writeError("Unknown /channels subcommand", `try: /channels add web`);
1343
- return;
1371
+ return { message: `Unknown subcommand '${subcommand}' \u2014 try: /channels add web` };
1344
1372
  }
1345
1373
  if (kind !== "web") {
1346
- renderer.writeError("Unsupported channel kind", `${kind ?? "(none)"} \u2014 only 'web' is supported`);
1347
- return;
1374
+ return {
1375
+ message: `Unsupported channel kind '${kind ?? ""}' \u2014 only 'web' is supported`
1376
+ };
1348
1377
  }
1349
1378
  try {
1350
1379
  const result = scaffoldWebChat(agentDir);
1351
1380
  if (result.alreadyExisted) {
1352
- renderer.writeNotice(`channels/web already exists \u2014 left it untouched`);
1353
- return;
1381
+ return { message: `channels/web already exists at ${result.targetPath}` };
1354
1382
  }
1355
- renderer.writeNotice(`scaffolded ${result.targetPath}`);
1356
- renderer.writeNotice("next: cd into it, npm install, npm run dev");
1383
+ return {
1384
+ message: [
1385
+ `Scaffolded ${result.targetPath}`,
1386
+ "Next: cd into it, npm install, npm run dev"
1387
+ ].join("\n")
1388
+ };
1357
1389
  } catch (err) {
1358
- renderer.writeError(
1359
- "Channel scaffold failed",
1360
- err instanceof Error ? err.message : String(err)
1361
- );
1390
+ return {
1391
+ message: `Channel scaffold failed: ${err instanceof Error ? err.message : String(err)}`
1392
+ };
1362
1393
  }
1363
1394
  }
1364
- function handleLogLevel(command, renderer, state) {
1395
+ function handleLogLevel(command, state) {
1365
1396
  const argument = command.argument.trim();
1366
1397
  if (argument.length === 0) {
1367
- renderer.writeNotice(`log level: ${state.mode}`);
1368
- renderer.writeNotice("change with: /loglevel all | stderr | none");
1369
- renderer.writeNotice("note: arcie does not currently capture subprocess logs.");
1370
- return;
1398
+ return {
1399
+ message: [
1400
+ `Log level: ${state.mode}`,
1401
+ "Change with: /loglevel all | stderr | none",
1402
+ "Note: arcie does not currently capture subprocess logs."
1403
+ ].join("\n")
1404
+ };
1371
1405
  }
1372
1406
  if (!VALID_LOG_MODES.has(argument)) {
1373
- renderer.writeError(
1374
- "Invalid log level",
1375
- `${argument} \u2014 pick one of: all, stderr, none`
1376
- );
1377
- return;
1407
+ return { message: `Invalid log level '${argument}' \u2014 pick one of: all, stderr, none` };
1378
1408
  }
1379
1409
  state.mode = argument;
1380
- renderer.writeNotice(`log level: ${state.mode}`);
1381
- renderer.writeNotice("note: arcie does not currently capture subprocess logs.");
1410
+ return {
1411
+ message: [
1412
+ `Log level: ${state.mode}`,
1413
+ "Note: arcie does not currently capture subprocess logs."
1414
+ ].join("\n")
1415
+ };
1382
1416
  }
1383
1417
  async function streamOneTurn(renderer, translator, agentDir, message) {
1384
1418
  let sawApproval = false;
@@ -2192,4 +2226,4 @@ async function devCommand(options) {
2192
2226
  export {
2193
2227
  devCommand
2194
2228
  };
2195
- //# sourceMappingURL=dev-DCPOO54H.js.map
2229
+ //# sourceMappingURL=dev-KO2CRPG3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/dev.ts","../src/cli/tui/renderer/start-block-chat.ts","../src/cli/agent-config.ts","../src/cli/tui/prompt-commands.ts","../src/cli/tui/tool-format.ts","../src/cli/tui/renderer/event-to-blocks.ts","../src/cli/tui/markdown.ts","../src/cli/tui/renderer/blocks.ts","../src/cli/tui/renderer/terminal-renderer.ts","../src/server/llm.ts","../src/server/index.ts"],"sourcesContent":["import { 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 {\n listChannels,\n providerKeyStatus,\n readAgentModel,\n writeAgentModel,\n} from \"../../agent-config\";\nimport { scaffoldWebChat } from \"../../scaffold-web-chat\";\nimport type { PromptCommand } from \"../prompt-commands\";\nimport { parsePromptCommand, formatPromptCommandHelp } from \"../prompt-commands\";\nimport { attachKeyStream } from \"../attach-keys\";\nimport { EventTranslator } from \"./event-to-blocks\";\nimport { TerminalRenderer } from \"./terminal-renderer\";\n\ntype ExtensionCommand = Extract<PromptCommand, { type: \"extension\" }>;\ntype LoglevelCommand = Extract<PromptCommand, { type: \"loglevel\" }>;\n\nconst VALID_LOG_MODES = new Set([\"all\", \"stderr\", \"none\"]);\n\nexport interface StartBlockChatOptions {\n readonly agentDir: string;\n readonly initialInput?: string;\n}\n\n/**\n * Runs the block-based dev TUI against a local agent directory. Returns when\n * the user submits `/exit` or presses Ctrl+C. Ownership of raw stdin is\n * scoped to this function; the caller does not need to restore terminal\n * state on exit paths.\n */\nexport async function startBlockChat(options: StartBlockChatOptions): Promise<void> {\n const { agentDir } = options;\n const renderer = new TerminalRenderer();\n const translator = new EventTranslator();\n\n const commitHeader = async () => {\n try {\n const agent = await loadAgent(agentDir);\n const model = agent.manifest.config.model;\n renderer.writeAgentHeader(`arcie · ${agentDir.split(\"/\").pop() ?? \"agent\"} · ${model}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n renderer.writeError(\"Agent load failed\", message);\n }\n };\n\n const { diagnostics } = discoverAgent(agentDir);\n const errorDiags = diagnostics.filter((d) => d.severity === \"error\");\n if (errorDiags.length > 0) {\n for (const d of errorDiags) renderer.writeError(d.code, d.message);\n renderer.stop();\n return;\n }\n\n await commitHeader();\n\n let watcher: FSWatcher | undefined;\n try {\n let reprobeTimer: ReturnType<typeof setTimeout> | undefined;\n watcher = watch(agentDir, { recursive: true }, () => {\n if (reprobeTimer !== undefined) clearTimeout(reprobeTimer);\n reprobeTimer = setTimeout(() => {\n void commitHeader();\n }, 250);\n });\n } catch {\n // A missing fs.watch (e.g. some sandboxes) is not fatal.\n }\n\n const detachKeys = attachKeyStream((key) => renderer.handleKey(key));\n\n const logLevelState = { mode: \"none\" as \"all\" | \"stderr\" | \"none\" };\n\n try {\n if (options.initialInput !== undefined && options.initialInput.length > 0) {\n await streamOneTurn(renderer, translator, agentDir, options.initialInput);\n }\n\n while (true) {\n const text = await renderer.readPrompt();\n if (text === undefined) return;\n const trimmed = text.trim();\n if (trimmed.length === 0) continue;\n\n if (trimmed.startsWith(\"/\")) {\n const command = parsePromptCommand(trimmed);\n if (command === null) {\n renderer.writeCommandInvocation(trimmed, \"error\");\n renderer.writeCommandResult(\"Unknown command — try /help\");\n continue;\n }\n\n if (command.type === \"exit\") {\n renderer.writeCommandInvocation(trimmed);\n return;\n }\n\n renderer.writeCommandInvocation(trimmed);\n\n switch (command.type) {\n case \"help\":\n renderer.writeCommandResult(formatPromptCommandHelp());\n continue;\n case \"clear\":\n case \"new\":\n for (const op of translator.reset()) renderer.apply([op]);\n await commitHeader();\n continue;\n case \"extension\": {\n const outcome = await handleExtension(command, agentDir);\n if (outcome.message.length > 0) renderer.writeCommandResult(outcome.message);\n if (outcome.refresh) await commitHeader();\n continue;\n }\n case \"loglevel\": {\n const outcome = handleLogLevel(command, logLevelState);\n renderer.writeCommandResult(outcome.message);\n continue;\n }\n }\n continue;\n }\n\n await streamOneTurn(renderer, translator, agentDir, trimmed);\n }\n } finally {\n detachKeys();\n watcher?.close();\n renderer.stop();\n }\n}\n\ninterface CommandOutcome {\n readonly message: string;\n /** When true, the caller re-commits the agent header (model / manifest changed). */\n readonly refresh?: boolean;\n}\n\nasync function handleExtension(\n command: ExtensionCommand,\n agentDir: string,\n): Promise<CommandOutcome> {\n const argument = command.argument.trim();\n switch (command.name) {\n case \"model\":\n return handleModel(argument, agentDir);\n case \"provider\":\n return handleProvider(agentDir);\n case \"channels\":\n return handleChannels(argument, agentDir);\n default:\n return { message: `/${command.name} is not supported here` };\n }\n}\n\nfunction handleModel(argument: string, agentDir: string): CommandOutcome {\n const current = readAgentModel(agentDir);\n if (argument.length === 0) {\n const lines = [\n current ? `Current model: ${current}` : \"No model configured in agent/agent.ts\",\n \"Change with: /model <provider/slug>\",\n ];\n return { message: lines.join(\"\\n\") };\n }\n if (current === argument) {\n return { message: `Model is already ${argument}` };\n }\n const changed = writeAgentModel(agentDir, argument);\n if (!changed) {\n return {\n message: \"Could not update agent/agent.ts — file missing or model field not found.\",\n };\n }\n return { message: `Model set to ${argument}`, refresh: true };\n}\n\nfunction handleProvider(agentDir: string): CommandOutcome {\n const status = providerKeyStatus(agentDir);\n const configured = status.filter((row) => row.set);\n if (configured.length === 0) {\n return {\n message: [\n \"No provider keys configured.\",\n \"Edit .env.local to add CENCORI_API_KEY or a direct provider key.\",\n ].join(\"\\n\"),\n };\n }\n const lines = [\"Provider keys:\"];\n for (const row of status) {\n if (row.set) {\n lines.push(` ${row.key} = ${row.masked} (${row.source})`);\n } else {\n lines.push(` ${row.key} — not set`);\n }\n }\n return { message: lines.join(\"\\n\") };\n}\n\nfunction handleChannels(argument: string, agentDir: string): CommandOutcome {\n if (argument.length === 0) {\n const channels = listChannels(agentDir);\n if (channels.length === 0) {\n return {\n message: [\"No channels scaffolded.\", \"Add one with: /channels add web\"].join(\"\\n\"),\n };\n }\n const lines = [\"Channels:\"];\n for (const channel of channels) lines.push(` ${channel.name} — ${channel.path}`);\n lines.push(\"Add another with: /channels add <kind>\");\n return { message: lines.join(\"\\n\") };\n }\n\n const parts = argument.split(/\\s+/);\n const subcommand = parts[0];\n const kind = parts[1];\n if (subcommand !== \"add\") {\n return { message: `Unknown subcommand '${subcommand}' — try: /channels add web` };\n }\n if (kind !== \"web\") {\n return {\n message: `Unsupported channel kind '${kind ?? \"\"}' — only 'web' is supported`,\n };\n }\n try {\n const result = scaffoldWebChat(agentDir);\n if (result.alreadyExisted) {\n return { message: `channels/web already exists at ${result.targetPath}` };\n }\n return {\n message: [\n `Scaffolded ${result.targetPath}`,\n \"Next: cd into it, npm install, npm run dev\",\n ].join(\"\\n\"),\n };\n } catch (err) {\n return {\n message: `Channel scaffold failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction handleLogLevel(\n command: LoglevelCommand,\n state: { mode: \"all\" | \"stderr\" | \"none\" },\n): CommandOutcome {\n const argument = command.argument.trim();\n if (argument.length === 0) {\n return {\n message: [\n `Log level: ${state.mode}`,\n \"Change with: /loglevel all | stderr | none\",\n \"Note: arcie does not currently capture subprocess logs.\",\n ].join(\"\\n\"),\n };\n }\n if (!VALID_LOG_MODES.has(argument)) {\n return { message: `Invalid log level '${argument}' — pick one of: all, stderr, none` };\n }\n state.mode = argument as \"all\" | \"stderr\" | \"none\";\n return {\n message: [\n `Log level: ${state.mode}`,\n \"Note: arcie does not currently capture subprocess logs.\",\n ].join(\"\\n\"),\n };\n}\n\nasync function streamOneTurn(\n renderer: TerminalRenderer,\n translator: EventTranslator,\n agentDir: string,\n message: string,\n): Promise<void> {\n let sawApproval = false;\n try {\n for await (const event of streamAgent(agentDir, message)) {\n const ops = translator.feed(event);\n renderer.apply(ops);\n if (\n event.type === \"tool.completed\" &&\n event.data.status === \"pending\" &&\n event.data.error?.code === \"needs_approval\"\n ) {\n sawApproval = true;\n }\n }\n if (sawApproval) {\n renderer.writeNotice(\n \"Tool call awaiting approval — approve via the Cencori sessions API to continue.\",\n );\n }\n } catch (err) {\n const detail = err instanceof Error ? err.stack : undefined;\n renderer.apply([\n {\n type: \"commit\",\n block: {\n kind: \"error\",\n title: \"Stream error\",\n body: err instanceof Error ? err.message : String(err),\n detail,\n },\n },\n ]);\n }\n}\n\n","import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport function agentSourcePath(agentDir: string): string {\n return join(agentDir, \"agent\", \"agent.ts\");\n}\n\nexport function envLocalPath(agentDir: string): string {\n return join(agentDir, \".env.local\");\n}\n\nexport function readAgentModel(agentDir: string): string | undefined {\n const path = agentSourcePath(agentDir);\n if (!existsSync(path)) return undefined;\n try {\n const content = readFileSync(path, \"utf-8\");\n return content.match(/model:\\s*\"([^\"]+)\"/)?.[1];\n } catch {\n return undefined;\n }\n}\n\nexport function writeAgentModel(agentDir: string, model: string): boolean {\n const path = agentSourcePath(agentDir);\n if (!existsSync(path)) return false;\n const content = readFileSync(path, \"utf-8\");\n const updated = content.replace(/model:\\s*\"[^\"]+\"/, `model: \"${model}\"`);\n if (updated === content) return false;\n writeFileSync(path, updated);\n return true;\n}\n\nexport const PROVIDER_KEYS = [\n \"CENCORI_API_KEY\",\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"GROQ_API_KEY\",\n \"DEEPSEEK_API_KEY\",\n \"MISTRAL_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"TOGETHER_API_KEY\",\n] as const;\n\nexport type ProviderKey = (typeof PROVIDER_KEYS)[number];\n\nexport interface ProviderKeyStatus {\n readonly key: string;\n readonly set: boolean;\n readonly source?: \"env\" | \"file\";\n readonly masked?: string;\n}\n\nexport function providerKeyStatus(agentDir: string): ProviderKeyStatus[] {\n const fileValues = readEnvLocal(agentDir);\n return PROVIDER_KEYS.map((key) => {\n const envValue = process.env[key];\n if (envValue && envValue.length > 0) {\n return { key, set: true, source: \"env\" as const, masked: maskSecret(envValue) };\n }\n const fileValue = fileValues[key];\n if (fileValue && fileValue.length > 0) {\n return { key, set: true, source: \"file\" as const, masked: maskSecret(fileValue) };\n }\n return { key, set: false };\n });\n}\n\nexport function readEnvLocal(agentDir: string): Record<string, string> {\n const envPath = envLocalPath(agentDir);\n if (!existsSync(envPath)) return {};\n const values: Record<string, string> = {};\n for (const line of readFileSync(envPath, \"utf-8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"#\") || !trimmed.includes(\"=\")) continue;\n const eq = trimmed.indexOf(\"=\");\n const key = trimmed.slice(0, eq).trim();\n const value = trimmed.slice(eq + 1).trim();\n if (key && value) values[key] = value;\n }\n return values;\n}\n\n/**\n * Writes `key=value` to `.env.local`, replacing an existing declaration\n * (commented or not) or appending a new line. Returns true if the file was\n * changed.\n */\nexport function upsertEnvLocal(agentDir: string, key: string, value: string): boolean {\n const envPath = envLocalPath(agentDir);\n if (!existsSync(envPath)) {\n writeFileSync(envPath, `${key}=${value}\\n`);\n return true;\n }\n const content = readFileSync(envPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n let replaced = false;\n const updated = lines.map((line) => {\n const trimmed = line.trim();\n if (trimmed.startsWith(`# ${key}=`) || trimmed.startsWith(`${key}=`)) {\n replaced = true;\n return `${key}=${value}`;\n }\n return line;\n });\n if (!replaced) updated.push(`${key}=${value}`);\n const next = updated.join(\"\\n\") + (updated.at(-1) === \"\" ? \"\" : \"\\n\");\n if (next === content) return false;\n writeFileSync(envPath, next);\n return true;\n}\n\nexport interface ChannelSummary {\n readonly name: string;\n readonly path: string;\n}\n\nexport function listChannels(agentDir: string): ChannelSummary[] {\n const channelsDir = join(agentDir, \"channels\");\n if (!existsSync(channelsDir)) return [];\n try {\n return readdirSync(channelsDir)\n .filter((entry) => {\n const full = join(channelsDir, entry);\n return statSync(full).isDirectory();\n })\n .map((name) => ({ name, path: join(channelsDir, name) }));\n } catch {\n return [];\n }\n}\n\nfunction maskSecret(value: string): string {\n if (value.length <= 8) return \"•\".repeat(value.length);\n return `${value.slice(0, 4)}${\"•\".repeat(6)}${value.slice(-4)}`;\n}\n","export type PromptCommandExtensionName = \"model\" | \"provider\" | \"channels\";\n\nexport type PromptCommand =\n | { type: \"new\" }\n | { type: \"exit\" }\n | { type: \"help\" }\n | { type: \"clear\" }\n | { type: \"loglevel\"; argument: string }\n | { type: \"extension\"; name: PromptCommandExtensionName; argument: string };\n\nexport interface PromptCommandSpec {\n readonly name: string;\n readonly aliases: readonly string[];\n readonly description: string;\n readonly argumentHint?: string;\n readonly takesArgument: boolean;\n readonly build: (argument: string) => PromptCommand;\n}\n\nconst PROMPT_COMMAND_DEFINITIONS = [\n {\n name: \"help\",\n aliases: [],\n description: \"Show available commands\",\n takesArgument: false,\n build: () => ({ type: \"help\" }),\n },\n {\n name: \"new\",\n aliases: [],\n description: \"Start a fresh session\",\n takesArgument: false,\n build: () => ({ type: \"new\" }),\n },\n {\n name: \"clear\",\n aliases: [],\n description: \"Clear the screen\",\n takesArgument: false,\n build: () => ({ type: \"clear\" }),\n },\n {\n name: \"model\",\n aliases: [],\n description: \"Show or change the agent's model\",\n argumentHint: \"[provider/slug]\",\n takesArgument: true,\n build: (argument) => ({ type: \"extension\", name: \"model\", argument }),\n },\n {\n name: \"provider\",\n aliases: [],\n description: \"Show provider API key status\",\n takesArgument: false,\n build: () => ({ type: \"extension\", name: \"provider\", argument: \"\" }),\n },\n {\n name: \"channels\",\n aliases: [],\n description: \"List or add chat channels\",\n argumentHint: \"[add web]\",\n takesArgument: true,\n build: (argument) => ({ type: \"extension\", name: \"channels\", argument }),\n },\n {\n name: \"loglevel\",\n aliases: [],\n description: \"Show or hide captured stdout/stderr logs\",\n argumentHint: \"[all|stderr|none]\",\n takesArgument: true,\n build: (argument) => ({ type: \"loglevel\", argument }),\n },\n {\n name: \"exit\",\n aliases: [\"quit\"],\n description: \"Quit the TUI\",\n takesArgument: false,\n build: () => ({ type: \"exit\" }),\n },\n] satisfies readonly PromptCommandSpec[];\n\nexport const PROMPT_COMMANDS: readonly PromptCommandSpec[] = PROMPT_COMMAND_DEFINITIONS;\n\nexport function parsePromptCommand(prompt: string): PromptCommand | null {\n const trimmed = prompt.trim();\n if (!trimmed.startsWith(\"/\")) return null;\n for (const spec of PROMPT_COMMANDS) {\n for (const alias of [spec.name, ...spec.aliases]) {\n const token = `/${alias}`;\n if (trimmed === token) return spec.build(\"\");\n if (spec.takesArgument && trimmed.startsWith(`${token} `)) {\n return spec.build(trimmed.slice(token.length).trim());\n }\n }\n }\n return null;\n}\n\nexport function isPromptControlCommand(prompt: string): boolean {\n return parsePromptCommand(prompt) !== null;\n}\n\nexport function formatPromptCommandHelp(\n commands: readonly PromptCommandSpec[] = PROMPT_COMMANDS,\n): string {\n const entries = commands.map((spec) => {\n const hint = spec.argumentHint === undefined ? \"\" : ` ${spec.argumentHint}`;\n const aliases = spec.aliases.map((alias) => ` (/${alias})`).join(\"\");\n return { invocation: `/${spec.name}${hint}${aliases}`, description: spec.description };\n });\n const column = Math.max(...entries.map((entry) => entry.invocation.length)) + 2;\n return entries.map((entry) => entry.invocation.padEnd(column) + entry.description).join(\"\\n\");\n}\n\nexport function matchingCommands(\n commands: readonly PromptCommandSpec[],\n text: string,\n): readonly PromptCommandSpec[] {\n if (!text.startsWith(\"/\") || /\\s/.test(text)) return [];\n const rest = text.slice(1);\n return commands.filter((spec) =>\n [spec.name, ...spec.aliases].some((token) => token.startsWith(rest)),\n );\n}\n","import { stripTerminalControls } from \"../ui/terminal-text\";\n\nconst ELLIPSIS = \"…\";\n\nexport function summarizeToolArgs(input: unknown, maxLength = 80): string {\n if (input === undefined || input === null) return \"\";\n\n if (typeof input !== \"object\") return truncate(formatScalar(input), maxLength);\n if (Array.isArray(input)) return truncate(`[${input.length}]`, maxLength);\n\n const entries = Object.entries(input as Record<string, unknown>);\n if (entries.length === 0) return \"\";\n\n const parts: string[] = [];\n for (const [key, value] of entries) {\n parts.push(`${stripTerminalControls(key)}=${formatInlineValue(value)}`);\n }\n\n return truncate(parts.join(\" \"), maxLength);\n}\n\nexport function summarizeToolResult(output: unknown, maxLength = 80): string {\n if (output === undefined || output === null) return \"\";\n\n if (typeof output === \"string\") {\n const firstLine = output.split(\"\\n\").find((line) => line.trim().length > 0) ?? \"\";\n return truncate(firstLine.trim(), maxLength);\n }\n\n if (typeof output !== \"object\") return truncate(formatScalar(output), maxLength);\n\n if (Array.isArray(output)) {\n return truncate(`${output.length} ${output.length === 1 ? \"item\" : \"items\"}`, maxLength);\n }\n\n const record = output as Record<string, unknown>;\n for (const key of [\"result\", \"text\", \"message\", \"summary\", \"value\", \"output\"]) {\n const value = record[key];\n if (value !== undefined && typeof value !== \"object\") {\n return truncate(`${formatScalar(value)}`, maxLength);\n }\n }\n\n const keys = Object.keys(record);\n if (keys.length === 0) return \"{}\";\n\n const inline = keys\n .slice(0, 3)\n .map((key) => `${key}=${formatInlineValue(record[key])}`)\n .join(\" \");\n return truncate(keys.length > 3 ? `${inline} ${ELLIPSIS}` : inline, maxLength);\n}\n\nexport function formatValuePretty(value: unknown): string {\n if (typeof value === \"string\") return stripTerminalControls(value);\n try {\n return stripTerminalControls(JSON.stringify(value, null, 2) ?? String(value));\n } catch {\n return stripTerminalControls(String(value));\n }\n}\n\nfunction formatInlineValue(value: unknown): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n if (typeof value === \"string\") return `\"${truncate(value, 32)}\"`;\n if (typeof value === \"object\") {\n return Array.isArray(value) ? `[${value.length}]` : \"{…}\";\n }\n return formatScalar(value);\n}\n\nfunction formatScalar(value: unknown): string {\n if (typeof value === \"string\") return stripTerminalControls(value);\n return stripTerminalControls(String(value));\n}\n\nexport function truncate(text: string, maxLength: number): string {\n const collapsed = stripTerminalControls(text).replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLength) return collapsed;\n return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}${ELLIPSIS}`;\n}\n","import type { StreamEvent } from \"../../../protocol/events\";\nimport type { Block } from \"./blocks\";\nimport { summarizeToolArgs, summarizeToolResult } from \"../tool-format\";\n\nexport type BlockOp =\n | { type: \"commit\"; block: Block }\n | { type: \"start-live\"; block: Block }\n | { type: \"update-live\"; id: string; patch: Partial<Block> }\n | { type: \"end-live\"; id: string }\n | { type: \"clear-live\"; id: string };\n\nexport interface TranslatorOptions {\n /** Auto-collapse a live reasoning block when the assistant starts speaking. Default true. */\n readonly autoCollapseReasoning?: boolean;\n}\n\n/**\n * Pure(ish) fold from `StreamEvent`s to `BlockOp`s.\n *\n * Owns just enough state to correlate stream events with live blocks: the\n * currently streaming assistant / reasoning blocks per level, an in-flight\n * tool map keyed by `callId`, and a subagent depth stack. Every method takes\n * one event and returns the ops that should be applied to the renderer's\n * block store.\n */\nexport class EventTranslator {\n readonly #autoCollapseReasoning: boolean;\n #nextId = 0;\n #currentAssistantId: string | undefined;\n #currentReasoningId: string | undefined;\n #toolIds = new Map<string, string>();\n #subagentStack: string[] = [];\n\n constructor(options: TranslatorOptions = {}) {\n this.#autoCollapseReasoning = options.autoCollapseReasoning ?? true;\n }\n\n get depth(): number {\n return this.#subagentStack.length;\n }\n\n reset(): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentAssistantId !== undefined) {\n ops.push({ type: \"end-live\", id: this.#currentAssistantId });\n }\n if (this.#currentReasoningId !== undefined) {\n ops.push({ type: \"end-live\", id: this.#currentReasoningId });\n }\n for (const [, id] of this.#toolIds) ops.push({ type: \"end-live\", id });\n for (const id of this.#subagentStack) ops.push({ type: \"end-live\", id });\n this.#currentAssistantId = undefined;\n this.#currentReasoningId = undefined;\n this.#toolIds.clear();\n this.#subagentStack = [];\n return ops;\n }\n\n feed(event: StreamEvent): BlockOp[] {\n switch (event.type) {\n case \"session.started\":\n case \"session.waiting\":\n case \"session.completed\":\n case \"turn.started\":\n case \"turn.completed\":\n case \"step.started\":\n case \"step.completed\":\n return [];\n case \"message.received\":\n return this.#onUserMessage(event.data.message);\n case \"message.appended\":\n return this.#onAssistantDelta(event.data.delta);\n case \"message.completed\":\n return this.#endAssistant(event.data.text ?? undefined);\n case \"reasoning.appended\":\n return this.#onReasoningDelta(event.data.delta);\n case \"reasoning.completed\":\n return this.#endReasoning(event.data.text);\n case \"tool.started\":\n return this.#onToolStarted(event.data.name, event.data.callId, event.data.input);\n case \"tool.completed\":\n return this.#onToolCompleted(\n event.data.callId,\n event.data.status,\n event.data.output,\n event.data.error?.message,\n event.data.error?.code,\n );\n case \"subagent.called\":\n return this.#onSubagentCalled(event.data.name, event.data.callId);\n case \"subagent.completed\":\n return this.#onSubagentCompleted(event.data.callId, event.data.output);\n case \"step.failed\":\n case \"turn.failed\":\n case \"session.failed\":\n return this.#onFailure(event.data.code, event.data.message);\n }\n }\n\n #id(prefix: string): string {\n this.#nextId += 1;\n return `${prefix}-${this.#nextId}`;\n }\n\n #onUserMessage(message: string): BlockOp[] {\n const ops = this.#closeReasoningIfLive();\n ops.push({\n type: \"commit\",\n block: { kind: \"user\", body: message, depth: this.depth },\n });\n return ops;\n }\n\n #onAssistantDelta(delta: string): BlockOp[] {\n const ops = this.#closeReasoningIfLive();\n if (this.#currentAssistantId === undefined) {\n const id = this.#id(\"assistant\");\n this.#currentAssistantId = id;\n ops.push({\n type: \"start-live\",\n block: this.#assistantKind({ kind: \"assistant\", id, body: delta, live: true, depth: this.depth }),\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: withDelta(delta),\n });\n }\n return ops;\n }\n\n #endAssistant(text: string | undefined): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentAssistantId === undefined) return ops;\n if (text !== undefined && text.length > 0) {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: { body: text, live: false },\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: { live: false },\n });\n }\n ops.push({ type: \"end-live\", id: this.#currentAssistantId });\n this.#currentAssistantId = undefined;\n return ops;\n }\n\n #onReasoningDelta(delta: string): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentReasoningId === undefined) {\n const id = this.#id(\"reasoning\");\n this.#currentReasoningId = id;\n ops.push({\n type: \"start-live\",\n block: this.#assistantKind({\n kind: \"reasoning\",\n id,\n body: delta,\n live: true,\n collapsed: false,\n depth: this.depth,\n }),\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentReasoningId,\n patch: withDelta(delta),\n });\n }\n return ops;\n }\n\n #endReasoning(text: string): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentReasoningId === undefined) return ops;\n ops.push({\n type: \"update-live\",\n id: this.#currentReasoningId,\n patch: { body: text, live: false, collapsed: this.#autoCollapseReasoning },\n });\n ops.push({ type: \"end-live\", id: this.#currentReasoningId });\n this.#currentReasoningId = undefined;\n return ops;\n }\n\n #closeReasoningIfLive(): BlockOp[] {\n if (this.#currentReasoningId === undefined || !this.#autoCollapseReasoning) return [];\n const id = this.#currentReasoningId;\n this.#currentReasoningId = undefined;\n return [\n { type: \"update-live\", id, patch: { collapsed: true, live: false } },\n { type: \"end-live\", id },\n ];\n }\n\n #onToolStarted(name: string, callId: string, input: unknown): BlockOp[] {\n const id = this.#id(\"tool\");\n this.#toolIds.set(callId, id);\n const inSubagent = this.depth > 0;\n const args = summarizeToolArgs(input, 80);\n return [\n {\n type: \"start-live\",\n block: {\n kind: inSubagent ? \"subagent-tool\" : \"tool\",\n id,\n title: name,\n subtitle: args,\n toolInput: input,\n status: \"running\",\n live: true,\n depth: this.depth,\n },\n },\n ];\n }\n\n #onToolCompleted(\n callId: string,\n status: string,\n output: unknown,\n errorMessage: string | undefined,\n errorCode: string | undefined,\n ): BlockOp[] {\n const id = this.#toolIds.get(callId);\n if (id === undefined) return [];\n const isApproval = status === \"pending\" && errorCode === \"needs_approval\";\n if (isApproval) {\n // Approval state stays live: the tool call has not resolved, and the\n // runner has yielded `session.waiting` to pause the stream. The block\n // sits with an `approval` glyph until the user resumes the session.\n return [\n {\n type: \"update-live\",\n id,\n patch: {\n status: \"approval\",\n result: errorMessage ?? \"awaiting approval\",\n },\n },\n ];\n }\n this.#toolIds.delete(callId);\n const ok = status === \"completed\";\n const patch: Partial<Block> = {\n status: ok ? \"done\" : \"error\",\n toolOutput: ok ? output : undefined,\n result: ok ? summarizeToolResult(output, 80) : errorMessage ?? \"failed\",\n live: false,\n };\n return [\n { type: \"update-live\", id, patch },\n { type: \"end-live\", id },\n ];\n }\n\n #onSubagentCalled(name: string, callId: string): BlockOp[] {\n const id = this.#id(\"subagent\");\n this.#subagentStack.push(id);\n return [\n {\n type: \"commit\",\n block: {\n kind: \"subagent\",\n id,\n title: name,\n depth: this.depth - 1,\n },\n },\n ];\n }\n\n #onSubagentCompleted(_callId: string, output: string): BlockOp[] {\n if (this.#subagentStack.length === 0) return [];\n this.#subagentStack.pop();\n if (output && output.length > 0) {\n return [\n {\n type: \"commit\",\n block: {\n kind: \"subagent-step\",\n body: output,\n depth: this.depth,\n },\n },\n ];\n }\n return [];\n }\n\n #onFailure(code: string, message: string): BlockOp[] {\n return [\n {\n type: \"commit\",\n block: {\n kind: \"error\",\n title: code,\n body: message,\n depth: this.depth,\n },\n },\n ];\n }\n\n #assistantKind<B extends Block>(block: B): B {\n return this.depth > 0 && block.kind === \"assistant\"\n ? ({ ...block, kind: \"subagent-step\" } as unknown as B)\n : block;\n }\n}\n\nconst DELTA_KEY = \"__delta\" as const;\n\nfunction withDelta(delta: string): Partial<Block> {\n return { [DELTA_KEY]: delta } as unknown as Partial<Block>;\n}\n\n/**\n * Applies a `BlockOp` to a mutable block store. The store keeps `live` blocks\n * as an insertion-ordered map (for live-region redraw) and `committed` blocks\n * as an append-only array (for scrollback). `commit` from the store is\n * whatever rows should be flushed to `LiveRegion.commit`.\n */\nexport interface BlockStore {\n readonly live: ReadonlyMap<string, Block>;\n readonly justCommitted: readonly Block[];\n apply(op: BlockOp): void;\n drainCommitted(): Block[];\n}\n\nexport function createBlockStore(): BlockStore {\n const live = new Map<string, Block>();\n let justCommitted: Block[] = [];\n\n return {\n get live() {\n return live;\n },\n get justCommitted() {\n return justCommitted;\n },\n apply(op) {\n switch (op.type) {\n case \"commit\":\n justCommitted.push(op.block);\n return;\n case \"start-live\":\n if (op.block.id === undefined) return;\n live.set(op.block.id, op.block);\n return;\n case \"update-live\": {\n const existing = live.get(op.id);\n if (existing === undefined) return;\n const patch = op.patch as Partial<Block> & { [DELTA_KEY]?: string };\n const delta = patch[DELTA_KEY];\n const rest: Partial<Block> = { ...patch };\n delete (rest as { [DELTA_KEY]?: string })[DELTA_KEY];\n const merged: Block = { ...existing, ...rest };\n if (delta !== undefined) merged.body = `${existing.body ?? \"\"}${delta}`;\n live.set(op.id, merged);\n return;\n }\n case \"end-live\": {\n const existing = live.get(op.id);\n if (existing === undefined) return;\n live.delete(op.id);\n justCommitted.push({ ...existing, live: false });\n return;\n }\n case \"clear-live\":\n live.delete(op.id);\n return;\n }\n },\n drainCommitted() {\n const out = justCommitted;\n justCommitted = [];\n return out;\n },\n };\n}\n","import { visibleLength } from \"../ui/terminal-text\";\n\ntype TableAlignment = \"left\" | \"center\" | \"right\";\n\nconst ansi = {\n bold: \"\\x1b[1m\",\n boldOff: \"\\x1b[22m\",\n italic: \"\\x1b[3m\",\n italicOff: \"\\x1b[23m\",\n};\n\nconst tableSeparator = \"─\";\n\nexport function renderMarkdown(input: string): string {\n const lines = input.split(\"\\n\");\n const output: string[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const table = parseTable(lines, index);\n if (table != null) {\n output.push(...renderTable(table));\n index = table.endIndex - 1;\n continue;\n }\n output.push(renderMarkdownLine(lines[index] ?? \"\"));\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderMarkdownLine(line: string): string {\n if (line.startsWith(\"### \")) return renderInlineMarkdown(`▶ ${line.slice(4)}`);\n if (line.startsWith(\"## \")) return renderInlineMarkdown(`■ ${line.slice(3)}`);\n if (line.startsWith(\"# \")) return renderInlineMarkdown(`█ ${line.slice(2)}`);\n\n const unorderedListItem = line.match(/^(\\s*)[-+*]\\s+(.*)$/);\n if (unorderedListItem) {\n const [, indentation, text = \"\"] = unorderedListItem;\n return renderInlineMarkdown(`${indentation}•${text.length > 0 ? ` ${text}` : \"\"}`);\n }\n\n if (/^\\d+\\. /.test(line)) return renderInlineMarkdown(line.replace(/^(\\d+)\\. /, \"$1. \"));\n if (line.startsWith(\"> \")) return renderInlineMarkdown(`│ ${line.slice(2)}`);\n return renderInlineMarkdown(line);\n}\n\nfunction renderInlineMarkdown(input: string): string {\n const urls: string[] = [];\n const shielded = input.replaceAll(/https?:\\/\\/\\S+/g, (match) => {\n const token = `${urls.length}`;\n urls.push(match);\n return token;\n });\n\n const styled = shielded\n .replaceAll(/`([^`]+)`/g, \"$1\")\n .replaceAll(/\\*\\*([^*\\n]+)\\*\\*/g, `${ansi.bold}$1${ansi.boldOff}`)\n .replaceAll(/__([^_\\n]+)__/g, `${ansi.bold}$1${ansi.boldOff}`)\n .replaceAll(/\\*([^*\\n]+)\\*/g, `${ansi.italic}$1${ansi.italicOff}`)\n .replaceAll(/_([^_\\n]+)_/g, `${ansi.italic}$1${ansi.italicOff}`);\n\n return styled.replaceAll(/(\\d+)/g, (_match, index) => urls[Number(index)] ?? \"\");\n}\n\ntype ParsedTable = {\n alignments: TableAlignment[];\n endIndex: number;\n header: string[];\n rows: string[][];\n};\n\nfunction parseTable(lines: string[], startIndex: number): ParsedTable | undefined {\n const header = parseTableCells(lines[startIndex] ?? \"\");\n if (header == null || header.length < 2) return undefined;\n\n const separatorCells = parseTableCells(lines[startIndex + 1] ?? \"\");\n if (separatorCells == null || separatorCells.length !== header.length) return undefined;\n\n const alignments = parseTableAlignments(separatorCells);\n if (alignments == null) return undefined;\n\n const rows: string[][] = [];\n let endIndex = startIndex + 2;\n\n while (endIndex < lines.length) {\n const row = parseTableCells(lines[endIndex] ?? \"\");\n if (row == null) break;\n rows.push(normalizeTableRow(row, header.length));\n endIndex += 1;\n }\n\n return { alignments, endIndex, header, rows };\n}\n\nfunction parseTableCells(line: string): string[] | undefined {\n if (!line.includes(\"|\")) return undefined;\n\n let tableLine = line.trim();\n if (tableLine.startsWith(\"|\")) tableLine = tableLine.slice(1);\n if (tableLine.endsWith(\"|\") && !tableLine.endsWith(\"\\\\|\")) {\n tableLine = tableLine.slice(0, -1);\n }\n\n const cells: string[] = [];\n let cell = \"\";\n\n for (let index = 0; index < tableLine.length; index += 1) {\n const character = tableLine[index];\n const nextCharacter = tableLine[index + 1];\n\n if (character === \"\\\\\" && nextCharacter === \"|\") {\n cell += \"|\";\n index += 1;\n continue;\n }\n if (character === \"|\") {\n cells.push(cell.trim());\n cell = \"\";\n continue;\n }\n cell += character;\n }\n\n cells.push(cell.trim());\n return cells;\n}\n\nfunction parseTableAlignments(cells: string[]): TableAlignment[] | undefined {\n const alignments: TableAlignment[] = [];\n\n for (const cell of cells) {\n const match = cell.match(/^(:)?-{3,}(:)?$/);\n if (match == null) return undefined;\n\n const [, left, right] = match;\n alignments.push(left != null && right != null ? \"center\" : right != null ? \"right\" : \"left\");\n }\n\n return alignments;\n}\n\nfunction normalizeTableRow(row: string[], length: number): string[] {\n return Array.from({ length }, (_, index) => row[index] ?? \"\");\n}\n\nfunction renderTable(table: ParsedTable): string[] {\n const header = table.header.map(\n (cell) => `${ansi.bold}${renderInlineMarkdown(cell)}${ansi.boldOff}`,\n );\n const rows = table.rows.map((row) => row.map(renderInlineMarkdown));\n const tableRows = [header, ...rows];\n const widths = table.alignments.map((_, columnIndex) =>\n Math.max(3, ...tableRows.map((row) => visibleLength(row[columnIndex] ?? \"\"))),\n );\n\n return [\n formatTableRow(header, widths, table.alignments),\n widths.map((width) => tableSeparator.repeat(width)).join(\" \"),\n ...rows.map((row) => formatTableRow(row, widths, table.alignments)),\n ];\n}\n\nfunction formatTableRow(row: string[], widths: number[], alignments: TableAlignment[]): string {\n return row\n .map((cell, index) => alignTableCell(cell, widths[index] ?? 0, alignments[index] ?? \"left\"))\n .join(\" \");\n}\n\nfunction alignTableCell(cell: string, width: number, alignment: TableAlignment): string {\n const paddingWidth = Math.max(0, width - visibleLength(cell));\n\n if (alignment === \"right\") return `${\" \".repeat(paddingWidth)}${cell}`;\n\n if (alignment === \"center\") {\n const leftPadding = Math.floor(paddingWidth / 2);\n const rightPadding = paddingWidth - leftPadding;\n return `${\" \".repeat(leftPadding)}${cell}${\" \".repeat(rightPadding)}`;\n }\n\n return `${cell}${\" \".repeat(paddingWidth)}`;\n}\n","import { renderMarkdown } from \"../markdown\";\nimport type { Theme } from \"../theme\";\nimport { isPromptControlCommand } from \"../prompt-commands\";\nimport { formatValuePretty, truncate } from \"../tool-format\";\nimport { sliceVisible, visibleLength, wrapVisibleLine } from \"../../ui/terminal-text\";\n\nexport type ToolStatus = \"running\" | \"done\" | \"error\" | \"denied\" | \"approval\";\n\nexport type BlockKind =\n | \"user\"\n | \"assistant\"\n | \"reasoning\"\n | \"tool\"\n | \"error\"\n | \"notice\"\n | \"warning\"\n | \"result\"\n | \"command\"\n | \"subagent\"\n | \"subagent-step\"\n | \"subagent-tool\"\n | \"agent-header\";\n\nexport interface Block {\n kind: BlockKind;\n id?: string;\n depth?: number;\n live?: boolean;\n\n title?: string;\n subtitle?: string;\n body?: string;\n reasoning?: string;\n result?: string;\n detail?: string;\n\n status?: ToolStatus;\n preformatted?: boolean;\n collapsed?: boolean;\n expanded?: boolean;\n toolInput?: unknown;\n toolOutput?: unknown;\n}\n\nexport interface RenderBlockContext {\n spinner: string;\n previous?: { kind: BlockKind; title?: string };\n}\n\nexport function renderBlockLines(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n const depth = block.depth ?? 0;\n const prefix = nestingPrefix(depth, theme);\n const avail = Math.max(8, width - visibleLength(prefix));\n const rows = renderBody(block, avail, theme, context);\n return rows.map((row) => `${prefix}${row}`);\n}\n\nfunction nestingPrefix(depth: number, theme: Theme): string {\n if (depth <= 0) return \"\";\n const rule = `${theme.colors.orange(theme.glyph.rule)} `;\n return rule.repeat(depth);\n}\n\nfunction renderBody(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n switch (block.kind) {\n case \"user\":\n return renderUser(block, width, theme);\n case \"assistant\":\n case \"subagent-step\":\n return renderProse(block, width, theme);\n case \"reasoning\":\n return renderReasoning(block, width, theme);\n case \"tool\":\n case \"subagent-tool\":\n return renderTool(block, width, theme, context);\n case \"error\":\n return renderError(block, width, theme);\n case \"notice\":\n return renderNotice(block, width, theme);\n case \"warning\":\n return renderWarning(block, width, theme);\n case \"result\":\n return renderResult(block, width, theme);\n case \"command\":\n return renderCommand(block, theme);\n case \"subagent\":\n return renderSubagentHeader(block, width, theme);\n case \"agent-header\":\n return (block.body ?? \"\").split(\"\\n\");\n }\n}\n\nfunction renderUser(block: Block, width: number, theme: Theme): string[] {\n const bar = theme.colors.cyan(theme.glyph.user);\n const lines = wrap(block.body ?? \"\", width - 2);\n return lines.map((line) => `${bar} ${line}`);\n}\n\nfunction renderProse(block: Block, width: number, theme: Theme): string[] {\n const rows: string[] = [];\n const isSubagent = block.kind === \"subagent-step\";\n const glyph = isSubagent ? \"\" : `${theme.colors.bold(theme.colors.white(theme.glyph.brand))} `;\n const indent = isSubagent ? \"\" : \" \";\n\n if (block.reasoning && block.reasoning.trim().length > 0) {\n rows.push(...renderReasoningLines(block.reasoning, width, theme));\n }\n\n const body = (block.body ?? \"\").trim();\n if (body.length === 0 && rows.length === 0) {\n return [`${glyph}${theme.colors.dim(`thinking${theme.glyph.ellipsis}`)}`];\n }\n\n if (body.length > 0) {\n const rendered = renderMarkdown(body)\n .split(\"\\n\")\n .flatMap((line) => wrapVisibleLine(line, width - indent.length));\n rendered.forEach((line, index) => {\n if (index === 0 && !isSubagent && rows.length === 0) {\n rows.push(`${glyph}${line}`);\n } else {\n rows.push(`${indent}${line}`);\n }\n });\n }\n\n return rows.length > 0 ? rows : [`${glyph}`];\n}\n\nfunction renderReasoning(block: Block, width: number, theme: Theme): string[] {\n if (block.collapsed) {\n return [`${theme.colors.gray(theme.glyph.reasoning)} ${theme.colors.dim(\"thinking\")}`];\n }\n return renderReasoningLines(block.body ?? \"\", width, theme, theme.glyph.reasoning);\n}\n\nfunction renderReasoningLines(\n text: string,\n width: number,\n theme: Theme,\n glyph?: string,\n): string[] {\n const pad = glyph ? 2 : 0;\n const lines = wrap(text.trim(), width - pad);\n if (lines.length === 0) return [];\n return lines.map((line, index) => {\n const prefix = glyph ? (index === 0 ? `${theme.colors.gray(glyph)} ` : \" \") : \"\";\n return `${prefix}${theme.colors.dim(theme.colors.italic(line))}`;\n });\n}\n\nfunction renderTool(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n const { icon, accent } = toolGlyph(block.status ?? \"running\", theme, context);\n const name = block.title ?? \"tool\";\n const headerWidth = width - 2;\n const namePlain = truncatePlain(name, headerWidth);\n let header = `${icon} ${theme.colors.bold(namePlain)}`;\n const argsBudget = headerWidth - namePlain.length - 2;\n const args = block.subtitle ?? \"\";\n if (args.length > 0 && argsBudget >= 6) {\n header += ` ${theme.colors.gray(truncate(args, argsBudget))}`;\n }\n\n const rows = [header];\n\n if (block.expanded) {\n rows.push(...renderToolExpanded(block, width, theme));\n } else if (block.status === \"done\" && block.result && block.result.length > 0) {\n rows.push(resultLine(theme.glyph.arrow, block.result, width, theme, accent));\n } else if (block.status === \"error\" && block.result) {\n rows.push(resultLine(theme.glyph.arrow, block.result, width, theme, theme.colors.red));\n } else if (block.status === \"denied\") {\n rows.push(resultLine(theme.glyph.arrow, \"denied\", width, theme, theme.colors.yellow));\n }\n\n return rows;\n}\n\nfunction renderToolExpanded(block: Block, width: number, theme: Theme): string[] {\n const rows: string[] = [];\n const push = (label: string, value: unknown, color: (text: string) => string) => {\n if (value === undefined) return;\n rows.push(` ${theme.colors.dim(label)}`);\n for (const line of wrap(formatValuePretty(value), width - 4)) {\n rows.push(` ${color(line)}`);\n }\n };\n push(\"input\", block.toolInput, theme.colors.gray);\n if (block.status === \"error\" && block.result) {\n push(\"error\", block.result, theme.colors.red);\n } else {\n push(\"output\", block.toolOutput, theme.colors.gray);\n }\n return rows;\n}\n\nfunction resultLine(\n marker: string,\n text: string,\n width: number,\n theme: Theme,\n color: (text: string) => string,\n): string {\n const budget = width - 4;\n return ` ${theme.colors.dim(marker)} ${color(truncate(text, budget))}`;\n}\n\nfunction toolGlyph(\n status: ToolStatus,\n theme: Theme,\n context: RenderBlockContext,\n): { icon: string; accent: (text: string) => string } {\n switch (status) {\n case \"done\":\n return { icon: theme.colors.green(theme.glyph.success), accent: theme.colors.gray };\n case \"error\":\n return { icon: theme.colors.red(theme.glyph.error), accent: theme.colors.red };\n case \"denied\":\n return { icon: theme.colors.yellow(theme.glyph.warning), accent: theme.colors.yellow };\n case \"approval\":\n return { icon: theme.colors.yellow(theme.glyph.question), accent: theme.colors.yellow };\n case \"running\":\n default:\n return { icon: theme.colors.yellow(context.spinner), accent: theme.colors.gray };\n }\n}\n\nconst ERROR_DETAIL_MAX_LINES = 12;\n\nfunction renderError(block: Block, width: number, theme: Theme): string[] {\n const icon = theme.colors.red(theme.colors.bold(theme.glyph.error));\n const title = block.title ?? \"Error\";\n const rows = [`${icon} ${theme.colors.red(theme.colors.bold(title))}`];\n for (const line of wrap(block.body ?? \"\", width - 2)) {\n rows.push(` ${colorizeError(line, theme)}`);\n }\n rows.push(...renderErrorDetail(block.detail, width, theme));\n return rows;\n}\n\nfunction renderErrorDetail(detail: string | undefined, width: number, theme: Theme): string[] {\n if (detail === undefined || detail.trim().length === 0) return [];\n const lines = detail.split(\"\\n\");\n const visible = lines.slice(0, ERROR_DETAIL_MAX_LINES);\n const rows = visible.map(\n (line) => ` ${theme.colors.dim(truncatePlain(line, Math.max(1, width - 2)))}`,\n );\n const hidden = lines.length - visible.length;\n if (hidden > 0) {\n rows.push(\n ` ${theme.colors.dim(`${theme.glyph.ellipsis} +${hidden} more line${hidden === 1 ? \"\" : \"s\"}`)}`,\n );\n }\n return rows;\n}\n\nconst URL_PATTERN = /(https?:\\/\\/\\S+)/u;\n\nfunction colorizeError(line: string, theme: Theme): string {\n if (!URL_PATTERN.test(line)) return theme.colors.red(line);\n return line\n .split(URL_PATTERN)\n .map((segment, index) =>\n index % 2 === 1 ? theme.colors.cyan(segment) : theme.colors.red(segment),\n )\n .join(\"\");\n}\n\nfunction renderNotice(block: Block, width: number, theme: Theme): string[] {\n const marker = theme.colors.dim(theme.glyph.dot);\n const lines = wrap(block.body ?? \"\", width - 2);\n if (lines.length === 0) return [marker];\n return lines.map((line) => `${marker} ${theme.colors.dim(line)}`);\n}\n\nexport function renderAttentionRows(body: string, width: number, theme: Theme): string[] {\n const marker = theme.colors.yellow(theme.glyph.warning);\n const lines = wrap(body, width - 2);\n return lines.map((line, index) => `${index === 0 ? marker : \" \"} ${paintCommands(line, theme)}`);\n}\n\nfunction renderWarning(block: Block, width: number, theme: Theme): string[] {\n return renderAttentionRows(block.body ?? \"\", width, theme);\n}\n\nfunction paintCommands(line: string, theme: Theme): string {\n return line.replace(/\\/[a-z:-]+/g, (token) =>\n isPromptControlCommand(token) ? theme.colors.blue(token) : token,\n );\n}\n\n/**\n * A slash-command invocation echoed under the user gutter. Rendered blue\n * so it's obvious it's a system-directed action, not chat content, but\n * marked with the same `▌` glyph as user messages so it visually chains\n * with the transcript. Failed commands (status: \"error\") get a leading `⨯`.\n */\nfunction renderCommand(block: Block, theme: Theme): string[] {\n const c = theme.colors;\n const status = block.status === \"error\" ? `${c.red(theme.glyph.error)} ` : \"\";\n return [`${c.cyan(theme.glyph.user)} ${status}${c.blue(block.body ?? \"\")}`];\n}\n\nfunction renderResult(block: Block, width: number, theme: Theme): string[] {\n const marker = theme.colors.dim(theme.glyph.elbow);\n const lines = wrap(block.body ?? \"\", width - 7);\n if (lines.length === 0) return [` ${marker}`];\n const dim = (line: string): string =>\n theme.colors.dim(line.replaceAll(\"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"));\n return lines.map((line, index) =>\n index === 0 ? ` ${marker} ${dim(line)}` : ` ${dim(line)}`,\n );\n}\n\nfunction renderSubagentHeader(block: Block, width: number, theme: Theme): string[] {\n const name = truncatePlain(block.title ?? \"subagent\", Math.max(8, width - 14));\n return [\n `${theme.colors.orange(theme.glyph.subagent)} ${theme.colors.bold(name)} ${theme.colors.dim(\"subagent\")}`,\n ];\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (text.trim().length === 0) return [];\n return text.split(\"\\n\").flatMap((line) => wrapVisibleLine(line, Math.max(1, width)));\n}\n\nfunction truncatePlain(text: string, maxWidth: number): string {\n if (visibleLength(text) <= maxWidth) return text;\n return sliceVisible(text, maxWidth);\n}\n","import type { Block } from \"./blocks\";\nimport { renderBlockLines, type RenderBlockContext } from \"./blocks\";\nimport { createBlockStore, type BlockOp, type BlockStore } from \"./event-to-blocks\";\nimport { LiveRegion, type TerminalOutput } from \"./live-region\";\nimport { createTheme, detectUnicode, type Theme } from \"../theme\";\nimport {\n EMPTY_LINE,\n PromptHistory,\n applyLineEditorKey,\n type LineState,\n visibleLine,\n} from \"../line-editor\";\nimport { inputTextWidth, visibleLength } from \"../../ui/terminal-text\";\nimport type { TerminalKey } from \"../key-parser\";\nimport {\n matchingCommands,\n type PromptCommandSpec,\n PROMPT_COMMANDS,\n} from \"../prompt-commands\";\n\nexport interface TerminalRendererOptions {\n readonly output?: TerminalOutput;\n readonly theme?: Theme;\n readonly commands?: readonly PromptCommandSpec[];\n readonly spinnerIntervalMs?: number;\n}\n\ninterface TypeaheadState {\n readonly matches: readonly PromptCommandSpec[];\n readonly selectedIndex: number;\n readonly dismissed: boolean;\n}\n\nconst EMPTY_TYPEAHEAD: TypeaheadState = {\n matches: [],\n selectedIndex: 0,\n dismissed: false,\n};\n\n/**\n * Terminal-side glue for the block renderer.\n *\n * Owns the LiveRegion, the block store, the line editor's `LineState`, and\n * the slash-command typeahead. External code feeds it stream events via\n * {@link apply} and key presses via {@link handleKey}; the renderer decides\n * when a prompt has been submitted and resolves the pending\n * `readPrompt` promise with its text.\n */\nexport class TerminalRenderer {\n readonly #output: TerminalOutput;\n readonly #theme: Theme;\n readonly #commands: readonly PromptCommandSpec[];\n readonly #store: BlockStore;\n readonly #region: LiveRegion;\n readonly #history = new PromptHistory();\n readonly #spinnerIntervalMs: number;\n #line: LineState = EMPTY_LINE;\n #typeahead: TypeaheadState = EMPTY_TYPEAHEAD;\n #pendingResolve: ((value: string | undefined) => void) | undefined;\n #spinnerFrame = 0;\n #spinnerTimer: ReturnType<typeof setInterval> | undefined;\n #stopped = false;\n #firstPaintDone = false;\n\n constructor(options: TerminalRendererOptions = {}) {\n this.#output = options.output ?? (process.stdout as unknown as TerminalOutput);\n this.#theme = options.theme ?? createTheme({ unicode: detectUnicode() });\n this.#commands = options.commands ?? PROMPT_COMMANDS;\n this.#spinnerIntervalMs = options.spinnerIntervalMs ?? 90;\n this.#store = createBlockStore();\n this.#region = new LiveRegion({\n output: this.#output,\n onResize: () => this.#paint(),\n });\n }\n\n apply(ops: readonly BlockOp[]): void {\n if (ops.length === 0) return;\n for (const op of ops) this.#store.apply(op);\n this.#flushCommitted();\n this.#syncSpinner();\n this.#paint();\n }\n\n writeNotice(text: string): void {\n this.apply([{ type: \"commit\", block: { kind: \"notice\", body: text } }]);\n }\n\n writeError(title: string, message: string): void {\n this.apply([\n { type: \"commit\", block: { kind: \"error\", title, body: message } },\n ]);\n }\n\n writeAgentHeader(body: string): void {\n this.apply([{ type: \"commit\", block: { kind: \"agent-header\", body } }]);\n }\n\n /**\n * Echoes a slash-command invocation to scrollback so it chains with the\n * transcript above (blue `▌ /model`) and the {@link writeCommandResult}\n * that hangs beneath it can share visual context.\n */\n writeCommandInvocation(text: string, status?: \"error\"): void {\n const block: Block = { kind: \"command\", body: text };\n if (status === \"error\") block.status = \"error\";\n this.apply([{ type: \"commit\", block }]);\n }\n\n /**\n * Writes a command outcome hung under the previous invocation with the\n * elbow connector (`⎿ message`). Multi-line messages soft-wrap under the\n * elbow.\n */\n writeCommandResult(text: string): void {\n this.apply([{ type: \"commit\", block: { kind: \"result\", body: text } }]);\n }\n\n readPrompt(): Promise<string | undefined> {\n return new Promise((resolve) => {\n this.#pendingResolve = resolve;\n this.#line = EMPTY_LINE;\n this.#typeahead = EMPTY_TYPEAHEAD;\n this.#history.begin(this.#line.text);\n this.#paint();\n });\n }\n\n handleKey(key: TerminalKey): void {\n if (this.#pendingResolve === undefined) return;\n\n if (key.type === \"ctrl-c\") {\n const resolve = this.#pendingResolve;\n this.#pendingResolve = undefined;\n this.stop();\n resolve(undefined);\n return;\n }\n\n if (this.#isTypeaheadOpen() && (key.type === \"up\" || key.type === \"down\")) {\n const delta = key.type === \"up\" ? -1 : 1;\n this.#moveTypeahead(delta);\n this.#paint();\n return;\n }\n\n if (this.#isTypeaheadOpen() && (key.type === \"tab\" || key.type === \"enter\")) {\n this.#acceptTypeahead(key.type === \"enter\");\n return;\n }\n\n if (key.type === \"escape\" && this.#isTypeaheadOpen()) {\n this.#typeahead = { ...this.#typeahead, dismissed: true };\n this.#paint();\n return;\n }\n\n if (key.type === \"enter\") {\n this.#submit();\n return;\n }\n\n if (key.type === \"up\" || key.type === \"ctrl-p\") {\n const previous = this.#history.previous(this.#line.text);\n if (previous !== undefined) {\n this.#line = { text: previous, cursor: previous.length };\n this.#refreshTypeahead();\n this.#paint();\n }\n return;\n }\n if (key.type === \"down\" || key.type === \"ctrl-n\") {\n const next = this.#history.next();\n if (next !== undefined) {\n this.#line = { text: next, cursor: next.length };\n this.#refreshTypeahead();\n this.#paint();\n }\n return;\n }\n\n const nextLine = applyLineEditorKey(this.#line, key, { multiline: false });\n if (nextLine !== undefined) {\n this.#line = nextLine;\n this.#refreshTypeahead();\n this.#paint();\n }\n }\n\n stop(): void {\n if (this.#stopped) return;\n this.#stopped = true;\n if (this.#spinnerTimer !== undefined) clearInterval(this.#spinnerTimer);\n this.#region.stop();\n }\n\n #submit(): void {\n if (this.#pendingResolve === undefined) return;\n const text = this.#line.text;\n this.#history.add(text);\n const resolve = this.#pendingResolve;\n this.#pendingResolve = undefined;\n this.#line = EMPTY_LINE;\n this.#typeahead = EMPTY_TYPEAHEAD;\n this.#region.paint([], { row: 1, col: 1 });\n resolve(text);\n }\n\n #refreshTypeahead(): void {\n const matches = matchingCommands(this.#commands, this.#line.text);\n this.#typeahead = { matches, selectedIndex: 0, dismissed: false };\n }\n\n #isTypeaheadOpen(): boolean {\n return this.#typeahead.matches.length > 0 && !this.#typeahead.dismissed;\n }\n\n #moveTypeahead(delta: number): void {\n const count = this.#typeahead.matches.length;\n if (count === 0) return;\n const selectedIndex = (this.#typeahead.selectedIndex + delta + count) % count;\n this.#typeahead = { ...this.#typeahead, selectedIndex };\n }\n\n #acceptTypeahead(submitAfter: boolean): void {\n const spec = this.#typeahead.matches[this.#typeahead.selectedIndex];\n if (spec === undefined) return;\n const text = `/${spec.name}${spec.takesArgument ? \" \" : \"\"}`;\n this.#line = { text, cursor: text.length };\n this.#typeahead = EMPTY_TYPEAHEAD;\n if (submitAfter && !spec.takesArgument) {\n this.#submit();\n } else {\n this.#paint();\n }\n }\n\n #flushCommitted(): void {\n const drained = this.#store.drainCommitted();\n if (drained.length === 0) return;\n const rows: string[] = [];\n let previous: RenderBlockContext[\"previous\"] | undefined;\n const ctx: RenderBlockContext = { spinner: this.#currentSpinner(), previous };\n for (const block of drained) {\n const blockCtx: RenderBlockContext = { spinner: this.#currentSpinner(), previous };\n rows.push(...renderBlockLines(block, this.columns, this.#theme, blockCtx));\n previous = { kind: block.kind, title: block.title };\n }\n if (rows.length > 0 && this.#firstPaintDone) rows.unshift(\"\");\n if (!this.#firstPaintDone && rows.length > 0) this.#firstPaintDone = true;\n this.#region.commit(rows);\n }\n\n #paint(): void {\n if (this.#stopped) return;\n if (this.#pendingResolve === undefined && this.#store.live.size === 0) {\n this.#region.paint([], { row: 1, col: 1 });\n return;\n }\n\n const rows: string[] = [];\n const ctx: RenderBlockContext = { spinner: this.#currentSpinner() };\n for (const block of this.#store.live.values()) {\n rows.push(...renderBlockLines(block, this.columns, this.#theme, ctx));\n }\n\n if (this.#pendingResolve !== undefined) {\n if (rows.length > 0) rows.push(\"\");\n const inputRow = this.#renderInputRow();\n const caretCol = this.#caretColumn();\n rows.push(inputRow);\n this.#region.paint(rows, { row: rows.length, col: caretCol });\n return;\n }\n\n this.#region.paint(rows, { row: rows.length, col: 1 });\n }\n\n #renderInputRow(): string {\n const c = this.#theme.colors;\n const promptGlyph = c.cyan(this.#theme.glyph.prompt);\n const promptWidth = visibleLength(`${this.#theme.glyph.prompt} `);\n const budget = Math.max(1, this.columns - promptWidth);\n const view = visibleLine(this.#line, budget);\n const before = view.before;\n const under = view.under.length === 0 ? \" \" : view.under;\n const after = view.after;\n return `${promptGlyph} ${before}${c.inverse(under)}${after}`;\n }\n\n #caretColumn(): number {\n const promptWidth = visibleLength(`${this.#theme.glyph.prompt} `);\n const view = visibleLine(this.#line, Math.max(1, this.columns - promptWidth));\n return 1 + promptWidth + inputTextWidth(view.before);\n }\n\n #currentSpinner(): string {\n return this.#theme.spinner[this.#spinnerFrame % this.#theme.spinner.length] ?? \"-\";\n }\n\n #syncSpinner(): void {\n const hasLive = [...this.#store.live.values()].some((b) => b.live === true);\n if (hasLive && this.#spinnerTimer === undefined) {\n this.#spinnerTimer = setInterval(() => {\n this.#spinnerFrame += 1;\n this.#paint();\n }, this.#spinnerIntervalMs);\n this.#spinnerTimer.unref?.();\n }\n if (!hasLive && this.#spinnerTimer !== undefined) {\n clearInterval(this.#spinnerTimer);\n this.#spinnerTimer = undefined;\n }\n }\n\n get columns(): number {\n return this.#region.columns;\n }\n}\n","import type { ModelToolDefinition } from \"../tools/index\";\n\ninterface ProviderConfig {\n baseUrl: string;\n apiKey: () => string | undefined;\n}\n\nconst PROVIDERS: Record<string, ProviderConfig> = {\n openai: {\n baseUrl: \"https://api.openai.com/v1\",\n apiKey: () => process.env.OPENAI_API_KEY,\n },\n anthropic: {\n baseUrl: \"https://api.anthropic.com/v1\",\n apiKey: () => process.env.ANTHROPIC_API_KEY,\n },\n groq: {\n baseUrl: \"https://api.groq.com/openai/v1\",\n apiKey: () => process.env.GROQ_API_KEY,\n },\n deepseek: {\n baseUrl: \"https://api.deepseek.com/v1\",\n apiKey: () => process.env.DEEPSEEK_API_KEY,\n },\n mistral: {\n baseUrl: \"https://api.mistral.ai/v1\",\n apiKey: () => process.env.MISTRAL_API_KEY,\n },\n google: {\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta\",\n apiKey: () => process.env.GOOGLE_API_KEY,\n },\n meta: {\n baseUrl: \"https://api.together.xyz/v1\",\n apiKey: () => process.env.TOGETHER_API_KEY || process.env.OPENAI_API_KEY,\n },\n};\n\nfunction parseModelId(modelId: string): { provider: string; model: string } {\n const slash = modelId.indexOf(\"/\");\n if (slash === -1) return { provider: \"\", model: modelId };\n return { provider: modelId.slice(0, slash), model: modelId.slice(slash + 1) };\n}\n\nexport interface LlmMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n}\n\nexport interface ToolResult {\n action_id: string;\n output: string;\n}\n\nexport interface LlmStreamEvent {\n type: \"delta\" | \"tool_call\" | \"done\" | \"error\";\n delta?: string;\n toolCall?: { name: string; arguments: string; id: string };\n toolCalls?: Array<{ name: string; arguments: string; id: string }>;\n finishReason?: string;\n error?: string;\n}\n\nexport function getProviderApiKey(provider: string): string | undefined {\n const cfg = PROVIDERS[provider];\n return cfg?.apiKey?.();\n}\n\nfunction flattenToolResults(model: string, results: ToolResult[]): LlmMessage[] {\n const provider = parseModelId(model).provider;\n if (provider === \"anthropic\") {\n return results.map((r) => ({\n role: \"user\" as const,\n content: JSON.stringify({ type: \"tool_result\", tool_use_id: r.action_id, content: r.output }),\n }));\n }\n return results.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.action_id,\n content: r.output,\n }));\n}\n\nexport async function* streamLlm(\n modelId: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const { provider, model } = parseModelId(modelId);\n const cfg = PROVIDERS[provider];\n\n if (!cfg) {\n yield { type: \"error\", error: `Unknown provider: ${provider}` };\n return;\n }\n\n const apiKey = cfg.apiKey();\n if (!apiKey) {\n yield { type: \"error\", error: `Missing API key for provider: ${provider}. Set ${provider.toUpperCase()}_API_KEY` };\n return;\n }\n\n if (provider === \"anthropic\") {\n yield* streamAnthropic(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n } else if (provider === \"google\") {\n yield* streamGoogle(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n } else {\n yield* streamOpenAICompatible(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n }\n}\n\nasync function* streamOpenAICompatible(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const body: Record<string, unknown> = {\n model,\n messages,\n stream: true,\n stream_options: { include_usage: false },\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools;\n }\n\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `LLM API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let accumulatedToolCalls: Map<number, { id: string; name: string; args: string }> = new Map();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const payload = line.slice(6).trim();\n if (payload === \"[DONE]\") {\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: \"stop\" };\n return;\n }\n\n try {\n const parsed = JSON.parse(payload);\n const choice = parsed.choices?.[0];\n\n if (choice?.finish_reason) {\n if (choice.finish_reason === \"tool_calls\" && accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: choice.finish_reason };\n return;\n }\n\n const delta = choice?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: \"delta\", delta: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n let existing = accumulatedToolCalls.get(idx);\n if (!existing) {\n if (!tc.function?.name) continue;\n existing = { id: tc.id ?? \"\", name: tc.function.name, args: \"\" };\n accumulatedToolCalls.set(idx, existing);\n }\n if (tc.id) existing.id = tc.id;\n if (tc.function?.name) existing.name = tc.function.name;\n if (tc.function?.arguments) existing.args += tc.function.arguments;\n }\n }\n } catch {}\n }\n }\n\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: \"stop\" };\n}\n\nasync function* streamAnthropic(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const systemMsgs = messages.filter((m) => m.role === \"system\");\n const chatMsgs = messages.filter((m) => m.role !== \"system\").map((m) => {\n if (m.role === \"tool\") {\n return {\n role: \"user\" as const,\n content: [{ type: \"tool_result\" as const, tool_use_id: m.tool_call_id!, content: m.content }],\n };\n }\n if (m.tool_calls) {\n return {\n role: \"assistant\" as const,\n content: m.tool_calls.map((tc) => ({\n type: \"tool_use\" as const,\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments || \"{}\"),\n })),\n };\n }\n return { role: m.role as \"user\" | \"assistant\", content: m.content };\n });\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: 4096,\n messages: chatMsgs,\n stream: true,\n };\n\n if (systemMsgs.length > 0) {\n body.system = systemMsgs.map((m) => ({ type: \"text\", text: m.content }));\n }\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema || { type: \"object\", properties: {} },\n }));\n }\n\n const res = await fetch(`${baseUrl}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `Anthropic API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let currentEvent = \"\";\n let accumulatedToolCalls: Map<string, { id: string; name: string; args: string }> = new Map();\n let inputJsonBuffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"event: \")) {\n currentEvent = line.slice(7);\n if (currentEvent === \"content_block_start\" || currentEvent === \"content_block_delta\") {\n inputJsonBuffer = \"\";\n }\n } else if (line.startsWith(\"data: \")) {\n const payload = line.slice(6).trim();\n if (!payload) continue;\n\n try {\n const parsed = JSON.parse(payload);\n\n if (currentEvent === \"content_block_start\" && parsed.content_block) {\n if (parsed.content_block.type === \"tool_use\") {\n accumulatedToolCalls.set(parsed.index, {\n id: parsed.content_block.id,\n name: parsed.content_block.name,\n args: \"\",\n });\n }\n } else if (currentEvent === \"content_block_delta\" && parsed.delta) {\n if (parsed.delta.type === \"text_delta\" && parsed.delta.text) {\n yield { type: \"delta\", delta: parsed.delta.text };\n } else if (parsed.delta.type === \"input_json_delta\" && parsed.delta.partial_json) {\n for (const [idx, tc] of accumulatedToolCalls) {\n if (String(parsed.index) === String(idx)) {\n tc.args += parsed.delta.partial_json;\n }\n }\n }\n } else if (currentEvent === \"message_start\") {\n } else if (currentEvent === \"message_delta\") {\n if (parsed.delta?.stop_reason === \"tool_use\" || parsed.delta?.stop_reason === \"end_turn\") {\n }\n if (parsed.delta?.stop_reason === \"end_turn\" && accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n accumulatedToolCalls.clear();\n }\n } else if (currentEvent === \"message_stop\") {\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n accumulatedToolCalls.clear();\n }\n yield { type: \"done\", finishReason: \"stop\" };\n return;\n }\n } catch {}\n }\n }\n }\n\n yield { type: \"done\", finishReason: \"stop\" };\n}\n\nasync function* streamGoogle(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const contents = messages.filter((m) => m.role !== \"system\").map((m) => {\n const role = m.role === \"assistant\" ? \"model\" : (m.role === \"tool\" ? \"user\" : m.role);\n return {\n role,\n parts: [{ text: m.content }],\n };\n });\n\n const body: Record<string, unknown> = {\n contents,\n generationConfig: { temperature: 0.7 },\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n functionDeclarations: [{\n name: t.name,\n description: t.description,\n parameters: t.input_schema || {},\n }],\n }));\n }\n\n const res = await fetch(\n `${baseUrl}/models/${model}:streamGenerateContent?key=${apiKey}&alt=sse`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `Google API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const payload = line.slice(6).trim();\n if (!payload) continue;\n\n try {\n const parsed = JSON.parse(payload);\n const candidate = parsed.candidates?.[0];\n if (!candidate) continue;\n\n const part = candidate.content?.parts?.[0];\n if (part?.text) {\n yield { type: \"delta\", delta: part.text };\n }\n\n if (candidate.finishReason) {\n yield { type: \"done\", finishReason: candidate.finishReason.toLowerCase() };\n return;\n }\n } catch {}\n }\n }\n\n yield { type: \"done\", finishReason: \"stop\" };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { streamLlm, getProviderApiKey, type LlmMessage, type ToolResult } from \"./llm\";\nimport type { ModelToolDefinition } from \"../tools/index\";\n\ninterface Session {\n id: string;\n agentId: string;\n model: string;\n instructions: string;\n messages: LlmMessage[];\n tools?: ModelToolDefinition[];\n pendingToolCalls?: Array<{ name: string; arguments: string; id: string }>;\n}\n\nconst sessions = new Map<string, Session>();\n\nlet sessionCounter = 0;\nfunction nextId(): string {\n return `local-${++sessionCounter}-${Date.now().toString(36)}`;\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n}\n\nfunction writeSSE(res: ServerResponse, event: string, data: unknown): void {\n res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`);\n}\n\nfunction parseUrl(url: string): { pathname: string } {\n const idx = url.indexOf(\"?\");\n return { pathname: idx === -1 ? url : url.slice(0, idx) };\n}\n\nexport async function handleSessionsRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<boolean> {\n const { pathname } = parseUrl(req.url ?? \"/\");\n\n const sessionMatch = pathname.match(/^\\/v1\\/sessions\\/([^/]+)\\/turns$/);\n const approveMatch = pathname.match(/^\\/v1\\/sessions\\/([^/]+)\\/approve$/);\n const createMatch = pathname === \"/v1/sessions\" && req.method === \"POST\";\n\n if (createMatch) {\n return handleCreateSession(req, res);\n }\n if (sessionMatch && req.method === \"POST\") {\n return handleTurn(req, res, sessionMatch[1]);\n }\n if (approveMatch && req.method === \"POST\") {\n return handleApprove(req, res, approveMatch[1]);\n }\n\n return false;\n}\n\nasync function handleCreateSession(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n const body = JSON.parse(await readBody(req));\n const id = nextId();\n const session: Session = {\n id,\n agentId: body.agent_id ?? \"unnamed\",\n model: body.metadata?.model ?? \"\",\n instructions: body.metadata?.instructions ?? \"\",\n messages: [],\n };\n sessions.set(id, session);\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ id }));\n return true;\n}\n\nasync function handleTurn(\n req: IncomingMessage,\n res: ServerResponse,\n sessionId: string,\n): Promise<boolean> {\n const session = sessions.get(sessionId);\n if (!session) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Session not found\" }));\n return true;\n }\n\n const body = JSON.parse(await readBody(req));\n const model = body.model || session.model;\n const input = body.input ?? \"\";\n const instructions = body.instructions || session.instructions;\n const stream = body.stream !== false;\n const pauseOnTools = body.pause_on_tool_calls !== false;\n const tools: ModelToolDefinition[] = (body.tools ?? []);\n\n session.model = model;\n session.instructions = instructions;\n if (tools.length > 0) session.tools = tools;\n\n const messages: LlmMessage[] = [];\n\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n\n for (const msg of session.messages) {\n messages.push(msg);\n }\n\n const turnNumber = session.messages.filter((m) => m.role === \"user\").length + 1;\n const userMsg: LlmMessage = { role: \"user\", content: input };\n messages.push(userMsg);\n\n if (stream) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n writeSSE(res, \"turn.started\", { turn_number: turnNumber, input_text: input });\n writeSSE(res, \"message.received\", { input_text: input, turn_number: turnNumber });\n writeSSE(res, \"step.started\", { step_number: 1, turn_number: turnNumber });\n\n let textSoFar = \"\";\n let hadToolCalls = false;\n let messagePushed = false;\n\n try {\n for await (const event of streamLlm(model, messages, tools.length > 0 ? tools : undefined)) {\n if (event.type === \"delta\" && event.delta) {\n textSoFar += event.delta;\n writeSSE(res, \"output_text.delta\", { delta: event.delta, text: textSoFar });\n }\n\n if (event.type === \"tool_call\" && event.toolCalls) {\n hadToolCalls = true;\n session.pendingToolCalls = event.toolCalls;\n\n for (const tc of event.toolCalls) {\n writeSSE(res, \"tool_call.started\", {\n tool: tc.name,\n arguments: JSON.parse(tc.arguments || \"{}\"),\n action_id: tc.id,\n });\n }\n\n const toolCallMsg: LlmMessage = {\n role: \"assistant\",\n content: textSoFar,\n tool_calls: event.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n\n if (pauseOnTools) {\n session.messages.push(toolCallMsg);\n messagePushed = true;\n writeSSE(res, \"turn.paused\", { text: textSoFar });\n res.end();\n return true;\n }\n\n session.messages.push(toolCallMsg);\n messagePushed = true;\n }\n\n if (event.type === \"done\") {\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: textSoFar });\n messagePushed = true;\n }\n writeSSE(res, \"message.completed\", {\n text: textSoFar,\n finish_reason: event.finishReason ?? \"stop\",\n step_number: 1,\n turn_number: turnNumber,\n });\n writeSSE(res, \"step.completed\", {\n finish_reason: event.finishReason ?? \"stop\",\n step_number: 1,\n turn_number: turnNumber,\n });\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n }\n\n if (event.type === \"error\") {\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n writeSSE(res, \"error\", { message: event.error });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n writeSSE(res, \"error\", { message: msg });\n }\n\n res.end();\n } else {\n let fullText = \"\";\n let messagePushed = false;\n try {\n for await (const event of streamLlm(model, messages, tools.length > 0 ? tools : undefined)) {\n if (event.type === \"delta\" && event.delta) {\n fullText += event.delta;\n }\n if (event.type === \"tool_call\" && event.toolCalls) {\n session.pendingToolCalls = event.toolCalls;\n }\n }\n } catch {}\n\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: fullText });\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ output: fullText, turn_id: sessionId }));\n }\n\n return true;\n}\n\nasync function handleApprove(\n req: IncomingMessage,\n res: ServerResponse,\n sessionId: string,\n): Promise<boolean> {\n const session = sessions.get(sessionId);\n if (!session) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Session not found\" }));\n return true;\n }\n\n const body = JSON.parse(await readBody(req));\n const toolResults: ToolResult[] = body.tool_results ?? [];\n const actionId = body.action_id ?? toolResults[0]?.action_id ?? \"\";\n\n if (!session.pendingToolCalls || session.pendingToolCalls.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"No pending tool calls\" }));\n return true;\n }\n\n const toolResultMessages = toolResults.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.action_id,\n content: r.output,\n }));\n\n for (const msg of toolResultMessages) {\n session.messages.push(msg);\n }\n\n session.pendingToolCalls = undefined;\n\n const turnNumber = session.messages.filter((m) => m.role === \"user\").length;\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n writeSSE(res, \"turn.resumed\", {});\n\n let textSoFar = \"\";\n let hadToolCalls = false;\n let messagePushed = false;\n\n try {\n for await (const event of streamLlm(\n session.model,\n session.messages,\n session.tools,\n toolResults,\n )) {\n if (event.type === \"delta\" && event.delta) {\n textSoFar += event.delta;\n writeSSE(res, \"output_text.delta\", { delta: event.delta, text: textSoFar });\n }\n\n if (event.type === \"tool_call\" && event.toolCalls) {\n hadToolCalls = true;\n session.pendingToolCalls = event.toolCalls;\n\n for (const tc of event.toolCalls) {\n writeSSE(res, \"tool_call.started\", {\n tool: tc.name,\n arguments: JSON.parse(tc.arguments || \"{}\"),\n action_id: tc.id,\n });\n }\n\n session.messages.push({\n role: \"assistant\",\n content: textSoFar,\n tool_calls: event.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n });\n messagePushed = true;\n\n writeSSE(res, \"turn.paused\", { text: textSoFar });\n res.end();\n return true;\n }\n\n if (event.type === \"done\") {\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: textSoFar });\n messagePushed = true;\n }\n writeSSE(res, \"message.completed\", {\n text: textSoFar,\n finish_reason: event.finishReason ?? \"stop\",\n });\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n }\n\n if (event.type === \"error\") {\n writeSSE(res, \"error\", { message: event.error });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n writeSSE(res, \"error\", { message: msg });\n }\n\n res.end();\n return true;\n}\n\nexport { getProviderApiKey };\n"],"mappings":"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","names":["resolve","resolve","resolve"]}
@@ -799,13 +799,13 @@ async function runInit(prompter, input) {
799
799
  if (action === void 0) return;
800
800
  switch (action) {
801
801
  case "chat": {
802
- const { devCommand } = await import("./dev-DCPOO54H.js");
802
+ const { devCommand } = await import("./dev-KO2CRPG3.js");
803
803
  prompter.stop();
804
804
  await devCommand({ port: "3000", agentDir: targetDir, input: true });
805
805
  break;
806
806
  }
807
807
  case "server": {
808
- const { devCommand } = await import("./dev-DCPOO54H.js");
808
+ const { devCommand } = await import("./dev-KO2CRPG3.js");
809
809
  prompter.stop();
810
810
  await devCommand({ port: "3000", agentDir: targetDir, input: false });
811
811
  break;
@@ -819,4 +819,4 @@ async function runInit(prompter, input) {
819
819
  export {
820
820
  initCommand
821
821
  };
822
- //# sourceMappingURL=init-Q2GCMBCJ.js.map
822
+ //# sourceMappingURL=init-Y7VNAVF7.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "arcie",
3
3
  "type": "module",
4
- "version": "0.1.8",
4
+ "version": "0.1.9",
5
5
  "description": "The electronic line — build agents at the speed of light.",
6
6
  "bin": {
7
7
  "arcie": "dist/cli/index.js"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/dev.ts","../src/cli/tui/renderer/start-block-chat.ts","../src/cli/agent-config.ts","../src/cli/tui/prompt-commands.ts","../src/cli/tui/tool-format.ts","../src/cli/tui/renderer/event-to-blocks.ts","../src/cli/tui/markdown.ts","../src/cli/tui/renderer/blocks.ts","../src/cli/tui/renderer/terminal-renderer.ts","../src/server/llm.ts","../src/server/index.ts"],"sourcesContent":["import { 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 {\n listChannels,\n providerKeyStatus,\n readAgentModel,\n writeAgentModel,\n} from \"../../agent-config\";\nimport { scaffoldWebChat } from \"../../scaffold-web-chat\";\nimport type { PromptCommand } from \"../prompt-commands\";\nimport { parsePromptCommand, formatPromptCommandHelp } from \"../prompt-commands\";\nimport { attachKeyStream } from \"../attach-keys\";\nimport { EventTranslator } from \"./event-to-blocks\";\nimport { TerminalRenderer } from \"./terminal-renderer\";\n\ntype ExtensionCommand = Extract<PromptCommand, { type: \"extension\" }>;\ntype LoglevelCommand = Extract<PromptCommand, { type: \"loglevel\" }>;\n\nconst VALID_LOG_MODES = new Set([\"all\", \"stderr\", \"none\"]);\n\nexport interface StartBlockChatOptions {\n readonly agentDir: string;\n readonly initialInput?: string;\n}\n\n/**\n * Runs the block-based dev TUI against a local agent directory. Returns when\n * the user submits `/exit` or presses Ctrl+C. Ownership of raw stdin is\n * scoped to this function; the caller does not need to restore terminal\n * state on exit paths.\n */\nexport async function startBlockChat(options: StartBlockChatOptions): Promise<void> {\n const { agentDir } = options;\n const renderer = new TerminalRenderer();\n const translator = new EventTranslator();\n\n const commitHeader = async () => {\n try {\n const agent = await loadAgent(agentDir);\n const model = agent.manifest.config.model;\n renderer.writeAgentHeader(`arcie · ${agentDir.split(\"/\").pop() ?? \"agent\"} · ${model}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n renderer.writeError(\"Agent load failed\", message);\n }\n };\n\n const { diagnostics } = discoverAgent(agentDir);\n const errorDiags = diagnostics.filter((d) => d.severity === \"error\");\n if (errorDiags.length > 0) {\n for (const d of errorDiags) renderer.writeError(d.code, d.message);\n renderer.stop();\n return;\n }\n\n await commitHeader();\n\n let watcher: FSWatcher | undefined;\n try {\n let reprobeTimer: ReturnType<typeof setTimeout> | undefined;\n watcher = watch(agentDir, { recursive: true }, () => {\n if (reprobeTimer !== undefined) clearTimeout(reprobeTimer);\n reprobeTimer = setTimeout(() => {\n void commitHeader();\n }, 250);\n });\n } catch {\n // A missing fs.watch (e.g. some sandboxes) is not fatal.\n }\n\n const detachKeys = attachKeyStream((key) => renderer.handleKey(key));\n\n const logLevelState = { mode: \"none\" as \"all\" | \"stderr\" | \"none\" };\n\n try {\n if (options.initialInput !== undefined && options.initialInput.length > 0) {\n await streamOneTurn(renderer, translator, agentDir, options.initialInput);\n }\n\n while (true) {\n const text = await renderer.readPrompt();\n if (text === undefined) return;\n const trimmed = text.trim();\n if (trimmed.length === 0) continue;\n\n if (trimmed.startsWith(\"/\")) {\n const command = parsePromptCommand(trimmed);\n if (command === null) {\n renderer.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 await handleExtension(command, renderer, agentDir, commitHeader);\n continue;\n case \"loglevel\":\n handleLogLevel(command, renderer, logLevelState);\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 handleExtension(\n command: ExtensionCommand,\n renderer: TerminalRenderer,\n agentDir: string,\n commitHeader: () => Promise<void>,\n): Promise<void> {\n const argument = command.argument.trim();\n switch (command.name) {\n case \"model\":\n await handleModel(argument, renderer, agentDir, commitHeader);\n return;\n case \"provider\":\n handleProvider(renderer, agentDir);\n return;\n case \"channels\":\n handleChannels(argument, renderer, agentDir);\n return;\n default:\n renderer.writeNotice(`/${command.name} is not supported here`);\n }\n}\n\nasync function handleModel(\n argument: string,\n renderer: TerminalRenderer,\n agentDir: string,\n commitHeader: () => Promise<void>,\n): Promise<void> {\n const current = readAgentModel(agentDir);\n if (argument.length === 0) {\n renderer.writeNotice(\n current ? `current model: ${current}` : \"no model configured in agent/agent.ts\",\n );\n renderer.writeNotice(\"change it with: /model <provider/slug>\");\n return;\n }\n if (current === argument) {\n renderer.writeNotice(`model is already ${argument}`);\n return;\n }\n const changed = writeAgentModel(agentDir, argument);\n if (!changed) {\n renderer.writeError(\n \"Model not changed\",\n \"Could not update agent/agent.ts — file missing or model field not found.\",\n );\n return;\n }\n renderer.writeNotice(`model set to ${argument}`);\n await commitHeader();\n}\n\nfunction handleProvider(renderer: TerminalRenderer, agentDir: string): void {\n const status = providerKeyStatus(agentDir);\n const configured = status.filter((row) => row.set);\n if (configured.length === 0) {\n renderer.writeNotice(\"no provider keys configured\");\n renderer.writeNotice(\"edit .env.local to add CENCORI_API_KEY or a direct provider key\");\n return;\n }\n renderer.writeNotice(\"provider keys:\");\n for (const row of status) {\n if (row.set) {\n renderer.writeNotice(` ${row.key} = ${row.masked} (${row.source})`);\n } else {\n renderer.writeNotice(` ${row.key} — not set`);\n }\n }\n}\n\nfunction handleChannels(\n argument: string,\n renderer: TerminalRenderer,\n agentDir: string,\n): void {\n if (argument.length === 0) {\n const channels = listChannels(agentDir);\n if (channels.length === 0) {\n renderer.writeNotice(\"no channels scaffolded\");\n renderer.writeNotice(\"add one with: /channels add web\");\n return;\n }\n renderer.writeNotice(\"channels:\");\n for (const channel of channels) renderer.writeNotice(` ${channel.name} — ${channel.path}`);\n renderer.writeNotice(\"add another with: /channels add <kind>\");\n return;\n }\n\n const parts = argument.split(/\\s+/);\n const subcommand = parts[0];\n const kind = parts[1];\n if (subcommand !== \"add\") {\n renderer.writeError(\"Unknown /channels subcommand\", `try: /channels add web`);\n return;\n }\n if (kind !== \"web\") {\n renderer.writeError(\"Unsupported channel kind\", `${kind ?? \"(none)\"} — only 'web' is supported`);\n return;\n }\n try {\n const result = scaffoldWebChat(agentDir);\n if (result.alreadyExisted) {\n renderer.writeNotice(`channels/web already exists — left it untouched`);\n return;\n }\n renderer.writeNotice(`scaffolded ${result.targetPath}`);\n renderer.writeNotice(\"next: cd into it, npm install, npm run dev\");\n } catch (err) {\n renderer.writeError(\n \"Channel scaffold failed\",\n err instanceof Error ? err.message : String(err),\n );\n }\n}\n\nfunction handleLogLevel(\n command: LoglevelCommand,\n renderer: TerminalRenderer,\n state: { mode: \"all\" | \"stderr\" | \"none\" },\n): void {\n const argument = command.argument.trim();\n if (argument.length === 0) {\n renderer.writeNotice(`log level: ${state.mode}`);\n renderer.writeNotice(\"change with: /loglevel all | stderr | none\");\n renderer.writeNotice(\"note: arcie does not currently capture subprocess logs.\");\n return;\n }\n if (!VALID_LOG_MODES.has(argument)) {\n renderer.writeError(\n \"Invalid log level\",\n `${argument} — pick one of: all, stderr, none`,\n );\n return;\n }\n state.mode = argument as \"all\" | \"stderr\" | \"none\";\n renderer.writeNotice(`log level: ${state.mode}`);\n renderer.writeNotice(\"note: arcie does not currently capture subprocess logs.\");\n}\n\nasync function streamOneTurn(\n renderer: TerminalRenderer,\n translator: EventTranslator,\n agentDir: string,\n message: string,\n): Promise<void> {\n let sawApproval = false;\n try {\n for await (const event of streamAgent(agentDir, message)) {\n const ops = translator.feed(event);\n renderer.apply(ops);\n if (\n event.type === \"tool.completed\" &&\n event.data.status === \"pending\" &&\n event.data.error?.code === \"needs_approval\"\n ) {\n sawApproval = true;\n }\n }\n if (sawApproval) {\n renderer.writeNotice(\n \"Tool call awaiting approval — approve via the Cencori sessions API to continue.\",\n );\n }\n } catch (err) {\n const detail = err instanceof Error ? err.stack : undefined;\n renderer.apply([\n {\n type: \"commit\",\n block: {\n kind: \"error\",\n title: \"Stream error\",\n body: err instanceof Error ? err.message : String(err),\n detail,\n },\n },\n ]);\n }\n}\n\n","import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport function agentSourcePath(agentDir: string): string {\n return join(agentDir, \"agent\", \"agent.ts\");\n}\n\nexport function envLocalPath(agentDir: string): string {\n return join(agentDir, \".env.local\");\n}\n\nexport function readAgentModel(agentDir: string): string | undefined {\n const path = agentSourcePath(agentDir);\n if (!existsSync(path)) return undefined;\n try {\n const content = readFileSync(path, \"utf-8\");\n return content.match(/model:\\s*\"([^\"]+)\"/)?.[1];\n } catch {\n return undefined;\n }\n}\n\nexport function writeAgentModel(agentDir: string, model: string): boolean {\n const path = agentSourcePath(agentDir);\n if (!existsSync(path)) return false;\n const content = readFileSync(path, \"utf-8\");\n const updated = content.replace(/model:\\s*\"[^\"]+\"/, `model: \"${model}\"`);\n if (updated === content) return false;\n writeFileSync(path, updated);\n return true;\n}\n\nexport const PROVIDER_KEYS = [\n \"CENCORI_API_KEY\",\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"GROQ_API_KEY\",\n \"DEEPSEEK_API_KEY\",\n \"MISTRAL_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"TOGETHER_API_KEY\",\n] as const;\n\nexport type ProviderKey = (typeof PROVIDER_KEYS)[number];\n\nexport interface ProviderKeyStatus {\n readonly key: string;\n readonly set: boolean;\n readonly source?: \"env\" | \"file\";\n readonly masked?: string;\n}\n\nexport function providerKeyStatus(agentDir: string): ProviderKeyStatus[] {\n const fileValues = readEnvLocal(agentDir);\n return PROVIDER_KEYS.map((key) => {\n const envValue = process.env[key];\n if (envValue && envValue.length > 0) {\n return { key, set: true, source: \"env\" as const, masked: maskSecret(envValue) };\n }\n const fileValue = fileValues[key];\n if (fileValue && fileValue.length > 0) {\n return { key, set: true, source: \"file\" as const, masked: maskSecret(fileValue) };\n }\n return { key, set: false };\n });\n}\n\nexport function readEnvLocal(agentDir: string): Record<string, string> {\n const envPath = envLocalPath(agentDir);\n if (!existsSync(envPath)) return {};\n const values: Record<string, string> = {};\n for (const line of readFileSync(envPath, \"utf-8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"#\") || !trimmed.includes(\"=\")) continue;\n const eq = trimmed.indexOf(\"=\");\n const key = trimmed.slice(0, eq).trim();\n const value = trimmed.slice(eq + 1).trim();\n if (key && value) values[key] = value;\n }\n return values;\n}\n\n/**\n * Writes `key=value` to `.env.local`, replacing an existing declaration\n * (commented or not) or appending a new line. Returns true if the file was\n * changed.\n */\nexport function upsertEnvLocal(agentDir: string, key: string, value: string): boolean {\n const envPath = envLocalPath(agentDir);\n if (!existsSync(envPath)) {\n writeFileSync(envPath, `${key}=${value}\\n`);\n return true;\n }\n const content = readFileSync(envPath, \"utf-8\");\n const lines = content.split(\"\\n\");\n let replaced = false;\n const updated = lines.map((line) => {\n const trimmed = line.trim();\n if (trimmed.startsWith(`# ${key}=`) || trimmed.startsWith(`${key}=`)) {\n replaced = true;\n return `${key}=${value}`;\n }\n return line;\n });\n if (!replaced) updated.push(`${key}=${value}`);\n const next = updated.join(\"\\n\") + (updated.at(-1) === \"\" ? \"\" : \"\\n\");\n if (next === content) return false;\n writeFileSync(envPath, next);\n return true;\n}\n\nexport interface ChannelSummary {\n readonly name: string;\n readonly path: string;\n}\n\nexport function listChannels(agentDir: string): ChannelSummary[] {\n const channelsDir = join(agentDir, \"channels\");\n if (!existsSync(channelsDir)) return [];\n try {\n return readdirSync(channelsDir)\n .filter((entry) => {\n const full = join(channelsDir, entry);\n return statSync(full).isDirectory();\n })\n .map((name) => ({ name, path: join(channelsDir, name) }));\n } catch {\n return [];\n }\n}\n\nfunction maskSecret(value: string): string {\n if (value.length <= 8) return \"•\".repeat(value.length);\n return `${value.slice(0, 4)}${\"•\".repeat(6)}${value.slice(-4)}`;\n}\n","export type PromptCommandExtensionName = \"model\" | \"provider\" | \"channels\";\n\nexport type PromptCommand =\n | { type: \"new\" }\n | { type: \"exit\" }\n | { type: \"help\" }\n | { type: \"clear\" }\n | { type: \"loglevel\"; argument: string }\n | { type: \"extension\"; name: PromptCommandExtensionName; argument: string };\n\nexport interface PromptCommandSpec {\n readonly name: string;\n readonly aliases: readonly string[];\n readonly description: string;\n readonly argumentHint?: string;\n readonly takesArgument: boolean;\n readonly build: (argument: string) => PromptCommand;\n}\n\nconst PROMPT_COMMAND_DEFINITIONS = [\n {\n name: \"help\",\n aliases: [],\n description: \"Show available commands\",\n takesArgument: false,\n build: () => ({ type: \"help\" }),\n },\n {\n name: \"new\",\n aliases: [],\n description: \"Start a fresh session\",\n takesArgument: false,\n build: () => ({ type: \"new\" }),\n },\n {\n name: \"clear\",\n aliases: [],\n description: \"Clear the screen\",\n takesArgument: false,\n build: () => ({ type: \"clear\" }),\n },\n {\n name: \"model\",\n aliases: [],\n description: \"Show or change the agent's model\",\n argumentHint: \"[provider/slug]\",\n takesArgument: true,\n build: (argument) => ({ type: \"extension\", name: \"model\", argument }),\n },\n {\n name: \"provider\",\n aliases: [],\n description: \"Show provider API key status\",\n takesArgument: false,\n build: () => ({ type: \"extension\", name: \"provider\", argument: \"\" }),\n },\n {\n name: \"channels\",\n aliases: [],\n description: \"List or add chat channels\",\n argumentHint: \"[add web]\",\n takesArgument: true,\n build: (argument) => ({ type: \"extension\", name: \"channels\", argument }),\n },\n {\n name: \"loglevel\",\n aliases: [],\n description: \"Show or hide captured stdout/stderr logs\",\n argumentHint: \"[all|stderr|none]\",\n takesArgument: true,\n build: (argument) => ({ type: \"loglevel\", argument }),\n },\n {\n name: \"exit\",\n aliases: [\"quit\"],\n description: \"Quit the TUI\",\n takesArgument: false,\n build: () => ({ type: \"exit\" }),\n },\n] satisfies readonly PromptCommandSpec[];\n\nexport const PROMPT_COMMANDS: readonly PromptCommandSpec[] = PROMPT_COMMAND_DEFINITIONS;\n\nexport function parsePromptCommand(prompt: string): PromptCommand | null {\n const trimmed = prompt.trim();\n if (!trimmed.startsWith(\"/\")) return null;\n for (const spec of PROMPT_COMMANDS) {\n for (const alias of [spec.name, ...spec.aliases]) {\n const token = `/${alias}`;\n if (trimmed === token) return spec.build(\"\");\n if (spec.takesArgument && trimmed.startsWith(`${token} `)) {\n return spec.build(trimmed.slice(token.length).trim());\n }\n }\n }\n return null;\n}\n\nexport function isPromptControlCommand(prompt: string): boolean {\n return parsePromptCommand(prompt) !== null;\n}\n\nexport function formatPromptCommandHelp(\n commands: readonly PromptCommandSpec[] = PROMPT_COMMANDS,\n): string {\n const entries = commands.map((spec) => {\n const hint = spec.argumentHint === undefined ? \"\" : ` ${spec.argumentHint}`;\n const aliases = spec.aliases.map((alias) => ` (/${alias})`).join(\"\");\n return { invocation: `/${spec.name}${hint}${aliases}`, description: spec.description };\n });\n const column = Math.max(...entries.map((entry) => entry.invocation.length)) + 2;\n return entries.map((entry) => entry.invocation.padEnd(column) + entry.description).join(\"\\n\");\n}\n\nexport function matchingCommands(\n commands: readonly PromptCommandSpec[],\n text: string,\n): readonly PromptCommandSpec[] {\n if (!text.startsWith(\"/\") || /\\s/.test(text)) return [];\n const rest = text.slice(1);\n return commands.filter((spec) =>\n [spec.name, ...spec.aliases].some((token) => token.startsWith(rest)),\n );\n}\n","import { stripTerminalControls } from \"../ui/terminal-text\";\n\nconst ELLIPSIS = \"…\";\n\nexport function summarizeToolArgs(input: unknown, maxLength = 80): string {\n if (input === undefined || input === null) return \"\";\n\n if (typeof input !== \"object\") return truncate(formatScalar(input), maxLength);\n if (Array.isArray(input)) return truncate(`[${input.length}]`, maxLength);\n\n const entries = Object.entries(input as Record<string, unknown>);\n if (entries.length === 0) return \"\";\n\n const parts: string[] = [];\n for (const [key, value] of entries) {\n parts.push(`${stripTerminalControls(key)}=${formatInlineValue(value)}`);\n }\n\n return truncate(parts.join(\" \"), maxLength);\n}\n\nexport function summarizeToolResult(output: unknown, maxLength = 80): string {\n if (output === undefined || output === null) return \"\";\n\n if (typeof output === \"string\") {\n const firstLine = output.split(\"\\n\").find((line) => line.trim().length > 0) ?? \"\";\n return truncate(firstLine.trim(), maxLength);\n }\n\n if (typeof output !== \"object\") return truncate(formatScalar(output), maxLength);\n\n if (Array.isArray(output)) {\n return truncate(`${output.length} ${output.length === 1 ? \"item\" : \"items\"}`, maxLength);\n }\n\n const record = output as Record<string, unknown>;\n for (const key of [\"result\", \"text\", \"message\", \"summary\", \"value\", \"output\"]) {\n const value = record[key];\n if (value !== undefined && typeof value !== \"object\") {\n return truncate(`${formatScalar(value)}`, maxLength);\n }\n }\n\n const keys = Object.keys(record);\n if (keys.length === 0) return \"{}\";\n\n const inline = keys\n .slice(0, 3)\n .map((key) => `${key}=${formatInlineValue(record[key])}`)\n .join(\" \");\n return truncate(keys.length > 3 ? `${inline} ${ELLIPSIS}` : inline, maxLength);\n}\n\nexport function formatValuePretty(value: unknown): string {\n if (typeof value === \"string\") return stripTerminalControls(value);\n try {\n return stripTerminalControls(JSON.stringify(value, null, 2) ?? String(value));\n } catch {\n return stripTerminalControls(String(value));\n }\n}\n\nfunction formatInlineValue(value: unknown): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n if (typeof value === \"string\") return `\"${truncate(value, 32)}\"`;\n if (typeof value === \"object\") {\n return Array.isArray(value) ? `[${value.length}]` : \"{…}\";\n }\n return formatScalar(value);\n}\n\nfunction formatScalar(value: unknown): string {\n if (typeof value === \"string\") return stripTerminalControls(value);\n return stripTerminalControls(String(value));\n}\n\nexport function truncate(text: string, maxLength: number): string {\n const collapsed = stripTerminalControls(text).replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLength) return collapsed;\n return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}${ELLIPSIS}`;\n}\n","import type { StreamEvent } from \"../../../protocol/events\";\nimport type { Block } from \"./blocks\";\nimport { summarizeToolArgs, summarizeToolResult } from \"../tool-format\";\n\nexport type BlockOp =\n | { type: \"commit\"; block: Block }\n | { type: \"start-live\"; block: Block }\n | { type: \"update-live\"; id: string; patch: Partial<Block> }\n | { type: \"end-live\"; id: string }\n | { type: \"clear-live\"; id: string };\n\nexport interface TranslatorOptions {\n /** Auto-collapse a live reasoning block when the assistant starts speaking. Default true. */\n readonly autoCollapseReasoning?: boolean;\n}\n\n/**\n * Pure(ish) fold from `StreamEvent`s to `BlockOp`s.\n *\n * Owns just enough state to correlate stream events with live blocks: the\n * currently streaming assistant / reasoning blocks per level, an in-flight\n * tool map keyed by `callId`, and a subagent depth stack. Every method takes\n * one event and returns the ops that should be applied to the renderer's\n * block store.\n */\nexport class EventTranslator {\n readonly #autoCollapseReasoning: boolean;\n #nextId = 0;\n #currentAssistantId: string | undefined;\n #currentReasoningId: string | undefined;\n #toolIds = new Map<string, string>();\n #subagentStack: string[] = [];\n\n constructor(options: TranslatorOptions = {}) {\n this.#autoCollapseReasoning = options.autoCollapseReasoning ?? true;\n }\n\n get depth(): number {\n return this.#subagentStack.length;\n }\n\n reset(): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentAssistantId !== undefined) {\n ops.push({ type: \"end-live\", id: this.#currentAssistantId });\n }\n if (this.#currentReasoningId !== undefined) {\n ops.push({ type: \"end-live\", id: this.#currentReasoningId });\n }\n for (const [, id] of this.#toolIds) ops.push({ type: \"end-live\", id });\n for (const id of this.#subagentStack) ops.push({ type: \"end-live\", id });\n this.#currentAssistantId = undefined;\n this.#currentReasoningId = undefined;\n this.#toolIds.clear();\n this.#subagentStack = [];\n return ops;\n }\n\n feed(event: StreamEvent): BlockOp[] {\n switch (event.type) {\n case \"session.started\":\n case \"session.waiting\":\n case \"session.completed\":\n case \"turn.started\":\n case \"turn.completed\":\n case \"step.started\":\n case \"step.completed\":\n return [];\n case \"message.received\":\n return this.#onUserMessage(event.data.message);\n case \"message.appended\":\n return this.#onAssistantDelta(event.data.delta);\n case \"message.completed\":\n return this.#endAssistant(event.data.text ?? undefined);\n case \"reasoning.appended\":\n return this.#onReasoningDelta(event.data.delta);\n case \"reasoning.completed\":\n return this.#endReasoning(event.data.text);\n case \"tool.started\":\n return this.#onToolStarted(event.data.name, event.data.callId, event.data.input);\n case \"tool.completed\":\n return this.#onToolCompleted(\n event.data.callId,\n event.data.status,\n event.data.output,\n event.data.error?.message,\n event.data.error?.code,\n );\n case \"subagent.called\":\n return this.#onSubagentCalled(event.data.name, event.data.callId);\n case \"subagent.completed\":\n return this.#onSubagentCompleted(event.data.callId, event.data.output);\n case \"step.failed\":\n case \"turn.failed\":\n case \"session.failed\":\n return this.#onFailure(event.data.code, event.data.message);\n }\n }\n\n #id(prefix: string): string {\n this.#nextId += 1;\n return `${prefix}-${this.#nextId}`;\n }\n\n #onUserMessage(message: string): BlockOp[] {\n const ops = this.#closeReasoningIfLive();\n ops.push({\n type: \"commit\",\n block: { kind: \"user\", body: message, depth: this.depth },\n });\n return ops;\n }\n\n #onAssistantDelta(delta: string): BlockOp[] {\n const ops = this.#closeReasoningIfLive();\n if (this.#currentAssistantId === undefined) {\n const id = this.#id(\"assistant\");\n this.#currentAssistantId = id;\n ops.push({\n type: \"start-live\",\n block: this.#assistantKind({ kind: \"assistant\", id, body: delta, live: true, depth: this.depth }),\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: withDelta(delta),\n });\n }\n return ops;\n }\n\n #endAssistant(text: string | undefined): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentAssistantId === undefined) return ops;\n if (text !== undefined && text.length > 0) {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: { body: text, live: false },\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: { live: false },\n });\n }\n ops.push({ type: \"end-live\", id: this.#currentAssistantId });\n this.#currentAssistantId = undefined;\n return ops;\n }\n\n #onReasoningDelta(delta: string): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentReasoningId === undefined) {\n const id = this.#id(\"reasoning\");\n this.#currentReasoningId = id;\n ops.push({\n type: \"start-live\",\n block: this.#assistantKind({\n kind: \"reasoning\",\n id,\n body: delta,\n live: true,\n collapsed: false,\n depth: this.depth,\n }),\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentReasoningId,\n patch: withDelta(delta),\n });\n }\n return ops;\n }\n\n #endReasoning(text: string): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentReasoningId === undefined) return ops;\n ops.push({\n type: \"update-live\",\n id: this.#currentReasoningId,\n patch: { body: text, live: false, collapsed: this.#autoCollapseReasoning },\n });\n ops.push({ type: \"end-live\", id: this.#currentReasoningId });\n this.#currentReasoningId = undefined;\n return ops;\n }\n\n #closeReasoningIfLive(): BlockOp[] {\n if (this.#currentReasoningId === undefined || !this.#autoCollapseReasoning) return [];\n const id = this.#currentReasoningId;\n this.#currentReasoningId = undefined;\n return [\n { type: \"update-live\", id, patch: { collapsed: true, live: false } },\n { type: \"end-live\", id },\n ];\n }\n\n #onToolStarted(name: string, callId: string, input: unknown): BlockOp[] {\n const id = this.#id(\"tool\");\n this.#toolIds.set(callId, id);\n const inSubagent = this.depth > 0;\n const args = summarizeToolArgs(input, 80);\n return [\n {\n type: \"start-live\",\n block: {\n kind: inSubagent ? \"subagent-tool\" : \"tool\",\n id,\n title: name,\n subtitle: args,\n toolInput: input,\n status: \"running\",\n live: true,\n depth: this.depth,\n },\n },\n ];\n }\n\n #onToolCompleted(\n callId: string,\n status: string,\n output: unknown,\n errorMessage: string | undefined,\n errorCode: string | undefined,\n ): BlockOp[] {\n const id = this.#toolIds.get(callId);\n if (id === undefined) return [];\n const isApproval = status === \"pending\" && errorCode === \"needs_approval\";\n if (isApproval) {\n // Approval state stays live: the tool call has not resolved, and the\n // runner has yielded `session.waiting` to pause the stream. The block\n // sits with an `approval` glyph until the user resumes the session.\n return [\n {\n type: \"update-live\",\n id,\n patch: {\n status: \"approval\",\n result: errorMessage ?? \"awaiting approval\",\n },\n },\n ];\n }\n this.#toolIds.delete(callId);\n const ok = status === \"completed\";\n const patch: Partial<Block> = {\n status: ok ? \"done\" : \"error\",\n toolOutput: ok ? output : undefined,\n result: ok ? summarizeToolResult(output, 80) : errorMessage ?? \"failed\",\n live: false,\n };\n return [\n { type: \"update-live\", id, patch },\n { type: \"end-live\", id },\n ];\n }\n\n #onSubagentCalled(name: string, callId: string): BlockOp[] {\n const id = this.#id(\"subagent\");\n this.#subagentStack.push(id);\n return [\n {\n type: \"commit\",\n block: {\n kind: \"subagent\",\n id,\n title: name,\n depth: this.depth - 1,\n },\n },\n ];\n }\n\n #onSubagentCompleted(_callId: string, output: string): BlockOp[] {\n if (this.#subagentStack.length === 0) return [];\n this.#subagentStack.pop();\n if (output && output.length > 0) {\n return [\n {\n type: \"commit\",\n block: {\n kind: \"subagent-step\",\n body: output,\n depth: this.depth,\n },\n },\n ];\n }\n return [];\n }\n\n #onFailure(code: string, message: string): BlockOp[] {\n return [\n {\n type: \"commit\",\n block: {\n kind: \"error\",\n title: code,\n body: message,\n depth: this.depth,\n },\n },\n ];\n }\n\n #assistantKind<B extends Block>(block: B): B {\n return this.depth > 0 && block.kind === \"assistant\"\n ? ({ ...block, kind: \"subagent-step\" } as unknown as B)\n : block;\n }\n}\n\nconst DELTA_KEY = \"__delta\" as const;\n\nfunction withDelta(delta: string): Partial<Block> {\n return { [DELTA_KEY]: delta } as unknown as Partial<Block>;\n}\n\n/**\n * Applies a `BlockOp` to a mutable block store. The store keeps `live` blocks\n * as an insertion-ordered map (for live-region redraw) and `committed` blocks\n * as an append-only array (for scrollback). `commit` from the store is\n * whatever rows should be flushed to `LiveRegion.commit`.\n */\nexport interface BlockStore {\n readonly live: ReadonlyMap<string, Block>;\n readonly justCommitted: readonly Block[];\n apply(op: BlockOp): void;\n drainCommitted(): Block[];\n}\n\nexport function createBlockStore(): BlockStore {\n const live = new Map<string, Block>();\n let justCommitted: Block[] = [];\n\n return {\n get live() {\n return live;\n },\n get justCommitted() {\n return justCommitted;\n },\n apply(op) {\n switch (op.type) {\n case \"commit\":\n justCommitted.push(op.block);\n return;\n case \"start-live\":\n if (op.block.id === undefined) return;\n live.set(op.block.id, op.block);\n return;\n case \"update-live\": {\n const existing = live.get(op.id);\n if (existing === undefined) return;\n const patch = op.patch as Partial<Block> & { [DELTA_KEY]?: string };\n const delta = patch[DELTA_KEY];\n const rest: Partial<Block> = { ...patch };\n delete (rest as { [DELTA_KEY]?: string })[DELTA_KEY];\n const merged: Block = { ...existing, ...rest };\n if (delta !== undefined) merged.body = `${existing.body ?? \"\"}${delta}`;\n live.set(op.id, merged);\n return;\n }\n case \"end-live\": {\n const existing = live.get(op.id);\n if (existing === undefined) return;\n live.delete(op.id);\n justCommitted.push({ ...existing, live: false });\n return;\n }\n case \"clear-live\":\n live.delete(op.id);\n return;\n }\n },\n drainCommitted() {\n const out = justCommitted;\n justCommitted = [];\n return out;\n },\n };\n}\n","import { visibleLength } from \"../ui/terminal-text\";\n\ntype TableAlignment = \"left\" | \"center\" | \"right\";\n\nconst ansi = {\n bold: \"\\x1b[1m\",\n boldOff: \"\\x1b[22m\",\n italic: \"\\x1b[3m\",\n italicOff: \"\\x1b[23m\",\n};\n\nconst tableSeparator = \"─\";\n\nexport function renderMarkdown(input: string): string {\n const lines = input.split(\"\\n\");\n const output: string[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const table = parseTable(lines, index);\n if (table != null) {\n output.push(...renderTable(table));\n index = table.endIndex - 1;\n continue;\n }\n output.push(renderMarkdownLine(lines[index] ?? \"\"));\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderMarkdownLine(line: string): string {\n if (line.startsWith(\"### \")) return renderInlineMarkdown(`▶ ${line.slice(4)}`);\n if (line.startsWith(\"## \")) return renderInlineMarkdown(`■ ${line.slice(3)}`);\n if (line.startsWith(\"# \")) return renderInlineMarkdown(`█ ${line.slice(2)}`);\n\n const unorderedListItem = line.match(/^(\\s*)[-+*]\\s+(.*)$/);\n if (unorderedListItem) {\n const [, indentation, text = \"\"] = unorderedListItem;\n return renderInlineMarkdown(`${indentation}•${text.length > 0 ? ` ${text}` : \"\"}`);\n }\n\n if (/^\\d+\\. /.test(line)) return renderInlineMarkdown(line.replace(/^(\\d+)\\. /, \"$1. \"));\n if (line.startsWith(\"> \")) return renderInlineMarkdown(`│ ${line.slice(2)}`);\n return renderInlineMarkdown(line);\n}\n\nfunction renderInlineMarkdown(input: string): string {\n const urls: string[] = [];\n const shielded = input.replaceAll(/https?:\\/\\/\\S+/g, (match) => {\n const token = `${urls.length}`;\n urls.push(match);\n return token;\n });\n\n const styled = shielded\n .replaceAll(/`([^`]+)`/g, \"$1\")\n .replaceAll(/\\*\\*([^*\\n]+)\\*\\*/g, `${ansi.bold}$1${ansi.boldOff}`)\n .replaceAll(/__([^_\\n]+)__/g, `${ansi.bold}$1${ansi.boldOff}`)\n .replaceAll(/\\*([^*\\n]+)\\*/g, `${ansi.italic}$1${ansi.italicOff}`)\n .replaceAll(/_([^_\\n]+)_/g, `${ansi.italic}$1${ansi.italicOff}`);\n\n return styled.replaceAll(/(\\d+)/g, (_match, index) => urls[Number(index)] ?? \"\");\n}\n\ntype ParsedTable = {\n alignments: TableAlignment[];\n endIndex: number;\n header: string[];\n rows: string[][];\n};\n\nfunction parseTable(lines: string[], startIndex: number): ParsedTable | undefined {\n const header = parseTableCells(lines[startIndex] ?? \"\");\n if (header == null || header.length < 2) return undefined;\n\n const separatorCells = parseTableCells(lines[startIndex + 1] ?? \"\");\n if (separatorCells == null || separatorCells.length !== header.length) return undefined;\n\n const alignments = parseTableAlignments(separatorCells);\n if (alignments == null) return undefined;\n\n const rows: string[][] = [];\n let endIndex = startIndex + 2;\n\n while (endIndex < lines.length) {\n const row = parseTableCells(lines[endIndex] ?? \"\");\n if (row == null) break;\n rows.push(normalizeTableRow(row, header.length));\n endIndex += 1;\n }\n\n return { alignments, endIndex, header, rows };\n}\n\nfunction parseTableCells(line: string): string[] | undefined {\n if (!line.includes(\"|\")) return undefined;\n\n let tableLine = line.trim();\n if (tableLine.startsWith(\"|\")) tableLine = tableLine.slice(1);\n if (tableLine.endsWith(\"|\") && !tableLine.endsWith(\"\\\\|\")) {\n tableLine = tableLine.slice(0, -1);\n }\n\n const cells: string[] = [];\n let cell = \"\";\n\n for (let index = 0; index < tableLine.length; index += 1) {\n const character = tableLine[index];\n const nextCharacter = tableLine[index + 1];\n\n if (character === \"\\\\\" && nextCharacter === \"|\") {\n cell += \"|\";\n index += 1;\n continue;\n }\n if (character === \"|\") {\n cells.push(cell.trim());\n cell = \"\";\n continue;\n }\n cell += character;\n }\n\n cells.push(cell.trim());\n return cells;\n}\n\nfunction parseTableAlignments(cells: string[]): TableAlignment[] | undefined {\n const alignments: TableAlignment[] = [];\n\n for (const cell of cells) {\n const match = cell.match(/^(:)?-{3,}(:)?$/);\n if (match == null) return undefined;\n\n const [, left, right] = match;\n alignments.push(left != null && right != null ? \"center\" : right != null ? \"right\" : \"left\");\n }\n\n return alignments;\n}\n\nfunction normalizeTableRow(row: string[], length: number): string[] {\n return Array.from({ length }, (_, index) => row[index] ?? \"\");\n}\n\nfunction renderTable(table: ParsedTable): string[] {\n const header = table.header.map(\n (cell) => `${ansi.bold}${renderInlineMarkdown(cell)}${ansi.boldOff}`,\n );\n const rows = table.rows.map((row) => row.map(renderInlineMarkdown));\n const tableRows = [header, ...rows];\n const widths = table.alignments.map((_, columnIndex) =>\n Math.max(3, ...tableRows.map((row) => visibleLength(row[columnIndex] ?? \"\"))),\n );\n\n return [\n formatTableRow(header, widths, table.alignments),\n widths.map((width) => tableSeparator.repeat(width)).join(\" \"),\n ...rows.map((row) => formatTableRow(row, widths, table.alignments)),\n ];\n}\n\nfunction formatTableRow(row: string[], widths: number[], alignments: TableAlignment[]): string {\n return row\n .map((cell, index) => alignTableCell(cell, widths[index] ?? 0, alignments[index] ?? \"left\"))\n .join(\" \");\n}\n\nfunction alignTableCell(cell: string, width: number, alignment: TableAlignment): string {\n const paddingWidth = Math.max(0, width - visibleLength(cell));\n\n if (alignment === \"right\") return `${\" \".repeat(paddingWidth)}${cell}`;\n\n if (alignment === \"center\") {\n const leftPadding = Math.floor(paddingWidth / 2);\n const rightPadding = paddingWidth - leftPadding;\n return `${\" \".repeat(leftPadding)}${cell}${\" \".repeat(rightPadding)}`;\n }\n\n return `${cell}${\" \".repeat(paddingWidth)}`;\n}\n","import { renderMarkdown } from \"../markdown\";\nimport type { Theme } from \"../theme\";\nimport { isPromptControlCommand } from \"../prompt-commands\";\nimport { formatValuePretty, truncate } from \"../tool-format\";\nimport { sliceVisible, visibleLength, wrapVisibleLine } from \"../../ui/terminal-text\";\n\nexport type ToolStatus = \"running\" | \"done\" | \"error\" | \"denied\" | \"approval\";\n\nexport type BlockKind =\n | \"user\"\n | \"assistant\"\n | \"reasoning\"\n | \"tool\"\n | \"error\"\n | \"notice\"\n | \"warning\"\n | \"result\"\n | \"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"]}