pi-fabric 0.108.0 → 0.109.0

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 (161) hide show
  1. package/README.md +1 -1
  2. package/dist/chunks/{chunk-DRY66JKC.js → chunk-2W2DTC45.js} +3 -3
  3. package/dist/chunks/{chunk-JIZFEZK2.js → chunk-BVJBYFHD.js} +2 -2
  4. package/dist/chunks/{chunk-UNKE4WWQ.js → chunk-CZPQTISQ.js} +3 -1
  5. package/dist/chunks/chunk-CZPQTISQ.js.map +7 -0
  6. package/dist/chunks/{chunk-YBK4MDZW.js → chunk-DD3B7UU6.js} +2 -2
  7. package/dist/chunks/{chunk-TGJ3GJDM.js → chunk-DZ4WN5XJ.js} +3 -3
  8. package/dist/chunks/{chunk-YWFZOYLG.js → chunk-FB24AOIJ.js} +3 -3
  9. package/dist/chunks/{chunk-VIHHAY4Y.js → chunk-GC2AUXG6.js} +2 -2
  10. package/dist/chunks/{chunk-ZL4UD4PW.js → chunk-JO3EEBTY.js} +41 -22
  11. package/dist/chunks/chunk-JO3EEBTY.js.map +7 -0
  12. package/dist/chunks/chunk-K6QXUGS5.js +30 -0
  13. package/dist/chunks/chunk-K6QXUGS5.js.map +7 -0
  14. package/dist/chunks/{chunk-VAON7IER.js → chunk-LOLCTWJF.js} +2 -2
  15. package/dist/chunks/{chunk-TJGIC767.js → chunk-M5IN6DMF.js} +4 -4
  16. package/dist/chunks/{chunk-PM6O2JUK.js → chunk-M6IRQ3QT.js} +2 -2
  17. package/dist/chunks/{chunk-OGORILCT.js → chunk-N2VKKA7O.js} +2 -2
  18. package/dist/chunks/{chunk-N5GUXC6F.js → chunk-P4KH4S4S.js} +2 -1
  19. package/dist/chunks/chunk-P4KH4S4S.js.map +7 -0
  20. package/dist/chunks/{chunk-XENCLZGL.js → chunk-PF27MQY5.js} +10 -1
  21. package/dist/chunks/chunk-PF27MQY5.js.map +7 -0
  22. package/dist/chunks/{chunk-MARGFSUE.js → chunk-PHXSUD52.js} +2 -2
  23. package/dist/chunks/{chunk-YRDCJZZW.js → chunk-RUO6L7RM.js} +1 -1
  24. package/dist/chunks/{chunk-YRDCJZZW.js.map → chunk-RUO6L7RM.js.map} +1 -1
  25. package/dist/chunks/{chunk-UPBP2YII.js → chunk-S3IRPDSO.js} +2 -2
  26. package/dist/chunks/{chunk-5RS2B4P5.js → chunk-SZCQA7FY.js} +25 -25
  27. package/dist/chunks/chunk-SZCQA7FY.js.map +7 -0
  28. package/dist/chunks/{chunk-RIVYOW5Q.js → chunk-T5CU2GPZ.js} +2 -2
  29. package/dist/chunks/{chunk-UZMHGK2T.js → chunk-THRQMRC3.js} +6 -6
  30. package/dist/chunks/{chunk-UZMHGK2T.js.map → chunk-THRQMRC3.js.map} +2 -2
  31. package/dist/chunks/{chunk-BDQLZAMV.js → chunk-UXEMIWYI.js} +13 -8
  32. package/dist/chunks/chunk-UXEMIWYI.js.map +7 -0
  33. package/dist/chunks/{chunk-SGFH5PYA.js → chunk-V2SKDVQX.js} +10 -9
  34. package/dist/chunks/chunk-V2SKDVQX.js.map +7 -0
  35. package/dist/chunks/{chunk-4O3PFVTC.js → chunk-VTK2FEH7.js} +2 -2
  36. package/dist/chunks/{chunk-4O3PFVTC.js.map → chunk-VTK2FEH7.js.map} +2 -2
  37. package/dist/chunks/{chunk-ECPZOET7.js → chunk-WREA4RNR.js} +2 -2
  38. package/dist/chunks/{chunk-JLBNPM4W.js → chunk-WYUV6WL3.js} +2 -2
  39. package/dist/chunks/{chunk-T6KZBPQE.js → chunk-X2TRSE7D.js} +2 -2
  40. package/dist/chunks/{chunk-3AOVGNQF.js → chunk-ZXKYU6CH.js} +4 -4
  41. package/dist/compaction/hook.js +4 -4
  42. package/dist/compaction/owner.js +5 -5
  43. package/dist/components/configuration.js +2 -2
  44. package/dist/config.d.ts +2 -0
  45. package/dist/config.d.ts.map +1 -1
  46. package/dist/core/action-registry.d.ts +1 -1
  47. package/dist/core/action-registry.d.ts.map +1 -1
  48. package/dist/core/action-registry.js +4 -4
  49. package/dist/core/native-tool-names.d.ts +9 -0
  50. package/dist/core/native-tool-names.d.ts.map +1 -0
  51. package/dist/core/native-tool-result.d.ts +11 -0
  52. package/dist/core/native-tool-result.d.ts.map +1 -0
  53. package/dist/core/system-guidance.d.ts +3 -3
  54. package/dist/core/system-guidance.d.ts.map +1 -1
  55. package/dist/entropy/index.js +6 -6
  56. package/dist/execution-service.d.ts.map +1 -1
  57. package/dist/extension-bootstrap.js +10 -10
  58. package/dist/fabric-runtime-state.d.ts.map +1 -1
  59. package/dist/fabric-runtime-state.js +169 -64
  60. package/dist/fabric-runtime-state.js.map +4 -4
  61. package/dist/index.js +13 -13
  62. package/dist/jev.js +4 -4
  63. package/dist/mcp.js +1 -1
  64. package/dist/memory/discovery.js +5 -5
  65. package/dist/memory/file-worker.js +7 -7
  66. package/dist/memory/normalize.js +4 -4
  67. package/dist/memory/search.js +5 -5
  68. package/dist/memory/worker-provider.js +8 -8
  69. package/dist/memory.js +8 -8
  70. package/dist/native-codemode.d.ts +1 -1
  71. package/dist/native-codemode.d.ts.map +1 -1
  72. package/dist/native-image-artifacts.d.ts +4 -0
  73. package/dist/native-image-artifacts.d.ts.map +1 -0
  74. package/dist/native-image-artifacts.js +18 -0
  75. package/dist/native-image-artifacts.js.map +7 -0
  76. package/dist/native-tool-catalog.d.ts +21 -0
  77. package/dist/native-tool-catalog.d.ts.map +1 -0
  78. package/dist/native-tool-catalog.js +71 -0
  79. package/dist/native-tool-catalog.js.map +7 -0
  80. package/dist/protocol.d.ts +2 -0
  81. package/dist/protocol.d.ts.map +1 -1
  82. package/dist/protocol.js +1 -1
  83. package/dist/providers/captured-tools-provider.d.ts +1 -1
  84. package/dist/providers/captured-tools-provider.d.ts.map +1 -1
  85. package/dist/providers/jev-provider.js +4 -4
  86. package/dist/providers/mcp-provider.d.ts +1 -1
  87. package/dist/providers/mcp-provider.d.ts.map +1 -1
  88. package/dist/providers/memory-provider.js +7 -7
  89. package/dist/providers/pi-native-mcp.d.ts.map +1 -1
  90. package/dist/providers/pi-tools-provider.d.ts.map +1 -1
  91. package/dist/residency/host.js +7 -7
  92. package/dist/residency/pi-entry.js +7 -7
  93. package/dist/runtime/core-override-guest-types.js +2 -2
  94. package/dist/runtime/dynamic-guest-types.d.ts +1 -1
  95. package/dist/runtime/dynamic-guest-types.d.ts.map +1 -1
  96. package/dist/runtime/dynamic-guest-types.js +1 -1
  97. package/dist/runtime/guest-types.d.ts +1 -1
  98. package/dist/runtime/guest-types.d.ts.map +1 -1
  99. package/dist/runtime/guest-types.js +1 -1
  100. package/dist/runtime/kernel.d.ts +2 -0
  101. package/dist/runtime/kernel.d.ts.map +1 -1
  102. package/dist/runtime/monty-runtime.js +1 -1
  103. package/dist/runtime/native-codemode-guest.d.ts.map +1 -1
  104. package/dist/runtime/native-codemode-types.d.ts +1 -1
  105. package/dist/runtime/native-codemode-types.d.ts.map +1 -1
  106. package/dist/runtime/node-process-runtime.js +3 -3
  107. package/dist/runtime/quickjs-runtime.d.ts +1 -1
  108. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  109. package/dist/runtime/quickjs-runtime.js +2 -2
  110. package/dist/runtime/type-checker.d.ts +2 -0
  111. package/dist/runtime/type-checker.d.ts.map +1 -1
  112. package/dist/runtime/type-checker.js +5 -3
  113. package/dist/runtime/typescript-kernel.d.ts +1 -1
  114. package/dist/runtime/typescript-kernel.d.ts.map +1 -1
  115. package/dist/runtime/typescript-kernel.js +14 -12
  116. package/dist/runtime/typescript-kernel.js.map +2 -2
  117. package/dist/runtime-state-speculation.d.ts +4 -1
  118. package/dist/runtime-state-speculation.d.ts.map +1 -1
  119. package/dist/speculation/python-scanner.js +1 -1
  120. package/dist/speculation/python-scanner.js.map +2 -2
  121. package/dist/speculation/scanner.d.ts +2 -0
  122. package/dist/speculation/scanner.d.ts.map +1 -1
  123. package/dist/speculation/scanner.js +18 -4
  124. package/dist/speculation/scanner.js.map +2 -2
  125. package/dist/speculation/types.d.ts +1 -0
  126. package/dist/speculation/types.d.ts.map +1 -1
  127. package/dist/type-error-guidance.js +1 -1
  128. package/dist/ui/conversation.js +3 -3
  129. package/dist/ui/dashboard.js +9 -9
  130. package/dist/ui/settings-sections-execution.d.ts.map +1 -1
  131. package/dist/ui/settings.js +5 -1
  132. package/dist/ui/settings.js.map +2 -2
  133. package/docs/codemode-parity.md +72 -25
  134. package/docs/configuration.md +4 -0
  135. package/docs/speculation.md +12 -3
  136. package/package.json +1 -1
  137. package/skillsets/typescript/fabric-exec/SKILL.md +1 -1
  138. package/dist/chunks/chunk-5RS2B4P5.js.map +0 -7
  139. package/dist/chunks/chunk-BDQLZAMV.js.map +0 -7
  140. package/dist/chunks/chunk-N5GUXC6F.js.map +0 -7
  141. package/dist/chunks/chunk-SGFH5PYA.js.map +0 -7
  142. package/dist/chunks/chunk-UNKE4WWQ.js.map +0 -7
  143. package/dist/chunks/chunk-XENCLZGL.js.map +0 -7
  144. package/dist/chunks/chunk-ZL4UD4PW.js.map +0 -7
  145. /package/dist/chunks/{chunk-DRY66JKC.js.map → chunk-2W2DTC45.js.map} +0 -0
  146. /package/dist/chunks/{chunk-JIZFEZK2.js.map → chunk-BVJBYFHD.js.map} +0 -0
  147. /package/dist/chunks/{chunk-YBK4MDZW.js.map → chunk-DD3B7UU6.js.map} +0 -0
  148. /package/dist/chunks/{chunk-TGJ3GJDM.js.map → chunk-DZ4WN5XJ.js.map} +0 -0
  149. /package/dist/chunks/{chunk-YWFZOYLG.js.map → chunk-FB24AOIJ.js.map} +0 -0
  150. /package/dist/chunks/{chunk-VIHHAY4Y.js.map → chunk-GC2AUXG6.js.map} +0 -0
  151. /package/dist/chunks/{chunk-VAON7IER.js.map → chunk-LOLCTWJF.js.map} +0 -0
  152. /package/dist/chunks/{chunk-TJGIC767.js.map → chunk-M5IN6DMF.js.map} +0 -0
  153. /package/dist/chunks/{chunk-PM6O2JUK.js.map → chunk-M6IRQ3QT.js.map} +0 -0
  154. /package/dist/chunks/{chunk-OGORILCT.js.map → chunk-N2VKKA7O.js.map} +0 -0
  155. /package/dist/chunks/{chunk-MARGFSUE.js.map → chunk-PHXSUD52.js.map} +0 -0
  156. /package/dist/chunks/{chunk-UPBP2YII.js.map → chunk-S3IRPDSO.js.map} +0 -0
  157. /package/dist/chunks/{chunk-RIVYOW5Q.js.map → chunk-T5CU2GPZ.js.map} +0 -0
  158. /package/dist/chunks/{chunk-ECPZOET7.js.map → chunk-WREA4RNR.js.map} +0 -0
  159. /package/dist/chunks/{chunk-JLBNPM4W.js.map → chunk-WYUV6WL3.js.map} +0 -0
  160. /package/dist/chunks/{chunk-T6KZBPQE.js.map → chunk-X2TRSE7D.js.map} +0 -0
  161. /package/dist/chunks/{chunk-3AOVGNQF.js.map → chunk-ZXKYU6CH.js.map} +0 -0
