@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.
Files changed (119) hide show
  1. package/LICENSE-APACHE +201 -0
  2. package/LICENSE-MIT +21 -0
  3. package/README.md +54 -0
  4. package/dist/alias.d.ts +4 -0
  5. package/dist/alias.d.ts.map +1 -0
  6. package/dist/alias.js +34 -0
  7. package/dist/alias.js.map +1 -0
  8. package/dist/cbor.d.ts +24 -0
  9. package/dist/cbor.d.ts.map +1 -0
  10. package/dist/cbor.js +267 -0
  11. package/dist/cbor.js.map +1 -0
  12. package/dist/delta.d.ts +8 -0
  13. package/dist/delta.d.ts.map +1 -0
  14. package/dist/delta.js +92 -0
  15. package/dist/delta.js.map +1 -0
  16. package/dist/derivation.d.ts +29 -0
  17. package/dist/derivation.d.ts.map +1 -0
  18. package/dist/derivation.js +183 -0
  19. package/dist/derivation.js.map +1 -0
  20. package/dist/eval.d.ts +91 -0
  21. package/dist/eval.d.ts.map +1 -0
  22. package/dist/eval.js +318 -0
  23. package/dist/eval.js.map +1 -0
  24. package/dist/hash.d.ts +4 -0
  25. package/dist/hash.d.ts.map +1 -0
  26. package/dist/hash.js +17 -0
  27. package/dist/hash.js.map +1 -0
  28. package/dist/http.d.ts +21 -0
  29. package/dist/http.d.ts.map +1 -0
  30. package/dist/http.js +110 -0
  31. package/dist/http.js.map +1 -0
  32. package/dist/hview.d.ts +15 -0
  33. package/dist/hview.d.ts.map +1 -0
  34. package/dist/hview.js +72 -0
  35. package/dist/hview.js.map +1 -0
  36. package/dist/index.d.ts +23 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +22 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/json-profile.d.ts +4 -0
  41. package/dist/json-profile.d.ts.map +1 -0
  42. package/dist/json-profile.js +97 -0
  43. package/dist/json-profile.js.map +1 -0
  44. package/dist/pack.d.ts +5 -0
  45. package/dist/pack.d.ts.map +1 -0
  46. package/dist/pack.js +227 -0
  47. package/dist/pack.js.map +1 -0
  48. package/dist/peer.d.ts +26 -0
  49. package/dist/peer.d.ts.map +1 -0
  50. package/dist/peer.js +111 -0
  51. package/dist/peer.js.map +1 -0
  52. package/dist/policy.d.ts +46 -0
  53. package/dist/policy.d.ts.map +1 -0
  54. package/dist/policy.js +186 -0
  55. package/dist/policy.js.map +1 -0
  56. package/dist/pred.d.ts +78 -0
  57. package/dist/pred.d.ts.map +1 -0
  58. package/dist/pred.js +228 -0
  59. package/dist/pred.js.map +1 -0
  60. package/dist/reactor.d.ts +67 -0
  61. package/dist/reactor.d.ts.map +1 -0
  62. package/dist/reactor.js +433 -0
  63. package/dist/reactor.js.map +1 -0
  64. package/dist/schema-deltas.d.ts +14 -0
  65. package/dist/schema-deltas.d.ts.map +1 -0
  66. package/dist/schema-deltas.js +87 -0
  67. package/dist/schema-deltas.js.map +1 -0
  68. package/dist/schema.d.ts +17 -0
  69. package/dist/schema.d.ts.map +1 -0
  70. package/dist/schema.js +102 -0
  71. package/dist/schema.js.map +1 -0
  72. package/dist/set.d.ts +18 -0
  73. package/dist/set.d.ts.map +1 -0
  74. package/dist/set.js +83 -0
  75. package/dist/set.js.map +1 -0
  76. package/dist/sign.d.ts +8 -0
  77. package/dist/sign.d.ts.map +1 -0
  78. package/dist/sign.js +44 -0
  79. package/dist/sign.js.map +1 -0
  80. package/dist/term-io.d.ts +13 -0
  81. package/dist/term-io.d.ts.map +1 -0
  82. package/dist/term-io.js +216 -0
  83. package/dist/term-io.js.map +1 -0
  84. package/dist/term-json.d.ts +7 -0
  85. package/dist/term-json.d.ts.map +1 -0
  86. package/dist/term-json.js +362 -0
  87. package/dist/term-json.js.map +1 -0
  88. package/dist/types.d.ts +34 -0
  89. package/dist/types.d.ts.map +1 -0
  90. package/dist/types.js +4 -0
  91. package/dist/types.js.map +1 -0
  92. package/dist/vocab.d.ts +2 -0
  93. package/dist/vocab.d.ts.map +1 -0
  94. package/dist/vocab.js +4 -0
  95. package/dist/vocab.js.map +1 -0
  96. package/package.json +83 -0
  97. package/src/alias.ts +36 -0
  98. package/src/cbor.ts +280 -0
  99. package/src/delta.ts +89 -0
  100. package/src/derivation.ts +229 -0
  101. package/src/eval.ts +401 -0
  102. package/src/hash.ts +19 -0
  103. package/src/http.ts +124 -0
  104. package/src/hview.ts +91 -0
  105. package/src/index.ts +83 -0
  106. package/src/json-profile.ts +96 -0
  107. package/src/pack.ts +239 -0
  108. package/src/peer.ts +126 -0
  109. package/src/policy.ts +216 -0
  110. package/src/pred.ts +307 -0
  111. package/src/reactor.ts +490 -0
  112. package/src/schema-deltas.ts +100 -0
  113. package/src/schema.ts +111 -0
  114. package/src/set.ts +98 -0
  115. package/src/sign.ts +48 -0
  116. package/src/term-io.ts +228 -0
  117. package/src/term-json.ts +364 -0
  118. package/src/types.ts +38 -0
  119. package/src/vocab.ts +3 -0
