pi-fabric 0.92.39 → 0.92.40

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.
Files changed (104) hide show
  1. package/dist/agents/thinking-transfer.d.ts.map +1 -1
  2. package/dist/build-identity.d.ts +21 -0
  3. package/dist/build-identity.d.ts.map +1 -0
  4. package/dist/chunks/{chunk-WIC446CZ.js → chunk-2A2NWQ36.js} +2 -2
  5. package/dist/chunks/{chunk-KH7Z7PUC.js → chunk-36B4AIRT.js} +2 -2
  6. package/dist/chunks/{chunk-A3W4ERB3.js → chunk-4NUTVNS2.js} +7 -2
  7. package/dist/chunks/chunk-4NUTVNS2.js.map +7 -0
  8. package/dist/chunks/{chunk-QLV2IZ3F.js → chunk-CGL7QP4A.js} +58 -7
  9. package/dist/chunks/chunk-CGL7QP4A.js.map +7 -0
  10. package/dist/chunks/{chunk-3M3RWABR.js → chunk-FLKGJPCN.js} +28 -1
  11. package/dist/chunks/{chunk-3M3RWABR.js.map → chunk-FLKGJPCN.js.map} +2 -2
  12. package/dist/chunks/{chunk-45QTPCE7.js → chunk-GGETIGM5.js} +487 -707
  13. package/dist/chunks/chunk-GGETIGM5.js.map +7 -0
  14. package/dist/chunks/{chunk-JCI2ZIFR.js → chunk-IH76PTXH.js} +2 -2
  15. package/dist/chunks/{chunk-5NZ4EZ47.js → chunk-IK6PPFWG.js} +2 -2
  16. package/dist/chunks/{chunk-IK46M2WL.js → chunk-IUCVOZRX.js} +2 -2
  17. package/dist/chunks/{chunk-NPEPBSQP.js → chunk-K6RRQTDN.js} +508 -164
  18. package/dist/chunks/chunk-K6RRQTDN.js.map +7 -0
  19. package/dist/chunks/{chunk-M3ZNZ6EZ.js → chunk-PMSIZLV6.js} +2 -1
  20. package/dist/chunks/chunk-PMSIZLV6.js.map +7 -0
  21. package/dist/chunks/{chunk-OHJJTXMP.js → chunk-RKRVOBVO.js} +2 -2
  22. package/dist/chunks/chunk-YV2PHCDB.js +108 -0
  23. package/dist/chunks/chunk-YV2PHCDB.js.map +7 -0
  24. package/dist/components/configuration.js +2 -2
  25. package/dist/components/provider-component.d.ts +1 -1
  26. package/dist/components/provider-component.d.ts.map +1 -1
  27. package/dist/config.d.ts +1 -0
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/core/compact-controller.d.ts.map +1 -1
  30. package/dist/core/fabric-state-paths.d.ts +2 -0
  31. package/dist/core/fabric-state-paths.d.ts.map +1 -0
  32. package/dist/core/media-sanitize.d.ts +3 -2
  33. package/dist/core/media-sanitize.d.ts.map +1 -1
  34. package/dist/fabric-exec-tool.d.ts.map +1 -1
  35. package/dist/fabric-runtime-state.d.ts +2 -0
  36. package/dist/fabric-runtime-state.d.ts.map +1 -1
  37. package/dist/fabric-runtime-state.js +581 -56
  38. package/dist/fabric-runtime-state.js.map +4 -4
  39. package/dist/fabric-state.d.ts +2 -0
  40. package/dist/fabric-state.d.ts.map +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +172 -15
  43. package/dist/index.js.map +4 -4
  44. package/dist/jev/observation.js +2 -3
  45. package/dist/jev.js +3 -4
  46. package/dist/prewalk/arm.d.ts.map +1 -1
  47. package/dist/prewalk/controller.d.ts +57 -6
  48. package/dist/prewalk/controller.d.ts.map +1 -1
  49. package/dist/prewalk/fs-drift.d.ts.map +1 -1
  50. package/dist/prewalk/handoff.d.ts +5 -25
  51. package/dist/prewalk/handoff.d.ts.map +1 -1
  52. package/dist/prewalk/messages.d.ts +24 -0
  53. package/dist/prewalk/messages.d.ts.map +1 -0
  54. package/dist/prewalk/model-switch.d.ts +3 -0
  55. package/dist/prewalk/model-switch.d.ts.map +1 -0
  56. package/dist/prewalk/plan.d.ts +46 -0
  57. package/dist/prewalk/plan.d.ts.map +1 -0
  58. package/dist/prewalk/return.d.ts +16 -0
  59. package/dist/prewalk/return.d.ts.map +1 -0
  60. package/dist/providers/jev-provider.js +3 -4
  61. package/dist/providers/prewalk-provider.d.ts +19 -0
  62. package/dist/providers/prewalk-provider.d.ts.map +1 -0
  63. package/dist/residency/host.js +4 -4
  64. package/dist/residency/pi-entry.js +4 -4
  65. package/dist/runtime/core-override-guest-types.js +2 -2
  66. package/dist/runtime/cpython-runtime.d.ts +2 -0
  67. package/dist/runtime/cpython-runtime.d.ts.map +1 -1
  68. package/dist/runtime/cpython-runtime.js +7 -3
  69. package/dist/runtime/cpython-runtime.js.map +2 -2
  70. package/dist/runtime/guest-types.d.ts +1 -1
  71. package/dist/runtime/guest-types.d.ts.map +1 -1
  72. package/dist/runtime/guest-types.js +1 -1
  73. package/dist/runtime/monty-runtime.js +2 -2
  74. package/dist/runtime/monty-runtime.js.map +2 -2
  75. package/dist/runtime/node-process-runtime.js +2 -2
  76. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  77. package/dist/runtime/quickjs-runtime.js +1 -1
  78. package/dist/runtime/typescript-kernel.js +4 -4
  79. package/dist/runtime-state-builtins.d.ts.map +1 -1
  80. package/dist/ui/settings-sections-agents.d.ts.map +1 -1
  81. package/dist/ui/settings.js +11 -2
  82. package/dist/ui/settings.js.map +2 -2
  83. package/dist/worker.js +3 -13
  84. package/dist/worker.js.map +2 -2
  85. package/docs/agents.md +10 -9
  86. package/docs/configuration.md +5 -3
  87. package/docs/programmatic-compaction.md +12 -7
  88. package/package.json +2 -1
  89. package/skillsets/typescript/fabric-exec/references/agents.md +2 -2
  90. package/dist/chunks/chunk-45QTPCE7.js.map +0 -7
  91. package/dist/chunks/chunk-A3W4ERB3.js.map +0 -7
  92. package/dist/chunks/chunk-BJOJX2UW.js +0 -59
  93. package/dist/chunks/chunk-BJOJX2UW.js.map +0 -7
  94. package/dist/chunks/chunk-M3ZNZ6EZ.js.map +0 -7
  95. package/dist/chunks/chunk-NPEPBSQP.js.map +0 -7
  96. package/dist/chunks/chunk-QLV2IZ3F.js.map +0 -7
  97. package/dist/chunks/chunk-XKRZHYH3.js +0 -447
  98. package/dist/chunks/chunk-XKRZHYH3.js.map +0 -7
  99. /package/dist/chunks/{chunk-WIC446CZ.js.map → chunk-2A2NWQ36.js.map} +0 -0
  100. /package/dist/chunks/{chunk-KH7Z7PUC.js.map → chunk-36B4AIRT.js.map} +0 -0
  101. /package/dist/chunks/{chunk-JCI2ZIFR.js.map → chunk-IH76PTXH.js.map} +0 -0
  102. /package/dist/chunks/{chunk-5NZ4EZ47.js.map → chunk-IK6PPFWG.js.map} +0 -0
  103. /package/dist/chunks/{chunk-IK46M2WL.js.map → chunk-IUCVOZRX.js.map} +0 -0
  104. /package/dist/chunks/{chunk-OHJJTXMP.js.map → chunk-RKRVOBVO.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"thinking-transfer.d.ts","sourceRoot":"","sources":["../../src/agents/thinking-transfer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,iCAAiC,CAAC;AAsBzC,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,gFAAgF;IAChF,sBAAsB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;AAE5E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAI/D,eAAO,MAAM,sBAAsB,GACjC,OAAO,qBAAqB,KAC3B,sBAmBF,CAAC;AAYF,eAAO,MAAM,4BAA4B,GACvC,SAAS,YAAY,EAAE,EACvB,QAAQ,sBAAsB,KAC7B;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAqC3D,CAAC;AAEF,eAAO,MAAM,2BAA2B,+BAA+B,CAAC;AAMxE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AA2BD,eAAO,MAAM,mBAAmB,GAC9B,SAAS,YAAY,EAAE,EACvB,OAAO,qBAAqB,KAC3B,cAAc,GAAG,SAkCnB,CAAC"}
1
+ {"version":3,"file":"thinking-transfer.d.ts","sourceRoot":"","sources":["../../src/agents/thinking-transfer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,iCAAiC,CAAC;AAsBzC,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,gFAAgF;IAChF,sBAAsB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;AAE5E,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAI/D,eAAO,MAAM,sBAAsB,GACjC,OAAO,qBAAqB,KAC3B,sBAmBF,CAAC;AAYF,eAAO,MAAM,4BAA4B,GACvC,SAAS,YAAY,EAAE,EACvB,QAAQ,sBAAsB,KAC7B;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAqC3D,CAAC;AAEF,eAAO,MAAM,2BAA2B,+BAA+B,CAAC;AAMxE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AA6BD,eAAO,MAAM,mBAAmB,GAC9B,SAAS,YAAY,EAAE,EACvB,OAAO,qBAAqB,KAC3B,cAAc,GAAG,SA6CnB,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface FabricLoadedFileIdentity {
2
+ path: string;
3
+ sha256: string;
4
+ }
5
+ export interface FabricRuntimeIdentity {
6
+ entry: FabricLoadedFileIdentity | null;
7
+ lazyRuntime: FabricLoadedFileIdentity | null;
8
+ }
9
+ export interface FabricLoadedFileIdentityStatus {
10
+ path: string;
11
+ loadedSha256: string;
12
+ diskSha256: string;
13
+ stale: boolean;
14
+ }
15
+ export declare const captureLoadedFileIdentity: (moduleUrl: string) => FabricLoadedFileIdentity | null;
16
+ export declare const loadedFileIdentityStatus: (identity: FabricLoadedFileIdentity) => FabricLoadedFileIdentityStatus;
17
+ export declare const runtimeIdentityStatus: (identity: FabricRuntimeIdentity) => {
18
+ entry: FabricLoadedFileIdentityStatus | null;
19
+ lazyRuntime: FabricLoadedFileIdentityStatus | null;
20
+ };
21
+ //# sourceMappingURL=build-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-identity.d.ts","sourceRoot":"","sources":["../src/build-identity.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACvC,WAAW,EAAE,wBAAwB,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAKD,eAAO,MAAM,yBAAyB,GACpC,WAAW,MAAM,KAChB,wBAAwB,GAAG,IAS7B,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,UAAU,wBAAwB,KACjC,8BAaF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,UAAU,qBAAqB,KAAG;IACtE,KAAK,EAAE,8BAA8B,GAAG,IAAI,CAAC;IAC7C,WAAW,EAAE,8BAA8B,GAAG,IAAI,CAAC;CAInD,CAAC"}
@@ -2,7 +2,7 @@ import {
2
2
  createGuestStackMap,
3
3
  guestSetupSource,
4
4
  remapGuestErrorText
5
- } from "./chunk-M3ZNZ6EZ.js";
5
+ } from "./chunk-PMSIZLV6.js";
6
6
  import {
7
7
  transpileFabricCodeWithSourceMap
8
8
  } from "./chunk-N5GUXC6F.js";
@@ -364,4 +364,4 @@ export {
364
364
  NodeProcessRuntime,
365
365
  BunProcessRuntime
366
366
  };
367
- //# sourceMappingURL=chunk-WIC446CZ.js.map
367
+ //# sourceMappingURL=chunk-2A2NWQ36.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PI_CORE_COMPATIBILITY_ARGUMENT_TYPE_NAMES,
3
3
  PI_CORE_NUMERIC_FIELDS
4
- } from "./chunk-3M3RWABR.js";
4
+ } from "./chunk-FLKGJPCN.js";
5
5
  import {
6
6
  PI_CORE_TOOL_NAMES
7
7
  } from "./chunk-YU62DDKK.js";