package/README.md CHANGED
@@ -158,7 +158,7 @@ See the [interface & commands reference](docs/interface.md) for every view, keyb
158
158
 
159
159
  - [Configuration](docs/configuration.md): `fabric.json`, code modes, tool capture, approvals, and budgets.
160
160
  - [Execution kernels](docs/kernels.md): exclusive TypeScript/Python selection, Monty sandboxing, CPython escape hatch, agent inheritance, and examples.
161
- - [Native codemode APIs](docs/codemode-parity.md): the `models` namespace, native classifiers and images, branch-local script state, output helpers, and per-call limits.
161
+ - [Native codemode APIs](docs/codemode-parity.md): additive native tool aliases or opt-in Pi-compatible scripts, collision-safe Fabric discovery, native models/images, branch-local state, and sPTC.
162
162
  - [Prompt cache](docs/prompt-cache.md): honest cache observations and optional, time-bounded native warming leases.
163
163
  - [Thinking control](docs/thinking.md): scoped host-session reasoning effort with configured bounds that children inherit and never widen.
164
164
  - [Durable Pi runner](docs/durable-pi.md): the default isolated Pi/Fabric host, checkpoint recovery, replay boundaries, and the explicit legacy `pi` option.
@@ -41,14 +41,14 @@ import {
41
41
  DEFAULT_FABRIC_CONFIG,
42
42
  MAX_AGENT_TIMEOUT_MS,
43
43
  MIN_AGENT_TIMEOUT_MS
44
- } from "./chunk-UNKE4WWQ.js";
44
+ } from "./chunk-CZPQTISQ.js";
45
45
  import {
46
46
  readJsonlPage
47
47
  } from "./chunk-CGPK5WHX.js";
