@gnolith/taproot 0.1.0-rc.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/COMPATIBILITY.md +15 -3
  3. package/LICENSE +21 -21
  4. package/README.md +122 -46
  5. package/SECURITY.md +10 -3
  6. package/SUPPORT.md +6 -1
  7. package/dist/authorization-maintenance.d.ts +55 -0
  8. package/dist/authorization-maintenance.d.ts.map +1 -0
  9. package/dist/authorization-maintenance.js +686 -0
  10. package/dist/authorization-maintenance.js.map +1 -0
  11. package/dist/authorization.d.ts +98 -0
  12. package/dist/authorization.d.ts.map +1 -0
  13. package/dist/authorization.js +1137 -0
  14. package/dist/authorization.js.map +1 -0
  15. package/dist/canonical.d.ts +2 -1
  16. package/dist/canonical.d.ts.map +1 -1
  17. package/dist/canonical.js +9 -1
  18. package/dist/canonical.js.map +1 -1
  19. package/dist/errors.d.ts +10 -0
  20. package/dist/errors.d.ts.map +1 -1
  21. package/dist/errors.js +10 -0
  22. package/dist/errors.js.map +1 -1
  23. package/dist/index.d.ts +127 -50
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +352 -44
  26. package/dist/index.js.map +1 -1
  27. package/dist/migrations.d.ts +42 -0
  28. package/dist/migrations.d.ts.map +1 -0
  29. package/dist/migrations.js +550 -0
  30. package/dist/migrations.js.map +1 -0
  31. package/dist/rdf.js +1 -1
  32. package/dist/rdf.js.map +1 -1
  33. package/dist/repository.d.ts +22 -11
  34. package/dist/repository.d.ts.map +1 -1
  35. package/dist/repository.js +596 -63
  36. package/dist/repository.js.map +1 -1
  37. package/dist/schema.d.ts +41 -7
  38. package/dist/schema.d.ts.map +1 -1
  39. package/dist/schema.js +722 -83
  40. package/dist/schema.js.map +1 -1
  41. package/dist/types.d.ts +59 -0
  42. package/dist/types.d.ts.map +1 -1
  43. package/docs/api.md +70 -18
  44. package/docs/architecture.md +21 -8
  45. package/docs/authorization.md +82 -0
  46. package/docs/completion-audit.md +22 -16
  47. package/docs/operations.md +48 -9
  48. package/docs/product-scope.md +11 -4
  49. package/docs/release-policy.md +4 -0
  50. package/docs/testing.md +31 -5
  51. package/docs/threat-model.md +38 -6
  52. package/examples/d1-diamond-interop/README.md +12 -0
  53. package/examples/d1-diamond-interop/demo.ts +281 -0
  54. package/migrations/0002_audit_operations.sql +4 -3
  55. package/migrations/0003_canonical_statement_text.sql +31 -0
  56. package/migrations/0004_canonical_authorization_policy.sql +213 -0
  57. package/package.json +12 -7
  58. package/examples/codex-site/.openai/hosting.json +0 -3
  59. package/examples/codex-site/README.md +0 -13
  60. package/examples/codex-site/demo.ts +0 -152
