pi-fabric 0.104.3 → 0.105.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 (159) hide show
  1. package/THIRD_PARTY_NOTICES.md +2 -2
  2. package/dist/agents.js +3 -3
  3. package/dist/chunks/{chunk-25LXRT3G.js → chunk-3GJJG2FV.js} +1 -1
  4. package/dist/chunks/{chunk-25LXRT3G.js.map → chunk-3GJJG2FV.js.map} +1 -1
  5. package/dist/chunks/{chunk-ZLWJ3T75.js → chunk-3KDUMDPZ.js} +3 -3
  6. package/dist/chunks/{chunk-BXYWRMBE.js → chunk-5MNLVHF5.js} +26 -3
  7. package/dist/chunks/chunk-5MNLVHF5.js.map +7 -0
  8. package/dist/chunks/chunk-6VXPACGC.js +6490 -0
  9. package/dist/chunks/chunk-6VXPACGC.js.map +7 -0
  10. package/dist/chunks/{chunk-57CMH4SW.js → chunk-7JU7Z4XQ.js} +2 -2
  11. package/dist/chunks/chunk-7QKKLBHJ.js +33 -0
  12. package/dist/chunks/chunk-7QKKLBHJ.js.map +7 -0
  13. package/dist/chunks/{chunk-SV7ONATB.js → chunk-7XRUMDV7.js} +2 -2
  14. package/dist/chunks/{chunk-WYRBDPPM.js → chunk-ABJCSNZO.js} +2 -2
  15. package/dist/chunks/{chunk-QM4IAKBX.js → chunk-BVJBYFHD.js} +2 -2
  16. package/dist/chunks/{chunk-SS7FVARK.js → chunk-C7EEG6SM.js} +2 -2
  17. package/dist/chunks/{chunk-HOX6VW45.js → chunk-CYMDX3XP.js} +1 -1
  18. package/dist/chunks/{chunk-HOX6VW45.js.map → chunk-CYMDX3XP.js.map} +1 -1
  19. package/dist/chunks/chunk-DK35W6U7.js +259 -0
  20. package/dist/chunks/chunk-DK35W6U7.js.map +7 -0
  21. package/dist/chunks/{chunk-UAP4EDZQ.js → chunk-DZ4WN5XJ.js} +3 -3
  22. package/dist/chunks/{chunk-VZQYLEND.js → chunk-FB24AOIJ.js} +35 -33
  23. package/dist/chunks/{chunk-VZQYLEND.js.map → chunk-FB24AOIJ.js.map} +1 -1
  24. package/dist/chunks/{chunk-V7R3NVOS.js → chunk-GJVPP3NN.js} +2 -2
  25. package/dist/chunks/{chunk-UVYTLBS7.js → chunk-GYPDGW27.js} +89 -89
  26. package/dist/chunks/chunk-GYPDGW27.js.map +7 -0
  27. package/dist/chunks/{chunk-Y5HBN75E.js → chunk-KQ6R5EWR.js} +42 -26
  28. package/dist/chunks/chunk-KQ6R5EWR.js.map +7 -0
  29. package/dist/chunks/{chunk-BDNV6QMJ.js → chunk-LOLCTWJF.js} +4 -4
  30. package/dist/chunks/{chunk-4HJNG5LT.js → chunk-M5IN6DMF.js} +6 -6
  31. package/dist/chunks/{chunk-WHARRF3O.js → chunk-M6IRQ3QT.js} +2 -2
  32. package/dist/chunks/{chunk-EMEWYTSW.js → chunk-OVBKQCYL.js} +2 -2
  33. package/dist/chunks/{chunk-IUQZF2WF.js → chunk-PYFJW3HC.js} +14 -14
  34. package/dist/chunks/chunk-PYFJW3HC.js.map +7 -0
  35. package/dist/chunks/{chunk-OUHI3ULH.js → chunk-PYQM7KPL.js} +2 -2
  36. package/dist/chunks/{chunk-L5LSY3Q6.js → chunk-QLFDPXK7.js} +25 -2
  37. package/dist/chunks/chunk-QLFDPXK7.js.map +7 -0
  38. package/dist/chunks/{chunk-62XUR6SO.js → chunk-QY7YK7M6.js} +2 -2
  39. package/dist/chunks/{chunk-5EPMKW2B.js → chunk-R5F6CHW2.js} +5 -5
  40. package/dist/chunks/{chunk-5EPMKW2B.js.map → chunk-R5F6CHW2.js.map} +1 -1
  41. package/dist/chunks/{chunk-MXONM47J.js → chunk-S3IRPDSO.js} +2 -2
  42. package/dist/chunks/{chunk-J4A3LL6Y.js → chunk-T5CU2GPZ.js} +4 -4
  43. package/dist/chunks/{chunk-4PS6ZPCS.js → chunk-U2UBUKNQ.js} +135 -135
  44. package/dist/chunks/chunk-U2UBUKNQ.js.map +7 -0
  45. package/dist/chunks/{chunk-57Q66QHO.js → chunk-VON4TSO3.js} +13 -10
  46. package/dist/chunks/chunk-VON4TSO3.js.map +7 -0
  47. package/dist/chunks/{chunk-YFL34TLP.js → chunk-VPRJOD4Y.js} +4 -4
  48. package/dist/chunks/{chunk-QABAX5PC.js → chunk-WLLXKS6I.js} +2 -2
  49. package/dist/chunks/{chunk-YJ6NRP2F.js → chunk-WREA4RNR.js} +3 -3
  50. package/dist/chunks/{chunk-23QOLJTO.js → chunk-WYUV6WL3.js} +2 -2
  51. package/dist/chunks/{chunk-QYTIKI7L.js → chunk-X2TRSE7D.js} +2 -2
  52. package/dist/chunks/{chunk-CI2MKLNG.js → chunk-YYSZBD7S.js} +16 -265
  53. package/dist/chunks/chunk-YYSZBD7S.js.map +7 -0
  54. package/dist/chunks/{chunk-AMZEU2WR.js → chunk-ZXKYU6CH.js} +2 -2
  55. package/dist/cli/decisions.js +1 -1
  56. package/dist/cli/mesh.js +2 -2
  57. package/dist/commands/fabric.d.ts.map +1 -1
  58. package/dist/compaction/hook.js +6 -6
  59. package/dist/compaction/owner.js +7 -7
  60. package/dist/components/configuration.js +2 -2
  61. package/dist/config.d.ts +4 -0
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/core/action-registry.js +6 -6
  64. package/dist/core/provider-operations.js.map +1 -1
  65. package/dist/entropy/index.js +9 -8
  66. package/dist/execution-service.d.ts.map +1 -1
  67. package/dist/extension-bootstrap.d.ts +7 -0
  68. package/dist/extension-bootstrap.d.ts.map +1 -0
  69. package/dist/extension-bootstrap.js +51 -0
  70. package/dist/extension-bootstrap.js.map +7 -0
  71. package/dist/extension.d.ts +8 -0
  72. package/dist/extension.d.ts.map +1 -0
  73. package/dist/fabric-runtime-state.js +85 -64
  74. package/dist/fabric-runtime-state.js.map +2 -2
  75. package/dist/index.d.ts +5 -6
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +44 -6429
  78. package/dist/index.js.map +4 -4
  79. package/dist/jev/observation.js +5 -5
  80. package/dist/jev.js +8 -8
  81. package/dist/memory/digest.js +2 -2
  82. package/dist/memory/discovery.js +6 -6
  83. package/dist/memory/file-worker.js +9 -9
  84. package/dist/memory/normalize.js +5 -5
  85. package/dist/memory/search.js +7 -7
  86. package/dist/memory/worker-provider.js +10 -10
  87. package/dist/memory.js +10 -10
  88. package/dist/providers/jev-provider.js +8 -8
  89. package/dist/providers/memory-provider.js +9 -9
  90. package/dist/providers/pi-tools-provider.d.ts.map +1 -1
  91. package/dist/residency/host.js +14 -14
  92. package/dist/residency/pi-entry.js +14 -14
  93. package/dist/runtime/cpython-child-source.d.ts.map +1 -1
  94. package/dist/runtime/cpython-runtime.d.ts.map +1 -1
  95. package/dist/runtime/cpython-runtime.js +34 -6
  96. package/dist/runtime/cpython-runtime.js.map +2 -2
  97. package/dist/runtime/deadline-pause.d.ts +26 -0
  98. package/dist/runtime/deadline-pause.d.ts.map +1 -0
  99. package/dist/runtime/kernel.d.ts +3 -0
  100. package/dist/runtime/kernel.d.ts.map +1 -1
  101. package/dist/runtime/monty-runtime.d.ts.map +1 -1
  102. package/dist/runtime/monty-runtime.js +25 -4
  103. package/dist/runtime/monty-runtime.js.map +2 -2
  104. package/dist/runtime/node-process-runtime.d.ts.map +1 -1
  105. package/dist/runtime/node-process-runtime.js +3 -2
  106. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  107. package/dist/runtime/quickjs-runtime.js +2 -1
  108. package/dist/runtime/typescript-kernel.js +3 -2
  109. package/dist/runtime/typescript-kernel.js.map +1 -1
  110. package/dist/storage/retention.d.ts +7 -0
  111. package/dist/storage/retention.d.ts.map +1 -1
  112. package/dist/ui/conversation.js +4 -4
  113. package/dist/ui/dashboard.js +4 -4
  114. package/dist/ui/settings-sections-execution.d.ts.map +1 -1
  115. package/dist/ui/settings.js +9 -1
  116. package/dist/ui/settings.js.map +2 -2
  117. package/dist/verified/generated/authority-kernel.js +1 -1
  118. package/dist/verified/generated/kernel.js +1 -1
  119. package/dist/verified/generated/lifecycle-kernel.js +1 -1
  120. package/dist/verified/generated/manifest.json +7 -7
  121. package/dist/verified/generated/provider-kernel.js +1 -1
  122. package/dist/verified/generated/storage-kernel.js +1 -1
  123. package/docs/configuration.md +12 -1
  124. package/docs/kitty-images.md +3 -3
  125. package/docs/provider-capabilities.md +1 -1
  126. package/docs/verified-kernels.md +1 -1
  127. package/package.json +2 -2
  128. package/scripts/test-verified-kernels.mjs +1 -1
  129. package/scripts/verified-kernels.mjs +1 -1
  130. package/dist/chunks/chunk-4PS6ZPCS.js.map +0 -7
  131. package/dist/chunks/chunk-57Q66QHO.js.map +0 -7
  132. package/dist/chunks/chunk-BXYWRMBE.js.map +0 -7
  133. package/dist/chunks/chunk-CI2MKLNG.js.map +0 -7
  134. package/dist/chunks/chunk-IUQZF2WF.js.map +0 -7
  135. package/dist/chunks/chunk-L5LSY3Q6.js.map +0 -7
  136. package/dist/chunks/chunk-UVYTLBS7.js.map +0 -7
  137. package/dist/chunks/chunk-Y5HBN75E.js.map +0 -7
  138. /package/dist/chunks/{chunk-ZLWJ3T75.js.map → chunk-3KDUMDPZ.js.map} +0 -0
  139. /package/dist/chunks/{chunk-57CMH4SW.js.map → chunk-7JU7Z4XQ.js.map} +0 -0
  140. /package/dist/chunks/{chunk-SV7ONATB.js.map → chunk-7XRUMDV7.js.map} +0 -0
  141. /package/dist/chunks/{chunk-WYRBDPPM.js.map → chunk-ABJCSNZO.js.map} +0 -0
  142. /package/dist/chunks/{chunk-QM4IAKBX.js.map → chunk-BVJBYFHD.js.map} +0 -0
  143. /package/dist/chunks/{chunk-SS7FVARK.js.map → chunk-C7EEG6SM.js.map} +0 -0
  144. /package/dist/chunks/{chunk-UAP4EDZQ.js.map → chunk-DZ4WN5XJ.js.map} +0 -0
  145. /package/dist/chunks/{chunk-V7R3NVOS.js.map → chunk-GJVPP3NN.js.map} +0 -0
  146. /package/dist/chunks/{chunk-BDNV6QMJ.js.map → chunk-LOLCTWJF.js.map} +0 -0
  147. /package/dist/chunks/{chunk-4HJNG5LT.js.map → chunk-M5IN6DMF.js.map} +0 -0
  148. /package/dist/chunks/{chunk-WHARRF3O.js.map → chunk-M6IRQ3QT.js.map} +0 -0
  149. /package/dist/chunks/{chunk-EMEWYTSW.js.map → chunk-OVBKQCYL.js.map} +0 -0
  150. /package/dist/chunks/{chunk-OUHI3ULH.js.map → chunk-PYQM7KPL.js.map} +0 -0
  151. /package/dist/chunks/{chunk-62XUR6SO.js.map → chunk-QY7YK7M6.js.map} +0 -0
  152. /package/dist/chunks/{chunk-MXONM47J.js.map → chunk-S3IRPDSO.js.map} +0 -0
  153. /package/dist/chunks/{chunk-J4A3LL6Y.js.map → chunk-T5CU2GPZ.js.map} +0 -0
  154. /package/dist/chunks/{chunk-YFL34TLP.js.map → chunk-VPRJOD4Y.js.map} +0 -0
  155. /package/dist/chunks/{chunk-QABAX5PC.js.map → chunk-WLLXKS6I.js.map} +0 -0
  156. /package/dist/chunks/{chunk-YJ6NRP2F.js.map → chunk-WREA4RNR.js.map} +0 -0
  157. /package/dist/chunks/{chunk-23QOLJTO.js.map → chunk-WYUV6WL3.js.map} +0 -0
  158. /package/dist/chunks/{chunk-QYTIKI7L.js.map → chunk-X2TRSE7D.js.map} +0 -0
  159. /package/dist/chunks/{chunk-AMZEU2WR.js.map → chunk-ZXKYU6CH.js.map} +0 -0
