pi-fabric 0.108.1 → 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.
- package/README.md +1 -1
- package/dist/chunks/{chunk-DRY66JKC.js → chunk-2W2DTC45.js} +3 -3
- package/dist/chunks/{chunk-JIZFEZK2.js → chunk-BVJBYFHD.js} +2 -2
- package/dist/chunks/{chunk-UNKE4WWQ.js → chunk-CZPQTISQ.js} +3 -1
- package/dist/chunks/chunk-CZPQTISQ.js.map +7 -0
- package/dist/chunks/{chunk-YBK4MDZW.js → chunk-DD3B7UU6.js} +2 -2
- package/dist/chunks/{chunk-TGJ3GJDM.js → chunk-DZ4WN5XJ.js} +3 -3
- package/dist/chunks/{chunk-YWFZOYLG.js → chunk-FB24AOIJ.js} +3 -3
- package/dist/chunks/{chunk-VIHHAY4Y.js → chunk-GC2AUXG6.js} +2 -2
- package/dist/chunks/{chunk-ZL4UD4PW.js → chunk-JO3EEBTY.js} +41 -22
- package/dist/chunks/chunk-JO3EEBTY.js.map +7 -0
- package/dist/chunks/chunk-K6QXUGS5.js +30 -0
- package/dist/chunks/chunk-K6QXUGS5.js.map +7 -0
- package/dist/chunks/{chunk-VAON7IER.js → chunk-LOLCTWJF.js} +2 -2
- package/dist/chunks/{chunk-TJGIC767.js → chunk-M5IN6DMF.js} +4 -4
- package/dist/chunks/{chunk-PM6O2JUK.js → chunk-M6IRQ3QT.js} +2 -2
- package/dist/chunks/{chunk-OGORILCT.js → chunk-N2VKKA7O.js} +2 -2
- package/dist/chunks/{chunk-N5GUXC6F.js → chunk-P4KH4S4S.js} +2 -1
- package/dist/chunks/chunk-P4KH4S4S.js.map +7 -0
- package/dist/chunks/{chunk-XENCLZGL.js → chunk-PF27MQY5.js} +10 -1
- package/dist/chunks/chunk-PF27MQY5.js.map +7 -0
- package/dist/chunks/{chunk-MARGFSUE.js → chunk-PHXSUD52.js} +2 -2
- package/dist/chunks/{chunk-YRDCJZZW.js → chunk-RUO6L7RM.js} +1 -1
- package/dist/chunks/{chunk-YRDCJZZW.js.map → chunk-RUO6L7RM.js.map} +1 -1
- package/dist/chunks/{chunk-UPBP2YII.js → chunk-S3IRPDSO.js} +2 -2
- package/dist/chunks/{chunk-AM6BRWYQ.js → chunk-SZCQA7FY.js} +25 -25
- package/dist/chunks/chunk-SZCQA7FY.js.map +7 -0
- package/dist/chunks/{chunk-RIVYOW5Q.js → chunk-T5CU2GPZ.js} +2 -2
- package/dist/chunks/{chunk-UZMHGK2T.js → chunk-THRQMRC3.js} +6 -6
- package/dist/chunks/{chunk-UZMHGK2T.js.map → chunk-THRQMRC3.js.map} +2 -2
- package/dist/chunks/{chunk-5QMCSJ42.js → chunk-UXEMIWYI.js} +5 -5
- package/dist/chunks/{chunk-5QMCSJ42.js.map → chunk-UXEMIWYI.js.map} +2 -2
- package/dist/chunks/{chunk-SGFH5PYA.js → chunk-V2SKDVQX.js} +10 -9
- package/dist/chunks/chunk-V2SKDVQX.js.map +7 -0
- package/dist/chunks/{chunk-4O3PFVTC.js → chunk-VTK2FEH7.js} +2 -2
- package/dist/chunks/{chunk-4O3PFVTC.js.map → chunk-VTK2FEH7.js.map} +2 -2
- package/dist/chunks/{chunk-ECPZOET7.js → chunk-WREA4RNR.js} +2 -2
- package/dist/chunks/{chunk-JLBNPM4W.js → chunk-WYUV6WL3.js} +2 -2
- package/dist/chunks/{chunk-T6KZBPQE.js → chunk-X2TRSE7D.js} +2 -2
- package/dist/chunks/{chunk-3AOVGNQF.js → chunk-ZXKYU6CH.js} +4 -4
- package/dist/compaction/hook.js +4 -4
- package/dist/compaction/owner.js +5 -5
- package/dist/components/configuration.js +2 -2
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/core/action-registry.js +4 -4
- package/dist/core/native-tool-names.d.ts +9 -0
- package/dist/core/native-tool-names.d.ts.map +1 -0
- package/dist/core/native-tool-result.d.ts +11 -0
- package/dist/core/native-tool-result.d.ts.map +1 -0
- package/dist/core/system-guidance.d.ts +3 -3
- package/dist/core/system-guidance.d.ts.map +1 -1
- package/dist/entropy/index.js +6 -6
- package/dist/execution-service.d.ts.map +1 -1
- package/dist/extension-bootstrap.js +10 -10
- package/dist/fabric-runtime-state.d.ts.map +1 -1
- package/dist/fabric-runtime-state.js +169 -64
- package/dist/fabric-runtime-state.js.map +4 -4
- package/dist/index.js +13 -13
- package/dist/jev.js +4 -4
- package/dist/mcp.js +1 -1
- package/dist/memory/discovery.js +5 -5
- package/dist/memory/file-worker.js +7 -7
- package/dist/memory/normalize.js +4 -4
- package/dist/memory/search.js +5 -5
- package/dist/memory/worker-provider.js +8 -8
- package/dist/memory.js +8 -8
- package/dist/native-codemode.d.ts +1 -1
- package/dist/native-codemode.d.ts.map +1 -1
- package/dist/native-image-artifacts.d.ts +4 -0
- package/dist/native-image-artifacts.d.ts.map +1 -0
- package/dist/native-image-artifacts.js +18 -0
- package/dist/native-image-artifacts.js.map +7 -0
- package/dist/native-tool-catalog.d.ts +21 -0
- package/dist/native-tool-catalog.d.ts.map +1 -0
- package/dist/native-tool-catalog.js +71 -0
- package/dist/native-tool-catalog.js.map +7 -0
- package/dist/protocol.d.ts +2 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +1 -1
- package/dist/providers/captured-tools-provider.d.ts +1 -1
- package/dist/providers/captured-tools-provider.d.ts.map +1 -1
- package/dist/providers/jev-provider.js +4 -4
- package/dist/providers/mcp-provider.d.ts +1 -1
- package/dist/providers/mcp-provider.d.ts.map +1 -1
- package/dist/providers/memory-provider.js +7 -7
- package/dist/providers/pi-native-mcp.d.ts.map +1 -1
- package/dist/providers/pi-tools-provider.d.ts.map +1 -1
- package/dist/residency/host.js +7 -7
- package/dist/residency/pi-entry.js +7 -7
- package/dist/runtime/core-override-guest-types.js +2 -2
- package/dist/runtime/dynamic-guest-types.d.ts +1 -1
- package/dist/runtime/dynamic-guest-types.d.ts.map +1 -1
- package/dist/runtime/dynamic-guest-types.js +1 -1
- package/dist/runtime/guest-types.d.ts +1 -1
- package/dist/runtime/guest-types.d.ts.map +1 -1
- package/dist/runtime/guest-types.js +1 -1
- package/dist/runtime/kernel.d.ts +2 -0
- package/dist/runtime/kernel.d.ts.map +1 -1
- package/dist/runtime/monty-runtime.js +1 -1
- package/dist/runtime/native-codemode-guest.d.ts.map +1 -1
- package/dist/runtime/native-codemode-types.d.ts +1 -1
- package/dist/runtime/native-codemode-types.d.ts.map +1 -1
- package/dist/runtime/node-process-runtime.js +3 -3
- package/dist/runtime/quickjs-runtime.d.ts +1 -1
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +2 -2
- package/dist/runtime/type-checker.d.ts +2 -0
- package/dist/runtime/type-checker.d.ts.map +1 -1
- package/dist/runtime/type-checker.js +5 -3
- package/dist/runtime/typescript-kernel.d.ts +1 -1
- package/dist/runtime/typescript-kernel.d.ts.map +1 -1
- package/dist/runtime/typescript-kernel.js +14 -12
- package/dist/runtime/typescript-kernel.js.map +2 -2
- package/dist/runtime-state-speculation.d.ts +4 -1
- package/dist/runtime-state-speculation.d.ts.map +1 -1
- package/dist/speculation/scanner.d.ts +2 -0
- package/dist/speculation/scanner.d.ts.map +1 -1
- package/dist/speculation/scanner.js +18 -4
- package/dist/speculation/scanner.js.map +2 -2
- package/dist/speculation/types.d.ts +1 -0
- package/dist/speculation/types.d.ts.map +1 -1
- package/dist/type-error-guidance.js +1 -1
- package/dist/ui/conversation.js +3 -3
- package/dist/ui/dashboard.js +9 -9
- package/dist/ui/settings-sections-execution.d.ts.map +1 -1
- package/dist/ui/settings.js +5 -1
- package/dist/ui/settings.js.map +2 -2
- package/docs/codemode-parity.md +72 -25
- package/docs/configuration.md +4 -0
- package/docs/speculation.md +7 -1
- package/package.json +1 -1
- package/skillsets/typescript/fabric-exec/SKILL.md +1 -1
- package/dist/chunks/chunk-AM6BRWYQ.js.map +0 -7
- package/dist/chunks/chunk-N5GUXC6F.js.map +0 -7
- package/dist/chunks/chunk-SGFH5PYA.js.map +0 -7
- package/dist/chunks/chunk-UNKE4WWQ.js.map +0 -7
- package/dist/chunks/chunk-XENCLZGL.js.map +0 -7
- package/dist/chunks/chunk-ZL4UD4PW.js.map +0 -7
- /package/dist/chunks/{chunk-DRY66JKC.js.map → chunk-2W2DTC45.js.map} +0 -0
- /package/dist/chunks/{chunk-JIZFEZK2.js.map → chunk-BVJBYFHD.js.map} +0 -0
- /package/dist/chunks/{chunk-YBK4MDZW.js.map → chunk-DD3B7UU6.js.map} +0 -0
- /package/dist/chunks/{chunk-TGJ3GJDM.js.map → chunk-DZ4WN5XJ.js.map} +0 -0
- /package/dist/chunks/{chunk-YWFZOYLG.js.map → chunk-FB24AOIJ.js.map} +0 -0
- /package/dist/chunks/{chunk-VIHHAY4Y.js.map → chunk-GC2AUXG6.js.map} +0 -0
- /package/dist/chunks/{chunk-VAON7IER.js.map → chunk-LOLCTWJF.js.map} +0 -0
- /package/dist/chunks/{chunk-TJGIC767.js.map → chunk-M5IN6DMF.js.map} +0 -0
- /package/dist/chunks/{chunk-PM6O2JUK.js.map → chunk-M6IRQ3QT.js.map} +0 -0
- /package/dist/chunks/{chunk-OGORILCT.js.map → chunk-N2VKKA7O.js.map} +0 -0
- /package/dist/chunks/{chunk-MARGFSUE.js.map → chunk-PHXSUD52.js.map} +0 -0
- /package/dist/chunks/{chunk-UPBP2YII.js.map → chunk-S3IRPDSO.js.map} +0 -0
- /package/dist/chunks/{chunk-RIVYOW5Q.js.map → chunk-T5CU2GPZ.js.map} +0 -0
- /package/dist/chunks/{chunk-ECPZOET7.js.map → chunk-WREA4RNR.js.map} +0 -0
- /package/dist/chunks/{chunk-JLBNPM4W.js.map → chunk-WYUV6WL3.js.map} +0 -0
- /package/dist/chunks/{chunk-T6KZBPQE.js.map → chunk-X2TRSE7D.js.map} +0 -0
- /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):
|
|
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-
|
|
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-
|
|
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-
|
|
7784
|
+
//# sourceMappingURL=chunk-2W2DTC45.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MemoryProvider
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
5
|
+
} from "./chunk-M5IN6DMF.js";
|
|
6
6
|
import {
|
|
7
7
|
readSessionHeader
|
|
8
|
-
} from "./chunk-
|
|
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-
|
|
162
|
+
//# sourceMappingURL=chunk-DZ4WN5XJ.js.map
|
|
@@ -17,11 +17,11 @@ import {
|
|
|
17
17
|
import {
|
|
18
18
|
sessionDirForCwd,
|
|
19
19
|
sessionsDirRoot
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-M6IRQ3QT.js";
|
|
21
21
|
import {
|
|
22
22
|
FABRIC_EXECUTION_TRACE_KIND,
|
|
23
23
|
readFabricExecutionTraceV1
|
|
24
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
-
|
|
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-
|
|
1360
|
+
//# sourceMappingURL=chunk-JO3EEBTY.js.map
|