pi-fabric 0.96.1 → 0.96.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/worker/recovery-watchdog.d.ts +12 -0
- package/dist/worker/recovery-watchdog.d.ts.map +1 -0
- package/dist/worker/recovery-watchdog.js +41 -0
- package/dist/worker/recovery-watchdog.js.map +7 -0
- package/dist/worker.js +70 -20
- package/dist/worker.js.map +2 -2
- package/docs/agents.md +6 -0
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const PI_RECOVERY_TIMEOUT_MS = 60000;
|
|
2
|
+
/** Bounds stalled Pi error recovery, not healthy inference or tool execution. */
|
|
3
|
+
export declare class PiRecoveryWatchdog {
|
|
4
|
+
#private;
|
|
5
|
+
private readonly fail;
|
|
6
|
+
constructor(fail: (error: string) => void);
|
|
7
|
+
arm(reason: string): void;
|
|
8
|
+
progress(): void;
|
|
9
|
+
clear(): void;
|
|
10
|
+
dispose(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=recovery-watchdog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-watchdog.d.ts","sourceRoot":"","sources":["../../src/worker/recovery-watchdog.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,iFAAiF;AACjF,qBAAa,kBAAkB;;IAKjB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IAE1D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAazB,QAAQ,IAAI,IAAI;IAOhB,KAAK,IAAI,IAAI;IAMb,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// src/worker/recovery-watchdog.ts
|
|
2
|
+
var PI_RECOVERY_TIMEOUT_MS = 6e4;
|
|
3
|
+
var PiRecoveryWatchdog = class {
|
|
4
|
+
constructor(fail) {
|
|
5
|
+
this.fail = fail;
|
|
6
|
+
}
|
|
7
|
+
#timer;
|
|
8
|
+
#reason;
|
|
9
|
+
#disposed = false;
|
|
10
|
+
arm(reason) {
|
|
11
|
+
if (this.#disposed) return;
|
|
12
|
+
this.#reason = reason;
|
|
13
|
+
if (this.#timer) return;
|
|
14
|
+
this.#timer = setTimeout(() => {
|
|
15
|
+
const error = this.#reason;
|
|
16
|
+
this.dispose();
|
|
17
|
+
this.fail(`${error}; Pi made no recovery progress for ${PI_RECOVERY_TIMEOUT_MS}ms; terminating child`);
|
|
18
|
+
}, PI_RECOVERY_TIMEOUT_MS);
|
|
19
|
+
this.#timer.unref?.();
|
|
20
|
+
}
|
|
21
|
+
progress() {
|
|
22
|
+
if (!this.#reason || this.#disposed) return;
|
|
23
|
+
const reason = this.#reason;
|
|
24
|
+
this.clear();
|
|
25
|
+
this.arm(reason);
|
|
26
|
+
}
|
|
27
|
+
clear() {
|
|
28
|
+
if (this.#timer) clearTimeout(this.#timer);
|
|
29
|
+
this.#timer = void 0;
|
|
30
|
+
this.#reason = void 0;
|
|
31
|
+
}
|
|
32
|
+
dispose() {
|
|
33
|
+
this.clear();
|
|
34
|
+
this.#disposed = true;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export {
|
|
38
|
+
PI_RECOVERY_TIMEOUT_MS,
|
|
39
|
+
PiRecoveryWatchdog
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=recovery-watchdog.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/worker/recovery-watchdog.ts"],
|
|
4
|
+
"sourcesContent": ["export const PI_RECOVERY_TIMEOUT_MS = 60_000;\n\n/** Bounds stalled Pi error recovery, not healthy inference or tool execution. */\nexport class PiRecoveryWatchdog {\n #timer: ReturnType<typeof setTimeout> | undefined;\n #reason: string | undefined;\n #disposed = false;\n\n constructor(private readonly fail: (error: string) => void) {}\n\n arm(reason: string): void {\n if (this.#disposed) return;\n this.#reason = reason;\n // Repeated errors, retry announcements and lifecycle chatter are not progress.\n if (this.#timer) return;\n this.#timer = setTimeout(() => {\n const error = this.#reason;\n this.dispose();\n this.fail(`${error}; Pi made no recovery progress for ${PI_RECOVERY_TIMEOUT_MS}ms; terminating child`);\n }, PI_RECOVERY_TIMEOUT_MS);\n this.#timer.unref?.();\n }\n\n progress(): void {\n if (!this.#reason || this.#disposed) return;\n const reason = this.#reason;\n this.clear();\n this.arm(reason);\n }\n\n clear(): void {\n if (this.#timer) clearTimeout(this.#timer);\n this.#timer = undefined;\n this.#reason = undefined;\n }\n\n dispose(): void {\n this.clear();\n this.#disposed = true;\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAAO,IAAM,yBAAyB;AAG/B,IAAM,qBAAN,MAAyB;AAAA,EAK9B,YAA6B,MAA+B;AAA/B;AAAA,EAAgC;AAAA,EAJ7D;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EAIZ,IAAI,QAAsB;AACxB,QAAI,KAAK,UAAW;AACpB,SAAK,UAAU;AAEf,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS,WAAW,MAAM;AAC7B,YAAM,QAAQ,KAAK;AACnB,WAAK,QAAQ;AACb,WAAK,KAAK,GAAG,KAAK,sCAAsC,sBAAsB,uBAAuB;AAAA,IACvG,GAAG,sBAAsB;AACzB,SAAK,OAAO,QAAQ;AAAA,EACtB;AAAA,EAEA,WAAiB;AACf,QAAI,CAAC,KAAK,WAAW,KAAK,UAAW;AACrC,UAAM,SAAS,KAAK;AACpB,SAAK,MAAM;AACX,SAAK,IAAI,MAAM;AAAA,EACjB;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,OAAQ,cAAa,KAAK,MAAM;AACzC,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAAgB;AACd,SAAK,MAAM;AACX,SAAK,YAAY;AAAA,EACnB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/worker.js
CHANGED
|
@@ -17,6 +17,11 @@ var loadWorkerModelControl = async () => {
|
|
|
17
17
|
const sourceModulePath = "./worker/model-control.ts";
|
|
18
18
|
return import(sourceModulePath);
|
|
19
19
|
};
|
|
20
|
+
var loadWorkerRecovery = async () => {
|
|
21
|
+
if (!import.meta.url.endsWith(".ts")) return import("./worker/recovery-watchdog.js");
|
|
22
|
+
const sourceModulePath = "./worker/recovery-watchdog.ts";
|
|
23
|
+
return import(sourceModulePath);
|
|
24
|
+
};
|
|
20
25
|
var loadAgentResult = async () => {
|
|
21
26
|
if (!import.meta.url.endsWith(".ts")) return import("./agents/result.js");
|
|
22
27
|
const sourceModulePath = "./agents/result.ts";
|
|
@@ -138,13 +143,14 @@ process.on("unhandledRejection", (error) => {
|
|
|
138
143
|
process.exit(1);
|
|
139
144
|
});
|
|
140
145
|
var main = async () => {
|
|
141
|
-
const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, { parseStructuredValue, validateAgentResult }, { PiModelControl }, { PiEventProjection }] = await Promise.all([
|
|
146
|
+
const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, { parseStructuredValue, validateAgentResult }, { PiModelControl }, { PiEventProjection }, { PiRecoveryWatchdog }] = await Promise.all([
|
|
142
147
|
loadWorkerOptions(),
|
|
143
148
|
loadWorkerRunRecord(),
|
|
144
149
|
loadWorkerSessionExport(),
|
|
145
150
|
loadAgentResult(),
|
|
146
151
|
loadWorkerModelControl(),
|
|
147
|
-
loadWorkerEventProjection()
|
|
152
|
+
loadWorkerEventProjection(),
|
|
153
|
+
loadWorkerRecovery()
|
|
148
154
|
]);
|
|
149
155
|
runRecordHelpers = loadedRunRecordHelpers;
|
|
150
156
|
const {
|
|
@@ -284,6 +290,36 @@ ${schema}`
|
|
|
284
290
|
let sawAgentError = false;
|
|
285
291
|
let retryPending = false;
|
|
286
292
|
const update = () => updateRunRecord(options.statusFile, record);
|
|
293
|
+
let killTimer;
|
|
294
|
+
let closeTimer;
|
|
295
|
+
const recoveryWatchdog = new PiRecoveryWatchdog((error) => failStalledChild(error));
|
|
296
|
+
const killChild = () => {
|
|
297
|
+
recoveryWatchdog.dispose();
|
|
298
|
+
if (closeTimer) clearTimeout(closeTimer);
|
|
299
|
+
terminateChild(child, "SIGTERM");
|
|
300
|
+
killTimer ??= setTimeout(() => terminateChild(child, "SIGKILL"), KILL_GRACE_MS);
|
|
301
|
+
killTimer.unref();
|
|
302
|
+
child.stdin?.end();
|
|
303
|
+
};
|
|
304
|
+
const failStalledChild = (error) => {
|
|
305
|
+
if (terminalStatus) return;
|
|
306
|
+
terminalStatus = "failed";
|
|
307
|
+
terminalError = error;
|
|
308
|
+
record.error = error;
|
|
309
|
+
update();
|
|
310
|
+
appendLog(`${JSON.stringify({ type: "fabric_recovery_error", error })}
|
|
311
|
+
`);
|
|
312
|
+
killChild();
|
|
313
|
+
};
|
|
314
|
+
const closeChild = () => {
|
|
315
|
+
child.stdin?.end();
|
|
316
|
+
recoveryWatchdog.clear();
|
|
317
|
+
if (closeTimer || killTimer) return;
|
|
318
|
+
closeTimer = setTimeout(() => failStalledChild(
|
|
319
|
+
`${terminalError ?? "Child Pi settled"}; child did not exit after stdin closed for ${KILL_GRACE_MS}ms`
|
|
320
|
+
), KILL_GRACE_MS);
|
|
321
|
+
closeTimer.unref();
|
|
322
|
+
};
|
|
287
323
|
const modelControl = new PiModelControl(options.id, options.model, thinking, {
|
|
288
324
|
send(frame) {
|
|
289
325
|
if (terminalStatus) return;
|
|
@@ -313,9 +349,7 @@ ${schema}`
|
|
|
313
349
|
update();
|
|
314
350
|
appendLog(`${JSON.stringify({ type: "fabric_model_error", requestedModel: options.model, model: record.model, error })}
|
|
315
351
|
`);
|
|
316
|
-
|
|
317
|
-
setTimeout(() => terminateChild(child, "SIGKILL"), KILL_GRACE_MS).unref();
|
|
318
|
-
child.stdin?.end();
|
|
352
|
+
killChild();
|
|
319
353
|
}
|
|
320
354
|
});
|
|
321
355
|
const lastEmittedUsage = emptyUsage();
|
|
@@ -364,9 +398,7 @@ ${schema}`
|
|
|
364
398
|
child.stdin.write(`${JSON.stringify(frame)}
|
|
365
399
|
`);
|
|
366
400
|
},
|
|
367
|
-
close
|
|
368
|
-
child.stdin?.end();
|
|
369
|
-
},
|
|
401
|
+
close: closeChild,
|
|
370
402
|
update(status) {
|
|
371
403
|
record.compaction = status;
|
|
372
404
|
update();
|
|
@@ -378,9 +410,7 @@ ${schema}`
|
|
|
378
410
|
if (total <= options.maxTokens) return;
|
|
379
411
|
terminalStatus = "timed_out";
|
|
380
412
|
terminalError = `Fabric token limit reached: ${total} tokens (limit ${options.maxTokens} set by agents.maxTokensPerChild); terminating child. The count is cumulative across the run and includes cache reads/writes, so it grows every turn; raise or disable agents.maxTokensPerChild in /fabric settings (0 disables), or split the task into smaller agent runs.`;
|
|
381
|
-
|
|
382
|
-
setTimeout(() => terminateChild(child, "SIGKILL"), KILL_GRACE_MS).unref();
|
|
383
|
-
child.stdin?.end();
|
|
413
|
+
killChild();
|
|
384
414
|
};
|
|
385
415
|
const claudeTools = /* @__PURE__ */ new Map();
|
|
386
416
|
const claudeCompletedUsage = emptyUsage();
|
|
@@ -639,17 +669,33 @@ ${text}
|
|
|
639
669
|
modelControl.observeAssistant(message);
|
|
640
670
|
}
|
|
641
671
|
}
|
|
672
|
+
if (event.type === "message_update" && !terminalStatus) {
|
|
673
|
+
const delta = event.assistantMessageEvent;
|
|
674
|
+
if (delta && ["text_delta", "thinking_delta", "toolcall_delta"].includes(String(delta.type)) && typeof delta.delta === "string" && delta.delta.length > 0) recoveryWatchdog.progress();
|
|
675
|
+
}
|
|
642
676
|
if (event.type === "agent_start") {
|
|
643
677
|
emitLifecycle("pi.agent_start");
|
|
644
678
|
retryPending = false;
|
|
645
|
-
|
|
646
|
-
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
if (event.type === "auto_retry_start" && !terminalStatus) {
|
|
682
|
+
retryPending = true;
|
|
683
|
+
recoveryWatchdog.arm(terminalError ?? stringField(event.errorMessage) ?? "Pi retry stalled");
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
if (event.type === "auto_retry_end" && !terminalStatus) {
|
|
687
|
+
retryPending = false;
|
|
688
|
+
if (event.success === false) {
|
|
689
|
+
sawAgentError = true;
|
|
690
|
+
terminalError = stringField(event.finalError) ?? terminalError ?? "Pi retries exhausted";
|
|
691
|
+
recoveryWatchdog.arm(terminalError);
|
|
692
|
+
}
|
|
647
693
|
return;
|
|
648
694
|
}
|
|
649
695
|
if (event.type === "response" && event.command === "prompt" && event.success === false) {
|
|
650
696
|
sawAgentError = true;
|
|
651
697
|
if (!terminalStatus) terminalError = typeof event.error === "string" ? event.error : "Pi rejected the prompt";
|
|
652
|
-
|
|
698
|
+
closeChild();
|
|
653
699
|
return;
|
|
654
700
|
}
|
|
655
701
|
if (event.type === "extension_ui_request") {
|
|
@@ -718,10 +764,12 @@ ${text}
|
|
|
718
764
|
});
|
|
719
765
|
modelControl.observeAssistant(messageRecord);
|
|
720
766
|
enforceTokenLimit();
|
|
721
|
-
if (messageRecord.stopReason === "error" && !terminalStatus) {
|
|
767
|
+
if ((messageRecord.stopReason === "error" || messageRecord.stopReason === "aborted") && !terminalStatus) {
|
|
722
768
|
sawAgentError = true;
|
|
723
769
|
terminalError = assistantError(messageRecord);
|
|
770
|
+
recoveryWatchdog.arm(terminalError);
|
|
724
771
|
} else {
|
|
772
|
+
recoveryWatchdog.clear();
|
|
725
773
|
sawAgentError = false;
|
|
726
774
|
if (!terminalStatus) terminalError = void 0;
|
|
727
775
|
}
|
|
@@ -731,6 +779,7 @@ ${text}
|
|
|
731
779
|
if (event.type === "agent_end") {
|
|
732
780
|
emitLifecycle("pi.agent_end", { willRetry: event.willRetry === true });
|
|
733
781
|
retryPending = event.willRetry === true;
|
|
782
|
+
if (retryPending && !terminalStatus) recoveryWatchdog.arm(terminalError ?? "Pi announced a retry but did not resume");
|
|
734
783
|
return;
|
|
735
784
|
}
|
|
736
785
|
if (event.type === "agent_settled") {
|
|
@@ -889,7 +938,7 @@ ${schema}`
|
|
|
889
938
|
terminalStatus = "failed";
|
|
890
939
|
terminalError = artifactPath ? `Agent emitted an oversized event line; first ${prefix.length} characters saved to: ${artifactPath}` : "Agent emitted an oversized event line";
|
|
891
940
|
outputBuffer = "";
|
|
892
|
-
|
|
941
|
+
killChild();
|
|
893
942
|
};
|
|
894
943
|
child.stdout?.on("data", (chunk) => {
|
|
895
944
|
const decoded = outputDecoder.write(chunk);
|
|
@@ -932,16 +981,14 @@ ${schema}`
|
|
|
932
981
|
if (options.runner === "pi" && !modelControl.ready) {
|
|
933
982
|
terminalError += "; Pi model admission did not complete; task was not sent";
|
|
934
983
|
}
|
|
935
|
-
|
|
936
|
-
setTimeout(() => terminateChild(child, "SIGKILL"), KILL_GRACE_MS).unref();
|
|
984
|
+
killChild();
|
|
937
985
|
}, options.timeoutMs);
|
|
938
986
|
timeout.unref();
|
|
939
987
|
const stop = () => {
|
|
940
988
|
if (terminalStatus) return;
|
|
941
989
|
terminalStatus = "stopped";
|
|
942
990
|
terminalError = "Agent stopped";
|
|
943
|
-
|
|
944
|
-
setTimeout(() => terminateChild(child, "SIGKILL"), KILL_GRACE_MS).unref();
|
|
991
|
+
killChild();
|
|
945
992
|
};
|
|
946
993
|
process.once("SIGTERM", stop);
|
|
947
994
|
process.once("SIGINT", stop);
|
|
@@ -957,6 +1004,9 @@ ${schema}`
|
|
|
957
1004
|
if (steerTimer) clearInterval(steerTimer);
|
|
958
1005
|
if (claudeCloseTimer) clearTimeout(claudeCloseTimer);
|
|
959
1006
|
clearTimeout(timeout);
|
|
1007
|
+
if (killTimer) clearTimeout(killTimer);
|
|
1008
|
+
if (closeTimer) clearTimeout(closeTimer);
|
|
1009
|
+
recoveryWatchdog.dispose();
|
|
960
1010
|
if (options.runner === "pi" && !modelControl.ready && !terminalStatus) {
|
|
961
1011
|
terminalStatus = "failed";
|
|
962
1012
|
terminalError = `Child Pi exited before requested model admission completed; task was not sent${stderr.trim() ? `: ${stderr.trim()}` : ""}`;
|
package/dist/worker.js.map
CHANGED
|
@@ -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 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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",
|
|
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 WorkerRecoveryModule = typeof import(\"./worker/recovery-watchdog.js\");\n\nconst loadWorkerRecovery = async (): Promise<WorkerRecoveryModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/recovery-watchdog.js\");\n const sourceModulePath = \"./worker/recovery-watchdog.ts\";\n return import(sourceModulePath) as Promise<WorkerRecoveryModule>;\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 }, { PiRecoveryWatchdog }] = await Promise.all([\n loadWorkerOptions(),\n loadWorkerRunRecord(),\n loadWorkerSessionExport(),\n loadAgentResult(),\n loadWorkerModelControl(),\n loadWorkerEventProjection(),\n loadWorkerRecovery(),\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 let killTimer: NodeJS.Timeout | undefined;\n let closeTimer: NodeJS.Timeout | undefined;\n const recoveryWatchdog = new PiRecoveryWatchdog((error) => failStalledChild(error));\n const killChild = (): void => {\n recoveryWatchdog.dispose();\n if (closeTimer) clearTimeout(closeTimer);\n terminateChild(child, \"SIGTERM\");\n killTimer ??= setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS);\n killTimer.unref();\n child.stdin?.end();\n };\n const failStalledChild = (error: string): void => {\n if (terminalStatus) return;\n terminalStatus = \"failed\";\n terminalError = error;\n record.error = error;\n update();\n appendLog(`${JSON.stringify({ type: \"fabric_recovery_error\", error })}\\n`);\n killChild();\n };\n const closeChild = (): void => {\n child.stdin?.end();\n recoveryWatchdog.clear();\n if (closeTimer || killTimer) return;\n // RPC EOF requests disposal, but a stuck extension can prevent process exit.\n closeTimer = setTimeout(() => failStalledChild(\n `${terminalError ?? \"Child Pi settled\"}; child did not exit after stdin closed for ${KILL_GRACE_MS}ms`,\n ), KILL_GRACE_MS);\n closeTimer.unref();\n };\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 killChild();\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: closeChild,\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 killChild();\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 === \"message_update\" && !terminalStatus) {\n const delta = event.assistantMessageEvent as Record<string, unknown> | undefined;\n if (delta && [\"text_delta\", \"thinking_delta\", \"toolcall_delta\"].includes(String(delta.type)) &&\n typeof delta.delta === \"string\" && delta.delta.length > 0) recoveryWatchdog.progress();\n }\n if (event.type === \"agent_start\") {\n emitLifecycle(\"pi.agent_start\");\n retryPending = false;\n // Starting a retry is not proof of recovery: preserve the error and timer\n // until the model actually produces output.\n return;\n }\n if (event.type === \"auto_retry_start\" && !terminalStatus) {\n retryPending = true;\n recoveryWatchdog.arm(terminalError ?? stringField(event.errorMessage) ?? \"Pi retry stalled\");\n return;\n }\n if (event.type === \"auto_retry_end\" && !terminalStatus) {\n retryPending = false;\n if (event.success === false) {\n sawAgentError = true;\n terminalError = stringField(event.finalError) ?? terminalError ?? \"Pi retries exhausted\";\n recoveryWatchdog.arm(terminalError);\n }\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 closeChild();\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\" || messageRecord.stopReason === \"aborted\") && !terminalStatus) {\n sawAgentError = true;\n terminalError = assistantError(messageRecord);\n recoveryWatchdog.arm(terminalError);\n } else {\n recoveryWatchdog.clear();\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 if (retryPending && !terminalStatus) recoveryWatchdog.arm(terminalError ?? \"Pi announced a retry but did not resume\");\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 killChild();\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 killChild();\n }, options.timeoutMs);\n timeout.unref();\n\n const stop = (): void => {\n if (terminalStatus) return;\n terminalStatus = \"stopped\";\n terminalError = \"Agent stopped\";\n killChild();\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 (killTimer) clearTimeout(killTimer);\n if (closeTimer) clearTimeout(closeTimer);\n recoveryWatchdog.dispose();\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; Main does not restart immediately. 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
|
+
### Stalled Pi error recovery
|
|
38
|
+
|
|
39
|
+
After a failed or aborted assistant response (including `Error: Terminated`), Fabric allows Pi's own retries to recover. If no recovery output arrives for 60 seconds, the worker fails the run with the original error and terminates the child, escalating from SIGTERM to SIGKILL after another 5 seconds. Repeated retry announcements, errors, or lifecycle events do not extend this deadline. Nonempty text/thinking/tool-call deltas refresh it; a successful assistant response clears it. Healthy inference and tool execution are not subject to this recovery timer, and the overall run deadline still applies.
|
|
40
|
+
|
|
41
|
+
Fabric handles exhausted retries explicitly instead of waiting forever on an earlier `willRetry` flag. Child shutdown after RPC stdin closes is also bounded: 5 seconds for graceful exit, then SIGTERM and a further 5 seconds before SIGKILL. These failures settle `agents.wait`/`join` and notify detached callers normally; they do not automatically replay potentially side-effecting work. Already-running workers must be stopped and respawned to use the fix.
|
|
42
|
+
|
|
37
43
|
### Image-heavy lifecycle events
|
|
38
44
|
|
|
39
45
|
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.
|