@@ -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,7 +1,7 @@
1
1
  import {
2
2
  AGENTS_ACTION_DESCRIPTORS,
3
3
  normalizeAgentRunRequest
4
- } from "./chunks/chunk-V7R3NVOS.js";
4
+ } from "./chunks/chunk-GJVPP3NN.js";
5
5
  import {
6
6
  validateAgentResult
7
7
  } from "./chunks/chunk-3QECYQGA.js";
@@ -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": "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",
6
6
  "names": ["version", "key"]
7
7
  }
@@ -8,10 +8,10 @@ import {
8
8
  agentParticipantRecords,
9
9
  loadModelUsage,
10
10
  useBudgetLedger
11
- } from "./chunk-Y5HBN75E.js";
11
+ } from "./chunk-KQ6R5EWR.js";
12
12
  import {
13
13
  MeshStore
14
- } from "./chunk-25LXRT3G.js";
14
+ } from "./chunk-3GJJG2FV.js";
15
15
  import {
16
16
  launchScope
17
17
  } from "./chunk-JKQARSWR.js";
@@ -815,4 +815,4 @@ export {
815
815
  residentIdleDecision,
816
816
  runResidentHostFromConfigPath
817
817
  };
818
- //# sourceMappingURL=chunk-ZLWJ3T75.js.map
818
+ //# sourceMappingURL=chunk-3KDUMDPZ.js.map
@@ -2,7 +2,10 @@ import {
2
2
  createGuestStackMap,
3
3
  guestSetupSource,
4
4
  remapGuestErrorText
5
- } from "./chunk-L5LSY3Q6.js";
5
+ } from "./chunk-QLFDPXK7.js";
6
+ import {
7
+ HumanWaitDeadlinePause
8
+ } from "./chunk-7QKKLBHJ.js";
6
9
  import {
7
10
  transpileFabricCodeWithSourceMap
8
11
  } from "./chunk-N5GUXC6F.js";