48
48
  import {
49
49
  compileFabricSummary,
50
50
  rawContextTokens
51
- } from "./chunk-RIVYOW5Q.js";
51
+ } from "./chunk-T5CU2GPZ.js";
52
52
  import {
53
53
  SHORT_LOCK_MAX_HOLD_MS,
54
54
  encodeOwnerIdentityLine,
@@ -7781,4 +7781,4 @@ export {
7781
7781
  agentParticipantRecords,
7782
7782
  actorParticipantRecord
7783
7783
  };
7784
- //# sourceMappingURL=chunk-DRY66JKC.js.map
7784
+ //# sourceMappingURL=chunk-2W2DTC45.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MemoryProvider
3
- } from "./chunk-TJGIC767.js";
3
+ } from "./chunk-M5IN6DMF.js";
4
4
 
5
5
  // src/memory/worker-provider.ts
6
6
  import path from "node:path";
@@ -187,4 +187,4 @@ var WorkerMemoryProvider = class extends MemoryProvider {
187
187
  export {
188
188
  WorkerMemoryProvider
189
189
  };
190
- //# sourceMappingURL=chunk-JIZFEZK2.js.map
190
+ //# sourceMappingURL=chunk-BVJBYFHD.js.map
@@ -278,6 +278,7 @@ var DEFAULT_FABRIC_CONFIG = {
278
278
  cpython: { binary: "python3" },
279
279
  jevFabric: { binary: "", home: "", timeoutMs: 36e5 },
280
280
  runtime: "quickjs",
281
+ codemodeProfile: "additive",
281
282
  timeoutMs: 12e4,
282
283
  maxTimeoutMs: 9e5,
283
284
  hostCallTimeouts: {},
@@ -668,6 +669,7 @@ var normalizeFabricConfig = (input) => {
668
669
  timeoutMs: boundedInteger(jevFabric.timeoutMs, DEFAULT_FABRIC_CONFIG.executor.jevFabric.timeoutMs, 1e3, MAX_EXECUTOR_TIMEOUT_MS)
669
670
  },
670
671
  runtime: executorRuntime,
672
+ codemodeProfile: executor.codemodeProfile === "native" ? "native" : "additive",
671
673
  maxTimeoutMs: boundedInteger(
672
674
  executor.maxTimeoutMs,
673
675
  DEFAULT_FABRIC_CONFIG.executor.maxTimeoutMs,
@@ -1362,4 +1364,4 @@ export {
1362
1364
  loadFabricConfig,
1363
1365
  saveFabricConfig
1364
1366
  };
1365
- //# sourceMappingURL=chunk-UNKE4WWQ.js.map
1367
+ //# sourceMappingURL=chunk-CZPQTISQ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/shell-limits.ts", "../../src/config.ts", "../../src/core/foreground-tools.ts", "../../src/core/damaged-file.ts", "../../src/config-migrations.ts"],
4
+ "sourcesContent": ["// Configuration reads must not import the process store or monitor engine.\nexport const DEFAULT_SHELL_HANG_MS = 120_000;\nexport const SHELL_HANG_MAX_MS = 600_000;\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 { approvalActionOverridesValue, type FabricActionApprovalMode } from \"./core/approval-overrides.js\";\nimport { foregroundConfigValue, type FabricForegroundConfig } from \"./core/foreground-tools.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-limits.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 {\n DEFAULT_FABRIC_THINKING,\n FABRIC_THINKING_BOUNDS_ENV,\n inheritedThinkingBounds,\n intersectThinkingBounds,\n isFabricThinking,\n normalizeThinkingBounds,\n type FabricThinking,\n type FabricThinkingBounds,\n} 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\";\n/** Built-in runner ids, or a runner registered through pi-fabric/runners. */\nexport type FabricAgentRunner = \"pi-durable\" | \"pi\" | \"claude\" | \"veda\" | (string & {});\n\n/** How a child run's reported model is checked against the requested key.\n * Strict fails the run on a mismatch. Permissive records the reported\n * attribution instead, so virtual provider keys can resolve to a concrete\n * backend at stream time. */\nexport type FabricModelAdmission = \"strict\" | \"permissive\";\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 /** Optional jev-fabric backend for durable tasks and sessions (macOS/Linux).\n * `binary` empty or \"auto\" picks the user's compatible install outside the\n * workspace, then the bundled package; an explicit path never falls back.\n * `home` empty means JEV_FABRIC_HOME, else `<cwd>/.jev-fabric-native`, the\n * same store other harnesses share. `timeoutMs` is the default job lifetime. */\n jevFabric: { binary: string; home: string; timeoutMs: number };\n /** TypeScript backend only; ignored by the Python kernel. */\n runtime: FabricExecutorRuntime;\n /** Add native tool aliases, or opt into Pi's script-level naming/result ergonomics. */\n codemodeProfile: \"additive\" | \"native\";\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 /** Exact host-call refs that wait for a person, e.g. \"extensions.ask\".\n * While such a call is in flight the program deadline is paused, so a\n * foreground question can wait indefinitely. Cancellation still applies. */\n humanWaitRefs: string[];\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 /** Exact `provider.action` or `provider.*` \u2192 allow | ask | deny; exact beats wildcard beats risk mode. */\n actions?: Record<string, FabricActionApprovalMode>;\n /** No-UI approvals: \"deny\" (absent, fail closed) or \"decision\" (await a durable user decision). */\n headless?: \"deny\" | \"decision\";\n /** Headless approval decision deadline; absent means 5 minutes. */\n headlessTimeoutMs?: number;\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\nconst nativeMcpServersValue = (value: unknown): string[] => {\n if (value === undefined) return [];\n if (!Array.isArray(value) || value.length > 256 || value.some(name =>\n typeof name !== \"string\" || !/^[A-Za-z0-9_-]+$/.test(name.trim()))) {\n throw new Error(\"mcp.nativeServers must be an array of at most 256 exact Pi MCP server names (letters, digits, _ and -)\");\n }\n return [...new Set(value.map((name: string) => name.trim()))];\n};\n\nexport interface FabricMcpConfig {\n enabled: boolean;\n /** Opt-in exact server names owned by Pi, never mcporter fallback targets. */\n nativeServers?: string[];\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 /** Admission policy for the model a child process actually reports. */\n modelAdmission: FabricModelAdmission;\n /** Shell command run in each new agent worktree before the child starts. */\n worktree?: { setup?: string };\n /** Child UI dialogs: \"cancel\" (absent) or \"route\" to the parent UI or a decision. */\n childQuestions?: \"cancel\" | \"route\";\n /** Routed child question deadline; absent means 10 minutes. */\n childQuestionTimeoutMs?: number;\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\nexport interface FabricCompactionPressureBands {\n warn: number;\n urgent: number;\n}\n\ninterface FabricCompactionConfig {\n engine: FabricCompactionEngine;\n targetContextRatio: number;\n thresholds: Record<string, number>;\n tokenThresholds: Record<string, number>;\n /** Occupancy fractions reported by `compact.pressure()`; 0 < warn < urgent < 1. */\n pressureBands: FabricCompactionPressureBands;\n /** Compact at a settled boundary when window headroom drops below this; 0 disables. */\n outputReserveTokens: number;\n /** Drop orphaned tool results and fill missing ones in outgoing context. */\n repairOrphans: boolean;\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\ninterface FabricTraceConfig {\n /** Persist the opt-in FabricAssessmentTraceV1 (timings, usage) beside the execution trace. */\n assessment: boolean;\n}\n\n/** One configured portable memory source (see docs/memory-recall.md). */\nexport interface FabricMemorySourceConfig {\n /** Registry id used as `args.source` in source-qualified memory calls. */\n id: string;\n /** Adapter kind; `\"fs\"` walks a local directory of session JSONL files. */\n kind: \"fs\";\n /** Absolute directory the `fs` adapter enumerates recursively. */\n root: string;\n}\n\nexport interface FabricExtractiveConfig {\n enabled: boolean;\n provider: string;\n model: string;\n maxViewBytes: number;\n maxCandidates: number;\n maxSourceChars: number;\n /** Zero selects deterministic-only operation. V1 issues at most one batch. */\n maxEvaluationsPerTurn: number;\n timeoutMs: number;\n}\n\nexport const DEFAULT_EXTRACTIVE_CONFIG: FabricExtractiveConfig = {\n enabled: false, provider: \"typesafe\", model: \"jev-latest\",\n maxViewBytes: 8192, maxCandidates: 128, maxSourceChars: 24000,\n maxEvaluationsPerTurn: 1, timeoutMs: 3000,\n};\n\nexport interface FabricMemoryConfig {\n extractive?: FabricExtractiveConfig;\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 /** Configured portable sources; present enables source-qualified calls. */\n sources?: FabricMemorySourceConfig[];\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 FabricThinkingConfig {\n /** Inclusive host/child thinking bounds; empty means the model's levels. */\n bounds: FabricThinkingBounds;\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 /** Registered tools full code mode keeps declared beside fabric_exec. */\n foreground: FabricForegroundConfig;\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 trace: FabricTraceConfig;\n schema: FabricSchemaConfig;\n speculation: FabricSpeculationConfig;\n thinking: FabricThinkingConfig;\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 jevFabric: { binary: \"\", home: \"\", timeoutMs: 3_600_000 },\n runtime: \"quickjs\",\n codemodeProfile: \"additive\",\n timeoutMs: 120_000,\n maxTimeoutMs: 900_000,\n hostCallTimeouts: {},\n humanWaitRefs: [\"extensions.ask\"],\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 nativeServers: [],\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-durable\",\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 modelAdmission: \"strict\",\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 pressureBands: { warn: 0.6, urgent: 0.8 },\n outputReserveTokens: 0,\n repairOrphans: true,\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 extractive: { ...DEFAULT_EXTRACTIVE_CONFIG },\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 trace: {\n assessment: false,\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 thinking: { bounds: {} },\n foreground: { tools: [], maxTools: 4 },\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\n// Inlined copy of RUNNER_ID_PATTERN (src/agents/runner-registry.ts) so config\n// never loads the runner registry; tests/runner-registry-graph.test.ts keeps it in sync.\nconst RUNNER_ID_PATTERN = /^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/;\n\n// A registered runner may load after config; launch fails closed if it never does.\nconst runnerValue = (value: unknown, fallback: FabricAgentRunner): FabricAgentRunner =>\n typeof value === \"string\" && value.length <= 64 && RUNNER_ID_PATTERN.test(value) ? value : fallback;\n\nconst modelAdmissionValue = (\n value: unknown,\n fallback: FabricModelAdmission,\n): FabricModelAdmission =>\n value === \"strict\" || value === \"permissive\" ? 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 humanWaitRefsValue = (value: unknown): string[] =>\n Array.isArray(value)\n ? [...new Set(value\n .filter((ref): ref is string => typeof ref === \"string\")\n .map((ref) => ref.trim())\n .filter((ref) => ref.length > 0 && ref.length <= 512))].slice(0, 256)\n : [...DEFAULT_FABRIC_CONFIG.executor.humanWaitRefs];\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\n// Bands are validated as a pair: any non-finite value or an ordering other\n// than 0 < warn < urgent < 1 falls back to the defaults as a whole.\nconst compactionPressureBandsValue = (\n value: unknown,\n fallback: FabricCompactionPressureBands,\n): FabricCompactionPressureBands => {\n const bands = objectValue(value);\n const warn = bands.warn === undefined ? fallback.warn : bands.warn;\n const urgent = bands.urgent === undefined ? fallback.urgent : bands.urgent;\n return typeof warn === \"number\"\n && typeof urgent === \"number\"\n && Number.isFinite(warn)\n && Number.isFinite(urgent)\n && warn > 0\n && warn < urgent\n && urgent < 1\n ? { warn, urgent }\n : { ...fallback };\n};\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\nconst MEMORY_SOURCE_ID_PATTERN = /^[a-z0-9][a-z0-9_.-]{0,127}$/;\n\n/**\n * Parse `memory.sources`. A wrong-typed value stays absent like every other\n * memory key, but a present array with malformed entries is a hard config\n * error: a silently dropped source would surface only as a confusing\n * `source_not_found` at call time. The id charset is the portable registry's\n * SOURCE_ID_PATTERN restricted to lowercase.\n */\nconst memorySourcesValue = (value: unknown): FabricMemorySourceConfig[] | undefined => {\n if (!Array.isArray(value)) return undefined;\n const sources: FabricMemorySourceConfig[] = [];\n const seen = new Set<string>();\n value.forEach((raw, index) => {\n const entry = objectValue(raw);\n const where = `memory.sources[${index}]`;\n const id = stringValue(entry.id);\n if (!id || !MEMORY_SOURCE_ID_PATTERN.test(id)) {\n throw new Error(\n `Invalid ${where}: id must be 1-128 chars of lowercase letters, digits, dot, underscore, or dash, starting with a letter or digit`,\n );\n }\n if (entry.kind !== \"fs\") {\n throw new Error(\n `Invalid ${where}: unknown kind ${JSON.stringify(entry.kind ?? null)}; expected \"fs\"`,\n );\n }\n const root = stringValue(entry.root);\n if (!root || !path.isAbsolute(root)) {\n throw new Error(`Invalid ${where}: root must be an absolute directory path`);\n }\n if (seen.has(id)) {\n throw new Error(`Invalid ${where}: duplicate source id ${JSON.stringify(id)}`);\n }\n seen.add(id);\n sources.push({ id, kind: \"fs\", root });\n });\n return sources.length > 0 ? sources : undefined;\n};\n\nexport const normalizeFabricConfig = (input: Record<string, unknown>): FabricConfig => {\n const executor = objectValue(input.executor);\n const cpython = objectValue(executor.cpython);\n const jevFabric = objectValue(executor.jevFabric);\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 extractive = objectValue(memory.extractive);\n const memorySources = memorySourcesValue(memory.sources);\n const entropy = objectValue(input.entropy);\n const repairs = objectValue(input.repairs);\n const trace = objectValue(input.trace);\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 approvalActions = approvalActionOverridesValue(approvals.actions);\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 jevFabric: {\n binary: stringValue(jevFabric.binary)?.trim() ?? DEFAULT_FABRIC_CONFIG.executor.jevFabric.binary,\n home: stringValue(jevFabric.home)?.trim() ?? \"\",\n timeoutMs: boundedInteger(jevFabric.timeoutMs, DEFAULT_FABRIC_CONFIG.executor.jevFabric.timeoutMs, 1_000, MAX_EXECUTOR_TIMEOUT_MS),\n },\n runtime: executorRuntime,\n codemodeProfile: executor.codemodeProfile === \"native\" ? \"native\" : \"additive\",\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 humanWaitRefs: humanWaitRefsValue(executor.humanWaitRefs),\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 ...(approvalActions ? { actions: approvalActions } : {}),\n ...(approvals.headless === \"decision\" ? { headless: \"decision\" as const } : {}),\n ...(approvals.headlessTimeoutMs === undefined ? {} : {\n headlessTimeoutMs: boundedInteger(approvals.headlessTimeoutMs, 300_000, 1_000, 86_400_000),\n }),\n },\n mcp: {\n enabled: booleanValue(mcp.enabled, DEFAULT_FABRIC_CONFIG.mcp.enabled),\n nativeServers: nativeMcpServersValue(mcp.nativeServers),\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 modelAdmission: modelAdmissionValue(\n agents.modelAdmission,\n DEFAULT_FABRIC_CONFIG.agents.modelAdmission,\n ),\n ...(stringValue(objectValue(agents.worktree).setup)\n ? { worktree: { setup: String(objectValue(agents.worktree).setup).trim() } }\n : {}),\n ...(agents.childQuestions === \"route\" ? { childQuestions: \"route\" as const } : {}),\n ...(agents.childQuestionTimeoutMs === undefined ? {} : {\n childQuestionTimeoutMs: boundedInteger(agents.childQuestionTimeoutMs, 600_000, 1_000, 86_400_000),\n }),\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 pressureBands: compactionPressureBandsValue(\n compaction.pressureBands,\n DEFAULT_FABRIC_CONFIG.compaction.pressureBands,\n ),\n outputReserveTokens: boundedInteger(\n compaction.outputReserveTokens,\n DEFAULT_FABRIC_CONFIG.compaction.outputReserveTokens,\n 0,\n MAX_COMPACTION_TOKEN_THRESHOLD,\n ),\n repairOrphans: booleanValue(\n compaction.repairOrphans,\n DEFAULT_FABRIC_CONFIG.compaction.repairOrphans,\n ),\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 extractive: {\n enabled: booleanValue(extractive.enabled, false),\n provider: stringValue(extractive.provider) || DEFAULT_EXTRACTIVE_CONFIG.provider,\n model: stringValue(extractive.model) || DEFAULT_EXTRACTIVE_CONFIG.model,\n maxViewBytes: boundedInteger(extractive.maxViewBytes, 8192, 1024, 32768),\n maxCandidates: boundedInteger(extractive.maxCandidates, 128, 1, 256),\n maxSourceChars: boundedInteger(extractive.maxSourceChars, 24000, 256, 100000),\n maxEvaluationsPerTurn: boundedInteger(extractive.maxEvaluationsPerTurn, 1, 0, 1),\n timeoutMs: boundedInteger(extractive.timeoutMs, 3000, 100, 10000),\n },\n enabled: booleanValue(memory.enabled, DEFAULT_FABRIC_CONFIG.memory.enabled),\n ...(memoryIndexDir ? { indexDir: memoryIndexDir } : {}),\n ...(memorySources ? { sources: memorySources } : {}),\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 trace: {\n assessment: booleanValue(trace.assessment, DEFAULT_FABRIC_CONFIG.trace.assessment),\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 thinking: {\n // Bounds are a ceiling policy: malformed values fail closed.\n bounds: normalizeThinkingBounds(objectValue(input.thinking).bounds, \"thinking.bounds\"),\n },\n // Malformed entries fail config loading; semantic refusals report at runtime.\n foreground: foregroundConfigValue(input.foreground),\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 const normalized = normalizeFabricConfig(merged);\n if (applyEnvironmentOverrides && process.env[FABRIC_THINKING_BOUNDS_ENV] !== undefined) {\n // A child only narrows its own bounds by the parent's; never widens them.\n const inherited = inheritedThinkingBounds();\n if (inherited) {\n normalized.thinking.bounds = intersectThinkingBounds(inherited, normalized.thinking.bounds);\n }\n }\n return normalized;\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 // Reject invalid ownership before the settings UI replaces a working file.\n // Do not normalize the whole document: saved layers must remain sparse.\n nativeMcpServersValue(objectValue(merged.mcp).nativeServers);\n approvalActionOverridesValue(objectValue(merged.approvals).actions);\n foregroundConfigValue(merged.foreground);\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 { PI_CORE_TOOL_NAME_SET } from \"./pi-tools.js\";\n\n/**\n * Foreground policy: registered tools full code mode keeps declared to the\n * model beside fabric_exec. It changes visibility only; a direct call takes\n * the same tool_call hooks and approval risk as `extensions.<name>`.\n */\nexport type FabricForegroundReason = \"turn-steering\" | \"human-input\" | \"context-control\" | \"skill-loading\";\nexport interface FabricForegroundTool { name: string; owner: string; reason: FabricForegroundReason }\nexport interface FabricForegroundConfig { tools: FabricForegroundTool[]; maxTools: number }\nexport type FabricForegroundRefusalReason =\n | \"enforce\" | \"managed-host\" | \"core\" | \"builtin\" | \"unknown\" | \"inactive\" | \"not-allowed\" | \"duplicate\" | \"cap\";\nexport interface FabricForegroundResolution {\n tools: readonly string[];\n refused: readonly { name: string; reason: FabricForegroundRefusalReason }[];\n}\n\nexport const MAX_FOREGROUND_TOOLS = 8;\nconst MAX_FOREGROUND_ENTRIES = 64;\nconst REASONS = new Set([\"turn-steering\", \"human-input\", \"context-control\", \"skill-loading\"]);\nconst NAME = /^[^\\s]{1,128}$/;\nconst isText = (value: unknown): value is string => typeof value === \"string\" && NAME.test(value);\n\n/** Parse `foreground`. Malformed entries are hard config errors, never dropped. */\nexport const foregroundConfigValue = (value: unknown): FabricForegroundConfig => {\n const input = typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {};\n const tools = input.tools ?? [];\n if (!Array.isArray(tools) || tools.length > MAX_FOREGROUND_ENTRIES) {\n throw new Error(`foreground.tools must be an array of at most ${MAX_FOREGROUND_ENTRIES} entries`);\n }\n const maxTools = input.maxTools ?? 4;\n if (!Number.isInteger(maxTools) || (maxTools as number) < 0 || (maxTools as number) > MAX_FOREGROUND_TOOLS) {\n throw new Error(`foreground.maxTools must be an integer from 0 to ${MAX_FOREGROUND_TOOLS}`);\n }\n return {\n maxTools: maxTools as number,\n tools: tools.map((entry: unknown, index) => {\n const { name, owner, reason } = (entry ?? {}) as Record<string, unknown>;\n if (!isText(name) || name === \"fabric_exec\" || !isText(owner) || !REASONS.has(reason as string)) {\n throw new Error(\n `Invalid foreground.tools[${index}]: expected { name, owner, reason: ${[...REASONS].join(\" | \")} }`,\n );\n }\n return { name, owner, reason: reason as FabricForegroundReason };\n }),\n };\n};\n\nexport const NO_FOREGROUND: FabricForegroundResolution = { tools: [], refused: [] };\n\n/** Resolve the declared set in policy order; every skipped entry is reported. */\nexport const resolveForegroundTools = (input: {\n policy: FabricForegroundConfig;\n mode: \"full-code\" | \"enforce\" | \"orchestration\";\n managedHost?: boolean;\n registered: readonly { name: string; exposure?: string; sourceInfo?: { source: string } }[];\n active: ReadonlySet<string>;\n allowlist?: ReadonlySet<string> | undefined;\n}): FabricForegroundResolution => {\n const { policy } = input;\n // Orchestration already declares Pi's active set; the policy has nothing to add.\n if (policy.tools.length === 0 || input.mode === \"orchestration\") return NO_FOREGROUND;\n const blanket = input.mode === \"enforce\" ? \"enforce\" : input.managedHost ? \"managed-host\" : undefined;\n if (blanket) return { tools: [], refused: policy.tools.map(({ name }) => ({ name, reason: blanket })) };\n const registered = new Map(input.registered.map((tool) => [tool.name, tool]));\n const tools: string[] = [];\n const refused: { name: string; reason: FabricForegroundRefusalReason }[] = [];\n const seen = new Set<string>();\n for (const { name } of policy.tools) {\n const tool = registered.get(name);\n const reason: FabricForegroundRefusalReason | undefined =\n PI_CORE_TOOL_NAME_SET.has(name) ? \"core\"\n : seen.has(name) ? \"duplicate\"\n : !tool || tool.exposure === \"hidden\" ? \"unknown\"\n : tool.sourceInfo?.source === \"builtin\" ? \"builtin\"\n : input.allowlist && !input.allowlist.has(name) ? \"not-allowed\"\n : !input.active.has(name) ? \"inactive\"\n : tools.length >= policy.maxTools ? \"cap\"\n : undefined;\n seen.add(name);\n if (reason) refused.push({ name, reason });\n else tools.push(name);\n }\n return { tools, refused };\n};\n\n/** One line for the session notice and `/fabric status`. */\nexport const formatForeground = ({ tools, refused }: FabricForegroundResolution): string =>\n (refused.length > 0 ? `refused ${refused.map(({ name, reason }) => `${name} (${reason})`).join(\", \")}; ` : \"\") +\n `declared ${tools.length > 0 ? tools.join(\", \") : \"fabric_exec only\"}`;\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", "mergeObjects", "path", "fs"]
7
+ }
@@ -8,7 +8,7 @@ import {
8
8
  agentParticipantRecords,
9
9
  loadModelUsage,
10
10
  useBudgetLedger
11
- } from "./chunk-DRY66JKC.js";
11
+ } from "./chunk-2W2DTC45.js";
12
12
  import {
13
13
  MeshStore
14
14
  } from "./chunk-3GJJG2FV.js";
@@ -815,4 +815,4 @@ export {
815
815
  residentIdleDecision,
816
816
  runResidentHostFromConfigPath
817
817
  };
818
- //# sourceMappingURL=chunk-YBK4MDZW.js.map
818
+ //# sourceMappingURL=chunk-DD3B7UU6.js.map
@@ -2,10 +2,10 @@ import {
2
2
  MEMORY_SOURCE_INTERFACE_VERSION,
3
3
  createMemorySourceRegistry,
4
4
  defineMemorySource
5
- } from "./chunk-TJGIC767.js";
5
+ } from "./chunk-M5IN6DMF.js";
6
6
  import {
7
7
  readSessionHeader
8
- } from "./chunk-ECPZOET7.js";
8
+ } from "./chunk-WREA4RNR.js";
9
9
 
