pi-fabric 0.92.40 → 0.92.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actors/types.d.ts +1 -1
- package/dist/actors/types.d.ts.map +1 -1
- package/dist/agents.js +2 -2
- package/dist/chunks/{chunk-R2V7X3QI.js → chunk-2QAOC3BO.js} +1 -1
- package/dist/chunks/chunk-2QAOC3BO.js.map +7 -0
- package/dist/chunks/{chunk-PXXRY3TN.js → chunk-2SWRVIYJ.js} +2 -2
- package/dist/chunks/{chunk-IH76PTXH.js → chunk-K6DHXXF5.js} +2 -2
- package/dist/chunks/{chunk-K6RRQTDN.js → chunk-Q4XJ4PYL.js} +2 -2
- package/dist/fabric-runtime-state.js +3 -3
- package/dist/index.js +1 -1
- package/dist/residency/host.js +3 -3
- package/dist/residency/pi-entry.js +3 -3
- package/dist/ui/dashboard.js +1 -1
- package/dist/worker/event-projection.d.ts +6 -0
- package/dist/worker/event-projection.d.ts.map +1 -0
- package/dist/worker/event-projection.js +99 -0
- package/dist/worker/event-projection.js.map +7 -0
- package/dist/worker.js +12 -4
- package/dist/worker.js.map +2 -2
- package/docs/agents.md +6 -0
- package/package.json +5 -5
- package/dist/chunks/chunk-R2V7X3QI.js.map +0 -7
- /package/dist/chunks/{chunk-PXXRY3TN.js.map → chunk-2SWRVIYJ.js.map} +0 -0
- /package/dist/chunks/{chunk-IH76PTXH.js.map → chunk-K6DHXXF5.js.map} +0 -0
- /package/dist/chunks/{chunk-K6RRQTDN.js.map → chunk-Q4XJ4PYL.js.map} +0 -0
package/dist/actors/types.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { FabricLogLine, AgentRunRecord, AgentUsage } from "../agents/types.
|
|
|
5
5
|
import type { FabricCapabilityRequirement } from "../components/types.js";
|
|
6
6
|
import type { FabricKernel } from "../runtime/kernel.js";
|
|
7
7
|
import type { FabricParticipantResidency } from "../topology/types.js";
|
|
8
|
-
export type FabricActorPiHostEvent = Exclude<ExtensionEvent["type"], "project_trust" | "cache_warming_decision">;
|
|
8
|
+
export type FabricActorPiHostEvent = Exclude<ExtensionEvent["type"], "project_trust" | "cache_warming_decision" | "agent_before_settle" | "context_with_system">;
|
|
9
9
|
export declare const FABRIC_ACTOR_PI_HOST_EVENTS: readonly ["resources_discover", "session_start", "session_info_changed", "session_before_switch", "session_before_fork", "session_before_compact", "session_compact", "session_compact_failed", "session_shutdown", "session_before_tree", "session_tree", "input", "before_agent_start", "agent_start", "agent_end", "agent_settled", "turn_start", "turn_end", "message_start", "message_update", "message_end", "ui_prompt_start", "ui_prompt_end", "context", "before_provider_headers", "before_provider_request", "after_provider_response", "tool_execution_start", "tool_call", "tool_execution_update", "tool_result", "tool_execution_end", "model_select", "thinking_level_select", "user_bash"];
|
|
10
10
|
export declare const FABRIC_ACTOR_HOST_EVENTS: readonly ["resources_discover", "session_start", "session_info_changed", "session_before_switch", "session_before_fork", "session_before_compact", "session_compact", "session_compact_failed", "session_shutdown", "session_before_tree", "session_tree", "input", "before_agent_start", "agent_start", "agent_end", "agent_settled", "turn_start", "turn_end", "message_start", "message_update", "message_end", "ui_prompt_start", "ui_prompt_end", "context", "before_provider_headers", "before_provider_request", "after_provider_response", "tool_execution_start", "tool_call", "tool_execution_update", "tool_result", "tool_execution_end", "model_select", "thinking_level_select", "user_bash", "tool_error"];
|
|
11
11
|
export type FabricActorHostEvent = (typeof FABRIC_ACTOR_HOST_EVENTS)[number];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/actors/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/actors/types.ts"],"names":[],"mappings":"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"}
|
package/dist/agents.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AGENTS_ACTION_DESCRIPTORS,
|
|
3
3
|
normalizeAgentRunRequest
|
|
4
|
-
} from "./chunks/chunk-
|
|
4
|
+
} from "./chunks/chunk-2SWRVIYJ.js";
|
|
5
5
|
import {
|
|
6
6
|
validateAgentResult
|
|
7
7
|
} from "./chunks/chunk-3QECYQGA.js";
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
terminalAgentStatuses,
|
|
18
18
|
waitForAgent
|
|
19
19
|
} from "./chunks/chunk-AYBIR4YV.js";
|
|
20
|
-
import "./chunks/chunk-
|
|
20
|
+
import "./chunks/chunk-2QAOC3BO.js";
|
|
21
21
|
import "./chunks/chunk-A4VP7HDF.js";
|
|
22
22
|
import "./chunks/chunk-MGWQOKBV.js";
|
|
23
23
|
import "./chunks/chunk-3H7SDWZI.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/actors/types.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ExtensionEvent } from \"@earendil-works/pi-coding-agent\";\nimport type { FabricAgentRunner, FabricAgentTransport, FabricPythonRuntime } from \"../config.js\";\nimport type { FabricThinking } from \"../thinking.js\";\nimport type { FabricLogLine, AgentRunRecord, AgentUsage } from \"../agents/types.js\";\nimport type { FabricCapabilityRequirement } from \"../components/types.js\";\nimport type { FabricKernel } from \"../runtime/kernel.js\";\nimport type { FabricParticipantResidency } from \"../topology/types.js\";\n\n// Pi's extension event union is closed; every member we want the actor host\n// to observe must appear in FABRIC_ACTOR_PI_HOST_EVENTS below. `project_trust`\n// uses pi's dedicated trust handler, and pi 0.86's `cache_warming_decision` is\n// a host-internal prompt-cache maintenance control event, so neither is an\n// actor observation and both are excluded here.\n//\n// pi 0.87 added two events, and neither is an actor observation yet:\n// - `agent_before_settle` is an actionable boundary that exists so a handler\n// can draft session entries and force one continuation. Fabric observes\n// lifecycle boundaries (`turn_end`, `agent_end`, `agent_settled`) and\n// republishes the ones it cares about through FABRIC_LIFECYCLE_EVENTS, which\n// has no `agent_before_settle` topic.\n// - `context_with_system` runs on the full transcript including system\n// messages and its result is sent verbatim. Exposing it to actors would let\n// them rewrite the system prompt per request, which Fabric deliberately\n// avoids to keep the cached system prefix byte-stable.\n// To observe either one as an actor event, add it to\n// FABRIC_ACTOR_PI_HOST_EVENTS below and give it a FABRIC_LIFECYCLE_EVENTS topic.\nexport type FabricActorPiHostEvent = Exclude<\n ExtensionEvent[\"type\"],\n \"project_trust\" | \"cache_warming_decision\" | \"agent_before_settle\" | \"context_with_system\"\n>;\n\nconst defineFabricActorPiHostEvents = <\n const Events extends readonly FabricActorPiHostEvent[],\n>(\n events: Exclude<FabricActorPiHostEvent, Events[number]> extends never ? Events : never,\n): Events => events;\n\nexport const FABRIC_ACTOR_PI_HOST_EVENTS = defineFabricActorPiHostEvents([\n \"resources_discover\",\n \"session_start\",\n \"session_info_changed\",\n \"session_before_switch\",\n \"session_before_fork\",\n \"session_before_compact\",\n \"session_compact\",\n \"session_compact_failed\",\n \"session_shutdown\",\n \"session_before_tree\",\n \"session_tree\",\n \"input\",\n \"before_agent_start\",\n \"agent_start\",\n \"agent_end\",\n \"agent_settled\",\n \"turn_start\",\n \"turn_end\",\n \"message_start\",\n \"message_update\",\n \"message_end\",\n \"ui_prompt_start\",\n \"ui_prompt_end\",\n \"context\",\n \"before_provider_headers\",\n \"before_provider_request\",\n \"after_provider_response\",\n \"tool_execution_start\",\n \"tool_call\",\n \"tool_execution_update\",\n \"tool_result\",\n \"tool_execution_end\",\n \"model_select\",\n \"thinking_level_select\",\n \"user_bash\",\n]);\n\nexport const FABRIC_ACTOR_HOST_EVENTS = [\n ...FABRIC_ACTOR_PI_HOST_EVENTS,\n \"tool_error\",\n] as const;\n\nexport type FabricActorHostEvent = (typeof FABRIC_ACTOR_HOST_EVENTS)[number];\n\nconst FABRIC_ACTOR_HOST_EVENT_SET: ReadonlySet<string> = new Set(FABRIC_ACTOR_HOST_EVENTS);\n\nexport const isFabricActorHostEvent = (value: unknown): value is FabricActorHostEvent =>\n typeof value === \"string\" && FABRIC_ACTOR_HOST_EVENT_SET.has(value);\n\nexport type FabricActorDelivery = \"mailbox\" | \"steer\" | \"followUp\" | \"nextTurn\";\nexport type FabricActorResponseMode = \"text\" | \"directive\";\nexport type FabricActorStatus = \"idle\" | \"queued\" | \"running\" | \"stopped\";\nexport type FabricActorBindingScope = \"session\" | \"project\";\nexport type FabricActorStorageScope = \"session\" | \"project\";\n\nexport interface FabricActorRunBinding {\n model?: string;\n thinking?: FabricThinking;\n}\n\ninterface FabricActorBindingView extends FabricActorRunBinding {\n scope: \"session\";\n sessionId: string;\n updatedAt?: number;\n}\n\ninterface FabricActorProjectDefaults extends FabricActorRunBinding {\n scope: \"project\";\n}\n\nexport interface FabricActorValidWhileSource {\n version: 1;\n source: string;\n}\n\nexport interface FabricActorValidityDecision {\n valid: boolean;\n reason?: string;\n}\n\nexport type FabricActorActivation =\n | {\n kind: \"hostEvent\";\n id: string;\n source: string;\n sequence: number;\n createdAt: number;\n event: FabricActorHostEvent;\n mainRevision: number;\n taskRevision: number;\n signal?: unknown;\n }\n | {\n kind: \"direct\";\n id: string;\n source: string;\n sequence: number;\n createdAt: number;\n }\n | {\n kind: \"mesh\";\n id: string;\n source: string;\n sequence: number;\n createdAt: number;\n topic: string;\n };\n\nexport interface FabricActorValidityFacts {\n activation: FabricActorActivation;\n current: {\n latestActivationSequence: number;\n mainRevision: number;\n taskRevision: number;\n idle: boolean;\n now: number;\n };\n}\n\nexport interface FabricActorRequest {\n /** Storage and visibility boundary. Defaults to mesh.actorScope for compatibility. */\n scope?: FabricActorStorageScope;\n name: string;\n instructions: string;\n /** Asynchronous observations of session-bound Pi events plus synthetic tool_error. */\n events?: FabricActorHostEvent[];\n topics?: string[];\n /** Defaults to mailbox. steer/followUp require an explicit triggerTurn choice. */\n delivery?: FabricActorDelivery;\n responseMode?: FabricActorResponseMode;\n /** Required for steer/followUp; must be false or omitted for mailbox/nextTurn. */\n triggerTurn?: boolean;\n coalesce?: boolean;\n /** session actors stop with their Pi host; durable actors transfer to a resident host. */\n residency?: FabricParticipantResidency;\n runner?: FabricAgentRunner;\n /** Omitted/inherit resolves at creation; the actor keeps one language for its session. */\n kernel?: FabricKernel | \"inherit\";\n /** Host-only backend snapshot for persistent/resident sessions; not a provider argument. */\n pythonRuntime?: FabricPythonRuntime;\n model?: string;\n thinking?: FabricThinking;\n tools?: string[];\n transport?: FabricAgentTransport;\n timeoutMs?: number;\n /**\n * Fabric capability for the actor. Defaults to true (today's behavior: a Pi\n * actor is recursively Fabric-equipped with the host-required fabric_exec\n * tool). Set false to disable Fabric for a Pi actor: the activation runs with\n * extensions:false and recursive:false so fabric_exec is not injected and the\n * actor cannot call agents.* or mesh.*; the host still manages its mailbox\n * and delivery (same model as a Claude actor). This does not restrict the\n * actor's ordinary tool allowlist. Fixed at creation.\n */\n extensions?: boolean;\n /** Exact Fabric actions committed before every actor run. Optional entries do not block a run. */\n requires?: readonly (string | FabricCapabilityRequirement)[];\n /** Serialized guest predicate evaluated before work and before delivery. */\n validWhile?: FabricActorValidWhileSource;\n}\n\nexport interface FabricActorInfo {\n id: string;\n scope: FabricActorStorageScope;\n name: string;\n rootId?: string;\n status: FabricActorStatus;\n runner: FabricAgentRunner;\n kernel?: FabricKernel;\n pythonRuntime?: FabricPythonRuntime;\n events: FabricActorHostEvent[];\n topics: string[];\n delivery: FabricActorDelivery;\n responseMode: FabricActorResponseMode;\n triggerTurn: boolean;\n coalesce: boolean;\n residency?: FabricParticipantResidency;\n /** Effective value for this caller after session bindings overlay project defaults. */\n model?: string;\n /** Effective value for this caller after session bindings overlay project defaults. */\n thinking?: FabricThinking;\n binding?: FabricActorBindingView;\n projectDefaults?: FabricActorProjectDefaults;\n tools?: string[];\n timeoutMs?: number;\n extensions?: boolean;\n requirements?: FabricCapabilityRequirement[];\n capabilityDigest?: string;\n missingCapabilities?: string[];\n validWhile?: FabricActorValidWhileSource;\n queued: number;\n messages: number;\n createdAt: number;\n updatedAt: number;\n lastRunId?: string;\n lastError?: string;\n sessionFile?: string;\n logDir?: string;\n}\n\nexport interface FabricActorLog {\n actorId: string;\n actorName: string;\n sessionFile: string;\n logDir: string;\n session: FabricLogLine[];\n sessionHasMore: boolean;\n sessionBefore?: number;\n run?: {\n runId: string;\n eventsFile: string;\n status?: AgentRunRecord;\n events: FabricLogLine[];\n hasMore: boolean;\n before?: number;\n };\n retainedRuns: string[];\n}\n\nexport interface FabricActorMessage {\n id: string;\n actorId: string;\n actorName: string;\n direction: \"in\" | \"out\";\n source: string;\n createdAt: number;\n text?: string;\n data?: unknown;\n action?: \"silent\" | \"message\" | \"stop\";\n runId?: string;\n usage?: AgentUsage;\n error?: string;\n stale?: boolean;\n reason?: string;\n}\n\nexport interface FabricActorDirective {\n action: \"silent\" | \"message\" | \"stop\";\n message?: string;\n data?: unknown;\n}\n\nexport interface FabricActorDeliveryRequest {\n actor: FabricActorInfo;\n message: FabricActorMessage;\n delivery: Exclude<FabricActorDelivery, \"mailbox\">;\n triggerTurn: boolean;\n}\n\n/**\n * A project-independent actor template stored in the global registry\n * (the user's agent dir, not a project mesh). It carries only the actor\n * definition (the same fields as FabricActorRequest) plus identity and\n * timestamps \u2014 never any history (messages, session transcript, or run logs).\n * Global actors are not live: they are stamped into a project via import,\n * which creates a fresh live actor with no inherited history.\n */\nexport interface GlobalActorDefinition extends FabricActorRequest {\n id: string;\n createdAt: number;\n updatedAt: number;\n // Redeclared required: the registry always materializes these (defaults\n // applied on create and load), so they are never undefined on a stored\n // template. Keeping them required avoids undefined creeping into merges and\n // spreads under exactOptionalPropertyTypes.\n events: FabricActorHostEvent[];\n topics: string[];\n delivery: FabricActorDelivery;\n responseMode: FabricActorResponseMode;\n triggerTurn: boolean;\n coalesce: boolean;\n residency?: FabricParticipantResidency;\n runner: FabricAgentRunner;\n}\n"],
|
|
5
|
+
"mappings": ";AA+BA,IAAM,gCAAgC,CAGpC,WACW;AAEN,IAAM,8BAA8B,8BAA8B;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,2BAA2B;AAAA,EACtC,GAAG;AAAA,EACH;AACF;AAIA,IAAM,8BAAmD,IAAI,IAAI,wBAAwB;AAElF,IAAM,yBAAyB,CAAC,UACrC,OAAO,UAAU,YAAY,4BAA4B,IAAI,KAAK;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-AYBIR4YV.js";
|
|
4
4
|
import {
|
|
5
5
|
FABRIC_ACTOR_HOST_EVENTS
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-2QAOC3BO.js";
|
|
7
7
|
import {
|
|
8
8
|
aliasThinking
|
|
9
9
|
} from "./chunk-A4VP7HDF.js";
|
|
@@ -747,4 +747,4 @@ export {
|
|
|
747
747
|
AGENTS_ACTION_DESCRIPTORS,
|
|
748
748
|
normalizeAgentRunRequest
|
|
749
749
|
};
|
|
750
|
-
//# sourceMappingURL=chunk-
|
|
750
|
+
//# sourceMappingURL=chunk-2SWRVIYJ.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
agentParticipantRecords,
|
|
10
10
|
loadModelUsage,
|
|
11
11
|
useBudgetLedger
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-Q4XJ4PYL.js";
|
|
13
13
|
import {
|
|
14
14
|
RESIDENT_HOST_FORMAT,
|
|
15
15
|
residentDeliveryPrefix,
|
|
@@ -691,4 +691,4 @@ if (isMain) {
|
|
|
691
691
|
export {
|
|
692
692
|
runResidentHostFromConfigPath
|
|
693
693
|
};
|
|
694
|
-
//# sourceMappingURL=chunk-
|
|
694
|
+
//# sourceMappingURL=chunk-K6DHXXF5.js.map
|
|
@@ -59,7 +59,7 @@ import {
|
|
|
59
59
|
} from "./chunk-AYBIR4YV.js";
|
|
60
60
|
import {
|
|
61
61
|
FABRIC_ACTOR_HOST_EVENTS
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-2QAOC3BO.js";
|
|
63
63
|
import {
|
|
64
64
|
isFabricThinking
|
|
65
65
|
} from "./chunk-MGWQOKBV.js";
|
|
@@ -7323,4 +7323,4 @@ export {
|
|
|
7323
7323
|
agentParticipantRecords,
|
|
7324
7324
|
actorParticipantRecord
|
|
7325
7325
|
};
|
|
7326
|
-
//# sourceMappingURL=chunk-
|
|
7326
|
+
//# sourceMappingURL=chunk-Q4XJ4PYL.js.map
|
|
@@ -77,7 +77,7 @@ import {
|
|
|
77
77
|
import {
|
|
78
78
|
AGENTS_ACTION_DESCRIPTORS,
|
|
79
79
|
normalizeAgentRunRequest
|
|
80
|
-
} from "./chunks/chunk-
|
|
80
|
+
} from "./chunks/chunk-2SWRVIYJ.js";
|
|
81
81
|
import {
|
|
82
82
|
actionArgNormalizer,
|
|
83
83
|
uniqueDeclaredKeyForSpelling
|
|
@@ -136,7 +136,7 @@ import {
|
|
|
136
136
|
snapshotHandoffSession,
|
|
137
137
|
thinkingTransferPolicy,
|
|
138
138
|
withInheritedSessionPins
|
|
139
|
-
} from "./chunks/chunk-
|
|
139
|
+
} from "./chunks/chunk-Q4XJ4PYL.js";
|
|
140
140
|
import {
|
|
141
141
|
executeFile,
|
|
142
142
|
processIsAlive,
|
|
@@ -191,7 +191,7 @@ import {
|
|
|
191
191
|
import {
|
|
192
192
|
FABRIC_ACTOR_HOST_EVENTS,
|
|
193
193
|
isFabricActorHostEvent
|
|
194
|
-
} from "./chunks/chunk-
|
|
194
|
+
} from "./chunks/chunk-2QAOC3BO.js";
|
|
195
195
|
import {
|
|
196
196
|
FUZZY_RESOLUTION_MARKERS,
|
|
197
197
|
resolveAvailablePiModel,
|
package/dist/index.js
CHANGED
|
@@ -236,7 +236,7 @@ import "./chunks/chunk-KAD7UWT2.js";
|
|
|
236
236
|
import "./chunks/chunk-ZDNGXLEC.js";
|
|
237
237
|
import {
|
|
238
238
|
FABRIC_ACTOR_PI_HOST_EVENTS
|
|
239
|
-
} from "./chunks/chunk-
|
|
239
|
+
} from "./chunks/chunk-2QAOC3BO.js";
|
|
240
240
|
import "./chunks/chunk-A4VP7HDF.js";
|
|
241
241
|
import "./chunks/chunk-MGWQOKBV.js";
|
|
242
242
|
import "./chunks/chunk-3H7SDWZI.js";
|
package/dist/residency/host.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runResidentHostFromConfigPath
|
|
4
|
-
} from "../chunks/chunk-
|
|
5
|
-
import "../chunks/chunk-
|
|
4
|
+
} from "../chunks/chunk-K6DHXXF5.js";
|
|
5
|
+
import "../chunks/chunk-Q4XJ4PYL.js";
|
|
6
6
|
import "../chunks/chunk-7BG5COXB.js";
|
|
7
7
|
import "../chunks/chunk-VPPIJRNZ.js";
|
|
8
8
|
import "../chunks/chunk-PM5I335G.js";
|
|
@@ -18,7 +18,7 @@ import "../chunks/chunk-SZUXWOO7.js";
|
|
|
18
18
|
import "../chunks/chunk-KAD7UWT2.js";
|
|
19
19
|
import "../chunks/chunk-ZDNGXLEC.js";
|
|
20
20
|
import "../chunks/chunk-AYBIR4YV.js";
|
|
21
|
-
import "../chunks/chunk-
|
|
21
|
+
import "../chunks/chunk-2QAOC3BO.js";
|
|
22
22
|
import "../chunks/chunk-A4VP7HDF.js";
|
|
23
23
|
import "../chunks/chunk-MGWQOKBV.js";
|
|
24
24
|
import "../chunks/chunk-3H7SDWZI.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runResidentHostFromConfigPath
|
|
3
|
-
} from "../chunks/chunk-
|
|
4
|
-
import "../chunks/chunk-
|
|
3
|
+
} from "../chunks/chunk-K6DHXXF5.js";
|
|
4
|
+
import "../chunks/chunk-Q4XJ4PYL.js";
|
|
5
5
|
import "../chunks/chunk-7BG5COXB.js";
|
|
6
6
|
import "../chunks/chunk-VPPIJRNZ.js";
|
|
7
7
|
import "../chunks/chunk-PM5I335G.js";
|
|
@@ -17,7 +17,7 @@ import "../chunks/chunk-SZUXWOO7.js";
|
|
|
17
17
|
import "../chunks/chunk-KAD7UWT2.js";
|
|
18
18
|
import "../chunks/chunk-ZDNGXLEC.js";
|
|
19
19
|
import "../chunks/chunk-AYBIR4YV.js";
|
|
20
|
-
import "../chunks/chunk-
|
|
20
|
+
import "../chunks/chunk-2QAOC3BO.js";
|
|
21
21
|
import "../chunks/chunk-A4VP7HDF.js";
|
|
22
22
|
import "../chunks/chunk-MGWQOKBV.js";
|
|
23
23
|
import "../chunks/chunk-3H7SDWZI.js";
|
package/dist/ui/dashboard.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-projection.d.ts","sourceRoot":"","sources":["../../src/worker/event-projection.ts"],"names":[],"mappings":"AAOA,qBAAa,iBAAiB;;IAW5B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAuE3B,GAAG,IAAI,MAAM;CAiBd"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// src/worker/event-projection.ts
|
|
2
|
+
var PiEventProjection = class {
|
|
3
|
+
#depth = 0;
|
|
4
|
+
#inString = false;
|
|
5
|
+
#escaped = false;
|
|
6
|
+
#expectKey = false;
|
|
7
|
+
#readingKey = false;
|
|
8
|
+
#keyToken = "";
|
|
9
|
+
#key = "";
|
|
10
|
+
#awaitingValue = false;
|
|
11
|
+
#skipping = false;
|
|
12
|
+
write(text) {
|
|
13
|
+
const parts = [];
|
|
14
|
+
let start = 0;
|
|
15
|
+
for (let i = 0; i < text.length; i++) {
|
|
16
|
+
const char = text[i];
|
|
17
|
+
if (char === "\n") {
|
|
18
|
+
if (this.#skipping) {
|
|
19
|
+
parts.push("!\n");
|
|
20
|
+
start = i + 1;
|
|
21
|
+
}
|
|
22
|
+
this.#reset();
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (this.#inString) {
|
|
26
|
+
if (this.#readingKey && this.#keyToken.length < 256) this.#keyToken += char;
|
|
27
|
+
if (this.#escaped) {
|
|
28
|
+
this.#escaped = false;
|
|
29
|
+
} else if (char === "\\") {
|
|
30
|
+
this.#escaped = true;
|
|
31
|
+
} else if (char === '"') {
|
|
32
|
+
this.#inString = false;
|
|
33
|
+
if (this.#readingKey) {
|
|
34
|
+
try {
|
|
35
|
+
this.#key = JSON.parse(this.#keyToken);
|
|
36
|
+
} catch {
|
|
37
|
+
this.#key = "";
|
|
38
|
+
}
|
|
39
|
+
this.#readingKey = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (this.#depth === 1 && this.#awaitingValue && !/[ \t\r]/.test(char)) {
|
|
45
|
+
this.#awaitingValue = false;
|
|
46
|
+
if (char === "[" && (this.#key === "messages" || this.#key === "toolResults")) {
|
|
47
|
+
parts.push(text.slice(start, i), "[]");
|
|
48
|
+
this.#skipping = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (char === '"') {
|
|
52
|
+
this.#inString = true;
|
|
53
|
+
this.#readingKey = this.#depth === 1 && this.#expectKey;
|
|
54
|
+
if (this.#readingKey) {
|
|
55
|
+
this.#keyToken = '"';
|
|
56
|
+
this.#expectKey = false;
|
|
57
|
+
}
|
|
58
|
+
} else if (char === "{" || char === "[") {
|
|
59
|
+
this.#depth++;
|
|
60
|
+
if (this.#depth === 1 && char === "{") this.#expectKey = true;
|
|
61
|
+
} else if (char === "}" || char === "]") {
|
|
62
|
+
this.#depth--;
|
|
63
|
+
if (this.#skipping && this.#depth === 1 && char === "]") {
|
|
64
|
+
this.#skipping = false;
|
|
65
|
+
start = i + 1;
|
|
66
|
+
}
|
|
67
|
+
} else if (this.#depth === 1 && char === ":") {
|
|
68
|
+
this.#awaitingValue = true;
|
|
69
|
+
} else if (this.#depth === 1 && char === ",") {
|
|
70
|
+
this.#expectKey = true;
|
|
71
|
+
this.#key = "";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!this.#skipping) parts.push(text.slice(start));
|
|
75
|
+
return parts.join("");
|
|
76
|
+
}
|
|
77
|
+
// A child may exit without LF. Do not let a truncated discarded array look
|
|
78
|
+
// complete to the worker's final JSON.parse.
|
|
79
|
+
end() {
|
|
80
|
+
const incomplete = this.#skipping ? "!" : "";
|
|
81
|
+
this.#reset();
|
|
82
|
+
return incomplete;
|
|
83
|
+
}
|
|
84
|
+
#reset() {
|
|
85
|
+
this.#depth = 0;
|
|
86
|
+
this.#inString = false;
|
|
87
|
+
this.#escaped = false;
|
|
88
|
+
this.#expectKey = false;
|
|
89
|
+
this.#readingKey = false;
|
|
90
|
+
this.#keyToken = "";
|
|
91
|
+
this.#key = "";
|
|
92
|
+
this.#awaitingValue = false;
|
|
93
|
+
this.#skipping = false;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
export {
|
|
97
|
+
PiEventProjection
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=event-projection.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/worker/event-projection.ts"],
|
|
4
|
+
"sourcesContent": ["// Pi repeats the entire history in agent_end.messages and the current tool\n// results in turn_end.toolResults. These top-level fields are not consumed by\n// the worker or transcript reader; authoritative messages arrive separately.\n// Elide them *before* buffering a JSONL record, not after JSON.parse. This keeps\n// image-heavy sessions bounded without dropping lifecycle flags after history.\n// This is a lexical projection, not a JSON validator. Retained JSON is parsed\n// by the worker. Discarded values are never accumulated; key tokens are bounded.\nexport class PiEventProjection {\n #depth = 0;\n #inString = false;\n #escaped = false;\n #expectKey = false;\n #readingKey = false;\n #keyToken = \"\";\n #key = \"\";\n #awaitingValue = false;\n #skipping = false;\n\n write(text: string): string {\n const parts: string[] = [];\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text[i]!;\n // Only LF frames records. CR is retained for the worker's CRLF handling;\n // U+2028/U+2029 and escaped newlines are ordinary JSON string contents.\n if (char === \"\\n\") {\n if (this.#skipping) {\n // An incomplete discarded value must not manufacture a valid event.\n parts.push(\"!\\n\");\n start = i + 1;\n }\n this.#reset();\n continue;\n }\n if (this.#inString) {\n if (this.#readingKey && this.#keyToken.length < 256) this.#keyToken += char;\n if (this.#escaped) {\n this.#escaped = false;\n } else if (char === \"\\\\\") {\n this.#escaped = true;\n } else if (char === '\"') {\n this.#inString = false;\n if (this.#readingKey) {\n try {\n this.#key = JSON.parse(this.#keyToken) as string;\n } catch {\n this.#key = \"\";\n }\n this.#readingKey = false;\n }\n }\n continue;\n }\n if (this.#depth === 1 && this.#awaitingValue && !/[ \\t\\r]/.test(char)) {\n this.#awaitingValue = false;\n if (char === \"[\" && (this.#key === \"messages\" || this.#key === \"toolResults\")) {\n parts.push(text.slice(start, i), \"[]\");\n this.#skipping = true;\n }\n }\n if (char === '\"') {\n this.#inString = true;\n this.#readingKey = this.#depth === 1 && this.#expectKey;\n if (this.#readingKey) {\n this.#keyToken = '\"';\n this.#expectKey = false;\n }\n } else if (char === \"{\" || char === \"[\") {\n this.#depth++;\n if (this.#depth === 1 && char === \"{\") this.#expectKey = true;\n } else if (char === \"}\" || char === \"]\") {\n this.#depth--;\n if (this.#skipping && this.#depth === 1 && char === \"]\") {\n this.#skipping = false;\n start = i + 1;\n }\n } else if (this.#depth === 1 && char === \":\") {\n this.#awaitingValue = true;\n } else if (this.#depth === 1 && char === \",\") {\n this.#expectKey = true;\n this.#key = \"\";\n }\n }\n if (!this.#skipping) parts.push(text.slice(start));\n return parts.join(\"\");\n }\n\n // A child may exit without LF. Do not let a truncated discarded array look\n // complete to the worker's final JSON.parse.\n end(): string {\n const incomplete = this.#skipping ? \"!\" : \"\";\n this.#reset();\n return incomplete;\n }\n\n #reset(): void {\n this.#depth = 0;\n this.#inString = false;\n this.#escaped = false;\n this.#expectKey = false;\n this.#readingKey = false;\n this.#keyToken = \"\";\n this.#key = \"\";\n this.#awaitingValue = false;\n this.#skipping = false;\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAOO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,YAAY;AAAA,EAEZ,MAAM,MAAsB;AAC1B,UAAM,QAAkB,CAAC;AACzB,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAGnB,UAAI,SAAS,MAAM;AACjB,YAAI,KAAK,WAAW;AAElB,gBAAM,KAAK,KAAK;AAChB,kBAAQ,IAAI;AAAA,QACd;AACA,aAAK,OAAO;AACZ;AAAA,MACF;AACA,UAAI,KAAK,WAAW;AAClB,YAAI,KAAK,eAAe,KAAK,UAAU,SAAS,IAAK,MAAK,aAAa;AACvE,YAAI,KAAK,UAAU;AACjB,eAAK,WAAW;AAAA,QAClB,WAAW,SAAS,MAAM;AACxB,eAAK,WAAW;AAAA,QAClB,WAAW,SAAS,KAAK;AACvB,eAAK,YAAY;AACjB,cAAI,KAAK,aAAa;AACpB,gBAAI;AACF,mBAAK,OAAO,KAAK,MAAM,KAAK,SAAS;AAAA,YACvC,QAAQ;AACN,mBAAK,OAAO;AAAA,YACd;AACA,iBAAK,cAAc;AAAA,UACrB;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,KAAK,WAAW,KAAK,KAAK,kBAAkB,CAAC,UAAU,KAAK,IAAI,GAAG;AACrE,aAAK,iBAAiB;AACtB,YAAI,SAAS,QAAQ,KAAK,SAAS,cAAc,KAAK,SAAS,gBAAgB;AAC7E,gBAAM,KAAK,KAAK,MAAM,OAAO,CAAC,GAAG,IAAI;AACrC,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AACA,UAAI,SAAS,KAAK;AAChB,aAAK,YAAY;AACjB,aAAK,cAAc,KAAK,WAAW,KAAK,KAAK;AAC7C,YAAI,KAAK,aAAa;AACpB,eAAK,YAAY;AACjB,eAAK,aAAa;AAAA,QACpB;AAAA,MACF,WAAW,SAAS,OAAO,SAAS,KAAK;AACvC,aAAK;AACL,YAAI,KAAK,WAAW,KAAK,SAAS,IAAK,MAAK,aAAa;AAAA,MAC3D,WAAW,SAAS,OAAO,SAAS,KAAK;AACvC,aAAK;AACL,YAAI,KAAK,aAAa,KAAK,WAAW,KAAK,SAAS,KAAK;AACvD,eAAK,YAAY;AACjB,kBAAQ,IAAI;AAAA,QACd;AAAA,MACF,WAAW,KAAK,WAAW,KAAK,SAAS,KAAK;AAC5C,aAAK,iBAAiB;AAAA,MACxB,WAAW,KAAK,WAAW,KAAK,SAAS,KAAK;AAC5C,aAAK,aAAa;AAClB,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AACA,QAAI,CAAC,KAAK,UAAW,OAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AACjD,WAAO,MAAM,KAAK,EAAE;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,MAAc;AACZ,UAAM,aAAa,KAAK,YAAY,MAAM;AAC1C,SAAK,OAAO;AACZ,WAAO;AAAA,EACT;AAAA,EAEA,SAAe;AACb,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,cAAc;AACnB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,iBAAiB;AACtB,SAAK,YAAY;AAAA,EACnB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/worker.js
CHANGED
|
@@ -7,6 +7,11 @@ import crossSpawn from "cross-spawn";
|
|
|
7
7
|
import { StringDecoder } from "node:string_decoder";
|
|
8
8
|
var NODE_SCRIPT_EXTENSIONS = /* @__PURE__ */ new Set([".js", ".cjs", ".mjs", ".ts", ".cts", ".mts"]);
|
|
9
9
|
var spawnCli = (command, args, options) => NODE_SCRIPT_EXTENSIONS.has(path.extname(command).toLowerCase()) ? crossSpawn(process.execPath, [command, ...args], options) : crossSpawn(command, [...args], options);
|
|
10
|
+
var loadWorkerEventProjection = async () => {
|
|
11
|
+
if (!import.meta.url.endsWith(".ts")) return import("./worker/event-projection.js");
|
|
12
|
+
const sourceModulePath = "./worker/event-projection.ts";
|
|
13
|
+
return import(sourceModulePath);
|
|
14
|
+
};
|
|
10
15
|
var loadWorkerModelControl = async () => {
|
|
11
16
|
if (!import.meta.url.endsWith(".ts")) return import("./worker/model-control.js");
|
|
12
17
|
const sourceModulePath = "./worker/model-control.ts";
|
|
@@ -133,12 +138,13 @@ process.on("unhandledRejection", (error) => {
|
|
|
133
138
|
process.exit(1);
|
|
134
139
|
});
|
|
135
140
|
var main = async () => {
|
|
136
|
-
const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, { parseStructuredValue, validateAgentResult }, { PiModelControl }] = await Promise.all([
|
|
141
|
+
const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, { parseStructuredValue, validateAgentResult }, { PiModelControl }, { PiEventProjection }] = await Promise.all([
|
|
137
142
|
loadWorkerOptions(),
|
|
138
143
|
loadWorkerRunRecord(),
|
|
139
144
|
loadWorkerSessionExport(),
|
|
140
145
|
loadAgentResult(),
|
|
141
|
-
loadWorkerModelControl()
|
|
146
|
+
loadWorkerModelControl(),
|
|
147
|
+
loadWorkerEventProjection()
|
|
142
148
|
]);
|
|
143
149
|
runRecordHelpers = loadedRunRecordHelpers;
|
|
144
150
|
const {
|
|
@@ -270,6 +276,7 @@ ${schema}`
|
|
|
270
276
|
let outputBuffer = "";
|
|
271
277
|
let vedaOutput = "";
|
|
272
278
|
let vedaParsed;
|
|
279
|
+
const eventProjection = options.runner === "pi" ? new PiEventProjection() : void 0;
|
|
273
280
|
const outputDecoder = new StringDecoder("utf8");
|
|
274
281
|
const stderrDecoder = new StringDecoder("utf8");
|
|
275
282
|
let terminalStatus;
|
|
@@ -890,7 +897,7 @@ ${schema}`
|
|
|
890
897
|
vedaOutput += decoded;
|
|
891
898
|
return;
|
|
892
899
|
}
|
|
893
|
-
outputBuffer += decoded;
|
|
900
|
+
outputBuffer += eventProjection ? eventProjection.write(decoded) : decoded;
|
|
894
901
|
while (true) {
|
|
895
902
|
const newline = outputBuffer.indexOf("\n");
|
|
896
903
|
if (newline < 0) {
|
|
@@ -958,7 +965,8 @@ ${schema}`
|
|
|
958
965
|
if (options.runner === "veda") {
|
|
959
966
|
vedaOutput += outputDecoder.end();
|
|
960
967
|
} else {
|
|
961
|
-
|
|
968
|
+
const tail = outputDecoder.end();
|
|
969
|
+
outputBuffer += eventProjection ? eventProjection.write(tail) + eventProjection.end() : tail;
|
|
962
970
|
}
|
|
963
971
|
recordStderr(stderrDecoder.end());
|
|
964
972
|
if (options.runner === "veda") {
|
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 WorkerModelControlModule = typeof import(\"./worker/model-control.js\");\n\nconst loadWorkerModelControl = async (): Promise<WorkerModelControlModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/model-control.js\");\n const sourceModulePath = \"./worker/model-control.ts\";\n return import(sourceModulePath) as Promise<WorkerModelControlModule>;\n};\n\ntype AgentResultModule = typeof import(\"./agents/result.js\");\n\nconst loadAgentResult = async (): Promise<AgentResultModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/result.js\");\n const sourceModulePath = \"./agents/result.ts\";\n return import(sourceModulePath) as Promise<AgentResultModule>;\n};\n\nconst loadWorkerOptions = async (): Promise<WorkerOptionsModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/options.js\");\n const sourceModulePath = \"./worker/options.ts\";\n return import(sourceModulePath) as Promise<WorkerOptionsModule>;\n};\n\nconst loadWorkerRunRecord = async (): Promise<WorkerRunRecordModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/run-record.js\");\n const sourceModulePath = \"./worker/run-record.ts\";\n return import(sourceModulePath) as Promise<WorkerRunRecordModule>;\n};\n\nconst loadWorkerSessionExport = async (): Promise<WorkerSessionExportModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/session-export.js\");\n const sourceModulePath = \"./worker/session-export.ts\";\n return import(sourceModulePath) as Promise<WorkerSessionExportModule>;\n};\n\nconst loadCompactControl = async (): Promise<CompactControlModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/compact-control.js\");\n const sourceModulePath = \"./agents/compact-control.ts\";\n return import(sourceModulePath) as Promise<CompactControlModule>;\n};\n\nconst loadClaudeCli = async (): Promise<ClaudeCliModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/claude-cli.js\");\n const sourceModulePath = \"./agents/claude-cli.ts\";\n return import(sourceModulePath) as Promise<ClaudeCliModule>;\n};\n\nconst loadVedaCli = async (): Promise<VedaCliModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/veda-cli.js\");\n const sourceModulePath = \"./agents/veda-cli.ts\";\n return import(sourceModulePath) as Promise<VedaCliModule>;\n};\n\nconst MAX_STDERR_CHARS = 20_000;\nconst MAX_EVENT_LINE_CHARS = 4 * 1024 * 1024;\nconst STEER_READ_CHUNK_BYTES = 256 * 1024;\nconst MAX_STEER_LINE_BYTES = 64 * 1024;\nconst MAX_STEER_COMMANDS_PER_POLL = 256;\nconst MAX_CLAUDE_PENDING_INPUTS = 256;\nconst MAX_CLAUDE_PENDING_TOOLS = 1_000;\nconst KILL_GRACE_MS = 5_000;\n\nconst extractText = (message: Record<string, unknown>): string => {\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter(\n (part): part is { type: \"text\"; text: string } =>\n typeof part === \"object\" &&\n part !== null &&\n (part as Record<string, unknown>).type === \"text\" &&\n typeof (part as Record<string, unknown>).text === \"string\",\n )\n .map((part) => part.text)\n .join(\"\");\n};\n\nconst readImages = (filePath: string | undefined): ImageContent[] => {\n if (!filePath) return [];\n const parsed: unknown = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n if (!Array.isArray(parsed)) throw new Error(\"Agent images file must contain an array\");\n const images: ImageContent[] = [];\n for (const value of parsed) {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n (value as { type?: unknown }).type !== \"image\" ||\n typeof (value as { data?: unknown }).data !== \"string\" ||\n typeof (value as { mimeType?: unknown }).mimeType !== \"string\"\n ) {\n throw new Error(\"Agent images file contains an invalid image block\");\n }\n images.push({\n type: \"image\",\n data: (value as { data: string }).data,\n mimeType: (value as { mimeType: string }).mimeType,\n });\n }\n return images;\n};\n\nconst numberField = (value: unknown): number => (typeof value === \"number\" ? value : 0);\n\nconst stringField = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n\nconst assistantError = (message: Record<string, unknown>): string => {\n const details: string[] = [];\n const direct = stringField(message.errorMessage) ?? stringField(message.error);\n if (direct) details.push(direct);\n if (Array.isArray(message.diagnostics)) {\n for (const diagnostic of message.diagnostics) {\n if (typeof diagnostic !== \"object\" || diagnostic === null || Array.isArray(diagnostic)) continue;\n const record = diagnostic as Record<string, unknown>;\n const nested =\n typeof record.error === \"object\" && record.error !== null && !Array.isArray(record.error)\n ? (record.error as Record<string, unknown>)\n : undefined;\n const detail = stringField(nested?.message) ?? stringField(record.message);\n if (detail) details.push(detail);\n }\n }\n const unique = [...new Set(details)];\n const provider = stringField(message.provider);\n const model = stringField(message.model);\n const source = [provider, model].filter((value): value is string => Boolean(value)).join(\"/\");\n const summary = unique.join(\" \u00B7 \") || \"Pi agent reported an error\";\n return `${source ? `${source}: ` : \"\"}${summary}`.slice(0, MAX_STDERR_CHARS);\n};\n\nconst runnerLabel = (runner: string): string =>\n runner === \"claude\" ? \"Claude\" : runner === \"veda\" ? \"Veda\" : \"Pi\";\n\nconst terminateChild = (child: ChildProcess, signal: NodeJS.Signals): void => {\n if (!child.pid) return;\n try {\n process.kill(process.platform === \"win32\" ? child.pid : -child.pid, signal);\n } catch { /* child process group already exited */ }\n};\n\n\n\nlet crashContext: { statusFile: string; record: AgentRunRecord } | undefined;\nlet runRecordHelpers: WorkerRunRecordModule | undefined;\nlet terminalWritten = false;\nconst writeCrashStatus = (error: unknown): void => {\n if (!crashContext || !runRecordHelpers || terminalWritten) return;\n try {\n runRecordHelpers.writeCrashRunRecord(crashContext.statusFile, crashContext.record, error);\n } catch {\n // Best effort: if the crash-status write itself fails, #monitor falls back\n // to \"Agent transport exited without a result\".\n }\n};\nprocess.on(\"uncaughtException\", (error) => {\n writeCrashStatus(error);\n process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : error}\\n`);\n process.exit(1);\n});\nprocess.on(\"unhandledRejection\", (error) => {\n writeCrashStatus(error);\n process.stderr.write(`Unhandled rejection: ${error instanceof Error ? error.stack ?? error.message : error}\\n`);\n process.exit(1);\n});\n\nconst main = async (): Promise<void> => {\n const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, {parseStructuredValue, validateAgentResult}, { PiModelControl }] = await Promise.all([\n loadWorkerOptions(),\n loadWorkerRunRecord(),\n loadWorkerSessionExport(),\n loadAgentResult(),\n loadWorkerModelControl(),\n ]);\n runRecordHelpers = loadedRunRecordHelpers;\n const {\n applyUsage,\n createRunningRecord,\n emptyUsage,\n extractUsageDelta,\n latestRunText,\n updateRunRecord,\n writeRunRecord,\n } = loadedRunRecordHelpers;\n const options = optionHelpers.parseWorkerOptions();\n const sessionExporter = options.sessionExportFile\n ? new sessionExportHelpers.SessionExporter({\n file: options.sessionExportFile,\n sessionId: options.id,\n cwd: options.cwd,\n agentName: options.name,\n })\n : undefined;\n const thinking =\n options.thinking === \"off\" ||\n options.thinking === \"minimal\" ||\n options.thinking === \"low\" ||\n options.thinking === \"medium\" ||\n options.thinking === \"high\" ||\n options.thinking === \"xhigh\" ||\n options.thinking === \"max\"\n ? options.thinking\n : undefined;\n const task = fs.readFileSync(options.taskFile, \"utf8\");\n const images = readImages(options.imagesFile);\n const record = createRunningRecord(options, task, thinking, Date.now());\n writeRunRecord(options.statusFile, record);\n const emitLifecycle = (\n event: string,\n data?: Record<string, unknown>,\n ): void => {\n try {\n fs.mkdirSync(path.dirname(options.lifecycleFile), { recursive: true });\n fs.appendFileSync(\n options.lifecycleFile,\n JSON.stringify({ version: 1, event, occurredAt: Date.now(), ...(data ? { data } : {}) }) + \"\\n\",\n { encoding: \"utf8\", mode: 0o600 },\n );\n } catch {\n // Lifecycle telemetry is best-effort and must not fail the child run.\n }\n };\n crashContext = { statusFile: options.statusFile, record };\n process.stdout.write(`[pi-fabric] ${options.name}\\n${task}\\n\\n`);\n fs.mkdirSync(path.dirname(options.logFile), { recursive: true });\n // Other processes tail this file while the run is live (transcript reader,\n // dashboards, preview trees). The previous buffered createWriteStream visibly\n // stalled mid-run \u2014 append synchronously so events are durable immediately.\n const appendLog = (text: string): void => {\n try {\n fs.appendFileSync(options.logFile, text, { encoding: \"utf8\", mode: 0o600 });\n } catch {\n // Event logging is best-effort and must not fail the child run.\n }\n };\n const sessionStream =\n options.runner === \"claude\" && options.sessionFile\n ? fs.createWriteStream(options.sessionFile, { flags: \"a\", mode: 0o600 })\n : undefined;\n sessionStream?.on(\"error\", () => {});\n\n const schema = options.schemaFile\n ? fs.readFileSync(options.schemaFile, \"utf8\")\n : undefined;\n const piArguments = [\"--mode\", \"rpc\"];\n if (options.sessionFile) piArguments.push(\"--session\", options.sessionFile);\n else piArguments.push(\"--no-session\");\n if (!options.extensions) piArguments.push(\"--no-extensions\");\n if (options.fabricExtensionPath) piArguments.push(\"-e\", options.fabricExtensionPath);\n if (options.tools.length > 0) piArguments.push(\"--tools\", options.tools.join(\",\"));\n else piArguments.push(\"--no-tools\"); // explicit empty allowlist => no tools, not Pi defaults\n if (options.model) piArguments.push(\"--model\", options.model);\n if (thinking) piArguments.push(\"--thinking\", thinking);\n if (options.systemPrompt) piArguments.push(\"--append-system-prompt\", options.systemPrompt);\n if (schema) {\n piArguments.push(\n \"--append-system-prompt\",\n `Your final response must contain only JSON matching this schema, without Markdown fences:\\n${schema}`,\n );\n }\n const claudeCli = options.runner === \"claude\" ? await loadClaudeCli() : undefined;\n const vedaCli = options.runner === \"veda\" ? await loadVedaCli() : undefined;\n const childArguments =\n options.runner === \"claude\"\n ? claudeCli!.buildClaudeArguments({\n tools: options.tools,\n extensions: options.extensions,\n persistentSession: Boolean(options.sessionFile),\n ...(options.model ? { model: options.model } : {}),\n ...(thinking ? { thinking } : {}),\n ...(options.systemPrompt ? { systemPrompt: options.systemPrompt } : {}),\n ...(schema ? { schema } : {}),\n ...(options.runnerSessionId ? { runnerSessionId: options.runnerSessionId } : {}),\n name: options.name,\n })\n : options.runner === \"veda\"\n ? vedaCli!.buildVedaArguments({\n backend: options.vedaBackend,\n persona: options.vedaPersona,\n ...(options.model ? { model: options.model } : {}),\n ...(thinking ? { thinking } : {}),\n tools: options.tools,\n // Isolate selection and conversation state per child run so\n // parallel Fabric agents never share Veda session state.\n session: `fabric-${options.id}`,\n })\n : piArguments;\n const childBinary =\n options.runner === \"claude\"\n ? options.claudeBinary\n : options.runner === \"veda\"\n ? options.vedaBinary\n : options.piBinary;\n\n const child = spawnCli(childBinary, childArguments, {\n cwd: options.cwd,\n detached: process.platform !== \"win32\",\n env: {\n ...process.env,\n ...(options.inheritedSessionPins && options.inheritedSessionPins.length > 0\n ? {\n PI_MULTIPROVIDER_SESSION_PINS: JSON.stringify(options.inheritedSessionPins),\n }\n : {}),\n PI_FABRIC_DEPTH: String(options.depth),\n PI_FABRIC_PARENT_RUN: options.id,\n PI_FABRIC_AGENT_NAME: options.name,\n ...(options.mainAgentId ? { PI_FABRIC_MAIN_AGENT_ID: options.mainAgentId } : {}),\n ...(options.fabricSessionId ? { PI_FABRIC_SESSION_ID: options.fabricSessionId } : {}),\n PI_FABRIC_GRANTED_RISKS: options.grantedRisks.join(\",\"),\n PI_FABRIC_FULL_CODE_MODE: String(options.fullCodeMode),\n // Never leak an ambient native-kernel selector into a non-Fabric runner.\n PI_FABRIC_KERNEL: options.kernel,\n PI_FABRIC_PYTHON_RUNTIME: options.pythonRuntime,\n // Native tool allowlist for nested-call enforcement: full-code children\n // reach pi.* through fabric_exec, which is not gated by the --tools\n // allowlist, so both Pi and captured-tool providers enforce this\n // child-side allowlist before preparation, discovery, and invocation.\n PI_FABRIC_TOOL_ALLOWLIST: JSON.stringify(options.tools),\n ...(options.actorId ? { PI_FABRIC_ACTOR_ID: options.actorId } : {}),\n ...(options.actorName ? { PI_FABRIC_ACTOR_NAME: options.actorName } : {}),\n PI_FABRIC_CAPABILITY_REQUIREMENTS: JSON.stringify(\n options.capabilityRequirements ?? [],\n ),\n PI_FABRIC_CAPABILITY_DIGEST: options.capabilityDigest ?? \"\",\n ...(options.meshRoot ? { PI_FABRIC_MESH_ROOT: options.meshRoot } : {}),\n ...(options.projectRoot ? { PI_FABRIC_PROJECT_ROOT: options.projectRoot } : {}),\n ...(options.ownerHostId ? { PI_FABRIC_OWNER_HOST_ID: options.ownerHostId } : {}),\n ...(options.ownerIdentityId\n ? { PI_FABRIC_OWNER_IDENTITY_ID: options.ownerIdentityId }\n : {}),\n ...(options.runRoot ? { PI_FABRIC_RUN_ROOT: options.runRoot } : {}),\n },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stderr = \"\";\n let outputBuffer = \"\";\n // Veda emits a single JSON document on stdout (progress goes to stderr, and\n // with --json progress is suppressed entirely). Buffer it raw and parse it\n // once the child closes instead of treating stdout as NDJSON lines.\n let vedaOutput = \"\";\n let vedaParsed: Record<string, unknown> | undefined;\n const outputDecoder = new StringDecoder(\"utf8\");\n const stderrDecoder = new StringDecoder(\"utf8\");\n let terminalStatus: AgentRunStatus | undefined;\n let terminalError: string | undefined;\n let sawAgentError = false;\n let retryPending = false;\n\n const update = (): void => updateRunRecord(options.statusFile, record);\n\n // Auth checks and model_select hooks can be slow under concurrent launches.\n // Startup and admission share the overall run timeout below, not a shorter cap.\n const modelControl = new PiModelControl(options.id, options.model, thinking, {\n send(frame) {\n if (terminalStatus) return;\n child.stdin?.write(`${JSON.stringify(frame)}\\n`);\n },\n observed(model) {\n if (record.model === model) return;\n record.model = model;\n update();\n },\n admitted(model, effectiveThinking) {\n if (terminalStatus) return;\n if (model) record.model = model;\n if ([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"].includes(effectiveThinking ?? \"\")) {\n record.thinking = effectiveThinking as NonNullable<AgentRunRecord[\"thinking\"]>;\n }\n update();\n child.stdin?.write(`${JSON.stringify({ type: \"prompt\", message: task, ...(images.length > 0 ? { images } : {}) })}\\n`);\n },\n fail(error) {\n if (terminalStatus) return;\n terminalStatus = \"failed\";\n terminalError = error;\n record.error = error;\n update();\n appendLog(`${JSON.stringify({ type: \"fabric_model_error\", requestedModel: options.model, model: record.model, error })}\\n`);\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n child.stdin?.end();\n },\n });\n\n // Attributed token telemetry. Every usage-bearing child event emits one\n // tokens.usage lifecycle entry identified by this run/actor/runner/depth.\n // The manager drains these alongside the pi.* lifecycle stream and appends\n // them to the budget ledger, replacing the old per-settle flat attribution.\n const lastEmittedUsage = emptyUsage();\n const emitTokenUsage = (\n delta?: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n },\n attribution?: { model?: string | undefined; provider?: string | undefined },\n ): void => {\n const snapshot = record.usage;\n if (\n snapshot.input === lastEmittedUsage.input &&\n snapshot.output === lastEmittedUsage.output &&\n snapshot.cacheRead === lastEmittedUsage.cacheRead &&\n snapshot.cacheWrite === lastEmittedUsage.cacheWrite &&\n snapshot.cost === lastEmittedUsage.cost\n ) {\n return;\n }\n emitLifecycle(\"tokens.usage\", {\n runId: options.id,\n name: options.name,\n runner: options.runner,\n depth: options.depth,\n ...(options.actorId ? { actorId: options.actorId } : {}),\n ...(options.actorName ? { actorName: options.actorName } : {}),\n cumulativeTokens:\n snapshot.input + snapshot.output + snapshot.cacheRead + snapshot.cacheWrite,\n input: delta?.input ?? 0,\n output: delta?.output ?? 0,\n cacheRead: delta?.cacheRead ?? 0,\n cacheWrite: delta?.cacheWrite ?? 0,\n cost: delta?.cost ?? snapshot.cost,\n });\n // Mirror the emitted payload into the pi-format usage export (when the\n // host enabled agents.sessionExport) so tokscale/ccusage can attribute\n // subagent tokens and cost. Export intentionally never writes content.\n sessionExporter?.push(\n {\n input: delta?.input ?? 0,\n output: delta?.output ?? 0,\n cacheRead: delta?.cacheRead ?? 0,\n cacheWrite: delta?.cacheWrite ?? 0,\n cost: delta?.cost ?? snapshot.cost,\n },\n attribution?.model ?? record.model ?? options.model,\n attribution?.provider,\n );\n lastEmittedUsage.input = snapshot.input;\n lastEmittedUsage.output = snapshot.output;\n lastEmittedUsage.cacheRead = snapshot.cacheRead;\n lastEmittedUsage.cacheWrite = snapshot.cacheWrite;\n lastEmittedUsage.cost = snapshot.cost;\n };\n\n const { ChildCompactControl } = await loadCompactControl();\n const compactControl = new ChildCompactControl(options.id, {\n send(frame) {\n if (!child.stdin || child.stdin.writableEnded || child.stdin.destroyed) {\n throw new Error(\"Child Pi stdin closed before compaction could start\");\n }\n child.stdin.write(`${JSON.stringify(frame)}\\n`);\n },\n close() {\n child.stdin?.end();\n },\n update(status) {\n record.compaction = status;\n update();\n },\n });\n\n // Preemptive per-child token guard. timeoutMs bounds wall time and budgetUsd\n // bounds cost, but a single runaway child can still blow its own context\n // before Pi core compacts. When maxTokens is set and the child's cumulative\n // token usage crosses it, terminate the child like a timeout so the run\n // settles with a terminal status instead of burning to the hour deadline.\n // The error string is model-facing: the parent agent reads it verbatim, so it\n // must name the config key and remedy, and front-load the numbers before TUI\n // truncation.\n const enforceTokenLimit = (): void => {\n if (terminalStatus || !options.maxTokens || options.maxTokens <= 0) return;\n const total =\n record.usage.input +\n record.usage.output +\n record.usage.cacheRead +\n record.usage.cacheWrite;\n if (total <= options.maxTokens) return;\n terminalStatus = \"timed_out\";\n terminalError =\n `Fabric token limit reached: ${total} tokens (limit ${options.maxTokens} set by agents.maxTokensPerChild); terminating child. ` +\n `The count is cumulative across the run and includes cache reads/writes, so it grows every turn; ` +\n `raise or disable agents.maxTokensPerChild in /fabric settings (0 disables), or split the task into smaller agent runs.`;\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n child.stdin?.end();\n };\n\n type ClaudeInputKind = \"initial\" | \"steer\" | \"follow_up\";\n const claudeTools = new Map<string, string>();\n const claudeCompletedUsage = emptyUsage();\n const claudeCurrentUsage = emptyUsage();\n const syncClaudeUsage = (): void => {\n record.usage = {\n input: claudeCompletedUsage.input + claudeCurrentUsage.input,\n output: claudeCompletedUsage.output + claudeCurrentUsage.output,\n cacheRead: claudeCompletedUsage.cacheRead + claudeCurrentUsage.cacheRead,\n cacheWrite: claudeCompletedUsage.cacheWrite + claudeCurrentUsage.cacheWrite,\n cost: claudeCompletedUsage.cost,\n };\n };\n\n const claudeSentInputs: Array<{ kind: ClaudeInputKind; message: string }> = [];\n const claudeSteering: string[] = [];\n const claudeFollowUps: string[] = [];\n let claudeSteeringMode: \"all\" | \"one-at-a-time\" = \"one-at-a-time\";\n let claudeFollowUpMode: \"all\" | \"one-at-a-time\" = \"one-at-a-time\";\n let claudeCanFollowUp = false;\n let claudeResultSeen = false;\n const enqueueClaudeControl = (queue: string[], message: string): void => {\n const pendingInputs = claudeSentInputs.length + claudeSteering.length + claudeFollowUps.length;\n if (pendingInputs >= MAX_CLAUDE_PENDING_INPUTS) return;\n queue.push(message);\n };\n let claudeCloseTimer: NodeJS.Timeout | undefined;\n\n const updateClaudeQueue = (): void => {\n const sentSteering = claudeSentInputs\n .filter((entry) => entry.kind === \"steer\")\n .map((entry) => entry.message);\n const sentFollowUps = claudeSentInputs\n .filter((entry) => entry.kind === \"follow_up\")\n .map((entry) => entry.message);\n record.pendingMessages = {\n steering: [...sentSteering, ...claudeSteering],\n followUp: [...sentFollowUps, ...claudeFollowUps],\n };\n update();\n };\n\n const writeClaudeInput = (\n kind: ClaudeInputKind,\n message: string,\n inputImages: readonly ImageContent[] = [],\n ): void => {\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n claudeCloseTimer = undefined;\n if (!child.stdin || child.stdin.writableEnded || child.stdin.destroyed) return;\n claudeSentInputs.push({ kind, message });\n if (kind === \"follow_up\") claudeCanFollowUp = false;\n child.stdin.write(\n `${JSON.stringify(claudeCli!.claudeUserMessage(message, inputImages))}\\n`,\n );\n updateClaudeQueue();\n };\n\n const flushClaudeSteering = (): void => {\n if (claudeSteering.length === 0) return;\n const alreadySent = claudeSentInputs.some((entry) => entry.kind === \"steer\");\n if (claudeSteeringMode === \"one-at-a-time\" && alreadySent) return;\n const count = claudeSteeringMode === \"all\" ? claudeSteering.length : 1;\n for (const message of claudeSteering.splice(0, count)) {\n writeClaudeInput(\"steer\", message);\n }\n };\n\n const flushClaudeFollowUps = (): void => {\n if (claudeFollowUps.length === 0 || claudeSteering.length > 0) return;\n if (claudeSentInputs.some((entry) => entry.kind === \"steer\")) return;\n const alreadySent = claudeSentInputs.some((entry) => entry.kind === \"follow_up\");\n if (claudeFollowUpMode === \"one-at-a-time\" && alreadySent) return;\n const count = claudeFollowUpMode === \"all\" ? claudeFollowUps.length : 1;\n for (const message of claudeFollowUps.splice(0, count)) {\n writeClaudeInput(\"follow_up\", message);\n }\n };\n\n const scheduleClaudeClose = (): void => {\n if (claudeCloseTimer || terminalStatus) return;\n claudeCloseTimer = setTimeout(() => {\n claudeCloseTimer = undefined;\n if (\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0\n ) {\n child.stdin?.end();\n }\n }, 300);\n claudeCloseTimer.unref();\n };\n\n const processClaudeEvent = (event: Record<string, unknown>): void => {\n if (event.type === \"system\" && event.subtype === \"init\") {\n const sessionId = stringField(event.session_id);\n if (sessionId) record.runnerSessionId = sessionId;\n const model = stringField(event.model);\n if (model && !record.model) record.model = model;\n update();\n return;\n }\n if (event.type === \"assistant\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const assistant = message as Record<string, unknown>;\n const text = extractText(assistant);\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const content = assistant.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null || Array.isArray(block)) continue;\n const part = block as Record<string, unknown>;\n if (part.type !== \"tool_use\") continue;\n const id = stringField(part.id);\n const name = stringField(part.name);\n if (!id || !name || claudeTools.has(id)) continue;\n claudeTools.set(id, name);\n while (claudeTools.size > MAX_CLAUDE_PENDING_TOOLS) {\n const oldestToolId = claudeTools.keys().next().value;\n if (oldestToolId === undefined) break;\n claudeTools.delete(oldestToolId);\n }\n record.toolCalls++;\n record.currentTool = name;\n process.stdout.write(`\u2192 ${name}\\n`);\n }\n }\n const usage = assistant.usage;\n if (typeof usage === \"object\" && usage !== null && !Array.isArray(usage)) {\n const values = usage as Record<string, unknown>;\n const delta = {\n input: numberField(values.input_tokens),\n output: numberField(values.output_tokens),\n cacheRead: numberField(values.cache_read_input_tokens),\n cacheWrite: numberField(values.cache_creation_input_tokens),\n cost: 0,\n };\n claudeCurrentUsage.input += delta.input;\n claudeCurrentUsage.output += delta.output;\n claudeCurrentUsage.cacheRead += delta.cacheRead;\n claudeCurrentUsage.cacheWrite += delta.cacheWrite;\n syncClaudeUsage();\n emitTokenUsage(delta, { model: record.model ?? stringField(event.model) });\n }\n if (typeof event.error === \"string\") {\n sawAgentError = true;\n terminalError = event.error;\n }\n enforceTokenLimit();\n update();\n return;\n }\n if (event.type === \"user\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const content = (message as Record<string, unknown>).content;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (typeof block !== \"object\" || block === null || Array.isArray(block)) continue;\n const part = block as Record<string, unknown>;\n if (part.type !== \"tool_result\") continue;\n const id = stringField(part.tool_use_id);\n if (id) claudeTools.delete(id);\n }\n const current = [...claudeTools.values()].at(-1);\n if (current) record.currentTool = current;\n else delete record.currentTool;\n update();\n return;\n }\n if (event.type === \"stream_event\") {\n const streamEvent = event.event;\n if (typeof streamEvent !== \"object\" || streamEvent === null || Array.isArray(streamEvent)) return;\n const stream = streamEvent as Record<string, unknown>;\n if (stream.type !== \"content_block_start\") return;\n const contentBlock = stream.content_block;\n if (typeof contentBlock !== \"object\" || contentBlock === null || Array.isArray(contentBlock)) return;\n const block = contentBlock as Record<string, unknown>;\n const name = stringField(block.name);\n if (block.type === \"tool_use\" && name) {\n record.currentTool = name;\n update();\n }\n return;\n }\n if (event.type !== \"result\") return;\n claudeResultSeen = true;\n const sessionId = stringField(event.session_id);\n if (sessionId) record.runnerSessionId = sessionId;\n const resultText = typeof event.result === \"string\" ? event.result : \"\";\n if (resultText) record.text = latestRunText(resultText);\n if (event.structured_output !== undefined) record.value = event.structured_output;\n record.turns += Math.max(0, Math.floor(numberField(event.num_turns)));\n const resultUsage =\n typeof event.usage === \"object\" && event.usage !== null && !Array.isArray(event.usage)\n ? (event.usage as Record<string, unknown>)\n : undefined;\n // The result frame supersedes the assistant-frame stream for this turn:\n // fold any unreported assistant tokens into the result delta so cumulative\n // attribution stays exact without double-counting assistant emissions.\n const resultDelta = resultUsage\n ? {\n input: numberField(resultUsage.input_tokens) - claudeCurrentUsage.input,\n output: numberField(resultUsage.output_tokens) - claudeCurrentUsage.output,\n cacheRead:\n numberField(resultUsage.cache_read_input_tokens) - claudeCurrentUsage.cacheRead,\n cacheWrite:\n numberField(resultUsage.cache_creation_input_tokens) - claudeCurrentUsage.cacheWrite,\n cost: Math.max(0, numberField(event.total_cost_usd)),\n }\n : { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: Math.max(0, numberField(event.total_cost_usd)) };\n claudeCompletedUsage.input += resultUsage\n ? numberField(resultUsage.input_tokens)\n : claudeCurrentUsage.input;\n claudeCompletedUsage.output += resultUsage\n ? numberField(resultUsage.output_tokens)\n : claudeCurrentUsage.output;\n claudeCompletedUsage.cacheRead += resultUsage\n ? numberField(resultUsage.cache_read_input_tokens)\n : claudeCurrentUsage.cacheRead;\n claudeCompletedUsage.cacheWrite += resultUsage\n ? numberField(resultUsage.cache_creation_input_tokens)\n : claudeCurrentUsage.cacheWrite;\n claudeCompletedUsage.cost += Math.max(0, numberField(event.total_cost_usd));\n claudeCurrentUsage.input = 0;\n claudeCurrentUsage.output = 0;\n claudeCurrentUsage.cacheRead = 0;\n claudeCurrentUsage.cacheWrite = 0;\n syncClaudeUsage();\n emitTokenUsage(resultDelta, { model: record.model ?? stringField(event.model) });\n enforceTokenLimit();\n const failed = event.is_error === true || event.subtype !== \"success\";\n if (failed) {\n sawAgentError = true;\n const errors = Array.isArray(event.errors)\n ? event.errors.filter((value): value is string => typeof value === \"string\").join(\" \u00B7 \")\n : \"\";\n terminalError = errors || resultText || `Claude returned ${String(event.subtype ?? \"an error\")}`;\n claudeSteering.splice(0);\n claudeFollowUps.splice(0);\n } else {\n sawAgentError = false;\n if (!terminalStatus) terminalError = undefined;\n }\n if (failed || terminalStatus) claudeSentInputs.splice(0);\n else claudeSentInputs.shift();\n claudeCanFollowUp = !failed && !terminalStatus;\n delete record.currentTool;\n updateClaudeQueue();\n if (failed || terminalStatus) {\n child.stdin?.end();\n return;\n }\n flushClaudeSteering();\n if (claudeSentInputs.length === 0 && claudeSteering.length === 0) {\n flushClaudeFollowUps();\n }\n if (\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0\n ) {\n scheduleClaudeClose();\n }\n };\n\n const processEvent = (line: string): void => {\n if (process.env.PI_FABRIC_INJECT_CRASH === \"stream\") throw new Error(\"simulated stream crash\");\n if (!line.trim()) return;\n appendLog(`${line}\\n`);\n sessionStream?.write(`${line}\\n`);\n let event: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(line);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return;\n event = parsed as Record<string, unknown>;\n } catch {\n return;\n }\n if (options.runner === \"claude\") {\n processClaudeEvent(event);\n return;\n }\n compactControl.observe(event);\n if (modelControl.observe(event)) return;\n if (event.type === \"message_start\" || event.type === \"message_update\") {\n const message = event.message;\n if (typeof message === \"object\" && message !== null && !Array.isArray(message)) {\n modelControl.observeAssistant(message as Record<string, unknown>);\n }\n }\n if (event.type === \"agent_start\") {\n emitLifecycle(\"pi.agent_start\");\n retryPending = false;\n sawAgentError = false;\n if (!terminalStatus) terminalError = undefined;\n return;\n }\n if (event.type === \"response\" && event.command === \"prompt\" && event.success === false) {\n sawAgentError = true;\n if (!terminalStatus) terminalError = typeof event.error === \"string\" ? event.error : \"Pi rejected the prompt\";\n child.stdin?.end();\n return;\n }\n if (event.type === \"extension_ui_request\") {\n const method = event.method;\n if (\n typeof event.id === \"string\" &&\n (method === \"select\" || method === \"confirm\" || method === \"input\" || method === \"editor\")\n ) {\n child.stdin?.write(\n `${JSON.stringify({ type: \"extension_ui_response\", id: event.id, cancelled: true })}\\n`,\n );\n }\n return;\n }\n if (event.type === \"tool_execution_start\") {\n record.toolCalls++;\n if (typeof event.toolName === \"string\") {\n record.currentTool = event.toolName;\n process.stdout.write(`\u2192 ${event.toolName}\\n`);\n }\n update();\n return;\n }\n if (event.type === \"tool_execution_end\") {\n if (event.isError === true) {\n emitLifecycle(\"pi.tool_error\", {\n ...(typeof event.toolCallId === \"string\" ? { toolCallId: event.toolCallId } : {}),\n ...(typeof event.toolName === \"string\" ? { toolName: event.toolName } : {}),\n });\n }\n delete record.currentTool;\n update();\n return;\n }\n if (event.type === \"turn_end\") {\n emitLifecycle(\"pi.turn_end\", {\n ...(typeof event.turnIndex === \"number\" ? { turnIndex: event.turnIndex } : {}),\n });\n record.turns++;\n update();\n return;\n }\n if (event.type === \"queue_update\") {\n const steering = Array.isArray(event.steering)\n ? event.steering.filter((value): value is string => typeof value === \"string\")\n : [];\n const followUp = Array.isArray(event.followUp)\n ? event.followUp.filter((value): value is string => typeof value === \"string\")\n : [];\n record.pendingMessages = { steering, followUp };\n update();\n return;\n }\n if (event.type === \"message_end\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const messageRecord = message as Record<string, unknown>;\n if (messageRecord.role !== \"assistant\") return;\n const text = extractText(messageRecord);\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const usageDelta = extractUsageDelta(messageRecord);\n applyUsage(record, messageRecord);\n emitTokenUsage(usageDelta, {\n model: stringField(messageRecord.model),\n provider: stringField(messageRecord.provider),\n });\n modelControl.observeAssistant(messageRecord);\n enforceTokenLimit();\n if (messageRecord.stopReason === \"error\" && !terminalStatus) {\n sawAgentError = true;\n terminalError = assistantError(messageRecord);\n } else {\n sawAgentError = false;\n // Once a terminal cause is set (e.g. the per-child token guard), keep it;\n // a later non-error message_end must not clobber the reason we are\n // terminating for.\n if (!terminalStatus) terminalError = undefined;\n }\n update();\n return;\n }\n if (event.type === \"agent_end\") {\n emitLifecycle(\"pi.agent_end\", { willRetry: event.willRetry === true });\n retryPending = event.willRetry === true;\n return;\n }\n if (event.type === \"agent_settled\") {\n emitLifecycle(\"pi.agent_settled\");\n if (!retryPending) {\n // Pull controls that landed with the final stream events before deciding\n // whether this one-shot child can close. A queued compact keeps stdin\n // open until its correlated response and compaction_end are observed.\n pollSteer();\n compactControl.childSettled();\n }\n return;\n }\n if (event.type === \"compaction_end\") {\n emitLifecycle(\"pi.session_compact\", {\n ...(typeof event.reason === \"string\" ? { reason: event.reason } : {}),\n ...(typeof event.willRetry === \"boolean\" ? { willRetry: event.willRetry } : {}),\n });\n return;\n }\n if (event.type === \"extension_error\") {\n const error = typeof event.error === \"string\" ? event.error : \"Extension error\";\n stderr = `${stderr}\\n${error}`.trim().slice(-MAX_STDERR_CHARS);\n update();\n }\n };\n\n child.stdin?.on(\"error\", () => {});\n if (options.runner === \"claude\") {\n writeClaudeInput(\"initial\", task, images);\n } else if (options.runner === \"veda\") {\n // Veda reads the prompt from stdin when no positional prompt is given.\n // Mirror its <system_instructions> wrapping so systemPrompt and schema\n // instructions reach the backend model.\n const sections: string[] = [];\n if (options.systemPrompt) {\n sections.push(`<system_instructions>\\n${options.systemPrompt}\\n</system_instructions>`);\n }\n if (schema) {\n sections.push(\n `Your final response must contain only JSON matching this schema, without Markdown fences:\\n${schema}`,\n );\n }\n sections.push(task);\n child.stdin?.write(sections.join(\"\\n\\n\"));\n child.stdin?.end();\n } else {\n modelControl.start();\n }\n\n // Tail a control file (steer.jsonl) the parent appends to and forward each\n // queued command to the child pi over its RPC stdin. This is the fabric\n // steering channel: the orchestrator (or any peer via the mesh relay) can\n // interject a steer / follow_up / queue-mode command between the child's\n // turns without stopping and respawning it, preserving its context. The\n // poller is best-effort: a closed or ended stdin (settled/stopped child) is\n // swallowed so a late steer never crashes the worker.\n let steerOffset = 0;\n let steerRemainder = Buffer.alloc(0);\n let skippingOversizedSteerLine = false;\n const pollSteer = (): void => {\n if (!options.steerFile || terminalStatus || (options.runner === \"pi\" && !modelControl.ready)) return;\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(options.steerFile, \"r\");\n } catch {\n return;\n }\n try {\n const size = fs.fstatSync(descriptor).size;\n if (size < steerOffset) {\n steerOffset = 0;\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = false;\n }\n if (size <= steerOffset) return;\n const length = Math.min(size - steerOffset, STEER_READ_CHUNK_BYTES);\n const buffer = Buffer.allocUnsafe(length);\n const bytesRead = fs.readSync(descriptor, buffer, 0, length, steerOffset);\n steerOffset += bytesRead;\n let combined = Buffer.concat([steerRemainder, buffer.subarray(0, bytesRead)]);\n if (skippingOversizedSteerLine) {\n const skippedLineEnd = combined.indexOf(0x0a);\n if (skippedLineEnd < 0) return;\n combined = combined.subarray(skippedLineEnd + 1);\n skippingOversizedSteerLine = false;\n }\n const newline = combined.lastIndexOf(0x0a);\n if (newline < 0) {\n if (combined.length > MAX_STEER_LINE_BYTES) {\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = true;\n } else {\n steerRemainder = Buffer.from(combined);\n }\n return;\n }\n const remainder = combined.subarray(newline + 1);\n if (remainder.length > MAX_STEER_LINE_BYTES) {\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = true;\n } else {\n steerRemainder = Buffer.from(remainder);\n }\n let processedCommands = 0;\n for (const raw of combined.subarray(0, newline + 1).toString(\"utf8\").split(\"\\n\")) {\n if (processedCommands >= MAX_STEER_COMMANDS_PER_POLL) break;\n if (Buffer.byteLength(raw, \"utf8\") > MAX_STEER_LINE_BYTES) continue;\n const line = raw.trim();\n if (!line) continue;\n processedCommands += 1;\n let command: { type?: string; message?: string; mode?: string; instructions?: string };\n try {\n command = JSON.parse(line);\n } catch {\n continue;\n }\n try {\n if (options.runner === \"claude\") {\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n claudeCloseTimer = undefined;\n if (command.type === \"steer\" && typeof command.message === \"string\") {\n enqueueClaudeControl(claudeSteering, command.message);\n flushClaudeSteering();\n } else if (command.type === \"follow_up\" && typeof command.message === \"string\") {\n enqueueClaudeControl(claudeFollowUps, command.message);\n if (claudeCanFollowUp && claudeSentInputs.length === 0) flushClaudeFollowUps();\n } else if (\n command.type === \"set_steering_mode\" &&\n (command.mode === \"all\" || command.mode === \"one-at-a-time\")\n ) {\n claudeSteeringMode = command.mode;\n flushClaudeSteering();\n } else if (\n command.type === \"set_follow_up_mode\" &&\n (command.mode === \"all\" || command.mode === \"one-at-a-time\")\n ) {\n claudeFollowUpMode = command.mode;\n if (claudeCanFollowUp && claudeSentInputs.length === 0) flushClaudeFollowUps();\n }\n updateClaudeQueue();\n } else if (options.runner === \"veda\") {\n // Steering is unsupported for the veda runner: Veda executes one\n // headless prompt per invocation. The command is dropped, never\n // forwarded to pi-style stdin frames.\n } else if (command.type === \"steer\" && typeof command.message === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"steer\", message: command.message }) + \"\\n\");\n } else if (command.type === \"follow_up\" && typeof command.message === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"follow_up\", message: command.message }) + \"\\n\");\n } else if (command.type === \"set_steering_mode\" && typeof command.mode === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"set_steering_mode\", mode: command.mode }) + \"\\n\");\n } else if (command.type === \"set_follow_up_mode\" && typeof command.mode === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"set_follow_up_mode\", mode: command.mode }) + \"\\n\");\n } else if (command.type === \"compact\") {\n compactControl.queue(command.instructions);\n }\n } catch {\n /* stdin closed (settled/stopped child); a late steer is dropped */\n }\n }\n } finally {\n fs.closeSync(descriptor);\n }\n };\n const steerTimer = options.steerFile ? setInterval(pollSteer, 200) : undefined;\n steerTimer?.unref?.();\n\n const failOversizedEvent = (line: string): void => {\n const prefix = line.slice(0, MAX_EVENT_LINE_CHARS);\n let artifactPath: string | undefined;\n try {\n artifactPath = path.join(path.dirname(options.logFile), \"oversized-event-prefix.txt\");\n fs.writeFileSync(artifactPath, prefix, { encoding: \"utf8\", mode: 0o600 });\n } catch {\n artifactPath = undefined;\n }\n terminalStatus = \"failed\";\n terminalError = artifactPath\n ? `Agent emitted an oversized event line; first ${prefix.length} characters saved to: ${artifactPath}`\n : \"Agent emitted an oversized event line\";\n outputBuffer = \"\";\n terminateChild(child, \"SIGTERM\");\n };\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n const decoded = outputDecoder.write(chunk);\n if (options.runner === \"veda\") {\n vedaOutput += decoded;\n return;\n }\n outputBuffer += decoded;\n while (true) {\n const newline = outputBuffer.indexOf(\"\\n\");\n if (newline < 0) {\n // A partial line past the cap is already anomalous: fail with bounded\n // evidence instead of growing the buffer. Redaction cannot decide this\n // - it collapses any long base64-alphabet run, including plain text,\n // which would let an unbounded line slip through as 'recovered'.\n if (outputBuffer.length > MAX_EVENT_LINE_CHARS) failOversizedEvent(outputBuffer);\n break;\n }\n if (newline > MAX_EVENT_LINE_CHARS) {\n // A complete oversized line fails on its raw length: the raw prefix is\n // the evidence, and redaction is not a licence to keep the run alive.\n failOversizedEvent(outputBuffer.slice(0, newline));\n return;\n }\n const line = outputBuffer.slice(0, newline).replace(/\\r$/, \"\");\n outputBuffer = outputBuffer.slice(newline + 1);\n processEvent(line);\n }\n });\n const recordStderr = (text: string): void => {\n if (!text) return;\n appendLog(`${JSON.stringify({ type: \"worker_stderr\", text })}\\n`);\n process.stderr.write(text);\n stderr = `${stderr}${text}`.slice(-MAX_STDERR_CHARS);\n };\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n recordStderr(stderrDecoder.write(chunk));\n });\n child.stderr?.on(\"error\", () => {});\n\n const timeout = setTimeout(() => {\n if (terminalStatus) return;\n terminalStatus = \"timed_out\";\n terminalError = `Agent timed out after ${options.timeoutMs}ms`;\n if (options.runner === \"pi\" && !modelControl.ready) {\n terminalError += \"; Pi model admission did not complete; task was not sent\";\n }\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n }, options.timeoutMs);\n timeout.unref();\n\n const stop = (): void => {\n if (terminalStatus) return;\n terminalStatus = \"stopped\";\n terminalError = \"Agent stopped\";\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n };\n process.once(\"SIGTERM\", stop);\n process.once(\"SIGINT\", stop);\n process.once(\"SIGHUP\", stop);\n\n const exitCode = await new Promise<number | null>((resolve) => {\n child.once(\"error\", (error) => {\n terminalStatus = \"failed\";\n terminalError = error.message;\n resolve(null);\n });\n child.once(\"close\", (code) => resolve(code));\n });\n\n if (steerTimer) clearInterval(steerTimer);\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n clearTimeout(timeout);\n if (options.runner === \"pi\" && !modelControl.ready && !terminalStatus) {\n terminalStatus = \"failed\";\n terminalError = `Child Pi exited before requested model admission completed; task was not sent${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`;\n }\n if (process.env.PI_FABRIC_INJECT_CRASH === \"close\") throw new Error(\"simulated close crash\");\n if (options.runner === \"veda\") {\n vedaOutput += outputDecoder.end();\n } else {\n outputBuffer += outputDecoder.end();\n }\n recordStderr(stderrDecoder.end());\n if (options.runner === \"veda\") {\n const trimmed = vedaOutput.trim();\n if (trimmed) {\n try {\n const parsed = parseStructuredValue(trimmed);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n vedaParsed = parsed as Record<string, unknown>;\n const text = stringField(vedaParsed.text) ?? \"\";\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const sessionId = stringField(vedaParsed.sessionId);\n if (sessionId) record.runnerSessionId = sessionId;\n const usage = vedaParsed.usage;\n if (typeof usage === \"object\" && usage !== null && !Array.isArray(usage)) {\n const values = usage as Record<string, unknown>;\n const input = numberField(values.inputTokens);\n const output = numberField(values.outputTokens);\n const cacheRead = numberField(values.cachedTokens);\n const cost = typeof values.costUsd === \"number\" ? values.costUsd : 0;\n record.usage = { input, output, cacheRead, cacheWrite: 0, cost };\n emitTokenUsage({ input, output, cacheRead, cacheWrite: 0, cost }, { model: stringField(vedaParsed.model) });\n }\n const envelopeErrors: string[] = [];\n const error = stringField(vedaParsed.error);\n if (error) envelopeErrors.push(error);\n // navigator-plan gates the response on a <program> design block and\n // the worker persona on a <worker_report>; both exit non-zero and\n // report failure only via design/worker fields, not envelope.error.\n for (const key of [\"design\", \"worker\"] as const) {\n const gate = vedaParsed[key];\n if (typeof gate !== \"object\" || gate === null || Array.isArray(gate)) continue;\n const status = gate as Record<string, unknown>;\n if (status.ok !== false) continue;\n const details = Array.isArray(status.errors)\n ? status.errors.filter((entry): entry is string => typeof entry === \"string\").join(\"; \")\n : [stringField(status.reason), stringField(status.detail)]\n .filter((entry): entry is string => entry !== undefined)\n .join(\": \");\n envelopeErrors.push(`Veda ${key} failed${details ? `: ${details}` : \"\"}`);\n }\n if (envelopeErrors.length > 0) {\n sawAgentError = true;\n terminalError = envelopeErrors.join(\"\\n\");\n }\n record.turns += 1;\n update();\n }\n } catch {\n // Unparseable stdout; the generic failed-record path reports stderr.\n }\n }\n } else if (outputBuffer.trim()) {\n processEvent(outputBuffer);\n }\n record.exitCode = exitCode;\n record.stderr = stderr.slice(-MAX_STDERR_CHARS);\n if (\n record.compaction?.status === \"queued\" ||\n record.compaction?.status === \"in_flight\"\n ) {\n const error = terminalError ?? \"Child Pi exited before the queued compaction completed\";\n record.compaction = {\n ...record.compaction,\n status: \"failed\",\n updatedAt: Date.now(),\n finishedAt: Date.now(),\n error,\n };\n if (!terminalStatus) {\n terminalStatus = \"failed\";\n terminalError = error;\n }\n }\n record.finishedAt = Date.now();\n record.updatedAt = record.finishedAt;\n const childCompleted =\n exitCode === 0 &&\n !sawAgentError &&\n (options.runner === \"pi\" ||\n (options.runner === \"claude\" &&\n claudeResultSeen &&\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0) ||\n (options.runner === \"veda\" && vedaParsed !== undefined));\n record.status = terminalStatus ?? (childCompleted ? \"completed\" : \"failed\");\n if (terminalError) record.error = terminalError;\n if (record.status === \"failed\" && !record.error) {\n record.error =\n stderr.trim() ||\n (exitCode === 0\n ? `${runnerLabel(options.runner)} agent reported an error before exiting`\n : `${runnerLabel(options.runner)} exited with code ${exitCode ?? \"unknown\"}`);\n }\n if (record.status === \"completed\" && options.schemaFile) {\n try {\n const schema = JSON.parse(fs.readFileSync(options.schemaFile, \"utf8\")) as Record<\n string,\n unknown\n >;\n validateAgentResult(record, schema);\n } catch (error) {\n record.status = \"failed\";\n const reason = error instanceof Error ? error.message : String(error);\n const output = record.text.trim();\n const snippet = output.slice(0, 200);\n record.error = `Structured agent output was invalid: ${reason}${snippet ? ` (output: ${snippet}${output.length > 200 ? \"\u2026\" : \"\"})` : \"\"}`;\n }\n }\n delete record.currentTool;\n writeRunRecord(options.statusFile, record);\n terminalWritten = true;\n process.stdout.write(`\\n[pi-fabric] ${record.status}\\n`);\n await new Promise<void>((resolve) =>\n sessionStream ? sessionStream.end(resolve) : resolve(),\n );\n process.exitCode = record.status === \"completed\" ? 0 : 1;\n};\n\nmain().catch((error) => {\n console.error(error instanceof Error ? (error.stack ?? error.message) : String(error));\n writeCrashStatus(error);\n process.exit(1);\n});\n"],
|
|
5
|
-
"mappings": "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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 AgentResultModule = typeof import(\"./agents/result.js\");\n\nconst loadAgentResult = async (): Promise<AgentResultModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/result.js\");\n const sourceModulePath = \"./agents/result.ts\";\n return import(sourceModulePath) as Promise<AgentResultModule>;\n};\n\nconst loadWorkerOptions = async (): Promise<WorkerOptionsModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/options.js\");\n const sourceModulePath = \"./worker/options.ts\";\n return import(sourceModulePath) as Promise<WorkerOptionsModule>;\n};\n\nconst loadWorkerRunRecord = async (): Promise<WorkerRunRecordModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/run-record.js\");\n const sourceModulePath = \"./worker/run-record.ts\";\n return import(sourceModulePath) as Promise<WorkerRunRecordModule>;\n};\n\nconst loadWorkerSessionExport = async (): Promise<WorkerSessionExportModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./worker/session-export.js\");\n const sourceModulePath = \"./worker/session-export.ts\";\n return import(sourceModulePath) as Promise<WorkerSessionExportModule>;\n};\n\nconst loadCompactControl = async (): Promise<CompactControlModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/compact-control.js\");\n const sourceModulePath = \"./agents/compact-control.ts\";\n return import(sourceModulePath) as Promise<CompactControlModule>;\n};\n\nconst loadClaudeCli = async (): Promise<ClaudeCliModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/claude-cli.js\");\n const sourceModulePath = \"./agents/claude-cli.ts\";\n return import(sourceModulePath) as Promise<ClaudeCliModule>;\n};\n\nconst loadVedaCli = async (): Promise<VedaCliModule> => {\n if (!import.meta.url.endsWith(\".ts\")) return import(\"./agents/veda-cli.js\");\n const sourceModulePath = \"./agents/veda-cli.ts\";\n return import(sourceModulePath) as Promise<VedaCliModule>;\n};\n\nconst MAX_STDERR_CHARS = 20_000;\nconst MAX_EVENT_LINE_CHARS = 4 * 1024 * 1024;\nconst STEER_READ_CHUNK_BYTES = 256 * 1024;\nconst MAX_STEER_LINE_BYTES = 64 * 1024;\nconst MAX_STEER_COMMANDS_PER_POLL = 256;\nconst MAX_CLAUDE_PENDING_INPUTS = 256;\nconst MAX_CLAUDE_PENDING_TOOLS = 1_000;\nconst KILL_GRACE_MS = 5_000;\n\nconst extractText = (message: Record<string, unknown>): string => {\n const content = message.content;\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter(\n (part): part is { type: \"text\"; text: string } =>\n typeof part === \"object\" &&\n part !== null &&\n (part as Record<string, unknown>).type === \"text\" &&\n typeof (part as Record<string, unknown>).text === \"string\",\n )\n .map((part) => part.text)\n .join(\"\");\n};\n\nconst readImages = (filePath: string | undefined): ImageContent[] => {\n if (!filePath) return [];\n const parsed: unknown = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n if (!Array.isArray(parsed)) throw new Error(\"Agent images file must contain an array\");\n const images: ImageContent[] = [];\n for (const value of parsed) {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n (value as { type?: unknown }).type !== \"image\" ||\n typeof (value as { data?: unknown }).data !== \"string\" ||\n typeof (value as { mimeType?: unknown }).mimeType !== \"string\"\n ) {\n throw new Error(\"Agent images file contains an invalid image block\");\n }\n images.push({\n type: \"image\",\n data: (value as { data: string }).data,\n mimeType: (value as { mimeType: string }).mimeType,\n });\n }\n return images;\n};\n\nconst numberField = (value: unknown): number => (typeof value === \"number\" ? value : 0);\n\nconst stringField = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n\nconst assistantError = (message: Record<string, unknown>): string => {\n const details: string[] = [];\n const direct = stringField(message.errorMessage) ?? stringField(message.error);\n if (direct) details.push(direct);\n if (Array.isArray(message.diagnostics)) {\n for (const diagnostic of message.diagnostics) {\n if (typeof diagnostic !== \"object\" || diagnostic === null || Array.isArray(diagnostic)) continue;\n const record = diagnostic as Record<string, unknown>;\n const nested =\n typeof record.error === \"object\" && record.error !== null && !Array.isArray(record.error)\n ? (record.error as Record<string, unknown>)\n : undefined;\n const detail = stringField(nested?.message) ?? stringField(record.message);\n if (detail) details.push(detail);\n }\n }\n const unique = [...new Set(details)];\n const provider = stringField(message.provider);\n const model = stringField(message.model);\n const source = [provider, model].filter((value): value is string => Boolean(value)).join(\"/\");\n const summary = unique.join(\" \u00B7 \") || \"Pi agent reported an error\";\n return `${source ? `${source}: ` : \"\"}${summary}`.slice(0, MAX_STDERR_CHARS);\n};\n\nconst runnerLabel = (runner: string): string =>\n runner === \"claude\" ? \"Claude\" : runner === \"veda\" ? \"Veda\" : \"Pi\";\n\nconst terminateChild = (child: ChildProcess, signal: NodeJS.Signals): void => {\n if (!child.pid) return;\n try {\n process.kill(process.platform === \"win32\" ? child.pid : -child.pid, signal);\n } catch { /* child process group already exited */ }\n};\n\n\n\nlet crashContext: { statusFile: string; record: AgentRunRecord } | undefined;\nlet runRecordHelpers: WorkerRunRecordModule | undefined;\nlet terminalWritten = false;\nconst writeCrashStatus = (error: unknown): void => {\n if (!crashContext || !runRecordHelpers || terminalWritten) return;\n try {\n runRecordHelpers.writeCrashRunRecord(crashContext.statusFile, crashContext.record, error);\n } catch {\n // Best effort: if the crash-status write itself fails, #monitor falls back\n // to \"Agent transport exited without a result\".\n }\n};\nprocess.on(\"uncaughtException\", (error) => {\n writeCrashStatus(error);\n process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : error}\\n`);\n process.exit(1);\n});\nprocess.on(\"unhandledRejection\", (error) => {\n writeCrashStatus(error);\n process.stderr.write(`Unhandled rejection: ${error instanceof Error ? error.stack ?? error.message : error}\\n`);\n process.exit(1);\n});\n\nconst main = async (): Promise<void> => {\n const [optionHelpers, loadedRunRecordHelpers, sessionExportHelpers, {parseStructuredValue, validateAgentResult}, { PiModelControl }, { PiEventProjection }] = await Promise.all([\n loadWorkerOptions(),\n loadWorkerRunRecord(),\n loadWorkerSessionExport(),\n loadAgentResult(),\n loadWorkerModelControl(),\n loadWorkerEventProjection(),\n ]);\n runRecordHelpers = loadedRunRecordHelpers;\n const {\n applyUsage,\n createRunningRecord,\n emptyUsage,\n extractUsageDelta,\n latestRunText,\n updateRunRecord,\n writeRunRecord,\n } = loadedRunRecordHelpers;\n const options = optionHelpers.parseWorkerOptions();\n const sessionExporter = options.sessionExportFile\n ? new sessionExportHelpers.SessionExporter({\n file: options.sessionExportFile,\n sessionId: options.id,\n cwd: options.cwd,\n agentName: options.name,\n })\n : undefined;\n const thinking =\n options.thinking === \"off\" ||\n options.thinking === \"minimal\" ||\n options.thinking === \"low\" ||\n options.thinking === \"medium\" ||\n options.thinking === \"high\" ||\n options.thinking === \"xhigh\" ||\n options.thinking === \"max\"\n ? options.thinking\n : undefined;\n const task = fs.readFileSync(options.taskFile, \"utf8\");\n const images = readImages(options.imagesFile);\n const record = createRunningRecord(options, task, thinking, Date.now());\n writeRunRecord(options.statusFile, record);\n const emitLifecycle = (\n event: string,\n data?: Record<string, unknown>,\n ): void => {\n try {\n fs.mkdirSync(path.dirname(options.lifecycleFile), { recursive: true });\n fs.appendFileSync(\n options.lifecycleFile,\n JSON.stringify({ version: 1, event, occurredAt: Date.now(), ...(data ? { data } : {}) }) + \"\\n\",\n { encoding: \"utf8\", mode: 0o600 },\n );\n } catch {\n // Lifecycle telemetry is best-effort and must not fail the child run.\n }\n };\n crashContext = { statusFile: options.statusFile, record };\n process.stdout.write(`[pi-fabric] ${options.name}\\n${task}\\n\\n`);\n fs.mkdirSync(path.dirname(options.logFile), { recursive: true });\n // Other processes tail this file while the run is live (transcript reader,\n // dashboards, preview trees). The previous buffered createWriteStream visibly\n // stalled mid-run \u2014 append synchronously so events are durable immediately.\n const appendLog = (text: string): void => {\n try {\n fs.appendFileSync(options.logFile, text, { encoding: \"utf8\", mode: 0o600 });\n } catch {\n // Event logging is best-effort and must not fail the child run.\n }\n };\n const sessionStream =\n options.runner === \"claude\" && options.sessionFile\n ? fs.createWriteStream(options.sessionFile, { flags: \"a\", mode: 0o600 })\n : undefined;\n sessionStream?.on(\"error\", () => {});\n\n const schema = options.schemaFile\n ? fs.readFileSync(options.schemaFile, \"utf8\")\n : undefined;\n const piArguments = [\"--mode\", \"rpc\"];\n if (options.sessionFile) piArguments.push(\"--session\", options.sessionFile);\n else piArguments.push(\"--no-session\");\n if (!options.extensions) piArguments.push(\"--no-extensions\");\n if (options.fabricExtensionPath) piArguments.push(\"-e\", options.fabricExtensionPath);\n if (options.tools.length > 0) piArguments.push(\"--tools\", options.tools.join(\",\"));\n else piArguments.push(\"--no-tools\"); // explicit empty allowlist => no tools, not Pi defaults\n if (options.model) piArguments.push(\"--model\", options.model);\n if (thinking) piArguments.push(\"--thinking\", thinking);\n if (options.systemPrompt) piArguments.push(\"--append-system-prompt\", options.systemPrompt);\n if (schema) {\n piArguments.push(\n \"--append-system-prompt\",\n `Your final response must contain only JSON matching this schema, without Markdown fences:\\n${schema}`,\n );\n }\n const claudeCli = options.runner === \"claude\" ? await loadClaudeCli() : undefined;\n const vedaCli = options.runner === \"veda\" ? await loadVedaCli() : undefined;\n const childArguments =\n options.runner === \"claude\"\n ? claudeCli!.buildClaudeArguments({\n tools: options.tools,\n extensions: options.extensions,\n persistentSession: Boolean(options.sessionFile),\n ...(options.model ? { model: options.model } : {}),\n ...(thinking ? { thinking } : {}),\n ...(options.systemPrompt ? { systemPrompt: options.systemPrompt } : {}),\n ...(schema ? { schema } : {}),\n ...(options.runnerSessionId ? { runnerSessionId: options.runnerSessionId } : {}),\n name: options.name,\n })\n : options.runner === \"veda\"\n ? vedaCli!.buildVedaArguments({\n backend: options.vedaBackend,\n persona: options.vedaPersona,\n ...(options.model ? { model: options.model } : {}),\n ...(thinking ? { thinking } : {}),\n tools: options.tools,\n // Isolate selection and conversation state per child run so\n // parallel Fabric agents never share Veda session state.\n session: `fabric-${options.id}`,\n })\n : piArguments;\n const childBinary =\n options.runner === \"claude\"\n ? options.claudeBinary\n : options.runner === \"veda\"\n ? options.vedaBinary\n : options.piBinary;\n\n const child = spawnCli(childBinary, childArguments, {\n cwd: options.cwd,\n detached: process.platform !== \"win32\",\n env: {\n ...process.env,\n ...(options.inheritedSessionPins && options.inheritedSessionPins.length > 0\n ? {\n PI_MULTIPROVIDER_SESSION_PINS: JSON.stringify(options.inheritedSessionPins),\n }\n : {}),\n PI_FABRIC_DEPTH: String(options.depth),\n PI_FABRIC_PARENT_RUN: options.id,\n PI_FABRIC_AGENT_NAME: options.name,\n ...(options.mainAgentId ? { PI_FABRIC_MAIN_AGENT_ID: options.mainAgentId } : {}),\n ...(options.fabricSessionId ? { PI_FABRIC_SESSION_ID: options.fabricSessionId } : {}),\n PI_FABRIC_GRANTED_RISKS: options.grantedRisks.join(\",\"),\n PI_FABRIC_FULL_CODE_MODE: String(options.fullCodeMode),\n // Never leak an ambient native-kernel selector into a non-Fabric runner.\n PI_FABRIC_KERNEL: options.kernel,\n PI_FABRIC_PYTHON_RUNTIME: options.pythonRuntime,\n // Native tool allowlist for nested-call enforcement: full-code children\n // reach pi.* through fabric_exec, which is not gated by the --tools\n // allowlist, so both Pi and captured-tool providers enforce this\n // child-side allowlist before preparation, discovery, and invocation.\n PI_FABRIC_TOOL_ALLOWLIST: JSON.stringify(options.tools),\n ...(options.actorId ? { PI_FABRIC_ACTOR_ID: options.actorId } : {}),\n ...(options.actorName ? { PI_FABRIC_ACTOR_NAME: options.actorName } : {}),\n PI_FABRIC_CAPABILITY_REQUIREMENTS: JSON.stringify(\n options.capabilityRequirements ?? [],\n ),\n PI_FABRIC_CAPABILITY_DIGEST: options.capabilityDigest ?? \"\",\n ...(options.meshRoot ? { PI_FABRIC_MESH_ROOT: options.meshRoot } : {}),\n ...(options.projectRoot ? { PI_FABRIC_PROJECT_ROOT: options.projectRoot } : {}),\n ...(options.ownerHostId ? { PI_FABRIC_OWNER_HOST_ID: options.ownerHostId } : {}),\n ...(options.ownerIdentityId\n ? { PI_FABRIC_OWNER_IDENTITY_ID: options.ownerIdentityId }\n : {}),\n ...(options.runRoot ? { PI_FABRIC_RUN_ROOT: options.runRoot } : {}),\n },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stderr = \"\";\n let outputBuffer = \"\";\n // Veda emits a single JSON document on stdout (progress goes to stderr, and\n // with --json progress is suppressed entirely). Buffer it raw and parse it\n // once the child closes instead of treating stdout as NDJSON lines.\n let vedaOutput = \"\";\n let vedaParsed: Record<string, unknown> | undefined;\n const eventProjection = options.runner === \"pi\" ? new PiEventProjection() : undefined;\n const outputDecoder = new StringDecoder(\"utf8\");\n const stderrDecoder = new StringDecoder(\"utf8\");\n let terminalStatus: AgentRunStatus | undefined;\n let terminalError: string | undefined;\n let sawAgentError = false;\n let retryPending = false;\n\n const update = (): void => updateRunRecord(options.statusFile, record);\n\n // Auth checks and model_select hooks can be slow under concurrent launches.\n // Startup and admission share the overall run timeout below, not a shorter cap.\n const modelControl = new PiModelControl(options.id, options.model, thinking, {\n send(frame) {\n if (terminalStatus) return;\n child.stdin?.write(`${JSON.stringify(frame)}\\n`);\n },\n observed(model) {\n if (record.model === model) return;\n record.model = model;\n update();\n },\n admitted(model, effectiveThinking) {\n if (terminalStatus) return;\n if (model) record.model = model;\n if ([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"].includes(effectiveThinking ?? \"\")) {\n record.thinking = effectiveThinking as NonNullable<AgentRunRecord[\"thinking\"]>;\n }\n update();\n child.stdin?.write(`${JSON.stringify({ type: \"prompt\", message: task, ...(images.length > 0 ? { images } : {}) })}\\n`);\n },\n fail(error) {\n if (terminalStatus) return;\n terminalStatus = \"failed\";\n terminalError = error;\n record.error = error;\n update();\n appendLog(`${JSON.stringify({ type: \"fabric_model_error\", requestedModel: options.model, model: record.model, error })}\\n`);\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n child.stdin?.end();\n },\n });\n\n // Attributed token telemetry. Every usage-bearing child event emits one\n // tokens.usage lifecycle entry identified by this run/actor/runner/depth.\n // The manager drains these alongside the pi.* lifecycle stream and appends\n // them to the budget ledger, replacing the old per-settle flat attribution.\n const lastEmittedUsage = emptyUsage();\n const emitTokenUsage = (\n delta?: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n },\n attribution?: { model?: string | undefined; provider?: string | undefined },\n ): void => {\n const snapshot = record.usage;\n if (\n snapshot.input === lastEmittedUsage.input &&\n snapshot.output === lastEmittedUsage.output &&\n snapshot.cacheRead === lastEmittedUsage.cacheRead &&\n snapshot.cacheWrite === lastEmittedUsage.cacheWrite &&\n snapshot.cost === lastEmittedUsage.cost\n ) {\n return;\n }\n emitLifecycle(\"tokens.usage\", {\n runId: options.id,\n name: options.name,\n runner: options.runner,\n depth: options.depth,\n ...(options.actorId ? { actorId: options.actorId } : {}),\n ...(options.actorName ? { actorName: options.actorName } : {}),\n cumulativeTokens:\n snapshot.input + snapshot.output + snapshot.cacheRead + snapshot.cacheWrite,\n input: delta?.input ?? 0,\n output: delta?.output ?? 0,\n cacheRead: delta?.cacheRead ?? 0,\n cacheWrite: delta?.cacheWrite ?? 0,\n cost: delta?.cost ?? snapshot.cost,\n });\n // Mirror the emitted payload into the pi-format usage export (when the\n // host enabled agents.sessionExport) so tokscale/ccusage can attribute\n // subagent tokens and cost. Export intentionally never writes content.\n sessionExporter?.push(\n {\n input: delta?.input ?? 0,\n output: delta?.output ?? 0,\n cacheRead: delta?.cacheRead ?? 0,\n cacheWrite: delta?.cacheWrite ?? 0,\n cost: delta?.cost ?? snapshot.cost,\n },\n attribution?.model ?? record.model ?? options.model,\n attribution?.provider,\n );\n lastEmittedUsage.input = snapshot.input;\n lastEmittedUsage.output = snapshot.output;\n lastEmittedUsage.cacheRead = snapshot.cacheRead;\n lastEmittedUsage.cacheWrite = snapshot.cacheWrite;\n lastEmittedUsage.cost = snapshot.cost;\n };\n\n const { ChildCompactControl } = await loadCompactControl();\n const compactControl = new ChildCompactControl(options.id, {\n send(frame) {\n if (!child.stdin || child.stdin.writableEnded || child.stdin.destroyed) {\n throw new Error(\"Child Pi stdin closed before compaction could start\");\n }\n child.stdin.write(`${JSON.stringify(frame)}\\n`);\n },\n close() {\n child.stdin?.end();\n },\n update(status) {\n record.compaction = status;\n update();\n },\n });\n\n // Preemptive per-child token guard. timeoutMs bounds wall time and budgetUsd\n // bounds cost, but a single runaway child can still blow its own context\n // before Pi core compacts. When maxTokens is set and the child's cumulative\n // token usage crosses it, terminate the child like a timeout so the run\n // settles with a terminal status instead of burning to the hour deadline.\n // The error string is model-facing: the parent agent reads it verbatim, so it\n // must name the config key and remedy, and front-load the numbers before TUI\n // truncation.\n const enforceTokenLimit = (): void => {\n if (terminalStatus || !options.maxTokens || options.maxTokens <= 0) return;\n const total =\n record.usage.input +\n record.usage.output +\n record.usage.cacheRead +\n record.usage.cacheWrite;\n if (total <= options.maxTokens) return;\n terminalStatus = \"timed_out\";\n terminalError =\n `Fabric token limit reached: ${total} tokens (limit ${options.maxTokens} set by agents.maxTokensPerChild); terminating child. ` +\n `The count is cumulative across the run and includes cache reads/writes, so it grows every turn; ` +\n `raise or disable agents.maxTokensPerChild in /fabric settings (0 disables), or split the task into smaller agent runs.`;\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n child.stdin?.end();\n };\n\n type ClaudeInputKind = \"initial\" | \"steer\" | \"follow_up\";\n const claudeTools = new Map<string, string>();\n const claudeCompletedUsage = emptyUsage();\n const claudeCurrentUsage = emptyUsage();\n const syncClaudeUsage = (): void => {\n record.usage = {\n input: claudeCompletedUsage.input + claudeCurrentUsage.input,\n output: claudeCompletedUsage.output + claudeCurrentUsage.output,\n cacheRead: claudeCompletedUsage.cacheRead + claudeCurrentUsage.cacheRead,\n cacheWrite: claudeCompletedUsage.cacheWrite + claudeCurrentUsage.cacheWrite,\n cost: claudeCompletedUsage.cost,\n };\n };\n\n const claudeSentInputs: Array<{ kind: ClaudeInputKind; message: string }> = [];\n const claudeSteering: string[] = [];\n const claudeFollowUps: string[] = [];\n let claudeSteeringMode: \"all\" | \"one-at-a-time\" = \"one-at-a-time\";\n let claudeFollowUpMode: \"all\" | \"one-at-a-time\" = \"one-at-a-time\";\n let claudeCanFollowUp = false;\n let claudeResultSeen = false;\n const enqueueClaudeControl = (queue: string[], message: string): void => {\n const pendingInputs = claudeSentInputs.length + claudeSteering.length + claudeFollowUps.length;\n if (pendingInputs >= MAX_CLAUDE_PENDING_INPUTS) return;\n queue.push(message);\n };\n let claudeCloseTimer: NodeJS.Timeout | undefined;\n\n const updateClaudeQueue = (): void => {\n const sentSteering = claudeSentInputs\n .filter((entry) => entry.kind === \"steer\")\n .map((entry) => entry.message);\n const sentFollowUps = claudeSentInputs\n .filter((entry) => entry.kind === \"follow_up\")\n .map((entry) => entry.message);\n record.pendingMessages = {\n steering: [...sentSteering, ...claudeSteering],\n followUp: [...sentFollowUps, ...claudeFollowUps],\n };\n update();\n };\n\n const writeClaudeInput = (\n kind: ClaudeInputKind,\n message: string,\n inputImages: readonly ImageContent[] = [],\n ): void => {\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n claudeCloseTimer = undefined;\n if (!child.stdin || child.stdin.writableEnded || child.stdin.destroyed) return;\n claudeSentInputs.push({ kind, message });\n if (kind === \"follow_up\") claudeCanFollowUp = false;\n child.stdin.write(\n `${JSON.stringify(claudeCli!.claudeUserMessage(message, inputImages))}\\n`,\n );\n updateClaudeQueue();\n };\n\n const flushClaudeSteering = (): void => {\n if (claudeSteering.length === 0) return;\n const alreadySent = claudeSentInputs.some((entry) => entry.kind === \"steer\");\n if (claudeSteeringMode === \"one-at-a-time\" && alreadySent) return;\n const count = claudeSteeringMode === \"all\" ? claudeSteering.length : 1;\n for (const message of claudeSteering.splice(0, count)) {\n writeClaudeInput(\"steer\", message);\n }\n };\n\n const flushClaudeFollowUps = (): void => {\n if (claudeFollowUps.length === 0 || claudeSteering.length > 0) return;\n if (claudeSentInputs.some((entry) => entry.kind === \"steer\")) return;\n const alreadySent = claudeSentInputs.some((entry) => entry.kind === \"follow_up\");\n if (claudeFollowUpMode === \"one-at-a-time\" && alreadySent) return;\n const count = claudeFollowUpMode === \"all\" ? claudeFollowUps.length : 1;\n for (const message of claudeFollowUps.splice(0, count)) {\n writeClaudeInput(\"follow_up\", message);\n }\n };\n\n const scheduleClaudeClose = (): void => {\n if (claudeCloseTimer || terminalStatus) return;\n claudeCloseTimer = setTimeout(() => {\n claudeCloseTimer = undefined;\n if (\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0\n ) {\n child.stdin?.end();\n }\n }, 300);\n claudeCloseTimer.unref();\n };\n\n const processClaudeEvent = (event: Record<string, unknown>): void => {\n if (event.type === \"system\" && event.subtype === \"init\") {\n const sessionId = stringField(event.session_id);\n if (sessionId) record.runnerSessionId = sessionId;\n const model = stringField(event.model);\n if (model && !record.model) record.model = model;\n update();\n return;\n }\n if (event.type === \"assistant\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const assistant = message as Record<string, unknown>;\n const text = extractText(assistant);\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const content = assistant.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null || Array.isArray(block)) continue;\n const part = block as Record<string, unknown>;\n if (part.type !== \"tool_use\") continue;\n const id = stringField(part.id);\n const name = stringField(part.name);\n if (!id || !name || claudeTools.has(id)) continue;\n claudeTools.set(id, name);\n while (claudeTools.size > MAX_CLAUDE_PENDING_TOOLS) {\n const oldestToolId = claudeTools.keys().next().value;\n if (oldestToolId === undefined) break;\n claudeTools.delete(oldestToolId);\n }\n record.toolCalls++;\n record.currentTool = name;\n process.stdout.write(`\u2192 ${name}\\n`);\n }\n }\n const usage = assistant.usage;\n if (typeof usage === \"object\" && usage !== null && !Array.isArray(usage)) {\n const values = usage as Record<string, unknown>;\n const delta = {\n input: numberField(values.input_tokens),\n output: numberField(values.output_tokens),\n cacheRead: numberField(values.cache_read_input_tokens),\n cacheWrite: numberField(values.cache_creation_input_tokens),\n cost: 0,\n };\n claudeCurrentUsage.input += delta.input;\n claudeCurrentUsage.output += delta.output;\n claudeCurrentUsage.cacheRead += delta.cacheRead;\n claudeCurrentUsage.cacheWrite += delta.cacheWrite;\n syncClaudeUsage();\n emitTokenUsage(delta, { model: record.model ?? stringField(event.model) });\n }\n if (typeof event.error === \"string\") {\n sawAgentError = true;\n terminalError = event.error;\n }\n enforceTokenLimit();\n update();\n return;\n }\n if (event.type === \"user\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const content = (message as Record<string, unknown>).content;\n if (!Array.isArray(content)) return;\n for (const block of content) {\n if (typeof block !== \"object\" || block === null || Array.isArray(block)) continue;\n const part = block as Record<string, unknown>;\n if (part.type !== \"tool_result\") continue;\n const id = stringField(part.tool_use_id);\n if (id) claudeTools.delete(id);\n }\n const current = [...claudeTools.values()].at(-1);\n if (current) record.currentTool = current;\n else delete record.currentTool;\n update();\n return;\n }\n if (event.type === \"stream_event\") {\n const streamEvent = event.event;\n if (typeof streamEvent !== \"object\" || streamEvent === null || Array.isArray(streamEvent)) return;\n const stream = streamEvent as Record<string, unknown>;\n if (stream.type !== \"content_block_start\") return;\n const contentBlock = stream.content_block;\n if (typeof contentBlock !== \"object\" || contentBlock === null || Array.isArray(contentBlock)) return;\n const block = contentBlock as Record<string, unknown>;\n const name = stringField(block.name);\n if (block.type === \"tool_use\" && name) {\n record.currentTool = name;\n update();\n }\n return;\n }\n if (event.type !== \"result\") return;\n claudeResultSeen = true;\n const sessionId = stringField(event.session_id);\n if (sessionId) record.runnerSessionId = sessionId;\n const resultText = typeof event.result === \"string\" ? event.result : \"\";\n if (resultText) record.text = latestRunText(resultText);\n if (event.structured_output !== undefined) record.value = event.structured_output;\n record.turns += Math.max(0, Math.floor(numberField(event.num_turns)));\n const resultUsage =\n typeof event.usage === \"object\" && event.usage !== null && !Array.isArray(event.usage)\n ? (event.usage as Record<string, unknown>)\n : undefined;\n // The result frame supersedes the assistant-frame stream for this turn:\n // fold any unreported assistant tokens into the result delta so cumulative\n // attribution stays exact without double-counting assistant emissions.\n const resultDelta = resultUsage\n ? {\n input: numberField(resultUsage.input_tokens) - claudeCurrentUsage.input,\n output: numberField(resultUsage.output_tokens) - claudeCurrentUsage.output,\n cacheRead:\n numberField(resultUsage.cache_read_input_tokens) - claudeCurrentUsage.cacheRead,\n cacheWrite:\n numberField(resultUsage.cache_creation_input_tokens) - claudeCurrentUsage.cacheWrite,\n cost: Math.max(0, numberField(event.total_cost_usd)),\n }\n : { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: Math.max(0, numberField(event.total_cost_usd)) };\n claudeCompletedUsage.input += resultUsage\n ? numberField(resultUsage.input_tokens)\n : claudeCurrentUsage.input;\n claudeCompletedUsage.output += resultUsage\n ? numberField(resultUsage.output_tokens)\n : claudeCurrentUsage.output;\n claudeCompletedUsage.cacheRead += resultUsage\n ? numberField(resultUsage.cache_read_input_tokens)\n : claudeCurrentUsage.cacheRead;\n claudeCompletedUsage.cacheWrite += resultUsage\n ? numberField(resultUsage.cache_creation_input_tokens)\n : claudeCurrentUsage.cacheWrite;\n claudeCompletedUsage.cost += Math.max(0, numberField(event.total_cost_usd));\n claudeCurrentUsage.input = 0;\n claudeCurrentUsage.output = 0;\n claudeCurrentUsage.cacheRead = 0;\n claudeCurrentUsage.cacheWrite = 0;\n syncClaudeUsage();\n emitTokenUsage(resultDelta, { model: record.model ?? stringField(event.model) });\n enforceTokenLimit();\n const failed = event.is_error === true || event.subtype !== \"success\";\n if (failed) {\n sawAgentError = true;\n const errors = Array.isArray(event.errors)\n ? event.errors.filter((value): value is string => typeof value === \"string\").join(\" \u00B7 \")\n : \"\";\n terminalError = errors || resultText || `Claude returned ${String(event.subtype ?? \"an error\")}`;\n claudeSteering.splice(0);\n claudeFollowUps.splice(0);\n } else {\n sawAgentError = false;\n if (!terminalStatus) terminalError = undefined;\n }\n if (failed || terminalStatus) claudeSentInputs.splice(0);\n else claudeSentInputs.shift();\n claudeCanFollowUp = !failed && !terminalStatus;\n delete record.currentTool;\n updateClaudeQueue();\n if (failed || terminalStatus) {\n child.stdin?.end();\n return;\n }\n flushClaudeSteering();\n if (claudeSentInputs.length === 0 && claudeSteering.length === 0) {\n flushClaudeFollowUps();\n }\n if (\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0\n ) {\n scheduleClaudeClose();\n }\n };\n\n const processEvent = (line: string): void => {\n if (process.env.PI_FABRIC_INJECT_CRASH === \"stream\") throw new Error(\"simulated stream crash\");\n if (!line.trim()) return;\n appendLog(`${line}\\n`);\n sessionStream?.write(`${line}\\n`);\n let event: Record<string, unknown>;\n try {\n const parsed: unknown = JSON.parse(line);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return;\n event = parsed as Record<string, unknown>;\n } catch {\n return;\n }\n if (options.runner === \"claude\") {\n processClaudeEvent(event);\n return;\n }\n compactControl.observe(event);\n if (modelControl.observe(event)) return;\n if (event.type === \"message_start\" || event.type === \"message_update\") {\n const message = event.message;\n if (typeof message === \"object\" && message !== null && !Array.isArray(message)) {\n modelControl.observeAssistant(message as Record<string, unknown>);\n }\n }\n if (event.type === \"agent_start\") {\n emitLifecycle(\"pi.agent_start\");\n retryPending = false;\n sawAgentError = false;\n if (!terminalStatus) terminalError = undefined;\n return;\n }\n if (event.type === \"response\" && event.command === \"prompt\" && event.success === false) {\n sawAgentError = true;\n if (!terminalStatus) terminalError = typeof event.error === \"string\" ? event.error : \"Pi rejected the prompt\";\n child.stdin?.end();\n return;\n }\n if (event.type === \"extension_ui_request\") {\n const method = event.method;\n if (\n typeof event.id === \"string\" &&\n (method === \"select\" || method === \"confirm\" || method === \"input\" || method === \"editor\")\n ) {\n child.stdin?.write(\n `${JSON.stringify({ type: \"extension_ui_response\", id: event.id, cancelled: true })}\\n`,\n );\n }\n return;\n }\n if (event.type === \"tool_execution_start\") {\n record.toolCalls++;\n if (typeof event.toolName === \"string\") {\n record.currentTool = event.toolName;\n process.stdout.write(`\u2192 ${event.toolName}\\n`);\n }\n update();\n return;\n }\n if (event.type === \"tool_execution_end\") {\n if (event.isError === true) {\n emitLifecycle(\"pi.tool_error\", {\n ...(typeof event.toolCallId === \"string\" ? { toolCallId: event.toolCallId } : {}),\n ...(typeof event.toolName === \"string\" ? { toolName: event.toolName } : {}),\n });\n }\n delete record.currentTool;\n update();\n return;\n }\n if (event.type === \"turn_end\") {\n emitLifecycle(\"pi.turn_end\", {\n ...(typeof event.turnIndex === \"number\" ? { turnIndex: event.turnIndex } : {}),\n });\n record.turns++;\n update();\n return;\n }\n if (event.type === \"queue_update\") {\n const steering = Array.isArray(event.steering)\n ? event.steering.filter((value): value is string => typeof value === \"string\")\n : [];\n const followUp = Array.isArray(event.followUp)\n ? event.followUp.filter((value): value is string => typeof value === \"string\")\n : [];\n record.pendingMessages = { steering, followUp };\n update();\n return;\n }\n if (event.type === \"message_end\") {\n const message = event.message;\n if (typeof message !== \"object\" || message === null || Array.isArray(message)) return;\n const messageRecord = message as Record<string, unknown>;\n if (messageRecord.role !== \"assistant\") return;\n const text = extractText(messageRecord);\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const usageDelta = extractUsageDelta(messageRecord);\n applyUsage(record, messageRecord);\n emitTokenUsage(usageDelta, {\n model: stringField(messageRecord.model),\n provider: stringField(messageRecord.provider),\n });\n modelControl.observeAssistant(messageRecord);\n enforceTokenLimit();\n if (messageRecord.stopReason === \"error\" && !terminalStatus) {\n sawAgentError = true;\n terminalError = assistantError(messageRecord);\n } else {\n sawAgentError = false;\n // Once a terminal cause is set (e.g. the per-child token guard), keep it;\n // a later non-error message_end must not clobber the reason we are\n // terminating for.\n if (!terminalStatus) terminalError = undefined;\n }\n update();\n return;\n }\n if (event.type === \"agent_end\") {\n emitLifecycle(\"pi.agent_end\", { willRetry: event.willRetry === true });\n retryPending = event.willRetry === true;\n return;\n }\n if (event.type === \"agent_settled\") {\n emitLifecycle(\"pi.agent_settled\");\n if (!retryPending) {\n // Pull controls that landed with the final stream events before deciding\n // whether this one-shot child can close. A queued compact keeps stdin\n // open until its correlated response and compaction_end are observed.\n pollSteer();\n compactControl.childSettled();\n }\n return;\n }\n if (event.type === \"compaction_end\") {\n emitLifecycle(\"pi.session_compact\", {\n ...(typeof event.reason === \"string\" ? { reason: event.reason } : {}),\n ...(typeof event.willRetry === \"boolean\" ? { willRetry: event.willRetry } : {}),\n });\n return;\n }\n if (event.type === \"extension_error\") {\n const error = typeof event.error === \"string\" ? event.error : \"Extension error\";\n stderr = `${stderr}\\n${error}`.trim().slice(-MAX_STDERR_CHARS);\n update();\n }\n };\n\n child.stdin?.on(\"error\", () => {});\n if (options.runner === \"claude\") {\n writeClaudeInput(\"initial\", task, images);\n } else if (options.runner === \"veda\") {\n // Veda reads the prompt from stdin when no positional prompt is given.\n // Mirror its <system_instructions> wrapping so systemPrompt and schema\n // instructions reach the backend model.\n const sections: string[] = [];\n if (options.systemPrompt) {\n sections.push(`<system_instructions>\\n${options.systemPrompt}\\n</system_instructions>`);\n }\n if (schema) {\n sections.push(\n `Your final response must contain only JSON matching this schema, without Markdown fences:\\n${schema}`,\n );\n }\n sections.push(task);\n child.stdin?.write(sections.join(\"\\n\\n\"));\n child.stdin?.end();\n } else {\n modelControl.start();\n }\n\n // Tail a control file (steer.jsonl) the parent appends to and forward each\n // queued command to the child pi over its RPC stdin. This is the fabric\n // steering channel: the orchestrator (or any peer via the mesh relay) can\n // interject a steer / follow_up / queue-mode command between the child's\n // turns without stopping and respawning it, preserving its context. The\n // poller is best-effort: a closed or ended stdin (settled/stopped child) is\n // swallowed so a late steer never crashes the worker.\n let steerOffset = 0;\n let steerRemainder = Buffer.alloc(0);\n let skippingOversizedSteerLine = false;\n const pollSteer = (): void => {\n if (!options.steerFile || terminalStatus || (options.runner === \"pi\" && !modelControl.ready)) return;\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(options.steerFile, \"r\");\n } catch {\n return;\n }\n try {\n const size = fs.fstatSync(descriptor).size;\n if (size < steerOffset) {\n steerOffset = 0;\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = false;\n }\n if (size <= steerOffset) return;\n const length = Math.min(size - steerOffset, STEER_READ_CHUNK_BYTES);\n const buffer = Buffer.allocUnsafe(length);\n const bytesRead = fs.readSync(descriptor, buffer, 0, length, steerOffset);\n steerOffset += bytesRead;\n let combined = Buffer.concat([steerRemainder, buffer.subarray(0, bytesRead)]);\n if (skippingOversizedSteerLine) {\n const skippedLineEnd = combined.indexOf(0x0a);\n if (skippedLineEnd < 0) return;\n combined = combined.subarray(skippedLineEnd + 1);\n skippingOversizedSteerLine = false;\n }\n const newline = combined.lastIndexOf(0x0a);\n if (newline < 0) {\n if (combined.length > MAX_STEER_LINE_BYTES) {\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = true;\n } else {\n steerRemainder = Buffer.from(combined);\n }\n return;\n }\n const remainder = combined.subarray(newline + 1);\n if (remainder.length > MAX_STEER_LINE_BYTES) {\n steerRemainder = Buffer.alloc(0);\n skippingOversizedSteerLine = true;\n } else {\n steerRemainder = Buffer.from(remainder);\n }\n let processedCommands = 0;\n for (const raw of combined.subarray(0, newline + 1).toString(\"utf8\").split(\"\\n\")) {\n if (processedCommands >= MAX_STEER_COMMANDS_PER_POLL) break;\n if (Buffer.byteLength(raw, \"utf8\") > MAX_STEER_LINE_BYTES) continue;\n const line = raw.trim();\n if (!line) continue;\n processedCommands += 1;\n let command: { type?: string; message?: string; mode?: string; instructions?: string };\n try {\n command = JSON.parse(line);\n } catch {\n continue;\n }\n try {\n if (options.runner === \"claude\") {\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n claudeCloseTimer = undefined;\n if (command.type === \"steer\" && typeof command.message === \"string\") {\n enqueueClaudeControl(claudeSteering, command.message);\n flushClaudeSteering();\n } else if (command.type === \"follow_up\" && typeof command.message === \"string\") {\n enqueueClaudeControl(claudeFollowUps, command.message);\n if (claudeCanFollowUp && claudeSentInputs.length === 0) flushClaudeFollowUps();\n } else if (\n command.type === \"set_steering_mode\" &&\n (command.mode === \"all\" || command.mode === \"one-at-a-time\")\n ) {\n claudeSteeringMode = command.mode;\n flushClaudeSteering();\n } else if (\n command.type === \"set_follow_up_mode\" &&\n (command.mode === \"all\" || command.mode === \"one-at-a-time\")\n ) {\n claudeFollowUpMode = command.mode;\n if (claudeCanFollowUp && claudeSentInputs.length === 0) flushClaudeFollowUps();\n }\n updateClaudeQueue();\n } else if (options.runner === \"veda\") {\n // Steering is unsupported for the veda runner: Veda executes one\n // headless prompt per invocation. The command is dropped, never\n // forwarded to pi-style stdin frames.\n } else if (command.type === \"steer\" && typeof command.message === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"steer\", message: command.message }) + \"\\n\");\n } else if (command.type === \"follow_up\" && typeof command.message === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"follow_up\", message: command.message }) + \"\\n\");\n } else if (command.type === \"set_steering_mode\" && typeof command.mode === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"set_steering_mode\", mode: command.mode }) + \"\\n\");\n } else if (command.type === \"set_follow_up_mode\" && typeof command.mode === \"string\") {\n child.stdin?.write(JSON.stringify({ type: \"set_follow_up_mode\", mode: command.mode }) + \"\\n\");\n } else if (command.type === \"compact\") {\n compactControl.queue(command.instructions);\n }\n } catch {\n /* stdin closed (settled/stopped child); a late steer is dropped */\n }\n }\n } finally {\n fs.closeSync(descriptor);\n }\n };\n const steerTimer = options.steerFile ? setInterval(pollSteer, 200) : undefined;\n steerTimer?.unref?.();\n\n const failOversizedEvent = (line: string): void => {\n const prefix = line.slice(0, MAX_EVENT_LINE_CHARS);\n let artifactPath: string | undefined;\n try {\n artifactPath = path.join(path.dirname(options.logFile), \"oversized-event-prefix.txt\");\n fs.writeFileSync(artifactPath, prefix, { encoding: \"utf8\", mode: 0o600 });\n } catch {\n artifactPath = undefined;\n }\n terminalStatus = \"failed\";\n terminalError = artifactPath\n ? `Agent emitted an oversized event line; first ${prefix.length} characters saved to: ${artifactPath}`\n : \"Agent emitted an oversized event line\";\n outputBuffer = \"\";\n terminateChild(child, \"SIGTERM\");\n };\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n const decoded = outputDecoder.write(chunk);\n if (options.runner === \"veda\") {\n vedaOutput += decoded;\n return;\n }\n outputBuffer += eventProjection ? eventProjection.write(decoded) : decoded;\n while (true) {\n const newline = outputBuffer.indexOf(\"\\n\");\n if (newline < 0) {\n // Redundant Pi lifecycle history has already been elided while streaming.\n // Keep the cap on authoritative messages and all other event fields;\n // broad base64/text redaction must not bypass this safety boundary.\n if (outputBuffer.length > MAX_EVENT_LINE_CHARS) failOversizedEvent(outputBuffer);\n break;\n }\n if (newline > MAX_EVENT_LINE_CHARS) {\n // The retained record still exceeds the cap. Preserve bounded evidence;\n // do not use broad text redaction to keep an anomalous run alive.\n failOversizedEvent(outputBuffer.slice(0, newline));\n return;\n }\n const line = outputBuffer.slice(0, newline).replace(/\\r$/, \"\");\n outputBuffer = outputBuffer.slice(newline + 1);\n processEvent(line);\n }\n });\n const recordStderr = (text: string): void => {\n if (!text) return;\n appendLog(`${JSON.stringify({ type: \"worker_stderr\", text })}\\n`);\n process.stderr.write(text);\n stderr = `${stderr}${text}`.slice(-MAX_STDERR_CHARS);\n };\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n recordStderr(stderrDecoder.write(chunk));\n });\n child.stderr?.on(\"error\", () => {});\n\n const timeout = setTimeout(() => {\n if (terminalStatus) return;\n terminalStatus = \"timed_out\";\n terminalError = `Agent timed out after ${options.timeoutMs}ms`;\n if (options.runner === \"pi\" && !modelControl.ready) {\n terminalError += \"; Pi model admission did not complete; task was not sent\";\n }\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n }, options.timeoutMs);\n timeout.unref();\n\n const stop = (): void => {\n if (terminalStatus) return;\n terminalStatus = \"stopped\";\n terminalError = \"Agent stopped\";\n terminateChild(child, \"SIGTERM\");\n setTimeout(() => terminateChild(child, \"SIGKILL\"), KILL_GRACE_MS).unref();\n };\n process.once(\"SIGTERM\", stop);\n process.once(\"SIGINT\", stop);\n process.once(\"SIGHUP\", stop);\n\n const exitCode = await new Promise<number | null>((resolve) => {\n child.once(\"error\", (error) => {\n terminalStatus = \"failed\";\n terminalError = error.message;\n resolve(null);\n });\n child.once(\"close\", (code) => resolve(code));\n });\n\n if (steerTimer) clearInterval(steerTimer);\n if (claudeCloseTimer) clearTimeout(claudeCloseTimer);\n clearTimeout(timeout);\n if (options.runner === \"pi\" && !modelControl.ready && !terminalStatus) {\n terminalStatus = \"failed\";\n terminalError = `Child Pi exited before requested model admission completed; task was not sent${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`;\n }\n if (process.env.PI_FABRIC_INJECT_CRASH === \"close\") throw new Error(\"simulated close crash\");\n if (options.runner === \"veda\") {\n vedaOutput += outputDecoder.end();\n } else {\n const tail = outputDecoder.end();\n outputBuffer += eventProjection ? eventProjection.write(tail) + eventProjection.end() : tail;\n }\n recordStderr(stderrDecoder.end());\n if (options.runner === \"veda\") {\n const trimmed = vedaOutput.trim();\n if (trimmed) {\n try {\n const parsed = parseStructuredValue(trimmed);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n vedaParsed = parsed as Record<string, unknown>;\n const text = stringField(vedaParsed.text) ?? \"\";\n if (text) {\n record.text = latestRunText(text);\n process.stdout.write(`\\n${text}\\n`);\n }\n const sessionId = stringField(vedaParsed.sessionId);\n if (sessionId) record.runnerSessionId = sessionId;\n const usage = vedaParsed.usage;\n if (typeof usage === \"object\" && usage !== null && !Array.isArray(usage)) {\n const values = usage as Record<string, unknown>;\n const input = numberField(values.inputTokens);\n const output = numberField(values.outputTokens);\n const cacheRead = numberField(values.cachedTokens);\n const cost = typeof values.costUsd === \"number\" ? values.costUsd : 0;\n record.usage = { input, output, cacheRead, cacheWrite: 0, cost };\n emitTokenUsage({ input, output, cacheRead, cacheWrite: 0, cost }, { model: stringField(vedaParsed.model) });\n }\n const envelopeErrors: string[] = [];\n const error = stringField(vedaParsed.error);\n if (error) envelopeErrors.push(error);\n // navigator-plan gates the response on a <program> design block and\n // the worker persona on a <worker_report>; both exit non-zero and\n // report failure only via design/worker fields, not envelope.error.\n for (const key of [\"design\", \"worker\"] as const) {\n const gate = vedaParsed[key];\n if (typeof gate !== \"object\" || gate === null || Array.isArray(gate)) continue;\n const status = gate as Record<string, unknown>;\n if (status.ok !== false) continue;\n const details = Array.isArray(status.errors)\n ? status.errors.filter((entry): entry is string => typeof entry === \"string\").join(\"; \")\n : [stringField(status.reason), stringField(status.detail)]\n .filter((entry): entry is string => entry !== undefined)\n .join(\": \");\n envelopeErrors.push(`Veda ${key} failed${details ? `: ${details}` : \"\"}`);\n }\n if (envelopeErrors.length > 0) {\n sawAgentError = true;\n terminalError = envelopeErrors.join(\"\\n\");\n }\n record.turns += 1;\n update();\n }\n } catch {\n // Unparseable stdout; the generic failed-record path reports stderr.\n }\n }\n } else if (outputBuffer.trim()) {\n processEvent(outputBuffer);\n }\n record.exitCode = exitCode;\n record.stderr = stderr.slice(-MAX_STDERR_CHARS);\n if (\n record.compaction?.status === \"queued\" ||\n record.compaction?.status === \"in_flight\"\n ) {\n const error = terminalError ?? \"Child Pi exited before the queued compaction completed\";\n record.compaction = {\n ...record.compaction,\n status: \"failed\",\n updatedAt: Date.now(),\n finishedAt: Date.now(),\n error,\n };\n if (!terminalStatus) {\n terminalStatus = \"failed\";\n terminalError = error;\n }\n }\n record.finishedAt = Date.now();\n record.updatedAt = record.finishedAt;\n const childCompleted =\n exitCode === 0 &&\n !sawAgentError &&\n (options.runner === \"pi\" ||\n (options.runner === \"claude\" &&\n claudeResultSeen &&\n claudeSentInputs.length === 0 &&\n claudeSteering.length === 0 &&\n claudeFollowUps.length === 0) ||\n (options.runner === \"veda\" && vedaParsed !== undefined));\n record.status = terminalStatus ?? (childCompleted ? \"completed\" : \"failed\");\n if (terminalError) record.error = terminalError;\n if (record.status === \"failed\" && !record.error) {\n record.error =\n stderr.trim() ||\n (exitCode === 0\n ? `${runnerLabel(options.runner)} agent reported an error before exiting`\n : `${runnerLabel(options.runner)} exited with code ${exitCode ?? \"unknown\"}`);\n }\n if (record.status === \"completed\" && options.schemaFile) {\n try {\n const schema = JSON.parse(fs.readFileSync(options.schemaFile, \"utf8\")) as Record<\n string,\n unknown\n >;\n validateAgentResult(record, schema);\n } catch (error) {\n record.status = \"failed\";\n const reason = error instanceof Error ? error.message : String(error);\n const output = record.text.trim();\n const snippet = output.slice(0, 200);\n record.error = `Structured agent output was invalid: ${reason}${snippet ? ` (output: ${snippet}${output.length > 200 ? \"\u2026\" : \"\"})` : \"\"}`;\n }\n }\n delete record.currentTool;\n writeRunRecord(options.statusFile, record);\n terminalWritten = true;\n process.stdout.write(`\\n[pi-fabric] ${record.status}\\n`);\n await new Promise<void>((resolve) =>\n sessionStream ? sessionStream.end(resolve) : resolve(),\n );\n process.exitCode = record.status === \"completed\" ? 0 : 1;\n};\n\nmain().catch((error) => {\n console.error(error instanceof Error ? (error.stack ?? error.message) : String(error));\n writeCrashStatus(error);\n process.exit(1);\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["sessionId", "schema"]
|
|
7
7
|
}
|
package/docs/agents.md
CHANGED
|
@@ -34,6 +34,12 @@ You can give `fabric_exec` optional `agentBudget` and `tokenBudget` limits. Conf
|
|
|
34
34
|
|
|
35
35
|
Durable spawns use the same inbox. Undelivered envelopes survive disconnects; receipts survive reconnects. Escape or an errored Main turn parks pending results until new input rather than immediately restarting Main. Explicit lifecycle subscriptions, actor messages, and trajectory handoffs retain their separate delivery policies. A terminal run can still report incomplete work; Main must inspect its result.
|
|
36
36
|
|
|
37
|
+
### Image-heavy lifecycle events
|
|
38
|
+
|
|
39
|
+
Pi repeats message history in `agent_end.messages` and tool results in `turn_end.toolResults`. Fabric streams past these redundant top-level fields, recording empty arrays in the worker event log. Large accumulated histories therefore do not trip the event-size guard or interrupt completion/retries. Authoritative message/tool events, final text, usage, and Pi's persisted session history are unchanged.
|
|
40
|
+
|
|
41
|
+
The 4,194,304-character guard still applies to other event data, including a single oversized authoritative message. It is not a model token limit. Already-running workers keep their loaded implementation; newly launched workers use the rebuilt/updated package.
|
|
42
|
+
|
|
37
43
|
### Reuse discovered model keys
|
|
38
44
|
|
|
39
45
|
Use `agents.models({ runner: "pi" })` and copy the returned `key` verbatim, or use an explicitly configured `models.aliases` name. Reuse the `model` returned by a successful spawn rather than reconstructing it from an agent's display name. For example, an agent named “Sol” need not share the version number of one named “Astra”. Prior success with one key does not validate a different key.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-fabric",
|
|
3
|
-
"version": "0.92.
|
|
3
|
+
"version": "0.92.42",
|
|
4
4
|
"description": "A programmable tool and agent runtime for Pi",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"image": "https://raw.githubusercontent.com/monotykamary/pi-fabric/main/media/banner.svg"
|
|
99
99
|
},
|
|
100
100
|
"dependencies": {
|
|
101
|
-
"@earendil-works/pi-ai": "0.
|
|
101
|
+
"@earendil-works/pi-ai": "0.87.0",
|
|
102
102
|
"@jitl/quickjs-singlefile-mjs-release-sync": "^0.32.0",
|
|
103
103
|
"@lezer/common": "^1.5.2",
|
|
104
104
|
"@lezer/python": "^1.1.19",
|
|
@@ -119,9 +119,9 @@
|
|
|
119
119
|
"@earendil-works/pi-tui": ">=0.80.6"
|
|
120
120
|
},
|
|
121
121
|
"devDependencies": {
|
|
122
|
-
"@earendil-works/pi-agent-core": "0.
|
|
123
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
124
|
-
"@earendil-works/pi-tui": "0.
|
|
122
|
+
"@earendil-works/pi-agent-core": "0.87.0",
|
|
123
|
+
"@earendil-works/pi-coding-agent": "0.87.0",
|
|
124
|
+
"@earendil-works/pi-tui": "0.87.0",
|
|
125
125
|
"@types/cross-spawn": "^6.0.6",
|
|
126
126
|
"@types/node": "^26.1.2",
|
|
127
127
|
"esbuild": "^0.25.12",
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/actors/types.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ExtensionEvent } from \"@earendil-works/pi-coding-agent\";\nimport type { FabricAgentRunner, FabricAgentTransport, FabricPythonRuntime } from \"../config.js\";\nimport type { FabricThinking } from \"../thinking.js\";\nimport type { FabricLogLine, AgentRunRecord, AgentUsage } from \"../agents/types.js\";\nimport type { FabricCapabilityRequirement } from \"../components/types.js\";\nimport type { FabricKernel } from \"../runtime/kernel.js\";\nimport type { FabricParticipantResidency } from \"../topology/types.js\";\n\n// Pi's extension event union is closed; every member we want the actor host\n// to observe must appear in FABRIC_ACTOR_PI_HOST_EVENTS below. `project_trust`\n// uses pi's dedicated trust handler, and pi 0.86's `cache_warming_decision` is\n// a host-internal prompt-cache maintenance control event, so neither is an\n// actor observation and both are excluded here.\nexport type FabricActorPiHostEvent = Exclude<\n ExtensionEvent[\"type\"],\n \"project_trust\" | \"cache_warming_decision\"\n>;\n\nconst defineFabricActorPiHostEvents = <\n const Events extends readonly FabricActorPiHostEvent[],\n>(\n events: Exclude<FabricActorPiHostEvent, Events[number]> extends never ? Events : never,\n): Events => events;\n\nexport const FABRIC_ACTOR_PI_HOST_EVENTS = defineFabricActorPiHostEvents([\n \"resources_discover\",\n \"session_start\",\n \"session_info_changed\",\n \"session_before_switch\",\n \"session_before_fork\",\n \"session_before_compact\",\n \"session_compact\",\n \"session_compact_failed\",\n \"session_shutdown\",\n \"session_before_tree\",\n \"session_tree\",\n \"input\",\n \"before_agent_start\",\n \"agent_start\",\n \"agent_end\",\n \"agent_settled\",\n \"turn_start\",\n \"turn_end\",\n \"message_start\",\n \"message_update\",\n \"message_end\",\n \"ui_prompt_start\",\n \"ui_prompt_end\",\n \"context\",\n \"before_provider_headers\",\n \"before_provider_request\",\n \"after_provider_response\",\n \"tool_execution_start\",\n \"tool_call\",\n \"tool_execution_update\",\n \"tool_result\",\n \"tool_execution_end\",\n \"model_select\",\n \"thinking_level_select\",\n \"user_bash\",\n]);\n\nexport const FABRIC_ACTOR_HOST_EVENTS = [\n ...FABRIC_ACTOR_PI_HOST_EVENTS,\n \"tool_error\",\n] as const;\n\nexport type FabricActorHostEvent = (typeof FABRIC_ACTOR_HOST_EVENTS)[number];\n\nconst FABRIC_ACTOR_HOST_EVENT_SET: ReadonlySet<string> = new Set(FABRIC_ACTOR_HOST_EVENTS);\n\nexport const isFabricActorHostEvent = (value: unknown): value is FabricActorHostEvent =>\n typeof value === \"string\" && FABRIC_ACTOR_HOST_EVENT_SET.has(value);\n\nexport type FabricActorDelivery = \"mailbox\" | \"steer\" | \"followUp\" | \"nextTurn\";\nexport type FabricActorResponseMode = \"text\" | \"directive\";\nexport type FabricActorStatus = \"idle\" | \"queued\" | \"running\" | \"stopped\";\nexport type FabricActorBindingScope = \"session\" | \"project\";\nexport type FabricActorStorageScope = \"session\" | \"project\";\n\nexport interface FabricActorRunBinding {\n model?: string;\n thinking?: FabricThinking;\n}\n\ninterface FabricActorBindingView extends FabricActorRunBinding {\n scope: \"session\";\n sessionId: string;\n updatedAt?: number;\n}\n\ninterface FabricActorProjectDefaults extends FabricActorRunBinding {\n scope: \"project\";\n}\n\nexport interface FabricActorValidWhileSource {\n version: 1;\n source: string;\n}\n\nexport interface FabricActorValidityDecision {\n valid: boolean;\n reason?: string;\n}\n\nexport type FabricActorActivation =\n | {\n kind: \"hostEvent\";\n id: string;\n source: string;\n sequence: number;\n createdAt: number;\n event: FabricActorHostEvent;\n mainRevision: number;\n taskRevision: number;\n signal?: unknown;\n }\n | {\n kind: \"direct\";\n id: string;\n source: string;\n sequence: number;\n createdAt: number;\n }\n | {\n kind: \"mesh\";\n id: string;\n source: string;\n sequence: number;\n createdAt: number;\n topic: string;\n };\n\nexport interface FabricActorValidityFacts {\n activation: FabricActorActivation;\n current: {\n latestActivationSequence: number;\n mainRevision: number;\n taskRevision: number;\n idle: boolean;\n now: number;\n };\n}\n\nexport interface FabricActorRequest {\n /** Storage and visibility boundary. Defaults to mesh.actorScope for compatibility. */\n scope?: FabricActorStorageScope;\n name: string;\n instructions: string;\n /** Asynchronous observations of session-bound Pi events plus synthetic tool_error. */\n events?: FabricActorHostEvent[];\n topics?: string[];\n /** Defaults to mailbox. steer/followUp require an explicit triggerTurn choice. */\n delivery?: FabricActorDelivery;\n responseMode?: FabricActorResponseMode;\n /** Required for steer/followUp; must be false or omitted for mailbox/nextTurn. */\n triggerTurn?: boolean;\n coalesce?: boolean;\n /** session actors stop with their Pi host; durable actors transfer to a resident host. */\n residency?: FabricParticipantResidency;\n runner?: FabricAgentRunner;\n /** Omitted/inherit resolves at creation; the actor keeps one language for its session. */\n kernel?: FabricKernel | \"inherit\";\n /** Host-only backend snapshot for persistent/resident sessions; not a provider argument. */\n pythonRuntime?: FabricPythonRuntime;\n model?: string;\n thinking?: FabricThinking;\n tools?: string[];\n transport?: FabricAgentTransport;\n timeoutMs?: number;\n /**\n * Fabric capability for the actor. Defaults to true (today's behavior: a Pi\n * actor is recursively Fabric-equipped with the host-required fabric_exec\n * tool). Set false to disable Fabric for a Pi actor: the activation runs with\n * extensions:false and recursive:false so fabric_exec is not injected and the\n * actor cannot call agents.* or mesh.*; the host still manages its mailbox\n * and delivery (same model as a Claude actor). This does not restrict the\n * actor's ordinary tool allowlist. Fixed at creation.\n */\n extensions?: boolean;\n /** Exact Fabric actions committed before every actor run. Optional entries do not block a run. */\n requires?: readonly (string | FabricCapabilityRequirement)[];\n /** Serialized guest predicate evaluated before work and before delivery. */\n validWhile?: FabricActorValidWhileSource;\n}\n\nexport interface FabricActorInfo {\n id: string;\n scope: FabricActorStorageScope;\n name: string;\n rootId?: string;\n status: FabricActorStatus;\n runner: FabricAgentRunner;\n kernel?: FabricKernel;\n pythonRuntime?: FabricPythonRuntime;\n events: FabricActorHostEvent[];\n topics: string[];\n delivery: FabricActorDelivery;\n responseMode: FabricActorResponseMode;\n triggerTurn: boolean;\n coalesce: boolean;\n residency?: FabricParticipantResidency;\n /** Effective value for this caller after session bindings overlay project defaults. */\n model?: string;\n /** Effective value for this caller after session bindings overlay project defaults. */\n thinking?: FabricThinking;\n binding?: FabricActorBindingView;\n projectDefaults?: FabricActorProjectDefaults;\n tools?: string[];\n timeoutMs?: number;\n extensions?: boolean;\n requirements?: FabricCapabilityRequirement[];\n capabilityDigest?: string;\n missingCapabilities?: string[];\n validWhile?: FabricActorValidWhileSource;\n queued: number;\n messages: number;\n createdAt: number;\n updatedAt: number;\n lastRunId?: string;\n lastError?: string;\n sessionFile?: string;\n logDir?: string;\n}\n\nexport interface FabricActorLog {\n actorId: string;\n actorName: string;\n sessionFile: string;\n logDir: string;\n session: FabricLogLine[];\n sessionHasMore: boolean;\n sessionBefore?: number;\n run?: {\n runId: string;\n eventsFile: string;\n status?: AgentRunRecord;\n events: FabricLogLine[];\n hasMore: boolean;\n before?: number;\n };\n retainedRuns: string[];\n}\n\nexport interface FabricActorMessage {\n id: string;\n actorId: string;\n actorName: string;\n direction: \"in\" | \"out\";\n source: string;\n createdAt: number;\n text?: string;\n data?: unknown;\n action?: \"silent\" | \"message\" | \"stop\";\n runId?: string;\n usage?: AgentUsage;\n error?: string;\n stale?: boolean;\n reason?: string;\n}\n\nexport interface FabricActorDirective {\n action: \"silent\" | \"message\" | \"stop\";\n message?: string;\n data?: unknown;\n}\n\nexport interface FabricActorDeliveryRequest {\n actor: FabricActorInfo;\n message: FabricActorMessage;\n delivery: Exclude<FabricActorDelivery, \"mailbox\">;\n triggerTurn: boolean;\n}\n\n/**\n * A project-independent actor template stored in the global registry\n * (the user's agent dir, not a project mesh). It carries only the actor\n * definition (the same fields as FabricActorRequest) plus identity and\n * timestamps \u2014 never any history (messages, session transcript, or run logs).\n * Global actors are not live: they are stamped into a project via import,\n * which creates a fresh live actor with no inherited history.\n */\nexport interface GlobalActorDefinition extends FabricActorRequest {\n id: string;\n createdAt: number;\n updatedAt: number;\n // Redeclared required: the registry always materializes these (defaults\n // applied on create and load), so they are never undefined on a stored\n // template. Keeping them required avoids undefined creeping into merges and\n // spreads under exactOptionalPropertyTypes.\n events: FabricActorHostEvent[];\n topics: string[];\n delivery: FabricActorDelivery;\n responseMode: FabricActorResponseMode;\n triggerTurn: boolean;\n coalesce: boolean;\n residency?: FabricParticipantResidency;\n runner: FabricAgentRunner;\n}\n"],
|
|
5
|
-
"mappings": ";AAkBA,IAAM,gCAAgC,CAGpC,WACW;AAEN,IAAM,8BAA8B,8BAA8B;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,2BAA2B;AAAA,EACtC,GAAG;AAAA,EACH;AACF;AAIA,IAAM,8BAAmD,IAAI,IAAI,wBAAwB;AAElF,IAAM,yBAAyB,CAAC,UACrC,OAAO,UAAU,YAAY,4BAA4B,IAAI,KAAK;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|