@@ -237,6 +240,7 @@ var NodeProcessRuntime = class {
237
240
  };
238
241
  const scheduleDeadline = () => {
239
242
  clearTimeout(deadline);
243
+ if (settled || finishing || !Number.isFinite(deadlineAt)) return;
240
244
  deadline = setTimeout(() => {
241
245
  const error = `Execution timed out after ${effectiveTimeoutMs}ms`;
242
246
  finish({ value: void 0, logs: [], terminationReason: "timed_out", error });
@@ -246,12 +250,27 @@ var NodeProcessRuntime = class {
246
250
  const extendDeadline = (ref, args) => {
247
251
  const requested = options.minimumTimeoutMsForHostCall?.(ref, args);
248
252
  if (typeof requested !== "number" || !Number.isFinite(requested)) return;
253
+ if (humanWait.paused) {
254
+ humanWait.raise(requested);
255
+ return;
256
+ }
249
257
  const nextDeadlineAt = Date.now() + Math.max(1, Math.floor(requested));
250
258
  if (nextDeadlineAt <= deadlineAt) return;
251
259
  deadlineAt = nextDeadlineAt;
252
260
  effectiveTimeoutMs = deadlineAt - startedAt;
253
261
  scheduleDeadline();
254
262
  };
263
+ const humanWait = new HumanWaitDeadlinePause({
264
+ remainingMs: () => deadlineAt - Date.now(),
265
+ suspend: () => {
266
+ clearTimeout(deadline);
267
+ deadlineAt = Infinity;
268
+ },
269
+ resume: (remainingMs) => {
270
+ deadlineAt = Date.now() + remainingMs;
271
+ scheduleDeadline();
272
+ }
273
+ });
255
274
  abortHandler = () => {
256
275
  finish({
257
276
  value: void 0,
@@ -308,10 +327,14 @@ var NodeProcessRuntime = class {
308
327
  });
309
328
  return;
310
329
  }
330
+ const waitsForHuman = options.isHumanWaitHostCall?.(message.ref, message.args) === true;
331
+ if (waitsForHuman) humanWait.enter();
311
332
  const task = runAbortable(
312
333
  hostAbortController.signal,
313
334
  () => hostCall(message.ref, message.args, hostAbortController.signal)
314
- ).then(
335
+ ).finally(() => {
336
+ if (waitsForHuman) humanWait.leave();
337
+ }).then(
315
338
  (value) => send(child, { type: "response", id: message.id, ok: true, value }),
316
339
  (error) => send(child, {
317
340
  type: "response",
@@ -364,4 +387,4 @@ export {
364
387
  NodeProcessRuntime,
365
388
  BunProcessRuntime
366
389
  };
367
- //# sourceMappingURL=chunk-BXYWRMBE.js.map
390
+ //# sourceMappingURL=chunk-5MNLVHF5.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/runtime/node-process-runtime.ts", "../../src/runtime/node-process-child-source.ts"],
4
+ "sourcesContent": ["import { spawn, type ChildProcess } from \"node:child_process\";\nimport { runAbortable, settleWithin } from \"../async-settlement.js\";\nimport { piBashExitMetadata } from \"../core/pi-bash-error.js\";\nimport { isPiShellRef } from \"../core/pi-tools.js\";\nimport { HumanWaitDeadlinePause } from \"./deadline-pause.js\";\nimport { guestSetupSource } from \"./quickjs-runtime.js\";\nimport type { FabricHostCall, FabricSandboxOptions, FabricSandboxResult } from \"./kernel.js\";\nimport { NODE_PROCESS_CHILD_SOURCE } from \"./node-process-child-source.js\";\nimport { createGuestStackMap, remapGuestErrorText } from \"./guest-stack-map.js\";\nimport { transpileFabricCodeWithSourceMap } from \"./type-checker.js\";\nimport {\n resolveScriptRuntime,\n resolveScriptRuntimeSync,\n} from \"../agents/transports/process-utils.js\";\n\ninterface ChildCallMessage {\n type: \"call\";\n id: number;\n ref: string;\n args: Record<string, unknown>;\n}\n\ninterface ChildResultMessage {\n type: \"result\";\n result: FabricSandboxResult;\n}\n\ntype ChildMessage = ChildCallMessage | ChildResultMessage;\n\nconst HOST_TASK_SETTLE_GRACE_MS = 250;\n\nconst send = (child: ChildProcess, message: any): void => {\n if (!child.connected) return;\n child.send(message, () => undefined);\n};\n\nexport class NodeProcessRuntime {\n readonly #interpreter: \"node\" | \"bun\";\n\n constructor(interpreter: \"node\" | \"bun\" = \"node\") {\n this.#interpreter = interpreter;\n }\n\n async execute(\n code: string,\n hostCall: FabricHostCall,\n options: FabricSandboxOptions,\n ): Promise<FabricSandboxResult> {\n if (options.signal?.aborted) {\n return {\n value: undefined,\n logs: [],\n terminationReason: \"aborted\",\n error: \"Execution cancelled\",\n };\n }\n if (!Number.isSafeInteger(options.memoryLimitBytes) || options.memoryLimitBytes < 1) {\n return {\n value: undefined,\n logs: [],\n terminationReason: \"runtime_error\",\n error: \"Process memory limit must be a positive safe integer\",\n };\n }\n if (!Number.isFinite(options.timeoutMs) || options.timeoutMs < 1) {\n return {\n value: undefined,\n logs: [],\n terminationReason: \"runtime_error\",\n error: \"Process timeout must be positive\",\n };\n }\n\n // Bun evaluates --eval input as ESM and ignores V8 heap flags, so the\n // Bun child gets the guest source bare; Node needs the module + heap flags.\n // Bun resolution stays async: Pi may legitimately run under Node while bun\n // is only available on PATH, and the sync variant does no PATH lookup.\n const runtimeOptions = this.#interpreter === \"bun\" ? { requireBun: true } : { requireNode: true };\n const interpreterPath = this.#interpreter === \"bun\"\n ? await resolveScriptRuntime(runtimeOptions)\n : resolveScriptRuntimeSync(runtimeOptions);\n const child = spawn(\n interpreterPath,\n this.#interpreter === \"bun\"\n ? [\"--eval\", NODE_PROCESS_CHILD_SOURCE]\n : [\n // Guest import() through importModuleDynamically needs the vm\n // modules flag; Bun's vm ignores the option (see __fabricImport).\n \"--experimental-vm-modules\",\n `--max-old-space-size=${Math.max(16, Math.floor(options.memoryLimitBytes / (1024 * 1024)))}`,\n \"--input-type=module\",\n \"--eval\",\n NODE_PROCESS_CHILD_SOURCE,\n ],\n { stdio: [\"ignore\", \"ignore\", \"ignore\", \"ipc\"] },\n );\n // Bun resolution is async, so the signal may have aborted while resolving.\n if (options.signal?.aborted) {\n return {\n value: undefined,\n logs: [],\n terminationReason: \"aborted\",\n error: \"Execution cancelled\",\n };\n }\n const hostAbortController = new AbortController();\n const startedAt = Date.now();\n let effectiveTimeoutMs = options.timeoutMs;\n let deadlineAt = startedAt + effectiveTimeoutMs;\n let deadline: NodeJS.Timeout | undefined;\n let abortHandler: (() => void) | undefined;\n let settled = false;\n let finishing = false;\n const hostTasks = new Set<Promise<void>>();\n\n const guestBundle = options.transpiledCode === undefined\n ? transpileFabricCodeWithSourceMap(code)\n : { code: options.transpiledCode, sourceMap: options.transpiledSourceMap };\n const guestStackMap = createGuestStackMap(guestBundle.sourceMap);\n const guestLineCount = guestBundle.code.split(\"\\n\").length;\n\n return new Promise<FabricSandboxResult>((resolve) => {\n const finish = (result: FabricSandboxResult): void => {\n if (settled) return;\n settled = true;\n if (deadline) clearTimeout(deadline);\n if (abortHandler) options.signal?.removeEventListener(\"abort\", abortHandler);\n if (!hostAbortController.signal.aborted && hostTasks.size > 0) {\n hostAbortController.abort(new Error(result.error ?? \"Process execution stopped\"));\n }\n child.removeAllListeners();\n if (child.connected) child.disconnect();\n if (child.exitCode === null && child.signalCode === null) child.kill(\"SIGKILL\");\n resolve(result);\n };\n const scheduleDeadline = (): void => {\n clearTimeout(deadline);\n if (settled || finishing || !Number.isFinite(deadlineAt)) return;\n deadline = setTimeout(() => {\n const error = `Execution timed out after ${effectiveTimeoutMs}ms`;\n finish({ value: undefined, logs: [], terminationReason: \"timed_out\", error });\n }, Math.min(2_147_483_647, Math.max(0, deadlineAt - Date.now())));\n deadline.unref?.();\n };\n const extendDeadline = (ref: string, args: Record<string, unknown>): void => {\n const requested = options.minimumTimeoutMsForHostCall?.(ref, args);\n if (typeof requested !== \"number\" || !Number.isFinite(requested)) return;\n if (humanWait.paused) {\n humanWait.raise(requested);\n return;\n }\n const nextDeadlineAt = Date.now() + Math.max(1, Math.floor(requested));\n if (nextDeadlineAt <= deadlineAt) return;\n deadlineAt = nextDeadlineAt;\n effectiveTimeoutMs = deadlineAt - startedAt;\n scheduleDeadline();\n };\n\n const humanWait = new HumanWaitDeadlinePause({\n remainingMs: () => deadlineAt - Date.now(),\n suspend: () => {\n clearTimeout(deadline);\n deadlineAt = Infinity;\n },\n resume: (remainingMs) => {\n deadlineAt = Date.now() + remainingMs;\n scheduleDeadline();\n },\n });\n\n abortHandler = () => {\n finish({\n value: undefined,\n logs: [],\n terminationReason: \"aborted\",\n error: \"Execution cancelled\",\n });\n };\n options.signal?.addEventListener(\"abort\", abortHandler, { once: true });\n\n child.on(\"message\", (raw: unknown) => {\n if (settled || finishing || typeof raw !== \"object\" || raw === null) return;\n const message = raw as ChildMessage;\n if (message.type === \"result\") {\n finishing = true;\n if (deadline) clearTimeout(deadline);\n if (message.result.terminationReason !== \"completed\" && !hostAbortController.signal.aborted) {\n hostAbortController.abort(new Error(message.result.error ?? \"Process execution stopped\"));\n }\n void (async () => {\n const completed = await settleWithin(hostTasks, HOST_TASK_SETTLE_GRACE_MS);\n if (!completed && !hostAbortController.signal.aborted) {\n hostAbortController.abort(\n new Error(\"Fabric guest execution ended before its host calls settled\"),\n );\n await settleWithin(hostTasks, HOST_TASK_SETTLE_GRACE_MS);\n }\n finish(\n message.result.error === undefined\n ? message.result\n : {\n ...message.result,\n error: remapGuestErrorText(message.result.error, guestStackMap, guestLineCount),\n },\n );\n })();\n return;\n }\n if (message.type !== \"call\") return;\n extendDeadline(message.ref, message.args);\n if (message.ref === \"fabric.$timer\") {\n const ms = Math.max(0, Number(message.args?.ms ?? 0));\n let timer: NodeJS.Timeout | undefined;\n const timerTask = new Promise<void>((resolveTask) => {\n timer = setTimeout(() => {\n if (!settled && !finishing) {\n send(child, { type: \"response\", id: message.id, ok: true, value: undefined });\n }\n resolveTask();\n }, ms);\n timer!.unref?.();\n });\n hostTasks.add(timerTask);\n void timerTask.finally(() => {\n hostTasks.delete(timerTask);\n if (timer) clearTimeout(timer);\n });\n return;\n }\n const waitsForHuman = options.isHumanWaitHostCall?.(message.ref, message.args) === true;\n if (waitsForHuman) humanWait.enter();\n const task = runAbortable(hostAbortController.signal, () =>\n hostCall(message.ref, message.args, hostAbortController.signal),\n ).finally(() => {\n if (waitsForHuman) humanWait.leave();\n }).then(\n (value) => send(child, { type: \"response\", id: message.id, ok: true, value }),\n (error) =>\n send(child, {\n type: \"response\",\n id: message.id,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n bashExit: isPiShellRef(message.ref) ? piBashExitMetadata(error) : undefined,\n }),\n );\n hostTasks.add(task);\n void task.finally(() => hostTasks.delete(task));\n });\n child.once(\"error\", (error) => {\n finish({\n value: undefined,\n logs: [],\n terminationReason: \"runtime_error\",\n error: `Process executor failed: ${error.message}`,\n });\n });\n child.once(\"exit\", (exitCode, signal) => {\n if (settled) return;\n const detail = signal ? `signal ${signal}` : `exit code ${exitCode ?? \"unknown\"}`;\n finish({\n value: undefined,\n logs: [],\n terminationReason: \"runtime_error\",\n error: `Process executor exited before returning a result (${detail}); it may have exceeded its memory limit`,\n });\n });\n\n scheduleDeadline();\n send(child, {\n type: \"execute\",\n setup: guestSetupSource(options.piToolCanonicalFields),\n code: guestBundle.code,\n strings: options.strings ?? {},\n tokenBudget: options.tokenBudget,\n maxLogChars: options.maxLogChars ?? 100_000,\n });\n });\n }\n}\n\nexport class BunProcessRuntime extends NodeProcessRuntime {\n constructor() {\n super(\"bun\");\n }\n}\n", "export const NODE_PROCESS_CHILD_SOURCE = String.raw`\nimport vm from \"node:vm\";\n\nconst pending = new Map();\nlet nextCallId = 0;\n\nconst send = (message) => {\n if (process.connected) process.send?.(message);\n};\n\nconst formatValue = (value) => {\n if (typeof value === \"string\") return value;\n if (value instanceof Error) return value.stack ?? value.message;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nconst jsonCompatible = (value) => {\n if (value === undefined) return undefined;\n const serialized = JSON.stringify(value);\n return serialized === undefined ? undefined : JSON.parse(serialized);\n};\n\nconst run = async (message) => {\n const logs = [];\n let logChars = 0;\n let logsTruncated = false;\n const hostCall = (ref, args) => {\n const id = nextCallId++;\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject });\n send({\n type: \"call\",\n id,\n ref: String(ref),\n args:\n typeof args === \"object\" && args !== null && !Array.isArray(args)\n ? args\n : {},\n });\n });\n };\n const print = (...values) => {\n if (logsTruncated) return;\n const line = values.map(formatValue).join(\" \");\n const remaining = message.maxLogChars - logChars;\n if (line.length > remaining) {\n if (remaining > 0) logs.push(line.slice(0, remaining));\n logs.push(\"[Pi Fabric log output truncated]\");\n logsTruncated = true;\n return;\n }\n logs.push(line);\n logChars += line.length;\n };\n\n // Bun module namespace for the guest. The child resolves the specifier in\n // its own module context; under the node runtime it fails and the binding\n // stays undefined. Namespace objects come from this realm, so instanceof\n // against guest-realm classes fails (same caveat as other sandbox bridges).\n const __bun = await import(\"bun\").catch(() => undefined);\n const sandbox = {\n __fabricHostCall: hostCall,\n __fabricTokenBudget: message.tokenBudget ?? Number.POSITIVE_INFINITY,\n // Native-module bridge for guests whose vm lacks the dynamic-import\n // callback. Bun >= 1.4 honors importModuleDynamically on runInContext\n // (natural import() works there), so this is mostly a fallback and an\n // explicit escape hatch. Cross-realm caveat: namespaces come from this\n // realm, so instanceof against guest-realm classes fails.\n __fabricImport: (specifier) => import(specifier),\n // Resolved above; undefined under the node runtime.\n __bun,\n print,\n \u03C0: jsonCompatible(message.strings),\n };\n const context = vm.createContext(sandbox, {\n name: \"pi-fabric-node-process\",\n codeGeneration: { strings: true, wasm: false },\n });\n\n try {\n vm.runInContext(message.setup, context, { filename: \"pi-fabric-setup.js\" });\n const promise = vm.runInContext(message.code + \"\\n__piFabricMain()\", context, {\n filename: \"pi-fabric-guest.js\",\n // Node requires --experimental-vm-modules (set at spawn). Bun >= 1.4\n // honors this option on runInContext (unlike on createContext), so\n // natural guest import() works there; __fabricImport is a fallback.\n importModuleDynamically: (specifier) => import(specifier),\n });\n const value = jsonCompatible(await promise);\n send({ type: \"result\", result: { value, logs, terminationReason: \"completed\" } });\n } catch (error) {\n send({\n type: \"result\",\n result: {\n logs,\n terminationReason: \"runtime_error\",\n error: error?.stack ?? error?.message ?? String(error),\n },\n });\n }\n};\n\nprocess.on(\"message\", (message) => {\n if (typeof message !== \"object\" || message === null) return;\n if (message.type === \"execute\") {\n void run(message);\n return;\n }\n if (message.type !== \"response\") return;\n const operation = pending.get(message.id);\n if (!operation) return;\n pending.delete(message.id);\n if (message.ok) operation.resolve(message.value);\n else {\n const error = new Error(message.error ?? \"Host call failed\");\n if (message.bashExit) error.__fabricBashExit = message.bashExit;\n operation.reject(error);\n }\n});\n`;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }