@cruba/crubal 0.1.0 → 0.2.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 (86) hide show
  1. package/README.md +30 -2
  2. package/dist/bin/crubal.js +70 -4
  3. package/dist/bin/crubal.js.map +1 -1
  4. package/dist/src/access.d.ts +126 -0
  5. package/dist/src/access.js +517 -0
  6. package/dist/src/access.js.map +1 -0
  7. package/dist/src/arrival.d.ts +55 -0
  8. package/dist/src/arrival.js +124 -0
  9. package/dist/src/arrival.js.map +1 -0
  10. package/dist/src/bundle.d.ts +66 -0
  11. package/dist/src/bundle.js +753 -0
  12. package/dist/src/bundle.js.map +1 -0
  13. package/dist/src/conditions.d.ts +7 -1
  14. package/dist/src/conditions.js +52 -11
  15. package/dist/src/conditions.js.map +1 -1
  16. package/dist/src/corpus.js +568 -34
  17. package/dist/src/corpus.js.map +1 -1
  18. package/dist/src/defs.d.ts +37 -2
  19. package/dist/src/defs.js +95 -14
  20. package/dist/src/defs.js.map +1 -1
  21. package/dist/src/dictionary.d.ts +15 -0
  22. package/dist/src/dictionary.js +72 -13
  23. package/dist/src/dictionary.js.map +1 -1
  24. package/dist/src/exchange.d.ts +202 -11
  25. package/dist/src/exchange.js +759 -45
  26. package/dist/src/exchange.js.map +1 -1
  27. package/dist/src/forms.d.ts +16 -0
  28. package/dist/src/forms.js +169 -0
  29. package/dist/src/forms.js.map +1 -0
  30. package/dist/src/index.d.ts +18 -6
  31. package/dist/src/index.js +17 -5
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/lifecycle.d.ts +84 -0
  34. package/dist/src/lifecycle.js +415 -0
  35. package/dist/src/lifecycle.js.map +1 -0
  36. package/dist/src/log.d.ts +78 -0
  37. package/dist/src/log.js +506 -0
  38. package/dist/src/log.js.map +1 -0
  39. package/dist/src/migrate.d.ts +24 -1
  40. package/dist/src/migrate.js +104 -9
  41. package/dist/src/migrate.js.map +1 -1
  42. package/dist/src/model.d.ts +33 -1
  43. package/dist/src/model.js +158 -2
  44. package/dist/src/model.js.map +1 -1
  45. package/dist/src/packages.d.ts +44 -0
  46. package/dist/src/packages.js +137 -3
  47. package/dist/src/packages.js.map +1 -1
  48. package/dist/src/print-text.js +22 -0
  49. package/dist/src/print-text.js.map +1 -1
  50. package/dist/src/publish.d.ts +27 -0
  51. package/dist/src/publish.js +275 -0
  52. package/dist/src/publish.js.map +1 -0
  53. package/dist/src/read-text.d.ts +2 -0
  54. package/dist/src/read-text.js +72 -4
  55. package/dist/src/read-text.js.map +1 -1
  56. package/dist/src/records.d.ts +31 -0
  57. package/dist/src/records.js +72 -0
  58. package/dist/src/records.js.map +1 -0
  59. package/dist/src/review.d.ts +22 -0
  60. package/dist/src/review.js +198 -0
  61. package/dist/src/review.js.map +1 -0
  62. package/dist/src/rules.d.ts +34 -2
  63. package/dist/src/rules.js +147 -22
  64. package/dist/src/rules.js.map +1 -1
  65. package/dist/src/schedule.d.ts +24 -0
  66. package/dist/src/schedule.js +126 -0
  67. package/dist/src/schedule.js.map +1 -0
  68. package/dist/src/std-packages.d.ts +9 -0
  69. package/dist/src/std-packages.js +268 -0
  70. package/dist/src/std-packages.js.map +1 -0
  71. package/dist/src/store.d.ts +38 -7
  72. package/dist/src/store.js +166 -24
  73. package/dist/src/store.js.map +1 -1
  74. package/dist/src/tree.d.ts +3 -0
  75. package/dist/src/tree.js +36 -0
  76. package/dist/src/tree.js.map +1 -1
  77. package/dist/src/units-table.d.ts +1 -0
  78. package/dist/src/units-table.js +200 -0
  79. package/dist/src/units-table.js.map +1 -0
  80. package/dist/src/units.d.ts +42 -4
  81. package/dist/src/units.js +91 -30
  82. package/dist/src/units.js.map +1 -1
  83. package/dist/src/views.d.ts +108 -6
  84. package/dist/src/views.js +389 -64
  85. package/dist/src/views.js.map +1 -1
  86. package/package.json +5 -3
