pi-fabric 0.104.3 → 0.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +2 -0
  2. package/THIRD_PARTY_NOTICES.md +2 -2
  3. package/dist/agents.js +6 -6
  4. package/dist/chunks/{chunk-25LXRT3G.js → chunk-3GJJG2FV.js} +1 -1
  5. package/dist/chunks/{chunk-25LXRT3G.js.map → chunk-3GJJG2FV.js.map} +1 -1
  6. package/dist/chunks/{chunk-KYXZJNV6.js → chunk-4O3PFVTC.js} +3 -1
  7. package/dist/chunks/{chunk-KYXZJNV6.js.map → chunk-4O3PFVTC.js.map} +2 -2
  8. package/dist/chunks/{chunk-TFFZVLR2.js → chunk-5HZJ5LTB.js} +44 -2
  9. package/dist/chunks/chunk-5HZJ5LTB.js.map +7 -0
  10. package/dist/chunks/{chunk-BXYWRMBE.js → chunk-6YLQ73DF.js} +49 -11
  11. package/dist/chunks/chunk-6YLQ73DF.js.map +7 -0
  12. package/dist/chunks/{chunk-57CMH4SW.js → chunk-7JU7Z4XQ.js} +2 -2
  13. package/dist/chunks/chunk-7QKKLBHJ.js +33 -0
  14. package/dist/chunks/chunk-7QKKLBHJ.js.map +7 -0
  15. package/dist/chunks/{chunk-SV7ONATB.js → chunk-7XRUMDV7.js} +2 -2
  16. package/dist/chunks/{chunk-WYRBDPPM.js → chunk-ABJCSNZO.js} +2 -2
  17. package/dist/chunks/{chunk-L5LSY3Q6.js → chunk-BOONFV43.js} +133 -7
  18. package/dist/chunks/chunk-BOONFV43.js.map +7 -0
  19. package/dist/chunks/{chunk-QM4IAKBX.js → chunk-BVJBYFHD.js} +2 -2
  20. package/dist/chunks/{chunk-SS7FVARK.js → chunk-C7EEG6SM.js} +2 -2
  21. package/dist/chunks/{chunk-HOX6VW45.js → chunk-CYMDX3XP.js} +1 -1
  22. package/dist/chunks/{chunk-HOX6VW45.js.map → chunk-CYMDX3XP.js.map} +1 -1
  23. package/dist/chunks/chunk-DK35W6U7.js +259 -0
  24. package/dist/chunks/chunk-DK35W6U7.js.map +7 -0
  25. package/dist/chunks/{chunk-UAP4EDZQ.js → chunk-DZ4WN5XJ.js} +3 -3
  26. package/dist/chunks/{chunk-VZQYLEND.js → chunk-FB24AOIJ.js} +35 -33
  27. package/dist/chunks/{chunk-VZQYLEND.js.map → chunk-FB24AOIJ.js.map} +1 -1
  28. package/dist/chunks/{chunk-V7R3NVOS.js → chunk-GJVPP3NN.js} +2 -2
  29. package/dist/chunks/{chunk-UVYTLBS7.js → chunk-GYPDGW27.js} +89 -89
  30. package/dist/chunks/chunk-GYPDGW27.js.map +7 -0
  31. package/dist/chunks/{chunk-ZLWJ3T75.js → chunk-L6PAMWV7.js} +3 -3
  32. package/dist/chunks/{chunk-EMEWYTSW.js → chunk-LOJO6DYE.js} +2 -2
  33. package/dist/chunks/{chunk-BDNV6QMJ.js → chunk-LOLCTWJF.js} +4 -4
  34. package/dist/chunks/{chunk-57Q66QHO.js → chunk-LWRRPPH2.js} +36 -10
  35. package/dist/chunks/chunk-LWRRPPH2.js.map +7 -0
  36. package/dist/chunks/{chunk-4HJNG5LT.js → chunk-M5IN6DMF.js} +6 -6
  37. package/dist/chunks/{chunk-WHARRF3O.js → chunk-M6IRQ3QT.js} +2 -2
  38. package/dist/chunks/{chunk-Y5HBN75E.js → chunk-MQK7POVM.js} +40 -24
  39. package/dist/chunks/chunk-MQK7POVM.js.map +7 -0
  40. package/dist/chunks/chunk-NHJCMJWX.js +6558 -0
  41. package/dist/chunks/chunk-NHJCMJWX.js.map +7 -0
  42. package/dist/chunks/{chunk-QABAX5PC.js → chunk-OQJGPLN5.js} +3 -3
  43. package/dist/chunks/{chunk-CGL7QP4A.js → chunk-PK4NIJEV.js} +10 -1
  44. package/dist/chunks/{chunk-CGL7QP4A.js.map → chunk-PK4NIJEV.js.map} +2 -2
  45. package/dist/chunks/{chunk-W7X4XEQU.js → chunk-PM7NQXS7.js} +2 -2
  46. package/dist/chunks/{chunk-IUQZF2WF.js → chunk-PYFJW3HC.js} +14 -14
  47. package/dist/chunks/chunk-PYFJW3HC.js.map +7 -0
  48. package/dist/chunks/{chunk-OUHI3ULH.js → chunk-PYQM7KPL.js} +2 -2
  49. package/dist/chunks/{chunk-62XUR6SO.js → chunk-QY7YK7M6.js} +2 -2
  50. package/dist/chunks/{chunk-5EPMKW2B.js → chunk-R5F6CHW2.js} +5 -5
  51. package/dist/chunks/{chunk-5EPMKW2B.js.map → chunk-R5F6CHW2.js.map} +1 -1
  52. package/dist/chunks/{chunk-MXONM47J.js → chunk-S3IRPDSO.js} +2 -2
  53. package/dist/chunks/{chunk-J4A3LL6Y.js → chunk-T5CU2GPZ.js} +4 -4
  54. package/dist/chunks/{chunk-YFL34TLP.js → chunk-TFYVSAFU.js} +4 -4
  55. package/dist/chunks/{chunk-4PS6ZPCS.js → chunk-U2UBUKNQ.js} +135 -135
  56. package/dist/chunks/chunk-U2UBUKNQ.js.map +7 -0
  57. package/dist/chunks/{chunk-YJ6NRP2F.js → chunk-WREA4RNR.js} +3 -3
  58. package/dist/chunks/{chunk-23QOLJTO.js → chunk-WYUV6WL3.js} +2 -2
  59. package/dist/chunks/{chunk-QYTIKI7L.js → chunk-X2TRSE7D.js} +2 -2
  60. package/dist/chunks/{chunk-CI2MKLNG.js → chunk-YYSZBD7S.js} +16 -265
  61. package/dist/chunks/chunk-YYSZBD7S.js.map +7 -0
  62. package/dist/chunks/{chunk-AMZEU2WR.js → chunk-ZXKYU6CH.js} +2 -2
  63. package/dist/cli/decisions.js +1 -1
  64. package/dist/cli/mesh.js +2 -2
  65. package/dist/commands/fabric.d.ts.map +1 -1
  66. package/dist/compaction/hook.js +6 -6
  67. package/dist/compaction/owner.js +7 -7
  68. package/dist/components/configuration.js +2 -2
  69. package/dist/config.d.ts +17 -0
  70. package/dist/config.d.ts.map +1 -1
  71. package/dist/core/action-registry.js +6 -6
  72. package/dist/core/media-sanitize.d.ts.map +1 -1
  73. package/dist/core/provider-operations.js.map +1 -1
  74. package/dist/entropy/index.js +9 -8
  75. package/dist/execution-service.d.ts +4 -0
  76. package/dist/execution-service.d.ts.map +1 -1
  77. package/dist/extension-bootstrap.d.ts +7 -0
  78. package/dist/extension-bootstrap.d.ts.map +1 -0
  79. package/dist/extension-bootstrap.js +51 -0
  80. package/dist/extension-bootstrap.js.map +7 -0
  81. package/dist/extension.d.ts +8 -0
  82. package/dist/extension.d.ts.map +1 -0
  83. package/dist/fabric-exec-arguments.d.ts.map +1 -1
  84. package/dist/fabric-exec-tool.d.ts.map +1 -1
  85. package/dist/fabric-runtime-state.d.ts.map +1 -1
  86. package/dist/fabric-runtime-state.js +510 -279
  87. package/dist/fabric-runtime-state.js.map +4 -4
  88. package/dist/index.d.ts +5 -6
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +44 -6429
  91. package/dist/index.js.map +4 -4
  92. package/dist/jev/observation.js +6 -6
  93. package/dist/jev.js +9 -9
  94. package/dist/memory/digest.js +2 -2
  95. package/dist/memory/discovery.js +6 -6
  96. package/dist/memory/extractive-history.d.ts +29 -0
  97. package/dist/memory/extractive-history.d.ts.map +1 -0
  98. package/dist/memory/extractive-history.js +340 -0
  99. package/dist/memory/extractive-history.js.map +7 -0
  100. package/dist/memory/extractive-index.d.ts +46 -0
  101. package/dist/memory/extractive-index.d.ts.map +1 -0
  102. package/dist/memory/file-worker.js +9 -9
  103. package/dist/memory/normalize.js +5 -5
  104. package/dist/memory/search.js +7 -7
  105. package/dist/memory/worker-provider.js +10 -10
  106. package/dist/memory.js +10 -10
  107. package/dist/native-codemode.d.ts +34 -0
  108. package/dist/native-codemode.d.ts.map +1 -0
  109. package/dist/native-discovery.d.ts +16 -0
  110. package/dist/native-discovery.d.ts.map +1 -0
  111. package/dist/native-discovery.js +19 -0
  112. package/dist/native-discovery.js.map +7 -0
  113. package/dist/providers/jev-provider.js +9 -9
  114. package/dist/providers/memory-provider.js +9 -9
  115. package/dist/providers/pi-tools-provider.d.ts.map +1 -1
  116. package/dist/residency/host.js +13 -13
  117. package/dist/residency/pi-entry.js +13 -13
  118. package/dist/runtime/core-override-guest-types.js +2 -2
  119. package/dist/runtime/cpython-child-source.d.ts.map +1 -1
  120. package/dist/runtime/cpython-runtime.d.ts.map +1 -1
  121. package/dist/runtime/cpython-runtime.js +34 -6
  122. package/dist/runtime/cpython-runtime.js.map +2 -2
  123. package/dist/runtime/deadline-pause.d.ts +26 -0
  124. package/dist/runtime/deadline-pause.d.ts.map +1 -0
  125. package/dist/runtime/dynamic-guest-types.d.ts +2 -0
  126. package/dist/runtime/dynamic-guest-types.d.ts.map +1 -1
  127. package/dist/runtime/dynamic-guest-types.js +5 -3
  128. package/dist/runtime/guest-types.d.ts +1 -1
  129. package/dist/runtime/guest-types.d.ts.map +1 -1
  130. package/dist/runtime/guest-types.js +1 -1
  131. package/dist/runtime/kernel.d.ts +6 -0
  132. package/dist/runtime/kernel.d.ts.map +1 -1
  133. package/dist/runtime/monty-runtime.d.ts.map +1 -1
  134. package/dist/runtime/monty-runtime.js +25 -4
  135. package/dist/runtime/monty-runtime.js.map +2 -2
  136. package/dist/runtime/native-codemode-guest.d.ts +2 -0
  137. package/dist/runtime/native-codemode-guest.d.ts.map +1 -0
  138. package/dist/runtime/native-codemode-types.d.ts +2 -0
  139. package/dist/runtime/native-codemode-types.d.ts.map +1 -0
  140. package/dist/runtime/node-process-child-source.d.ts.map +1 -1
  141. package/dist/runtime/node-process-runtime.d.ts.map +1 -1
  142. package/dist/runtime/node-process-runtime.js +3 -2
  143. package/dist/runtime/quickjs-runtime.d.ts +1 -1
  144. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  145. package/dist/runtime/quickjs-runtime.js +2 -1
  146. package/dist/runtime/typescript-kernel.js +10 -9
  147. package/dist/runtime/typescript-kernel.js.map +1 -1
  148. package/dist/storage/retention.d.ts +7 -0
  149. package/dist/storage/retention.d.ts.map +1 -1
  150. package/dist/type-error-guidance.js +1 -1
  151. package/dist/ui/border-status-editor.d.ts +3 -0
  152. package/dist/ui/border-status-editor.d.ts.map +1 -1
  153. package/dist/ui/conversation.d.ts +1 -0
  154. package/dist/ui/conversation.d.ts.map +1 -1
  155. package/dist/ui/conversation.js +28 -5
  156. package/dist/ui/conversation.js.map +2 -2
  157. package/dist/ui/dashboard.js +10 -10
  158. package/dist/ui/settings-section-context.d.ts +2 -0
  159. package/dist/ui/settings-section-context.d.ts.map +1 -1
  160. package/dist/ui/settings-sections-execution.d.ts.map +1 -1
  161. package/dist/ui/settings-sections-lifecycle.d.ts +1 -0
  162. package/dist/ui/settings-sections-lifecycle.d.ts.map +1 -1
  163. package/dist/ui/settings-sections.d.ts +2 -0
  164. package/dist/ui/settings-sections.d.ts.map +1 -1
  165. package/dist/ui/settings-values.d.ts +3 -0
  166. package/dist/ui/settings-values.d.ts.map +1 -1
  167. package/dist/ui/settings.d.ts.map +1 -1
  168. package/dist/ui/settings.js +64 -1
  169. package/dist/ui/settings.js.map +2 -2
  170. package/dist/verified/generated/authority-kernel.js +1 -1
  171. package/dist/verified/generated/kernel.js +1 -1
  172. package/dist/verified/generated/lifecycle-kernel.js +1 -1
  173. package/dist/verified/generated/manifest.json +7 -7
  174. package/dist/verified/generated/provider-kernel.js +1 -1
  175. package/dist/verified/generated/storage-kernel.js +1 -1
  176. package/docs/codemode-parity.md +50 -0
  177. package/docs/configuration.md +37 -1
  178. package/docs/extractive-history.md +171 -0
  179. package/docs/interface.md +1 -1
  180. package/docs/kitty-images.md +3 -3
  181. package/docs/provider-capabilities.md +1 -1
  182. package/docs/verified-kernels.md +1 -1
  183. package/package.json +2 -2
  184. package/scripts/test-verified-kernels.mjs +1 -1
  185. package/scripts/verified-kernels.mjs +1 -1
  186. package/skillsets/typescript/fabric-exec/SKILL.md +2 -2
  187. package/dist/chunks/chunk-4PS6ZPCS.js.map +0 -7
  188. package/dist/chunks/chunk-57Q66QHO.js.map +0 -7
  189. package/dist/chunks/chunk-BXYWRMBE.js.map +0 -7
  190. package/dist/chunks/chunk-CI2MKLNG.js.map +0 -7
  191. package/dist/chunks/chunk-IUQZF2WF.js.map +0 -7
  192. package/dist/chunks/chunk-L5LSY3Q6.js.map +0 -7
  193. package/dist/chunks/chunk-TFFZVLR2.js.map +0 -7
  194. package/dist/chunks/chunk-UVYTLBS7.js.map +0 -7
  195. package/dist/chunks/chunk-Y5HBN75E.js.map +0 -7
  196. /package/dist/chunks/{chunk-57CMH4SW.js.map → chunk-7JU7Z4XQ.js.map} +0 -0
  197. /package/dist/chunks/{chunk-SV7ONATB.js.map → chunk-7XRUMDV7.js.map} +0 -0
  198. /package/dist/chunks/{chunk-WYRBDPPM.js.map → chunk-ABJCSNZO.js.map} +0 -0
  199. /package/dist/chunks/{chunk-QM4IAKBX.js.map → chunk-BVJBYFHD.js.map} +0 -0
  200. /package/dist/chunks/{chunk-SS7FVARK.js.map → chunk-C7EEG6SM.js.map} +0 -0
  201. /package/dist/chunks/{chunk-UAP4EDZQ.js.map → chunk-DZ4WN5XJ.js.map} +0 -0
  202. /package/dist/chunks/{chunk-V7R3NVOS.js.map → chunk-GJVPP3NN.js.map} +0 -0
  203. /package/dist/chunks/{chunk-ZLWJ3T75.js.map → chunk-L6PAMWV7.js.map} +0 -0
  204. /package/dist/chunks/{chunk-EMEWYTSW.js.map → chunk-LOJO6DYE.js.map} +0 -0
  205. /package/dist/chunks/{chunk-BDNV6QMJ.js.map → chunk-LOLCTWJF.js.map} +0 -0
  206. /package/dist/chunks/{chunk-4HJNG5LT.js.map → chunk-M5IN6DMF.js.map} +0 -0
  207. /package/dist/chunks/{chunk-WHARRF3O.js.map → chunk-M6IRQ3QT.js.map} +0 -0
  208. /package/dist/chunks/{chunk-QABAX5PC.js.map → chunk-OQJGPLN5.js.map} +0 -0
  209. /package/dist/chunks/{chunk-W7X4XEQU.js.map → chunk-PM7NQXS7.js.map} +0 -0
  210. /package/dist/chunks/{chunk-OUHI3ULH.js.map → chunk-PYQM7KPL.js.map} +0 -0
  211. /package/dist/chunks/{chunk-62XUR6SO.js.map → chunk-QY7YK7M6.js.map} +0 -0
  212. /package/dist/chunks/{chunk-MXONM47J.js.map → chunk-S3IRPDSO.js.map} +0 -0
  213. /package/dist/chunks/{chunk-J4A3LL6Y.js.map → chunk-T5CU2GPZ.js.map} +0 -0
  214. /package/dist/chunks/{chunk-YFL34TLP.js.map → chunk-TFYVSAFU.js.map} +0 -0
  215. /package/dist/chunks/{chunk-YJ6NRP2F.js.map → chunk-WREA4RNR.js.map} +0 -0
  216. /package/dist/chunks/{chunk-23QOLJTO.js.map → chunk-WYUV6WL3.js.map} +0 -0
  217. /package/dist/chunks/{chunk-QYTIKI7L.js.map → chunk-X2TRSE7D.js.map} +0 -0
  218. /package/dist/chunks/{chunk-AMZEU2WR.js.map → chunk-ZXKYU6CH.js.map} +0 -0
package/README.md CHANGED
@@ -158,12 +158,14 @@ See the [interface & commands reference](docs/interface.md) for every view, keyb
158
158
 
159
159
  - [Configuration](docs/configuration.md): `fabric.json`, code modes, tool capture, approvals, and budgets.
160
160
  - [Execution kernels](docs/kernels.md): exclusive TypeScript/Python selection, Monty sandboxing, CPython escape hatch, agent inheritance, and examples.
161
+ - [Native codemode APIs](docs/codemode-parity.md): the `models` namespace, native classifiers and images, branch-local script state, output helpers, and per-call limits.
161
162
  - [Prompt cache](docs/prompt-cache.md): honest cache observations and optional, time-bounded native warming leases.
162
163
  - [Thinking control](docs/thinking.md): scoped host-session reasoning effort with configured bounds that children inherit and never widen.
163
164
  - [Optional durable Pi runner](docs/durable-pi.md): explicit hosted-backend registration, persistent submissions, recovery boundaries, and unchanged default runner behavior.
164
165
  - [Durable decisions](docs/decisions.md): pending approvals and questions in the project mesh, headless approvals, routed child dialogs, `/fabric decisions`, and the `pi-fabric decisions` CLI.
165
166
  - [Saved programs](docs/programs.md): content-addressed programs, nested `programs.run` with the caller's capabilities, `/fabric programs`, and host runs through `/fabric run` or an event.
166
167
  - [Memory & recall](docs/memory-recall.md): compact ranked hits, uniform follow calls, lossless expansion, and guest-local `memory.walk` computation.
168
+ - [Extractive history](docs/extractive-history.md): opt-in native-classifier salience, source-preserving selection, bounded context, and deterministic fallback; configure it through JSON or the TUI.
167
169
  - [Interface & commands](docs/interface.md): dashboard, settings, keybindings, slash commands, and headless runs.
168
170
  - [Agents, actors & mesh](docs/agents.md): model handoff, `/fabric prewalk`, runners, transports, actors, councils, recursive queries, and durable coordination.
169
171
  - [Durable residency through Pi](docs/residency-runtime.md): background host lifecycle and the Pi-runtime launcher boundary.
@@ -8,10 +8,10 @@ Haydn Paterson, licensed under MIT. This private artifact is not loaded by the
8
8
  Pi extension, which continues to use Pi's host-provided TypeBox. The complete
9
9
  license is distributed at [docs/licenses/typebox-mit.txt](docs/licenses/typebox-mit.txt).
10
10
 
11
- ## Bend 2.0.34
11
+ ## Bend 2.0.35
12
12
 
13
13
  The generated policy kernel includes Bend's emitted JavaScript trampoline and
