pi-fabric 0.96.4 → 0.98.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +1 -0
  2. package/THIRD_PARTY_NOTICES.md +5 -4
  3. package/dist/agents.js +3 -3
  4. package/dist/cache/leases.d.ts +24 -0
  5. package/dist/cache/leases.d.ts.map +1 -0
  6. package/dist/cache/observations.d.ts +8 -0
  7. package/dist/cache/observations.d.ts.map +1 -0
  8. package/dist/cache/types.d.ts +68 -0
  9. package/dist/cache/types.d.ts.map +1 -0
  10. package/dist/chunks/{chunk-JCV54SSP.js → chunk-27ORW5EK.js} +41 -22
  11. package/dist/chunks/chunk-27ORW5EK.js.map +7 -0
  12. package/dist/chunks/{chunk-QFKHAAZA.js → chunk-43MBJKT6.js} +4 -4
  13. package/dist/chunks/{chunk-GGETIGM5.js → chunk-7WEYUJCF.js} +6 -3
  14. package/dist/chunks/chunk-7WEYUJCF.js.map +7 -0
  15. package/dist/chunks/{chunk-LNLQ2LX3.js → chunk-ASU53MOT.js} +2 -2
  16. package/dist/chunks/{chunk-ZTXZ6JDO.js → chunk-CDLOYMVO.js} +2 -2
  17. package/dist/chunks/{chunk-754HA6KO.js → chunk-CFVBGKBX.js} +2 -2
  18. package/dist/chunks/{chunk-FJSHRHOR.js → chunk-CPSPZGK4.js} +6 -6
  19. package/dist/chunks/{chunk-UBPFGMDQ.js → chunk-CXQF35XB.js} +4 -4
  20. package/dist/chunks/{chunk-EBWMC3OO.js → chunk-EH26JJCE.js} +2 -2
  21. package/dist/chunks/{chunk-3SIXBW6A.js → chunk-H4YYLQTX.js} +2 -2
  22. package/dist/chunks/{chunk-CSJSHBAT.js → chunk-I5VN6D5T.js} +48 -21
  23. package/dist/chunks/chunk-I5VN6D5T.js.map +7 -0
  24. package/dist/chunks/{chunk-PMSIZLV6.js → chunk-IUCEIYLV.js} +2 -1
  25. package/dist/chunks/chunk-IUCEIYLV.js.map +7 -0
  26. package/dist/chunks/{chunk-VRYEGVHR.js → chunk-J7ZQERKA.js} +11 -8
  27. package/dist/chunks/chunk-J7ZQERKA.js.map +7 -0
  28. package/dist/chunks/{chunk-D4B4CCTA.js → chunk-JHQDS6YP.js} +2 -2
  29. package/dist/chunks/{chunk-V3PIO7QL.js → chunk-JMZZ6OKM.js} +1 -42
  30. package/dist/chunks/chunk-JMZZ6OKM.js.map +7 -0
  31. package/dist/chunks/{chunk-OINADFEF.js → chunk-JWWGWUP7.js} +5 -5
  32. package/dist/chunks/{chunk-WXSELMFV.js → chunk-KFPUVFDS.js} +5 -5
  33. package/dist/chunks/{chunk-X3IRR7CV.js → chunk-M25A5R3F.js} +2 -2
  34. package/dist/chunks/{chunk-OUAC6O5C.js → chunk-M7FGAVKW.js} +11 -11
  35. package/dist/chunks/chunk-MNTJX4U7.js +760 -0
  36. package/dist/chunks/chunk-MNTJX4U7.js.map +7 -0
  37. package/dist/chunks/chunk-O4A5UOXU.js +44 -0
  38. package/dist/chunks/chunk-O4A5UOXU.js.map +7 -0
  39. package/dist/chunks/{chunk-VQGO4P7C.js → chunk-QIW7QMFI.js} +2 -2
  40. package/dist/chunks/{chunk-B4HECUJI.js → chunk-RUEKYUNR.js} +2 -2
  41. package/dist/chunks/{chunk-B2IVWASP.js → chunk-SG443DA4.js} +2 -2
  42. package/dist/chunks/{chunk-3CJETB4S.js → chunk-UGMLWBVF.js} +390 -228
  43. package/dist/chunks/chunk-UGMLWBVF.js.map +7 -0
  44. package/dist/chunks/{chunk-ZRI433JP.js → chunk-USBUNTLW.js} +241 -70
  45. package/dist/chunks/chunk-USBUNTLW.js.map +7 -0
  46. package/dist/chunks/{chunk-ULQFHZJE.js → chunk-VFLAWZQR.js} +37 -1
  47. package/dist/chunks/{chunk-ULQFHZJE.js.map → chunk-VFLAWZQR.js.map} +2 -2
  48. package/dist/chunks/{chunk-Y57UHPIK.js → chunk-VRAGOMN4.js} +3 -1
  49. package/dist/chunks/chunk-VRAGOMN4.js.map +7 -0
  50. package/dist/chunks/{chunk-2A2NWQ36.js → chunk-WGGUZMQ4.js} +2 -2
  51. package/dist/chunks/{chunk-G2F2RDZI.js → chunk-YAPDV6LO.js} +2 -2
  52. package/dist/chunks/{chunk-Q5BMTL6A.js → chunk-YIEK7FH2.js} +4 -4
  53. package/dist/chunks/{chunk-KS44WKJJ.js → chunk-Z45SUO4B.js} +2 -2
  54. package/dist/commands/fabric.d.ts.map +1 -1
  55. package/dist/compaction/hook.js +6 -6
  56. package/dist/components/provider-component.d.ts +1 -1
  57. package/dist/components/provider-component.d.ts.map +1 -1
  58. package/dist/core/action-registry.js +7 -7
  59. package/dist/core/file-lock.d.ts +4 -0
  60. package/dist/core/file-lock.d.ts.map +1 -1
  61. package/dist/core/provider-operations.js +162 -51
  62. package/dist/core/provider-operations.js.map +2 -2
  63. package/dist/core/shell-timing.d.ts +11 -0
  64. package/dist/core/shell-timing.d.ts.map +1 -0
  65. package/dist/entropy/index.js +12 -10
  66. package/dist/entropy/pool-store.d.ts +3 -1
  67. package/dist/entropy/pool-store.d.ts.map +1 -1
  68. package/dist/fabric-runtime-state.d.ts.map +1 -1
  69. package/dist/fabric-runtime-state.js +607 -196
  70. package/dist/fabric-runtime-state.js.map +4 -4
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +119 -53
  73. package/dist/index.js.map +3 -3
  74. package/dist/jev/observation.js +5 -5
  75. package/dist/jev.js +8 -8
  76. package/dist/memory/digest.js +2 -2
  77. package/dist/memory/discovery.js +6 -6
  78. package/dist/memory/file-worker.js +9 -9
  79. package/dist/memory/normalize.js +5 -5
  80. package/dist/memory/search.js +7 -7
  81. package/dist/memory/worker-provider.js +10 -10
  82. package/dist/memory.js +9 -9
  83. package/dist/prewalk/messages.d.ts +1 -1
  84. package/dist/prewalk/messages.d.ts.map +1 -1
  85. package/dist/protocol.d.ts +13 -0
  86. package/dist/protocol.d.ts.map +1 -1
  87. package/dist/protocol.js +3 -1
  88. package/dist/providers/cache-provider.d.ts +16 -0
  89. package/dist/providers/cache-provider.d.ts.map +1 -0
  90. package/dist/providers/jev-provider.js +8 -8
  91. package/dist/providers/memory-provider.js +9 -9
  92. package/dist/providers/prewalk-provider.d.ts +3 -3
  93. package/dist/providers/prewalk-provider.d.ts.map +1 -1
  94. package/dist/residency/host.js +8 -8
  95. package/dist/residency/pi-entry.js +8 -8
  96. package/dist/runtime/core-override-guest-types.js +2 -2
  97. package/dist/runtime/cpython-runtime.js +1 -1
  98. package/dist/runtime/cpython-runtime.js.map +1 -1
  99. package/dist/runtime/guest-types.d.ts +1 -1
  100. package/dist/runtime/guest-types.d.ts.map +1 -1
  101. package/dist/runtime/guest-types.js +1 -1
  102. package/dist/runtime/monty-runtime.js +1 -1
  103. package/dist/runtime/monty-runtime.js.map +2 -2
  104. package/dist/runtime/node-process-runtime.js +2 -2
  105. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  106. package/dist/runtime/quickjs-runtime.js +1 -1
  107. package/dist/runtime/typescript-kernel.js +4 -4
  108. package/dist/runtime-state-builtins.d.ts.map +1 -1
  109. package/dist/schema/policy.d.ts.map +1 -1
  110. package/dist/ui/conversation.d.ts +2 -1
  111. package/dist/ui/conversation.d.ts.map +1 -1
  112. package/dist/ui/conversation.js +41 -37
  113. package/dist/ui/conversation.js.map +2 -2
  114. package/dist/ui/dashboard.js +10 -8
  115. package/dist/ui/dashboard.js.map +1 -1
  116. package/dist/ui/fabric-model-selector.d.ts +3 -0
  117. package/dist/ui/fabric-model-selector.d.ts.map +1 -1
  118. package/dist/ui/settings.js +1 -1
  119. package/dist/ui/shell-tasks.d.ts +2 -1
  120. package/dist/ui/shell-tasks.d.ts.map +1 -1
  121. package/dist/ui/shell-tasks.js +169 -81
  122. package/dist/ui/shell-tasks.js.map +3 -3
  123. package/dist/verified/generated/authority-kernel.js +188 -81
  124. package/dist/verified/generated/kernel.js +547 -265
  125. package/dist/verified/generated/lifecycle-kernel.d.ts +1 -1
  126. package/dist/verified/generated/lifecycle-kernel.js +172 -125
  127. package/dist/verified/generated/manifest.json +11 -11
  128. package/dist/verified/generated/provider-kernel.js +160 -52
  129. package/dist/verified/generated/storage-kernel.js +238 -69
  130. package/docs/architecture.md +1 -0
  131. package/docs/background-tasks.md +33 -0
  132. package/docs/components.md +3 -0
  133. package/docs/configuration.md +2 -0
  134. package/docs/entropy.md +13 -0
  135. package/docs/interface.md +2 -0
  136. package/docs/prompt-cache.md +91 -0
  137. package/docs/provider-capabilities.md +1 -1
  138. package/docs/verified-kernels.md +10 -6
  139. package/package.json +1 -1
  140. package/proofs/lifecycle-spec.bend +4 -4
  141. package/proofs/lifecycle-types.d.ts +1 -1
  142. package/proofs/lifecycle.bend +6 -6
  143. package/scripts/test-verified-kernels.mjs +3 -3
  144. package/scripts/verified-kernels.mjs +53 -13
  145. package/skillsets/typescript/fabric-exec/SKILL.md +5 -0
  146. package/skillsets/typescript/fabric-exec/references/agents.md +2 -0
  147. package/dist/chunks/chunk-3CJETB4S.js.map +0 -7
  148. package/dist/chunks/chunk-4E63LJDD.js +0 -468
  149. package/dist/chunks/chunk-4E63LJDD.js.map +0 -7
  150. package/dist/chunks/chunk-CSJSHBAT.js.map +0 -7
  151. package/dist/chunks/chunk-GGETIGM5.js.map +0 -7
  152. package/dist/chunks/chunk-JCV54SSP.js.map +0 -7
  153. package/dist/chunks/chunk-PMSIZLV6.js.map +0 -7
  154. package/dist/chunks/chunk-V3PIO7QL.js.map +0 -7
  155. package/dist/chunks/chunk-VRYEGVHR.js.map +0 -7
  156. package/dist/chunks/chunk-Y57UHPIK.js.map +0 -7
  157. package/dist/chunks/chunk-ZRI433JP.js.map +0 -7
  158. /package/dist/chunks/{chunk-QFKHAAZA.js.map → chunk-43MBJKT6.js.map} +0 -0
  159. /package/dist/chunks/{chunk-LNLQ2LX3.js.map → chunk-ASU53MOT.js.map} +0 -0
  160. /package/dist/chunks/{chunk-ZTXZ6JDO.js.map → chunk-CDLOYMVO.js.map} +0 -0
  161. /package/dist/chunks/{chunk-754HA6KO.js.map → chunk-CFVBGKBX.js.map} +0 -0
  162. /package/dist/chunks/{chunk-FJSHRHOR.js.map → chunk-CPSPZGK4.js.map} +0 -0
  163. /package/dist/chunks/{chunk-UBPFGMDQ.js.map → chunk-CXQF35XB.js.map} +0 -0
  164. /package/dist/chunks/{chunk-EBWMC3OO.js.map → chunk-EH26JJCE.js.map} +0 -0
  165. /package/dist/chunks/{chunk-3SIXBW6A.js.map → chunk-H4YYLQTX.js.map} +0 -0
  166. /package/dist/chunks/{chunk-D4B4CCTA.js.map → chunk-JHQDS6YP.js.map} +0 -0
  167. /package/dist/chunks/{chunk-OINADFEF.js.map → chunk-JWWGWUP7.js.map} +0 -0
  168. /package/dist/chunks/{chunk-WXSELMFV.js.map → chunk-KFPUVFDS.js.map} +0 -0
  169. /package/dist/chunks/{chunk-X3IRR7CV.js.map → chunk-M25A5R3F.js.map} +0 -0
  170. /package/dist/chunks/{chunk-OUAC6O5C.js.map → chunk-M7FGAVKW.js.map} +0 -0
  171. /package/dist/chunks/{chunk-VQGO4P7C.js.map → chunk-QIW7QMFI.js.map} +0 -0
  172. /package/dist/chunks/{chunk-B4HECUJI.js.map → chunk-RUEKYUNR.js.map} +0 -0
  173. /package/dist/chunks/{chunk-B2IVWASP.js.map → chunk-SG443DA4.js.map} +0 -0
  174. /package/dist/chunks/{chunk-2A2NWQ36.js.map → chunk-WGGUZMQ4.js.map} +0 -0
  175. /package/dist/chunks/{chunk-G2F2RDZI.js.map → chunk-YAPDV6LO.js.map} +0 -0
  176. /package/dist/chunks/{chunk-Q5BMTL6A.js.map → chunk-YIEK7FH2.js.map} +0 -0
  177. /package/dist/chunks/{chunk-KS44WKJJ.js.map → chunk-Z45SUO4B.js.map} +0 -0