@@ -284,4 +284,4 @@ var buildCoreOverrideGuestDeclarations = (sources) => {
284
284
  export {
285
285
  buildCoreOverrideGuestDeclarations
286
286
  };
287
- //# sourceMappingURL=chunk-KH7Z7PUC.js.map
287
+ //# sourceMappingURL=chunk-36B4AIRT.js.map
@@ -573,7 +573,8 @@ var DEFAULT_FABRIC_CONFIG = {
573
573
  mode: "in-place",
574
574
  alwaysRearm: false,
575
575
  compactOnReturn: true,
576
- detectShellWrites: true
576
+ detectShellWrites: true,
577
+ requirePlan: true
577
578
  },
578
579
  agents: {
579
580
  enabled: true,
@@ -981,6 +982,10 @@ var normalizeFabricConfig = (input) => {
981
982
  detectShellWrites: booleanValue(
982
983
  prewalk.detectShellWrites,
983
984
  DEFAULT_FABRIC_CONFIG.prewalk.detectShellWrites
985
+ ),
986
+ requirePlan: booleanValue(
987
+ prewalk.requirePlan,
988
+ DEFAULT_FABRIC_CONFIG.prewalk.requirePlan
984
989
  )
985
990
  },
986
991
  agents: {
@@ -1495,4 +1500,4 @@ export {
1495
1500
  loadFabricConfig,
1496
1501
  saveFabricConfig
1497
1502
  };
1498
- //# sourceMappingURL=chunk-A3W4ERB3.js.map
1503
+ //# sourceMappingURL=chunk-4NUTVNS2.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 // Git Bash `$$` is an MSYS pid; Node and taskkill need /proc/$$/winpid.\n : `printf '%s\\\\n' \"$(cat /proc/$$/winpid 2>/dev/null || printf '%s' \"$$\")\" > ${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 // Frontier-first planning: the mutation boundary that would hand off instead\n // asks Main to record its plan, and the handoff fires at the next mutation with\n // that plan in the transcript. Upstream prewalk nudges the plan on turn one,\n // before any discovery; this lands on the boundary, after it.\n requirePlan: 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 requirePlan: 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 requirePlan: booleanValue(\n prewalk.requirePlan,\n DEFAULT_FABRIC_CONFIG.prewalk.requirePlan,\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
+ }
@@ -1,10 +1,59 @@
1
- import {
2
- isImageContent,
3
- looksLikeBase64
4
- } from "./chunk-BJOJX2UW.js";
5
-
6
1
  // src/actors/host-event-payload.ts
2
+ import { createHash as createHash2 } from "node:crypto";
3
+
4
+ // src/core/media-sanitize.ts
7
5
  import { createHash } from "node:crypto";
6
+ var BASE64_RUN = /[A-Za-z0-9+/=_-]{1024,}/g;
7
+ var BASE64_ALPHABET = /^[A-Za-z0-9+/=_\r\n-]+$/;
8
+ var omittedMarker = (length) => "[omitted base64: " + String(length) + " chars]";
9
+ var isPlainObject = (value) => {
10
+ const prototype = Object.getPrototypeOf(value);
11
+ return prototype === Object.prototype || prototype === null;
12
+ };
13
+ var looksLikeBase64 = (value) => {
14
+ if (value.startsWith("data:") && value.includes(";base64,")) return true;
15
+ if (value.length < 1024 || value.length % 4 !== 0) return false;
16
+ return BASE64_ALPHABET.test(value);
17
+ };
18
+ var isImageContent = (value) => typeof value === "object" && value !== null && !Array.isArray(value) && value.type === "image" && typeof value.data === "string" && typeof value.mimeType === "string";
19
+ var sanitizeFabricMediaText = (text) => {
20
+ if (text.length < 1024) return text;
21
+ return text.replace(BASE64_RUN, (run) => omittedMarker(run.length));
22
+ };
23
+ var sanitizeFabricMediaValue = (value) => {
24
+ const images = [];
25
+ const media = [];
26
+ const indexes = /* @__PURE__ */ new Map();
27
+ const seen = /* @__PURE__ */ new WeakSet();
28
+ const walk = (node) => {
29
+ if (typeof node === "string") {
30
+ if (looksLikeBase64(node)) return omittedMarker(node.length);
31
+ return sanitizeFabricMediaText(node);
32
+ }
33
+ if (node === null || typeof node !== "object") return node;
34
+ if (isImageContent(node)) {
35
+ const sha256 = createHash("sha256").update(node.mimeType).update("\0").update(node.data).digest("hex");
36
+ let mediaIndex = indexes.get(sha256);
37
+ if (mediaIndex === void 0) {
38
+ mediaIndex = images.length;
39
+ indexes.set(sha256, mediaIndex);
40
+ images.push({ type: "image", data: node.data, mimeType: node.mimeType });
41
+ media.push({ type: "image", mediaIndex, mimeType: node.mimeType, redacted: true });
42
+ }
43
+ return { type: "image", mediaIndex, mimeType: node.mimeType, redacted: true };
44
+ }
45
+ if (seen.has(node)) return node;
46
+ seen.add(node);
47
+ if (Array.isArray(node)) return node.map(walk);
48
+ if (!isPlainObject(node)) return node;
49
+ const rebuilt = {};
50
+ for (const [key, nested] of Object.entries(node)) rebuilt[key] = walk(nested);
51
+ return rebuilt;
52
+ };
53
+ return { value: walk(value), images, media };
54
+ };
55
+
56
+ // src/actors/host-event-payload.ts
8
57
  var normalizedKey = (key) => key.toLowerCase().replaceAll(/[^a-z0-9]/g, "");
9
58
  var isSensitiveKey = (key) => {
10
59
  const normalized = normalizedKey(key);
@@ -38,7 +87,7 @@ var prepareFabricActorHostPayload = (value, maxChars) => {
38
87
  const serialized = JSON.stringify(value, (key, nested) => {
39
88
  if (key && isSensitiveKey(key)) return "[redacted]";
40
89
  if (isImageContent(nested)) {
41
- const sha256 = createHash("sha256").update(nested.mimeType).update("\0").update(nested.data).digest("hex");
90
+ const sha256 = createHash2("sha256").update(nested.mimeType).update("\0").update(nested.data).digest("hex");
42
91
  let mediaIndex = imageIndexes.get(sha256);
43
92
  if (mediaIndex === void 0) {
44
93
  mediaIndex = images.length;
@@ -87,6 +136,8 @@ var prepareFabricActorHostPayload = (value, maxChars) => {
87
136
  };
88
137
 
89
138
  export {
139
+ sanitizeFabricMediaText,
140
+ sanitizeFabricMediaValue,
90
141
  prepareFabricActorHostPayload
91
142
  };
92
- //# sourceMappingURL=chunk-QLV2IZ3F.js.map
143
+ //# sourceMappingURL=chunk-CGL7QP4A.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/actors/host-event-payload.ts", "../../src/core/media-sanitize.ts"],
4
+ "sourcesContent": ["import { createHash } from \"node:crypto\";\n// Base64 and image-block heuristics are shared with the fabric_exec media\n// sanitizer so both channels agree on what counts as a payload.\nimport { isImageContent, looksLikeBase64 } from \"../core/media-sanitize.js\";\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\n\ninterface FabricActorHostMediaDescriptor {\n type: \"image\";\n mediaIndex: number;\n mimeType: string;\n}\n\nexport interface PreparedFabricActorHostPayload {\n payload: unknown;\n images: ImageContent[];\n media: FabricActorHostMediaDescriptor[];\n}\n\nconst normalizedKey = (key: string): string =>\n key.toLowerCase().replaceAll(/[^a-z0-9]/g, \"\");\n\nconst isSensitiveKey = (key: string): boolean => {\n const normalized = normalizedKey(key);\n return [\n \"password\",\n \"passwd\",\n \"secret\",\n \"token\",\n \"accesstoken\",\n \"refreshtoken\",\n \"authorization\",\n \"cookie\",\n \"credential\",\n \"credentials\",\n \"apikey\",\n \"privatekey\",\n \"clientsecret\",\n ].some((sensitive) => normalized === sensitive || normalized.endsWith(sensitive));\n};\n\nconst redactInlineSecrets = (value: string): string =>\n value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]+=*/gi, \"Bearer [redacted]\")\n .replace(/\\bBasic\\s+[A-Za-z0-9+/=]{8,}/gi, \"Basic [redacted]\")\n .replace(/\\b(?:sk|pk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{12,}\\b/g, \"[redacted]\")\n .replace(\n /\\b(Authorization|Proxy-Authorization|Cookie|Set-Cookie|X-Api-Key)\\s*:\\s*[^\\r\\n;]+/gi,\n \"$1: [redacted]\",\n )\n .replace(/(https?:\\/\\/)[^\\s/:@]+:[^\\s/@]+@/gi, \"$1[redacted]@\");\n\n\nexport const prepareFabricActorHostPayload = (\n value: unknown,\n maxChars: number,\n): PreparedFabricActorHostPayload => {\n const images: ImageContent[] = [];\n const media: FabricActorHostMediaDescriptor[] = [];\n const imageIndexes = new Map<string, number>();\n const seen = new WeakSet<object>();\n let json: string;\n\n try {\n const serialized = JSON.stringify(value, (key, nested) => {\n if (key && isSensitiveKey(key)) return \"[redacted]\";\n if (isImageContent(nested)) {\n const sha256 = createHash(\"sha256\")\n .update(nested.mimeType)\n .update(\"\\0\")\n .update(nested.data)\n .digest(\"hex\");\n let mediaIndex = imageIndexes.get(sha256);\n if (mediaIndex === undefined) {\n mediaIndex = images.length;\n imageIndexes.set(sha256, mediaIndex);\n images.push({ type: \"image\", data: nested.data, mimeType: nested.mimeType });\n media.push({ type: \"image\", mediaIndex, mimeType: nested.mimeType });\n }\n return {\n type: \"image\",\n mediaIndex,\n mimeType: nested.mimeType,\n redacted: true,\n };\n }\n if (\n typeof nested === \"object\" &&\n nested !== null &&\n !Array.isArray(nested) &&\n (nested as { type?: unknown }).type === \"image\"\n ) {\n return {\n type: \"image\",\n ...(typeof (nested as { mimeType?: unknown }).mimeType === \"string\"\n ? { mimeType: (nested as { mimeType: string }).mimeType }\n : {}),\n redacted: true,\n };\n }\n if (typeof nested === \"string\") {\n if (looksLikeBase64(nested)) return \"[omitted base64]\";\n return redactInlineSecrets(nested);\n }\n if (typeof nested === \"bigint\") return String(nested);\n if (typeof nested === \"function\" || typeof nested === \"symbol\") return undefined;\n if (typeof nested === \"object\" && nested !== null) {\n if (seen.has(nested)) return \"[circular or repeated reference]\";\n seen.add(nested);\n }\n return nested;\n });\n json = serialized ?? \"null\";\n } catch {\n json = JSON.stringify(String(value));\n }\n\n if (json.length > maxChars) json = json.slice(json.length - maxChars);\n let payload: unknown;\n try {\n payload = JSON.parse(json) as unknown;\n } catch {\n payload = json;\n }\n return { payload, images, media };\n};\n", "import { createHash } from \"node:crypto\";\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\n\n/**\n * Media sanitization for every channel that serializes guest or provider data\n * into text: fabric_exec logs, results, and error text, and actor host-event\n * payloads. Worker event lines are not sanitized: one past the line cap fails the\n * run with a bounded raw prefix as evidence.\n *\n * Raw image bytes stay available out of band (see the images side channel), so a\n * multimodal model can still receive them while text channels receive a\n * descriptor. The rule used to be implemented only for actor host events, so a\n * guest that printed or returned a nested pi.read image could push hundreds of\n * KB of base64 into one serialized line and break the run.\n */\n\n/** Descriptor that replaces an image payload in a text channel. */\nexport interface FabricSanitizedMediaDescriptor {\n type: \"image\";\n mediaIndex: number;\n mimeType: string;\n redacted: true;\n}\n\nexport interface SanitizedFabricMedia {\n value: unknown;\n /** Raw payloads, indexed by mediaIndex in the descriptors. */\n images: ImageContent[];\n media: FabricSanitizedMediaDescriptor[];\n}\n\n/** A run of base64-alphabet characters long enough to be a binary payload. */\nconst BASE64_RUN = /[A-Za-z0-9+/=_-]{1024,}/g;\n\nconst BASE64_ALPHABET = /^[A-Za-z0-9+/=_\\r\\n-]+$/;\n\nconst omittedMarker = (length: number): string =>\n \"[omitted base64: \" + String(length) + \" chars]\";\n\nconst isPlainObject = (value: object): boolean => {\n const prototype = Object.getPrototypeOf(value) as object | null;\n return prototype === Object.prototype || prototype === null;\n};\n\n/** True when an entire string is a base64 payload (or a base64 data URL). */\nexport const looksLikeBase64 = (value: string): boolean => {\n if (value.startsWith(\"data:\") && value.includes(\";base64,\")) return true;\n if (value.length < 1_024 || value.length % 4 !== 0) return false;\n return BASE64_ALPHABET.test(value);\n};\n\n/** True for the Pi multimodal block shape {type: \"image\", data, mimeType}. */\nexport const isImageContent = (value: unknown): value is ImageContent =>\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n (value as { type?: unknown }).type === \"image\" &&\n typeof (value as { data?: unknown }).data === \"string\" &&\n typeof (value as { mimeType?: unknown }).mimeType === \"string\";\n\n/**\n * Replace base64 runs inside free text with a bounded marker. Short strings are\n * returned untouched, so the hot event-line path pays only a length check.\n */\nexport const sanitizeFabricMediaText = (text: string): string => {\n if (text.length < 1_024) return text;\n return text.replace(BASE64_RUN, (run) => omittedMarker(run.length));\n};\n\n/**\n * Recursively replace image payloads and long base64 strings in a value.\n *\n * Images are deduplicated by content hash and hoisted into the images side\n * channel, and their text representation becomes a descriptor. Non-plain objects\n * and repeated references are returned unchanged: rebuilding them would drop\n * class identity, which matters because fabric_exec inspects result values for\n * control fields such as terminate.\n */\nexport const sanitizeFabricMediaValue = (value: unknown): SanitizedFabricMedia => {\n const images: ImageContent[] = [];\n const media: FabricSanitizedMediaDescriptor[] = [];\n const indexes = new Map<string, number>();\n const seen = new WeakSet<object>();\n\n const walk = (node: unknown): unknown => {\n if (typeof node === \"string\") {\n if (looksLikeBase64(node)) return omittedMarker(node.length);\n return sanitizeFabricMediaText(node);\n }\n if (node === null || typeof node !== \"object\") return node;\n if (isImageContent(node)) {\n const sha256 = createHash(\"sha256\")\n .update(node.mimeType)\n .update(\"\\0\")\n .update(node.data)\n .digest(\"hex\");\n let mediaIndex = indexes.get(sha256);\n if (mediaIndex === undefined) {\n mediaIndex = images.length;\n indexes.set(sha256, mediaIndex);\n images.push({ type: \"image\", data: node.data, mimeType: node.mimeType });\n media.push({ type: \"image\", mediaIndex, mimeType: node.mimeType, redacted: true });\n }\n return { type: \"image\", mediaIndex, mimeType: node.mimeType, redacted: true };\n }\n if (seen.has(node)) return node;\n seen.add(node);\n if (Array.isArray(node)) return node.map(walk);\n if (!isPlainObject(node)) return node;\n const rebuilt: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(node)) rebuilt[key] = walk(nested);\n return rebuilt;\n };\n\n return { value: walk(value), images, media };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["createHash", "createHash"]
7
+ }
@@ -1379,6 +1379,32 @@ interface FabricCompactApi {
1379
1379
  cancel(): Promise<{ cancelled: true }>;
1380
1380
  }
1381
1381
 
1382
+ interface FabricPrewalkFileIdentityStatus {
1383
+ path: string;
1384
+ loadedSha256: string;
1385
+ diskSha256: string;
1386
+ stale: boolean;
1387
+ }
1388
+ interface FabricPrewalkApi {
1389
+ plan(args: {
1390
+ outcome: string;
1391
+ steps: string[];
1392
+ verification: string[];
1393
+ risks: string;
1394
+ }): Promise<{ recorded: true; readiness: "ready"; plan: string }>;
1395
+ status(): Promise<{
1396
+ state: "idle" | "armed" | "handing_off" | "continuation_pending";
1397
+ planRequired: boolean;
1398
+ planReady: boolean;
1399
+ planPrompts: number;
1400
+ claimedReadiness: "planned" | "disabled" | "unplanned" | null;
1401
+ runtime?: {
1402
+ entry: FabricPrewalkFileIdentityStatus | null;
1403
+ lazyRuntime: FabricPrewalkFileIdentityStatus | null;
1404
+ };
1405
+ }>;
1406
+ }
1407
+
1382
1408
  interface FabricWorkflowAgentOptions extends Omit<FabricAgentRequest, "task"> {
1383
1409
  label?: string;
1384
1410
  }
@@ -1432,6 +1458,7 @@ declare const state: FabricStateApi;
1432
1458
  declare const schema: FabricSchemaApi;
1433
1459
  declare const components: FabricComponentsApi;
1434
1460
  declare const compact: FabricCompactApi;
1461
+ declare const prewalk: FabricPrewalkApi;
1435
1462
  ${JEV_GUEST_DECLARATIONS}
1436
1463
  declare const council: FabricCouncilApi;
1437
1464
  declare const workflow: FabricWorkflowApi;
@@ -1511,4 +1538,4 @@ export {
1511
1538
  GUEST_TYPE_DECLARATIONS,
1512
1539
  guestTypeDeclarations
1513
1540
  };
1514
- //# sourceMappingURL=chunk-3M3RWABR.js.map
1541
+ //# sourceMappingURL=chunk-FLKGJPCN.js.map