10
10
  // src/memory/fs-source.ts
11
11
  import crypto from "node:crypto";
@@ -159,4 +159,4 @@ export {
159
159
  createFileSystemMemorySource,
160
160
  createConfiguredMemorySourceRegistry
161
161
  };
162
- //# sourceMappingURL=chunk-TGJ3GJDM.js.map
162
+ //# sourceMappingURL=chunk-DZ4WN5XJ.js.map
@@ -17,11 +17,11 @@ import {
17
17
  import {
18
18
  sessionDirForCwd,
19
19
  sessionsDirRoot
20
- } from "./chunk-PM6O2JUK.js";
20
+ } from "./chunk-M6IRQ3QT.js";
21
21
  import {
22
22
  FABRIC_EXECUTION_TRACE_KIND,
23
23
  readFabricExecutionTraceV1
24
- } from "./chunk-3AOVGNQF.js";
24
+ } from "./chunk-ZXKYU6CH.js";
25
25
  import {
26
26
  MAX_NORMAL_FORM_PLANS,
27
27
  applyNormalFormPlan,
@@ -1902,4 +1902,4 @@ export {
1902
1902
  sessionWindowEvidence,
1903
1903
  runEntropyTrial
1904
1904
  };
1905
- //# sourceMappingURL=chunk-YWFZOYLG.js.map
1905
+ //# sourceMappingURL=chunk-FB24AOIJ.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-XENCLZGL.js";
4
+ } from "./chunk-PF27MQY5.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-VIHHAY4Y.js.map
287
+ //# sourceMappingURL=chunk-GC2AUXG6.js.map
@@ -1,9 +1,9 @@
1
+ import {
2
+ transpileFabricCodeWithSourceMap
3
+ } from "./chunk-P4KH4S4S.js";
1
4
  import {
2
5
  HumanWaitDeadlinePause
3
6
  } from "./chunk-7QKKLBHJ.js";
