arcie 0.1.7 → 0.1.8

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.
@@ -44,6 +44,8 @@ declare interface AgentManifest {
44
44
  export { AgentManifest }
45
45
  export { AgentManifest as AgentManifest_alias_1 }
46
46
 
47
+ export declare function agentSourcePath(agentDir: string): string;
48
+
47
49
  export declare const ansiPattern: RegExp;
48
50
 
49
51
  export declare const ansiPrefixPattern: RegExp;
@@ -269,6 +271,11 @@ declare interface ChannelResponse {
269
271
  export { ChannelResponse }
270
272
  export { ChannelResponse as ChannelResponse_alias_1 }
271
273
 
274
+ export declare interface ChannelSummary {
275
+ readonly name: string;
276
+ readonly path: string;
277
+ }
278
+
272
279
  export declare function checkProviderKeys(agentDir: string, modelId: string): Diagnostic[];
273
280
 
274
281
  declare interface CliLiveRow {
@@ -586,6 +593,8 @@ declare function ensureContext<T>(key: string, factory: () => T): T;
586
593
  export { ensureContext }
587
594
  export { ensureContext as ensureContext_alias_1 }
588
595
 
596
+ export declare function envLocalPath(agentDir: string): string;
597
+
589
598
  /**
590
599
  * Pure(ish) fold from `StreamEvent`s to `BlockOp`s.
591
600
  *
@@ -845,6 +854,8 @@ export declare interface LineState {
845
854
  readonly cursor: number;
846
855
  }
847
856
 
857
+ export declare function listChannels(agentDir: string): ChannelSummary[];
858
+
848
859
  /**
849
860
  * Bottom-anchored redraw region.
850
861
  *
@@ -1277,11 +1288,28 @@ declare interface PromptLogicalRow {
1277
1288
  readonly start: number;
1278
1289
  }
1279
1290
 
1291
+ export declare const PROVIDER_KEYS: readonly ["CENCORI_API_KEY", "OPENAI_API_KEY", "ANTHROPIC_API_KEY", "GROQ_API_KEY", "DEEPSEEK_API_KEY", "MISTRAL_API_KEY", "GOOGLE_API_KEY", "TOGETHER_API_KEY"];
1292
+
1280
1293
  export declare function providerEnvVar(modelId: string): {
1281
1294
  provider: string;
1282
1295
  envVar: string;
1283
1296
  } | undefined;
1284
1297
 
1298
+ export declare type ProviderKey = (typeof PROVIDER_KEYS)[number];
1299
+
1300
+ export declare interface ProviderKeyStatus {
1301
+ readonly key: string;
1302
+ readonly set: boolean;
1303
+ readonly source?: "env" | "file";
1304
+ readonly masked?: string;
1305
+ }
1306
+
1307
+ export declare function providerKeyStatus(agentDir: string): ProviderKeyStatus[];
1308
+
1309
+ export declare function readAgentModel(agentDir: string): string | undefined;
1310
+
1311
+ export declare function readEnvLocal(agentDir: string): Record<string, string>;
1312
+
1285
1313
  declare interface ReasoningAppendedEvent {
1286
1314
  type: "reasoning.appended";
1287
1315
  data: {
@@ -2128,6 +2156,13 @@ declare interface TurnStartedEvent {
2128
2156
  export { TurnStartedEvent }
2129
2157
  export { TurnStartedEvent as TurnStartedEvent_alias_1 }
2130
2158
 
2159
+ /**
2160
+ * Writes `key=value` to `.env.local`, replacing an existing declaration
2161
+ * (commented or not) or appending a new line. Returns true if the file was
2162
+ * changed.
2163
+ */
2164
+ export declare function upsertEnvLocal(agentDir: string, key: string, value: string): boolean;
2165
+
2131
2166
  /**
2132
2167
  * Runs the caller-supplied `validate` against the current draft and returns
2133
2168
  * a state carrying the error message, or `undefined` when the draft is
@@ -2238,6 +2273,8 @@ export { WorkingMemoryProcessor as WorkingMemoryProcessor_alias_2 }
2238
2273
 
2239
2274
  export declare function wrapVisibleLine(line: string, width: number): string[];
2240
2275
 
2276
+ export declare function writeAgentModel(agentDir: string, model: string): boolean;
2277
+
2241
2278
  export declare function yellow(text: string): string;
2242
2279
 
2243
2280
  export { }
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-DNVKDUHX.js");
108
+ const { initCommand } = await import("../init-Q2GCMBCJ.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-A6KGOSNL.js");
143
+ const { devCommand } = await import("../dev-DCPOO54H.js");
144
144
  await devCommand({
145
145
  port: String(options.port ?? 3e3),
146
146
  agentDir: options.agentDir,
@@ -20,6 +20,9 @@ import {
20
20
  import {
21
21
  showHeader
22
22
  } from "./chunk-XOFWQUOO.js";
23
+ import {
24
+ scaffoldWebChat
25
+ } from "./chunk-SGWQZZ2A.js";
23
26
  import {
24
27
  streamAgent
25
28
  } from "./chunk-4WSILP75.js";
@@ -39,6 +42,89 @@ import { resolve } from "path";
39
42
  // src/cli/tui/renderer/start-block-chat.ts
40
43
  import { watch } from "fs";
41
44
 
45
+ // src/cli/agent-config.ts
46
+ import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from "fs";
47
+ import { join } from "path";
48
+ function agentSourcePath(agentDir) {
49
+ return join(agentDir, "agent", "agent.ts");
50
+ }
51
+ function envLocalPath(agentDir) {
52
+ return join(agentDir, ".env.local");
53
+ }
54
+ function readAgentModel(agentDir) {
55
+ const path = agentSourcePath(agentDir);
56
+ if (!existsSync(path)) return void 0;
57
+ try {
58
+ const content = readFileSync(path, "utf-8");
59
+ return content.match(/model:\s*"([^"]+)"/)?.[1];
60
+ } catch {
61
+ return void 0;
62
+ }
63
+ }
64
+ function writeAgentModel(agentDir, model) {
65
+ const path = agentSourcePath(agentDir);
66
+ if (!existsSync(path)) return false;
67
+ const content = readFileSync(path, "utf-8");
68
+ const updated = content.replace(/model:\s*"[^"]+"/, `model: "${model}"`);
69
+ if (updated === content) return false;
70
+ writeFileSync(path, updated);
71
+ return true;
72
+ }
73
+ var PROVIDER_KEYS = [
74
+ "CENCORI_API_KEY",
75
+ "OPENAI_API_KEY",
76
+ "ANTHROPIC_API_KEY",
77
+ "GROQ_API_KEY",
78
+ "DEEPSEEK_API_KEY",
79
+ "MISTRAL_API_KEY",
80
+ "GOOGLE_API_KEY",
81
+ "TOGETHER_API_KEY"
82
+ ];
83
+ function providerKeyStatus(agentDir) {
84
+ const fileValues = readEnvLocal(agentDir);
85
+ return PROVIDER_KEYS.map((key) => {
86
+ const envValue = process.env[key];
87
+ if (envValue && envValue.length > 0) {
88
+ return { key, set: true, source: "env", masked: maskSecret(envValue) };
89
+ }
90
+ const fileValue = fileValues[key];
91
+ if (fileValue && fileValue.length > 0) {
92
+ return { key, set: true, source: "file", masked: maskSecret(fileValue) };
93
+ }
94
+ return { key, set: false };
95
+ });
96
+ }
97
+ function readEnvLocal(agentDir) {
98
+ const envPath = envLocalPath(agentDir);
99
+ if (!existsSync(envPath)) return {};
100
+ const values = {};
101
+ for (const line of readFileSync(envPath, "utf-8").split("\n")) {
102
+ const trimmed = line.trim();
103
+ if (trimmed.startsWith("#") || !trimmed.includes("=")) continue;
104
+ const eq = trimmed.indexOf("=");
105
+ const key = trimmed.slice(0, eq).trim();
106
+ const value = trimmed.slice(eq + 1).trim();
107
+ if (key && value) values[key] = value;
108
+ }
109
+ return values;
110
+ }
111
+ function listChannels(agentDir) {
112
+ const channelsDir = join(agentDir, "channels");
113
+ if (!existsSync(channelsDir)) return [];
114
+ try {
115
+ return readdirSync(channelsDir).filter((entry) => {
116
+ const full = join(channelsDir, entry);
117
+ return statSync(full).isDirectory();
118
+ }).map((name) => ({ name, path: join(channelsDir, name) }));
119
+ } catch {
120
+ return [];
121
+ }
122
+ }
123
+ function maskSecret(value) {
124
+ if (value.length <= 8) return "\u2022".repeat(value.length);
125
+ return `${value.slice(0, 4)}${"\u2022".repeat(6)}${value.slice(-4)}`;
126
+ }
127
+
42
128
  // src/cli/tui/prompt-commands.ts
43
129
  var PROMPT_COMMAND_DEFINITIONS = [
44
130
  {
@@ -65,24 +151,25 @@ var PROMPT_COMMAND_DEFINITIONS = [
65
151
  {
66
152
  name: "model",
67
153
  aliases: [],
68
- description: "Configure the agent's model and provider",
69
- argumentHint: "[provider/model]",
154
+ description: "Show or change the agent's model",
155
+ argumentHint: "[provider/slug]",
70
156
  takesArgument: true,
71
157
  build: (argument) => ({ type: "extension", name: "model", argument })
72
158
  },
73
159
  {
74
160
  name: "provider",
75
161
  aliases: [],
76
- description: "Configure provider API keys",
162
+ description: "Show provider API key status",
77
163
  takesArgument: false,
78
164
  build: () => ({ type: "extension", name: "provider", argument: "" })
79
165
  },
80
166
  {
81
167
  name: "channels",
82
168
  aliases: [],
83
- description: "Add chat channels to the agent",
84
- takesArgument: false,
85
- build: () => ({ type: "extension", name: "channels", argument: "" })
169
+ description: "List or add chat channels",
170
+ argumentHint: "[add web]",
171
+ takesArgument: true,
172
+ build: (argument) => ({ type: "extension", name: "channels", argument })
86
173
  },
87
174
  {
88
175
  name: "loglevel",
@@ -1097,6 +1184,7 @@ var TerminalRenderer = class {
1097
1184
  };
1098
1185
 
1099
1186
  // src/cli/tui/renderer/start-block-chat.ts
1187
+ var VALID_LOG_MODES = /* @__PURE__ */ new Set(["all", "stderr", "none"]);
1100
1188
  async function startBlockChat(options) {
1101
1189
  const { agentDir } = options;
1102
1190
  const renderer = new TerminalRenderer();
@@ -1131,6 +1219,7 @@ async function startBlockChat(options) {
1131
1219
  } catch {
1132
1220
  }
1133
1221
  const detachKeys = attachKeyStream((key) => renderer.handleKey(key));
1222
+ const logLevelState = { mode: "none" };
1134
1223
  try {
1135
1224
  if (options.initialInput !== void 0 && options.initialInput.length > 0) {
1136
1225
  await streamOneTurn(renderer, translator, agentDir, options.initialInput);
@@ -1160,10 +1249,10 @@ async function startBlockChat(options) {
1160
1249
  await commitHeader();
1161
1250
  continue;
1162
1251
  case "extension":
1163
- renderer.writeNotice(`/${command.name} not yet implemented`);
1252
+ await handleExtension(command, renderer, agentDir, commitHeader);
1164
1253
  continue;
1165
1254
  case "loglevel":
1166
- renderer.writeNotice("logs not yet implemented");
1255
+ handleLogLevel(command, renderer, logLevelState);
1167
1256
  continue;
1168
1257
  }
1169
1258
  continue;
@@ -1176,6 +1265,121 @@ async function startBlockChat(options) {
1176
1265
  renderer.stop();
1177
1266
  }
1178
1267
  }
1268
+ async function handleExtension(command, renderer, agentDir, commitHeader) {
1269
+ const argument = command.argument.trim();
1270
+ switch (command.name) {
1271
+ case "model":
1272
+ await handleModel(argument, renderer, agentDir, commitHeader);
1273
+ return;
1274
+ case "provider":
1275
+ handleProvider(renderer, agentDir);
1276
+ return;
1277
+ case "channels":
1278
+ handleChannels(argument, renderer, agentDir);
1279
+ return;
1280
+ default:
1281
+ renderer.writeNotice(`/${command.name} is not supported here`);
1282
+ }
1283
+ }
1284
+ async function handleModel(argument, renderer, agentDir, commitHeader) {
1285
+ const current = readAgentModel(agentDir);
1286
+ 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;
1292
+ }
1293
+ if (current === argument) {
1294
+ renderer.writeNotice(`model is already ${argument}`);
1295
+ return;
1296
+ }
1297
+ const changed = writeAgentModel(agentDir, argument);
1298
+ 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;
1304
+ }
1305
+ renderer.writeNotice(`model set to ${argument}`);
1306
+ await commitHeader();
1307
+ }
1308
+ function handleProvider(renderer, agentDir) {
1309
+ const status = providerKeyStatus(agentDir);
1310
+ const configured = status.filter((row) => row.set);
1311
+ 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;
1315
+ }
1316
+ renderer.writeNotice("provider keys:");
1317
+ for (const row of status) {
1318
+ if (row.set) {
1319
+ renderer.writeNotice(` ${row.key} = ${row.masked} (${row.source})`);
1320
+ } else {
1321
+ renderer.writeNotice(` ${row.key} \u2014 not set`);
1322
+ }
1323
+ }
1324
+ }
1325
+ function handleChannels(argument, renderer, agentDir) {
1326
+ if (argument.length === 0) {
1327
+ const channels = listChannels(agentDir);
1328
+ if (channels.length === 0) {
1329
+ renderer.writeNotice("no channels scaffolded");
1330
+ renderer.writeNotice("add one with: /channels add web");
1331
+ return;
1332
+ }
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;
1337
+ }
1338
+ const parts = argument.split(/\s+/);
1339
+ const subcommand = parts[0];
1340
+ const kind = parts[1];
1341
+ if (subcommand !== "add") {
1342
+ renderer.writeError("Unknown /channels subcommand", `try: /channels add web`);
1343
+ return;
1344
+ }
1345
+ if (kind !== "web") {
1346
+ renderer.writeError("Unsupported channel kind", `${kind ?? "(none)"} \u2014 only 'web' is supported`);
1347
+ return;
1348
+ }
1349
+ try {
1350
+ const result = scaffoldWebChat(agentDir);
1351
+ if (result.alreadyExisted) {
1352
+ renderer.writeNotice(`channels/web already exists \u2014 left it untouched`);
1353
+ return;
1354
+ }
1355
+ renderer.writeNotice(`scaffolded ${result.targetPath}`);
1356
+ renderer.writeNotice("next: cd into it, npm install, npm run dev");
1357
+ } catch (err) {
1358
+ renderer.writeError(
1359
+ "Channel scaffold failed",
1360
+ err instanceof Error ? err.message : String(err)
1361
+ );
1362
+ }
1363
+ }
1364
+ function handleLogLevel(command, renderer, state) {
1365
+ const argument = command.argument.trim();
1366
+ 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;
1371
+ }
1372
+ 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;
1378
+ }
1379
+ state.mode = argument;
1380
+ renderer.writeNotice(`log level: ${state.mode}`);
1381
+ renderer.writeNotice("note: arcie does not currently capture subprocess logs.");
1382
+ }
1179
1383
  async function streamOneTurn(renderer, translator, agentDir, message) {
1180
1384
  let sawApproval = false;
1181
1385
  try {
@@ -1988,4 +2192,4 @@ async function devCommand(options) {
1988
2192
  export {
1989
2193
  devCommand
1990
2194
  };
1991
- //# sourceMappingURL=dev-A6KGOSNL.js.map
2195
+ //# sourceMappingURL=dev-DCPOO54H.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.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"]}
@@ -1,9 +1,6 @@
1
1
  import {
2
2
  renderCliTaggedLine
3
3
  } from "./chunk-HVBDOHTL.js";
4
- import {
5
- scaffoldWebChat
6
- } from "./chunk-SGWQZZ2A.js";
7
4
  import {
8
5
  EMPTY_LINE,
9
6
  LiveRegion,
@@ -19,6 +16,9 @@ import {
19
16
  visibleLine
20
17
  } from "./chunk-HWD2Z2CH.js";
21
18
  import "./chunk-N5R3TEEZ.js";
19
+ import {
20
+ scaffoldWebChat
21
+ } from "./chunk-SGWQZZ2A.js";
22
22
 
23
23
  // src/cli/init.ts
24
24
  import {
@@ -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-A6KGOSNL.js");
802
+ const { devCommand } = await import("./dev-DCPOO54H.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-A6KGOSNL.js");
808
+ const { devCommand } = await import("./dev-DCPOO54H.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-DNVKDUHX.js.map
822
+ //# sourceMappingURL=init-Q2GCMBCJ.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "arcie",
3
3
  "type": "module",
4
- "version": "0.1.7",
4
+ "version": "0.1.8",
5
5
  "description": "The electronic line — build agents at the speed of light.",
6
6
  "bin": {
7
7
  "arcie": "dist/cli/index.js"
@@ -28,6 +28,7 @@
28
28
  "./auth": "./dist/auth/index.js",
29
29
  "./discover": "./dist/discover/index.js",
30
30
  "./protocol": "./dist/protocol/events.js"
31
+
31
32
  },
32
33
  "typesVersions": {
33
34
  "*": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/dev.ts","../src/cli/tui/renderer/start-block-chat.ts","../src/cli/tui/prompt-commands.ts","../src/cli/tui/tool-format.ts","../src/cli/tui/renderer/event-to-blocks.ts","../src/cli/tui/markdown.ts","../src/cli/tui/renderer/blocks.ts","../src/cli/tui/renderer/terminal-renderer.ts","../src/server/llm.ts","../src/server/index.ts"],"sourcesContent":["import { createServer } from \"node:http\";\nimport { resolve } from \"node:path\";\nimport { loadAgent } from \"../loader\";\nimport { discoverAgent } from \"../discover/index\";\nimport { streamAgent } from \"../runner/index\";\nimport { showHeader } from \"./banner\";\nimport { grey, dimmed } from \"./style\";\nimport { startBlockChat } from \"./tui/renderer/start-block-chat\";\nimport { handleSessionsRequest, getProviderApiKey } from \"../server/index\";\n\nexport interface DevOptions {\n port: string;\n agentDir: string;\n input?: boolean;\n}\n\nfunction checkProviderKeys(modelId: string): string[] {\n const provider = modelId.split(\"/\")[0];\n const missing: string[] = [];\n\n const keyMap: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n groq: \"GROQ_API_KEY\",\n deepseek: \"DEEPSEEK_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n meta: \"TOGETHER_API_KEY\",\n };\n\n const envVar = keyMap[provider];\n if (envVar && !process.env[envVar] && !getProviderApiKey(provider)) {\n missing.push(envVar);\n }\n\n return missing;\n}\n\nconst MAX_PORT_ATTEMPTS = 10;\n\nfunction tryListen(server: ReturnType<typeof createServer>, port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const onError = (err: NodeJS.ErrnoException) => {\n server.removeListener(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.removeListener(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(port);\n });\n}\n\n/**\n * Binds `server` to the first free port starting at `startPort`, walking\n * forward one port at a time until it finds one or exhausts the attempt\n * budget. Returns the bound port. Non-EADDRINUSE errors bubble up.\n */\nasync function listenWithFallback(\n server: ReturnType<typeof createServer>,\n startPort: number,\n): Promise<number> {\n for (let offset = 0; offset < MAX_PORT_ATTEMPTS; offset += 1) {\n const port = startPort + offset;\n try {\n await tryListen(server, port);\n return port;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"EADDRINUSE\") throw err;\n }\n }\n throw new Error(\n `Could not find a free port in ${startPort}..${startPort + MAX_PORT_ATTEMPTS - 1}`,\n );\n}\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n const agentDirPath = resolve(process.cwd(), options.agentDir);\n const requestedPort = parseInt(options.port, 10);\n\n const server = createServer(async (req, res) => {\n if (await handleSessionsRequest(req, res)) {\n return;\n }\n\n if (req.method === \"POST\" && req.url === \"/\") {\n let body = \"\";\n for await (const chunk of req) body += chunk;\n\n try {\n const { message, stream } = JSON.parse(body);\n\n if (stream) {\n res.writeHead(200, {\n \"Content-Type\": \"application/x-ndjson\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n for await (const event of streamAgent(agentDirPath, message)) {\n res.write(JSON.stringify(event) + \"\\n\");\n }\n res.end();\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n for await (const _event of streamAgent(agentDirPath, message)) {}\n res.end(JSON.stringify({ status: \"ok\" }));\n }\n } catch (err) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: String(err) }));\n }\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n });\n\n let boundPort: number;\n try {\n boundPort = await listenWithFallback(server, requestedPort);\n } catch (err) {\n console.error();\n console.error(` ${grey(\"✗\")} ${err instanceof Error ? err.message : String(err)}`);\n console.error(` ${dimmed(\"try: arcie dev --port <n> # pick your own starting port\")}`);\n console.error();\n process.exit(1);\n }\n\n const localApiUrl = `http://127.0.0.1:${boundPort}/v1`;\n if (!process.env.CENCORI_API_KEY) process.env.CENCORI_API_KEY = \"local-dev-key\";\n if (!process.env.CENCORI_API_URL) process.env.CENCORI_API_URL = localApiUrl;\n\n if (!options.input) {\n showHeader();\n\n const { diagnostics } = discoverAgent(agentDirPath);\n\n if (diagnostics.some((d) => d.severity === \"error\")) {\n for (const d of diagnostics) {\n console.error(` ${grey(\"✖\")} ${d.code}: ${d.message}`);\n }\n process.exit(1);\n }\n\n for (const d of diagnostics) {\n console.warn(` ${grey(\"⚠\")} ${d.code}: ${d.message}`);\n }\n\n try {\n const agent = await loadAgent(agentDirPath);\n console.log(` ${agentDirPath} ${grey(\"\\xB7\")} ${grey(agent.manifest.config.model)}`);\n console.log();\n if (boundPort !== requestedPort) {\n console.log(\n ` ${grey(\"!\")} port ${requestedPort} was in use ${grey(\"\\xB7\")} using ${boundPort}`,\n );\n console.log();\n }\n console.log(` ${dimmed(`http://localhost:${boundPort}`)}`);\n console.log();\n console.log(` ${dimmed(`$ curl -X POST http://localhost:${boundPort} \\\\`)}`);\n console.log(` ${dimmed(` -H \"Content-Type: application/json\" \\\\`)}`);\n console.log(` ${dimmed(` -d '{\"message\": \"hello\"}'`)}`);\n console.log();\n\n const missing = checkProviderKeys(agent.manifest.config.model);\n if (missing.length > 0) {\n console.log(` ${grey(\"⚠\")} Missing API keys: ${missing.join(\", \")}`);\n console.log(` ${dimmed(\" Set them in .env.local or your environment\")}`);\n console.log();\n }\n } catch {\n console.log(` ${agentDirPath}`);\n console.log();\n console.log(` ${dimmed(`http://localhost:${boundPort}`)}`);\n console.log();\n }\n }\n\n if (options.input) {\n void startBlockChat({ agentDir: agentDirPath });\n }\n}\n","import { watch, type FSWatcher } from \"node:fs\";\nimport { streamAgent } from \"../../../runner/index\";\nimport { loadAgent } from \"../../../loader\";\nimport { discoverAgent } from \"../../../discover/index\";\nimport { parsePromptCommand, formatPromptCommandHelp } from \"../prompt-commands\";\nimport { attachKeyStream } from \"../attach-keys\";\nimport { EventTranslator } from \"./event-to-blocks\";\nimport { TerminalRenderer } from \"./terminal-renderer\";\n\nexport interface StartBlockChatOptions {\n readonly agentDir: string;\n readonly initialInput?: string;\n}\n\n/**\n * Runs the block-based dev TUI against a local agent directory. Returns when\n * the user submits `/exit` or presses Ctrl+C. Ownership of raw stdin is\n * scoped to this function; the caller does not need to restore terminal\n * state on exit paths.\n */\nexport async function startBlockChat(options: StartBlockChatOptions): Promise<void> {\n const { agentDir } = options;\n const renderer = new TerminalRenderer();\n const translator = new EventTranslator();\n\n const commitHeader = async () => {\n try {\n const agent = await loadAgent(agentDir);\n const model = agent.manifest.config.model;\n renderer.writeAgentHeader(`arcie · ${agentDir.split(\"/\").pop() ?? \"agent\"} · ${model}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n renderer.writeError(\"Agent load failed\", message);\n }\n };\n\n const { diagnostics } = discoverAgent(agentDir);\n const errorDiags = diagnostics.filter((d) => d.severity === \"error\");\n if (errorDiags.length > 0) {\n for (const d of errorDiags) renderer.writeError(d.code, d.message);\n renderer.stop();\n return;\n }\n\n await commitHeader();\n\n let watcher: FSWatcher | undefined;\n try {\n let reprobeTimer: ReturnType<typeof setTimeout> | undefined;\n watcher = watch(agentDir, { recursive: true }, () => {\n if (reprobeTimer !== undefined) clearTimeout(reprobeTimer);\n reprobeTimer = setTimeout(() => {\n void commitHeader();\n }, 250);\n });\n } catch {\n // A missing fs.watch (e.g. some sandboxes) is not fatal.\n }\n\n const detachKeys = attachKeyStream((key) => renderer.handleKey(key));\n\n try {\n if (options.initialInput !== undefined && options.initialInput.length > 0) {\n await streamOneTurn(renderer, translator, agentDir, options.initialInput);\n }\n\n while (true) {\n const text = await renderer.readPrompt();\n if (text === undefined) return;\n const trimmed = text.trim();\n if (trimmed.length === 0) continue;\n\n if (trimmed.startsWith(\"/\")) {\n const command = parsePromptCommand(trimmed);\n if (command === null) {\n renderer.writeError(\"Unknown command\", `${trimmed} — try /help`);\n continue;\n }\n switch (command.type) {\n case \"exit\":\n return;\n case \"help\":\n for (const line of formatPromptCommandHelp().split(\"\\n\")) {\n renderer.writeNotice(line);\n }\n continue;\n case \"clear\":\n case \"new\":\n for (const op of translator.reset()) renderer.apply([op]);\n await commitHeader();\n continue;\n case \"extension\":\n renderer.writeNotice(`/${command.name} not yet implemented`);\n continue;\n case \"loglevel\":\n renderer.writeNotice(\"logs not yet implemented\");\n continue;\n }\n continue;\n }\n\n await streamOneTurn(renderer, translator, agentDir, trimmed);\n }\n } finally {\n detachKeys();\n watcher?.close();\n renderer.stop();\n }\n}\n\nasync function streamOneTurn(\n renderer: TerminalRenderer,\n translator: EventTranslator,\n agentDir: string,\n message: string,\n): Promise<void> {\n let sawApproval = false;\n try {\n for await (const event of streamAgent(agentDir, message)) {\n const ops = translator.feed(event);\n renderer.apply(ops);\n if (\n event.type === \"tool.completed\" &&\n event.data.status === \"pending\" &&\n event.data.error?.code === \"needs_approval\"\n ) {\n sawApproval = true;\n }\n }\n if (sawApproval) {\n renderer.writeNotice(\n \"Tool call awaiting approval — approve via the Cencori sessions API to continue.\",\n );\n }\n } catch (err) {\n const detail = err instanceof Error ? err.stack : undefined;\n renderer.apply([\n {\n type: \"commit\",\n block: {\n kind: \"error\",\n title: \"Stream error\",\n body: err instanceof Error ? err.message : String(err),\n detail,\n },\n },\n ]);\n }\n}\n\n","export type PromptCommandExtensionName = \"model\" | \"provider\" | \"channels\";\n\nexport type PromptCommand =\n | { type: \"new\" }\n | { type: \"exit\" }\n | { type: \"help\" }\n | { type: \"clear\" }\n | { type: \"loglevel\"; argument: string }\n | { type: \"extension\"; name: PromptCommandExtensionName; argument: string };\n\nexport interface PromptCommandSpec {\n readonly name: string;\n readonly aliases: readonly string[];\n readonly description: string;\n readonly argumentHint?: string;\n readonly takesArgument: boolean;\n readonly build: (argument: string) => PromptCommand;\n}\n\nconst PROMPT_COMMAND_DEFINITIONS = [\n {\n name: \"help\",\n aliases: [],\n description: \"Show available commands\",\n takesArgument: false,\n build: () => ({ type: \"help\" }),\n },\n {\n name: \"new\",\n aliases: [],\n description: \"Start a fresh session\",\n takesArgument: false,\n build: () => ({ type: \"new\" }),\n },\n {\n name: \"clear\",\n aliases: [],\n description: \"Clear the screen\",\n takesArgument: false,\n build: () => ({ type: \"clear\" }),\n },\n {\n name: \"model\",\n aliases: [],\n description: \"Configure the agent's model and provider\",\n argumentHint: \"[provider/model]\",\n takesArgument: true,\n build: (argument) => ({ type: \"extension\", name: \"model\", argument }),\n },\n {\n name: \"provider\",\n aliases: [],\n description: \"Configure provider API keys\",\n takesArgument: false,\n build: () => ({ type: \"extension\", name: \"provider\", argument: \"\" }),\n },\n {\n name: \"channels\",\n aliases: [],\n description: \"Add chat channels to the agent\",\n takesArgument: false,\n build: () => ({ type: \"extension\", name: \"channels\", argument: \"\" }),\n },\n {\n name: \"loglevel\",\n aliases: [],\n description: \"Show or hide captured stdout/stderr logs\",\n argumentHint: \"[all|stderr|none]\",\n takesArgument: true,\n build: (argument) => ({ type: \"loglevel\", argument }),\n },\n {\n name: \"exit\",\n aliases: [\"quit\"],\n description: \"Quit the TUI\",\n takesArgument: false,\n build: () => ({ type: \"exit\" }),\n },\n] satisfies readonly PromptCommandSpec[];\n\nexport const PROMPT_COMMANDS: readonly PromptCommandSpec[] = PROMPT_COMMAND_DEFINITIONS;\n\nexport function parsePromptCommand(prompt: string): PromptCommand | null {\n const trimmed = prompt.trim();\n if (!trimmed.startsWith(\"/\")) return null;\n for (const spec of PROMPT_COMMANDS) {\n for (const alias of [spec.name, ...spec.aliases]) {\n const token = `/${alias}`;\n if (trimmed === token) return spec.build(\"\");\n if (spec.takesArgument && trimmed.startsWith(`${token} `)) {\n return spec.build(trimmed.slice(token.length).trim());\n }\n }\n }\n return null;\n}\n\nexport function isPromptControlCommand(prompt: string): boolean {\n return parsePromptCommand(prompt) !== null;\n}\n\nexport function formatPromptCommandHelp(\n commands: readonly PromptCommandSpec[] = PROMPT_COMMANDS,\n): string {\n const entries = commands.map((spec) => {\n const hint = spec.argumentHint === undefined ? \"\" : ` ${spec.argumentHint}`;\n const aliases = spec.aliases.map((alias) => ` (/${alias})`).join(\"\");\n return { invocation: `/${spec.name}${hint}${aliases}`, description: spec.description };\n });\n const column = Math.max(...entries.map((entry) => entry.invocation.length)) + 2;\n return entries.map((entry) => entry.invocation.padEnd(column) + entry.description).join(\"\\n\");\n}\n\nexport function matchingCommands(\n commands: readonly PromptCommandSpec[],\n text: string,\n): readonly PromptCommandSpec[] {\n if (!text.startsWith(\"/\") || /\\s/.test(text)) return [];\n const rest = text.slice(1);\n return commands.filter((spec) =>\n [spec.name, ...spec.aliases].some((token) => token.startsWith(rest)),\n );\n}\n","import { stripTerminalControls } from \"../ui/terminal-text\";\n\nconst ELLIPSIS = \"…\";\n\nexport function summarizeToolArgs(input: unknown, maxLength = 80): string {\n if (input === undefined || input === null) return \"\";\n\n if (typeof input !== \"object\") return truncate(formatScalar(input), maxLength);\n if (Array.isArray(input)) return truncate(`[${input.length}]`, maxLength);\n\n const entries = Object.entries(input as Record<string, unknown>);\n if (entries.length === 0) return \"\";\n\n const parts: string[] = [];\n for (const [key, value] of entries) {\n parts.push(`${stripTerminalControls(key)}=${formatInlineValue(value)}`);\n }\n\n return truncate(parts.join(\" \"), maxLength);\n}\n\nexport function summarizeToolResult(output: unknown, maxLength = 80): string {\n if (output === undefined || output === null) return \"\";\n\n if (typeof output === \"string\") {\n const firstLine = output.split(\"\\n\").find((line) => line.trim().length > 0) ?? \"\";\n return truncate(firstLine.trim(), maxLength);\n }\n\n if (typeof output !== \"object\") return truncate(formatScalar(output), maxLength);\n\n if (Array.isArray(output)) {\n return truncate(`${output.length} ${output.length === 1 ? \"item\" : \"items\"}`, maxLength);\n }\n\n const record = output as Record<string, unknown>;\n for (const key of [\"result\", \"text\", \"message\", \"summary\", \"value\", \"output\"]) {\n const value = record[key];\n if (value !== undefined && typeof value !== \"object\") {\n return truncate(`${formatScalar(value)}`, maxLength);\n }\n }\n\n const keys = Object.keys(record);\n if (keys.length === 0) return \"{}\";\n\n const inline = keys\n .slice(0, 3)\n .map((key) => `${key}=${formatInlineValue(record[key])}`)\n .join(\" \");\n return truncate(keys.length > 3 ? `${inline} ${ELLIPSIS}` : inline, maxLength);\n}\n\nexport function formatValuePretty(value: unknown): string {\n if (typeof value === \"string\") return stripTerminalControls(value);\n try {\n return stripTerminalControls(JSON.stringify(value, null, 2) ?? String(value));\n } catch {\n return stripTerminalControls(String(value));\n }\n}\n\nfunction formatInlineValue(value: unknown): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n if (typeof value === \"string\") return `\"${truncate(value, 32)}\"`;\n if (typeof value === \"object\") {\n return Array.isArray(value) ? `[${value.length}]` : \"{…}\";\n }\n return formatScalar(value);\n}\n\nfunction formatScalar(value: unknown): string {\n if (typeof value === \"string\") return stripTerminalControls(value);\n return stripTerminalControls(String(value));\n}\n\nexport function truncate(text: string, maxLength: number): string {\n const collapsed = stripTerminalControls(text).replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLength) return collapsed;\n return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}${ELLIPSIS}`;\n}\n","import type { StreamEvent } from \"../../../protocol/events\";\nimport type { Block } from \"./blocks\";\nimport { summarizeToolArgs, summarizeToolResult } from \"../tool-format\";\n\nexport type BlockOp =\n | { type: \"commit\"; block: Block }\n | { type: \"start-live\"; block: Block }\n | { type: \"update-live\"; id: string; patch: Partial<Block> }\n | { type: \"end-live\"; id: string }\n | { type: \"clear-live\"; id: string };\n\nexport interface TranslatorOptions {\n /** Auto-collapse a live reasoning block when the assistant starts speaking. Default true. */\n readonly autoCollapseReasoning?: boolean;\n}\n\n/**\n * Pure(ish) fold from `StreamEvent`s to `BlockOp`s.\n *\n * Owns just enough state to correlate stream events with live blocks: the\n * currently streaming assistant / reasoning blocks per level, an in-flight\n * tool map keyed by `callId`, and a subagent depth stack. Every method takes\n * one event and returns the ops that should be applied to the renderer's\n * block store.\n */\nexport class EventTranslator {\n readonly #autoCollapseReasoning: boolean;\n #nextId = 0;\n #currentAssistantId: string | undefined;\n #currentReasoningId: string | undefined;\n #toolIds = new Map<string, string>();\n #subagentStack: string[] = [];\n\n constructor(options: TranslatorOptions = {}) {\n this.#autoCollapseReasoning = options.autoCollapseReasoning ?? true;\n }\n\n get depth(): number {\n return this.#subagentStack.length;\n }\n\n reset(): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentAssistantId !== undefined) {\n ops.push({ type: \"end-live\", id: this.#currentAssistantId });\n }\n if (this.#currentReasoningId !== undefined) {\n ops.push({ type: \"end-live\", id: this.#currentReasoningId });\n }\n for (const [, id] of this.#toolIds) ops.push({ type: \"end-live\", id });\n for (const id of this.#subagentStack) ops.push({ type: \"end-live\", id });\n this.#currentAssistantId = undefined;\n this.#currentReasoningId = undefined;\n this.#toolIds.clear();\n this.#subagentStack = [];\n return ops;\n }\n\n feed(event: StreamEvent): BlockOp[] {\n switch (event.type) {\n case \"session.started\":\n case \"session.waiting\":\n case \"session.completed\":\n case \"turn.started\":\n case \"turn.completed\":\n case \"step.started\":\n case \"step.completed\":\n return [];\n case \"message.received\":\n return this.#onUserMessage(event.data.message);\n case \"message.appended\":\n return this.#onAssistantDelta(event.data.delta);\n case \"message.completed\":\n return this.#endAssistant(event.data.text ?? undefined);\n case \"reasoning.appended\":\n return this.#onReasoningDelta(event.data.delta);\n case \"reasoning.completed\":\n return this.#endReasoning(event.data.text);\n case \"tool.started\":\n return this.#onToolStarted(event.data.name, event.data.callId, event.data.input);\n case \"tool.completed\":\n return this.#onToolCompleted(\n event.data.callId,\n event.data.status,\n event.data.output,\n event.data.error?.message,\n event.data.error?.code,\n );\n case \"subagent.called\":\n return this.#onSubagentCalled(event.data.name, event.data.callId);\n case \"subagent.completed\":\n return this.#onSubagentCompleted(event.data.callId, event.data.output);\n case \"step.failed\":\n case \"turn.failed\":\n case \"session.failed\":\n return this.#onFailure(event.data.code, event.data.message);\n }\n }\n\n #id(prefix: string): string {\n this.#nextId += 1;\n return `${prefix}-${this.#nextId}`;\n }\n\n #onUserMessage(message: string): BlockOp[] {\n const ops = this.#closeReasoningIfLive();\n ops.push({\n type: \"commit\",\n block: { kind: \"user\", body: message, depth: this.depth },\n });\n return ops;\n }\n\n #onAssistantDelta(delta: string): BlockOp[] {\n const ops = this.#closeReasoningIfLive();\n if (this.#currentAssistantId === undefined) {\n const id = this.#id(\"assistant\");\n this.#currentAssistantId = id;\n ops.push({\n type: \"start-live\",\n block: this.#assistantKind({ kind: \"assistant\", id, body: delta, live: true, depth: this.depth }),\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: withDelta(delta),\n });\n }\n return ops;\n }\n\n #endAssistant(text: string | undefined): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentAssistantId === undefined) return ops;\n if (text !== undefined && text.length > 0) {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: { body: text, live: false },\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentAssistantId,\n patch: { live: false },\n });\n }\n ops.push({ type: \"end-live\", id: this.#currentAssistantId });\n this.#currentAssistantId = undefined;\n return ops;\n }\n\n #onReasoningDelta(delta: string): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentReasoningId === undefined) {\n const id = this.#id(\"reasoning\");\n this.#currentReasoningId = id;\n ops.push({\n type: \"start-live\",\n block: this.#assistantKind({\n kind: \"reasoning\",\n id,\n body: delta,\n live: true,\n collapsed: false,\n depth: this.depth,\n }),\n });\n } else {\n ops.push({\n type: \"update-live\",\n id: this.#currentReasoningId,\n patch: withDelta(delta),\n });\n }\n return ops;\n }\n\n #endReasoning(text: string): BlockOp[] {\n const ops: BlockOp[] = [];\n if (this.#currentReasoningId === undefined) return ops;\n ops.push({\n type: \"update-live\",\n id: this.#currentReasoningId,\n patch: { body: text, live: false, collapsed: this.#autoCollapseReasoning },\n });\n ops.push({ type: \"end-live\", id: this.#currentReasoningId });\n this.#currentReasoningId = undefined;\n return ops;\n }\n\n #closeReasoningIfLive(): BlockOp[] {\n if (this.#currentReasoningId === undefined || !this.#autoCollapseReasoning) return [];\n const id = this.#currentReasoningId;\n this.#currentReasoningId = undefined;\n return [\n { type: \"update-live\", id, patch: { collapsed: true, live: false } },\n { type: \"end-live\", id },\n ];\n }\n\n #onToolStarted(name: string, callId: string, input: unknown): BlockOp[] {\n const id = this.#id(\"tool\");\n this.#toolIds.set(callId, id);\n const inSubagent = this.depth > 0;\n const args = summarizeToolArgs(input, 80);\n return [\n {\n type: \"start-live\",\n block: {\n kind: inSubagent ? \"subagent-tool\" : \"tool\",\n id,\n title: name,\n subtitle: args,\n toolInput: input,\n status: \"running\",\n live: true,\n depth: this.depth,\n },\n },\n ];\n }\n\n #onToolCompleted(\n callId: string,\n status: string,\n output: unknown,\n errorMessage: string | undefined,\n errorCode: string | undefined,\n ): BlockOp[] {\n const id = this.#toolIds.get(callId);\n if (id === undefined) return [];\n const isApproval = status === \"pending\" && errorCode === \"needs_approval\";\n if (isApproval) {\n // Approval state stays live: the tool call has not resolved, and the\n // runner has yielded `session.waiting` to pause the stream. The block\n // sits with an `approval` glyph until the user resumes the session.\n return [\n {\n type: \"update-live\",\n id,\n patch: {\n status: \"approval\",\n result: errorMessage ?? \"awaiting approval\",\n },\n },\n ];\n }\n this.#toolIds.delete(callId);\n const ok = status === \"completed\";\n const patch: Partial<Block> = {\n status: ok ? \"done\" : \"error\",\n toolOutput: ok ? output : undefined,\n result: ok ? summarizeToolResult(output, 80) : errorMessage ?? \"failed\",\n live: false,\n };\n return [\n { type: \"update-live\", id, patch },\n { type: \"end-live\", id },\n ];\n }\n\n #onSubagentCalled(name: string, callId: string): BlockOp[] {\n const id = this.#id(\"subagent\");\n this.#subagentStack.push(id);\n return [\n {\n type: \"commit\",\n block: {\n kind: \"subagent\",\n id,\n title: name,\n depth: this.depth - 1,\n },\n },\n ];\n }\n\n #onSubagentCompleted(_callId: string, output: string): BlockOp[] {\n if (this.#subagentStack.length === 0) return [];\n this.#subagentStack.pop();\n if (output && output.length > 0) {\n return [\n {\n type: \"commit\",\n block: {\n kind: \"subagent-step\",\n body: output,\n depth: this.depth,\n },\n },\n ];\n }\n return [];\n }\n\n #onFailure(code: string, message: string): BlockOp[] {\n return [\n {\n type: \"commit\",\n block: {\n kind: \"error\",\n title: code,\n body: message,\n depth: this.depth,\n },\n },\n ];\n }\n\n #assistantKind<B extends Block>(block: B): B {\n return this.depth > 0 && block.kind === \"assistant\"\n ? ({ ...block, kind: \"subagent-step\" } as unknown as B)\n : block;\n }\n}\n\nconst DELTA_KEY = \"__delta\" as const;\n\nfunction withDelta(delta: string): Partial<Block> {\n return { [DELTA_KEY]: delta } as unknown as Partial<Block>;\n}\n\n/**\n * Applies a `BlockOp` to a mutable block store. The store keeps `live` blocks\n * as an insertion-ordered map (for live-region redraw) and `committed` blocks\n * as an append-only array (for scrollback). `commit` from the store is\n * whatever rows should be flushed to `LiveRegion.commit`.\n */\nexport interface BlockStore {\n readonly live: ReadonlyMap<string, Block>;\n readonly justCommitted: readonly Block[];\n apply(op: BlockOp): void;\n drainCommitted(): Block[];\n}\n\nexport function createBlockStore(): BlockStore {\n const live = new Map<string, Block>();\n let justCommitted: Block[] = [];\n\n return {\n get live() {\n return live;\n },\n get justCommitted() {\n return justCommitted;\n },\n apply(op) {\n switch (op.type) {\n case \"commit\":\n justCommitted.push(op.block);\n return;\n case \"start-live\":\n if (op.block.id === undefined) return;\n live.set(op.block.id, op.block);\n return;\n case \"update-live\": {\n const existing = live.get(op.id);\n if (existing === undefined) return;\n const patch = op.patch as Partial<Block> & { [DELTA_KEY]?: string };\n const delta = patch[DELTA_KEY];\n const rest: Partial<Block> = { ...patch };\n delete (rest as { [DELTA_KEY]?: string })[DELTA_KEY];\n const merged: Block = { ...existing, ...rest };\n if (delta !== undefined) merged.body = `${existing.body ?? \"\"}${delta}`;\n live.set(op.id, merged);\n return;\n }\n case \"end-live\": {\n const existing = live.get(op.id);\n if (existing === undefined) return;\n live.delete(op.id);\n justCommitted.push({ ...existing, live: false });\n return;\n }\n case \"clear-live\":\n live.delete(op.id);\n return;\n }\n },\n drainCommitted() {\n const out = justCommitted;\n justCommitted = [];\n return out;\n },\n };\n}\n","import { visibleLength } from \"../ui/terminal-text\";\n\ntype TableAlignment = \"left\" | \"center\" | \"right\";\n\nconst ansi = {\n bold: \"\\x1b[1m\",\n boldOff: \"\\x1b[22m\",\n italic: \"\\x1b[3m\",\n italicOff: \"\\x1b[23m\",\n};\n\nconst tableSeparator = \"─\";\n\nexport function renderMarkdown(input: string): string {\n const lines = input.split(\"\\n\");\n const output: string[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const table = parseTable(lines, index);\n if (table != null) {\n output.push(...renderTable(table));\n index = table.endIndex - 1;\n continue;\n }\n output.push(renderMarkdownLine(lines[index] ?? \"\"));\n }\n\n return output.join(\"\\n\");\n}\n\nfunction renderMarkdownLine(line: string): string {\n if (line.startsWith(\"### \")) return renderInlineMarkdown(`▶ ${line.slice(4)}`);\n if (line.startsWith(\"## \")) return renderInlineMarkdown(`■ ${line.slice(3)}`);\n if (line.startsWith(\"# \")) return renderInlineMarkdown(`█ ${line.slice(2)}`);\n\n const unorderedListItem = line.match(/^(\\s*)[-+*]\\s+(.*)$/);\n if (unorderedListItem) {\n const [, indentation, text = \"\"] = unorderedListItem;\n return renderInlineMarkdown(`${indentation}•${text.length > 0 ? ` ${text}` : \"\"}`);\n }\n\n if (/^\\d+\\. /.test(line)) return renderInlineMarkdown(line.replace(/^(\\d+)\\. /, \"$1. \"));\n if (line.startsWith(\"> \")) return renderInlineMarkdown(`│ ${line.slice(2)}`);\n return renderInlineMarkdown(line);\n}\n\nfunction renderInlineMarkdown(input: string): string {\n const urls: string[] = [];\n const shielded = input.replaceAll(/https?:\\/\\/\\S+/g, (match) => {\n const token = `${urls.length}`;\n urls.push(match);\n return token;\n });\n\n const styled = shielded\n .replaceAll(/`([^`]+)`/g, \"$1\")\n .replaceAll(/\\*\\*([^*\\n]+)\\*\\*/g, `${ansi.bold}$1${ansi.boldOff}`)\n .replaceAll(/__([^_\\n]+)__/g, `${ansi.bold}$1${ansi.boldOff}`)\n .replaceAll(/\\*([^*\\n]+)\\*/g, `${ansi.italic}$1${ansi.italicOff}`)\n .replaceAll(/_([^_\\n]+)_/g, `${ansi.italic}$1${ansi.italicOff}`);\n\n return styled.replaceAll(/(\\d+)/g, (_match, index) => urls[Number(index)] ?? \"\");\n}\n\ntype ParsedTable = {\n alignments: TableAlignment[];\n endIndex: number;\n header: string[];\n rows: string[][];\n};\n\nfunction parseTable(lines: string[], startIndex: number): ParsedTable | undefined {\n const header = parseTableCells(lines[startIndex] ?? \"\");\n if (header == null || header.length < 2) return undefined;\n\n const separatorCells = parseTableCells(lines[startIndex + 1] ?? \"\");\n if (separatorCells == null || separatorCells.length !== header.length) return undefined;\n\n const alignments = parseTableAlignments(separatorCells);\n if (alignments == null) return undefined;\n\n const rows: string[][] = [];\n let endIndex = startIndex + 2;\n\n while (endIndex < lines.length) {\n const row = parseTableCells(lines[endIndex] ?? \"\");\n if (row == null) break;\n rows.push(normalizeTableRow(row, header.length));\n endIndex += 1;\n }\n\n return { alignments, endIndex, header, rows };\n}\n\nfunction parseTableCells(line: string): string[] | undefined {\n if (!line.includes(\"|\")) return undefined;\n\n let tableLine = line.trim();\n if (tableLine.startsWith(\"|\")) tableLine = tableLine.slice(1);\n if (tableLine.endsWith(\"|\") && !tableLine.endsWith(\"\\\\|\")) {\n tableLine = tableLine.slice(0, -1);\n }\n\n const cells: string[] = [];\n let cell = \"\";\n\n for (let index = 0; index < tableLine.length; index += 1) {\n const character = tableLine[index];\n const nextCharacter = tableLine[index + 1];\n\n if (character === \"\\\\\" && nextCharacter === \"|\") {\n cell += \"|\";\n index += 1;\n continue;\n }\n if (character === \"|\") {\n cells.push(cell.trim());\n cell = \"\";\n continue;\n }\n cell += character;\n }\n\n cells.push(cell.trim());\n return cells;\n}\n\nfunction parseTableAlignments(cells: string[]): TableAlignment[] | undefined {\n const alignments: TableAlignment[] = [];\n\n for (const cell of cells) {\n const match = cell.match(/^(:)?-{3,}(:)?$/);\n if (match == null) return undefined;\n\n const [, left, right] = match;\n alignments.push(left != null && right != null ? \"center\" : right != null ? \"right\" : \"left\");\n }\n\n return alignments;\n}\n\nfunction normalizeTableRow(row: string[], length: number): string[] {\n return Array.from({ length }, (_, index) => row[index] ?? \"\");\n}\n\nfunction renderTable(table: ParsedTable): string[] {\n const header = table.header.map(\n (cell) => `${ansi.bold}${renderInlineMarkdown(cell)}${ansi.boldOff}`,\n );\n const rows = table.rows.map((row) => row.map(renderInlineMarkdown));\n const tableRows = [header, ...rows];\n const widths = table.alignments.map((_, columnIndex) =>\n Math.max(3, ...tableRows.map((row) => visibleLength(row[columnIndex] ?? \"\"))),\n );\n\n return [\n formatTableRow(header, widths, table.alignments),\n widths.map((width) => tableSeparator.repeat(width)).join(\" \"),\n ...rows.map((row) => formatTableRow(row, widths, table.alignments)),\n ];\n}\n\nfunction formatTableRow(row: string[], widths: number[], alignments: TableAlignment[]): string {\n return row\n .map((cell, index) => alignTableCell(cell, widths[index] ?? 0, alignments[index] ?? \"left\"))\n .join(\" \");\n}\n\nfunction alignTableCell(cell: string, width: number, alignment: TableAlignment): string {\n const paddingWidth = Math.max(0, width - visibleLength(cell));\n\n if (alignment === \"right\") return `${\" \".repeat(paddingWidth)}${cell}`;\n\n if (alignment === \"center\") {\n const leftPadding = Math.floor(paddingWidth / 2);\n const rightPadding = paddingWidth - leftPadding;\n return `${\" \".repeat(leftPadding)}${cell}${\" \".repeat(rightPadding)}`;\n }\n\n return `${cell}${\" \".repeat(paddingWidth)}`;\n}\n","import { renderMarkdown } from \"../markdown\";\nimport type { Theme } from \"../theme\";\nimport { isPromptControlCommand } from \"../prompt-commands\";\nimport { formatValuePretty, truncate } from \"../tool-format\";\nimport { sliceVisible, visibleLength, wrapVisibleLine } from \"../../ui/terminal-text\";\n\nexport type ToolStatus = \"running\" | \"done\" | \"error\" | \"denied\" | \"approval\";\n\nexport type BlockKind =\n | \"user\"\n | \"assistant\"\n | \"reasoning\"\n | \"tool\"\n | \"error\"\n | \"notice\"\n | \"warning\"\n | \"result\"\n | \"subagent\"\n | \"subagent-step\"\n | \"subagent-tool\"\n | \"agent-header\";\n\nexport interface Block {\n kind: BlockKind;\n id?: string;\n depth?: number;\n live?: boolean;\n\n title?: string;\n subtitle?: string;\n body?: string;\n reasoning?: string;\n result?: string;\n detail?: string;\n\n status?: ToolStatus;\n preformatted?: boolean;\n collapsed?: boolean;\n expanded?: boolean;\n toolInput?: unknown;\n toolOutput?: unknown;\n}\n\nexport interface RenderBlockContext {\n spinner: string;\n previous?: { kind: BlockKind; title?: string };\n}\n\nexport function renderBlockLines(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n const depth = block.depth ?? 0;\n const prefix = nestingPrefix(depth, theme);\n const avail = Math.max(8, width - visibleLength(prefix));\n const rows = renderBody(block, avail, theme, context);\n return rows.map((row) => `${prefix}${row}`);\n}\n\nfunction nestingPrefix(depth: number, theme: Theme): string {\n if (depth <= 0) return \"\";\n const rule = `${theme.colors.orange(theme.glyph.rule)} `;\n return rule.repeat(depth);\n}\n\nfunction renderBody(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n switch (block.kind) {\n case \"user\":\n return renderUser(block, width, theme);\n case \"assistant\":\n case \"subagent-step\":\n return renderProse(block, width, theme);\n case \"reasoning\":\n return renderReasoning(block, width, theme);\n case \"tool\":\n case \"subagent-tool\":\n return renderTool(block, width, theme, context);\n case \"error\":\n return renderError(block, width, theme);\n case \"notice\":\n return renderNotice(block, width, theme);\n case \"warning\":\n return renderWarning(block, width, theme);\n case \"result\":\n return renderResult(block, width, theme);\n case \"subagent\":\n return renderSubagentHeader(block, width, theme);\n case \"agent-header\":\n return (block.body ?? \"\").split(\"\\n\");\n }\n}\n\nfunction renderUser(block: Block, width: number, theme: Theme): string[] {\n const bar = theme.colors.cyan(theme.glyph.user);\n const lines = wrap(block.body ?? \"\", width - 2);\n return lines.map((line) => `${bar} ${line}`);\n}\n\nfunction renderProse(block: Block, width: number, theme: Theme): string[] {\n const rows: string[] = [];\n const isSubagent = block.kind === \"subagent-step\";\n const glyph = isSubagent ? \"\" : `${theme.colors.bold(theme.colors.white(theme.glyph.brand))} `;\n const indent = isSubagent ? \"\" : \" \";\n\n if (block.reasoning && block.reasoning.trim().length > 0) {\n rows.push(...renderReasoningLines(block.reasoning, width, theme));\n }\n\n const body = (block.body ?? \"\").trim();\n if (body.length === 0 && rows.length === 0) {\n return [`${glyph}${theme.colors.dim(`thinking${theme.glyph.ellipsis}`)}`];\n }\n\n if (body.length > 0) {\n const rendered = renderMarkdown(body)\n .split(\"\\n\")\n .flatMap((line) => wrapVisibleLine(line, width - indent.length));\n rendered.forEach((line, index) => {\n if (index === 0 && !isSubagent && rows.length === 0) {\n rows.push(`${glyph}${line}`);\n } else {\n rows.push(`${indent}${line}`);\n }\n });\n }\n\n return rows.length > 0 ? rows : [`${glyph}`];\n}\n\nfunction renderReasoning(block: Block, width: number, theme: Theme): string[] {\n if (block.collapsed) {\n return [`${theme.colors.gray(theme.glyph.reasoning)} ${theme.colors.dim(\"thinking\")}`];\n }\n return renderReasoningLines(block.body ?? \"\", width, theme, theme.glyph.reasoning);\n}\n\nfunction renderReasoningLines(\n text: string,\n width: number,\n theme: Theme,\n glyph?: string,\n): string[] {\n const pad = glyph ? 2 : 0;\n const lines = wrap(text.trim(), width - pad);\n if (lines.length === 0) return [];\n return lines.map((line, index) => {\n const prefix = glyph ? (index === 0 ? `${theme.colors.gray(glyph)} ` : \" \") : \"\";\n return `${prefix}${theme.colors.dim(theme.colors.italic(line))}`;\n });\n}\n\nfunction renderTool(\n block: Block,\n width: number,\n theme: Theme,\n context: RenderBlockContext,\n): string[] {\n const { icon, accent } = toolGlyph(block.status ?? \"running\", theme, context);\n const name = block.title ?? \"tool\";\n const headerWidth = width - 2;\n const namePlain = truncatePlain(name, headerWidth);\n let header = `${icon} ${theme.colors.bold(namePlain)}`;\n const argsBudget = headerWidth - namePlain.length - 2;\n const args = block.subtitle ?? \"\";\n if (args.length > 0 && argsBudget >= 6) {\n header += ` ${theme.colors.gray(truncate(args, argsBudget))}`;\n }\n\n const rows = [header];\n\n if (block.expanded) {\n rows.push(...renderToolExpanded(block, width, theme));\n } else if (block.status === \"done\" && block.result && block.result.length > 0) {\n rows.push(resultLine(theme.glyph.arrow, block.result, width, theme, accent));\n } else if (block.status === \"error\" && block.result) {\n rows.push(resultLine(theme.glyph.arrow, block.result, width, theme, theme.colors.red));\n } else if (block.status === \"denied\") {\n rows.push(resultLine(theme.glyph.arrow, \"denied\", width, theme, theme.colors.yellow));\n }\n\n return rows;\n}\n\nfunction renderToolExpanded(block: Block, width: number, theme: Theme): string[] {\n const rows: string[] = [];\n const push = (label: string, value: unknown, color: (text: string) => string) => {\n if (value === undefined) return;\n rows.push(` ${theme.colors.dim(label)}`);\n for (const line of wrap(formatValuePretty(value), width - 4)) {\n rows.push(` ${color(line)}`);\n }\n };\n push(\"input\", block.toolInput, theme.colors.gray);\n if (block.status === \"error\" && block.result) {\n push(\"error\", block.result, theme.colors.red);\n } else {\n push(\"output\", block.toolOutput, theme.colors.gray);\n }\n return rows;\n}\n\nfunction resultLine(\n marker: string,\n text: string,\n width: number,\n theme: Theme,\n color: (text: string) => string,\n): string {\n const budget = width - 4;\n return ` ${theme.colors.dim(marker)} ${color(truncate(text, budget))}`;\n}\n\nfunction toolGlyph(\n status: ToolStatus,\n theme: Theme,\n context: RenderBlockContext,\n): { icon: string; accent: (text: string) => string } {\n switch (status) {\n case \"done\":\n return { icon: theme.colors.green(theme.glyph.success), accent: theme.colors.gray };\n case \"error\":\n return { icon: theme.colors.red(theme.glyph.error), accent: theme.colors.red };\n case \"denied\":\n return { icon: theme.colors.yellow(theme.glyph.warning), accent: theme.colors.yellow };\n case \"approval\":\n return { icon: theme.colors.yellow(theme.glyph.question), accent: theme.colors.yellow };\n case \"running\":\n default:\n return { icon: theme.colors.yellow(context.spinner), accent: theme.colors.gray };\n }\n}\n\nconst ERROR_DETAIL_MAX_LINES = 12;\n\nfunction renderError(block: Block, width: number, theme: Theme): string[] {\n const icon = theme.colors.red(theme.colors.bold(theme.glyph.error));\n const title = block.title ?? \"Error\";\n const rows = [`${icon} ${theme.colors.red(theme.colors.bold(title))}`];\n for (const line of wrap(block.body ?? \"\", width - 2)) {\n rows.push(` ${colorizeError(line, theme)}`);\n }\n rows.push(...renderErrorDetail(block.detail, width, theme));\n return rows;\n}\n\nfunction renderErrorDetail(detail: string | undefined, width: number, theme: Theme): string[] {\n if (detail === undefined || detail.trim().length === 0) return [];\n const lines = detail.split(\"\\n\");\n const visible = lines.slice(0, ERROR_DETAIL_MAX_LINES);\n const rows = visible.map(\n (line) => ` ${theme.colors.dim(truncatePlain(line, Math.max(1, width - 2)))}`,\n );\n const hidden = lines.length - visible.length;\n if (hidden > 0) {\n rows.push(\n ` ${theme.colors.dim(`${theme.glyph.ellipsis} +${hidden} more line${hidden === 1 ? \"\" : \"s\"}`)}`,\n );\n }\n return rows;\n}\n\nconst URL_PATTERN = /(https?:\\/\\/\\S+)/u;\n\nfunction colorizeError(line: string, theme: Theme): string {\n if (!URL_PATTERN.test(line)) return theme.colors.red(line);\n return line\n .split(URL_PATTERN)\n .map((segment, index) =>\n index % 2 === 1 ? theme.colors.cyan(segment) : theme.colors.red(segment),\n )\n .join(\"\");\n}\n\nfunction renderNotice(block: Block, width: number, theme: Theme): string[] {\n const marker = theme.colors.dim(theme.glyph.dot);\n const lines = wrap(block.body ?? \"\", width - 2);\n if (lines.length === 0) return [marker];\n return lines.map((line) => `${marker} ${theme.colors.dim(line)}`);\n}\n\nexport function renderAttentionRows(body: string, width: number, theme: Theme): string[] {\n const marker = theme.colors.yellow(theme.glyph.warning);\n const lines = wrap(body, width - 2);\n return lines.map((line, index) => `${index === 0 ? marker : \" \"} ${paintCommands(line, theme)}`);\n}\n\nfunction renderWarning(block: Block, width: number, theme: Theme): string[] {\n return renderAttentionRows(block.body ?? \"\", width, theme);\n}\n\nfunction paintCommands(line: string, theme: Theme): string {\n return line.replace(/\\/[a-z:-]+/g, (token) =>\n isPromptControlCommand(token) ? theme.colors.blue(token) : token,\n );\n}\n\nfunction renderResult(block: Block, width: number, theme: Theme): string[] {\n const marker = theme.colors.dim(theme.glyph.elbow);\n const lines = wrap(block.body ?? \"\", width - 7);\n if (lines.length === 0) return [` ${marker}`];\n const dim = (line: string): string =>\n theme.colors.dim(line.replaceAll(\"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"));\n return lines.map((line, index) =>\n index === 0 ? ` ${marker} ${dim(line)}` : ` ${dim(line)}`,\n );\n}\n\nfunction renderSubagentHeader(block: Block, width: number, theme: Theme): string[] {\n const name = truncatePlain(block.title ?? \"subagent\", Math.max(8, width - 14));\n return [\n `${theme.colors.orange(theme.glyph.subagent)} ${theme.colors.bold(name)} ${theme.colors.dim(\"subagent\")}`,\n ];\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (text.trim().length === 0) return [];\n return text.split(\"\\n\").flatMap((line) => wrapVisibleLine(line, Math.max(1, width)));\n}\n\nfunction truncatePlain(text: string, maxWidth: number): string {\n if (visibleLength(text) <= maxWidth) return text;\n return sliceVisible(text, maxWidth);\n}\n","import type { Block } from \"./blocks\";\nimport { renderBlockLines, type RenderBlockContext } from \"./blocks\";\nimport { createBlockStore, type BlockOp, type BlockStore } from \"./event-to-blocks\";\nimport { LiveRegion, type TerminalOutput } from \"./live-region\";\nimport { createTheme, detectUnicode, type Theme } from \"../theme\";\nimport {\n EMPTY_LINE,\n PromptHistory,\n applyLineEditorKey,\n type LineState,\n visibleLine,\n} from \"../line-editor\";\nimport { inputTextWidth, visibleLength } from \"../../ui/terminal-text\";\nimport type { TerminalKey } from \"../key-parser\";\nimport {\n matchingCommands,\n type PromptCommandSpec,\n PROMPT_COMMANDS,\n} from \"../prompt-commands\";\n\nexport interface TerminalRendererOptions {\n readonly output?: TerminalOutput;\n readonly theme?: Theme;\n readonly commands?: readonly PromptCommandSpec[];\n readonly spinnerIntervalMs?: number;\n}\n\ninterface TypeaheadState {\n readonly matches: readonly PromptCommandSpec[];\n readonly selectedIndex: number;\n readonly dismissed: boolean;\n}\n\nconst EMPTY_TYPEAHEAD: TypeaheadState = {\n matches: [],\n selectedIndex: 0,\n dismissed: false,\n};\n\n/**\n * Terminal-side glue for the block renderer.\n *\n * Owns the LiveRegion, the block store, the line editor's `LineState`, and\n * the slash-command typeahead. External code feeds it stream events via\n * {@link apply} and key presses via {@link handleKey}; the renderer decides\n * when a prompt has been submitted and resolves the pending\n * `readPrompt` promise with its text.\n */\nexport class TerminalRenderer {\n readonly #output: TerminalOutput;\n readonly #theme: Theme;\n readonly #commands: readonly PromptCommandSpec[];\n readonly #store: BlockStore;\n readonly #region: LiveRegion;\n readonly #history = new PromptHistory();\n readonly #spinnerIntervalMs: number;\n #line: LineState = EMPTY_LINE;\n #typeahead: TypeaheadState = EMPTY_TYPEAHEAD;\n #pendingResolve: ((value: string | undefined) => void) | undefined;\n #spinnerFrame = 0;\n #spinnerTimer: ReturnType<typeof setInterval> | undefined;\n #stopped = false;\n #firstPaintDone = false;\n\n constructor(options: TerminalRendererOptions = {}) {\n this.#output = options.output ?? (process.stdout as unknown as TerminalOutput);\n this.#theme = options.theme ?? createTheme({ unicode: detectUnicode() });\n this.#commands = options.commands ?? PROMPT_COMMANDS;\n this.#spinnerIntervalMs = options.spinnerIntervalMs ?? 90;\n this.#store = createBlockStore();\n this.#region = new LiveRegion({\n output: this.#output,\n onResize: () => this.#paint(),\n });\n }\n\n apply(ops: readonly BlockOp[]): void {\n if (ops.length === 0) return;\n for (const op of ops) this.#store.apply(op);\n this.#flushCommitted();\n this.#syncSpinner();\n this.#paint();\n }\n\n writeNotice(text: string): void {\n this.apply([{ type: \"commit\", block: { kind: \"notice\", body: text } }]);\n }\n\n writeError(title: string, message: string): void {\n this.apply([\n { type: \"commit\", block: { kind: \"error\", title, body: message } },\n ]);\n }\n\n writeAgentHeader(body: string): void {\n this.apply([{ type: \"commit\", block: { kind: \"agent-header\", body } }]);\n }\n\n readPrompt(): Promise<string | undefined> {\n return new Promise((resolve) => {\n this.#pendingResolve = resolve;\n this.#line = EMPTY_LINE;\n this.#typeahead = EMPTY_TYPEAHEAD;\n this.#history.begin(this.#line.text);\n this.#paint();\n });\n }\n\n handleKey(key: TerminalKey): void {\n if (this.#pendingResolve === undefined) return;\n\n if (key.type === \"ctrl-c\") {\n const resolve = this.#pendingResolve;\n this.#pendingResolve = undefined;\n this.stop();\n resolve(undefined);\n return;\n }\n\n if (this.#isTypeaheadOpen() && (key.type === \"up\" || key.type === \"down\")) {\n const delta = key.type === \"up\" ? -1 : 1;\n this.#moveTypeahead(delta);\n this.#paint();\n return;\n }\n\n if (this.#isTypeaheadOpen() && (key.type === \"tab\" || key.type === \"enter\")) {\n this.#acceptTypeahead(key.type === \"enter\");\n return;\n }\n\n if (key.type === \"escape\" && this.#isTypeaheadOpen()) {\n this.#typeahead = { ...this.#typeahead, dismissed: true };\n this.#paint();\n return;\n }\n\n if (key.type === \"enter\") {\n this.#submit();\n return;\n }\n\n if (key.type === \"up\" || key.type === \"ctrl-p\") {\n const previous = this.#history.previous(this.#line.text);\n if (previous !== undefined) {\n this.#line = { text: previous, cursor: previous.length };\n this.#refreshTypeahead();\n this.#paint();\n }\n return;\n }\n if (key.type === \"down\" || key.type === \"ctrl-n\") {\n const next = this.#history.next();\n if (next !== undefined) {\n this.#line = { text: next, cursor: next.length };\n this.#refreshTypeahead();\n this.#paint();\n }\n return;\n }\n\n const nextLine = applyLineEditorKey(this.#line, key, { multiline: false });\n if (nextLine !== undefined) {\n this.#line = nextLine;\n this.#refreshTypeahead();\n this.#paint();\n }\n }\n\n stop(): void {\n if (this.#stopped) return;\n this.#stopped = true;\n if (this.#spinnerTimer !== undefined) clearInterval(this.#spinnerTimer);\n this.#region.stop();\n }\n\n #submit(): void {\n if (this.#pendingResolve === undefined) return;\n const text = this.#line.text;\n this.#history.add(text);\n const resolve = this.#pendingResolve;\n this.#pendingResolve = undefined;\n this.#line = EMPTY_LINE;\n this.#typeahead = EMPTY_TYPEAHEAD;\n this.#region.paint([], { row: 1, col: 1 });\n resolve(text);\n }\n\n #refreshTypeahead(): void {\n const matches = matchingCommands(this.#commands, this.#line.text);\n this.#typeahead = { matches, selectedIndex: 0, dismissed: false };\n }\n\n #isTypeaheadOpen(): boolean {\n return this.#typeahead.matches.length > 0 && !this.#typeahead.dismissed;\n }\n\n #moveTypeahead(delta: number): void {\n const count = this.#typeahead.matches.length;\n if (count === 0) return;\n const selectedIndex = (this.#typeahead.selectedIndex + delta + count) % count;\n this.#typeahead = { ...this.#typeahead, selectedIndex };\n }\n\n #acceptTypeahead(submitAfter: boolean): void {\n const spec = this.#typeahead.matches[this.#typeahead.selectedIndex];\n if (spec === undefined) return;\n const text = `/${spec.name}${spec.takesArgument ? \" \" : \"\"}`;\n this.#line = { text, cursor: text.length };\n this.#typeahead = EMPTY_TYPEAHEAD;\n if (submitAfter && !spec.takesArgument) {\n this.#submit();\n } else {\n this.#paint();\n }\n }\n\n #flushCommitted(): void {\n const drained = this.#store.drainCommitted();\n if (drained.length === 0) return;\n const rows: string[] = [];\n let previous: RenderBlockContext[\"previous\"] | undefined;\n const ctx: RenderBlockContext = { spinner: this.#currentSpinner(), previous };\n for (const block of drained) {\n const blockCtx: RenderBlockContext = { spinner: this.#currentSpinner(), previous };\n rows.push(...renderBlockLines(block, this.columns, this.#theme, blockCtx));\n previous = { kind: block.kind, title: block.title };\n }\n if (rows.length > 0 && this.#firstPaintDone) rows.unshift(\"\");\n if (!this.#firstPaintDone && rows.length > 0) this.#firstPaintDone = true;\n this.#region.commit(rows);\n }\n\n #paint(): void {\n if (this.#stopped) return;\n if (this.#pendingResolve === undefined && this.#store.live.size === 0) {\n this.#region.paint([], { row: 1, col: 1 });\n return;\n }\n\n const rows: string[] = [];\n const ctx: RenderBlockContext = { spinner: this.#currentSpinner() };\n for (const block of this.#store.live.values()) {\n rows.push(...renderBlockLines(block, this.columns, this.#theme, ctx));\n }\n\n if (this.#pendingResolve !== undefined) {\n if (rows.length > 0) rows.push(\"\");\n const inputRow = this.#renderInputRow();\n const caretCol = this.#caretColumn();\n rows.push(inputRow);\n this.#region.paint(rows, { row: rows.length, col: caretCol });\n return;\n }\n\n this.#region.paint(rows, { row: rows.length, col: 1 });\n }\n\n #renderInputRow(): string {\n const c = this.#theme.colors;\n const promptGlyph = c.cyan(this.#theme.glyph.prompt);\n const promptWidth = visibleLength(`${this.#theme.glyph.prompt} `);\n const budget = Math.max(1, this.columns - promptWidth);\n const view = visibleLine(this.#line, budget);\n const before = view.before;\n const under = view.under.length === 0 ? \" \" : view.under;\n const after = view.after;\n return `${promptGlyph} ${before}${c.inverse(under)}${after}`;\n }\n\n #caretColumn(): number {\n const promptWidth = visibleLength(`${this.#theme.glyph.prompt} `);\n const view = visibleLine(this.#line, Math.max(1, this.columns - promptWidth));\n return 1 + promptWidth + inputTextWidth(view.before);\n }\n\n #currentSpinner(): string {\n return this.#theme.spinner[this.#spinnerFrame % this.#theme.spinner.length] ?? \"-\";\n }\n\n #syncSpinner(): void {\n const hasLive = [...this.#store.live.values()].some((b) => b.live === true);\n if (hasLive && this.#spinnerTimer === undefined) {\n this.#spinnerTimer = setInterval(() => {\n this.#spinnerFrame += 1;\n this.#paint();\n }, this.#spinnerIntervalMs);\n this.#spinnerTimer.unref?.();\n }\n if (!hasLive && this.#spinnerTimer !== undefined) {\n clearInterval(this.#spinnerTimer);\n this.#spinnerTimer = undefined;\n }\n }\n\n get columns(): number {\n return this.#region.columns;\n }\n}\n","import type { ModelToolDefinition } from \"../tools/index\";\n\ninterface ProviderConfig {\n baseUrl: string;\n apiKey: () => string | undefined;\n}\n\nconst PROVIDERS: Record<string, ProviderConfig> = {\n openai: {\n baseUrl: \"https://api.openai.com/v1\",\n apiKey: () => process.env.OPENAI_API_KEY,\n },\n anthropic: {\n baseUrl: \"https://api.anthropic.com/v1\",\n apiKey: () => process.env.ANTHROPIC_API_KEY,\n },\n groq: {\n baseUrl: \"https://api.groq.com/openai/v1\",\n apiKey: () => process.env.GROQ_API_KEY,\n },\n deepseek: {\n baseUrl: \"https://api.deepseek.com/v1\",\n apiKey: () => process.env.DEEPSEEK_API_KEY,\n },\n mistral: {\n baseUrl: \"https://api.mistral.ai/v1\",\n apiKey: () => process.env.MISTRAL_API_KEY,\n },\n google: {\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta\",\n apiKey: () => process.env.GOOGLE_API_KEY,\n },\n meta: {\n baseUrl: \"https://api.together.xyz/v1\",\n apiKey: () => process.env.TOGETHER_API_KEY || process.env.OPENAI_API_KEY,\n },\n};\n\nfunction parseModelId(modelId: string): { provider: string; model: string } {\n const slash = modelId.indexOf(\"/\");\n if (slash === -1) return { provider: \"\", model: modelId };\n return { provider: modelId.slice(0, slash), model: modelId.slice(slash + 1) };\n}\n\nexport interface LlmMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n}\n\nexport interface ToolResult {\n action_id: string;\n output: string;\n}\n\nexport interface LlmStreamEvent {\n type: \"delta\" | \"tool_call\" | \"done\" | \"error\";\n delta?: string;\n toolCall?: { name: string; arguments: string; id: string };\n toolCalls?: Array<{ name: string; arguments: string; id: string }>;\n finishReason?: string;\n error?: string;\n}\n\nexport function getProviderApiKey(provider: string): string | undefined {\n const cfg = PROVIDERS[provider];\n return cfg?.apiKey?.();\n}\n\nfunction flattenToolResults(model: string, results: ToolResult[]): LlmMessage[] {\n const provider = parseModelId(model).provider;\n if (provider === \"anthropic\") {\n return results.map((r) => ({\n role: \"user\" as const,\n content: JSON.stringify({ type: \"tool_result\", tool_use_id: r.action_id, content: r.output }),\n }));\n }\n return results.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.action_id,\n content: r.output,\n }));\n}\n\nexport async function* streamLlm(\n modelId: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const { provider, model } = parseModelId(modelId);\n const cfg = PROVIDERS[provider];\n\n if (!cfg) {\n yield { type: \"error\", error: `Unknown provider: ${provider}` };\n return;\n }\n\n const apiKey = cfg.apiKey();\n if (!apiKey) {\n yield { type: \"error\", error: `Missing API key for provider: ${provider}. Set ${provider.toUpperCase()}_API_KEY` };\n return;\n }\n\n if (provider === \"anthropic\") {\n yield* streamAnthropic(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n } else if (provider === \"google\") {\n yield* streamGoogle(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n } else {\n yield* streamOpenAICompatible(cfg.baseUrl, apiKey, model, messages, tools, toolResults);\n }\n}\n\nasync function* streamOpenAICompatible(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const body: Record<string, unknown> = {\n model,\n messages,\n stream: true,\n stream_options: { include_usage: false },\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools;\n }\n\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `LLM API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let accumulatedToolCalls: Map<number, { id: string; name: string; args: string }> = new Map();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const payload = line.slice(6).trim();\n if (payload === \"[DONE]\") {\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: \"stop\" };\n return;\n }\n\n try {\n const parsed = JSON.parse(payload);\n const choice = parsed.choices?.[0];\n\n if (choice?.finish_reason) {\n if (choice.finish_reason === \"tool_calls\" && accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: choice.finish_reason };\n return;\n }\n\n const delta = choice?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: \"delta\", delta: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n let existing = accumulatedToolCalls.get(idx);\n if (!existing) {\n if (!tc.function?.name) continue;\n existing = { id: tc.id ?? \"\", name: tc.function.name, args: \"\" };\n accumulatedToolCalls.set(idx, existing);\n }\n if (tc.id) existing.id = tc.id;\n if (tc.function?.name) existing.name = tc.function.name;\n if (tc.function?.arguments) existing.args += tc.function.arguments;\n }\n }\n } catch {}\n }\n }\n\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n }\n yield { type: \"done\", finishReason: \"stop\" };\n}\n\nasync function* streamAnthropic(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const systemMsgs = messages.filter((m) => m.role === \"system\");\n const chatMsgs = messages.filter((m) => m.role !== \"system\").map((m) => {\n if (m.role === \"tool\") {\n return {\n role: \"user\" as const,\n content: [{ type: \"tool_result\" as const, tool_use_id: m.tool_call_id!, content: m.content }],\n };\n }\n if (m.tool_calls) {\n return {\n role: \"assistant\" as const,\n content: m.tool_calls.map((tc) => ({\n type: \"tool_use\" as const,\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments || \"{}\"),\n })),\n };\n }\n return { role: m.role as \"user\" | \"assistant\", content: m.content };\n });\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: 4096,\n messages: chatMsgs,\n stream: true,\n };\n\n if (systemMsgs.length > 0) {\n body.system = systemMsgs.map((m) => ({ type: \"text\", text: m.content }));\n }\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema || { type: \"object\", properties: {} },\n }));\n }\n\n const res = await fetch(`${baseUrl}/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `Anthropic API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let currentEvent = \"\";\n let accumulatedToolCalls: Map<string, { id: string; name: string; args: string }> = new Map();\n let inputJsonBuffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"event: \")) {\n currentEvent = line.slice(7);\n if (currentEvent === \"content_block_start\" || currentEvent === \"content_block_delta\") {\n inputJsonBuffer = \"\";\n }\n } else if (line.startsWith(\"data: \")) {\n const payload = line.slice(6).trim();\n if (!payload) continue;\n\n try {\n const parsed = JSON.parse(payload);\n\n if (currentEvent === \"content_block_start\" && parsed.content_block) {\n if (parsed.content_block.type === \"tool_use\") {\n accumulatedToolCalls.set(parsed.index, {\n id: parsed.content_block.id,\n name: parsed.content_block.name,\n args: \"\",\n });\n }\n } else if (currentEvent === \"content_block_delta\" && parsed.delta) {\n if (parsed.delta.type === \"text_delta\" && parsed.delta.text) {\n yield { type: \"delta\", delta: parsed.delta.text };\n } else if (parsed.delta.type === \"input_json_delta\" && parsed.delta.partial_json) {\n for (const [idx, tc] of accumulatedToolCalls) {\n if (String(parsed.index) === String(idx)) {\n tc.args += parsed.delta.partial_json;\n }\n }\n }\n } else if (currentEvent === \"message_start\") {\n } else if (currentEvent === \"message_delta\") {\n if (parsed.delta?.stop_reason === \"tool_use\" || parsed.delta?.stop_reason === \"end_turn\") {\n }\n if (parsed.delta?.stop_reason === \"end_turn\" && accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n accumulatedToolCalls.clear();\n }\n } else if (currentEvent === \"message_stop\") {\n if (accumulatedToolCalls.size > 0) {\n const calls = Array.from(accumulatedToolCalls.values()).map((c) => ({\n id: c.id,\n name: c.name,\n arguments: c.args,\n }));\n yield { type: \"tool_call\", toolCalls: calls };\n accumulatedToolCalls.clear();\n }\n yield { type: \"done\", finishReason: \"stop\" };\n return;\n }\n } catch {}\n }\n }\n }\n\n yield { type: \"done\", finishReason: \"stop\" };\n}\n\nasync function* streamGoogle(\n baseUrl: string,\n apiKey: string,\n model: string,\n messages: LlmMessage[],\n tools?: ModelToolDefinition[],\n toolResults?: ToolResult[],\n): AsyncGenerator<LlmStreamEvent> {\n const contents = messages.filter((m) => m.role !== \"system\").map((m) => {\n const role = m.role === \"assistant\" ? \"model\" : (m.role === \"tool\" ? \"user\" : m.role);\n return {\n role,\n parts: [{ text: m.content }],\n };\n });\n\n const body: Record<string, unknown> = {\n contents,\n generationConfig: { temperature: 0.7 },\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools.map((t) => ({\n functionDeclarations: [{\n name: t.name,\n description: t.description,\n parameters: t.input_schema || {},\n }],\n }));\n }\n\n const res = await fetch(\n `${baseUrl}/models/${model}:streamGenerateContent?key=${apiKey}&alt=sse`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!res.ok) {\n const err = await res.text().catch(() => \"\");\n yield { type: \"error\", error: `Google API error (${res.status}): ${err.slice(0, 300)}` };\n return;\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" };\n return;\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const payload = line.slice(6).trim();\n if (!payload) continue;\n\n try {\n const parsed = JSON.parse(payload);\n const candidate = parsed.candidates?.[0];\n if (!candidate) continue;\n\n const part = candidate.content?.parts?.[0];\n if (part?.text) {\n yield { type: \"delta\", delta: part.text };\n }\n\n if (candidate.finishReason) {\n yield { type: \"done\", finishReason: candidate.finishReason.toLowerCase() };\n return;\n }\n } catch {}\n }\n }\n\n yield { type: \"done\", finishReason: \"stop\" };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { streamLlm, getProviderApiKey, type LlmMessage, type ToolResult } from \"./llm\";\nimport type { ModelToolDefinition } from \"../tools/index\";\n\ninterface Session {\n id: string;\n agentId: string;\n model: string;\n instructions: string;\n messages: LlmMessage[];\n tools?: ModelToolDefinition[];\n pendingToolCalls?: Array<{ name: string; arguments: string; id: string }>;\n}\n\nconst sessions = new Map<string, Session>();\n\nlet sessionCounter = 0;\nfunction nextId(): string {\n return `local-${++sessionCounter}-${Date.now().toString(36)}`;\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n}\n\nfunction writeSSE(res: ServerResponse, event: string, data: unknown): void {\n res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`);\n}\n\nfunction parseUrl(url: string): { pathname: string } {\n const idx = url.indexOf(\"?\");\n return { pathname: idx === -1 ? url : url.slice(0, idx) };\n}\n\nexport async function handleSessionsRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<boolean> {\n const { pathname } = parseUrl(req.url ?? \"/\");\n\n const sessionMatch = pathname.match(/^\\/v1\\/sessions\\/([^/]+)\\/turns$/);\n const approveMatch = pathname.match(/^\\/v1\\/sessions\\/([^/]+)\\/approve$/);\n const createMatch = pathname === \"/v1/sessions\" && req.method === \"POST\";\n\n if (createMatch) {\n return handleCreateSession(req, res);\n }\n if (sessionMatch && req.method === \"POST\") {\n return handleTurn(req, res, sessionMatch[1]);\n }\n if (approveMatch && req.method === \"POST\") {\n return handleApprove(req, res, approveMatch[1]);\n }\n\n return false;\n}\n\nasync function handleCreateSession(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n const body = JSON.parse(await readBody(req));\n const id = nextId();\n const session: Session = {\n id,\n agentId: body.agent_id ?? \"unnamed\",\n model: body.metadata?.model ?? \"\",\n instructions: body.metadata?.instructions ?? \"\",\n messages: [],\n };\n sessions.set(id, session);\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ id }));\n return true;\n}\n\nasync function handleTurn(\n req: IncomingMessage,\n res: ServerResponse,\n sessionId: string,\n): Promise<boolean> {\n const session = sessions.get(sessionId);\n if (!session) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Session not found\" }));\n return true;\n }\n\n const body = JSON.parse(await readBody(req));\n const model = body.model || session.model;\n const input = body.input ?? \"\";\n const instructions = body.instructions || session.instructions;\n const stream = body.stream !== false;\n const pauseOnTools = body.pause_on_tool_calls !== false;\n const tools: ModelToolDefinition[] = (body.tools ?? []);\n\n session.model = model;\n session.instructions = instructions;\n if (tools.length > 0) session.tools = tools;\n\n const messages: LlmMessage[] = [];\n\n if (instructions) {\n messages.push({ role: \"system\", content: instructions });\n }\n\n for (const msg of session.messages) {\n messages.push(msg);\n }\n\n const turnNumber = session.messages.filter((m) => m.role === \"user\").length + 1;\n const userMsg: LlmMessage = { role: \"user\", content: input };\n messages.push(userMsg);\n\n if (stream) {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n writeSSE(res, \"turn.started\", { turn_number: turnNumber, input_text: input });\n writeSSE(res, \"message.received\", { input_text: input, turn_number: turnNumber });\n writeSSE(res, \"step.started\", { step_number: 1, turn_number: turnNumber });\n\n let textSoFar = \"\";\n let hadToolCalls = false;\n let messagePushed = false;\n\n try {\n for await (const event of streamLlm(model, messages, tools.length > 0 ? tools : undefined)) {\n if (event.type === \"delta\" && event.delta) {\n textSoFar += event.delta;\n writeSSE(res, \"output_text.delta\", { delta: event.delta, text: textSoFar });\n }\n\n if (event.type === \"tool_call\" && event.toolCalls) {\n hadToolCalls = true;\n session.pendingToolCalls = event.toolCalls;\n\n for (const tc of event.toolCalls) {\n writeSSE(res, \"tool_call.started\", {\n tool: tc.name,\n arguments: JSON.parse(tc.arguments || \"{}\"),\n action_id: tc.id,\n });\n }\n\n const toolCallMsg: LlmMessage = {\n role: \"assistant\",\n content: textSoFar,\n tool_calls: event.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n };\n\n if (pauseOnTools) {\n session.messages.push(toolCallMsg);\n messagePushed = true;\n writeSSE(res, \"turn.paused\", { text: textSoFar });\n res.end();\n return true;\n }\n\n session.messages.push(toolCallMsg);\n messagePushed = true;\n }\n\n if (event.type === \"done\") {\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: textSoFar });\n messagePushed = true;\n }\n writeSSE(res, \"message.completed\", {\n text: textSoFar,\n finish_reason: event.finishReason ?? \"stop\",\n step_number: 1,\n turn_number: turnNumber,\n });\n writeSSE(res, \"step.completed\", {\n finish_reason: event.finishReason ?? \"stop\",\n step_number: 1,\n turn_number: turnNumber,\n });\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n }\n\n if (event.type === \"error\") {\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n writeSSE(res, \"error\", { message: event.error });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n writeSSE(res, \"error\", { message: msg });\n }\n\n res.end();\n } else {\n let fullText = \"\";\n let messagePushed = false;\n try {\n for await (const event of streamLlm(model, messages, tools.length > 0 ? tools : undefined)) {\n if (event.type === \"delta\" && event.delta) {\n fullText += event.delta;\n }\n if (event.type === \"tool_call\" && event.toolCalls) {\n session.pendingToolCalls = event.toolCalls;\n }\n }\n } catch {}\n\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: fullText });\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ output: fullText, turn_id: sessionId }));\n }\n\n return true;\n}\n\nasync function handleApprove(\n req: IncomingMessage,\n res: ServerResponse,\n sessionId: string,\n): Promise<boolean> {\n const session = sessions.get(sessionId);\n if (!session) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Session not found\" }));\n return true;\n }\n\n const body = JSON.parse(await readBody(req));\n const toolResults: ToolResult[] = body.tool_results ?? [];\n const actionId = body.action_id ?? toolResults[0]?.action_id ?? \"\";\n\n if (!session.pendingToolCalls || session.pendingToolCalls.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"No pending tool calls\" }));\n return true;\n }\n\n const toolResultMessages = toolResults.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.action_id,\n content: r.output,\n }));\n\n for (const msg of toolResultMessages) {\n session.messages.push(msg);\n }\n\n session.pendingToolCalls = undefined;\n\n const turnNumber = session.messages.filter((m) => m.role === \"user\").length;\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n\n writeSSE(res, \"turn.resumed\", {});\n\n let textSoFar = \"\";\n let hadToolCalls = false;\n let messagePushed = false;\n\n try {\n for await (const event of streamLlm(\n session.model,\n session.messages,\n session.tools,\n toolResults,\n )) {\n if (event.type === \"delta\" && event.delta) {\n textSoFar += event.delta;\n writeSSE(res, \"output_text.delta\", { delta: event.delta, text: textSoFar });\n }\n\n if (event.type === \"tool_call\" && event.toolCalls) {\n hadToolCalls = true;\n session.pendingToolCalls = event.toolCalls;\n\n for (const tc of event.toolCalls) {\n writeSSE(res, \"tool_call.started\", {\n tool: tc.name,\n arguments: JSON.parse(tc.arguments || \"{}\"),\n action_id: tc.id,\n });\n }\n\n session.messages.push({\n role: \"assistant\",\n content: textSoFar,\n tool_calls: event.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n });\n messagePushed = true;\n\n writeSSE(res, \"turn.paused\", { text: textSoFar });\n res.end();\n return true;\n }\n\n if (event.type === \"done\") {\n if (!messagePushed) {\n session.messages.push({ role: \"assistant\", content: textSoFar });\n messagePushed = true;\n }\n writeSSE(res, \"message.completed\", {\n text: textSoFar,\n finish_reason: event.finishReason ?? \"stop\",\n });\n writeSSE(res, \"turn.completed\", { turn_number: turnNumber, turn_id: sessionId });\n }\n\n if (event.type === \"error\") {\n writeSSE(res, \"error\", { message: event.error });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n writeSSE(res, \"error\", { message: msg });\n }\n\n res.end();\n return true;\n}\n\nexport { getProviderApiKey };\n"],"mappings":"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","names":["resolve","resolve","resolve"]}