package/README.md CHANGED
@@ -142,6 +142,7 @@ See the [interface & commands reference](docs/interface.md) for every view, keyb
142
142
 
143
143
  - [Configuration](docs/configuration.md): `fabric.json`, code modes, tool capture, approvals, and budgets.
144
144
  - [Execution kernels](docs/kernels.md): exclusive TypeScript/Python selection, Monty sandboxing, CPython escape hatch, agent inheritance, and examples.
145
+ - [Prompt cache](docs/prompt-cache.md): honest cache observations and optional, time-bounded native warming leases.
145
146
  - [Memory & recall](docs/memory-recall.md): compact ranked hits, uniform follow calls, lossless expansion, and guest-local `memory.walk` computation.
146
147
  - [Interface & commands](docs/interface.md): dashboard, settings, keybindings, slash commands, and headless runs.
147
148
  - [Agents, actors & mesh](docs/agents.md): model handoff, `/fabric prewalk`, runners, transports, actors, councils, recursive queries, and durable coordination.
@@ -1,11 +1,12 @@
1
1
  # Third-party notices
2
2
 
3
- ## Bend 2.0.26
3
+ ## Bend 2.0.32
4
4
 
5
5
  The generated policy kernel includes Bend's emitted JavaScript trampoline and
6
- compiled Base primitives from [Bend 2.0.26](https://github.com/bendlang/bend/tree/v2.0.26),
7
- Copyright 2026 HigherOrderCO, licensed under Apache-2.0. Pi Fabric removes the
8
- CLI invocation, adds library exports, and tree-shakes unused runtime code.
6
+ compiled Base primitives from [Bend 2.0.32](https://github.com/bendlang/bend/tree/v2.0.32),
7
+ Copyright 2026 HigherOrderCO, licensed under Apache-2.0. Pi Fabric selects the
8
+ ABI library exports, adapts constructor tags at the boundary, and tree-shakes
9
+ unused runtime code.
9
10
  The complete license is distributed at [docs/licenses/bend-apache-2.0.txt](docs/licenses/bend-apache-2.0.txt).
10
11
 
11
12
 
package/dist/agents.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  AGENTS_ACTION_DESCRIPTORS,
6
6
  normalizeAgentRunRequest
7
- } from "./chunks/chunk-754HA6KO.js";
7
+ } from "./chunks/chunk-CFVBGKBX.js";
8
8
  import {
9
9
  actionArgNormalizer
10
10
  } from "./chunks/chunk-NQOEHX62.js";