14
- compiled Base primitives from [Bend 2.0.34](https://github.com/bendlang/bend/tree/v2.0.34),
14
+ compiled Base primitives from [Bend 2.0.35](https://github.com/bendlang/bend/tree/v2.0.35),
15
15
  Copyright 2026 HigherOrderCO, licensed under Apache-2.0. Pi Fabric selects the
16
16
  ABI library exports, adapts constructor tags at the boundary, and tree-shakes
17
17
  unused runtime code.
package/dist/agents.js CHANGED
@@ -1,10 +1,10 @@
1
- import {
2
- AGENTS_ACTION_DESCRIPTORS,
3
- normalizeAgentRunRequest
4
- } from "./chunks/chunk-V7R3NVOS.js";
5
1
  import {
6
2
  validateAgentResult
7
3
  } from "./chunks/chunk-3QECYQGA.js";
4
+ import {
5
+ AGENTS_ACTION_DESCRIPTORS,
6
+ normalizeAgentRunRequest
7
+ } from "./chunks/chunk-GJVPP3NN.js";
8
8
  import {
9
9
  AgentAdmission,
10
10
  assertAgentTask,
@@ -17,12 +17,12 @@ import {
17
17
  import "./chunks/chunk-IIPKG52D.js";
18
18
  import "./chunks/chunk-ZLNJDTCN.js";
19
19
  import "./chunks/chunk-V73NIH6B.js";
20
- import "./chunks/chunk-OUHI3ULH.js";
20
+ import "./chunks/chunk-PYQM7KPL.js";
21
21
  import {
22
22
  actionArgNormalizer
23
23
  } from "./chunks/chunk-NQOEHX62.js";
24
24
  import "./chunks/chunk-4RTHQGES.js";
25
- import "./chunks/chunk-HOX6VW45.js";
25
+ import "./chunks/chunk-CYMDX3XP.js";
26
26
 
27
27
  // src/agents/service-schema.ts
28
28
  import { Value } from "typebox/value";
@@ -1326,4 +1326,4 @@ export {
1326
1326
  MESH_MAX_SCHEDULE_AHEAD_MS,
1327
1327
  MeshStore
1328
1328
  };
1329
- //# sourceMappingURL=chunk-25LXRT3G.js.map
1329
+ //# sourceMappingURL=chunk-3GJJG2FV.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/mesh/store.ts", "../../src/verified/generated/storage-kernel.js", "../../src/verified/storage.ts"],
4
- "sourcesContent": ["import { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n writeFileAtomic,\n encodeOwnerIdentityLine,\n lockOwnerLiveness,\n SHORT_LOCK_MAX_HOLD_MS,\n} from \"../core/atomic-write.js\";\nimport { readJsonlPage } from \"../log-tail.js\";\nimport { captureStoragePut, captureStorageDelete, storageRevision } from \"../verified/storage.js\";\nimport type { FabricMessageSender } from \"../protocol.js\";\nimport { processSender } from \"../scope.js\";\n\nexport interface MeshIdentity {\n id: string;\n name: string;\n kind: \"main\" | \"actor\" | \"agent\";\n sessionId?: string;\n}\n\nexport interface MeshEvent {\n id: string;\n sequence: number;\n topic: string;\n kind: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n createdAt: number;\n /** Set on events appended through a scoped external grant (`pi-fabric mesh post`). */\n origin?: \"external\";\n untrusted?: true;\n grantId?: string;\n /** Set on events released from a pending schedule; the event id is the schedule id. */\n scheduled?: { dueAt: number; key?: string };\n /** Host-stamped authority of the publishing process; absent from older builds and grant posts. */\n sender?: FabricMessageSender;\n}\n\n/** Host-internal append request used inside {@link MeshStore.transact}. */\nexport interface MeshAppendInput {\n id?: string;\n topic: string;\n kind?: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n origin?: \"external\";\n untrusted?: true;\n grantId?: string;\n scheduled?: { dueAt: number; key?: string };\n sender?: FabricMessageSender;\n /** A tighter per-event byte ceiling than the store's own. */\n maxEventBytes?: number;\n}\n\n/** A pending scheduled event; released into its topic log once due. */\nexport interface MeshSchedule {\n id: string;\n key?: string;\n topic: string;\n kind: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n dueAt: number;\n createdAt: number;\n /** Stamped when scheduled; carried onto the released event. */\n sender?: FabricMessageSender;\n}\n\ninterface MeshScheduleFile {\n format: 1;\n schedules: MeshSchedule[];\n}\n\nexport interface MeshTailResult {\n events: MeshEvent[];\n nextOffset: number;\n}\n\nexport interface MeshStateEntry {\n key: string;\n value: unknown;\n version: number;\n updatedAt: number;\n updatedBy: MeshIdentity;\n}\n\ninterface MeshStateFile {\n format: 1 | 2;\n revisionFormat?: 2;\n entries: Record<string, MeshStateEntry>;\n versions?: Record<string, number>;\n tombstoneOrder?: string[];\n /** Persisted allocation clock; never evicted with per-key tombstones. */\n highWater?: number;\n}\n\nexport interface MeshStoreOptions {\n maxEventLogBytes?: number;\n retainedEventLogBytes?: number;\n maxStateBytes?: number;\n maxStateTombstones?: number;\n lockTimeoutMs?: number;\n staleLockMs?: number;\n}\n\nconst TOPIC_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,127}$/;\nconst KEY_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,255}$/;\n\nexport const validateMeshTopic = (topic: string): void => {\n if (!TOPIC_PATTERN.test(topic)) throw new Error(`Invalid Fabric mesh topic: ${topic}`);\n};\nconst LOCK_TIMEOUT_MS = 10_000;\nconst STALE_LOCK_MS = 30_000;\nconst DEFAULT_MAX_EVENT_LOG_BYTES = 64 * 1024 * 1024;\nconst DEFAULT_RETAINED_EVENT_LOG_BYTES = 16 * 1024 * 1024;\nconst DEFAULT_MAX_STATE_BYTES = 32 * 1024 * 1024;\nconst DEFAULT_MAX_STATE_TOMBSTONES = 10_000;\nconst EVENT_READ_PAGE_BYTES = 4 * 1024 * 1024;\nconst EVENT_READ_CHUNK_BYTES = 64 * 1024;\nconst CURSOR_OFFSET_BASE = 2 ** 32;\nexport const MESH_MAX_PENDING_SCHEDULES = 1_000;\nexport const MESH_MAX_SCHEDULE_AHEAD_MS = 366 * 24 * 60 * 60 * 1_000;\nconst MAX_SCHEDULE_FILE_BYTES = 16 * 1024 * 1024;\nconst SCHEDULE_KEY_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,127}$/;\n\nconst delay = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\nconst errorCode = (error: unknown): string | undefined =>\n error instanceof Error && \"code\" in error && typeof error.code === \"string\"\n ? error.code\n : undefined;\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 {\n return false;\n }\n};\n\nconst jsonClone = <T>(value: T): T => {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) throw new Error(\"Mesh values must be JSON-serializable\");\n return JSON.parse(serialized) as T;\n};\n\nconst isMeshStateFile = (value: unknown): value is MeshStateFile => {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n ![1, 2].includes((value as { format?: unknown }).format as number)\n ) {\n return false;\n }\n const entries = (value as { entries?: unknown }).entries;\n return typeof entries === \"object\" && entries !== null && !Array.isArray(entries);\n};\n\nconst recoverConcatenatedState = (serialized: string): MeshStateFile | undefined => {\n const snapshots: MeshStateFile[] = [];\n let documents = 0;\n let start = -1;\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let index = 0; index < serialized.length; index += 1) {\n const character = serialized[index]!;\n if (start < 0) {\n if (/\\s/.test(character)) continue;\n if (character !== \"{\") return undefined;\n start = index;\n depth = 1;\n continue;\n }\n if (inString) {\n if (escaped) escaped = false;\n else if (character === \"\\\\\") escaped = true;\n else if (character === '\"') inString = false;\n continue;\n }\n if (character === '\"') inString = true;\n else if (character === \"{\") depth += 1;\n else if (character === \"}\") {\n depth -= 1;\n if (depth !== 0) continue;\n try {\n const parsed: unknown = JSON.parse(serialized.slice(start, index + 1));\n documents += 1;\n if (isMeshStateFile(parsed)) snapshots.push(parsed);\n } catch {\n return undefined;\n }\n start = -1;\n }\n }\n\n return start < 0 && documents > 1 ? snapshots.at(-1) : undefined;\n};\n\nconst compareSchedules = (left: MeshSchedule, right: MeshSchedule): number =>\n left.dueAt - right.dueAt || left.createdAt - right.createdAt || left.id.localeCompare(right.id);\n\nconst isMeshSchedule = (value: unknown): value is MeshSchedule => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const entry = value as Partial<MeshSchedule>;\n return typeof entry.id === \"string\" && typeof entry.topic === \"string\" &&\n typeof entry.kind === \"string\" && typeof entry.from === \"object\" && entry.from !== null &&\n Number.isSafeInteger(entry.dueAt) && Number.isSafeInteger(entry.createdAt) &&\n (entry.key === undefined || typeof entry.key === \"string\");\n};\n\nconst emptyState = (): MeshStateFile => ({ format: 1, revisionFormat: 2, entries: {}, highWater: 0 });\n\nconst readState = (filePath: string, maxBytes: number, recoverDamage = true): MeshStateFile => {\n let serialized: string;\n try {\n const stat = fs.statSync(filePath);\n if (stat.size > maxBytes) throw new Error(`state exceeds ${maxBytes} bytes`);\n if (stat.size === 0 && recoverDamage) return emptyState();\n serialized = fs.readFileSync(filePath, \"utf8\");\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return emptyState();\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read Fabric mesh state: ${message}`);\n }\n if (!serialized.trim() && recoverDamage) return emptyState();\n try {\n const parsed: unknown = JSON.parse(serialized);\n if (isMeshStateFile(parsed)) return parsed;\n throw new Error(\"invalid state format\");\n } catch (error) {\n // Failed parsing must not silently erase the allocation clock. Read-only\n // startup can tolerate damage, but mutations require a repaired snapshot.\n const recovered = recoverConcatenatedState(serialized);\n if (recovered) return recovered;\n if (!recoverDamage) throw new Error(\"Failed to read Fabric mesh state: invalid state format\");\n // Preserve the original bytes at this path as a barrier to clock reset.\n return emptyState();\n }\n};\n\nconst atomicWrite = (filePath: string, value: unknown, maxBytes = Number.POSITIVE_INFINITY): void => {\n const serialized = JSON.stringify(value, null, 2);\n if (Buffer.byteLength(serialized, \"utf8\") > maxBytes) {\n throw new Error(`Fabric mesh state exceeds ${maxBytes} bytes`);\n }\n writeFileAtomic(filePath, serialized);\n};\n\n// Host invariant for the proved reducer: the persisted clock covers every\n// issued token. Legacy files can seed only from retained entries/tombstones;\n// tokens already evicted before this migration cannot be reconstructed.\nconst stateSlot = (state: MeshStateFile, key: string): {\n present: boolean; version: number; highWater: number;\n} => {\n if (state.versions !== undefined &&\n (typeof state.versions !== \"object\" || state.versions === null || Array.isArray(state.versions))) {\n throw new Error(\"Invalid Fabric mesh revision table\");\n }\n let retainedMaximum = 0;\n for (const revision of Object.values(state.versions ?? {})) {\n retainedMaximum = Math.max(retainedMaximum, storageRevision(revision));\n }\n for (const [entryKey, entry] of Object.entries(state.entries)) {\n if (typeof entry !== \"object\" || entry === null || entry.key !== entryKey) {\n throw new Error(\"Invalid Fabric mesh state entry\");\n }\n const version = storageRevision(entry.version);\n const retained = state.versions !== undefined && Object.hasOwn(state.versions, entryKey)\n ? state.versions[entryKey] : undefined;\n if (version === 0 || (retained !== undefined && retained !== version)) {\n throw new Error(\"Inconsistent Fabric mesh revision\");\n }\n retainedMaximum = Math.max(retainedMaximum, version);\n }\n // New snapshots require their clock: losing it must not look like legacy\n // migration and silently reissue revisions from an evicted history.\n if (Object.hasOwn(state, \"revisionFormat\") && state.revisionFormat !== 2) {\n throw new Error(\"Unsupported Fabric mesh revision protocol\");\n }\n if ((state.format === 2 || state.revisionFormat === 2) && !Object.hasOwn(state, \"highWater\")) {\n throw new Error(\"Missing Fabric mesh high-water revision\");\n }\n const highWater = Object.hasOwn(state, \"highWater\")\n ? storageRevision(state.highWater) : retainedMaximum;\n if (highWater < retainedMaximum) throw new Error(\"Inconsistent Fabric mesh high-water revision\");\n const present = Object.hasOwn(state.entries, key);\n const version = present ? state.entries[key]!.version\n : state.versions !== undefined && Object.hasOwn(state.versions, key) ? state.versions[key]! : 0;\n return { present, version, highWater };\n};\n\nconst compactStateTombstones = (state: MeshStateFile, maxTombstones: number): void => {\n state.versions ??= {};\n const orderedKeys: string[] = [];\n const seen = new Set<string>();\n for (const key of state.tombstoneOrder ?? []) {\n if (Object.hasOwn(state.entries, key) || !Object.hasOwn(state.versions, key) || seen.has(key)) continue;\n seen.add(key);\n orderedKeys.push(key);\n }\n for (const key of Object.keys(state.versions)) {\n if (Object.hasOwn(state.entries, key) || seen.has(key)) continue;\n seen.add(key);\n orderedKeys.push(key);\n }\n const retainedKeys = orderedKeys.slice(-maxTombstones);\n const retained = new Set(retainedKeys);\n for (const key of Object.keys(state.versions)) {\n if (!Object.hasOwn(state.entries, key) && !retained.has(key)) delete state.versions[key];\n }\n state.tombstoneOrder = retainedKeys;\n};\n\nexport class MeshStore {\n readonly #eventsPath: string;\n readonly #statePath: string;\n readonly #counterPath: string;\n readonly #generationPath: string;\n readonly #lockPath: string;\n readonly #maxEventLogBytes: number;\n readonly #retainedEventLogBytes: number;\n readonly #maxStateBytes: number;\n readonly #maxStateTombstones: number;\n readonly #lockTimeoutMs: number;\n readonly #staleLockMs: number;\n #stateCache:\n | { device: number; inode: number; size: number; modifiedAt: number; state: MeshStateFile }\n | undefined;\n readonly #schedulesPath: string;\n #scheduleCache:\n | { inode: number; size: number; modifiedAt: number; file: MeshScheduleFile; error?: string }\n | undefined;\n\n constructor(\n readonly root: string,\n readonly maxEventBytes: number,\n readonly maxReadEvents: number,\n options: MeshStoreOptions = {},\n ) {\n this.#eventsPath = path.join(root, \"events.jsonl\");\n this.#statePath = path.join(root, \"state.json\");\n this.#counterPath = path.join(root, \"sequence\");\n this.#generationPath = path.join(root, \"generation\");\n this.#lockPath = path.join(root, \".lock\");\n // Pending schedules live beside state.json, outside the verified storage\n // revision table: they are serialized by this lock, not by key CAS.\n this.#schedulesPath = path.join(root, \"schedules.json\");\n this.#maxEventLogBytes = Math.min(\n CURSOR_OFFSET_BASE - 1,\n Math.max(maxEventBytes + 2, Math.floor(options.maxEventLogBytes ?? DEFAULT_MAX_EVENT_LOG_BYTES)),\n );\n this.#retainedEventLogBytes = Math.min(\n this.#maxEventLogBytes - 1,\n Math.max(\n maxEventBytes + 1,\n Math.floor(options.retainedEventLogBytes ?? DEFAULT_RETAINED_EVENT_LOG_BYTES),\n ),\n );\n this.#maxStateBytes = Math.max(\n maxEventBytes * 2,\n Math.floor(options.maxStateBytes ?? DEFAULT_MAX_STATE_BYTES),\n );\n this.#maxStateTombstones = Math.max(\n 1,\n Math.floor(options.maxStateTombstones ?? DEFAULT_MAX_STATE_TOMBSTONES),\n );\n this.#lockTimeoutMs = Math.max(100, Math.floor(options.lockTimeoutMs ?? LOCK_TIMEOUT_MS));\n this.#staleLockMs = Math.max(100, Math.floor(options.staleLockMs ?? STALE_LOCK_MS));\n fs.mkdirSync(root, { recursive: true, mode: 0o700 });\n }\n\n async publish(input: {\n topic: string;\n kind?: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n /** Host-only: publish on behalf of another authority (an actor's scope). */\n sender?: FabricMessageSender;\n }): Promise<MeshEvent> {\n this.#validateTopic(input.topic);\n if (input.to !== undefined && !input.to.trim()) throw new Error(\"Mesh recipient is empty\");\n const eventData = input.data === undefined ? undefined : jsonClone(input.data);\n const sender = input.sender ?? processSender();\n return this.#withLock(() => {\n // Any write that already holds the lock also releases due schedules first,\n // so the log keeps due-time order relative to this event. Damaged\n // schedule state must not block ordinary publishing.\n try { this.#releaseDueLocked(Date.now()); } catch { /* schedule mutations report it */ }\n return this.#appendLocked({ ...input, ...(eventData !== undefined ? { data: eventData } : {}), sender });\n });\n }\n\n /**\n * Host-internal: runs `operation` under the mesh lock with an append\n * capability, for side stores (grants) that must commit with an event.\n */\n async transact<T>(operation: (append: (input: MeshAppendInput) => MeshEvent) => T): Promise<T> {\n return this.#withLock(() => {\n try { this.#releaseDueLocked(Date.now()); } catch { /* schedule mutations report it */ }\n return operation((input) => {\n this.#validateTopic(input.topic);\n return this.#appendLocked(input);\n });\n });\n }\n\n #appendLocked(input: MeshAppendInput): MeshEvent {\n this.#repairEventLog();\n const sequence = Math.max(this.#readSequence(), this.#readLastEventSequence()) + 1;\n const event: MeshEvent = {\n id: input.id ?? randomUUID(),\n sequence,\n topic: input.topic,\n kind: input.kind?.trim() || \"message\",\n from: jsonClone(input.from),\n ...(input.to ? { to: input.to } : {}),\n ...(input.text !== undefined ? { text: input.text } : {}),\n ...(input.data !== undefined ? { data: jsonClone(input.data) } : {}),\n createdAt: Date.now(),\n ...(input.origin ? { origin: input.origin } : {}),\n ...(input.untrusted ? { untrusted: true as const } : {}),\n ...(input.grantId ? { grantId: input.grantId } : {}),\n ...(input.scheduled ? { scheduled: { ...input.scheduled } } : {}),\n ...(input.sender ? { sender: jsonClone(input.sender) } : {}),\n };\n const line = JSON.stringify(event);\n const limit = Math.min(this.maxEventBytes, input.maxEventBytes ?? this.maxEventBytes);\n if (Buffer.byteLength(line, \"utf8\") > limit) {\n throw new Error(`Mesh event exceeds ${limit} bytes`);\n }\n fs.appendFileSync(this.#eventsPath, `${line}\\n`, { encoding: \"utf8\", mode: 0o600 });\n atomicWrite(this.#counterPath, sequence);\n this.#compactEventLog();\n return event;\n }\n\n /**\n * Stores a pending event released into `topic` once `dueAt` passes. A `key`\n * replaces any pending schedule with that key in the same locked write, so\n * concurrent publishers never leave two schedules for one key.\n */\n async schedule(input: {\n topic: string;\n kind?: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n dueAt: number;\n key?: string;\n }, now = Date.now()): Promise<MeshSchedule> {\n this.#validateTopic(input.topic);\n if (input.to !== undefined && !input.to.trim()) throw new Error(\"Mesh recipient is empty\");\n if (input.key !== undefined && !SCHEDULE_KEY_PATTERN.test(input.key)) {\n throw new Error(`Invalid Fabric mesh schedule key: ${input.key}`);\n }\n if (!Number.isSafeInteger(input.dueAt) || input.dueAt < 0) {\n throw new Error(\"Mesh schedule due time must be a nonnegative epoch millisecond integer\");\n }\n if (input.dueAt > now + MESH_MAX_SCHEDULE_AHEAD_MS) {\n throw new Error(\"Mesh schedules may be at most 366 days ahead\");\n }\n const schedule: MeshSchedule = {\n id: randomUUID(),\n ...(input.key !== undefined ? { key: input.key } : {}),\n topic: input.topic,\n kind: input.kind?.trim() || \"message\",\n from: jsonClone(input.from),\n ...(input.to ? { to: input.to } : {}),\n ...(input.text !== undefined ? { text: input.text } : {}),\n ...(input.data !== undefined ? { data: jsonClone(input.data) } : {}),\n dueAt: input.dueAt,\n createdAt: now,\n sender: processSender(),\n };\n // Reject at schedule time what release could never append.\n const released: MeshEvent = {\n id: schedule.id, sequence: Number.MAX_SAFE_INTEGER, topic: schedule.topic, kind: schedule.kind,\n from: schedule.from, ...(schedule.to ? { to: schedule.to } : {}),\n ...(schedule.text !== undefined ? { text: schedule.text } : {}),\n ...(schedule.data !== undefined ? { data: schedule.data } : {}),\n createdAt: Number.MAX_SAFE_INTEGER,\n scheduled: { dueAt: schedule.dueAt, ...(schedule.key !== undefined ? { key: schedule.key } : {}) },\n ...(schedule.sender ? { sender: schedule.sender } : {}),\n };\n if (Buffer.byteLength(JSON.stringify(released), \"utf8\") > this.maxEventBytes) {\n throw new Error(`Mesh event exceeds ${this.maxEventBytes} bytes`);\n }\n return this.#withLock(() => {\n const file = this.#readSchedules(false);\n const pending = file.schedules.filter((entry) => input.key === undefined || entry.key !== input.key);\n if (pending.length >= MESH_MAX_PENDING_SCHEDULES) {\n throw new Error(`At most ${MESH_MAX_PENDING_SCHEDULES} mesh schedules may be pending`);\n }\n pending.push(schedule);\n this.#writeSchedules(pending);\n this.#releaseDueLocked(now);\n return jsonClone(schedule);\n });\n }\n\n /** Removes the pending schedule with `key`, if any. */\n async unschedule(key: string): Promise<{ removed: boolean }> {\n if (!SCHEDULE_KEY_PATTERN.test(key)) throw new Error(`Invalid Fabric mesh schedule key: ${key}`);\n return this.#withLock(() => {\n const file = this.#readSchedules(false);\n const pending = file.schedules.filter((entry) => entry.key !== key);\n if (pending.length === file.schedules.length) return { removed: false };\n this.#writeSchedules(pending);\n return { removed: true };\n });\n }\n\n /** Pending schedules by due time; a due one stays listed until a releaser appends it. */\n scheduled(input: { topic?: string; limit?: number } = {}): MeshSchedule[] {\n if (input.topic !== undefined) this.#validateTopic(input.topic);\n const limit = Math.max(1, Math.min(Math.floor(input.limit ?? 100), MESH_MAX_PENDING_SCHEDULES));\n return this.#readSchedules(true).schedules\n .filter((entry) => input.topic === undefined || entry.topic === input.topic)\n .sort(compareSchedules)\n .slice(0, limit)\n .map((entry) => jsonClone(entry));\n }\n\n /** Earliest pending due time, read without the lock (one stat when unchanged). */\n nextScheduleDueAt(): number | undefined {\n let next: number | undefined;\n for (const entry of this.#readSchedules(true).schedules) {\n if (next === undefined || entry.dueAt < next) next = entry.dueAt;\n }\n return next;\n }\n\n /**\n * Appends every due schedule to its topic and removes it, under the mesh\n * lock, so concurrent releasers (monitors, resident hosts, CLI posts) append\n * each schedule once. The lock is taken only when something is due.\n */\n async releaseDueSchedules(now = Date.now()): Promise<MeshEvent[]> {\n const next = this.nextScheduleDueAt();\n if (next === undefined || next > now) return [];\n return this.#withLock(() => this.#releaseDueLocked(now));\n }\n\n #releaseDueLocked(now: number): MeshEvent[] {\n if (!fs.existsSync(this.#schedulesPath)) return [];\n const file = this.#readSchedules(false);\n const due = file.schedules.filter((entry) => entry.dueAt <= now).sort(compareSchedules);\n if (due.length === 0) return [];\n const released: MeshEvent[] = [];\n const releasedIds = new Set<string>();\n try {\n // Events first, then the shrunken schedule file: a crash in between\n // re-releases with the same event id (at-least-once, dedupe by id).\n for (const entry of due) {\n released.push(this.#appendLocked({\n id: entry.id,\n topic: entry.topic,\n kind: entry.kind,\n from: entry.from,\n ...(entry.to ? { to: entry.to } : {}),\n ...(entry.text !== undefined ? { text: entry.text } : {}),\n ...(entry.data !== undefined ? { data: entry.data } : {}),\n scheduled: { dueAt: entry.dueAt, ...(entry.key !== undefined ? { key: entry.key } : {}) },\n // Older schedules stay unstamped: the releasing host never lends its own authority.\n ...(entry.sender ? { sender: entry.sender } : {}),\n }));\n releasedIds.add(entry.id);\n }\n } finally {\n if (releasedIds.size > 0) {\n this.#writeSchedules(file.schedules.filter((entry) => !releasedIds.has(entry.id)));\n }\n }\n return released;\n }\n\n #readSchedules(lenient: boolean): MeshScheduleFile {\n let stat: fs.Stats;\n try {\n stat = fs.statSync(this.#schedulesPath);\n } catch (error) {\n this.#scheduleCache = undefined;\n if (errorCode(error) === \"ENOENT\") return { format: 1, schedules: [] };\n throw error;\n }\n // Locked mutations always re-read; the stat-keyed cache serves only lockless reads.\n const cached = lenient ? this.#scheduleCache : undefined;\n if (cached && cached.inode === stat.ino && cached.size === stat.size && cached.modifiedAt === stat.mtimeMs) {\n return cached.error === undefined ? cached.file : { format: 1, schedules: [] };\n }\n let file: MeshScheduleFile = { format: 1, schedules: [] };\n let damage: string | undefined;\n try {\n if (stat.size > MAX_SCHEDULE_FILE_BYTES) throw new Error(`exceeds ${MAX_SCHEDULE_FILE_BYTES} bytes`);\n const parsed = JSON.parse(fs.readFileSync(this.#schedulesPath, \"utf8\")) as Partial<MeshScheduleFile>;\n if (parsed?.format !== 1 || !Array.isArray(parsed.schedules) || !parsed.schedules.every(isMeshSchedule)) {\n throw new Error(\"invalid format\");\n }\n file = { format: 1, schedules: parsed.schedules };\n } catch (error) {\n damage = error instanceof Error ? error.message : String(error);\n }\n this.#scheduleCache = {\n inode: stat.ino, size: stat.size, modifiedAt: stat.mtimeMs, file, ...(damage !== undefined ? { error: damage } : {}),\n };\n if (damage === undefined) return file;\n // Reads tolerate damage; mutations refuse to overwrite it silently.\n if (lenient) return { format: 1, schedules: [] };\n throw new Error(`Failed to read Fabric mesh schedules: ${damage}`);\n }\n\n #writeSchedules(schedules: MeshSchedule[]): void {\n if (schedules.length === 0) {\n fs.rmSync(this.#schedulesPath, { force: true });\n this.#scheduleCache = undefined;\n return;\n }\n atomicWrite(this.#schedulesPath, { format: 1, schedules }, MAX_SCHEDULE_FILE_BYTES);\n this.#scheduleCache = undefined;\n }\n\n read(\n input: {\n after?: number;\n topic?: string;\n to?: string;\n limit?: number;\n } = {},\n ): MeshEvent[] {\n if (input.topic !== undefined) this.#validateTopic(input.topic);\n const limit = Math.max(1, Math.min(Math.floor(input.limit ?? 100), this.maxReadEvents));\n const events =\n input.after === undefined\n ? this.#readRecentEvents(input, limit)\n : this.#readEventsAfter(Math.max(0, Math.floor(input.after)), input, limit);\n return events.map((event) => jsonClone(event));\n }\n\n latestSequence(): number {\n return Math.max(this.#readSequence(), this.#readLastEventSequence());\n }\n\n latestOffset(): number {\n const generation = this.#readGeneration();\n let descriptor: number | undefined;\n let completeOffset = 0;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n if (size > 0) {\n const lastByte = Buffer.allocUnsafe(1);\n fs.readSync(descriptor, lastByte, 0, 1, size - 1);\n if (lastByte[0] === 0x0a) {\n completeOffset = size;\n } else {\n const readBytes = Math.min(size, this.maxEventBytes + 1);\n const tail = Buffer.allocUnsafe(readBytes);\n fs.readSync(descriptor, tail, 0, readBytes, size - readBytes);\n const newline = tail.lastIndexOf(0x0a);\n completeOffset = newline >= 0 ? size - readBytes + newline + 1 : 0;\n }\n }\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n return this.#encodeCursor(generation, completeOffset);\n }\n\n tail(cursor: number, limit = 100): MeshTailResult {\n const boundedLimit = Math.max(1, Math.min(Math.floor(limit), this.maxReadEvents));\n const generation = this.#readGeneration();\n const decoded = this.#decodeCursor(cursor);\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n let position = decoded.generation === generation ? Math.min(decoded.offset, size) : 0;\n if (position > 0) {\n const previousByte = Buffer.allocUnsafe(1);\n fs.readSync(descriptor, previousByte, 0, 1, position - 1);\n if (previousByte[0] !== 0x0a) position = 0;\n }\n if (position >= size) {\n return { events: [], nextOffset: this.#encodeCursor(generation, position) };\n }\n const chunkBytes = Math.min(\n size - position,\n Math.max(this.maxEventBytes + 1, EVENT_READ_PAGE_BYTES),\n );\n const buffer = Buffer.allocUnsafe(chunkBytes);\n const bytesRead = fs.readSync(descriptor, buffer, 0, chunkBytes, position);\n const events: MeshEvent[] = [];\n let lineStart = 0;\n let consumed = 0;\n for (let index = 0; index < bytesRead; index++) {\n if (buffer[index] !== 0x0a) continue;\n const line = buffer.subarray(lineStart, index).toString(\"utf8\").trim();\n lineStart = index + 1;\n consumed = lineStart;\n if (line) {\n try {\n const event = JSON.parse(line) as MeshEvent;\n if (typeof event.sequence === \"number\") events.push(event);\n } catch { /* skip malformed mesh log line */ }\n }\n if (events.length >= boundedLimit) break;\n }\n return {\n events: events.map((event) => jsonClone(event)),\n nextOffset: this.#encodeCursor(generation, position + consumed),\n };\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return { events: [], nextOffset: this.#encodeCursor(generation, 0) };\n }\n throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #readRecentEvents(\n input: { topic?: string; to?: string },\n limit: number,\n ): MeshEvent[] {\n let events: MeshEvent[] = [];\n let before: number | undefined;\n while (events.length < limit) {\n const page = readJsonlPage(\n this.#eventsPath,\n this.maxReadEvents,\n before,\n Math.max(this.maxEventBytes + 1, EVENT_READ_PAGE_BYTES),\n );\n const pageEvents: MeshEvent[] = [];\n for (const line of page.lines) {\n const parsed = line.parsed;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) continue;\n const event = parsed as MeshEvent;\n if (typeof event.sequence !== \"number\" || !this.#eventMatches(event, input)) continue;\n pageEvents.push(event);\n }\n events = [...pageEvents, ...events].slice(-limit);\n if (!page.hasMore || page.before === undefined || page.before === before) break;\n before = page.before;\n }\n return events;\n }\n\n #readEventsAfter(\n after: number,\n input: { topic?: string; to?: string },\n limit: number,\n ): MeshEvent[] {\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n const events: MeshEvent[] = [];\n let position = 0;\n let lineChunks: Buffer[] = [];\n let lineBytes = 0;\n let skippingOversizedLine = false;\n let reachedLimit = false;\n\n const emitLine = (): void => {\n if (!skippingOversizedLine && lineBytes > 0) {\n const decoded = Buffer.concat(lineChunks, lineBytes).toString(\"utf8\");\n const line = decoded.endsWith(String.fromCharCode(13)) ? decoded.slice(0, -1) : decoded;\n try {\n const event = JSON.parse(line) as MeshEvent;\n if (\n typeof event.sequence === \"number\" &&\n event.sequence > after &&\n this.#eventMatches(event, input)\n ) {\n events.push(event);\n reachedLimit = events.length >= limit;\n }\n } catch { /* skip malformed mesh log line */ }\n }\n lineChunks = [];\n lineBytes = 0;\n skippingOversizedLine = false;\n };\n\n while (position < size && !reachedLimit) {\n const readLength = Math.min(EVENT_READ_CHUNK_BYTES, size - position);\n const chunk = Buffer.allocUnsafe(readLength);\n const bytesRead = fs.readSync(descriptor, chunk, 0, readLength, position);\n if (bytesRead <= 0) break;\n position += bytesRead;\n const captured = chunk.subarray(0, bytesRead);\n let segmentStart = 0;\n while (segmentStart < captured.length && !reachedLimit) {\n const newline = captured.indexOf(0x0a, segmentStart);\n const segmentEnd = newline < 0 ? captured.length : newline;\n const segment = captured.subarray(segmentStart, segmentEnd);\n if (!skippingOversizedLine) {\n if (lineBytes + segment.length <= this.maxEventBytes) {\n if (segment.length > 0) lineChunks.push(segment);\n lineBytes += segment.length;\n } else {\n lineChunks = [];\n lineBytes = 0;\n skippingOversizedLine = true;\n }\n }\n if (newline < 0) break;\n emitLine();\n segmentStart = newline + 1;\n }\n }\n if (!reachedLimit && (lineBytes > 0 || skippingOversizedLine)) emitLine();\n return events;\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return [];\n throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #eventMatches(event: MeshEvent, input: { topic?: string; to?: string }): boolean {\n if (input.topic !== undefined && event.topic !== input.topic) return false;\n if (input.to !== undefined && event.to !== input.to) return false;\n return true;\n }\n\n get(key: string): MeshStateEntry | undefined {\n this.#validateKey(key);\n const entries = this.#readCachedState().entries;\n return Object.hasOwn(entries, key) ? jsonClone(entries[key]) : undefined;\n }\n\n list(prefix = \"\", limit = 100): MeshStateEntry[] {\n const boundedLimit = Math.max(1, Math.min(Math.floor(limit), this.maxReadEvents));\n return this.listAll(prefix).slice(0, boundedLimit);\n }\n\n /** Internal project-state scan for host-managed indexes that must reconcile every key. */\n listAll(prefix = \"\"): MeshStateEntry[] {\n if (prefix) this.#validateKey(prefix);\n return Object.values(this.#readCachedState().entries)\n .filter((entry) => !prefix || entry.key.startsWith(prefix))\n .sort((left, right) => left.key.localeCompare(right.key))\n .map((entry) => jsonClone(entry));\n }\n\n async put(input: {\n key: string;\n value: unknown;\n identity: MeshIdentity;\n ifVersion?: number;\n }): Promise<MeshStateEntry> {\n const { key, value, identity, ifVersion } = input;\n this.#validateKey(key);\n const request = captureStoragePut({ key, value, identity, ifVersion }, this.maxEventBytes);\n return this.#withLock(() => {\n const state = readState(this.#statePath, this.#maxStateBytes, false);\n const slot = stateSlot(state, request.key);\n const plan = request.transition(slot.present, slot.version, slot.highWater);\n if (plan.kind !== \"put\") throw new Error(\"Invalid verified storage put plan\");\n const entry: MeshStateEntry = {\n key: plan.key,\n value: plan.value,\n version: plan.version,\n updatedAt: Date.now(),\n updatedBy: plan.identity,\n };\n state.entries[plan.key] = entry;\n state.versions ??= {};\n state.versions[plan.key] = plan.version;\n // Keep the envelope readable by existing hosts; revisionFormat marks the\n // mandatory persistent clock without making old readers quarantine it.\n state.format = 1;\n state.revisionFormat = 2;\n state.highWater = plan.highWater;\n state.tombstoneOrder = (state.tombstoneOrder ?? []).filter((key) => key !== plan.key);\n compactStateTombstones(state, this.#maxStateTombstones);\n atomicWrite(this.#statePath, state, this.#maxStateBytes);\n this.#cacheState(state);\n return jsonClone(entry);\n });\n }\n\n async delete(input: {\n key: string;\n ifVersion?: number;\n }): Promise<{ deleted: boolean; version?: number }> {\n const { key, ifVersion } = input;\n this.#validateKey(key);\n const request = captureStorageDelete({ key, ifVersion });\n return this.#withLock(() => {\n const state = readState(this.#statePath, this.#maxStateBytes, false);\n const slot = stateSlot(state, request.key);\n const plan = request.transition(slot.present, slot.version, slot.highWater);\n if (plan.kind === \"unchanged\") {\n this.#cacheState(state);\n return { deleted: false };\n }\n if (plan.kind !== \"delete\") throw new Error(\"Invalid verified storage delete plan\");\n delete state.entries[plan.key];\n state.versions ??= {};\n // Delete consumes a key successor and advances the persistent clock.\n // Eviction can forget a CAS tombstone, but not allocation history.\n state.versions[plan.key] = plan.version;\n // Keep the envelope readable by existing hosts; revisionFormat marks the\n // mandatory persistent clock without making old readers quarantine it.\n state.format = 1;\n state.revisionFormat = 2;\n state.highWater = plan.highWater;\n state.tombstoneOrder = [\n ...(state.tombstoneOrder ?? []).filter((key) => key !== plan.key),\n plan.key,\n ];\n compactStateTombstones(state, this.#maxStateTombstones);\n atomicWrite(this.#statePath, state, this.#maxStateBytes);\n this.#cacheState(state);\n return { deleted: true, version: plan.version };\n });\n }\n\n #readCachedState(): MeshStateFile {\n try {\n const stat = fs.statSync(this.#statePath);\n const cached = this.#stateCache;\n if (\n cached &&\n cached.device === stat.dev &&\n cached.inode === stat.ino &&\n cached.size === stat.size &&\n cached.modifiedAt === stat.mtimeMs\n ) {\n return cached.state;\n }\n } catch (error) {\n this.#stateCache = undefined;\n if (errorCode(error) === \"ENOENT\") return emptyState();\n throw error;\n }\n const state = readState(this.#statePath, this.#maxStateBytes);\n this.#cacheState(state);\n return state;\n }\n\n #cacheState(state: MeshStateFile): void {\n try {\n const stat = fs.statSync(this.#statePath);\n this.#stateCache = {\n device: stat.dev,\n inode: stat.ino,\n size: stat.size,\n modifiedAt: stat.mtimeMs,\n state,\n };\n } catch {\n this.#stateCache = undefined;\n }\n }\n\n async #withLock<T>(operation: () => T): Promise<T> {\n fs.mkdirSync(this.root, { recursive: true, mode: 0o700 });\n const deadline = Date.now() + this.#lockTimeoutMs;\n const token = randomUUID();\n const ownerPath = path.join(this.#lockPath, \"owner\");\n while (true) {\n try {\n fs.mkdirSync(this.#lockPath, { mode: 0o700 });\n fs.writeFileSync(ownerPath, `${token}\\n${process.pid}\\n${Date.now()}\\n${encodeOwnerIdentityLine()}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n break;\n } catch (error) {\n if (errorCode(error) !== \"EEXIST\") throw error;\n if (this.#clearStaleLock(ownerPath)) continue;\n if (Date.now() >= deadline) throw new Error(\"Timed out waiting for the Fabric mesh lock\");\n await delay(10);\n }\n }\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(this.#lockPath, { recursive: true, force: true });\n }\n } catch {\n // Another process already recovered or removed this lock.\n }\n }\n }\n\n // Returns true when a stale lock was removed and acquisition should retry.\n // A lock is stale when it outlived the stale window without a live owner:\n // either the owner file names a dead process, or the owner file is missing\n // or corrupt \u2014 the owner crashed between creating the lock directory and\n // writing the owner file \u2014 and the untouched lock directory itself is\n // stale. Removal re-reads the state it judged stale so a freshly rotated\n // owner is never deleted mid-check.\n #clearStaleLock(ownerPath: string): boolean {\n let lockModifiedAt: number | undefined;\n let owner: string | undefined;\n try {\n owner = fs.readFileSync(ownerPath, \"utf8\");\n } catch {\n try {\n lockModifiedAt = fs.statSync(this.#lockPath).mtimeMs;\n } catch {\n return false;\n }\n }\n if (owner !== undefined) {\n const [, pidText, createdText, identityLine] = owner.trim().split(\"\\n\");\n const createdAt = Number(createdText);\n if (Number.isFinite(createdAt) && Date.now() - createdAt <= this.#staleLockMs) return false;\n // Unknown (another PID namespace within the hold ceiling) is not death.\n if (lockOwnerLiveness(Number(pidText), createdAt, identityLine, {\n legacyAlive: processAlive,\n maxHoldMs: Math.max(SHORT_LOCK_MAX_HOLD_MS, this.#staleLockMs),\n }) !== \"dead\") return false;\n try {\n if (fs.readFileSync(ownerPath, \"utf8\") !== owner) return false;\n fs.rmSync(this.#lockPath, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n }\n if (lockModifiedAt === undefined || Date.now() - lockModifiedAt <= this.#staleLockMs) {\n return false;\n }\n try {\n if (fs.statSync(this.#lockPath).mtimeMs !== lockModifiedAt) return false;\n fs.rmSync(this.#lockPath, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n }\n\n #readGeneration(): number {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(this.#generationPath, \"utf8\"));\n return typeof parsed === \"number\" && Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : 0;\n } catch {\n return 0;\n }\n }\n\n #encodeCursor(generation: number, offset: number): number {\n const cursor = generation * CURSOR_OFFSET_BASE + offset;\n if (!Number.isSafeInteger(cursor) || cursor < 0) {\n throw new Error(\"Fabric mesh cursor exhausted its safe integer range\");\n }\n return cursor;\n }\n\n #decodeCursor(cursor: number): { generation: number; offset: number } {\n if (!Number.isSafeInteger(cursor) || cursor < 0) return { generation: -1, offset: 0 };\n return {\n generation: Math.floor(cursor / CURSOR_OFFSET_BASE),\n offset: cursor % CURSOR_OFFSET_BASE,\n };\n }\n\n #compactEventLog(): void {\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n if (size <= this.#maxEventLogBytes) return;\n const readBytes = Math.min(\n size,\n this.#retainedEventLogBytes + this.maxEventBytes + 1,\n );\n const buffer = Buffer.allocUnsafe(readBytes);\n const bytesRead = fs.readSync(descriptor, buffer, 0, readBytes, size - readBytes);\n const captured = buffer.subarray(0, bytesRead);\n const retentionBoundary = Math.max(0, captured.length - this.#retainedEventLogBytes);\n const newline = retentionBoundary === 0 ? -1 : captured.indexOf(0x0a, retentionBoundary);\n const retainedStart = retentionBoundary === 0 ? 0 : newline >= 0 ? newline + 1 : captured.length;\n const retained = captured.subarray(retainedStart);\n fs.closeSync(descriptor);\n descriptor = undefined;\n const temporaryPath =\n this.#eventsPath + \".\" + process.pid + \".\" + randomUUID() + \".tmp\";\n try {\n fs.writeFileSync(temporaryPath, retained, { mode: 0o600 });\n fs.renameSync(temporaryPath, this.#eventsPath);\n } finally {\n try { fs.rmSync(temporaryPath, { force: true }); } catch {}\n }\n atomicWrite(this.#generationPath, this.#readGeneration() + 1);\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #repairEventLog(): void {\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r+\");\n const size = fs.fstatSync(descriptor).size;\n if (size === 0) return;\n const lastByte = Buffer.allocUnsafe(1);\n fs.readSync(descriptor, lastByte, 0, 1, size - 1);\n if (lastByte[0] === 0x0a) return;\n const readBytes = Math.min(size, this.maxEventBytes + 1);\n const tail = Buffer.allocUnsafe(readBytes);\n fs.readSync(descriptor, tail, 0, readBytes, size - readBytes);\n const newline = tail.lastIndexOf(0x0a);\n fs.ftruncateSync(descriptor, newline >= 0 ? size - readBytes + newline + 1 : 0);\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #readLastEventSequence(): number {\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n if (size === 0) return 0;\n const readBytes = Math.min(size, this.maxEventBytes + 1);\n const tail = Buffer.allocUnsafe(readBytes);\n fs.readSync(descriptor, tail, 0, readBytes, size - readBytes);\n const lines = tail.toString(\"utf8\").trim().split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index--) {\n const line = lines[index];\n if (!line) continue;\n try {\n const parsed = JSON.parse(line) as { sequence?: unknown };\n if (typeof parsed.sequence === \"number\" && Number.isSafeInteger(parsed.sequence)) {\n return parsed.sequence;\n }\n } catch { /* skip malformed sequence line */ }\n }\n return 0;\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return 0;\n throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #readSequence(): number {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(this.#counterPath, \"utf8\"));\n return typeof parsed === \"number\" && Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : 0;\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return 0;\n return 0;\n }\n }\n\n #validateTopic(topic: string): void {\n validateMeshTopic(topic);\n }\n\n #validateKey(key: string): void {\n const unsafeSegment = key\n .split(/[/:]/)\n .some(\n (segment) =>\n segment === \"__proto__\" || segment === \"prototype\" || segment === \"constructor\",\n );\n if (!KEY_PATTERN.test(key) || unsafeSegment) {\n throw new Error(`Invalid Fabric mesh key: ${key}`);\n }\n }\n}\n", "// Generated by Bend 2.0.34; do not edit. See LAWS.bend and PROOF.bend.\n// Includes adapted Bend runtime/Base code, Copyright 2026 HigherOrderCO, Apache-2.0.\n// ABI exports selected and tags adapted by Pi Fabric; see THIRD_PARTY_NOTICES.md.\nfunction d(e, t) {\n return { $: e < t ? \"LT\" : e === t ? \"EQ\" : \"GT\" };\n}\nfunction y(e) {\n if (e > 281474976710655)\n throw \"bend: a Nat past the largest immediate 2^48-1\";\n return e;\n}\nfunction c(e) {\n return (typeof e == \"bigint\" || Number.isInteger(e)) && e >= 0 && e <= 2 ** 53 ? Number(e) : { [Symbol.toPrimitive]() {\n throw \"bend: a Nat past the largest immediate 2^48-1\";\n } };\n}\nfunction D(e) {\n for (; e !== null && typeof e == \"object\" && e.$ === \"$JMP\"; )\n e = e.f(...e.x);\n return e;\n}\nfunction m(e, t) {\n return (...a) => a.length < t ? m((...s) => e(...a, ...s), t - a.length) : e(...a);\n}\nfunction C(e, t) {\n let a = e.high, s = e.low, n = t.high, r = t.low;\n return u(p(a, n), p(s, r));\n}\nfunction q(e, t) {\n if (e.$ === \"storage-plans.Any\")\n return !0;\n {\n let a = e.version;\n return C(a, t);\n }\n}\nfunction k(e) {\n let t = e.high, a = e.low, s = t < 2097151, n = a < 4294967295;\n return u(u(R(t, 2097151), R(a, 4294967295)), s || n);\n}\nfunction E(e, t, a) {\n return e ? { $: \"storage-plans.Revision\", high: y(t + 1), low: 0 } : { $: \"storage-plans.Revision\", high: t, low: y(a + 1) };\n}\nfunction h(e) {\n let t = e.high, a = e.low;\n return E(p(a, 4294967295), t, a);\n}\nfunction x(e, t, a) {\n return e ? t : a;\n}\nfunction b(e, t) {\n return u(k(e), k(t));\n}\nfunction N(e, t, a, s, n) {\n if (e)\n if (a.$ === \"storage-plans.Put\") {\n let r = a.value, o = a.identity;\n return { $: \"storage-plans.PutNext\", key: t, value: r, identity: o, version: h(s), highWater: h(n) };\n } else\n return { $: \"storage-plans.DeleteNext\", key: t, version: h(s), highWater: h(n) };\n else\n return { $: \"storage-plans.Exhausted\" };\n}\nfunction S(e, t, a, s, n) {\n if (t.$ === \"storage-plans.Delete\")\n return a ? N(b(s, n), e, { $: \"storage-plans.Delete\" }, s, n) : { $: \"storage-plans.Unchanged\" };\n {\n let r = t.value, o = t.identity;\n return N(b(x(a, s, n), n), e, { $: \"storage-plans.Put\", value: r, identity: o }, x(a, s, n), n);\n }\n}\nfunction U(e, t, a, s, n, r) {\n return e ? S(t, a, s, n, r) : { $: \"storage-plans.Conflict\" };\n}\nfunction T(e, t) {\n let a = e.key, s = e.expected, n = e.change, r = t.present, o = t.version, l = t.highWater;\n return U(q(s, o), a, n, r, o, l);\n}\nfunction W(e, t) {\n return T(e, t);\n}\nfunction u(e, t) {\n return e ? t : !1;\n}\nfunction p(e, t) {\n return B(d(e, t));\n}\nfunction R(e, t) {\n return I(d(e, t));\n}\nfunction B(e) {\n return e.$ === \"EQ\";\n}\nfunction I(e) {\n return e.$ !== \"GT\";\n}\nfunction $(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Revision\":\n return a = a[s] = { ...e, high: c(e.high), low: c(e.low) }, t[0];\n default:\n throw \"bend: storage-plans.Revision has no tag \" + e?.$ + \" (its tags: storage-plans.Revision); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction i(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Revision\":\n return a = a[s] = { ...e, high: BigInt(e.high), low: BigInt(e.low) }, t[0];\n default:\n throw \"bend: storage-plans.Revision has no tag \" + e?.$ + \" (its tags: storage-plans.Revision); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction j(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Any\":\n return a[s] = e, t[0];\n case \"storage-plans.At\":\n return a = a[s] = { ...e, version: $(e.version) }, t[0];\n default:\n throw \"bend: storage-plans.Expectation has no tag \" + e?.$ + \" (its tags: storage-plans.Any, storage-plans.At); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction G(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Any\":\n return a[s] = e, t[0];\n case \"storage-plans.At\":\n return a = a[s] = { ...e, version: i(e.version) }, t[0];\n default:\n throw \"bend: storage-plans.Expectation has no tag \" + e?.$ + \" (its tags: storage-plans.Any, storage-plans.At); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction f(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"Nil\":\n return a[s] = e, t[0];\n case \"Con\":\n a = a[s] = { ...e, head: c(e.head) }, s = \"tail\", e = e[s];\n continue;\n default:\n throw \"bend: List has no tag \" + e?.$ + \" (its tags: Nil, Con); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction L(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Put\":\n return a = a[s] = { ...e, value: f(e.value), identity: f(e.identity) }, t[0];\n case \"storage-plans.Delete\":\n return a[s] = e, t[0];\n default:\n throw \"bend: storage-plans.Change has no tag \" + e?.$ + \" (its tags: storage-plans.Put, storage-plans.Delete); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction g(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"Nil\":\n return a[s] = e, t[0];\n case \"Con\":\n a = a[s] = { ...e, head: BigInt(e.head) }, s = \"tail\", e = e[s];\n continue;\n default:\n throw \"bend: List has no tag \" + e?.$ + \" (its tags: Nil, Con); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction M(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Put\":\n return a = a[s] = { ...e, value: g(e.value), identity: g(e.identity) }, t[0];\n case \"storage-plans.Delete\":\n return a[s] = e, t[0];\n default:\n throw \"bend: storage-plans.Change has no tag \" + e?.$ + \" (its tags: storage-plans.Put, storage-plans.Delete); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction Q(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Conflict\":\n return a[s] = e, t[0];\n case \"storage-plans.Exhausted\":\n return a[s] = e, t[0];\n case \"storage-plans.Unchanged\":\n return a[s] = e, t[0];\n case \"storage-plans.PutNext\":\n return a = a[s] = { ...e, key: g(e.key), value: g(e.value), identity: g(e.identity), version: i(e.version), highWater: i(e.highWater) }, t[0];\n case \"storage-plans.DeleteNext\":\n return a = a[s] = { ...e, key: g(e.key), version: i(e.version), highWater: i(e.highWater) }, t[0];\n default:\n throw \"bend: storage-plans.Plan has no tag \" + e?.$ + \" (its tags: storage-plans.Conflict, storage-plans.Exhausted, storage-plans.Unchanged, storage-plans.PutNext, storage-plans.DeleteNext); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction J(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Request\":\n return a = a[s] = { ...e, key: f(e.key), expected: j(e.expected), change: L(e.change) }, t[0];\n default:\n throw \"bend: storage-plans.Request has no tag \" + e?.$ + \" (its tags: storage-plans.Request); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction O(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Slot\":\n return a = a[s] = { ...e, version: $(e.version), highWater: $(e.highWater) }, t[0];\n default:\n throw \"bend: storage-plans.Slot has no tag \" + e?.$ + \" (its tags: storage-plans.Slot); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction z(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Request\":\n return a = a[s] = { ...e, key: g(e.key), expected: G(e.expected), change: M(e.change) }, t[0];\n default:\n throw \"bend: storage-plans.Request has no tag \" + e?.$ + \" (its tags: storage-plans.Request); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction F(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Slot\":\n return a = a[s] = { ...e, version: i(e.version), highWater: i(e.highWater) }, t[0];\n default:\n throw \"bend: storage-plans.Slot has no tag \" + e?.$ + \" (its tags: storage-plans.Slot); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nvar P = /* @__PURE__ */ new Map([[\"Any\", \"storage-plans.Any\"], [\"Revision\", \"storage-plans.Revision\"], [\"Exhausted\", \"storage-plans.Exhausted\"], [\"Put\", \"storage-plans.Put\"], [\"PutNext\", \"storage-plans.PutNext\"], [\"DeleteNext\", \"storage-plans.DeleteNext\"], [\"Delete\", \"storage-plans.Delete\"], [\"Unchanged\", \"storage-plans.Unchanged\"], [\"Conflict\", \"storage-plans.Conflict\"], [\"At\", \"storage-plans.At\"], [\"Request\", \"storage-plans.Request\"], [\"Slot\", \"storage-plans.Slot\"]]), H = /* @__PURE__ */ new Map([[\"storage-plans.Any\", \"Any\"], [\"storage-plans.Revision\", \"Revision\"], [\"storage-plans.Exhausted\", \"Exhausted\"], [\"storage-plans.Put\", \"Put\"], [\"storage-plans.PutNext\", \"PutNext\"], [\"storage-plans.DeleteNext\", \"DeleteNext\"], [\"storage-plans.Delete\", \"Delete\"], [\"storage-plans.Unchanged\", \"Unchanged\"], [\"storage-plans.Conflict\", \"Conflict\"], [\"storage-plans.At\", \"At\"], [\"storage-plans.Request\", \"Request\"], [\"storage-plans.Slot\", \"Slot\"]]);\nfunction w(e, t) {\n let a = [e];\n for (let s = [[a, 0]]; s.length > 0; ) {\n let [n, r] = s.pop(), o = n[r];\n if (o === null || typeof o != \"object\") continue;\n let l = Array.isArray(o) ? [...o] : { ...o };\n typeof l.$ == \"string\" && (l.$ = t.get(l.$) ?? l.$), n[r] = l;\n for (let A of Object.keys(l)) s.push([l, A]);\n }\n return a[0];\n}\nvar K = /* @__PURE__ */ m((e, t) => {\n let a = Q(D(W(J(e), O(t))));\n return z(e), F(t), a;\n}, 2), V = (e, t) => w(K(w(e, P), w(t, P)), H);\nexport {\n V as storageTransition\n};\n", "import {\n storageTransition,\n type StoragePlan,\n type StorageRequest,\n type StorageRevision,\n type StorageText,\n} from \"./generated/storage-kernel.js\";\nimport type { MeshIdentity } from \"../mesh/store.js\";\n\n// Bend Nat arithmetic is capped at 2^48-1. Canonical radix-2^32 limbs\n// represent the entire JS safe-integer range without crossing that runtime cap.\nconst RADIX = 4294967296n;\n\nconst encode = (text: string): StorageText => {\n let result: StorageText = { $: \"Nil\" };\n for (let index = text.length - 1; index >= 0; index--) {\n result = { $: \"Con\", head: BigInt(text.charCodeAt(index)), tail: result };\n }\n return result;\n};\n\nconst decode = (text: StorageText): string => {\n const units: string[] = [];\n for (let node = text; node.$ === \"Con\"; node = node.tail) {\n if (node.head < 0n || node.head > 65535n) throw new Error(\"Invalid storage code unit\");\n units.push(String.fromCharCode(Number(node.head)));\n }\n return units.join(\"\");\n};\n\nexport const storageRevision = (value: unknown): number => {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n throw new Error(\"Invalid Fabric mesh revision: expected a nonnegative safe integer\");\n }\n return value;\n};\n\nconst encodeRevision = (value: number): StorageRevision => {\n const exact = BigInt(storageRevision(value));\n return { $: \"Revision\", high: exact / RADIX, low: exact % RADIX };\n};\n\nconst decodeRevision = (value: StorageRevision): number => {\n if (value.high < 0n || value.high > 2097151n || value.low < 0n || value.low >= RADIX) {\n throw new Error(\"Invalid verified storage revision limbs\");\n }\n // Representation conversion only; CAS, overflow and successor/carry decisions\n // are performed by the executable proved reducer, not reproduced here.\n return storageRevision(Number(value.high * RADIX + value.low));\n};\n\nconst serialize = (value: unknown): string => {\n const json = JSON.stringify(value);\n if (json === undefined) throw new Error(\"Mesh values must be JSON-serializable\");\n return json;\n};\n\nexport type StorageTransition =\n | { kind: \"put\"; key: string; value: unknown; identity: MeshIdentity; version: number; highWater: number }\n | { kind: \"delete\"; key: string; version: number; highWater: number }\n | { kind: \"unchanged\" };\n\nexport interface CapturedStorageRequest {\n readonly key: string;\n readonly transition: (present: boolean, actualVersion: number, highWater: number) => StorageTransition;\n}\n\nconst capture = (\n key: string,\n ifVersion: number | undefined,\n payload?: { value: string; identity: string },\n): CapturedStorageRequest => {\n const expected = ifVersion === undefined ? undefined : storageRevision(ifVersion);\n // The wire graph and JSON strings never escape this closure. Caller-owned\n // objects (including nested identity/value) are not retained across lock wait.\n const request: StorageRequest = {\n $: \"Request\",\n key: encode(key),\n expected: expected === undefined ? { $: \"Any\" } : { $: \"At\", version: encodeRevision(expected) },\n change: payload === undefined ? { $: \"Delete\" } : {\n $: \"Put\", value: encode(payload.value), identity: encode(payload.identity),\n },\n };\n return Object.freeze({\n key,\n transition(present: boolean, actualVersion: number, highWater: number): StorageTransition {\n const actual = storageRevision(actualVersion);\n const clock = storageRevision(highWater);\n if (clock < actual) throw new Error(\"Inconsistent Fabric mesh high-water revision\");\n const plan: StoragePlan = storageTransition(\n request, { $: \"Slot\", present, version: encodeRevision(actual), highWater: encodeRevision(clock) },\n );\n switch (plan.$) {\n case \"Conflict\":\n throw new Error(`Mesh compare-and-swap failed for ${key}: expected version ${expected}, found ${actual}`);\n case \"Exhausted\":\n throw new Error(`Fabric mesh revision exhausted for ${key}`);\n case \"Unchanged\":\n return { kind: \"unchanged\" };\n case \"PutNext\":\n return {\n kind: \"put\", key: decode(plan.key), value: JSON.parse(decode(plan.value)),\n identity: JSON.parse(decode(plan.identity)) as MeshIdentity,\n version: decodeRevision(plan.version), highWater: decodeRevision(plan.highWater),\n };\n case \"DeleteNext\":\n return { kind: \"delete\", key: decode(plan.key), version: decodeRevision(plan.version), highWater: decodeRevision(plan.highWater) };\n }\n },\n });\n};\n\nexport const captureStoragePut = (input: {\n key: string; ifVersion?: number | undefined; value: unknown; identity: MeshIdentity;\n}, maxValueBytes = Number.POSITIVE_INFINITY): CapturedStorageRequest => {\n const { key, ifVersion, value, identity } = input;\n // Capture scalars before serialization can invoke user-defined toJSON hooks.\n if (ifVersion !== undefined) storageRevision(ifVersion);\n const identityJson = serialize(identity);\n const valueJson = serialize(value);\n if (Buffer.byteLength(valueJson, \"utf8\") > maxValueBytes) {\n throw new Error(`Mesh state value exceeds ${maxValueBytes} bytes`);\n }\n return capture(key, ifVersion, { value: valueJson, identity: identityJson });\n};\n\nexport const captureStorageDelete = (input: {\n key: string; ifVersion?: number | undefined;\n}): CapturedStorageRequest => {\n const { key, ifVersion } = input;\n return capture(key, ifVersion);\n};\n"],
4
+ "sourcesContent": ["import { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n writeFileAtomic,\n encodeOwnerIdentityLine,\n lockOwnerLiveness,\n SHORT_LOCK_MAX_HOLD_MS,\n} from \"../core/atomic-write.js\";\nimport { readJsonlPage } from \"../log-tail.js\";\nimport { captureStoragePut, captureStorageDelete, storageRevision } from \"../verified/storage.js\";\nimport type { FabricMessageSender } from \"../protocol.js\";\nimport { processSender } from \"../scope.js\";\n\nexport interface MeshIdentity {\n id: string;\n name: string;\n kind: \"main\" | \"actor\" | \"agent\";\n sessionId?: string;\n}\n\nexport interface MeshEvent {\n id: string;\n sequence: number;\n topic: string;\n kind: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n createdAt: number;\n /** Set on events appended through a scoped external grant (`pi-fabric mesh post`). */\n origin?: \"external\";\n untrusted?: true;\n grantId?: string;\n /** Set on events released from a pending schedule; the event id is the schedule id. */\n scheduled?: { dueAt: number; key?: string };\n /** Host-stamped authority of the publishing process; absent from older builds and grant posts. */\n sender?: FabricMessageSender;\n}\n\n/** Host-internal append request used inside {@link MeshStore.transact}. */\nexport interface MeshAppendInput {\n id?: string;\n topic: string;\n kind?: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n origin?: \"external\";\n untrusted?: true;\n grantId?: string;\n scheduled?: { dueAt: number; key?: string };\n sender?: FabricMessageSender;\n /** A tighter per-event byte ceiling than the store's own. */\n maxEventBytes?: number;\n}\n\n/** A pending scheduled event; released into its topic log once due. */\nexport interface MeshSchedule {\n id: string;\n key?: string;\n topic: string;\n kind: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n dueAt: number;\n createdAt: number;\n /** Stamped when scheduled; carried onto the released event. */\n sender?: FabricMessageSender;\n}\n\ninterface MeshScheduleFile {\n format: 1;\n schedules: MeshSchedule[];\n}\n\nexport interface MeshTailResult {\n events: MeshEvent[];\n nextOffset: number;\n}\n\nexport interface MeshStateEntry {\n key: string;\n value: unknown;\n version: number;\n updatedAt: number;\n updatedBy: MeshIdentity;\n}\n\ninterface MeshStateFile {\n format: 1 | 2;\n revisionFormat?: 2;\n entries: Record<string, MeshStateEntry>;\n versions?: Record<string, number>;\n tombstoneOrder?: string[];\n /** Persisted allocation clock; never evicted with per-key tombstones. */\n highWater?: number;\n}\n\nexport interface MeshStoreOptions {\n maxEventLogBytes?: number;\n retainedEventLogBytes?: number;\n maxStateBytes?: number;\n maxStateTombstones?: number;\n lockTimeoutMs?: number;\n staleLockMs?: number;\n}\n\nconst TOPIC_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,127}$/;\nconst KEY_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,255}$/;\n\nexport const validateMeshTopic = (topic: string): void => {\n if (!TOPIC_PATTERN.test(topic)) throw new Error(`Invalid Fabric mesh topic: ${topic}`);\n};\nconst LOCK_TIMEOUT_MS = 10_000;\nconst STALE_LOCK_MS = 30_000;\nconst DEFAULT_MAX_EVENT_LOG_BYTES = 64 * 1024 * 1024;\nconst DEFAULT_RETAINED_EVENT_LOG_BYTES = 16 * 1024 * 1024;\nconst DEFAULT_MAX_STATE_BYTES = 32 * 1024 * 1024;\nconst DEFAULT_MAX_STATE_TOMBSTONES = 10_000;\nconst EVENT_READ_PAGE_BYTES = 4 * 1024 * 1024;\nconst EVENT_READ_CHUNK_BYTES = 64 * 1024;\nconst CURSOR_OFFSET_BASE = 2 ** 32;\nexport const MESH_MAX_PENDING_SCHEDULES = 1_000;\nexport const MESH_MAX_SCHEDULE_AHEAD_MS = 366 * 24 * 60 * 60 * 1_000;\nconst MAX_SCHEDULE_FILE_BYTES = 16 * 1024 * 1024;\nconst SCHEDULE_KEY_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,127}$/;\n\nconst delay = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\nconst errorCode = (error: unknown): string | undefined =>\n error instanceof Error && \"code\" in error && typeof error.code === \"string\"\n ? error.code\n : undefined;\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 {\n return false;\n }\n};\n\nconst jsonClone = <T>(value: T): T => {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) throw new Error(\"Mesh values must be JSON-serializable\");\n return JSON.parse(serialized) as T;\n};\n\nconst isMeshStateFile = (value: unknown): value is MeshStateFile => {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n ![1, 2].includes((value as { format?: unknown }).format as number)\n ) {\n return false;\n }\n const entries = (value as { entries?: unknown }).entries;\n return typeof entries === \"object\" && entries !== null && !Array.isArray(entries);\n};\n\nconst recoverConcatenatedState = (serialized: string): MeshStateFile | undefined => {\n const snapshots: MeshStateFile[] = [];\n let documents = 0;\n let start = -1;\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let index = 0; index < serialized.length; index += 1) {\n const character = serialized[index]!;\n if (start < 0) {\n if (/\\s/.test(character)) continue;\n if (character !== \"{\") return undefined;\n start = index;\n depth = 1;\n continue;\n }\n if (inString) {\n if (escaped) escaped = false;\n else if (character === \"\\\\\") escaped = true;\n else if (character === '\"') inString = false;\n continue;\n }\n if (character === '\"') inString = true;\n else if (character === \"{\") depth += 1;\n else if (character === \"}\") {\n depth -= 1;\n if (depth !== 0) continue;\n try {\n const parsed: unknown = JSON.parse(serialized.slice(start, index + 1));\n documents += 1;\n if (isMeshStateFile(parsed)) snapshots.push(parsed);\n } catch {\n return undefined;\n }\n start = -1;\n }\n }\n\n return start < 0 && documents > 1 ? snapshots.at(-1) : undefined;\n};\n\nconst compareSchedules = (left: MeshSchedule, right: MeshSchedule): number =>\n left.dueAt - right.dueAt || left.createdAt - right.createdAt || left.id.localeCompare(right.id);\n\nconst isMeshSchedule = (value: unknown): value is MeshSchedule => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const entry = value as Partial<MeshSchedule>;\n return typeof entry.id === \"string\" && typeof entry.topic === \"string\" &&\n typeof entry.kind === \"string\" && typeof entry.from === \"object\" && entry.from !== null &&\n Number.isSafeInteger(entry.dueAt) && Number.isSafeInteger(entry.createdAt) &&\n (entry.key === undefined || typeof entry.key === \"string\");\n};\n\nconst emptyState = (): MeshStateFile => ({ format: 1, revisionFormat: 2, entries: {}, highWater: 0 });\n\nconst readState = (filePath: string, maxBytes: number, recoverDamage = true): MeshStateFile => {\n let serialized: string;\n try {\n const stat = fs.statSync(filePath);\n if (stat.size > maxBytes) throw new Error(`state exceeds ${maxBytes} bytes`);\n if (stat.size === 0 && recoverDamage) return emptyState();\n serialized = fs.readFileSync(filePath, \"utf8\");\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return emptyState();\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read Fabric mesh state: ${message}`);\n }\n if (!serialized.trim() && recoverDamage) return emptyState();\n try {\n const parsed: unknown = JSON.parse(serialized);\n if (isMeshStateFile(parsed)) return parsed;\n throw new Error(\"invalid state format\");\n } catch (error) {\n // Failed parsing must not silently erase the allocation clock. Read-only\n // startup can tolerate damage, but mutations require a repaired snapshot.\n const recovered = recoverConcatenatedState(serialized);\n if (recovered) return recovered;\n if (!recoverDamage) throw new Error(\"Failed to read Fabric mesh state: invalid state format\");\n // Preserve the original bytes at this path as a barrier to clock reset.\n return emptyState();\n }\n};\n\nconst atomicWrite = (filePath: string, value: unknown, maxBytes = Number.POSITIVE_INFINITY): void => {\n const serialized = JSON.stringify(value, null, 2);\n if (Buffer.byteLength(serialized, \"utf8\") > maxBytes) {\n throw new Error(`Fabric mesh state exceeds ${maxBytes} bytes`);\n }\n writeFileAtomic(filePath, serialized);\n};\n\n// Host invariant for the proved reducer: the persisted clock covers every\n// issued token. Legacy files can seed only from retained entries/tombstones;\n// tokens already evicted before this migration cannot be reconstructed.\nconst stateSlot = (state: MeshStateFile, key: string): {\n present: boolean; version: number; highWater: number;\n} => {\n if (state.versions !== undefined &&\n (typeof state.versions !== \"object\" || state.versions === null || Array.isArray(state.versions))) {\n throw new Error(\"Invalid Fabric mesh revision table\");\n }\n let retainedMaximum = 0;\n for (const revision of Object.values(state.versions ?? {})) {\n retainedMaximum = Math.max(retainedMaximum, storageRevision(revision));\n }\n for (const [entryKey, entry] of Object.entries(state.entries)) {\n if (typeof entry !== \"object\" || entry === null || entry.key !== entryKey) {\n throw new Error(\"Invalid Fabric mesh state entry\");\n }\n const version = storageRevision(entry.version);\n const retained = state.versions !== undefined && Object.hasOwn(state.versions, entryKey)\n ? state.versions[entryKey] : undefined;\n if (version === 0 || (retained !== undefined && retained !== version)) {\n throw new Error(\"Inconsistent Fabric mesh revision\");\n }\n retainedMaximum = Math.max(retainedMaximum, version);\n }\n // New snapshots require their clock: losing it must not look like legacy\n // migration and silently reissue revisions from an evicted history.\n if (Object.hasOwn(state, \"revisionFormat\") && state.revisionFormat !== 2) {\n throw new Error(\"Unsupported Fabric mesh revision protocol\");\n }\n if ((state.format === 2 || state.revisionFormat === 2) && !Object.hasOwn(state, \"highWater\")) {\n throw new Error(\"Missing Fabric mesh high-water revision\");\n }\n const highWater = Object.hasOwn(state, \"highWater\")\n ? storageRevision(state.highWater) : retainedMaximum;\n if (highWater < retainedMaximum) throw new Error(\"Inconsistent Fabric mesh high-water revision\");\n const present = Object.hasOwn(state.entries, key);\n const version = present ? state.entries[key]!.version\n : state.versions !== undefined && Object.hasOwn(state.versions, key) ? state.versions[key]! : 0;\n return { present, version, highWater };\n};\n\nconst compactStateTombstones = (state: MeshStateFile, maxTombstones: number): void => {\n state.versions ??= {};\n const orderedKeys: string[] = [];\n const seen = new Set<string>();\n for (const key of state.tombstoneOrder ?? []) {\n if (Object.hasOwn(state.entries, key) || !Object.hasOwn(state.versions, key) || seen.has(key)) continue;\n seen.add(key);\n orderedKeys.push(key);\n }\n for (const key of Object.keys(state.versions)) {\n if (Object.hasOwn(state.entries, key) || seen.has(key)) continue;\n seen.add(key);\n orderedKeys.push(key);\n }\n const retainedKeys = orderedKeys.slice(-maxTombstones);\n const retained = new Set(retainedKeys);\n for (const key of Object.keys(state.versions)) {\n if (!Object.hasOwn(state.entries, key) && !retained.has(key)) delete state.versions[key];\n }\n state.tombstoneOrder = retainedKeys;\n};\n\nexport class MeshStore {\n readonly #eventsPath: string;\n readonly #statePath: string;\n readonly #counterPath: string;\n readonly #generationPath: string;\n readonly #lockPath: string;\n readonly #maxEventLogBytes: number;\n readonly #retainedEventLogBytes: number;\n readonly #maxStateBytes: number;\n readonly #maxStateTombstones: number;\n readonly #lockTimeoutMs: number;\n readonly #staleLockMs: number;\n #stateCache:\n | { device: number; inode: number; size: number; modifiedAt: number; state: MeshStateFile }\n | undefined;\n readonly #schedulesPath: string;\n #scheduleCache:\n | { inode: number; size: number; modifiedAt: number; file: MeshScheduleFile; error?: string }\n | undefined;\n\n constructor(\n readonly root: string,\n readonly maxEventBytes: number,\n readonly maxReadEvents: number,\n options: MeshStoreOptions = {},\n ) {\n this.#eventsPath = path.join(root, \"events.jsonl\");\n this.#statePath = path.join(root, \"state.json\");\n this.#counterPath = path.join(root, \"sequence\");\n this.#generationPath = path.join(root, \"generation\");\n this.#lockPath = path.join(root, \".lock\");\n // Pending schedules live beside state.json, outside the verified storage\n // revision table: they are serialized by this lock, not by key CAS.\n this.#schedulesPath = path.join(root, \"schedules.json\");\n this.#maxEventLogBytes = Math.min(\n CURSOR_OFFSET_BASE - 1,\n Math.max(maxEventBytes + 2, Math.floor(options.maxEventLogBytes ?? DEFAULT_MAX_EVENT_LOG_BYTES)),\n );\n this.#retainedEventLogBytes = Math.min(\n this.#maxEventLogBytes - 1,\n Math.max(\n maxEventBytes + 1,\n Math.floor(options.retainedEventLogBytes ?? DEFAULT_RETAINED_EVENT_LOG_BYTES),\n ),\n );\n this.#maxStateBytes = Math.max(\n maxEventBytes * 2,\n Math.floor(options.maxStateBytes ?? DEFAULT_MAX_STATE_BYTES),\n );\n this.#maxStateTombstones = Math.max(\n 1,\n Math.floor(options.maxStateTombstones ?? DEFAULT_MAX_STATE_TOMBSTONES),\n );\n this.#lockTimeoutMs = Math.max(100, Math.floor(options.lockTimeoutMs ?? LOCK_TIMEOUT_MS));\n this.#staleLockMs = Math.max(100, Math.floor(options.staleLockMs ?? STALE_LOCK_MS));\n fs.mkdirSync(root, { recursive: true, mode: 0o700 });\n }\n\n async publish(input: {\n topic: string;\n kind?: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n /** Host-only: publish on behalf of another authority (an actor's scope). */\n sender?: FabricMessageSender;\n }): Promise<MeshEvent> {\n this.#validateTopic(input.topic);\n if (input.to !== undefined && !input.to.trim()) throw new Error(\"Mesh recipient is empty\");\n const eventData = input.data === undefined ? undefined : jsonClone(input.data);\n const sender = input.sender ?? processSender();\n return this.#withLock(() => {\n // Any write that already holds the lock also releases due schedules first,\n // so the log keeps due-time order relative to this event. Damaged\n // schedule state must not block ordinary publishing.\n try { this.#releaseDueLocked(Date.now()); } catch { /* schedule mutations report it */ }\n return this.#appendLocked({ ...input, ...(eventData !== undefined ? { data: eventData } : {}), sender });\n });\n }\n\n /**\n * Host-internal: runs `operation` under the mesh lock with an append\n * capability, for side stores (grants) that must commit with an event.\n */\n async transact<T>(operation: (append: (input: MeshAppendInput) => MeshEvent) => T): Promise<T> {\n return this.#withLock(() => {\n try { this.#releaseDueLocked(Date.now()); } catch { /* schedule mutations report it */ }\n return operation((input) => {\n this.#validateTopic(input.topic);\n return this.#appendLocked(input);\n });\n });\n }\n\n #appendLocked(input: MeshAppendInput): MeshEvent {\n this.#repairEventLog();\n const sequence = Math.max(this.#readSequence(), this.#readLastEventSequence()) + 1;\n const event: MeshEvent = {\n id: input.id ?? randomUUID(),\n sequence,\n topic: input.topic,\n kind: input.kind?.trim() || \"message\",\n from: jsonClone(input.from),\n ...(input.to ? { to: input.to } : {}),\n ...(input.text !== undefined ? { text: input.text } : {}),\n ...(input.data !== undefined ? { data: jsonClone(input.data) } : {}),\n createdAt: Date.now(),\n ...(input.origin ? { origin: input.origin } : {}),\n ...(input.untrusted ? { untrusted: true as const } : {}),\n ...(input.grantId ? { grantId: input.grantId } : {}),\n ...(input.scheduled ? { scheduled: { ...input.scheduled } } : {}),\n ...(input.sender ? { sender: jsonClone(input.sender) } : {}),\n };\n const line = JSON.stringify(event);\n const limit = Math.min(this.maxEventBytes, input.maxEventBytes ?? this.maxEventBytes);\n if (Buffer.byteLength(line, \"utf8\") > limit) {\n throw new Error(`Mesh event exceeds ${limit} bytes`);\n }\n fs.appendFileSync(this.#eventsPath, `${line}\\n`, { encoding: \"utf8\", mode: 0o600 });\n atomicWrite(this.#counterPath, sequence);\n this.#compactEventLog();\n return event;\n }\n\n /**\n * Stores a pending event released into `topic` once `dueAt` passes. A `key`\n * replaces any pending schedule with that key in the same locked write, so\n * concurrent publishers never leave two schedules for one key.\n */\n async schedule(input: {\n topic: string;\n kind?: string;\n from: MeshIdentity;\n to?: string;\n text?: string;\n data?: unknown;\n dueAt: number;\n key?: string;\n }, now = Date.now()): Promise<MeshSchedule> {\n this.#validateTopic(input.topic);\n if (input.to !== undefined && !input.to.trim()) throw new Error(\"Mesh recipient is empty\");\n if (input.key !== undefined && !SCHEDULE_KEY_PATTERN.test(input.key)) {\n throw new Error(`Invalid Fabric mesh schedule key: ${input.key}`);\n }\n if (!Number.isSafeInteger(input.dueAt) || input.dueAt < 0) {\n throw new Error(\"Mesh schedule due time must be a nonnegative epoch millisecond integer\");\n }\n if (input.dueAt > now + MESH_MAX_SCHEDULE_AHEAD_MS) {\n throw new Error(\"Mesh schedules may be at most 366 days ahead\");\n }\n const schedule: MeshSchedule = {\n id: randomUUID(),\n ...(input.key !== undefined ? { key: input.key } : {}),\n topic: input.topic,\n kind: input.kind?.trim() || \"message\",\n from: jsonClone(input.from),\n ...(input.to ? { to: input.to } : {}),\n ...(input.text !== undefined ? { text: input.text } : {}),\n ...(input.data !== undefined ? { data: jsonClone(input.data) } : {}),\n dueAt: input.dueAt,\n createdAt: now,\n sender: processSender(),\n };\n // Reject at schedule time what release could never append.\n const released: MeshEvent = {\n id: schedule.id, sequence: Number.MAX_SAFE_INTEGER, topic: schedule.topic, kind: schedule.kind,\n from: schedule.from, ...(schedule.to ? { to: schedule.to } : {}),\n ...(schedule.text !== undefined ? { text: schedule.text } : {}),\n ...(schedule.data !== undefined ? { data: schedule.data } : {}),\n createdAt: Number.MAX_SAFE_INTEGER,\n scheduled: { dueAt: schedule.dueAt, ...(schedule.key !== undefined ? { key: schedule.key } : {}) },\n ...(schedule.sender ? { sender: schedule.sender } : {}),\n };\n if (Buffer.byteLength(JSON.stringify(released), \"utf8\") > this.maxEventBytes) {\n throw new Error(`Mesh event exceeds ${this.maxEventBytes} bytes`);\n }\n return this.#withLock(() => {\n const file = this.#readSchedules(false);\n const pending = file.schedules.filter((entry) => input.key === undefined || entry.key !== input.key);\n if (pending.length >= MESH_MAX_PENDING_SCHEDULES) {\n throw new Error(`At most ${MESH_MAX_PENDING_SCHEDULES} mesh schedules may be pending`);\n }\n pending.push(schedule);\n this.#writeSchedules(pending);\n this.#releaseDueLocked(now);\n return jsonClone(schedule);\n });\n }\n\n /** Removes the pending schedule with `key`, if any. */\n async unschedule(key: string): Promise<{ removed: boolean }> {\n if (!SCHEDULE_KEY_PATTERN.test(key)) throw new Error(`Invalid Fabric mesh schedule key: ${key}`);\n return this.#withLock(() => {\n const file = this.#readSchedules(false);\n const pending = file.schedules.filter((entry) => entry.key !== key);\n if (pending.length === file.schedules.length) return { removed: false };\n this.#writeSchedules(pending);\n return { removed: true };\n });\n }\n\n /** Pending schedules by due time; a due one stays listed until a releaser appends it. */\n scheduled(input: { topic?: string; limit?: number } = {}): MeshSchedule[] {\n if (input.topic !== undefined) this.#validateTopic(input.topic);\n const limit = Math.max(1, Math.min(Math.floor(input.limit ?? 100), MESH_MAX_PENDING_SCHEDULES));\n return this.#readSchedules(true).schedules\n .filter((entry) => input.topic === undefined || entry.topic === input.topic)\n .sort(compareSchedules)\n .slice(0, limit)\n .map((entry) => jsonClone(entry));\n }\n\n /** Earliest pending due time, read without the lock (one stat when unchanged). */\n nextScheduleDueAt(): number | undefined {\n let next: number | undefined;\n for (const entry of this.#readSchedules(true).schedules) {\n if (next === undefined || entry.dueAt < next) next = entry.dueAt;\n }\n return next;\n }\n\n /**\n * Appends every due schedule to its topic and removes it, under the mesh\n * lock, so concurrent releasers (monitors, resident hosts, CLI posts) append\n * each schedule once. The lock is taken only when something is due.\n */\n async releaseDueSchedules(now = Date.now()): Promise<MeshEvent[]> {\n const next = this.nextScheduleDueAt();\n if (next === undefined || next > now) return [];\n return this.#withLock(() => this.#releaseDueLocked(now));\n }\n\n #releaseDueLocked(now: number): MeshEvent[] {\n if (!fs.existsSync(this.#schedulesPath)) return [];\n const file = this.#readSchedules(false);\n const due = file.schedules.filter((entry) => entry.dueAt <= now).sort(compareSchedules);\n if (due.length === 0) return [];\n const released: MeshEvent[] = [];\n const releasedIds = new Set<string>();\n try {\n // Events first, then the shrunken schedule file: a crash in between\n // re-releases with the same event id (at-least-once, dedupe by id).\n for (const entry of due) {\n released.push(this.#appendLocked({\n id: entry.id,\n topic: entry.topic,\n kind: entry.kind,\n from: entry.from,\n ...(entry.to ? { to: entry.to } : {}),\n ...(entry.text !== undefined ? { text: entry.text } : {}),\n ...(entry.data !== undefined ? { data: entry.data } : {}),\n scheduled: { dueAt: entry.dueAt, ...(entry.key !== undefined ? { key: entry.key } : {}) },\n // Older schedules stay unstamped: the releasing host never lends its own authority.\n ...(entry.sender ? { sender: entry.sender } : {}),\n }));\n releasedIds.add(entry.id);\n }\n } finally {\n if (releasedIds.size > 0) {\n this.#writeSchedules(file.schedules.filter((entry) => !releasedIds.has(entry.id)));\n }\n }\n return released;\n }\n\n #readSchedules(lenient: boolean): MeshScheduleFile {\n let stat: fs.Stats;\n try {\n stat = fs.statSync(this.#schedulesPath);\n } catch (error) {\n this.#scheduleCache = undefined;\n if (errorCode(error) === \"ENOENT\") return { format: 1, schedules: [] };\n throw error;\n }\n // Locked mutations always re-read; the stat-keyed cache serves only lockless reads.\n const cached = lenient ? this.#scheduleCache : undefined;\n if (cached && cached.inode === stat.ino && cached.size === stat.size && cached.modifiedAt === stat.mtimeMs) {\n return cached.error === undefined ? cached.file : { format: 1, schedules: [] };\n }\n let file: MeshScheduleFile = { format: 1, schedules: [] };\n let damage: string | undefined;\n try {\n if (stat.size > MAX_SCHEDULE_FILE_BYTES) throw new Error(`exceeds ${MAX_SCHEDULE_FILE_BYTES} bytes`);\n const parsed = JSON.parse(fs.readFileSync(this.#schedulesPath, \"utf8\")) as Partial<MeshScheduleFile>;\n if (parsed?.format !== 1 || !Array.isArray(parsed.schedules) || !parsed.schedules.every(isMeshSchedule)) {\n throw new Error(\"invalid format\");\n }\n file = { format: 1, schedules: parsed.schedules };\n } catch (error) {\n damage = error instanceof Error ? error.message : String(error);\n }\n this.#scheduleCache = {\n inode: stat.ino, size: stat.size, modifiedAt: stat.mtimeMs, file, ...(damage !== undefined ? { error: damage } : {}),\n };\n if (damage === undefined) return file;\n // Reads tolerate damage; mutations refuse to overwrite it silently.\n if (lenient) return { format: 1, schedules: [] };\n throw new Error(`Failed to read Fabric mesh schedules: ${damage}`);\n }\n\n #writeSchedules(schedules: MeshSchedule[]): void {\n if (schedules.length === 0) {\n fs.rmSync(this.#schedulesPath, { force: true });\n this.#scheduleCache = undefined;\n return;\n }\n atomicWrite(this.#schedulesPath, { format: 1, schedules }, MAX_SCHEDULE_FILE_BYTES);\n this.#scheduleCache = undefined;\n }\n\n read(\n input: {\n after?: number;\n topic?: string;\n to?: string;\n limit?: number;\n } = {},\n ): MeshEvent[] {\n if (input.topic !== undefined) this.#validateTopic(input.topic);\n const limit = Math.max(1, Math.min(Math.floor(input.limit ?? 100), this.maxReadEvents));\n const events =\n input.after === undefined\n ? this.#readRecentEvents(input, limit)\n : this.#readEventsAfter(Math.max(0, Math.floor(input.after)), input, limit);\n return events.map((event) => jsonClone(event));\n }\n\n latestSequence(): number {\n return Math.max(this.#readSequence(), this.#readLastEventSequence());\n }\n\n latestOffset(): number {\n const generation = this.#readGeneration();\n let descriptor: number | undefined;\n let completeOffset = 0;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n if (size > 0) {\n const lastByte = Buffer.allocUnsafe(1);\n fs.readSync(descriptor, lastByte, 0, 1, size - 1);\n if (lastByte[0] === 0x0a) {\n completeOffset = size;\n } else {\n const readBytes = Math.min(size, this.maxEventBytes + 1);\n const tail = Buffer.allocUnsafe(readBytes);\n fs.readSync(descriptor, tail, 0, readBytes, size - readBytes);\n const newline = tail.lastIndexOf(0x0a);\n completeOffset = newline >= 0 ? size - readBytes + newline + 1 : 0;\n }\n }\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n return this.#encodeCursor(generation, completeOffset);\n }\n\n tail(cursor: number, limit = 100): MeshTailResult {\n const boundedLimit = Math.max(1, Math.min(Math.floor(limit), this.maxReadEvents));\n const generation = this.#readGeneration();\n const decoded = this.#decodeCursor(cursor);\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n let position = decoded.generation === generation ? Math.min(decoded.offset, size) : 0;\n if (position > 0) {\n const previousByte = Buffer.allocUnsafe(1);\n fs.readSync(descriptor, previousByte, 0, 1, position - 1);\n if (previousByte[0] !== 0x0a) position = 0;\n }\n if (position >= size) {\n return { events: [], nextOffset: this.#encodeCursor(generation, position) };\n }\n const chunkBytes = Math.min(\n size - position,\n Math.max(this.maxEventBytes + 1, EVENT_READ_PAGE_BYTES),\n );\n const buffer = Buffer.allocUnsafe(chunkBytes);\n const bytesRead = fs.readSync(descriptor, buffer, 0, chunkBytes, position);\n const events: MeshEvent[] = [];\n let lineStart = 0;\n let consumed = 0;\n for (let index = 0; index < bytesRead; index++) {\n if (buffer[index] !== 0x0a) continue;\n const line = buffer.subarray(lineStart, index).toString(\"utf8\").trim();\n lineStart = index + 1;\n consumed = lineStart;\n if (line) {\n try {\n const event = JSON.parse(line) as MeshEvent;\n if (typeof event.sequence === \"number\") events.push(event);\n } catch { /* skip malformed mesh log line */ }\n }\n if (events.length >= boundedLimit) break;\n }\n return {\n events: events.map((event) => jsonClone(event)),\n nextOffset: this.#encodeCursor(generation, position + consumed),\n };\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") {\n return { events: [], nextOffset: this.#encodeCursor(generation, 0) };\n }\n throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #readRecentEvents(\n input: { topic?: string; to?: string },\n limit: number,\n ): MeshEvent[] {\n let events: MeshEvent[] = [];\n let before: number | undefined;\n while (events.length < limit) {\n const page = readJsonlPage(\n this.#eventsPath,\n this.maxReadEvents,\n before,\n Math.max(this.maxEventBytes + 1, EVENT_READ_PAGE_BYTES),\n );\n const pageEvents: MeshEvent[] = [];\n for (const line of page.lines) {\n const parsed = line.parsed;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) continue;\n const event = parsed as MeshEvent;\n if (typeof event.sequence !== \"number\" || !this.#eventMatches(event, input)) continue;\n pageEvents.push(event);\n }\n events = [...pageEvents, ...events].slice(-limit);\n if (!page.hasMore || page.before === undefined || page.before === before) break;\n before = page.before;\n }\n return events;\n }\n\n #readEventsAfter(\n after: number,\n input: { topic?: string; to?: string },\n limit: number,\n ): MeshEvent[] {\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n const events: MeshEvent[] = [];\n let position = 0;\n let lineChunks: Buffer[] = [];\n let lineBytes = 0;\n let skippingOversizedLine = false;\n let reachedLimit = false;\n\n const emitLine = (): void => {\n if (!skippingOversizedLine && lineBytes > 0) {\n const decoded = Buffer.concat(lineChunks, lineBytes).toString(\"utf8\");\n const line = decoded.endsWith(String.fromCharCode(13)) ? decoded.slice(0, -1) : decoded;\n try {\n const event = JSON.parse(line) as MeshEvent;\n if (\n typeof event.sequence === \"number\" &&\n event.sequence > after &&\n this.#eventMatches(event, input)\n ) {\n events.push(event);\n reachedLimit = events.length >= limit;\n }\n } catch { /* skip malformed mesh log line */ }\n }\n lineChunks = [];\n lineBytes = 0;\n skippingOversizedLine = false;\n };\n\n while (position < size && !reachedLimit) {\n const readLength = Math.min(EVENT_READ_CHUNK_BYTES, size - position);\n const chunk = Buffer.allocUnsafe(readLength);\n const bytesRead = fs.readSync(descriptor, chunk, 0, readLength, position);\n if (bytesRead <= 0) break;\n position += bytesRead;\n const captured = chunk.subarray(0, bytesRead);\n let segmentStart = 0;\n while (segmentStart < captured.length && !reachedLimit) {\n const newline = captured.indexOf(0x0a, segmentStart);\n const segmentEnd = newline < 0 ? captured.length : newline;\n const segment = captured.subarray(segmentStart, segmentEnd);\n if (!skippingOversizedLine) {\n if (lineBytes + segment.length <= this.maxEventBytes) {\n if (segment.length > 0) lineChunks.push(segment);\n lineBytes += segment.length;\n } else {\n lineChunks = [];\n lineBytes = 0;\n skippingOversizedLine = true;\n }\n }\n if (newline < 0) break;\n emitLine();\n segmentStart = newline + 1;\n }\n }\n if (!reachedLimit && (lineBytes > 0 || skippingOversizedLine)) emitLine();\n return events;\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return [];\n throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #eventMatches(event: MeshEvent, input: { topic?: string; to?: string }): boolean {\n if (input.topic !== undefined && event.topic !== input.topic) return false;\n if (input.to !== undefined && event.to !== input.to) return false;\n return true;\n }\n\n get(key: string): MeshStateEntry | undefined {\n this.#validateKey(key);\n const entries = this.#readCachedState().entries;\n return Object.hasOwn(entries, key) ? jsonClone(entries[key]) : undefined;\n }\n\n list(prefix = \"\", limit = 100): MeshStateEntry[] {\n const boundedLimit = Math.max(1, Math.min(Math.floor(limit), this.maxReadEvents));\n return this.listAll(prefix).slice(0, boundedLimit);\n }\n\n /** Internal project-state scan for host-managed indexes that must reconcile every key. */\n listAll(prefix = \"\"): MeshStateEntry[] {\n if (prefix) this.#validateKey(prefix);\n return Object.values(this.#readCachedState().entries)\n .filter((entry) => !prefix || entry.key.startsWith(prefix))\n .sort((left, right) => left.key.localeCompare(right.key))\n .map((entry) => jsonClone(entry));\n }\n\n async put(input: {\n key: string;\n value: unknown;\n identity: MeshIdentity;\n ifVersion?: number;\n }): Promise<MeshStateEntry> {\n const { key, value, identity, ifVersion } = input;\n this.#validateKey(key);\n const request = captureStoragePut({ key, value, identity, ifVersion }, this.maxEventBytes);\n return this.#withLock(() => {\n const state = readState(this.#statePath, this.#maxStateBytes, false);\n const slot = stateSlot(state, request.key);\n const plan = request.transition(slot.present, slot.version, slot.highWater);\n if (plan.kind !== \"put\") throw new Error(\"Invalid verified storage put plan\");\n const entry: MeshStateEntry = {\n key: plan.key,\n value: plan.value,\n version: plan.version,\n updatedAt: Date.now(),\n updatedBy: plan.identity,\n };\n state.entries[plan.key] = entry;\n state.versions ??= {};\n state.versions[plan.key] = plan.version;\n // Keep the envelope readable by existing hosts; revisionFormat marks the\n // mandatory persistent clock without making old readers quarantine it.\n state.format = 1;\n state.revisionFormat = 2;\n state.highWater = plan.highWater;\n state.tombstoneOrder = (state.tombstoneOrder ?? []).filter((key) => key !== plan.key);\n compactStateTombstones(state, this.#maxStateTombstones);\n atomicWrite(this.#statePath, state, this.#maxStateBytes);\n this.#cacheState(state);\n return jsonClone(entry);\n });\n }\n\n async delete(input: {\n key: string;\n ifVersion?: number;\n }): Promise<{ deleted: boolean; version?: number }> {\n const { key, ifVersion } = input;\n this.#validateKey(key);\n const request = captureStorageDelete({ key, ifVersion });\n return this.#withLock(() => {\n const state = readState(this.#statePath, this.#maxStateBytes, false);\n const slot = stateSlot(state, request.key);\n const plan = request.transition(slot.present, slot.version, slot.highWater);\n if (plan.kind === \"unchanged\") {\n this.#cacheState(state);\n return { deleted: false };\n }\n if (plan.kind !== \"delete\") throw new Error(\"Invalid verified storage delete plan\");\n delete state.entries[plan.key];\n state.versions ??= {};\n // Delete consumes a key successor and advances the persistent clock.\n // Eviction can forget a CAS tombstone, but not allocation history.\n state.versions[plan.key] = plan.version;\n // Keep the envelope readable by existing hosts; revisionFormat marks the\n // mandatory persistent clock without making old readers quarantine it.\n state.format = 1;\n state.revisionFormat = 2;\n state.highWater = plan.highWater;\n state.tombstoneOrder = [\n ...(state.tombstoneOrder ?? []).filter((key) => key !== plan.key),\n plan.key,\n ];\n compactStateTombstones(state, this.#maxStateTombstones);\n atomicWrite(this.#statePath, state, this.#maxStateBytes);\n this.#cacheState(state);\n return { deleted: true, version: plan.version };\n });\n }\n\n #readCachedState(): MeshStateFile {\n try {\n const stat = fs.statSync(this.#statePath);\n const cached = this.#stateCache;\n if (\n cached &&\n cached.device === stat.dev &&\n cached.inode === stat.ino &&\n cached.size === stat.size &&\n cached.modifiedAt === stat.mtimeMs\n ) {\n return cached.state;\n }\n } catch (error) {\n this.#stateCache = undefined;\n if (errorCode(error) === \"ENOENT\") return emptyState();\n throw error;\n }\n const state = readState(this.#statePath, this.#maxStateBytes);\n this.#cacheState(state);\n return state;\n }\n\n #cacheState(state: MeshStateFile): void {\n try {\n const stat = fs.statSync(this.#statePath);\n this.#stateCache = {\n device: stat.dev,\n inode: stat.ino,\n size: stat.size,\n modifiedAt: stat.mtimeMs,\n state,\n };\n } catch {\n this.#stateCache = undefined;\n }\n }\n\n async #withLock<T>(operation: () => T): Promise<T> {\n fs.mkdirSync(this.root, { recursive: true, mode: 0o700 });\n const deadline = Date.now() + this.#lockTimeoutMs;\n const token = randomUUID();\n const ownerPath = path.join(this.#lockPath, \"owner\");\n while (true) {\n try {\n fs.mkdirSync(this.#lockPath, { mode: 0o700 });\n fs.writeFileSync(ownerPath, `${token}\\n${process.pid}\\n${Date.now()}\\n${encodeOwnerIdentityLine()}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n break;\n } catch (error) {\n if (errorCode(error) !== \"EEXIST\") throw error;\n if (this.#clearStaleLock(ownerPath)) continue;\n if (Date.now() >= deadline) throw new Error(\"Timed out waiting for the Fabric mesh lock\");\n await delay(10);\n }\n }\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(this.#lockPath, { recursive: true, force: true });\n }\n } catch {\n // Another process already recovered or removed this lock.\n }\n }\n }\n\n // Returns true when a stale lock was removed and acquisition should retry.\n // A lock is stale when it outlived the stale window without a live owner:\n // either the owner file names a dead process, or the owner file is missing\n // or corrupt \u2014 the owner crashed between creating the lock directory and\n // writing the owner file \u2014 and the untouched lock directory itself is\n // stale. Removal re-reads the state it judged stale so a freshly rotated\n // owner is never deleted mid-check.\n #clearStaleLock(ownerPath: string): boolean {\n let lockModifiedAt: number | undefined;\n let owner: string | undefined;\n try {\n owner = fs.readFileSync(ownerPath, \"utf8\");\n } catch {\n try {\n lockModifiedAt = fs.statSync(this.#lockPath).mtimeMs;\n } catch {\n return false;\n }\n }\n if (owner !== undefined) {\n const [, pidText, createdText, identityLine] = owner.trim().split(\"\\n\");\n const createdAt = Number(createdText);\n if (Number.isFinite(createdAt) && Date.now() - createdAt <= this.#staleLockMs) return false;\n // Unknown (another PID namespace within the hold ceiling) is not death.\n if (lockOwnerLiveness(Number(pidText), createdAt, identityLine, {\n legacyAlive: processAlive,\n maxHoldMs: Math.max(SHORT_LOCK_MAX_HOLD_MS, this.#staleLockMs),\n }) !== \"dead\") return false;\n try {\n if (fs.readFileSync(ownerPath, \"utf8\") !== owner) return false;\n fs.rmSync(this.#lockPath, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n }\n if (lockModifiedAt === undefined || Date.now() - lockModifiedAt <= this.#staleLockMs) {\n return false;\n }\n try {\n if (fs.statSync(this.#lockPath).mtimeMs !== lockModifiedAt) return false;\n fs.rmSync(this.#lockPath, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n }\n\n #readGeneration(): number {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(this.#generationPath, \"utf8\"));\n return typeof parsed === \"number\" && Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : 0;\n } catch {\n return 0;\n }\n }\n\n #encodeCursor(generation: number, offset: number): number {\n const cursor = generation * CURSOR_OFFSET_BASE + offset;\n if (!Number.isSafeInteger(cursor) || cursor < 0) {\n throw new Error(\"Fabric mesh cursor exhausted its safe integer range\");\n }\n return cursor;\n }\n\n #decodeCursor(cursor: number): { generation: number; offset: number } {\n if (!Number.isSafeInteger(cursor) || cursor < 0) return { generation: -1, offset: 0 };\n return {\n generation: Math.floor(cursor / CURSOR_OFFSET_BASE),\n offset: cursor % CURSOR_OFFSET_BASE,\n };\n }\n\n #compactEventLog(): void {\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n if (size <= this.#maxEventLogBytes) return;\n const readBytes = Math.min(\n size,\n this.#retainedEventLogBytes + this.maxEventBytes + 1,\n );\n const buffer = Buffer.allocUnsafe(readBytes);\n const bytesRead = fs.readSync(descriptor, buffer, 0, readBytes, size - readBytes);\n const captured = buffer.subarray(0, bytesRead);\n const retentionBoundary = Math.max(0, captured.length - this.#retainedEventLogBytes);\n const newline = retentionBoundary === 0 ? -1 : captured.indexOf(0x0a, retentionBoundary);\n const retainedStart = retentionBoundary === 0 ? 0 : newline >= 0 ? newline + 1 : captured.length;\n const retained = captured.subarray(retainedStart);\n fs.closeSync(descriptor);\n descriptor = undefined;\n const temporaryPath =\n this.#eventsPath + \".\" + process.pid + \".\" + randomUUID() + \".tmp\";\n try {\n fs.writeFileSync(temporaryPath, retained, { mode: 0o600 });\n fs.renameSync(temporaryPath, this.#eventsPath);\n } finally {\n try { fs.rmSync(temporaryPath, { force: true }); } catch {}\n }\n atomicWrite(this.#generationPath, this.#readGeneration() + 1);\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #repairEventLog(): void {\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r+\");\n const size = fs.fstatSync(descriptor).size;\n if (size === 0) return;\n const lastByte = Buffer.allocUnsafe(1);\n fs.readSync(descriptor, lastByte, 0, 1, size - 1);\n if (lastByte[0] === 0x0a) return;\n const readBytes = Math.min(size, this.maxEventBytes + 1);\n const tail = Buffer.allocUnsafe(readBytes);\n fs.readSync(descriptor, tail, 0, readBytes, size - readBytes);\n const newline = tail.lastIndexOf(0x0a);\n fs.ftruncateSync(descriptor, newline >= 0 ? size - readBytes + newline + 1 : 0);\n } catch (error) {\n if (errorCode(error) !== \"ENOENT\") throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #readLastEventSequence(): number {\n let descriptor: number | undefined;\n try {\n descriptor = fs.openSync(this.#eventsPath, \"r\");\n const size = fs.fstatSync(descriptor).size;\n if (size === 0) return 0;\n const readBytes = Math.min(size, this.maxEventBytes + 1);\n const tail = Buffer.allocUnsafe(readBytes);\n fs.readSync(descriptor, tail, 0, readBytes, size - readBytes);\n const lines = tail.toString(\"utf8\").trim().split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index--) {\n const line = lines[index];\n if (!line) continue;\n try {\n const parsed = JSON.parse(line) as { sequence?: unknown };\n if (typeof parsed.sequence === \"number\" && Number.isSafeInteger(parsed.sequence)) {\n return parsed.sequence;\n }\n } catch { /* skip malformed sequence line */ }\n }\n return 0;\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return 0;\n throw error;\n } finally {\n if (descriptor !== undefined) fs.closeSync(descriptor);\n }\n }\n\n #readSequence(): number {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(this.#counterPath, \"utf8\"));\n return typeof parsed === \"number\" && Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : 0;\n } catch (error) {\n if (errorCode(error) === \"ENOENT\") return 0;\n return 0;\n }\n }\n\n #validateTopic(topic: string): void {\n validateMeshTopic(topic);\n }\n\n #validateKey(key: string): void {\n const unsafeSegment = key\n .split(/[/:]/)\n .some(\n (segment) =>\n segment === \"__proto__\" || segment === \"prototype\" || segment === \"constructor\",\n );\n if (!KEY_PATTERN.test(key) || unsafeSegment) {\n throw new Error(`Invalid Fabric mesh key: ${key}`);\n }\n }\n}\n", "// Generated by Bend 2.0.35; do not edit. See LAWS.bend and PROOF.bend.\n// Includes adapted Bend runtime/Base code, Copyright 2026 HigherOrderCO, Apache-2.0.\n// ABI exports selected and tags adapted by Pi Fabric; see THIRD_PARTY_NOTICES.md.\nfunction d(e, t) {\n return { $: e < t ? \"LT\" : e === t ? \"EQ\" : \"GT\" };\n}\nfunction y(e) {\n if (e > 281474976710655)\n throw \"bend: a Nat past the largest immediate 2^48-1\";\n return e;\n}\nfunction c(e) {\n return (typeof e == \"bigint\" || Number.isInteger(e)) && e >= 0 && e <= 2 ** 53 ? Number(e) : { [Symbol.toPrimitive]() {\n throw \"bend: a Nat past the largest immediate 2^48-1\";\n } };\n}\nfunction D(e) {\n for (; e !== null && typeof e == \"object\" && e.$ === \"$JMP\"; )\n e = e.f(...e.x);\n return e;\n}\nfunction m(e, t) {\n return (...a) => a.length < t ? m((...s) => e(...a, ...s), t - a.length) : e(...a);\n}\nfunction C(e, t) {\n let a = e.high, s = e.low, n = t.high, r = t.low;\n return u(p(a, n), p(s, r));\n}\nfunction q(e, t) {\n if (e.$ === \"storage-plans.Any\")\n return !0;\n {\n let a = e.version;\n return C(a, t);\n }\n}\nfunction k(e) {\n let t = e.high, a = e.low, s = t < 2097151, n = a < 4294967295;\n return u(u(R(t, 2097151), R(a, 4294967295)), s || n);\n}\nfunction E(e, t, a) {\n return e ? { $: \"storage-plans.Revision\", high: y(t + 1), low: 0 } : { $: \"storage-plans.Revision\", high: t, low: y(a + 1) };\n}\nfunction h(e) {\n let t = e.high, a = e.low;\n return E(p(a, 4294967295), t, a);\n}\nfunction x(e, t, a) {\n return e ? t : a;\n}\nfunction b(e, t) {\n return u(k(e), k(t));\n}\nfunction N(e, t, a, s, n) {\n if (e)\n if (a.$ === \"storage-plans.Put\") {\n let r = a.value, o = a.identity;\n return { $: \"storage-plans.PutNext\", key: t, value: r, identity: o, version: h(s), highWater: h(n) };\n } else\n return { $: \"storage-plans.DeleteNext\", key: t, version: h(s), highWater: h(n) };\n else\n return { $: \"storage-plans.Exhausted\" };\n}\nfunction S(e, t, a, s, n) {\n if (t.$ === \"storage-plans.Delete\")\n return a ? N(b(s, n), e, { $: \"storage-plans.Delete\" }, s, n) : { $: \"storage-plans.Unchanged\" };\n {\n let r = t.value, o = t.identity;\n return N(b(x(a, s, n), n), e, { $: \"storage-plans.Put\", value: r, identity: o }, x(a, s, n), n);\n }\n}\nfunction U(e, t, a, s, n, r) {\n return e ? S(t, a, s, n, r) : { $: \"storage-plans.Conflict\" };\n}\nfunction T(e, t) {\n let a = e.key, s = e.expected, n = e.change, r = t.present, o = t.version, l = t.highWater;\n return U(q(s, o), a, n, r, o, l);\n}\nfunction W(e, t) {\n return T(e, t);\n}\nfunction u(e, t) {\n return e ? t : !1;\n}\nfunction p(e, t) {\n return B(d(e, t));\n}\nfunction R(e, t) {\n return I(d(e, t));\n}\nfunction B(e) {\n return e.$ === \"EQ\";\n}\nfunction I(e) {\n return e.$ !== \"GT\";\n}\nfunction $(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Revision\":\n return a = a[s] = { ...e, high: c(e.high), low: c(e.low) }, t[0];\n default:\n throw \"bend: storage-plans.Revision has no tag \" + e?.$ + \" (its tags: storage-plans.Revision); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction i(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Revision\":\n return a = a[s] = { ...e, high: BigInt(e.high), low: BigInt(e.low) }, t[0];\n default:\n throw \"bend: storage-plans.Revision has no tag \" + e?.$ + \" (its tags: storage-plans.Revision); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction j(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Any\":\n return a[s] = e, t[0];\n case \"storage-plans.At\":\n return a = a[s] = { ...e, version: $(e.version) }, t[0];\n default:\n throw \"bend: storage-plans.Expectation has no tag \" + e?.$ + \" (its tags: storage-plans.Any, storage-plans.At); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction G(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Any\":\n return a[s] = e, t[0];\n case \"storage-plans.At\":\n return a = a[s] = { ...e, version: i(e.version) }, t[0];\n default:\n throw \"bend: storage-plans.Expectation has no tag \" + e?.$ + \" (its tags: storage-plans.Any, storage-plans.At); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction f(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"Nil\":\n return a[s] = e, t[0];\n case \"Con\":\n a = a[s] = { ...e, head: c(e.head) }, s = \"tail\", e = e[s];\n continue;\n default:\n throw \"bend: List has no tag \" + e?.$ + \" (its tags: Nil, Con); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction L(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Put\":\n return a = a[s] = { ...e, value: f(e.value), identity: f(e.identity) }, t[0];\n case \"storage-plans.Delete\":\n return a[s] = e, t[0];\n default:\n throw \"bend: storage-plans.Change has no tag \" + e?.$ + \" (its tags: storage-plans.Put, storage-plans.Delete); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction g(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"Nil\":\n return a[s] = e, t[0];\n case \"Con\":\n a = a[s] = { ...e, head: BigInt(e.head) }, s = \"tail\", e = e[s];\n continue;\n default:\n throw \"bend: List has no tag \" + e?.$ + \" (its tags: Nil, Con); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction M(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Put\":\n return a = a[s] = { ...e, value: g(e.value), identity: g(e.identity) }, t[0];\n case \"storage-plans.Delete\":\n return a[s] = e, t[0];\n default:\n throw \"bend: storage-plans.Change has no tag \" + e?.$ + \" (its tags: storage-plans.Put, storage-plans.Delete); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction Q(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Conflict\":\n return a[s] = e, t[0];\n case \"storage-plans.Exhausted\":\n return a[s] = e, t[0];\n case \"storage-plans.Unchanged\":\n return a[s] = e, t[0];\n case \"storage-plans.PutNext\":\n return a = a[s] = { ...e, key: g(e.key), value: g(e.value), identity: g(e.identity), version: i(e.version), highWater: i(e.highWater) }, t[0];\n case \"storage-plans.DeleteNext\":\n return a = a[s] = { ...e, key: g(e.key), version: i(e.version), highWater: i(e.highWater) }, t[0];\n default:\n throw \"bend: storage-plans.Plan has no tag \" + e?.$ + \" (its tags: storage-plans.Conflict, storage-plans.Exhausted, storage-plans.Unchanged, storage-plans.PutNext, storage-plans.DeleteNext); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction J(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Request\":\n return a = a[s] = { ...e, key: f(e.key), expected: j(e.expected), change: L(e.change) }, t[0];\n default:\n throw \"bend: storage-plans.Request has no tag \" + e?.$ + \" (its tags: storage-plans.Request); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction O(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Slot\":\n return a = a[s] = { ...e, version: $(e.version), highWater: $(e.highWater) }, t[0];\n default:\n throw \"bend: storage-plans.Slot has no tag \" + e?.$ + \" (its tags: storage-plans.Slot); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction z(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Request\":\n return a = a[s] = { ...e, key: g(e.key), expected: G(e.expected), change: M(e.change) }, t[0];\n default:\n throw \"bend: storage-plans.Request has no tag \" + e?.$ + \" (its tags: storage-plans.Request); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nfunction F(e) {\n let t = [e];\n for (let a = t, s = 0; ; )\n switch (e.$) {\n case \"storage-plans.Slot\":\n return a = a[s] = { ...e, version: i(e.version), highWater: i(e.highWater) }, t[0];\n default:\n throw \"bend: storage-plans.Slot has no tag \" + e?.$ + \" (its tags: storage-plans.Slot); a tag names its constructor as the loading file sees it, which a later version will make the same everywhere (#1105)\";\n }\n}\nvar P = /* @__PURE__ */ new Map([[\"Any\", \"storage-plans.Any\"], [\"Revision\", \"storage-plans.Revision\"], [\"Exhausted\", \"storage-plans.Exhausted\"], [\"Put\", \"storage-plans.Put\"], [\"PutNext\", \"storage-plans.PutNext\"], [\"DeleteNext\", \"storage-plans.DeleteNext\"], [\"Delete\", \"storage-plans.Delete\"], [\"Unchanged\", \"storage-plans.Unchanged\"], [\"Conflict\", \"storage-plans.Conflict\"], [\"At\", \"storage-plans.At\"], [\"Request\", \"storage-plans.Request\"], [\"Slot\", \"storage-plans.Slot\"]]), H = /* @__PURE__ */ new Map([[\"storage-plans.Any\", \"Any\"], [\"storage-plans.Revision\", \"Revision\"], [\"storage-plans.Exhausted\", \"Exhausted\"], [\"storage-plans.Put\", \"Put\"], [\"storage-plans.PutNext\", \"PutNext\"], [\"storage-plans.DeleteNext\", \"DeleteNext\"], [\"storage-plans.Delete\", \"Delete\"], [\"storage-plans.Unchanged\", \"Unchanged\"], [\"storage-plans.Conflict\", \"Conflict\"], [\"storage-plans.At\", \"At\"], [\"storage-plans.Request\", \"Request\"], [\"storage-plans.Slot\", \"Slot\"]]);\nfunction w(e, t) {\n let a = [e];\n for (let s = [[a, 0]]; s.length > 0; ) {\n let [n, r] = s.pop(), o = n[r];\n if (o === null || typeof o != \"object\") continue;\n let l = Array.isArray(o) ? [...o] : { ...o };\n typeof l.$ == \"string\" && (l.$ = t.get(l.$) ?? l.$), n[r] = l;\n for (let A of Object.keys(l)) s.push([l, A]);\n }\n return a[0];\n}\nvar K = /* @__PURE__ */ m((e, t) => {\n let a = Q(D(W(J(e), O(t))));\n return z(e), F(t), a;\n}, 2), V = (e, t) => w(K(w(e, P), w(t, P)), H);\nexport {\n V as storageTransition\n};\n", "import {\n storageTransition,\n type StoragePlan,\n type StorageRequest,\n type StorageRevision,\n type StorageText,\n} from \"./generated/storage-kernel.js\";\nimport type { MeshIdentity } from \"../mesh/store.js\";\n\n// Bend Nat arithmetic is capped at 2^48-1. Canonical radix-2^32 limbs\n// represent the entire JS safe-integer range without crossing that runtime cap.\nconst RADIX = 4294967296n;\n\nconst encode = (text: string): StorageText => {\n let result: StorageText = { $: \"Nil\" };\n for (let index = text.length - 1; index >= 0; index--) {\n result = { $: \"Con\", head: BigInt(text.charCodeAt(index)), tail: result };\n }\n return result;\n};\n\nconst decode = (text: StorageText): string => {\n const units: string[] = [];\n for (let node = text; node.$ === \"Con\"; node = node.tail) {\n if (node.head < 0n || node.head > 65535n) throw new Error(\"Invalid storage code unit\");\n units.push(String.fromCharCode(Number(node.head)));\n }\n return units.join(\"\");\n};\n\nexport const storageRevision = (value: unknown): number => {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n throw new Error(\"Invalid Fabric mesh revision: expected a nonnegative safe integer\");\n }\n return value;\n};\n\nconst encodeRevision = (value: number): StorageRevision => {\n const exact = BigInt(storageRevision(value));\n return { $: \"Revision\", high: exact / RADIX, low: exact % RADIX };\n};\n\nconst decodeRevision = (value: StorageRevision): number => {\n if (value.high < 0n || value.high > 2097151n || value.low < 0n || value.low >= RADIX) {\n throw new Error(\"Invalid verified storage revision limbs\");\n }\n // Representation conversion only; CAS, overflow and successor/carry decisions\n // are performed by the executable proved reducer, not reproduced here.\n return storageRevision(Number(value.high * RADIX + value.low));\n};\n\nconst serialize = (value: unknown): string => {\n const json = JSON.stringify(value);\n if (json === undefined) throw new Error(\"Mesh values must be JSON-serializable\");\n return json;\n};\n\nexport type StorageTransition =\n | { kind: \"put\"; key: string; value: unknown; identity: MeshIdentity; version: number; highWater: number }\n | { kind: \"delete\"; key: string; version: number; highWater: number }\n | { kind: \"unchanged\" };\n\nexport interface CapturedStorageRequest {\n readonly key: string;\n readonly transition: (present: boolean, actualVersion: number, highWater: number) => StorageTransition;\n}\n\nconst capture = (\n key: string,\n ifVersion: number | undefined,\n payload?: { value: string; identity: string },\n): CapturedStorageRequest => {\n const expected = ifVersion === undefined ? undefined : storageRevision(ifVersion);\n // The wire graph and JSON strings never escape this closure. Caller-owned\n // objects (including nested identity/value) are not retained across lock wait.\n const request: StorageRequest = {\n $: \"Request\",\n key: encode(key),\n expected: expected === undefined ? { $: \"Any\" } : { $: \"At\", version: encodeRevision(expected) },\n change: payload === undefined ? { $: \"Delete\" } : {\n $: \"Put\", value: encode(payload.value), identity: encode(payload.identity),\n },\n };\n return Object.freeze({\n key,\n transition(present: boolean, actualVersion: number, highWater: number): StorageTransition {\n const actual = storageRevision(actualVersion);\n const clock = storageRevision(highWater);\n if (clock < actual) throw new Error(\"Inconsistent Fabric mesh high-water revision\");\n const plan: StoragePlan = storageTransition(\n request, { $: \"Slot\", present, version: encodeRevision(actual), highWater: encodeRevision(clock) },\n );\n switch (plan.$) {\n case \"Conflict\":\n throw new Error(`Mesh compare-and-swap failed for ${key}: expected version ${expected}, found ${actual}`);\n case \"Exhausted\":\n throw new Error(`Fabric mesh revision exhausted for ${key}`);\n case \"Unchanged\":\n return { kind: \"unchanged\" };\n case \"PutNext\":\n return {\n kind: \"put\", key: decode(plan.key), value: JSON.parse(decode(plan.value)),\n identity: JSON.parse(decode(plan.identity)) as MeshIdentity,\n version: decodeRevision(plan.version), highWater: decodeRevision(plan.highWater),\n };\n case \"DeleteNext\":\n return { kind: \"delete\", key: decode(plan.key), version: decodeRevision(plan.version), highWater: decodeRevision(plan.highWater) };\n }\n },\n });\n};\n\nexport const captureStoragePut = (input: {\n key: string; ifVersion?: number | undefined; value: unknown; identity: MeshIdentity;\n}, maxValueBytes = Number.POSITIVE_INFINITY): CapturedStorageRequest => {\n const { key, ifVersion, value, identity } = input;\n // Capture scalars before serialization can invoke user-defined toJSON hooks.\n if (ifVersion !== undefined) storageRevision(ifVersion);\n const identityJson = serialize(identity);\n const valueJson = serialize(value);\n if (Buffer.byteLength(valueJson, \"utf8\") > maxValueBytes) {\n throw new Error(`Mesh state value exceeds ${maxValueBytes} bytes`);\n }\n return capture(key, ifVersion, { value: valueJson, identity: identityJson });\n};\n\nexport const captureStorageDelete = (input: {\n key: string; ifVersion?: number | undefined;\n}): CapturedStorageRequest => {\n const { key, ifVersion } = input;\n return capture(key, ifVersion);\n};\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,OAAO,QAAQ;AACf,OAAO,UAAU;;;ACCjB,SAAS,EAAE,GAAG,GAAG;AACf,SAAO,EAAE,GAAG,IAAI,IAAI,OAAO,MAAM,IAAI,OAAO,KAAK;AACnD;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI;AACN,UAAM;AACR,SAAO;AACT;AACA,SAAS,EAAE,GAAG;AACZ,UAAQ,OAAO,KAAK,YAAY,OAAO,UAAU,CAAC,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,WAAW,IAAI;AACpH,UAAM;AAAA,EACR,EAAE;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,SAAO,MAAM,QAAQ,OAAO,KAAK,YAAY,EAAE,MAAM;AACnD,QAAI,EAAE,EAAE,GAAG,EAAE,CAAC;AAChB,SAAO;AACT;AACA,SAAS,EAAE,GAAG,GAAG;AACf,SAAO,IAAI,MAAM,EAAE,SAAS,IAAI,EAAE,IAAI,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,GAAG,CAAC;AACnF;AACA,SAAS,EAAE,GAAG,GAAG;AACf,MAAI,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,IAAI,EAAE;AAC7C,SAAO,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC3B;AACA,SAAS,EAAE,GAAG,GAAG;AACf,MAAI,EAAE,MAAM;AACV,WAAO;AACT;AACE,QAAI,IAAI,EAAE;AACV,WAAO,EAAE,GAAG,CAAC;AAAA,EACf;AACF;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,IAAI,SAAS,IAAI,IAAI;AACpD,SAAO,EAAE,EAAE,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC;AACrD;AACA,SAAS,EAAE,GAAG,GAAG,GAAG;AAClB,SAAO,IAAI,EAAE,GAAG,0BAA0B,MAAM,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,0BAA0B,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,EAAE;AAC7H;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,EAAE,MAAM,IAAI,EAAE;AACtB,SAAO,EAAE,EAAE,GAAG,UAAU,GAAG,GAAG,CAAC;AACjC;AACA,SAAS,EAAE,GAAG,GAAG,GAAG;AAClB,SAAO,IAAI,IAAI;AACjB;AACA,SAAS,EAAE,GAAG,GAAG;AACf,SAAO,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACrB;AACA,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG;AACxB,MAAI;AACF,QAAI,EAAE,MAAM,qBAAqB;AAC/B,UAAI,IAAI,EAAE,OAAO,IAAI,EAAE;AACvB,aAAO,EAAE,GAAG,yBAAyB,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE;AAAA,IACrG;AACE,aAAO,EAAE,GAAG,4BAA4B,KAAK,GAAG,SAAS,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE;AAAA;AAEjF,WAAO,EAAE,GAAG,0BAA0B;AAC1C;AACA,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG;AACxB,MAAI,EAAE,MAAM;AACV,WAAO,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,uBAAuB,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,0BAA0B;AACjG;AACE,QAAI,IAAI,EAAE,OAAO,IAAI,EAAE;AACvB,WAAO,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,qBAAqB,OAAO,GAAG,UAAU,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC;AAAA,EAChG;AACF;AACA,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC3B,SAAO,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,yBAAyB;AAC9D;AACA,SAAS,EAAE,GAAG,GAAG;AACf,MAAI,IAAI,EAAE,KAAK,IAAI,EAAE,UAAU,IAAI,EAAE,QAAQ,IAAI,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE;AACjF,SAAO,EAAE,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACjC;AACA,SAAS,EAAE,GAAG,GAAG;AACf,SAAO,EAAE,GAAG,CAAC;AACf;AACA,SAAS,EAAE,GAAG,GAAG;AACf,SAAO,IAAI,IAAI;AACjB;AACA,SAAS,EAAE,GAAG,GAAG;AACf,SAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAClB;AACA,SAAS,EAAE,GAAG,GAAG;AACf,SAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAClB;AACA,SAAS,EAAE,GAAG;AACZ,SAAO,EAAE,MAAM;AACjB;AACA,SAAS,EAAE,GAAG;AACZ,SAAO,EAAE,MAAM;AACjB;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,EAAE,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAAA,MACjE;AACE,cAAM,6CAA6C,GAAG,IAAI;AAAA,IAC9D;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,OAAO,EAAE,IAAI,GAAG,KAAK,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAAA,MAC3E;AACE,cAAM,6CAA6C,GAAG,IAAI;AAAA,IAC9D;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,MACxD;AACE,cAAM,gDAAgD,GAAG,IAAI;AAAA,IACjE;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,MACxD;AACE,cAAM,gDAAgD,GAAG,IAAI;AAAA,IACjE;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB,KAAK;AACH,YAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,QAAQ,IAAI,EAAE,CAAC;AACzD;AAAA,MACF;AACE,cAAM,2BAA2B,GAAG,IAAI;AAAA,IAC5C;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,EAAE,EAAE,KAAK,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAAA,MAC7E,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB;AACE,cAAM,2CAA2C,GAAG,IAAI;AAAA,IAC5D;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB,KAAK;AACH,YAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,QAAQ,IAAI,EAAE,CAAC;AAC9D;AAAA,MACF;AACE,cAAM,2BAA2B,GAAG,IAAI;AAAA,IAC5C;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,EAAE,EAAE,KAAK,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAAA,MAC7E,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB;AACE,cAAM,2CAA2C,GAAG,IAAI;AAAA,IAC5D;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB,KAAK;AACH,eAAO,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAAA,MACtB,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG,OAAO,EAAE,EAAE,KAAK,GAAG,UAAU,EAAE,EAAE,QAAQ,GAAG,SAAS,EAAE,EAAE,OAAO,GAAG,WAAW,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAAA,MAC9I,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG,SAAS,EAAE,EAAE,OAAO,GAAG,WAAW,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAAA,MAClG;AACE,cAAM,yCAAyC,GAAG,IAAI;AAAA,IAC1D;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG,UAAU,EAAE,EAAE,QAAQ,GAAG,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,MAC9F;AACE,cAAM,4CAA4C,GAAG,IAAI;AAAA,IAC7D;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,SAAS,EAAE,EAAE,OAAO,GAAG,WAAW,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAAA,MACnF;AACE,cAAM,yCAAyC,GAAG,IAAI;AAAA,IAC1D;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,GAAG,GAAG,UAAU,EAAE,EAAE,QAAQ,GAAG,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,MAC9F;AACE,cAAM,4CAA4C,GAAG,IAAI;AAAA,IAC7D;AACJ;AACA,SAAS,EAAE,GAAG;AACZ,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,GAAG,IAAI;AAClB,YAAQ,EAAE,GAAG;AAAA,MACX,KAAK;AACH,eAAO,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,SAAS,EAAE,EAAE,OAAO,GAAG,WAAW,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAAA,MACnF;AACE,cAAM,yCAAyC,GAAG,IAAI;AAAA,IAC1D;AACJ;AACA,IAAI,IAAoB,oBAAI,IAAI,CAAC,CAAC,OAAO,mBAAmB,GAAG,CAAC,YAAY,wBAAwB,GAAG,CAAC,aAAa,yBAAyB,GAAG,CAAC,OAAO,mBAAmB,GAAG,CAAC,WAAW,uBAAuB,GAAG,CAAC,cAAc,0BAA0B,GAAG,CAAC,UAAU,sBAAsB,GAAG,CAAC,aAAa,yBAAyB,GAAG,CAAC,YAAY,wBAAwB,GAAG,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAW,uBAAuB,GAAG,CAAC,QAAQ,oBAAoB,CAAC,CAAC;AAAxd,IAA2d,IAAoB,oBAAI,IAAI,CAAC,CAAC,qBAAqB,KAAK,GAAG,CAAC,0BAA0B,UAAU,GAAG,CAAC,2BAA2B,WAAW,GAAG,CAAC,qBAAqB,KAAK,GAAG,CAAC,yBAAyB,SAAS,GAAG,CAAC,4BAA4B,YAAY,GAAG,CAAC,wBAAwB,QAAQ,GAAG,CAAC,2BAA2B,WAAW,GAAG,CAAC,0BAA0B,UAAU,GAAG,CAAC,oBAAoB,IAAI,GAAG,CAAC,yBAAyB,SAAS,GAAG,CAAC,sBAAsB,MAAM,CAAC,CAAC;AAC/6B,SAAS,EAAE,GAAG,GAAG;AACf,MAAI,IAAI,CAAC,CAAC;AACV,WAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,SAAS,KAAK;AACrC,QAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC;AAC7B,QAAI,MAAM,QAAQ,OAAO,KAAK,SAAU;AACxC,QAAI,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;AAC3C,WAAO,EAAE,KAAK,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI;AAC5D,aAAS,KAAK,OAAO,KAAK,CAAC,EAAG,GAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AAAA,EAC7C;AACA,SAAO,EAAE,CAAC;AACZ;AACA,IAAI,IAAoB,kBAAE,CAAC,GAAG,MAAM;AAClC,MAAI,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1B,SAAO,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG;AACrB,GAAG,CAAC;AAHJ,IAGO,IAAI,CAAC,GAAG,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;;;AC5P7C,IAAM,QAAQ;AAEd,IAAM,SAAS,CAAC,SAA8B;AAC5C,MAAI,SAAsB,EAAE,GAAG,MAAM;AACrC,WAAS,QAAQ,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS;AACrD,aAAS,EAAE,GAAG,OAAO,MAAM,OAAO,KAAK,WAAW,KAAK,CAAC,GAAG,MAAM,OAAO;AAAA,EAC1E;AACA,SAAO;AACT;AAEA,IAAM,SAAS,CAAC,SAA8B;AAC5C,QAAM,QAAkB,CAAC;AACzB,WAAS,OAAO,MAAM,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM;AACxD,QAAI,KAAK,OAAO,MAAM,KAAK,OAAO,OAAQ,OAAM,IAAI,MAAM,2BAA2B;AACrF,UAAM,KAAK,OAAO,aAAa,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,EACnD;AACA,SAAO,MAAM,KAAK,EAAE;AACtB;AAEO,IAAM,kBAAkB,CAAC,UAA2B;AACzD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAC1E,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,UAAmC;AACzD,QAAM,QAAQ,OAAO,gBAAgB,KAAK,CAAC;AAC3C,SAAO,EAAE,GAAG,YAAY,MAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM;AAClE;AAEA,IAAM,iBAAiB,CAAC,UAAmC;AACzD,MAAI,MAAM,OAAO,MAAM,MAAM,OAAO,YAAY,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO;AACpF,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAGA,SAAO,gBAAgB,OAAO,MAAM,OAAO,QAAQ,MAAM,GAAG,CAAC;AAC/D;AAEA,IAAM,YAAY,CAAC,UAA2B;AAC5C,QAAM,OAAO,KAAK,UAAU,KAAK;AACjC,MAAI,SAAS,OAAW,OAAM,IAAI,MAAM,uCAAuC;AAC/E,SAAO;AACT;AAYA,IAAM,UAAU,CACd,KACA,WACA,YAC2B;AAC3B,QAAM,WAAW,cAAc,SAAY,SAAY,gBAAgB,SAAS;AAGhF,QAAM,UAA0B;AAAA,IAC9B,GAAG;AAAA,IACH,KAAK,OAAO,GAAG;AAAA,IACf,UAAU,aAAa,SAAY,EAAE,GAAG,MAAM,IAAI,EAAE,GAAG,MAAM,SAAS,eAAe,QAAQ,EAAE;AAAA,IAC/F,QAAQ,YAAY,SAAY,EAAE,GAAG,SAAS,IAAI;AAAA,MAChD,GAAG;AAAA,MAAO,OAAO,OAAO,QAAQ,KAAK;AAAA,MAAG,UAAU,OAAO,QAAQ,QAAQ;AAAA,IAC3E;AAAA,EACF;AACA,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,WAAW,SAAkB,eAAuB,WAAsC;AACxF,YAAM,SAAS,gBAAgB,aAAa;AAC5C,YAAM,QAAQ,gBAAgB,SAAS;AACvC,UAAI,QAAQ,OAAQ,OAAM,IAAI,MAAM,8CAA8C;AAClF,YAAM,OAAoB;AAAA,QACxB;AAAA,QAAS,EAAE,GAAG,QAAQ,SAAS,SAAS,eAAe,MAAM,GAAG,WAAW,eAAe,KAAK,EAAE;AAAA,MACnG;AACA,cAAQ,KAAK,GAAG;AAAA,QACd,KAAK;AACH,gBAAM,IAAI,MAAM,oCAAoC,GAAG,sBAAsB,QAAQ,WAAW,MAAM,EAAE;AAAA,QAC1G,KAAK;AACH,gBAAM,IAAI,MAAM,sCAAsC,GAAG,EAAE;AAAA,QAC7D,KAAK;AACH,iBAAO,EAAE,MAAM,YAAY;AAAA,QAC7B,KAAK;AACH,iBAAO;AAAA,YACL,MAAM;AAAA,YAAO,KAAK,OAAO,KAAK,GAAG;AAAA,YAAG,OAAO,KAAK,MAAM,OAAO,KAAK,KAAK,CAAC;AAAA,YACxE,UAAU,KAAK,MAAM,OAAO,KAAK,QAAQ,CAAC;AAAA,YAC1C,SAAS,eAAe,KAAK,OAAO;AAAA,YAAG,WAAW,eAAe,KAAK,SAAS;AAAA,UACjF;AAAA,QACF,KAAK;AACH,iBAAO,EAAE,MAAM,UAAU,KAAK,OAAO,KAAK,GAAG,GAAG,SAAS,eAAe,KAAK,OAAO,GAAG,WAAW,eAAe,KAAK,SAAS,EAAE;AAAA,MACrI;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,IAAM,oBAAoB,CAAC,OAE/B,gBAAgB,OAAO,sBAA8C;AACtE,QAAM,EAAE,KAAK,WAAW,OAAO,SAAS,IAAI;AAE5C,MAAI,cAAc,OAAW,iBAAgB,SAAS;AACtD,QAAM,eAAe,UAAU,QAAQ;AACvC,QAAM,YAAY,UAAU,KAAK;AACjC,MAAI,OAAO,WAAW,WAAW,MAAM,IAAI,eAAe;AACxD,UAAM,IAAI,MAAM,4BAA4B,aAAa,QAAQ;AAAA,EACnE;AACA,SAAO,QAAQ,KAAK,WAAW,EAAE,OAAO,WAAW,UAAU,aAAa,CAAC;AAC7E;AAEO,IAAM,uBAAuB,CAAC,UAEP;AAC5B,QAAM,EAAE,KAAK,UAAU,IAAI;AAC3B,SAAO,QAAQ,KAAK,SAAS;AAC/B;;;AFnBA,IAAM,gBAAgB;AACtB,IAAM,cAAc;AAEb,IAAM,oBAAoB,CAAC,UAAwB;AACxD,MAAI,CAAC,cAAc,KAAK,KAAK,EAAG,OAAM,IAAI,MAAM,8BAA8B,KAAK,EAAE;AACvF;AACA,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,8BAA8B,KAAK,OAAO;AAChD,IAAM,mCAAmC,KAAK,OAAO;AACrD,IAAM,0BAA0B,KAAK,OAAO;AAC5C,IAAM,+BAA+B;AACrC,IAAM,wBAAwB,IAAI,OAAO;AACzC,IAAM,yBAAyB,KAAK;AACpC,IAAM,qBAAqB,KAAK;AACzB,IAAM,6BAA6B;AACnC,IAAM,6BAA6B,MAAM,KAAK,KAAK,KAAK;AAC/D,IAAM,0BAA0B,KAAK,OAAO;AAC5C,IAAM,uBAAuB;AAE7B,IAAM,QAAQ,CAAC,iBACb,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AAE5D,IAAM,YAAY,CAAC,UACjB,iBAAiB,SAAS,UAAU,SAAS,OAAO,MAAM,SAAS,WAC/D,MAAM,OACN;AAEN,IAAM,eAAe,CAAC,QAAyB;AAC7C,MAAI,CAAC,OAAO,cAAc,GAAG,KAAK,OAAO,EAAG,QAAO;AACnD,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,YAAY,CAAI,UAAgB;AACpC,QAAM,aAAa,KAAK,UAAU,KAAK;AACvC,MAAI,eAAe,OAAW,OAAM,IAAI,MAAM,uCAAuC;AACrF,SAAO,KAAK,MAAM,UAAU;AAC9B;AAEA,IAAM,kBAAkB,CAAC,UAA2C;AAClE,MACE,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAQ,KAAK,KACnB,CAAC,CAAC,GAAG,CAAC,EAAE,SAAU,MAA+B,MAAgB,GACjE;AACA,WAAO;AAAA,EACT;AACA,QAAM,UAAW,MAAgC;AACjD,SAAO,OAAO,YAAY,YAAY,YAAY,QAAQ,CAAC,MAAM,QAAQ,OAAO;AAClF;AAEA,IAAM,2BAA2B,CAAC,eAAkD;AAClF,QAAM,YAA6B,CAAC;AACpC,MAAI,YAAY;AAChB,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,UAAU;AAEd,WAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAAG;AACzD,UAAM,YAAY,WAAW,KAAK;AAClC,QAAI,QAAQ,GAAG;AACb,UAAI,KAAK,KAAK,SAAS,EAAG;AAC1B,UAAI,cAAc,IAAK,QAAO;AAC9B,cAAQ;AACR,cAAQ;AACR;AAAA,IACF;AACA,QAAI,UAAU;AACZ,UAAI,QAAS,WAAU;AAAA,eACd,cAAc,KAAM,WAAU;AAAA,eAC9B,cAAc,IAAK,YAAW;AACvC;AAAA,IACF;AACA,QAAI,cAAc,IAAK,YAAW;AAAA,aACzB,cAAc,IAAK,UAAS;AAAA,aAC5B,cAAc,KAAK;AAC1B,eAAS;AACT,UAAI,UAAU,EAAG;AACjB,UAAI;AACF,cAAM,SAAkB,KAAK,MAAM,WAAW,MAAM,OAAO,QAAQ,CAAC,CAAC;AACrE,qBAAa;AACb,YAAI,gBAAgB,MAAM,EAAG,WAAU,KAAK,MAAM;AAAA,MACpD,QAAQ;AACN,eAAO;AAAA,MACT;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,YAAY,IAAI,UAAU,GAAG,EAAE,IAAI;AACzD;AAEA,IAAM,mBAAmB,CAAC,MAAoB,UAC5C,KAAK,QAAQ,MAAM,SAAS,KAAK,YAAY,MAAM,aAAa,KAAK,GAAG,cAAc,MAAM,EAAE;AAEhG,IAAM,iBAAiB,CAAC,UAA0C;AAChE,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,EAAG,QAAO;AAChF,QAAM,QAAQ;AACd,SAAO,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,UAAU,YAC5D,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,QACnF,OAAO,cAAc,MAAM,KAAK,KAAK,OAAO,cAAc,MAAM,SAAS,MACxE,MAAM,QAAQ,UAAa,OAAO,MAAM,QAAQ;AACrD;AAEA,IAAM,aAAa,OAAsB,EAAE,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAAC,GAAG,WAAW,EAAE;AAEnG,IAAM,YAAY,CAAC,UAAkB,UAAkB,gBAAgB,SAAwB;AAC7F,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,GAAG,SAAS,QAAQ;AACjC,QAAI,KAAK,OAAO,SAAU,OAAM,IAAI,MAAM,iBAAiB,QAAQ,QAAQ;AAC3E,QAAI,KAAK,SAAS,KAAK,cAAe,QAAO,WAAW;AACxD,iBAAa,GAAG,aAAa,UAAU,MAAM;AAAA,EAC/C,SAAS,OAAO;AACd,QAAI,UAAU,KAAK,MAAM,SAAU,QAAO,WAAW;AACrD,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,qCAAqC,OAAO,EAAE;AAAA,EAChE;AACA,MAAI,CAAC,WAAW,KAAK,KAAK,cAAe,QAAO,WAAW;AAC3D,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,UAAU;AAC7C,QAAI,gBAAgB,MAAM,EAAG,QAAO;AACpC,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC,SAAS,OAAO;AAGd,UAAM,YAAY,yBAAyB,UAAU;AACrD,QAAI,UAAW,QAAO;AACtB,QAAI,CAAC,cAAe,OAAM,IAAI,MAAM,wDAAwD;AAE5F,WAAO,WAAW;AAAA,EACpB;AACF;AAEA,IAAM,cAAc,CAAC,UAAkB,OAAgB,WAAW,OAAO,sBAA4B;AACnG,QAAM,aAAa,KAAK,UAAU,OAAO,MAAM,CAAC;AAChD,MAAI,OAAO,WAAW,YAAY,MAAM,IAAI,UAAU;AACpD,UAAM,IAAI,MAAM,6BAA6B,QAAQ,QAAQ;AAAA,EAC/D;AACA,kBAAgB,UAAU,UAAU;AACtC;AAKA,IAAM,YAAY,CAAC,OAAsB,QAEpC;AACH,MAAI,MAAM,aAAa,WAClB,OAAO,MAAM,aAAa,YAAY,MAAM,aAAa,QAAQ,MAAM,QAAQ,MAAM,QAAQ,IAAI;AACpG,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,MAAI,kBAAkB;AACtB,aAAW,YAAY,OAAO,OAAO,MAAM,YAAY,CAAC,CAAC,GAAG;AAC1D,sBAAkB,KAAK,IAAI,iBAAiB,gBAAgB,QAAQ,CAAC;AAAA,EACvE;AACA,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,MAAM,OAAO,GAAG;AAC7D,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,UAAU;AACzE,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,UAAMA,WAAU,gBAAgB,MAAM,OAAO;AAC7C,UAAM,WAAW,MAAM,aAAa,UAAa,OAAO,OAAO,MAAM,UAAU,QAAQ,IACnF,MAAM,SAAS,QAAQ,IAAI;AAC/B,QAAIA,aAAY,KAAM,aAAa,UAAa,aAAaA,UAAU;AACrE,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,sBAAkB,KAAK,IAAI,iBAAiBA,QAAO;AAAA,EACrD;AAGA,MAAI,OAAO,OAAO,OAAO,gBAAgB,KAAK,MAAM,mBAAmB,GAAG;AACxE,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,OAAK,MAAM,WAAW,KAAK,MAAM,mBAAmB,MAAM,CAAC,OAAO,OAAO,OAAO,WAAW,GAAG;AAC5F,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACA,QAAM,YAAY,OAAO,OAAO,OAAO,WAAW,IAC9C,gBAAgB,MAAM,SAAS,IAAI;AACvC,MAAI,YAAY,gBAAiB,OAAM,IAAI,MAAM,8CAA8C;AAC/F,QAAM,UAAU,OAAO,OAAO,MAAM,SAAS,GAAG;AAChD,QAAM,UAAU,UAAU,MAAM,QAAQ,GAAG,EAAG,UAC1C,MAAM,aAAa,UAAa,OAAO,OAAO,MAAM,UAAU,GAAG,IAAI,MAAM,SAAS,GAAG,IAAK;AAChG,SAAO,EAAE,SAAS,SAAS,UAAU;AACvC;AAEA,IAAM,yBAAyB,CAAC,OAAsB,kBAAgC;AACpF,QAAM,aAAa,CAAC;AACpB,QAAM,cAAwB,CAAC;AAC/B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,OAAO,MAAM,kBAAkB,CAAC,GAAG;AAC5C,QAAI,OAAO,OAAO,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,OAAO,MAAM,UAAU,GAAG,KAAK,KAAK,IAAI,GAAG,EAAG;AAC/F,SAAK,IAAI,GAAG;AACZ,gBAAY,KAAK,GAAG;AAAA,EACtB;AACA,aAAW,OAAO,OAAO,KAAK,MAAM,QAAQ,GAAG;AAC7C,QAAI,OAAO,OAAO,MAAM,SAAS,GAAG,KAAK,KAAK,IAAI,GAAG,EAAG;AACxD,SAAK,IAAI,GAAG;AACZ,gBAAY,KAAK,GAAG;AAAA,EACtB;AACA,QAAM,eAAe,YAAY,MAAM,CAAC,aAAa;AACrD,QAAM,WAAW,IAAI,IAAI,YAAY;AACrC,aAAW,OAAO,OAAO,KAAK,MAAM,QAAQ,GAAG;AAC7C,QAAI,CAAC,OAAO,OAAO,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,GAAG,EAAG,QAAO,MAAM,SAAS,GAAG;AAAA,EACzF;AACA,QAAM,iBAAiB;AACzB;AAEO,IAAM,YAAN,MAAgB;AAAA,EAoBrB,YACW,MACA,eACA,eACT,UAA4B,CAAC,GAC7B;AAJS;AACA;AACA;AAGT,SAAK,cAAc,KAAK,KAAK,MAAM,cAAc;AACjD,SAAK,aAAa,KAAK,KAAK,MAAM,YAAY;AAC9C,SAAK,eAAe,KAAK,KAAK,MAAM,UAAU;AAC9C,SAAK,kBAAkB,KAAK,KAAK,MAAM,YAAY;AACnD,SAAK,YAAY,KAAK,KAAK,MAAM,OAAO;AAGxC,SAAK,iBAAiB,KAAK,KAAK,MAAM,gBAAgB;AACtD,SAAK,oBAAoB,KAAK;AAAA,MAC5B,qBAAqB;AAAA,MACrB,KAAK,IAAI,gBAAgB,GAAG,KAAK,MAAM,QAAQ,oBAAoB,2BAA2B,CAAC;AAAA,IACjG;AACA,SAAK,yBAAyB,KAAK;AAAA,MACjC,KAAK,oBAAoB;AAAA,MACzB,KAAK;AAAA,QACH,gBAAgB;AAAA,QAChB,KAAK,MAAM,QAAQ,yBAAyB,gCAAgC;AAAA,MAC9E;AAAA,IACF;AACA,SAAK,iBAAiB,KAAK;AAAA,MACzB,gBAAgB;AAAA,MAChB,KAAK,MAAM,QAAQ,iBAAiB,uBAAuB;AAAA,IAC7D;AACA,SAAK,sBAAsB,KAAK;AAAA,MAC9B;AAAA,MACA,KAAK,MAAM,QAAQ,sBAAsB,4BAA4B;AAAA,IACvE;AACA,SAAK,iBAAiB,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,iBAAiB,eAAe,CAAC;AACxF,SAAK,eAAe,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,eAAe,aAAa,CAAC;AAClF,OAAG,UAAU,MAAM,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EACrD;AAAA,EAvDS;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAGS;AAAA,EACT;AAAA,EA0CA,MAAM,QAAQ,OASS;AACrB,SAAK,eAAe,MAAM,KAAK;AAC/B,QAAI,MAAM,OAAO,UAAa,CAAC,MAAM,GAAG,KAAK,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACzF,UAAM,YAAY,MAAM,SAAS,SAAY,SAAY,UAAU,MAAM,IAAI;AAC7E,UAAM,SAAS,MAAM,UAAU,cAAc;AAC7C,WAAO,KAAK,UAAU,MAAM;AAI1B,UAAI;AAAE,aAAK,kBAAkB,KAAK,IAAI,CAAC;AAAA,MAAG,QAAQ;AAAA,MAAqC;AACvF,aAAO,KAAK,cAAc,EAAE,GAAG,OAAO,GAAI,cAAc,SAAY,EAAE,MAAM,UAAU,IAAI,CAAC,GAAI,OAAO,CAAC;AAAA,IACzG,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAY,WAA6E;AAC7F,WAAO,KAAK,UAAU,MAAM;AAC1B,UAAI;AAAE,aAAK,kBAAkB,KAAK,IAAI,CAAC;AAAA,MAAG,QAAQ;AAAA,MAAqC;AACvF,aAAO,UAAU,CAAC,UAAU;AAC1B,aAAK,eAAe,MAAM,KAAK;AAC/B,eAAO,KAAK,cAAc,KAAK;AAAA,MACjC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,OAAmC;AAC/C,SAAK,gBAAgB;AACrB,UAAM,WAAW,KAAK,IAAI,KAAK,cAAc,GAAG,KAAK,uBAAuB,CAAC,IAAI;AACjF,UAAM,QAAmB;AAAA,MACvB,IAAI,MAAM,MAAM,WAAW;AAAA,MAC3B;AAAA,MACA,OAAO,MAAM;AAAA,MACb,MAAM,MAAM,MAAM,KAAK,KAAK;AAAA,MAC5B,MAAM,UAAU,MAAM,IAAI;AAAA,MAC1B,GAAI,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,MACnC,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,MACvD,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,UAAU,MAAM,IAAI,EAAE,IAAI,CAAC;AAAA,MAClE,WAAW,KAAK,IAAI;AAAA,MACpB,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,MAC/C,GAAI,MAAM,YAAY,EAAE,WAAW,KAAc,IAAI,CAAC;AAAA,MACtD,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,MAClD,GAAI,MAAM,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,UAAU,EAAE,IAAI,CAAC;AAAA,MAC/D,GAAI,MAAM,SAAS,EAAE,QAAQ,UAAU,MAAM,MAAM,EAAE,IAAI,CAAC;AAAA,IAC5D;AACA,UAAM,OAAO,KAAK,UAAU,KAAK;AACjC,UAAM,QAAQ,KAAK,IAAI,KAAK,eAAe,MAAM,iBAAiB,KAAK,aAAa;AACpF,QAAI,OAAO,WAAW,MAAM,MAAM,IAAI,OAAO;AAC3C,YAAM,IAAI,MAAM,sBAAsB,KAAK,QAAQ;AAAA,IACrD;AACA,OAAG,eAAe,KAAK,aAAa,GAAG,IAAI;AAAA,GAAM,EAAE,UAAU,QAAQ,MAAM,IAAM,CAAC;AAClF,gBAAY,KAAK,cAAc,QAAQ;AACvC,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,OASZ,MAAM,KAAK,IAAI,GAA0B;AAC1C,SAAK,eAAe,MAAM,KAAK;AAC/B,QAAI,MAAM,OAAO,UAAa,CAAC,MAAM,GAAG,KAAK,EAAG,OAAM,IAAI,MAAM,yBAAyB;AACzF,QAAI,MAAM,QAAQ,UAAa,CAAC,qBAAqB,KAAK,MAAM,GAAG,GAAG;AACpE,YAAM,IAAI,MAAM,qCAAqC,MAAM,GAAG,EAAE;AAAA,IAClE;AACA,QAAI,CAAC,OAAO,cAAc,MAAM,KAAK,KAAK,MAAM,QAAQ,GAAG;AACzD,YAAM,IAAI,MAAM,wEAAwE;AAAA,IAC1F;AACA,QAAI,MAAM,QAAQ,MAAM,4BAA4B;AAClD,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AACA,UAAM,WAAyB;AAAA,MAC7B,IAAI,WAAW;AAAA,MACf,GAAI,MAAM,QAAQ,SAAY,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,MACpD,OAAO,MAAM;AAAA,MACb,MAAM,MAAM,MAAM,KAAK,KAAK;AAAA,MAC5B,MAAM,UAAU,MAAM,IAAI;AAAA,MAC1B,GAAI,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,MACnC,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,MACvD,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,UAAU,MAAM,IAAI,EAAE,IAAI,CAAC;AAAA,MAClE,OAAO,MAAM;AAAA,MACb,WAAW;AAAA,MACX,QAAQ,cAAc;AAAA,IACxB;AAEA,UAAM,WAAsB;AAAA,MAC1B,IAAI,SAAS;AAAA,MAAI,UAAU,OAAO;AAAA,MAAkB,OAAO,SAAS;AAAA,MAAO,MAAM,SAAS;AAAA,MAC1F,MAAM,SAAS;AAAA,MAAM,GAAI,SAAS,KAAK,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC;AAAA,MAC9D,GAAI,SAAS,SAAS,SAAY,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,MAC7D,GAAI,SAAS,SAAS,SAAY,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,MAC7D,WAAW,OAAO;AAAA,MAClB,WAAW,EAAE,OAAO,SAAS,OAAO,GAAI,SAAS,QAAQ,SAAY,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,EAAG;AAAA,MACjG,GAAI,SAAS,SAAS,EAAE,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,IACvD;AACA,QAAI,OAAO,WAAW,KAAK,UAAU,QAAQ,GAAG,MAAM,IAAI,KAAK,eAAe;AAC5E,YAAM,IAAI,MAAM,sBAAsB,KAAK,aAAa,QAAQ;AAAA,IAClE;AACA,WAAO,KAAK,UAAU,MAAM;AAC1B,YAAM,OAAO,KAAK,eAAe,KAAK;AACtC,YAAM,UAAU,KAAK,UAAU,OAAO,CAAC,UAAU,MAAM,QAAQ,UAAa,MAAM,QAAQ,MAAM,GAAG;AACnG,UAAI,QAAQ,UAAU,4BAA4B;AAChD,cAAM,IAAI,MAAM,WAAW,0BAA0B,gCAAgC;AAAA,MACvF;AACA,cAAQ,KAAK,QAAQ;AACrB,WAAK,gBAAgB,OAAO;AAC5B,WAAK,kBAAkB,GAAG;AAC1B,aAAO,UAAU,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WAAW,KAA4C;AAC3D,QAAI,CAAC,qBAAqB,KAAK,GAAG,EAAG,OAAM,IAAI,MAAM,qCAAqC,GAAG,EAAE;AAC/F,WAAO,KAAK,UAAU,MAAM;AAC1B,YAAM,OAAO,KAAK,eAAe,KAAK;AACtC,YAAM,UAAU,KAAK,UAAU,OAAO,CAAC,UAAU,MAAM,QAAQ,GAAG;AAClE,UAAI,QAAQ,WAAW,KAAK,UAAU,OAAQ,QAAO,EAAE,SAAS,MAAM;AACtE,WAAK,gBAAgB,OAAO;AAC5B,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UAAU,QAA4C,CAAC,GAAmB;AACxE,QAAI,MAAM,UAAU,OAAW,MAAK,eAAe,MAAM,KAAK;AAC9D,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,MAAM,SAAS,GAAG,GAAG,0BAA0B,CAAC;AAC9F,WAAO,KAAK,eAAe,IAAI,EAAE,UAC9B,OAAO,CAAC,UAAU,MAAM,UAAU,UAAa,MAAM,UAAU,MAAM,KAAK,EAC1E,KAAK,gBAAgB,EACrB,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,UAAU,UAAU,KAAK,CAAC;AAAA,EACpC;AAAA;AAAA,EAGA,oBAAwC;AACtC,QAAI;AACJ,eAAW,SAAS,KAAK,eAAe,IAAI,EAAE,WAAW;AACvD,UAAI,SAAS,UAAa,MAAM,QAAQ,KAAM,QAAO,MAAM;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAoB,MAAM,KAAK,IAAI,GAAyB;AAChE,UAAM,OAAO,KAAK,kBAAkB;AACpC,QAAI,SAAS,UAAa,OAAO,IAAK,QAAO,CAAC;AAC9C,WAAO,KAAK,UAAU,MAAM,KAAK,kBAAkB,GAAG,CAAC;AAAA,EACzD;AAAA,EAEA,kBAAkB,KAA0B;AAC1C,QAAI,CAAC,GAAG,WAAW,KAAK,cAAc,EAAG,QAAO,CAAC;AACjD,UAAM,OAAO,KAAK,eAAe,KAAK;AACtC,UAAM,MAAM,KAAK,UAAU,OAAO,CAAC,UAAU,MAAM,SAAS,GAAG,EAAE,KAAK,gBAAgB;AACtF,QAAI,IAAI,WAAW,EAAG,QAAO,CAAC;AAC9B,UAAM,WAAwB,CAAC;AAC/B,UAAM,cAAc,oBAAI,IAAY;AACpC,QAAI;AAGF,iBAAW,SAAS,KAAK;AACvB,iBAAS,KAAK,KAAK,cAAc;AAAA,UAC/B,IAAI,MAAM;AAAA,UACV,OAAO,MAAM;AAAA,UACb,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM;AAAA,UACZ,GAAI,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,UACnC,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,UACvD,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,UACvD,WAAW,EAAE,OAAO,MAAM,OAAO,GAAI,MAAM,QAAQ,SAAY,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,EAAG;AAAA;AAAA,UAExF,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,QACjD,CAAC,CAAC;AACF,oBAAY,IAAI,MAAM,EAAE;AAAA,MAC1B;AAAA,IACF,UAAE;AACA,UAAI,YAAY,OAAO,GAAG;AACxB,aAAK,gBAAgB,KAAK,UAAU,OAAO,CAAC,UAAU,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC,CAAC;AAAA,MACnF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,SAAoC;AACjD,QAAI;AACJ,QAAI;AACF,aAAO,GAAG,SAAS,KAAK,cAAc;AAAA,IACxC,SAAS,OAAO;AACd,WAAK,iBAAiB;AACtB,UAAI,UAAU,KAAK,MAAM,SAAU,QAAO,EAAE,QAAQ,GAAG,WAAW,CAAC,EAAE;AACrE,YAAM;AAAA,IACR;AAEA,UAAM,SAAS,UAAU,KAAK,iBAAiB;AAC/C,QAAI,UAAU,OAAO,UAAU,KAAK,OAAO,OAAO,SAAS,KAAK,QAAQ,OAAO,eAAe,KAAK,SAAS;AAC1G,aAAO,OAAO,UAAU,SAAY,OAAO,OAAO,EAAE,QAAQ,GAAG,WAAW,CAAC,EAAE;AAAA,IAC/E;AACA,QAAI,OAAyB,EAAE,QAAQ,GAAG,WAAW,CAAC,EAAE;AACxD,QAAI;AACJ,QAAI;AACF,UAAI,KAAK,OAAO,wBAAyB,OAAM,IAAI,MAAM,WAAW,uBAAuB,QAAQ;AACnG,YAAM,SAAS,KAAK,MAAM,GAAG,aAAa,KAAK,gBAAgB,MAAM,CAAC;AACtE,UAAI,QAAQ,WAAW,KAAK,CAAC,MAAM,QAAQ,OAAO,SAAS,KAAK,CAAC,OAAO,UAAU,MAAM,cAAc,GAAG;AACvG,cAAM,IAAI,MAAM,gBAAgB;AAAA,MAClC;AACA,aAAO,EAAE,QAAQ,GAAG,WAAW,OAAO,UAAU;AAAA,IAClD,SAAS,OAAO;AACd,eAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAChE;AACA,SAAK,iBAAiB;AAAA,MACpB,OAAO,KAAK;AAAA,MAAK,MAAM,KAAK;AAAA,MAAM,YAAY,KAAK;AAAA,MAAS;AAAA,MAAM,GAAI,WAAW,SAAY,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,IACpH;AACA,QAAI,WAAW,OAAW,QAAO;AAEjC,QAAI,QAAS,QAAO,EAAE,QAAQ,GAAG,WAAW,CAAC,EAAE;AAC/C,UAAM,IAAI,MAAM,yCAAyC,MAAM,EAAE;AAAA,EACnE;AAAA,EAEA,gBAAgB,WAAiC;AAC/C,QAAI,UAAU,WAAW,GAAG;AAC1B,SAAG,OAAO,KAAK,gBAAgB,EAAE,OAAO,KAAK,CAAC;AAC9C,WAAK,iBAAiB;AACtB;AAAA,IACF;AACA,gBAAY,KAAK,gBAAgB,EAAE,QAAQ,GAAG,UAAU,GAAG,uBAAuB;AAClF,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,KACE,QAKI,CAAC,GACQ;AACb,QAAI,MAAM,UAAU,OAAW,MAAK,eAAe,MAAM,KAAK;AAC9D,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,MAAM,SAAS,GAAG,GAAG,KAAK,aAAa,CAAC;AACtF,UAAM,SACJ,MAAM,UAAU,SACZ,KAAK,kBAAkB,OAAO,KAAK,IACnC,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,KAAK,CAAC,GAAG,OAAO,KAAK;AAC9E,WAAO,OAAO,IAAI,CAAC,UAAU,UAAU,KAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK,IAAI,KAAK,cAAc,GAAG,KAAK,uBAAuB,CAAC;AAAA,EACrE;AAAA,EAEA,eAAuB;AACrB,UAAM,aAAa,KAAK,gBAAgB;AACxC,QAAI;AACJ,QAAI,iBAAiB;AACrB,QAAI;AACF,mBAAa,GAAG,SAAS,KAAK,aAAa,GAAG;AAC9C,YAAM,OAAO,GAAG,UAAU,UAAU,EAAE;AACtC,UAAI,OAAO,GAAG;AACZ,cAAM,WAAW,OAAO,YAAY,CAAC;AACrC,WAAG,SAAS,YAAY,UAAU,GAAG,GAAG,OAAO,CAAC;AAChD,YAAI,SAAS,CAAC,MAAM,IAAM;AACxB,2BAAiB;AAAA,QACnB,OAAO;AACL,gBAAM,YAAY,KAAK,IAAI,MAAM,KAAK,gBAAgB,CAAC;AACvD,gBAAM,OAAO,OAAO,YAAY,SAAS;AACzC,aAAG,SAAS,YAAY,MAAM,GAAG,WAAW,OAAO,SAAS;AAC5D,gBAAM,UAAU,KAAK,YAAY,EAAI;AACrC,2BAAiB,WAAW,IAAI,OAAO,YAAY,UAAU,IAAI;AAAA,QACnE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,UAAU,KAAK,MAAM,SAAU,OAAM;AAAA,IAC3C,UAAE;AACA,UAAI,eAAe,OAAW,IAAG,UAAU,UAAU;AAAA,IACvD;AACA,WAAO,KAAK,cAAc,YAAY,cAAc;AAAA,EACtD;AAAA,EAEA,KAAK,QAAgB,QAAQ,KAAqB;AAChD,UAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,KAAK,aAAa,CAAC;AAChF,UAAM,aAAa,KAAK,gBAAgB;AACxC,UAAM,UAAU,KAAK,cAAc,MAAM;AACzC,QAAI;AACJ,QAAI;AACF,mBAAa,GAAG,SAAS,KAAK,aAAa,GAAG;AAC9C,YAAM,OAAO,GAAG,UAAU,UAAU,EAAE;AACtC,UAAI,WAAW,QAAQ,eAAe,aAAa,KAAK,IAAI,QAAQ,QAAQ,IAAI,IAAI;AACpF,UAAI,WAAW,GAAG;AAChB,cAAM,eAAe,OAAO,YAAY,CAAC;AACzC,WAAG,SAAS,YAAY,cAAc,GAAG,GAAG,WAAW,CAAC;AACxD,YAAI,aAAa,CAAC,MAAM,GAAM,YAAW;AAAA,MAC3C;AACA,UAAI,YAAY,MAAM;AACpB,eAAO,EAAE,QAAQ,CAAC,GAAG,YAAY,KAAK,cAAc,YAAY,QAAQ,EAAE;AAAA,MAC5E;AACA,YAAM,aAAa,KAAK;AAAA,QACtB,OAAO;AAAA,QACP,KAAK,IAAI,KAAK,gBAAgB,GAAG,qBAAqB;AAAA,MACxD;AACA,YAAM,SAAS,OAAO,YAAY,UAAU;AAC5C,YAAM,YAAY,GAAG,SAAS,YAAY,QAAQ,GAAG,YAAY,QAAQ;AACzE,YAAM,SAAsB,CAAC;AAC7B,UAAI,YAAY;AAChB,UAAI,WAAW;AACf,eAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS;AAC9C,YAAI,OAAO,KAAK,MAAM,GAAM;AAC5B,cAAM,OAAO,OAAO,SAAS,WAAW,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK;AACrE,oBAAY,QAAQ;AACpB,mBAAW;AACX,YAAI,MAAM;AACR,cAAI;AACF,kBAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,gBAAI,OAAO,MAAM,aAAa,SAAU,QAAO,KAAK,KAAK;AAAA,UAC3D,QAAQ;AAAA,UAAqC;AAAA,QAC/C;AACA,YAAI,OAAO,UAAU,aAAc;AAAA,MACrC;AACA,aAAO;AAAA,QACL,QAAQ,OAAO,IAAI,CAAC,UAAU,UAAU,KAAK,CAAC;AAAA,QAC9C,YAAY,KAAK,cAAc,YAAY,WAAW,QAAQ;AAAA,MAChE;AAAA,IACF,SAAS,OAAO;AACd,UAAI,UAAU,KAAK,MAAM,UAAU;AACjC,eAAO,EAAE,QAAQ,CAAC,GAAG,YAAY,KAAK,cAAc,YAAY,CAAC,EAAE;AAAA,MACrE;AACA,YAAM;AAAA,IACR,UAAE;AACA,UAAI,eAAe,OAAW,IAAG,UAAU,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,kBACE,OACA,OACa;AACb,QAAI,SAAsB,CAAC;AAC3B,QAAI;AACJ,WAAO,OAAO,SAAS,OAAO;AAC5B,YAAM,OAAO;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AAAA,QACA,KAAK,IAAI,KAAK,gBAAgB,GAAG,qBAAqB;AAAA,MACxD;AACA,YAAM,aAA0B,CAAC;AACjC,iBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAM,SAAS,KAAK;AACpB,YAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,EAAG;AAC5E,cAAM,QAAQ;AACd,YAAI,OAAO,MAAM,aAAa,YAAY,CAAC,KAAK,cAAc,OAAO,KAAK,EAAG;AAC7E,mBAAW,KAAK,KAAK;AAAA,MACvB;AACA,eAAS,CAAC,GAAG,YAAY,GAAG,MAAM,EAAE,MAAM,CAAC,KAAK;AAChD,UAAI,CAAC,KAAK,WAAW,KAAK,WAAW,UAAa,KAAK,WAAW,OAAQ;AAC1E,eAAS,KAAK;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,iBACE,OACA,OACA,OACa;AACb,QAAI;AACJ,QAAI;AACF,mBAAa,GAAG,SAAS,KAAK,aAAa,GAAG;AAC9C,YAAM,OAAO,GAAG,UAAU,UAAU,EAAE;AACtC,YAAM,SAAsB,CAAC;AAC7B,UAAI,WAAW;AACf,UAAI,aAAuB,CAAC;AAC5B,UAAI,YAAY;AAChB,UAAI,wBAAwB;AAC5B,UAAI,eAAe;AAEnB,YAAM,WAAW,MAAY;AAC3B,YAAI,CAAC,yBAAyB,YAAY,GAAG;AAC3C,gBAAM,UAAU,OAAO,OAAO,YAAY,SAAS,EAAE,SAAS,MAAM;AACpE,gBAAM,OAAO,QAAQ,SAAS,OAAO,aAAa,EAAE,CAAC,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAChF,cAAI;AACF,kBAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,gBACE,OAAO,MAAM,aAAa,YAC1B,MAAM,WAAW,SACjB,KAAK,cAAc,OAAO,KAAK,GAC/B;AACA,qBAAO,KAAK,KAAK;AACjB,6BAAe,OAAO,UAAU;AAAA,YAClC;AAAA,UACF,QAAQ;AAAA,UAAqC;AAAA,QAC/C;AACA,qBAAa,CAAC;AACd,oBAAY;AACZ,gCAAwB;AAAA,MAC1B;AAEA,aAAO,WAAW,QAAQ,CAAC,cAAc;AACvC,cAAM,aAAa,KAAK,IAAI,wBAAwB,OAAO,QAAQ;AACnE,cAAM,QAAQ,OAAO,YAAY,UAAU;AAC3C,cAAM,YAAY,GAAG,SAAS,YAAY,OAAO,GAAG,YAAY,QAAQ;AACxE,YAAI,aAAa,EAAG;AACpB,oBAAY;AACZ,cAAM,WAAW,MAAM,SAAS,GAAG,SAAS;AAC5C,YAAI,eAAe;AACnB,eAAO,eAAe,SAAS,UAAU,CAAC,cAAc;AACtD,gBAAM,UAAU,SAAS,QAAQ,IAAM,YAAY;AACnD,gBAAM,aAAa,UAAU,IAAI,SAAS,SAAS;AACnD,gBAAM,UAAU,SAAS,SAAS,cAAc,UAAU;AAC1D,cAAI,CAAC,uBAAuB;AAC1B,gBAAI,YAAY,QAAQ,UAAU,KAAK,eAAe;AACpD,kBAAI,QAAQ,SAAS,EAAG,YAAW,KAAK,OAAO;AAC/C,2BAAa,QAAQ;AAAA,YACvB,OAAO;AACL,2BAAa,CAAC;AACd,0BAAY;AACZ,sCAAwB;AAAA,YAC1B;AAAA,UACF;AACA,cAAI,UAAU,EAAG;AACjB,mBAAS;AACT,yBAAe,UAAU;AAAA,QAC3B;AAAA,MACF;AACA,UAAI,CAAC,iBAAiB,YAAY,KAAK,uBAAwB,UAAS;AACxE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,UAAU,KAAK,MAAM,SAAU,QAAO,CAAC;AAC3C,YAAM;AAAA,IACR,UAAE;AACA,UAAI,eAAe,OAAW,IAAG,UAAU,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,cAAc,OAAkB,OAAiD;AAC/E,QAAI,MAAM,UAAU,UAAa,MAAM,UAAU,MAAM,MAAO,QAAO;AACrE,QAAI,MAAM,OAAO,UAAa,MAAM,OAAO,MAAM,GAAI,QAAO;AAC5D,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,KAAyC;AAC3C,SAAK,aAAa,GAAG;AACrB,UAAM,UAAU,KAAK,iBAAiB,EAAE;AACxC,WAAO,OAAO,OAAO,SAAS,GAAG,IAAI,UAAU,QAAQ,GAAG,CAAC,IAAI;AAAA,EACjE;AAAA,EAEA,KAAK,SAAS,IAAI,QAAQ,KAAuB;AAC/C,UAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,KAAK,aAAa,CAAC;AAChF,WAAO,KAAK,QAAQ,MAAM,EAAE,MAAM,GAAG,YAAY;AAAA,EACnD;AAAA;AAAA,EAGA,QAAQ,SAAS,IAAsB;AACrC,QAAI,OAAQ,MAAK,aAAa,MAAM;AACpC,WAAO,OAAO,OAAO,KAAK,iBAAiB,EAAE,OAAO,EACjD,OAAO,CAAC,UAAU,CAAC,UAAU,MAAM,IAAI,WAAW,MAAM,CAAC,EACzD,KAAK,CAAC,MAAM,UAAU,KAAK,IAAI,cAAc,MAAM,GAAG,CAAC,EACvD,IAAI,CAAC,UAAU,UAAU,KAAK,CAAC;AAAA,EACpC;AAAA,EAEA,MAAM,IAAI,OAKkB;AAC1B,UAAM,EAAE,KAAK,OAAO,UAAU,UAAU,IAAI;AAC5C,SAAK,aAAa,GAAG;AACrB,UAAM,UAAU,kBAAkB,EAAE,KAAK,OAAO,UAAU,UAAU,GAAG,KAAK,aAAa;AACzF,WAAO,KAAK,UAAU,MAAM;AAC1B,YAAM,QAAQ,UAAU,KAAK,YAAY,KAAK,gBAAgB,KAAK;AACnE,YAAM,OAAO,UAAU,OAAO,QAAQ,GAAG;AACzC,YAAM,OAAO,QAAQ,WAAW,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS;AAC1E,UAAI,KAAK,SAAS,MAAO,OAAM,IAAI,MAAM,mCAAmC;AAC5E,YAAM,QAAwB;AAAA,QAC5B,KAAK,KAAK;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,WAAW,KAAK,IAAI;AAAA,QACpB,WAAW,KAAK;AAAA,MAClB;AACA,YAAM,QAAQ,KAAK,GAAG,IAAI;AAC1B,YAAM,aAAa,CAAC;AACpB,YAAM,SAAS,KAAK,GAAG,IAAI,KAAK;AAGhC,YAAM,SAAS;AACf,YAAM,iBAAiB;AACvB,YAAM,YAAY,KAAK;AACvB,YAAM,kBAAkB,MAAM,kBAAkB,CAAC,GAAG,OAAO,CAACC,SAAQA,SAAQ,KAAK,GAAG;AACpF,6BAAuB,OAAO,KAAK,mBAAmB;AACtD,kBAAY,KAAK,YAAY,OAAO,KAAK,cAAc;AACvD,WAAK,YAAY,KAAK;AACtB,aAAO,UAAU,KAAK;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,OAGuC;AAClD,UAAM,EAAE,KAAK,UAAU,IAAI;AAC3B,SAAK,aAAa,GAAG;AACrB,UAAM,UAAU,qBAAqB,EAAE,KAAK,UAAU,CAAC;AACvD,WAAO,KAAK,UAAU,MAAM;AAC1B,YAAM,QAAQ,UAAU,KAAK,YAAY,KAAK,gBAAgB,KAAK;AACnE,YAAM,OAAO,UAAU,OAAO,QAAQ,GAAG;AACzC,YAAM,OAAO,QAAQ,WAAW,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS;AAC1E,UAAI,KAAK,SAAS,aAAa;AAC7B,aAAK,YAAY,KAAK;AACtB,eAAO,EAAE,SAAS,MAAM;AAAA,MAC1B;AACA,UAAI,KAAK,SAAS,SAAU,OAAM,IAAI,MAAM,sCAAsC;AAClF,aAAO,MAAM,QAAQ,KAAK,GAAG;AAC7B,YAAM,aAAa,CAAC;AAGpB,YAAM,SAAS,KAAK,GAAG,IAAI,KAAK;AAGhC,YAAM,SAAS;AACf,YAAM,iBAAiB;AACvB,YAAM,YAAY,KAAK;AACvB,YAAM,iBAAiB;AAAA,QACrB,IAAI,MAAM,kBAAkB,CAAC,GAAG,OAAO,CAACA,SAAQA,SAAQ,KAAK,GAAG;AAAA,QAChE,KAAK;AAAA,MACP;AACA,6BAAuB,OAAO,KAAK,mBAAmB;AACtD,kBAAY,KAAK,YAAY,OAAO,KAAK,cAAc;AACvD,WAAK,YAAY,KAAK;AACtB,aAAO,EAAE,SAAS,MAAM,SAAS,KAAK,QAAQ;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEA,mBAAkC;AAChC,QAAI;AACF,YAAM,OAAO,GAAG,SAAS,KAAK,UAAU;AACxC,YAAM,SAAS,KAAK;AACpB,UACE,UACA,OAAO,WAAW,KAAK,OACvB,OAAO,UAAU,KAAK,OACtB,OAAO,SAAS,KAAK,QACrB,OAAO,eAAe,KAAK,SAC3B;AACA,eAAO,OAAO;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,cAAc;AACnB,UAAI,UAAU,KAAK,MAAM,SAAU,QAAO,WAAW;AACrD,YAAM;AAAA,IACR;AACA,UAAM,QAAQ,UAAU,KAAK,YAAY,KAAK,cAAc;AAC5D,SAAK,YAAY,KAAK;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAA4B;AACtC,QAAI;AACF,YAAM,OAAO,GAAG,SAAS,KAAK,UAAU;AACxC,WAAK,cAAc;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB;AAAA,MACF;AAAA,IACF,QAAQ;AACN,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,UAAa,WAAgC;AACjD,OAAG,UAAU,KAAK,MAAM,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACxD,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK;AACnC,UAAM,QAAQ,WAAW;AACzB,UAAM,YAAY,KAAK,KAAK,KAAK,WAAW,OAAO;AACnD,WAAO,MAAM;AACX,UAAI;AACF,WAAG,UAAU,KAAK,WAAW,EAAE,MAAM,IAAM,CAAC;AAC5C,WAAG,cAAc,WAAW,GAAG,KAAK;AAAA,EAAK,QAAQ,GAAG;AAAA,EAAK,KAAK,IAAI,CAAC;AAAA,EAAK,wBAAwB,CAAC;AAAA,GAAM;AAAA,UACrG,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AACD;AAAA,MACF,SAAS,OAAO;AACd,YAAI,UAAU,KAAK,MAAM,SAAU,OAAM;AACzC,YAAI,KAAK,gBAAgB,SAAS,EAAG;AACrC,YAAI,KAAK,IAAI,KAAK,SAAU,OAAM,IAAI,MAAM,4CAA4C;AACxF,cAAM,MAAM,EAAE;AAAA,MAChB;AAAA,IACF;AACA,QAAI;AACF,aAAO,UAAU;AAAA,IACnB,UAAE;AACA,UAAI;AACF,cAAM,QAAQ,GAAG,aAAa,WAAW,MAAM;AAC/C,YAAI,MAAM,WAAW,GAAG,KAAK;AAAA,CAAI,GAAG;AAClC,aAAG,OAAO,KAAK,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,QAC5D;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgB,WAA4B;AAC1C,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,cAAQ,GAAG,aAAa,WAAW,MAAM;AAAA,IAC3C,QAAQ;AACN,UAAI;AACF,yBAAiB,GAAG,SAAS,KAAK,SAAS,EAAE;AAAA,MAC/C,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,UAAU,QAAW;AACvB,YAAM,CAAC,EAAE,SAAS,aAAa,YAAY,IAAI,MAAM,KAAK,EAAE,MAAM,IAAI;AACtE,YAAM,YAAY,OAAO,WAAW;AACpC,UAAI,OAAO,SAAS,SAAS,KAAK,KAAK,IAAI,IAAI,aAAa,KAAK,aAAc,QAAO;AAEtF,UAAI,kBAAkB,OAAO,OAAO,GAAG,WAAW,cAAc;AAAA,QAC9D,aAAa;AAAA,QACb,WAAW,KAAK,IAAI,wBAAwB,KAAK,YAAY;AAAA,MAC/D,CAAC,MAAM,OAAQ,QAAO;AACtB,UAAI;AACF,YAAI,GAAG,aAAa,WAAW,MAAM,MAAM,MAAO,QAAO;AACzD,WAAG,OAAO,KAAK,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1D,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,mBAAmB,UAAa,KAAK,IAAI,IAAI,kBAAkB,KAAK,cAAc;AACpF,aAAO;AAAA,IACT;AACA,QAAI;AACF,UAAI,GAAG,SAAS,KAAK,SAAS,EAAE,YAAY,eAAgB,QAAO;AACnE,SAAG,OAAO,KAAK,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1D,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,kBAA0B;AACxB,QAAI;AACF,YAAM,SAAkB,KAAK,MAAM,GAAG,aAAa,KAAK,iBAAiB,MAAM,CAAC;AAChF,aAAO,OAAO,WAAW,YAAY,OAAO,cAAc,MAAM,KAAK,UAAU,IAAI,SAAS;AAAA,IAC9F,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,cAAc,YAAoB,QAAwB;AACxD,UAAM,SAAS,aAAa,qBAAqB;AACjD,QAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,GAAG;AAC/C,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,QAAwD;AACpE,QAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,EAAG,QAAO,EAAE,YAAY,IAAI,QAAQ,EAAE;AACpF,WAAO;AAAA,MACL,YAAY,KAAK,MAAM,SAAS,kBAAkB;AAAA,MAClD,QAAQ,SAAS;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,mBAAyB;AACvB,QAAI;AACJ,QAAI;AACF,mBAAa,GAAG,SAAS,KAAK,aAAa,GAAG;AAC9C,YAAM,OAAO,GAAG,UAAU,UAAU,EAAE;AACtC,UAAI,QAAQ,KAAK,kBAAmB;AACpC,YAAM,YAAY,KAAK;AAAA,QACrB;AAAA,QACA,KAAK,yBAAyB,KAAK,gBAAgB;AAAA,MACrD;AACA,YAAM,SAAS,OAAO,YAAY,SAAS;AAC3C,YAAM,YAAY,GAAG,SAAS,YAAY,QAAQ,GAAG,WAAW,OAAO,SAAS;AAChF,YAAM,WAAW,OAAO,SAAS,GAAG,SAAS;AAC7C,YAAM,oBAAoB,KAAK,IAAI,GAAG,SAAS,SAAS,KAAK,sBAAsB;AACnF,YAAM,UAAU,sBAAsB,IAAI,KAAK,SAAS,QAAQ,IAAM,iBAAiB;AACvF,YAAM,gBAAgB,sBAAsB,IAAI,IAAI,WAAW,IAAI,UAAU,IAAI,SAAS;AAC1F,YAAM,WAAW,SAAS,SAAS,aAAa;AAChD,SAAG,UAAU,UAAU;AACvB,mBAAa;AACb,YAAM,gBACJ,KAAK,cAAc,MAAM,QAAQ,MAAM,MAAM,WAAW,IAAI;AAC9D,UAAI;AACF,WAAG,cAAc,eAAe,UAAU,EAAE,MAAM,IAAM,CAAC;AACzD,WAAG,WAAW,eAAe,KAAK,WAAW;AAAA,MAC/C,UAAE;AACA,YAAI;AAAE,aAAG,OAAO,eAAe,EAAE,OAAO,KAAK,CAAC;AAAA,QAAG,QAAQ;AAAA,QAAC;AAAA,MAC5D;AACA,kBAAY,KAAK,iBAAiB,KAAK,gBAAgB,IAAI,CAAC;AAAA,IAC9D,SAAS,OAAO;AACd,UAAI,UAAU,KAAK,MAAM,SAAU,OAAM;AAAA,IAC3C,UAAE;AACA,UAAI,eAAe,OAAW,IAAG,UAAU,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,kBAAwB;AACtB,QAAI;AACJ,QAAI;AACF,mBAAa,GAAG,SAAS,KAAK,aAAa,IAAI;AAC/C,YAAM,OAAO,GAAG,UAAU,UAAU,EAAE;AACtC,UAAI,SAAS,EAAG;AAChB,YAAM,WAAW,OAAO,YAAY,CAAC;AACrC,SAAG,SAAS,YAAY,UAAU,GAAG,GAAG,OAAO,CAAC;AAChD,UAAI,SAAS,CAAC,MAAM,GAAM;AAC1B,YAAM,YAAY,KAAK,IAAI,MAAM,KAAK,gBAAgB,CAAC;AACvD,YAAM,OAAO,OAAO,YAAY,SAAS;AACzC,SAAG,SAAS,YAAY,MAAM,GAAG,WAAW,OAAO,SAAS;AAC5D,YAAM,UAAU,KAAK,YAAY,EAAI;AACrC,SAAG,cAAc,YAAY,WAAW,IAAI,OAAO,YAAY,UAAU,IAAI,CAAC;AAAA,IAChF,SAAS,OAAO;AACd,UAAI,UAAU,KAAK,MAAM,SAAU,OAAM;AAAA,IAC3C,UAAE;AACA,UAAI,eAAe,OAAW,IAAG,UAAU,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,yBAAiC;AAC/B,QAAI;AACJ,QAAI;AACF,mBAAa,GAAG,SAAS,KAAK,aAAa,GAAG;AAC9C,YAAM,OAAO,GAAG,UAAU,UAAU,EAAE;AACtC,UAAI,SAAS,EAAG,QAAO;AACvB,YAAM,YAAY,KAAK,IAAI,MAAM,KAAK,gBAAgB,CAAC;AACvD,YAAM,OAAO,OAAO,YAAY,SAAS;AACzC,SAAG,SAAS,YAAY,MAAM,GAAG,WAAW,OAAO,SAAS;AAC5D,YAAM,QAAQ,KAAK,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI;AACrD,eAAS,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS;AACtD,cAAM,OAAO,MAAM,KAAK;AACxB,YAAI,CAAC,KAAM;AACX,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,cAAI,OAAO,OAAO,aAAa,YAAY,OAAO,cAAc,OAAO,QAAQ,GAAG;AAChF,mBAAO,OAAO;AAAA,UAChB;AAAA,QACF,QAAQ;AAAA,QAAqC;AAAA,MAC/C;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,UAAU,KAAK,MAAM,SAAU,QAAO;AAC1C,YAAM;AAAA,IACR,UAAE;AACA,UAAI,eAAe,OAAW,IAAG,UAAU,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,gBAAwB;AACtB,QAAI;AACF,YAAM,SAAkB,KAAK,MAAM,GAAG,aAAa,KAAK,cAAc,MAAM,CAAC;AAC7E,aAAO,OAAO,WAAW,YAAY,OAAO,cAAc,MAAM,KAAK,UAAU,IAAI,SAAS;AAAA,IAC9F,SAAS,OAAO;AACd,UAAI,UAAU,KAAK,MAAM,SAAU,QAAO;AAC1C,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,eAAe,OAAqB;AAClC,sBAAkB,KAAK;AAAA,EACzB;AAAA,EAEA,aAAa,KAAmB;AAC9B,UAAM,gBAAgB,IACnB,MAAM,MAAM,EACZ;AAAA,MACC,CAAC,YACC,YAAY,eAAe,YAAY,eAAe,YAAY;AAAA,IACtE;AACF,QAAI,CAAC,YAAY,KAAK,GAAG,KAAK,eAAe;AAC3C,YAAM,IAAI,MAAM,4BAA4B,GAAG,EAAE;AAAA,IACnD;AAAA,EACF;AACF;",
6
6
  "names": ["version", "key"]
7
7
  }
@@ -210,6 +210,7 @@ ${memberBlock.lines.join("\n")}
210
210
  declare const extensions: FabricExtensionsApiDynamic;
211
211
  `;
212
212
  };
213
+ var describeFabricActionDeclaration = (name, inputSchema) => `${JSON.stringify(name)}: (args: ${schemaType(inputSchema, 0)}) => Promise<unknown>`;
213
214
  var buildDynamicGuestDeclarations = (sources) => {
214
215
  const dynamic = {};
215
216
  if (sources.mcpServers && sources.mcpServers.length > 0) {
@@ -222,6 +223,7 @@ var buildDynamicGuestDeclarations = (sources) => {
222
223
  };
223
224
 
224
225
  export {
226
+ describeFabricActionDeclaration,
225
227
  buildDynamicGuestDeclarations
226
228
  };
227
- //# sourceMappingURL=chunk-KYXZJNV6.js.map
229
+ //# sourceMappingURL=chunk-4O3PFVTC.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/runtime/dynamic-guest-types.ts"],
4
- "sourcesContent": ["import { sanitizeMcpRefPart } from \"../ref-names.js\";\nimport type {\n FabricDynamicGuestDeclarations,\n FabricGuestTypeSources,\n FabricNamedActionTypeSource,\n} from \"../protocol.js\";\n\n// Renders guest .d.ts fragments for the dynamic call surfaces\n// (mcp.<server>.<tool> and extensions.<tool>) from live provider descriptors,\n// closing the type-check gap those globals had as Record<string, unknown>\n// callables: argument-shape mistakes surfaced only at dispatch time. The\n// generated surface stays advisory \u2014 the registry still validates every\n// call's args against the action's own inputSchema before invoke, so drift\n// between these declarations and a live server fails at the usual validate\n// stage rather than silently.\n\nconst MAX_DEPTH = 6;\nconst MAX_UNION_MEMBERS = 12;\nconst MAX_SCHEMA_SOURCE_CHARS = 4_096;\nconst MAX_MEMBER_TYPE_CHARS = 2_500;\nconst MAX_SECTION_CHARS = 60_000;\nconst MAX_MCP_SERVERS = 64;\nconst MAX_TOOLS_PER_SERVER = 128;\nconst MAX_EXTENSION_TOOLS = 256;\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst propertyKey = (name: string): string =>\n IDENTIFIER.test(name) ? name : JSON.stringify(name);\n\nconst literalType = (value: unknown): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\" && Number.isFinite(value)) return JSON.stringify(value);\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n return \"unknown\";\n};\n\nconst unionType = (parts: string[]): string => {\n const unique = [...new Set(parts)];\n if (unique.length === 0) return \"unknown\";\n return unique.length === 1 ? unique[0]! : unique.join(\" | \");\n};\n\nconst typeList = (value: unknown): string[] => {\n if (typeof value === \"string\") return [value];\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === \"string\");\n }\n return [];\n};\n\nconst objectType = (schema: Record<string, unknown>, depth: number): string => {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(\n Array.isArray(schema.required)\n ? schema.required.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n );\n const members: string[] = [];\n for (const key of Object.keys(properties).sort()) {\n members.push(\n `${propertyKey(key)}${required.has(key) ? \"\" : \"?\"}: ${schemaType(properties[key], depth + 1)}`,\n );\n }\n const additional = schema.additionalProperties;\n if (additional !== false) {\n members.push(\n isRecord(additional)\n ? `[key: string]: ${schemaType(additional, depth + 1)}`\n : \"[key: string]: unknown\",\n );\n }\n return `{ ${members.join(\"; \")} }`;\n};\n\nconst schemaType = (schema: unknown, depth: number): string => {\n if (depth > MAX_DEPTH) return \"unknown\";\n if (schema === true || schema === undefined) return \"unknown\";\n if (schema === false) return \"never\";\n if (!isRecord(schema)) return \"unknown\";\n if (\"const\" in schema) return literalType(schema.const);\n if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n return unionType(schema.enum.slice(0, MAX_UNION_MEMBERS).map(literalType));\n }\n const alternates = Array.isArray(schema.anyOf)\n ? schema.anyOf\n : Array.isArray(schema.oneOf)\n ? schema.oneOf\n : undefined;\n if (alternates) {\n if (alternates.length === 0) return \"unknown\";\n return unionType(\n alternates.slice(0, MAX_UNION_MEMBERS).map((entry) => schemaType(entry, depth + 1)),\n );\n }\n if (Array.isArray(schema.allOf) && schema.allOf.length > 0) {\n return schema.allOf\n .slice(0, MAX_UNION_MEMBERS)\n .map((entry) => {\n const rendered = schemaType(entry, depth + 1);\n return rendered.includes(\" | \") ? `(${rendered})` : rendered;\n })\n .join(\" & \");\n }\n const types = typeList(schema.type);\n if (types.length > 1) {\n return unionType(types.map((type) => schemaType({ ...schema, type }, depth + 1)));\n }\n const type = types[0];\n if (type === \"object\" || (!type && isRecord(schema.properties))) {\n return objectType(schema, depth);\n }\n if (type === \"string\") return \"string\";\n if (type === \"number\" || type === \"integer\") return \"number\";\n if (type === \"boolean\") return \"boolean\";\n if (type === \"null\") return \"null\";\n if (type === \"array\") {\n const items = schema.items;\n if (Array.isArray(items)) {\n return `[${items\n .slice(0, MAX_UNION_MEMBERS)\n .map((entry) => schemaType(entry, depth + 1))\n .join(\", \")}]`;\n }\n return isRecord(items) || items === true\n ? `Array<${schemaType(items, depth + 1)}>`\n : \"unknown[]\";\n }\n return \"unknown\";\n};\n\ninterface FabricRenderBudget {\n chars: number;\n}\n\nconst spend = (budget: FabricRenderBudget, text: string): boolean => {\n if (budget.chars < text.length) return false;\n budget.chars -= text.length;\n return true;\n};\n\nconst hasRequiredArgs = (source: FabricNamedActionTypeSource): boolean =>\n Array.isArray(source.inputSchema.required) &&\n source.inputSchema.required.length > 0 &&\n isRecord(source.inputSchema.properties);\n\nconst renderMember = (\n name: string,\n source: FabricNamedActionTypeSource,\n resultType: string,\n): string => {\n const loose = `${propertyKey(name)}(args?: Record<string, unknown>): ${resultType};`;\n const schemaJson = JSON.stringify(source.inputSchema);\n if (!schemaJson || schemaJson.length > MAX_SCHEMA_SOURCE_CHARS) return loose;\n const rendered = schemaType(source.inputSchema, 0);\n if (rendered.length > MAX_MEMBER_TYPE_CHARS) return loose;\n return `${propertyKey(name)}(args${hasRequiredArgs(source) ? \"\" : \"?\"}: ${rendered}): ${resultType};`;\n};\n\n// Name collisions after sanitization are ambiguous: the MCP provider refuses\n// ambiguous sanitized server names and resolves colliding tools to the first\n// match, so mirrored members would promise a shape dispatch does not\n// guarantee. Unique names render in up to two forms \u2014 the sanitized\n// identifier the model types and a quoted raw alias for bracket access\n// (mcp[\"my-server\"]) \u2014 and ambiguous groups render nothing. A raw alias can\n// never collide with a sanitized member: aliases always contain a character\n// the sanitizer would replace or a leading digit it would prefix.\nconst renderMemberBlock = (\n sources: FabricNamedActionTypeSource[],\n resultType: string,\n limit: number,\n budget: FabricRenderBudget,\n): { lines: string[]; dropped: number } => {\n const bySanitized = new Map<string, FabricNamedActionTypeSource[]>();\n for (const source of sources.slice(0, limit)) {\n const key = sanitizeMcpRefPart(source.name);\n const group = bySanitized.get(key);\n if (group) group.push(source);\n else bySanitized.set(key, [source]);\n }\n const lines: string[] = [];\n let dropped = Math.max(0, sources.length - limit);\n const sortedGroups = [...bySanitized.entries()].sort(([a], [b]) => a.localeCompare(b));\n for (const [sanitized, group] of sortedGroups) {\n if (group.length > 1) {\n dropped += group.length;\n continue;\n }\n const source = group[0]!;\n const text =\n source.name === sanitized\n ? ` ${renderMember(sanitized, source, resultType)}`\n : ` ${renderMember(sanitized, source, resultType)}\\n ${renderMember(source.name, source, resultType)}`;\n if (!spend(budget, text)) {\n dropped += 1;\n continue;\n }\n lines.push(text);\n }\n return { lines, dropped };\n};\n\nconst renderMcpDeclaration = (\n sources: NonNullable<FabricGuestTypeSources[\"mcpServers\"]>,\n): string => {\n const bySanitized = new Map<string, typeof sources>();\n const rawNames = new Set<string>();\n for (const source of sources.slice(0, MAX_MCP_SERVERS)) {\n if (rawNames.has(source.server)) continue;\n rawNames.add(source.server);\n const key = sanitizeMcpRefPart(source.server);\n const group = bySanitized.get(key);\n if (group) group.push(source);\n else bySanitized.set(key, [source]);\n }\n const budget: FabricRenderBudget = { chars: MAX_SECTION_CHARS };\n const interfaces: string[] = [];\n const mapEntries: string[] = [];\n let droppedServers = Math.max(0, sources.length - rawNames.size);\n let droppedTools = 0;\n const sortedGroups = [...bySanitized.entries()].sort(([a], [b]) => a.localeCompare(b));\n for (const [sanitized, group] of sortedGroups) {\n if (group.length > 1) {\n droppedServers += group.length;\n droppedTools += group.reduce((total, entry) => total + entry.tools.length, 0);\n continue;\n }\n const source = group[0]!;\n const interfaceName = `FabricMcpServer_${sanitized}`;\n const memberBlock = renderMemberBlock(\n source.tools,\n \"Promise<FabricMcpResult | unknown>\",\n MAX_TOOLS_PER_SERVER,\n budget,\n );\n droppedTools += memberBlock.dropped;\n const header = `interface ${interfaceName} {\\n${memberBlock.lines.join(\"\\n\")}\\n}`;\n if (!spend(budget, header)) {\n droppedServers += 1;\n droppedTools += source.tools.length;\n break;\n }\n interfaces.push(header);\n mapEntries.push(` ${sanitized}: ${interfaceName};`);\n if (source.server !== sanitized) {\n mapEntries.push(` ${propertyKey(source.server)}: ${interfaceName};`);\n }\n }\n const notes: string[] = [];\n if (droppedServers > 0) notes.push(`${droppedServers} server(s) untyped`);\n if (droppedTools > 0) notes.push(`${droppedTools} tool(s) untyped`);\n const note =\n notes.length > 0\n ? `// Omitted from this surface (${notes.join(\", \")}); those calls compile\\n// as the loose fallback would and still validate at dispatch.\\n`\n : \"\";\n return (\n \"// Generated from the live MCP descriptor cache for this execution. Known\\n\" +\n \"// servers and tools carry their schemas so argument-shape mistakes fail\\n\" +\n \"// type-check before the sandbox runs, like pi.* calls do; anything absent\\n\" +\n \"// (cold cache, ambiguous sanitized names) compiles as it would with the\\n\" +\n \"// loose declarations and is validated by the registry at dispatch.\\n\" +\n note +\n interfaces.join(\"\\n\") +\n (interfaces.length > 0 ? \"\\n\" : \"\") +\n `declare const mcp: {\\n${mapEntries.join(\"\\n\")}\\n} & FabricMcpManagement;\\n`\n );\n};\n\nconst renderExtensionsDeclaration = (\n sources: NonNullable<FabricGuestTypeSources[\"extensionTools\"]>,\n): string => {\n const budget: FabricRenderBudget = { chars: MAX_SECTION_CHARS };\n const memberBlock = renderMemberBlock(\n sources,\n \"Promise<FabricCapturedToolResult>\",\n MAX_EXTENSION_TOOLS,\n budget,\n );\n const note =\n memberBlock.dropped > 0\n ? `// Omitted ${memberBlock.dropped} tool(s) from this surface; those calls\\n// compile as the loose fallback would and still validate at dispatch.\\n`\n : \"\";\n return (\n \"// Generated from the captured extension tool catalog for this execution,\\n\" +\n \"// with the same advisory semantics as the generated mcp surface above.\\n\" +\n note +\n `interface FabricExtensionsApiDynamic {\\n${memberBlock.lines.join(\"\\n\")}\\n}\\n` +\n \"declare const extensions: FabricExtensionsApiDynamic;\\n\"\n );\n};\n\n// Renders replacement `declare const mcp` / `declare const extensions` blocks\n// for guestTypeDeclarations(). Missing or empty sections return undefined so\n// the loose static lines survive, matching cold-cache behavior.\nexport const buildDynamicGuestDeclarations = (\n sources: FabricGuestTypeSources,\n): FabricDynamicGuestDeclarations => {\n const dynamic: FabricDynamicGuestDeclarations = {};\n if (sources.mcpServers && sources.mcpServers.length > 0) {\n dynamic.mcp = renderMcpDeclaration(sources.mcpServers);\n }\n if (sources.extensionTools && sources.extensionTools.length > 0) {\n dynamic.extensions = renderExtensionsDeclaration(sources.extensionTools);\n }\n return dynamic;\n};\n"],
5
- "mappings": ";;;;;AAgBA,IAAM,YAAY;AAClB,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAC9B,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AACxB,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAE5B,IAAM,aAAa;AAEnB,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAM,cAAc,CAAC,SACnB,WAAW,KAAK,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI;AAEpD,IAAM,cAAc,CAAC,UAA2B;AAC9C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO,KAAK,UAAU,KAAK;AACpF,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AACxD,SAAO;AACT;AAEA,IAAM,YAAY,CAAC,UAA4B;AAC7C,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AACjC,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,OAAO,WAAW,IAAI,OAAO,CAAC,IAAK,OAAO,KAAK,KAAK;AAC7D;AAEA,IAAM,WAAW,CAAC,UAA6B;AAC7C,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC,KAAK;AAC5C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ;AAAA,EAC3E;AACA,SAAO,CAAC;AACV;AAEA,IAAM,aAAa,CAAC,QAAiC,UAA0B;AAC7E,QAAM,aAAa,SAAS,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC;AACtE,QAAM,WAAW,IAAI;AAAA,IACnB,MAAM,QAAQ,OAAO,QAAQ,IACzB,OAAO,SAAS,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAC5E,CAAC;AAAA,EACP;AACA,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,OAAO,KAAK,UAAU,EAAE,KAAK,GAAG;AAChD,YAAQ;AAAA,MACN,GAAG,YAAY,GAAG,CAAC,GAAG,SAAS,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK,WAAW,WAAW,GAAG,GAAG,QAAQ,CAAC,CAAC;AAAA,IAC/F;AAAA,EACF;AACA,QAAM,aAAa,OAAO;AAC1B,MAAI,eAAe,OAAO;AACxB,YAAQ;AAAA,MACN,SAAS,UAAU,IACf,kBAAkB,WAAW,YAAY,QAAQ,CAAC,CAAC,KACnD;AAAA,IACN;AAAA,EACF;AACA,SAAO,KAAK,QAAQ,KAAK,IAAI,CAAC;AAChC;AAEA,IAAM,aAAa,CAAC,QAAiB,UAA0B;AAC7D,MAAI,QAAQ,UAAW,QAAO;AAC9B,MAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AACpD,MAAI,WAAW,MAAO,QAAO;AAC7B,MAAI,CAAC,SAAS,MAAM,EAAG,QAAO;AAC9B,MAAI,WAAW,OAAQ,QAAO,YAAY,OAAO,KAAK;AACtD,MAAI,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG;AACxD,WAAO,UAAU,OAAO,KAAK,MAAM,GAAG,iBAAiB,EAAE,IAAI,WAAW,CAAC;AAAA,EAC3E;AACA,QAAM,aAAa,MAAM,QAAQ,OAAO,KAAK,IACzC,OAAO,QACP,MAAM,QAAQ,OAAO,KAAK,IACxB,OAAO,QACP;AACN,MAAI,YAAY;AACd,QAAI,WAAW,WAAW,EAAG,QAAO;AACpC,WAAO;AAAA,MACL,WAAW,MAAM,GAAG,iBAAiB,EAAE,IAAI,CAAC,UAAU,WAAW,OAAO,QAAQ,CAAC,CAAC;AAAA,IACpF;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,GAAG;AAC1D,WAAO,OAAO,MACX,MAAM,GAAG,iBAAiB,EAC1B,IAAI,CAAC,UAAU;AACd,YAAM,WAAW,WAAW,OAAO,QAAQ,CAAC;AAC5C,aAAO,SAAS,SAAS,KAAK,IAAI,IAAI,QAAQ,MAAM;AAAA,IACtD,CAAC,EACA,KAAK,KAAK;AAAA,EACf;AACA,QAAM,QAAQ,SAAS,OAAO,IAAI;AAClC,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,UAAU,MAAM,IAAI,CAACA,UAAS,WAAW,EAAE,GAAG,QAAQ,MAAAA,MAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;AAAA,EAClF;AACA,QAAM,OAAO,MAAM,CAAC;AACpB,MAAI,SAAS,YAAa,CAAC,QAAQ,SAAS,OAAO,UAAU,GAAI;AAC/D,WAAO,WAAW,QAAQ,KAAK;AAAA,EACjC;AACA,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,YAAY,SAAS,UAAW,QAAO;AACpD,MAAI,SAAS,UAAW,QAAO;AAC/B,MAAI,SAAS,OAAQ,QAAO;AAC5B,MAAI,SAAS,SAAS;AACpB,UAAM,QAAQ,OAAO;AACrB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,IAAI,MACR,MAAM,GAAG,iBAAiB,EAC1B,IAAI,CAAC,UAAU,WAAW,OAAO,QAAQ,CAAC,CAAC,EAC3C,KAAK,IAAI,CAAC;AAAA,IACf;AACA,WAAO,SAAS,KAAK,KAAK,UAAU,OAChC,SAAS,WAAW,OAAO,QAAQ,CAAC,CAAC,MACrC;AAAA,EACN;AACA,SAAO;AACT;AAMA,IAAM,QAAQ,CAAC,QAA4B,SAA0B;AACnE,MAAI,OAAO,QAAQ,KAAK,OAAQ,QAAO;AACvC,SAAO,SAAS,KAAK;AACrB,SAAO;AACT;AAEA,IAAM,kBAAkB,CAAC,WACvB,MAAM,QAAQ,OAAO,YAAY,QAAQ,KACzC,OAAO,YAAY,SAAS,SAAS,KACrC,SAAS,OAAO,YAAY,UAAU;AAExC,IAAM,eAAe,CACnB,MACA,QACA,eACW;AACX,QAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,qCAAqC,UAAU;AACjF,QAAM,aAAa,KAAK,UAAU,OAAO,WAAW;AACpD,MAAI,CAAC,cAAc,WAAW,SAAS,wBAAyB,QAAO;AACvE,QAAM,WAAW,WAAW,OAAO,aAAa,CAAC;AACjD,MAAI,SAAS,SAAS,sBAAuB,QAAO;AACpD,SAAO,GAAG,YAAY,IAAI,CAAC,QAAQ,gBAAgB,MAAM,IAAI,KAAK,GAAG,KAAK,QAAQ,MAAM,UAAU;AACpG;AAUA,IAAM,oBAAoB,CACxB,SACA,YACA,OACA,WACyC;AACzC,QAAM,cAAc,oBAAI,IAA2C;AACnE,aAAW,UAAU,QAAQ,MAAM,GAAG,KAAK,GAAG;AAC5C,UAAM,MAAM,mBAAmB,OAAO,IAAI;AAC1C,UAAM,QAAQ,YAAY,IAAI,GAAG;AACjC,QAAI,MAAO,OAAM,KAAK,MAAM;AAAA,QACvB,aAAY,IAAI,KAAK,CAAC,MAAM,CAAC;AAAA,EACpC;AACA,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU,KAAK,IAAI,GAAG,QAAQ,SAAS,KAAK;AAChD,QAAM,eAAe,CAAC,GAAG,YAAY,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACrF,aAAW,CAAC,WAAW,KAAK,KAAK,cAAc;AAC7C,QAAI,MAAM,SAAS,GAAG;AACpB,iBAAW,MAAM;AACjB;AAAA,IACF;AACA,UAAM,SAAS,MAAM,CAAC;AACtB,UAAM,OACJ,OAAO,SAAS,YACZ,KAAK,aAAa,WAAW,QAAQ,UAAU,CAAC,KAChD,KAAK,aAAa,WAAW,QAAQ,UAAU,CAAC;AAAA,IAAO,aAAa,OAAO,MAAM,QAAQ,UAAU,CAAC;AAC1G,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,iBAAW;AACX;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAEA,IAAM,uBAAuB,CAC3B,YACW;AACX,QAAM,cAAc,oBAAI,IAA4B;AACpD,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,UAAU,QAAQ,MAAM,GAAG,eAAe,GAAG;AACtD,QAAI,SAAS,IAAI,OAAO,MAAM,EAAG;AACjC,aAAS,IAAI,OAAO,MAAM;AAC1B,UAAM,MAAM,mBAAmB,OAAO,MAAM;AAC5C,UAAM,QAAQ,YAAY,IAAI,GAAG;AACjC,QAAI,MAAO,OAAM,KAAK,MAAM;AAAA,QACvB,aAAY,IAAI,KAAK,CAAC,MAAM,CAAC;AAAA,EACpC;AACA,QAAM,SAA6B,EAAE,OAAO,kBAAkB;AAC9D,QAAM,aAAuB,CAAC;AAC9B,QAAM,aAAuB,CAAC;AAC9B,MAAI,iBAAiB,KAAK,IAAI,GAAG,QAAQ,SAAS,SAAS,IAAI;AAC/D,MAAI,eAAe;AACnB,QAAM,eAAe,CAAC,GAAG,YAAY,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACrF,aAAW,CAAC,WAAW,KAAK,KAAK,cAAc;AAC7C,QAAI,MAAM,SAAS,GAAG;AACpB,wBAAkB,MAAM;AACxB,sBAAgB,MAAM,OAAO,CAAC,OAAO,UAAU,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAC5E;AAAA,IACF;AACA,UAAM,SAAS,MAAM,CAAC;AACtB,UAAM,gBAAgB,mBAAmB,SAAS;AAClD,UAAM,cAAc;AAAA,MAClB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,oBAAgB,YAAY;AAC5B,UAAM,SAAS,aAAa,aAAa;AAAA,EAAO,YAAY,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5E,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,wBAAkB;AAClB,sBAAgB,OAAO,MAAM;AAC7B;AAAA,IACF;AACA,eAAW,KAAK,MAAM;AACtB,eAAW,KAAK,KAAK,SAAS,KAAK,aAAa,GAAG;AACnD,QAAI,OAAO,WAAW,WAAW;AAC/B,iBAAW,KAAK,KAAK,YAAY,OAAO,MAAM,CAAC,KAAK,aAAa,GAAG;AAAA,IACtE;AAAA,EACF;AACA,QAAM,QAAkB,CAAC;AACzB,MAAI,iBAAiB,EAAG,OAAM,KAAK,GAAG,cAAc,oBAAoB;AACxE,MAAI,eAAe,EAAG,OAAM,KAAK,GAAG,YAAY,kBAAkB;AAClE,QAAM,OACJ,MAAM,SAAS,IACX,iCAAiC,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA,IACjD;AACN,SACE,qXAKA,OACA,WAAW,KAAK,IAAI,KACnB,WAAW,SAAS,IAAI,OAAO,MAChC;AAAA,EAAyB,WAAW,KAAK,IAAI,CAAC;AAAA;AAAA;AAElD;AAEA,IAAM,8BAA8B,CAClC,YACW;AACX,QAAM,SAA6B,EAAE,OAAO,kBAAkB;AAC9D,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,OACJ,YAAY,UAAU,IAClB,cAAc,YAAY,OAAO;AAAA;AAAA,IACjC;AACN,SACE,yJAEA,OACA;AAAA,EAA2C,YAAY,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAG3E;AAKO,IAAM,gCAAgC,CAC3C,YACmC;AACnC,QAAM,UAA0C,CAAC;AACjD,MAAI,QAAQ,cAAc,QAAQ,WAAW,SAAS,GAAG;AACvD,YAAQ,MAAM,qBAAqB,QAAQ,UAAU;AAAA,EACvD;AACA,MAAI,QAAQ,kBAAkB,QAAQ,eAAe,SAAS,GAAG;AAC/D,YAAQ,aAAa,4BAA4B,QAAQ,cAAc;AAAA,EACzE;AACA,SAAO;AACT;",
4
+ "sourcesContent": ["import { sanitizeMcpRefPart } from \"../ref-names.js\";\nimport type {\n FabricDynamicGuestDeclarations,\n FabricGuestTypeSources,\n FabricNamedActionTypeSource,\n} from \"../protocol.js\";\n\n// Renders guest .d.ts fragments for the dynamic call surfaces\n// (mcp.<server>.<tool> and extensions.<tool>) from live provider descriptors,\n// closing the type-check gap those globals had as Record<string, unknown>\n// callables: argument-shape mistakes surfaced only at dispatch time. The\n// generated surface stays advisory \u2014 the registry still validates every\n// call's args against the action's own inputSchema before invoke, so drift\n// between these declarations and a live server fails at the usual validate\n// stage rather than silently.\n\nconst MAX_DEPTH = 6;\nconst MAX_UNION_MEMBERS = 12;\nconst MAX_SCHEMA_SOURCE_CHARS = 4_096;\nconst MAX_MEMBER_TYPE_CHARS = 2_500;\nconst MAX_SECTION_CHARS = 60_000;\nconst MAX_MCP_SERVERS = 64;\nconst MAX_TOOLS_PER_SERVER = 128;\nconst MAX_EXTENSION_TOOLS = 256;\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst propertyKey = (name: string): string =>\n IDENTIFIER.test(name) ? name : JSON.stringify(name);\n\nconst literalType = (value: unknown): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\" && Number.isFinite(value)) return JSON.stringify(value);\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n return \"unknown\";\n};\n\nconst unionType = (parts: string[]): string => {\n const unique = [...new Set(parts)];\n if (unique.length === 0) return \"unknown\";\n return unique.length === 1 ? unique[0]! : unique.join(\" | \");\n};\n\nconst typeList = (value: unknown): string[] => {\n if (typeof value === \"string\") return [value];\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === \"string\");\n }\n return [];\n};\n\nconst objectType = (schema: Record<string, unknown>, depth: number): string => {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(\n Array.isArray(schema.required)\n ? schema.required.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n );\n const members: string[] = [];\n for (const key of Object.keys(properties).sort()) {\n members.push(\n `${propertyKey(key)}${required.has(key) ? \"\" : \"?\"}: ${schemaType(properties[key], depth + 1)}`,\n );\n }\n const additional = schema.additionalProperties;\n if (additional !== false) {\n members.push(\n isRecord(additional)\n ? `[key: string]: ${schemaType(additional, depth + 1)}`\n : \"[key: string]: unknown\",\n );\n }\n return `{ ${members.join(\"; \")} }`;\n};\n\nconst schemaType = (schema: unknown, depth: number): string => {\n if (depth > MAX_DEPTH) return \"unknown\";\n if (schema === true || schema === undefined) return \"unknown\";\n if (schema === false) return \"never\";\n if (!isRecord(schema)) return \"unknown\";\n if (\"const\" in schema) return literalType(schema.const);\n if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n return unionType(schema.enum.slice(0, MAX_UNION_MEMBERS).map(literalType));\n }\n const alternates = Array.isArray(schema.anyOf)\n ? schema.anyOf\n : Array.isArray(schema.oneOf)\n ? schema.oneOf\n : undefined;\n if (alternates) {\n if (alternates.length === 0) return \"unknown\";\n return unionType(\n alternates.slice(0, MAX_UNION_MEMBERS).map((entry) => schemaType(entry, depth + 1)),\n );\n }\n if (Array.isArray(schema.allOf) && schema.allOf.length > 0) {\n return schema.allOf\n .slice(0, MAX_UNION_MEMBERS)\n .map((entry) => {\n const rendered = schemaType(entry, depth + 1);\n return rendered.includes(\" | \") ? `(${rendered})` : rendered;\n })\n .join(\" & \");\n }\n const types = typeList(schema.type);\n if (types.length > 1) {\n return unionType(types.map((type) => schemaType({ ...schema, type }, depth + 1)));\n }\n const type = types[0];\n if (type === \"object\" || (!type && isRecord(schema.properties))) {\n return objectType(schema, depth);\n }\n if (type === \"string\") return \"string\";\n if (type === \"number\" || type === \"integer\") return \"number\";\n if (type === \"boolean\") return \"boolean\";\n if (type === \"null\") return \"null\";\n if (type === \"array\") {\n const items = schema.items;\n if (Array.isArray(items)) {\n return `[${items\n .slice(0, MAX_UNION_MEMBERS)\n .map((entry) => schemaType(entry, depth + 1))\n .join(\", \")}]`;\n }\n return isRecord(items) || items === true\n ? `Array<${schemaType(items, depth + 1)}>`\n : \"unknown[]\";\n }\n return \"unknown\";\n};\n\ninterface FabricRenderBudget {\n chars: number;\n}\n\nconst spend = (budget: FabricRenderBudget, text: string): boolean => {\n if (budget.chars < text.length) return false;\n budget.chars -= text.length;\n return true;\n};\n\nconst hasRequiredArgs = (source: FabricNamedActionTypeSource): boolean =>\n Array.isArray(source.inputSchema.required) &&\n source.inputSchema.required.length > 0 &&\n isRecord(source.inputSchema.properties);\n\nconst renderMember = (\n name: string,\n source: FabricNamedActionTypeSource,\n resultType: string,\n): string => {\n const loose = `${propertyKey(name)}(args?: Record<string, unknown>): ${resultType};`;\n const schemaJson = JSON.stringify(source.inputSchema);\n if (!schemaJson || schemaJson.length > MAX_SCHEMA_SOURCE_CHARS) return loose;\n const rendered = schemaType(source.inputSchema, 0);\n if (rendered.length > MAX_MEMBER_TYPE_CHARS) return loose;\n return `${propertyKey(name)}(args${hasRequiredArgs(source) ? \"\" : \"?\"}: ${rendered}): ${resultType};`;\n};\n\n// Name collisions after sanitization are ambiguous: the MCP provider refuses\n// ambiguous sanitized server names and resolves colliding tools to the first\n// match, so mirrored members would promise a shape dispatch does not\n// guarantee. Unique names render in up to two forms \u2014 the sanitized\n// identifier the model types and a quoted raw alias for bracket access\n// (mcp[\"my-server\"]) \u2014 and ambiguous groups render nothing. A raw alias can\n// never collide with a sanitized member: aliases always contain a character\n// the sanitizer would replace or a leading digit it would prefix.\nconst renderMemberBlock = (\n sources: FabricNamedActionTypeSource[],\n resultType: string,\n limit: number,\n budget: FabricRenderBudget,\n): { lines: string[]; dropped: number } => {\n const bySanitized = new Map<string, FabricNamedActionTypeSource[]>();\n for (const source of sources.slice(0, limit)) {\n const key = sanitizeMcpRefPart(source.name);\n const group = bySanitized.get(key);\n if (group) group.push(source);\n else bySanitized.set(key, [source]);\n }\n const lines: string[] = [];\n let dropped = Math.max(0, sources.length - limit);\n const sortedGroups = [...bySanitized.entries()].sort(([a], [b]) => a.localeCompare(b));\n for (const [sanitized, group] of sortedGroups) {\n if (group.length > 1) {\n dropped += group.length;\n continue;\n }\n const source = group[0]!;\n const text =\n source.name === sanitized\n ? ` ${renderMember(sanitized, source, resultType)}`\n : ` ${renderMember(sanitized, source, resultType)}\\n ${renderMember(source.name, source, resultType)}`;\n if (!spend(budget, text)) {\n dropped += 1;\n continue;\n }\n lines.push(text);\n }\n return { lines, dropped };\n};\n\nconst renderMcpDeclaration = (\n sources: NonNullable<FabricGuestTypeSources[\"mcpServers\"]>,\n): string => {\n const bySanitized = new Map<string, typeof sources>();\n const rawNames = new Set<string>();\n for (const source of sources.slice(0, MAX_MCP_SERVERS)) {\n if (rawNames.has(source.server)) continue;\n rawNames.add(source.server);\n const key = sanitizeMcpRefPart(source.server);\n const group = bySanitized.get(key);\n if (group) group.push(source);\n else bySanitized.set(key, [source]);\n }\n const budget: FabricRenderBudget = { chars: MAX_SECTION_CHARS };\n const interfaces: string[] = [];\n const mapEntries: string[] = [];\n let droppedServers = Math.max(0, sources.length - rawNames.size);\n let droppedTools = 0;\n const sortedGroups = [...bySanitized.entries()].sort(([a], [b]) => a.localeCompare(b));\n for (const [sanitized, group] of sortedGroups) {\n if (group.length > 1) {\n droppedServers += group.length;\n droppedTools += group.reduce((total, entry) => total + entry.tools.length, 0);\n continue;\n }\n const source = group[0]!;\n const interfaceName = `FabricMcpServer_${sanitized}`;\n const memberBlock = renderMemberBlock(\n source.tools,\n \"Promise<FabricMcpResult | unknown>\",\n MAX_TOOLS_PER_SERVER,\n budget,\n );\n droppedTools += memberBlock.dropped;\n const header = `interface ${interfaceName} {\\n${memberBlock.lines.join(\"\\n\")}\\n}`;\n if (!spend(budget, header)) {\n droppedServers += 1;\n droppedTools += source.tools.length;\n break;\n }\n interfaces.push(header);\n mapEntries.push(` ${sanitized}: ${interfaceName};`);\n if (source.server !== sanitized) {\n mapEntries.push(` ${propertyKey(source.server)}: ${interfaceName};`);\n }\n }\n const notes: string[] = [];\n if (droppedServers > 0) notes.push(`${droppedServers} server(s) untyped`);\n if (droppedTools > 0) notes.push(`${droppedTools} tool(s) untyped`);\n const note =\n notes.length > 0\n ? `// Omitted from this surface (${notes.join(\", \")}); those calls compile\\n// as the loose fallback would and still validate at dispatch.\\n`\n : \"\";\n return (\n \"// Generated from the live MCP descriptor cache for this execution. Known\\n\" +\n \"// servers and tools carry their schemas so argument-shape mistakes fail\\n\" +\n \"// type-check before the sandbox runs, like pi.* calls do; anything absent\\n\" +\n \"// (cold cache, ambiguous sanitized names) compiles as it would with the\\n\" +\n \"// loose declarations and is validated by the registry at dispatch.\\n\" +\n note +\n interfaces.join(\"\\n\") +\n (interfaces.length > 0 ? \"\\n\" : \"\") +\n `declare const mcp: {\\n${mapEntries.join(\"\\n\")}\\n} & FabricMcpManagement;\\n`\n );\n};\n\nconst renderExtensionsDeclaration = (\n sources: NonNullable<FabricGuestTypeSources[\"extensionTools\"]>,\n): string => {\n const budget: FabricRenderBudget = { chars: MAX_SECTION_CHARS };\n const memberBlock = renderMemberBlock(\n sources,\n \"Promise<FabricCapturedToolResult>\",\n MAX_EXTENSION_TOOLS,\n budget,\n );\n const note =\n memberBlock.dropped > 0\n ? `// Omitted ${memberBlock.dropped} tool(s) from this surface; those calls\\n// compile as the loose fallback would and still validate at dispatch.\\n`\n : \"\";\n return (\n \"// Generated from the captured extension tool catalog for this execution,\\n\" +\n \"// with the same advisory semantics as the generated mcp surface above.\\n\" +\n note +\n `interface FabricExtensionsApiDynamic {\\n${memberBlock.lines.join(\"\\n\")}\\n}\\n` +\n \"declare const extensions: FabricExtensionsApiDynamic;\\n\"\n );\n};\n\n// Renders replacement `declare const mcp` / `declare const extensions` blocks\n// for guestTypeDeclarations(). Missing or empty sections return undefined so\n// the loose static lines survive, matching cold-cache behavior.\n/** Bounded advisory declaration for native describeTool compatibility. */\nexport const describeFabricActionDeclaration = (name: string, inputSchema: Record<string, unknown>): string =>\n `${JSON.stringify(name)}: (args: ${schemaType(inputSchema, 0)}) => Promise<unknown>`;\n\nexport const buildDynamicGuestDeclarations = (\n sources: FabricGuestTypeSources,\n): FabricDynamicGuestDeclarations => {\n const dynamic: FabricDynamicGuestDeclarations = {};\n if (sources.mcpServers && sources.mcpServers.length > 0) {\n dynamic.mcp = renderMcpDeclaration(sources.mcpServers);\n }\n if (sources.extensionTools && sources.extensionTools.length > 0) {\n dynamic.extensions = renderExtensionsDeclaration(sources.extensionTools);\n }\n return dynamic;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["type"]
7
7
  }