@@ -0,0 +1,362 @@
1
+ // Parse the JSON term profile (ERRATA-2 E1) into Term/Pred. Strings are NFC-normalized at parse
2
+ // time so term-side comparisons are NFC-vs-NFC (data strings are NFC by validation, D11).
3
+ const CMPS = ["eq", "neq", "lt", "lte", "gt", "gte", "prefix", "inSet"];
4
+ function nfc(s) {
5
+ return s.normalize("NFC");
6
+ }
7
+ function asObject(x, what) {
8
+ if (typeof x !== "object" || x === null || Array.isArray(x)) {
9
+ throw new Error(`expected object for ${what}`);
10
+ }
11
+ return x;
12
+ }
13
+ function parsePrimitive(v, what) {
14
+ if (typeof v === "string")
15
+ return nfc(v);
16
+ if (typeof v === "boolean")
17
+ return v;
18
+ if (typeof v === "number") {
19
+ if (!Number.isFinite(v))
20
+ throw new Error(`${what}: numeric constant must be finite`);
21
+ return v;
22
+ }
23
+ throw new Error(`${what}: constant must be string | number | boolean`);
24
+ }
25
+ // A hole in Const position: {"hole": "name"} (E15).
26
+ function parseHole(v) {
27
+ if (typeof v !== "object" || v === null || Array.isArray(v))
28
+ return undefined;
29
+ const h = v["hole"];
30
+ return typeof h === "string" ? { kind: "hole", name: nfc(h) } : undefined;
31
+ }
32
+ function parseParam(v, what) {
33
+ return parseHole(v) ?? parsePrimitive(v, what);
34
+ }
35
+ function parseCmp(v, what) {
36
+ if (typeof v !== "string" || !CMPS.includes(v)) {
37
+ throw new Error(`${what}: unknown cmp ${String(v)}`);
38
+ }
39
+ return v;
40
+ }
41
+ function parseStrMatch(raw, what) {
42
+ const o = asObject(raw, what);
43
+ if (typeof o["exact"] === "string")
44
+ return { kind: "exact", value: nfc(o["exact"]) };
45
+ if (typeof o["prefix"] === "string")
46
+ return { kind: "prefix", value: nfc(o["prefix"]) };
47
+ if (Array.isArray(o["inSet"])) {
48
+ return {
49
+ kind: "inSet",
50
+ values: o["inSet"].map((s) => {
51
+ if (typeof s !== "string")
52
+ throw new Error(`${what}: inSet members must be strings`);
53
+ return nfc(s);
54
+ }),
55
+ };
56
+ }
57
+ if (o["aliased"] !== undefined) {
58
+ const a = asObject(o["aliased"], `${what}.aliased`);
59
+ if (typeof a["name"] !== "string")
60
+ throw new Error(`${what}: aliased.name must be a string`);
61
+ const out = { name: nfc(a["name"]) };
62
+ if (a["via"] !== undefined) {
63
+ if (typeof a["via"] !== "string")
64
+ throw new Error(`${what}: aliased.via must be an entity id`);
65
+ out.via = nfc(a["via"]);
66
+ }
67
+ if (a["trust"] !== undefined) {
68
+ const trust = parsePred(a["trust"]);
69
+ assertClosedTrustPred(trust, `${what}.aliased.trust`);
70
+ out.trust = trust;
71
+ }
72
+ return { kind: "aliased", ...out };
73
+ }
74
+ throw new Error(`${what}: StrMatch must be exact | prefix | inSet | aliased`);
75
+ }
76
+ // An aliased trust predicate admits no holes and no nested aliased (SPEC-9 §4.1): it is
77
+ // evaluated against alias-vocabulary deltas during closure computation, outside the hole
78
+ // environment and outside any further expansion.
79
+ function assertClosedTrustPred(p, what) {
80
+ switch (p.kind) {
81
+ case "true":
82
+ case "false":
83
+ return;
84
+ case "match":
85
+ if (typeof p.constant === "object" && !Array.isArray(p.constant)) {
86
+ throw new Error(`${what}: holes are not allowed inside an aliased trust predicate`);
87
+ }
88
+ return;
89
+ case "hasPointer": {
90
+ const pp = p.ppred;
91
+ if (pp.targetEntity?.kind === "hole" ||
92
+ (pp.targetValue?.kind === "vcmp" && typeof pp.targetValue.value === "object")) {
93
+ throw new Error(`${what}: holes are not allowed inside an aliased trust predicate`);
94
+ }
95
+ if (pp.role?.kind === "aliased" || pp.context?.kind === "aliased") {
96
+ throw new Error(`${what}: nested aliased is not allowed inside an aliased trust predicate`);
97
+ }
98
+ return;
99
+ }
100
+ case "and":
101
+ case "or":
102
+ assertClosedTrustPred(p.left, what);
103
+ assertClosedTrustPred(p.right, what);
104
+ return;
105
+ case "not":
106
+ assertClosedTrustPred(p.pred, what);
107
+ return;
108
+ }
109
+ }
110
+ function parseValMatch(raw, what) {
111
+ const o = asObject(raw, what);
112
+ if (o["vcmp"] !== undefined) {
113
+ const v = asObject(o["vcmp"], `${what}.vcmp`);
114
+ const cmp = parseCmp(v["cmp"], `${what}.vcmp`);
115
+ if (cmp === "inSet")
116
+ throw new Error(`${what}: vcmp cmp inSet is not allowed; use the inSet arm`);
117
+ const value = parseParam(v["value"], `${what}.vcmp`);
118
+ if (cmp === "prefix" && typeof value !== "string" && typeof value !== "object") {
119
+ throw new Error(`${what}: prefix requires a string constant`);
120
+ }
121
+ return { kind: "vcmp", cmp, value };
122
+ }
123
+ if (Array.isArray(o["between"])) {
124
+ if (o["between"].length !== 2)
125
+ throw new Error(`${what}: between takes [lo, hi]`);
126
+ return {
127
+ kind: "between",
128
+ lo: parsePrimitive(o["between"][0], `${what}.between`),
129
+ hi: parsePrimitive(o["between"][1], `${what}.between`),
130
+ };
131
+ }
132
+ if (Array.isArray(o["inSet"])) {
133
+ return { kind: "inSet", values: o["inSet"].map((v) => parsePrimitive(v, `${what}.inSet`)) };
134
+ }
135
+ throw new Error(`${what}: ValMatch must be vcmp | between | inSet`);
136
+ }
137
+ function parsePPred(raw) {
138
+ const o = asObject(raw, "hasPointer");
139
+ const out = {};
140
+ if (o["role"] !== undefined)
141
+ out.role = parseStrMatch(o["role"], "hasPointer.role");
142
+ if (o["targetEntity"] !== undefined) {
143
+ const te = o["targetEntity"];
144
+ if (typeof te === "string") {
145
+ out.targetEntity = { kind: "const", id: nfc(te) };
146
+ }
147
+ else {
148
+ const hole = parseHole(te);
149
+ if (hole !== undefined) {
150
+ out.targetEntity = hole;
151
+ }
152
+ else {
153
+ const v = asObject(te, "targetEntity");
154
+ if (v["var"] !== "root") {
155
+ throw new Error('targetEntity must be a string, {var: "root"}, or {hole: "name"}');
156
+ }
157
+ out.targetEntity = { kind: "root" };
158
+ }
159
+ }
160
+ }
161
+ if (o["targetDelta"] !== undefined) {
162
+ if (typeof o["targetDelta"] !== "string")
163
+ throw new Error("targetDelta must be a string");
164
+ out.targetDelta = o["targetDelta"];
165
+ }
166
+ if (o["context"] !== undefined)
167
+ out.context = parseStrMatch(o["context"], "hasPointer.context");
168
+ if (o["targetIsPrimitive"] !== undefined) {
169
+ if (typeof o["targetIsPrimitive"] !== "boolean") {
170
+ throw new Error("targetIsPrimitive must be a boolean");
171
+ }
172
+ out.targetIsPrimitive = o["targetIsPrimitive"];
173
+ }
174
+ if (o["targetValue"] !== undefined) {
175
+ out.targetValue = parseValMatch(o["targetValue"], "hasPointer.targetValue");
176
+ }
177
+ if (Object.keys(out).length === 0)
178
+ throw new Error("hasPointer requires at least one field (E1)");
179
+ return out;
180
+ }
181
+ export function parsePred(raw) {
182
+ if (raw === "true")
183
+ return { kind: "true" };
184
+ if (raw === "false")
185
+ return { kind: "false" };
186
+ const o = asObject(raw, "pred");
187
+ if (o["match"] !== undefined) {
188
+ const m = asObject(o["match"], "match");
189
+ const field = m["field"];
190
+ if (field !== "author" && field !== "timestamp" && field !== "id") {
191
+ throw new Error(`match: unknown field ${String(field)}`);
192
+ }
193
+ const cmp = parseCmp(m["cmp"], "match");
194
+ const rawConst = m["const"];
195
+ const constant = cmp === "inSet"
196
+ ? (() => {
197
+ if (!Array.isArray(rawConst))
198
+ throw new Error("match: inSet requires an array const");
199
+ return rawConst.map((v) => parsePrimitive(v, "match.const"));
200
+ })()
201
+ : parseParam(rawConst, "match.const");
202
+ if (cmp === "prefix" && typeof constant !== "string" && typeof constant !== "object") {
203
+ throw new Error("match: prefix requires a string const");
204
+ }
205
+ return { kind: "match", field, cmp, constant };
206
+ }
207
+ if (o["hasPointer"] !== undefined)
208
+ return { kind: "hasPointer", ppred: parsePPred(o["hasPointer"]) };
209
+ if (o["and"] !== undefined || o["or"] !== undefined) {
210
+ const key = o["and"] !== undefined ? "and" : "or";
211
+ const arr = o[key];
212
+ if (!Array.isArray(arr) || arr.length !== 2)
213
+ throw new Error(`${key} takes exactly [Pred, Pred] (E1)`);
214
+ const left = parsePred(arr[0]);
215
+ const right = parsePred(arr[1]);
216
+ return key === "and" ? { kind: "and", left, right } : { kind: "or", left, right };
217
+ }
218
+ if (o["not"] !== undefined)
219
+ return { kind: "not", pred: parsePred(o["not"]) };
220
+ throw new Error("pred must be true | false | match | hasPointer | and | or | not");
221
+ }
222
+ function parseMaskPolicy(raw) {
223
+ if (raw === "drop")
224
+ return { kind: "drop" };
225
+ if (raw === "annotate")
226
+ return { kind: "annotate" };
227
+ const o = asObject(raw, "mask.policy");
228
+ if (o["trust"] !== undefined)
229
+ return { kind: "trust", pred: parsePred(o["trust"]) };
230
+ throw new Error("mask policy must be drop | annotate | {trust: Pred}");
231
+ }
232
+ const MERGE_FNS = ["max", "min", "sum", "count", "and", "or", "concatSorted"];
233
+ function parseOrder(raw) {
234
+ if (raw === "lexById")
235
+ return { kind: "lexById" };
236
+ const o = asObject(raw, "order");
237
+ if (o["byTimestamp"] !== undefined) {
238
+ if (o["byTimestamp"] !== "desc" && o["byTimestamp"] !== "asc") {
239
+ throw new Error("byTimestamp must be desc | asc");
240
+ }
241
+ return { kind: "byTimestamp", dir: o["byTimestamp"] };
242
+ }
243
+ if (Array.isArray(o["byAuthorRank"])) {
244
+ return {
245
+ kind: "byAuthorRank",
246
+ authors: o["byAuthorRank"].map((a) => {
247
+ if (typeof a !== "string")
248
+ throw new Error("byAuthorRank entries must be strings");
249
+ return nfc(a);
250
+ }),
251
+ };
252
+ }
253
+ if (o["byPred"] !== undefined) {
254
+ const p = asObject(o["byPred"], "byPred");
255
+ return { kind: "byPred", pred: parsePred(p["pred"]), then: parseOrder(p["then"]) };
256
+ }
257
+ throw new Error("order must be lexById | byTimestamp | byAuthorRank | byPred");
258
+ }
259
+ function parsePropPolicy(raw) {
260
+ const o = asObject(raw, "propPolicy");
261
+ if (o["pick"] !== undefined) {
262
+ return { kind: "pick", order: parseOrder(asObject(o["pick"], "pick")["order"]) };
263
+ }
264
+ if (o["all"] !== undefined) {
265
+ return { kind: "all", order: parseOrder(asObject(o["all"], "all")["order"]) };
266
+ }
267
+ if (o["merge"] !== undefined) {
268
+ if (!MERGE_FNS.includes(o["merge"])) {
269
+ throw new Error("unknown merge fn " + String(o["merge"]));
270
+ }
271
+ return { kind: "merge", fn: o["merge"] };
272
+ }
273
+ if (o["conflicts"] !== undefined) {
274
+ return { kind: "conflicts", order: parseOrder(asObject(o["conflicts"], "conflicts")["order"]) };
275
+ }
276
+ if (o["absentAs"] !== undefined) {
277
+ const a = asObject(o["absentAs"], "absentAs");
278
+ return {
279
+ kind: "absentAs",
280
+ constant: parsePrimitive(a["const"], "absentAs.const"),
281
+ then: parsePropPolicy(a["then"]),
282
+ };
283
+ }
284
+ throw new Error("propPolicy must be pick | all | merge | conflicts | absentAs");
285
+ }
286
+ export function parsePolicy(raw) {
287
+ const o = asObject(raw, "policy");
288
+ const props = new Map();
289
+ if (o["props"] !== undefined) {
290
+ for (const [k, v] of Object.entries(asObject(o["props"], "policy.props"))) {
291
+ props.set(nfc(k), parsePropPolicy(v));
292
+ }
293
+ }
294
+ return { props, default: parsePropPolicy(o["default"]) };
295
+ }
296
+ function parseGroupKey(raw) {
297
+ if (raw === "byTargetContext")
298
+ return { kind: "byTargetContext" };
299
+ if (raw === "byRole")
300
+ return { kind: "byRole" };
301
+ const o = asObject(raw, "group.key");
302
+ if (typeof o["const"] === "string")
303
+ return { kind: "const", prop: nfc(o["const"]) };
304
+ throw new Error("group key must be byTargetContext | byRole | {const: string}");
305
+ }
306
+ function parseSchemaRef(raw) {
307
+ if (typeof raw === "string")
308
+ return { kind: "name", name: nfc(raw) };
309
+ const o = asObject(raw, "schemaRef");
310
+ if (typeof o["pinned"] === "string")
311
+ return { kind: "pinned", hash: o["pinned"] };
312
+ throw new Error("schema ref must be a name string or {pinned: hash} (E13)");
313
+ }
314
+ export function parseTerm(raw) {
315
+ if (raw === "input")
316
+ return { kind: "input" };
317
+ const o = asObject(raw, "term");
318
+ switch (o["op"]) {
319
+ case "select":
320
+ return { kind: "select", pred: parsePred(o["pred"]), of: parseTerm(o["in"]) };
321
+ case "union":
322
+ return { kind: "union", left: parseTerm(o["left"]), right: parseTerm(o["right"]) };
323
+ case "mask":
324
+ return { kind: "mask", policy: parseMaskPolicy(o["policy"]), of: parseTerm(o["in"]) };
325
+ case "group":
326
+ return { kind: "group", key: parseGroupKey(o["key"]), of: parseTerm(o["in"]) };
327
+ case "expand": {
328
+ return {
329
+ kind: "expand",
330
+ role: parseStrMatch(o["role"], "expand.role"),
331
+ schema: parseSchemaRef(o["schema"]),
332
+ of: parseTerm(o["in"]),
333
+ };
334
+ }
335
+ case "fix": {
336
+ if (typeof o["entity"] !== "string")
337
+ throw new Error("fix.entity must be a string");
338
+ const fix = {
339
+ kind: "fix",
340
+ schema: parseSchemaRef(o["schema"]),
341
+ entity: nfc(o["entity"]),
342
+ };
343
+ if (o["bindings"] === undefined)
344
+ return fix;
345
+ const bo = asObject(o["bindings"], "fix.bindings");
346
+ const bindings = new Map();
347
+ for (const key of Object.keys(bo).sort()) {
348
+ bindings.set(nfc(key), parsePrimitive(bo[key], `fix.bindings.${key}`));
349
+ }
350
+ return { ...fix, bindings };
351
+ }
352
+ case "resolve":
353
+ return { kind: "resolve", policy: parsePolicy(o["policy"]), of: parseTerm(o["in"]) };
354
+ case "prune": {
355
+ const keep = o["keep"] === "all" ? "all" : parseStrMatch(o["keep"], "prune.keep");
356
+ return { kind: "prune", keep, of: parseTerm(o["in"]) };
357
+ }
358
+ default:
359
+ throw new Error(`unknown term op ${String(o["op"])}`);
360
+ }
361
+ }
362
+ //# sourceMappingURL=term-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"term-json.js","sourceRoot":"","sources":["../src/term-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export type Primitive = string | number | boolean;
2
+ export interface EntityRef {
3
+ readonly id: string;
4
+ readonly context?: string;
5
+ }
6
+ export interface DeltaRef {
7
+ readonly delta: string;
8
+ readonly context?: string;
9
+ }
10
+ export type Target = {
11
+ readonly kind: "primitive";
12
+ readonly value: Primitive;
13
+ } | {
14
+ readonly kind: "entity";
15
+ readonly entity: EntityRef;
16
+ } | {
17
+ readonly kind: "delta";
18
+ readonly deltaRef: DeltaRef;
19
+ };
20
+ export interface Pointer {
21
+ readonly role: string;
22
+ readonly target: Target;
23
+ }
24
+ export interface Claims {
25
+ readonly timestamp: number;
26
+ readonly author: string;
27
+ readonly pointers: readonly Pointer[];
28
+ }
29
+ export interface Delta {
30
+ readonly id: string;
31
+ readonly claims: Claims;
32
+ readonly sig?: string;
33
+ }
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ // The delta data model (SPEC-1 §2). Bytes are never stored here — these are the logical
2
+ // structures; canonical encoding lives in cbor.ts / delta.ts.
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,8DAA8D"}
@@ -0,0 +1,2 @@
1
+ export declare const VOCAB_PREFIX = "rhizomatic";
2
+ //# sourceMappingURL=vocab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vocab.d.ts","sourceRoot":"","sources":["../src/vocab.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,eAAe,CAAC"}
package/dist/vocab.js ADDED
@@ -0,0 +1,4 @@
1
+ // The reserved vocabulary namespace (decided 2026-06-11). One configurable constant, so any
2
+ // future change is a one-line edit plus a vector regen. Leaf module: importable from anywhere.
3
+ export const VOCAB_PREFIX = "rhizomatic";
4
+ //# sourceMappingURL=vocab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vocab.js","sourceRoot":"","sources":["../src/vocab.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,+FAA+F;AAC/F,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC"}
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "@rhizomes/rhizomatic",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Rhizomatic (TypeScript) — a portable format for arbitrarily-relational data: signed, content-addressed deltas; union merge (grow-only CRDT); truth resolved per-reader. One of two parallel witnesses to the spec.",
6
+ "license": "MIT OR Apache-2.0",
7
+ "author": "Mykola Bilokonsky",
8
+ "homepage": "https://github.com/mbilokonsky/rhizomatic#readme",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/mbilokonsky/rhizomatic.git",
12
+ "directory": "implementations/ts"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/mbilokonsky/rhizomatic/issues"
16
+ },
17
+ "keywords": [
18
+ "crdt",
19
+ "content-addressed",
20
+ "provenance",
21
+ "canonical-cbor",
22
+ "delta",
23
+ "federation",
24
+ "rhizomatic",
25
+ "signed-data"
26
+ ],
27
+ "main": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ }
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "src",
38
+ "README.md",
39
+ "LICENSE-MIT",
40
+ "LICENSE-APACHE"
41
+ ],
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc -p tsconfig.build.json",
47
+ "prepare": "npm run build",
48
+ "preversion": "npm run check",
49
+ "version": "npm run build",
50
+ "postversion": "git push --follow-tags",
51
+ "release:patch": "npm version patch && npm publish",
52
+ "release:minor": "npm version minor && npm publish",
53
+ "release:major": "npm version major && npm publish",
54
+ "test": "vitest run",
55
+ "typecheck": "tsc --noEmit",
56
+ "lint": "eslint .",
57
+ "lint:fix": "eslint . --fix",
58
+ "format": "prettier --write .",
59
+ "format:check": "prettier --check .",
60
+ "check": "npm run format:check && npm run lint && npm run typecheck && npm test",
61
+ "gen-vectors": "tsx tools/gen-vectors.ts",
62
+ "demo": "tsx demo/demo.ts",
63
+ "playground:build": "esbuild demo/playground/playground.ts --bundle --format=iife --outfile=demo/playground/bundle.js",
64
+ "docs:build": "esbuild demo/tour/tour.ts --bundle --format=iife --outfile=../../docs/tour.bundle.js && esbuild demo/playground/playground.ts --bundle --format=iife --outfile=../../docs/playground.bundle.js"
65
+ },
66
+ "dependencies": {
67
+ "@noble/curves": "^1.6.0",
68
+ "@noble/hashes": "^1.5.0"
69
+ },
70
+ "devDependencies": {
71
+ "@eslint/js": "^9.15.0",
72
+ "@types/node": "^22.0.0",
73
+ "esbuild": "^0.28.0",
74
+ "eslint": "^9.15.0",
75
+ "eslint-config-prettier": "^9.1.0",
76
+ "fast-check": "^3.22.0",
77
+ "prettier": "^3.3.0",
78
+ "tsx": "^4.19.0",
79
+ "typescript": "^5.7.0",
80
+ "typescript-eslint": "^8.15.0",
81
+ "vitest": "^2.1.0"
82
+ }
83
+ }
package/src/alias.ts ADDED
@@ -0,0 +1,36 @@
1
+ // Relation signatures (SPEC-9 §5): the deterministic answer to "what relation shape does this
2
+ // delta instantiate?" — the librarian's input, never part of evaluation semantics.
3
+
4
+ import { array, encode, tstr } from "./cbor.js";
5
+ import { bytesToHex } from "./hash.js";
6
+ import type { Delta } from "./types.js";
7
+
8
+ function byteCompare(a: Uint8Array, b: Uint8Array): number {
9
+ const n = Math.min(a.length, b.length);
10
+ for (let i = 0; i < n; i++) {
11
+ const d = a[i]! - b[i]!;
12
+ if (d !== 0) return d;
13
+ }
14
+ return a.length - b.length;
15
+ }
16
+
17
+ // The [role, context] pairs ([role] when the pointer has no context) of the delta's EntityRef
18
+ // pointers, sorted bytewise by their canonical CBOR encoding. Primitive and DeltaRef pointers
19
+ // contribute nothing: primitives are not vertices (SPEC-1 §2.3); delta references are plumbing.
20
+ export function relationSignature(delta: Delta): readonly (readonly string[])[] {
21
+ const pairs: { pair: string[]; bytes: Uint8Array }[] = [];
22
+ for (const ptr of delta.claims.pointers) {
23
+ if (ptr.target.kind !== "entity") continue;
24
+ const context = ptr.target.entity.context;
25
+ const pair = context === undefined ? [ptr.role] : [ptr.role, context];
26
+ pairs.push({ pair, bytes: encode(array(pair.map(tstr))) });
27
+ }
28
+ pairs.sort((a, b) => byteCompare(a.bytes, b.bytes));
29
+ return pairs.map((p) => p.pair);
30
+ }
31
+
32
+ // The signature's canonical form: the canonical CBOR of the sorted array of pairs.
33
+ export function relationSignatureCanonicalHex(delta: Delta): string {
34
+ const pairs = relationSignature(delta).map((pair) => array(pair.map(tstr)));
35
+ return bytesToHex(encode(array(pairs)));
36
+ }