@@ -20,8 +20,8 @@ import {
20
20
  import "./chunks/chunk-2QAOC3BO.js";
21
21
  import "./chunks/chunk-A4VP7HDF.js";
22
22
  import "./chunks/chunk-MGWQOKBV.js";
23
- import "./chunks/chunk-LNLQ2LX3.js";
24
- import "./chunks/chunk-4E63LJDD.js";
23
+ import "./chunks/chunk-ASU53MOT.js";
24
+ import "./chunks/chunk-MNTJX4U7.js";
25
25
 
26
26
  // src/agents/service-schema.ts
27
27
  import { Value } from "typebox/value";
@@ -0,0 +1,24 @@
1
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+ import type { FabricCacheHoldOptions, FabricCacheHoldResult, FabricCacheLease } from "./types.js";
3
+ export declare const MAX_CACHE_LEASE_MS: number;
4
+ export declare const MAX_CACHE_LEASES = 128;
5
+ export declare class CacheLeases {
6
+ #private;
7
+ private readonly pi;
8
+ private readonly sessionId;
9
+ constructor(pi: ExtensionAPI, sessionId: string);
10
+ supported(context: ExtensionContext): boolean;
11
+ get cleanupError(): string | null;
12
+ values(): FabricCacheLease[];
13
+ reconcile(context: ExtensionContext): void;
14
+ hold(options: FabricCacheHoldOptions, context: ExtensionContext, scope: FabricCacheLease["scope"], invocationId: string, signal?: AbortSignal): FabricCacheHoldResult;
15
+ release(id: string): {
16
+ released: boolean;
17
+ cleanupError: string | null;
18
+ };
19
+ dispose(id: string): void;
20
+ invocationEnded(id: string): void;
21
+ invalidate(): void;
22
+ close(): void;
23
+ }
24
+ //# sourceMappingURL=leases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leases.d.ts","sourceRoot":"","sources":["../../src/cache/leases.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAUlG,eAAO,MAAM,kBAAkB,QAAc,CAAC;AAC9C,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,qBAAa,WAAW;;IASV,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAgB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAA5C,EAAE,EAAE,YAAY,EAAmB,SAAS,EAAE,MAAM;IAEjF,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;IAG7C,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAA+B;IAChE,MAAM,IAAI,gBAAgB,EAAE;IAU5B,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IA2B1C,IAAI,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAC/F,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,qBAAqB;IAuCpE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAKvE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIzB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IA0BjC,UAAU,IAAI,IAAI;IAIlB,KAAK,IAAI,IAAI;CAOd"}
@@ -0,0 +1,8 @@
1
+ import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+ import type { FabricCacheObservation, FabricCacheSample } from "./types.js";
3
+ export declare const CACHE_OBSERVATION_LIMIT = 256;
4
+ /** Unknown counters are not zero-percent cache misses. */
5
+ export declare function cacheSample(usage: unknown, entryId: string, timestamp: string): FabricCacheSample | null;
6
+ /** Bounded active-branch walk; never scans session files or abandoned branches. */
7
+ export declare function observePromptCache(context: ExtensionContext): FabricCacheObservation;
8
+ //# sourceMappingURL=observations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observations.d.ts","sourceRoot":"","sources":["../../src/cache/observations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAM3C,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAYxG;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,sBAAsB,CA+CpF"}
@@ -0,0 +1,68 @@
1
+ export interface FabricCacheHoldOptions {
2
+ /** self is the local Pi session; main is accepted only in a root Pi runtime. */
3
+ target?: "self" | "main";
4
+ durationMs: number;
5
+ /** Requires native admission support; currently returns unsupported, never ignored. */
6
+ maxRefreshes?: number;
7
+ /** Requires native admission support; currently returns unsupported, never ignored. */
8
+ maxCostUsd?: number;
9
+ }
10
+ export interface FabricCacheLease {
11
+ id: string;
12
+ scope: "session" | "component";
13
+ sessionId: string;
14
+ model: string;
15
+ expiresAt: number;
16
+ }
17
+ export type FabricCacheHoldResult = ({
18
+ status: "held";
19
+ } & FabricCacheLease) | {
20
+ status: "unsupported" | "unavailable";
21
+ reason: string;
22
+ };
23
+ export interface FabricCacheSample {
24
+ entryId: string;
25
+ observedAt: number;
26
+ input: number;
27
+ cacheRead: number;
28
+ cacheWrite: number;
29
+ output: number;
30
+ totalInput: number;
31
+ cacheReadShare: number;
32
+ reportedCostUsd: number | null;
33
+ }
34
+ export interface FabricCacheObservation {
35
+ lastRequest: FabricCacheSample | null;
36
+ lastRefresh: FabricCacheSample | null;
37
+ maintenance: {
38
+ requests: number;
39
+ tokens: number;
40
+ reportedCostUsd: number;
41
+ unknownCostRequests: number;
42
+ unknownTokenRequests: number;
43
+ };
44
+ window: {
45
+ entries: number;
46
+ limit: number;
47
+ truncated: boolean;
48
+ stoppedAt: string | null;
49
+ };
50
+ }
51
+ export interface FabricCacheStatus {
52
+ target: "self";
53
+ sessionId: string;
54
+ model: string | null;
55
+ supported: boolean;
56
+ reason: string | null;
57
+ limits: {
58
+ durationMs: true;
59
+ maxRefreshes: false;
60
+ maxCostUsd: false;
61
+ };
62
+ leases: FabricCacheLease[];
63
+ /** Native scheduling/residency is not observable through the scoped lease API. */
64
+ scheduled: null;
65
+ cleanupError: string | null;
66
+ observation: FabricCacheObservation;
67
+ }
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,qBAAqB,GAC7B,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAAC,GACvC;IAAE,MAAM,EAAE,aAAa,GAAG,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAC1F;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE;QAAE,UAAU,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,KAAK,CAAC;QAAC,UAAU,EAAE,KAAK,CAAA;KAAE,CAAC;IACrE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,kFAAkF;IAClF,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,sBAAsB,CAAC;CACrC"}
@@ -6,7 +6,7 @@ import {
6
6
  MAX_NORMAL_FORM_PLANS,
7
7
  isNormalFormPlan,
8
8
  provesNormalFormPlan
9
- } from "./chunk-OINADFEF.js";
9
+ } from "./chunk-JWWGWUP7.js";
10
10
  import {
11
11
  stableJsonHash
12
12
  } from "./chunk-3YZUQESG.js";
@@ -203,10 +203,6 @@ var replaySuccessfulCallsAsync = async (surface, before, traces, touchedRefs, au
203
203
  return violations;
204
204
  };
205
205
 
206
- // src/entropy/compiled-store.ts
207
- import fs2 from "node:fs";
208
- import path2 from "node:path";
209
-
210
206
  // src/core/file-lock.ts
211
207
  import { randomUUID } from "node:crypto";
212
208
  import fs from "node:fs";
@@ -214,6 +210,12 @@ import path from "node:path";
214
210
  var DEFAULT_LOCK_ATTEMPTS = 50;
215
211
  var DEFAULT_LOCK_DELAY_MS = 5;
216
212
  var DEFAULT_STALE_LOCK_MS = 3e4;
213
+ var FileLockTimeoutError = class extends Error {
214
+ constructor(message) {
215
+ super(message);
216
+ this.name = "FileLockTimeoutError";
217
+ }
218
+ };
217
219
  var errorCode = (error) => typeof error === "object" && error !== null && "code" in error ? String(error.code) : void 0;
