pi-fabric 0.92.35 → 0.92.37
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/agents/completion-inbox.d.ts +15 -0
- package/dist/agents/completion-inbox.d.ts.map +1 -0
- package/dist/agents/manager.d.ts +1 -0
- package/dist/agents/manager.d.ts.map +1 -1
- package/dist/agents.js +1 -1
- package/dist/chunks/{chunk-MDOBLRPL.js → chunk-2NG7VFJZ.js} +28 -1
- package/dist/chunks/chunk-2NG7VFJZ.js.map +7 -0
- package/dist/chunks/{chunk-UAWA6VJY.js → chunk-3ALJY5MG.js} +8 -6
- package/dist/chunks/chunk-3ALJY5MG.js.map +7 -0
- package/dist/chunks/{chunk-WG24VI7K.js → chunk-3M3RWABR.js} +17 -2
- package/dist/chunks/chunk-3M3RWABR.js.map +7 -0
- package/dist/chunks/{chunk-DLLIRB63.js → chunk-3TXOQ5MG.js} +54 -44
- package/dist/chunks/chunk-3TXOQ5MG.js.map +7 -0
- package/dist/chunks/{chunk-F5SWLHBF.js → chunk-IZSVDLWG.js} +1 -1
- package/dist/chunks/{chunk-ZHJNWM6A.js → chunk-KH7Z7PUC.js} +2 -2
- package/dist/chunks/{chunk-RWDKJ24D.js → chunk-NHMICIEU.js} +2 -2
- package/dist/chunks/{chunk-6Q234GXU.js → chunk-NTKI5NUE.js} +21 -4
- package/dist/chunks/chunk-NTKI5NUE.js.map +7 -0
- package/dist/chunks/{chunk-Z7ZAT43C.js → chunk-PXXRY3TN.js} +7 -4
- package/dist/chunks/chunk-PXXRY3TN.js.map +7 -0
- package/dist/chunks/{chunk-JNMTTJMQ.js → chunk-TX6E5W7H.js} +1 -1
- package/dist/chunks/{chunk-JNMTTJMQ.js.map → chunk-TX6E5W7H.js.map} +1 -1
- package/dist/chunks/{chunk-Y65V2MAP.js → chunk-V6RU7BGE.js} +2 -2
- package/dist/chunks/{chunk-RRGTKHXZ.js → chunk-X7XFT57O.js} +9 -140
- package/dist/chunks/{chunk-RRGTKHXZ.js.map → chunk-X7XFT57O.js.map} +4 -4
- package/dist/chunks/{chunk-HYK47EXZ.js → chunk-XL5NI6KH.js} +2 -2
- package/dist/chunks/chunk-Z64PRP7A.js +156 -0
- package/dist/chunks/chunk-Z64PRP7A.js.map +7 -0
- package/dist/components/configuration.js +2 -2
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/core/action-registry.d.ts +8 -0
- package/dist/core/action-registry.d.ts.map +1 -1
- package/dist/core/action-registry.js +5 -3
- package/dist/core/semantic-search.d.ts +56 -0
- package/dist/core/semantic-search.d.ts.map +1 -0
- package/dist/execution-service.d.ts.map +1 -1
- package/dist/fabric-runtime-state.d.ts.map +1 -1
- package/dist/fabric-runtime-state.js +548 -133
- package/dist/fabric-runtime-state.js.map +4 -4
- package/dist/index.js +4 -4
- package/dist/jev.js +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +9 -2
- package/dist/mcp.js.map +2 -2
- package/dist/providers/agents-actions.d.ts.map +1 -1
- package/dist/providers/agents-provider.d.ts.map +1 -1
- package/dist/providers/jev-provider.js +1 -1
- package/dist/providers/mcp-descriptor-cache.d.ts +2 -0
- package/dist/providers/mcp-descriptor-cache.d.ts.map +1 -1
- package/dist/residency/actor-client.js +2 -2
- package/dist/residency/client.d.ts +3 -0
- package/dist/residency/client.d.ts.map +1 -1
- package/dist/residency/host.d.ts.map +1 -1
- package/dist/residency/host.js +4 -4
- package/dist/residency/pi-entry.js +4 -4
- package/dist/residency/protocol.d.ts +4 -0
- package/dist/residency/protocol.d.ts.map +1 -1
- package/dist/runtime/core-override-guest-types.js +2 -2
- package/dist/runtime/guest-types.d.ts +1 -1
- package/dist/runtime/guest-types.d.ts.map +1 -1
- package/dist/runtime/guest-types.js +1 -1
- package/dist/runtime/monty-runtime.js +1 -1
- package/dist/runtime/typescript-kernel.js +2 -2
- package/dist/runtime-state-builtins.d.ts.map +1 -1
- package/dist/ui/settings-section-context.d.ts +1 -0
- package/dist/ui/settings-section-context.d.ts.map +1 -1
- package/dist/ui/settings-sections-execution.d.ts +1 -1
- package/dist/ui/settings-sections-execution.d.ts.map +1 -1
- package/dist/ui/settings-sections.d.ts +1 -0
- package/dist/ui/settings-sections.d.ts.map +1 -1
- package/dist/ui/settings-values.d.ts +1 -0
- package/dist/ui/settings-values.d.ts.map +1 -1
- package/dist/ui/settings.d.ts.map +1 -1
- package/dist/ui/settings.js +37 -5
- package/dist/ui/settings.js.map +2 -2
- package/docs/agents.md +8 -0
- package/docs/configuration.md +5 -1
- package/package.json +1 -1
- package/skillsets/python/fabric-exec/references/agents.md +1 -1
- package/skillsets/python/fabric-exec/references/mcp.md +1 -1
- package/skillsets/typescript/fabric-exec/SKILL.md +1 -1
- package/skillsets/typescript/fabric-exec/references/agents.md +1 -1
- package/dist/chunks/chunk-6Q234GXU.js.map +0 -7
- package/dist/chunks/chunk-DLLIRB63.js.map +0 -7
- package/dist/chunks/chunk-MDOBLRPL.js.map +0 -7
- package/dist/chunks/chunk-UAWA6VJY.js.map +0 -7
- package/dist/chunks/chunk-WG24VI7K.js.map +0 -7
- package/dist/chunks/chunk-Z7ZAT43C.js.map +0 -7
- /package/dist/chunks/{chunk-F5SWLHBF.js.map → chunk-IZSVDLWG.js.map} +0 -0
- /package/dist/chunks/{chunk-ZHJNWM6A.js.map → chunk-KH7Z7PUC.js.map} +0 -0
- /package/dist/chunks/{chunk-RWDKJ24D.js.map → chunk-NHMICIEU.js.map} +0 -0
- /package/dist/chunks/{chunk-Y65V2MAP.js.map → chunk-V6RU7BGE.js.map} +0 -0
- /package/dist/chunks/{chunk-HYK47EXZ.js.map → chunk-XL5NI6KH.js.map} +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { AgentRunResult } from "./types.js";
|
|
3
|
+
export declare const AGENT_COMPLETION_MESSAGE_TYPE = "pi-fabric-agent-complete";
|
|
4
|
+
type Completion = Pick<AgentRunResult, "id" | "name" | "status" | "text" | "error" | "startedAt" | "finishedAt">;
|
|
5
|
+
/** Own notifications until the tool batch ends, so a late wait can still retract them. */
|
|
6
|
+
export declare class AgentCompletionInbox {
|
|
7
|
+
#private;
|
|
8
|
+
readonly pi: ExtensionAPI;
|
|
9
|
+
constructor(pi: ExtensionAPI, context: ExtensionContext);
|
|
10
|
+
enqueue(result: Completion, delivered?: () => void): void;
|
|
11
|
+
acknowledge(id: string): void;
|
|
12
|
+
close(): void;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=completion-inbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-inbox.d.ts","sourceRoot":"","sources":["../../src/agents/completion-inbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,6BAA6B,6BAA6B,CAAC;AAKxE,KAAK,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC;AAQjH,0FAA0F;AAC1F,qBAAa,oBAAoB;;IASnB,QAAQ,CAAC,EAAE,EAAE,YAAY;gBAAhB,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB;IAwChE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAwBzD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK7B,KAAK,IAAI,IAAI;CAkDd"}
|
package/dist/agents/manager.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export declare class AgentManager {
|
|
|
34
34
|
identityId?: string;
|
|
35
35
|
retention?: FabricRetentionConfig;
|
|
36
36
|
onBackgroundComplete?: (result: AgentRunResult) => void;
|
|
37
|
+
onResultConsumed?: (id: string) => void;
|
|
37
38
|
onLifecycle?: (event: FabricLifecyclePublishRequest) => void;
|
|
38
39
|
preparePiModel?: (model: string | undefined) => Promise<string | void>;
|
|
39
40
|
resolveParticipantGuidance?: AgentParticipantGuidanceResolver;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/agents/manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOzD,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,KAAK,EAEV,kBAAkB,EAClB,cAAc,EACd,eAAe,EAEf,cAAc,EACd,eAAe,EACf,cAAc,EAEd,gBAAgB,EAKjB,MAAM,YAAY,CAAC;AAuBpB,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,uBAAuB,CAAC;AAoB/B,eAAO,MAAM,uBAAuB,GAClC,qBAAqB,MAAM,EAC3B,qBAAqB,MAAM,KAC1B,MAYF,CAAC;AAEF,UAAU,+BAA+B;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,KAAK,gCAAgC,GAAG,CACtC,OAAO,EAAE,+BAA+B,KACrC,MAAM,GAAG,SAAS,CAAC;AAExB,8EAA8E;AAC9E,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,EAAE,eAAe,MAAM,KAAG,MAoB1E,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/agents/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/agents.js
CHANGED
|
@@ -561,6 +561,12 @@ var DEFAULT_FABRIC_CONFIG = {
|
|
|
561
561
|
enabled: true,
|
|
562
562
|
revalidate: "changed",
|
|
563
563
|
revalidateBudgetMs: 6e4
|
|
564
|
+
},
|
|
565
|
+
jev: {
|
|
566
|
+
semanticSearch: false,
|
|
567
|
+
blockedServers: [],
|
|
568
|
+
semanticCandidateLimit: 127,
|
|
569
|
+
semanticMinProbability: 0.2
|
|
564
570
|
}
|
|
565
571
|
},
|
|
566
572
|
prewalk: {
|
|
@@ -755,6 +761,7 @@ var normalizeFabricConfig = (input) => {
|
|
|
755
761
|
const approvals = objectValue(input.approvals);
|
|
756
762
|
const mcp = objectValue(input.mcp);
|
|
757
763
|
const mcpCache = objectValue(mcp.cache);
|
|
764
|
+
const mcpJev = objectValue(mcp.jev);
|
|
758
765
|
const prewalk = objectValue(input.prewalk);
|
|
759
766
|
const agents = objectValue(input.agents);
|
|
760
767
|
const claude = objectValue(agents.claude);
|
|
@@ -936,6 +943,26 @@ var normalizeFabricConfig = (input) => {
|
|
|
936
943
|
1e3,
|
|
937
944
|
6e5
|
|
938
945
|
)
|
|
946
|
+
},
|
|
947
|
+
jev: {
|
|
948
|
+
semanticSearch: booleanValue(
|
|
949
|
+
mcpJev.semanticSearch,
|
|
950
|
+
DEFAULT_FABRIC_CONFIG.mcp.jev.semanticSearch
|
|
951
|
+
),
|
|
952
|
+
blockedServers: Array.isArray(mcpJev.blockedServers) ? [...new Set(
|
|
953
|
+
mcpJev.blockedServers.flatMap((name) => {
|
|
954
|
+
if (typeof name !== "string") return [];
|
|
955
|
+
const trimmed = name.trim();
|
|
956
|
+
return trimmed.length > 0 && trimmed.length <= 128 ? [trimmed] : [];
|
|
957
|
+
})
|
|
958
|
+
)].slice(0, 256) : [...DEFAULT_FABRIC_CONFIG.mcp.jev.blockedServers],
|
|
959
|
+
semanticCandidateLimit: boundedInteger(
|
|
960
|
+
mcpJev.semanticCandidateLimit,
|
|
961
|
+
DEFAULT_FABRIC_CONFIG.mcp.jev.semanticCandidateLimit,
|
|
962
|
+
2,
|
|
963
|
+
127
|
|
964
|
+
),
|
|
965
|
+
semanticMinProbability: typeof mcpJev.semanticMinProbability === "number" && Number.isFinite(mcpJev.semanticMinProbability) && mcpJev.semanticMinProbability >= 0 && mcpJev.semanticMinProbability <= 1 ? mcpJev.semanticMinProbability : DEFAULT_FABRIC_CONFIG.mcp.jev.semanticMinProbability
|
|
939
966
|
}
|
|
940
967
|
},
|
|
941
968
|
prewalk: {
|
|
@@ -1468,4 +1495,4 @@ export {
|
|
|
1468
1495
|
loadFabricConfig,
|
|
1469
1496
|
saveFabricConfig
|
|
1470
1497
|
};
|
|
1471
|
-
//# sourceMappingURL=chunk-
|
|
1498
|
+
//# sourceMappingURL=chunk-2NG7VFJZ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/core/shell-jobs.ts", "../../src/config.ts", "../../src/core/damaged-file.ts", "../../src/config-migrations.ts"],
|
|
4
|
+
"sourcesContent": ["import fs from \"node:fs\";\nimport { readFile, unlink } from \"node:fs/promises\";\nimport { closeScratch, createScratch } from \"../storage/scratch.js\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { BashOperations } from \"@earendil-works/pi-coding-agent\";\nimport type { PiShellToolName } from \"./pi-tools.js\";\n\nexport const DEFAULT_SHELL_HANG_MS = 120_000;\nexport const SHELL_HANG_MAX_MS = 600_000;\nconst SHELL_HANG_SNAPSHOT_BYTES = 8_000;\nexport const SHELL_TAIL_BYTES = 1024 * 1024;\nexport const SHELL_LOG_BYTES = 8 * 1024 * 1024;\nexport const SHELL_COMPLETED_HANDLES = 256;\nconst SHELL_COMPLETED_MAX_AGE_MS = 24 * 60 * 60 * 1_000;\nconst LOG_HEADER = \"[Bounded shell log: starts with retained pre-spill tail; 8 MiB total cap, then further output is omitted. Not a full-output archive.]\\n\";\nconst LOG_TRUNCATED = \"\\n[Shell log truncated: disk limit reached; subsequent output omitted.]\\n\";\n\nconst posixQuote = (value: string): string =>\n \"'\" + value.replaceAll(\"'\", \"'\\\\''\") + \"'\";\n\nconst powershellQuote = (value: string): string =>\n \"'\" + value.replaceAll(\"'\", \"''\") + \"'\";\n\nexport const wrapShellCommandForPid = (\n command: string,\n pidPath: string,\n tool: PiShellToolName,\n): string =>\n tool === \"powershell\"\n ? `Set-Content -LiteralPath ${powershellQuote(pidPath)} -Value $PID\\n${command}`\n : `printf '%s\\\\n' \"$$\" > ${posixQuote(pidPath)}\\n${command}`;\n\nexport const formatShellHangNotice = (input: {\n elapsedMs: number;\n pid?: number;\n logPath: string;\n}): string => {\n const seconds = Math.max(1, Math.round(input.elapsedMs / 1_000));\n const pid = input.pid !== undefined ? ` (pid ${input.pid})` : \"\";\n return `[Still running after ${seconds}s${pid}. Bounded live output (may be truncated): ${input.logPath}]`;\n};\n\nexport const appendShellHangNotice = (output: string, notice: string): string =>\n output ? `${output}\\n\\n${notice}` : notice;\n\nexport const parseShellPid = (text: string): number | undefined => {\n const pid = Number(text.trim());\n return Number.isSafeInteger(pid) && pid > 1 ? pid : undefined;\n};\n\ntype FabricShellJobStatus = \"running\" | \"spilled\" | \"exited\" | \"killed\";\n\nexport interface FabricShellJobInfo {\n id: string;\n tool: PiShellToolName;\n command: string;\n pid?: number;\n logPath?: string;\n startedAt: number;\n spilledAt?: number;\n finishedAt?: number;\n status: FabricShellJobStatus;\n exitCode?: number | null;\n}\n\nexport interface FabricShellJobHandle {\n readonly id: string;\n readonly tool: PiShellToolName;\n readonly command: string;\n readonly abort: AbortController;\n readonly startedAt: number;\n readonly pidPath: string;\n pid?: number;\n logPath?: string;\n spilled: boolean;\n finished: boolean;\n append(data: Buffer): void;\n snapshotText(maxBytes?: number): string;\n persistLog(): Promise<string>;\n readPid(): Promise<number | undefined>;\n spill(): void;\n whenSpill(): Promise<void>;\n finish(exitCode?: number | null, footer?: string): Promise<void>;\n}\n\nclass FabricShellJob implements FabricShellJobHandle {\n readonly id: string;\n readonly tool: PiShellToolName;\n readonly command: string;\n readonly abort = new AbortController();\n readonly startedAt = Date.now();\n readonly pidPath: string;\n pid?: number;\n logPath?: string;\n spilled = false;\n finished = false;\n spilledAt?: number;\n finishedAt?: number;\n exitCode?: number | null;\n status: FabricShellJobStatus = \"running\";\n #tail = Buffer.alloc(0);\n #omitted = false;\n readonly #directory: string;\n #descriptor: number | undefined;\n #logBytes = 0;\n #logTruncated = false;\n #spill = new AbortController();\n #pidRead: Promise<number | undefined> | undefined;\n\n constructor(tool: PiShellToolName, command: string, readonly onFinish: () => void, tempRoot: string) {\n this.id = randomUUID();\n this.tool = tool;\n this.command = command;\n this.#directory = createScratch(\"shell\", tempRoot);\n this.pidPath = path.join(this.#directory, \"child.pid\");\n }\n\n append(data: Buffer): void {\n if (this.finished) return;\n const keep = Math.max(0, SHELL_TAIL_BYTES - data.length);\n if (this.#tail.length + data.length > SHELL_TAIL_BYTES) this.#omitted = true;\n // Copy slices: a tiny view must not pin an arbitrarily large input buffer.\n this.#tail = Buffer.concat([\n this.#tail.subarray(Math.max(0, this.#tail.length - keep)),\n data.subarray(Math.max(0, data.length - SHELL_TAIL_BYTES)),\n ]);\n this.#writeLog(data);\n }\n\n #writeLog(data: Buffer): void {\n if (this.#descriptor === undefined || this.#logTruncated) return;\n const available = Math.max(0, SHELL_LOG_BYTES - Buffer.byteLength(LOG_TRUNCATED) - this.#logBytes);\n try {\n const chunk = data.subarray(0, available);\n // Bounded synchronous writes avoid an unbounded WriteStream backpressure queue.\n let offset = 0;\n while (offset < chunk.length) {\n const written = fs.writeSync(this.#descriptor, chunk, offset);\n if (written <= 0) throw new Error(\"Shell log write made no progress\");\n offset += written;\n }\n this.#logBytes += chunk.length;\n if (chunk.length < data.length) {\n fs.writeSync(this.#descriptor, LOG_TRUNCATED);\n this.#logTruncated = true;\n }\n } catch {\n // Never crash the subprocess data handler on ENOSPC. The header already\n // disclaims completeness; close the descriptor and stop accepting output.\n try { fs.closeSync(this.#descriptor); } catch {}\n this.#descriptor = undefined;\n this.#logTruncated = true;\n }\n }\n\n snapshotText(maxBytes = SHELL_HANG_SNAPSHOT_BYTES): string {\n const limit = Number.isFinite(maxBytes) ? Math.max(0, Math.floor(maxBytes)) : SHELL_TAIL_BYTES;\n const slice = this.#tail.subarray(Math.max(0, this.#tail.length - limit));\n const truncated = this.#omitted || slice.length < this.#tail.length;\n return `${truncated ? \"[Output truncated; retained tail follows]\\n\" : \"\"}${slice.toString(\"utf8\")}`;\n }\n\n async persistLog(): Promise<string> {\n if (this.logPath) return this.logPath;\n if (this.finished) throw new Error(\"Shell job finished before a log was requested\");\n const logPath = path.join(this.#directory, \"output.log\");\n try {\n this.#descriptor = fs.openSync(logPath, \"wx\", 0o600);\n fs.writeSync(this.#descriptor, LOG_HEADER);\n this.#logBytes = Buffer.byteLength(LOG_HEADER);\n if (this.#omitted) this.#writeLog(Buffer.from(\"[Pre-spill output truncated: only the last 1 MiB was retained.]\\n\"));\n this.#writeLog(this.#tail);\n this.logPath = logPath;\n return logPath;\n } catch (error) {\n if (this.#descriptor !== undefined) { try { fs.closeSync(this.#descriptor); } catch {} }\n this.#descriptor = undefined;\n try { fs.unlinkSync(logPath); } catch {}\n throw error;\n }\n }\n\n async readPid(): Promise<number | undefined> {\n if (this.pid !== undefined) return this.pid;\n this.#pidRead ??= (async () => {\n for (let attempt = 0; attempt < 25; attempt += 1) {\n try {\n const pid = parseShellPid(await readFile(this.pidPath, \"utf8\"));\n if (pid !== undefined) {\n this.pid = pid;\n return pid;\n }\n } catch {\n // Pid file is written by the child after spawn.\n }\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n return undefined;\n })();\n return this.#pidRead;\n }\n\n spill(): void {\n if (this.spilled || this.finished) return;\n this.spilled = true;\n this.spilledAt = Date.now();\n this.status = \"spilled\";\n if (!this.#spill.signal.aborted) this.#spill.abort();\n }\n\n whenSpill(): Promise<void> {\n if (this.spilled || this.#spill.signal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n this.#spill.signal.addEventListener(\"abort\", () => resolve(), { once: true });\n });\n }\n\n async finish(exitCode?: number | null, footer?: string): Promise<void> {\n if (this.finished) return;\n // A fast exit can beat the provider's persistLog continuation after spill.\n const persistence = this.spilled && !this.logPath ? this.persistLog() : undefined;\n this.finished = true;\n await persistence?.catch(() => undefined);\n this.finishedAt = Date.now();\n if (exitCode !== undefined) this.exitCode = exitCode;\n if (this.status === \"running\") {\n this.status = this.abort.signal.aborted ? \"killed\" : \"exited\";\n } else if (this.abort.signal.aborted && this.status === \"spilled\") {\n this.status = \"killed\";\n }\n if (footer) this.#writeLog(Buffer.from(footer.endsWith(\"\\n\") ? footer : `${footer}\\n`));\n if (this.#descriptor !== undefined) { try { fs.closeSync(this.#descriptor); } catch {} }\n this.#descriptor = undefined;\n this.#tail = Buffer.alloc(0);\n this.#omitted = false;\n if (!this.#spill.signal.aborted) this.#spill.abort();\n await unlink(this.pidPath).catch(() => undefined);\n if (this.logPath) closeScratch(this.#directory);\n else { try { fs.rmSync(this.#directory, { recursive: true, force: true }); } catch {} }\n this.onFinish();\n }\n\n info(): FabricShellJobInfo {\n return {\n id: this.id,\n tool: this.tool,\n command: this.command,\n ...(this.pid !== undefined ? { pid: this.pid } : {}),\n ...(this.logPath ? { logPath: this.logPath } : {}),\n startedAt: this.startedAt,\n ...(this.spilledAt !== undefined ? { spilledAt: this.spilledAt } : {}),\n ...(this.finishedAt !== undefined ? { finishedAt: this.finishedAt } : {}),\n status: this.status,\n ...(this.exitCode !== undefined ? { exitCode: this.exitCode } : {}),\n };\n }\n}\n\nexport const trackShellOperations = (\n inner: BashOperations,\n job: FabricShellJobHandle,\n tool: PiShellToolName,\n): BashOperations => ({\n exec: (command, cwd, options) =>\n inner.exec(wrapShellCommandForPid(command, job.pidPath, tool), cwd, {\n ...options,\n onData: (data) => {\n job.append(data);\n options.onData(data);\n },\n }),\n});\n\nexport class FabricShellJobStore {\n readonly #jobs = new Map<string, FabricShellJob>();\n\n constructor(readonly tempRoot = tmpdir()) {}\n\n #prune(): void {\n const completed = [...this.#jobs.values()].filter((job) => job.finished);\n completed.sort((a, b) => (a.finishedAt ?? 0) - (b.finishedAt ?? 0));\n for (const [index, job] of completed.entries()) {\n if (index < completed.length - SHELL_COMPLETED_HANDLES || Date.now() - (job.finishedAt ?? 0) >= SHELL_COMPLETED_MAX_AGE_MS) this.#jobs.delete(job.id);\n }\n }\n\n begin(tool: PiShellToolName, command: string): FabricShellJob {\n this.#prune();\n const job = new FabricShellJob(tool, command, () => this.#prune(), this.tempRoot);\n this.#jobs.set(job.id, job);\n return job;\n }\n\n get(id: string): FabricShellJob | undefined {\n this.#prune();\n return this.#jobs.get(id);\n }\n\n list(): FabricShellJobInfo[] {\n this.#prune();\n return [...this.#jobs.values()].map((job) => job.info());\n }\n\n waiting(): FabricShellJob[] {\n return [...this.#jobs.values()].filter((job) => !job.spilled && !job.finished);\n }\n\n live(): FabricShellJob[] {\n return [...this.#jobs.values()].filter((job) => !job.finished);\n }\n\n spillWaiting(): number {\n const jobs = this.waiting();\n for (const job of jobs) job.spill();\n return jobs.length;\n }\n\n killWaiting(): number {\n const jobs = this.waiting();\n for (const job of jobs) {\n if (!job.abort.signal.aborted) job.abort.abort(new Error(\"Command aborted\"));\n }\n return jobs.length;\n }\n\n async close(): Promise<void> {\n const live = this.live();\n for (const job of live) {\n if (!job.abort.signal.aborted) job.abort.abort(new Error(\"Fabric session ended\"));\n }\n await Promise.allSettled(live.map((job) => job.finish(null, \"\\n\\n[Process ended: session closed]\\n\")));\n this.#jobs.clear();\n }\n}\n\nexport const raceShellHang = async <T>(options: {\n execute: (signal: AbortSignal) => Promise<T>;\n parentSignal: AbortSignal | undefined;\n hangMs: number;\n immediate?: boolean;\n job: FabricShellJobHandle;\n}): Promise<{ status: \"done\"; value: T } | { status: \"error\"; error: unknown } | { status: \"spilled\" }> => {\n const { job, parentSignal, hangMs } = options;\n const onParentAbort = (): void => {\n if (job.spilled || job.finished || job.abort.signal.aborted) return;\n job.abort.abort(parentSignal?.reason ?? new Error(\"Command aborted\"));\n };\n if (parentSignal) {\n if (parentSignal.aborted) onParentAbort();\n else parentSignal.addEventListener(\"abort\", onParentAbort, { once: true });\n }\n const detachParent = (): void => {\n parentSignal?.removeEventListener(\"abort\", onParentAbort);\n };\n\n let hangTimer: ReturnType<typeof setTimeout> | undefined;\n const hang = new Promise<\"spill\">((resolve) => {\n const finish = (): void => resolve(\"spill\");\n if (hangMs > 0) {\n hangTimer = setTimeout(() => {\n job.spill();\n finish();\n }, hangMs);\n hangTimer.unref?.();\n }\n if (options.immediate) {\n void job.readPid().then(() => {\n if (!job.finished) job.spill();\n });\n }\n void job.whenSpill().then(finish);\n });\n\n const execute = options.execute(job.abort.signal).then(\n (value) => ({ status: \"done\" as const, value }),\n (error) => ({ status: \"error\" as const, error }),\n );\n\n try {\n const first = await Promise.race([execute, hang]);\n if (first === \"spill\") {\n if (job.finished) return execute;\n job.spill();\n detachParent();\n void execute.then(async (result) => {\n if (job.finished) return;\n if (result.status === \"done\") {\n await job.finish(0, \"\\n\\n[Process exited with code 0]\\n\");\n return;\n }\n const message = result.error instanceof Error ? result.error.message : String(result.error);\n await job.finish(null, \"\\n\\n[\" + message + \"]\\n\");\n });\n return { status: \"spilled\" };\n }\n detachParent();\n return first;\n } finally {\n if (hangTimer) clearTimeout(hangTimer);\n }\n};\n", "import fs from \"node:fs\";\nimport { DEFAULT_JEV_CONFIG, normalizeJevConfig, type FabricJevConfig } from \"./jev/config.js\";\nimport { normalizeJevApprovalModel } from \"./jev/model-key.js\";\nexport type { FabricJevConfig } from \"./jev/config.js\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { renameAtomic } from \"./core/atomic-write.js\";\nimport { quarantineDamagedFile } from \"./core/damaged-file.js\";\nimport { normalizeModelAliases, type FabricModelAliases } from \"./core/model-resolution.js\";\nimport { PI_CORE_TOOL_NAME_SET } from \"./core/pi-tools.js\";\nimport { DEFAULT_SHELL_HANG_MS, SHELL_HANG_MAX_MS } from \"./core/shell-jobs.js\";\nimport {\n CURRENT_FABRIC_CONFIG_VERSION,\n migrateFabricConfigDocument,\n} from \"./config-migrations.js\";\nimport type { FabricComponentEntry } from \"./components/types.js\";\nimport type { FabricRisk } from \"./protocol.js\";\nimport type { FabricKernel } from \"./runtime/kernel.js\";\nimport { DEFAULT_FABRIC_THINKING, isFabricThinking, type FabricThinking } from \"./thinking.js\";\nimport {\n defaultCodePreviewSettings,\n normalizeCodePreviewSettings,\n type CodePreviewSettings,\n} from \"./ui/code-preview.js\";\n\ntype FabricApprovalMode = \"allow\" | \"ask\" | \"auto\" | \"deny\";\nexport type FabricAgentTransport =\n | \"auto\"\n | \"process\"\n | \"tmux\"\n | \"screen\"\n | \"localterm\"\n | \"herdr\";\nexport type FabricAgentRunner = \"pi\" | \"claude\" | \"veda\";\nexport type FabricUiWidgetMode = \"auto\" | \"always\" | \"hidden\";\ntype FabricToolDisplayMode = \"full\" | \"compact\";\nexport type FabricResultFormat = \"auto\" | \"yaml\" | \"json\" | \"text\";\nexport type FabricPrewalkMode = \"in-place\" | \"trajectory\";\nexport type FabricExecutorRuntime = \"quickjs\" | \"node-process\" | \"bun-process\";\nexport type FabricConfigScope = \"global\" | \"project\";\ntype FabricCompactionEngine = \"pi\" | \"fabric\";\ntype FabricActorScope = \"project\" | \"session\";\n\nexport type FabricPythonRuntime = \"cpython\" | \"monty\";\n\ninterface FabricExecutorConfig {\n kernel: FabricKernel;\n pythonRuntime: FabricPythonRuntime;\n cpython: { binary: string };\n /** TypeScript backend only; ignored by the Python kernel. */\n runtime: FabricExecutorRuntime;\n timeoutMs: number;\n /** Policy maximum for any executor deadline, including per-invocation\n * requests and per-ref floors. Values above this are visibly normalized. */\n maxTimeoutMs: number;\n /** Exact-ref deadline floors (ms) for known long-running host calls, e.g.\n * \"extensions.subagent\". Keys are exact refs; no wildcard matching. */\n hostCallTimeouts: Record<string, number>;\n /** Wait budget for nested pi.bash / pi.powershell (default 2m, max 10m).\n * 0 disables auto-spill. After this, the await settles successfully with a\n * live output path while the process keeps running. `background: true`\n * detaches immediately. Explicit shell timeout remains a hard cap. */\n shellHangMs: number;\n memoryLimitBytes: number;\n maxOutputChars: number;\n maxNestedResultChars: number;\n resultFormat: FabricResultFormat;\n}\n\nexport interface FabricApprovalConfig {\n read: FabricApprovalMode;\n write: FabricApprovalMode;\n execute: FabricApprovalMode;\n network: FabricApprovalMode;\n agent: FabricApprovalMode;\n model?: string;\n}\n\n/** Session-start background revalidation scope for the MCP descriptor cache:\n * \"changed\" lists only added/reconfigured servers, \"all\" re-lists every known\n * server, \"off\" never spawns servers in the background. */\ntype FabricMcpRevalidatePolicy = \"changed\" | \"all\" | \"off\";\n\ninterface FabricMcpCacheConfig {\n /** Serve MCP tool metadata from the on-disk descriptor cache instead of\n * connecting to every configured server on first discovery each session. */\n enabled: boolean;\n revalidate: FabricMcpRevalidatePolicy;\n /** Wall-clock budget for one session-start background revalidation pass. */\n revalidateBudgetMs: number;\n}\n\nexport interface FabricMcpJevConfig {\n /** Opt-in Jev ranking for tools.search({ searchMode: \"semantic\" }). */\n semanticSearch: boolean;\n /** MCP servers whose tool metadata must not be sent to Jev. Empty allows every server, including ones not yet cached. */\n blockedServers: string[];\n semanticCandidateLimit: number;\n semanticMinProbability: number;\n}\n\nexport interface FabricMcpConfig {\n enabled: boolean;\n configPath?: string;\n disableOAuth: boolean;\n allowDynamicServers: boolean;\n callTimeoutMs: number;\n cache: FabricMcpCacheConfig;\n jev: FabricMcpJevConfig;\n}\n\ninterface FabricClaudeRunnerConfig {\n binary: string;\n model?: string;\n}\n\n/** Veda CLI options for the `veda` agent runner. The Veda CLI wraps external\n * backends (agy, codex, claude-code, droid, pi, and any backend registered by\n * the installed Veda build); the backend is selected here and the persona\n * controls read-only vs write-capable behavior. */\ninterface FabricVedaRunnerConfig {\n binary: string;\n /** Veda backend to drive. Defaults to the Antigravity CLI (agy). */\n backend: string;\n /** Optional backend-specific model or Veda model alias. */\n model?: string;\n /** Veda persona: navigator-plan, navigator-chat, reviewer, or worker. */\n persona: string;\n}\n\ninterface FabricPrewalkConfig {\n // Master switch, persisted by /fabric prewalk --disable|--enable or the\n // settings UI (absent means enabled). Manual arming, session auto-arm, and\n // boundary claims all gate on it.\n enabled?: boolean;\n mode: FabricPrewalkMode;\n model?: string;\n alwaysRearm: boolean;\n // Compact with the configured engine just before restoring Main's boundary\n // model after an in-place continuation settles.\n compactOnReturn: boolean;\n // Filesystem fallback trigger: when an armed boundary ran a successful\n // pi.bash or pi.powershell without an audited mutation, claim on stat-manifest drift so\n // shell heredocs / sed -i / formatter writes also hand off.\n detectShellWrites: boolean;\n // Reasoning effort for the trajectory executor; unset inherits agents.thinking.\n thinking?: FabricThinking;\n}\n\nexport interface FabricAgentConfig {\n enabled: boolean;\n runner: FabricAgentRunner;\n transport: FabricAgentTransport;\n model?: string;\n claude: FabricClaudeRunnerConfig;\n veda: FabricVedaRunnerConfig;\n thinking: FabricThinking;\n maxConcurrent: number;\n maxPerExecution: number;\n maxDepth: number;\n timeoutMs: number;\n extensions: boolean;\n defaultTools: string[];\n retainRuns: boolean;\n notifyOnComplete: boolean;\n budgetUsd: number;\n maxTokensPerChild: number;\n /** Write usage-only pi-format session files per agent run for external trackers. */\n sessionExport: boolean;\n /** Export store root override; PI_FABRIC_AGENT_DIR wins. Empty = ~/.pi-fabric/agent. */\n sessionExportDir: string;\n}\n\nexport interface FabricToolCaptureConfig {\n enabled: boolean;\n hideFromModel: boolean;\n keepVisible: string[];\n defaultRisk: FabricRisk;\n risks: Record<string, FabricRisk>;\n}\n\nexport type FabricSchemaMode = \"off\" | \"audit\" | \"enforce\";\n\nexport interface FabricSchemaTrustedCommand {\n command: string;\n args: string[];\n shell: boolean;\n timeoutMs: number;\n}\n\nexport interface FabricSchemaConfig {\n mode: FabricSchemaMode;\n certificateTtlMs: number;\n maxFiles: number;\n maxBytes: number;\n trustedCommands: Record<string, FabricSchemaTrustedCommand>;\n}\n\ninterface FabricUiConfig {\n enabled: boolean;\n widget: FabricUiWidgetMode;\n maxRows: number;\n refreshMs: number;\n eventHistory: number;\n haltOnEscape: boolean;\n showAgentToolPreview: boolean;\n toolDisplay: FabricToolDisplayMode;\n updateDebounceMs: number;\n}\n\ninterface FabricCompactionConfig {\n engine: FabricCompactionEngine;\n targetContextRatio: number;\n thresholds: Record<string, number>;\n tokenThresholds: Record<string, number>;\n}\n\nexport const MIN_COMPACTION_TOKEN_THRESHOLD = 1_000;\nexport const MAX_COMPACTION_TOKEN_THRESHOLD = 100_000_000;\nexport const MIN_COMPACTION_RATIO_THRESHOLD = 0.25;\nexport const MAX_COMPACTION_RATIO_THRESHOLD = 0.95;\n\nexport const clampCompactionTokenThreshold = (value: number): number =>\n Math.min(\n MAX_COMPACTION_TOKEN_THRESHOLD,\n Math.max(MIN_COMPACTION_TOKEN_THRESHOLD, Math.round(value)),\n );\n\nexport const clampCompactionRatioThreshold = (value: number): number =>\n Math.min(\n MAX_COMPACTION_RATIO_THRESHOLD,\n Math.max(MIN_COMPACTION_RATIO_THRESHOLD, value),\n );\n\nexport interface FabricRetentionConfig {\n orphanedTempRunMs: number;\n oneShotRunMs: number;\n actorRunArchiveMs: number;\n}\n\nexport interface FabricMeshConfig {\n enabled: boolean;\n root?: string;\n actorScope: FabricActorScope;\n maxEventBytes: number;\n maxReadEvents: number;\n actorPollMs: number;\n actorQueueLimit: number;\n eventContextChars: number;\n actorContextEntries: number;\n}\n\ninterface FabricRepairsConfig {\n enabled: boolean;\n}\n\ninterface FabricEntropyConfig {\n compile: boolean;\n}\n\nexport interface FabricMemoryConfig {\n enabled: boolean;\n indexDir?: string;\n maxSessions: number;\n maxEntryChars: number;\n indexThinking: boolean;\n indexToolOutput: boolean;\n hotSessions?: number;\n digestTerms?: number;\n maxColdVocabularyBytes?: number;\n maxColdCacheBytes?: number;\n maxSyncSessions?: number;\n maxSyncSourceBytes?: number;\n maxCacheCleanupFiles?: number;\n regexMaxPatternBytes?: number;\n regexMaxHaystackTerms?: number;\n regexMaxHaystackBytes?: number;\n regexTimeoutMs?: number;\n}\n\nexport interface FabricSpeculationConfig {\n /** Master switch for speculative programmatic tool calling during streaming. */\n enabled: boolean;\n /** Maximum simultaneously in-flight speculative calls; excess candidates are dropped. */\n maxConcurrent: number;\n /** Maximum retained unserved speculation entries per turn. */\n maxEntries: number;\n /** Per-stream cap on buffered partial tool-call arguments while extracting the `code` field. */\n maxBufferBytes: number;\n /** Unserved speculation entries older than this are aborted and discarded. */\n entryTtlMs: number;\n /**\n * Tier B: MCP tools that may be speculated despite risk \"network\". Entries\n * are `server.tool` or `server.*` and match the ref after the `mcp.` prefix.\n * Only enable for tools the operator knows are read-only; cached MCP\n * annotations with destructiveHint=true always refuse.\n */\n mcpAllowlist: string[];\n}\n\n\nexport interface FabricModelsConfig {\n /** Alias name \u2192 ordered provider/model fallback chain plus an optional default thinking level. */\n aliases: FabricModelAliases;\n}\n\nexport interface FabricConfig {\n fullCodeMode: boolean;\n executor: FabricExecutorConfig;\n approvals: FabricApprovalConfig;\n mcp: FabricMcpConfig;\n prewalk: FabricPrewalkConfig;\n agents: FabricAgentConfig;\n models: FabricModelsConfig;\n components: FabricComponentEntry[];\n capture: FabricToolCaptureConfig;\n ui: FabricUiConfig;\n compaction: FabricCompactionConfig;\n retention: FabricRetentionConfig;\n mesh: FabricMeshConfig;\n memory: FabricMemoryConfig;\n jev: FabricJevConfig;\n entropy: FabricEntropyConfig;\n repairs: FabricRepairsConfig;\n schema: FabricSchemaConfig;\n speculation: FabricSpeculationConfig;\n codePreview: CodePreviewSettings;\n}\n\n/** Hard implementation maximum for any executor deadline. Policy ceilings\n * (executor.maxTimeoutMs) may be raised up to this value by administrators. */\nexport const MAX_EXECUTOR_TIMEOUT_MS = 24 * 3_600_000;\n\nexport const MIN_AGENT_TIMEOUT_MS = 1_000;\nexport const MAX_AGENT_TIMEOUT_MS = 24 * 3_600_000;\n/** Default per-run wall-clock budget. It equals the policy ceiling on purpose:\n * an orchestration program inherits agents.timeoutMs as its own whole-program\n * deadline floor, so any lower default truncates long participants at a\n * fraction of the maximum the policy already allows. Narrow one run by setting\n * agents.timeoutMs explicitly; per-call values can only raise it. */\nconst DEFAULT_AGENT_TIMEOUT_MS = MAX_AGENT_TIMEOUT_MS;\nexport const QUICKJS_MAX_MEMORY_LIMIT_BYTES = 0xffff_ffff;\nexport const MAX_EXECUTOR_MEMORY_LIMIT_BYTES = Math.max(\n 8 * 1024 * 1024,\n Math.min(Number.MAX_SAFE_INTEGER, Math.floor(os.totalmem())),\n);\n\nexport const maxExecutorMemoryLimitBytes = (\n runtime: FabricExecutorRuntime,\n kernel: FabricKernel = \"typescript\",\n): number =>\n kernel === \"typescript\" && runtime === \"quickjs\"\n ? Math.min(QUICKJS_MAX_MEMORY_LIMIT_BYTES, MAX_EXECUTOR_MEMORY_LIMIT_BYTES)\n : MAX_EXECUTOR_MEMORY_LIMIT_BYTES;\n\nexport const DEFAULT_FABRIC_CONFIG: FabricConfig = {\n fullCodeMode: true,\n executor: {\n kernel: \"typescript\",\n pythonRuntime: \"monty\",\n cpython: { binary: \"python3\" },\n runtime: \"quickjs\",\n timeoutMs: 120_000,\n maxTimeoutMs: 900_000,\n hostCallTimeouts: {},\n shellHangMs: DEFAULT_SHELL_HANG_MS,\n memoryLimitBytes: 64 * 1024 * 1024,\n maxOutputChars: 50_000,\n maxNestedResultChars: 2_000_000,\n resultFormat: \"auto\",\n },\n approvals: {\n read: \"allow\",\n write: \"allow\",\n execute: \"allow\",\n network: \"allow\",\n agent: \"allow\",\n },\n mcp: {\n enabled: true,\n disableOAuth: true,\n allowDynamicServers: true,\n callTimeoutMs: 120_000,\n cache: {\n enabled: true,\n revalidate: \"changed\",\n revalidateBudgetMs: 60_000,\n },\n jev: {\n semanticSearch: false,\n blockedServers: [],\n semanticCandidateLimit: 127,\n semanticMinProbability: 0.2,\n },\n },\n prewalk: {\n mode: \"in-place\",\n alwaysRearm: false,\n compactOnReturn: true,\n detectShellWrites: true,\n },\n agents: {\n enabled: true,\n runner: \"pi\",\n transport: \"process\",\n claude: { binary: \"claude\" },\n veda: { binary: \"veda\", backend: \"agy\", persona: \"navigator-chat\" },\n thinking: DEFAULT_FABRIC_THINKING,\n maxConcurrent: 4,\n maxPerExecution: 100,\n maxDepth: 2,\n timeoutMs: DEFAULT_AGENT_TIMEOUT_MS,\n extensions: true,\n defaultTools: [\"read\", \"bash\", \"edit\", \"write\", \"grep\", \"find\", \"ls\"],\n retainRuns: false,\n notifyOnComplete: true,\n budgetUsd: 0,\n maxTokensPerChild: 0,\n sessionExport: true,\n sessionExportDir: \"\",\n },\n jev: { ...DEFAULT_JEV_CONFIG, credentialCommand: [] },\n components: [],\n capture: {\n enabled: true,\n hideFromModel: true,\n keepVisible: [\"fabric_exec\"],\n defaultRisk: \"execute\",\n risks: {\n read: \"read\",\n grep: \"read\",\n find: \"read\",\n ls: \"read\",\n edit: \"write\",\n write: \"write\",\n bash: \"execute\",\n fovea_sketch: \"read\",\n fovea_focus: \"read\",\n fovea_dwell: \"read\",\n fovea_impact: \"read\",\n },\n },\n ui: {\n enabled: true,\n widget: \"auto\",\n maxRows: 6,\n refreshMs: 500,\n eventHistory: 80,\n haltOnEscape: true,\n showAgentToolPreview: true,\n toolDisplay: \"compact\",\n updateDebounceMs: 100,\n },\n compaction: {\n engine: \"fabric\",\n targetContextRatio: 0.65,\n thresholds: {},\n tokenThresholds: {},\n },\n retention: {\n orphanedTempRunMs: 6 * 60 * 60 * 1_000,\n oneShotRunMs: 24 * 60 * 60 * 1_000,\n actorRunArchiveMs: 7 * 24 * 60 * 60 * 1_000,\n },\n mesh: {\n enabled: true,\n actorScope: \"project\",\n maxEventBytes: 256 * 1024,\n maxReadEvents: 500,\n actorPollMs: 250,\n actorQueueLimit: 32,\n eventContextChars: 40_000,\n actorContextEntries: 14,\n },\n models: {\n aliases: {},\n },\n memory: {\n enabled: true,\n maxSessions: 500,\n maxEntryChars: 2_000,\n indexThinking: false,\n indexToolOutput: true,\n hotSessions: 50,\n digestTerms: 200,\n maxColdVocabularyBytes: 512 * 1024,\n maxColdCacheBytes: 1024 * 1024,\n maxSyncSessions: 10_000,\n maxSyncSourceBytes: 512 * 1024 * 1024,\n maxCacheCleanupFiles: 100_000,\n regexMaxPatternBytes: 1_024,\n regexMaxHaystackTerms: 20_000,\n regexMaxHaystackBytes: 2 * 1024 * 1024,\n regexTimeoutMs: 250,\n },\n entropy: {\n compile: true,\n },\n repairs: {\n enabled: true,\n },\n schema: {\n mode: \"off\",\n certificateTtlMs: 30_000,\n maxFiles: 100,\n maxBytes: 10 * 1024 * 1024,\n trustedCommands: {},\n },\n speculation: {\n enabled: true,\n maxConcurrent: 4,\n maxEntries: 64,\n maxBufferBytes: 2 * 1024 * 1024,\n entryTtlMs: 180_000,\n mcpAllowlist: [],\n },\n codePreview: defaultCodePreviewSettings(),\n};\n\ninterface JsonObjectFile {\n document: Record<string, unknown>;\n source: string;\n}\n\nconst readJsonObjectFile = (filePath: string): JsonObjectFile | undefined => {\n let source: string;\n try {\n source = fs.readFileSync(filePath, \"utf8\");\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return undefined;\n // Unreadable settings must not take down extension load.\n return undefined;\n }\n if (!source.trim()) return { document: {}, source };\n try {\n const parsed: unknown = JSON.parse(source);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n quarantineDamagedFile(filePath);\n return undefined;\n }\n return { document: parsed as Record<string, unknown>, source };\n } catch {\n quarantineDamagedFile(filePath);\n return undefined;\n }\n};\n\nconst readJsonObject = (filePath: string): Record<string, unknown> | undefined =>\n readJsonObjectFile(filePath)?.document;\n\nconst mergeObjects = (\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> => {\n const merged = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const baseValue = merged[key];\n if (\n typeof baseValue === \"object\" &&\n baseValue !== null &&\n !Array.isArray(baseValue) &&\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n ) {\n merged[key] = mergeObjects(\n baseValue as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n merged[key] = value;\n }\n }\n return merged;\n};\n\nconst approvalMode = (value: unknown, fallback: FabricApprovalMode): FabricApprovalMode =>\n value === \"allow\" || value === \"ask\" || value === \"auto\" || value === \"deny\"\n ? value\n : fallback;\n\nconst booleanValue = (value: unknown, fallback: boolean): boolean =>\n typeof value === \"boolean\" ? value : fallback;\n\nconst boundedInteger = (value: unknown, fallback: number, min: number, max: number): number =>\n typeof value === \"number\" && Number.isFinite(value)\n ? Math.max(min, Math.min(max, Math.floor(value)))\n : fallback;\n\nconst boundedFloat = (value: unknown, fallback: number, min: number, max: number): number =>\n typeof value === \"number\" && Number.isFinite(value)\n ? Math.max(min, Math.min(max, value))\n : fallback;\n\nconst stringValue = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value : undefined;\n\nconst runnerValue = (value: unknown, fallback: FabricAgentRunner): FabricAgentRunner =>\n value === \"pi\" || value === \"claude\" || value === \"veda\" ? value : fallback;\n\nconst prewalkModeValue = (\n value: unknown,\n fallback: FabricPrewalkMode,\n): FabricPrewalkMode =>\n value === \"in-place\" || value === \"trajectory\" ? value : fallback;\n\nconst transportValue = (\n value: unknown,\n fallback: FabricAgentTransport,\n): FabricAgentTransport =>\n value === \"auto\" ||\n value === \"process\" ||\n value === \"tmux\" ||\n value === \"screen\" ||\n value === \"localterm\" ||\n value === \"herdr\"\n ? value\n : fallback;\n\nconst thinkingValue = (value: unknown, fallback: FabricThinking): FabricThinking =>\n isFabricThinking(value) ? value : fallback;\n\nconst objectValue = (value: unknown): Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\nconst widgetModeValue = (value: unknown, fallback: FabricUiWidgetMode): FabricUiWidgetMode =>\n value === \"auto\" || value === \"always\" || value === \"hidden\" ? value : fallback;\n\nconst toolDisplayModeValue = (\n value: unknown,\n fallback: FabricToolDisplayMode,\n): FabricToolDisplayMode => value === \"full\" || value === \"compact\" ? value : fallback;\n\nconst executorKernelValue = (value: unknown, fallback: FabricKernel): FabricKernel =>\n value === \"typescript\" || value === \"python\" ? value : fallback;\n\nconst executorRuntimeValue = (\n value: unknown,\n fallback: FabricExecutorRuntime,\n): FabricExecutorRuntime =>\n value === \"quickjs\" || value === \"node-process\" || value === \"bun-process\" ? value : fallback;\n\nconst resultFormatValue = (\n value: unknown,\n fallback: FabricResultFormat,\n): FabricResultFormat =>\n value === \"auto\" || value === \"yaml\" || value === \"json\" || value === \"text\"\n ? value\n : fallback;\n\nconst compactionEngineValue = (\n value: unknown,\n fallback: FabricCompactionEngine,\n): FabricCompactionEngine =>\n value === \"pi\" || value === \"fabric\" ? value : fallback;\n\nconst actorScopeValue = (value: unknown, fallback: FabricActorScope): FabricActorScope =>\n value === \"project\" || value === \"session\" ? value : fallback;\n\nconst schemaModeValue = (value: unknown, fallback: FabricSchemaMode): FabricSchemaMode =>\n value === \"off\" || value === \"audit\" || value === \"enforce\" ? value : fallback;\n\nconst mcpRevalidatePolicyValue = (\n value: unknown,\n fallback: FabricMcpRevalidatePolicy,\n): FabricMcpRevalidatePolicy =>\n value === \"changed\" || value === \"all\" || value === \"off\" ? value : fallback;\n\nconst riskValue = (value: unknown, fallback: FabricRisk): FabricRisk =>\n value === \"read\" ||\n value === \"write\" ||\n value === \"execute\" ||\n value === \"network\" ||\n value === \"agent\"\n ? value\n : fallback;\n\nexport const normalizeFabricConfig = (input: Record<string, unknown>): FabricConfig => {\n const executor = objectValue(input.executor);\n const cpython = objectValue(executor.cpython);\n const executorKernel = executorKernelValue(executor.kernel, DEFAULT_FABRIC_CONFIG.executor.kernel);\n const executorMaxTimeoutMs = boundedInteger(\n executor.maxTimeoutMs,\n DEFAULT_FABRIC_CONFIG.executor.maxTimeoutMs,\n 1_000,\n MAX_EXECUTOR_TIMEOUT_MS,\n );\n const approvals = objectValue(input.approvals);\n const mcp = objectValue(input.mcp);\n const mcpCache = objectValue(mcp.cache);\n const mcpJev = objectValue(mcp.jev);\n const prewalk = objectValue(input.prewalk);\n const agents = objectValue(input.agents);\n const claude = objectValue(agents.claude);\n const veda = objectValue(agents.veda);\n const capture = objectValue(input.capture);\n const ui = objectValue(input.ui);\n const compaction = objectValue(input.compaction);\n const retention = objectValue(input.retention);\n const mesh = objectValue(input.mesh);\n const memory = objectValue(input.memory);\n const entropy = objectValue(input.entropy);\n const repairs = objectValue(input.repairs);\n const modelsSection = objectValue(input.models);\n const schema = objectValue(input.schema);\n const schemaMode = schemaModeValue(schema.mode, DEFAULT_FABRIC_CONFIG.schema.mode);\n const speculation = objectValue(input.speculation);\n const configuredExecutorRuntime = executorRuntimeValue(\n executor.runtime,\n DEFAULT_FABRIC_CONFIG.executor.runtime,\n );\n const executorRuntime = schemaMode === \"enforce\" && executorKernel === \"typescript\"\n ? \"quickjs\"\n : configuredExecutorRuntime;\n const configuredTools = Array.isArray(agents.defaultTools)\n ? agents.defaultTools.filter(\n (tool): tool is string => typeof tool === \"string\" && Boolean(tool),\n )\n : DEFAULT_FABRIC_CONFIG.agents.defaultTools;\n const approvalModel = normalizeJevApprovalModel(stringValue(approvals.model));\n const configPath = stringValue(mcp.configPath);\n const meshRoot = stringValue(mesh.root);\n const memoryIndexDir = stringValue(memory.indexDir);\n const compactionThresholds = Object.fromEntries(\n Object.entries(objectValue(compaction.thresholds))\n .filter(([model, threshold]) =>\n model.includes(\"/\")\n && typeof threshold === \"number\"\n && Number.isFinite(threshold),\n )\n .map(([model, threshold]) => [\n model,\n clampCompactionRatioThreshold(threshold as number),\n ]),\n );\n const compactionTokenThresholds = Object.fromEntries(\n Object.entries(objectValue(compaction.tokenThresholds))\n .filter(([model, tokens]) =>\n model.includes(\"/\")\n && typeof tokens === \"number\"\n && Number.isFinite(tokens),\n )\n .map(([model, tokens]) => [\n model,\n clampCompactionTokenThreshold(tokens as number),\n ]),\n );\n const prewalkModel = stringValue(prewalk.model);\n const prewalkThinking = isFabricThinking(prewalk.thinking) ? prewalk.thinking : undefined;\n const agentModel = stringValue(agents.model);\n const claudeBinary = stringValue(claude.binary);\n const claudeModel = stringValue(claude.model);\n const vedaBinary = stringValue(veda.binary);\n const vedaBackend = stringValue(veda.backend);\n const vedaModel = stringValue(veda.model);\n const vedaPersona = stringValue(veda.persona);\n const agentThinking = thinkingValue(agents.thinking, DEFAULT_FABRIC_CONFIG.agents.thinking);\n const configuredComponents: FabricComponentEntry[] = Array.isArray(input.components)\n ? input.components.flatMap((raw) => {\n const componentEntry = objectValue(raw);\n const id = stringValue(componentEntry.id);\n const component = stringValue(componentEntry.component);\n if (!id || !component) return [];\n return [{\n id,\n component,\n ...(Object.prototype.hasOwnProperty.call(componentEntry, \"config\")\n ? { config: componentEntry.config }\n : {}),\n ...(typeof componentEntry.disabled === \"boolean\"\n ? { disabled: componentEntry.disabled }\n : {}),\n }];\n }).slice(0, 256)\n : DEFAULT_FABRIC_CONFIG.components;\n const configuredVisible = Array.isArray(capture.keepVisible)\n ? capture.keepVisible.filter(\n (name): name is string => typeof name === \"string\" && Boolean(name.trim()),\n )\n : DEFAULT_FABRIC_CONFIG.capture.keepVisible;\n const configuredRisks = {\n ...DEFAULT_FABRIC_CONFIG.capture.risks,\n ...objectValue(capture.risks),\n };\n const trustedCommands = Object.fromEntries(\n Object.entries(objectValue(schema.trustedCommands)).flatMap(([name, raw]) => {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/.test(name)) return [];\n const command = objectValue(raw);\n const executable = stringValue(command.command);\n if (!executable) return [];\n const shell = booleanValue(command.shell, false);\n const args = !shell && Array.isArray(command.args)\n ? command.args.filter((arg): arg is string => typeof arg === \"string\").slice(0, 64)\n : [];\n return [[name, {\n command: executable,\n args,\n shell,\n timeoutMs: boundedInteger(command.timeoutMs, 30_000, 1, 300_000),\n } satisfies FabricSchemaTrustedCommand]];\n }),\n );\n const risks = Object.fromEntries(\n Object.entries(configuredRisks)\n .filter(([name]) => Boolean(name.trim()))\n .map(([name, risk]) => [name, riskValue(risk, DEFAULT_FABRIC_CONFIG.capture.defaultRisk)]),\n );\n\n return {\n fullCodeMode: booleanValue(input.fullCodeMode, DEFAULT_FABRIC_CONFIG.fullCodeMode),\n executor: {\n kernel: executorKernel,\n pythonRuntime: executor.pythonRuntime === \"cpython\" ? \"cpython\" : \"monty\",\n cpython: {\n binary: stringValue(cpython.binary)?.trim() ?? DEFAULT_FABRIC_CONFIG.executor.cpython.binary,\n },\n runtime: executorRuntime,\n maxTimeoutMs: boundedInteger(\n executor.maxTimeoutMs,\n DEFAULT_FABRIC_CONFIG.executor.maxTimeoutMs,\n 1_000,\n MAX_EXECUTOR_TIMEOUT_MS,\n ),\n hostCallTimeouts: Object.fromEntries(\n Object.entries(objectValue(executor.hostCallTimeouts))\n .filter(([ref, value]) =>\n typeof ref === \"string\" &&\n Boolean(ref.trim()) &&\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n value >= 1,\n )\n .map(([ref, value]) => [ref, boundedInteger(value, 1_000, 1_000, executorMaxTimeoutMs)]),\n ),\n timeoutMs: boundedInteger(\n executor.timeoutMs,\n DEFAULT_FABRIC_CONFIG.executor.timeoutMs,\n 1_000,\n executorMaxTimeoutMs,\n ),\n shellHangMs: boundedInteger(\n executor.shellHangMs,\n DEFAULT_FABRIC_CONFIG.executor.shellHangMs,\n 0,\n Math.min(executorMaxTimeoutMs, SHELL_HANG_MAX_MS),\n ),\n memoryLimitBytes: boundedInteger(\n executor.memoryLimitBytes,\n DEFAULT_FABRIC_CONFIG.executor.memoryLimitBytes,\n 8 * 1024 * 1024,\n maxExecutorMemoryLimitBytes(executorRuntime, executorKernel),\n ),\n maxOutputChars: boundedInteger(\n executor.maxOutputChars,\n DEFAULT_FABRIC_CONFIG.executor.maxOutputChars,\n 1_000,\n 1_000_000,\n ),\n maxNestedResultChars: boundedInteger(\n executor.maxNestedResultChars,\n DEFAULT_FABRIC_CONFIG.executor.maxNestedResultChars,\n 10_000,\n 20_000_000,\n ),\n resultFormat: resultFormatValue(\n executor.resultFormat,\n DEFAULT_FABRIC_CONFIG.executor.resultFormat,\n ),\n },\n approvals: {\n read: approvalMode(approvals.read, DEFAULT_FABRIC_CONFIG.approvals.read),\n write: approvalMode(approvals.write, DEFAULT_FABRIC_CONFIG.approvals.write),\n execute: approvalMode(approvals.execute, DEFAULT_FABRIC_CONFIG.approvals.execute),\n network: approvalMode(approvals.network, DEFAULT_FABRIC_CONFIG.approvals.network),\n agent: approvalMode(approvals.agent, DEFAULT_FABRIC_CONFIG.approvals.agent),\n ...(approvalModel ? { model: approvalModel } : {}),\n },\n mcp: {\n enabled: booleanValue(mcp.enabled, DEFAULT_FABRIC_CONFIG.mcp.enabled),\n ...(configPath ? { configPath } : {}),\n disableOAuth: booleanValue(mcp.disableOAuth, DEFAULT_FABRIC_CONFIG.mcp.disableOAuth),\n allowDynamicServers: booleanValue(\n mcp.allowDynamicServers,\n DEFAULT_FABRIC_CONFIG.mcp.allowDynamicServers,\n ),\n callTimeoutMs: boundedInteger(\n mcp.callTimeoutMs,\n DEFAULT_FABRIC_CONFIG.mcp.callTimeoutMs,\n 1_000,\n 900_000,\n ),\n cache: {\n enabled: booleanValue(mcpCache.enabled, DEFAULT_FABRIC_CONFIG.mcp.cache.enabled),\n revalidate: mcpRevalidatePolicyValue(\n mcpCache.revalidate,\n DEFAULT_FABRIC_CONFIG.mcp.cache.revalidate,\n ),\n revalidateBudgetMs: boundedInteger(\n mcpCache.revalidateBudgetMs,\n DEFAULT_FABRIC_CONFIG.mcp.cache.revalidateBudgetMs,\n 1_000,\n 600_000,\n ),\n },\n jev: {\n semanticSearch: booleanValue(\n mcpJev.semanticSearch,\n DEFAULT_FABRIC_CONFIG.mcp.jev.semanticSearch,\n ),\n blockedServers: Array.isArray(mcpJev.blockedServers)\n ? [...new Set(\n mcpJev.blockedServers.flatMap((name) => {\n if (typeof name !== \"string\") return [];\n const trimmed = name.trim();\n return trimmed.length > 0 && trimmed.length <= 128 ? [trimmed] : [];\n }),\n )].slice(0, 256)\n : [...DEFAULT_FABRIC_CONFIG.mcp.jev.blockedServers],\n semanticCandidateLimit: boundedInteger(\n mcpJev.semanticCandidateLimit,\n DEFAULT_FABRIC_CONFIG.mcp.jev.semanticCandidateLimit,\n 2,\n 127,\n ),\n semanticMinProbability:\n typeof mcpJev.semanticMinProbability === \"number\" &&\n Number.isFinite(mcpJev.semanticMinProbability) &&\n mcpJev.semanticMinProbability >= 0 &&\n mcpJev.semanticMinProbability <= 1\n ? mcpJev.semanticMinProbability\n : DEFAULT_FABRIC_CONFIG.mcp.jev.semanticMinProbability,\n },\n },\n prewalk: {\n ...(prewalk.enabled === false ? { enabled: false } : {}),\n mode: prewalkModeValue(prewalk.mode, DEFAULT_FABRIC_CONFIG.prewalk.mode),\n ...(prewalkModel ? { model: prewalkModel } : {}),\n ...(prewalkThinking ? { thinking: prewalkThinking } : {}),\n alwaysRearm: booleanValue(\n prewalk.alwaysRearm,\n DEFAULT_FABRIC_CONFIG.prewalk.alwaysRearm,\n ),\n compactOnReturn: booleanValue(\n prewalk.compactOnReturn,\n DEFAULT_FABRIC_CONFIG.prewalk.compactOnReturn,\n ),\n detectShellWrites: booleanValue(\n prewalk.detectShellWrites,\n DEFAULT_FABRIC_CONFIG.prewalk.detectShellWrites,\n ),\n },\n agents: {\n enabled: booleanValue(agents.enabled, DEFAULT_FABRIC_CONFIG.agents.enabled),\n runner: runnerValue(agents.runner, DEFAULT_FABRIC_CONFIG.agents.runner),\n transport: transportValue(agents.transport, DEFAULT_FABRIC_CONFIG.agents.transport),\n ...(agentModel ? { model: agentModel } : {}),\n claude: {\n binary: claudeBinary ?? DEFAULT_FABRIC_CONFIG.agents.claude.binary,\n ...(claudeModel ? { model: claudeModel } : {}),\n },\n veda: {\n binary: vedaBinary ?? DEFAULT_FABRIC_CONFIG.agents.veda.binary,\n backend: vedaBackend ?? DEFAULT_FABRIC_CONFIG.agents.veda.backend,\n ...(vedaModel ? { model: vedaModel } : {}),\n persona: vedaPersona ?? DEFAULT_FABRIC_CONFIG.agents.veda.persona,\n },\n thinking: agentThinking,\n maxConcurrent: boundedInteger(\n agents.maxConcurrent,\n DEFAULT_FABRIC_CONFIG.agents.maxConcurrent,\n 1,\n 32,\n ),\n maxPerExecution: boundedInteger(\n agents.maxPerExecution,\n DEFAULT_FABRIC_CONFIG.agents.maxPerExecution,\n 1,\n 1_000,\n ),\n maxDepth: boundedInteger(\n agents.maxDepth,\n DEFAULT_FABRIC_CONFIG.agents.maxDepth,\n 0,\n Number.MAX_SAFE_INTEGER,\n ),\n timeoutMs: boundedInteger(\n agents.timeoutMs,\n DEFAULT_FABRIC_CONFIG.agents.timeoutMs,\n MIN_AGENT_TIMEOUT_MS,\n MAX_AGENT_TIMEOUT_MS,\n ),\n extensions: booleanValue(agents.extensions, DEFAULT_FABRIC_CONFIG.agents.extensions),\n defaultTools: configuredTools,\n retainRuns: booleanValue(agents.retainRuns, DEFAULT_FABRIC_CONFIG.agents.retainRuns),\n notifyOnComplete: booleanValue(\n agents.notifyOnComplete,\n DEFAULT_FABRIC_CONFIG.agents.notifyOnComplete,\n ),\n budgetUsd: boundedFloat(\n agents.budgetUsd,\n DEFAULT_FABRIC_CONFIG.agents.budgetUsd,\n 0,\n 1_000_000,\n ),\n maxTokensPerChild: boundedInteger(\n agents.maxTokensPerChild,\n DEFAULT_FABRIC_CONFIG.agents.maxTokensPerChild,\n 0,\n 100_000_000,\n ),\n sessionExport: booleanValue(\n agents.sessionExport,\n DEFAULT_FABRIC_CONFIG.agents.sessionExport,\n ),\n sessionExportDir:\n typeof agents.sessionExportDir === \"string\"\n ? agents.sessionExportDir\n : DEFAULT_FABRIC_CONFIG.agents.sessionExportDir,\n },\n jev: normalizeJevConfig(input.jev),\n components: configuredComponents.map((entry) => structuredClone(entry)),\n capture: {\n enabled: booleanValue(capture.enabled, DEFAULT_FABRIC_CONFIG.capture.enabled),\n hideFromModel: booleanValue(\n capture.hideFromModel,\n DEFAULT_FABRIC_CONFIG.capture.hideFromModel,\n ),\n keepVisible: [...new Set(configuredVisible)],\n defaultRisk: riskValue(capture.defaultRisk, DEFAULT_FABRIC_CONFIG.capture.defaultRisk),\n risks,\n },\n ui: {\n enabled: booleanValue(ui.enabled, DEFAULT_FABRIC_CONFIG.ui.enabled),\n widget: widgetModeValue(ui.widget, DEFAULT_FABRIC_CONFIG.ui.widget),\n maxRows: boundedInteger(ui.maxRows, DEFAULT_FABRIC_CONFIG.ui.maxRows, 1, 20),\n refreshMs: boundedInteger(ui.refreshMs, DEFAULT_FABRIC_CONFIG.ui.refreshMs, 100, 10_000),\n eventHistory: boundedInteger(\n ui.eventHistory,\n DEFAULT_FABRIC_CONFIG.ui.eventHistory,\n 1,\n 500,\n ),\n haltOnEscape: booleanValue(ui.haltOnEscape, DEFAULT_FABRIC_CONFIG.ui.haltOnEscape),\n // Renamed from ui.showNestedToolCalls; the v2 migration rewrites persisted\n // files, and this fallback covers configs normalized without migration.\n showAgentToolPreview: booleanValue(\n ui.showAgentToolPreview ?? ui.showNestedToolCalls,\n DEFAULT_FABRIC_CONFIG.ui.showAgentToolPreview,\n ),\n toolDisplay: toolDisplayModeValue(\n ui.toolDisplay,\n DEFAULT_FABRIC_CONFIG.ui.toolDisplay,\n ),\n // Renamed from ui.nestedToolDebounceMs (v3): the window coalesces every\n // live fabric_exec card update \u2014 nested calls, progress, agent previews.\n updateDebounceMs: boundedInteger(\n ui.updateDebounceMs ?? ui.nestedToolDebounceMs,\n DEFAULT_FABRIC_CONFIG.ui.updateDebounceMs,\n 0,\n 2_000,\n ),\n },\n compaction: {\n engine: compactionEngineValue(compaction.engine, DEFAULT_FABRIC_CONFIG.compaction.engine),\n targetContextRatio: boundedFloat(\n compaction.targetContextRatio,\n DEFAULT_FABRIC_CONFIG.compaction.targetContextRatio,\n 0.25,\n 0.85,\n ),\n thresholds: compactionThresholds,\n tokenThresholds: compactionTokenThresholds,\n },\n retention: {\n orphanedTempRunMs: boundedInteger(\n retention.orphanedTempRunMs,\n DEFAULT_FABRIC_CONFIG.retention.orphanedTempRunMs,\n 60 * 60 * 1_000,\n 365 * 24 * 60 * 60 * 1_000,\n ),\n oneShotRunMs: boundedInteger(\n retention.oneShotRunMs,\n DEFAULT_FABRIC_CONFIG.retention.oneShotRunMs,\n 60 * 60 * 1_000,\n 365 * 24 * 60 * 60 * 1_000,\n ),\n actorRunArchiveMs: boundedInteger(\n retention.actorRunArchiveMs,\n DEFAULT_FABRIC_CONFIG.retention.actorRunArchiveMs,\n 60 * 60 * 1_000,\n 365 * 24 * 60 * 60 * 1_000,\n ),\n },\n mesh: {\n enabled: booleanValue(mesh.enabled, DEFAULT_FABRIC_CONFIG.mesh.enabled),\n ...(meshRoot ? { root: meshRoot } : {}),\n actorScope: actorScopeValue(mesh.actorScope, DEFAULT_FABRIC_CONFIG.mesh.actorScope),\n maxEventBytes: boundedInteger(\n mesh.maxEventBytes,\n DEFAULT_FABRIC_CONFIG.mesh.maxEventBytes,\n 1_024,\n 4 * 1024 * 1024,\n ),\n maxReadEvents: boundedInteger(\n mesh.maxReadEvents,\n DEFAULT_FABRIC_CONFIG.mesh.maxReadEvents,\n 1,\n 10_000,\n ),\n actorPollMs: boundedInteger(\n mesh.actorPollMs,\n DEFAULT_FABRIC_CONFIG.mesh.actorPollMs,\n 50,\n 10_000,\n ),\n actorQueueLimit: boundedInteger(\n mesh.actorQueueLimit,\n DEFAULT_FABRIC_CONFIG.mesh.actorQueueLimit,\n 1,\n 1_000,\n ),\n eventContextChars: boundedInteger(\n mesh.eventContextChars,\n DEFAULT_FABRIC_CONFIG.mesh.eventContextChars,\n 1_000,\n 1_000_000,\n ),\n actorContextEntries: boundedInteger(\n mesh.actorContextEntries,\n DEFAULT_FABRIC_CONFIG.mesh.actorContextEntries,\n 1,\n 100,\n ),\n },\n models: {\n aliases: normalizeModelAliases(modelsSection.aliases),\n },\n memory: {\n enabled: booleanValue(memory.enabled, DEFAULT_FABRIC_CONFIG.memory.enabled),\n ...(memoryIndexDir ? { indexDir: memoryIndexDir } : {}),\n maxSessions: boundedInteger(\n memory.maxSessions,\n DEFAULT_FABRIC_CONFIG.memory.maxSessions,\n 1,\n 100_000,\n ),\n maxEntryChars: boundedInteger(\n memory.maxEntryChars,\n DEFAULT_FABRIC_CONFIG.memory.maxEntryChars,\n 100,\n 1_000_000,\n ),\n indexThinking: booleanValue(\n memory.indexThinking,\n DEFAULT_FABRIC_CONFIG.memory.indexThinking ?? false,\n ),\n indexToolOutput: booleanValue(\n memory.indexToolOutput,\n DEFAULT_FABRIC_CONFIG.memory.indexToolOutput ?? true,\n ),\n hotSessions: boundedInteger(\n memory.hotSessions,\n DEFAULT_FABRIC_CONFIG.memory.hotSessions ?? 50,\n 0,\n 100_000,\n ),\n digestTerms: boundedInteger(\n memory.digestTerms,\n DEFAULT_FABRIC_CONFIG.memory.digestTerms ?? 200,\n 1,\n 10_000,\n ),\n maxColdVocabularyBytes: boundedInteger(\n memory.maxColdVocabularyBytes,\n DEFAULT_FABRIC_CONFIG.memory.maxColdVocabularyBytes ?? 512 * 1024,\n 2,\n 64 * 1024 * 1024,\n ),\n maxColdCacheBytes: boundedInteger(\n memory.maxColdCacheBytes,\n DEFAULT_FABRIC_CONFIG.memory.maxColdCacheBytes ?? 1024 * 1024,\n 512,\n 128 * 1024 * 1024,\n ),\n maxSyncSessions: boundedInteger(\n memory.maxSyncSessions,\n DEFAULT_FABRIC_CONFIG.memory.maxSyncSessions ?? 10_000,\n 1,\n 1_000_000,\n ),\n maxSyncSourceBytes: boundedInteger(\n memory.maxSyncSourceBytes,\n DEFAULT_FABRIC_CONFIG.memory.maxSyncSourceBytes ?? 512 * 1024 * 1024,\n 1_024,\n 8 * 1024 * 1024 * 1024,\n ),\n maxCacheCleanupFiles: boundedInteger(\n memory.maxCacheCleanupFiles,\n DEFAULT_FABRIC_CONFIG.memory.maxCacheCleanupFiles ?? 100_000,\n 1,\n 1_000_000,\n ),\n regexMaxPatternBytes: boundedInteger(\n memory.regexMaxPatternBytes,\n DEFAULT_FABRIC_CONFIG.memory.regexMaxPatternBytes ?? 1_024,\n 1,\n 64 * 1024,\n ),\n regexMaxHaystackTerms: boundedInteger(\n memory.regexMaxHaystackTerms,\n DEFAULT_FABRIC_CONFIG.memory.regexMaxHaystackTerms ?? 20_000,\n 1,\n 1_000_000,\n ),\n regexMaxHaystackBytes: boundedInteger(\n memory.regexMaxHaystackBytes,\n DEFAULT_FABRIC_CONFIG.memory.regexMaxHaystackBytes ?? 2 * 1024 * 1024,\n 1_024,\n 128 * 1024 * 1024,\n ),\n regexTimeoutMs: boundedInteger(\n memory.regexTimeoutMs,\n DEFAULT_FABRIC_CONFIG.memory.regexTimeoutMs ?? 250,\n 10,\n 10_000,\n ),\n },\n entropy: {\n compile: booleanValue(entropy.compile, DEFAULT_FABRIC_CONFIG.entropy.compile),\n },\n repairs: {\n enabled: booleanValue(repairs.enabled, DEFAULT_FABRIC_CONFIG.repairs.enabled),\n },\n schema: {\n mode: schemaMode,\n certificateTtlMs: boundedInteger(\n schema.certificateTtlMs,\n DEFAULT_FABRIC_CONFIG.schema.certificateTtlMs,\n 1_000,\n 10 * 60_000,\n ),\n maxFiles: boundedInteger(\n schema.maxFiles,\n DEFAULT_FABRIC_CONFIG.schema.maxFiles,\n 1,\n 1_000,\n ),\n maxBytes: boundedInteger(\n schema.maxBytes,\n DEFAULT_FABRIC_CONFIG.schema.maxBytes,\n 1_024,\n 100 * 1024 * 1024,\n ),\n trustedCommands,\n },\n speculation: {\n enabled: booleanValue(\n speculation.enabled,\n DEFAULT_FABRIC_CONFIG.speculation.enabled,\n ),\n maxConcurrent: boundedInteger(\n speculation.maxConcurrent,\n DEFAULT_FABRIC_CONFIG.speculation.maxConcurrent,\n 1,\n 32,\n ),\n maxEntries: boundedInteger(\n speculation.maxEntries,\n DEFAULT_FABRIC_CONFIG.speculation.maxEntries,\n 1,\n 1_024,\n ),\n maxBufferBytes: boundedInteger(\n speculation.maxBufferBytes,\n DEFAULT_FABRIC_CONFIG.speculation.maxBufferBytes,\n 64 * 1024,\n 64 * 1024 * 1024,\n ),\n entryTtlMs: boundedInteger(\n speculation.entryTtlMs,\n DEFAULT_FABRIC_CONFIG.speculation.entryTtlMs,\n 5_000,\n 30 * 60_000,\n ),\n mcpAllowlist: [\n ...new Set(\n (Array.isArray(speculation.mcpAllowlist) ? speculation.mcpAllowlist : [])\n .filter(\n (entry): entry is string =>\n typeof entry === \"string\" && entry.trim().length > 0,\n )\n .map((entry) => entry.trim().slice(0, 256)),\n ),\n ].slice(0, 256),\n },\n codePreview: normalizeCodePreviewSettings(input.codePreview),\n };\n};\n\nexport const effectiveToolCaptureConfig = (\n config: Pick<FabricConfig, \"fullCodeMode\" | \"capture\"> & Partial<Pick<FabricConfig, \"schema\">>,\n): FabricToolCaptureConfig =>\n config.schema?.mode === \"enforce\"\n ? {\n ...config.capture,\n enabled: true,\n hideFromModel: true,\n keepVisible: [\"fabric_exec\"],\n risks: { ...config.capture.risks },\n }\n : config.fullCodeMode\n ? {\n ...config.capture,\n keepVisible: config.capture.keepVisible.filter(\n (name) => !PI_CORE_TOOL_NAME_SET.has(name),\n ),\n risks: { ...config.capture.risks },\n }\n : {\n ...config.capture,\n enabled: false,\n hideFromModel: false,\n keepVisible: [...config.capture.keepVisible],\n risks: { ...config.capture.risks },\n };\n\ninterface FabricConfigFilePlan {\n path: string;\n document: Record<string, unknown>;\n source: string;\n changed: boolean;\n}\n\nconst planConfigFile = (filePath: string): FabricConfigFilePlan | undefined => {\n const input = readJsonObjectFile(filePath);\n if (!input) return undefined;\n const migration = migrateFabricConfigDocument(input.document);\n return {\n path: filePath,\n document: migration.document,\n source: input.source,\n changed: migration.changed,\n };\n};\n\nexport const writeJsonAtomic = (\n filePath: string,\n document: Record<string, unknown>,\n expectedSource: string | null,\n): void => {\n const resolvedPath = fs.existsSync(filePath) ? fs.realpathSync(filePath) : filePath;\n const directory = path.dirname(resolvedPath);\n if (!fs.existsSync(directory)) fs.mkdirSync(directory, { recursive: true });\n const mode = fs.existsSync(resolvedPath) ? fs.statSync(resolvedPath).mode & 0o777 : 0o600;\n const temporaryPath = path.join(\n directory,\n `.${path.basename(resolvedPath)}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`,\n );\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(temporaryPath, \"wx\", mode);\n fs.writeFileSync(descriptor, `${JSON.stringify(document, null, 2)}\\n`, \"utf8\");\n fs.fsyncSync(descriptor);\n fs.closeSync(descriptor);\n descriptor = undefined;\n if (expectedSource === null) {\n if (fs.existsSync(resolvedPath)) {\n throw new Error(`Fabric configuration changed while updating ${filePath}`);\n }\n } else {\n let currentSource: string;\n try {\n currentSource = fs.readFileSync(resolvedPath, \"utf8\");\n } catch (error) {\n throw new Error(`Fabric configuration changed while updating ${filePath}`, { cause: error });\n }\n if (currentSource !== expectedSource) {\n throw new Error(`Fabric configuration changed while updating ${filePath}`);\n }\n }\n renameAtomic(temporaryPath, resolvedPath);\n try {\n const directoryDescriptor = fs.openSync(directory, \"r\");\n try {\n fs.fsyncSync(directoryDescriptor);\n } finally {\n fs.closeSync(directoryDescriptor);\n }\n } catch (error) {\n const code = error instanceof Error && \"code\" in error ? error.code : undefined;\n if (code !== \"EINVAL\" && code !== \"ENOTSUP\" && code !== \"EISDIR\" && code !== \"EPERM\") throw error;\n }\n } catch (error) {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n};\n\nconst resolveFabricConfig = (\n options: {\n cwd: string;\n agentDir: string;\n },\n includeProject: boolean,\n applyEnvironmentOverrides: boolean,\n): FabricConfig => {\n let merged = structuredClone(DEFAULT_FABRIC_CONFIG) as unknown as Record<string, unknown>;\n const plans = [\n planConfigFile(path.join(options.agentDir, \"fabric.json\")),\n ...(includeProject\n ? [planConfigFile(path.join(options.cwd, \".pi\", \"fabric.json\"))]\n : []),\n ].filter((plan): plan is FabricConfigFilePlan => plan !== undefined);\n for (const plan of plans) {\n if (plan.changed) writeJsonAtomic(plan.path, plan.document, plan.source);\n merged = mergeObjects(merged, plan.document);\n }\n const inheritedKernel = process.env.PI_FABRIC_KERNEL;\n if (applyEnvironmentOverrides && inheritedKernel !== undefined) {\n // This can select trusted native execution: never repair an unsafe selector.\n if (inheritedKernel !== \"typescript\" && inheritedKernel !== \"python\") {\n throw new Error(`Invalid PI_FABRIC_KERNEL: ${inheritedKernel}; expected typescript or python`);\n }\n merged.executor = { ...objectValue(merged.executor), kernel: inheritedKernel };\n }\n const inheritedPythonRuntime = process.env.PI_FABRIC_PYTHON_RUNTIME;\n if (applyEnvironmentOverrides && inheritedPythonRuntime !== undefined) {\n if (inheritedPythonRuntime !== \"cpython\" && inheritedPythonRuntime !== \"monty\") {\n throw new Error(`Invalid PI_FABRIC_PYTHON_RUNTIME: ${inheritedPythonRuntime}; expected cpython or monty`);\n }\n merged.executor = { ...objectValue(merged.executor), pythonRuntime: inheritedPythonRuntime };\n }\n const inheritedFullCodeMode = process.env.PI_FABRIC_FULL_CODE_MODE;\n if (\n applyEnvironmentOverrides &&\n (inheritedFullCodeMode === \"true\" || inheritedFullCodeMode === \"false\")\n ) {\n merged.fullCodeMode = inheritedFullCodeMode === \"true\";\n }\n return normalizeFabricConfig(merged);\n};\n\nexport const loadFabricConfigForScope = (\n options: {\n cwd: string;\n agentDir: string;\n projectTrusted: boolean;\n },\n scope: FabricConfigScope,\n): FabricConfig => {\n if (scope === \"project\" && !options.projectTrusted) {\n throw new Error(\"Cannot load project Fabric configuration for an untrusted project\");\n }\n return resolveFabricConfig(options, scope === \"project\", false);\n};\n\nexport const loadFabricConfig = (options: {\n cwd: string;\n agentDir: string;\n projectTrusted: boolean;\n}): FabricConfig => {\n const config = resolveFabricConfig(options, options.projectTrusted, true);\n if (config.compaction.engine === \"fabric\") {\n process.env.PI_FABRIC_COMPACTION_ENGINE = \"fabric\";\n } else {\n delete process.env.PI_FABRIC_COMPACTION_ENGINE;\n }\n return config;\n};\n\nexport const saveFabricConfig = (\n options: {\n cwd: string;\n agentDir: string;\n projectTrusted: boolean;\n scope?: FabricConfigScope;\n },\n partial: Record<string, unknown>,\n): { scope: FabricConfigScope; path: string } => {\n const scope = options.scope ?? (options.projectTrusted ? \"project\" : \"global\");\n if (scope === \"project\" && !options.projectTrusted) {\n throw new Error(\"Cannot save project Fabric configuration for an untrusted project\");\n }\n const targetPath = scope === \"project\"\n ? path.join(options.cwd, \".pi\", \"fabric.json\")\n : path.join(options.agentDir, \"fabric.json\");\n if (Object.hasOwn(partial, \"configVersion\") || Object.hasOwn(partial, \"subagents\")) {\n throw new Error(\"Fabric configuration updates must use the current schema\");\n }\n const input = readJsonObjectFile(targetPath);\n const existing = migrateFabricConfigDocument(input?.document ?? {}).document;\n const merged = mergeObjects(existing, partial) as Record<string, unknown>;\n // Never stamp down: preserve version markers written by newer builds.\n merged.configVersion = Math.max(\n typeof merged.configVersion === \"number\" ? merged.configVersion : 0,\n CURRENT_FABRIC_CONFIG_VERSION,\n );\n writeJsonAtomic(targetPath, merged, input?.source ?? null);\n return { scope, path: targetPath };\n};\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Move an unreadable JSON document aside so the original path can be\n * recreated, without deleting evidence the operator may still want.\n */\nexport const quarantineDamagedFile = (filePath: string): string | undefined => {\n const destination = path.join(\n path.dirname(filePath),\n `${path.basename(filePath)}.damaged.${process.pid}.${Date.now()}`,\n );\n try {\n fs.renameSync(filePath, destination);\n return destination;\n } catch {\n return undefined;\n }\n};\n", "export const CURRENT_FABRIC_CONFIG_VERSION = 4;\n\nexport interface FabricConfigMigrationResult {\n document: Record<string, unknown>;\n fromVersion: number;\n toVersion: number;\n appliedVersions: number[];\n changed: boolean;\n // True when the document was written by a newer pi-fabric build. The document\n // is accepted as-is (newer builds only add semantics older builds can safely\n // ignore) and is never rewritten or version-stamped down.\n forwardCompatible: boolean;\n}\n\ninterface FabricConfigMigration {\n from: number;\n to: number;\n migrate(document: Readonly<Record<string, unknown>>): Record<string, unknown>;\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst mergeObjects = (\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> => {\n const merged = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = merged[key];\n merged[key] = isObject(current) && isObject(value) ? mergeObjects(current, value) : value;\n }\n return merged;\n};\n\nconst migrations: readonly FabricConfigMigration[] = [\n {\n from: 0,\n to: 1,\n migrate(document) {\n const migrated = { ...document };\n const legacy = migrated.subagents;\n const canonical = migrated.agents;\n if (legacy !== undefined) {\n if (canonical !== undefined && isObject(legacy) !== isObject(canonical)) {\n throw new Error(\n \"Fabric configuration cannot merge legacy subagents with a malformed agents section\",\n );\n }\n migrated.agents = isObject(legacy) && isObject(canonical)\n ? mergeObjects(legacy, canonical)\n : canonical ?? legacy;\n }\n delete migrated.subagents;\n return migrated;\n },\n },\n {\n from: 1,\n to: 2,\n migrate(document) {\n const migrated = { ...document };\n const ui = migrated.ui;\n if (isObject(ui) && Object.hasOwn(ui, \"showNestedToolCalls\")) {\n const renamed = { ...ui };\n if (!Object.hasOwn(renamed, \"showAgentToolPreview\")) {\n renamed.showAgentToolPreview = renamed.showNestedToolCalls;\n }\n delete renamed.showNestedToolCalls;\n migrated.ui = renamed;\n }\n return migrated;\n },\n },\n {\n from: 2,\n to: 3,\n migrate(document) {\n const migrated = { ...document };\n const ui = migrated.ui;\n if (isObject(ui) && Object.hasOwn(ui, \"nestedToolDebounceMs\")) {\n const renamed = { ...ui };\n if (!Object.hasOwn(renamed, \"updateDebounceMs\")) {\n renamed.updateDebounceMs = renamed.nestedToolDebounceMs;\n }\n delete renamed.nestedToolDebounceMs;\n migrated.ui = renamed;\n }\n return migrated;\n },\n },\n {\n from: 3,\n to: 4,\n migrate(document) {\n const migrated = { ...document };\n const prewalk = migrated.prewalk;\n if (\n isObject(prewalk) &&\n (prewalk.enabled === \"true\" || prewalk.enabled === \"false\")\n ) {\n migrated.prewalk = {\n ...prewalk,\n enabled: prewalk.enabled === \"true\",\n };\n }\n return migrated;\n },\n },\n];\n\nconst configVersion = (document: Readonly<Record<string, unknown>>): number => {\n const value = document.configVersion;\n if (value === undefined) return 0;\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n throw new Error(\"Fabric configuration configVersion must be a non-negative integer\");\n }\n return value;\n};\n\nexport const migrateFabricConfigDocument = (\n input: Readonly<Record<string, unknown>>,\n): FabricConfigMigrationResult => {\n const fromVersion = configVersion(input);\n if (fromVersion > CURRENT_FABRIC_CONFIG_VERSION) {\n // Written by a newer build: accept as-is instead of bricking the\n // extension. Legacy-shape checks (e.g. the removed subagents key) apply to\n // supported versions only \u2014 newer semantics are unknown here.\n return {\n document: structuredClone(input) as Record<string, unknown>,\n fromVersion,\n toVersion: fromVersion,\n appliedVersions: [],\n changed: false,\n forwardCompatible: true,\n };\n }\n let version = fromVersion;\n let document = structuredClone(input) as Record<string, unknown>;\n const appliedVersions: number[] = [];\n\n while (version < CURRENT_FABRIC_CONFIG_VERSION) {\n const migration = migrations.find((candidate) => candidate.from === version);\n if (!migration || migration.to !== version + 1) {\n throw new Error(`No Fabric configuration migration exists for version ${version}`);\n }\n document = migration.migrate(document);\n version = migration.to;\n document.configVersion = version;\n appliedVersions.push(version);\n }\n\n if (Object.hasOwn(document, \"subagents\")) {\n throw new Error(\"Current Fabric configuration contains removed key subagents\");\n }\n\n return {\n document,\n fromVersion,\n toVersion: version,\n appliedVersions,\n changed: appliedVersions.length > 0,\n forwardCompatible: false,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fs", "path", "fs", "path", "fs", "mergeObjects", "fs", "path"]
|
|
7
|
+
}
|
|
@@ -9,12 +9,12 @@ import {
|
|
|
9
9
|
agentParticipantRecords,
|
|
10
10
|
loadModelUsage,
|
|
11
11
|
useBudgetLedger
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NTKI5NUE.js";
|
|
13
13
|
import {
|
|
14
14
|
RESIDENT_HOST_FORMAT,
|
|
15
15
|
residentDeliveryPrefix,
|
|
16
16
|
residentHostId
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-TX6E5W7H.js";
|
|
18
18
|
import {
|
|
19
19
|
writeJsonAtomic
|
|
20
20
|
} from "./chunk-KAD7UWT2.js";
|
|
@@ -174,7 +174,8 @@ var ResidentHost = class {
|
|
|
174
174
|
`Fabric agent ${result.id.slice(0, 8)} ${result.status} after ${Math.round(durationMs / 1e3)}s: ${summary}`,
|
|
175
175
|
"followUp",
|
|
176
176
|
true,
|
|
177
|
-
result
|
|
177
|
+
result,
|
|
178
|
+
result.id
|
|
178
179
|
).catch(() => void 0);
|
|
179
180
|
}
|
|
180
181
|
});
|
|
@@ -422,7 +423,7 @@ var ResidentHost = class {
|
|
|
422
423
|
target.ownerIdentityId
|
|
423
424
|
);
|
|
424
425
|
}
|
|
425
|
-
async #queueDelivery(from, message, delivery, triggerTurn, data) {
|
|
426
|
+
async #queueDelivery(from, message, delivery, triggerTurn, data, agentCompletionId) {
|
|
426
427
|
const id = randomUUID();
|
|
427
428
|
const record = {
|
|
428
429
|
format: RESIDENT_HOST_FORMAT,
|
|
@@ -433,6 +434,7 @@ var ResidentHost = class {
|
|
|
433
434
|
triggerTurn,
|
|
434
435
|
message,
|
|
435
436
|
...data === void 0 ? {} : { data },
|
|
437
|
+
...agentCompletionId ? { agentCompletionId } : {},
|
|
436
438
|
createdAt: Date.now()
|
|
437
439
|
};
|
|
438
440
|
try {
|
|
@@ -507,7 +509,6 @@ var ResidentHost = class {
|
|
|
507
509
|
throw new Error("Durable agents.spawn accepts only its public task and run settings");
|
|
508
510
|
}
|
|
509
511
|
const handle = await this.agents.spawn({ ...command.request, residency: "durable" });
|
|
510
|
-
this.agents.detachSignal(handle.id);
|
|
511
512
|
const runDirectory = this.agents.runDirectory(handle.id);
|
|
512
513
|
if (!runDirectory) throw new Error(`Resident agent ${handle.id} has no run directory`);
|
|
513
514
|
const worktreeGitRoot = this.agents.worktreeGitRoot(handle.id);
|
|
@@ -522,6 +523,7 @@ var ResidentHost = class {
|
|
|
522
523
|
updatedAt: Date.now()
|
|
523
524
|
};
|
|
524
525
|
atomicWrite(path.join(this.#agentsPath, `${handle.id}.json`), metadata);
|
|
526
|
+
this.agents.detachSignal(handle.id);
|
|
525
527
|
response = {
|
|
526
528
|
format: RESIDENT_HOST_FORMAT,
|
|
527
529
|
requestId,
|
|
@@ -689,4 +691,4 @@ if (isMain) {
|
|
|
689
691
|
export {
|
|
690
692
|
runResidentHostFromConfigPath
|
|
691
693
|
};
|
|
692
|
-
//# sourceMappingURL=chunk-
|
|
694
|
+
//# sourceMappingURL=chunk-3ALJY5MG.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/residency/host.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { writeJsonAtomic } from \"../core/atomic-write.js\";\nimport {\n normalizeModelAliases,\n resolveAvailablePiModel,\n type FabricModelCandidate,\n} from \"../core/model-resolution.js\";\nimport { loadModelUsage } from \"../core/model-usage.js\";\nimport {\n parseFabricOwnedModelGuidance,\n resolveFabricModelGuidance,\n} from \"../components/model-guidance.js\";\nimport { ActorDirectory } from \"../actors/directory.js\";\nimport type { FabricActorInfo } from \"../actors/types.js\";\nimport { AgentManager } from \"../agents/manager.js\";\nimport { useBudgetLedger } from \"../agents/budget-ledger.js\";\nimport { LifecycleBroker } from \"../lifecycle/broker.js\";\nimport { lifecycleSourceIdentity, type FabricLifecycleEvent, type FabricLifecycleSubscription } from \"../lifecycle/types.js\";\nimport { MeshStore, type MeshIdentity } from \"../mesh/store.js\";\nimport { FabricControlPlane, type FabricControlAcceptance, type FabricControlCommand } from \"../topology/control-plane.js\";\nimport { ParticipantDirectory } from \"../topology/participant-directory.js\";\nimport { actorParticipantRecord, agentParticipantRecords } from \"../topology/records.js\";\nimport {\n RESIDENT_HOST_FORMAT,\n residentDeliveryPrefix,\n residentHostId,\n type ResidentAgentMetadata,\n type ResidentCommand,\n type ResidentCommandResponse,\n type ResidentDeliveryRecord,\n type ResidentHostConfig,\n type ResidentHostOwner,\n} from \"./protocol.js\";\n\nconst REQUEST_POLL_MS = 50;\nconst IDLE_EXIT_MS = 30_000;\nconst COMPLETION_MAX_CHARS = 8_000;\n\nconst delay = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nconst atomicWrite = (filePath: string, value: unknown): void => {\n writeJsonAtomic(filePath, value, { space: 2 });\n};\n\nconst readJson = <T>(filePath: string): T | undefined => {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf8\")) as T;\n } catch {\n return undefined;\n }\n};\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst processAlive = (pid: number): boolean => {\n if (!Number.isSafeInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n // On Windows, EPERM means the process exists but cannot be opened for\n // signaling; only ESRCH (or other errors) mean it is gone.\n return error instanceof Error && \"code\" in error && (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n};\n\nclass ResidentHostAlreadyRunning extends Error {}\n\nconst parseResidentHostConfigPath = (argv: readonly string[]): string => {\n const index = argv.indexOf(\"--config\");\n const value = index >= 0 ? argv[index + 1] : undefined;\n if (!value) throw new Error(\"Missing resident host argument: --config\");\n return path.resolve(value);\n};\n\nconst validateResidentHostConfig = (value: unknown, configPath: string): ResidentHostConfig => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"Invalid Fabric resident host config\");\n }\n const config = value as Partial<ResidentHostConfig>;\n if (\n config.format !== RESIDENT_HOST_FORMAT ||\n typeof config.rootId !== \"string\" ||\n typeof config.sessionId !== \"string\" ||\n typeof config.cwd !== \"string\" ||\n typeof config.projectRoot !== \"string\" ||\n typeof config.meshRoot !== \"string\" ||\n typeof config.actorRoot !== \"string\" ||\n (config.sessionActorRoot !== undefined && typeof config.sessionActorRoot !== \"string\") ||\n typeof config.residencyRoot !== \"string\" ||\n typeof config.fullCodeMode !== \"boolean\" ||\n (config.kernel !== undefined && config.kernel !== \"typescript\" && config.kernel !== \"python\") ||\n (config.pythonRuntime !== undefined && config.pythonRuntime !== \"cpython\" && config.pythonRuntime !== \"monty\") ||\n typeof config.agents !== \"object\" ||\n config.agents === null ||\n typeof config.mesh !== \"object\" ||\n config.mesh === null ||\n typeof config.retention !== \"object\" ||\n config.retention === null ||\n typeof config.workerPath !== \"string\" ||\n typeof config.fabricExtensionPath !== \"string\" ||\n typeof config.piBinary !== \"string\" ||\n typeof config.claudeBinary !== \"string\" ||\n typeof config.vedaBinary !== \"string\"\n ) {\n throw new Error(\"Fabric resident host config is incomplete\");\n }\n if (path.resolve(config.residencyRoot) !== path.dirname(configPath)) {\n throw new Error(\"Fabric resident host config is outside its residency root\");\n }\n if (!config.mesh.enabled) throw new Error(\"Durable residency requires the Fabric mesh\");\n return config as ResidentHostConfig;\n};\n\nclass ResidentHost {\n readonly hostId: string;\n readonly identity: MeshIdentity;\n readonly mesh: MeshStore;\n readonly participants: ParticipantDirectory;\n readonly control: FabricControlPlane;\n readonly agents: AgentManager;\n readonly actors: ActorDirectory;\n readonly lifecycle: LifecycleBroker;\n readonly #ownerPath: string;\n readonly #lockPath: string;\n readonly #errorPath: string;\n readonly #requestsPath: string;\n readonly #processingPath: string;\n readonly #responsesPath: string;\n readonly #agentsPath: string;\n readonly #deliveryPrefix: string;\n readonly #token = randomUUID();\n #requestTimer: NodeJS.Timeout | undefined;\n #pollingRequests = false;\n #closed = false;\n #started = false;\n #idleSince = Date.now();\n\n constructor(\n readonly config: ResidentHostConfig,\n readonly onIdle: () => void = () => {},\n ) {\n this.hostId = residentHostId(config.rootId);\n this.identity = { id: this.hostId, name: \"Fabric resident host\", kind: \"agent\" };\n this.#ownerPath = path.join(config.residencyRoot, \"owner.json\");\n this.#lockPath = path.join(config.residencyRoot, \"host.lock\");\n this.#errorPath = path.join(config.residencyRoot, \"error.json\");\n this.#requestsPath = path.join(config.residencyRoot, \"requests\");\n this.#processingPath = path.join(config.residencyRoot, \"processing\");\n this.#responsesPath = path.join(config.residencyRoot, \"responses\");\n this.#agentsPath = path.join(config.residencyRoot, \"agents\");\n this.#deliveryPrefix = residentDeliveryPrefix(config.rootId);\n this.mesh = new MeshStore(config.meshRoot, config.mesh.maxEventBytes, config.mesh.maxReadEvents);\n this.participants = new ParticipantDirectory(this.mesh, {\n enabled: true,\n hostId: this.hostId,\n rootId: config.rootId,\n identity: this.identity,\n });\n this.control = new FabricControlPlane(this.mesh, this.identity, {\n enabled: true,\n hostId: this.hostId,\n pollMs: config.mesh.actorPollMs,\n });\n if (config.agents.budgetUsd > 0) {\n const budgetFile = path.join(config.residencyRoot, \"budget.jsonl\");\n fs.mkdirSync(path.dirname(budgetFile), { recursive: true, mode: 0o700 });\n if (!fs.existsSync(budgetFile)) fs.writeFileSync(budgetFile, \"\", { mode: 0o600 });\n useBudgetLedger({\n budget: config.agents.budgetUsd,\n file: budgetFile,\n id: this.hostId,\n });\n }\n const guidanceConfigPath = path.join(config.residencyRoot, \"config.json\");\n const currentConfig = (): Partial<ResidentHostConfig> =>\n readJson<Partial<ResidentHostConfig>>(guidanceConfigPath) ?? config;\n const currentModelGuidance = () =>\n parseFabricOwnedModelGuidance(currentConfig().modelGuidance ?? config.modelGuidance);\n const resolveResidentPiModel = (selector?: string): string => {\n const state = currentConfig().piModels ?? config.piModels;\n const available: FabricModelCandidate[] = Array.isArray(state?.available)\n ? state.available.flatMap((candidate) =>\n typeof candidate?.provider === \"string\" && typeof candidate.id === \"string\"\n ? [{\n provider: candidate.provider,\n id: candidate.id,\n ...(typeof candidate.name === \"string\" ? { name: candidate.name } : {}),\n }]\n : [],\n )\n : [];\n const query = selector?.trim() || state?.defaultModel?.trim() || \"\";\n const resolved = resolveAvailablePiModel(query, {\n aliases: normalizeModelAliases(state?.aliases),\n available,\n lastUsed: loadModelUsage(),\n });\n return `${resolved.provider}/${resolved.id}`;\n };\n this.agents = new AgentManager(config.cwd, config.agents, {\n workerPath: config.workerPath,\n fabricExtensionPath: config.fabricExtensionPath,\n piBinary: config.piBinary,\n claudeBinary: config.claudeBinary,\n vedaBinary: config.vedaBinary,\n runRoot: path.join(config.residencyRoot, \"runs\"),\n fullCodeMode: config.fullCodeMode,\n kernel: () => currentConfig().kernel ?? config.kernel ?? \"typescript\",\n pythonRuntime: () => currentConfig().pythonRuntime ?? config.pythonRuntime ?? \"monty\",\n mainAgentId: config.rootId,\n fabricSessionId: config.sessionId,\n meshRoot: config.meshRoot,\n projectRoot: config.projectRoot,\n hostId: this.hostId,\n identityId: this.identity.id,\n retention: config.retention,\n preparePiModel: async (model) => resolveResidentPiModel(model),\n resolveParticipantGuidance: ({ model }) => {\n if (!model) return undefined;\n return resolveFabricModelGuidance(currentModelGuidance(), {\n model,\n target: \"participant\",\n includeSlots: false,\n }).appendText || undefined;\n },\n onLifecycle: (event) => void this.lifecycle?.publish(event).catch(() => undefined),\n onBackgroundComplete: (result) => {\n if (!config.agents.notifyOnComplete) return;\n const durationMs = Math.max(0, (result.finishedAt ?? Date.now()) - result.startedAt);\n const summary = (result.text || result.error || \"no result\").slice(0, COMPLETION_MAX_CHARS);\n void this.#queueDelivery(\n { id: result.id, name: result.name, kind: \"agent\" },\n `Fabric agent ${result.id.slice(0, 8)} ${result.status} after ${Math.round(durationMs / 1_000)}s: ${summary}`,\n \"followUp\",\n true,\n result,\n result.id,\n ).catch(() => undefined);\n },\n });\n const canManageActor = (id: string): boolean | undefined => {\n const participant = this.participants.get(id);\n return participant ? participant.ownerHostId === this.hostId : undefined;\n };\n const lineageAlive = (rootId: string): boolean =>\n this.participants.get(rootId) !== undefined;\n const actorRoots = config.sessionActorRoot\n ? { project: config.actorRoot, session: config.sessionActorRoot }\n : config.mesh.actorScope === \"session\"\n ? { project: path.dirname(config.actorRoot), session: config.actorRoot }\n : { project: config.actorRoot, session: path.join(config.actorRoot, config.sessionId) };\n this.actors = new ActorDirectory([\n config.sessionId,\n this.identity,\n this.mesh,\n config.mesh,\n this.agents,\n ({ actor, message, delivery, triggerTurn }) => {\n if (!message.text) return;\n const mode = delivery === \"steer\" ? \"steer\" : \"followUp\";\n const triggers = delivery === \"nextTurn\" ? false : triggerTurn;\n void this.#queueDelivery(\n { id: actor.id, name: actor.name, kind: \"actor\" },\n message.text,\n mode,\n triggers,\n message.data,\n ).catch(() => undefined);\n },\n {\n persistent: true,\n canManageActor,\n lineageAlive,\n claimResidency: \"durable\",\n rootId: config.rootId,\n meshCursorPath: path.join(config.residencyRoot, \"actor-mesh-cursor.json\"),\n retention: config.retention,\n resolvePiModel: resolveResidentPiModel,\n },\n ], actorRoots, config.mesh.actorScope);\n this.lifecycle = new LifecycleBroker(\n this.mesh,\n this.identity,\n this.participants,\n {\n enabled: true,\n pollMs: config.mesh.actorPollMs,\n maxReadEvents: config.mesh.maxReadEvents,\n },\n (subscription, event) => this.#deliverLifecycle(subscription, event),\n );\n }\n\n async start(): Promise<void> {\n if (this.#started) return;\n this.#acquireLock();\n this.#started = true;\n fs.mkdirSync(this.#requestsPath, { recursive: true, mode: 0o700 });\n fs.mkdirSync(this.#processingPath, { recursive: true, mode: 0o700 });\n fs.mkdirSync(this.#responsesPath, { recursive: true, mode: 0o700 });\n fs.mkdirSync(this.#agentsPath, { recursive: true, mode: 0o700 });\n this.#recoverInterruptedRequests();\n const firstSeenAgents = new Map<string, number>();\n this.participants.registerSource(() =>\n agentParticipantRecords(\n this.agents.listForUi(),\n this.config.rootId,\n this.hostId,\n this.identity.id,\n this.config.rootId,\n firstSeenAgents,\n ),\n );\n this.participants.registerSource(() =>\n this.actors.listOwned().map((actor) =>\n actorParticipantRecord(\n actor,\n this.config.rootId,\n this.hostId,\n this.identity.id,\n this.config.rootId,\n ),\n ),\n );\n this.agents.subscribeUi(() => this.participants.scheduleRefresh());\n this.actors.subscribe(() => this.participants.scheduleRefresh());\n this.control.start((command, from, signal) =>\n this.#acceptControl(command, from, signal));\n await this.participants.start().catch(() => undefined);\n this.lifecycle.start();\n this.#requestTimer = setInterval(\n () => void this.#pollRequests().catch(() => undefined),\n REQUEST_POLL_MS,\n );\n const now = Date.now();\n const owner: ResidentHostOwner = {\n format: RESIDENT_HOST_FORMAT,\n hostId: this.hostId,\n pid: process.pid,\n token: this.#token,\n startedAt: now,\n readyAt: now,\n };\n atomicWrite(this.#ownerPath, owner);\n fs.rmSync(this.#errorPath, { force: true });\n await this.#pollRequests();\n }\n\n async close(): Promise<void> {\n if (this.#closed) return;\n this.#closed = true;\n if (this.#requestTimer) clearInterval(this.#requestTimer);\n this.#requestTimer = undefined;\n while (this.#pollingRequests) await delay(10);\n await this.participants.quiesce().catch(() => undefined);\n await this.lifecycle.close().catch(() => undefined);\n await this.control.close().catch(() => undefined);\n try {\n await this.actors.close();\n } finally {\n await this.agents.close();\n await this.participants.close().catch(() => undefined);\n this.#releaseLock();\n }\n }\n\n async #acceptControl(\n command: FabricControlCommand,\n _from: MeshIdentity,\n signal?: AbortSignal,\n ): Promise<FabricControlAcceptance> {\n if (command.operation === \"cancel\") {\n return { accepted: false, error: \"Cancel commands are handled by the control plane\" };\n }\n if (command.operation === \"stop\") {\n try {\n await this.agents.stop(command.targetId);\n this.participants.scheduleRefresh();\n return { accepted: true, messageId: command.commandId };\n } catch (error) {\n if (!(error instanceof Error && /Unknown Fabric agent/.test(error.message))) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n try {\n if (!this.actors.owns(command.targetId)) {\n return { accepted: false, error: `Resident host does not own ${command.targetId}` };\n }\n await this.actors.stop(command.targetId);\n this.participants.scheduleRefresh();\n return { accepted: true, messageId: command.commandId };\n } catch (error) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n const message = command.message?.trim();\n if (!message) return { accepted: false, error: \"Fabric control message must not be empty\" };\n if (command.operation === \"ask\") {\n try {\n if (!this.actors.owns(command.targetId)) {\n return { accepted: false, error: `Resident host does not own ${command.targetId}` };\n }\n const result = await this.actors.ask(\n command.targetId,\n message,\n command.data,\n signal,\n command.binding !== undefined ? { binding: command.binding } : {},\n );\n return { accepted: true, messageId: result.id, result };\n } catch (error) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n try {\n this.agents.status(command.targetId);\n const result = command.operation === \"steer\"\n ? this.agents.steer(command.targetId, message, command.data)\n : this.agents.followUp(command.targetId, message, command.data);\n return { accepted: true, messageId: result.messageId };\n } catch (error) {\n if (!(error instanceof Error && /Unknown Fabric agent/.test(error.message))) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n try {\n if (!this.actors.owns(command.targetId)) {\n return { accepted: false, error: `Resident host does not own ${command.targetId}` };\n }\n const result = this.actors.tell(\n command.targetId,\n message,\n command.data,\n command.binding !== undefined ? { binding: command.binding } : {},\n );\n return { accepted: true, messageId: result.messageId };\n } catch (error) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n\n async #deliverLifecycle(\n subscription: FabricLifecycleSubscription,\n event: FabricLifecycleEvent,\n ): Promise<void> {\n const message = `Fabric lifecycle ${event.event} from ${event.source.name} (${event.source.id})${event.status ? ` with status ${event.status}` : \"\"}.`;\n if (subscription.to === this.config.rootId) {\n await this.#queueDelivery(\n lifecycleSourceIdentity(event.source),\n message,\n subscription.delivery,\n subscription.triggerTurn,\n event,\n );\n return;\n }\n try {\n this.agents.status(subscription.to);\n if (subscription.delivery === \"steer\") this.agents.steer(subscription.to, message, event);\n else this.agents.followUp(subscription.to, message, event);\n return;\n } catch (error) {\n if (!(error instanceof Error && /Unknown Fabric agent/.test(error.message))) throw error;\n }\n try {\n if (this.actors.owns(subscription.to)) {\n this.actors.tell(subscription.to, message, event);\n return;\n }\n } catch {\n // Route through the current remote owner below.\n }\n const target = this.participants.get(subscription.to);\n if (!target) throw new Error(`Unknown Fabric lifecycle target: ${subscription.to}`);\n await this.control.request(\n target.ownerHostId,\n target.id,\n subscription.delivery,\n { message, data: event, triggerTurn: subscription.triggerTurn },\n target.ownerIdentityId,\n );\n }\n\n async #queueDelivery(\n from: MeshIdentity,\n message: string,\n delivery: \"steer\" | \"followUp\",\n triggerTurn: boolean,\n data?: unknown,\n agentCompletionId?: string,\n ): Promise<void> {\n const id = randomUUID();\n const record: ResidentDeliveryRecord = {\n format: RESIDENT_HOST_FORMAT,\n id,\n rootId: this.config.rootId,\n from,\n delivery,\n triggerTurn,\n message,\n ...(data === undefined ? {} : { data }),\n ...(agentCompletionId ? { agentCompletionId } : {}),\n createdAt: Date.now(),\n };\n try {\n await this.mesh.put({\n key: `${this.#deliveryPrefix}${id}`,\n value: record,\n identity: this.identity,\n ifVersion: 0,\n });\n } catch {\n await this.mesh.put({\n key: `${this.#deliveryPrefix}${id}`,\n value: {\n ...record,\n message: message.slice(0, Math.max(1, this.config.mesh.eventContextChars)),\n data: { fabricTruncated: true },\n },\n identity: this.identity,\n ifVersion: 0,\n });\n }\n }\n\n async #pollRequests(): Promise<void> {\n if (this.#pollingRequests || this.#closed) return;\n this.#pollingRequests = true;\n try {\n let entries: string[];\n try {\n entries = fs.readdirSync(this.#requestsPath).filter((entry) => entry.endsWith(\".json\"));\n } catch {\n return;\n }\n for (const entry of entries.slice(0, 32)) {\n const source = path.join(this.#requestsPath, entry);\n const processing = path.join(this.#processingPath, entry);\n try {\n fs.renameSync(source, processing);\n } catch {\n continue;\n }\n await this.#processRequest(processing);\n }\n } finally {\n this.#pollingRequests = false;\n this.#checkIdle();\n }\n }\n\n #checkIdle(): void {\n const activeActor = this.actors\n .listOwned()\n .some((actor) => actor.residency === \"durable\" && actor.status !== \"stopped\");\n const activeAgent = this.agents\n .listForUi()\n .some((agent) => agent.status === \"queued\" || agent.status === \"running\");\n let pendingRequest = false;\n try {\n pendingRequest = fs.readdirSync(this.#requestsPath).some((entry) => entry.endsWith(\".json\"));\n } catch {\n // Missing request directory is empty.\n }\n if (activeActor || activeAgent || pendingRequest) {\n this.#idleSince = Date.now();\n return;\n }\n if (Date.now() - this.#idleSince >= IDLE_EXIT_MS) this.onIdle();\n }\n\n async #processRequest(filePath: string): Promise<void> {\n const command = readJson<ResidentCommand>(filePath);\n const requestId = command?.requestId ?? path.basename(filePath, \".json\");\n let response: ResidentCommandResponse;\n try {\n if (\n command?.format !== RESIDENT_HOST_FORMAT ||\n command.rootId !== this.config.rootId ||\n command.requestId !== requestId\n ) {\n throw new Error(\"Invalid Fabric residency request\");\n }\n if (command.operation === \"spawn\") {\n if (\n command.request.sessionSeed ||\n command.request.sessionFile ||\n command.request.actorId ||\n command.request.actorName ||\n command.request.meshRoot ||\n command.request.runnerSessionId ||\n command.request.systemPrompt ||\n command.request.images\n ) {\n throw new Error(\"Durable agents.spawn accepts only its public task and run settings\");\n }\n const handle = await this.agents.spawn({ ...command.request, residency: \"durable\" });\n const runDirectory = this.agents.runDirectory(handle.id);\n if (!runDirectory) throw new Error(`Resident agent ${handle.id} has no run directory`);\n const worktreeGitRoot = this.agents.worktreeGitRoot(handle.id);\n const metadata: ResidentAgentMetadata = {\n format: RESIDENT_HOST_FORMAT,\n rootId: this.config.rootId,\n id: handle.id,\n runDirectory,\n handle: { ...handle, residency: \"durable\" },\n ...(worktreeGitRoot ? { worktreeGitRoot } : {}),\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n atomicWrite(path.join(this.#agentsPath, `${handle.id}.json`), metadata);\n // Publish ownership before a fast, already-settled spawn can notify Main.\n this.agents.detachSignal(handle.id);\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n handle: metadata.handle,\n completedAt: Date.now(),\n };\n } else if (command.operation === \"foreground\") {\n this.agents.markForeground(command.id);\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n completedAt: Date.now(),\n };\n } else if (command.operation === \"cleanup\") {\n await this.agents.wait(command.id);\n await this.agents.cleanup(command.id, command.deleteBranch);\n fs.rmSync(path.join(this.#agentsPath, `${command.id}.json`), { force: true });\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n completedAt: Date.now(),\n };\n } else if (command.operation === \"createActor\") {\n if (command.request.residency !== \"durable\") {\n throw new Error(\"Resident host createActor only supports durable residency\");\n }\n // This handler already runs inside the authoritative durable host.\n // Keep the new actor locally owned; ceding it here created a needless\n // self-transfer window that blocked the next recruitment request.\n const actor = await this.actors.create(command.request, { asRegistryOwner: true });\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n actor: actor as FabricActorInfo,\n completedAt: Date.now(),\n };\n } else {\n if (!this.actors.owns(command.id)) {\n throw new Error(`Resident host does not own ${command.id}`);\n }\n await this.actors.remove(command.id);\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n completedAt: Date.now(),\n };\n }\n } catch (error) {\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: false,\n error: errorMessage(error),\n completedAt: Date.now(),\n };\n }\n atomicWrite(path.join(this.#responsesPath, `${requestId}.json`), response);\n fs.rmSync(filePath, { force: true });\n this.participants.scheduleRefresh();\n }\n\n #recoverInterruptedRequests(): void {\n let entries: string[];\n try {\n entries = fs.readdirSync(this.#processingPath).filter((entry) => entry.endsWith(\".json\"));\n } catch {\n return;\n }\n for (const entry of entries) {\n const requestId = path.basename(entry, \".json\");\n const response: ResidentCommandResponse = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: false,\n error: \"Fabric residency outcome is indeterminate after resident host restart\",\n completedAt: Date.now(),\n };\n atomicWrite(path.join(this.#responsesPath, entry), response);\n fs.rmSync(path.join(this.#processingPath, entry), { force: true });\n }\n }\n\n #acquireLock(): void {\n fs.mkdirSync(this.config.residencyRoot, { recursive: true, mode: 0o700 });\n const existing = readJson<ResidentHostOwner>(this.#ownerPath);\n if (existing && processAlive(existing.pid)) {\n throw new ResidentHostAlreadyRunning(`Fabric resident host is already running (${existing.pid})`);\n }\n try {\n const descriptor = fs.openSync(this.#lockPath, \"wx\", 0o600);\n fs.writeFileSync(descriptor, JSON.stringify({ token: this.#token, pid: process.pid }));\n fs.closeSync(descriptor);\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"EEXIST\") {\n const locked = readJson<{ pid?: unknown }>(this.#lockPath);\n if (typeof locked?.pid === \"number\" && processAlive(locked.pid)) {\n throw new ResidentHostAlreadyRunning(`Fabric resident host is starting (${locked.pid})`);\n }\n fs.rmSync(this.#lockPath, { force: true });\n const descriptor = fs.openSync(this.#lockPath, \"wx\", 0o600);\n fs.writeFileSync(descriptor, JSON.stringify({ token: this.#token, pid: process.pid }));\n fs.closeSync(descriptor);\n } else {\n throw error;\n }\n }\n }\n\n #releaseLock(): void {\n const lock = readJson<{ token?: unknown }>(this.#lockPath);\n if (lock?.token === this.#token) fs.rmSync(this.#lockPath, { force: true });\n const owner = readJson<ResidentHostOwner>(this.#ownerPath);\n if (owner?.token === this.#token) fs.rmSync(this.#ownerPath, { force: true });\n }\n}\n\nconst runResidentHost = async (\n config: ResidentHostConfig,\n signal?: AbortSignal,\n): Promise<void> => {\n let finishIdle: (() => void) | undefined;\n const idle = new Promise<void>((resolve) => {\n finishIdle = resolve;\n });\n const host = new ResidentHost(config, () => finishIdle?.());\n await host.start();\n if (signal?.aborted) {\n await host.close();\n return;\n }\n await Promise.race([\n idle,\n new Promise<void>((resolve) => {\n const finish = (): void => resolve();\n signal?.addEventListener(\"abort\", finish, { once: true });\n process.once(\"SIGTERM\", finish);\n process.once(\"SIGINT\", finish);\n }),\n ]);\n await host.close();\n};\n\nexport const runResidentHostFromConfigPath = async (\n configPath: string,\n signal?: AbortSignal,\n): Promise<void> => {\n let config: ResidentHostConfig | undefined;\n try {\n config = validateResidentHostConfig(readJson<unknown>(configPath), configPath);\n await runResidentHost(config, signal);\n } catch (error) {\n if (error instanceof ResidentHostAlreadyRunning) return;\n const residencyRoot = config?.residencyRoot ?? path.dirname(configPath);\n try {\n atomicWrite(path.join(residencyRoot, \"error.json\"), {\n error: errorMessage(error),\n occurredAt: Date.now(),\n });\n } catch {\n // Startup diagnostics are best-effort.\n }\n throw error;\n }\n};\n\nconst isMain = process.argv[1] && path.resolve(process.argv[1]) === path.resolve(fileURLToPath(import.meta.url));\nif (isMain) {\n const configPath = parseResidentHostConfigPath(process.argv);\n try {\n await runResidentHostFromConfigPath(configPath);\n } catch {\n process.exitCode = 1;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -423,6 +423,21 @@ interface FabricActionListEnvelope {
|
|
|
423
423
|
truncated: boolean;
|
|
424
424
|
limit: number;
|
|
425
425
|
}
|
|
426
|
+
interface FabricActionSearchBackend {
|
|
427
|
+
requested: "semantic";
|
|
428
|
+
used: "semantic" | "lexical";
|
|
429
|
+
degraded: boolean;
|
|
430
|
+
model?: string;
|
|
431
|
+
usage?: { inputTokens: number; outputTokens: number };
|
|
432
|
+
abstained?: boolean;
|
|
433
|
+
reason?: "timeout" | "rate_limited" | "service_unavailable";
|
|
434
|
+
}
|
|
435
|
+
interface FabricActionSearchEnvelope {
|
|
436
|
+
kind: "pi-fabric.action-search";
|
|
437
|
+
version: 1;
|
|
438
|
+
actions: FabricAction[];
|
|
439
|
+
backend: FabricActionSearchBackend;
|
|
440
|
+
}
|
|
426
441
|
interface FabricToolsApi {
|
|
427
442
|
providers(): Promise<Array<{ name: string; description: string }>>;
|
|
428
443
|
catalog(args?: { provider?: string; limit?: number }): Promise<FabricCapabilityCatalog>;
|
|
@@ -432,7 +447,7 @@ interface FabricToolsApi {
|
|
|
432
447
|
* search() or pass envelope: true to get totals and a truncated flag.
|
|
433
448
|
*/
|
|
434
449
|
list(args?: { provider?: string; namespace?: string; query?: string; limit?: number; envelope?: boolean }): Promise<FabricAction[] | FabricActionListEnvelope>;
|
|
435
|
-
search(args: { query: string; limit?: number }): Promise<FabricAction[]>;
|
|
450
|
+
search(args: { query: string; limit?: number; searchMode?: "lexical" | "semantic" }): Promise<FabricAction[] | FabricActionSearchEnvelope>;
|
|
436
451
|
describe(args: { ref: string }): Promise<FabricAction>;
|
|
437
452
|
call(args: { ref: string; args?: Record<string, unknown> }): Promise<unknown>;
|
|
438
453
|
progress(args: { message: string }): Promise<void>;
|
|
@@ -1496,4 +1511,4 @@ export {
|
|
|
1496
1511
|
GUEST_TYPE_DECLARATIONS,
|
|
1497
1512
|
guestTypeDeclarations
|
|
1498
1513
|
};
|
|
1499
|
-
//# sourceMappingURL=chunk-
|
|
1514
|
+
//# sourceMappingURL=chunk-3M3RWABR.js.map
|