@pegma/knowledge-base-application 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +140 -2
- package/dist/articles.d.ts +10 -0
- package/dist/articles.d.ts.map +1 -0
- package/dist/articles.js +454 -0
- package/dist/articles.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/governance.d.ts +14 -0
- package/dist/governance.d.ts.map +1 -0
- package/dist/governance.js +364 -0
- package/dist/governance.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/lexical.d.ts +13 -0
- package/dist/lexical.d.ts.map +1 -0
- package/dist/lexical.js +105 -0
- package/dist/lexical.js.map +1 -0
- package/dist/publication.d.ts +42 -0
- package/dist/publication.d.ts.map +1 -0
- package/dist/publication.js +258 -0
- package/dist/publication.js.map +1 -0
- package/dist/reads.d.ts +5 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +228 -0
- package/dist/reads.js.map +1 -0
- package/dist/records.d.ts +40 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +122 -0
- package/dist/records.js.map +1 -0
- package/dist/repository.d.ts +74 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +738 -0
- package/dist/repository.js.map +1 -0
- package/dist/retrieval-budget.d.ts +37 -0
- package/dist/retrieval-budget.d.ts.map +1 -0
- package/dist/retrieval-budget.js +111 -0
- package/dist/retrieval-budget.js.map +1 -0
- package/dist/retrieval-limits.d.ts +4 -0
- package/dist/retrieval-limits.d.ts.map +1 -0
- package/dist/retrieval-limits.js +21 -0
- package/dist/retrieval-limits.js.map +1 -0
- package/dist/retrieval-maintenance.d.ts +19 -0
- package/dist/retrieval-maintenance.d.ts.map +1 -0
- package/dist/retrieval-maintenance.js +359 -0
- package/dist/retrieval-maintenance.js.map +1 -0
- package/dist/retrieval-records.d.ts +55 -0
- package/dist/retrieval-records.d.ts.map +1 -0
- package/dist/retrieval-records.js +140 -0
- package/dist/retrieval-records.js.map +1 -0
- package/dist/retrieval-repository.d.ts +32 -0
- package/dist/retrieval-repository.d.ts.map +1 -0
- package/dist/retrieval-repository.js +750 -0
- package/dist/retrieval-repository.js.map +1 -0
- package/dist/retrieval-types.d.ts +185 -0
- package/dist/retrieval-types.d.ts.map +1 -0
- package/dist/retrieval-types.js +24 -0
- package/dist/retrieval-types.js.map +1 -0
- package/dist/retrieval.d.ts +12 -0
- package/dist/retrieval.d.ts.map +1 -0
- package/dist/retrieval.js +541 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/storage-helpers.d.ts +23 -0
- package/dist/storage-helpers.d.ts.map +1 -0
- package/dist/storage-helpers.js +138 -0
- package/dist/storage-helpers.js.map +1 -0
- package/dist/types.d.ts +280 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -4
package/dist/reads.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { hasPermission } from "@pegma/authorization-core";
|
|
2
|
+
import { articleKinds, knowledgePermissions, } from "@pegma/knowledge-base-contracts";
|
|
3
|
+
import { KnowledgeBaseNotFoundError, KnowledgeBasePrerequisiteError, requirePermission, } from "./errors.js";
|
|
4
|
+
import { loadGovernanceContext } from "./governance.js";
|
|
5
|
+
import { createPublicationChecker } from "./publication.js";
|
|
6
|
+
import { canonicalJson, RepositoryConflictError, RepositoryIntegrityError, requireIdentifier, snapshotData, } from "./storage-helpers.js";
|
|
7
|
+
function readInput(value, field, extra = []) {
|
|
8
|
+
const input = snapshotData(value);
|
|
9
|
+
if (input === null ||
|
|
10
|
+
typeof input !== "object" ||
|
|
11
|
+
Array.isArray(input) ||
|
|
12
|
+
Object.keys(input).some((key) => key !== field && !extra.includes(key))) {
|
|
13
|
+
throw new TypeError("Read contains unsupported fields");
|
|
14
|
+
}
|
|
15
|
+
requireIdentifier(input[field], field);
|
|
16
|
+
return input;
|
|
17
|
+
}
|
|
18
|
+
function clockTime(options) {
|
|
19
|
+
const at = options.clock.now();
|
|
20
|
+
if (typeof at !== "string" ||
|
|
21
|
+
!Number.isFinite(Date.parse(at)) ||
|
|
22
|
+
new Date(at).toISOString() !== at) {
|
|
23
|
+
throw new TypeError("Clock must return a canonical ISO timestamp");
|
|
24
|
+
}
|
|
25
|
+
return at;
|
|
26
|
+
}
|
|
27
|
+
async function requiredArticle(repository, articleId) {
|
|
28
|
+
const current = await repository.readArticleVersioned(articleId);
|
|
29
|
+
if (current === null)
|
|
30
|
+
throw new KnowledgeBaseNotFoundError("article");
|
|
31
|
+
return current.value;
|
|
32
|
+
}
|
|
33
|
+
function snapshotReferences(snapshot) {
|
|
34
|
+
if (!Array.isArray(snapshot.references) || snapshot.references.length > 32) {
|
|
35
|
+
throw new RepositoryIntegrityError();
|
|
36
|
+
}
|
|
37
|
+
return snapshot.references;
|
|
38
|
+
}
|
|
39
|
+
/** Explicit keyed staff reads and a separately authorized portal-only read. */
|
|
40
|
+
export function createReadServices(repository, options) {
|
|
41
|
+
const publications = createPublicationChecker(repository, options);
|
|
42
|
+
return {
|
|
43
|
+
async getCollection(access, request) {
|
|
44
|
+
access = snapshotData(access);
|
|
45
|
+
requirePermission(access, knowledgePermissions.collectionRead);
|
|
46
|
+
const input = readInput(request, "collectionId");
|
|
47
|
+
const current = await repository.readCollectionVersioned(input.collectionId);
|
|
48
|
+
if (current === null)
|
|
49
|
+
throw new KnowledgeBaseNotFoundError("collection");
|
|
50
|
+
requirePermission(access, knowledgePermissions.collectionRead);
|
|
51
|
+
return snapshotData({
|
|
52
|
+
generation: current.value.generation,
|
|
53
|
+
collection: current.value.collection,
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
async getValidationPolicy(access, request) {
|
|
57
|
+
access = snapshotData(access);
|
|
58
|
+
requirePermission(access, knowledgePermissions.validationManage);
|
|
59
|
+
const input = readInput(request, "policyId");
|
|
60
|
+
const current = await repository.readValidationPolicyVersioned(input.policyId);
|
|
61
|
+
if (current === null)
|
|
62
|
+
throw new KnowledgeBaseNotFoundError("validation_policy");
|
|
63
|
+
requirePermission(access, knowledgePermissions.validationManage);
|
|
64
|
+
return snapshotData({
|
|
65
|
+
generation: current.value.generation,
|
|
66
|
+
policy: current.value.policy,
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
async getGovernanceConfiguration(access, request) {
|
|
70
|
+
access = snapshotData(access);
|
|
71
|
+
requirePermission(access, knowledgePermissions.validationManage);
|
|
72
|
+
const input = readInput(request, "collectionId");
|
|
73
|
+
const current = await repository.readCollectionVersioned(input.collectionId);
|
|
74
|
+
if (current === null || current.value.configuration === undefined) {
|
|
75
|
+
throw new KnowledgeBaseNotFoundError("governance_configuration");
|
|
76
|
+
}
|
|
77
|
+
requirePermission(access, knowledgePermissions.validationManage);
|
|
78
|
+
return snapshotData({
|
|
79
|
+
collectionId: input.collectionId,
|
|
80
|
+
generation: current.value.generation,
|
|
81
|
+
configuration: current.value.configuration,
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
async getValidationRequirements(access, request) {
|
|
85
|
+
access = snapshotData(access);
|
|
86
|
+
const authorize = () => {
|
|
87
|
+
if (!hasPermission(access, knowledgePermissions.evidenceSubmit)) {
|
|
88
|
+
requirePermission(access, knowledgePermissions.draftWrite);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
authorize();
|
|
92
|
+
const input = readInput(request, "collectionId", ["kind"]);
|
|
93
|
+
if (!articleKinds.includes(input.kind)) {
|
|
94
|
+
throw new TypeError("Unknown article kind");
|
|
95
|
+
}
|
|
96
|
+
const governance = await loadGovernanceContext(repository, input.collectionId, clockTime(options));
|
|
97
|
+
const [collection, validation] = await Promise.all([
|
|
98
|
+
repository.readCollectionVersioned(input.collectionId),
|
|
99
|
+
repository.readValidationPolicyVersioned(governance.context.validationPolicy.id),
|
|
100
|
+
]);
|
|
101
|
+
if (collection === null ||
|
|
102
|
+
collection.value.generation !== governance.governanceGeneration ||
|
|
103
|
+
validation === null ||
|
|
104
|
+
validation.value.generation !== governance.validationGeneration) {
|
|
105
|
+
throw new RepositoryConflictError();
|
|
106
|
+
}
|
|
107
|
+
authorize();
|
|
108
|
+
return snapshotData({
|
|
109
|
+
collectionId: input.collectionId,
|
|
110
|
+
governanceGeneration: governance.governanceGeneration,
|
|
111
|
+
validationPolicy: {
|
|
112
|
+
id: governance.context.validationPolicy.id,
|
|
113
|
+
version: governance.context.validationPolicy.version,
|
|
114
|
+
},
|
|
115
|
+
expectedStagingBuildId: governance.context.expectedStagingBuildId,
|
|
116
|
+
checks: governance.context.validationPolicy.requirements
|
|
117
|
+
.filter((check) => check.kind === input.kind)
|
|
118
|
+
.map((check) => ({
|
|
119
|
+
id: check.id,
|
|
120
|
+
testKind: check.testKind,
|
|
121
|
+
maxAgeMilliseconds: check.maxAgeMilliseconds,
|
|
122
|
+
})),
|
|
123
|
+
});
|
|
124
|
+
},
|
|
125
|
+
async getDraft(access, request) {
|
|
126
|
+
access = snapshotData(access);
|
|
127
|
+
requirePermission(access, knowledgePermissions.draftRead);
|
|
128
|
+
const input = readInput(request, "articleId");
|
|
129
|
+
const current = await requiredArticle(repository, input.articleId);
|
|
130
|
+
requirePermission(access, knowledgePermissions.draftRead);
|
|
131
|
+
return snapshotData({
|
|
132
|
+
articleId: current.article.id,
|
|
133
|
+
generation: current.generation,
|
|
134
|
+
state: current.article.state,
|
|
135
|
+
revision: current.article.current,
|
|
136
|
+
hasPendingReview: current.review !== undefined,
|
|
137
|
+
hasPublication: current.article.published !== undefined,
|
|
138
|
+
publicationHeld: current.publicationHeld,
|
|
139
|
+
});
|
|
140
|
+
},
|
|
141
|
+
async getEvidence(access, request) {
|
|
142
|
+
access = snapshotData(access);
|
|
143
|
+
requirePermission(access, knowledgePermissions.evidenceRead);
|
|
144
|
+
const input = readInput(request, "articleId");
|
|
145
|
+
const current = await requiredArticle(repository, input.articleId);
|
|
146
|
+
requirePermission(access, knowledgePermissions.evidenceRead);
|
|
147
|
+
return snapshotData({
|
|
148
|
+
articleId: current.article.id,
|
|
149
|
+
generation: current.generation,
|
|
150
|
+
evidence: current.article.evidence,
|
|
151
|
+
revokedEvidence: current.revokedEvidence,
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
async getProvenance(access, request) {
|
|
155
|
+
access = snapshotData(access);
|
|
156
|
+
requirePermission(access, knowledgePermissions.provenanceRead);
|
|
157
|
+
const input = readInput(request, "articleId");
|
|
158
|
+
const current = await requiredArticle(repository, input.articleId);
|
|
159
|
+
const snapshots = [
|
|
160
|
+
current.provenance,
|
|
161
|
+
...(current.publishedProvenance === undefined
|
|
162
|
+
? []
|
|
163
|
+
: [current.publishedProvenance]),
|
|
164
|
+
];
|
|
165
|
+
const references = new Map();
|
|
166
|
+
for (const source of snapshots) {
|
|
167
|
+
for (const reference of snapshotReferences(source))
|
|
168
|
+
references.set(canonicalJson(reference), reference);
|
|
169
|
+
}
|
|
170
|
+
if (references.size > 0) {
|
|
171
|
+
const verifier = options.privateSources;
|
|
172
|
+
if (verifier === undefined || typeof verifier.canRead !== "function") {
|
|
173
|
+
throw new KnowledgeBasePrerequisiteError("source_access_verifier");
|
|
174
|
+
}
|
|
175
|
+
let allowed;
|
|
176
|
+
try {
|
|
177
|
+
allowed = await Promise.all([...references.values()].map((reference) => verifier.canRead({
|
|
178
|
+
access: snapshotData(access),
|
|
179
|
+
articleId: input.articleId,
|
|
180
|
+
reference: snapshotData(reference),
|
|
181
|
+
})));
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
throw new KnowledgeBasePrerequisiteError("source_access_verifier");
|
|
185
|
+
}
|
|
186
|
+
if (allowed.some((value) => value !== true))
|
|
187
|
+
throw new KnowledgeBaseNotFoundError("provenance");
|
|
188
|
+
}
|
|
189
|
+
requirePermission(access, knowledgePermissions.provenanceRead);
|
|
190
|
+
const latest = await requiredArticle(repository, input.articleId);
|
|
191
|
+
if (latest.generation !== current.generation)
|
|
192
|
+
throw new RepositoryConflictError();
|
|
193
|
+
requirePermission(access, knowledgePermissions.provenanceRead);
|
|
194
|
+
return snapshotData({
|
|
195
|
+
articleId: current.article.id,
|
|
196
|
+
generation: current.generation,
|
|
197
|
+
snapshot: current.provenance,
|
|
198
|
+
...(current.publishedProvenance === undefined
|
|
199
|
+
? {}
|
|
200
|
+
: { publishedSnapshot: current.publishedProvenance }),
|
|
201
|
+
});
|
|
202
|
+
},
|
|
203
|
+
async getReview(access, request) {
|
|
204
|
+
access = snapshotData(access);
|
|
205
|
+
requirePermission(access, knowledgePermissions.review);
|
|
206
|
+
const input = readInput(request, "articleId");
|
|
207
|
+
const current = await requiredArticle(repository, input.articleId);
|
|
208
|
+
if (current.review === undefined)
|
|
209
|
+
throw new KnowledgeBaseNotFoundError("review");
|
|
210
|
+
requirePermission(access, knowledgePermissions.review);
|
|
211
|
+
return snapshotData({
|
|
212
|
+
articleId: current.article.id,
|
|
213
|
+
generation: current.generation,
|
|
214
|
+
review: current.review,
|
|
215
|
+
});
|
|
216
|
+
},
|
|
217
|
+
async getPublishedArticle(access, request) {
|
|
218
|
+
const input = readInput(request, "articleId");
|
|
219
|
+
const checked = await publications.check({
|
|
220
|
+
access,
|
|
221
|
+
articleId: input.articleId,
|
|
222
|
+
purpose: "portal",
|
|
223
|
+
});
|
|
224
|
+
return checked.article;
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=reads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reads.js","sourceRoot":"","sources":["../src/reads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type StoredRecord } from "@pegma/storage-core";
|
|
2
|
+
import type { Article, Collection, ValidationPolicy } from "@pegma/knowledge-base-contracts";
|
|
3
|
+
import type { EvidenceRevocation, GovernanceConfiguration, ReviewSnapshot, SourceSnapshot } from "./types.js";
|
|
4
|
+
export type ResourceKind = "article" | "collection" | "validation";
|
|
5
|
+
export interface StoredArticle {
|
|
6
|
+
readonly generation: number;
|
|
7
|
+
readonly article: Article;
|
|
8
|
+
readonly provenance: SourceSnapshot;
|
|
9
|
+
readonly review?: ReviewSnapshot;
|
|
10
|
+
readonly publishedProvenance?: SourceSnapshot;
|
|
11
|
+
readonly publicationReview?: ReviewSnapshot;
|
|
12
|
+
readonly publicationHeld: boolean;
|
|
13
|
+
readonly revokedEvidence: readonly EvidenceRevocation[];
|
|
14
|
+
}
|
|
15
|
+
export interface StoredCollection {
|
|
16
|
+
readonly generation: number;
|
|
17
|
+
readonly collection: Collection;
|
|
18
|
+
readonly configuration?: GovernanceConfiguration;
|
|
19
|
+
}
|
|
20
|
+
export interface StoredValidationPolicy {
|
|
21
|
+
readonly generation: number;
|
|
22
|
+
readonly policy: ValidationPolicy;
|
|
23
|
+
}
|
|
24
|
+
export type KnowledgeRecordKind = "head" | "revision" | "evidence" | "review" | "publication" | "provenance" | "revocation" | "collection-policy" | "configuration" | "policy" | "audit" | "command" | "job";
|
|
25
|
+
export interface KnowledgeRecord {
|
|
26
|
+
readonly schemaVersion: 1;
|
|
27
|
+
readonly resourceKind: ResourceKind;
|
|
28
|
+
readonly resourceId: string;
|
|
29
|
+
readonly partition: string;
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly kind: KnowledgeRecordKind;
|
|
32
|
+
readonly data: unknown;
|
|
33
|
+
}
|
|
34
|
+
export declare const maximumRecordNativeBytes = 900000;
|
|
35
|
+
export declare const maximumTransactionEncodedBytes: number;
|
|
36
|
+
export declare const maximumTransactionActions = 100;
|
|
37
|
+
export declare function encodeKnowledgeRecord(record: KnowledgeRecord): StoredRecord;
|
|
38
|
+
export declare function decodeKnowledgeRecord(record: StoredRecord): KnowledgeRecord;
|
|
39
|
+
export declare const knowledgeRecords: import("@pegma/storage-core").CollectionDefinition<KnowledgeRecord>;
|
|
40
|
+
//# sourceMappingURL=records.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AASpB,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,cAAc,CAAC;IAC9C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,cAAc,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,uBAAuB,CAAC;CAClD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,UAAU,GACV,UAAU,GACV,QAAQ,GACR,aAAa,GACb,YAAY,GACZ,YAAY,GACZ,mBAAmB,GACnB,eAAe,GACf,QAAQ,GACR,OAAO,GACP,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAChD,eAAO,MAAM,8BAA8B,QAAkB,CAAC;AAC9D,eAAO,MAAM,yBAAyB,MAAM,CAAC;AA8C7C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CA0B3E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,CA8C3E;AAED,eAAO,MAAM,gBAAgB,qEAI3B,CAAC"}
|
package/dist/records.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { defineCollection } from "@pegma/storage-core";
|
|
2
|
+
import { canonicalJson, RepositoryCapacityError, RepositoryIntegrityError, requireGeneration, requireIdentifier, } from "./storage-helpers.js";
|
|
3
|
+
export const maximumRecordNativeBytes = 900_000;
|
|
4
|
+
export const maximumTransactionEncodedBytes = 3 * 1024 * 1024;
|
|
5
|
+
export const maximumTransactionActions = 100;
|
|
6
|
+
const chunkCharacters = 30_000;
|
|
7
|
+
const maximumChunks = 15;
|
|
8
|
+
const kinds = [
|
|
9
|
+
"head",
|
|
10
|
+
"revision",
|
|
11
|
+
"evidence",
|
|
12
|
+
"review",
|
|
13
|
+
"publication",
|
|
14
|
+
"provenance",
|
|
15
|
+
"revocation",
|
|
16
|
+
"collection-policy",
|
|
17
|
+
"configuration",
|
|
18
|
+
"policy",
|
|
19
|
+
"audit",
|
|
20
|
+
"command",
|
|
21
|
+
"job",
|
|
22
|
+
];
|
|
23
|
+
function validateRecord(record) {
|
|
24
|
+
if (record.schemaVersion !== 1 ||
|
|
25
|
+
!["article", "collection", "validation"].includes(record.resourceKind) ||
|
|
26
|
+
!kinds.includes(record.kind))
|
|
27
|
+
throw new RepositoryIntegrityError();
|
|
28
|
+
requireIdentifier(record.resourceId);
|
|
29
|
+
if (record.data === null ||
|
|
30
|
+
typeof record.data !== "object" ||
|
|
31
|
+
Array.isArray(record.data))
|
|
32
|
+
throw new RepositoryIntegrityError();
|
|
33
|
+
if (typeof record.partition !== "string" ||
|
|
34
|
+
typeof record.id !== "string" ||
|
|
35
|
+
!new RegExp("^" + record.resourceKind + ":[a-f0-9]{64}$", "u").test(record.partition) ||
|
|
36
|
+
record.id.length === 0 ||
|
|
37
|
+
record.id.length > 300 ||
|
|
38
|
+
/[^A-Za-z0-9|:._-]/u.test(record.id))
|
|
39
|
+
throw new RepositoryIntegrityError();
|
|
40
|
+
}
|
|
41
|
+
export function encodeKnowledgeRecord(record) {
|
|
42
|
+
validateRecord(record);
|
|
43
|
+
const payload = canonicalJson(record.data);
|
|
44
|
+
if (payload.length * 2 > maximumRecordNativeBytes - 4_096)
|
|
45
|
+
throw new RepositoryCapacityError("record_bytes");
|
|
46
|
+
const parts = [];
|
|
47
|
+
for (let offset = 0; offset < payload.length;) {
|
|
48
|
+
let end = Math.min(payload.length, offset + chunkCharacters);
|
|
49
|
+
const last = payload.charCodeAt(end - 1);
|
|
50
|
+
if (end < payload.length && last >= 0xd800 && last <= 0xdbff)
|
|
51
|
+
end -= 1;
|
|
52
|
+
parts.push(payload.slice(offset, end));
|
|
53
|
+
offset = end;
|
|
54
|
+
}
|
|
55
|
+
if (parts.length === 0 || parts.length > maximumChunks)
|
|
56
|
+
throw new RepositoryCapacityError("record_chunks");
|
|
57
|
+
const encoded = {
|
|
58
|
+
schemaVersion: 1,
|
|
59
|
+
resourceKind: record.resourceKind,
|
|
60
|
+
resourceId: record.resourceId,
|
|
61
|
+
recordPartition: record.partition,
|
|
62
|
+
recordId: record.id,
|
|
63
|
+
kind: record.kind,
|
|
64
|
+
partCount: parts.length,
|
|
65
|
+
};
|
|
66
|
+
for (const [index, part] of parts.entries())
|
|
67
|
+
encoded["part" + index] = part;
|
|
68
|
+
return encoded;
|
|
69
|
+
}
|
|
70
|
+
export function decodeKnowledgeRecord(record) {
|
|
71
|
+
try {
|
|
72
|
+
if (record.schemaVersion !== 1 || typeof record.partCount !== "number")
|
|
73
|
+
throw new RepositoryIntegrityError();
|
|
74
|
+
requireGeneration(record.partCount, 1);
|
|
75
|
+
if (record.partCount > maximumChunks)
|
|
76
|
+
throw new RepositoryIntegrityError();
|
|
77
|
+
const expected = new Set([
|
|
78
|
+
"schemaVersion",
|
|
79
|
+
"resourceKind",
|
|
80
|
+
"resourceId",
|
|
81
|
+
"recordPartition",
|
|
82
|
+
"recordId",
|
|
83
|
+
"kind",
|
|
84
|
+
"partCount",
|
|
85
|
+
...Array.from({ length: record.partCount }, (_, index) => "part" + index),
|
|
86
|
+
]);
|
|
87
|
+
if (Object.keys(record).length !== expected.size ||
|
|
88
|
+
Object.keys(record).some((key) => !expected.has(key)))
|
|
89
|
+
throw new RepositoryIntegrityError();
|
|
90
|
+
const parts = [];
|
|
91
|
+
for (let index = 0; index < record.partCount; index += 1) {
|
|
92
|
+
const part = record["part" + index];
|
|
93
|
+
if (typeof part !== "string" || part.length > chunkCharacters)
|
|
94
|
+
throw new RepositoryIntegrityError();
|
|
95
|
+
parts.push(part);
|
|
96
|
+
}
|
|
97
|
+
const payload = parts.join("");
|
|
98
|
+
if (payload.length * 2 > maximumRecordNativeBytes - 4_096)
|
|
99
|
+
throw new RepositoryIntegrityError();
|
|
100
|
+
const decoded = {
|
|
101
|
+
schemaVersion: 1,
|
|
102
|
+
resourceKind: record.resourceKind,
|
|
103
|
+
resourceId: record.resourceId,
|
|
104
|
+
partition: record.recordPartition,
|
|
105
|
+
id: record.recordId,
|
|
106
|
+
kind: record.kind,
|
|
107
|
+
data: JSON.parse(payload),
|
|
108
|
+
};
|
|
109
|
+
validateRecord(decoded);
|
|
110
|
+
canonicalJson(decoded.data);
|
|
111
|
+
return decoded;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new RepositoryIntegrityError();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export const knowledgeRecords = defineCollection({
|
|
118
|
+
name: "knowledge-base.records.v1",
|
|
119
|
+
key: (record) => ({ partition: record.partition, id: record.id }),
|
|
120
|
+
codec: { encode: encodeKnowledgeRecord, decode: decodeKnowledgeRecord },
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,qBAAqB,CAAC;AAY1E,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAmD9B,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAC7C,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,KAAK,GAAsB;IAC/B,MAAM;IACN,UAAU;IACV,UAAU;IACV,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,eAAe;IACf,QAAQ;IACR,OAAO;IACP,SAAS;IACT,KAAK;CACN,CAAC;AAEF,SAAS,cAAc,CAAC,MAAuB;IAC7C,IACE,MAAM,CAAC,aAAa,KAAK,CAAC;QAC1B,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;QACtE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAE5B,MAAM,IAAI,wBAAwB,EAAE,CAAC;IACvC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,IACE,MAAM,CAAC,IAAI,KAAK,IAAI;QACpB,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAE1B,MAAM,IAAI,wBAAwB,EAAE,CAAC;IACvC,IACE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;QAC7B,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,YAAY,GAAG,gBAAgB,EAAE,GAAG,CAAC,CAAC,IAAI,CACjE,MAAM,CAAC,SAAS,CACjB;QACD,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG;QACtB,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAEpC,MAAM,IAAI,wBAAwB,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAuB;IAC3D,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,wBAAwB,GAAG,KAAK;QACvD,MAAM,IAAI,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QAC9C,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;YAAE,GAAG,IAAI,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,aAAa;QACpD,MAAM,IAAI,uBAAuB,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,OAAO,GAAoC;QAC/C,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,eAAe,EAAE,MAAM,CAAC,SAAS;QACjC,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,KAAK,CAAC,MAAM;KACxB,CAAC;IACF,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;QAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;IAC5E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,aAAa,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YACpE,MAAM,IAAI,wBAAwB,EAAE,CAAC;QACvC,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,SAAS,GAAG,aAAa;YAAE,MAAM,IAAI,wBAAwB,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;YACvB,eAAe;YACf,cAAc;YACd,YAAY;YACZ,iBAAiB;YACjB,UAAU;YACV,MAAM;YACN,WAAW;YACX,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC;SAC1E,CAAC,CAAC;QACH,IACE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI;YAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAErD,MAAM,IAAI,wBAAwB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YACpC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe;gBAC3D,MAAM,IAAI,wBAAwB,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,wBAAwB,GAAG,KAAK;YACvD,MAAM,IAAI,wBAAwB,EAAE,CAAC;QACvC,MAAM,OAAO,GAAoB;YAC/B,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,MAAM,CAAC,YAA4B;YACjD,UAAU,EAAE,MAAM,CAAC,UAAoB;YACvC,SAAS,EAAE,MAAM,CAAC,eAAyB;YAC3C,EAAE,EAAE,MAAM,CAAC,QAAkB;YAC7B,IAAI,EAAE,MAAM,CAAC,IAA2B;YACxC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY;SACrC,CAAC;QACF,cAAc,CAAC,OAAO,CAAC,CAAC;QACxB,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,wBAAwB,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAkB;IAChE,IAAI,EAAE,2BAA2B;IACjC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;IACjE,KAAK,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE;CACxE,CAAC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type AuditDetails } from "@pegma/audit";
|
|
2
|
+
import type { IsoTimestamp, PrincipalId, VerificationEvidence, ArticleRevision, Article, PublishedArticle } from "@pegma/knowledge-base-contracts";
|
|
3
|
+
import type { Store } from "@pegma/storage-core";
|
|
4
|
+
import { type ResourceKind, type StoredArticle, type StoredCollection, type StoredValidationPolicy } from "./records.js";
|
|
5
|
+
import type { ReviewSnapshot, SourceSnapshot } from "./types.js";
|
|
6
|
+
export interface KnowledgeRepositoryLimits {
|
|
7
|
+
readonly maxPhysicalRows: number;
|
|
8
|
+
readonly maxRetainedBytes: number;
|
|
9
|
+
readonly controlReserveRows: number;
|
|
10
|
+
readonly controlReserveBytes: number;
|
|
11
|
+
readonly maxArticleRevisions: number;
|
|
12
|
+
readonly maxEvidenceVersions: number;
|
|
13
|
+
readonly maxConflictAttempts: number;
|
|
14
|
+
}
|
|
15
|
+
export interface VersionedState<T> {
|
|
16
|
+
readonly value: T;
|
|
17
|
+
readonly version: string;
|
|
18
|
+
}
|
|
19
|
+
export interface RepositoryCommand {
|
|
20
|
+
readonly commandId: string;
|
|
21
|
+
readonly correlationId: string;
|
|
22
|
+
readonly actorId: PrincipalId;
|
|
23
|
+
readonly operation: string;
|
|
24
|
+
readonly fingerprint: string;
|
|
25
|
+
readonly occurredAt: IsoTimestamp;
|
|
26
|
+
}
|
|
27
|
+
export interface KnowledgeJobInput {
|
|
28
|
+
readonly task: "article_changed" | "collection_changed" | "validation_changed";
|
|
29
|
+
readonly payload?: Readonly<Record<string, string | number | boolean | null>>;
|
|
30
|
+
}
|
|
31
|
+
export interface MutationInput<T> {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly command: RepositoryCommand;
|
|
34
|
+
readonly expectedGeneration?: number;
|
|
35
|
+
readonly control?: boolean;
|
|
36
|
+
readonly recheck: (current: T | null) => Promise<void>;
|
|
37
|
+
readonly decide: (current: T | null, nextGeneration: number) => Promise<{
|
|
38
|
+
readonly next: Omit<T, "generation">;
|
|
39
|
+
readonly jobs?: readonly KnowledgeJobInput[];
|
|
40
|
+
readonly auditDetails?: AuditDetails;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export interface RepositoryResult<T> {
|
|
44
|
+
readonly value: T;
|
|
45
|
+
readonly replayed: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Publication-only hydration; unrelated current draft/proofs remain private. */
|
|
48
|
+
export interface ArticlePublicationState {
|
|
49
|
+
readonly articleId: string;
|
|
50
|
+
readonly generation: number;
|
|
51
|
+
readonly state: Article["state"];
|
|
52
|
+
readonly publicationHeld: boolean;
|
|
53
|
+
readonly published?: PublishedArticle;
|
|
54
|
+
readonly publishedProvenance?: SourceSnapshot;
|
|
55
|
+
readonly publicationReview?: ReviewSnapshot;
|
|
56
|
+
}
|
|
57
|
+
export interface KnowledgeRepository {
|
|
58
|
+
readonly limits: KnowledgeRepositoryLimits;
|
|
59
|
+
readArticleVersioned(id: string): Promise<VersionedState<StoredArticle> | null>;
|
|
60
|
+
readArticlePublicationVersioned(id: string): Promise<VersionedState<ArticlePublicationState> | null>;
|
|
61
|
+
/** One keyed head read; never hydrates draft, evidence, or private source rows. */
|
|
62
|
+
readResourceGeneration(kind: ResourceKind, id: string): Promise<number | null>;
|
|
63
|
+
readCollectionVersioned(id: string): Promise<VersionedState<StoredCollection> | null>;
|
|
64
|
+
readValidationPolicyVersioned(id: string): Promise<VersionedState<StoredValidationPolicy> | null>;
|
|
65
|
+
getArticleRevision(id: string, revision: number): Promise<ArticleRevision | null>;
|
|
66
|
+
getEvidenceVersion(id: string, articleRevision: number, evidenceId: string, version: number): Promise<VerificationEvidence | null>;
|
|
67
|
+
isEvidenceRevoked(id: string, hash: string): Promise<boolean>;
|
|
68
|
+
executeArticle(input: MutationInput<StoredArticle>): Promise<RepositoryResult<StoredArticle>>;
|
|
69
|
+
executeCollection(input: MutationInput<StoredCollection>): Promise<RepositoryResult<StoredCollection>>;
|
|
70
|
+
executeValidationPolicy(input: MutationInput<StoredValidationPolicy>): Promise<RepositoryResult<StoredValidationPolicy>>;
|
|
71
|
+
}
|
|
72
|
+
export declare const defaultKnowledgeRepositoryLimits: KnowledgeRepositoryLimits;
|
|
73
|
+
export declare function createKnowledgeRepository(store: Store, overrides?: Partial<KnowledgeRepositoryLimits>): KnowledgeRepository;
|
|
74
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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"}
|