@@ -0,0 +1,506 @@
1
+ // log.ts: the log as effects (spec 8.5) and rebuild (8.5.3). An entry says exactly what changed in the
2
+ // stored state: value writes with their source and where they landed, envelope writes, observations,
3
+ // bindings, review decisions, instructions, runs, installs and (under an emergency edge) reads. Rebuilding
4
+ // applies the entries in order to an empty store and needs no rules, so it gives back exactly the state the
5
+ // store had. Redacted entries are skipped, and only value, observation and read writes may be redacted.
6
+ import { serialize } from "./canonical.js";
7
+ import { MemoryRecords } from "./records.js";
8
+ import { writeHash } from "./store.js";
9
+ import { CrubalError } from "./tree.js";
10
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
11
+ export function emptyState() {
12
+ return { records: new MemoryRecords(), edges: new Map(), bindings: new Map(), instructions: new Map(), observations: [], reviews: [], runs: new Map(), installed: [], reads: [], definitions: new Map() };
13
+ }
14
+ // A filter names its facet in a `facet` field, a view its `shape`, a contract its `kind`: the member kinds
15
+ // that carry another kind's word are read first, so `{filter, facet}` is a filter and never a facet.
16
+ const MEMBERS = ["filter", "view", "contract", "facet", "class", "rule", "kind", "shape", "permissions", "ownership", "units", "utility"];
17
+ /** The key of a `define` write's member: which kind of member, and its name. */
18
+ function memberKey(def) {
19
+ for (const m of MEMBERS)
20
+ if (typeof def[m] === "string")
21
+ return `${m}:${def[m]}`;
22
+ return null;
23
+ }
24
+ /** The source a value write carries: the write's own, else the entry's default, with `via` the entry. */
25
+ function sourceOf(entry, write) {
26
+ const base = isObj(entry.source) ? entry.source : {};
27
+ const own = isObj(write.source) ? write.source : {};
28
+ const merged = { ...base, ...own };
29
+ // A copied value keeps the source of where it came from (1.12, 1.7), so a write may name its own `via`.
30
+ const s = { origin: merged.origin ?? "reported", via: merged.via ?? String(entry.log) };
31
+ if (merged.owner)
32
+ s.owner = merged.owner;
33
+ if (merged.adopted)
34
+ s.adopted = true;
35
+ // The terms a value was taken under (7.8) ride on the write and come back with it.
36
+ if (typeof merged.until === "string")
37
+ s.until = merged.until;
38
+ if (merged.reshare === false)
39
+ s.reshare = false;
40
+ if (merged.revocable === true)
41
+ s.revocable = true;
42
+ return s;
43
+ }
44
+ /** Set or remove the value at a top-level key or `parts[row].key` address. */
45
+ function place(r, address, value, source) {
46
+ const part = address.match(/^parts\[([^\]]+)\]\.(\w+)$/);
47
+ if (part) {
48
+ const parts = (r.parts ?? []).filter(isObj);
49
+ let p = parts.find((x) => String(x.$row) === part[1]);
50
+ if (!p) {
51
+ p = { $row: part[1], values: {} };
52
+ parts.push(p);
53
+ }
54
+ const values = isObj(p.values) ? { ...p.values } : {};
55
+ if (value === undefined)
56
+ delete values[part[2]];
57
+ else
58
+ values[part[2]] = value;
59
+ p.values = values;
60
+ r.parts = parts;
61
+ }
62
+ else if (value === undefined)
63
+ delete r.values[address];
64
+ else
65
+ r.values[address] = value;
66
+ if (source) {
67
+ r.sources = { ...(r.sources ?? {}) };
68
+ if (value === undefined)
69
+ delete r.sources[address];
70
+ else
71
+ r.sources[address] = source;
72
+ }
73
+ }
74
+ function need(state, id, what) {
75
+ const r = state.records.get(id);
76
+ if (!r)
77
+ throw new CrubalError(`${what} names ${id}, a record the log hasn't created`);
78
+ // A record a working set shares between copies is frozen: the entry changes its own copy, set back.
79
+ if (Object.isFrozen(r)) {
80
+ const copy = structuredClone(r);
81
+ state.records.set(id, copy);
82
+ return copy;
83
+ }
84
+ return r;
85
+ }
86
+ /** Apply one entry's effects to the state. */
87
+ export function applyEntry(state, entry) {
88
+ if (typeof entry.redacted === "string")
89
+ return;
90
+ const writes = Array.isArray(entry.writes) ? entry.writes.filter(isObj) : [];
91
+ for (const w of writes) {
92
+ // A redacted write (8.5.2) is skipped: the state is rebuilt without what it held.
93
+ if (typeof w.redacted === "string")
94
+ continue;
95
+ if (typeof w.envelope === "string") {
96
+ applyEnvelope(state, entry, w);
97
+ continue;
98
+ }
99
+ if (isObj(w.edge)) {
100
+ state.edges.set(String(w.edge.edge), w.edge);
101
+ continue;
102
+ }
103
+ if (typeof w.edge === "string" && w.removed === true) {
104
+ state.edges.delete(w.edge);
105
+ continue;
106
+ }
107
+ if (isObj(w.binding)) {
108
+ const b = w.binding;
109
+ const key = `${b.contract}|${b.ref}`;
110
+ if (b.removed === true)
111
+ state.bindings.delete(key);
112
+ else
113
+ state.bindings.set(key, String(b.record));
114
+ continue;
115
+ }
116
+ if (isObj(w.instruction)) {
117
+ const i = w.instruction;
118
+ const issuer = String(i.issuer);
119
+ state.instructions.set(issuer, [...(state.instructions.get(issuer) ?? []), i]);
120
+ continue;
121
+ }
122
+ if (isObj(w.observation)) {
123
+ state.observations.push(w.observation);
124
+ continue;
125
+ }
126
+ if (isObj(w.review)) {
127
+ state.reviews.push(w.review);
128
+ continue;
129
+ }
130
+ if (typeof w.run === "string") {
131
+ state.runs.set(w.run, { ...(state.runs.get(w.run) ?? {}), ...w });
132
+ continue;
133
+ }
134
+ if (isObj(w.install)) {
135
+ state.installed.push(w.install);
136
+ continue;
137
+ }
138
+ if (isObj(w.define)) {
139
+ // A member of the working package as it now stands, or retired (8.5, 11.4).
140
+ const key = memberKey(w.define);
141
+ if (!key)
142
+ throw new CrubalError(`entry ${entry.log}: a define write names a ${MEMBERS.join(", ")}`);
143
+ if (w.define.retired === true)
144
+ state.definitions.delete(key);
145
+ else
146
+ state.definitions.set(key, w.define);
147
+ continue;
148
+ }
149
+ if (typeof w.read === "string") {
150
+ state.reads.push({ record: w.read, log: String(entry.log), by: (entry.by ?? "") });
151
+ continue;
152
+ }
153
+ if (typeof w.record === "string" && typeof w.address === "string") {
154
+ applyValue(state, entry, w);
155
+ continue;
156
+ }
157
+ throw new CrubalError(`entry ${entry.log} holds a write of no known kind: ${serialize(w)}`);
158
+ }
159
+ }
160
+ function applyValue(state, entry, w) {
161
+ const r = need(state, String(w.record), `entry ${entry.log}`);
162
+ const address = String(w.address);
163
+ const as = typeof w.as === "string" ? w.as : "current";
164
+ const source = sourceOf(entry, w);
165
+ const removed = w.removed === true;
166
+ if (typeof entry.at === "string")
167
+ r.updated = entry.at;
168
+ if (as === "current") {
169
+ place(r, address, removed ? undefined : w.value, source);
170
+ // A value made current is no longer held there.
171
+ if (r.held?.[address]) {
172
+ const { [address]: _h, ...rest } = r.held;
173
+ if (Object.keys(rest).length)
174
+ r.held = rest;
175
+ else
176
+ delete r.held;
177
+ }
178
+ return;
179
+ }
180
+ if (as === "held" && removed) {
181
+ // A hold let go by a decision (10.4): nothing comes back.
182
+ const held = { ...(r.held ?? {}) };
183
+ delete held[address];
184
+ if (Object.keys(held).length)
185
+ r.held = held;
186
+ else
187
+ delete r.held;
188
+ return;
189
+ }
190
+ if (as === "held") {
191
+ // Held: the value leaves the current state and waits, with the rule that held it (6.7).
192
+ const held = { ...(r.held ?? {}) };
193
+ const value = w.value ?? r.values[address];
194
+ if (value === undefined)
195
+ throw new CrubalError(`entry ${entry.log}: nothing at ${address} to hold`);
196
+ const kept = isObj(w.source) ? w.source : undefined;
197
+ held[address] = { value, ...(typeof w.rule === "string" ? { rule: w.rule } : {}), ...(typeof w.instruction === "string" ? { instruction: w.instruction } : {}), ...(kept ? { source: kept } : {}) };
198
+ r.held = held;
199
+ place(r, address, undefined, source);
200
+ return;
201
+ }
202
+ const value = w.value;
203
+ if (value === undefined && !removed)
204
+ throw new CrubalError(`entry ${entry.log}: a value landing as ${as} needs its value`);
205
+ if (as === "alternative" || as === "suggestion") {
206
+ const bag = { ...(r[as === "alternative" ? "alternatives" : "suggestions"] ?? {}) };
207
+ const item = { value: value, origin: source.origin, via: source.via, ...(source.owner ? { owner: source.owner } : {}) };
208
+ bag[address] = removed ? (bag[address] ?? []).filter((x) => serialize(x.value) !== serialize(value)) : [...(bag[address] ?? []), item];
209
+ if (!bag[address]?.length)
210
+ delete bag[address];
211
+ if (as === "alternative") {
212
+ if (Object.keys(bag).length)
213
+ r.alternatives = bag;
214
+ else
215
+ delete r.alternatives;
216
+ }
217
+ else if (Object.keys(bag).length)
218
+ r.suggestions = bag;
219
+ else
220
+ delete r.suggestions;
221
+ return;
222
+ }
223
+ throw new CrubalError(`entry ${entry.log}: a value lands as current, alternative, suggestion or held, not ${as}`);
224
+ }
225
+ function applyEnvelope(state, entry, w) {
226
+ const id = String(w.record);
227
+ const member = String(w.envelope);
228
+ if (member === "created") {
229
+ const v = isObj(w.value) ? w.value : {};
230
+ const r = { id, kind: String(v.kind), level: String(v.level), owner: String(v.owner ?? entry.owner ?? ""), values: {} };
231
+ if (typeof v.of === "string")
232
+ r.of = v.of;
233
+ if (typeof v.within === "string")
234
+ r.within = v.within;
235
+ if (Array.isArray(v.wears))
236
+ r.wears = v.wears.map(String);
237
+ if (typeof entry.at === "string") {
238
+ r.created = entry.at;
239
+ r.updated = entry.at;
240
+ }
241
+ state.records.set(id, r);
242
+ return;
243
+ }
244
+ const r = need(state, id, `entry ${entry.log}`);
245
+ if (typeof entry.at === "string")
246
+ r.updated = entry.at;
247
+ if (member === "of" || member === "within") {
248
+ if (w.removed === true)
249
+ delete r[member];
250
+ else
251
+ r[member] = String(w.value);
252
+ }
253
+ else if (member === "wears")
254
+ r.wears = Array.isArray(w.value) ? w.value.map(String) : [];
255
+ else if (member === "status") {
256
+ const s = isObj(w.value) ? w.value : {};
257
+ if (s.state === "archived") {
258
+ const st = { state: "archived" };
259
+ if (typeof s.reason === "string")
260
+ st.reason = s.reason;
261
+ if (typeof s.into === "string")
262
+ st.into = s.into;
263
+ r.status = st;
264
+ }
265
+ else
266
+ delete r.status;
267
+ }
268
+ else if (member === "applied") {
269
+ const v = isObj(w.value) ? w.value : {};
270
+ r.applied = { ...(r.applied ?? {}), ...Object.fromEntries(Object.entries(v).map(([k, n]) => [k, Number(n)])) };
271
+ }
272
+ else
273
+ throw new CrubalError(`entry ${entry.log}: no envelope member ${member}`);
274
+ }
275
+ /** Rebuild a store's state from its log alone (8.5.3). */
276
+ export function rebuild(entries) {
277
+ const state = emptyState();
278
+ for (const e of entries)
279
+ applyEntry(state, e);
280
+ return state;
281
+ }
282
+ /** The state as JSON, for comparing and for a dump. */
283
+ export function stateJson(state) {
284
+ const out = { records: [...state.records.values()] };
285
+ if (state.edges.size)
286
+ out.edges = [...state.edges.values()];
287
+ if (state.bindings.size)
288
+ out.bindings = Object.fromEntries(state.bindings);
289
+ if (state.instructions.size)
290
+ out.instructions = Object.fromEntries([...state.instructions].map(([k, v]) => [k, v]));
291
+ if (state.observations.length)
292
+ out.observations = state.observations;
293
+ if (state.reviews.length)
294
+ out.reviews = state.reviews;
295
+ if (state.runs.size)
296
+ out.runs = [...state.runs.values()];
297
+ if (state.installed.length)
298
+ out.installed = state.installed;
299
+ if (state.reads.length)
300
+ out.reads = state.reads;
301
+ if (state.definitions.size)
302
+ out.definitions = [...state.definitions.values()];
303
+ return out;
304
+ }
305
+ function sourceAt(r, key) {
306
+ return r.sources?.[key] ?? r.sources?.["*"];
307
+ }
308
+ const sameJson = (a, b) => serialize((a ?? "∅")) === serialize((b ?? "∅"));
309
+ /** The writes that take `before` to `after`: exactly the effects, nothing computed (8.5). */
310
+ export function diffWrites(before, after) {
311
+ const writes = [];
312
+ for (const [id, r] of after.records) {
313
+ const was = before.records.get(id);
314
+ const now = r;
315
+ if (!was) {
316
+ const v = { kind: now.kind, level: now.level, owner: now.owner };
317
+ if (now.of)
318
+ v.of = now.of;
319
+ if (now.within)
320
+ v.within = now.within;
321
+ if (now.wears)
322
+ v.wears = now.wears;
323
+ writes.push({ record: id, envelope: "created", value: v });
324
+ }
325
+ else {
326
+ for (const m of ["of", "within"]) {
327
+ if (was[m] === now[m])
328
+ continue;
329
+ writes.push(now[m] ? { record: id, envelope: m, value: now[m] } : { record: id, envelope: m, removed: true });
330
+ }
331
+ if (!sameJson(was.wears ?? [], now.wears ?? []))
332
+ writes.push({ record: id, envelope: "wears", value: now.wears ?? [] });
333
+ }
334
+ if (!sameJson((was?.status ?? {}), (now.status ?? {})))
335
+ writes.push({ record: id, envelope: "status", value: (now.status ?? { state: "active" }) });
336
+ if (!sameJson(was?.applied ?? {}, now.applied ?? {}))
337
+ writes.push({ record: id, envelope: "applied", value: now.applied ?? {} });
338
+ const heldWas = was?.held ?? {};
339
+ const heldNow = now.held ?? {};
340
+ const newlyHeld = new Set(Object.keys(heldNow).filter((k) => !sameJson(heldWas[k], heldNow[k])));
341
+ for (const k of newlyHeld) {
342
+ const h = heldNow[k];
343
+ // The value's source rides with the hold, so a release gives it back as it was (6.7).
344
+ const src = isObj(h.source) ? h.source : undefined;
345
+ writes.push({ record: id, address: k, as: "held", value: h.value, ...(typeof h.rule === "string" ? { rule: h.rule } : {}), ...(typeof h.instruction === "string" ? { instruction: h.instruction } : {}), ...(src ? { source: src } : {}) });
346
+ }
347
+ for (const k of Object.keys(heldWas))
348
+ if (heldNow[k] === undefined && now.values[k] === undefined)
349
+ writes.push({ record: id, address: k, as: "held", removed: true });
350
+ for (const [k, v] of Object.entries(now.values)) {
351
+ const s = sourceAt(now, k);
352
+ if (was && sameJson(was.values[k], v) && sameJson((sourceAt(was, k) ?? ""), (s ?? "")))
353
+ continue;
354
+ writes.push({ record: id, address: k, value: v, ...(s ? { source: s } : {}) });
355
+ }
356
+ for (const k of Object.keys(was?.values ?? {}))
357
+ if (now.values[k] === undefined && !newlyHeld.has(k))
358
+ writes.push({ record: id, address: k, removed: true });
359
+ for (const bag of ["alternatives", "suggestions"]) {
360
+ const bw = was?.[bag] ?? {};
361
+ // Items gone from the bag: accepted or denied (14.7), kept in the history as removed.
362
+ for (const [addr, olds] of Object.entries(bw)) {
363
+ const keep = (now[bag]?.[addr] ?? []).map((x) => serialize(x));
364
+ for (const it of olds)
365
+ if (!keep.includes(serialize(it)))
366
+ writes.push({ record: id, address: addr, as: bag === "alternatives" ? "alternative" : "suggestion", value: it.value, removed: true });
367
+ }
368
+ for (const [addr, items] of Object.entries(now[bag] ?? {})) {
369
+ const old = (bw[addr] ?? []).map((x) => serialize(x));
370
+ for (const it of items) {
371
+ if (old.includes(serialize(it)))
372
+ continue;
373
+ const src = { origin: it.origin, via: it.via, ...(it.owner ? { owner: it.owner } : {}) };
374
+ writes.push({ record: id, address: addr, as: bag === "alternatives" ? "alternative" : "suggestion", value: it.value, source: src });
375
+ }
376
+ }
377
+ }
378
+ }
379
+ for (const [key, record] of after.bindings) {
380
+ if (before.bindings.get(key) === record)
381
+ continue;
382
+ const at = key.indexOf("|");
383
+ writes.push({ binding: { contract: key.slice(0, at), ref: key.slice(at + 1), record } });
384
+ }
385
+ for (const [issuer, list] of after.instructions) {
386
+ const have = before.instructions.get(issuer)?.length ?? 0;
387
+ for (const i of list.slice(have))
388
+ writes.push({ instruction: { issuer, ...i } });
389
+ }
390
+ for (const [id, e] of after.edges)
391
+ if (!sameJson(before.edges.get(id), e))
392
+ writes.push({ edge: e });
393
+ for (const id of before.edges.keys())
394
+ if (!after.edges.has(id))
395
+ writes.push({ edge: id, removed: true });
396
+ for (const item of after.review.slice(before.reviews.length))
397
+ writes.push({ review: item });
398
+ return writes;
399
+ }
400
+ /** A record with its sources spelled per key and its times dropped, so a draft and a rebuilt state compare. */
401
+ function normal(r) {
402
+ const x = r;
403
+ const sources = {};
404
+ for (const k of Object.keys(r.values)) {
405
+ const s = sourceAt(r, k);
406
+ if (s)
407
+ sources[k] = s;
408
+ }
409
+ const { created: _c, updated: _u, sources: _s, ...rest } = x;
410
+ return { ...rest, sources };
411
+ }
412
+ /** Where a draft and a state disagree, or null. */
413
+ export function differs(state, draft) {
414
+ for (const [id, r] of draft.records) {
415
+ const s = state.records.get(id);
416
+ if (!s)
417
+ return `${id} is in the draft but not the state`;
418
+ if (serialize(normal(s)) !== serialize(normal(r)))
419
+ return `${id}: draft ${serialize(normal(r))} state ${serialize(normal(s))}`;
420
+ }
421
+ for (const id of state.records.keys())
422
+ if (!draft.records.has(id))
423
+ return `${id} is in the state but not the draft`;
424
+ for (const [k, v] of draft.bindings)
425
+ if (state.bindings.get(k) !== v)
426
+ return `binding ${k}`;
427
+ for (const [k, v] of draft.instructions)
428
+ if ((state.instructions.get(k)?.length ?? 0) !== v.length)
429
+ return `instructions of ${k}`;
430
+ return null;
431
+ }
432
+ /**
433
+ * The journal (8.5): operations work on a draft, every change becomes an entry, and the state is only ever
434
+ * what applying the entries gives. A commit whose entries don't describe the whole change is refused, so
435
+ * the log can never fall behind the state.
436
+ */
437
+ export class Journal {
438
+ state = emptyState();
439
+ entries = [];
440
+ draft;
441
+ owner;
442
+ n = 0;
443
+ constructor(owner, records = [], at) {
444
+ this.owner = owner;
445
+ this.draft = { records: new MemoryRecords(), bindings: new Map(), instructions: new Map(), edges: new Map(), review: [] };
446
+ for (const r of records)
447
+ this.draft.records.set(r.id, structuredClone(r));
448
+ if (records.length)
449
+ this.commit({ migration: "backfill" }, () => { }, at);
450
+ }
451
+ /**
452
+ * Run an operation on the draft, log what it changed, and apply the entry to the state. `extra` carries
453
+ * writes the diff can't see (a run's state, a read under an emergency edge, a define).
454
+ */
455
+ commit(by, mutate, at, extra = []) {
456
+ mutate(this.draft);
457
+ const writes = [...diffWrites(this.state, this.draft), ...extra];
458
+ if (!writes.length)
459
+ return null;
460
+ this.n += 1;
461
+ const entry = { log: `J-${this.n}`, owner: this.owner, at: at ?? new Date().toISOString().replace(/\.\d{3}Z$/, "Z"), by, writes };
462
+ applyEntry(this.state, entry);
463
+ this.entries.push(entry);
464
+ const problem = differs(this.state, this.draft);
465
+ if (problem)
466
+ throw new CrubalError(`the log doesn't describe the change: ${problem}`);
467
+ return entry;
468
+ }
469
+ }
470
+ /**
471
+ * Can this whole entry be redacted (8.5.2)? Only when it holds nothing but value, observation and read
472
+ * writes and isn't witnessed; otherwise it is redacted write by write. Returns the reason it can't, or null.
473
+ */
474
+ export function redactable(entry) {
475
+ if (entry.witnessed === true)
476
+ return "a witnessed entry is never redacted";
477
+ const writes = Array.isArray(entry.writes) ? entry.writes.filter(isObj) : [];
478
+ for (const w of writes)
479
+ if (redactableWrite(entry, w))
480
+ return "an entry holding a write that is never redacted is redacted write by write, never whole";
481
+ return null;
482
+ }
483
+ /** Can this write be redacted (8.5.2)? Null when it can, else why not. */
484
+ export function redactableWrite(entry, w) {
485
+ if (entry.witnessed === true)
486
+ return "a witnessed entry is never redacted";
487
+ if (typeof w.redacted === "string")
488
+ return null;
489
+ const value = typeof w.record === "string" && typeof w.address === "string";
490
+ if (value || isObj(w.observation) || typeof w.read === "string")
491
+ return null;
492
+ return "a write that created a record, changed its envelope or a definition, or wrote an edge, binding, review, instruction, run or install is never redacted";
493
+ }
494
+ /** Redact one write of an entry (8.5.2): it becomes its own hash, and the entry's hash stays where it was. */
495
+ export function redactWrite(entry, index) {
496
+ const writes = Array.isArray(entry.writes) ? [...entry.writes] : [];
497
+ const w = writes[index];
498
+ if (!isObj(w))
499
+ throw new Error(`no write ${index}`);
500
+ const why = redactableWrite(entry, w);
501
+ if (why)
502
+ throw new Error(why);
503
+ writes[index] = { redacted: `sha256:${writeHash(w)}` };
504
+ return { ...entry, writes };
505
+ }
506
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/log.ts"],"names":[],"mappings":"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"}
@@ -64,6 +64,16 @@ export type Step = {
64
64
  to: string;
65
65
  line: number;
66
66
  text: string;
67
+ }
68
+ /** `fill: value` with `for: level::` and `when:` beneath: records lacking the key get the value (10.3). */
69
+ | {
70
+ verb: "fill";
71
+ facet: string;
72
+ value: string;
73
+ level?: string;
74
+ when?: string;
75
+ line: number;
76
+ text: string;
67
77
  };
68
78
  export type Recipe = {
69
79
  from: string;
@@ -82,7 +92,20 @@ export type ReviewItem = {
82
92
  held: true;
83
93
  };
84
94
  /** Restamp records with a recipe. Returns the restamped records and the review queue. */
85
- export declare function restamp(records: Record[], recipe: Recipe, dict: Dictionary): {
95
+ export type StepStats = {
96
+ step: string;
97
+ facet: string;
98
+ verb: string;
99
+ changed: number;
100
+ review: number;
101
+ };
102
+ export declare function restamp(records: Record[], recipe: Recipe, dict: Dictionary, stats?: StepStats[]): {
86
103
  records: Record[];
87
104
  review: ReviewItem[];
88
105
  };
106
+ /** What a restamp would do, without doing it (10.4): per step, how many values change and how many go to review. */
107
+ export declare function dryRun(records: Record[], recipe: Recipe, dict: Dictionary): {
108
+ steps: StepStats[];
109
+ records: number;
110
+ review: number;
111
+ };