@@ -0,0 +1,550 @@
1
+ import { checksumMigration, migrateDiamondStore, readAppliedMigrations, } from '@gnolith/diamond';
2
+ import { BaseIriMismatchError, InvalidBaseIriError, SchemaMismatchError, TaprootMigrationStateError, } from './errors.js';
3
+ import { TAPROOT_JSON_VERSION, TAPROOT_RDF_VERSION, TAPROOT_SCHEMA_VERSION, backfillLegacyRevisions, backfillRdfOwnership, backfillTaprootAudit, inspectTaprootSchema, isExactTaprootPreFinalizeSchema, isExactPreAuthorizationTaprootSchema, isExactTaprootSchema, isExactTaprootUpgradeSchema, isRecognizedLegacyV1, legacyRevisionFinalizeStatements, legacyTaprootStructureStatements, preStatementTextTaprootSchemaStatements, taprootFinalizeStatements, taprootAuthorizationSchemaStatements, taprootSchemaStatements, verifyTaprootPackageSeeds, verifyPersistedStatementText, verifyTaprootSemanticState, } from './schema.js';
4
+ export const taprootMigrationNamespace = '@gnolith/taproot';
5
+ export const taprootMigrations = [
6
+ {
7
+ id: '0001-v0.1-schema',
8
+ statements: preStatementTextTaprootSchemaStatements,
9
+ },
10
+ {
11
+ id: '0002-durable-database-identity',
12
+ statements: [
13
+ `INSERT INTO taproot_metadata(metadata_key, metadata_value)
14
+ VALUES ('migration_api_version', '1')
15
+ ON CONFLICT(metadata_key) DO UPDATE SET metadata_value = excluded.metadata_value`,
16
+ ],
17
+ },
18
+ {
19
+ id: '0003-canonical-statement-text',
20
+ statements: [
21
+ `INSERT INTO taproot_assertions(assertion_key)
22
+ WITH canonical_json(entity_json) AS (
23
+ SELECT entity_json FROM taproot_entities
24
+ UNION ALL
25
+ SELECT entity_json FROM taproot_entity_revisions
26
+ )
27
+ SELECT NULL
28
+ FROM canonical_json AS source,
29
+ json_each(source.entity_json, '$.claims') AS claim,
30
+ json_each(claim.value) AS statement
31
+ WHERE json_type(statement.value, '$.text') IS NOT 'text'
32
+ OR trim(json_extract(statement.value, '$.text')) = ''
33
+ LIMIT 1`,
34
+ `UPDATE taproot_metadata SET metadata_value = '2'
35
+ WHERE metadata_key = 'canonical_json_version' AND metadata_value = '1'`,
36
+ `INSERT INTO taproot_assertions(assertion_key)
37
+ SELECT NULL WHERE NOT EXISTS (
38
+ SELECT 1 FROM taproot_metadata
39
+ WHERE metadata_key = 'canonical_json_version' AND metadata_value = '2'
40
+ )`,
41
+ `INSERT INTO taproot_migrations(version, name)
42
+ VALUES (3, 'canonical-statement-text')
43
+ ON CONFLICT(version) DO NOTHING`,
44
+ ],
45
+ },
46
+ {
47
+ id: '0004-canonical-authorization-policy',
48
+ statements: taprootAuthorizationSchemaStatements,
49
+ },
50
+ ];
51
+ const migrationPhaseKey = 'migration_phase';
52
+ const migrationSourceKey = 'migration_source';
53
+ const migrationSourceRdfKey = 'migration_source_rdf_version';
54
+ const migrationSourceBaseIriKey = 'migration_source_base_iri';
55
+ export function canonicalizeTaprootBaseIri(value) {
56
+ let url;
57
+ try {
58
+ url = new URL(value);
59
+ }
60
+ catch (cause) {
61
+ throw new InvalidBaseIriError('baseIri must be an absolute HTTP(S) IRI', {
62
+ cause,
63
+ });
64
+ }
65
+ if ((url.protocol !== 'http:' && url.protocol !== 'https:') ||
66
+ url.username !== '' ||
67
+ url.password !== '' ||
68
+ url.search !== '' ||
69
+ url.hash !== '')
70
+ throw new InvalidBaseIriError('baseIri must be an absolute HTTP(S) IRI without credentials, query, or fragment');
71
+ const canonical = stripTrailingSlashes(url.href);
72
+ if (!canonical)
73
+ throw new InvalidBaseIriError('baseIri cannot be empty');
74
+ return canonical;
75
+ }
76
+ function stripTrailingSlashes(value) {
77
+ let end = value.length;
78
+ while (end > 0 && value.charCodeAt(end - 1) === 47)
79
+ end -= 1;
80
+ return value.slice(0, end);
81
+ }
82
+ export async function inspectTaprootPersistence(db) {
83
+ const schema = await inspectTaprootSchema(db);
84
+ const baseIri = await readMetadata(db, 'base_iri');
85
+ const phase = await readMetadata(db, migrationPhaseKey);
86
+ const migrations = await planTaprootMigrations(db, schema);
87
+ let semanticCurrent = false;
88
+ const canonicalIdentity = baseIri === undefined ? undefined : tryCanonicalizeBaseIri(baseIri);
89
+ if (schema.valid &&
90
+ baseIri !== undefined &&
91
+ canonicalIdentity === baseIri &&
92
+ phase === undefined &&
93
+ migrations.every(({ status }) => status === 'applied')) {
94
+ try {
95
+ await verifyTaprootSemanticState(db, canonicalIdentity);
96
+ await verifyTaprootPackageSeeds(db);
97
+ semanticCurrent = true;
98
+ }
99
+ catch (cause) {
100
+ if (!(cause instanceof SchemaMismatchError))
101
+ throw cause;
102
+ }
103
+ }
104
+ return {
105
+ baseIri: baseIri ?? null,
106
+ schema,
107
+ migrations,
108
+ current: semanticCurrent,
109
+ };
110
+ }
111
+ export async function planTaprootMigrations(db, knownSchema) {
112
+ const expected = await expectedMigrations();
113
+ const ledgerExists = await tableExists(db, '_gnolith_migrations');
114
+ const applied = ledgerExists
115
+ ? await readAppliedMigrations(db, taprootMigrationNamespace)
116
+ : [];
117
+ validateApplied(applied, expected);
118
+ const phase = await readMetadata(db, migrationPhaseKey);
119
+ if (phase !== undefined) {
120
+ await validateRecoveryState(db, phase, applied);
121
+ return expected.map(({ migration, checksum }) => ({
122
+ id: migration.id,
123
+ checksum,
124
+ status: 'pending',
125
+ adopted: false,
126
+ }));
127
+ }
128
+ const schema = knownSchema ?? (await inspectTaprootSchema(db));
129
+ const taprootTableCount = await countTaprootTables(db);
130
+ const exactCurrent = !applied.length &&
131
+ taprootTableCount > 0 &&
132
+ schema.valid &&
133
+ (await isExactTaprootSchema(db));
134
+ const legacy = !applied.length &&
135
+ taprootTableCount > 0 &&
136
+ (await legacyTables(db)).length > 0 &&
137
+ (await isRecognizedLegacyV1(db, await legacyTables(db)));
138
+ if (!applied.length && taprootTableCount > 0 && !exactCurrent && !legacy)
139
+ throw new TaprootMigrationStateError(`Existing Taproot schema cannot be adopted exactly${schema.errors.length ? `: ${schema.errors.join('; ')}` : ': catalog definitions differ from the package manifest'}`);
140
+ return expected.map(({ migration, checksum }, index) => {
141
+ const record = applied.find(({ id }) => id === migration.id);
142
+ return {
143
+ id: migration.id,
144
+ checksum,
145
+ status: record
146
+ ? 'applied'
147
+ : exactCurrent && index === 0
148
+ ? 'adoptable'
149
+ : 'pending',
150
+ adopted: record?.adopted ?? false,
151
+ };
152
+ });
153
+ }
154
+ export async function applyTaprootMigrations(db, options = {}) {
155
+ const requested = options.baseIri === undefined
156
+ ? undefined
157
+ : canonicalizeTaprootBaseIri(options.baseIri);
158
+ const existingIdentity = await readMetadata(db, 'base_iri');
159
+ if (existingIdentity === undefined && requested === undefined)
160
+ throw new InvalidBaseIriError('baseIri is required when initializing a Taproot database for the first time');
161
+ const canonicalExisting = existingIdentity === undefined
162
+ ? undefined
163
+ : canonicalizeTaprootBaseIri(existingIdentity);
164
+ if (canonicalExisting !== undefined &&
165
+ requested !== undefined &&
166
+ canonicalExisting !== requested)
167
+ throw new BaseIriMismatchError(`Taproot database identity is ${canonicalExisting}, not ${requested}`);
168
+ const identity = requested ?? canonicalExisting;
169
+ // Diamond owns its schema and ledger namespace. Its initialization is the
170
+ // only prerequisite outside Taproot's package-owned transaction sequence.
171
+ await migrateDiamondStore(db);
172
+ const expected = await expectedMigrations();
173
+ let applied = await readAppliedMigrations(db, taprootMigrationNamespace);
174
+ validateApplied(applied, expected);
175
+ let phase = await readMetadata(db, migrationPhaseKey);
176
+ if (phase !== undefined)
177
+ await validateRecoveryState(db, phase, applied);
178
+ if (phase === undefined &&
179
+ applied.length > 0 &&
180
+ applied.length < expected.length) {
181
+ if (!(await isExactPreAuthorizationTaprootSchema(db)))
182
+ throw new TaprootMigrationStateError('Pending Taproot migrations require the exact prior package catalog');
183
+ const pending = expected.slice(applied.length);
184
+ if (pending.some(({ migration }) => migration.id !== '0003-canonical-statement-text' &&
185
+ migration.id !== '0004-canonical-authorization-policy'))
186
+ throw new TaprootMigrationStateError('Taproot migration ledger is partial and has no supported upgrade path');
187
+ const appliedAt = new Date().toISOString();
188
+ if (pending.some(({ migration }) => migration.id === '0003-canonical-statement-text')) {
189
+ try {
190
+ await verifyPersistedStatementText(db);
191
+ }
192
+ catch (cause) {
193
+ throw new TaprootMigrationStateError('Existing Taproot statements lack explicitly authored nonblank text; migration refused without rewriting or inventing historical text', { cause });
194
+ }
195
+ }
196
+ try {
197
+ await db.batch([
198
+ ...pending.flatMap(({ migration }) => migration.statements.map((sql) => db.prepare(sql))),
199
+ ...ledgerStatements(db, pending, 0, appliedAt),
200
+ ]);
201
+ }
202
+ catch (cause) {
203
+ throw new TaprootMigrationStateError('Canonical statement-text migration failed; existing data may lack explicitly authored text and no historical text was inferred or rewritten', { cause });
204
+ }
205
+ applied = await readAppliedMigrations(db, taprootMigrationNamespace);
206
+ validateApplied(applied, expected);
207
+ }
208
+ if (phase === undefined && applied.length > 0) {
209
+ if (applied.length !== expected.length)
210
+ throw new TaprootMigrationStateError('Taproot migration ledger is partial and has no recovery marker');
211
+ if (!(await isExactTaprootSchema(db)))
212
+ throw new TaprootMigrationStateError('Applied Taproot migration ledger does not match the package catalog');
213
+ await writeCanonicalIdentity(db, identity, existingIdentity);
214
+ try {
215
+ await verifyTaprootSemanticState(db, identity);
216
+ await verifyTaprootPackageSeeds(db);
217
+ return inspectTaprootPersistence(db);
218
+ }
219
+ catch (cause) {
220
+ if (!(cause instanceof SchemaMismatchError))
221
+ throw cause;
222
+ await beginRecovery(db, 'current', TAPROOT_RDF_VERSION, identity, true);
223
+ applied = [];
224
+ phase = 'structure';
225
+ }
226
+ }
227
+ if (phase === undefined) {
228
+ const tables = await legacyTables(db);
229
+ const count = await countTaprootTables(db);
230
+ if (count === 0) {
231
+ await initializeFresh(db, identity, expected);
232
+ return inspectTaprootPersistence(db);
233
+ }
234
+ if (await isRecognizedLegacyV1(db, tables)) {
235
+ await db.batch([
236
+ ...legacyTaprootStructureStatements.map((sql) => db.prepare(sql)),
237
+ ...recoveryMetadataStatements(db, 'legacy', '1', identity, existingIdentity),
238
+ ]);
239
+ phase = 'structure';
240
+ }
241
+ else if (await isExactTaprootSchema(db)) {
242
+ const previousRdf = (await readMetadata(db, 'rdf_mapping_version')) ?? '1';
243
+ await beginRecovery(db, 'current', previousRdf, identity, false, existingIdentity);
244
+ phase = 'structure';
245
+ }
246
+ else {
247
+ const schema = await inspectTaprootSchema(db);
248
+ throw new TaprootMigrationStateError(`Existing Taproot schema cannot be adopted exactly${schema.errors.length ? `: ${schema.errors.join('; ')}` : ': catalog definitions differ from the package manifest'}`);
249
+ }
250
+ }
251
+ while (phase !== undefined) {
252
+ const source = await requireRecoverySource(db);
253
+ if (phase === 'structure') {
254
+ if (source === 'legacy')
255
+ await backfillLegacyRevisions(db);
256
+ await transitionPhase(db, 'structure', 'revisions', [
257
+ `SELECT NULL WHERE EXISTS (
258
+ SELECT 1 FROM taproot_entity_revisions
259
+ WHERE event_id IS NULL OR content_hash IS NULL
260
+ )`,
261
+ ], source === 'legacy' ? legacyRevisionFinalizeStatements : []);
262
+ phase = 'revisions';
263
+ continue;
264
+ }
265
+ if (phase === 'revisions') {
266
+ await backfillTaprootAudit(db);
267
+ await transitionPhase(db, 'revisions', 'audit', [
268
+ `SELECT NULL WHERE EXISTS (
269
+ SELECT 1 FROM taproot_entity_revisions r
270
+ LEFT JOIN taproot_audit_events a ON a.event_id = r.event_id
271
+ WHERE a.event_id IS NULL OR a.entity_id IS NOT r.entity_id
272
+ OR a.revision IS NOT r.revision
273
+ OR a.content_hash IS NOT r.content_hash
274
+ OR a.parent_hash IS NOT r.parent_hash
275
+ OR a.attribution_json IS NOT r.attribution_json
276
+ OR a.edit_summary IS NOT r.edit_summary
277
+ OR a.tags_json IS NOT r.tags_json
278
+ OR a.created_at IS NOT r.created_at
279
+ )`,
280
+ ]);
281
+ phase = 'audit';
282
+ continue;
283
+ }
284
+ if (phase === 'audit') {
285
+ const previousRdf = await readMetadata(db, migrationSourceRdfKey);
286
+ const previousBaseIri = await readMetadata(db, migrationSourceBaseIriKey);
287
+ await backfillRdfOwnership(db, previousRdf, previousBaseIri);
288
+ await transitionPhase(db, 'audit', 'rdf');
289
+ phase = 'rdf';
290
+ continue;
291
+ }
292
+ if (phase === 'rdf') {
293
+ await verifyPersistedStatementText(db);
294
+ await verifyTaprootSemanticState(db, identity);
295
+ await finalizeRecovery(db, identity, expected, source !== 'current' || applied.length === 0);
296
+ phase = undefined;
297
+ continue;
298
+ }
299
+ throw new TaprootMigrationStateError(`Unknown Taproot recovery phase ${phase}`);
300
+ }
301
+ return inspectTaprootPersistence(db);
302
+ }
303
+ async function initializeFresh(db, identity, expected) {
304
+ const appliedAt = new Date().toISOString();
305
+ await db.batch([
306
+ ...taprootSchemaStatements.map((sql) => db.prepare(sql)),
307
+ ...identityStatements(db, identity),
308
+ db.prepare(`INSERT INTO taproot_metadata(metadata_key, metadata_value)
309
+ VALUES ('migration_api_version', '1')
310
+ ON CONFLICT(metadata_key) DO UPDATE SET metadata_value = excluded.metadata_value`),
311
+ ...ledgerStatements(db, expected, 0, appliedAt),
312
+ ]);
313
+ }
314
+ async function beginRecovery(db, source, previousRdf, identity, removeLedger, observedIdentity) {
315
+ await db.batch([
316
+ ...(removeLedger
317
+ ? [
318
+ db
319
+ .prepare(`DELETE FROM _gnolith_migrations WHERE namespace = ?`)
320
+ .bind(taprootMigrationNamespace),
321
+ ]
322
+ : []),
323
+ ...recoveryMetadataStatements(db, source, previousRdf, identity, observedIdentity),
324
+ ]);
325
+ }
326
+ function recoveryMetadataStatements(db, source, previousRdf, identity, observedIdentity) {
327
+ return [
328
+ ...identityStatements(db, identity, observedIdentity),
329
+ db
330
+ .prepare(`INSERT INTO taproot_metadata(metadata_key, metadata_value)
331
+ VALUES (?, 'structure'), (?, ?), (?, ?), (?, ?)
332
+ ON CONFLICT(metadata_key) DO UPDATE SET metadata_value = excluded.metadata_value`)
333
+ .bind(migrationPhaseKey, migrationSourceKey, source, migrationSourceRdfKey, previousRdf, migrationSourceBaseIriKey, observedIdentity ?? identity),
334
+ ];
335
+ }
336
+ async function transitionPhase(db, from, to, failureQueries = [], statements = []) {
337
+ await db.batch([
338
+ ...failureQueries.map((sql) => db.prepare(`INSERT INTO taproot_assertions(assertion_key) ${sql}`)),
339
+ ...statements.map((sql) => db.prepare(sql)),
340
+ db
341
+ .prepare(`INSERT INTO taproot_assertions(assertion_key)
342
+ SELECT NULL WHERE NOT EXISTS (
343
+ SELECT 1 FROM taproot_metadata
344
+ WHERE metadata_key = ? AND metadata_value = ?
345
+ )`)
346
+ .bind(migrationPhaseKey, from),
347
+ db
348
+ .prepare(`UPDATE taproot_metadata SET metadata_value = ?
349
+ WHERE metadata_key = ? AND metadata_value = ?`)
350
+ .bind(to, migrationPhaseKey, from),
351
+ ]);
352
+ }
353
+ async function finalizeRecovery(db, identity, expected, adopted) {
354
+ const appliedAt = new Date().toISOString();
355
+ await db.batch([
356
+ db
357
+ .prepare(`INSERT INTO taproot_assertions(assertion_key)
358
+ SELECT NULL WHERE NOT EXISTS (
359
+ SELECT 1 FROM taproot_metadata
360
+ WHERE metadata_key = ? AND metadata_value = 'rdf'
361
+ )`)
362
+ .bind(migrationPhaseKey),
363
+ ...taprootFinalizeStatements.map((sql) => db.prepare(sql)),
364
+ ...identityStatements(db, identity),
365
+ db.prepare(`INSERT INTO taproot_metadata(metadata_key, metadata_value)
366
+ VALUES ('migration_api_version', '1')
367
+ ON CONFLICT(metadata_key) DO UPDATE SET metadata_value = excluded.metadata_value`),
368
+ db.prepare(`INSERT INTO taproot_assertions(assertion_key)
369
+ SELECT NULL WHERE
370
+ (SELECT COUNT(*) FROM taproot_migrations) != 4
371
+ OR NOT EXISTS (
372
+ SELECT 1 FROM taproot_migrations
373
+ WHERE version = 1 AND name = 'initial'
374
+ )
375
+ OR NOT EXISTS (
376
+ SELECT 1 FROM taproot_migrations
377
+ WHERE version = 2 AND name = 'audit-and-operations'
378
+ )
379
+ OR NOT EXISTS (
380
+ SELECT 1 FROM taproot_migrations
381
+ WHERE version = 3 AND name = 'canonical-statement-text'
382
+ )
383
+ OR NOT EXISTS (
384
+ SELECT 1 FROM taproot_migrations
385
+ WHERE version = 4 AND name = 'canonical-authorization-policy'
386
+ )`),
387
+ db.prepare(`INSERT INTO taproot_assertions(assertion_key)
388
+ SELECT NULL WHERE EXISTS (
389
+ SELECT 1 FROM taproot_rdf_ownership o
390
+ WHERE NOT EXISTS (
391
+ SELECT 1 FROM rdf_quads q
392
+ WHERE q.subject_key = o.subject_key
393
+ AND q.predicate_key = o.predicate_key
394
+ AND q.object_key = o.object_key
395
+ AND q.graph_key = o.graph_key
396
+ )
397
+ )`),
398
+ ...ledgerStatements(db, expected, adopted ? 1 : 0, appliedAt),
399
+ db
400
+ .prepare(`DELETE FROM taproot_metadata WHERE metadata_key IN (?, ?, ?, ?)`)
401
+ .bind(migrationPhaseKey, migrationSourceKey, migrationSourceRdfKey, migrationSourceBaseIriKey),
402
+ ]);
403
+ }
404
+ function identityStatements(db, identity, observedIdentity) {
405
+ return [
406
+ db
407
+ .prepare(`INSERT INTO taproot_metadata(metadata_key, metadata_value)
408
+ VALUES ('base_iri', ?)
409
+ ON CONFLICT(metadata_key) DO NOTHING`)
410
+ .bind(identity),
411
+ ...(observedIdentity === undefined || observedIdentity === identity
412
+ ? []
413
+ : [
414
+ db
415
+ .prepare(`UPDATE taproot_metadata SET metadata_value = ?
416
+ WHERE metadata_key = 'base_iri' AND metadata_value = ?`)
417
+ .bind(identity, observedIdentity),
418
+ ]),
419
+ db
420
+ .prepare(`INSERT INTO taproot_assertions(assertion_key)
421
+ SELECT NULL WHERE NOT EXISTS (
422
+ SELECT 1 FROM taproot_metadata
423
+ WHERE metadata_key = 'base_iri' AND metadata_value = ?
424
+ )`)
425
+ .bind(identity),
426
+ ];
427
+ }
428
+ function ledgerStatements(db, expected, adopted, appliedAt) {
429
+ return expected.map(({ migration, checksum }) => db
430
+ .prepare(`INSERT INTO _gnolith_migrations
431
+ (namespace, migration_id, checksum, adopted, applied_at)
432
+ VALUES (?, ?, ?, ?, ?)`)
433
+ .bind(taprootMigrationNamespace, migration.id, checksum, adopted, appliedAt));
434
+ }
435
+ async function writeCanonicalIdentity(db, identity, observedIdentity) {
436
+ await db.batch(identityStatements(db, identity, observedIdentity));
437
+ }
438
+ function tryCanonicalizeBaseIri(value) {
439
+ try {
440
+ return canonicalizeTaprootBaseIri(value);
441
+ }
442
+ catch {
443
+ return undefined;
444
+ }
445
+ }
446
+ async function validateRecoveryState(db, phase, applied) {
447
+ if (!['structure', 'revisions', 'audit', 'rdf'].includes(phase))
448
+ throw new TaprootMigrationStateError(`Unknown Taproot recovery phase ${phase}`);
449
+ if (applied.length)
450
+ throw new TaprootMigrationStateError('Taproot recovery marker cannot coexist with applied ledger entries');
451
+ const source = await requireRecoverySource(db);
452
+ const exact = source === 'legacy'
453
+ ? phase === 'structure'
454
+ ? await isExactTaprootUpgradeSchema(db)
455
+ : await isExactTaprootPreFinalizeSchema(db)
456
+ : await isExactTaprootSchema(db);
457
+ if (!exact)
458
+ throw new TaprootMigrationStateError('Taproot recovery catalog differs from its durable recovery source');
459
+ const sourceRdf = await readMetadata(db, migrationSourceRdfKey);
460
+ if (sourceRdf !== '1' && sourceRdf !== TAPROOT_RDF_VERSION)
461
+ throw new TaprootMigrationStateError('Taproot recovery source RDF version is missing or unsupported');
462
+ const sourceBaseIri = await readMetadata(db, migrationSourceBaseIriKey);
463
+ const currentBaseIri = await readMetadata(db, 'base_iri');
464
+ let sourceCanonical;
465
+ let currentCanonical;
466
+ try {
467
+ sourceCanonical =
468
+ sourceBaseIri === undefined
469
+ ? undefined
470
+ : canonicalizeTaprootBaseIri(sourceBaseIri);
471
+ currentCanonical =
472
+ currentBaseIri === undefined
473
+ ? undefined
474
+ : canonicalizeTaprootBaseIri(currentBaseIri);
475
+ }
476
+ catch {
477
+ // Converted below into one package-specific fail-closed state error.
478
+ }
479
+ if (sourceCanonical === undefined ||
480
+ currentCanonical === undefined ||
481
+ currentCanonical !== currentBaseIri ||
482
+ sourceCanonical !== currentCanonical)
483
+ throw new TaprootMigrationStateError('Taproot recovery source base IRI is missing, invalid, or does not match the durable identity');
484
+ }
485
+ async function requireRecoverySource(db) {
486
+ const source = await readMetadata(db, migrationSourceKey);
487
+ if (source !== 'legacy' && source !== 'current')
488
+ throw new TaprootMigrationStateError(`Unknown Taproot recovery source ${source ?? 'missing'}`);
489
+ return source;
490
+ }
491
+ async function expectedMigrations() {
492
+ return Promise.all(taprootMigrations.map(async (migration) => ({
493
+ migration,
494
+ checksum: await checksumMigration(migration),
495
+ })));
496
+ }
497
+ async function readMetadata(db, key) {
498
+ if (!(await tableExists(db, 'taproot_metadata')))
499
+ return undefined;
500
+ const result = await db
501
+ .prepare(`SELECT metadata_value FROM taproot_metadata WHERE metadata_key = ?`)
502
+ .bind(key)
503
+ .all();
504
+ return result.results[0]?.metadata_value;
505
+ }
506
+ async function tableExists(db, name) {
507
+ const result = await db
508
+ .prepare(`SELECT 1 AS found FROM sqlite_schema WHERE type = 'table' AND name = ?`)
509
+ .bind(name)
510
+ .all();
511
+ return result.results.length > 0;
512
+ }
513
+ async function countTaprootTables(db) {
514
+ const result = await db
515
+ .prepare(`SELECT COUNT(*) AS count FROM sqlite_schema
516
+ WHERE type = 'table' AND name LIKE 'taproot_%'`)
517
+ .all();
518
+ return Number(result.results[0]?.count ?? 0);
519
+ }
520
+ async function legacyTables(db) {
521
+ const result = await db
522
+ .prepare(`SELECT name FROM sqlite_schema
523
+ WHERE type = 'table' AND name LIKE 'taproot_%' ORDER BY name`)
524
+ .all();
525
+ return result.results;
526
+ }
527
+ function validateApplied(applied, expected) {
528
+ const expectedById = new Map(expected.map(({ migration, checksum }) => [migration.id, checksum]));
529
+ for (const record of applied) {
530
+ const checksum = expectedById.get(record.id);
531
+ if (!checksum)
532
+ throw new TaprootMigrationStateError(`Unknown Taproot migration ${record.id}`);
533
+ if (checksum !== record.checksum)
534
+ throw new TaprootMigrationStateError(`Checksum drift detected for Taproot migration ${record.id}`);
535
+ }
536
+ let gap = false;
537
+ const appliedIds = new Set(applied.map(({ id }) => id));
538
+ for (const { migration } of expected) {
539
+ if (!appliedIds.has(migration.id))
540
+ gap = true;
541
+ else if (gap)
542
+ throw new TaprootMigrationStateError(`Taproot migration history is out of order at ${migration.id}`);
543
+ }
544
+ }
545
+ export const taprootPersistenceVersions = {
546
+ schema: TAPROOT_SCHEMA_VERSION,
547
+ canonicalJson: TAPROOT_JSON_VERSION,
548
+ rdfMapping: TAPROOT_RDF_VERSION,
549
+ };
550
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
package/dist/rdf.js CHANGED
@@ -197,7 +197,7 @@ function addFullValue(snak, node, factory, quad) {
197
197
  }
198
198
  function namespaces(baseIri) {
199
199
  const base = withoutTrailingSlashes(baseIri);
200
- if (!/^https?:\/\//u.test(base))
200
+ if (!/^https?:\/\//iu.test(base))
201
201
  throw new TypeError('baseIri must be an absolute HTTP(S) IRI');
202
202
  return {
203
203
  entity: `${base}/entity/`,