@loomwork/ui-lineage 0.0.0-stage → 0.1.1
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 +202 -0
- package/NOTICE +8 -0
- package/README.md +471 -2
- package/dist/conformance.d.ts +4 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +143 -0
- package/dist/conformance.js.map +1 -0
- package/dist/derive.d.ts +15 -0
- package/dist/derive.d.ts.map +1 -0
- package/dist/derive.js +35 -0
- package/dist/derive.js.map +1 -0
- package/dist/esm/conformance.js +140 -0
- package/dist/esm/conformance.js.map +1 -0
- package/dist/esm/derive.js +29 -0
- package/dist/esm/derive.js.map +1 -0
- package/dist/esm/events.js +101 -0
- package/dist/esm/events.js.map +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lineage.js +1376 -0
- package/dist/esm/lineage.js.map +1 -0
- package/dist/esm/retention.js +73 -0
- package/dist/esm/retention.js.map +1 -0
- package/dist/esm/rootsFor.js +49 -0
- package/dist/esm/rootsFor.js.map +1 -0
- package/dist/esm/seen.js +733 -0
- package/dist/esm/seen.js.map +1 -0
- package/dist/esm/seenCrypto.js +197 -0
- package/dist/esm/seenCrypto.js.map +1 -0
- package/dist/esm/seenGc.js +122 -0
- package/dist/esm/seenGc.js.map +1 -0
- package/dist/esm/state.js +185 -0
- package/dist/esm/state.js.map +1 -0
- package/dist/esm/store.js +172 -0
- package/dist/esm/store.js.map +1 -0
- package/dist/events.d.ts +781 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +106 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/lineage.d.ts +394 -0
- package/dist/lineage.d.ts.map +1 -0
- package/dist/lineage.js +1383 -0
- package/dist/lineage.js.map +1 -0
- package/dist/retention.d.ts +45 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +78 -0
- package/dist/retention.js.map +1 -0
- package/dist/rootsFor.d.ts +33 -0
- package/dist/rootsFor.d.ts.map +1 -0
- package/dist/rootsFor.js +52 -0
- package/dist/rootsFor.js.map +1 -0
- package/dist/seen.d.ts +375 -0
- package/dist/seen.d.ts.map +1 -0
- package/dist/seen.js +739 -0
- package/dist/seen.js.map +1 -0
- package/dist/seenCrypto.d.ts +72 -0
- package/dist/seenCrypto.d.ts.map +1 -0
- package/dist/seenCrypto.js +210 -0
- package/dist/seenCrypto.js.map +1 -0
- package/dist/seenGc.d.ts +73 -0
- package/dist/seenGc.d.ts.map +1 -0
- package/dist/seenGc.js +126 -0
- package/dist/seenGc.js.map +1 -0
- package/dist/state.d.ts +66 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +190 -0
- package/dist/state.js.map +1 -0
- package/dist/store.d.ts +93 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +177 -0
- package/dist/store.js.map +1 -0
- package/package.json +60 -3
- package/src/conformance.ts +148 -0
- package/src/derive.ts +57 -0
- package/src/events.ts +125 -0
- package/src/index.ts +79 -0
- package/src/lineage.ts +1655 -0
- package/src/retention.ts +118 -0
- package/src/rootsFor.ts +75 -0
- package/src/seen.ts +965 -0
- package/src/seenCrypto.ts +271 -0
- package/src/seenGc.ts +233 -0
- package/src/state.ts +268 -0
- package/src/store.ts +274 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"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"}
|
package/dist/derive.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Experience, type Provenance } from "@loomwork/ui-core";
|
|
2
|
+
export interface Authored {
|
|
3
|
+
readonly by: Provenance;
|
|
4
|
+
readonly at: string;
|
|
5
|
+
}
|
|
6
|
+
/** The unsealed artifact a revert to `target` produces on top of `head`. Same line, same id. */
|
|
7
|
+
export declare function revertArtifact(head: Experience, target: Experience, a: Authored): Experience;
|
|
8
|
+
/**
|
|
9
|
+
* The unsealed first artifact of the line `experienceId`, forked from `source` with the classes of
|
|
10
|
+
* `carriedFrom` (the source line's head at the fork) carried in. Its parent is `source` — a version
|
|
11
|
+
* of ANOTHER line, which is how a branch is told from a genesis.
|
|
12
|
+
*/
|
|
13
|
+
export declare function branchArtifact(source: Experience, carriedFrom: Experience, experienceId: string, a: Authored): Experience;
|
|
14
|
+
export declare const authorOf: (by: Provenance) => string;
|
|
15
|
+
//# sourceMappingURL=derive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAgB,MAAM,mBAAmB,CAAC;AAkBnF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,GAAG,UAAU,CAS5F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,UAAU,EACvB,YAAY,EAAE,MAAM,EACpB,CAAC,EAAE,QAAQ,GACV,UAAU,CASZ;AAED,eAAO,MAAM,QAAQ,GAAI,IAAI,UAAU,KAAG,MAA2C,CAAC"}
|
package/dist/derive.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authorOf = void 0;
|
|
4
|
+
exports.revertArtifact = revertArtifact;
|
|
5
|
+
exports.branchArtifact = branchArtifact;
|
|
6
|
+
const ui_core_1 = require("@loomwork/ui-core");
|
|
7
|
+
/** The unsealed artifact a revert to `target` produces on top of `head`. Same line, same id. */
|
|
8
|
+
function revertArtifact(head, target, a) {
|
|
9
|
+
const adopted = {
|
|
10
|
+
...target,
|
|
11
|
+
experienceId: head.experienceId,
|
|
12
|
+
versionHash: "",
|
|
13
|
+
parents: [head.versionHash],
|
|
14
|
+
meta: { author: (0, exports.authorOf)(a.by), createdAt: a.at, sourceKind: "revert" },
|
|
15
|
+
};
|
|
16
|
+
return (0, ui_core_1.carryClasses)(head, adopted);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The unsealed first artifact of the line `experienceId`, forked from `source` with the classes of
|
|
20
|
+
* `carriedFrom` (the source line's head at the fork) carried in. Its parent is `source` — a version
|
|
21
|
+
* of ANOTHER line, which is how a branch is told from a genesis.
|
|
22
|
+
*/
|
|
23
|
+
function branchArtifact(source, carriedFrom, experienceId, a) {
|
|
24
|
+
const adopted = {
|
|
25
|
+
...source,
|
|
26
|
+
experienceId,
|
|
27
|
+
versionHash: "",
|
|
28
|
+
parents: [source.versionHash],
|
|
29
|
+
meta: { author: (0, exports.authorOf)(a.by), createdAt: a.at, sourceKind: "branch" },
|
|
30
|
+
};
|
|
31
|
+
return (0, ui_core_1.carryClasses)(carriedFrom, adopted);
|
|
32
|
+
}
|
|
33
|
+
const authorOf = (by) => by.agentId ?? by.ref ?? by.source;
|
|
34
|
+
exports.authorOf = authorOf;
|
|
35
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":";;;AAwBA,wCASC;AAOD,wCAcC;AAtDD,+CAAmF;AAuBnF,gGAAgG;AAChG,SAAgB,cAAc,CAAC,IAAgB,EAAE,MAAkB,EAAE,CAAW;IAC9E,MAAM,OAAO,GAAe;QAC1B,GAAG,MAAM;QACT,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;QAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;KACxE,CAAC;IACF,OAAO,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAC5B,MAAkB,EAClB,WAAuB,EACvB,YAAoB,EACpB,CAAW;IAEX,MAAM,OAAO,GAAe;QAC1B,GAAG,MAAM;QACT,YAAY;QACZ,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7B,IAAI,EAAE,EAAE,MAAM,EAAE,IAAA,gBAAQ,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;KACxE,CAAC;IACF,OAAO,IAAA,sBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAEM,MAAM,QAAQ,GAAG,CAAC,EAAc,EAAU,EAAE,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC;AAAzE,QAAA,QAAQ,YAAiE"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// ── The LineageStore conformance kit ──────────────────────────────────────────
|
|
2
|
+
// Returns findings (a test asserts the list is empty), never throws: a store that throws on a case
|
|
3
|
+
// is reported as a finding, like `checkPlannerConformance`. Each case uses a fresh line id, so one
|
|
4
|
+
// `make()` store serves them all — but a backend that cannot isolate lines is exactly what the
|
|
5
|
+
// "lines are independent" case catches.
|
|
6
|
+
const rec = (n) => ({
|
|
7
|
+
type: "EXPERIENCE_COMPOSED",
|
|
8
|
+
payload: { n },
|
|
9
|
+
at: "2026-10-06T00:00:00.000Z",
|
|
10
|
+
});
|
|
11
|
+
export async function checkLineageStoreConformance(make) {
|
|
12
|
+
const findings = [];
|
|
13
|
+
const fail = (code, message) => findings.push({ code, severity: "error", message });
|
|
14
|
+
const store = await make();
|
|
15
|
+
const cases = [
|
|
16
|
+
[
|
|
17
|
+
"an unknown line reads empty",
|
|
18
|
+
async () => {
|
|
19
|
+
const r = await store.read("c-empty");
|
|
20
|
+
if (r.length !== 0)
|
|
21
|
+
fail("read-unknown", `an unknown line read ${r.length} records`);
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
[
|
|
25
|
+
"append at tip 0 wins sequence 1; the sequence is dense",
|
|
26
|
+
async () => {
|
|
27
|
+
const a = await store.append("c-seq", 0, rec(1));
|
|
28
|
+
const b = await store.append("c-seq", 1, rec(2));
|
|
29
|
+
if (!a.ok || a.sequence !== 1 || !b.ok || b.sequence !== 2)
|
|
30
|
+
fail("append-sequence", `sequential appends returned ${JSON.stringify([a, b])}`);
|
|
31
|
+
const r = await store.read("c-seq");
|
|
32
|
+
if (r.map((x) => x.sequence).join() !== "1,2")
|
|
33
|
+
fail("read-order", `read returned sequences ${r.map((x) => x.sequence).join()}`);
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
[
|
|
37
|
+
"a stale expectedSequence is refused with the real tip and writes nothing",
|
|
38
|
+
async () => {
|
|
39
|
+
await store.append("c-stale", 0, rec(1));
|
|
40
|
+
const s = await store.append("c-stale", 0, rec(2));
|
|
41
|
+
if (s.ok || s.tip !== 1)
|
|
42
|
+
fail("stale-append", `a stale append returned ${JSON.stringify(s)}`);
|
|
43
|
+
const ahead = await store.append("c-stale", 5, rec(3));
|
|
44
|
+
if (ahead.ok || ahead.tip !== 1)
|
|
45
|
+
fail("gap-append", `an append past the tip (a gap) returned ${JSON.stringify(ahead)}`);
|
|
46
|
+
const r = await store.read("c-stale");
|
|
47
|
+
if (r.length !== 1)
|
|
48
|
+
fail("refused-wrote", `a refused append left ${r.length} records`);
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
[
|
|
52
|
+
"of N concurrent appends at one tip exactly one wins",
|
|
53
|
+
async () => {
|
|
54
|
+
const outs = await Promise.all(Array.from({ length: 8 }, (_, i) => store.append("c-race", 0, rec(i))));
|
|
55
|
+
const wins = outs.filter((o) => o.ok).length;
|
|
56
|
+
if (wins !== 1)
|
|
57
|
+
fail("race", `${wins} of 8 concurrent appends at the same tip won`);
|
|
58
|
+
const r = await store.read("c-race");
|
|
59
|
+
if (r.length !== 1)
|
|
60
|
+
fail("race-log", `the raced line holds ${r.length} records`);
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
[
|
|
64
|
+
"lines are independent",
|
|
65
|
+
async () => {
|
|
66
|
+
await store.append("c-iso-a", 0, rec(1));
|
|
67
|
+
const b = await store.append("c-iso-b", 0, rec(2));
|
|
68
|
+
if (!b.ok)
|
|
69
|
+
fail("isolation", "an append to a second line was refused by the first line's tip");
|
|
70
|
+
if ((await store.read("c-iso-a")).length !== 1)
|
|
71
|
+
fail("isolation", "a line holds another's record");
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
[
|
|
75
|
+
"payloads round-trip and neither side aliases the log",
|
|
76
|
+
async () => {
|
|
77
|
+
const payload = { nested: { list: [1, 2, { k: "v" }] } };
|
|
78
|
+
await store.append("c-copy", 0, {
|
|
79
|
+
type: "EXPERIENCE_COMPOSED",
|
|
80
|
+
payload,
|
|
81
|
+
at: "2026-10-06T00:00:00.000Z",
|
|
82
|
+
});
|
|
83
|
+
payload.nested.list.push(3);
|
|
84
|
+
const first = await store.read("c-copy");
|
|
85
|
+
if (JSON.stringify(first[0]?.payload) !==
|
|
86
|
+
JSON.stringify({ nested: { list: [1, 2, { k: "v" }] } }))
|
|
87
|
+
fail("copy-in", "mutating a payload after append changed the stored record");
|
|
88
|
+
first[0]?.payload.nested.list.push(9);
|
|
89
|
+
const second = await store.read("c-copy");
|
|
90
|
+
if (JSON.stringify(second[0]?.payload).includes("9"))
|
|
91
|
+
fail("copy-out", "mutating a read result changed the stored record");
|
|
92
|
+
if (second[0]?.type !== "EXPERIENCE_COMPOSED" ||
|
|
93
|
+
second[0]?.at !== "2026-10-06T00:00:00.000Z")
|
|
94
|
+
fail("fields", "type or at did not round-trip");
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
[
|
|
98
|
+
"optional readTail / readAfter / listStreams agree with read (when implemented)",
|
|
99
|
+
async () => {
|
|
100
|
+
for (let i = 0; i < 5; i++)
|
|
101
|
+
await store.append("c-opt", i, rec(i));
|
|
102
|
+
const all = await store.read("c-opt");
|
|
103
|
+
const seqs = (r) => r.map((x) => x.sequence).join();
|
|
104
|
+
if (store.readTail !== undefined) {
|
|
105
|
+
if (seqs(await store.readTail("c-opt", 2)) !== "4,5")
|
|
106
|
+
fail("read-tail", "readTail(2) did not return the newest two records in order");
|
|
107
|
+
if (seqs(await store.readTail("c-opt", 99)) !== seqs(all))
|
|
108
|
+
fail("read-tail", "readTail past the length did not return the whole line");
|
|
109
|
+
if ((await store.readTail("c-opt-none", 3)).length !== 0)
|
|
110
|
+
fail("read-tail", "readTail of an unknown line was not empty");
|
|
111
|
+
}
|
|
112
|
+
if (store.readAfter !== undefined) {
|
|
113
|
+
if (seqs(await store.readAfter("c-opt", 3)) !== "4,5")
|
|
114
|
+
fail("read-after", "readAfter(3) did not return the records past sequence 3");
|
|
115
|
+
if (seqs(await store.readAfter("c-opt", 0, 2)) !== "1,2")
|
|
116
|
+
fail("read-after", "readAfter(0, 2) did not honour the limit");
|
|
117
|
+
if ((await store.readAfter("c-opt", 5)).length !== 0)
|
|
118
|
+
fail("read-after", "readAfter at the tip was not empty");
|
|
119
|
+
}
|
|
120
|
+
if (store.listStreams !== undefined) {
|
|
121
|
+
const ids = [];
|
|
122
|
+
for await (const id of store.listStreams())
|
|
123
|
+
ids.push(id);
|
|
124
|
+
if (!ids.includes("c-opt") || new Set(ids).size !== ids.length)
|
|
125
|
+
fail("list-streams", "listStreams missed a line or listed one twice");
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
];
|
|
130
|
+
for (const [name, run] of cases) {
|
|
131
|
+
try {
|
|
132
|
+
await run();
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
fail("store-threw", `${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return findings;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../../src/conformance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { carryClasses } from "@loomwork/ui-core";
|
|
2
|
+
/** The unsealed artifact a revert to `target` produces on top of `head`. Same line, same id. */
|
|
3
|
+
export function revertArtifact(head, target, a) {
|
|
4
|
+
const adopted = {
|
|
5
|
+
...target,
|
|
6
|
+
experienceId: head.experienceId,
|
|
7
|
+
versionHash: "",
|
|
8
|
+
parents: [head.versionHash],
|
|
9
|
+
meta: { author: authorOf(a.by), createdAt: a.at, sourceKind: "revert" },
|
|
10
|
+
};
|
|
11
|
+
return carryClasses(head, adopted);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The unsealed first artifact of the line `experienceId`, forked from `source` with the classes of
|
|
15
|
+
* `carriedFrom` (the source line's head at the fork) carried in. Its parent is `source` — a version
|
|
16
|
+
* of ANOTHER line, which is how a branch is told from a genesis.
|
|
17
|
+
*/
|
|
18
|
+
export function branchArtifact(source, carriedFrom, experienceId, a) {
|
|
19
|
+
const adopted = {
|
|
20
|
+
...source,
|
|
21
|
+
experienceId,
|
|
22
|
+
versionHash: "",
|
|
23
|
+
parents: [source.versionHash],
|
|
24
|
+
meta: { author: authorOf(a.by), createdAt: a.at, sourceKind: "branch" },
|
|
25
|
+
};
|
|
26
|
+
return carryClasses(carriedFrom, adopted);
|
|
27
|
+
}
|
|
28
|
+
export const authorOf = (by) => by.agentId ?? by.ref ?? by.source;
|
|
29
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/derive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBnF,gGAAgG;AAChG,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,MAAkB,EAAE,CAAW;IAC9E,MAAM,OAAO,GAAe;QAC1B,GAAG,MAAM;QACT,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;QAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;KACxE,CAAC;IACF,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAkB,EAClB,WAAuB,EACvB,YAAoB,EACpB,CAAW;IAEX,MAAM,OAAO,GAAe;QAC1B,GAAG,MAAM;QACT,YAAY;QACZ,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7B,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;KACxE,CAAC;IACF,OAAO,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAc,EAAU,EAAE,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Operation, Provenance, Sensitivity } from "@loomwork/ui-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
// ── The lineage event protocol ────────────────────────────────────────────────
|
|
4
|
+
// A lineage is the append-only log of ONE experience's versions. Every entry is an event whose
|
|
5
|
+
// type names what happened and whose payload carries the content address (`ref`) of the stored
|
|
6
|
+
// artifact plus enough to VERIFY it without trusting the blob:
|
|
7
|
+
//
|
|
8
|
+
// EXPERIENCE_COMPOSED a version produced by ops folded onto its parent (or the genesis, ops [])
|
|
9
|
+
// EXPERIENCE_REVERTED a version that restores an older artifact's content as a NEW version
|
|
10
|
+
// EXPERIENCE_BRANCHED the first version of a NEW lineage forked from a version of another
|
|
11
|
+
// EXPERIENCE_PROMOTED the app chose to SHOW a version (head is "latest", promoted is "shown")
|
|
12
|
+
//
|
|
13
|
+
// `EXPERIENCE_COMPOSED` is the same name and `{ ref, parents, ops }` core's `log.ts` declared as a
|
|
14
|
+
// userspace convention; here it gains a producer, a consumer and a validator. The extra fields
|
|
15
|
+
// (`experienceId`, `versionHash`, `by`) are additive. `EXPERIENCE_PROMOTED` is redeclared (not
|
|
16
|
+
// imported) because importing it from `@loomwork/ui-planner` would put the planner's whole graph —
|
|
17
|
+
// hydration, the sandbox — into a server-side store package; `lineage.test.ts` asserts the two
|
|
18
|
+
// spellings never drift.
|
|
19
|
+
export const EXPERIENCE_COMPOSED = "EXPERIENCE_COMPOSED";
|
|
20
|
+
export const EXPERIENCE_REVERTED = "EXPERIENCE_REVERTED";
|
|
21
|
+
export const EXPERIENCE_BRANCHED = "EXPERIENCE_BRANCHED";
|
|
22
|
+
export const EXPERIENCE_PROMOTED = "EXPERIENCE_PROMOTED";
|
|
23
|
+
const ContentRefSchema = z.object({ __loomContent: z.string().min(1) });
|
|
24
|
+
const Hash = z.string().min(1);
|
|
25
|
+
const RecordedOperationSchema = z.object({
|
|
26
|
+
op: Operation,
|
|
27
|
+
baseVersion: z.string().optional(),
|
|
28
|
+
by: Provenance,
|
|
29
|
+
at: z.string(),
|
|
30
|
+
});
|
|
31
|
+
const Common = {
|
|
32
|
+
experienceId: z.string().min(1),
|
|
33
|
+
versionHash: Hash,
|
|
34
|
+
ref: ContentRefSchema,
|
|
35
|
+
parents: z.array(Hash),
|
|
36
|
+
by: Provenance,
|
|
37
|
+
};
|
|
38
|
+
export const ComposedPayload = z.object({
|
|
39
|
+
...Common,
|
|
40
|
+
ops: z.array(RecordedOperationSchema),
|
|
41
|
+
/**
|
|
42
|
+
* What the author said about the change (U7): UNTRUSTED text (a planner's model text), bounded
|
|
43
|
+
* and stripped by `boundSummary` on the way in AND on the way out of the fold, since the log is
|
|
44
|
+
* untrusted input. Optional, so every version written before it replays unchanged; it is not in
|
|
45
|
+
* the content address (nothing here is).
|
|
46
|
+
*/
|
|
47
|
+
summary: z.string().optional(),
|
|
48
|
+
/**
|
|
49
|
+
* The strictest class of everything the author READ to write `summary` (the experience, tool
|
|
50
|
+
* samples, caller context), stamped by the host at compose. A summary is judged against it (and
|
|
51
|
+
* against the version's own class floor) before a viewer is shown it. Recorded on the event, not
|
|
52
|
+
* in the content address. Absent = unknown, and the floor alone gates the summary.
|
|
53
|
+
*/
|
|
54
|
+
summaryClass: Sensitivity.optional(),
|
|
55
|
+
});
|
|
56
|
+
export const RevertedPayload = z.object({ ...Common, revertedTo: Hash });
|
|
57
|
+
export const BranchedPayload = z.object({
|
|
58
|
+
...Common,
|
|
59
|
+
from: z.object({ experienceId: z.string().min(1), versionHash: Hash }),
|
|
60
|
+
/** The version of the SOURCE line whose sticky classes were carried in (its head at the fork). */
|
|
61
|
+
carriedFrom: Hash,
|
|
62
|
+
});
|
|
63
|
+
export const PromotedPayload = z.object({
|
|
64
|
+
ref: ContentRefSchema,
|
|
65
|
+
experienceId: z.string().min(1),
|
|
66
|
+
versionHash: Hash,
|
|
67
|
+
by: Provenance,
|
|
68
|
+
});
|
|
69
|
+
export const PAYLOAD_SCHEMAS = {
|
|
70
|
+
[EXPERIENCE_COMPOSED]: ComposedPayload,
|
|
71
|
+
[EXPERIENCE_REVERTED]: RevertedPayload,
|
|
72
|
+
[EXPERIENCE_BRANCHED]: BranchedPayload,
|
|
73
|
+
[EXPERIENCE_PROMOTED]: PromotedPayload,
|
|
74
|
+
};
|
|
75
|
+
export const isLineageEventType = (t) => Object.hasOwn(PAYLOAD_SCHEMAS, t);
|
|
76
|
+
/**
|
|
77
|
+
* The payload paths that carry host or model TEXT, per event type: the op props and labels, the
|
|
78
|
+
* author's `summary` and the `by` provenance (a user's own words and ids). These are what a host
|
|
79
|
+
* seals under its owner's key so erasing the owner makes the line unreadable
|
|
80
|
+
* (`registerLineageSensitivePaths`). Everything else on an event is an identifier (`experienceId`,
|
|
81
|
+
* `versionHash`, `ref`, `parents`, `from`, `carriedFrom`, `revertedTo`) or a class
|
|
82
|
+
* (`summaryClass`), and stays plain so the log's structure survives the key.
|
|
83
|
+
*
|
|
84
|
+
* `ops` is one path: it covers every nested op's `by`, props, labels and prompt text.
|
|
85
|
+
*/
|
|
86
|
+
export const LINEAGE_SENSITIVE_PATHS = {
|
|
87
|
+
[EXPERIENCE_COMPOSED]: ["ops", "summary", "by"],
|
|
88
|
+
[EXPERIENCE_REVERTED]: ["by"],
|
|
89
|
+
[EXPERIENCE_BRANCHED]: ["by"],
|
|
90
|
+
[EXPERIENCE_PROMOTED]: ["by"],
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Register {@link LINEAGE_SENSITIVE_PATHS} on a crypto event store (`EncryptingEventStore`'s
|
|
94
|
+
* `registerSensitive`). Call it once at composition, before the first lineage write: what was
|
|
95
|
+
* written before stays plaintext.
|
|
96
|
+
*/
|
|
97
|
+
export function registerLineageSensitivePaths(store) {
|
|
98
|
+
for (const [type, paths] of Object.entries(LINEAGE_SENSITIVE_PATHS))
|
|
99
|
+
store.registerSensitive(type, paths);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iFAAiF;AACjF,+FAA+F;AAC/F,+FAA+F;AAC/F,+DAA+D;AAC/D,EAAE;AACF,mGAAmG;AACnG,8FAA8F;AAC9F,6FAA6F;AAC7F,iGAAiG;AACjG,EAAE;AACF,mGAAmG;AACnG,+FAA+F;AAC/F,+FAA+F;AAC/F,mGAAmG;AACnG,+FAA+F;AAC/F,yBAAyB;AAEzB,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAQzD,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxE,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE/B,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,SAAS;IACb,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG;IACb,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,gBAAgB;IACrB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACtB,EAAE,EAAE,UAAU;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,MAAM;IACT,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;IACrC;;;;;OAKG;IACH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B;;;;;OAKG;IACH,YAAY,EAAE,WAAW,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,MAAM;IACT,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACtE,kGAAkG;IAClG,WAAW,EAAE,IAAI;CAClB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,EAAE,gBAAgB;IACrB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,IAAI;IACjB,EAAE,EAAE,UAAU;CACf,CAAC,CAAC;AAQH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,CAAC,mBAAmB,CAAC,EAAE,eAAe;IACtC,CAAC,mBAAmB,CAAC,EAAE,eAAe;IACtC,CAAC,mBAAmB,CAAC,EAAE,eAAe;IACtC,CAAC,mBAAmB,CAAC,EAAE,eAAe;CAC9B,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAyB,EAAE,CACrE,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AAEpC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA0D;IAC5F,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC;IAC/C,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC;IAC7B,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC;IAC7B,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,KAE7C;IACC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC;QACjE,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { LineErasedError, LineUnreadableError, Lineage, classifyLineFailure } from "./lineage";
|
|
2
|
+
export { branchArtifact, revertArtifact } from "./derive";
|
|
3
|
+
export { BranchedPayload, ComposedPayload, EXPERIENCE_BRANCHED, EXPERIENCE_COMPOSED, EXPERIENCE_PROMOTED, EXPERIENCE_REVERTED, LINEAGE_SENSITIVE_PATHS, PromotedPayload, RevertedPayload, registerLineageSensitivePaths, } from "./events";
|
|
4
|
+
export { foldLineage } from "./state";
|
|
5
|
+
export { InMemoryLineageStore, LINEAGE_STREAM_PREFIX, LINEAGE_WORKFLOW_ID, LOOM_UI_STREAM_NAMESPACE, eventStoreLineageStore, } from "./store";
|
|
6
|
+
export { checkLineageStoreConformance } from "./conformance";
|
|
7
|
+
export { DEFAULT_MAX_SEEN_VIEWS, DEFAULT_MAX_SKEW_MS, MAX_SEEN_READ, SEEN_STREAM_PREFIX, SEEN_WORKFLOW_ID, SeenLog, VIEWER_ERASED, VIEWS_RETAINED, VIEW_RECORDED, ViewRecordPayload, seenStoreOptions, seenStreamKey, } from "./seen";
|
|
8
|
+
export { InMemorySeenKeyStore, SEALED_REF_BLOCK, checkSeenKeyStoreConformance, seenKeySubject, } from "./seenCrypto";
|
|
9
|
+
export { collectSeenGarbage, collectSeenRoots } from "./seenGc";
|
|
10
|
+
export { DEFAULT_KEEP_LAST, retainedVersions, validateRetentionPolicy } from "./retention";
|
|
11
|
+
export { rootsFor } from "./rootsFor";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAW/F,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,EACL,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,eAAe,EACf,6BAA6B,GAC9B,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,SAAS,CAAC;AAQjB,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,aAAa,EACb,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,GACd,MAAM,QAAQ,CAAC;AAShB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,4BAA4B,EAC5B,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGhE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|