4
- import {
5
- transpileFabricCodeWithSourceMap
6
- } from "./chunk-N5GUXC6F.js";
7
7
  import {
8
8
  PI_ARGUMENT_NORMALIZATION_SOURCE
9
9
  } from "./chunk-6KO2LEOO.js";
@@ -123,6 +123,18 @@ globalThis.ALL_TOOLS = Object.freeze([]);
123
123
  globalThis.searchTools = (query, options = {}) => __call("fabric.$nativeSearch", { query, ...options });
124
124
  globalThis.describeTool = name => __call("fabric.$nativeDescribe", { name });
125
125
  globalThis.describeNamespace = name => __call("fabric.$describeNamespace", { name });
126
+ let __nativeAllTools = Object.freeze([]);
127
+ globalThis.nativeDiscovery = Object.freeze({
128
+ get ALL_TOOLS() { return __nativeAllTools; },
129
+ searchTools: (query, options = {}) => __call("fabric.$piSearch", { query, ...options }),
130
+ describeTool: name => __call("fabric.$piDescribe", { name }),
131
+ describeNamespace: name => __call("fabric.$piNamespace", { name }),
132
+ });
133
+ if (typeof __nativeProfile !== "undefined" && __nativeProfile) {
134
+ globalThis.searchTools = globalThis.nativeDiscovery.searchTools;
135
+ globalThis.describeTool = globalThis.nativeDiscovery.describeTool;
136
+ globalThis.describeNamespace = globalThis.nativeDiscovery.describeNamespace;
137
+ }
126
138
  const __exit = Object.freeze({});
