@nicia-ai/typegraph 0.25.1 → 0.27.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 (122) hide show
  1. package/dist/backend/postgres/index.cjs +161 -113
  2. package/dist/backend/postgres/index.cjs.map +1 -1
  3. package/dist/backend/postgres/index.d.cts +6 -8
  4. package/dist/backend/postgres/index.d.ts +6 -8
  5. package/dist/backend/postgres/index.js +116 -68
  6. package/dist/backend/postgres/index.js.map +1 -1
  7. package/dist/backend/sqlite/index.cjs +16 -15
  8. package/dist/backend/sqlite/index.d.cts +11 -26
  9. package/dist/backend/sqlite/index.d.ts +11 -26
  10. package/dist/backend/sqlite/index.js +6 -5
  11. package/dist/backend/sqlite/libsql.cjs +9 -8
  12. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  13. package/dist/backend/sqlite/libsql.d.cts +4 -3
  14. package/dist/backend/sqlite/libsql.d.ts +4 -3
  15. package/dist/backend/sqlite/libsql.js +6 -5
  16. package/dist/backend/sqlite/libsql.js.map +1 -1
  17. package/dist/backend/sqlite/local.cjs +11 -10
  18. package/dist/backend/sqlite/local.cjs.map +1 -1
  19. package/dist/backend/sqlite/local.d.cts +4 -3
  20. package/dist/backend/sqlite/local.d.ts +4 -3
  21. package/dist/backend/sqlite/local.js +6 -5
  22. package/dist/backend/sqlite/local.js.map +1 -1
  23. package/dist/chunk-4FJVSF3K.cjs +12 -0
  24. package/dist/{chunk-D2GO3RBL.cjs.map → chunk-4FJVSF3K.cjs.map} +1 -1
  25. package/dist/chunk-5H3BAMTB.js +32 -0
  26. package/dist/chunk-5H3BAMTB.js.map +1 -0
  27. package/dist/{chunk-CLEUFN2K.js → chunk-DDVA4QBA.js} +174 -78
  28. package/dist/chunk-DDVA4QBA.js.map +1 -0
  29. package/dist/{chunk-OECDVACY.cjs → chunk-DN4RUDF3.cjs} +2 -2
  30. package/dist/chunk-DN4RUDF3.cjs.map +1 -0
  31. package/dist/{chunk-NHQWXSTS.js → chunk-E5ROA3MN.js} +3 -3
  32. package/dist/{chunk-NHQWXSTS.js.map → chunk-E5ROA3MN.js.map} +1 -1
  33. package/dist/{chunk-CPFR3O7L.js → chunk-ENXJLDRK.js} +2 -2
  34. package/dist/chunk-ENXJLDRK.js.map +1 -0
  35. package/dist/chunk-IUIWCFG3.cjs +36 -0
  36. package/dist/chunk-IUIWCFG3.cjs.map +1 -0
  37. package/dist/{chunk-EG6TJ3I5.js → chunk-OYLF3IC7.js} +3 -3
  38. package/dist/{chunk-EG6TJ3I5.js.map → chunk-OYLF3IC7.js.map} +1 -1
  39. package/dist/{chunk-JTI5WT4P.cjs → chunk-PN37HVAV.cjs} +32 -10
  40. package/dist/chunk-PN37HVAV.cjs.map +1 -0
  41. package/dist/{chunk-RCAJZG67.cjs → chunk-PYJOBZR3.cjs} +10 -10
  42. package/dist/{chunk-RCAJZG67.cjs.map → chunk-PYJOBZR3.cjs.map} +1 -1
  43. package/dist/{chunk-PSKUWVCB.js → chunk-RF5EUQWS.js} +336 -36
  44. package/dist/chunk-RF5EUQWS.js.map +1 -0
  45. package/dist/{chunk-CLGC7AQ2.cjs → chunk-RVT2N4RF.cjs} +206 -110
  46. package/dist/chunk-RVT2N4RF.cjs.map +1 -0
  47. package/dist/{chunk-4BOWVUGQ.js → chunk-TSGBRPNE.js} +3 -3
  48. package/dist/{chunk-4BOWVUGQ.js.map → chunk-TSGBRPNE.js.map} +1 -1
  49. package/dist/{chunk-CQVNGKU7.cjs → chunk-TVUARC7S.cjs} +410 -100
  50. package/dist/chunk-TVUARC7S.cjs.map +1 -0
  51. package/dist/{chunk-DOTEN2FG.js → chunk-U5ROKVRF.js} +26 -3
  52. package/dist/chunk-U5ROKVRF.js.map +1 -0
  53. package/dist/{chunk-E5JZSEGJ.cjs → chunk-WFUN6DCM.cjs} +8 -8
  54. package/dist/{chunk-E5JZSEGJ.cjs.map → chunk-WFUN6DCM.cjs.map} +1 -1
  55. package/dist/{chunk-AAA2CR3P.js → chunk-X53YKGHR.js} +78 -37
  56. package/dist/chunk-X53YKGHR.js.map +1 -0
  57. package/dist/{chunk-W5MTHMTE.cjs → chunk-YEDQLNVE.cjs} +26 -2
  58. package/dist/chunk-YEDQLNVE.cjs.map +1 -0
  59. package/dist/{chunk-QMQYK3IF.cjs → chunk-ZGEMI7MJ.cjs} +163 -122
  60. package/dist/chunk-ZGEMI7MJ.cjs.map +1 -0
  61. package/dist/{chunk-YZZBDCLV.js → chunk-ZTREJOGB.js} +32 -11
  62. package/dist/chunk-ZTREJOGB.js.map +1 -0
  63. package/dist/{ddl-BqMmpNor.d.ts → ddl-9kw8UADK.d.ts} +298 -12
  64. package/dist/{ddl-Bwjh8Hff.d.cts → ddl-Cw82BPM4.d.cts} +298 -12
  65. package/dist/{extension-types-D07e_NTw.d.cts → extension-types-B78CZfA5.d.cts} +1 -1
  66. package/dist/{extension-types-D07e_NTw.d.ts → extension-types-B78CZfA5.d.ts} +1 -1
  67. package/dist/graph-extension/index.cjs +18 -18
  68. package/dist/graph-extension/index.d.cts +4 -4
  69. package/dist/graph-extension/index.d.ts +4 -4
  70. package/dist/graph-extension/index.js +3 -3
  71. package/dist/{index-CT6nvtxL.d.cts → index-Bilw0pYm.d.cts} +34 -3
  72. package/dist/{index-DQheiVQV.d.ts → index-CWdBFWbI.d.ts} +34 -3
  73. package/dist/index.cjs +482 -361
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +13 -11
  76. package/dist/index.d.ts +13 -11
  77. package/dist/index.js +153 -37
  78. package/dist/index.js.map +1 -1
  79. package/dist/indexes/index.cjs +13 -13
  80. package/dist/indexes/index.d.cts +5 -5
  81. package/dist/indexes/index.d.ts +5 -5
  82. package/dist/indexes/index.js +1 -1
  83. package/dist/interchange/index.cjs +7 -7
  84. package/dist/interchange/index.d.cts +7 -5
  85. package/dist/interchange/index.d.ts +7 -5
  86. package/dist/interchange/index.js +2 -2
  87. package/dist/{manager-Cy3dhwYO.d.cts → manager-CWa9cgwb.d.cts} +36 -9
  88. package/dist/{manager-sZkU2VPC.d.ts → manager-Cfcb2sJL.d.ts} +36 -9
  89. package/dist/{materialize-indexes-BB9N5uQl.d.cts → materialize-indexes-BQfaAZKA.d.cts} +1 -1
  90. package/dist/{materialize-indexes-BYpU2RKh.d.ts → materialize-indexes-DFavFQah.d.ts} +1 -1
  91. package/dist/profiler/index.d.cts +9 -7
  92. package/dist/profiler/index.d.ts +9 -7
  93. package/dist/schema/index.cjs +32 -27
  94. package/dist/schema/index.cjs.map +1 -1
  95. package/dist/schema/index.d.cts +9 -7
  96. package/dist/schema/index.d.ts +9 -7
  97. package/dist/schema/index.js +6 -5
  98. package/dist/schema/index.js.map +1 -1
  99. package/dist/{sqlite-h6dta1IJ.d.ts → sqlite-BvSEbybu.d.cts} +320 -1
  100. package/dist/{sqlite-BhFswiAR.d.cts → sqlite-GKvcDPVn.d.ts} +320 -1
  101. package/dist/{store-BS_hehiz.d.ts → store-C57kdvAa.d.ts} +155 -5
  102. package/dist/{store-CkCvqRUf.d.cts → store-Ojf0NOKk.d.cts} +155 -5
  103. package/dist/{types-BpgACExN.d.cts → types-CF7nDH3q.d.cts} +2 -2
  104. package/dist/{types-Bz-Pi681.d.ts → types-Cars4JZ1.d.ts} +2 -2
  105. package/dist/{types-DptZHe-l.d.ts → types-DZPBXZOK.d.cts} +272 -14
  106. package/dist/{types-WF5ItKQu.d.cts → types-Dzkr0Eqi.d.ts} +272 -14
  107. package/dist/{where-DZYMiXVq.d.cts → where-BmtjfWuS.d.cts} +2 -2
  108. package/dist/{where-C40InMIp.d.ts → where-kk1Zz2En.d.ts} +2 -2
  109. package/package.json +3 -1
  110. package/dist/chunk-AAA2CR3P.js.map +0 -1
  111. package/dist/chunk-CLEUFN2K.js.map +0 -1
  112. package/dist/chunk-CLGC7AQ2.cjs.map +0 -1
  113. package/dist/chunk-CPFR3O7L.js.map +0 -1
  114. package/dist/chunk-CQVNGKU7.cjs.map +0 -1
  115. package/dist/chunk-D2GO3RBL.cjs +0 -12
  116. package/dist/chunk-DOTEN2FG.js.map +0 -1
  117. package/dist/chunk-JTI5WT4P.cjs.map +0 -1
  118. package/dist/chunk-OECDVACY.cjs.map +0 -1
  119. package/dist/chunk-PSKUWVCB.js.map +0 -1
  120. package/dist/chunk-QMQYK3IF.cjs.map +0 -1
  121. package/dist/chunk-W5MTHMTE.cjs.map +0 -1
  122. package/dist/chunk-YZZBDCLV.js.map +0 -1
