pi-fabric 0.92.41 → 0.92.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ export declare class PiEventProjection {
2
+ #private;
3
+ write(text: string): string;
4
+ end(): string;
5
+ }
6
+ //# sourceMappingURL=event-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-projection.d.ts","sourceRoot":"","sources":["../../src/worker/event-projection.ts"],"names":[],"mappings":"AAOA,qBAAa,iBAAiB;;IAW5B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAuE3B,GAAG,IAAI,MAAM;CAiBd"}
@@ -0,0 +1,99 @@
1
+ // src/worker/event-projection.ts
2
+ var PiEventProjection = class {
3
+ #depth = 0;
4
+ #inString = false;
5
+ #escaped = false;
6
+ #expectKey = false;
7
+ #readingKey = false;
8
+ #keyToken = "";
9
+ #key = "";
10
+ #awaitingValue = false;
11
+ #skipping = false;
12
+ write(text) {
13
+ const parts = [];
14
+ let start = 0;
15
+ for (let i = 0; i < text.length; i++) {
16
+ const char = text[i];
17
+ if (char === "\n") {
18
+ if (this.#skipping) {
19
+ parts.push("!\n");
20
+ start = i + 1;
21
+ }
22
+ this.#reset();
23
+ continue;
24
+ }
25
+ if (this.#inString) {
26
+ if (this.#readingKey && this.#keyToken.length < 256) this.#keyToken += char;
27
+ if (this.#escaped) {
28
+ this.#escaped = false;
29
+ } else if (char === "\\") {
30
+ this.#escaped = true;
31
+ } else if (char === '"') {
32
+ this.#inString = false;
33
+ if (this.#readingKey) {
34
+ try {
35
+ this.#key = JSON.parse(this.#keyToken);
36
+ } catch {
37
+ this.#key = "";
38
+ }
39
+ this.#readingKey = false;
40
+ }
41
+ }
42
+ continue;
43
+ }
44
+ if (this.#depth === 1 && this.#awaitingValue && !/[ \t\r]/.test(char)) {
45
+ this.#awaitingValue = false;
46
+ if (char === "[" && (this.#key === "messages" || this.#key === "toolResults")) {
47
+ parts.push(text.slice(start, i), "[]");
48
+ this.#skipping = true;
49
+ }
50
+ }
51
+ if (char === '"') {
52
+ this.#inString = true;
53
+ this.#readingKey = this.#depth === 1 && this.#expectKey;
54
+ if (this.#readingKey) {
55
+ this.#keyToken = '"';
56
+ this.#expectKey = false;
57
+ }
58
+ } else if (char === "{" || char === "[") {
59
+ this.#depth++;
60
+ if (this.#depth === 1 && char === "{") this.#expectKey = true;
61
+ } else if (char === "}" || char === "]") {
62
+ this.#depth--;
63
+ if (this.#skipping && this.#depth === 1 && char === "]") {
64
+ this.#skipping = false;
65
+ start = i + 1;
66
+ }
67
+ } else if (this.#depth === 1 && char === ":") {
68
+ this.#awaitingValue = true;
69
+ } else if (this.#depth === 1 && char === ",") {
70
+ this.#expectKey = true;
71
+ this.#key = "";
72
+ }
73
+ }
74
+ if (!this.#skipping) parts.push(text.slice(start));
75
+ return parts.join("");
76
+ }
77
+ // A child may exit without LF. Do not let a truncated discarded array look
78
+ // complete to the worker's final JSON.parse.
79
+ end() {
80
+ const incomplete = this.#skipping ? "!" : "";
81
+ this.#reset();
82
+ return incomplete;
83
+ }
84
+ #reset() {
85
+ this.#depth = 0;
86
+ this.#inString = false;
87
+ this.#escaped = false;
88
+ this.#expectKey = false;
89
+ this.#readingKey = false;
90
+ this.#keyToken = "";
91
+ this.#key = "";
92
+ this.#awaitingValue = false;
93
+ this.#skipping = false;
94
+ }
95
+ };
96
+ export {
97
+ PiEventProjection
98
+ };
99
+ //# sourceMappingURL=event-projection.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/worker/event-projection.ts"],
4
+ "sourcesContent": ["// Pi repeats the entire history in agent_end.messages and the current tool\n// results in turn_end.toolResults. These top-level fields are not consumed by\n// the worker or transcript reader; authoritative messages arrive separately.\n// Elide them *before* buffering a JSONL record, not after JSON.parse. This keeps\n// image-heavy sessions bounded without dropping lifecycle flags after history.\n// This is a lexical projection, not a JSON validator. Retained JSON is parsed\n// by the worker. Discarded values are never accumulated; key tokens are bounded.\nexport class PiEventProjection {\n #depth = 0;\n #inString = false;\n #escaped = false;\n #expectKey = false;\n #readingKey = false;\n #keyToken = \"\";\n #key = \"\";\n #awaitingValue = false;\n #skipping = false;\n\n write(text: string): string {\n const parts: string[] = [];\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text[i]!;\n // Only LF frames records. CR is retained for the worker's CRLF handling;\n // U+2028/U+2029 and escaped newlines are ordinary JSON string contents.\n if (char === \"\\n\") {\n if (this.#skipping) {\n // An incomplete discarded value must not manufacture a valid event.\n parts.push(\"!\\n\");\n start = i + 1;\n }\n this.#reset();\n continue;\n }\n if (this.#inString) {\n if (this.#readingKey && this.#keyToken.length < 256) this.#keyToken += char;\n if (this.#escaped) {\n this.#escaped = false;\n } else if (char === \"\\\\\") {\n this.#escaped = true;\n } else if (char === '\"') {\n this.#inString = false;\n if (this.#readingKey) {\n try {\n this.#key = JSON.parse(this.#keyToken) as string;\n } catch {\n this.#key = \"\";\n }\n this.#readingKey = false;\n }\n }\n continue;\n }\n if (this.#depth === 1 && this.#awaitingValue && !/[ \\t\\r]/.test(char)) {\n this.#awaitingValue = false;\n if (char === \"[\" && (this.#key === \"messages\" || this.#key === \"toolResults\")) {\n parts.push(text.slice(start, i), \"[]\");\n this.#skipping = true;\n }\n }\n if (char === '\"') {\n this.#inString = true;\n this.#readingKey = this.#depth === 1 && this.#expectKey;\n if (this.#readingKey) {\n this.#keyToken = '\"';\n this.#expectKey = false;\n }\n } else if (char === \"{\" || char === \"[\") {\n this.#depth++;\n if (this.#depth === 1 && char === \"{\") this.#expectKey = true;\n } else if (char === \"}\" || char === \"]\") {\n this.#depth--;\n if (this.#skipping && this.#depth === 1 && char === \"]\") {\n this.#skipping = false;\n start = i + 1;\n }\n } else if (this.#depth === 1 && char === \":\") {\n this.#awaitingValue = true;\n } else if (this.#depth === 1 && char === \",\") {\n this.#expectKey = true;\n this.#key = \"\";\n }\n }\n if (!this.#skipping) parts.push(text.slice(start));\n return parts.join(\"\");\n }\n\n // A child may exit without LF. Do not let a truncated discarded array look\n // complete to the worker's final JSON.parse.\n end(): string {\n const incomplete = this.#skipping ? \"!\" : \"\";\n this.#reset();\n return incomplete;\n }\n\n #reset(): void {\n this.#depth = 0;\n this.#inString = false;\n this.#escaped = false;\n this.#expectKey = false;\n this.#readingKey = false;\n this.#keyToken = \"\";\n this.#key = \"\";\n this.#awaitingValue = false;\n this.#skipping = false;\n }\n}\n"],
5
+ "mappings": ";AAOO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,YAAY;AAAA,EAEZ,MAAM,MAAsB;AAC1B,UAAM,QAAkB,CAAC;AACzB,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAGnB,UAAI,SAAS,MAAM;AACjB,YAAI,KAAK,WAAW;AAElB,gBAAM,KAAK,KAAK;AAChB,kBAAQ,IAAI;AAAA,QACd;AACA,aAAK,OAAO;AACZ;AAAA,MACF;AACA,UAAI,KAAK,WAAW;AAClB,YAAI,KAAK,eAAe,KAAK,UAAU,SAAS,IAAK,MAAK,aAAa;AACvE,YAAI,KAAK,UAAU;AACjB,eAAK,WAAW;AAAA,QAClB,WAAW,SAAS,MAAM;AACxB,eAAK,WAAW;AAAA,QAClB,WAAW,SAAS,KAAK;AACvB,eAAK,YAAY;AACjB,cAAI,KAAK,aAAa;AACpB,gBAAI;AACF,mBAAK,OAAO,KAAK,MAAM,KAAK,SAAS;AAAA,YACvC,QAAQ;AACN,mBAAK,OAAO;AAAA,YACd;AACA,iBAAK,cAAc;AAAA,UACrB;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,KAAK,WAAW,KAAK,KAAK,kBAAkB,CAAC,UAAU,KAAK,IAAI,GAAG;AACrE,aAAK,iBAAiB;AACtB,YAAI,SAAS,QAAQ,KAAK,SAAS,cAAc,KAAK,SAAS,gBAAgB;AAC7E,gBAAM,KAAK,KAAK,MAAM,OAAO,CAAC,GAAG,IAAI;AACrC,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AACA,UAAI,SAAS,KAAK;AAChB,aAAK,YAAY;AACjB,aAAK,cAAc,KAAK,WAAW,KAAK,KAAK;AAC7C,YAAI,KAAK,aAAa;AACpB,eAAK,YAAY;AACjB,eAAK,aAAa;AAAA,QACpB;AAAA,MACF,WAAW,SAAS,OAAO,SAAS,KAAK;AACvC,aAAK;AACL,YAAI,KAAK,WAAW,KAAK,SAAS,IAAK,MAAK,aAAa;AAAA,MAC3D,WAAW,SAAS,OAAO,SAAS,KAAK;AACvC,aAAK;AACL,YAAI,KAAK,aAAa,KAAK,WAAW,KAAK,SAAS,KAAK;AACvD,eAAK,YAAY;AACjB,kBAAQ,IAAI;AAAA,QACd;AAAA,MACF,WAAW,KAAK,WAAW,KAAK,SAAS,KAAK;AAC5C,aAAK,iBAAiB;AAAA,MACxB,WAAW,KAAK,WAAW,KAAK,SAAS,KAAK;AAC5C,aAAK,aAAa;AAClB,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AACA,QAAI,CAAC,KAAK,UAAW,OAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AACjD,WAAO,MAAM,KAAK,EAAE;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,MAAc;AACZ,UAAM,aAAa,KAAK,YAAY,MAAM;AAC1C,SAAK,OAAO;AACZ,WAAO;AAAA,EACT;AAAA,EAEA,SAAe;AACb,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,cAAc;AACnB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,iBAAiB;AACtB,SAAK,YAAY;AAAA,EACnB;AACF;",
6
+ "names": []
7
+ }
package/dist/worker.js CHANGED
@@ -7,6 +7,11 @@ import crossSpawn from "cross-spawn";
7
7
  import { StringDecoder } from "node:string_decoder";
8
8
  var NODE_SCRIPT_EXTENSIONS = /* @__PURE__ */ new Set([".js", ".cjs", ".mjs", ".ts", ".cts", ".mts"]);
9
9
  var spawnCli = (command, args, options) => NODE_SCRIPT_EXTENSIONS.has(path.extname(command).toLowerCase()) ? crossSpawn(process.execPath, [command, ...args], options) : crossSpawn(command, [...args], options);
10
+ var loadWorkerEventProjection = async () => {
11
+ if (!import.meta.url.endsWith(".ts")) return import("./worker/event-projection.js");
12
+ const sourceModulePath = "./worker/event-projection.ts";
13
+ return import(sourceModulePath);
14
+ };
10
15
  var loadWorkerModelControl = async () => {
11
16
  if (!import.meta.url.endsWith(".ts")) return import("./worker/model-control.js");
12
17
  const sourceModulePath = "./worker/model-control.ts";
@@ -133,12 +138,13 @@ process.on("unhandledRejection", (error) => {
133
138
  process.exit(1);
134
139
  });
135
140
  var main = async () => {
136
- const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, { parseStructuredValue, validateAgentResult }, { PiModelControl }] = await Promise.all([
141
+ const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, { parseStructuredValue, validateAgentResult }, { PiModelControl }, { PiEventProjection }] = await Promise.all([
137
142
  loadWorkerOptions(),
138
143
  loadWorkerRunRecord(),
139
144
  loadWorkerSessionExport(),
140
145
  loadAgentResult(),
141
- loadWorkerModelControl()
146
+ loadWorkerModelControl(),
147
+ loadWorkerEventProjection()
142
148
  ]);
143
149
  runRecordHelpers = loadedRunRecordHelpers;
144
150
  const {
@@ -270,6 +276,7 @@ ${schema}`
270
276
  let outputBuffer = "";
271
277
  let vedaOutput = "";
272
278
  let vedaParsed;
279
+ const eventProjection = options.runner === "pi" ? new PiEventProjection() : void 0;
273
280
  const outputDecoder = new StringDecoder("utf8");
274
281
  const stderrDecoder = new StringDecoder("utf8");
275
282
  let terminalStatus;
@@ -890,7 +897,7 @@ ${schema}`
890
897
  vedaOutput += decoded;
891
898
  return;
892
899
  }
893
- outputBuffer += decoded;
900
+ outputBuffer += eventProjection ? eventProjection.write(decoded) : decoded;
894
901
  while (true) {
895
902
  const newline = outputBuffer.indexOf("\n");
896
903
  if (newline < 0) {
@@ -958,7 +965,8 @@ ${schema}`
958
965
  if (options.runner === "veda") {
959
966
  vedaOutput += outputDecoder.end();
960
967
  } else {
961
- outputBuffer += outputDecoder.end();
968
+ const tail = outputDecoder.end();
969
+ outputBuffer += eventProjection ? eventProjection.write(tail) + eventProjection.end() : tail;
962
970
  }
963
971
  recordStderr(stderrDecoder.end());
964
972
  if (options.runner === "veda") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/worker.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ChildProcess, SpawnOptions } from \"node:child_process\";\nimport crossSpawn from \"cross-spawn\";\nimport { StringDecoder } from \"node:string_decoder\";\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\nimport type {\n AgentRunRecord,\n AgentRunStatus,\n} from \"./agents/types.js\";\n\nconst NODE_SCRIPT_EXTENSIONS = new Set([\".js\", \".cjs\", \".mjs\", \".ts\", \".cts\", \".mts\"]);\n\nconst spawnCli = (\n command: string,\n args: readonly string[],\n options: SpawnOptions,\n): ChildProcess => NODE_SCRIPT_EXTENSIONS.has(path.extname(command).toLowerCase())\n ? crossSpawn(process.execPath, [command, ...args], options)\n : crossSpawn(command, [...args], options);\n\ntype ClaudeCliModule = typeof import(\"./agents/claude-cli.js\");\ntype VedaCliModule = typeof import(\"./agents/veda-cli.js\");\ntype CompactControlModule = typeof import(\"./agents/compact-control.js\");\ntype WorkerOptionsModule = typeof import(\"./worker/options.js\");\ntype WorkerRunRecordModule = typeof import(\"./worker/run-record.js\");\ntype WorkerSessionExportModule = typeof import(\"./worker/session-export.js\");\ntype WorkerModelControlModule = typeof import(\"./worker/model-control.js\");\n\nconst loadWorkerModelControl = async (): Promise<WorkerModelControlModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/model-control.js\");\n const sourceModulePath = \"./worker/model-control.ts\";\n return import(sourceModulePath) as Promise<WorkerModelControlModule>;\n};\n\ntype AgentResultModule = typeof import(\"./agents/result.js\");\n\nconst loadAgentResult = async (): Promise<AgentResultModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/result.js\");\n const sourceModulePath = \"./agents/result.ts\";\n return import(sourceModulePath) as Promise<AgentResultModule>;\n};\n\nconst loadWorkerOptions = async (): Promise<WorkerOptionsModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/options.js\");\n const sourceModulePath = \"./worker/options.ts\";\n return import(sourceModulePath) as Promise<WorkerOptionsModule>;\n};\n\nconst loadWorkerRunRecord = async (): Promise<WorkerRunRecordModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/run-record.js\");\n const sourceModulePath = \"./worker/run-record.ts\";\n return import(sourceModulePath) as Promise<WorkerRunRecordModule>;\n};\n\nconst loadWorkerSessionExport = async (): Promise<WorkerSessionExportModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/session-export.js\");\n const sourceModulePath = \"./worker/session-export.ts\";\n return import(sourceModulePath) as Promise<WorkerSessionExportModule>;\n};\n\nconst loadCompactControl = async (): Promise<CompactControlModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/compact-control.js\");\n const sourceModulePath = \"./agents/compact-control.ts\";\n return import(sourceModulePath) as Promise<CompactControlModule>;\n};\n\nconst loadClaudeCli = async (): Promise<ClaudeCliModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/claude-cli.js\");\n const sourceModulePath = \"./agents/claude-cli.ts\";\n return import(sourceModulePath) as Promise<ClaudeCliModule>;\n};\n\nconst loadVedaCli = async (): Promise<VedaCliModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/veda-cli.js\");\n const sourceModulePath = \"./agents/veda-cli.ts\";\n return import(sourceModulePath) as Promise<VedaCliModule>;\n};\n\nconst MAX_STDERR_CHARS = 20_000;\nconst MAX_EVENT_LINE_CHARS = 4 * 1024 * 1024;\nconst STEER_READ_CHUNK_BYTES = 256 * 1024;\nconst MAX_STEER_LINE_BYTES = 64 * 1024;\nconst MAX_STEER_COMMANDS_PER_POLL = 256;\nconst MAX_CLAUDE_PENDING_INPUTS = 256;\nconst MAX_CLAUDE_PENDING_TOOLS = 1_000;\nconst KILL_GRACE_MS = 5_000;\n\nconst extractText = (message: Record<string, unknown>): string => {\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter(\n (part): part is { type: \"text\"; text: string } =>\n typeof part === \"object\" &&\n part !== null &&\n (part as Record<string, unknown>).type === \"text\" &&\n typeof (part as Record<string, unknown>).text === \"string\",\n )\n .map((part) => part.text)\n .join(\"\");\n};\n\nconst readImages = (filePath: string | undefined): ImageContent[] => {\n if (!filePath) return [];\n const parsed: unknown = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n if (!Array.isArray(parsed)) throw new Error(\"Agent images file must contain an array\");\n const images: ImageContent[] = [];\n for (const value of parsed) {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n (value as { type?: unknown }).type !== \"image\" ||\n typeof (value as { data?: unknown }).data !== \"string\" ||\n typeof (value as { mimeType?: unknown }).mimeType !== \"string\"\n ) {\n throw new Error(\"Agent images file contains an invalid image block\");\n }\n images.push({\n type: \"image\",\n data: (value as { data: string }).data,\n mimeType: (value as { mimeType: string }).mimeType,\n });\n }\n return images;\n};\n\nconst numberField = (value: unknown): number => (typeof value === \"number\" ? value : 0);\n\nconst stringField = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n\nconst assistantError = (message: Record<string, unknown>): string => {\n const details: string[] = [];\n const direct = stringField(message.errorMessage) ?? stringField(message.error);\n if (direct) details.push(direct);\n if (Array.isArray(message.diagnostics)) {\n for (const diagnostic of message.diagnostics) {\n if (typeof diagnostic !== \"object\" || diagnostic === null || Array.isArray(diagnostic)) continue;\n const record = diagnostic as Record<string, unknown>;\n const nested =\n typeof record.error === \"object\" && record.error !== null && !Array.isArray(record.error)\n ? (record.error as Record<string, unknown>)\n : undefined;\n const detail = stringField(nested?.message) ?? stringField(record.message);\n if (detail) details.push(detail);\n }\n }\n const unique = [...new Set(details)];\n const provider = stringField(message.provider);\n const model = stringField(message.model);\n const source = [provider, model].filter((value): value is string => Boolean(value)).join(\"/\");\n const summary = unique.join(\" \u00B7 \") || \"Pi agent reported an error\";\n return `${source ? `${source}: ` : \"\"}${summary}`.slice(0, MAX_STDERR_CHARS);\n};\n\nconst runnerLabel = (runner: string): string =>\n runner === \"claude\" ? \"Claude\" : runner === \"veda\" ? \"Veda\" : \"Pi\";\n\nconst terminateChild = (child: ChildProcess, signal: NodeJS.Signals): void => {\n if (!child.pid) return;\n try {\n process.kill(process.platform === \"win32\" ? child.pid : -child.pid, signal);\n } catch { /* child process group already exited */ }\n};\n\n\n\nlet crashContext: { statusFile: string; record: AgentRunRecord } | undefined;\nlet runRecordHelpers: WorkerRunRecordModule | undefined;\nlet terminalWritten = false;\nconst writeCrashStatus = (error: unknown): void => {\n if (!crashContext || !runRecordHelpers || terminalWritten) return;\n try {\n runRecordHelpers.writeCrashRunRecord(crashContext.statusFile, crashContext.record, error);\n } catch {\n // Best effort: if the crash-status write itself fails, #monitor falls back\n // to \"Agent transport exited without a result\".\n }\n};\nprocess.on(\"uncaughtException\", (error) => {\n writeCrashStatus(error);\n process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : error}\\n`);\n process.exit(1);\n});\nprocess.on(\"unhandledRejection\", (error) => {\n writeCrashStatus(error);\n process.stderr.write(`Unhandled rejection: ${error instanceof Error ? error.stack ?? error.message : error}\\n`);\n process.exit(1);\n});\n\nconst main = async (): Promise<void> => {\n const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, {parseStructuredValue, validateAgentResult}, { PiModelControl }] = await Promise.all([\n loadWorkerOptions(),\n loadWorkerRunRecord(),\n loadWorkerSessionExport(),\n loadAgentResult(),\n loadWorkerModelControl(),\n ]);\n runRecordHelpers = loadedRunRecordHelpers;\n const {\n applyUsage,\n createRunningRecord,\n emptyUsage,\n extractUsageDelta,\n latestRunText,\n updateRunRecord,\n writeRunRecord,\n } = loadedRunRecordHelpers;\n const options = optionHelpers.parseWorkerOptions();\n const sessionExporter = options.sessionExportFile\n ? new sessionExportHelpers.SessionExporter({\n file: options.sessionExportFile,\n sessionId: options.id,\n cwd: options.cwd,\n agentName: options.name,\n })\n : undefined;\n const thinking =\n options.thinking === \"off\" ||\n options.thinking === \"minimal\" ||\n options.thinking === \"low\" ||\n options.thinking === \"medium\" ||\n options.thinking === \"high\" ||\n options.thinking === \"xhigh\" ||\n options.thinking === \"max\"\n ? options.thinking\n : undefined;\n const task = fs.readFileSync(options.taskFile, \"utf8\");\n const images = readImages(options.imagesFile);\n const record = createRunningRecord(options, task, thinking, Date.now());\n writeRunRecord(options.statusFile, record);\n const emitLifecycle = (\n event: string,\n data?: Record<string, unknown>,\n ): void => {\n try {\n fs.mkdirSync(path.dirname(options.lifecycleFile), { recursive: true });\n fs.appendFileSync(\n options.lifecycleFile,\n JSON.stringify({ version: 1, event, occurredAt: Date.now(), ...(data ? { data } : {}) }) + \"\\n\",\n { encoding: \"utf8\", mode: 0o600 },\n );\n } catch {\n // Lifecycle telemetry is best-effort and must not fail the child run.\n }\n };\n crashContext = { statusFile: options.statusFile, record };\n process.stdout.write(`[pi-fabric] ${options.name}\\n${task}\\n\\n`);\n fs.mkdirSync(path.dirname(options.logFile), { recursive: true });\n // Other processes tail this file while the run is live (transcript reader,\n // dashboards, preview trees). The previous buffered createWriteStream visibly\n // stalled mid-run \u2014 append synchronously so events are durable immediately.\n const appendLog = (text: string): void => {\n try {\n fs.appendFileSync(options.logFile, text, { encoding: \"utf8\", mode: 0o600 });\n } catch {\n // Event logging is best-effort and must not fail the child run.\n }\n };\n const sessionStream =\n options.runner === \"claude\" && options.sessionFile\n ? fs.createWriteStream(options.sessionFile, { flags: \"a\", mode: 0o600 })\n : undefined;\n sessionStream?.on(\"error\", () => {});\n\n const schema = options.schemaFile\n ? fs.readFileSync(options.schemaFile, \"utf8\")\n : undefined;\n const piArguments = [\"--mode\", \"rpc\"];\n if (options.sessionFile) piArguments.push(\"--session\", options.sessionFile);\n else piArguments.push(\"--no-session\");\n if (!options.extensions) piArguments.push(\"--no-extensions\");\n if (options.fabricExtensionPath) piArguments.push(\"-e\", options.fabricExtensionPath);\n if (options.tools.length > 0) piArguments.push(\"--tools\", options.tools.join(\",\"));\n else piArguments.push(\"--no-tools\"); // explicit empty allowlist => no tools, not Pi defaults\n if (options.model) piArguments.push(\"--model\", options.model);\n if (thinking) piArguments.push(\"--thinking\", thinking);\n if (options.systemPrompt) piArguments.push(\"--append-system-prompt\", options.systemPrompt);\n if (schema) {\n piArguments.push(\n \"--append-system-prompt\",\n `Your final response must contain only JSON matching this schema, without Markdown fences:\\n${schema}`,\n );\n }\n const claudeCli = options.runner === \"claude\" ? await loadClaudeCli() : undefined;\n const vedaCli = options.runner === \"veda\" ? await loadVedaCli() : undefined;\n const childArguments =\n options.runner === \"claude\"\n ? claudeCli!.buildClaudeArguments({\n tools: options.tools,\n extensions: options.extensions,\n persistentSession: Boolean(options.sessionFile),\n ...(options.model ? { model: options.model } : {}),\n ...(thinking ? { thinking } : {}),\n ...(options.systemPrompt ? { systemPrompt: options.systemPrompt } : {}),\n ...(schema ? { schema } : {}),\n ...(options.runnerSessionId ? { runnerSessionId: options.runnerSessionId } : {}),\n name: options.name,\n })\n : options.runner === \"veda\"\n ? vedaCli!.buildVedaArguments({\n backend: options.vedaBackend,\n persona: options.vedaPersona,\n ...(options.model ? { model: options.model } : {}),\n ...(thinking ? { thinking } : {}),\n tools: options.tools,\n // Isolate selection and conversation state per child run so\n // parallel Fabric agents never share Veda session state.\n session: `fabric-${options.id}`,\n })\n : piArguments;\n const childBinary =\n options.runner === \"claude\"\n ? options.claudeBinary\n : options.runner === \"veda\"\n ? options.vedaBinary\n : options.piBinary;\n\n const child = spawnCli(childBinary, childArguments, {\n cwd: options.cwd,\n detached: process.platform !== \"win32\",\n env: {\n ...process.env,\n ...(options.inheritedSessionPins && options.inheritedSessionPins.length > 0\n ? {\n PI_MULTIPROVIDER_SESSION_PINS: JSON.stringify(options.inheritedSessionPins),\n }\n : {}),\n PI_FABRIC_DEPTH: String(options.depth),\n PI_FABRIC_PARENT_RUN: options.id,\n PI_FABRIC_AGENT_NAME: options.name,\n ...(options.mainAgentId ? { PI_FABRIC_MAIN_AGENT_ID: options.mainAgentId } : {}),\n ...(options.fabricSessionId ? { PI_FABRIC_SESSION_ID: options.fabricSessionId } : {}),\n PI_FABRIC_GRANTED_RISKS: options.grantedRisks.join(\",\"),\n PI_FABRIC_FULL_CODE_MODE: String(options.fullCodeMode),\n // Never leak an ambient native-kernel selector into a non-Fabric runner.\n PI_FABRIC_KERNEL: options.kernel,\n PI_FABRIC_PYTHON_RUNTIME: options.pythonRuntime,\n // Native tool allowlist for nested-call enforcement: full-code children\n // reach pi.* through fabric_exec, which is not gated by the --tools\n // allowlist, so both Pi and captured-tool providers enforce this\n // child-side allowlist before preparation, discovery, and invocation.\n PI_FABRIC_TOOL_ALLOWLIST: JSON.stringify(options.tools),\n ...(options.actorId ? { PI_FABRIC_ACTOR_ID: options.actorId } : {}),\n ...(options.actorName ? { PI_FABRIC_ACTOR_NAME: options.actorName } : {}),\n PI_FABRIC_CAPABILITY_REQUIREMENTS: JSON.stringify(\n options.capabilityRequirements ?? [],\n ),\n PI_FABRIC_CAPABILITY_DIGEST: options.capabilityDigest ?? \"\",\n ...(options.meshRoot ? { PI_FABRIC_MESH_ROOT: options.meshRoot } : {}),\n ...(options.projectRoot ? { PI_FABRIC_PROJECT_ROOT: options.projectRoot } : {}),\n ...(options.ownerHostId ? { PI_FABRIC_OWNER_HOST_ID: options.ownerHostId } : {}),\n ...(options.ownerIdentityId\n ? { PI_FABRIC_OWNER_IDENTITY_ID: options.ownerIdentityId }\n : {}),\n ...(options.runRoot ? { PI_FABRIC_RUN_ROOT: options.runRoot } : {}),\n },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stderr = \"\";\n let outputBuffer = \"\";\n // Veda emits a single JSON document on stdout (progress goes to stderr, and\n // with --json progress is suppressed entirely). Buffer it raw and parse it\n // once the child closes instead of treating stdout as NDJSON lines.\n let vedaOutput = \"\";\n let vedaParsed: Record<string, unknown> | undefined;\n const outputDecoder = new StringDecoder(\"utf8\");\n const stderrDecoder = new StringDecoder(\"utf8\");\n let terminalStatus: AgentRunStatus | undefined;\n let terminalError: string | undefined;\n let sawAgentError = false;\n let retryPending = false;\n\n const update = (): void => updateRunRecord(options.statusFile, record);\n\n // Auth checks and model_select hooks can be slow under concurrent launches.\n // Startup and admission share the overall run timeout below, not a shorter cap.\n const modelControl = new PiModelControl(options.id, options.model, thinking, {\n send(frame) {\n if (terminalStatus) return;\n child.stdin?.write(`${JSON.stringify(frame)}\\n`);\n },\n observed(model) {\n if (record.model === model) return;\n record.model = model;\n update();\n },\n admitted(model, effectiveThinking) {\n if (terminalStatus) return;\n if (model) record.model = model;\n if ([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"].includes(effectiveThinking ?? \"\")) {\n record.thinking = effectiveThinking as NonNullable<AgentRunRecord[\"thinking\"]>;\n }\n update();\n child.stdin?.write(`${JSON.stringify({ type: \"prompt\", message: task, ...(images.length > 0 ? { images } : {}) })}\\n`);\n },\n fail(error) {\n if (terminalStatus) return;\n terminalStatus = \"failed\";\n terminalError = error;\n record.error = error;\n update();\n appendLog(`${JSON.stringify({ type: \"fabric_model_error\", requestedModel: options.model, model: record.model, error })}\\n`);\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n child.stdin?.end();\n },\n });\n\n // Attributed token telemetry. Every usage-bearing child event emits one\n // tokens.usage lifecycle entry identified by this run/actor/runner/depth.\n // The manager drains these alongside the pi.* lifecycle stream and appends\n // them to the budget ledger, replacing the old per-settle flat attribution.\n const lastEmittedUsage = emptyUsage();\n const emitTokenUsage = (\n delta?: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n },\n attribution?: { model?: string | undefined; provider?: string | undefined },\n ): void => {\n const snapshot = record.usage;\n if (\n snapshot.input === lastEmittedUsage.input &&\n snapshot.output === lastEmittedUsage.output &&\n snapshot.cacheRead === lastEmittedUsage.cacheRead &&\n snapshot.cacheWrite === lastEmittedUsage.cacheWrite &&\n snapshot.cost === lastEmittedUsage.cost\n ) {\n return;\n }\n emitLifecycle(\"tokens.usage\", {\n runId: options.id,\n name: options.name,\n runner: options.runner,\n depth: options.depth,\n ...(options.actorId ? { actorId: options.actorId } : {}),\n ...(options.actorName ? { actorName: options.actorName } : {}),\n cumulativeTokens:\n snapshot.input + snapshot.output + snapshot.cacheRead + snapshot.cacheWrite,\n input: delta?.input ?? 0,\n output: delta?.output ?? 0,\n cacheRead: delta?.cacheRead ?? 0,\n cacheWrite: delta?.cacheWrite ?? 0,\n cost: delta?.cost ?? snapshot.cost,\n });\n // Mirror the emitted payload into the pi-format usage export (when the\n // host enabled agents.sessionExport) so tokscale/ccusage can attribute\n // subagent tokens and cost. Export intentionally never writes content.\n sessionExporter?.push(\n {\n input: delta?.input ?? 0,\n output: delta?.output ?? 0,\n cacheRead: delta?.cacheRead ?? 0,\n cacheWrite: delta?.cacheWrite ?? 0,\n cost: delta?.cost ?? snapshot.cost,\n },\n attribution?.model ?? record.model ?? options.model,\n attribution?.provider,\n );\n lastEmittedUsage.input = snapshot.input;\n lastEmittedUsage.output = snapshot.output;\n lastEmittedUsage.cacheRead = snapshot.cacheRead;\n lastEmittedUsage.cacheWrite = snapshot.cacheWrite;\n lastEmittedUsage.cost = snapshot.cost;\n };\n\n const { ChildCompactControl } = await loadCompactControl();\n const compactControl = new ChildCompactControl(options.id, {\n send(frame) {\n if (!child.stdin || child.stdin.writableEnded || child.stdin.destroyed) {\n throw new Error(\"Child Pi stdin closed before compaction could start\");\n }\n child.stdin.write(`${JSON.stringify(frame)}\\n`);\n },\n close() {\n child.stdin?.end();\n },\n update(status) {\n record.compaction = status;\n update();\n },\n });\n\n // Preemptive per-child token guard. timeoutMs bounds wall time and budgetUsd\n // bounds cost, but a single runaway child can still blow its own context\n // before Pi core compacts. When maxTokens is set and the child's cumulative\n // token usage crosses it, terminate the child like a timeout so the run\n // settles with a terminal status instead of burning to the hour deadline.\n // The error string is model-facing: the parent agent reads it verbatim, so it\n // must name the config key and remedy, and front-load the numbers before TUI\n // truncation.\n const enforceTokenLimit = (): void => {\n if (terminalStatus || !options.maxTokens || options.maxTokens <= 0) return;\n const total =\n record.usage.input +\n record.usage.output +\n record.usage.cacheRead +\n record.usage.cacheWrite;\n if (total <= options.maxTokens) return;\n terminalStatus = \"timed_out\";\n terminalError =\n `Fabric token limit reached: ${total} tokens (limit ${options.maxTokens} set by agents.maxTokensPerChild); terminating child. ` +\n `The count is cumulative across the run and includes cache reads/writes, so it grows every turn; ` +\n `raise or disable agents.maxTokensPerChild in /fabric settings (0 disables), or split the task into smaller agent runs.`;\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n child.stdin?.end();\n };\n\n type ClaudeInputKind = \"initial\" | \"steer\" | \"follow_up\";\n const claudeTools = new Map<string, string>();\n const claudeCompletedUsage = emptyUsage();\n const claudeCurrentUsage = emptyUsage();\n const syncClaudeUsage = (): void => {\n record.usage = {\n input: claudeCompletedUsage.input + claudeCurrentUsage.input,\n output: claudeCompletedUsage.output + claudeCurrentUsage.output,\n cacheRead: claudeCompletedUsage.cacheRead + claudeCurrentUsage.cacheRead,\n cacheWrite: claudeCompletedUsage.cacheWrite + claudeCurrentUsage.cacheWrite,\n cost: claudeCompletedUsage.cost,\n };\n };\n\n const claudeSentInputs: Array<{ kind: ClaudeInputKind; message: string }> = [];\n const claudeSteering: string[] = [];\n const claudeFollowUps: string[] = [];\n let claudeSteeringMode: \"all\" | \"one-at-a-time\" = \"one-at-a-time\";\n let claudeFollowUpMode: \"all\" | \"one-at-a-time\" = \"one-at-a-time\";\n let claudeCanFollowUp = false;\n let claudeResultSeen = false;\n const enqueueClaudeControl = (queue: string[], message: string): void => {\n const pendingInputs = claudeSentInputs.length + claudeSteering.length + claudeFollowUps.length;\n if (pendingInputs >= MAX_CLAUDE_PENDING_INPUTS) return;\n queue.push(message);\n };\n let claudeCloseTimer: NodeJS.Timeout | undefined;\n\n const updateClaudeQueue = (): void => {\n const sentSteering = claudeSentInputs\n .filter((entry) => entry.kind === \"steer\")\n .map((entry) => entry.message);\n const sentFollowUps = claudeSentInputs\n .filter((entry) => entry.kind === \"follow_up\")\n .map((entry) => entry.message);\n record.pendingMessages = {\n steering: [...sentSteering, ...claudeSteering],\n followUp: [...sentFollowUps, ...claudeFollowUps],\n };\n update();\n };\n\n const writeClaudeInput = (\n kind: ClaudeInputKind,\n message: string,\n inputImages: readonly ImageContent[] = [],\n ): void => {\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n claudeCloseTimer = undefined;\n if (!child.stdin || child.stdin.writableEnded || child.stdin.destroyed) return;\n claudeSentInputs.push({ kind, message });\n if (kind === \"follow_up\") claudeCanFollowUp = false;\n child.stdin.write(\n `${JSON.stringify(claudeCli!.claudeUserMessage(message, inputImages))}\\n`,\n );\n updateClaudeQueue();\n };\n\n const flushClaudeSteering = (): void => {\n if (claudeSteering.length === 0) return;\n const alreadySent = claudeSentInputs.some((entry) => entry.kind === \"steer\");\n if (claudeSteeringMode === \"one-at-a-time\" && alreadySent) return;\n const count = claudeSteeringMode === \"all\" ? claudeSteering.length : 1;\n for (const message of claudeSteering.splice(0, count)) {\n writeClaudeInput(\"steer\", message);\n }\n };\n\n const flushClaudeFollowUps = (): void => {\n if (claudeFollowUps.length === 0 || claudeSteering.length > 0) return;\n if (claudeSentInputs.some((entry) => entry.kind === \"steer\")) return;\n const alreadySent = claudeSentInputs.some((entry) => entry.kind === \"follow_up\");\n if (claudeFollowUpMode === \"one-at-a-time\" && alreadySent) return;\n const count = claudeFollowUpMode === \"all\" ? claudeFollowUps.length : 1;\n for (const message of claudeFollowUps.splice(0, count)) {\n writeClaudeInput(\"follow_up\", message);\n }\n };\n\n const scheduleClaudeClose = (): void => {\n if (claudeCloseTimer || terminalStatus) return;\n claudeCloseTimer = setTimeout(() => {\n claudeCloseTimer = undefined;\n if (\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0\n ) {\n child.stdin?.end();\n }\n }, 300);\n claudeCloseTimer.unref();\n };\n\n const processClaudeEvent = (event: Record<string, unknown>): void => {\n if (event.type === \"system\" && event.subtype === \"init\") {\n const sessionId = stringField(event.session_id);\n if (sessionId) record.runnerSessionId = sessionId;\n const model = stringField(event.model);\n if (model && !record.model) record.model = model;\n update();\n return;\n }\n if (event.type === \"assistant\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const assistant = message as Record<string, unknown>;\n const text = extractText(assistant);\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const content = assistant.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null || Array.isArray(block)) continue;\n const part = block as Record<string, unknown>;\n if (part.type !== \"tool_use\") continue;\n const id = stringField(part.id);\n const name = stringField(part.name);\n if (!id || !name || claudeTools.has(id)) continue;\n claudeTools.set(id, name);\n while (claudeTools.size > MAX_CLAUDE_PENDING_TOOLS) {\n const oldestToolId = claudeTools.keys().next().value;\n if (oldestToolId === undefined) break;\n claudeTools.delete(oldestToolId);\n }\n record.toolCalls++;\n record.currentTool = name;\n process.stdout.write(`\u2192 ${name}\\n`);\n }\n }\n const usage = assistant.usage;\n if (typeof usage === \"object\" && usage !== null && !Array.isArray(usage)) {\n const values = usage as Record<string, unknown>;\n const delta = {\n input: numberField(values.input_tokens),\n output: numberField(values.output_tokens),\n cacheRead: numberField(values.cache_read_input_tokens),\n cacheWrite: numberField(values.cache_creation_input_tokens),\n cost: 0,\n };\n claudeCurrentUsage.input += delta.input;\n claudeCurrentUsage.output += delta.output;\n claudeCurrentUsage.cacheRead += delta.cacheRead;\n claudeCurrentUsage.cacheWrite += delta.cacheWrite;\n syncClaudeUsage();\n emitTokenUsage(delta, { model: record.model ?? stringField(event.model) });\n }\n if (typeof event.error === \"string\") {\n sawAgentError = true;\n terminalError = event.error;\n }\n enforceTokenLimit();\n update();\n return;\n }\n if (event.type === \"user\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const content = (message as Record<string, unknown>).content;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (typeof block !== \"object\" || block === null || Array.isArray(block)) continue;\n const part = block as Record<string, unknown>;\n if (part.type !== \"tool_result\") continue;\n const id = stringField(part.tool_use_id);\n if (id) claudeTools.delete(id);\n }\n const current = [...claudeTools.values()].at(-1);\n if (current) record.currentTool = current;\n else delete record.currentTool;\n update();\n return;\n }\n if (event.type === \"stream_event\") {\n const streamEvent = event.event;\n if (typeof streamEvent !== \"object\" || streamEvent === null || Array.isArray(streamEvent)) return;\n const stream = streamEvent as Record<string, unknown>;\n if (stream.type !== \"content_block_start\") return;\n const contentBlock = stream.content_block;\n if (typeof contentBlock !== \"object\" || contentBlock === null || Array.isArray(contentBlock)) return;\n const block = contentBlock as Record<string, unknown>;\n const name = stringField(block.name);\n if (block.type === \"tool_use\" && name) {\n record.currentTool = name;\n update();\n }\n return;\n }\n if (event.type !== \"result\") return;\n claudeResultSeen = true;\n const sessionId = stringField(event.session_id);\n if (sessionId) record.runnerSessionId = sessionId;\n const resultText = typeof event.result === \"string\" ? event.result : \"\";\n if (resultText) record.text = latestRunText(resultText);\n if (event.structured_output !== undefined) record.value = event.structured_output;\n record.turns += Math.max(0, Math.floor(numberField(event.num_turns)));\n const resultUsage =\n typeof event.usage === \"object\" && event.usage !== null && !Array.isArray(event.usage)\n ? (event.usage as Record<string, unknown>)\n : undefined;\n // The result frame supersedes the assistant-frame stream for this turn:\n // fold any unreported assistant tokens into the result delta so cumulative\n // attribution stays exact without double-counting assistant emissions.\n const resultDelta = resultUsage\n ? {\n input: numberField(resultUsage.input_tokens) - claudeCurrentUsage.input,\n output: numberField(resultUsage.output_tokens) - claudeCurrentUsage.output,\n cacheRead:\n numberField(resultUsage.cache_read_input_tokens) - claudeCurrentUsage.cacheRead,\n cacheWrite:\n numberField(resultUsage.cache_creation_input_tokens) - claudeCurrentUsage.cacheWrite,\n cost: Math.max(0, numberField(event.total_cost_usd)),\n }\n : { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: Math.max(0, numberField(event.total_cost_usd)) };\n claudeCompletedUsage.input += resultUsage\n ? numberField(resultUsage.input_tokens)\n : claudeCurrentUsage.input;\n claudeCompletedUsage.output += resultUsage\n ? numberField(resultUsage.output_tokens)\n : claudeCurrentUsage.output;\n claudeCompletedUsage.cacheRead += resultUsage\n ? numberField(resultUsage.cache_read_input_tokens)\n : claudeCurrentUsage.cacheRead;\n claudeCompletedUsage.cacheWrite += resultUsage\n ? numberField(resultUsage.cache_creation_input_tokens)\n : claudeCurrentUsage.cacheWrite;\n claudeCompletedUsage.cost += Math.max(0, numberField(event.total_cost_usd));\n claudeCurrentUsage.input = 0;\n claudeCurrentUsage.output = 0;\n claudeCurrentUsage.cacheRead = 0;\n claudeCurrentUsage.cacheWrite = 0;\n syncClaudeUsage();\n emitTokenUsage(resultDelta, { model: record.model ?? stringField(event.model) });\n enforceTokenLimit();\n const failed = event.is_error === true || event.subtype !== \"success\";\n if (failed) {\n sawAgentError = true;\n const errors = Array.isArray(event.errors)\n ? event.errors.filter((value): value is string => typeof value === \"string\").join(\" \u00B7 \")\n : \"\";\n terminalError = errors || resultText || `Claude returned ${String(event.subtype ?? \"an error\")}`;\n claudeSteering.splice(0);\n claudeFollowUps.splice(0);\n } else {\n sawAgentError = false;\n if (!terminalStatus) terminalError = undefined;\n }\n if (failed || terminalStatus) claudeSentInputs.splice(0);\n else claudeSentInputs.shift();\n claudeCanFollowUp = !failed && !terminalStatus;\n delete record.currentTool;\n updateClaudeQueue();\n if (failed || terminalStatus) {\n child.stdin?.end();\n return;\n }\n flushClaudeSteering();\n if (claudeSentInputs.length === 0 && claudeSteering.length === 0) {\n flushClaudeFollowUps();\n }\n if (\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0\n ) {\n scheduleClaudeClose();\n }\n };\n\n const processEvent = (line: string): void => {\n if (process.env.PI_FABRIC_INJECT_CRASH === \"stream\") throw new Error(\"simulated stream crash\");\n if (!line.trim()) return;\n appendLog(`${line}\\n`);\n sessionStream?.write(`${line}\\n`);\n let event: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(line);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return;\n event = parsed as Record<string, unknown>;\n } catch {\n return;\n }\n if (options.runner === \"claude\") {\n processClaudeEvent(event);\n return;\n }\n compactControl.observe(event);\n if (modelControl.observe(event)) return;\n if (event.type === \"message_start\" || event.type === \"message_update\") {\n const message = event.message;\n if (typeof message === \"object\" && message !== null && !Array.isArray(message)) {\n modelControl.observeAssistant(message as Record<string, unknown>);\n }\n }\n if (event.type === \"agent_start\") {\n emitLifecycle(\"pi.agent_start\");\n retryPending = false;\n sawAgentError = false;\n if (!terminalStatus) terminalError = undefined;\n return;\n }\n if (event.type === \"response\" && event.command === \"prompt\" && event.success === false) {\n sawAgentError = true;\n if (!terminalStatus) terminalError = typeof event.error === \"string\" ? event.error : \"Pi rejected the prompt\";\n child.stdin?.end();\n return;\n }\n if (event.type === \"extension_ui_request\") {\n const method = event.method;\n if (\n typeof event.id === \"string\" &&\n (method === \"select\" || method === \"confirm\" || method === \"input\" || method === \"editor\")\n ) {\n child.stdin?.write(\n `${JSON.stringify({ type: \"extension_ui_response\", id: event.id, cancelled: true })}\\n`,\n );\n }\n return;\n }\n if (event.type === \"tool_execution_start\") {\n record.toolCalls++;\n if (typeof event.toolName === \"string\") {\n record.currentTool = event.toolName;\n process.stdout.write(`\u2192 ${event.toolName}\\n`);\n }\n update();\n return;\n }\n if (event.type === \"tool_execution_end\") {\n if (event.isError === true) {\n emitLifecycle(\"pi.tool_error\", {\n ...(typeof event.toolCallId === \"string\" ? { toolCallId: event.toolCallId } : {}),\n ...(typeof event.toolName === \"string\" ? { toolName: event.toolName } : {}),\n });\n }\n delete record.currentTool;\n update();\n return;\n }\n if (event.type === \"turn_end\") {\n emitLifecycle(\"pi.turn_end\", {\n ...(typeof event.turnIndex === \"number\" ? { turnIndex: event.turnIndex } : {}),\n });\n record.turns++;\n update();\n return;\n }\n if (event.type === \"queue_update\") {\n const steering = Array.isArray(event.steering)\n ? event.steering.filter((value): value is string => typeof value === \"string\")\n : [];\n const followUp = Array.isArray(event.followUp)\n ? event.followUp.filter((value): value is string => typeof value === \"string\")\n : [];\n record.pendingMessages = { steering, followUp };\n update();\n return;\n }\n if (event.type === \"message_end\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const messageRecord = message as Record<string, unknown>;\n if (messageRecord.role !== \"assistant\") return;\n const text = extractText(messageRecord);\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const usageDelta = extractUsageDelta(messageRecord);\n applyUsage(record, messageRecord);\n emitTokenUsage(usageDelta, {\n model: stringField(messageRecord.model),\n provider: stringField(messageRecord.provider),\n });\n modelControl.observeAssistant(messageRecord);\n enforceTokenLimit();\n if (messageRecord.stopReason === \"error\" && !terminalStatus) {\n sawAgentError = true;\n terminalError = assistantError(messageRecord);\n } else {\n sawAgentError = false;\n // Once a terminal cause is set (e.g. the per-child token guard), keep it;\n // a later non-error message_end must not clobber the reason we are\n // terminating for.\n if (!terminalStatus) terminalError = undefined;\n }\n update();\n return;\n }\n if (event.type === \"agent_end\") {\n emitLifecycle(\"pi.agent_end\", { willRetry: event.willRetry === true });\n retryPending = event.willRetry === true;\n return;\n }\n if (event.type === \"agent_settled\") {\n emitLifecycle(\"pi.agent_settled\");\n if (!retryPending) {\n // Pull controls that landed with the final stream events before deciding\n // whether this one-shot child can close. A queued compact keeps stdin\n // open until its correlated response and compaction_end are observed.\n pollSteer();\n compactControl.childSettled();\n }\n return;\n }\n if (event.type === \"compaction_end\") {\n emitLifecycle(\"pi.session_compact\", {\n ...(typeof event.reason === \"string\" ? { reason: event.reason } : {}),\n ...(typeof event.willRetry === \"boolean\" ? { willRetry: event.willRetry } : {}),\n });\n return;\n }\n if (event.type === \"extension_error\") {\n const error = typeof event.error === \"string\" ? event.error : \"Extension error\";\n stderr = `${stderr}\\n${error}`.trim().slice(-MAX_STDERR_CHARS);\n update();\n }\n };\n\n child.stdin?.on(\"error\", () => {});\n if (options.runner === \"claude\") {\n writeClaudeInput(\"initial\", task, images);\n } else if (options.runner === \"veda\") {\n // Veda reads the prompt from stdin when no positional prompt is given.\n // Mirror its <system_instructions> wrapping so systemPrompt and schema\n // instructions reach the backend model.\n const sections: string[] = [];\n if (options.systemPrompt) {\n sections.push(`<system_instructions>\\n${options.systemPrompt}\\n</system_instructions>`);\n }\n if (schema) {\n sections.push(\n `Your final response must contain only JSON matching this schema, without Markdown fences:\\n${schema}`,\n );\n }\n sections.push(task);\n child.stdin?.write(sections.join(\"\\n\\n\"));\n child.stdin?.end();\n } else {\n modelControl.start();\n }\n\n // Tail a control file (steer.jsonl) the parent appends to and forward each\n // queued command to the child pi over its RPC stdin. This is the fabric\n // steering channel: the orchestrator (or any peer via the mesh relay) can\n // interject a steer / follow_up / queue-mode command between the child's\n // turns without stopping and respawning it, preserving its context. The\n // poller is best-effort: a closed or ended stdin (settled/stopped child) is\n // swallowed so a late steer never crashes the worker.\n let steerOffset = 0;\n let steerRemainder = Buffer.alloc(0);\n let skippingOversizedSteerLine = false;\n const pollSteer = (): void => {\n if (!options.steerFile || terminalStatus || (options.runner === \"pi\" && !modelControl.ready)) return;\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(options.steerFile, \"r\");\n } catch {\n return;\n }\n try {\n const size = fs.fstatSync(descriptor).size;\n if (size < steerOffset) {\n steerOffset = 0;\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = false;\n }\n if (size <= steerOffset) return;\n const length = Math.min(size - steerOffset, STEER_READ_CHUNK_BYTES);\n const buffer = Buffer.allocUnsafe(length);\n const bytesRead = fs.readSync(descriptor, buffer, 0, length, steerOffset);\n steerOffset += bytesRead;\n let combined = Buffer.concat([steerRemainder, buffer.subarray(0, bytesRead)]);\n if (skippingOversizedSteerLine) {\n const skippedLineEnd = combined.indexOf(0x0a);\n if (skippedLineEnd < 0) return;\n combined = combined.subarray(skippedLineEnd + 1);\n skippingOversizedSteerLine = false;\n }\n const newline = combined.lastIndexOf(0x0a);\n if (newline < 0) {\n if (combined.length > MAX_STEER_LINE_BYTES) {\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = true;\n } else {\n steerRemainder = Buffer.from(combined);\n }\n return;\n }\n const remainder = combined.subarray(newline + 1);\n if (remainder.length > MAX_STEER_LINE_BYTES) {\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = true;\n } else {\n steerRemainder = Buffer.from(remainder);\n }\n let processedCommands = 0;\n for (const raw of combined.subarray(0, newline + 1).toString(\"utf8\").split(\"\\n\")) {\n if (processedCommands >= MAX_STEER_COMMANDS_PER_POLL) break;\n if (Buffer.byteLength(raw, \"utf8\") > MAX_STEER_LINE_BYTES) continue;\n const line = raw.trim();\n if (!line) continue;\n processedCommands += 1;\n let command: { type?: string; message?: string; mode?: string; instructions?: string };\n try {\n command = JSON.parse(line);\n } catch {\n continue;\n }\n try {\n if (options.runner === \"claude\") {\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n claudeCloseTimer = undefined;\n if (command.type === \"steer\" && typeof command.message === \"string\") {\n enqueueClaudeControl(claudeSteering, command.message);\n flushClaudeSteering();\n } else if (command.type === \"follow_up\" && typeof command.message === \"string\") {\n enqueueClaudeControl(claudeFollowUps, command.message);\n if (claudeCanFollowUp && claudeSentInputs.length === 0) flushClaudeFollowUps();\n } else if (\n command.type === \"set_steering_mode\" &&\n (command.mode === \"all\" || command.mode === \"one-at-a-time\")\n ) {\n claudeSteeringMode = command.mode;\n flushClaudeSteering();\n } else if (\n command.type === \"set_follow_up_mode\" &&\n (command.mode === \"all\" || command.mode === \"one-at-a-time\")\n ) {\n claudeFollowUpMode = command.mode;\n if (claudeCanFollowUp && claudeSentInputs.length === 0) flushClaudeFollowUps();\n }\n updateClaudeQueue();\n } else if (options.runner === \"veda\") {\n // Steering is unsupported for the veda runner: Veda executes one\n // headless prompt per invocation. The command is dropped, never\n // forwarded to pi-style stdin frames.\n } else if (command.type === \"steer\" && typeof command.message === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"steer\", message: command.message }) + \"\\n\");\n } else if (command.type === \"follow_up\" && typeof command.message === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"follow_up\", message: command.message }) + \"\\n\");\n } else if (command.type === \"set_steering_mode\" && typeof command.mode === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"set_steering_mode\", mode: command.mode }) + \"\\n\");\n } else if (command.type === \"set_follow_up_mode\" && typeof command.mode === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"set_follow_up_mode\", mode: command.mode }) + \"\\n\");\n } else if (command.type === \"compact\") {\n compactControl.queue(command.instructions);\n }\n } catch {\n /* stdin closed (settled/stopped child); a late steer is dropped */\n }\n }\n } finally {\n fs.closeSync(descriptor);\n }\n };\n const steerTimer = options.steerFile ? setInterval(pollSteer, 200) : undefined;\n steerTimer?.unref?.();\n\n const failOversizedEvent = (line: string): void => {\n const prefix = line.slice(0, MAX_EVENT_LINE_CHARS);\n let artifactPath: string | undefined;\n try {\n artifactPath = path.join(path.dirname(options.logFile), \"oversized-event-prefix.txt\");\n fs.writeFileSync(artifactPath, prefix, { encoding: \"utf8\", mode: 0o600 });\n } catch {\n artifactPath = undefined;\n }\n terminalStatus = \"failed\";\n terminalError = artifactPath\n ? `Agent emitted an oversized event line; first ${prefix.length} characters saved to: ${artifactPath}`\n : \"Agent emitted an oversized event line\";\n outputBuffer = \"\";\n terminateChild(child, \"SIGTERM\");\n };\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n const decoded = outputDecoder.write(chunk);\n if (options.runner === \"veda\") {\n vedaOutput += decoded;\n return;\n }\n outputBuffer += decoded;\n while (true) {\n const newline = outputBuffer.indexOf(\"\\n\");\n if (newline < 0) {\n // A partial line past the cap is already anomalous: fail with bounded\n // evidence instead of growing the buffer. Redaction cannot decide this\n // - it collapses any long base64-alphabet run, including plain text,\n // which would let an unbounded line slip through as 'recovered'.\n if (outputBuffer.length > MAX_EVENT_LINE_CHARS) failOversizedEvent(outputBuffer);\n break;\n }\n if (newline > MAX_EVENT_LINE_CHARS) {\n // A complete oversized line fails on its raw length: the raw prefix is\n // the evidence, and redaction is not a licence to keep the run alive.\n failOversizedEvent(outputBuffer.slice(0, newline));\n return;\n }\n const line = outputBuffer.slice(0, newline).replace(/\\r$/, \"\");\n outputBuffer = outputBuffer.slice(newline + 1);\n processEvent(line);\n }\n });\n const recordStderr = (text: string): void => {\n if (!text) return;\n appendLog(`${JSON.stringify({ type: \"worker_stderr\", text })}\\n`);\n process.stderr.write(text);\n stderr = `${stderr}${text}`.slice(-MAX_STDERR_CHARS);\n };\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n recordStderr(stderrDecoder.write(chunk));\n });\n child.stderr?.on(\"error\", () => {});\n\n const timeout = setTimeout(() => {\n if (terminalStatus) return;\n terminalStatus = \"timed_out\";\n terminalError = `Agent timed out after ${options.timeoutMs}ms`;\n if (options.runner === \"pi\" && !modelControl.ready) {\n terminalError += \"; Pi model admission did not complete; task was not sent\";\n }\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n }, options.timeoutMs);\n timeout.unref();\n\n const stop = (): void => {\n if (terminalStatus) return;\n terminalStatus = \"stopped\";\n terminalError = \"Agent stopped\";\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n };\n process.once(\"SIGTERM\", stop);\n process.once(\"SIGINT\", stop);\n process.once(\"SIGHUP\", stop);\n\n const exitCode = await new Promise<number | null>((resolve) => {\n child.once(\"error\", (error) => {\n terminalStatus = \"failed\";\n terminalError = error.message;\n resolve(null);\n });\n child.once(\"close\", (code) => resolve(code));\n });\n\n if (steerTimer) clearInterval(steerTimer);\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n clearTimeout(timeout);\n if (options.runner === \"pi\" && !modelControl.ready && !terminalStatus) {\n terminalStatus = \"failed\";\n terminalError = `Child Pi exited before requested model admission completed; task was not sent${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`;\n }\n if (process.env.PI_FABRIC_INJECT_CRASH === \"close\") throw new Error(\"simulated close crash\");\n if (options.runner === \"veda\") {\n vedaOutput += outputDecoder.end();\n } else {\n outputBuffer += outputDecoder.end();\n }\n recordStderr(stderrDecoder.end());\n if (options.runner === \"veda\") {\n const trimmed = vedaOutput.trim();\n if (trimmed) {\n try {\n const parsed = parseStructuredValue(trimmed);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n vedaParsed = parsed as Record<string, unknown>;\n const text = stringField(vedaParsed.text) ?? \"\";\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const sessionId = stringField(vedaParsed.sessionId);\n if (sessionId) record.runnerSessionId = sessionId;\n const usage = vedaParsed.usage;\n if (typeof usage === \"object\" && usage !== null && !Array.isArray(usage)) {\n const values = usage as Record<string, unknown>;\n const input = numberField(values.inputTokens);\n const output = numberField(values.outputTokens);\n const cacheRead = numberField(values.cachedTokens);\n const cost = typeof values.costUsd === \"number\" ? values.costUsd : 0;\n record.usage = { input, output, cacheRead, cacheWrite: 0, cost };\n emitTokenUsage({ input, output, cacheRead, cacheWrite: 0, cost }, { model: stringField(vedaParsed.model) });\n }\n const envelopeErrors: string[] = [];\n const error = stringField(vedaParsed.error);\n if (error) envelopeErrors.push(error);\n // navigator-plan gates the response on a <program> design block and\n // the worker persona on a <worker_report>; both exit non-zero and\n // report failure only via design/worker fields, not envelope.error.\n for (const key of [\"design\", \"worker\"] as const) {\n const gate = vedaParsed[key];\n if (typeof gate !== \"object\" || gate === null || Array.isArray(gate)) continue;\n const status = gate as Record<string, unknown>;\n if (status.ok !== false) continue;\n const details = Array.isArray(status.errors)\n ? status.errors.filter((entry): entry is string => typeof entry === \"string\").join(\"; \")\n : [stringField(status.reason), stringField(status.detail)]\n .filter((entry): entry is string => entry !== undefined)\n .join(\": \");\n envelopeErrors.push(`Veda ${key} failed${details ? `: ${details}` : \"\"}`);\n }\n if (envelopeErrors.length > 0) {\n sawAgentError = true;\n terminalError = envelopeErrors.join(\"\\n\");\n }\n record.turns += 1;\n update();\n }\n } catch {\n // Unparseable stdout; the generic failed-record path reports stderr.\n }\n }\n } else if (outputBuffer.trim()) {\n processEvent(outputBuffer);\n }\n record.exitCode = exitCode;\n record.stderr = stderr.slice(-MAX_STDERR_CHARS);\n if (\n record.compaction?.status === \"queued\" ||\n record.compaction?.status === \"in_flight\"\n ) {\n const error = terminalError ?? \"Child Pi exited before the queued compaction completed\";\n record.compaction = {\n ...record.compaction,\n status: \"failed\",\n updatedAt: Date.now(),\n finishedAt: Date.now(),\n error,\n };\n if (!terminalStatus) {\n terminalStatus = \"failed\";\n terminalError = error;\n }\n }\n record.finishedAt = Date.now();\n record.updatedAt = record.finishedAt;\n const childCompleted =\n exitCode === 0 &&\n !sawAgentError &&\n (options.runner === \"pi\" ||\n (options.runner === \"claude\" &&\n claudeResultSeen &&\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0) ||\n (options.runner === \"veda\" && vedaParsed !== undefined));\n record.status = terminalStatus ?? (childCompleted ? \"completed\" : \"failed\");\n if (terminalError) record.error = terminalError;\n if (record.status === \"failed\" && !record.error) {\n record.error =\n stderr.trim() ||\n (exitCode === 0\n ? `${runnerLabel(options.runner)} agent reported an error before exiting`\n : `${runnerLabel(options.runner)} exited with code ${exitCode ?? \"unknown\"}`);\n }\n if (record.status === \"completed\" && options.schemaFile) {\n try {\n const schema = JSON.parse(fs.readFileSync(options.schemaFile, \"utf8\")) as Record<\n string,\n unknown\n >;\n validateAgentResult(record, schema);\n } catch (error) {\n record.status = \"failed\";\n const reason = error instanceof Error ? error.message : String(error);\n const output = record.text.trim();\n const snippet = output.slice(0, 200);\n record.error = `Structured agent output was invalid: ${reason}${snippet ? ` (output: ${snippet}${output.length > 200 ? \"\u2026\" : \"\"})` : \"\"}`;\n }\n }\n delete record.currentTool;\n writeRunRecord(options.statusFile, record);\n terminalWritten = true;\n process.stdout.write(`\\n[pi-fabric] ${record.status}\\n`);\n await new Promise<void>((resolve) =>\n sessionStream ? sessionStream.end(resolve) : resolve(),\n );\n process.exitCode = record.status === \"completed\" ? 0 : 1;\n};\n\nmain().catch((error) => {\n console.error(error instanceof Error ? (error.stack ?? error.message) : String(error));\n writeCrashStatus(error);\n process.exit(1);\n});\n"],
5
- "mappings": ";;;AAEA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,OAAO,gBAAgB;AACvB,SAAS,qBAAqB;AAO9B,IAAM,yBAAyB,oBAAI,IAAI,CAAC,OAAO,QAAQ,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAErF,IAAM,WAAW,CACf,SACA,MACA,YACiB,uBAAuB,IAAI,KAAK,QAAQ,OAAO,EAAE,YAAY,CAAC,IAC7E,WAAW,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI,GAAG,OAAO,IACxD,WAAW,SAAS,CAAC,GAAG,IAAI,GAAG,OAAO;AAU1C,IAAM,yBAAyB,YAA+C;AAC5E,MAAI,CAAC,YAAY,IAAI,SAAS,KAAK,EAAG,QAAO,OAAO,2BAA2B;AAC/E,QAAM,mBAAmB;AACzB,SAAO,OAAO;AAChB;AAIA,IAAM,kBAAkB,YAAwC;AAC9D,MAAI,CAAC,YAAY,IAAI,SAAS,KAAK,EAAG,QAAO,OAAO,oBAAoB;AACxE,QAAM,mBAAmB;AACzB,SAAO,OAAO;AAChB;AAEA,IAAM,oBAAoB,YAA0C;AAClE,MAAI,CAAC,YAAY,IAAI,SAAS,KAAK,EAAG,QAAO,OAAO,qBAAqB;AACzE,QAAM,mBAAmB;AACzB,SAAO,OAAO;AAChB;AAEA,IAAM,sBAAsB,YAA4C;AACtE,MAAI,CAAC,YAAY,IAAI,SAAS,KAAK,EAAG,QAAO,OAAO,wBAAwB;AAC5E,QAAM,mBAAmB;AACzB,SAAO,OAAO;AAChB;AAEA,IAAM,0BAA0B,YAAgD;AAC9E,MAAI,CAAC,YAAY,IAAI,SAAS,KAAK,EAAG,QAAO,OAAO,4BAA4B;AAChF,QAAM,mBAAmB;AACzB,SAAO,OAAO;AAChB;AAEA,IAAM,qBAAqB,YAA2C;AACpE,MAAI,CAAC,YAAY,IAAI,SAAS,KAAK,EAAG,QAAO,OAAO,6BAA6B;AACjF,QAAM,mBAAmB;AACzB,SAAO,OAAO;AAChB;AAEA,IAAM,gBAAgB,YAAsC;AAC1D,MAAI,CAAC,YAAY,IAAI,SAAS,KAAK,EAAG,QAAO,OAAO,wBAAwB;AAC5E,QAAM,mBAAmB;AACzB,SAAO,OAAO;AAChB;AAEA,IAAM,cAAc,YAAoC;AACtD,MAAI,CAAC,YAAY,IAAI,SAAS,KAAK,EAAG,QAAO,OAAO,sBAAsB;AAC1E,QAAM,mBAAmB;AACzB,SAAO,OAAO;AAChB;AAEA,IAAM,mBAAmB;AACzB,IAAM,uBAAuB,IAAI,OAAO;AACxC,IAAM,yBAAyB,MAAM;AACrC,IAAM,uBAAuB,KAAK;AAClC,IAAM,8BAA8B;AACpC,IAAM,4BAA4B;AAClC,IAAM,2BAA2B;AACjC,IAAM,gBAAgB;AAEtB,IAAM,cAAc,CAAC,YAA6C;AAChE,QAAM,UAAU,QAAQ;AACxB,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QACJ;AAAA,IACC,CAAC,SACC,OAAO,SAAS,YAChB,SAAS,QACR,KAAiC,SAAS,UAC3C,OAAQ,KAAiC,SAAS;AAAA,EACtD,EACC,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,EAAE;AACZ;AAEA,IAAM,aAAa,CAAC,aAAiD;AACnE,MAAI,CAAC,SAAU,QAAO,CAAC;AACvB,QAAM,SAAkB,KAAK,MAAM,GAAG,aAAa,UAAU,MAAM,CAAC;AACpE,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,OAAM,IAAI,MAAM,yCAAyC;AACrF,QAAM,SAAyB,CAAC;AAChC,aAAW,SAAS,QAAQ;AAC1B,QACE,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAQ,KAAK,KAClB,MAA6B,SAAS,WACvC,OAAQ,MAA6B,SAAS,YAC9C,OAAQ,MAAiC,aAAa,UACtD;AACA,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AACA,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAO,MAA2B;AAAA,MAClC,UAAW,MAA+B;AAAA,IAC5C,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,IAAM,cAAc,CAAC,UAA4B,OAAO,UAAU,WAAW,QAAQ;AAErF,IAAM,cAAc,CAAC,UACnB,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AAE7D,IAAM,iBAAiB,CAAC,YAA6C;AACnE,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAS,YAAY,QAAQ,YAAY,KAAK,YAAY,QAAQ,KAAK;AAC7E,MAAI,OAAQ,SAAQ,KAAK,MAAM;AAC/B,MAAI,MAAM,QAAQ,QAAQ,WAAW,GAAG;AACtC,eAAW,cAAc,QAAQ,aAAa;AAC5C,UAAI,OAAO,eAAe,YAAY,eAAe,QAAQ,MAAM,QAAQ,UAAU,EAAG;AACxF,YAAM,SAAS;AACf,YAAM,SACJ,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,QAAQ,CAAC,MAAM,QAAQ,OAAO,KAAK,IACnF,OAAO,QACR;AACN,YAAM,SAAS,YAAY,QAAQ,OAAO,KAAK,YAAY,OAAO,OAAO;AACzE,UAAI,OAAQ,SAAQ,KAAK,MAAM;AAAA,IACjC;AAAA,EACF;AACA,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AACnC,QAAM,WAAW,YAAY,QAAQ,QAAQ;AAC7C,QAAM,QAAQ,YAAY,QAAQ,KAAK;AACvC,QAAM,SAAS,CAAC,UAAU,KAAK,EAAE,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EAAE,KAAK,GAAG;AAC5F,QAAM,UAAU,OAAO,KAAK,QAAK,KAAK;AACtC,SAAO,GAAG,SAAS,GAAG,MAAM,OAAO,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,gBAAgB;AAC7E;AAEA,IAAM,cAAc,CAAC,WACnB,WAAW,WAAW,WAAW,WAAW,SAAS,SAAS;AAEhE,IAAM,iBAAiB,CAAC,OAAqB,WAAiC;AAC5E,MAAI,CAAC,MAAM,IAAK;AAChB,MAAI;AACF,YAAQ,KAAK,QAAQ,aAAa,UAAU,MAAM,MAAM,CAAC,MAAM,KAAK,MAAM;AAAA,EAC5E,QAAQ;AAAA,EAA2C;AACrD;AAIA,IAAI;AACJ,IAAI;AACJ,IAAI,kBAAkB;AACtB,IAAM,mBAAmB,CAAC,UAAyB;AACjD,MAAI,CAAC,gBAAgB,CAAC,oBAAoB,gBAAiB;AAC3D,MAAI;AACF,qBAAiB,oBAAoB,aAAa,YAAY,aAAa,QAAQ,KAAK;AAAA,EAC1F,QAAQ;AAAA,EAGR;AACF;AACA,QAAQ,GAAG,qBAAqB,CAAC,UAAU;AACzC,mBAAiB,KAAK;AACtB,UAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,CAAI;AACzF,UAAQ,KAAK,CAAC;AAChB,CAAC;AACD,QAAQ,GAAG,sBAAsB,CAAC,UAAU;AAC1C,mBAAiB,KAAK;AACtB,UAAQ,OAAO,MAAM,wBAAwB,iBAAiB,QAAQ,MAAM,SAAS,MAAM,UAAU,KAAK;AAAA,CAAI;AAC9G,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,IAAM,OAAO,YAA2B;AACtC,QAAM,CAAC,eAAe,wBAAwB,sBAAsB,EAAC,sBAAsB,oBAAmB,GAAG,EAAE,eAAe,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvJ,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,EACzB,CAAC;AACD,qBAAmB;AACnB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,UAAU,cAAc,mBAAmB;AACjD,QAAM,kBAAkB,QAAQ,oBAC5B,IAAI,qBAAqB,gBAAgB;AAAA,IACvC,MAAM,QAAQ;AAAA,IACd,WAAW,QAAQ;AAAA,IACnB,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,EACrB,CAAC,IACD;AACJ,QAAM,WACJ,QAAQ,aAAa,SACrB,QAAQ,aAAa,aACrB,QAAQ,aAAa,SACrB,QAAQ,aAAa,YACrB,QAAQ,aAAa,UACrB,QAAQ,aAAa,WACrB,QAAQ,aAAa,QACjB,QAAQ,WACR;AACN,QAAM,OAAO,GAAG,aAAa,QAAQ,UAAU,MAAM;AACrD,QAAM,SAAS,WAAW,QAAQ,UAAU;AAC5C,QAAM,SAAS,oBAAoB,SAAS,MAAM,UAAU,KAAK,IAAI,CAAC;AACtE,iBAAe,QAAQ,YAAY,MAAM;AACzC,QAAM,gBAAgB,CACpB,OACA,SACS;AACT,QAAI;AACF,SAAG,UAAU,KAAK,QAAQ,QAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACrE,SAAG;AAAA,QACD,QAAQ;AAAA,QACR,KAAK,UAAU,EAAE,SAAS,GAAG,OAAO,YAAY,KAAK,IAAI,GAAG,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG,CAAC,IAAI;AAAA,QAC3F,EAAE,UAAU,QAAQ,MAAM,IAAM;AAAA,MAClC;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,iBAAe,EAAE,YAAY,QAAQ,YAAY,OAAO;AACxD,UAAQ,OAAO,MAAM,eAAe,QAAQ,IAAI;AAAA,EAAK,IAAI;AAAA;AAAA,CAAM;AAC/D,KAAG,UAAU,KAAK,QAAQ,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAI/D,QAAM,YAAY,CAAC,SAAuB;AACxC,QAAI;AACF,SAAG,eAAe,QAAQ,SAAS,MAAM,EAAE,UAAU,QAAQ,MAAM,IAAM,CAAC;AAAA,IAC5E,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,gBACJ,QAAQ,WAAW,YAAY,QAAQ,cACnC,GAAG,kBAAkB,QAAQ,aAAa,EAAE,OAAO,KAAK,MAAM,IAAM,CAAC,IACrE;AACN,iBAAe,GAAG,SAAS,MAAM;AAAA,EAAC,CAAC;AAEnC,QAAM,SAAS,QAAQ,aACnB,GAAG,aAAa,QAAQ,YAAY,MAAM,IAC1C;AACJ,QAAM,cAAc,CAAC,UAAU,KAAK;AACpC,MAAI,QAAQ,YAAa,aAAY,KAAK,aAAa,QAAQ,WAAW;AAAA,MACrE,aAAY,KAAK,cAAc;AACpC,MAAI,CAAC,QAAQ,WAAY,aAAY,KAAK,iBAAiB;AAC3D,MAAI,QAAQ,oBAAqB,aAAY,KAAK,MAAM,QAAQ,mBAAmB;AACnF,MAAI,QAAQ,MAAM,SAAS,EAAG,aAAY,KAAK,WAAW,QAAQ,MAAM,KAAK,GAAG,CAAC;AAAA,MAC5E,aAAY,KAAK,YAAY;AAClC,MAAI,QAAQ,MAAO,aAAY,KAAK,WAAW,QAAQ,KAAK;AAC5D,MAAI,SAAU,aAAY,KAAK,cAAc,QAAQ;AACrD,MAAI,QAAQ,aAAc,aAAY,KAAK,0BAA0B,QAAQ,YAAY;AACzF,MAAI,QAAQ;AACV,gBAAY;AAAA,MACV;AAAA,MACA;AAAA,EAA8F,MAAM;AAAA,IACtG;AAAA,EACF;AACA,QAAM,YAAY,QAAQ,WAAW,WAAW,MAAM,cAAc,IAAI;AACxE,QAAM,UAAU,QAAQ,WAAW,SAAS,MAAM,YAAY,IAAI;AAClE,QAAM,iBACJ,QAAQ,WAAW,WACf,UAAW,qBAAqB;AAAA,IAC9B,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,mBAAmB,QAAQ,QAAQ,WAAW;AAAA,IAC9C,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChD,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,GAAI,QAAQ,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,IACrE,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3B,GAAI,QAAQ,kBAAkB,EAAE,iBAAiB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,IAC9E,MAAM,QAAQ;AAAA,EAChB,CAAC,IACD,QAAQ,WAAW,SACjB,QAAS,mBAAmB;AAAA,IAC1B,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,IACjB,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChD,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,OAAO,QAAQ;AAAA;AAAA;AAAA,IAGf,SAAS,UAAU,QAAQ,EAAE;AAAA,EAC/B,CAAC,IACD;AACR,QAAM,cACJ,QAAQ,WAAW,WACf,QAAQ,eACR,QAAQ,WAAW,SACjB,QAAQ,aACR,QAAQ;AAEhB,QAAM,QAAQ,SAAS,aAAa,gBAAgB;AAAA,IAClD,KAAK,QAAQ;AAAA,IACb,UAAU,QAAQ,aAAa;AAAA,IAC/B,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,GAAI,QAAQ,wBAAwB,QAAQ,qBAAqB,SAAS,IACtE;AAAA,QACE,+BAA+B,KAAK,UAAU,QAAQ,oBAAoB;AAAA,MAC5E,IACA,CAAC;AAAA,MACL,iBAAiB,OAAO,QAAQ,KAAK;AAAA,MACrC,sBAAsB,QAAQ;AAAA,MAC9B,sBAAsB,QAAQ;AAAA,MAC9B,GAAI,QAAQ,cAAc,EAAE,yBAAyB,QAAQ,YAAY,IAAI,CAAC;AAAA,MAC9E,GAAI,QAAQ,kBAAkB,EAAE,sBAAsB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,MACnF,yBAAyB,QAAQ,aAAa,KAAK,GAAG;AAAA,MACtD,0BAA0B,OAAO,QAAQ,YAAY;AAAA;AAAA,MAErD,kBAAkB,QAAQ;AAAA,MAC1B,0BAA0B,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,MAKlC,0BAA0B,KAAK,UAAU,QAAQ,KAAK;AAAA,MACtD,GAAI,QAAQ,UAAU,EAAE,oBAAoB,QAAQ,QAAQ,IAAI,CAAC;AAAA,MACjE,GAAI,QAAQ,YAAY,EAAE,sBAAsB,QAAQ,UAAU,IAAI,CAAC;AAAA,MACvE,mCAAmC,KAAK;AAAA,QACtC,QAAQ,0BAA0B,CAAC;AAAA,MACrC;AAAA,MACA,6BAA6B,QAAQ,oBAAoB;AAAA,MACzD,GAAI,QAAQ,WAAW,EAAE,qBAAqB,QAAQ,SAAS,IAAI,CAAC;AAAA,MACpE,GAAI,QAAQ,cAAc,EAAE,wBAAwB,QAAQ,YAAY,IAAI,CAAC;AAAA,MAC7E,GAAI,QAAQ,cAAc,EAAE,yBAAyB,QAAQ,YAAY,IAAI,CAAC;AAAA,MAC9E,GAAI,QAAQ,kBACR,EAAE,6BAA6B,QAAQ,gBAAgB,IACvD,CAAC;AAAA,MACL,GAAI,QAAQ,UAAU,EAAE,oBAAoB,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACnE;AAAA,IACA,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,EAChC,CAAC;AACD,MAAI,SAAS;AACb,MAAI,eAAe;AAInB,MAAI,aAAa;AACjB,MAAI;AACJ,QAAM,gBAAgB,IAAI,cAAc,MAAM;AAC9C,QAAM,gBAAgB,IAAI,cAAc,MAAM;AAC9C,MAAI;AACJ,MAAI;AACJ,MAAI,gBAAgB;AACpB,MAAI,eAAe;AAEnB,QAAM,SAAS,MAAY,gBAAgB,QAAQ,YAAY,MAAM;AAIrE,QAAM,eAAe,IAAI,eAAe,QAAQ,IAAI,QAAQ,OAAO,UAAU;AAAA,IAC3E,KAAK,OAAO;AACV,UAAI,eAAgB;AACpB,YAAM,OAAO,MAAM,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAAA,IACjD;AAAA,IACA,SAAS,OAAO;AACd,UAAI,OAAO,UAAU,MAAO;AAC5B,aAAO,QAAQ;AACf,aAAO;AAAA,IACT;AAAA,IACA,SAAS,OAAO,mBAAmB;AACjC,UAAI,eAAgB;AACpB,UAAI,MAAO,QAAO,QAAQ;AAC1B,UAAI,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,SAAS,KAAK,EAAE,SAAS,qBAAqB,EAAE,GAAG;AACjG,eAAO,WAAW;AAAA,MACpB;AACA,aAAO;AACP,YAAM,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,MAAM,UAAU,SAAS,MAAM,GAAI,OAAO,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC,CAAC;AAAA,CAAI;AAAA,IACvH;AAAA,IACA,KAAK,OAAO;AACV,UAAI,eAAgB;AACpB,uBAAiB;AACjB,sBAAgB;AAChB,aAAO,QAAQ;AACf,aAAO;AACP,gBAAU,GAAG,KAAK,UAAU,EAAE,MAAM,sBAAsB,gBAAgB,QAAQ,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAC1H,qBAAe,OAAO,SAAS;AAC/B,iBAAW,MAAM,eAAe,OAAO,SAAS,GAAG,aAAa,EAAE,MAAM;AACxE,YAAM,OAAO,IAAI;AAAA,IACnB;AAAA,EACF,CAAC;AAMD,QAAM,mBAAmB,WAAW;AACpC,QAAM,iBAAiB,CACrB,OAOA,gBACS;AACT,UAAM,WAAW,OAAO;AACxB,QACE,SAAS,UAAU,iBAAiB,SACpC,SAAS,WAAW,iBAAiB,UACrC,SAAS,cAAc,iBAAiB,aACxC,SAAS,eAAe,iBAAiB,cACzC,SAAS,SAAS,iBAAiB,MACnC;AACA;AAAA,IACF;AACA,kBAAc,gBAAgB;AAAA,MAC5B,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,MACtD,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,MAC5D,kBACE,SAAS,QAAQ,SAAS,SAAS,SAAS,YAAY,SAAS;AAAA,MACnE,OAAO,OAAO,SAAS;AAAA,MACvB,QAAQ,OAAO,UAAU;AAAA,MACzB,WAAW,OAAO,aAAa;AAAA,MAC/B,YAAY,OAAO,cAAc;AAAA,MACjC,MAAM,OAAO,QAAQ,SAAS;AAAA,IAChC,CAAC;AAID,qBAAiB;AAAA,MACf;AAAA,QACE,OAAO,OAAO,SAAS;AAAA,QACvB,QAAQ,OAAO,UAAU;AAAA,QACzB,WAAW,OAAO,aAAa;AAAA,QAC/B,YAAY,OAAO,cAAc;AAAA,QACjC,MAAM,OAAO,QAAQ,SAAS;AAAA,MAChC;AAAA,MACA,aAAa,SAAS,OAAO,SAAS,QAAQ;AAAA,MAC9C,aAAa;AAAA,IACf;AACA,qBAAiB,QAAQ,SAAS;AAClC,qBAAiB,SAAS,SAAS;AACnC,qBAAiB,YAAY,SAAS;AACtC,qBAAiB,aAAa,SAAS;AACvC,qBAAiB,OAAO,SAAS;AAAA,EACnC;AAEA,QAAM,EAAE,oBAAoB,IAAI,MAAM,mBAAmB;AACzD,QAAM,iBAAiB,IAAI,oBAAoB,QAAQ,IAAI;AAAA,IACzD,KAAK,OAAO;AACV,UAAI,CAAC,MAAM,SAAS,MAAM,MAAM,iBAAiB,MAAM,MAAM,WAAW;AACtE,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AACA,YAAM,MAAM,MAAM,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAAA,IAChD;AAAA,IACA,QAAQ;AACN,YAAM,OAAO,IAAI;AAAA,IACnB;AAAA,IACA,OAAO,QAAQ;AACb,aAAO,aAAa;AACpB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAUD,QAAM,oBAAoB,MAAY;AACpC,QAAI,kBAAkB,CAAC,QAAQ,aAAa,QAAQ,aAAa,EAAG;AACpE,UAAM,QACJ,OAAO,MAAM,QACb,OAAO,MAAM,SACb,OAAO,MAAM,YACb,OAAO,MAAM;AACf,QAAI,SAAS,QAAQ,UAAW;AAChC,qBAAiB;AACjB,oBACE,+BAA+B,KAAK,kBAAkB,QAAQ,SAAS;AAGzE,mBAAe,OAAO,SAAS;AAC/B,eAAW,MAAM,eAAe,OAAO,SAAS,GAAG,aAAa,EAAE,MAAM;AACxE,UAAM,OAAO,IAAI;AAAA,EACnB;AAGA,QAAM,cAAc,oBAAI,IAAoB;AAC5C,QAAM,uBAAuB,WAAW;AACxC,QAAM,qBAAqB,WAAW;AACtC,QAAM,kBAAkB,MAAY;AAClC,WAAO,QAAQ;AAAA,MACb,OAAO,qBAAqB,QAAQ,mBAAmB;AAAA,MACvD,QAAQ,qBAAqB,SAAS,mBAAmB;AAAA,MACzD,WAAW,qBAAqB,YAAY,mBAAmB;AAAA,MAC/D,YAAY,qBAAqB,aAAa,mBAAmB;AAAA,MACjE,MAAM,qBAAqB;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,mBAAsE,CAAC;AAC7E,QAAM,iBAA2B,CAAC;AAClC,QAAM,kBAA4B,CAAC;AACnC,MAAI,qBAA8C;AAClD,MAAI,qBAA8C;AAClD,MAAI,oBAAoB;AACxB,MAAI,mBAAmB;AACvB,QAAM,uBAAuB,CAAC,OAAiB,YAA0B;AACvE,UAAM,gBAAgB,iBAAiB,SAAS,eAAe,SAAS,gBAAgB;AACxF,QAAI,iBAAiB,0BAA2B;AAChD,UAAM,KAAK,OAAO;AAAA,EACpB;AACA,MAAI;AAEJ,QAAM,oBAAoB,MAAY;AACpC,UAAM,eAAe,iBAClB,OAAO,CAAC,UAAU,MAAM,SAAS,OAAO,EACxC,IAAI,CAAC,UAAU,MAAM,OAAO;AAC/B,UAAM,gBAAgB,iBACnB,OAAO,CAAC,UAAU,MAAM,SAAS,WAAW,EAC5C,IAAI,CAAC,UAAU,MAAM,OAAO;AAC/B,WAAO,kBAAkB;AAAA,MACvB,UAAU,CAAC,GAAG,cAAc,GAAG,cAAc;AAAA,MAC7C,UAAU,CAAC,GAAG,eAAe,GAAG,eAAe;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,CACvB,MACA,SACA,cAAuC,CAAC,MAC/B;AACT,QAAI,iBAAkB,cAAa,gBAAgB;AACnD,uBAAmB;AACnB,QAAI,CAAC,MAAM,SAAS,MAAM,MAAM,iBAAiB,MAAM,MAAM,UAAW;AACxE,qBAAiB,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,QAAI,SAAS,YAAa,qBAAoB;AAC9C,UAAM,MAAM;AAAA,MACV,GAAG,KAAK,UAAU,UAAW,kBAAkB,SAAS,WAAW,CAAC,CAAC;AAAA;AAAA,IACvE;AACA,sBAAkB;AAAA,EACpB;AAEA,QAAM,sBAAsB,MAAY;AACtC,QAAI,eAAe,WAAW,EAAG;AACjC,UAAM,cAAc,iBAAiB,KAAK,CAAC,UAAU,MAAM,SAAS,OAAO;AAC3E,QAAI,uBAAuB,mBAAmB,YAAa;AAC3D,UAAM,QAAQ,uBAAuB,QAAQ,eAAe,SAAS;AACrE,eAAW,WAAW,eAAe,OAAO,GAAG,KAAK,GAAG;AACrD,uBAAiB,SAAS,OAAO;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,uBAAuB,MAAY;AACvC,QAAI,gBAAgB,WAAW,KAAK,eAAe,SAAS,EAAG;AAC/D,QAAI,iBAAiB,KAAK,CAAC,UAAU,MAAM,SAAS,OAAO,EAAG;AAC9D,UAAM,cAAc,iBAAiB,KAAK,CAAC,UAAU,MAAM,SAAS,WAAW;AAC/E,QAAI,uBAAuB,mBAAmB,YAAa;AAC3D,UAAM,QAAQ,uBAAuB,QAAQ,gBAAgB,SAAS;AACtE,eAAW,WAAW,gBAAgB,OAAO,GAAG,KAAK,GAAG;AACtD,uBAAiB,aAAa,OAAO;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAY;AACtC,QAAI,oBAAoB,eAAgB;AACxC,uBAAmB,WAAW,MAAM;AAClC,yBAAmB;AACnB,UACE,iBAAiB,WAAW,KAC5B,eAAe,WAAW,KAC1B,gBAAgB,WAAW,GAC3B;AACA,cAAM,OAAO,IAAI;AAAA,MACnB;AAAA,IACF,GAAG,GAAG;AACN,qBAAiB,MAAM;AAAA,EACzB;AAEA,QAAM,qBAAqB,CAAC,UAAyC;AACnE,QAAI,MAAM,SAAS,YAAY,MAAM,YAAY,QAAQ;AACvD,YAAMA,aAAY,YAAY,MAAM,UAAU;AAC9C,UAAIA,WAAW,QAAO,kBAAkBA;AACxC,YAAM,QAAQ,YAAY,MAAM,KAAK;AACrC,UAAI,SAAS,CAAC,OAAO,MAAO,QAAO,QAAQ;AAC3C,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,UAAU,MAAM;AACtB,UAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,EAAG;AAC/E,YAAM,YAAY;AAClB,YAAM,OAAO,YAAY,SAAS;AAClC,UAAI,MAAM;AACR,eAAO,OAAO,cAAc,IAAI;AAChC,gBAAQ,OAAO,MAAM;AAAA,EAAK,IAAI;AAAA,CAAI;AAAA,MACpC;AACA,YAAM,UAAU,UAAU;AAC1B,UAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,mBAAW,SAAS,SAAS;AAC3B,cAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,EAAG;AACzE,gBAAM,OAAO;AACb,cAAI,KAAK,SAAS,WAAY;AAC9B,gBAAM,KAAK,YAAY,KAAK,EAAE;AAC9B,gBAAM,OAAO,YAAY,KAAK,IAAI;AAClC,cAAI,CAAC,MAAM,CAAC,QAAQ,YAAY,IAAI,EAAE,EAAG;AACzC,sBAAY,IAAI,IAAI,IAAI;AACxB,iBAAO,YAAY,OAAO,0BAA0B;AAClD,kBAAM,eAAe,YAAY,KAAK,EAAE,KAAK,EAAE;AAC/C,gBAAI,iBAAiB,OAAW;AAChC,wBAAY,OAAO,YAAY;AAAA,UACjC;AACA,iBAAO;AACP,iBAAO,cAAc;AACrB,kBAAQ,OAAO,MAAM,UAAK,IAAI;AAAA,CAAI;AAAA,QACpC;AAAA,MACF;AACA,YAAM,QAAQ,UAAU;AACxB,UAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,GAAG;AACxE,cAAM,SAAS;AACf,cAAM,QAAQ;AAAA,UACZ,OAAO,YAAY,OAAO,YAAY;AAAA,UACtC,QAAQ,YAAY,OAAO,aAAa;AAAA,UACxC,WAAW,YAAY,OAAO,uBAAuB;AAAA,UACrD,YAAY,YAAY,OAAO,2BAA2B;AAAA,UAC1D,MAAM;AAAA,QACR;AACA,2BAAmB,SAAS,MAAM;AAClC,2BAAmB,UAAU,MAAM;AACnC,2BAAmB,aAAa,MAAM;AACtC,2BAAmB,cAAc,MAAM;AACvC,wBAAgB;AAChB,uBAAe,OAAO,EAAE,OAAO,OAAO,SAAS,YAAY,MAAM,KAAK,EAAE,CAAC;AAAA,MAC3E;AACA,UAAI,OAAO,MAAM,UAAU,UAAU;AACnC,wBAAgB;AAChB,wBAAgB,MAAM;AAAA,MACxB;AACA,wBAAkB;AAClB,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,SAAS,QAAQ;AACzB,YAAM,UAAU,MAAM;AACtB,UAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,EAAG;AAC/E,YAAM,UAAW,QAAoC;AACrD,UAAI,CAAC,MAAM,QAAQ,OAAO,EAAG;AAC7B,iBAAW,SAAS,SAAS;AAC3B,YAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,EAAG;AACzE,cAAM,OAAO;AACb,YAAI,KAAK,SAAS,cAAe;AACjC,cAAM,KAAK,YAAY,KAAK,WAAW;AACvC,YAAI,GAAI,aAAY,OAAO,EAAE;AAAA,MAC/B;AACA,YAAM,UAAU,CAAC,GAAG,YAAY,OAAO,CAAC,EAAE,GAAG,EAAE;AAC/C,UAAI,QAAS,QAAO,cAAc;AAAA,UAC7B,QAAO,OAAO;AACnB,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,SAAS,gBAAgB;AACjC,YAAM,cAAc,MAAM;AAC1B,UAAI,OAAO,gBAAgB,YAAY,gBAAgB,QAAQ,MAAM,QAAQ,WAAW,EAAG;AAC3F,YAAM,SAAS;AACf,UAAI,OAAO,SAAS,sBAAuB;AAC3C,YAAM,eAAe,OAAO;AAC5B,UAAI,OAAO,iBAAiB,YAAY,iBAAiB,QAAQ,MAAM,QAAQ,YAAY,EAAG;AAC9F,YAAM,QAAQ;AACd,YAAM,OAAO,YAAY,MAAM,IAAI;AACnC,UAAI,MAAM,SAAS,cAAc,MAAM;AACrC,eAAO,cAAc;AACrB,eAAO;AAAA,MACT;AACA;AAAA,IACF;AACA,QAAI,MAAM,SAAS,SAAU;AAC7B,uBAAmB;AACnB,UAAM,YAAY,YAAY,MAAM,UAAU;AAC9C,QAAI,UAAW,QAAO,kBAAkB;AACxC,UAAM,aAAa,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACrE,QAAI,WAAY,QAAO,OAAO,cAAc,UAAU;AACtD,QAAI,MAAM,sBAAsB,OAAW,QAAO,QAAQ,MAAM;AAChE,WAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,MAAM,SAAS,CAAC,CAAC;AACpE,UAAM,cACJ,OAAO,MAAM,UAAU,YAAY,MAAM,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,KAAK,IAChF,MAAM,QACP;AAIN,UAAM,cAAc,cAChB;AAAA,MACE,OAAO,YAAY,YAAY,YAAY,IAAI,mBAAmB;AAAA,MAClE,QAAQ,YAAY,YAAY,aAAa,IAAI,mBAAmB;AAAA,MACpE,WACE,YAAY,YAAY,uBAAuB,IAAI,mBAAmB;AAAA,MACxE,YACE,YAAY,YAAY,2BAA2B,IAAI,mBAAmB;AAAA,MAC5E,MAAM,KAAK,IAAI,GAAG,YAAY,MAAM,cAAc,CAAC;AAAA,IACrD,IACA,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,KAAK,IAAI,GAAG,YAAY,MAAM,cAAc,CAAC,EAAE;AAC7G,yBAAqB,SAAS,cAC1B,YAAY,YAAY,YAAY,IACpC,mBAAmB;AACvB,yBAAqB,UAAU,cAC3B,YAAY,YAAY,aAAa,IACrC,mBAAmB;AACvB,yBAAqB,aAAa,cAC9B,YAAY,YAAY,uBAAuB,IAC/C,mBAAmB;AACvB,yBAAqB,cAAc,cAC/B,YAAY,YAAY,2BAA2B,IACnD,mBAAmB;AACvB,yBAAqB,QAAQ,KAAK,IAAI,GAAG,YAAY,MAAM,cAAc,CAAC;AAC1E,uBAAmB,QAAQ;AAC3B,uBAAmB,SAAS;AAC5B,uBAAmB,YAAY;AAC/B,uBAAmB,aAAa;AAChC,oBAAgB;AAChB,mBAAe,aAAa,EAAE,OAAO,OAAO,SAAS,YAAY,MAAM,KAAK,EAAE,CAAC;AAC/E,sBAAkB;AAClB,UAAM,SAAS,MAAM,aAAa,QAAQ,MAAM,YAAY;AAC5D,QAAI,QAAQ;AACV,sBAAgB;AAChB,YAAM,SAAS,MAAM,QAAQ,MAAM,MAAM,IACrC,MAAM,OAAO,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAAE,KAAK,QAAK,IACrF;AACJ,sBAAgB,UAAU,cAAc,mBAAmB,OAAO,MAAM,WAAW,UAAU,CAAC;AAC9F,qBAAe,OAAO,CAAC;AACvB,sBAAgB,OAAO,CAAC;AAAA,IAC1B,OAAO;AACL,sBAAgB;AAChB,UAAI,CAAC,eAAgB,iBAAgB;AAAA,IACvC;AACA,QAAI,UAAU,eAAgB,kBAAiB,OAAO,CAAC;AAAA,QAClD,kBAAiB,MAAM;AAC5B,wBAAoB,CAAC,UAAU,CAAC;AAChC,WAAO,OAAO;AACd,sBAAkB;AAClB,QAAI,UAAU,gBAAgB;AAC5B,YAAM,OAAO,IAAI;AACjB;AAAA,IACF;AACA,wBAAoB;AACpB,QAAI,iBAAiB,WAAW,KAAK,eAAe,WAAW,GAAG;AAChE,2BAAqB;AAAA,IACvB;AACA,QACE,iBAAiB,WAAW,KAC5B,eAAe,WAAW,KAC1B,gBAAgB,WAAW,GAC3B;AACA,0BAAoB;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,SAAuB;AAC3C,QAAI,QAAQ,IAAI,2BAA2B,SAAU,OAAM,IAAI,MAAM,wBAAwB;AAC7F,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,cAAU,GAAG,IAAI;AAAA,CAAI;AACrB,mBAAe,MAAM,GAAG,IAAI;AAAA,CAAI;AAChC,QAAI;AACJ,QAAI;AACF,YAAM,SAAkB,KAAK,MAAM,IAAI;AACvC,UAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,EAAG;AAC5E,cAAQ;AAAA,IACV,QAAQ;AACN;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,UAAU;AAC/B,yBAAmB,KAAK;AACxB;AAAA,IACF;AACA,mBAAe,QAAQ,KAAK;AAC5B,QAAI,aAAa,QAAQ,KAAK,EAAG;AACjC,QAAI,MAAM,SAAS,mBAAmB,MAAM,SAAS,kBAAkB;AACrE,YAAM,UAAU,MAAM;AACtB,UAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC9E,qBAAa,iBAAiB,OAAkC;AAAA,MAClE;AAAA,IACF;AACA,QAAI,MAAM,SAAS,eAAe;AAChC,oBAAc,gBAAgB;AAC9B,qBAAe;AACf,sBAAgB;AAChB,UAAI,CAAC,eAAgB,iBAAgB;AACrC;AAAA,IACF;AACA,QAAI,MAAM,SAAS,cAAc,MAAM,YAAY,YAAY,MAAM,YAAY,OAAO;AACtF,sBAAgB;AAChB,UAAI,CAAC,eAAgB,iBAAgB,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AACrF,YAAM,OAAO,IAAI;AACjB;AAAA,IACF;AACA,QAAI,MAAM,SAAS,wBAAwB;AACzC,YAAM,SAAS,MAAM;AACrB,UACE,OAAO,MAAM,OAAO,aACnB,WAAW,YAAY,WAAW,aAAa,WAAW,WAAW,WAAW,WACjF;AACA,cAAM,OAAO;AAAA,UACX,GAAG,KAAK,UAAU,EAAE,MAAM,yBAAyB,IAAI,MAAM,IAAI,WAAW,KAAK,CAAC,CAAC;AAAA;AAAA,QACrF;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,MAAM,SAAS,wBAAwB;AACzC,aAAO;AACP,UAAI,OAAO,MAAM,aAAa,UAAU;AACtC,eAAO,cAAc,MAAM;AAC3B,gBAAQ,OAAO,MAAM,UAAK,MAAM,QAAQ;AAAA,CAAI;AAAA,MAC9C;AACA,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,SAAS,sBAAsB;AACvC,UAAI,MAAM,YAAY,MAAM;AAC1B,sBAAc,iBAAiB;AAAA,UAC7B,GAAI,OAAO,MAAM,eAAe,WAAW,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,UAC/E,GAAI,OAAO,MAAM,aAAa,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,QAC3E,CAAC;AAAA,MACH;AACA,aAAO,OAAO;AACd,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,SAAS,YAAY;AAC7B,oBAAc,eAAe;AAAA,QAC3B,GAAI,OAAO,MAAM,cAAc,WAAW,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MAC9E,CAAC;AACD,aAAO;AACP,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,SAAS,gBAAgB;AACjC,YAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IACzC,MAAM,SAAS,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAC3E,CAAC;AACL,YAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IACzC,MAAM,SAAS,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAC3E,CAAC;AACL,aAAO,kBAAkB,EAAE,UAAU,SAAS;AAC9C,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,SAAS,eAAe;AAChC,YAAM,UAAU,MAAM;AACtB,UAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,EAAG;AAC/E,YAAM,gBAAgB;AACtB,UAAI,cAAc,SAAS,YAAa;AACxC,YAAM,OAAO,YAAY,aAAa;AACtC,UAAI,MAAM;AACR,eAAO,OAAO,cAAc,IAAI;AAChC,gBAAQ,OAAO,MAAM;AAAA,EAAK,IAAI;AAAA,CAAI;AAAA,MACpC;AACA,YAAM,aAAa,kBAAkB,aAAa;AAClD,iBAAW,QAAQ,aAAa;AAChC,qBAAe,YAAY;AAAA,QACzB,OAAO,YAAY,cAAc,KAAK;AAAA,QACtC,UAAU,YAAY,cAAc,QAAQ;AAAA,MAC9C,CAAC;AACD,mBAAa,iBAAiB,aAAa;AAC3C,wBAAkB;AAClB,UAAI,cAAc,eAAe,WAAW,CAAC,gBAAgB;AAC3D,wBAAgB;AAChB,wBAAgB,eAAe,aAAa;AAAA,MAC9C,OAAO;AACL,wBAAgB;AAIhB,YAAI,CAAC,eAAgB,iBAAgB;AAAA,MACvC;AACA,aAAO;AACP;AAAA,IACF;AACA,QAAI,MAAM,SAAS,aAAa;AAC9B,oBAAc,gBAAgB,EAAE,WAAW,MAAM,cAAc,KAAK,CAAC;AACrE,qBAAe,MAAM,cAAc;AACnC;AAAA,IACF;AACA,QAAI,MAAM,SAAS,iBAAiB;AAClC,oBAAc,kBAAkB;AAChC,UAAI,CAAC,cAAc;AAIjB,kBAAU;AACV,uBAAe,aAAa;AAAA,MAC9B;AACA;AAAA,IACF;AACA,QAAI,MAAM,SAAS,kBAAkB;AACnC,oBAAc,sBAAsB;AAAA,QAClC,GAAI,OAAO,MAAM,WAAW,WAAW,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,QACnE,GAAI,OAAO,MAAM,cAAc,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MAC/E,CAAC;AACD;AAAA,IACF;AACA,QAAI,MAAM,SAAS,mBAAmB;AACpC,YAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAC9D,eAAS,GAAG,MAAM;AAAA,EAAK,KAAK,GAAG,KAAK,EAAE,MAAM,CAAC,gBAAgB;AAC7D,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,OAAO,GAAG,SAAS,MAAM;AAAA,EAAC,CAAC;AACjC,MAAI,QAAQ,WAAW,UAAU;AAC/B,qBAAiB,WAAW,MAAM,MAAM;AAAA,EAC1C,WAAW,QAAQ,WAAW,QAAQ;AAIpC,UAAM,WAAqB,CAAC;AAC5B,QAAI,QAAQ,cAAc;AACxB,eAAS,KAAK;AAAA,EAA0B,QAAQ,YAAY;AAAA,uBAA0B;AAAA,IACxF;AACA,QAAI,QAAQ;AACV,eAAS;AAAA,QACP;AAAA,EAA8F,MAAM;AAAA,MACtG;AAAA,IACF;AACA,aAAS,KAAK,IAAI;AAClB,UAAM,OAAO,MAAM,SAAS,KAAK,MAAM,CAAC;AACxC,UAAM,OAAO,IAAI;AAAA,EACnB,OAAO;AACL,iBAAa,MAAM;AAAA,EACrB;AASA,MAAI,cAAc;AAClB,MAAI,iBAAiB,OAAO,MAAM,CAAC;AACnC,MAAI,6BAA6B;AACjC,QAAM,YAAY,MAAY;AAC5B,QAAI,CAAC,QAAQ,aAAa,kBAAmB,QAAQ,WAAW,QAAQ,CAAC,aAAa,MAAQ;AAC9F,QAAI;AACJ,QAAI;AACF,mBAAa,GAAG,SAAS,QAAQ,WAAW,GAAG;AAAA,IACjD,QAAQ;AACN;AAAA,IACF;AACA,QAAI;AACF,YAAM,OAAO,GAAG,UAAU,UAAU,EAAE;AACtC,UAAI,OAAO,aAAa;AACtB,sBAAc;AACd,yBAAiB,OAAO,MAAM,CAAC;AAC/B,qCAA6B;AAAA,MAC/B;AACA,UAAI,QAAQ,YAAa;AACzB,YAAM,SAAS,KAAK,IAAI,OAAO,aAAa,sBAAsB;AAClE,YAAM,SAAS,OAAO,YAAY,MAAM;AACxC,YAAM,YAAY,GAAG,SAAS,YAAY,QAAQ,GAAG,QAAQ,WAAW;AACxE,qBAAe;AACf,UAAI,WAAW,OAAO,OAAO,CAAC,gBAAgB,OAAO,SAAS,GAAG,SAAS,CAAC,CAAC;AAC5E,UAAI,4BAA4B;AAC9B,cAAM,iBAAiB,SAAS,QAAQ,EAAI;AAC5C,YAAI,iBAAiB,EAAG;AACxB,mBAAW,SAAS,SAAS,iBAAiB,CAAC;AAC/C,qCAA6B;AAAA,MAC/B;AACA,YAAM,UAAU,SAAS,YAAY,EAAI;AACzC,UAAI,UAAU,GAAG;AACf,YAAI,SAAS,SAAS,sBAAsB;AAC1C,2BAAiB,OAAO,MAAM,CAAC;AAC/B,uCAA6B;AAAA,QAC/B,OAAO;AACL,2BAAiB,OAAO,KAAK,QAAQ;AAAA,QACvC;AACA;AAAA,MACF;AACA,YAAM,YAAY,SAAS,SAAS,UAAU,CAAC;AAC/C,UAAI,UAAU,SAAS,sBAAsB;AAC3C,yBAAiB,OAAO,MAAM,CAAC;AAC/B,qCAA6B;AAAA,MAC/B,OAAO;AACL,yBAAiB,OAAO,KAAK,SAAS;AAAA,MACxC;AACA,UAAI,oBAAoB;AACxB,iBAAW,OAAO,SAAS,SAAS,GAAG,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,MAAM,IAAI,GAAG;AAChF,YAAI,qBAAqB,4BAA6B;AACtD,YAAI,OAAO,WAAW,KAAK,MAAM,IAAI,qBAAsB;AAC3D,cAAM,OAAO,IAAI,KAAK;AACtB,YAAI,CAAC,KAAM;AACX,6BAAqB;AACrB,YAAI;AACJ,YAAI;AACF,oBAAU,KAAK,MAAM,IAAI;AAAA,QAC3B,QAAQ;AACN;AAAA,QACF;AACA,YAAI;AACF,cAAI,QAAQ,WAAW,UAAU;AAC/B,gBAAI,iBAAkB,cAAa,gBAAgB;AACnD,+BAAmB;AACnB,gBAAI,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,UAAU;AACnE,mCAAqB,gBAAgB,QAAQ,OAAO;AACpD,kCAAoB;AAAA,YACtB,WAAW,QAAQ,SAAS,eAAe,OAAO,QAAQ,YAAY,UAAU;AAC9E,mCAAqB,iBAAiB,QAAQ,OAAO;AACrD,kBAAI,qBAAqB,iBAAiB,WAAW,EAAG,sBAAqB;AAAA,YAC/E,WACE,QAAQ,SAAS,wBAChB,QAAQ,SAAS,SAAS,QAAQ,SAAS,kBAC5C;AACA,mCAAqB,QAAQ;AAC7B,kCAAoB;AAAA,YACtB,WACE,QAAQ,SAAS,yBAChB,QAAQ,SAAS,SAAS,QAAQ,SAAS,kBAC5C;AACA,mCAAqB,QAAQ;AAC7B,kBAAI,qBAAqB,iBAAiB,WAAW,EAAG,sBAAqB;AAAA,YAC/E;AACA,8BAAkB;AAAA,UACpB,WAAW,QAAQ,WAAW,QAAQ;AAAA,UAItC,WAAW,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC1E,kBAAM,OAAO,MAAM,KAAK,UAAU,EAAE,MAAM,SAAS,SAAS,QAAQ,QAAQ,CAAC,IAAI,IAAI;AAAA,UACvF,WAAW,QAAQ,SAAS,eAAe,OAAO,QAAQ,YAAY,UAAU;AAC9E,kBAAM,OAAO,MAAM,KAAK,UAAU,EAAE,MAAM,aAAa,SAAS,QAAQ,QAAQ,CAAC,IAAI,IAAI;AAAA,UAC3F,WAAW,QAAQ,SAAS,uBAAuB,OAAO,QAAQ,SAAS,UAAU;AACnF,kBAAM,OAAO,MAAM,KAAK,UAAU,EAAE,MAAM,qBAAqB,MAAM,QAAQ,KAAK,CAAC,IAAI,IAAI;AAAA,UAC7F,WAAW,QAAQ,SAAS,wBAAwB,OAAO,QAAQ,SAAS,UAAU;AACpF,kBAAM,OAAO,MAAM,KAAK,UAAU,EAAE,MAAM,sBAAsB,MAAM,QAAQ,KAAK,CAAC,IAAI,IAAI;AAAA,UAC9F,WAAW,QAAQ,SAAS,WAAW;AACrC,2BAAe,MAAM,QAAQ,YAAY;AAAA,UAC3C;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,UAAE;AACA,SAAG,UAAU,UAAU;AAAA,IACzB;AAAA,EACF;AACA,QAAM,aAAa,QAAQ,YAAY,YAAY,WAAW,GAAG,IAAI;AACrE,cAAY,QAAQ;AAEpB,QAAM,qBAAqB,CAAC,SAAuB;AACjD,UAAM,SAAS,KAAK,MAAM,GAAG,oBAAoB;AACjD,QAAI;AACJ,QAAI;AACF,qBAAe,KAAK,KAAK,KAAK,QAAQ,QAAQ,OAAO,GAAG,4BAA4B;AACpF,SAAG,cAAc,cAAc,QAAQ,EAAE,UAAU,QAAQ,MAAM,IAAM,CAAC;AAAA,IAC1E,QAAQ;AACN,qBAAe;AAAA,IACjB;AACA,qBAAiB;AACjB,oBAAgB,eACZ,gDAAgD,OAAO,MAAM,yBAAyB,YAAY,KAClG;AACJ,mBAAe;AACf,mBAAe,OAAO,SAAS;AAAA,EACjC;AAEA,QAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,UAAM,UAAU,cAAc,MAAM,KAAK;AACzC,QAAI,QAAQ,WAAW,QAAQ;AAC7B,oBAAc;AACd;AAAA,IACF;AACA,oBAAgB;AAChB,WAAO,MAAM;AACX,YAAM,UAAU,aAAa,QAAQ,IAAI;AACzC,UAAI,UAAU,GAAG;AAKf,YAAI,aAAa,SAAS,qBAAsB,oBAAmB,YAAY;AAC/E;AAAA,MACF;AACA,UAAI,UAAU,sBAAsB;AAGlC,2BAAmB,aAAa,MAAM,GAAG,OAAO,CAAC;AACjD;AAAA,MACF;AACA,YAAM,OAAO,aAAa,MAAM,GAAG,OAAO,EAAE,QAAQ,OAAO,EAAE;AAC7D,qBAAe,aAAa,MAAM,UAAU,CAAC;AAC7C,mBAAa,IAAI;AAAA,IACnB;AAAA,EACF,CAAC;AACD,QAAM,eAAe,CAAC,SAAuB;AAC3C,QAAI,CAAC,KAAM;AACX,cAAU,GAAG,KAAK,UAAU,EAAE,MAAM,iBAAiB,KAAK,CAAC,CAAC;AAAA,CAAI;AAChE,YAAQ,OAAO,MAAM,IAAI;AACzB,aAAS,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,gBAAgB;AAAA,EACrD;AACA,QAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,iBAAa,cAAc,MAAM,KAAK,CAAC;AAAA,EACzC,CAAC;AACD,QAAM,QAAQ,GAAG,SAAS,MAAM;AAAA,EAAC,CAAC;AAElC,QAAM,UAAU,WAAW,MAAM;AAC/B,QAAI,eAAgB;AACpB,qBAAiB;AACjB,oBAAgB,yBAAyB,QAAQ,SAAS;AAC1D,QAAI,QAAQ,WAAW,QAAQ,CAAC,aAAa,OAAO;AAClD,uBAAiB;AAAA,IACnB;AACA,mBAAe,OAAO,SAAS;AAC/B,eAAW,MAAM,eAAe,OAAO,SAAS,GAAG,aAAa,EAAE,MAAM;AAAA,EAC1E,GAAG,QAAQ,SAAS;AACpB,UAAQ,MAAM;AAEd,QAAM,OAAO,MAAY;AACvB,QAAI,eAAgB;AACpB,qBAAiB;AACjB,oBAAgB;AAChB,mBAAe,OAAO,SAAS;AAC/B,eAAW,MAAM,eAAe,OAAO,SAAS,GAAG,aAAa,EAAE,MAAM;AAAA,EAC1E;AACA,UAAQ,KAAK,WAAW,IAAI;AAC5B,UAAQ,KAAK,UAAU,IAAI;AAC3B,UAAQ,KAAK,UAAU,IAAI;AAE3B,QAAM,WAAW,MAAM,IAAI,QAAuB,CAAC,YAAY;AAC7D,UAAM,KAAK,SAAS,CAAC,UAAU;AAC7B,uBAAiB;AACjB,sBAAgB,MAAM;AACtB,cAAQ,IAAI;AAAA,IACd,CAAC;AACD,UAAM,KAAK,SAAS,CAAC,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC7C,CAAC;AAED,MAAI,WAAY,eAAc,UAAU;AACxC,MAAI,iBAAkB,cAAa,gBAAgB;AACnD,eAAa,OAAO;AACpB,MAAI,QAAQ,WAAW,QAAQ,CAAC,aAAa,SAAS,CAAC,gBAAgB;AACrE,qBAAiB;AACjB,oBAAgB,gFAAgF,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,CAAC,KAAK,EAAE;AAAA,EAC3I;AACA,MAAI,QAAQ,IAAI,2BAA2B,QAAS,OAAM,IAAI,MAAM,uBAAuB;AAC3F,MAAI,QAAQ,WAAW,QAAQ;AAC7B,kBAAc,cAAc,IAAI;AAAA,EAClC,OAAO;AACL,oBAAgB,cAAc,IAAI;AAAA,EACpC;AACA,eAAa,cAAc,IAAI,CAAC;AAChC,MAAI,QAAQ,WAAW,QAAQ;AAC7B,UAAM,UAAU,WAAW,KAAK;AAChC,QAAI,SAAS;AACX,UAAI;AACF,cAAM,SAAS,qBAAqB,OAAO;AAC3C,YAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,uBAAa;AACb,gBAAM,OAAO,YAAY,WAAW,IAAI,KAAK;AAC7C,cAAI,MAAM;AACR,mBAAO,OAAO,cAAc,IAAI;AAChC,oBAAQ,OAAO,MAAM;AAAA,EAAK,IAAI;AAAA,CAAI;AAAA,UACpC;AACA,gBAAM,YAAY,YAAY,WAAW,SAAS;AAClD,cAAI,UAAW,QAAO,kBAAkB;AACxC,gBAAM,QAAQ,WAAW;AACzB,cAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,GAAG;AACxE,kBAAM,SAAS;AACf,kBAAM,QAAQ,YAAY,OAAO,WAAW;AAC5C,kBAAM,SAAS,YAAY,OAAO,YAAY;AAC9C,kBAAM,YAAY,YAAY,OAAO,YAAY;AACjD,kBAAM,OAAO,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACnE,mBAAO,QAAQ,EAAE,OAAO,QAAQ,WAAW,YAAY,GAAG,KAAK;AAC/D,2BAAe,EAAE,OAAO,QAAQ,WAAW,YAAY,GAAG,KAAK,GAAG,EAAE,OAAO,YAAY,WAAW,KAAK,EAAE,CAAC;AAAA,UAC5G;AACA,gBAAM,iBAA2B,CAAC;AAClC,gBAAM,QAAQ,YAAY,WAAW,KAAK;AAC1C,cAAI,MAAO,gBAAe,KAAK,KAAK;AAIpC,qBAAW,OAAO,CAAC,UAAU,QAAQ,GAAY;AAC/C,kBAAM,OAAO,WAAW,GAAG;AAC3B,gBAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,EAAG;AACtE,kBAAM,SAAS;AACf,gBAAI,OAAO,OAAO,MAAO;AACzB,kBAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,IACvC,OAAO,OAAO,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAAE,KAAK,IAAI,IACrF,CAAC,YAAY,OAAO,MAAM,GAAG,YAAY,OAAO,MAAM,CAAC,EACpD,OAAO,CAAC,UAA2B,UAAU,MAAS,EACtD,KAAK,IAAI;AAChB,2BAAe,KAAK,QAAQ,GAAG,UAAU,UAAU,KAAK,OAAO,KAAK,EAAE,EAAE;AAAA,UAC1E;AACA,cAAI,eAAe,SAAS,GAAG;AAC7B,4BAAgB;AAChB,4BAAgB,eAAe,KAAK,IAAI;AAAA,UAC1C;AACA,iBAAO,SAAS;AAChB,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,WAAW,aAAa,KAAK,GAAG;AAC9B,iBAAa,YAAY;AAAA,EAC3B;AACA,SAAO,WAAW;AAClB,SAAO,SAAS,OAAO,MAAM,CAAC,gBAAgB;AAC9C,MACE,OAAO,YAAY,WAAW,YAC9B,OAAO,YAAY,WAAW,aAC9B;AACA,UAAM,QAAQ,iBAAiB;AAC/B,WAAO,aAAa;AAAA,MAClB,GAAG,OAAO;AAAA,MACV,QAAQ;AAAA,MACR,WAAW,KAAK,IAAI;AAAA,MACpB,YAAY,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AACA,QAAI,CAAC,gBAAgB;AACnB,uBAAiB;AACjB,sBAAgB;AAAA,IAClB;AAAA,EACF;AACA,SAAO,aAAa,KAAK,IAAI;AAC7B,SAAO,YAAY,OAAO;AAC1B,QAAM,iBACJ,aAAa,KACb,CAAC,kBACA,QAAQ,WAAW,QACjB,QAAQ,WAAW,YAClB,oBACA,iBAAiB,WAAW,KAC5B,eAAe,WAAW,KAC1B,gBAAgB,WAAW,KAC5B,QAAQ,WAAW,UAAU,eAAe;AACjD,SAAO,SAAS,mBAAmB,iBAAiB,cAAc;AAClE,MAAI,cAAe,QAAO,QAAQ;AAClC,MAAI,OAAO,WAAW,YAAY,CAAC,OAAO,OAAO;AAC/C,WAAO,QACL,OAAO,KAAK,MACX,aAAa,IACV,GAAG,YAAY,QAAQ,MAAM,CAAC,4CAC9B,GAAG,YAAY,QAAQ,MAAM,CAAC,qBAAqB,YAAY,SAAS;AAAA,EAChF;AACA,MAAI,OAAO,WAAW,eAAe,QAAQ,YAAY;AACvD,QAAI;AACF,YAAMC,UAAS,KAAK,MAAM,GAAG,aAAa,QAAQ,YAAY,MAAM,CAAC;AAIrE,0BAAoB,QAAQA,OAAM;AAAA,IACpC,SAAS,OAAO;AACd,aAAO,SAAS;AAChB,YAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,YAAM,SAAS,OAAO,KAAK,KAAK;AAChC,YAAM,UAAU,OAAO,MAAM,GAAG,GAAG;AACnC,aAAO,QAAQ,wCAAwC,MAAM,GAAG,UAAU,aAAa,OAAO,GAAG,OAAO,SAAS,MAAM,WAAM,EAAE,MAAM,EAAE;AAAA,IACzI;AAAA,EACF;AACA,SAAO,OAAO;AACd,iBAAe,QAAQ,YAAY,MAAM;AACzC,oBAAkB;AAClB,UAAQ,OAAO,MAAM;AAAA,cAAiB,OAAO,MAAM;AAAA,CAAI;AACvD,QAAM,IAAI;AAAA,IAAc,CAAC,YACvB,gBAAgB,cAAc,IAAI,OAAO,IAAI,QAAQ;AAAA,EACvD;AACA,UAAQ,WAAW,OAAO,WAAW,cAAc,IAAI;AACzD;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAM,iBAAiB,QAAS,MAAM,SAAS,MAAM,UAAW,OAAO,KAAK,CAAC;AACrF,mBAAiB,KAAK;AACtB,UAAQ,KAAK,CAAC;AAChB,CAAC;",
4
+ "sourcesContent": ["#!/usr/bin/env node\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ChildProcess, SpawnOptions } from \"node:child_process\";\nimport crossSpawn from \"cross-spawn\";\nimport { StringDecoder } from \"node:string_decoder\";\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\nimport type {\n AgentRunRecord,\n AgentRunStatus,\n} from \"./agents/types.js\";\n\nconst NODE_SCRIPT_EXTENSIONS = new Set([\".js\", \".cjs\", \".mjs\", \".ts\", \".cts\", \".mts\"]);\n\nconst spawnCli = (\n command: string,\n args: readonly string[],\n options: SpawnOptions,\n): ChildProcess => NODE_SCRIPT_EXTENSIONS.has(path.extname(command).toLowerCase())\n ? crossSpawn(process.execPath, [command, ...args], options)\n : crossSpawn(command, [...args], options);\n\ntype ClaudeCliModule = typeof import(\"./agents/claude-cli.js\");\ntype VedaCliModule = typeof import(\"./agents/veda-cli.js\");\ntype CompactControlModule = typeof import(\"./agents/compact-control.js\");\ntype WorkerOptionsModule = typeof import(\"./worker/options.js\");\ntype WorkerRunRecordModule = typeof import(\"./worker/run-record.js\");\ntype WorkerSessionExportModule = typeof import(\"./worker/session-export.js\");\ntype WorkerEventProjectionModule = typeof import(\"./worker/event-projection.js\");\nconst loadWorkerEventProjection = async (): Promise<WorkerEventProjectionModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/event-projection.js\");\n const sourceModulePath = \"./worker/event-projection.ts\";\n return import(sourceModulePath) as Promise<WorkerEventProjectionModule>;\n};\n\ntype WorkerModelControlModule = typeof import(\"./worker/model-control.js\");\n\nconst loadWorkerModelControl = async (): Promise<WorkerModelControlModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/model-control.js\");\n const sourceModulePath = \"./worker/model-control.ts\";\n return import(sourceModulePath) as Promise<WorkerModelControlModule>;\n};\n\ntype AgentResultModule = typeof import(\"./agents/result.js\");\n\nconst loadAgentResult = async (): Promise<AgentResultModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/result.js\");\n const sourceModulePath = \"./agents/result.ts\";\n return import(sourceModulePath) as Promise<AgentResultModule>;\n};\n\nconst loadWorkerOptions = async (): Promise<WorkerOptionsModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/options.js\");\n const sourceModulePath = \"./worker/options.ts\";\n return import(sourceModulePath) as Promise<WorkerOptionsModule>;\n};\n\nconst loadWorkerRunRecord = async (): Promise<WorkerRunRecordModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/run-record.js\");\n const sourceModulePath = \"./worker/run-record.ts\";\n return import(sourceModulePath) as Promise<WorkerRunRecordModule>;\n};\n\nconst loadWorkerSessionExport = async (): Promise<WorkerSessionExportModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/session-export.js\");\n const sourceModulePath = \"./worker/session-export.ts\";\n return import(sourceModulePath) as Promise<WorkerSessionExportModule>;\n};\n\nconst loadCompactControl = async (): Promise<CompactControlModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/compact-control.js\");\n const sourceModulePath = \"./agents/compact-control.ts\";\n return import(sourceModulePath) as Promise<CompactControlModule>;\n};\n\nconst loadClaudeCli = async (): Promise<ClaudeCliModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/claude-cli.js\");\n const sourceModulePath = \"./agents/claude-cli.ts\";\n return import(sourceModulePath) as Promise<ClaudeCliModule>;\n};\n\nconst loadVedaCli = async (): Promise<VedaCliModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/veda-cli.js\");\n const sourceModulePath = \"./agents/veda-cli.ts\";\n return import(sourceModulePath) as Promise<VedaCliModule>;\n};\n\nconst MAX_STDERR_CHARS = 20_000;\nconst MAX_EVENT_LINE_CHARS = 4 * 1024 * 1024;\nconst STEER_READ_CHUNK_BYTES = 256 * 1024;\nconst MAX_STEER_LINE_BYTES = 64 * 1024;\nconst MAX_STEER_COMMANDS_PER_POLL = 256;\nconst MAX_CLAUDE_PENDING_INPUTS = 256;\nconst MAX_CLAUDE_PENDING_TOOLS = 1_000;\nconst KILL_GRACE_MS = 5_000;\n\nconst extractText = (message: Record<string, unknown>): string => {\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter(\n (part): part is { type: \"text\"; text: string } =>\n typeof part === \"object\" &&\n part !== null &&\n (part as Record<string, unknown>).type === \"text\" &&\n typeof (part as Record<string, unknown>).text === \"string\",\n )\n .map((part) => part.text)\n .join(\"\");\n};\n\nconst readImages = (filePath: string | undefined): ImageContent[] => {\n if (!filePath) return [];\n const parsed: unknown = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n if (!Array.isArray(parsed)) throw new Error(\"Agent images file must contain an array\");\n const images: ImageContent[] = [];\n for (const value of parsed) {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n (value as { type?: unknown }).type !== \"image\" ||\n typeof (value as { data?: unknown }).data !== \"string\" ||\n typeof (value as { mimeType?: unknown }).mimeType !== \"string\"\n ) {\n throw new Error(\"Agent images file contains an invalid image block\");\n }\n images.push({\n type: \"image\",\n data: (value as { data: string }).data,\n mimeType: (value as { mimeType: string }).mimeType,\n });\n }\n return images;\n};\n\nconst numberField = (value: unknown): number => (typeof value === \"number\" ? value : 0);\n\nconst stringField = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n\nconst assistantError = (message: Record<string, unknown>): string => {\n const details: string[] = [];\n const direct = stringField(message.errorMessage) ?? stringField(message.error);\n if (direct) details.push(direct);\n if (Array.isArray(message.diagnostics)) {\n for (const diagnostic of message.diagnostics) {\n if (typeof diagnostic !== \"object\" || diagnostic === null || Array.isArray(diagnostic)) continue;\n const record = diagnostic as Record<string, unknown>;\n const nested =\n typeof record.error === \"object\" && record.error !== null && !Array.isArray(record.error)\n ? (record.error as Record<string, unknown>)\n : undefined;\n const detail = stringField(nested?.message) ?? stringField(record.message);\n if (detail) details.push(detail);\n }\n }\n const unique = [...new Set(details)];\n const provider = stringField(message.provider);\n const model = stringField(message.model);\n const source = [provider, model].filter((value): value is string => Boolean(value)).join(\"/\");\n const summary = unique.join(\" \u00B7 \") || \"Pi agent reported an error\";\n return `${source ? `${source}: ` : \"\"}${summary}`.slice(0, MAX_STDERR_CHARS);\n};\n\nconst runnerLabel = (runner: string): string =>\n runner === \"claude\" ? \"Claude\" : runner === \"veda\" ? \"Veda\" : \"Pi\";\n\nconst terminateChild = (child: ChildProcess, signal: NodeJS.Signals): void => {\n if (!child.pid) return;\n try {\n process.kill(process.platform === \"win32\" ? child.pid : -child.pid, signal);\n } catch { /* child process group already exited */ }\n};\n\n\n\nlet crashContext: { statusFile: string; record: AgentRunRecord } | undefined;\nlet runRecordHelpers: WorkerRunRecordModule | undefined;\nlet terminalWritten = false;\nconst writeCrashStatus = (error: unknown): void => {\n if (!crashContext || !runRecordHelpers || terminalWritten) return;\n try {\n runRecordHelpers.writeCrashRunRecord(crashContext.statusFile, crashContext.record, error);\n } catch {\n // Best effort: if the crash-status write itself fails, #monitor falls back\n // to \"Agent transport exited without a result\".\n }\n};\nprocess.on(\"uncaughtException\", (error) => {\n writeCrashStatus(error);\n process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : error}\\n`);\n process.exit(1);\n});\nprocess.on(\"unhandledRejection\", (error) => {\n writeCrashStatus(error);\n process.stderr.write(`Unhandled rejection: ${error instanceof Error ? error.stack ?? error.message : error}\\n`);\n process.exit(1);\n});\n\nconst main = async (): Promise<void> => {\n const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, {parseStructuredValue, validateAgentResult}, { PiModelControl }, { PiEventProjection }] = await Promise.all([\n loadWorkerOptions(),\n loadWorkerRunRecord(),\n loadWorkerSessionExport(),\n loadAgentResult(),\n loadWorkerModelControl(),\n loadWorkerEventProjection(),\n ]);\n runRecordHelpers = loadedRunRecordHelpers;\n const {\n applyUsage,\n createRunningRecord,\n emptyUsage,\n extractUsageDelta,\n latestRunText,\n updateRunRecord,\n writeRunRecord,\n } = loadedRunRecordHelpers;\n const options = optionHelpers.parseWorkerOptions();\n const sessionExporter = options.sessionExportFile\n ? new sessionExportHelpers.SessionExporter({\n file: options.sessionExportFile,\n sessionId: options.id,\n cwd: options.cwd,\n agentName: options.name,\n })\n : undefined;\n const thinking =\n options.thinking === \"off\" ||\n options.thinking === \"minimal\" ||\n options.thinking === \"low\" ||\n options.thinking === \"medium\" ||\n options.thinking === \"high\" ||\n options.thinking === \"xhigh\" ||\n options.thinking === \"max\"\n ? options.thinking\n : undefined;\n const task = fs.readFileSync(options.taskFile, \"utf8\");\n const images = readImages(options.imagesFile);\n const record = createRunningRecord(options, task, thinking, Date.now());\n writeRunRecord(options.statusFile, record);\n const emitLifecycle = (\n event: string,\n data?: Record<string, unknown>,\n ): void => {\n try {\n fs.mkdirSync(path.dirname(options.lifecycleFile), { recursive: true });\n fs.appendFileSync(\n options.lifecycleFile,\n JSON.stringify({ version: 1, event, occurredAt: Date.now(), ...(data ? { data } : {}) }) + \"\\n\",\n { encoding: \"utf8\", mode: 0o600 },\n );\n } catch {\n // Lifecycle telemetry is best-effort and must not fail the child run.\n }\n };\n crashContext = { statusFile: options.statusFile, record };\n process.stdout.write(`[pi-fabric] ${options.name}\\n${task}\\n\\n`);\n fs.mkdirSync(path.dirname(options.logFile), { recursive: true });\n // Other processes tail this file while the run is live (transcript reader,\n // dashboards, preview trees). The previous buffered createWriteStream visibly\n // stalled mid-run \u2014 append synchronously so events are durable immediately.\n const appendLog = (text: string): void => {\n try {\n fs.appendFileSync(options.logFile, text, { encoding: \"utf8\", mode: 0o600 });\n } catch {\n // Event logging is best-effort and must not fail the child run.\n }\n };\n const sessionStream =\n options.runner === \"claude\" && options.sessionFile\n ? fs.createWriteStream(options.sessionFile, { flags: \"a\", mode: 0o600 })\n : undefined;\n sessionStream?.on(\"error\", () => {});\n\n const schema = options.schemaFile\n ? fs.readFileSync(options.schemaFile, \"utf8\")\n : undefined;\n const piArguments = [\"--mode\", \"rpc\"];\n if (options.sessionFile) piArguments.push(\"--session\", options.sessionFile);\n else piArguments.push(\"--no-session\");\n if (!options.extensions) piArguments.push(\"--no-extensions\");\n if (options.fabricExtensionPath) piArguments.push(\"-e\", options.fabricExtensionPath);\n if (options.tools.length > 0) piArguments.push(\"--tools\", options.tools.join(\",\"));\n else piArguments.push(\"--no-tools\"); // explicit empty allowlist => no tools, not Pi defaults\n if (options.model) piArguments.push(\"--model\", options.model);\n if (thinking) piArguments.push(\"--thinking\", thinking);\n if (options.systemPrompt) piArguments.push(\"--append-system-prompt\", options.systemPrompt);\n if (schema) {\n piArguments.push(\n \"--append-system-prompt\",\n `Your final response must contain only JSON matching this schema, without Markdown fences:\\n${schema}`,\n );\n }\n const claudeCli = options.runner === \"claude\" ? await loadClaudeCli() : undefined;\n const vedaCli = options.runner === \"veda\" ? await loadVedaCli() : undefined;\n const childArguments =\n options.runner === \"claude\"\n ? claudeCli!.buildClaudeArguments({\n tools: options.tools,\n extensions: options.extensions,\n persistentSession: Boolean(options.sessionFile),\n ...(options.model ? { model: options.model } : {}),\n ...(thinking ? { thinking } : {}),\n ...(options.systemPrompt ? { systemPrompt: options.systemPrompt } : {}),\n ...(schema ? { schema } : {}),\n ...(options.runnerSessionId ? { runnerSessionId: options.runnerSessionId } : {}),\n name: options.name,\n })\n : options.runner === \"veda\"\n ? vedaCli!.buildVedaArguments({\n backend: options.vedaBackend,\n persona: options.vedaPersona,\n ...(options.model ? { model: options.model } : {}),\n ...(thinking ? { thinking } : {}),\n tools: options.tools,\n // Isolate selection and conversation state per child run so\n // parallel Fabric agents never share Veda session state.\n session: `fabric-${options.id}`,\n })\n : piArguments;\n const childBinary =\n options.runner === \"claude\"\n ? options.claudeBinary\n : options.runner === \"veda\"\n ? options.vedaBinary\n : options.piBinary;\n\n const child = spawnCli(childBinary, childArguments, {\n cwd: options.cwd,\n detached: process.platform !== \"win32\",\n env: {\n ...process.env,\n ...(options.inheritedSessionPins && options.inheritedSessionPins.length > 0\n ? {\n PI_MULTIPROVIDER_SESSION_PINS: JSON.stringify(options.inheritedSessionPins),\n }\n : {}),\n PI_FABRIC_DEPTH: String(options.depth),\n PI_FABRIC_PARENT_RUN: options.id,\n PI_FABRIC_AGENT_NAME: options.name,\n ...(options.mainAgentId ? { PI_FABRIC_MAIN_AGENT_ID: options.mainAgentId } : {}),\n ...(options.fabricSessionId ? { PI_FABRIC_SESSION_ID: options.fabricSessionId } : {}),\n PI_FABRIC_GRANTED_RISKS: options.grantedRisks.join(\",\"),\n PI_FABRIC_FULL_CODE_MODE: String(options.fullCodeMode),\n // Never leak an ambient native-kernel selector into a non-Fabric runner.\n PI_FABRIC_KERNEL: options.kernel,\n PI_FABRIC_PYTHON_RUNTIME: options.pythonRuntime,\n // Native tool allowlist for nested-call enforcement: full-code children\n // reach pi.* through fabric_exec, which is not gated by the --tools\n // allowlist, so both Pi and captured-tool providers enforce this\n // child-side allowlist before preparation, discovery, and invocation.\n PI_FABRIC_TOOL_ALLOWLIST: JSON.stringify(options.tools),\n ...(options.actorId ? { PI_FABRIC_ACTOR_ID: options.actorId } : {}),\n ...(options.actorName ? { PI_FABRIC_ACTOR_NAME: options.actorName } : {}),\n PI_FABRIC_CAPABILITY_REQUIREMENTS: JSON.stringify(\n options.capabilityRequirements ?? [],\n ),\n PI_FABRIC_CAPABILITY_DIGEST: options.capabilityDigest ?? \"\",\n ...(options.meshRoot ? { PI_FABRIC_MESH_ROOT: options.meshRoot } : {}),\n ...(options.projectRoot ? { PI_FABRIC_PROJECT_ROOT: options.projectRoot } : {}),\n ...(options.ownerHostId ? { PI_FABRIC_OWNER_HOST_ID: options.ownerHostId } : {}),\n ...(options.ownerIdentityId\n ? { PI_FABRIC_OWNER_IDENTITY_ID: options.ownerIdentityId }\n : {}),\n ...(options.runRoot ? { PI_FABRIC_RUN_ROOT: options.runRoot } : {}),\n },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stderr = \"\";\n let outputBuffer = \"\";\n // Veda emits a single JSON document on stdout (progress goes to stderr, and\n // with --json progress is suppressed entirely). Buffer it raw and parse it\n // once the child closes instead of treating stdout as NDJSON lines.\n let vedaOutput = \"\";\n let vedaParsed: Record<string, unknown> | undefined;\n const eventProjection = options.runner === \"pi\" ? new PiEventProjection() : undefined;\n const outputDecoder = new StringDecoder(\"utf8\");\n const stderrDecoder = new StringDecoder(\"utf8\");\n let terminalStatus: AgentRunStatus | undefined;\n let terminalError: string | undefined;\n let sawAgentError = false;\n let retryPending = false;\n\n const update = (): void => updateRunRecord(options.statusFile, record);\n\n // Auth checks and model_select hooks can be slow under concurrent launches.\n // Startup and admission share the overall run timeout below, not a shorter cap.\n const modelControl = new PiModelControl(options.id, options.model, thinking, {\n send(frame) {\n if (terminalStatus) return;\n child.stdin?.write(`${JSON.stringify(frame)}\\n`);\n },\n observed(model) {\n if (record.model === model) return;\n record.model = model;\n update();\n },\n admitted(model, effectiveThinking) {\n if (terminalStatus) return;\n if (model) record.model = model;\n if ([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"].includes(effectiveThinking ?? \"\")) {\n record.thinking = effectiveThinking as NonNullable<AgentRunRecord[\"thinking\"]>;\n }\n update();\n child.stdin?.write(`${JSON.stringify({ type: \"prompt\", message: task, ...(images.length > 0 ? { images } : {}) })}\\n`);\n },\n fail(error) {\n if (terminalStatus) return;\n terminalStatus = \"failed\";\n terminalError = error;\n record.error = error;\n update();\n appendLog(`${JSON.stringify({ type: \"fabric_model_error\", requestedModel: options.model, model: record.model, error })}\\n`);\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n child.stdin?.end();\n },\n });\n\n // Attributed token telemetry. Every usage-bearing child event emits one\n // tokens.usage lifecycle entry identified by this run/actor/runner/depth.\n // The manager drains these alongside the pi.* lifecycle stream and appends\n // them to the budget ledger, replacing the old per-settle flat attribution.\n const lastEmittedUsage = emptyUsage();\n const emitTokenUsage = (\n delta?: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n },\n attribution?: { model?: string | undefined; provider?: string | undefined },\n ): void => {\n const snapshot = record.usage;\n if (\n snapshot.input === lastEmittedUsage.input &&\n snapshot.output === lastEmittedUsage.output &&\n snapshot.cacheRead === lastEmittedUsage.cacheRead &&\n snapshot.cacheWrite === lastEmittedUsage.cacheWrite &&\n snapshot.cost === lastEmittedUsage.cost\n ) {\n return;\n }\n emitLifecycle(\"tokens.usage\", {\n runId: options.id,\n name: options.name,\n runner: options.runner,\n depth: options.depth,\n ...(options.actorId ? { actorId: options.actorId } : {}),\n ...(options.actorName ? { actorName: options.actorName } : {}),\n cumulativeTokens:\n snapshot.input + snapshot.output + snapshot.cacheRead + snapshot.cacheWrite,\n input: delta?.input ?? 0,\n output: delta?.output ?? 0,\n cacheRead: delta?.cacheRead ?? 0,\n cacheWrite: delta?.cacheWrite ?? 0,\n cost: delta?.cost ?? snapshot.cost,\n });\n // Mirror the emitted payload into the pi-format usage export (when the\n // host enabled agents.sessionExport) so tokscale/ccusage can attribute\n // subagent tokens and cost. Export intentionally never writes content.\n sessionExporter?.push(\n {\n input: delta?.input ?? 0,\n output: delta?.output ?? 0,\n cacheRead: delta?.cacheRead ?? 0,\n cacheWrite: delta?.cacheWrite ?? 0,\n cost: delta?.cost ?? snapshot.cost,\n },\n attribution?.model ?? record.model ?? options.model,\n attribution?.provider,\n );\n lastEmittedUsage.input = snapshot.input;\n lastEmittedUsage.output = snapshot.output;\n lastEmittedUsage.cacheRead = snapshot.cacheRead;\n lastEmittedUsage.cacheWrite = snapshot.cacheWrite;\n lastEmittedUsage.cost = snapshot.cost;\n };\n\n const { ChildCompactControl } = await loadCompactControl();\n const compactControl = new ChildCompactControl(options.id, {\n send(frame) {\n if (!child.stdin || child.stdin.writableEnded || child.stdin.destroyed) {\n throw new Error(\"Child Pi stdin closed before compaction could start\");\n }\n child.stdin.write(`${JSON.stringify(frame)}\\n`);\n },\n close() {\n child.stdin?.end();\n },\n update(status) {\n record.compaction = status;\n update();\n },\n });\n\n // Preemptive per-child token guard. timeoutMs bounds wall time and budgetUsd\n // bounds cost, but a single runaway child can still blow its own context\n // before Pi core compacts. When maxTokens is set and the child's cumulative\n // token usage crosses it, terminate the child like a timeout so the run\n // settles with a terminal status instead of burning to the hour deadline.\n // The error string is model-facing: the parent agent reads it verbatim, so it\n // must name the config key and remedy, and front-load the numbers before TUI\n // truncation.\n const enforceTokenLimit = (): void => {\n if (terminalStatus || !options.maxTokens || options.maxTokens <= 0) return;\n const total =\n record.usage.input +\n record.usage.output +\n record.usage.cacheRead +\n record.usage.cacheWrite;\n if (total <= options.maxTokens) return;\n terminalStatus = \"timed_out\";\n terminalError =\n `Fabric token limit reached: ${total} tokens (limit ${options.maxTokens} set by agents.maxTokensPerChild); terminating child. ` +\n `The count is cumulative across the run and includes cache reads/writes, so it grows every turn; ` +\n `raise or disable agents.maxTokensPerChild in /fabric settings (0 disables), or split the task into smaller agent runs.`;\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n child.stdin?.end();\n };\n\n type ClaudeInputKind = \"initial\" | \"steer\" | \"follow_up\";\n const claudeTools = new Map<string, string>();\n const claudeCompletedUsage = emptyUsage();\n const claudeCurrentUsage = emptyUsage();\n const syncClaudeUsage = (): void => {\n record.usage = {\n input: claudeCompletedUsage.input + claudeCurrentUsage.input,\n output: claudeCompletedUsage.output + claudeCurrentUsage.output,\n cacheRead: claudeCompletedUsage.cacheRead + claudeCurrentUsage.cacheRead,\n cacheWrite: claudeCompletedUsage.cacheWrite + claudeCurrentUsage.cacheWrite,\n cost: claudeCompletedUsage.cost,\n };\n };\n\n const claudeSentInputs: Array<{ kind: ClaudeInputKind; message: string }> = [];\n const claudeSteering: string[] = [];\n const claudeFollowUps: string[] = [];\n let claudeSteeringMode: \"all\" | \"one-at-a-time\" = \"one-at-a-time\";\n let claudeFollowUpMode: \"all\" | \"one-at-a-time\" = \"one-at-a-time\";\n let claudeCanFollowUp = false;\n let claudeResultSeen = false;\n const enqueueClaudeControl = (queue: string[], message: string): void => {\n const pendingInputs = claudeSentInputs.length + claudeSteering.length + claudeFollowUps.length;\n if (pendingInputs >= MAX_CLAUDE_PENDING_INPUTS) return;\n queue.push(message);\n };\n let claudeCloseTimer: NodeJS.Timeout | undefined;\n\n const updateClaudeQueue = (): void => {\n const sentSteering = claudeSentInputs\n .filter((entry) => entry.kind === \"steer\")\n .map((entry) => entry.message);\n const sentFollowUps = claudeSentInputs\n .filter((entry) => entry.kind === \"follow_up\")\n .map((entry) => entry.message);\n record.pendingMessages = {\n steering: [...sentSteering, ...claudeSteering],\n followUp: [...sentFollowUps, ...claudeFollowUps],\n };\n update();\n };\n\n const writeClaudeInput = (\n kind: ClaudeInputKind,\n message: string,\n inputImages: readonly ImageContent[] = [],\n ): void => {\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n claudeCloseTimer = undefined;\n if (!child.stdin || child.stdin.writableEnded || child.stdin.destroyed) return;\n claudeSentInputs.push({ kind, message });\n if (kind === \"follow_up\") claudeCanFollowUp = false;\n child.stdin.write(\n `${JSON.stringify(claudeCli!.claudeUserMessage(message, inputImages))}\\n`,\n );\n updateClaudeQueue();\n };\n\n const flushClaudeSteering = (): void => {\n if (claudeSteering.length === 0) return;\n const alreadySent = claudeSentInputs.some((entry) => entry.kind === \"steer\");\n if (claudeSteeringMode === \"one-at-a-time\" && alreadySent) return;\n const count = claudeSteeringMode === \"all\" ? claudeSteering.length : 1;\n for (const message of claudeSteering.splice(0, count)) {\n writeClaudeInput(\"steer\", message);\n }\n };\n\n const flushClaudeFollowUps = (): void => {\n if (claudeFollowUps.length === 0 || claudeSteering.length > 0) return;\n if (claudeSentInputs.some((entry) => entry.kind === \"steer\")) return;\n const alreadySent = claudeSentInputs.some((entry) => entry.kind === \"follow_up\");\n if (claudeFollowUpMode === \"one-at-a-time\" && alreadySent) return;\n const count = claudeFollowUpMode === \"all\" ? claudeFollowUps.length : 1;\n for (const message of claudeFollowUps.splice(0, count)) {\n writeClaudeInput(\"follow_up\", message);\n }\n };\n\n const scheduleClaudeClose = (): void => {\n if (claudeCloseTimer || terminalStatus) return;\n claudeCloseTimer = setTimeout(() => {\n claudeCloseTimer = undefined;\n if (\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0\n ) {\n child.stdin?.end();\n }\n }, 300);\n claudeCloseTimer.unref();\n };\n\n const processClaudeEvent = (event: Record<string, unknown>): void => {\n if (event.type === \"system\" && event.subtype === \"init\") {\n const sessionId = stringField(event.session_id);\n if (sessionId) record.runnerSessionId = sessionId;\n const model = stringField(event.model);\n if (model && !record.model) record.model = model;\n update();\n return;\n }\n if (event.type === \"assistant\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const assistant = message as Record<string, unknown>;\n const text = extractText(assistant);\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const content = assistant.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null || Array.isArray(block)) continue;\n const part = block as Record<string, unknown>;\n if (part.type !== \"tool_use\") continue;\n const id = stringField(part.id);\n const name = stringField(part.name);\n if (!id || !name || claudeTools.has(id)) continue;\n claudeTools.set(id, name);\n while (claudeTools.size > MAX_CLAUDE_PENDING_TOOLS) {\n const oldestToolId = claudeTools.keys().next().value;\n if (oldestToolId === undefined) break;\n claudeTools.delete(oldestToolId);\n }\n record.toolCalls++;\n record.currentTool = name;\n process.stdout.write(`\u2192 ${name}\\n`);\n }\n }\n const usage = assistant.usage;\n if (typeof usage === \"object\" && usage !== null && !Array.isArray(usage)) {\n const values = usage as Record<string, unknown>;\n const delta = {\n input: numberField(values.input_tokens),\n output: numberField(values.output_tokens),\n cacheRead: numberField(values.cache_read_input_tokens),\n cacheWrite: numberField(values.cache_creation_input_tokens),\n cost: 0,\n };\n claudeCurrentUsage.input += delta.input;\n claudeCurrentUsage.output += delta.output;\n claudeCurrentUsage.cacheRead += delta.cacheRead;\n claudeCurrentUsage.cacheWrite += delta.cacheWrite;\n syncClaudeUsage();\n emitTokenUsage(delta, { model: record.model ?? stringField(event.model) });\n }\n if (typeof event.error === \"string\") {\n sawAgentError = true;\n terminalError = event.error;\n }\n enforceTokenLimit();\n update();\n return;\n }\n if (event.type === \"user\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const content = (message as Record<string, unknown>).content;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (typeof block !== \"object\" || block === null || Array.isArray(block)) continue;\n const part = block as Record<string, unknown>;\n if (part.type !== \"tool_result\") continue;\n const id = stringField(part.tool_use_id);\n if (id) claudeTools.delete(id);\n }\n const current = [...claudeTools.values()].at(-1);\n if (current) record.currentTool = current;\n else delete record.currentTool;\n update();\n return;\n }\n if (event.type === \"stream_event\") {\n const streamEvent = event.event;\n if (typeof streamEvent !== \"object\" || streamEvent === null || Array.isArray(streamEvent)) return;\n const stream = streamEvent as Record<string, unknown>;\n if (stream.type !== \"content_block_start\") return;\n const contentBlock = stream.content_block;\n if (typeof contentBlock !== \"object\" || contentBlock === null || Array.isArray(contentBlock)) return;\n const block = contentBlock as Record<string, unknown>;\n const name = stringField(block.name);\n if (block.type === \"tool_use\" && name) {\n record.currentTool = name;\n update();\n }\n return;\n }\n if (event.type !== \"result\") return;\n claudeResultSeen = true;\n const sessionId = stringField(event.session_id);\n if (sessionId) record.runnerSessionId = sessionId;\n const resultText = typeof event.result === \"string\" ? event.result : \"\";\n if (resultText) record.text = latestRunText(resultText);\n if (event.structured_output !== undefined) record.value = event.structured_output;\n record.turns += Math.max(0, Math.floor(numberField(event.num_turns)));\n const resultUsage =\n typeof event.usage === \"object\" && event.usage !== null && !Array.isArray(event.usage)\n ? (event.usage as Record<string, unknown>)\n : undefined;\n // The result frame supersedes the assistant-frame stream for this turn:\n // fold any unreported assistant tokens into the result delta so cumulative\n // attribution stays exact without double-counting assistant emissions.\n const resultDelta = resultUsage\n ? {\n input: numberField(resultUsage.input_tokens) - claudeCurrentUsage.input,\n output: numberField(resultUsage.output_tokens) - claudeCurrentUsage.output,\n cacheRead:\n numberField(resultUsage.cache_read_input_tokens) - claudeCurrentUsage.cacheRead,\n cacheWrite:\n numberField(resultUsage.cache_creation_input_tokens) - claudeCurrentUsage.cacheWrite,\n cost: Math.max(0, numberField(event.total_cost_usd)),\n }\n : { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: Math.max(0, numberField(event.total_cost_usd)) };\n claudeCompletedUsage.input += resultUsage\n ? numberField(resultUsage.input_tokens)\n : claudeCurrentUsage.input;\n claudeCompletedUsage.output += resultUsage\n ? numberField(resultUsage.output_tokens)\n : claudeCurrentUsage.output;\n claudeCompletedUsage.cacheRead += resultUsage\n ? numberField(resultUsage.cache_read_input_tokens)\n : claudeCurrentUsage.cacheRead;\n claudeCompletedUsage.cacheWrite += resultUsage\n ? numberField(resultUsage.cache_creation_input_tokens)\n : claudeCurrentUsage.cacheWrite;\n claudeCompletedUsage.cost += Math.max(0, numberField(event.total_cost_usd));\n claudeCurrentUsage.input = 0;\n claudeCurrentUsage.output = 0;\n claudeCurrentUsage.cacheRead = 0;\n claudeCurrentUsage.cacheWrite = 0;\n syncClaudeUsage();\n emitTokenUsage(resultDelta, { model: record.model ?? stringField(event.model) });\n enforceTokenLimit();\n const failed = event.is_error === true || event.subtype !== \"success\";\n if (failed) {\n sawAgentError = true;\n const errors = Array.isArray(event.errors)\n ? event.errors.filter((value): value is string => typeof value === \"string\").join(\" \u00B7 \")\n : \"\";\n terminalError = errors || resultText || `Claude returned ${String(event.subtype ?? \"an error\")}`;\n claudeSteering.splice(0);\n claudeFollowUps.splice(0);\n } else {\n sawAgentError = false;\n if (!terminalStatus) terminalError = undefined;\n }\n if (failed || terminalStatus) claudeSentInputs.splice(0);\n else claudeSentInputs.shift();\n claudeCanFollowUp = !failed && !terminalStatus;\n delete record.currentTool;\n updateClaudeQueue();\n if (failed || terminalStatus) {\n child.stdin?.end();\n return;\n }\n flushClaudeSteering();\n if (claudeSentInputs.length === 0 && claudeSteering.length === 0) {\n flushClaudeFollowUps();\n }\n if (\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0\n ) {\n scheduleClaudeClose();\n }\n };\n\n const processEvent = (line: string): void => {\n if (process.env.PI_FABRIC_INJECT_CRASH === \"stream\") throw new Error(\"simulated stream crash\");\n if (!line.trim()) return;\n appendLog(`${line}\\n`);\n sessionStream?.write(`${line}\\n`);\n let event: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(line);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return;\n event = parsed as Record<string, unknown>;\n } catch {\n return;\n }\n if (options.runner === \"claude\") {\n processClaudeEvent(event);\n return;\n }\n compactControl.observe(event);\n if (modelControl.observe(event)) return;\n if (event.type === \"message_start\" || event.type === \"message_update\") {\n const message = event.message;\n if (typeof message === \"object\" && message !== null && !Array.isArray(message)) {\n modelControl.observeAssistant(message as Record<string, unknown>);\n }\n }\n if (event.type === \"agent_start\") {\n emitLifecycle(\"pi.agent_start\");\n retryPending = false;\n sawAgentError = false;\n if (!terminalStatus) terminalError = undefined;\n return;\n }\n if (event.type === \"response\" && event.command === \"prompt\" && event.success === false) {\n sawAgentError = true;\n if (!terminalStatus) terminalError = typeof event.error === \"string\" ? event.error : \"Pi rejected the prompt\";\n child.stdin?.end();\n return;\n }\n if (event.type === \"extension_ui_request\") {\n const method = event.method;\n if (\n typeof event.id === \"string\" &&\n (method === \"select\" || method === \"confirm\" || method === \"input\" || method === \"editor\")\n ) {\n child.stdin?.write(\n `${JSON.stringify({ type: \"extension_ui_response\", id: event.id, cancelled: true })}\\n`,\n );\n }\n return;\n }\n if (event.type === \"tool_execution_start\") {\n record.toolCalls++;\n if (typeof event.toolName === \"string\") {\n record.currentTool = event.toolName;\n process.stdout.write(`\u2192 ${event.toolName}\\n`);\n }\n update();\n return;\n }\n if (event.type === \"tool_execution_end\") {\n if (event.isError === true) {\n emitLifecycle(\"pi.tool_error\", {\n ...(typeof event.toolCallId === \"string\" ? { toolCallId: event.toolCallId } : {}),\n ...(typeof event.toolName === \"string\" ? { toolName: event.toolName } : {}),\n });\n }\n delete record.currentTool;\n update();\n return;\n }\n if (event.type === \"turn_end\") {\n emitLifecycle(\"pi.turn_end\", {\n ...(typeof event.turnIndex === \"number\" ? { turnIndex: event.turnIndex } : {}),\n });\n record.turns++;\n update();\n return;\n }\n if (event.type === \"queue_update\") {\n const steering = Array.isArray(event.steering)\n ? event.steering.filter((value): value is string => typeof value === \"string\")\n : [];\n const followUp = Array.isArray(event.followUp)\n ? event.followUp.filter((value): value is string => typeof value === \"string\")\n : [];\n record.pendingMessages = { steering, followUp };\n update();\n return;\n }\n if (event.type === \"message_end\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const messageRecord = message as Record<string, unknown>;\n if (messageRecord.role !== \"assistant\") return;\n const text = extractText(messageRecord);\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const usageDelta = extractUsageDelta(messageRecord);\n applyUsage(record, messageRecord);\n emitTokenUsage(usageDelta, {\n model: stringField(messageRecord.model),\n provider: stringField(messageRecord.provider),\n });\n modelControl.observeAssistant(messageRecord);\n enforceTokenLimit();\n if (messageRecord.stopReason === \"error\" && !terminalStatus) {\n sawAgentError = true;\n terminalError = assistantError(messageRecord);\n } else {\n sawAgentError = false;\n // Once a terminal cause is set (e.g. the per-child token guard), keep it;\n // a later non-error message_end must not clobber the reason we are\n // terminating for.\n if (!terminalStatus) terminalError = undefined;\n }\n update();\n return;\n }\n if (event.type === \"agent_end\") {\n emitLifecycle(\"pi.agent_end\", { willRetry: event.willRetry === true });\n retryPending = event.willRetry === true;\n return;\n }\n if (event.type === \"agent_settled\") {\n emitLifecycle(\"pi.agent_settled\");\n if (!retryPending) {\n // Pull controls that landed with the final stream events before deciding\n // whether this one-shot child can close. A queued compact keeps stdin\n // open until its correlated response and compaction_end are observed.\n pollSteer();\n compactControl.childSettled();\n }\n return;\n }\n if (event.type === \"compaction_end\") {\n emitLifecycle(\"pi.session_compact\", {\n ...(typeof event.reason === \"string\" ? { reason: event.reason } : {}),\n ...(typeof event.willRetry === \"boolean\" ? { willRetry: event.willRetry } : {}),\n });\n return;\n }\n if (event.type === \"extension_error\") {\n const error = typeof event.error === \"string\" ? event.error : \"Extension error\";\n stderr = `${stderr}\\n${error}`.trim().slice(-MAX_STDERR_CHARS);\n update();\n }\n };\n\n child.stdin?.on(\"error\", () => {});\n if (options.runner === \"claude\") {\n writeClaudeInput(\"initial\", task, images);\n } else if (options.runner === \"veda\") {\n // Veda reads the prompt from stdin when no positional prompt is given.\n // Mirror its <system_instructions> wrapping so systemPrompt and schema\n // instructions reach the backend model.\n const sections: string[] = [];\n if (options.systemPrompt) {\n sections.push(`<system_instructions>\\n${options.systemPrompt}\\n</system_instructions>`);\n }\n if (schema) {\n sections.push(\n `Your final response must contain only JSON matching this schema, without Markdown fences:\\n${schema}`,\n );\n }\n sections.push(task);\n child.stdin?.write(sections.join(\"\\n\\n\"));\n child.stdin?.end();\n } else {\n modelControl.start();\n }\n\n // Tail a control file (steer.jsonl) the parent appends to and forward each\n // queued command to the child pi over its RPC stdin. This is the fabric\n // steering channel: the orchestrator (or any peer via the mesh relay) can\n // interject a steer / follow_up / queue-mode command between the child's\n // turns without stopping and respawning it, preserving its context. The\n // poller is best-effort: a closed or ended stdin (settled/stopped child) is\n // swallowed so a late steer never crashes the worker.\n let steerOffset = 0;\n let steerRemainder = Buffer.alloc(0);\n let skippingOversizedSteerLine = false;\n const pollSteer = (): void => {\n if (!options.steerFile || terminalStatus || (options.runner === \"pi\" && !modelControl.ready)) return;\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(options.steerFile, \"r\");\n } catch {\n return;\n }\n try {\n const size = fs.fstatSync(descriptor).size;\n if (size < steerOffset) {\n steerOffset = 0;\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = false;\n }\n if (size <= steerOffset) return;\n const length = Math.min(size - steerOffset, STEER_READ_CHUNK_BYTES);\n const buffer = Buffer.allocUnsafe(length);\n const bytesRead = fs.readSync(descriptor, buffer, 0, length, steerOffset);\n steerOffset += bytesRead;\n let combined = Buffer.concat([steerRemainder, buffer.subarray(0, bytesRead)]);\n if (skippingOversizedSteerLine) {\n const skippedLineEnd = combined.indexOf(0x0a);\n if (skippedLineEnd < 0) return;\n combined = combined.subarray(skippedLineEnd + 1);\n skippingOversizedSteerLine = false;\n }\n const newline = combined.lastIndexOf(0x0a);\n if (newline < 0) {\n if (combined.length > MAX_STEER_LINE_BYTES) {\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = true;\n } else {\n steerRemainder = Buffer.from(combined);\n }\n return;\n }\n const remainder = combined.subarray(newline + 1);\n if (remainder.length > MAX_STEER_LINE_BYTES) {\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = true;\n } else {\n steerRemainder = Buffer.from(remainder);\n }\n let processedCommands = 0;\n for (const raw of combined.subarray(0, newline + 1).toString(\"utf8\").split(\"\\n\")) {\n if (processedCommands >= MAX_STEER_COMMANDS_PER_POLL) break;\n if (Buffer.byteLength(raw, \"utf8\") > MAX_STEER_LINE_BYTES) continue;\n const line = raw.trim();\n if (!line) continue;\n processedCommands += 1;\n let command: { type?: string; message?: string; mode?: string; instructions?: string };\n try {\n command = JSON.parse(line);\n } catch {\n continue;\n }\n try {\n if (options.runner === \"claude\") {\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n claudeCloseTimer = undefined;\n if (command.type === \"steer\" && typeof command.message === \"string\") {\n enqueueClaudeControl(claudeSteering, command.message);\n flushClaudeSteering();\n } else if (command.type === \"follow_up\" && typeof command.message === \"string\") {\n enqueueClaudeControl(claudeFollowUps, command.message);\n if (claudeCanFollowUp && claudeSentInputs.length === 0) flushClaudeFollowUps();\n } else if (\n command.type === \"set_steering_mode\" &&\n (command.mode === \"all\" || command.mode === \"one-at-a-time\")\n ) {\n claudeSteeringMode = command.mode;\n flushClaudeSteering();\n } else if (\n command.type === \"set_follow_up_mode\" &&\n (command.mode === \"all\" || command.mode === \"one-at-a-time\")\n ) {\n claudeFollowUpMode = command.mode;\n if (claudeCanFollowUp && claudeSentInputs.length === 0) flushClaudeFollowUps();\n }\n updateClaudeQueue();\n } else if (options.runner === \"veda\") {\n // Steering is unsupported for the veda runner: Veda executes one\n // headless prompt per invocation. The command is dropped, never\n // forwarded to pi-style stdin frames.\n } else if (command.type === \"steer\" && typeof command.message === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"steer\", message: command.message }) + \"\\n\");\n } else if (command.type === \"follow_up\" && typeof command.message === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"follow_up\", message: command.message }) + \"\\n\");\n } else if (command.type === \"set_steering_mode\" && typeof command.mode === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"set_steering_mode\", mode: command.mode }) + \"\\n\");\n } else if (command.type === \"set_follow_up_mode\" && typeof command.mode === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"set_follow_up_mode\", mode: command.mode }) + \"\\n\");\n } else if (command.type === \"compact\") {\n compactControl.queue(command.instructions);\n }\n } catch {\n /* stdin closed (settled/stopped child); a late steer is dropped */\n }\n }\n } finally {\n fs.closeSync(descriptor);\n }\n };\n const steerTimer = options.steerFile ? setInterval(pollSteer, 200) : undefined;\n steerTimer?.unref?.();\n\n const failOversizedEvent = (line: string): void => {\n const prefix = line.slice(0, MAX_EVENT_LINE_CHARS);\n let artifactPath: string | undefined;\n try {\n artifactPath = path.join(path.dirname(options.logFile), \"oversized-event-prefix.txt\");\n fs.writeFileSync(artifactPath, prefix, { encoding: \"utf8\", mode: 0o600 });\n } catch {\n artifactPath = undefined;\n }\n terminalStatus = \"failed\";\n terminalError = artifactPath\n ? `Agent emitted an oversized event line; first ${prefix.length} characters saved to: ${artifactPath}`\n : \"Agent emitted an oversized event line\";\n outputBuffer = \"\";\n terminateChild(child, \"SIGTERM\");\n };\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n const decoded = outputDecoder.write(chunk);\n if (options.runner === \"veda\") {\n vedaOutput += decoded;\n return;\n }\n outputBuffer += eventProjection ? eventProjection.write(decoded) : decoded;\n while (true) {\n const newline = outputBuffer.indexOf(\"\\n\");\n if (newline < 0) {\n // Redundant Pi lifecycle history has already been elided while streaming.\n // Keep the cap on authoritative messages and all other event fields;\n // broad base64/text redaction must not bypass this safety boundary.\n if (outputBuffer.length > MAX_EVENT_LINE_CHARS) failOversizedEvent(outputBuffer);\n break;\n }\n if (newline > MAX_EVENT_LINE_CHARS) {\n // The retained record still exceeds the cap. Preserve bounded evidence;\n // do not use broad text redaction to keep an anomalous run alive.\n failOversizedEvent(outputBuffer.slice(0, newline));\n return;\n }\n const line = outputBuffer.slice(0, newline).replace(/\\r$/, \"\");\n outputBuffer = outputBuffer.slice(newline + 1);\n processEvent(line);\n }\n });\n const recordStderr = (text: string): void => {\n if (!text) return;\n appendLog(`${JSON.stringify({ type: \"worker_stderr\", text })}\\n`);\n process.stderr.write(text);\n stderr = `${stderr}${text}`.slice(-MAX_STDERR_CHARS);\n };\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n recordStderr(stderrDecoder.write(chunk));\n });\n child.stderr?.on(\"error\", () => {});\n\n const timeout = setTimeout(() => {\n if (terminalStatus) return;\n terminalStatus = \"timed_out\";\n terminalError = `Agent timed out after ${options.timeoutMs}ms`;\n if (options.runner === \"pi\" && !modelControl.ready) {\n terminalError += \"; Pi model admission did not complete; task was not sent\";\n }\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n }, options.timeoutMs);\n timeout.unref();\n\n const stop = (): void => {\n if (terminalStatus) return;\n terminalStatus = \"stopped\";\n terminalError = \"Agent stopped\";\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n };\n process.once(\"SIGTERM\", stop);\n process.once(\"SIGINT\", stop);\n process.once(\"SIGHUP\", stop);\n\n const exitCode = await new Promise<number | null>((resolve) => {\n child.once(\"error\", (error) => {\n terminalStatus = \"failed\";\n terminalError = error.message;\n resolve(null);\n });\n child.once(\"close\", (code) => resolve(code));\n });\n\n if (steerTimer) clearInterval(steerTimer);\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n clearTimeout(timeout);\n if (options.runner === \"pi\" && !modelControl.ready && !terminalStatus) {\n terminalStatus = \"failed\";\n terminalError = `Child Pi exited before requested model admission completed; task was not sent${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`;\n }\n if (process.env.PI_FABRIC_INJECT_CRASH === \"close\") throw new Error(\"simulated close crash\");\n if (options.runner === \"veda\") {\n vedaOutput += outputDecoder.end();\n } else {\n const tail = outputDecoder.end();\n outputBuffer += eventProjection ? eventProjection.write(tail) + eventProjection.end() : tail;\n }\n recordStderr(stderrDecoder.end());\n if (options.runner === \"veda\") {\n const trimmed = vedaOutput.trim();\n if (trimmed) {\n try {\n const parsed = parseStructuredValue(trimmed);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n vedaParsed = parsed as Record<string, unknown>;\n const text = stringField(vedaParsed.text) ?? \"\";\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const sessionId = stringField(vedaParsed.sessionId);\n if (sessionId) record.runnerSessionId = sessionId;\n const usage = vedaParsed.usage;\n if (typeof usage === \"object\" && usage !== null && !Array.isArray(usage)) {\n const values = usage as Record<string, unknown>;\n const input = numberField(values.inputTokens);\n const output = numberField(values.outputTokens);\n const cacheRead = numberField(values.cachedTokens);\n const cost = typeof values.costUsd === \"number\" ? values.costUsd : 0;\n record.usage = { input, output, cacheRead, cacheWrite: 0, cost };\n emitTokenUsage({ input, output, cacheRead, cacheWrite: 0, cost }, { model: stringField(vedaParsed.model) });\n }\n const envelopeErrors: string[] = [];\n const error = stringField(vedaParsed.error);\n if (error) envelopeErrors.push(error);\n // navigator-plan gates the response on a <program> design block and\n // the worker persona on a <worker_report>; both exit non-zero and\n // report failure only via design/worker fields, not envelope.error.\n for (const key of [\"design\", \"worker\"] as const) {\n const gate = vedaParsed[key];\n if (typeof gate !== \"object\" || gate === null || Array.isArray(gate)) continue;\n const status = gate as Record<string, unknown>;\n if (status.ok !== false) continue;\n const details = Array.isArray(status.errors)\n ? status.errors.filter((entry): entry is string => typeof entry === \"string\").join(\"; \")\n : [stringField(status.reason), stringField(status.detail)]\n .filter((entry): entry is string => entry !== undefined)\n .join(\": \");\n envelopeErrors.push(`Veda ${key} failed${details ? `: ${details}` : \"\"}`);\n }\n if (envelopeErrors.length > 0) {\n sawAgentError = true;\n terminalError = envelopeErrors.join(\"\\n\");\n }\n record.turns += 1;\n update();\n }\n } catch {\n // Unparseable stdout; the generic failed-record path reports stderr.\n }\n }\n } else if (outputBuffer.trim()) {\n processEvent(outputBuffer);\n }\n record.exitCode = exitCode;\n record.stderr = stderr.slice(-MAX_STDERR_CHARS);\n if (\n record.compaction?.status === \"queued\" ||\n record.compaction?.status === \"in_flight\"\n ) {\n const error = terminalError ?? \"Child Pi exited before the queued compaction completed\";\n record.compaction = {\n ...record.compaction,\n status: \"failed\",\n updatedAt: Date.now(),\n finishedAt: Date.now(),\n error,\n };\n if (!terminalStatus) {\n terminalStatus = \"failed\";\n terminalError = error;\n }\n }\n record.finishedAt = Date.now();\n record.updatedAt = record.finishedAt;\n const childCompleted =\n exitCode === 0 &&\n !sawAgentError &&\n (options.runner === \"pi\" ||\n (options.runner === \"claude\" &&\n claudeResultSeen &&\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0) ||\n (options.runner === \"veda\" && vedaParsed !== undefined));\n record.status = terminalStatus ?? (childCompleted ? \"completed\" : \"failed\");\n if (terminalError) record.error = terminalError;\n if (record.status === \"failed\" && !record.error) {\n record.error =\n stderr.trim() ||\n (exitCode === 0\n ? `${runnerLabel(options.runner)} agent reported an error before exiting`\n : `${runnerLabel(options.runner)} exited with code ${exitCode ?? \"unknown\"}`);\n }\n if (record.status === \"completed\" && options.schemaFile) {\n try {\n const schema = JSON.parse(fs.readFileSync(options.schemaFile, \"utf8\")) as Record<\n string,\n unknown\n >;\n validateAgentResult(record, schema);\n } catch (error) {\n record.status = \"failed\";\n const reason = error instanceof Error ? error.message : String(error);\n const output = record.text.trim();\n const snippet = output.slice(0, 200);\n record.error = `Structured agent output was invalid: ${reason}${snippet ? ` (output: ${snippet}${output.length > 200 ? \"\u2026\" : \"\"})` : \"\"}`;\n }\n }\n delete record.currentTool;\n writeRunRecord(options.statusFile, record);\n terminalWritten = true;\n process.stdout.write(`\\n[pi-fabric] ${record.status}\\n`);\n await new Promise<void>((resolve) =>\n sessionStream ? sessionStream.end(resolve) : resolve(),\n );\n process.exitCode = record.status === \"completed\" ? 0 : 1;\n};\n\nmain().catch((error) => {\n console.error(error instanceof Error ? (error.stack ?? error.message) : String(error));\n writeCrashStatus(error);\n process.exit(1);\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["sessionId", "schema"]
7
7
  }
package/docs/agents.md CHANGED
@@ -34,6 +34,12 @@ You can give `fabric_exec` optional `agentBudget` and `tokenBudget` limits. Conf
34
34
 
35
35
  Durable spawns use the same inbox. Undelivered envelopes survive disconnects; receipts survive reconnects. Escape or an errored Main turn parks pending results until new input rather than immediately restarting Main. Explicit lifecycle subscriptions, actor messages, and trajectory handoffs retain their separate delivery policies. A terminal run can still report incomplete work; Main must inspect its result.
36
36
 
37
+ ### Image-heavy lifecycle events
38
+
39
+ Pi repeats message history in `agent_end.messages` and tool results in `turn_end.toolResults`. Fabric streams past these redundant top-level fields, recording empty arrays in the worker event log. Large accumulated histories therefore do not trip the event-size guard or interrupt completion/retries. Authoritative message/tool events, final text, usage, and Pi's persisted session history are unchanged.
40
+
41
+ The 4,194,304-character guard still applies to other event data, including a single oversized authoritative message. It is not a model token limit. Already-running workers keep their loaded implementation; newly launched workers use the rebuilt/updated package.
42
+
37
43
  ### Reuse discovered model keys
38
44
 
39
45
  Use `agents.models({ runner: "pi" })` and copy the returned `key` verbatim, or use an explicitly configured `models.aliases` name. Reuse the `model` returned by a successful spawn rather than reconstructing it from an agent's display name. For example, an agent named “Sol” need not share the version number of one named “Astra”. Prior success with one key does not validate a different key.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-fabric",
3
- "version": "0.92.41",
3
+ "version": "0.92.42",
4
4
  "description": "A programmable tool and agent runtime for Pi",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",