pi-fabric 0.104.2 → 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.
- package/THIRD_PARTY_NOTICES.md +2 -2
- package/dist/agents.js +3 -3
- package/dist/chunks/chunk-2Y24ML7H.js +115 -0
- package/dist/chunks/chunk-2Y24ML7H.js.map +7 -0
- package/dist/chunks/{chunk-25LXRT3G.js → chunk-3GJJG2FV.js} +1 -1
- package/dist/chunks/{chunk-25LXRT3G.js.map → chunk-3GJJG2FV.js.map} +1 -1
- package/dist/chunks/{chunk-ZLWJ3T75.js → chunk-3KDUMDPZ.js} +3 -3
- package/dist/chunks/{chunk-BXYWRMBE.js → chunk-5MNLVHF5.js} +26 -3
- package/dist/chunks/chunk-5MNLVHF5.js.map +7 -0
- package/dist/chunks/chunk-6VXPACGC.js +6490 -0
- package/dist/chunks/chunk-6VXPACGC.js.map +7 -0
- package/dist/chunks/{chunk-57CMH4SW.js → chunk-7JU7Z4XQ.js} +2 -2
- package/dist/chunks/chunk-7QKKLBHJ.js +33 -0
- package/dist/chunks/chunk-7QKKLBHJ.js.map +7 -0
- package/dist/chunks/{chunk-SV7ONATB.js → chunk-7XRUMDV7.js} +2 -2
- package/dist/chunks/{chunk-WYRBDPPM.js → chunk-ABJCSNZO.js} +2 -2
- package/dist/chunks/chunk-B2Y4364O.js +78 -0
- package/dist/chunks/chunk-B2Y4364O.js.map +7 -0
- package/dist/chunks/{chunk-QM4IAKBX.js → chunk-BVJBYFHD.js} +2 -2
- package/dist/chunks/{chunk-SS7FVARK.js → chunk-C7EEG6SM.js} +2 -2
- package/dist/chunks/{chunk-HOX6VW45.js → chunk-CYMDX3XP.js} +1 -1
- package/dist/chunks/{chunk-HOX6VW45.js.map → chunk-CYMDX3XP.js.map} +1 -1
- package/dist/chunks/chunk-DK35W6U7.js +259 -0
- package/dist/chunks/chunk-DK35W6U7.js.map +7 -0
- package/dist/chunks/{chunk-UAP4EDZQ.js → chunk-DZ4WN5XJ.js} +3 -3
- package/dist/chunks/{chunk-VZQYLEND.js → chunk-FB24AOIJ.js} +35 -33
- package/dist/chunks/{chunk-VZQYLEND.js.map → chunk-FB24AOIJ.js.map} +1 -1
- package/dist/chunks/{chunk-V7R3NVOS.js → chunk-GJVPP3NN.js} +2 -2
- package/dist/chunks/{chunk-UVYTLBS7.js → chunk-GYPDGW27.js} +89 -89
- package/dist/chunks/chunk-GYPDGW27.js.map +7 -0
- package/dist/chunks/{chunk-Y5HBN75E.js → chunk-KQ6R5EWR.js} +42 -26
- package/dist/chunks/chunk-KQ6R5EWR.js.map +7 -0
- package/dist/chunks/{chunk-BDNV6QMJ.js → chunk-LOLCTWJF.js} +4 -4
- package/dist/chunks/{chunk-4HJNG5LT.js → chunk-M5IN6DMF.js} +6 -6
- package/dist/chunks/{chunk-WHARRF3O.js → chunk-M6IRQ3QT.js} +2 -2
- package/dist/chunks/{chunk-EMEWYTSW.js → chunk-OVBKQCYL.js} +2 -2
- package/dist/chunks/{chunk-IUQZF2WF.js → chunk-PYFJW3HC.js} +14 -14
- package/dist/chunks/chunk-PYFJW3HC.js.map +7 -0
- package/dist/chunks/{chunk-OUHI3ULH.js → chunk-PYQM7KPL.js} +2 -2
- package/dist/chunks/{chunk-L5LSY3Q6.js → chunk-QLFDPXK7.js} +25 -2
- package/dist/chunks/chunk-QLFDPXK7.js.map +7 -0
- package/dist/chunks/{chunk-62XUR6SO.js → chunk-QY7YK7M6.js} +2 -2
- package/dist/chunks/{chunk-5EPMKW2B.js → chunk-R5F6CHW2.js} +5 -5
- package/dist/chunks/{chunk-5EPMKW2B.js.map → chunk-R5F6CHW2.js.map} +1 -1
- package/dist/chunks/{chunk-MXONM47J.js → chunk-S3IRPDSO.js} +2 -2
- package/dist/chunks/{chunk-J4A3LL6Y.js → chunk-T5CU2GPZ.js} +4 -4
- package/dist/chunks/{chunk-4PS6ZPCS.js → chunk-U2UBUKNQ.js} +135 -135
- package/dist/chunks/chunk-U2UBUKNQ.js.map +7 -0
- package/dist/chunks/{chunk-57Q66QHO.js → chunk-VON4TSO3.js} +13 -10
- package/dist/chunks/chunk-VON4TSO3.js.map +7 -0
- package/dist/chunks/{chunk-YFL34TLP.js → chunk-VPRJOD4Y.js} +4 -4
- package/dist/chunks/{chunk-QABAX5PC.js → chunk-WLLXKS6I.js} +2 -2
- package/dist/chunks/{chunk-YJ6NRP2F.js → chunk-WREA4RNR.js} +3 -3
- package/dist/chunks/{chunk-23QOLJTO.js → chunk-WYUV6WL3.js} +2 -2
- package/dist/chunks/{chunk-QYTIKI7L.js → chunk-X2TRSE7D.js} +2 -2
- package/dist/chunks/{chunk-CI2MKLNG.js → chunk-YYSZBD7S.js} +16 -265
- package/dist/chunks/chunk-YYSZBD7S.js.map +7 -0
- package/dist/chunks/{chunk-AMZEU2WR.js → chunk-ZXKYU6CH.js} +2 -2
- package/dist/cli/decisions.js +1 -1
- package/dist/cli/mesh.js +2 -2
- package/dist/commands/fabric.d.ts.map +1 -1
- package/dist/compaction/hook.js +6 -6
- package/dist/compaction/owner.js +7 -7
- package/dist/components/configuration.js +2 -2
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/core/action-registry.js +6 -6
- package/dist/core/provider-operations.js.map +1 -1
- package/dist/entropy/index.js +9 -8
- package/dist/execution-service.d.ts.map +1 -1
- package/dist/extension-bootstrap.d.ts +7 -0
- package/dist/extension-bootstrap.d.ts.map +1 -0
- package/dist/extension-bootstrap.js +51 -0
- package/dist/extension-bootstrap.js.map +7 -0
- package/dist/extension.d.ts +8 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/fabric-runtime-state.js +85 -64
- package/dist/fabric-runtime-state.js.map +2 -2
- package/dist/index.d.ts +5 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -6428
- package/dist/index.js.map +4 -4
- package/dist/jev/observation.js +5 -5
- package/dist/jev.js +8 -8
- package/dist/memory/digest.js +2 -2
- package/dist/memory/discovery.js +6 -6
- package/dist/memory/file-worker.js +9 -9
- package/dist/memory/normalize.js +5 -5
- package/dist/memory/search.js +7 -7
- package/dist/memory/worker-provider.js +10 -10
- package/dist/memory.js +10 -10
- package/dist/providers/jev-provider.js +8 -8
- package/dist/providers/memory-provider.js +9 -9
- package/dist/providers/pi-tools-provider.d.ts.map +1 -1
- package/dist/residency/host.js +14 -14
- package/dist/residency/pi-entry.js +14 -14
- package/dist/runtime/cpython-child-source.d.ts.map +1 -1
- package/dist/runtime/cpython-runtime.d.ts.map +1 -1
- package/dist/runtime/cpython-runtime.js +34 -6
- package/dist/runtime/cpython-runtime.js.map +2 -2
- package/dist/runtime/deadline-pause.d.ts +26 -0
- package/dist/runtime/deadline-pause.d.ts.map +1 -0
- package/dist/runtime/kernel.d.ts +3 -0
- package/dist/runtime/kernel.d.ts.map +1 -1
- package/dist/runtime/monty-runtime.d.ts.map +1 -1
- package/dist/runtime/monty-runtime.js +25 -4
- package/dist/runtime/monty-runtime.js.map +2 -2
- package/dist/runtime/node-process-runtime.d.ts.map +1 -1
- package/dist/runtime/node-process-runtime.js +3 -2
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +2 -1
- package/dist/runtime/typescript-kernel.js +3 -2
- package/dist/runtime/typescript-kernel.js.map +1 -1
- package/dist/storage/retention.d.ts +7 -0
- package/dist/storage/retention.d.ts.map +1 -1
- package/dist/ui/conversation-render.d.ts +2 -1
- package/dist/ui/conversation-render.d.ts.map +1 -1
- package/dist/ui/conversation-scrollbar.d.ts +1 -1
- package/dist/ui/conversation-scrollbar.d.ts.map +1 -1
- package/dist/ui/conversation-selection.d.ts +2 -2
- package/dist/ui/conversation-selection.d.ts.map +1 -1
- package/dist/ui/conversation.d.ts +1 -0
- package/dist/ui/conversation.d.ts.map +1 -1
- package/dist/ui/conversation.js +28 -14
- package/dist/ui/conversation.js.map +2 -2
- package/dist/ui/dashboard.js +4 -4
- package/dist/ui/image-overlays.d.ts +16 -0
- package/dist/ui/image-overlays.d.ts.map +1 -0
- package/dist/ui/image-overlays.js +10 -0
- package/dist/ui/image-overlays.js.map +7 -0
- package/dist/ui/kitty-viewport.d.ts +24 -0
- package/dist/ui/kitty-viewport.d.ts.map +1 -0
- package/dist/ui/settings-sections-execution.d.ts.map +1 -1
- package/dist/ui/settings.d.ts.map +1 -1
- package/dist/ui/settings.js +16 -5
- package/dist/ui/settings.js.map +2 -2
- package/dist/verified/generated/authority-kernel.js +1 -1
- package/dist/verified/generated/kernel.js +1 -1
- package/dist/verified/generated/lifecycle-kernel.js +1 -1
- package/dist/verified/generated/manifest.json +7 -7
- package/dist/verified/generated/provider-kernel.js +1 -1
- package/dist/verified/generated/storage-kernel.js +1 -1
- package/docs/configuration.md +12 -1
- package/docs/kitty-images.md +89 -0
- package/docs/provider-capabilities.md +1 -1
- package/docs/verified-kernels.md +1 -1
- package/package.json +3 -2
- package/scripts/test-verified-kernels.mjs +1 -1
- package/scripts/verified-kernels.mjs +1 -1
- package/dist/chunks/chunk-4PS6ZPCS.js.map +0 -7
- package/dist/chunks/chunk-57Q66QHO.js.map +0 -7
- package/dist/chunks/chunk-BXYWRMBE.js.map +0 -7
- package/dist/chunks/chunk-CI2MKLNG.js.map +0 -7
- package/dist/chunks/chunk-IUQZF2WF.js.map +0 -7
- package/dist/chunks/chunk-L5LSY3Q6.js.map +0 -7
- package/dist/chunks/chunk-UVYTLBS7.js.map +0 -7
- package/dist/chunks/chunk-Y5HBN75E.js.map +0 -7
- /package/dist/chunks/{chunk-ZLWJ3T75.js.map → chunk-3KDUMDPZ.js.map} +0 -0
- /package/dist/chunks/{chunk-57CMH4SW.js.map → chunk-7JU7Z4XQ.js.map} +0 -0
- /package/dist/chunks/{chunk-SV7ONATB.js.map → chunk-7XRUMDV7.js.map} +0 -0
- /package/dist/chunks/{chunk-WYRBDPPM.js.map → chunk-ABJCSNZO.js.map} +0 -0
- /package/dist/chunks/{chunk-QM4IAKBX.js.map → chunk-BVJBYFHD.js.map} +0 -0
- /package/dist/chunks/{chunk-SS7FVARK.js.map → chunk-C7EEG6SM.js.map} +0 -0
- /package/dist/chunks/{chunk-UAP4EDZQ.js.map → chunk-DZ4WN5XJ.js.map} +0 -0
- /package/dist/chunks/{chunk-V7R3NVOS.js.map → chunk-GJVPP3NN.js.map} +0 -0
- /package/dist/chunks/{chunk-BDNV6QMJ.js.map → chunk-LOLCTWJF.js.map} +0 -0
- /package/dist/chunks/{chunk-4HJNG5LT.js.map → chunk-M5IN6DMF.js.map} +0 -0
- /package/dist/chunks/{chunk-WHARRF3O.js.map → chunk-M6IRQ3QT.js.map} +0 -0
- /package/dist/chunks/{chunk-EMEWYTSW.js.map → chunk-OVBKQCYL.js.map} +0 -0
- /package/dist/chunks/{chunk-OUHI3ULH.js.map → chunk-PYQM7KPL.js.map} +0 -0
- /package/dist/chunks/{chunk-62XUR6SO.js.map → chunk-QY7YK7M6.js.map} +0 -0
- /package/dist/chunks/{chunk-MXONM47J.js.map → chunk-S3IRPDSO.js.map} +0 -0
- /package/dist/chunks/{chunk-J4A3LL6Y.js.map → chunk-T5CU2GPZ.js.map} +0 -0
- /package/dist/chunks/{chunk-YFL34TLP.js.map → chunk-VPRJOD4Y.js.map} +0 -0
- /package/dist/chunks/{chunk-QABAX5PC.js.map → chunk-WLLXKS6I.js.map} +0 -0
- /package/dist/chunks/{chunk-YJ6NRP2F.js.map → chunk-WREA4RNR.js.map} +0 -0
- /package/dist/chunks/{chunk-23QOLJTO.js.map → chunk-WYUV6WL3.js.map} +0 -0
- /package/dist/chunks/{chunk-QYTIKI7L.js.map → chunk-X2TRSE7D.js.map} +0 -0
- /package/dist/chunks/{chunk-AMZEU2WR.js.map → chunk-ZXKYU6CH.js.map} +0 -0
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -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.
|
|
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.
|
|
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-
|
|
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-
|
|
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-
|
|
25
|
+
import "./chunks/chunk-CYMDX3XP.js";
|
|
26
26
|
|
|
27
27
|
// src/agents/service-schema.ts
|
|
28
28
|
import { Value } from "typebox/value";
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// src/ui/kitty-viewport.ts
|
|
2
|
+
import { getPngDimensions } from "@earendil-works/pi-tui";
|
|
3
|
+
var isKittyImageLine = (line) => line.includes("\x1B_G");
|
|
4
|
+
var EMPTY_IMAGE_ROWS = /* @__PURE__ */ new Set();
|
|
5
|
+
var MAX_CROP_CACHE_BYTES = 16 * 1024 * 1024;
|
|
6
|
+
var MAX_CACHED_CROPS = 2;
|
|
7
|
+
function header(line) {
|
|
8
|
+
const start = line.indexOf("\x1B_G");
|
|
9
|
+
if (start < 0) return void 0;
|
|
10
|
+
const end = line.indexOf(";", start);
|
|
11
|
+
if (end < 0) return void 0;
|
|
12
|
+
const controls = line.slice(start + 3, end).split(",");
|
|
13
|
+
const rows = Number(controls.find((control) => control.startsWith("r="))?.slice(2));
|
|
14
|
+
if (!Number.isSafeInteger(rows) || rows <= 0) return void 0;
|
|
15
|
+
return { start, end, controls, rows };
|
|
16
|
+
}
|
|
17
|
+
var KittyViewport = class {
|
|
18
|
+
source;
|
|
19
|
+
images = [];
|
|
20
|
+
crops = /* @__PURE__ */ new Map();
|
|
21
|
+
cropBytes = 0;
|
|
22
|
+
clear() {
|
|
23
|
+
this.source = void 0;
|
|
24
|
+
this.images = [];
|
|
25
|
+
this.crops.clear();
|
|
26
|
+
this.cropBytes = 0;
|
|
27
|
+
}
|
|
28
|
+
slice(source, start, end) {
|
|
29
|
+
if (source !== this.source) {
|
|
30
|
+
this.clear();
|
|
31
|
+
this.source = source;
|
|
32
|
+
for (let row = 0; row < source.length; row++) {
|
|
33
|
+
const image = header(source[row]);
|
|
34
|
+
if (!image) continue;
|
|
35
|
+
this.images.push({ ...image, row, line: source[row] });
|
|
36
|
+
row += image.rows - 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const lines = source.slice(start, end);
|
|
40
|
+
if (!lines.length || !this.images.length) return { lines, imageRows: EMPTY_IMAGE_ROWS };
|
|
41
|
+
let low = 0;
|
|
42
|
+
let high = this.images.length;
|
|
43
|
+
while (low < high) {
|
|
44
|
+
const middle = low + high >>> 1;
|
|
45
|
+
const image = this.images[middle];
|
|
46
|
+
if (image.row + image.rows <= start) low = middle + 1;
|
|
47
|
+
else high = middle;
|
|
48
|
+
}
|
|
49
|
+
let imageRows;
|
|
50
|
+
for (let index = low; index < this.images.length; index++) {
|
|
51
|
+
const image = this.images[index];
|
|
52
|
+
if (image.row >= start + lines.length) break;
|
|
53
|
+
const row = Math.max(0, image.row - start);
|
|
54
|
+
const hidden = Math.max(0, start - image.row);
|
|
55
|
+
const visible = Math.min(image.rows - hidden, lines.length - row);
|
|
56
|
+
const line = this.crop(image, hidden, visible);
|
|
57
|
+
lines[row] = line;
|
|
58
|
+
if (!line) continue;
|
|
59
|
+
imageRows ??= /* @__PURE__ */ new Set();
|
|
60
|
+
for (let i = row; i < row + visible; i++) imageRows.add(i);
|
|
61
|
+
}
|
|
62
|
+
return { lines, imageRows: imageRows ?? EMPTY_IMAGE_ROWS };
|
|
63
|
+
}
|
|
64
|
+
crop(image, hidden, visible) {
|
|
65
|
+
if (hidden === 0 && visible === image.rows) return image.line;
|
|
66
|
+
const cached = this.crops.get(image);
|
|
67
|
+
if (cached?.hidden === hidden && cached.visible === visible) return cached.line;
|
|
68
|
+
if (image.heightPx === void 0) image.heightPx = getPngDimensions(image.line.slice(image.end + 1, image.end + 33))?.heightPx ?? null;
|
|
69
|
+
if (!image.heightPx || !image.controls.includes("f=100") || !image.controls.includes("a=T")) return "";
|
|
70
|
+
const sourceY = Math.floor(image.heightPx * hidden / image.rows);
|
|
71
|
+
const sourceEnd = Math.ceil(image.heightPx * (hidden + visible) / image.rows);
|
|
72
|
+
const controls = image.controls.filter((control) => !/^[yhr]=/.test(control));
|
|
73
|
+
controls.push(`y=${sourceY}`, `h=${Math.max(1, sourceEnd - sourceY)}`, `r=${visible}`);
|
|
74
|
+
const line = `${image.line.slice(0, image.start)}\x1B_G${controls.join(",")};${image.line.slice(image.end + 1)}`;
|
|
75
|
+
if (cached) {
|
|
76
|
+
this.cropBytes -= cached.bytes;
|
|
77
|
+
this.crops.delete(image);
|
|
78
|
+
}
|
|
79
|
+
const bytes = line.length * 2;
|
|
80
|
+
if (bytes <= MAX_CROP_CACHE_BYTES) {
|
|
81
|
+
while (this.crops.size >= MAX_CACHED_CROPS || this.cropBytes + bytes > MAX_CROP_CACHE_BYTES) {
|
|
82
|
+
const oldest = this.crops.keys().next().value;
|
|
83
|
+
this.cropBytes -= this.crops.get(oldest).bytes;
|
|
84
|
+
this.crops.delete(oldest);
|
|
85
|
+
}
|
|
86
|
+
this.crops.set(image, { hidden, visible, line, bytes });
|
|
87
|
+
this.cropBytes += bytes;
|
|
88
|
+
}
|
|
89
|
+
return line;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
function hideKittyImages(lines, viewportHeight = lines.length) {
|
|
93
|
+
const start = Math.max(0, lines.length - viewportHeight);
|
|
94
|
+
let result;
|
|
95
|
+
const hide = (row) => {
|
|
96
|
+
result ??= lines.slice();
|
|
97
|
+
result[row] = "";
|
|
98
|
+
};
|
|
99
|
+
for (let row = start; row < lines.length; row++) if (isKittyImageLine(lines[row])) hide(row);
|
|
100
|
+
for (let row = start - 1; row >= 0; row--) {
|
|
101
|
+
const line = lines[row];
|
|
102
|
+
if (line === "") continue;
|
|
103
|
+
const image = header(line);
|
|
104
|
+
if (image && row + image.rows > start) hide(row);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
return result ?? lines;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export {
|
|
111
|
+
isKittyImageLine,
|
|
112
|
+
KittyViewport,
|
|
113
|
+
hideKittyImages
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=chunk-2Y24ML7H.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/ui/kitty-viewport.ts"],
|
|
4
|
+
"sourcesContent": ["import { getPngDimensions } from \"@earendil-works/pi-tui\";\n\nexport const isKittyImageLine = (line: string): boolean => line.includes(\"\\x1b_G\");\nconst EMPTY_IMAGE_ROWS: ReadonlySet<number> = new Set<number>();\nconst MAX_CROP_CACHE_BYTES = 16 * 1024 * 1024;\nconst MAX_CACHED_CROPS = 2; // Only the top and bottom image can need cropping.\n\nfunction header(line: string) {\n const start = line.indexOf(\"\\x1b_G\");\n if (start < 0) return undefined;\n const end = line.indexOf(\";\", start);\n if (end < 0) return undefined;\n const controls = line.slice(start + 3, end).split(\",\");\n const rows = Number(controls.find((control) => control.startsWith(\"r=\"))?.slice(2));\n if (!Number.isSafeInteger(rows) || rows <= 0) return undefined;\n return { start, end, controls, rows };\n}\n\ntype ImageBlock = NonNullable<ReturnType<typeof header>> & { row: number; line: string; heightPx?: number | null };\ntype CachedCrop = { hidden: number; visible: number; line: string; bytes: number };\nexport interface KittyViewportFrame {\n lines: string[];\n /** Reserved rows must stay empty so Pi pre-clears them before placing pixels. */\n imageRows: ReadonlySet<number>;\n}\n\n/** Index immutable retained frames once. Scrolling then touches only the viewport\n * and its intersecting images, never a long run of offscreen blank reservations.\n * The two-entry, byte-bounded crop cache avoids rebuilding megabyte transmissions\n * on unchanged frames. No image data is decoded, uploaded or deleted here. */\nexport class KittyViewport {\n private source: readonly string[] | undefined;\n private images: ImageBlock[] = [];\n private readonly crops = new Map<ImageBlock, CachedCrop>();\n private cropBytes = 0;\n\n clear(): void {\n this.source = undefined;\n this.images = [];\n this.crops.clear();\n this.cropBytes = 0;\n }\n\n slice(source: readonly string[], start: number, end: number): KittyViewportFrame {\n if (source !== this.source) {\n this.clear();\n this.source = source;\n for (let row = 0; row < source.length; row++) {\n const image = header(source[row]!);\n if (!image) continue;\n this.images.push({ ...image, row, line: source[row]! });\n row += image.rows - 1;\n }\n }\n const lines = source.slice(start, end);\n if (!lines.length || !this.images.length) return { lines, imageRows: EMPTY_IMAGE_ROWS };\n let low = 0;\n let high = this.images.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n const image = this.images[middle]!;\n if (image.row + image.rows <= start) low = middle + 1;\n else high = middle;\n }\n let imageRows: Set<number> | undefined;\n for (let index = low; index < this.images.length; index++) {\n const image = this.images[index]!;\n if (image.row >= start + lines.length) break;\n const row = Math.max(0, image.row - start);\n const hidden = Math.max(0, start - image.row);\n const visible = Math.min(image.rows - hidden, lines.length - row);\n const line = this.crop(image, hidden, visible);\n lines[row] = line;\n if (!line) continue;\n imageRows ??= new Set<number>();\n for (let i = row; i < row + visible; i++) imageRows.add(i);\n }\n return { lines, imageRows: imageRows ?? EMPTY_IMAGE_ROWS };\n }\n\n private crop(image: ImageBlock, hidden: number, visible: number): string {\n if (hidden === 0 && visible === image.rows) return image.line;\n const cached = this.crops.get(image);\n if (cached?.hidden === hidden && cached.visible === visible) return cached.line;\n // Pi's f=100 transmission starts with a PNG header. Read only its first 32\n // base64 characters, not a second Pi installation's image metadata registry.\n if (image.heightPx === undefined) image.heightPx = getPngDimensions(image.line.slice(image.end + 1, image.end + 33))?.heightPx ?? null;\n if (!image.heightPx || !image.controls.includes(\"f=100\") || !image.controls.includes(\"a=T\")) return \"\";\n const sourceY = Math.floor(image.heightPx * hidden / image.rows);\n const sourceEnd = Math.ceil(image.heightPx * (hidden + visible) / image.rows);\n const controls = image.controls.filter((control) => !/^[yhr]=/.test(control));\n controls.push(`y=${sourceY}`, `h=${Math.max(1, sourceEnd - sourceY)}`, `r=${visible}`);\n const line = `${image.line.slice(0, image.start)}\\x1b_G${controls.join(\",\")};${image.line.slice(image.end + 1)}`;\n if (cached) {\n this.cropBytes -= cached.bytes;\n this.crops.delete(image);\n }\n const bytes = line.length * 2; // conservative UTF-16 storage budget\n if (bytes <= MAX_CROP_CACHE_BYTES) {\n while (this.crops.size >= MAX_CACHED_CROPS || this.cropBytes + bytes > MAX_CROP_CACHE_BYTES) {\n const oldest = this.crops.keys().next().value!;\n this.cropBytes -= this.crops.get(oldest)!.bytes;\n this.crops.delete(oldest);\n }\n this.crops.set(image, { hidden, visible, line, bytes });\n this.cropBytes += bytes;\n }\n return line;\n }\n}\n\n/** Hide only background placements that can reach the visible terminal. Leave\n * offscreen scrollback intact; removing it would force unnecessary reuploads on\n * close. Return text-only frames unchanged instead of copying retained history. */\nexport function hideKittyImages(lines: string[], viewportHeight = lines.length): string[] {\n const start = Math.max(0, lines.length - viewportHeight);\n let result: string[] | undefined;\n const hide = (row: number): void => { result ??= lines.slice(); result[row] = \"\"; };\n for (let row = start; row < lines.length; row++) if (isKittyImageLine(lines[row]!)) hide(row);\n // An image anchored above the viewport may extend into it through empty rows.\n for (let row = start - 1; row >= 0; row--) {\n const line = lines[row]!;\n if (line === \"\") continue;\n const image = header(line);\n if (image && row + image.rows > start) hide(row);\n break;\n }\n return result ?? lines;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -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-
|
|
11
|
+
} from "./chunk-KQ6R5EWR.js";
|
|
12
12
|
import {
|
|
13
13
|
MeshStore
|
|
14
|
-
} from "./chunk-
|
|
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-
|
|
818
|
+
//# sourceMappingURL=chunk-3KDUMDPZ.js.map
|