@proposit/proposit-core 3.3.0 → 3.4.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/README.md +99 -2
- package/dist/cli/commands/expressions.d.ts.map +1 -1
- package/dist/cli/commands/expressions.js +44 -0
- package/dist/cli/commands/expressions.js.map +1 -1
- package/dist/cli/commands/origins.d.ts +3 -0
- package/dist/cli/commands/origins.d.ts.map +1 -0
- package/dist/cli/commands/origins.js +264 -0
- package/dist/cli/commands/origins.js.map +1 -0
- package/dist/cli/commands/premises.d.ts.map +1 -1
- package/dist/cli/commands/premises.js +18 -2
- package/dist/cli/commands/premises.js.map +1 -1
- package/dist/cli/engine.d.ts.map +1 -1
- package/dist/cli/engine.js +5 -2
- package/dist/cli/engine.js.map +1 -1
- package/dist/cli/router.d.ts.map +1 -1
- package/dist/cli/router.js +1 -0
- package/dist/cli/router.js.map +1 -1
- package/dist/cli/schemata.d.ts +2 -0
- package/dist/cli/schemata.d.ts.map +1 -1
- package/dist/cli/schemata.js +14 -1
- package/dist/cli/schemata.js.map +1 -1
- package/dist/cli/storage/libraries.d.ts +4 -0
- package/dist/cli/storage/libraries.d.ts.map +1 -1
- package/dist/cli/storage/libraries.js +19 -0
- package/dist/cli/storage/libraries.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/extensions/basics/schemata.d.ts +2 -0
- package/dist/extensions/basics/schemata.d.ts.map +1 -1
- package/dist/extensions/citations/ieee/index.d.ts +1 -0
- package/dist/extensions/citations/ieee/index.d.ts.map +1 -1
- package/dist/extensions/citations/ieee/index.js +1 -0
- package/dist/extensions/citations/ieee/index.js.map +1 -1
- package/dist/extensions/citations/ieee/origin-document.d.ts +452 -0
- package/dist/extensions/citations/ieee/origin-document.d.ts.map +1 -0
- package/dist/extensions/citations/ieee/origin-document.js +25 -0
- package/dist/extensions/citations/ieee/origin-document.js.map +1 -0
- package/dist/extensions/pipelines/base/finalize-response-v2.d.ts +24 -0
- package/dist/extensions/pipelines/base/finalize-response-v2.d.ts.map +1 -1
- package/dist/extensions/pipelines/base/finalize-response-v2.js +249 -8
- package/dist/extensions/pipelines/base/finalize-response-v2.js.map +1 -1
- package/dist/extensions/pipelines/base/index.d.ts +3 -1
- package/dist/extensions/pipelines/base/index.d.ts.map +1 -1
- package/dist/extensions/pipelines/base/index.js +2 -1
- package/dist/extensions/pipelines/base/index.js.map +1 -1
- package/dist/extensions/pipelines/base/source-anchors.d.ts +57 -0
- package/dist/extensions/pipelines/base/source-anchors.d.ts.map +1 -0
- package/dist/extensions/pipelines/base/source-anchors.js +174 -0
- package/dist/extensions/pipelines/base/source-anchors.js.map +1 -0
- package/dist/extensions/pipelines/ingestion/scholar/scholar.d.ts.map +1 -1
- package/dist/extensions/pipelines/ingestion/scholar/scholar.js +11 -1
- package/dist/extensions/pipelines/ingestion/scholar/scholar.js.map +1 -1
- package/dist/extensions/pipelines/ingestion/scribe/scribe.d.ts.map +1 -1
- package/dist/extensions/pipelines/ingestion/scribe/scribe.js +5 -0
- package/dist/extensions/pipelines/ingestion/scribe/scribe.js.map +1 -1
- package/dist/lib/consts.d.ts.map +1 -1
- package/dist/lib/consts.js +27 -0
- package/dist/lib/consts.js.map +1 -1
- package/dist/lib/core/argument-engine.d.ts +5 -3
- package/dist/lib/core/argument-engine.d.ts.map +1 -1
- package/dist/lib/core/argument-engine.js +7 -4
- package/dist/lib/core/argument-engine.js.map +1 -1
- package/dist/lib/core/interfaces/argument-engine.interfaces.d.ts +2 -1
- package/dist/lib/core/interfaces/argument-engine.interfaces.d.ts.map +1 -1
- package/dist/lib/core/interfaces/index.d.ts +1 -1
- package/dist/lib/core/interfaces/index.d.ts.map +1 -1
- package/dist/lib/core/interfaces/library.interfaces.d.ts +72 -1
- package/dist/lib/core/interfaces/library.interfaces.d.ts.map +1 -1
- package/dist/lib/core/origin-library.d.ts +127 -0
- package/dist/lib/core/origin-library.d.ts.map +1 -0
- package/dist/lib/core/origin-library.js +520 -0
- package/dist/lib/core/origin-library.js.map +1 -0
- package/dist/lib/core/premise-engine.d.ts.map +1 -1
- package/dist/lib/core/premise-engine.js +20 -3
- package/dist/lib/core/premise-engine.js.map +1 -1
- package/dist/lib/core/proposit-core.d.ts +15 -8
- package/dist/lib/core/proposit-core.d.ts.map +1 -1
- package/dist/lib/core/proposit-core.js +28 -3
- package/dist/lib/core/proposit-core.js.map +1 -1
- package/dist/lib/grammar/types.d.ts +2 -2
- package/dist/lib/grammar/types.d.ts.map +1 -1
- package/dist/lib/grammar/types.js +2 -1
- package/dist/lib/grammar/types.js.map +1 -1
- package/dist/lib/grammar/validators/presentable.d.ts +19 -0
- package/dist/lib/grammar/validators/presentable.d.ts.map +1 -1
- package/dist/lib/grammar/validators/presentable.js +57 -0
- package/dist/lib/grammar/validators/presentable.js.map +1 -1
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +3 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/parsing/argument-parser.d.ts.map +1 -1
- package/dist/lib/parsing/argument-parser.js +4 -3
- package/dist/lib/parsing/argument-parser.js.map +1 -1
- package/dist/lib/schemata/index.d.ts +1 -0
- package/dist/lib/schemata/index.d.ts.map +1 -1
- package/dist/lib/schemata/index.js +1 -0
- package/dist/lib/schemata/index.js.map +1 -1
- package/dist/lib/schemata/origin.d.ts +48 -0
- package/dist/lib/schemata/origin.d.ts.map +1 -0
- package/dist/lib/schemata/origin.js +102 -0
- package/dist/lib/schemata/origin.js.map +1 -0
- package/dist/lib/schemata/propositional.d.ts +6 -0
- package/dist/lib/schemata/propositional.d.ts.map +1 -1
- package/dist/lib/schemata/propositional.js +13 -0
- package/dist/lib/schemata/propositional.js.map +1 -1
- package/dist/lib/types/checksum.d.ts +3 -0
- package/dist/lib/types/checksum.d.ts.map +1 -1
- package/dist/lib/types/validation.d.ts +19 -1
- package/dist/lib/types/validation.d.ts.map +1 -1
- package/dist/lib/types/validation.js +19 -0
- package/dist/lib/types/validation.js.map +1 -1
- package/dist/lib/utils/collections.d.ts +15 -0
- package/dist/lib/utils/collections.d.ts.map +1 -1
- package/dist/lib/utils/collections.js +17 -0
- package/dist/lib/utils/collections.js.map +1 -1
- package/dist/lib/utils/origin-text.d.ts +62 -0
- package/dist/lib/utils/origin-text.d.ts.map +1 -0
- package/dist/lib/utils/origin-text.js +204 -0
- package/dist/lib/utils/origin-text.js.map +1 -0
- package/dist/lib/utils/sha256.d.ts +6 -0
- package/dist/lib/utils/sha256.d.ts.map +1 -0
- package/dist/lib/utils/sha256.js +98 -0
- package/dist/lib/utils/sha256.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
import { Value } from "typebox/value";
|
|
2
|
+
import { CoreOriginDocumentSchema, CoreOriginLinkSchema, CoreOriginAnchorSchema, } from "../schemata/origin.js";
|
|
3
|
+
import { DEFAULT_CHECKSUM_CONFIG } from "../consts.js";
|
|
4
|
+
import { entityChecksum } from "./checksum.js";
|
|
5
|
+
import { sha256Hex } from "../utils/sha256.js";
|
|
6
|
+
import { normalizeOriginText, buildCodePointIndex, sliceByCodePointsIndexed, } from "../utils/origin-text.js";
|
|
7
|
+
import { ORIGIN_DOCUMENT_SCHEMA_INVALID, ORIGIN_LINK_SCHEMA_INVALID, ORIGIN_ANCHOR_SCHEMA_INVALID, ORIGIN_DOCUMENT_DUPLICATE_ID, ORIGIN_LINK_DUPLICATE_ID, ORIGIN_ANCHOR_DUPLICATE_ID, ORIGIN_DOCUMENT_REF_NOT_FOUND, ORIGIN_DOCUMENT_DIGEST_MISMATCH, ORIGIN_DOCUMENT_TEXT_NOT_NORMALIZED, ORIGIN_ANCHOR_SPAN_OUT_OF_RANGE, ORIGIN_ANCHOR_QUOTE_MISMATCH, ORIGIN_ANCHOR_LINK_NOT_FOUND, ORIGIN_DOCUMENT_NOT_FOUND, ORIGIN_LINK_NOT_FOUND, ORIGIN_ANCHOR_NOT_FOUND, ORIGIN_DOCUMENT_IN_USE, } from "../types/validation.js";
|
|
8
|
+
import { InvariantViolationError } from "./invariant-violation-error.js";
|
|
9
|
+
function argumentKey(argumentId, argumentVersion) {
|
|
10
|
+
return `${argumentId}@${argumentVersion}`;
|
|
11
|
+
}
|
|
12
|
+
function targetKey(targetType, targetId) {
|
|
13
|
+
return `${targetType}:${targetId}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Holds the source texts arguments were built from, their per-version
|
|
17
|
+
* associations, and the spans of those texts individual argument parts derive
|
|
18
|
+
* from.
|
|
19
|
+
*
|
|
20
|
+
* Documents are immutable: there is no update path, because every anchor is
|
|
21
|
+
* an offset into a document's exact text. Correcting a source means replacing
|
|
22
|
+
* the document, which invalidates its anchors by design.
|
|
23
|
+
*
|
|
24
|
+
* The text is opaque content. This class digests it, measures it, and slices
|
|
25
|
+
* it by index; it never parses, renders, or interprets it.
|
|
26
|
+
*
|
|
27
|
+
* An anchor is only meaningful alongside a link: the link carries the stance.
|
|
28
|
+
* `validate()` therefore requires every anchor's
|
|
29
|
+
* `(argumentId, argumentVersion, documentId)` to have a matching link, which
|
|
30
|
+
* fixes the persistence order for consumers — document, then link, then
|
|
31
|
+
* anchors — and makes removing a link that still has anchors a violation.
|
|
32
|
+
*
|
|
33
|
+
* Like the claim-connection libraries, this one mints no identifiers —
|
|
34
|
+
* callers supply them — and takes no argument lookup: an argument library is
|
|
35
|
+
* constructed after this one, so cross-checking argument existence here would
|
|
36
|
+
* invert the dependency order. What it does enforce is everything decidable
|
|
37
|
+
* from its own contents, most importantly that an anchor's span slices out
|
|
38
|
+
* the anchor's own quote.
|
|
39
|
+
*/
|
|
40
|
+
export class OriginLibrary {
|
|
41
|
+
documents;
|
|
42
|
+
links;
|
|
43
|
+
anchors;
|
|
44
|
+
linksByArgument;
|
|
45
|
+
anchorsByArgument;
|
|
46
|
+
anchorsByTarget;
|
|
47
|
+
/**
|
|
48
|
+
* Documents whose stored text has been confirmed normalized and matching
|
|
49
|
+
* its digest, keyed by id and pinned to the exact text that passed. A
|
|
50
|
+
* document is immutable, so a body that has been checked once cannot
|
|
51
|
+
* change — but keying on the text rather than the id alone is what stops a
|
|
52
|
+
* tampered snapshot from inheriting a previous instance's verdict.
|
|
53
|
+
*/
|
|
54
|
+
verifiedDocumentBodies;
|
|
55
|
+
/** Code-point index per document, reused across that document's anchors. */
|
|
56
|
+
documentIndexes;
|
|
57
|
+
/**
|
|
58
|
+
* Violations present as of the last accepted state, so a mutation can be
|
|
59
|
+
* judged on what it *introduced* rather than on whether everything is
|
|
60
|
+
* clean afterwards. Carried between mutations rather than recomputed, so
|
|
61
|
+
* this costs no extra `validate()` pass.
|
|
62
|
+
*/
|
|
63
|
+
knownViolationKeys;
|
|
64
|
+
checksumConfig;
|
|
65
|
+
constructor(options) {
|
|
66
|
+
this.documents = new Map();
|
|
67
|
+
this.links = new Map();
|
|
68
|
+
this.anchors = new Map();
|
|
69
|
+
this.linksByArgument = new Map();
|
|
70
|
+
this.anchorsByArgument = new Map();
|
|
71
|
+
this.anchorsByTarget = new Map();
|
|
72
|
+
this.verifiedDocumentBodies = new Map();
|
|
73
|
+
this.documentIndexes = new Map();
|
|
74
|
+
this.knownViolationKeys = new Set();
|
|
75
|
+
this.checksumConfig = options?.checksumConfig;
|
|
76
|
+
}
|
|
77
|
+
/** Stable identity for a violation, so two validation runs can be compared. */
|
|
78
|
+
static violationKey(violation) {
|
|
79
|
+
return `${violation.code}|${violation.entityType}|${violation.entityId}`;
|
|
80
|
+
}
|
|
81
|
+
static addToIndex(index, key, id) {
|
|
82
|
+
let bucket = index.get(key);
|
|
83
|
+
if (!bucket) {
|
|
84
|
+
bucket = new Set();
|
|
85
|
+
index.set(key, bucket);
|
|
86
|
+
}
|
|
87
|
+
bucket.add(id);
|
|
88
|
+
}
|
|
89
|
+
reindex() {
|
|
90
|
+
this.linksByArgument = new Map();
|
|
91
|
+
this.anchorsByArgument = new Map();
|
|
92
|
+
this.anchorsByTarget = new Map();
|
|
93
|
+
for (const link of this.links.values()) {
|
|
94
|
+
OriginLibrary.addToIndex(this.linksByArgument, argumentKey(link.argumentId, link.argumentVersion), link.id);
|
|
95
|
+
}
|
|
96
|
+
for (const anchor of this.anchors.values()) {
|
|
97
|
+
OriginLibrary.addToIndex(this.anchorsByArgument, argumentKey(anchor.argumentId, anchor.argumentVersion), anchor.id);
|
|
98
|
+
OriginLibrary.addToIndex(this.anchorsByTarget, targetKey(anchor.targetType, anchor.targetId), anchor.id);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
restoreFromSnapshot(snap) {
|
|
102
|
+
this.documents = new Map(snap.documents.map((d) => [d.id, d]));
|
|
103
|
+
this.links = new Map(snap.links.map((l) => [l.id, l]));
|
|
104
|
+
this.anchors = new Map(snap.anchors.map((a) => [a.id, a]));
|
|
105
|
+
for (const [id, text] of this.verifiedDocumentBodies) {
|
|
106
|
+
if (this.documents.get(id)?.text !== text) {
|
|
107
|
+
this.verifiedDocumentBodies.delete(id);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const [id, index] of this.documentIndexes) {
|
|
111
|
+
if (this.documents.get(id)?.text !== index.text) {
|
|
112
|
+
this.documentIndexes.delete(id);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
this.reindex();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Runs a mutation, then rolls back and throws if the mutation *introduced*
|
|
119
|
+
* a violation.
|
|
120
|
+
*
|
|
121
|
+
* Introduced, not "left the library inconsistent". Demanding a clean
|
|
122
|
+
* library after every mutation makes an already-inconsistent one
|
|
123
|
+
* unrepairable: two anchors that both violate the same invariant each keep
|
|
124
|
+
* the other's removal from being accepted, and every mutation fails
|
|
125
|
+
* forever. A library that validates has to stay repairable, and a snapshot
|
|
126
|
+
* assembled by a consumer — or written by an older build — can arrive
|
|
127
|
+
* inconsistent through no fault of the mutation being attempted.
|
|
128
|
+
*
|
|
129
|
+
* One rule covers both directions: an `addAnchor` with no link introduces a
|
|
130
|
+
* violation and is still refused on a broken library as on a clean one, and
|
|
131
|
+
* a `removeLink` that orphans existing anchors introduces theirs.
|
|
132
|
+
*
|
|
133
|
+
* ponytail: validating the whole library after every mutation is O(n²) in
|
|
134
|
+
* anchor count across a bulk import — each of n `addAnchor` calls re-checks
|
|
135
|
+
* the n anchors already present. Each check is one short slice comparison
|
|
136
|
+
* against a cached index, so a few thousand anchors is still milliseconds;
|
|
137
|
+
* scope the validation to the entity that changed if a caller ever needs
|
|
138
|
+
* tens of thousands. The document-body checks, which scaled with document
|
|
139
|
+
* *size* rather than count, are already skipped once verified.
|
|
140
|
+
*
|
|
141
|
+
* ponytail: the code-point indexes those checks rely on are retained for
|
|
142
|
+
* the life of every document, uncapped — roughly 10x the text size, so 10 MB
|
|
143
|
+
* of documents holds about 100 MB of heap. Peak is unchanged; steady state
|
|
144
|
+
* is not. If it bites, index only documents that have anchors and drop the
|
|
145
|
+
* index with their last anchor.
|
|
146
|
+
*/
|
|
147
|
+
withValidation(fn) {
|
|
148
|
+
const snap = this.snapshot();
|
|
149
|
+
const knownBefore = this.knownViolationKeys;
|
|
150
|
+
try {
|
|
151
|
+
const result = fn();
|
|
152
|
+
const violations = this.validate().violations;
|
|
153
|
+
const introduced = violations.filter((v) => !knownBefore.has(OriginLibrary.violationKey(v)));
|
|
154
|
+
if (introduced.length > 0) {
|
|
155
|
+
this.restoreFromSnapshot(snap);
|
|
156
|
+
this.knownViolationKeys = knownBefore;
|
|
157
|
+
throw new InvariantViolationError(introduced);
|
|
158
|
+
}
|
|
159
|
+
this.knownViolationKeys = new Set(violations.map((v) => OriginLibrary.violationKey(v)));
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
if (!(e instanceof InvariantViolationError)) {
|
|
164
|
+
this.restoreFromSnapshot(snap);
|
|
165
|
+
this.knownViolationKeys = knownBefore;
|
|
166
|
+
}
|
|
167
|
+
throw e;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Creates a document from raw text. The text is normalized and digested
|
|
172
|
+
* here rather than by the caller, so every document in the library shares
|
|
173
|
+
* one coordinate system and one identity rule.
|
|
174
|
+
*/
|
|
175
|
+
addDocument(document) {
|
|
176
|
+
return this.withValidation(() => {
|
|
177
|
+
if (this.documents.has(document.id)) {
|
|
178
|
+
throw new InvariantViolationError([
|
|
179
|
+
{
|
|
180
|
+
code: ORIGIN_DOCUMENT_DUPLICATE_ID,
|
|
181
|
+
message: `${ORIGIN_DOCUMENT_DUPLICATE_ID}: origin document with id ${document.id} already exists`,
|
|
182
|
+
entityType: "originDocument",
|
|
183
|
+
entityId: document.id,
|
|
184
|
+
},
|
|
185
|
+
]);
|
|
186
|
+
}
|
|
187
|
+
const text = normalizeOriginText(document.text);
|
|
188
|
+
const full = {
|
|
189
|
+
...document,
|
|
190
|
+
text,
|
|
191
|
+
digest: sha256Hex(text),
|
|
192
|
+
checksum: "",
|
|
193
|
+
};
|
|
194
|
+
full.checksum = entityChecksum(full, this.fieldsFor("originDocumentFields"));
|
|
195
|
+
this.documents.set(full.id, full);
|
|
196
|
+
// Recording the body as verified is what lets later mutations skip
|
|
197
|
+
// re-scanning it, but seeding unconditionally would disable
|
|
198
|
+
// ORIGIN_DOCUMENT_TEXT_NOT_NORMALIZED on the very pass meant to
|
|
199
|
+
// check this document — and that check is what caught the
|
|
200
|
+
// normalizer not being idempotent. One extra normalize per
|
|
201
|
+
// document, once, rather than per mutation. The digest half needs
|
|
202
|
+
// no check: it was computed from this exact string.
|
|
203
|
+
if (normalizeOriginText(text) === text) {
|
|
204
|
+
this.verifiedDocumentBodies.set(full.id, text);
|
|
205
|
+
}
|
|
206
|
+
return full;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
addLink(link) {
|
|
210
|
+
return this.withValidation(() => {
|
|
211
|
+
if (this.links.has(link.id)) {
|
|
212
|
+
throw new InvariantViolationError([
|
|
213
|
+
{
|
|
214
|
+
code: ORIGIN_LINK_DUPLICATE_ID,
|
|
215
|
+
message: `${ORIGIN_LINK_DUPLICATE_ID}: origin link with id ${link.id} already exists`,
|
|
216
|
+
entityType: "originLink",
|
|
217
|
+
entityId: link.id,
|
|
218
|
+
},
|
|
219
|
+
]);
|
|
220
|
+
}
|
|
221
|
+
const full = { ...link, checksum: "" };
|
|
222
|
+
full.checksum = entityChecksum(full, this.fieldsFor("originLinkFields"));
|
|
223
|
+
this.links.set(full.id, full);
|
|
224
|
+
OriginLibrary.addToIndex(this.linksByArgument, argumentKey(full.argumentId, full.argumentVersion), full.id);
|
|
225
|
+
return full;
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
addAnchor(anchor) {
|
|
229
|
+
return this.withValidation(() => {
|
|
230
|
+
if (this.anchors.has(anchor.id)) {
|
|
231
|
+
throw new InvariantViolationError([
|
|
232
|
+
{
|
|
233
|
+
code: ORIGIN_ANCHOR_DUPLICATE_ID,
|
|
234
|
+
message: `${ORIGIN_ANCHOR_DUPLICATE_ID}: origin anchor with id ${anchor.id} already exists`,
|
|
235
|
+
entityType: "originAnchor",
|
|
236
|
+
entityId: anchor.id,
|
|
237
|
+
},
|
|
238
|
+
]);
|
|
239
|
+
}
|
|
240
|
+
const full = { ...anchor, checksum: "" };
|
|
241
|
+
full.checksum = entityChecksum(full, this.fieldsFor("originAnchorFields"));
|
|
242
|
+
this.anchors.set(full.id, full);
|
|
243
|
+
OriginLibrary.addToIndex(this.anchorsByArgument, argumentKey(full.argumentId, full.argumentVersion), full.id);
|
|
244
|
+
OriginLibrary.addToIndex(this.anchorsByTarget, targetKey(full.targetType, full.targetId), full.id);
|
|
245
|
+
return full;
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Removes a document. Refuses while a link or an anchor still references
|
|
250
|
+
* it — dropping it silently would leave dangling references that only
|
|
251
|
+
* `validate()` would notice, and only later.
|
|
252
|
+
*/
|
|
253
|
+
removeDocument(id) {
|
|
254
|
+
return this.withValidation(() => {
|
|
255
|
+
const document = this.documents.get(id);
|
|
256
|
+
if (!document) {
|
|
257
|
+
throw new InvariantViolationError([
|
|
258
|
+
{
|
|
259
|
+
code: ORIGIN_DOCUMENT_NOT_FOUND,
|
|
260
|
+
message: `${ORIGIN_DOCUMENT_NOT_FOUND}: origin document with id "${id}" not found`,
|
|
261
|
+
entityType: "originDocument",
|
|
262
|
+
entityId: id,
|
|
263
|
+
},
|
|
264
|
+
]);
|
|
265
|
+
}
|
|
266
|
+
const referenceCount = this.getAllLinks().filter((l) => l.documentId === id).length +
|
|
267
|
+
this.getAllAnchors().filter((a) => a.documentId === id).length;
|
|
268
|
+
if (referenceCount > 0) {
|
|
269
|
+
throw new InvariantViolationError([
|
|
270
|
+
{
|
|
271
|
+
code: ORIGIN_DOCUMENT_IN_USE,
|
|
272
|
+
message: `${ORIGIN_DOCUMENT_IN_USE}: origin document "${id}" is still referenced by ${referenceCount} link(s) or anchor(s)`,
|
|
273
|
+
entityType: "originDocument",
|
|
274
|
+
entityId: id,
|
|
275
|
+
},
|
|
276
|
+
]);
|
|
277
|
+
}
|
|
278
|
+
this.documents.delete(id);
|
|
279
|
+
this.verifiedDocumentBodies.delete(id);
|
|
280
|
+
this.documentIndexes.delete(id);
|
|
281
|
+
return document;
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
removeLink(id) {
|
|
285
|
+
return this.withValidation(() => {
|
|
286
|
+
const link = this.links.get(id);
|
|
287
|
+
if (!link) {
|
|
288
|
+
throw new InvariantViolationError([
|
|
289
|
+
{
|
|
290
|
+
code: ORIGIN_LINK_NOT_FOUND,
|
|
291
|
+
message: `${ORIGIN_LINK_NOT_FOUND}: origin link with id "${id}" not found`,
|
|
292
|
+
entityType: "originLink",
|
|
293
|
+
entityId: id,
|
|
294
|
+
},
|
|
295
|
+
]);
|
|
296
|
+
}
|
|
297
|
+
this.links.delete(id);
|
|
298
|
+
this.linksByArgument
|
|
299
|
+
.get(argumentKey(link.argumentId, link.argumentVersion))
|
|
300
|
+
?.delete(id);
|
|
301
|
+
return link;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
removeAnchor(id) {
|
|
305
|
+
return this.withValidation(() => {
|
|
306
|
+
const anchor = this.anchors.get(id);
|
|
307
|
+
if (!anchor) {
|
|
308
|
+
throw new InvariantViolationError([
|
|
309
|
+
{
|
|
310
|
+
code: ORIGIN_ANCHOR_NOT_FOUND,
|
|
311
|
+
message: `${ORIGIN_ANCHOR_NOT_FOUND}: origin anchor with id "${id}" not found`,
|
|
312
|
+
entityType: "originAnchor",
|
|
313
|
+
entityId: id,
|
|
314
|
+
},
|
|
315
|
+
]);
|
|
316
|
+
}
|
|
317
|
+
this.anchors.delete(id);
|
|
318
|
+
this.anchorsByArgument
|
|
319
|
+
.get(argumentKey(anchor.argumentId, anchor.argumentVersion))
|
|
320
|
+
?.delete(id);
|
|
321
|
+
this.anchorsByTarget
|
|
322
|
+
.get(targetKey(anchor.targetType, anchor.targetId))
|
|
323
|
+
?.delete(id);
|
|
324
|
+
return anchor;
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
getDocument(id) {
|
|
328
|
+
return this.documents.get(id);
|
|
329
|
+
}
|
|
330
|
+
getLink(id) {
|
|
331
|
+
return this.links.get(id);
|
|
332
|
+
}
|
|
333
|
+
getAnchor(id) {
|
|
334
|
+
return this.anchors.get(id);
|
|
335
|
+
}
|
|
336
|
+
getLinksForArgument(argumentId, argumentVersion) {
|
|
337
|
+
const ids = this.linksByArgument.get(argumentKey(argumentId, argumentVersion));
|
|
338
|
+
if (!ids)
|
|
339
|
+
return [];
|
|
340
|
+
return Array.from(ids)
|
|
341
|
+
.map((id) => this.links.get(id))
|
|
342
|
+
.filter((l) => l !== undefined);
|
|
343
|
+
}
|
|
344
|
+
getAnchorsForArgument(argumentId, argumentVersion) {
|
|
345
|
+
const ids = this.anchorsByArgument.get(argumentKey(argumentId, argumentVersion));
|
|
346
|
+
if (!ids)
|
|
347
|
+
return [];
|
|
348
|
+
return Array.from(ids)
|
|
349
|
+
.map((id) => this.anchors.get(id))
|
|
350
|
+
.filter((a) => a !== undefined);
|
|
351
|
+
}
|
|
352
|
+
getAnchorsForTarget(targetType, targetId) {
|
|
353
|
+
const ids = this.anchorsByTarget.get(targetKey(targetType, targetId));
|
|
354
|
+
if (!ids)
|
|
355
|
+
return [];
|
|
356
|
+
return Array.from(ids)
|
|
357
|
+
.map((id) => this.anchors.get(id))
|
|
358
|
+
.filter((a) => a !== undefined);
|
|
359
|
+
}
|
|
360
|
+
getAllDocuments() {
|
|
361
|
+
return Array.from(this.documents.values());
|
|
362
|
+
}
|
|
363
|
+
getAllLinks() {
|
|
364
|
+
return Array.from(this.links.values());
|
|
365
|
+
}
|
|
366
|
+
getAllAnchors() {
|
|
367
|
+
return Array.from(this.anchors.values());
|
|
368
|
+
}
|
|
369
|
+
snapshot() {
|
|
370
|
+
return {
|
|
371
|
+
documents: this.getAllDocuments(),
|
|
372
|
+
links: this.getAllLinks(),
|
|
373
|
+
anchors: this.getAllAnchors(),
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/** Restores an origin library from a snapshot, rebuilding its indexes. */
|
|
377
|
+
static fromSnapshot(snapshot, options) {
|
|
378
|
+
const lib = new OriginLibrary(options);
|
|
379
|
+
lib.restoreFromSnapshot(snapshot);
|
|
380
|
+
// A loaded snapshot may already be inconsistent — this constructor
|
|
381
|
+
// deliberately does not refuse it. Recording what is already wrong is
|
|
382
|
+
// what lets a caller repair it one mutation at a time.
|
|
383
|
+
lib.knownViolationKeys = new Set(lib.validate().violations.map((v) => OriginLibrary.violationKey(v)));
|
|
384
|
+
return lib;
|
|
385
|
+
}
|
|
386
|
+
validate() {
|
|
387
|
+
const violations = [];
|
|
388
|
+
for (const [id, document] of this.documents) {
|
|
389
|
+
if (!Value.Check(CoreOriginDocumentSchema, document)) {
|
|
390
|
+
violations.push({
|
|
391
|
+
code: ORIGIN_DOCUMENT_SCHEMA_INVALID,
|
|
392
|
+
message: `${ORIGIN_DOCUMENT_SCHEMA_INVALID}: origin document "${id}" does not conform to schema`,
|
|
393
|
+
entityType: "originDocument",
|
|
394
|
+
entityId: id,
|
|
395
|
+
});
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
// Normalizing and digesting a document body is the only cost in
|
|
399
|
+
// this method that scales with document *size*, and `validate()`
|
|
400
|
+
// runs after every mutation. Documents are immutable, so a body
|
|
401
|
+
// that has passed once cannot change; anything that could have
|
|
402
|
+
// swapped it (fromSnapshot, a rollback) clears its entry first.
|
|
403
|
+
if (this.verifiedDocumentBodies.get(id) === document.text)
|
|
404
|
+
continue;
|
|
405
|
+
let bodyOk = true;
|
|
406
|
+
if (normalizeOriginText(document.text) !== document.text) {
|
|
407
|
+
bodyOk = false;
|
|
408
|
+
violations.push({
|
|
409
|
+
code: ORIGIN_DOCUMENT_TEXT_NOT_NORMALIZED,
|
|
410
|
+
message: `${ORIGIN_DOCUMENT_TEXT_NOT_NORMALIZED}: origin document "${id}" holds text that is not in normalized form; every anchor offset into it is unsound`,
|
|
411
|
+
entityType: "originDocument",
|
|
412
|
+
entityId: id,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
if (sha256Hex(document.text) !== document.digest) {
|
|
416
|
+
bodyOk = false;
|
|
417
|
+
violations.push({
|
|
418
|
+
code: ORIGIN_DOCUMENT_DIGEST_MISMATCH,
|
|
419
|
+
message: `${ORIGIN_DOCUMENT_DIGEST_MISMATCH}: origin document "${id}" carries a digest that does not match its text`,
|
|
420
|
+
entityType: "originDocument",
|
|
421
|
+
entityId: id,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
if (bodyOk)
|
|
425
|
+
this.verifiedDocumentBodies.set(id, document.text);
|
|
426
|
+
}
|
|
427
|
+
for (const [id, link] of this.links) {
|
|
428
|
+
if (!Value.Check(CoreOriginLinkSchema, link)) {
|
|
429
|
+
violations.push({
|
|
430
|
+
code: ORIGIN_LINK_SCHEMA_INVALID,
|
|
431
|
+
message: `${ORIGIN_LINK_SCHEMA_INVALID}: origin link "${id}" does not conform to schema`,
|
|
432
|
+
entityType: "originLink",
|
|
433
|
+
entityId: id,
|
|
434
|
+
});
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
if (!this.documents.has(link.documentId)) {
|
|
438
|
+
violations.push({
|
|
439
|
+
code: ORIGIN_DOCUMENT_REF_NOT_FOUND,
|
|
440
|
+
message: `${ORIGIN_DOCUMENT_REF_NOT_FOUND}: origin link "${id}" references non-existent document "${link.documentId}"`,
|
|
441
|
+
entityType: "originLink",
|
|
442
|
+
entityId: id,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
for (const [id, anchor] of this.anchors) {
|
|
447
|
+
if (!Value.Check(CoreOriginAnchorSchema, anchor)) {
|
|
448
|
+
violations.push({
|
|
449
|
+
code: ORIGIN_ANCHOR_SCHEMA_INVALID,
|
|
450
|
+
message: `${ORIGIN_ANCHOR_SCHEMA_INVALID}: origin anchor "${id}" does not conform to schema`,
|
|
451
|
+
entityType: "originAnchor",
|
|
452
|
+
entityId: id,
|
|
453
|
+
});
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
const document = this.documents.get(anchor.documentId);
|
|
457
|
+
if (!document) {
|
|
458
|
+
violations.push({
|
|
459
|
+
code: ORIGIN_DOCUMENT_REF_NOT_FOUND,
|
|
460
|
+
message: `${ORIGIN_DOCUMENT_REF_NOT_FOUND}: origin anchor "${id}" references non-existent document "${anchor.documentId}"`,
|
|
461
|
+
entityType: "originAnchor",
|
|
462
|
+
entityId: id,
|
|
463
|
+
});
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
// Built once per document and kept, for the same reason the body
|
|
467
|
+
// checks are skipped: a document is immutable. The entry is keyed
|
|
468
|
+
// to the exact text it was built from, not to the id alone, so
|
|
469
|
+
// anything that ever puts a different body under a known id — a
|
|
470
|
+
// restore, or a future replace — rebuilds instead of slicing
|
|
471
|
+
// against the wrong string.
|
|
472
|
+
let index = this.documentIndexes.get(document.id);
|
|
473
|
+
if (index?.text !== document.text) {
|
|
474
|
+
index = buildCodePointIndex(document.text);
|
|
475
|
+
this.documentIndexes.set(document.id, index);
|
|
476
|
+
}
|
|
477
|
+
const documentLength = index.offsets.length - 1;
|
|
478
|
+
if (!Number.isInteger(anchor.startCodePoint) ||
|
|
479
|
+
!Number.isInteger(anchor.endCodePoint) ||
|
|
480
|
+
anchor.startCodePoint < 0 ||
|
|
481
|
+
anchor.endCodePoint < anchor.startCodePoint ||
|
|
482
|
+
anchor.endCodePoint > documentLength) {
|
|
483
|
+
violations.push({
|
|
484
|
+
code: ORIGIN_ANCHOR_SPAN_OUT_OF_RANGE,
|
|
485
|
+
message: `${ORIGIN_ANCHOR_SPAN_OUT_OF_RANGE}: origin anchor "${id}" spans [${anchor.startCodePoint}, ${anchor.endCodePoint}) of a document ${documentLength} code points long`,
|
|
486
|
+
entityType: "originAnchor",
|
|
487
|
+
entityId: id,
|
|
488
|
+
});
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
const sliced = sliceByCodePointsIndexed(index, anchor.startCodePoint, anchor.endCodePoint);
|
|
492
|
+
if (sliced !== anchor.exact) {
|
|
493
|
+
violations.push({
|
|
494
|
+
code: ORIGIN_ANCHOR_QUOTE_MISMATCH,
|
|
495
|
+
message: `${ORIGIN_ANCHOR_QUOTE_MISMATCH}: origin anchor "${id}" spans text that is not its own quote — an anchor at an unverified offset`,
|
|
496
|
+
entityType: "originAnchor",
|
|
497
|
+
entityId: id,
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
// The link carries the stance, and the stance is what decides
|
|
501
|
+
// whether unanchored content means anything. An anchor whose
|
|
502
|
+
// argument version is not linked to this document is provenance no
|
|
503
|
+
// consumer can interpret, so it is a violation rather than a gap.
|
|
504
|
+
const linked = this.getLinksForArgument(anchor.argumentId, anchor.argumentVersion).some((l) => l.documentId === anchor.documentId);
|
|
505
|
+
if (!linked) {
|
|
506
|
+
violations.push({
|
|
507
|
+
code: ORIGIN_ANCHOR_LINK_NOT_FOUND,
|
|
508
|
+
message: `${ORIGIN_ANCHOR_LINK_NOT_FOUND}: origin anchor "${id}" targets ${anchor.argumentId}@${anchor.argumentVersion}, which has no link to document "${anchor.documentId}"`,
|
|
509
|
+
entityType: "originAnchor",
|
|
510
|
+
entityId: id,
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return { ok: violations.length === 0, violations };
|
|
515
|
+
}
|
|
516
|
+
fieldsFor(key) {
|
|
517
|
+
return this.checksumConfig?.[key] ?? DEFAULT_CHECKSUM_CONFIG[key];
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=origin-library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origin-library.js","sourceRoot":"","sources":["../../../src/lib/core/origin-library.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"premise-engine.d.ts","sourceRoot":"","sources":["../../../src/lib/core/premise-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAE/B,KAAK,iBAAiB,EACzB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAIH,KAAK,mBAAmB,EAC3B,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"premise-engine.d.ts","sourceRoot":"","sources":["../../../src/lib/core/premise-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CorePremiseSchema, isExternallyBound, isPremiseBound, } from "../schemata/index.js";
|
|
2
2
|
import { DefaultMap } from "../utils/default-map.js";
|
|
3
3
|
import { midpoint, POSITION_INITIAL, POSITION_MAX, } from "../utils/position.js";
|
|
4
|
-
import { sortedCopyById, sortedUnique } from "../utils/collections.js";
|
|
4
|
+
import { sortedCopyById, sortedUnique, withoutUndefinedValues, } from "../utils/collections.js";
|
|
5
5
|
import { HierarchicalChecksumCache } from "./checksum-cache.js";
|
|
6
6
|
import { kleeneAnd, kleeneIff, kleeneImplies, kleeneNot, kleeneOr, } from "./evaluation/kleene.js";
|
|
7
7
|
import { buildDirectionalVacuity, makeErrorIssue, makeValidationResult, } from "./evaluation/validation.js";
|
|
@@ -809,7 +809,20 @@ export class PremiseEngine extends HierarchicalChecksumCache {
|
|
|
809
809
|
patchAndMarkExpression(expressionId, fields) {
|
|
810
810
|
const expr = this.expressions.getExpression(expressionId);
|
|
811
811
|
if (expr) {
|
|
812
|
-
|
|
812
|
+
// An `undefined` value deletes the key rather than assigning it.
|
|
813
|
+
// `Object.assign` would leave the key present holding `undefined`,
|
|
814
|
+
// which is checksum-safe and JSON-safe on its own but makes
|
|
815
|
+
// `"field" in entity` true — and any downstream mapper that turns
|
|
816
|
+
// `undefined` into `null` then flips a field from absent to
|
|
817
|
+
// present, changing the entity's checksum. Clearing a field has to
|
|
818
|
+
// restore the shape it had before it was set.
|
|
819
|
+
const target = expr;
|
|
820
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
821
|
+
if (value === undefined)
|
|
822
|
+
delete target[key];
|
|
823
|
+
else
|
|
824
|
+
target[key] = value;
|
|
825
|
+
}
|
|
813
826
|
}
|
|
814
827
|
this.expressions.markExpressionDirty(expressionId);
|
|
815
828
|
this.markDirty();
|
|
@@ -825,8 +838,12 @@ export class PremiseEngine extends HierarchicalChecksumCache {
|
|
|
825
838
|
return this.withValidation(() => {
|
|
826
839
|
// Strip old extras and replace with new ones, preserving structural fields.
|
|
827
840
|
const { id, argumentId, argumentVersion, checksum, descendantChecksum, combinedChecksum, type, derivedClaimId, } = this.premise;
|
|
841
|
+
// Clearing a field means removing its key, not assigning
|
|
842
|
+
// `undefined` — see `withoutUndefinedValues`. `updateExtras`
|
|
843
|
+
// spreads its updates in, so this is the single place that has to
|
|
844
|
+
// enforce it for every premise-level caller.
|
|
828
845
|
this.premise = {
|
|
829
|
-
...extras,
|
|
846
|
+
...withoutUndefinedValues(extras),
|
|
830
847
|
id,
|
|
831
848
|
argumentId,
|
|
832
849
|
argumentVersion,
|