@@ -1,29 +1,30 @@
1
1
  'use strict';
2
2
 
3
- var chunkE5JZSEGJ_cjs = require('./chunk-E5JZSEGJ.cjs');
4
- var chunkRCAJZG67_cjs = require('./chunk-RCAJZG67.cjs');
3
+ var chunkWFUN6DCM_cjs = require('./chunk-WFUN6DCM.cjs');
4
+ var chunkPYJOBZR3_cjs = require('./chunk-PYJOBZR3.cjs');
5
+ var chunkIUIWCFG3_cjs = require('./chunk-IUIWCFG3.cjs');
5
6
  var chunkCTHNVU6K_cjs = require('./chunk-CTHNVU6K.cjs');
6
7
  var chunkEK6RJ373_cjs = require('./chunk-EK6RJ373.cjs');
7
8
  var chunkX3244EKP_cjs = require('./chunk-X3244EKP.cjs');
8
- var chunkW5MTHMTE_cjs = require('./chunk-W5MTHMTE.cjs');
9
+ var chunkYEDQLNVE_cjs = require('./chunk-YEDQLNVE.cjs');
9
10
  var zod = require('zod');
10
11
 
11
12
  // src/core/node.ts
12
13
  function validateSchemaKeys(schema, name) {
13
- chunkRCAJZG67_cjs.assertSchemaKeysAreFree(
14
+ chunkPYJOBZR3_cjs.assertSchemaKeysAreFree(
14
15
  "Node",
15
16
  name,
16
17
  Object.keys(schema.shape),
17
- chunkRCAJZG67_cjs.RESERVED_NODE_KEYS
18
+ chunkPYJOBZR3_cjs.RESERVED_NODE_KEYS
18
19
  );
19
20
  }
20
21
  function defineNode(name, options) {
21
22
  validateSchemaKeys(options.schema, name);
22
23
  if (options.annotations !== void 0) {
23
- chunkRCAJZG67_cjs.assertJsonValue(options.annotations, "annotations", `Node "${name}"`);
24
+ chunkPYJOBZR3_cjs.assertJsonValue(options.annotations, "annotations", `Node "${name}"`);
24
25
  }
25
26
  return Object.freeze({
26
- [chunkE5JZSEGJ_cjs.NODE_TYPE_BRAND]: true,
27
+ [chunkWFUN6DCM_cjs.NODE_TYPE_BRAND]: true,
27
28
  kind: name,
28
29
  schema: options.schema,
29
30
  description: options.description,
@@ -32,21 +33,21 @@ function defineNode(name, options) {
32
33
  }
33
34
  var EMPTY_SCHEMA = zod.z.object({});
34
35
  function validateSchemaKeys2(schema, name) {
35
- chunkRCAJZG67_cjs.assertSchemaKeysAreFree(
36
+ chunkPYJOBZR3_cjs.assertSchemaKeysAreFree(
36
37
  "Edge",
37
38
  name,
38
39
  Object.keys(schema.shape),
39
- chunkRCAJZG67_cjs.RESERVED_EDGE_KEYS
40
+ chunkPYJOBZR3_cjs.RESERVED_EDGE_KEYS
40
41
  );
41
42
  }
42
43
  function defineEdge(name, options) {
43
44
  const schema = options?.schema ?? EMPTY_SCHEMA;
44
45
  validateSchemaKeys2(schema, name);
45
46
  if (options?.annotations !== void 0) {
46
- chunkRCAJZG67_cjs.assertJsonValue(options.annotations, "annotations", `Edge "${name}"`);
47
+ chunkPYJOBZR3_cjs.assertJsonValue(options.annotations, "annotations", `Edge "${name}"`);
47
48
  }
48
49
  return Object.freeze({
49
- [chunkE5JZSEGJ_cjs.EDGE_TYPE_BRAND]: true,
50
+ [chunkWFUN6DCM_cjs.EDGE_TYPE_BRAND]: true,
50
51
  kind: name,
51
52
  schema,
52
53
  description: options?.description,
@@ -83,7 +84,7 @@ function createMetaEdge(name, properties) {
83
84
  }
84
85
  });
85
86
  }
86
- var subClassOfMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_SUB_CLASS_OF, {
87
+ var subClassOfMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_SUB_CLASS_OF, {
87
88
  transitive: true,
88
89
  inference: "subsumption",
89
90
  description: "Type inheritance (Podcast subClassOf Media)"
@@ -95,9 +96,9 @@ function subClassOf(child, parent) {
95
96
  to: parent
96
97
  };
97
98
  }
98
- var broaderMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_BROADER, {
99
+ var broaderMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_BROADER, {
99
100
  transitive: true,
100
- inverse: chunkRCAJZG67_cjs.META_EDGE_NARROWER,
101
+ inverse: chunkPYJOBZR3_cjs.META_EDGE_NARROWER,
101
102
  inference: "hierarchy",
102
103
  description: "Broader concept (ML broader AI)"
103
104
  });
@@ -108,9 +109,9 @@ function broader(narrowerConcept, broaderConcept) {
108
109
  to: broaderConcept
109
110
  };
110
111
  }
111
- var narrowerMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_NARROWER, {
112
+ var narrowerMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_NARROWER, {
112
113
  transitive: true,
113
- inverse: chunkRCAJZG67_cjs.META_EDGE_BROADER,
114
+ inverse: chunkPYJOBZR3_cjs.META_EDGE_BROADER,
114
115
  inference: "hierarchy",
115
116
  description: "Narrower concept (AI narrower ML)"
116
117
  });
@@ -121,7 +122,7 @@ function narrower(broaderConcept, narrowerConcept) {
121
122
  to: narrowerConcept
122
123
  };
123
124
  }
124
- var relatedToMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_RELATED_TO, {
125
+ var relatedToMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_RELATED_TO, {
125
126
  symmetric: true,
126
127
  inference: "association",
127
128
  description: "Non-hierarchical association"
@@ -133,7 +134,7 @@ function relatedTo(conceptA, conceptB) {
133
134
  to: conceptB
134
135
  };
135
136
  }
136
- var equivalentToMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_EQUIVALENT_TO, {
137
+ var equivalentToMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_EQUIVALENT_TO, {
137
138
  symmetric: true,
138
139
  transitive: true,
139
140
  inference: "substitution",
@@ -146,7 +147,7 @@ function equivalentTo(kindA, kindBOrIri) {
146
147
  to: kindBOrIri
147
148
  };
148
149
  }
149
- var sameAsMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_SAME_AS, {
150
+ var sameAsMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_SAME_AS, {
150
151
  symmetric: true,
151
152
  transitive: true,
152
153
  inference: "substitution",
@@ -159,7 +160,7 @@ function sameAs(kindA, kindBOrIri) {
159
160
  to: kindBOrIri
160
161
  };
161
162
  }
162
- var differentFromMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_DIFFERENT_FROM, {
163
+ var differentFromMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_DIFFERENT_FROM, {
163
164
  symmetric: true,
164
165
  inference: "constraint",
165
166
  description: "Explicitly different individuals"
@@ -171,7 +172,7 @@ function differentFrom(kindA, kindB) {
171
172
  to: kindB
172
173
  };
173
174
  }
174
- var disjointWithMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_DISJOINT_WITH, {
175
+ var disjointWithMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_DISJOINT_WITH, {
175
176
  symmetric: true,
176
177
  inference: "constraint",
177
178
  description: "Mutually exclusive types"
@@ -183,9 +184,9 @@ function disjointWith(kindA, kindB) {
183
184
  to: kindB
184
185
  };
185
186
  }
186
- var partOfMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_PART_OF, {
187
+ var partOfMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_PART_OF, {
187
188
  transitive: true,
188
- inverse: chunkRCAJZG67_cjs.META_EDGE_HAS_PART,
189
+ inverse: chunkPYJOBZR3_cjs.META_EDGE_HAS_PART,
189
190
  inference: "composition",
190
191
  description: "X is part of Y"
191
192
  });
@@ -196,9 +197,9 @@ function partOf(part, whole) {
196
197
  to: whole
197
198
  };
198
199
  }
199
- var hasPartMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_HAS_PART, {
200
+ var hasPartMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_HAS_PART, {
200
201
  transitive: true,
201
- inverse: chunkRCAJZG67_cjs.META_EDGE_PART_OF,
202
+ inverse: chunkPYJOBZR3_cjs.META_EDGE_PART_OF,
202
203
  inference: "composition",
203
204
  description: "Y has part X"
204
205
  });
@@ -209,12 +210,12 @@ function hasPart(whole, part) {
209
210
  to: part
210
211
  };
211
212
  }
212
- var inverseOfMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_INVERSE_OF, {
213
+ var inverseOfMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_INVERSE_OF, {
213
214
  symmetric: true,
214
215
  inference: "none",
215
216
  description: "Edge A is inverse of edge B"
216
217
  });
217
- var impliesMetaEdge = createMetaEdge(chunkRCAJZG67_cjs.META_EDGE_IMPLIES, {
218
+ var impliesMetaEdge = createMetaEdge(chunkPYJOBZR3_cjs.META_EDGE_IMPLIES, {
218
219
  transitive: true,
219
220
  inference: "none",
220
221
  description: "Edge A implies edge B exists"
@@ -262,21 +263,6 @@ var core = {
262
263
  implies
263
264
  };
264
265
 
265
- // src/schema/canonical.ts
266
- function sortedReplacer(_key, value) {
267
- if (value !== null && typeof value === "object" && !Array.isArray(value)) {
268
- const sorted = {};
269
- for (const key of Object.keys(value).toSorted()) {
270
- sorted[key] = value[key];
271
- }
272
- return sorted;
273
- }
274
- return value;
275
- }
276
- function canonicalEqual(a, b) {
277
- return JSON.stringify(a, sortedReplacer) === JSON.stringify(b, sortedReplacer);
278
- }
279
-
280
266
  // src/schema/migration.ts
281
267
  function computeSchemaDiff(before, after) {
282
268
  const nodeChanges = diffNodes(before.nodes, after.nodes);
@@ -359,7 +345,7 @@ function diffNodes(before, after) {
359
345
  }
360
346
  function diffNodeDef(name, before, after) {
361
347
  const changes = [];
362
- if (!canonicalEqual(before.properties, after.properties)) {
348
+ if (!chunkIUIWCFG3_cjs.canonicalEqual(before.properties, after.properties)) {
363
349
  const beforeProps = before.properties.properties ?? {};
364
350
  const afterProps = after.properties.properties ?? {};
365
351
  const beforeRequired = new Set(before.properties.required);
@@ -398,7 +384,7 @@ function diffNodeDef(name, before, after) {
398
384
  after
399
385
  });
400
386
  }
401
- if (!canonicalEqual(before.uniqueConstraints, after.uniqueConstraints)) {
387
+ if (!chunkIUIWCFG3_cjs.canonicalEqual(before.uniqueConstraints, after.uniqueConstraints)) {
402
388
  changes.push({
403
389
  type: "modified",
404
390
  kind: name,
@@ -482,7 +468,7 @@ function diffEdges(before, after) {
482
468
  }
483
469
  function diffEdgeDef(name, before, after) {
484
470
  const changes = [];
485
- if (!canonicalEqual(before.fromKinds, after.fromKinds)) {
471
+ if (!chunkIUIWCFG3_cjs.canonicalEqual(before.fromKinds, after.fromKinds)) {
486
472
  changes.push({
487
473
  type: "modified",
488
474
  kind: name,
@@ -492,7 +478,7 @@ function diffEdgeDef(name, before, after) {
492
478
  after
493
479
  });
494
480
  }
495
- if (!canonicalEqual(before.toKinds, after.toKinds)) {
481
+ if (!chunkIUIWCFG3_cjs.canonicalEqual(before.toKinds, after.toKinds)) {
496
482
  changes.push({
497
483
  type: "modified",
498
484
  kind: name,
@@ -512,7 +498,7 @@ function diffEdgeDef(name, before, after) {
512
498
  after
513
499
  });
514
500
  }
515
- if (!canonicalEqual(before.properties, after.properties)) {
501
+ if (!chunkIUIWCFG3_cjs.canonicalEqual(before.properties, after.properties)) {
516
502
  changes.push({
517
503
  type: "modified",
518
504
  kind: name,
@@ -537,7 +523,7 @@ function diffEdgeDef(name, before, after) {
537
523
  function annotationsChanged(before, after) {
538
524
  if (before === void 0 && after === void 0) return false;
539
525
  if (before === void 0 || after === void 0) return true;
540
- return !canonicalEqual(before, after);
526
+ return !chunkIUIWCFG3_cjs.canonicalEqual(before, after);
541
527
  }
542
528
  function diffOntology(before, after) {
543
529
  const changes = [];
@@ -636,7 +622,7 @@ function diffIndexes(before, after) {
636
622
  for (const [name, beforeIndex] of beforeByName) {
637
623
  const afterIndex = afterByName.get(name);
638
624
  if (!afterIndex) continue;
639
- if (!canonicalEqual(beforeIndex, afterIndex)) {
625
+ if (!chunkIUIWCFG3_cjs.canonicalEqual(beforeIndex, afterIndex)) {
640
626
  changes.push({
641
627
  type: "modified",
642
628
  name,
@@ -666,7 +652,7 @@ function diffExtension(before, after) {
666
652
  details: "Graph extension document was removed"
667
653
  };
668
654
  }
669
- if (canonicalEqual(before, after)) return void 0;
655
+ if (chunkIUIWCFG3_cjs.canonicalEqual(before, after)) return void 0;
670
656
  return {
671
657
  type: "modified",
672
658
  severity: "safe",
@@ -818,7 +804,7 @@ var KindRegistry = class {
818
804
  * Checks if child is a subclass of parent (directly or transitively).
819
805
  */
820
806
  isSubClassOf(child, parent) {
821
- return chunkRCAJZG67_cjs.isReachable(this.subClassAncestors, child, parent);
807
+ return chunkPYJOBZR3_cjs.isReachable(this.subClassAncestors, child, parent);
822
808
  }
823
809
  /**
824
810
  * Expands a kind to include all its subclasses.
@@ -845,13 +831,13 @@ var KindRegistry = class {
845
831
  * Checks if narrowerConcept is narrower than broaderConcept.
846
832
  */
847
833
  isNarrowerThan(narrowerConcept, broaderConcept) {
848
- return chunkRCAJZG67_cjs.isReachable(this.broaderClosure, narrowerConcept, broaderConcept);
834
+ return chunkPYJOBZR3_cjs.isReachable(this.broaderClosure, narrowerConcept, broaderConcept);
849
835
  }
850
836
  /**
851
837
  * Checks if broaderConcept is broader than narrowerConcept.
852
838
  */
853
839
  isBroaderThan(broaderConcept, narrowerConcept) {
854
- return chunkRCAJZG67_cjs.isReachable(this.narrowerClosure, broaderConcept, narrowerConcept);
840
+ return chunkPYJOBZR3_cjs.isReachable(this.narrowerClosure, broaderConcept, narrowerConcept);
855
841
  }
856
842
  /**
857
843
  * Expands to include all narrower concepts.
@@ -915,7 +901,7 @@ var KindRegistry = class {
915
901
  * Checks if part is part of whole (directly or transitively).
916
902
  */
917
903
  isPartOf(part, whole) {
918
- return chunkRCAJZG67_cjs.isReachable(this.partOfClosure, part, whole);
904
+ return chunkPYJOBZR3_cjs.isReachable(this.partOfClosure, part, whole);
919
905
  }
920
906
  /**
921
907
  * Gets all wholes that contain this part.
@@ -1026,57 +1012,57 @@ function computeClosuresFromOntology(ontology) {
1026
1012
  const fromName = getKindName(relation.from);
1027
1013
  const toName = getKindName(relation.to);
1028
1014
  switch (relation.metaEdge.name) {
1029
- case chunkRCAJZG67_cjs.META_EDGE_SUB_CLASS_OF: {
1015
+ case chunkPYJOBZR3_cjs.META_EDGE_SUB_CLASS_OF: {
1030
1016
  subClassRelations.push([fromName, toName]);
1031
1017
  break;
1032
1018
  }
1033
- case chunkRCAJZG67_cjs.META_EDGE_BROADER: {
1019
+ case chunkPYJOBZR3_cjs.META_EDGE_BROADER: {
1034
1020
  broaderRelations.push([fromName, toName]);
1035
1021
  break;
1036
1022
  }
1037
- case chunkRCAJZG67_cjs.META_EDGE_NARROWER: {
1023
+ case chunkPYJOBZR3_cjs.META_EDGE_NARROWER: {
1038
1024
  broaderRelations.push([toName, fromName]);
1039
1025
  break;
1040
1026
  }
1041
- case chunkRCAJZG67_cjs.META_EDGE_EQUIVALENT_TO:
1042
- case chunkRCAJZG67_cjs.META_EDGE_SAME_AS: {
1027
+ case chunkPYJOBZR3_cjs.META_EDGE_EQUIVALENT_TO:
1028
+ case chunkPYJOBZR3_cjs.META_EDGE_SAME_AS: {
1043
1029
  equivalentRelations.push([fromName, toName]);
1044
1030
  break;
1045
1031
  }
1046
- case chunkRCAJZG67_cjs.META_EDGE_DISJOINT_WITH: {
1032
+ case chunkPYJOBZR3_cjs.META_EDGE_DISJOINT_WITH: {
1047
1033
  disjointRelations.push([fromName, toName]);
1048
1034
  break;
1049
1035
  }
1050
- case chunkRCAJZG67_cjs.META_EDGE_PART_OF: {
1036
+ case chunkPYJOBZR3_cjs.META_EDGE_PART_OF: {
1051
1037
  partOfRelations.push([fromName, toName]);
1052
1038
  break;
1053
1039
  }
1054
- case chunkRCAJZG67_cjs.META_EDGE_HAS_PART: {
1040
+ case chunkPYJOBZR3_cjs.META_EDGE_HAS_PART: {
1055
1041
  partOfRelations.push([toName, fromName]);
1056
1042
  break;
1057
1043
  }
1058
- case chunkRCAJZG67_cjs.META_EDGE_INVERSE_OF: {
1044
+ case chunkPYJOBZR3_cjs.META_EDGE_INVERSE_OF: {
1059
1045
  inverseOfRelations.push([fromName, toName]);
1060
1046
  break;
1061
1047
  }
1062
- case chunkRCAJZG67_cjs.META_EDGE_IMPLIES: {
1048
+ case chunkPYJOBZR3_cjs.META_EDGE_IMPLIES: {
1063
1049
  impliesRelations.push([fromName, toName]);
1064
1050
  break;
1065
1051
  }
1066
1052
  }
1067
1053
  }
1068
- const subClassAncestors = chunkRCAJZG67_cjs.computeTransitiveClosure(subClassRelations);
1069
- const subClassDescendants = chunkRCAJZG67_cjs.invertClosure(subClassAncestors);
1070
- const broaderClosure = chunkRCAJZG67_cjs.computeTransitiveClosure(broaderRelations);
1071
- const narrowerClosure = chunkRCAJZG67_cjs.invertClosure(broaderClosure);
1054
+ const subClassAncestors = chunkPYJOBZR3_cjs.computeTransitiveClosure(subClassRelations);
1055
+ const subClassDescendants = chunkPYJOBZR3_cjs.invertClosure(subClassAncestors);
1056
+ const broaderClosure = chunkPYJOBZR3_cjs.computeTransitiveClosure(broaderRelations);
1057
+ const narrowerClosure = chunkPYJOBZR3_cjs.invertClosure(broaderClosure);
1072
1058
  const equivalenceSets = computeEquivalenceSets(equivalentRelations);
1073
1059
  const iriToKind = computeIriMapping(equivalentRelations);
1074
1060
  const disjointPairs = computeDisjointPairs(disjointRelations);
1075
- const partOfClosure = chunkRCAJZG67_cjs.computeTransitiveClosure(partOfRelations);
1076
- const hasPartClosure = chunkRCAJZG67_cjs.invertClosure(partOfClosure);
1061
+ const partOfClosure = chunkPYJOBZR3_cjs.computeTransitiveClosure(partOfRelations);
1062
+ const hasPartClosure = chunkPYJOBZR3_cjs.invertClosure(partOfClosure);
1077
1063
  const edgeInverses = computeEdgeInverses(inverseOfRelations);
1078
- const edgeImplicationsClosure = chunkRCAJZG67_cjs.computeTransitiveClosure(impliesRelations);
1079
- const edgeImplyingClosure = chunkRCAJZG67_cjs.invertClosure(edgeImplicationsClosure);
1064
+ const edgeImplicationsClosure = chunkPYJOBZR3_cjs.computeTransitiveClosure(impliesRelations);
1065
+ const edgeImplyingClosure = chunkPYJOBZR3_cjs.invertClosure(edgeImplicationsClosure);
1080
1066
  return {
1081
1067
  subClassAncestors,
1082
1068
  subClassDescendants,
@@ -1180,7 +1166,7 @@ function serializeSchema(graph, version) {
1180
1166
  return {
1181
1167
  graphId: graph.id,
1182
1168
  version,
1183
- generatedAt: chunkE5JZSEGJ_cjs.nowIso(),
1169
+ generatedAt: chunkWFUN6DCM_cjs.nowIso(),
1184
1170
  nodes,
1185
1171
  edges,
1186
1172
  ontology,
@@ -1211,7 +1197,7 @@ function serializeDeprecatedKinds(set) {
1211
1197
  function canonicalExtension(document) {
1212
1198
  if (document === void 0) return void 0;
1213
1199
  if (document.version === void 0) return document;
1214
- if (document.version !== chunkRCAJZG67_cjs.LEGACY_GRAPH_EXTENSION_VERSION) return document;
1200
+ if (document.version !== chunkPYJOBZR3_cjs.LEGACY_GRAPH_EXTENSION_VERSION) return document;
1215
1201
  const { version: _omit, ...rest } = document;
1216
1202
  return rest;
1217
1203
  }
@@ -1285,7 +1271,7 @@ function serializeEdgeIndexDeclaration(declaration) {
1285
1271
  }
1286
1272
  function serializeNodes(graph) {
1287
1273
  const result = {};
1288
- for (const kindName of chunkE5JZSEGJ_cjs.getNodeKinds(graph)) {
1274
+ for (const kindName of chunkWFUN6DCM_cjs.getNodeKinds(graph)) {
1289
1275
  const registration = graph.nodes[kindName];
1290
1276
  if (registration === void 0) continue;
1291
1277
  result[kindName] = serializeNodeDef(registration);
@@ -1353,7 +1339,7 @@ function deserializeWherePredicate(serialized) {
1353
1339
  }
1354
1340
  function serializeEdges(graph) {
1355
1341
  const result = {};
1356
- for (const kindName of chunkE5JZSEGJ_cjs.getEdgeKinds(graph)) {
1342
+ for (const kindName of chunkWFUN6DCM_cjs.getEdgeKinds(graph)) {
1357
1343
  const registration = graph.edges[kindName];
1358
1344
  if (registration === void 0) continue;
1359
1345
  result[kindName] = serializeEdgeDef(registration);
@@ -1501,7 +1487,7 @@ async function computeSchemaHash(schema) {
1501
1487
  ...schema.extension === void 0 ? {} : { extension: schema.extension },
1502
1488
  ...schema.deprecatedKinds === void 0 ? {} : { deprecatedKinds: schema.deprecatedKinds }
1503
1489
  };
1504
- const json = JSON.stringify(hashable, sortedReplacer);
1490
+ const json = JSON.stringify(hashable, chunkIUIWCFG3_cjs.sortedReplacer);
1505
1491
  return chunkCTHNVU6K_cjs.sha256Hex(json);
1506
1492
  }
1507
1493
  var COMPILE_NODE_CACHE = /* @__PURE__ */ new Map();
@@ -1550,7 +1536,7 @@ function compileNode(kindName, document) {
1550
1536
  const schema = buildObjectSchema(document.properties);
1551
1537
  const type = defineNode(
1552
1538
  kindName,
1553
- chunkRCAJZG67_cjs.compactUndefined({
1539
+ chunkPYJOBZR3_cjs.compactUndefined({
1554
1540
  schema,
1555
1541
  description: document.description,
1556
1542
  annotations: document.annotations
@@ -1574,7 +1560,7 @@ function compileEdge(kindName, document, nodeTypeByName) {
1574
1560
  (name) => nodeTypeByName.get(name) ?? name
1575
1561
  );
1576
1562
  return Object.freeze(
1577
- chunkRCAJZG67_cjs.compactUndefined({
1563
+ chunkPYJOBZR3_cjs.compactUndefined({
1578
1564
  kindName,
1579
1565
  schema,
1580
1566
  description: document.description,
@@ -1708,7 +1694,7 @@ function makeWherePredicate(field, op) {
1708
1694
  };
1709
1695
  }
1710
1696
  var META_EDGE_BY_NAME = Object.fromEntries(
1711
- chunkRCAJZG67_cjs.ALL_META_EDGE_NAMES.map((name) => [name, core[`${name}MetaEdge`]])
1697
+ chunkPYJOBZR3_cjs.ALL_META_EDGE_NAMES.map((name) => [name, core[`${name}MetaEdge`]])
1712
1698
  );
1713
1699
  function compileOntologyRelation(relation, nodeTypeByName) {
1714
1700
  const metaEdge = META_EDGE_BY_NAME[relation.metaEdge];
@@ -1744,10 +1730,10 @@ function extensionKindNames(document) {
1744
1730
  function mergeGraphExtension(graph, document) {
1745
1731
  const existingDocument = graph.extension ?? Object.freeze({});
1746
1732
  const unionDocument = unionDocuments(existingDocument, document);
1747
- if (graph.extension !== void 0 && canonicalEqual(unionDocument, existingDocument)) {
1733
+ if (graph.extension !== void 0 && chunkIUIWCFG3_cjs.canonicalEqual(unionDocument, existingDocument)) {
1748
1734
  return graph;
1749
1735
  }
1750
- const validatedUnion = chunkRCAJZG67_cjs.unwrap(chunkRCAJZG67_cjs.validateGraphExtension(unionDocument));
1736
+ const validatedUnion = chunkPYJOBZR3_cjs.unwrap(chunkPYJOBZR3_cjs.validateGraphExtension(unionDocument));
1751
1737
  const compiled = compileGraphExtension(validatedUnion);
1752
1738
  const { nodes: runtimeNodeNames, edges: runtimeEdgeNames } = extensionKindNames(existingDocument);
1753
1739
  const nodeKinds = /* @__PURE__ */ new Map();
@@ -1799,7 +1785,7 @@ function mergeGraphExtension(graph, document) {
1799
1785
  });
1800
1786
  const type = defineEdge(
1801
1787
  edge.kindName,
1802
- chunkRCAJZG67_cjs.compactUndefined({
1788
+ chunkPYJOBZR3_cjs.compactUndefined({
1803
1789
  schema: edge.schema,
1804
1790
  description: edge.description,
1805
1791
  annotations: edge.annotations,
@@ -1849,7 +1835,7 @@ function deriveGraphExtensionVectorIndexes(compiledNodes) {
1849
1835
  ...compiled.unique.length === 0 ? {} : { unique: [...compiled.unique] }
1850
1836
  };
1851
1837
  }
1852
- return chunkE5JZSEGJ_cjs.autoDeriveVectorIndexes(registrations).map(
1838
+ return chunkWFUN6DCM_cjs.autoDeriveVectorIndexes(registrations).map(
1853
1839
  (index) => Object.freeze({ ...index, origin: "runtime" })
1854
1840
  );
1855
1841
  }
@@ -1867,7 +1853,7 @@ function mergeIndexesWithGraphExtension(existing, runtimeIndexes, graphId) {
1867
1853
  const runtimeRelational = runtimeIndexes.filter(
1868
1854
  (index) => index.entity !== "vector"
1869
1855
  );
1870
- const vectorMerged = chunkE5JZSEGJ_cjs.mergeVectorIndexes(compileTimeIndexes, runtimeVectors);
1856
+ const vectorMerged = chunkWFUN6DCM_cjs.mergeVectorIndexes(compileTimeIndexes, runtimeVectors);
1871
1857
  const merged = [...vectorMerged, ...runtimeRelational];
1872
1858
  assertUniqueIndexNames(merged, graphId);
1873
1859
  return merged;
@@ -1879,7 +1865,7 @@ function assertUniqueIndexNames(indexes, graphId) {
1879
1865
  seen.add(index.name);
1880
1866
  continue;
1881
1867
  }
1882
- throw new chunkW5MTHMTE_cjs.ConfigurationError(
1868
+ throw new chunkYEDQLNVE_cjs.ConfigurationError(
1883
1869
  `Duplicate index name "${index.name}" after merging graph extension into graph "${graphId}". Index names must be unique within a graph.`,
1884
1870
  { graphId, indexName: index.name, code: "DUPLICATE_INDEX_NAME" },
1885
1871
  {
@@ -1895,7 +1881,7 @@ function compileGraphExtensionRelationalIndexes(documents, nodeKinds, mergedEdge
1895
1881
  if (document.entity === "node") {
1896
1882
  const node = nodeKinds.get(document.kind);
1897
1883
  if (node === void 0) {
1898
- throw new chunkW5MTHMTE_cjs.KindNotFoundError(document.kind, "node", {
1884
+ throw new chunkYEDQLNVE_cjs.KindNotFoundError(document.kind, "node", {
1899
1885
  graphId,
1900
1886
  suggestion: "Declare the kind under `nodes` in this graph extension, or remove the index from `indexes`."
1901
1887
  });
@@ -1909,7 +1895,7 @@ function compileGraphExtensionRelationalIndexes(documents, nodeKinds, mergedEdge
1909
1895
  }
1910
1896
  const edgeRegistration = mergedEdges[document.kind];
1911
1897
  if (edgeRegistration === void 0) {
1912
- throw new chunkW5MTHMTE_cjs.KindNotFoundError(document.kind, "edge", {
1898
+ throw new chunkYEDQLNVE_cjs.KindNotFoundError(document.kind, "edge", {
1913
1899
  graphId,
1914
1900
  suggestion: "Declare the edge under `edges` in this graph extension, or remove the index from `indexes`."
1915
1901
  });
@@ -1926,7 +1912,7 @@ function buildWhereCallback(where) {
1926
1912
  return (props) => {
1927
1913
  const builder = props[where.field];
1928
1914
  if (builder === void 0) {
1929
- throw new chunkW5MTHMTE_cjs.ConfigurationError(
1915
+ throw new chunkYEDQLNVE_cjs.ConfigurationError(
1930
1916
  `Graph-extension index \`where\` references unknown field "${where.field}".`,
1931
1917
  { field: where.field, code: "EXTENSION_INDEX_WHERE_UNKNOWN_FIELD" }
1932
1918
  );
@@ -1935,7 +1921,7 @@ function buildWhereCallback(where) {
1935
1921
  };
1936
1922
  }
1937
1923
  function toNodeIndexConfig(document) {
1938
- return chunkRCAJZG67_cjs.compactUndefined({
1924
+ return chunkPYJOBZR3_cjs.compactUndefined({
1939
1925
  fields: document.fields,
1940
1926
  coveringFields: document.coveringFields,
1941
1927
  unique: document.unique,
@@ -1945,7 +1931,7 @@ function toNodeIndexConfig(document) {
1945
1931
  });
1946
1932
  }
1947
1933
  function toEdgeIndexConfig(document) {
1948
- return chunkRCAJZG67_cjs.compactUndefined({
1934
+ return chunkPYJOBZR3_cjs.compactUndefined({
1949
1935
  fields: document.fields,
1950
1936
  coveringFields: document.coveringFields,
1951
1937
  unique: document.unique,
@@ -2001,14 +1987,14 @@ function isEmptyExtension(extension) {
2001
1987
  }
2002
1988
  function assertNoCollision(kindName, entity, collides, graphId) {
2003
1989
  if (!collides) return;
2004
- throw new chunkRCAJZG67_cjs.KindCollisionError(kindName, entity, graphId);
1990
+ throw new chunkPYJOBZR3_cjs.KindCollisionError(kindName, entity, graphId);
2005
1991
  }
2006
1992
  function resolveEndpoints(entries, nodeKinds, context) {
2007
1993
  return entries.map((entry) => {
2008
1994
  if (typeof entry !== "string") return entry;
2009
1995
  const resolved = nodeKinds.get(entry);
2010
1996
  if (resolved === void 0) {
2011
- throw new chunkRCAJZG67_cjs.GraphExtensionUnresolvedEndpointError(
1997
+ throw new chunkPYJOBZR3_cjs.GraphExtensionUnresolvedEndpointError(
2012
1998
  context.edgeKind,
2013
1999
  context.side,
2014
2000
  entry,
@@ -2353,7 +2339,7 @@ function parseSerializedSchema(json) {
2353
2339
  try {
2354
2340
  parsed = JSON.parse(json);
2355
2341
  } catch {
2356
- throw new chunkW5MTHMTE_cjs.DatabaseOperationError(
2342
+ throw new chunkYEDQLNVE_cjs.DatabaseOperationError(
2357
2343
  "Stored schema document is not valid JSON",
2358
2344
  { operation: "select", entity: "schema" }
2359
2345
  );
@@ -2361,12 +2347,12 @@ function parseSerializedSchema(json) {
2361
2347
  const result = serializedSchemaZod.safeParse(parsed);
2362
2348
  if (!result.success) {
2363
2349
  const issues = result.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`).join("; ");
2364
- throw new chunkW5MTHMTE_cjs.DatabaseOperationError(
2350
+ throw new chunkYEDQLNVE_cjs.DatabaseOperationError(
2365
2351
  `Stored schema document is malformed: ${issues}`,
2366
2352
  { operation: "select", entity: "schema" }
2367
2353
  );
2368
2354
  }
2369
- const validated = chunkRCAJZG67_cjs.freezeDeep(result.data);
2355
+ const validated = chunkPYJOBZR3_cjs.freezeDeep(result.data);
2370
2356
  if (PARSE_CACHE.size >= PARSE_CACHE_LIMIT) {
2371
2357
  const oldest = PARSE_CACHE.keys().next().value;
2372
2358
  if (oldest !== void 0) PARSE_CACHE.delete(oldest);
@@ -2374,25 +2360,11 @@ function parseSerializedSchema(json) {
2374
2360
  PARSE_CACHE.set(json, validated);
2375
2361
  return validated;
2376
2362
  }
2377
- var MISSING_TABLE_PATTERNS = [
2378
- "no such table",
2379
- // SQLite
2380
- "does not exist",
2381
- // PostgreSQL ("relation ... does not exist")
2382
- "SQLITE_ERROR"
2383
- // D1 / Durable Objects error code
2384
- ];
2385
- function isMissingTableError(error) {
2386
- const message = error instanceof Error ? error.message : String(error);
2387
- return MISSING_TABLE_PATTERNS.some((pattern) => message.includes(pattern));
2388
- }
2389
2363
  async function loadActiveSchemaWithBootstrap(backend, graphId) {
2390
2364
  try {
2391
- const row = await backend.getActiveSchema(graphId);
2392
- await backend.ensureFulltextTable?.();
2393
- return row;
2365
+ return await backend.getActiveSchema(graphId);
2394
2366
  } catch (error) {
2395
- if (backend.bootstrapTables && isMissingTableError(error)) {
2367
+ if (backend.bootstrapTables && chunkIUIWCFG3_cjs.isMissingTableError(error)) {
2396
2368
  await backend.bootstrapTables();
2397
2369
  return await backend.getActiveSchema(graphId);
2398
2370
  }
@@ -2404,11 +2376,17 @@ async function loadAndMergeGraphExtensionDocument(backend, graph) {
2404
2376
  if (activeRow === void 0) {
2405
2377
  return { graph, activeRow: void 0, storedSchema: void 0 };
2406
2378
  }
2379
+ const { graph: merged, storedSchema } = mergeStoredGraphExtension(
2380
+ graph,
2381
+ activeRow
2382
+ );
2383
+ return { graph: merged, activeRow, storedSchema };
2384
+ }
2385
+ function mergeStoredGraphExtension(graph, activeRow) {
2407
2386
  const storedSchema = parseSerializedSchema(activeRow.schema_doc);
2408
2387
  const merged = storedSchema.extension === void 0 ? graph : mergeGraphExtension(graph, storedSchema.extension);
2409
2388
  return {
2410
2389
  graph: applyDeprecatedKinds(merged, storedSchema.deprecatedKinds),
2411
- activeRow,
2412
2390
  storedSchema
2413
2391
  };
2414
2392
  }
@@ -2480,7 +2458,7 @@ async function ensureSchema(backend, graph, options) {
2480
2458
  }
2481
2459
  const actions = getMigrationActions(diff);
2482
2460
  if (throwOnBreaking) {
2483
- throw new chunkW5MTHMTE_cjs.MigrationError(
2461
+ throw new chunkYEDQLNVE_cjs.MigrationError(
2484
2462
  `Schema migration required: ${diff.summary}. ${actions.length} migration action(s) needed. Use getSchemaChanges() to review, then migrateSchema() to apply.`,
2485
2463
  {
2486
2464
  graphId: graph.id,
@@ -2491,6 +2469,69 @@ async function ensureSchema(backend, graph, options) {
2491
2469
  }
2492
2470
  return { status: "breaking", diff, actions };
2493
2471
  }
2472
+ async function loadAndVerifyGraph(backend, graph) {
2473
+ const activeRow = await readActiveSchemaPure(backend, graph.id);
2474
+ const { graph: merged, storedSchema } = mergeStoredGraphExtension(
2475
+ graph,
2476
+ activeRow
2477
+ );
2478
+ const storedHash = activeRow.schema_hash;
2479
+ const currentHash = await getSchemaHash(merged, activeRow.version + 1);
2480
+ if (storedHash !== currentHash) {
2481
+ const currentSchema = serializeSchema(merged, activeRow.version + 1);
2482
+ const diff = computeSchemaDiff(storedSchema, currentSchema);
2483
+ if (diff.hasChanges) {
2484
+ throw schemaBehindError(merged.id, activeRow.version, diff);
2485
+ }
2486
+ }
2487
+ await backend.assertRuntimeContributionsInitialized?.(merged.id);
2488
+ return {
2489
+ graph: merged,
2490
+ activeRow,
2491
+ result: { status: "unchanged", version: activeRow.version }
2492
+ };
2493
+ }
2494
+ function schemaBehindError(graphId, fromVersion, diff) {
2495
+ const actions = getMigrationActions(diff);
2496
+ const qualifier = isBackwardsCompatible(diff) ? "safe auto-migration" : "breaking change";
2497
+ return new chunkYEDQLNVE_cjs.MigrationError(
2498
+ `Schema verification failed for graph "${graphId}": ${diff.summary} (${qualifier}). ${actions.length} migration action(s) needed. The least-privilege runtime cannot migrate \u2014 run createStoreWithSchema(graph, adminBackend) under a privileged role (after any generated migration SQL, if you manage DDL externally) before attaching with createStore() / createVerifiedStore().`,
2499
+ {
2500
+ graphId,
2501
+ fromVersion,
2502
+ toVersion: fromVersion + 1
2503
+ }
2504
+ );
2505
+ }
2506
+ async function assertSchemaCurrent(backend, graph) {
2507
+ const { result } = await loadAndVerifyGraph(backend, graph);
2508
+ return result;
2509
+ }
2510
+ async function readActiveSchemaPure(backend, graphId) {
2511
+ let activeRow;
2512
+ try {
2513
+ activeRow = await backend.getActiveSchema(graphId);
2514
+ } catch (error) {
2515
+ if (chunkIUIWCFG3_cjs.isMissingTableError(error)) {
2516
+ throw schemaNotInitializedError(graphId, error);
2517
+ }
2518
+ throw error;
2519
+ }
2520
+ if (activeRow === void 0) {
2521
+ throw schemaNotInitializedError(graphId);
2522
+ }
2523
+ return activeRow;
2524
+ }
2525
+ function schemaNotInitializedError(graphId, cause) {
2526
+ return new chunkYEDQLNVE_cjs.ConfigurationError(
2527
+ `Cannot verify graph "${graphId}": no schema has been initialized. Run createStoreWithSchema(graph, adminBackend) once under a privileged role (which commits the schema_versions row and materializes contribution markers) before attaching with createStore() / createVerifiedStore(). Generated migration SQL creates the tables but does not initialize the schema row.`,
2528
+ { graphId },
2529
+ {
2530
+ cause,
2531
+ suggestion: "Run createStoreWithSchema(graph, adminBackend) once under a privileged role. If you manage DDL externally with drizzle-kit / generatePostgresMigrationSQL / generateSqliteMigrationSQL, apply that first, then still run createStoreWithSchema to commit the schema row and contribution markers."
2532
+ }
2533
+ );
2534
+ }
2494
2535
  async function initializeSchema(backend, graph) {
2495
2536
  const schema = serializeSchema(graph, 1);
2496
2537
  const hash = await computeSchemaHash(schema);
@@ -2525,7 +2566,7 @@ async function commitNewSchemaVersion(backend, graph, currentVersion) {
2525
2566
  async function rollbackSchema(backend, graphId, targetVersion) {
2526
2567
  const activeRow = await backend.getActiveSchema(graphId);
2527
2568
  if (activeRow === void 0) {
2528
- throw new chunkW5MTHMTE_cjs.MigrationError(
2569
+ throw new chunkYEDQLNVE_cjs.MigrationError(
2529
2570
  `Cannot rollback graph "${graphId}": no active schema version exists.`,
2530
2571
  { graphId, fromVersion: 0, toVersion: targetVersion }
2531
2572
  );
@@ -2574,7 +2615,7 @@ function validateProps(schema, props, context) {
2574
2615
  }
2575
2616
  const issues = zodIssuesToValidationIssues(result.error);
2576
2617
  const location = buildLocationString(context);
2577
- throw new chunkW5MTHMTE_cjs.ValidationError(
2618
+ throw new chunkYEDQLNVE_cjs.ValidationError(
2578
2619
  `Invalid ${context.entityType} props for ${location}: ${result.error.message}`,
2579
2620
  {
2580
2621
  entityType: context.entityType,
@@ -2601,7 +2642,7 @@ function validateEdgeProps(schema, props, context) {
2601
2642
  function wrapZodError(error, context) {
2602
2643
  const issues = zodIssuesToValidationIssues(error);
2603
2644
  const location = buildLocationString(context);
2604
- return new chunkW5MTHMTE_cjs.ValidationError(
2645
+ return new chunkYEDQLNVE_cjs.ValidationError(
2605
2646
  `Validation failed for ${context.entityType} ${location}: ${error.message}`,
2606
2647
  {
2607
2648
  entityType: context.entityType,
@@ -2614,7 +2655,7 @@ function wrapZodError(error, context) {
2614
2655
  );
2615
2656
  }
2616
2657
  function createValidationError(message, issues, context) {
2617
- return new chunkW5MTHMTE_cjs.ValidationError(message, {
2658
+ return new chunkYEDQLNVE_cjs.ValidationError(message, {
2618
2659
  ...context?.entityType !== void 0 && {
2619
2660
  entityType: context.entityType
2620
2661
  },
@@ -2628,9 +2669,9 @@ function createValidationError(message, issues, context) {
2628
2669
  exports.KindRegistry = KindRegistry;
2629
2670
  exports.META_EDGE_BRAND = META_EDGE_BRAND;
2630
2671
  exports.applyDeprecatedKinds = applyDeprecatedKinds;
2672
+ exports.assertSchemaCurrent = assertSchemaCurrent;
2631
2673
  exports.broader = broader;
2632
2674
  exports.buildGraphExtensionOntologyKeySet = buildGraphExtensionOntologyKeySet;
2633
- exports.canonicalEqual = canonicalEqual;
2634
2675
  exports.commitNewSchemaVersion = commitNewSchemaVersion;
2635
2676
  exports.compileTimeOntologyKey = compileTimeOntologyKey;
2636
2677
  exports.computeClosuresFromOntology = computeClosuresFromOntology;
@@ -2660,6 +2701,7 @@ exports.isMetaEdge = isMetaEdge;
2660
2701
  exports.isSchemaInitialized = isSchemaInitialized;
2661
2702
  exports.loadActiveSchemaWithBootstrap = loadActiveSchemaWithBootstrap;
2662
2703
  exports.loadAndMergeGraphExtensionDocument = loadAndMergeGraphExtensionDocument;
2704
+ exports.loadAndVerifyGraph = loadAndVerifyGraph;
2663
2705
  exports.mergeGraphExtension = mergeGraphExtension;
2664
2706
  exports.migrateSchema = migrateSchema;
2665
2707
  exports.narrower = narrower;
@@ -2670,11 +2712,10 @@ exports.rollbackSchema = rollbackSchema;
2670
2712
  exports.sameAs = sameAs;
2671
2713
  exports.serializeSchema = serializeSchema;
2672
2714
  exports.serializeSchemaProperties = serializeSchemaProperties;
2673
- exports.sortedReplacer = sortedReplacer;
2674
2715
  exports.subClassOf = subClassOf;
2675
2716
  exports.validateEdgeProps = validateEdgeProps;
2676
2717
  exports.validateNodeProps = validateNodeProps;
2677
2718
  exports.validateProps = validateProps;
2678
2719
  exports.wrapZodError = wrapZodError;
2679
- //# sourceMappingURL=chunk-QMQYK3IF.cjs.map
2680
- //# sourceMappingURL=chunk-QMQYK3IF.cjs.map
2720
+ //# sourceMappingURL=chunk-ZGEMI7MJ.cjs.map
2721
+ //# sourceMappingURL=chunk-ZGEMI7MJ.cjs.map