@rhizomes/rhizomatic 0.1.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/LICENSE-APACHE +201 -0
- package/LICENSE-MIT +21 -0
- package/README.md +54 -0
- package/dist/alias.d.ts +4 -0
- package/dist/alias.d.ts.map +1 -0
- package/dist/alias.js +34 -0
- package/dist/alias.js.map +1 -0
- package/dist/cbor.d.ts +24 -0
- package/dist/cbor.d.ts.map +1 -0
- package/dist/cbor.js +267 -0
- package/dist/cbor.js.map +1 -0
- package/dist/delta.d.ts +8 -0
- package/dist/delta.d.ts.map +1 -0
- package/dist/delta.js +92 -0
- package/dist/delta.js.map +1 -0
- package/dist/derivation.d.ts +29 -0
- package/dist/derivation.d.ts.map +1 -0
- package/dist/derivation.js +183 -0
- package/dist/derivation.js.map +1 -0
- package/dist/eval.d.ts +91 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/eval.js +318 -0
- package/dist/eval.js.map +1 -0
- package/dist/hash.d.ts +4 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +17 -0
- package/dist/hash.js.map +1 -0
- package/dist/http.d.ts +21 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +110 -0
- package/dist/http.js.map +1 -0
- package/dist/hview.d.ts +15 -0
- package/dist/hview.d.ts.map +1 -0
- package/dist/hview.js +72 -0
- package/dist/hview.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/json-profile.d.ts +4 -0
- package/dist/json-profile.d.ts.map +1 -0
- package/dist/json-profile.js +97 -0
- package/dist/json-profile.js.map +1 -0
- package/dist/pack.d.ts +5 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +227 -0
- package/dist/pack.js.map +1 -0
- package/dist/peer.d.ts +26 -0
- package/dist/peer.d.ts.map +1 -0
- package/dist/peer.js +111 -0
- package/dist/peer.js.map +1 -0
- package/dist/policy.d.ts +46 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +186 -0
- package/dist/policy.js.map +1 -0
- package/dist/pred.d.ts +78 -0
- package/dist/pred.d.ts.map +1 -0
- package/dist/pred.js +228 -0
- package/dist/pred.js.map +1 -0
- package/dist/reactor.d.ts +67 -0
- package/dist/reactor.d.ts.map +1 -0
- package/dist/reactor.js +433 -0
- package/dist/reactor.js.map +1 -0
- package/dist/schema-deltas.d.ts +14 -0
- package/dist/schema-deltas.d.ts.map +1 -0
- package/dist/schema-deltas.js +87 -0
- package/dist/schema-deltas.js.map +1 -0
- package/dist/schema.d.ts +17 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +102 -0
- package/dist/schema.js.map +1 -0
- package/dist/set.d.ts +18 -0
- package/dist/set.d.ts.map +1 -0
- package/dist/set.js +83 -0
- package/dist/set.js.map +1 -0
- package/dist/sign.d.ts +8 -0
- package/dist/sign.d.ts.map +1 -0
- package/dist/sign.js +44 -0
- package/dist/sign.js.map +1 -0
- package/dist/term-io.d.ts +13 -0
- package/dist/term-io.d.ts.map +1 -0
- package/dist/term-io.js +216 -0
- package/dist/term-io.js.map +1 -0
- package/dist/term-json.d.ts +7 -0
- package/dist/term-json.d.ts.map +1 -0
- package/dist/term-json.js +362 -0
- package/dist/term-json.js.map +1 -0
- package/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/vocab.d.ts +2 -0
- package/dist/vocab.d.ts.map +1 -0
- package/dist/vocab.js +4 -0
- package/dist/vocab.js.map +1 -0
- package/package.json +83 -0
- package/src/alias.ts +36 -0
- package/src/cbor.ts +280 -0
- package/src/delta.ts +89 -0
- package/src/derivation.ts +229 -0
- package/src/eval.ts +401 -0
- package/src/hash.ts +19 -0
- package/src/http.ts +124 -0
- package/src/hview.ts +91 -0
- package/src/index.ts +83 -0
- package/src/json-profile.ts +96 -0
- package/src/pack.ts +239 -0
- package/src/peer.ts +126 -0
- package/src/policy.ts +216 -0
- package/src/pred.ts +307 -0
- package/src/reactor.ts +490 -0
- package/src/schema-deltas.ts +100 -0
- package/src/schema.ts +111 -0
- package/src/set.ts +98 -0
- package/src/sign.ts +48 -0
- package/src/term-io.ts +228 -0
- package/src/term-json.ts +364 -0
- package/src/types.ts +38 -0
- package/src/vocab.ts +3 -0
package/dist/reactor.js
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
// The reactor core (SPEC-4 §2-3, ERRATA-4): ingest -> validate -> persist -> index. The log is
|
|
2
|
+
// the truth; the four core indexes are derived and reconstructible. Materializations arrive in
|
|
3
|
+
// M2.2; this layer guarantees idempotence and order-convergence.
|
|
4
|
+
import { evalTerm } from "./eval.js";
|
|
5
|
+
import { array, encode } from "./cbor.js";
|
|
6
|
+
import { bytesToHex } from "./hash.js";
|
|
7
|
+
import { hvEntryToCbor, hviewCanonicalHex } from "./hview.js";
|
|
8
|
+
import { collectRefs } from "./schema.js";
|
|
9
|
+
import { comparePrimitives } from "./pred.js";
|
|
10
|
+
import { viewCanonicalHex } from "./policy.js";
|
|
11
|
+
import { DeltaSet } from "./set.js";
|
|
12
|
+
import { VOCAB_PREFIX } from "./schema-deltas.js";
|
|
13
|
+
import { verifyDelta } from "./sign.js";
|
|
14
|
+
export class Reactor {
|
|
15
|
+
// The append-only log in arrival order (v0: in-memory; the log is still the truth — V2).
|
|
16
|
+
log = [];
|
|
17
|
+
set = new DeltaSet();
|
|
18
|
+
// target index: EntityId -> delta ids whose pointers target that entity (SPEC-4 §3)
|
|
19
|
+
targetIndex = new Map();
|
|
20
|
+
// negation index: delta id -> ids of negations targeting it (SPEC-4 §3)
|
|
21
|
+
negationIndex = new Map();
|
|
22
|
+
materializations = new Map();
|
|
23
|
+
// value index: role -> canonical primitive key -> { value, ids } (V1: keyed by role)
|
|
24
|
+
valueIndex = new Map();
|
|
25
|
+
// Validate -> persist -> index. Idempotent by id; rejected deltas leave no trace (V3).
|
|
26
|
+
ingest(delta) {
|
|
27
|
+
if (this.set.has(delta.id))
|
|
28
|
+
return { status: "duplicate" };
|
|
29
|
+
// A present signature must verify; unsigned deltas remain legal at L1 (D9).
|
|
30
|
+
if (delta.sig !== undefined && verifyDelta(delta) !== "verified") {
|
|
31
|
+
return { status: "rejected", reason: "signature does not verify" };
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
this.set.add(delta); // recomputes the content address and runs L1 validation
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
return { status: "rejected", reason: e instanceof Error ? e.message : String(e) };
|
|
38
|
+
}
|
|
39
|
+
this.log.push(delta);
|
|
40
|
+
this.index(delta);
|
|
41
|
+
for (const cb of this.rawSubscribers)
|
|
42
|
+
cb(delta);
|
|
43
|
+
this.lastChanges = this.dispatchAndUpdate([delta]);
|
|
44
|
+
return { status: "accepted" };
|
|
45
|
+
}
|
|
46
|
+
index(delta) {
|
|
47
|
+
for (const ptr of delta.claims.pointers) {
|
|
48
|
+
switch (ptr.target.kind) {
|
|
49
|
+
case "entity": {
|
|
50
|
+
const id = ptr.target.entity.id;
|
|
51
|
+
let bucket = this.targetIndex.get(id);
|
|
52
|
+
if (bucket === undefined) {
|
|
53
|
+
bucket = new Set();
|
|
54
|
+
this.targetIndex.set(id, bucket);
|
|
55
|
+
}
|
|
56
|
+
bucket.add(delta.id);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "delta": {
|
|
60
|
+
if (ptr.role === "negates") {
|
|
61
|
+
const target = ptr.target.deltaRef.delta;
|
|
62
|
+
let bucket = this.negationIndex.get(target);
|
|
63
|
+
if (bucket === undefined) {
|
|
64
|
+
bucket = new Set();
|
|
65
|
+
this.negationIndex.set(target, bucket);
|
|
66
|
+
}
|
|
67
|
+
bucket.add(delta.id);
|
|
68
|
+
}
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case "primitive": {
|
|
72
|
+
let roleBucket = this.valueIndex.get(ptr.role);
|
|
73
|
+
if (roleBucket === undefined) {
|
|
74
|
+
roleBucket = new Map();
|
|
75
|
+
this.valueIndex.set(ptr.role, roleBucket);
|
|
76
|
+
}
|
|
77
|
+
const key = viewCanonicalHex(ptr.target.value);
|
|
78
|
+
let entry = roleBucket.get(key);
|
|
79
|
+
if (entry === undefined) {
|
|
80
|
+
entry = { value: ptr.target.value, ids: new Set() };
|
|
81
|
+
roleBucket.set(key, entry);
|
|
82
|
+
}
|
|
83
|
+
entry.ids.add(delta.id);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// --- queries over the core indexes (sorted ids — canonical enumeration order) ---
|
|
90
|
+
byTarget(entityId) {
|
|
91
|
+
return [...(this.targetIndex.get(entityId) ?? [])].sort();
|
|
92
|
+
}
|
|
93
|
+
negationsOf(deltaId) {
|
|
94
|
+
return [...(this.negationIndex.get(deltaId) ?? [])].sort();
|
|
95
|
+
}
|
|
96
|
+
// Range/equality queries over primitive payloads filed under a role (V1; ValMatch per SPEC-2 §3).
|
|
97
|
+
byValue(role, match) {
|
|
98
|
+
const bucket = this.valueIndex.get(role);
|
|
99
|
+
if (bucket === undefined)
|
|
100
|
+
return [];
|
|
101
|
+
const out = [];
|
|
102
|
+
for (const { value, ids } of bucket.values()) {
|
|
103
|
+
if (match(value))
|
|
104
|
+
out.push(...ids);
|
|
105
|
+
}
|
|
106
|
+
return out.sort();
|
|
107
|
+
}
|
|
108
|
+
byValueBetween(role, lo, hi) {
|
|
109
|
+
return this.byValue(role, (v) => comparePrimitives(v, lo) >= 0 && comparePrimitives(v, hi) <= 0);
|
|
110
|
+
}
|
|
111
|
+
// --- the log and the set ---
|
|
112
|
+
get size() {
|
|
113
|
+
return this.set.size;
|
|
114
|
+
}
|
|
115
|
+
has(id) {
|
|
116
|
+
return this.set.has(id);
|
|
117
|
+
}
|
|
118
|
+
get(id) {
|
|
119
|
+
return this.set.get(id);
|
|
120
|
+
}
|
|
121
|
+
// Arrival order — a transport artifact, never consulted by evaluation (SPEC-4 §2).
|
|
122
|
+
arrivalLog() {
|
|
123
|
+
return this.log;
|
|
124
|
+
}
|
|
125
|
+
digest() {
|
|
126
|
+
return this.set.digest();
|
|
127
|
+
}
|
|
128
|
+
snapshot() {
|
|
129
|
+
return DeltaSet.from(this.set);
|
|
130
|
+
}
|
|
131
|
+
// Batch evaluation over the current set — the oracle hookup (SPEC-4 §1). Read-your-writes
|
|
132
|
+
// holds trivially: ingest is synchronous, so an accepted delta is visible immediately (§6).
|
|
133
|
+
eval(term, root, registry) {
|
|
134
|
+
return evalTerm(term, this.set, root, registry);
|
|
135
|
+
}
|
|
136
|
+
// --- materializations (SPEC-4 §4, ERRATA-4 V5) ---
|
|
137
|
+
lastChanges = [];
|
|
138
|
+
// Register a live materialization: an HView-sort term (a function of $root) kept
|
|
139
|
+
// incrementally equal to batch evaluation at each root (SPEC-4 §1).
|
|
140
|
+
register(name, term, roots, registry) {
|
|
141
|
+
if (this.materializations.has(name))
|
|
142
|
+
throw new Error(`duplicate materialization: ${name}`);
|
|
143
|
+
const mat = {
|
|
144
|
+
name,
|
|
145
|
+
term,
|
|
146
|
+
roots: [...roots],
|
|
147
|
+
registry,
|
|
148
|
+
rootAnchored: isRootAnchored(term, registry),
|
|
149
|
+
views: new Map(),
|
|
150
|
+
hexes: new Map(),
|
|
151
|
+
propHexes: new Map(),
|
|
152
|
+
supportEntities: new Map(),
|
|
153
|
+
evalCount: 0,
|
|
154
|
+
};
|
|
155
|
+
for (const root of mat.roots)
|
|
156
|
+
void this.refresh(mat, root);
|
|
157
|
+
this.materializations.set(name, mat);
|
|
158
|
+
}
|
|
159
|
+
materializedHex(name, root) {
|
|
160
|
+
return this.materializations.get(name)?.hexes.get(root);
|
|
161
|
+
}
|
|
162
|
+
materializedView(name, root) {
|
|
163
|
+
return this.materializations.get(name)?.views.get(root);
|
|
164
|
+
}
|
|
165
|
+
evalCountOf(name) {
|
|
166
|
+
return this.materializations.get(name)?.evalCount ?? 0;
|
|
167
|
+
}
|
|
168
|
+
changesFromLastIngest() {
|
|
169
|
+
return this.lastChanges;
|
|
170
|
+
}
|
|
171
|
+
refresh(mat, root) {
|
|
172
|
+
const result = evalTerm(mat.term, this.set, root, mat.registry);
|
|
173
|
+
if (result.sort !== "hview")
|
|
174
|
+
throw new Error("materialized terms must be HView-sort");
|
|
175
|
+
mat.evalCount += 1;
|
|
176
|
+
const hex = hviewCanonicalHex(result.hview);
|
|
177
|
+
const changed = mat.hexes.get(root) !== hex;
|
|
178
|
+
const newPropHexes = propHexesOf(result.hview);
|
|
179
|
+
const changedProps = changed
|
|
180
|
+
? diffProps(mat.propHexes.get(root) ?? new Map(), newPropHexes)
|
|
181
|
+
: undefined;
|
|
182
|
+
mat.views.set(root, result.hview);
|
|
183
|
+
mat.hexes.set(root, hex);
|
|
184
|
+
mat.propHexes.set(root, newPropHexes);
|
|
185
|
+
const entities = new Set([root]);
|
|
186
|
+
collectNestedIds(result.hview, entities);
|
|
187
|
+
mat.supportEntities.set(root, entities);
|
|
188
|
+
return changedProps;
|
|
189
|
+
}
|
|
190
|
+
// Sound dispatch (V5): over-match allowed, under-match forbidden.
|
|
191
|
+
dispatchAndUpdate(deltas) {
|
|
192
|
+
const responsible = deltas.map((d) => d.id);
|
|
193
|
+
const changes = [];
|
|
194
|
+
for (const mat of this.materializations.values()) {
|
|
195
|
+
for (const root of mat.roots) {
|
|
196
|
+
if (!deltas.some((d) => this.affects(d, mat, root)))
|
|
197
|
+
continue;
|
|
198
|
+
const changedProps = this.refresh(mat, root);
|
|
199
|
+
if (changedProps !== undefined) {
|
|
200
|
+
changes.push({
|
|
201
|
+
materialization: mat.name,
|
|
202
|
+
root,
|
|
203
|
+
changedProps,
|
|
204
|
+
responsibleDeltaIds: responsible,
|
|
205
|
+
newHex: mat.hexes.get(root),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
for (const c of changes) {
|
|
211
|
+
for (const cb of this.matSubscribers.get(c.materialization) ?? [])
|
|
212
|
+
cb(c);
|
|
213
|
+
}
|
|
214
|
+
return changes;
|
|
215
|
+
}
|
|
216
|
+
affects(delta, mat, root) {
|
|
217
|
+
if (!mat.rootAnchored)
|
|
218
|
+
return true; // broad dispatch for non-anchored terms (V5)
|
|
219
|
+
const support = mat.supportEntities.get(root) ?? new Set([root]);
|
|
220
|
+
if (this.targetsSupport(delta, support))
|
|
221
|
+
return true;
|
|
222
|
+
// negation chains: walk each negates target downward toward base data (V5)
|
|
223
|
+
for (const ptr of delta.claims.pointers) {
|
|
224
|
+
if (ptr.role !== "negates" || ptr.target.kind !== "delta")
|
|
225
|
+
continue;
|
|
226
|
+
if (this.chainTouchesSupport(ptr.target.deltaRef.delta, support, 0))
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
targetsSupport(delta, support) {
|
|
232
|
+
return delta.claims.pointers.some((p) => p.target.kind === "entity" && support.has(p.target.entity.id));
|
|
233
|
+
}
|
|
234
|
+
chainTouchesSupport(id, support, depth) {
|
|
235
|
+
if (depth > 64)
|
|
236
|
+
return true; // adversarial-depth guard: over-match rather than recurse forever
|
|
237
|
+
const target = this.set.get(id);
|
|
238
|
+
if (target === undefined)
|
|
239
|
+
return false; // unknown target: nothing materialized depends on it
|
|
240
|
+
if (this.targetsSupport(target, support))
|
|
241
|
+
return true;
|
|
242
|
+
for (const ptr of target.claims.pointers) {
|
|
243
|
+
if (ptr.role !== "negates" || ptr.target.kind !== "delta")
|
|
244
|
+
continue;
|
|
245
|
+
if (this.chainTouchesSupport(ptr.target.deltaRef.delta, support, depth + 1))
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
// --- subscriptions (SPEC-4 §5) ---
|
|
251
|
+
rawSubscribers = [];
|
|
252
|
+
matSubscribers = new Map();
|
|
253
|
+
// The raw stream: every accepted delta (federation relays, audit, mirrors).
|
|
254
|
+
subscribeRaw(cb) {
|
|
255
|
+
this.rawSubscribers.push(cb);
|
|
256
|
+
}
|
|
257
|
+
// Change events on a registered materialization's HyperViews.
|
|
258
|
+
subscribe(materialization, cb) {
|
|
259
|
+
const list = this.matSubscribers.get(materialization);
|
|
260
|
+
if (list === undefined)
|
|
261
|
+
this.matSubscribers.set(materialization, [cb]);
|
|
262
|
+
else
|
|
263
|
+
list.push(cb);
|
|
264
|
+
}
|
|
265
|
+
// --- atomic batch ingestion (SPEC-1 §9, SPEC-4 §6) ---
|
|
266
|
+
// Manifest-keyed atomic ingestion: validate everything first; all members become visible to
|
|
267
|
+
// dispatch in one step, or none do. The transaction vocabulary supplies the batch boundary;
|
|
268
|
+
// the reactor supplies the courtesy.
|
|
269
|
+
ingestBundle(manifest, members) {
|
|
270
|
+
const fresh = [...members, manifest].filter((d) => !this.set.has(d.id));
|
|
271
|
+
// Validate all before admitting any (atomic acceptance).
|
|
272
|
+
for (const d of fresh) {
|
|
273
|
+
if (d.sig !== undefined && verifyDelta(d) !== "verified") {
|
|
274
|
+
return { status: "rejected", reason: `bundle member ${d.id}: signature does not verify` };
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
const probe = new DeltaSet();
|
|
278
|
+
probe.add(d);
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
return {
|
|
282
|
+
status: "rejected",
|
|
283
|
+
reason: `bundle member ${d.id}: ${e instanceof Error ? e.message : String(e)}`,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// The manifest must commit to every supplied member by content address (SPEC-1 §9).
|
|
288
|
+
const committed = new Set(manifestMemberIds(manifest));
|
|
289
|
+
for (const m of members) {
|
|
290
|
+
if (!committed.has(m.id)) {
|
|
291
|
+
return { status: "rejected", reason: `member ${m.id} is not claimed by the manifest` };
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (fresh.length === 0)
|
|
295
|
+
return { status: "duplicate" };
|
|
296
|
+
for (const d of fresh) {
|
|
297
|
+
this.set.add(d);
|
|
298
|
+
this.log.push(d);
|
|
299
|
+
this.index(d);
|
|
300
|
+
for (const cb of this.rawSubscribers)
|
|
301
|
+
cb(d);
|
|
302
|
+
}
|
|
303
|
+
this.lastChanges = this.dispatchAndUpdate(fresh);
|
|
304
|
+
return { status: "accepted" };
|
|
305
|
+
}
|
|
306
|
+
// Completeness is verifiable, not enforced (SPEC-1 §9): a hash check.
|
|
307
|
+
holdsAllMembers(manifestId) {
|
|
308
|
+
const manifest = this.set.get(manifestId);
|
|
309
|
+
if (manifest === undefined)
|
|
310
|
+
return false;
|
|
311
|
+
return manifestMemberIds(manifest).every((id) => this.set.has(id));
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// --- the rdb.txn vocabulary (SPEC-1 §9) ---
|
|
315
|
+
export function makeManifestClaims(author, timestamp, memberIds, options) {
|
|
316
|
+
const pointers = memberIds.map((id) => ({
|
|
317
|
+
role: `${VOCAB_PREFIX}.txn.member`,
|
|
318
|
+
target: { kind: "delta", deltaRef: { delta: id } },
|
|
319
|
+
}));
|
|
320
|
+
if (options?.prior !== undefined) {
|
|
321
|
+
pointers.push({
|
|
322
|
+
role: `${VOCAB_PREFIX}.txn.prior`,
|
|
323
|
+
target: { kind: "delta", deltaRef: { delta: options.prior } },
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
if (options?.intent !== undefined) {
|
|
327
|
+
pointers.push({
|
|
328
|
+
role: `${VOCAB_PREFIX}.txn.intent`,
|
|
329
|
+
target: { kind: "primitive", value: options.intent },
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
return { timestamp, author, pointers };
|
|
333
|
+
}
|
|
334
|
+
export function manifestMemberIds(manifest) {
|
|
335
|
+
return manifest.claims.pointers
|
|
336
|
+
.filter((p) => p.role === `${VOCAB_PREFIX}.txn.member` && p.target.kind === "delta")
|
|
337
|
+
.map((p) => p.target.deltaRef.delta);
|
|
338
|
+
}
|
|
339
|
+
// Per-property canonical hexes, for change-path diffing (SPEC-4 §5).
|
|
340
|
+
function propHexesOf(h) {
|
|
341
|
+
const out = new Map();
|
|
342
|
+
for (const [prop, entries] of h.props) {
|
|
343
|
+
out.set(prop, bytesToHex(encode(array(entries.map(hvEntryToCbor)))));
|
|
344
|
+
}
|
|
345
|
+
return out;
|
|
346
|
+
}
|
|
347
|
+
function diffProps(before, after) {
|
|
348
|
+
const changed = new Set();
|
|
349
|
+
for (const [prop, hex] of after)
|
|
350
|
+
if (before.get(prop) !== hex)
|
|
351
|
+
changed.add(prop);
|
|
352
|
+
for (const prop of before.keys())
|
|
353
|
+
if (!after.has(prop))
|
|
354
|
+
changed.add(prop);
|
|
355
|
+
return [...changed].sort();
|
|
356
|
+
}
|
|
357
|
+
// Collect every nested (expanded) HView id, recursively — the support-entity set (V5).
|
|
358
|
+
function collectNestedIds(h, out) {
|
|
359
|
+
for (const entries of h.props.values()) {
|
|
360
|
+
for (const e of entries) {
|
|
361
|
+
if (e.expanded === undefined)
|
|
362
|
+
continue;
|
|
363
|
+
for (const nested of e.expanded.values()) {
|
|
364
|
+
out.add(nested.id);
|
|
365
|
+
collectNestedIds(nested, out);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// Does this predicate conjunctively REQUIRE a pointer at $root? (V5 anchoring analyzer)
|
|
371
|
+
function predRequiresRoot(pred) {
|
|
372
|
+
switch (pred.kind) {
|
|
373
|
+
case "hasPointer":
|
|
374
|
+
return pred.ppred.targetEntity?.kind === "root";
|
|
375
|
+
case "and":
|
|
376
|
+
return predRequiresRoot(pred.left) || predRequiresRoot(pred.right);
|
|
377
|
+
case "or":
|
|
378
|
+
return predRequiresRoot(pred.left) && predRequiresRoot(pred.right);
|
|
379
|
+
default:
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Does every group in this pipeline sit above a root-requiring select?
|
|
384
|
+
function pipelineAnchored(t) {
|
|
385
|
+
switch (t.kind) {
|
|
386
|
+
case "input":
|
|
387
|
+
return false;
|
|
388
|
+
case "select":
|
|
389
|
+
return predRequiresRoot(t.pred) || pipelineAnchored(t.of);
|
|
390
|
+
case "mask":
|
|
391
|
+
return pipelineAnchored(t.of);
|
|
392
|
+
case "union":
|
|
393
|
+
return pipelineAnchored(t.left) && pipelineAnchored(t.right);
|
|
394
|
+
default:
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
function termAnchored(t) {
|
|
399
|
+
switch (t.kind) {
|
|
400
|
+
case "group":
|
|
401
|
+
return pipelineAnchored(t.of);
|
|
402
|
+
case "prune":
|
|
403
|
+
case "expand":
|
|
404
|
+
case "resolve":
|
|
405
|
+
return termAnchored(t.of);
|
|
406
|
+
case "fix":
|
|
407
|
+
return true; // anchoring of the referenced schema is checked via the registry walk below
|
|
408
|
+
default:
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Root anchoring across the term and every transitively referenced schema body (V5).
|
|
413
|
+
export function isRootAnchored(term, registry) {
|
|
414
|
+
if (!termAnchored(term))
|
|
415
|
+
return false;
|
|
416
|
+
const seen = new Set();
|
|
417
|
+
const queue = [...collectRefs(term)];
|
|
418
|
+
while (queue.length > 0) {
|
|
419
|
+
const ref = queue.pop();
|
|
420
|
+
const key = ref.kind === "name" ? `n:${ref.name}` : `h:${ref.hash}`;
|
|
421
|
+
if (seen.has(key))
|
|
422
|
+
continue;
|
|
423
|
+
seen.add(key);
|
|
424
|
+
const schema = registry?.resolve(ref);
|
|
425
|
+
if (schema === undefined)
|
|
426
|
+
return false; // unresolvable: be conservative, dispatch broadly
|
|
427
|
+
if (!termAnchored(schema.body))
|
|
428
|
+
return false;
|
|
429
|
+
queue.push(...collectRefs(schema.body));
|
|
430
|
+
}
|
|
431
|
+
return true;
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=reactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactor.js","sourceRoot":"","sources":["../src/reactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HyperSchema } from "./schema.js";
|
|
2
|
+
import { DeltaSet } from "./set.js";
|
|
3
|
+
import type { Claims } from "./types.js";
|
|
4
|
+
export { VOCAB_PREFIX } from "./vocab.js";
|
|
5
|
+
export declare const SCHEMA_SCHEMA: HyperSchema;
|
|
6
|
+
export declare function publishSchemaClaims(schema: HyperSchema, schemaEntity: string, author: string, timestamp: number): Claims;
|
|
7
|
+
export declare function loadSchema(dset: DeltaSet, schemaEntity: string): HyperSchema;
|
|
8
|
+
export declare function definitionRoles(): {
|
|
9
|
+
defines: string;
|
|
10
|
+
name: string;
|
|
11
|
+
alg: string;
|
|
12
|
+
term: string;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=schema-deltas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-deltas.d.ts","sourceRoot":"","sources":["../src/schema-deltas.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ1C,eAAO,MAAM,aAAa,EAAE,WAc3B,CAAC;AAGF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,CAcR;AAcD,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAG,WAAW,CAuB5E;AAED,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAE9F"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Schemas as deltas (SPEC-3 §5, ERRATA-3 S1-S3): the at-rest, federated form of a schema, and the
|
|
2
|
+
// rdb.SchemaSchema bootstrap — the one hand-specified schema, through which all others are read.
|
|
3
|
+
import { decode } from "./cbor.js";
|
|
4
|
+
import { evalTerm } from "./eval.js";
|
|
5
|
+
import { hexToBytes } from "@noble/hashes/utils";
|
|
6
|
+
import { cborToJson, termCanonicalHex } from "./term-io.js";
|
|
7
|
+
import { parseTerm } from "./term-json.js";
|
|
8
|
+
import { VOCAB_PREFIX } from "./vocab.js";
|
|
9
|
+
export { VOCAB_PREFIX } from "./vocab.js";
|
|
10
|
+
const ROLE_DEFINES = `${VOCAB_PREFIX}.schema.defines`;
|
|
11
|
+
const ROLE_NAME = `${VOCAB_PREFIX}.schema.name`;
|
|
12
|
+
const ROLE_ALG = `${VOCAB_PREFIX}.schema.alg`;
|
|
13
|
+
const ROLE_TERM = `${VOCAB_PREFIX}.schema.term`;
|
|
14
|
+
// The bootstrap (S2): the canonical idiom, hand-specified. Everything else is read using it.
|
|
15
|
+
export const SCHEMA_SCHEMA = {
|
|
16
|
+
name: `${VOCAB_PREFIX}.SchemaSchema`,
|
|
17
|
+
alg: 1,
|
|
18
|
+
body: parseTerm({
|
|
19
|
+
op: "group",
|
|
20
|
+
key: "byTargetContext",
|
|
21
|
+
in: {
|
|
22
|
+
op: "select",
|
|
23
|
+
pred: { hasPointer: { targetEntity: { var: "root" } } },
|
|
24
|
+
// mask BEFORE select (ERRATA-3 S5): negations target deltas, not the root, so a
|
|
25
|
+
// select-first idiom would exclude them before mask could suppress anything.
|
|
26
|
+
in: { op: "mask", policy: "drop", in: "input" },
|
|
27
|
+
},
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
// Publish a schema definition as claims (S1). The caller signs/timestamps as any other authorship.
|
|
31
|
+
export function publishSchemaClaims(schema, schemaEntity, author, timestamp) {
|
|
32
|
+
return {
|
|
33
|
+
timestamp,
|
|
34
|
+
author,
|
|
35
|
+
pointers: [
|
|
36
|
+
{
|
|
37
|
+
role: ROLE_DEFINES,
|
|
38
|
+
target: { kind: "entity", entity: { id: schemaEntity, context: "definition" } },
|
|
39
|
+
},
|
|
40
|
+
{ role: ROLE_NAME, target: { kind: "primitive", value: schema.name } },
|
|
41
|
+
{ role: ROLE_ALG, target: { kind: "primitive", value: schema.alg } },
|
|
42
|
+
{ role: ROLE_TERM, target: { kind: "primitive", value: termCanonicalHex(schema.body) } },
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function primitiveOf(claims, role) {
|
|
47
|
+
for (const p of claims.pointers) {
|
|
48
|
+
if (p.role === role && p.target.kind === "primitive" && typeof p.target.value !== "boolean") {
|
|
49
|
+
return p.target.value;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
// Load a schema definition from the rhizome (S3): evaluate the bootstrap at the schema entity,
|
|
55
|
+
// take the latest surviving definition (claimed timestamp, lexById tiebreak — a policy choice),
|
|
56
|
+
// decode the term, and verify canonicality by re-encoding.
|
|
57
|
+
export function loadSchema(dset, schemaEntity) {
|
|
58
|
+
const result = evalTerm(SCHEMA_SCHEMA.body, dset, schemaEntity);
|
|
59
|
+
if (result.sort !== "hview")
|
|
60
|
+
throw new Error("bootstrap body must yield an HView");
|
|
61
|
+
const defs = result.hview.props.get("definition") ?? [];
|
|
62
|
+
if (defs.length === 0)
|
|
63
|
+
throw new Error(`no surviving schema definition for ${schemaEntity}`);
|
|
64
|
+
const latest = [...defs].sort((a, b) => {
|
|
65
|
+
const dt = b.delta.claims.timestamp - a.delta.claims.timestamp;
|
|
66
|
+
if (dt !== 0)
|
|
67
|
+
return dt;
|
|
68
|
+
return a.delta.id < b.delta.id ? -1 : 1;
|
|
69
|
+
})[0];
|
|
70
|
+
const name = primitiveOf(latest.delta.claims, ROLE_NAME);
|
|
71
|
+
const alg = primitiveOf(latest.delta.claims, ROLE_ALG);
|
|
72
|
+
const termHex = primitiveOf(latest.delta.claims, ROLE_TERM);
|
|
73
|
+
if (typeof name !== "string" || typeof alg !== "number" || typeof termHex !== "string") {
|
|
74
|
+
throw new Error(`malformed schema definition delta ${latest.delta.id}`);
|
|
75
|
+
}
|
|
76
|
+
const bytes = hexToBytes(termHex);
|
|
77
|
+
const term = parseTerm(cborToJson(decode(bytes)));
|
|
78
|
+
// Reject non-canonical blobs: the term must re-encode to exactly the published bytes (S3).
|
|
79
|
+
if (termCanonicalHex(term) !== termHex) {
|
|
80
|
+
throw new Error(`schema definition ${latest.delta.id} carries a non-canonical term blob`);
|
|
81
|
+
}
|
|
82
|
+
return { name, alg, body: term };
|
|
83
|
+
}
|
|
84
|
+
export function definitionRoles() {
|
|
85
|
+
return { defines: ROLE_DEFINES, name: ROLE_NAME, alg: ROLE_ALG, term: ROLE_TERM };
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=schema-deltas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-deltas.js","sourceRoot":"","sources":["../src/schema-deltas.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SchemaRefT, Term } from "./eval.js";
|
|
2
|
+
export interface HyperSchema {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly alg: number;
|
|
5
|
+
readonly body: Term;
|
|
6
|
+
}
|
|
7
|
+
export declare function collectRefs(term: Term): SchemaRefT[];
|
|
8
|
+
export declare class SchemaRegistry {
|
|
9
|
+
private readonly byName;
|
|
10
|
+
private readonly byHash;
|
|
11
|
+
private constructor();
|
|
12
|
+
static build(schemas: readonly HyperSchema[]): SchemaRegistry;
|
|
13
|
+
get(name: string): HyperSchema | undefined;
|
|
14
|
+
getByHash(hash: string): HyperSchema | undefined;
|
|
15
|
+
resolve(ref: SchemaRefT): HyperSchema | undefined;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGlD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB;AAGD,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,EAAE,CA4BpD;AAED,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFzB,OAAO;IAOP,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,cAAc;IAgD7D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIhD,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS;CAGlD"}
|