218
220
  var sleepSync = (() => {
219
221
  try {
@@ -230,10 +232,16 @@ var processAlive = (pid) => {
230
232
  try {
231
233
  process.kill(pid, 0);
232
234
  return true;
233
- } catch {
234
- return false;
235
+ } catch (error) {
236
+ return errorCode(error) !== "ESRCH";
235
237
  }
236
238
  };
239
+ var ownerCanBeReaped = (owner, mtimeMs, staleMs) => {
240
+ const [, pid, created] = owner.split("\n");
241
+ const timestamp = Number(created);
242
+ const since = created?.trim() && Number.isSafeInteger(timestamp) && timestamp >= 0 && timestamp <= Date.now() ? timestamp : mtimeMs;
243
+ return Date.now() - since > staleMs && !processAlive(Number(pid));
244
+ };
237
245
  var sleepAsync = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
238
246
  var reapStaleLockAsync = async (lock, verify) => {
239
247
  const claim = `${lock}.reap-${process.pid}-${randomUUID()}`;
@@ -285,15 +293,12 @@ ${Date.now()}
285
293
  if (errorCode(error) !== "EEXIST") throw error;
286
294
  try {
287
295
  const firstOwner = await fs.promises.readFile(ownerPath, "utf8");
288
- const [, pidText, createdText] = firstOwner.trim().split("\n");
289
- const stale = Date.now() - Number(createdText) > staleMs;
290
- if (stale && !processAlive(Number(pidText))) {
296
+ if (ownerCanBeReaped(firstOwner, (await fs.promises.stat(lock)).mtimeMs, staleMs)) {
291
297
  const secondOwner = await fs.promises.readFile(ownerPath, "utf8");
292
298
  if (secondOwner === firstOwner && await reapStaleLockAsync(lock, async (claimed) => {
293
299
  try {
294
300
  const owner = await fs.promises.readFile(path.join(claimed, "owner"), "utf8");
295
- const [, pid, created] = owner.trim().split("\n");
296
- return Date.now() - Number(created) > staleMs && !processAlive(Number(pid));
301
+ return owner === firstOwner && ownerCanBeReaped(owner, (await fs.promises.stat(claimed)).mtimeMs, staleMs);
297
302
  } catch {
298
303
  return false;
299
304
  }
@@ -301,11 +306,18 @@ ${Date.now()}
301
306
  continue;
302
307
  }
303
308
  }
304
- } catch {
309
+ } catch (error2) {
310
+ if (errorCode(error2) !== "ENOENT") throw error2;
305
311
  try {
306
312
  const first = await fs.promises.stat(lock);
307
313
  if (Date.now() - first.mtimeMs > staleMs && await reapStaleLockAsync(lock, async (claimed) => {
308
314
  try {
315
+ try {
316
+ await fs.promises.readFile(path.join(claimed, "owner"), "utf8");
317
+ return false;
318
+ } catch (error3) {
319
+ if (errorCode(error3) !== "ENOENT") return false;
320
+ }
309
321
  return Date.now() - (await fs.promises.stat(claimed)).mtimeMs > staleMs;
310
322
  } catch {
311
323
  return false;
@@ -320,7 +332,7 @@ ${Date.now()}
320
332
  await sleepAsync(delayMs);
321
333
  }
322
334
  }
323
- if (!acquired) throw new Error(options.timeoutMessage);
335
+ if (!acquired) throw new FileLockTimeoutError(options.timeoutMessage);
324
336
  try {
325
337
  return await operation();
326
338
  } finally {
@@ -382,15 +394,12 @@ ${Date.now()}
382
394
  if (errorCode(error) !== "EEXIST") throw error;
383
395
  try {
384
396
  const firstOwner = fs.readFileSync(ownerPath, "utf8");
385
- const [, pidText, createdText] = firstOwner.trim().split("\n");
386
- const stale = Date.now() - Number(createdText) > staleMs;
387
- if (stale && !processAlive(Number(pidText))) {
397
+ if (ownerCanBeReaped(firstOwner, fs.statSync(lock).mtimeMs, staleMs)) {
388
398
  const secondOwner = fs.readFileSync(ownerPath, "utf8");
389
399
  if (secondOwner === firstOwner && reapStaleLock(lock, (claimed) => {
390
400
  try {
391
401
  const owner = fs.readFileSync(path.join(claimed, "owner"), "utf8");
392
- const [, pid, created] = owner.trim().split("\n");
393
- return Date.now() - Number(created) > staleMs && !processAlive(Number(pid));
402
+ return owner === firstOwner && ownerCanBeReaped(owner, fs.statSync(claimed).mtimeMs, staleMs);
394
403
  } catch {
395
404
  return false;
396
405
  }
@@ -398,11 +407,18 @@ ${Date.now()}
398
407
  continue;
399
408
  }
400
409
  }
401
- } catch {
410
+ } catch (error2) {
411
+ if (errorCode(error2) !== "ENOENT") throw error2;
402
412
  try {
403
413
  const first = fs.statSync(lock);
404
414
  if (Date.now() - first.mtimeMs > staleMs && reapStaleLock(lock, (claimed) => {
405
415
  try {
416
+ try {
417
+ fs.readFileSync(path.join(claimed, "owner"), "utf8");
418
+ return false;
419
+ } catch (error3) {
420
+ if (errorCode(error3) !== "ENOENT") return false;
421
+ }
406
422
  return Date.now() - fs.statSync(claimed).mtimeMs > staleMs;
407
423
  } catch {
408
424
  return false;
@@ -417,7 +433,7 @@ ${Date.now()}
417
433
  sleepSync(delayMs);
418
434
  }
419
435
  }
420
- if (!acquired) throw new Error(options.timeoutMessage);
436
+ if (!acquired) throw new FileLockTimeoutError(options.timeoutMessage);
421
437
  try {
422
438
  return operation();
423
439
  } finally {
@@ -433,6 +449,8 @@ ${Date.now()}
433
449
  };
434
450
 
435
451
  // src/entropy/compiled-store.ts
452
+ import fs2 from "node:fs";
453
+ import path2 from "node:path";
436
454
  var COMPILED_LOCK_ATTEMPTS = 50;
437
455
  var COMPILED_LOCK_DELAY_MS = 5;
438
456
  var COMPILED_STALE_LOCK_MS = 3e4;
@@ -632,6 +650,7 @@ export {
632
650
  mergeCompiledSurfaces,
633
651
  replaySuccessfulCalls,
634
652
  replaySuccessfulCallsAsync,
653
+ FileLockTimeoutError,
635
654
  withExclusiveFileLockAsync,
636
655
  withExclusiveFileLock,
637
656
  compiledSurfaceDirectory,
@@ -641,4 +660,4 @@ export {
641
660
  saveCompiledSurface,
642
661
  saveCompiledSurfaceAsync
643
662
  };
644
- //# sourceMappingURL=chunk-JCV54SSP.js.map
663
+ //# sourceMappingURL=chunk-27ORW5EK.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/entropy/types.ts", "../../src/entropy/compiled-surface.ts", "../../src/core/file-lock.ts", "../../src/entropy/compiled-store.ts"],
4
+ "sourcesContent": ["// Deterministic tool-entropy measurement for the Fabric tool surface.\n//\n// The operational score is an invocation rejection fraction, not bits.\n// Shape, failure-stage, flow, churn, navigation, lexicon, and schema freedom\n// remain separate diagnostics from typed traces, repairs, and live schemas.\n// No model judges anything; identical inputs and metric version give the\n// same report. Derived metrics are rounded to six decimal places.\n\nexport const ENTROPY_METRIC_VERSION = 3 as const;\n\n// Legacy diagnostic weights retained for export compatibility. In v3 only\n// staticFreedom scales staticScore; none contribute to the operational score.\n// Changes to metric formulas require an ENTROPY_METRIC_VERSION bump.\nexport const ENTROPY_WEIGHTS = {\n shape: 1,\n failureStage: 1,\n churn: 4,\n navigation: 4,\n flow: 1,\n lexicon: 2,\n staticFreedom: 0.25,\n} as const;\n\n// Failure stages that mean \"the surface rejected the call before it could\n// take effect\" \u2014 the offline residue class behind repair fingerprints.\nexport const ENTROPY_INVOCATION_STAGES: readonly string[] = [\"resolve\", \"prepare\", \"validate\"];\n\nexport type EntropyOutcome = \"succeeded\" | \"failed\" | \"aborted\" | \"timed_out\";\n\nexport interface EntropySurfaceAction {\n ref: string;\n inputSchema: unknown;\n}\n\nexport interface EntropySurfaceSnapshot {\n version: 1;\n actions: EntropySurfaceAction[];\n}\n\nexport interface EntropyOperationInput {\n ref: string;\n args: Record<string, unknown>;\n outcome: EntropyOutcome;\n failureStage?: string;\n normalization?: import(\"./normal-form.js\").NormalFormWitness;\n}\n\nexport interface EntropyTraceInput {\n operations: EntropyOperationInput[];\n taskKey?: string;\n /** Producing model, stamped from the session scan as `provider/modelId`. */\n model?: string;\n}\n\n// Normalized compatibility alias: `ref` is the canonical target the row\n// repairs toward.\nexport interface EntropyRepairRowInput {\n kind: \"keyAlias\" | \"actionAlias\";\n ref: string;\n from: string;\n to: string;\n}\n\n// One verbatim argument value observed in persisted audits: the value-level\n// corpus for enum-tighten. Trace V1 projects values away per ref; audits\n// carry every argument the call actually used. Pooled observations carry\n// `count` multiplicity instead of one entry per call.\nexport interface EntropyValueObservation {\n ref: string;\n key: string;\n value: string | number | boolean;\n /** Observation multiplicity; window scans emit one entry per call, pools emit one per distinct value. */\n count?: number;\n}\n\n// One verbatim call per persisted audit: the authoritative record of the\n// arguments a call actually used. Trace V1 projects values away per ref, so\n// replay validation consults these, never the projected trace args.\nexport interface EntropyAuditCall {\n ref: string;\n args: Record<string, unknown>;\n}\n\nexport interface EntropyShapeSignature {\n signature: string;\n count: number;\n}\n\nexport interface EntropyRefReport {\n ref: string;\n calls: number;\n succeeded: number;\n failed: number;\n shapeSignatures: EntropyShapeSignature[];\n /** Shannon entropy of argument shapes, in bits. */\n shapeEntropyBits: number;\n /** Shannon entropy of failed-call stages, in bits. */\n failureStageEntropyBits: number;\n /** Mean normalized shape distance between a failure and the next same-ref call. */\n churnRate: number;\n /** Count of repair rows targeting this ref. */\n lexiconRows: number;\n /** Heuristic schema-freedom units; zero for an unknown schema. */\n staticFreedom: number;\n /** Invocation rejections / calls, a fraction in [0, 1]. */\n score: number;\n}\n\nexport interface EntropyTotals {\n traces: number;\n operations: number;\n actionOperations: number;\n discoveryOperations: number;\n workflowOperations: number;\n succeeded: number;\n failed: number;\n aborted: number;\n timedOut: number;\n invocationRejections: number;\n invocationRejectionsPer1k: number;\n}\n\n// Per-model behavioral attribution over stamped traces only.\nexport interface EntropyModelReport {\n model: string;\n operations: number;\n actionOperations: number;\n succeeded: number;\n invocationRejections: number;\n invocationRejectionsPer1k: number;\n /** Invocation rejections / action operations for this model, in [0, 1]; zero if none. */\n behavioralScore: number;\n}\n\nexport interface EntropyReport {\n metricVersion: typeof ENTROPY_METRIC_VERSION;\n catalogDigest: string;\n totals: EntropyTotals;\n /** Call-weighted mean per-ref shape entropy, in bits. */\n shapeEntropyBits: number;\n /** Failed-call-weighted mean per-ref failure-stage entropy, in bits. */\n failureStageEntropyBits: number;\n /** Mean normalized failure-to-next-same-ref shape distance within traces. */\n churnRate: number;\n /** Discovery operations / action operations; zero without action operations. */\n navigationRatio: number;\n /** Trace-weighted mean per-task action-sequence entropy, in bits. */\n flowEntropyBits: number;\n /** Total count of supplied repair rows. */\n lexiconRows: number;\n /** Sum of heuristic schema-freedom units over distinct called refs. */\n staticFreedom: number;\n /** 0.25 \u00D7 call-weighted mean schema freedom; unknown schemas contribute zero.\n * Diagnostic only, zero without action calls; never added to score. */\n staticScore: number;\n /** Identical to score: invocation rejection fraction, not entropy bits. */\n behavioralScore: number;\n /** Failed resolve/prepare/validate calls / all action operations, in [0, 1].\n * Zero without action operations. Discovery/workflow operations are excluded. */\n score: number;\n refs: EntropyRefReport[];\n /** Behavioral attribution per producing model; empty when no trace carries one. */\n byModel: EntropyModelReport[];\n}\n\nexport type EntropyProposal =\n | {\n kind: \"normal-form\";\n ref: string;\n baseSchemaDigest: string;\n rules: import(\"./normal-form.js\").NormalFormRule[];\n }\n | {\n kind: \"enum-tighten\";\n ref: string;\n key: string;\n values: (string | number | boolean)[];\n calls: number;\n distinct: number;\n topShare: number;\n }\n | {\n kind: \"declare-enum\";\n ref: string;\n key: string;\n values: (string | number | boolean)[];\n calls: number;\n distinct: number;\n topShare: number;\n }\n | {\n kind: \"overload-split\";\n ref: string;\n shapeEntropyBits: number;\n clusters: { keys: string[]; calls: number }[];\n }\n | {\n kind: \"sequence-fuse\";\n sequence: string[];\n occurrences: number;\n }\n | {\n kind: \"noise-quarantine\";\n ref: string;\n calls: number;\n succeeded: number;\n failed: number;\n failureStageEntropyBits: number;\n };\n\nexport interface EntropyGateResult {\n passed: boolean;\n beforeScore: number;\n afterScore: number;\n delta: number;\n reasons: string[];\n}\n\n// Trend of a score sequence, oldest to newest: the ratchet's line. A\n// negative slopePerStep means the surface is compiling down.\nexport interface EntropyTrend {\n count: number;\n first?: number;\n last?: number;\n slopePerStep: number;\n}\n", "// Version 2 compiles compatibility normal forms, never schema restrictions.\n// Version 1 restriction artifacts remain readable for migration but are inert.\nimport { Value } from \"typebox/value\";\nimport { stableJsonHash } from \"../core/stable-hash.js\";\nimport { ENTROPY_METRIC_VERSION } from \"./types.js\";\nimport { MAX_NORMAL_FORM_PLANS, provesNormalFormPlan, type NormalFormPlan } from \"./normal-form.js\";\nimport type { EntropyAuditCall, EntropyProposal, EntropySurfaceSnapshot, EntropyTraceInput } from \"./types.js\";\n\nexport const COMPILED_SURFACE_VERSION = 2 as const;\nexport const MAX_COMPILED_SURFACE_PROPOSALS = 256;\nexport interface CompiledSurfaceOverlayEntry {\n ref: string;\n inputSchema: Record<string, unknown>;\n baseSchemaDigest: string;\n}\nexport interface CompiledSurfaceQuarantineEntry { ref: string; baseSchemaDigest: string }\nexport interface CompiledSurfaceAppliedProposal { kind: EntropyProposal[\"kind\"]; ref: string; detail: string }\nexport interface CompiledSurfaceGateRecord { passed: boolean; beforeScore: number; afterScore: number; reasons: string[] }\nexport interface CompiledSurfaceFile {\n version: 1 | typeof COMPILED_SURFACE_VERSION;\n metricVersion: number;\n /** Legacy restrictions are retained only when reading version 1. Never enforced. */\n actions: CompiledSurfaceOverlayEntry[];\n quarantined: CompiledSurfaceQuarantineEntry[];\n normalizations?: NormalFormPlan[];\n applied: CompiledSurfaceAppliedProposal[];\n gate: CompiledSurfaceGateRecord;\n evidenceDigest: string;\n}\n\nexport const emptyCompiledSurface = (): CompiledSurfaceFile => ({\n version: COMPILED_SURFACE_VERSION, metricVersion: ENTROPY_METRIC_VERSION,\n actions: [], quarantined: [], normalizations: [], applied: [],\n gate: { passed: true, beforeScore: 0, afterScore: 0, reasons: [] },\n evidenceDigest: stableJsonHash([]),\n});\nexport const compiledSurfaceEffectChanged = (before: CompiledSurfaceFile | undefined, after: CompiledSurfaceFile): boolean =>\n stableJsonHash(before?.version === COMPILED_SURFACE_VERSION ? before.normalizations ?? [] : []) !==\n stableJsonHash(after.version === COMPILED_SURFACE_VERSION ? after.normalizations ?? [] : []);\n// Scores are comparable across compiles only under the same metric version;\n// legacy (v1) or stale-metric artifacts yield no baseline for a lowering.\nexport const comparableCompiledSurfaceScore = (\n file: CompiledSurfaceFile | undefined,\n metricVersion: number,\n): number | undefined =>\n file?.version === COMPILED_SURFACE_VERSION && file.metricVersion === metricVersion\n ? file.gate.afterScore\n : undefined;\nconst isPlainRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nexport const schemaDigest = (schema: unknown): string => stableJsonHash(schema);\n\n// These compatibility APIs deliberately preserve the entire declaration.\n// Neither a legacy artifact nor an imported schema may remove capabilities.\nexport const effectiveSchemaFor = (_ref: string, liveSchema: unknown, _file?: CompiledSurfaceFile): unknown => liveSchema;\nexport const applyCompiledSurface = (live: EntropySurfaceSnapshot, _file?: CompiledSurfaceFile): EntropySurfaceSnapshot => live;\nexport const quarantinedRefNames = (_file?: CompiledSurfaceFile): ReadonlySet<string> => new Set();\nexport const isQuarantinedRef = (_ref: string, _liveSchema: unknown, _file?: CompiledSurfaceFile): boolean => false;\n\nexport interface MergedCompiledSurface {\n file: CompiledSurfaceFile;\n droppedOverlays: number;\n droppedQuarantines: number;\n droppedNormalizations: number;\n}\n\n// Import proves the complete rule plan by re-derivation, not merely a base\n// digest. Forged rule kinds/targets, drift, and every legacy restriction drop.\nexport const mergeCompiledSurfaces = (\n local: CompiledSurfaceFile | undefined,\n incoming: CompiledSurfaceFile,\n live: EntropySurfaceSnapshot,\n): MergedCompiledSurface => {\n const schemas = new Map(live.actions.map((action) => [action.ref, action.inputSchema]));\n const plans = new Map<string, NormalFormPlan>();\n let droppedNormalizations = 0;\n for (const file of [local, incoming]) {\n if (!file || file.version !== COMPILED_SURFACE_VERSION) continue;\n for (const plan of file.normalizations ?? []) {\n if (!provesNormalFormPlan(plan, schemas.get(plan.ref))) { droppedNormalizations++; continue; }\n if (plans.size >= MAX_NORMAL_FORM_PLANS || plans.has(plan.ref)) continue;\n plans.set(plan.ref, plan);\n }\n }\n const normalizations = [...plans.values()].sort((a, b) => a.ref < b.ref ? -1 : a.ref > b.ref ? 1 : 0);\n return {\n file: {\n ...emptyCompiledSurface(), normalizations,\n applied: normalizations.slice(0, MAX_COMPILED_SURFACE_PROPOSALS).map((plan) => ({ kind: \"normal-form\", ref: plan.ref, detail: `${plan.rules.length} proven rules` })),\n evidenceDigest: stableJsonHash(normalizations),\n },\n droppedOverlays: (local?.actions.length ?? 0) + incoming.actions.length,\n droppedQuarantines: (local?.quarantined.length ?? 0) + incoming.quarantined.length,\n droppedNormalizations,\n };\n};\n\nexport interface ReplayViolation {\n ref: string;\n reason: string;\n}\n\n// Replay preservation: every successful call to a ref the compile touched\n// must still parse against the candidate surface \u2014 resolution plus the same\n// TypeBox check the registry's validate stage uses. Untouched refs keep\n// their schema by identity, so replay stays scoped to the touched set.\n// When a touched ref has verbatim audit calls, they are the replay corpus:\n// trace V1 projects values away per ref, so validating the projected trace\n// args would phantom-reject calls that actually parsed. Audits the declared\n// surface already rejected are not protected \u2014 those calls never executed,\n// so no compile can invalidate them.\nexport const replaySuccessfulCalls = (\n surface: EntropySurfaceSnapshot,\n before: EntropySurfaceSnapshot,\n traces: readonly EntropyTraceInput[],\n touchedRefs: ReadonlySet<string>,\n auditCalls?: readonly EntropyAuditCall[],\n): ReplayViolation[] => {\n const schemaByRef = new Map(surface.actions.map((action) => [action.ref, action.inputSchema]));\n const beforeByRef = new Map(before.actions.map((action) => [action.ref, action.inputSchema]));\n const accepts = (schema: unknown, args: Record<string, unknown>): boolean => {\n try {\n return isPlainRecord(schema) && Value.Check(schema, args);\n } catch {\n return false;\n }\n };\n const violations: ReplayViolation[] = [];\n const auditedRefs = new Set<string>();\n if (auditCalls) {\n const auditArgsByRef = new Map<string, Record<string, unknown>[]>();\n for (const call of auditCalls) {\n if (!touchedRefs.has(call.ref)) continue;\n const bucket = auditArgsByRef.get(call.ref) ?? [];\n bucket.push(call.args);\n auditArgsByRef.set(call.ref, bucket);\n }\n for (const [ref, argsList] of auditArgsByRef) {\n auditedRefs.add(ref);\n const schema = schemaByRef.get(ref);\n if (schema === undefined) {\n violations.push({ ref, reason: \"absent from the candidate surface\" });\n continue;\n }\n const declared = beforeByRef.get(ref);\n for (const args of argsList) {\n if (declared !== undefined && !accepts(declared, args)) continue;\n if (!accepts(schema, args)) {\n violations.push({\n ref,\n reason: \"recorded arguments no longer validate against the compiled schema\",\n });\n }\n }\n }\n }\n for (const sourceTrace of traces) {\n for (const operation of sourceTrace.operations) {\n if (operation.outcome !== \"succeeded\") continue;\n if (operation.ref.startsWith(\"fabric.\")) continue;\n if (!touchedRefs.has(operation.ref)) continue;\n if (auditedRefs.has(operation.ref)) continue;\n const schema = schemaByRef.get(operation.ref);\n if (schema === undefined) {\n violations.push({ ref: operation.ref, reason: \"absent from the candidate surface\" });\n continue;\n }\n if (!accepts(schema, operation.args)) {\n violations.push({\n ref: operation.ref,\n reason: \"recorded arguments no longer validate against the compiled schema\",\n });\n }\n }\n }\n return violations;\n};\n\nconst COOPERATIVE_REPLAY_CHUNK = 64;\n\nconst replayYield = (): Promise<void> =>\n new Promise((resolve) => setImmediate(resolve));\n\n// Hook-safe replay gate. The ordering and validation rules match the pure\n// certification path exactly, with fixed operation chunks between TUI turns.\nexport const replaySuccessfulCallsAsync = async (\n surface: EntropySurfaceSnapshot,\n before: EntropySurfaceSnapshot,\n traces: readonly EntropyTraceInput[],\n touchedRefs: ReadonlySet<string>,\n auditCalls?: readonly EntropyAuditCall[],\n): Promise<ReplayViolation[]> => {\n const schemaByRef = new Map(surface.actions.map((action) => [action.ref, action.inputSchema]));\n const beforeByRef = new Map(before.actions.map((action) => [action.ref, action.inputSchema]));\n const accepts = (schema: unknown, args: Record<string, unknown>): boolean => {\n try {\n return isPlainRecord(schema) && Value.Check(schema, args);\n } catch {\n return false;\n }\n };\n const violations: ReplayViolation[] = [];\n const auditedRefs = new Set<string>();\n let processed = 0;\n await replayYield();\n if (auditCalls) {\n const auditArgsByRef = new Map<string, Record<string, unknown>[]>();\n for (const call of auditCalls) {\n if (touchedRefs.has(call.ref)) {\n const bucket = auditArgsByRef.get(call.ref) ?? [];\n bucket.push(call.args);\n auditArgsByRef.set(call.ref, bucket);\n }\n processed += 1;\n if (processed % COOPERATIVE_REPLAY_CHUNK === 0) await replayYield();\n }\n for (const [ref, argsList] of auditArgsByRef) {\n auditedRefs.add(ref);\n const schema = schemaByRef.get(ref);\n if (schema === undefined) {\n violations.push({ ref, reason: \"absent from the candidate surface\" });\n continue;\n }\n const declared = beforeByRef.get(ref);\n for (const args of argsList) {\n if (declared === undefined || accepts(declared, args)) {\n if (!accepts(schema, args)) {\n violations.push({\n ref,\n reason: \"recorded arguments no longer validate against the compiled schema\",\n });\n }\n }\n processed += 1;\n if (processed % COOPERATIVE_REPLAY_CHUNK === 0) await replayYield();\n }\n }\n }\n for (const sourceTrace of traces) {\n for (const operation of sourceTrace.operations) {\n if (\n operation.outcome === \"succeeded\" &&\n !operation.ref.startsWith(\"fabric.\") &&\n touchedRefs.has(operation.ref) &&\n !auditedRefs.has(operation.ref)\n ) {\n const schema = schemaByRef.get(operation.ref);\n if (schema === undefined) {\n violations.push({ ref: operation.ref, reason: \"absent from the candidate surface\" });\n } else if (!accepts(schema, operation.args)) {\n violations.push({\n ref: operation.ref,\n reason: \"recorded arguments no longer validate against the compiled schema\",\n });\n }\n }\n processed += 1;\n if (processed % COOPERATIVE_REPLAY_CHUNK === 0) await replayYield();\n }\n }\n return violations;\n};\n", "// Cross-process exclusive lock for Fabric's durable stores (the repair\n// table, the compiled entropy surface). Acquisition is a bounded retry over\n// mkdir; stale-lock recovery is an exclusive rename claim, so racing\n// reapers can never delete a lock a fresh writer owns.\n\nimport { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nconst DEFAULT_LOCK_ATTEMPTS = 50;\nconst DEFAULT_LOCK_DELAY_MS = 5;\nconst DEFAULT_STALE_LOCK_MS = 30_000;\n\n/** Contention is retryable; permission, I/O, and operation errors are not. */\nexport class FileLockTimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FileLockTimeoutError\";\n }\n}\n\nexport interface ExclusiveLockOptions {\n directory: string;\n lockName: string;\n /** Error message when acquisition times out. */\n timeoutMessage: string;\n staleMs?: number;\n attempts?: number;\n delayMs?: number;\n}\n\nconst errorCode = (error: unknown): string | undefined =>\n typeof error === \"object\" && error !== null && \"code\" in error\n ? String((error as { code?: unknown }).code)\n : undefined;\n\nconst sleepSync = (() => {\n try {\n const buffer = new Int32Array(new SharedArrayBuffer(4));\n return (ms: number): void => {\n Atomics.wait(buffer, 0, 0, ms);\n };\n } catch {\n return (): void => undefined;\n }\n})();\n\nconst processAlive = (pid: number): boolean => {\n if (!Number.isSafeInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n // EPERM (or an unknown probe failure) is not evidence of a dead owner.\n return errorCode(error) !== \"ESRCH\";\n }\n};\n\nconst ownerCanBeReaped = (owner: string, mtimeMs: number, staleMs: number): boolean => {\n const [, pid, created] = owner.split(\"\\n\");\n const timestamp = Number(created);\n // Damaged metadata must not strand the lock forever. Still protect a live\n // PID, and use filesystem age when the creation timestamp is unusable.\n const since = created?.trim() && Number.isSafeInteger(timestamp) && timestamp >= 0 && timestamp <= Date.now()\n ? timestamp\n : mtimeMs;\n return Date.now() - since > staleMs && !processAlive(Number(pid));\n};\n\nconst sleepAsync = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nconst reapStaleLockAsync = async (\n lock: string,\n verify: (claimed: string) => Promise<boolean>,\n): Promise<boolean> => {\n const claim = `${lock}.reap-${process.pid}-${randomUUID()}`;\n try {\n await fs.promises.rename(lock, claim);\n } catch {\n return false;\n }\n if (!(await verify(claim))) {\n try {\n await fs.promises.rename(claim, lock);\n } catch {\n if (await verify(claim)) {\n await fs.promises.rm(claim, { recursive: true, force: true });\n }\n }\n return false;\n }\n await fs.promises.rm(claim, { recursive: true, force: true });\n return true;\n};\n\nexport const withExclusiveFileLockAsync = async <T>(\n options: ExclusiveLockOptions,\n operation: () => T | Promise<T>,\n): Promise<T> => {\n const attempts = options.attempts ?? DEFAULT_LOCK_ATTEMPTS;\n const delayMs = options.delayMs ?? DEFAULT_LOCK_DELAY_MS;\n const staleMs = options.staleMs ?? DEFAULT_STALE_LOCK_MS;\n await fs.promises.mkdir(options.directory, { recursive: true, mode: 0o700 });\n const lock = path.join(options.directory, options.lockName);\n const ownerPath = path.join(lock, \"owner\");\n const token = randomUUID();\n let acquired = false;\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n await fs.promises.mkdir(lock, { mode: 0o700 });\n try {\n await fs.promises.writeFile(ownerPath, `${token}\\n${process.pid}\\n${Date.now()}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n } catch (error) {\n await fs.promises.rm(lock, { recursive: true, force: true });\n throw error;\n }\n acquired = true;\n break;\n } catch (error) {\n if (errorCode(error) !== \"EEXIST\") throw error;\n try {\n const firstOwner = await fs.promises.readFile(ownerPath, \"utf8\");\n if (ownerCanBeReaped(firstOwner, (await fs.promises.stat(lock)).mtimeMs, staleMs)) {\n const secondOwner = await fs.promises.readFile(ownerPath, \"utf8\");\n if (\n secondOwner === firstOwner &&\n await reapStaleLockAsync(lock, async (claimed) => {\n try {\n const owner = await fs.promises.readFile(path.join(claimed, \"owner\"), \"utf8\");\n return owner === firstOwner &&\n ownerCanBeReaped(owner, (await fs.promises.stat(claimed)).mtimeMs, staleMs);\n } catch {\n return false;\n }\n })\n ) {\n continue;\n }\n }\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") throw error;\n try {\n const first = await fs.promises.stat(lock);\n if (\n Date.now() - first.mtimeMs > staleMs &&\n await reapStaleLockAsync(lock, async (claimed) => {\n try {\n try {\n await fs.promises.readFile(path.join(claimed, \"owner\"), \"utf8\");\n return false;\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") return false;\n }\n return Date.now() - (await fs.promises.stat(claimed)).mtimeMs > staleMs;\n } catch {\n return false;\n }\n })\n ) {\n continue;\n }\n } catch {\n // Lock creation or stale recovery raced; retry the bounded acquisition.\n }\n }\n if (attempt === attempts - 1) break;\n await sleepAsync(delayMs);\n }\n }\n if (!acquired) throw new FileLockTimeoutError(options.timeoutMessage);\n try {\n return await operation();\n } finally {\n try {\n const owner = await fs.promises.readFile(ownerPath, \"utf8\");\n if (owner.startsWith(`${token}\\n`)) {\n await fs.promises.rm(lock, { recursive: true, force: true });\n }\n } catch {\n // A recovering process already removed this lock.\n }\n }\n};\n\n// Stale-lock recovery must be an exclusive claim. Stat-then-delete is\n// TOCTOU: two reapers (or a reaper and a fresh writer that recreated the\n// lock in between) can both pass their checks, and the slower rm then\n// deletes a lock the faster one already replaced. rename() is the claim \u2014\n// only one process can move the directory, and removal targets the claimed\n// path, never the live lock path. A claim that turns out to hold a live\n// lock is renamed back before any destructive step; a live lock is never\n// deleted, even if the rename-back races a fresh writer.\nconst reapStaleLock = (lock: string, verify: (claimed: string) => boolean): boolean => {\n const claim = `${lock}.reap-${process.pid}-${randomUUID()}`;\n try {\n fs.renameSync(lock, claim);\n } catch {\n return false;\n }\n if (!verify(claim)) {\n try {\n fs.renameSync(claim, lock);\n } catch {\n // `lock` was recreated after the claim. Re-verify before any\n // destructive step so a claimed live lock is only ever abandoned as\n // garbage, never deleted.\n if (verify(claim)) fs.rmSync(claim, { recursive: true, force: true });\n }\n return false;\n }\n fs.rmSync(claim, { recursive: true, force: true });\n return true;\n};\n\nexport const withExclusiveFileLock = <T>(\n options: ExclusiveLockOptions,\n operation: () => T,\n): T => {\n const attempts = options.attempts ?? DEFAULT_LOCK_ATTEMPTS;\n const delayMs = options.delayMs ?? DEFAULT_LOCK_DELAY_MS;\n const staleMs = options.staleMs ?? DEFAULT_STALE_LOCK_MS;\n fs.mkdirSync(options.directory, { recursive: true, mode: 0o700 });\n const lock = path.join(options.directory, options.lockName);\n const ownerPath = path.join(lock, \"owner\");\n const token = randomUUID();\n let acquired = false;\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n fs.mkdirSync(lock, { mode: 0o700 });\n try {\n fs.writeFileSync(ownerPath, `${token}\\n${process.pid}\\n${Date.now()}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n } catch (error) {\n fs.rmSync(lock, { recursive: true, force: true });\n throw error;\n }\n acquired = true;\n break;\n } catch (error) {\n if (errorCode(error) !== \"EEXIST\") throw error;\n try {\n const firstOwner = fs.readFileSync(ownerPath, \"utf8\");\n if (ownerCanBeReaped(firstOwner, fs.statSync(lock).mtimeMs, staleMs)) {\n const secondOwner = fs.readFileSync(ownerPath, \"utf8\");\n if (\n secondOwner === firstOwner &&\n reapStaleLock(lock, (claimed) => {\n try {\n const owner = fs.readFileSync(path.join(claimed, \"owner\"), \"utf8\");\n return owner === firstOwner &&\n ownerCanBeReaped(owner, fs.statSync(claimed).mtimeMs, staleMs);\n } catch {\n return false;\n }\n })\n ) {\n continue;\n }\n }\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") throw error;\n try {\n // Ownerless lock (crash between mkdir and the owner write): age is\n // the only signal, and the claim re-verifies it after the rename.\n const first = fs.statSync(lock);\n if (\n Date.now() - first.mtimeMs > staleMs &&\n reapStaleLock(lock, (claimed) => {\n try {\n try {\n fs.readFileSync(path.join(claimed, \"owner\"), \"utf8\");\n return false;\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") return false;\n }\n return Date.now() - fs.statSync(claimed).mtimeMs > staleMs;\n } catch {\n return false;\n }\n })\n ) {\n continue;\n }\n } catch {\n // Lock creation or stale recovery raced; retry the bounded acquisition.\n }\n }\n if (attempt === attempts - 1) break;\n sleepSync(delayMs);\n }\n }\n if (!acquired) throw new FileLockTimeoutError(options.timeoutMessage);\n try {\n return operation();\n } finally {\n try {\n const owner = fs.readFileSync(ownerPath, \"utf8\");\n if (owner.startsWith(`${token}\\n`)) {\n fs.rmSync(lock, { recursive: true, force: true });\n }\n } catch {\n // A recovering process already removed this lock.\n }\n }\n};", "// Persistence for the compiled entropy surface: <agent dir>/fabric/entropy/\n// compiled.json, locked across Pi processes sharing the agent directory.\n// A damaged artifact surfaces as an error and blocks compiles from\n// overwriting it \u2014 the same discipline as the repair table. The artifact is\n// clock-free, so saving byte-identical content is a no-op.\n\nimport fs from \"node:fs\";\nimport { isNormalFormPlan, MAX_NORMAL_FORM_PLANS } from \"./normal-form.js\";\nimport path from \"node:path\";\nimport { writeJsonAtomic, writeJsonAtomicAsync } from \"../core/atomic-write.js\";\nimport { withExclusiveFileLock, withExclusiveFileLockAsync } from \"../core/file-lock.js\";\nimport {\n COMPILED_SURFACE_VERSION,\n MAX_COMPILED_SURFACE_PROPOSALS,\n type CompiledSurfaceAppliedProposal,\n type CompiledSurfaceFile,\n type CompiledSurfaceGateRecord,\n type CompiledSurfaceOverlayEntry,\n type CompiledSurfaceQuarantineEntry,\n} from \"./compiled-surface.js\";\n\nconst COMPILED_LOCK_ATTEMPTS = 50;\nconst COMPILED_LOCK_DELAY_MS = 5;\nconst COMPILED_STALE_LOCK_MS = 30_000;\n\nexport const compiledSurfaceDirectory = (agentDir: string): string =>\n path.join(agentDir, \"fabric\", \"entropy\");\n\nconst compiledPath = (directory: string): string => path.join(directory, \"compiled.json\");\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst errorCode = (error: unknown): string | undefined =>\n isRecord(error) && typeof error.code === \"string\" ? error.code : undefined;\n\nconst errorText = (error: unknown): string =>\n (error instanceof Error ? error.message : String(error)).slice(0, 200);\n\nconst parseOverlayEntry = (value: unknown): CompiledSurfaceOverlayEntry | undefined => {\n if (!isRecord(value) || typeof value.ref !== \"string\" || !value.ref.trim()) return undefined;\n if (!isRecord(value.inputSchema)) return undefined;\n if (typeof value.baseSchemaDigest !== \"string\" || !value.baseSchemaDigest.trim()) {\n return undefined;\n }\n return {\n ref: value.ref.trim(),\n inputSchema: value.inputSchema,\n baseSchemaDigest: value.baseSchemaDigest.trim(),\n };\n};\n\nconst parseQuarantineEntry = (value: unknown): CompiledSurfaceQuarantineEntry | undefined => {\n if (!isRecord(value) || typeof value.ref !== \"string\" || !value.ref.trim()) return undefined;\n if (typeof value.baseSchemaDigest !== \"string\" || !value.baseSchemaDigest.trim()) {\n return undefined;\n }\n return { ref: value.ref.trim(), baseSchemaDigest: value.baseSchemaDigest.trim() };\n};\n\nconst parseAppliedProposal = (value: unknown): CompiledSurfaceAppliedProposal | undefined => {\n if (!isRecord(value)) return undefined;\n if (typeof value.kind !== \"string\" || !value.kind.trim()) return undefined;\n if (typeof value.ref !== \"string\" || !value.ref.trim()) return undefined;\n if (typeof value.detail !== \"string\" || !value.detail.trim()) return undefined;\n return {\n kind: value.kind.trim() as CompiledSurfaceAppliedProposal[\"kind\"],\n ref: value.ref.trim(),\n detail: value.detail.trim(),\n };\n};\n\nconst parseGateRecord = (value: unknown): CompiledSurfaceGateRecord | undefined => {\n if (!isRecord(value) || typeof value.passed !== \"boolean\") return undefined;\n if (typeof value.beforeScore !== \"number\" || typeof value.afterScore !== \"number\" ||\n !Number.isFinite(value.beforeScore) || !Number.isFinite(value.afterScore)) {\n return undefined;\n }\n if (!Array.isArray(value.reasons) || !value.reasons.every((r) => typeof r === \"string\")) {\n return undefined;\n }\n return {\n passed: value.passed,\n beforeScore: value.beforeScore,\n afterScore: value.afterScore,\n reasons: value.reasons,\n };\n};\n\n// Version 1 is accepted only as inert migration data. Version 2 cannot carry\n// restrictions. Its bounded plans are re-proved against live schemas at use;\n// a persisted gate flag or metric version never grants execution authority.\nconst parseCompiledSurfaceFile = (value: unknown): CompiledSurfaceFile | undefined => {\n if (!isRecord(value) || (value.version !== 1 && value.version !== COMPILED_SURFACE_VERSION)) return undefined;\n if (value.version === COMPILED_SURFACE_VERSION) {\n if (!Array.isArray(value.normalizations) || value.normalizations.length > MAX_NORMAL_FORM_PLANS ||\n !value.normalizations.every(isNormalFormPlan) ||\n new Set(value.normalizations.map((plan) => plan.ref)).size !== value.normalizations.length) return undefined;\n if (!Array.isArray(value.actions) || value.actions.length !== 0 ||\n !Array.isArray(value.quarantined) || value.quarantined.length !== 0) return undefined;\n }\n if (!Number.isSafeInteger(value.metricVersion) || (value.metricVersion as number) < 1) {\n return undefined;\n }\n if (!Array.isArray(value.actions) || !value.actions.every((entry) => parseOverlayEntry(entry))) {\n return undefined;\n }\n if (\n !Array.isArray(value.quarantined) ||\n !value.quarantined.every((entry) => parseQuarantineEntry(entry))\n ) {\n return undefined;\n }\n if (\n !Array.isArray(value.applied) ||\n value.applied.length > MAX_COMPILED_SURFACE_PROPOSALS ||\n !value.applied.every((entry) => parseAppliedProposal(entry))\n ) {\n return undefined;\n }\n if (!parseGateRecord(value.gate)) return undefined;\n if (typeof value.evidenceDigest !== \"string\" || !value.evidenceDigest.trim()) return undefined;\n const overlaySeen = new Set<string>();\n for (const entry of value.actions) {\n const parsed = parseOverlayEntry(entry)!;\n if (overlaySeen.has(parsed.ref)) return undefined;\n overlaySeen.add(parsed.ref);\n }\n return {\n version: value.version,\n ...(value.version === COMPILED_SURFACE_VERSION ? { normalizations: value.normalizations as import(\"./normal-form.js\").NormalFormPlan[] } : {}),\n metricVersion: value.metricVersion as number,\n actions: value.actions.map((entry) => parseOverlayEntry(entry)!),\n quarantined: value.quarantined.map((entry) => parseQuarantineEntry(entry)!),\n applied: value.applied.map((entry) => parseAppliedProposal(entry)!),\n gate: parseGateRecord(value.gate)!,\n evidenceDigest: value.evidenceDigest.trim(),\n };\n};\n\n// Public guarded parse for artifact files that did not come from this\n// agent dir: exported artifacts being imported, or certification fixtures.\n// The same validation the store applies to its own file, so nothing trusts\n// an artifact shape the store would refuse to load.\nexport const parseCompiledSurfaceArtifact = (\n value: unknown,\n): CompiledSurfaceFile | undefined => parseCompiledSurfaceFile(value);\n\nexport interface LoadedCompiledSurface {\n file?: CompiledSurfaceFile;\n error?: string;\n}\n\nexport const loadCompiledSurface = (agentDir: string): LoadedCompiledSurface => {\n const file = compiledPath(compiledSurfaceDirectory(agentDir));\n let raw: string;\n try {\n raw = fs.readFileSync(file, \"utf8\");\n } catch (error) {\n // A missing artifact means the surface was never compiled; anything\n // else is damage that callers must surface, not silently rebuild.\n if (errorCode(error) === \"ENOENT\") return {};\n return { error: `compiled surface is unreadable: ${errorText(error)}` };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { error: \"compiled surface is malformed JSON\" };\n }\n const parsedFile = parseCompiledSurfaceFile(parsed);\n if (!parsedFile) return { error: \"compiled surface is invalid\" };\n return { file: parsedFile };\n};\n\nexport const loadCompiledSurfaceAsync = async (\n agentDir: string,\n): Promise<LoadedCompiledSurface> => {\n const file = compiledPath(compiledSurfaceDirectory(agentDir));\n let raw: string;\n try {\n raw = await fs.promises.readFile(file, \"utf8\");\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return {};\n return { error: `compiled surface is unreadable: ${errorText(error)}` };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { error: \"compiled surface is malformed JSON\" };\n }\n const parsedFile = parseCompiledSurfaceFile(parsed);\n return parsedFile ? { file: parsedFile } : { error: \"compiled surface is invalid\" };\n};\n\nexport interface SavedCompiledSurface {\n file: CompiledSurfaceFile;\n written: boolean;\n}\n\nexport const saveCompiledSurface = (\n agentDir: string,\n file: CompiledSurfaceFile,\n): SavedCompiledSurface =>\n withExclusiveFileLock(\n {\n directory: compiledSurfaceDirectory(agentDir),\n lockName: \"compiled.lock\",\n timeoutMessage: \"Timed out waiting for the compiled entropy surface lock\",\n attempts: COMPILED_LOCK_ATTEMPTS,\n delayMs: COMPILED_LOCK_DELAY_MS,\n staleMs: COMPILED_STALE_LOCK_MS,\n },\n () => {\n // A damaged artifact must never be silently rebuilt; fail so the\n // compile records the rejection and leaves the file for recovery.\n const loaded = loadCompiledSurface(agentDir);\n if (loaded.error) throw new Error(loaded.error);\n const target = compiledPath(compiledSurfaceDirectory(agentDir));\n const serialized = `${JSON.stringify(file, null, 2)}\\n`;\n try {\n if (fs.readFileSync(target, \"utf8\") === serialized) return { file, written: false };\n } catch {\n // Missing file: proceed to write.\n }\n writeJsonAtomic(target, file, { space: 2, newline: true, mode: 0o600, dirMode: 0o700 });\n return { file, written: true };\n },\n );\n\nexport const saveCompiledSurfaceAsync = async (\n agentDir: string,\n file: CompiledSurfaceFile,\n): Promise<SavedCompiledSurface> =>\n withExclusiveFileLockAsync(\n {\n directory: compiledSurfaceDirectory(agentDir),\n lockName: \"compiled.lock\",\n timeoutMessage: \"Timed out waiting for the compiled entropy surface lock\",\n attempts: COMPILED_LOCK_ATTEMPTS,\n delayMs: COMPILED_LOCK_DELAY_MS,\n staleMs: COMPILED_STALE_LOCK_MS,\n },\n async () => {\n const loaded = await loadCompiledSurfaceAsync(agentDir);\n if (loaded.error) throw new Error(loaded.error);\n const target = compiledPath(compiledSurfaceDirectory(agentDir));\n const serialized = `${JSON.stringify(file, null, 2)}\\n`;\n try {\n if (await fs.promises.readFile(target, \"utf8\") === serialized) {\n return { file, written: false };\n }\n } catch {\n // Missing file: proceed to write.\n }\n await writeJsonAtomicAsync(target, file, {\n space: 2,\n newline: true,\n mode: 0o600,\n dirMode: 0o700,\n });\n return { file, written: true };\n },\n );\n"],
5
+ "mappings": "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",
6
+ "names": ["error", "fs", "path", "path", "errorCode", "fs"]
7
+ }
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  checkObserve,
7
7
  jevObserveSchema
8
- } from "./chunk-3SIXBW6A.js";
8
+ } from "./chunk-H4YYLQTX.js";
9
9
  import {
10
10
  checkSchema,
11
11
  checkValue,
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-WHBJDTCR.js";
15
15
  import {
16
16
  validationMessage
17
- } from "./chunk-G2F2RDZI.js";
17
+ } from "./chunk-YAPDV6LO.js";
18
18
  import {
19
19
  runAbortable
20
20
  } from "./chunk-7TB7NXSL.js";
@@ -22,7 +22,7 @@ import {
22
22
  ApprovalController,
23
23
  FabricAutoApprovalClassifier,
24
24
  FabricSessionApprovals
25
- } from "./chunk-D4B4CCTA.js";
25
+ } from "./chunk-JHQDS6YP.js";
26
26
  import {
27
27
  resolveJevModelRoute
28
28
  } from "./chunk-B54Z662X.js";
@@ -448,4 +448,4 @@ export {
448
448
  JEV_ACTION_DESCRIPTORS,
449
449
  JevProvider
450
450
  };
451
- //# sourceMappingURL=chunk-QFKHAAZA.js.map
451
+ //# sourceMappingURL=chunk-43MBJKT6.js.map
@@ -658,11 +658,13 @@ var isPrewalkPlanningDirective = (message) => {
658
658
  const custom = message;
659
659
  return custom !== null && typeof custom === "object" && custom.role === "custom" && (custom.customType === PREWALK_ARMED_MESSAGE_TYPE || custom.customType === PREWALK_PLAN_MESSAGE_TYPE);
660
660
  };
661
- var filterPrewalkPlanningDirectives = (messages, visible) => {
662
- if (visible) return { messages, changed: false };
661
+ var filterPrewalkPlanningDirectives = (messages, armed, planRequired) => {
662
+ if (armed && planRequired) return { messages, changed: false };
663
663
  let changed = false;
664
664
  const filtered = messages.filter((message) => {
665
665
  if (!isPrewalkPlanningDirective(message)) return true;
666
+ const custom = message;
667
+ if (armed && custom.customType === PREWALK_ARMED_MESSAGE_TYPE && custom.details?.requirePlan === false) return true;
666
668
  changed = true;
667
669
  return false;
668
670
  });
@@ -1358,6 +1360,7 @@ var FABRIC_COMPONENT_PROVIDER_NAMES = [
1358
1360
  "state",
1359
1361
  "schema",
1360
1362
  "compact",
1363
+ "cache",
1361
1364
  "prewalk",
1362
1365
  "agents",
1363
1366
  "memory",
@@ -1792,4 +1795,4 @@ export {
1792
1795
  captureLoadedFileIdentity,
1793
1796
  runtimeIdentityStatus
1794
1797
  };
1795
- //# sourceMappingURL=chunk-GGETIGM5.js.map
1798
+ //# sourceMappingURL=chunk-7WEYUJCF.js.map