127
139
  let __storeValues;
128
140
  let __storeDirty = false;
@@ -176,8 +188,14 @@ globalThis.image = value => {
176
188
  };
177
189
  globalThis.exit = () => { throw __exit; };
178
190
  globalThis.__fabricRun = async (main) => {
191
+ if (typeof __nativeToolsEnabled !== "undefined" && __nativeToolsEnabled) {
192
+ __nativeAllTools = Object.freeze(await __call("fabric.$piAllTools", {}));
193
+ for (const tool of __nativeAllTools) __nativeToolNames.add(tool.name);
194
+ __nativeCatalogReady = true;
195
+ if (__nativeProfile) globalThis.ALL_TOOLS = __nativeAllTools;
196
+ }
179
197
  if (typeof __nativeStoreEnabled !== "undefined" && __nativeStoreEnabled) {
180
- globalThis.ALL_TOOLS = Object.freeze(await __call("fabric.$allTools", {}));
198
+ if (!(typeof __nativeProfile !== "undefined" && __nativeProfile)) globalThis.ALL_TOOLS = Object.freeze(await __call("fabric.$allTools", {}));
181
199
  try { __storeValues = Object.assign(Object.create(null), await __call("native.load", {})); }
182
200
  catch (error) { __storeError = error; }
183
201
  }
@@ -218,7 +236,7 @@ var quickJsModule = () => {
218
236
  quickJsModulePromise ??= newQuickJSWASMModuleFromVariant(releaseSyncVariant);
219
237
  return quickJsModulePromise;
220
238
  };
221
- var guestSetupSource = (fields, nativeStoreEnabled = false) => `const __piCanonicalFields = ${JSON.stringify(fields ?? {})}; const __nativeStoreEnabled = ${nativeStoreEnabled};
239
+ var guestSetupSource = (fields, nativeStoreEnabled = false, profile = "additive", nativeToolsEnabled = false) => `const __piCanonicalFields = ${JSON.stringify(fields ?? {})}; const __nativeStoreEnabled = ${nativeStoreEnabled}; const __nativeProfile = ${profile === "native"}; const __nativeToolsEnabled = ${nativeToolsEnabled};
222
240
  ${GUEST_SETUP}`;
223
241
  var GUEST_SETUP = `
224
242
  (() => {
@@ -245,7 +263,6 @@ const __call = async (ref, args) => {
245
263
  __recordSuccessfulCall(ref, normalizedArgs);
246
264
  return value;
247
265
  };
248
- const __piToolNames = ["read","bash","powershell","edit","write","grep","find","ls"];
249
266
  const __toolsBase = {
250
267
  providers: () => __call("fabric.$providers", {}),
251
268
  catalog: (args = {}) => __call("fabric.$catalog", args),
@@ -260,26 +277,28 @@ const __toolsBase = {
260
277
  models: () => __call("fabric.$models", {}),
261
278
  };
262
279
  ${NATIVE_CODEMODE_GUEST}
263
- // tools is discovery + generic calls only. The proxy keeps the seven discovery
264
- // methods and turns a core-tool name (read/bash/edit/...) into an actionable
265
- // error pointing at pi.<name>, so a model that writes tools.read(...) learns
266
- // the fix in one turn instead of looping on "tools.read is not a function".
267
- globalThis.tools = new Proxy(__toolsBase, {
280
+ const __nativeToolNames = new Set();
281
+ let __nativeCatalogReady = false;
282
+ globalThis.nativeTools = new Proxy(Object.create(null), {
283
+ get(_target, property) {
284
+ if (typeof property === "symbol" || (__nativeCatalogReady ? !__nativeToolNames.has(property) : property === "then")) return undefined;
285
+ return args => __call("fabric.$nativeTool", { name: String(property), args: args === undefined ? {} : args });
286
+ },
287
+ ownKeys() { return [...__nativeToolNames]; },
288
+ getOwnPropertyDescriptor(_target, property) { return __nativeToolNames.has(property) ? {enumerable:true, configurable:true} : undefined; },
289
+ set() { return true; },
290
+ deleteProperty() { return true; },
291
+ });
292
+ const __fabricTools = new Proxy(__toolsBase, {
268
293
  get(target, property) {
269
294
  if (property === "then" || typeof property === "symbol") return undefined;
270
- const name = String(property);
271
- if (__piToolNames.indexOf(name) >= 0) {
272
- return () => {
273
- throw new Error(
274
- "tools." + name + " is not available on the discovery API. tools is discovery + generic calls only (providers/catalog/list/search/describe/call/models). For the Pi core tool, call pi." + name + "(args), e.g. pi." + name + "({ ... })."
275
- );
276
- };
277
- }
278
- return target[property];
295
+ return Object.prototype.hasOwnProperty.call(target, property) ? target[property] : globalThis.nativeTools[property];
279
296
  },
280
297
  set() { return true; },
281
298
  deleteProperty() { return true; },
282
299
  });
300
+ globalThis.fabric = Object.freeze({ tools: __fabricTools });
301
+ globalThis.tools = typeof __nativeProfile !== "undefined" && __nativeProfile ? globalThis.nativeTools : __fabricTools;
283
302
  const __piStringFields = { bash: "command", powershell: "command", read: "path", ls: "path", grep: "pattern", find: "pattern" };
284
303
  // Object aliases and coercions are shared with host preparation in core/pi-arguments.ts.
285
304
 
@@ -1191,7 +1210,7 @@ var QuickJsRuntime = class {
1191
1210
  context.setProp(context.global, "__fabricTokenBudget", tokenBudget);
1192
1211
  tokenBudget.dispose();
1193
1212
  cpuDeadlineAt = Date.now() + (options.maxCpuSliceMs ?? Infinity);
1194
- const setupResult = context.evalCode(guestSetupSource(options.piToolCanonicalFields, options.nativeStoreEnabled), "pi-fabric-setup.js");
1213
+ const setupResult = context.evalCode(guestSetupSource(options.piToolCanonicalFields, options.nativeStoreEnabled, options.codemodeProfile, options.nativeToolsEnabled), "pi-fabric-setup.js");
1195
1214
  if (setupResult.error) {
1196
1215
  const deadlineExceeded = interruptedByDeadline || interruptedByCpu || Date.now() > executionDeadlineAt;
1197
1216
  if (deadlineExceeded) timedOut = true;
@@ -1338,4 +1357,4 @@ export {
1338
1357
  GUEST_SETUP,
1339
1358
  QuickJsRuntime
1340
1359
  };
1341
- //# sourceMappingURL=chunk-ZL4UD4PW.js.map
1360
+ //# sourceMappingURL=chunk-JO3EEBTY.js.map