@nicia-ai/typegraph 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/README.md +23 -0
  2. package/dist/{ast-BVyihVbP.d.cts → ast-CXFx6bF6.d.ts} +45 -165
  3. package/dist/{ast-BVyihVbP.d.ts → ast-D-3bOanX.d.cts} +45 -165
  4. package/dist/backend/drizzle/index.cjs +20 -20
  5. package/dist/backend/drizzle/index.d.cts +6 -5
  6. package/dist/backend/drizzle/index.d.ts +6 -5
  7. package/dist/backend/drizzle/index.js +8 -8
  8. package/dist/backend/drizzle/postgres.cjs +9 -9
  9. package/dist/backend/drizzle/postgres.d.cts +9 -11
  10. package/dist/backend/drizzle/postgres.d.ts +9 -11
  11. package/dist/backend/drizzle/postgres.js +6 -6
  12. package/dist/backend/drizzle/schema/postgres.cjs +10 -10
  13. package/dist/backend/drizzle/schema/postgres.d.cts +6 -5
  14. package/dist/backend/drizzle/schema/postgres.d.ts +6 -5
  15. package/dist/backend/drizzle/schema/postgres.js +3 -3
  16. package/dist/backend/drizzle/schema/sqlite.cjs +10 -10
  17. package/dist/backend/drizzle/schema/sqlite.d.cts +6 -5
  18. package/dist/backend/drizzle/schema/sqlite.d.ts +6 -5
  19. package/dist/backend/drizzle/schema/sqlite.js +3 -3
  20. package/dist/backend/drizzle/sqlite.cjs +9 -9
  21. package/dist/backend/drizzle/sqlite.d.cts +17 -18
  22. package/dist/backend/drizzle/sqlite.d.ts +17 -18
  23. package/dist/backend/drizzle/sqlite.js +6 -6
  24. package/dist/backend/postgres/index.cjs +21 -17
  25. package/dist/backend/postgres/index.d.cts +8 -7
  26. package/dist/backend/postgres/index.d.ts +8 -7
  27. package/dist/backend/postgres/index.js +8 -8
  28. package/dist/backend/sqlite/index.cjs +27 -21
  29. package/dist/backend/sqlite/index.cjs.map +1 -1
  30. package/dist/backend/sqlite/index.d.cts +7 -6
  31. package/dist/backend/sqlite/index.d.ts +7 -6
  32. package/dist/backend/sqlite/index.js +18 -12
  33. package/dist/backend/sqlite/index.js.map +1 -1
  34. package/dist/{chunk-YM5AL65Y.cjs → chunk-2WVFEIHR.cjs} +29 -3
  35. package/dist/chunk-2WVFEIHR.cjs.map +1 -0
  36. package/dist/{chunk-4PIEL2VO.js → chunk-3PURVEA4.js} +36 -5
  37. package/dist/chunk-3PURVEA4.js.map +1 -0
  38. package/dist/chunk-46YY2FRV.js +287 -0
  39. package/dist/chunk-46YY2FRV.js.map +1 -0
  40. package/dist/chunk-4HARSV2G.js +1448 -0
  41. package/dist/chunk-4HARSV2G.js.map +1 -0
  42. package/dist/{chunk-IIAT36MI.js → chunk-54WJF3DW.js} +29 -3
  43. package/dist/chunk-54WJF3DW.js.map +1 -0
  44. package/dist/chunk-CMHFS34N.cjs +390 -0
  45. package/dist/chunk-CMHFS34N.cjs.map +1 -0
  46. package/dist/chunk-DD6ONEBN.cjs +1264 -0
  47. package/dist/chunk-DD6ONEBN.cjs.map +1 -0
  48. package/dist/chunk-F23W4W3A.cjs +289 -0
  49. package/dist/chunk-F23W4W3A.cjs.map +1 -0
  50. package/dist/chunk-F2BZSEFE.js +388 -0
  51. package/dist/chunk-F2BZSEFE.js.map +1 -0
  52. package/dist/{chunk-DDM2FZRJ.cjs → chunk-JQDWEX6V.cjs} +24 -24
  53. package/dist/{chunk-DDM2FZRJ.cjs.map → chunk-JQDWEX6V.cjs.map} +1 -1
  54. package/dist/chunk-NP4G4ZKM.js +1228 -0
  55. package/dist/chunk-NP4G4ZKM.js.map +1 -0
  56. package/dist/{chunk-UJAGXJDG.cjs → chunk-NU2XNMVI.cjs} +38 -7
  57. package/dist/chunk-NU2XNMVI.cjs.map +1 -0
  58. package/dist/{chunk-JKTO7TW3.js → chunk-O5XPCJLF.js} +25 -3
  59. package/dist/chunk-O5XPCJLF.js.map +1 -0
  60. package/dist/{chunk-2QHQ2C4P.js → chunk-OGGLFYFA.js} +36 -5
  61. package/dist/chunk-OGGLFYFA.js.map +1 -0
  62. package/dist/{chunk-SV5H3XM5.cjs → chunk-OYL2SGBD.cjs} +26 -2
  63. package/dist/chunk-OYL2SGBD.cjs.map +1 -0
  64. package/dist/chunk-SFY2PPOY.cjs +1469 -0
  65. package/dist/chunk-SFY2PPOY.cjs.map +1 -0
  66. package/dist/{chunk-JDAET5LO.js → chunk-SMLIWLS7.js} +9 -9
  67. package/dist/chunk-SMLIWLS7.js.map +1 -0
  68. package/dist/{chunk-VXRVGFCI.js → chunk-U3452TEU.js} +17 -17
  69. package/dist/{chunk-VXRVGFCI.js.map → chunk-U3452TEU.js.map} +1 -1
  70. package/dist/{chunk-MNO33ASC.cjs → chunk-UYMT4LO2.cjs} +9 -8
  71. package/dist/chunk-UYMT4LO2.cjs.map +1 -0
  72. package/dist/{chunk-L642L24T.js → chunk-XDTYTNYL.js} +14 -21
  73. package/dist/chunk-XDTYTNYL.js.map +1 -0
  74. package/dist/{chunk-N4AOJ3VF.cjs → chunk-XZL6MCZJ.cjs} +38 -7
  75. package/dist/chunk-XZL6MCZJ.cjs.map +1 -0
  76. package/dist/{chunk-DBFCKELK.cjs → chunk-ZJHQZZT2.cjs} +18 -27
  77. package/dist/chunk-ZJHQZZT2.cjs.map +1 -0
  78. package/dist/index-Dkicw49A.d.cts +373 -0
  79. package/dist/index-Dkicw49A.d.ts +373 -0
  80. package/dist/index.cjs +5915 -3377
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.d.cts +24 -664
  83. package/dist/index.d.ts +24 -664
  84. package/dist/index.js +5781 -3223
  85. package/dist/index.js.map +1 -1
  86. package/dist/indexes/index.cjs +16 -16
  87. package/dist/indexes/index.d.cts +5 -4
  88. package/dist/indexes/index.d.ts +5 -4
  89. package/dist/indexes/index.js +2 -2
  90. package/dist/interchange/index.cjs +9 -9
  91. package/dist/interchange/index.cjs.map +1 -1
  92. package/dist/interchange/index.d.cts +5 -3
  93. package/dist/interchange/index.d.ts +5 -3
  94. package/dist/interchange/index.js +8 -8
  95. package/dist/interchange/index.js.map +1 -1
  96. package/dist/manager-Jc5Btay9.d.cts +493 -0
  97. package/dist/manager-e9LXthrx.d.ts +493 -0
  98. package/dist/profiler/index.cjs +2 -8
  99. package/dist/profiler/index.cjs.map +1 -1
  100. package/dist/profiler/index.d.cts +9 -161
  101. package/dist/profiler/index.d.ts +9 -161
  102. package/dist/profiler/index.js +4 -4
  103. package/dist/profiler/index.js.map +1 -1
  104. package/dist/schema/index.cjs +145 -0
  105. package/dist/schema/index.cjs.map +1 -0
  106. package/dist/schema/index.d.cts +237 -0
  107. package/dist/schema/index.d.ts +237 -0
  108. package/dist/schema/index.js +72 -0
  109. package/dist/schema/index.js.map +1 -0
  110. package/dist/{store-BPhjw5S8.d.ts → store-DM3Tk3Pw.d.ts} +874 -1283
  111. package/dist/{store-DNOOQEm8.d.cts → store-nbBybLWP.d.cts} +874 -1283
  112. package/dist/{test-helpers-BjyRYJZX.d.ts → test-helpers-CIq1Hhj1.d.ts} +5 -1
  113. package/dist/{test-helpers-NoQXhleQ.d.cts → test-helpers-DPRFVky4.d.cts} +5 -1
  114. package/dist/{types-D_3mEv2y.d.ts → types-BL1GyVku.d.cts} +2 -2
  115. package/dist/{types-DsRfx0yk.d.ts → types-Cdbi4hcx.d.ts} +228 -4
  116. package/dist/{types-BrSfFSpW.d.cts → types-DCGa53O2.d.ts} +2 -2
  117. package/dist/{types-aapj0GLz.d.cts → types-DDP0MGBF.d.cts} +228 -4
  118. package/dist/{types-CX4cLd7M.d.ts → types-DHRsi6j9.d.cts} +4 -3
  119. package/dist/types-DTJEu_-h.d.cts +158 -0
  120. package/dist/types-DTJEu_-h.d.ts +158 -0
  121. package/dist/{types-a5rAxC92.d.cts → types-ZT5mlism.d.ts} +4 -3
  122. package/package.json +17 -2
  123. package/dist/chunk-2FURVVAX.cjs +0 -350
  124. package/dist/chunk-2FURVVAX.cjs.map +0 -1
  125. package/dist/chunk-2QHQ2C4P.js.map +0 -1
  126. package/dist/chunk-4PIEL2VO.js.map +0 -1
  127. package/dist/chunk-DBFCKELK.cjs.map +0 -1
  128. package/dist/chunk-H7THXVH6.cjs +0 -314
  129. package/dist/chunk-H7THXVH6.cjs.map +0 -1
  130. package/dist/chunk-HXAPXPZH.cjs +0 -680
  131. package/dist/chunk-HXAPXPZH.cjs.map +0 -1
  132. package/dist/chunk-IIAT36MI.js.map +0 -1
  133. package/dist/chunk-JDAET5LO.js.map +0 -1
  134. package/dist/chunk-JKTO7TW3.js.map +0 -1
  135. package/dist/chunk-L642L24T.js.map +0 -1
  136. package/dist/chunk-MNO33ASC.cjs.map +0 -1
  137. package/dist/chunk-N4AOJ3VF.cjs.map +0 -1
  138. package/dist/chunk-QB3WBMDT.js +0 -646
  139. package/dist/chunk-QB3WBMDT.js.map +0 -1
  140. package/dist/chunk-SV5H3XM5.cjs.map +0 -1
  141. package/dist/chunk-UJAGXJDG.cjs.map +0 -1
  142. package/dist/chunk-X4EVMBON.js +0 -312
  143. package/dist/chunk-X4EVMBON.js.map +0 -1
  144. package/dist/chunk-XZL4NLV6.js +0 -348
  145. package/dist/chunk-XZL4NLV6.js.map +0 -1
  146. package/dist/chunk-YM5AL65Y.cjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nicia-ai/typegraph",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "TypeScript-first embedded knowledge graph library with ontological reasoning",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -37,6 +37,16 @@
37
37
  "default": "./dist/profiler/index.cjs"
38
38
  }
39
39
  },
40
+ "./schema": {
41
+ "import": {
42
+ "types": "./dist/schema/index.d.ts",
43
+ "default": "./dist/schema/index.js"
44
+ },
45
+ "require": {
46
+ "types": "./dist/schema/index.d.cts",
47
+ "default": "./dist/schema/index.cjs"
48
+ }
49
+ },
40
50
  "./indexes": {
41
51
  "import": {
42
52
  "types": "./dist/indexes/index.d.ts",
@@ -168,7 +178,7 @@
168
178
  "@stryker-mutator/core": "^9.5.1",
169
179
  "@stryker-mutator/vitest-runner": "^9.5.1",
170
180
  "@types/better-sqlite3": "^7.6.13",
171
- "@types/node": "^24.10.11",
181
+ "@types/node": "^24.10.13",
172
182
  "@types/pg": "^8.16.0",
173
183
  "@vitest/coverage-v8": "^4.0.18",
174
184
  "better-sqlite3": "^12.6.2",
@@ -194,6 +204,11 @@
194
204
  "test:unit": "vitest run",
195
205
  "pretest:property": "node --import tsx scripts/ensure-native-sqlite.ts",
196
206
  "test:property": "vitest run tests/property",
207
+ "pretest:perf": "node --import tsx scripts/ensure-native-sqlite.ts",
208
+ "test:perf": "pnpm --filter @nicia-ai/typegraph-benchmarks perf:check",
209
+ "bench:perf": "pnpm --filter @nicia-ai/typegraph-benchmarks perf",
210
+ "test:perf:postgres": "pnpm --filter @nicia-ai/typegraph-benchmarks perf:check:postgres",
211
+ "bench:perf:postgres": "pnpm --filter @nicia-ai/typegraph-benchmarks perf:postgres",
197
212
  "test:postgres": "./scripts/test-postgres.sh",
198
213
  "test:coverage": "vitest run --coverage",
199
214
  "test:mutation": "stryker run"
@@ -1,350 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkUJAGXJDG_cjs = require('./chunk-UJAGXJDG.cjs');
4
- var chunkHXAPXPZH_cjs = require('./chunk-HXAPXPZH.cjs');
5
- var chunkSV5H3XM5_cjs = require('./chunk-SV5H3XM5.cjs');
6
- var drizzleOrm = require('drizzle-orm');
7
-
8
- function nowIso() {
9
- return (/* @__PURE__ */ new Date()).toISOString();
10
- }
11
- function nullToUndefined(value) {
12
- return value ?? void 0;
13
- }
14
- function formatTimestamp(value) {
15
- if (value === null || value === void 0) return void 0;
16
- if (value instanceof Date) return value.toISOString();
17
- if (typeof value === "string") {
18
- if (value.includes("T")) return value;
19
- const date = new Date(value);
20
- if (!Number.isNaN(date.getTime())) return date.toISOString();
21
- return value;
22
- }
23
- return void 0;
24
- }
25
- function toNodeRow(row) {
26
- return {
27
- graph_id: row.graph_id,
28
- kind: row.kind,
29
- id: row.id,
30
- // PostgreSQL JSONB is already parsed, stringify for consistency
31
- props: typeof row.props === "string" ? row.props : JSON.stringify(row.props ?? {}),
32
- version: row.version,
33
- valid_from: nullToUndefined(formatTimestamp(row.valid_from)),
34
- valid_to: nullToUndefined(formatTimestamp(row.valid_to)),
35
- created_at: formatTimestamp(row.created_at) ?? "",
36
- updated_at: formatTimestamp(row.updated_at) ?? "",
37
- deleted_at: nullToUndefined(formatTimestamp(row.deleted_at))
38
- };
39
- }
40
- function toEdgeRow(row) {
41
- return {
42
- graph_id: row.graph_id,
43
- id: row.id,
44
- kind: row.kind,
45
- from_kind: row.from_kind,
46
- from_id: row.from_id,
47
- to_kind: row.to_kind,
48
- to_id: row.to_id,
49
- props: typeof row.props === "string" ? row.props : JSON.stringify(row.props ?? {}),
50
- valid_from: nullToUndefined(formatTimestamp(row.valid_from)),
51
- valid_to: nullToUndefined(formatTimestamp(row.valid_to)),
52
- created_at: formatTimestamp(row.created_at) ?? "",
53
- updated_at: formatTimestamp(row.updated_at) ?? "",
54
- deleted_at: nullToUndefined(formatTimestamp(row.deleted_at))
55
- };
56
- }
57
- function toUniqueRow(row) {
58
- return {
59
- graph_id: row.graph_id,
60
- node_kind: row.node_kind,
61
- constraint_name: row.constraint_name,
62
- key: row.key,
63
- node_id: row.node_id,
64
- concrete_kind: row.concrete_kind,
65
- deleted_at: nullToUndefined(formatTimestamp(row.deleted_at))
66
- };
67
- }
68
- function toSchemaVersionRow(row) {
69
- const isActiveValue = row.is_active;
70
- const isActive = isActiveValue === true || isActiveValue === 1 || isActiveValue === "1";
71
- return {
72
- graph_id: row.graph_id,
73
- version: row.version,
74
- schema_hash: row.schema_hash,
75
- schema_doc: typeof row.schema_doc === "string" ? row.schema_doc : JSON.stringify(row.schema_doc ?? {}),
76
- created_at: formatTimestamp(row.created_at) ?? "",
77
- is_active: isActive
78
- };
79
- }
80
- function toEmbeddingRow(row) {
81
- let embedding;
82
- if (typeof row.embedding === "string") {
83
- const content = row.embedding.slice(1, -1);
84
- embedding = content === "" ? [] : content.split(",").map((s) => Number.parseFloat(s.trim()));
85
- } else if (Array.isArray(row.embedding)) {
86
- embedding = row.embedding;
87
- } else {
88
- embedding = [];
89
- }
90
- return {
91
- graph_id: row.graph_id,
92
- node_kind: row.node_kind,
93
- node_id: row.node_id,
94
- field_path: row.field_path,
95
- embedding,
96
- dimensions: row.dimensions,
97
- created_at: formatTimestamp(row.created_at) ?? "",
98
- updated_at: formatTimestamp(row.updated_at) ?? ""
99
- };
100
- }
101
- var POSTGRES_VECTOR_CAPABILITIES = {
102
- ...chunkHXAPXPZH_cjs.POSTGRES_CAPABILITIES,
103
- vector: {
104
- supported: true,
105
- metrics: ["cosine", "l2", "inner_product"],
106
- indexTypes: ["hnsw", "ivfflat", "none"],
107
- maxDimensions: 16e3
108
- // pgvector limit
109
- }
110
- };
111
- function createPostgresBackend(db, options = {}) {
112
- const tables2 = options.tables ?? chunkUJAGXJDG_cjs.tables;
113
- const tableNames = {
114
- nodes: drizzleOrm.getTableName(tables2.nodes),
115
- edges: drizzleOrm.getTableName(tables2.edges),
116
- embeddings: drizzleOrm.getTableName(tables2.embeddings)
117
- };
118
- async function execAll(query) {
119
- const result = await db.execute(query);
120
- return result.rows;
121
- }
122
- async function execGet(query) {
123
- const result = await db.execute(query);
124
- return result.rows[0];
125
- }
126
- async function execRun(query) {
127
- await db.execute(query);
128
- }
129
- const backend = {
130
- dialect: "postgres",
131
- capabilities: POSTGRES_VECTOR_CAPABILITIES,
132
- tableNames,
133
- // === Node Operations ===
134
- async insertNode(params) {
135
- const timestamp = nowIso();
136
- const query = chunkHXAPXPZH_cjs.buildInsertNode(tables2, params, timestamp);
137
- const row = await execGet(query);
138
- if (!row) throw new Error("Insert node failed: no row returned");
139
- return toNodeRow(row);
140
- },
141
- async getNode(graphId, kind, id) {
142
- const query = chunkHXAPXPZH_cjs.buildGetNode(tables2, graphId, kind, id);
143
- const row = await execGet(query);
144
- return row ? toNodeRow(row) : void 0;
145
- },
146
- async updateNode(params) {
147
- const timestamp = nowIso();
148
- const query = chunkHXAPXPZH_cjs.buildUpdateNode(tables2, params, timestamp);
149
- const row = await execGet(query);
150
- if (!row) throw new Error("Update node failed: no row returned");
151
- return toNodeRow(row);
152
- },
153
- async deleteNode(params) {
154
- const timestamp = nowIso();
155
- const query = chunkHXAPXPZH_cjs.buildDeleteNode(tables2, params, timestamp);
156
- await execRun(query);
157
- },
158
- async hardDeleteNode(params) {
159
- const deleteUniquesQuery = chunkHXAPXPZH_cjs.buildHardDeleteUniquesByNode(
160
- tables2,
161
- params.graphId,
162
- params.id
163
- );
164
- await execRun(deleteUniquesQuery);
165
- const deleteEmbeddingsQuery = chunkHXAPXPZH_cjs.buildHardDeleteEmbeddingsByNode(
166
- tables2,
167
- params.graphId,
168
- params.kind,
169
- params.id
170
- );
171
- await execRun(deleteEmbeddingsQuery);
172
- const query = chunkHXAPXPZH_cjs.buildHardDeleteNode(tables2, params);
173
- await execRun(query);
174
- },
175
- // === Edge Operations ===
176
- async insertEdge(params) {
177
- const timestamp = nowIso();
178
- const query = chunkHXAPXPZH_cjs.buildInsertEdge(tables2, params, timestamp);
179
- const row = await execGet(query);
180
- if (!row) throw new Error("Insert edge failed: no row returned");
181
- return toEdgeRow(row);
182
- },
183
- async getEdge(graphId, id) {
184
- const query = chunkHXAPXPZH_cjs.buildGetEdge(tables2, graphId, id);
185
- const row = await execGet(query);
186
- return row ? toEdgeRow(row) : void 0;
187
- },
188
- async updateEdge(params) {
189
- const timestamp = nowIso();
190
- const query = chunkHXAPXPZH_cjs.buildUpdateEdge(tables2, params, timestamp);
191
- const row = await execGet(query);
192
- if (!row) throw new Error("Update edge failed: no row returned");
193
- return toEdgeRow(row);
194
- },
195
- async deleteEdge(params) {
196
- const timestamp = nowIso();
197
- const query = chunkHXAPXPZH_cjs.buildDeleteEdge(tables2, params, timestamp);
198
- await execRun(query);
199
- },
200
- async hardDeleteEdge(params) {
201
- const query = chunkHXAPXPZH_cjs.buildHardDeleteEdge(tables2, params);
202
- await execRun(query);
203
- },
204
- // === Edge Cardinality Operations ===
205
- async countEdgesFrom(params) {
206
- const query = chunkHXAPXPZH_cjs.buildCountEdgesFrom(tables2, params);
207
- const row = await execGet(query);
208
- return Number(row?.count ?? 0);
209
- },
210
- async edgeExistsBetween(params) {
211
- const query = chunkHXAPXPZH_cjs.buildEdgeExistsBetween(tables2, params);
212
- const row = await execGet(query);
213
- return row !== void 0;
214
- },
215
- // === Edge Query Operations ===
216
- async findEdgesConnectedTo(params) {
217
- const query = chunkHXAPXPZH_cjs.buildFindEdgesConnectedTo(tables2, params);
218
- const rows = await execAll(query);
219
- return rows.map((row) => toEdgeRow(row));
220
- },
221
- // === Collection Query Operations ===
222
- async findNodesByKind(params) {
223
- const query = chunkHXAPXPZH_cjs.buildFindNodesByKind(tables2, params);
224
- const rows = await execAll(query);
225
- return rows.map((row) => toNodeRow(row));
226
- },
227
- async countNodesByKind(params) {
228
- const query = chunkHXAPXPZH_cjs.buildCountNodesByKind(tables2, params);
229
- const row = await execGet(query);
230
- return Number(row?.count ?? 0);
231
- },
232
- async findEdgesByKind(params) {
233
- const query = chunkHXAPXPZH_cjs.buildFindEdgesByKind(tables2, params);
234
- const rows = await execAll(query);
235
- return rows.map((row) => toEdgeRow(row));
236
- },
237
- async countEdgesByKind(params) {
238
- const query = chunkHXAPXPZH_cjs.buildCountEdgesByKind(tables2, params);
239
- const row = await execGet(query);
240
- return Number(row?.count ?? 0);
241
- },
242
- // === Unique Constraint Operations ===
243
- async insertUnique(params) {
244
- const query = chunkHXAPXPZH_cjs.buildInsertUnique(tables2, "postgres", params);
245
- const result = await execGet(query);
246
- if (result && result.node_id !== params.nodeId) {
247
- throw new chunkSV5H3XM5_cjs.UniquenessError({
248
- constraintName: params.constraintName,
249
- kind: params.nodeKind,
250
- existingId: result.node_id,
251
- newId: params.nodeId,
252
- fields: []
253
- // Fields not available at this level
254
- });
255
- }
256
- },
257
- async deleteUnique(params) {
258
- const timestamp = nowIso();
259
- const query = chunkHXAPXPZH_cjs.buildDeleteUnique(tables2, params, timestamp);
260
- await execRun(query);
261
- },
262
- async checkUnique(params) {
263
- const query = chunkHXAPXPZH_cjs.buildCheckUnique(tables2, params);
264
- const row = await execGet(query);
265
- return row ? toUniqueRow(row) : void 0;
266
- },
267
- // === Schema Operations ===
268
- async getActiveSchema(graphId) {
269
- const query = chunkHXAPXPZH_cjs.buildGetActiveSchema(tables2, graphId, "postgres");
270
- const row = await execGet(query);
271
- return row ? toSchemaVersionRow(row) : void 0;
272
- },
273
- async insertSchema(params) {
274
- const timestamp = nowIso();
275
- const query = chunkHXAPXPZH_cjs.buildInsertSchema(tables2, params, timestamp, "postgres");
276
- const row = await execGet(query);
277
- if (!row) throw new Error("Insert schema failed: no row returned");
278
- return toSchemaVersionRow(row);
279
- },
280
- async getSchemaVersion(graphId, version) {
281
- const query = chunkHXAPXPZH_cjs.buildGetSchemaVersion(tables2, graphId, version);
282
- const row = await execGet(query);
283
- return row ? toSchemaVersionRow(row) : void 0;
284
- },
285
- async setActiveSchema(graphId, version) {
286
- const queries = chunkHXAPXPZH_cjs.buildSetActiveSchema(tables2, graphId, version, "postgres");
287
- await execRun(queries.deactivateAll);
288
- await execRun(queries.activateVersion);
289
- },
290
- // === Embedding Operations ===
291
- async upsertEmbedding(params) {
292
- const timestamp = nowIso();
293
- const query = chunkHXAPXPZH_cjs.buildUpsertEmbeddingPostgres(tables2, params, timestamp);
294
- await execRun(query);
295
- },
296
- async deleteEmbedding(params) {
297
- const query = chunkHXAPXPZH_cjs.buildDeleteEmbedding(tables2, params);
298
- await execRun(query);
299
- },
300
- async getEmbedding(graphId, nodeKind, nodeId, fieldPath) {
301
- const query = chunkHXAPXPZH_cjs.buildGetEmbedding(
302
- tables2,
303
- graphId,
304
- nodeKind,
305
- nodeId,
306
- fieldPath
307
- );
308
- const row = await execGet(query);
309
- return row ? toEmbeddingRow(row) : void 0;
310
- },
311
- async vectorSearch(params) {
312
- const query = chunkHXAPXPZH_cjs.buildVectorSearchPostgres(tables2, params);
313
- const rows = await execAll(query);
314
- return rows.map((row) => ({
315
- nodeId: row.node_id,
316
- score: row.score
317
- }));
318
- },
319
- // === Query Execution ===
320
- async execute(query) {
321
- return execAll(query);
322
- },
323
- // === Transaction ===
324
- async transaction(fn, options2) {
325
- const txConfig = options2?.isolationLevel ? {
326
- isolationLevel: options2.isolationLevel.replace("_", " ")
327
- } : void 0;
328
- return db.transaction(async (tx) => {
329
- const txBackend = createTransactionBackend(
330
- tx,
331
- tables2
332
- );
333
- return fn(txBackend);
334
- }, txConfig);
335
- },
336
- // === Lifecycle ===
337
- async close() {
338
- }
339
- };
340
- return backend;
341
- }
342
- function createTransactionBackend(tx, tables2) {
343
- const txBackend = createPostgresBackend(tx, { tables: tables2 });
344
- const { transaction: _tx, close: _close, ...ops } = txBackend;
345
- return ops;
346
- }
347
-
348
- exports.createPostgresBackend = createPostgresBackend;
349
- //# sourceMappingURL=chunk-2FURVVAX.cjs.map
350
- //# sourceMappingURL=chunk-2FURVVAX.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/backend/drizzle/postgres.ts"],"names":["POSTGRES_CAPABILITIES","tables","getTableName","buildInsertNode","buildGetNode","buildUpdateNode","buildDeleteNode","buildHardDeleteUniquesByNode","buildHardDeleteEmbeddingsByNode","buildHardDeleteNode","buildInsertEdge","buildGetEdge","buildUpdateEdge","buildDeleteEdge","buildHardDeleteEdge","buildCountEdgesFrom","buildEdgeExistsBetween","buildFindEdgesConnectedTo","buildFindNodesByKind","buildCountNodesByKind","buildFindEdgesByKind","buildCountEdgesByKind","buildInsertUnique","UniquenessError","buildDeleteUnique","buildCheckUnique","buildGetActiveSchema","buildInsertSchema","buildGetSchemaVersion","buildSetActiveSchema","buildUpsertEmbeddingPostgres","buildDeleteEmbedding","buildGetEmbedding","buildVectorSearchPostgres","options"],"mappings":"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","file":"chunk-2FURVVAX.cjs","sourcesContent":["/**\n * PostgreSQL backend adapter for TypeGraph.\n *\n * Works with any Drizzle PostgreSQL database instance:\n * - node-postgres (pg)\n * - PGlite\n * - Neon\n * - Vercel Postgres\n * - Supabase\n *\n * @example\n * ```typescript\n * import { drizzle } from \"drizzle-orm/node-postgres\";\n * import { Pool } from \"pg\";\n * import { createPostgresBackend } from \"@nicia-ai/typegraph/drizzle/postgres\";\n * import { tables } from \"@nicia-ai/typegraph/drizzle/schema/postgres\";\n *\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n * const db = drizzle(pool);\n * const backend = createPostgresBackend(db, { tables });\n * ```\n */\nimport { getTableName,type SQL } from \"drizzle-orm\";\nimport { type PgDatabase } from \"drizzle-orm/pg-core\";\n\nimport { UniquenessError } from \"../../errors\";\nimport type { SqlTableNames } from \"../../query/compiler/schema\";\nimport {\n type BackendCapabilities,\n type CheckUniqueParams,\n type CountEdgesByKindParams,\n type CountEdgesFromParams,\n type CountNodesByKindParams,\n type DeleteEdgeParams,\n type DeleteEmbeddingParams,\n type DeleteNodeParams,\n type DeleteUniqueParams,\n type EdgeExistsBetweenParams,\n type EdgeRow,\n type EmbeddingRow,\n type FindEdgesByKindParams,\n type FindEdgesConnectedToParams,\n type FindNodesByKindParams,\n type GraphBackend,\n type HardDeleteEdgeParams,\n type HardDeleteNodeParams,\n type InsertEdgeParams,\n type InsertNodeParams,\n type InsertSchemaParams,\n type InsertUniqueParams,\n type NodeRow,\n POSTGRES_CAPABILITIES,\n type SchemaVersionRow,\n type TransactionBackend,\n type TransactionOptions,\n type UniqueRow,\n type UpdateEdgeParams,\n type UpdateNodeParams,\n type UpsertEmbeddingParams,\n type VectorSearchParams,\n type VectorSearchResult,\n} from \"../types\";\nimport * as ops from \"./operations\";\nimport {\n type PostgresTables,\n tables as defaultTables,\n} from \"./schema/postgres\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Options for creating a PostgreSQL backend.\n */\nexport type PostgresBackendOptions = Readonly<{\n /**\n * Custom table definitions. Use createPostgresTables() to customize table names.\n * Defaults to standard TypeGraph table names.\n */\n tables?: PostgresTables;\n}>;\n\n/**\n * Any Drizzle PostgreSQL database instance.\n * Using 'any' for the query result type to support all PG drivers.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyPgDatabase = PgDatabase<any>;\n\n// ============================================================\n// Utilities\n// ============================================================\n\n/**\n * Gets the current timestamp in ISO format.\n */\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\n/**\n * Converts null to undefined.\n */\nfunction nullToUndefined<T>(value: T | null): T | undefined {\n return value ?? undefined;\n}\n\n/**\n * Formats a timestamp value to ISO string.\n * PostgreSQL returns Date objects or timestamp strings, need to normalize to ISO format.\n */\nfunction formatTimestamp(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"string\") {\n // If already in ISO format, return as-is\n if (value.includes(\"T\")) return value;\n // Parse PostgreSQL timestamp format and convert to ISO\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) return date.toISOString();\n return value;\n }\n return undefined;\n}\n\n/**\n * Converts a database row to NodeRow type.\n * PostgreSQL returns dates as Date objects and JSONB as objects.\n * Raw SQL returns snake_case column names.\n */\nfunction toNodeRow(row: Record<string, unknown>): NodeRow {\n return {\n graph_id: row.graph_id as string,\n kind: row.kind as string,\n id: row.id as string,\n // PostgreSQL JSONB is already parsed, stringify for consistency\n props:\n typeof row.props === \"string\"\n ? row.props\n : JSON.stringify(row.props ?? {}),\n version: row.version as number,\n valid_from: nullToUndefined(formatTimestamp(row.valid_from)),\n valid_to: nullToUndefined(formatTimestamp(row.valid_to)),\n created_at: formatTimestamp(row.created_at) ?? \"\",\n updated_at: formatTimestamp(row.updated_at) ?? \"\",\n deleted_at: nullToUndefined(formatTimestamp(row.deleted_at)),\n };\n}\n\n/**\n * Converts a database row to EdgeRow type.\n * Raw SQL returns snake_case column names.\n */\nfunction toEdgeRow(row: Record<string, unknown>): EdgeRow {\n return {\n graph_id: row.graph_id as string,\n id: row.id as string,\n kind: row.kind as string,\n from_kind: row.from_kind as string,\n from_id: row.from_id as string,\n to_kind: row.to_kind as string,\n to_id: row.to_id as string,\n props:\n typeof row.props === \"string\"\n ? row.props\n : JSON.stringify(row.props ?? {}),\n valid_from: nullToUndefined(formatTimestamp(row.valid_from)),\n valid_to: nullToUndefined(formatTimestamp(row.valid_to)),\n created_at: formatTimestamp(row.created_at) ?? \"\",\n updated_at: formatTimestamp(row.updated_at) ?? \"\",\n deleted_at: nullToUndefined(formatTimestamp(row.deleted_at)),\n };\n}\n\n/**\n * Converts a database row to UniqueRow type.\n * Raw SQL returns snake_case column names.\n */\nfunction toUniqueRow(row: Record<string, unknown>): UniqueRow {\n return {\n graph_id: row.graph_id as string,\n node_kind: row.node_kind as string,\n constraint_name: row.constraint_name as string,\n key: row.key as string,\n node_id: row.node_id as string,\n concrete_kind: row.concrete_kind as string,\n deleted_at: nullToUndefined(formatTimestamp(row.deleted_at)),\n };\n}\n\n/**\n * Converts a database row to SchemaVersionRow type.\n * Raw SQL returns snake_case column names.\n */\nfunction toSchemaVersionRow(row: Record<string, unknown>): SchemaVersionRow {\n // PostgreSQL may return is_active as boolean or number/string depending on driver\n const isActiveValue = row.is_active;\n const isActive = isActiveValue === true || isActiveValue === 1 || isActiveValue === \"1\";\n\n return {\n graph_id: row.graph_id as string,\n version: row.version as number,\n schema_hash: row.schema_hash as string,\n schema_doc:\n typeof row.schema_doc === \"string\"\n ? row.schema_doc\n : JSON.stringify(row.schema_doc ?? {}),\n created_at: formatTimestamp(row.created_at) ?? \"\",\n is_active: isActive,\n };\n}\n\n/**\n * Converts a database row to EmbeddingRow type.\n * Raw SQL returns snake_case column names.\n */\nfunction toEmbeddingRow(row: Record<string, unknown>): EmbeddingRow {\n // pgvector returns embedding as a string '[1,2,3]' or as parsed array\n let embedding: readonly number[];\n if (typeof row.embedding === \"string\") {\n const content = row.embedding.slice(1, -1);\n embedding = content === \"\" ? [] : content.split(\",\").map((s) => Number.parseFloat(s.trim()));\n } else if (Array.isArray(row.embedding)) {\n embedding = row.embedding as number[];\n } else {\n embedding = [];\n }\n\n return {\n graph_id: row.graph_id as string,\n node_kind: row.node_kind as string,\n node_id: row.node_id as string,\n field_path: row.field_path as string,\n embedding,\n dimensions: row.dimensions as number,\n created_at: formatTimestamp(row.created_at) ?? \"\",\n updated_at: formatTimestamp(row.updated_at) ?? \"\",\n };\n}\n\n/**\n * PostgreSQL capabilities with vector search support.\n * Extends base POSTGRES_CAPABILITIES with vector operations.\n */\nconst POSTGRES_VECTOR_CAPABILITIES: BackendCapabilities = {\n ...POSTGRES_CAPABILITIES,\n vector: {\n supported: true,\n metrics: [\"cosine\", \"l2\", \"inner_product\"] as const,\n indexTypes: [\"hnsw\", \"ivfflat\", \"none\"] as const,\n maxDimensions: 16_000, // pgvector limit\n },\n};\n\n// ============================================================\n// Backend Factory\n// ============================================================\n\n/**\n * Creates a TypeGraph backend for PostgreSQL databases.\n *\n * Works with any Drizzle PostgreSQL instance regardless of the underlying driver.\n *\n * @param db - A Drizzle PostgreSQL database instance\n * @param options - Backend configuration\n * @returns A GraphBackend implementation\n */\nexport function createPostgresBackend(\n db: AnyPgDatabase,\n options: PostgresBackendOptions = {},\n): GraphBackend {\n const tables = options.tables ?? defaultTables;\n\n const tableNames: SqlTableNames = {\n nodes: getTableName(tables.nodes),\n edges: getTableName(tables.edges),\n embeddings: getTableName(tables.embeddings),\n };\n\n /**\n * Execute a query and return all rows.\n */\n async function execAll<T>(query: SQL): Promise<T[]> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const result: { rows: T[] } = await db.execute(query);\n return result.rows;\n }\n\n /**\n * Execute a query and return the first row.\n */\n async function execGet<T>(query: SQL): Promise<T | undefined> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const result: { rows: T[] } = await db.execute(query);\n return result.rows[0];\n }\n\n /**\n * Execute a modification query.\n */\n async function execRun(query: SQL): Promise<void> {\n await db.execute(query);\n }\n\n // Create the backend operations\n const backend: GraphBackend = {\n dialect: \"postgres\",\n capabilities: POSTGRES_VECTOR_CAPABILITIES,\n tableNames,\n\n // === Node Operations ===\n\n async insertNode(params: InsertNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = ops.buildInsertNode(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Insert node failed: no row returned\");\n return toNodeRow(row);\n },\n\n async getNode(\n graphId: string,\n kind: string,\n id: string,\n ): Promise<NodeRow | undefined> {\n const query = ops.buildGetNode(tables, graphId, kind, id);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toNodeRow(row) : undefined;\n },\n\n async updateNode(params: UpdateNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = ops.buildUpdateNode(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Update node failed: no row returned\");\n return toNodeRow(row);\n },\n\n async deleteNode(params: DeleteNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = ops.buildDeleteNode(tables, params, timestamp);\n await execRun(query);\n },\n\n async hardDeleteNode(params: HardDeleteNodeParams): Promise<void> {\n // Delete associated uniqueness entries\n const deleteUniquesQuery = ops.buildHardDeleteUniquesByNode(\n tables,\n params.graphId,\n params.id,\n );\n await execRun(deleteUniquesQuery);\n\n // Delete associated embeddings\n const deleteEmbeddingsQuery = ops.buildHardDeleteEmbeddingsByNode(\n tables,\n params.graphId,\n params.kind,\n params.id,\n );\n await execRun(deleteEmbeddingsQuery);\n\n // Delete the node itself\n const query = ops.buildHardDeleteNode(tables, params);\n await execRun(query);\n },\n\n // === Edge Operations ===\n\n async insertEdge(params: InsertEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = ops.buildInsertEdge(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Insert edge failed: no row returned\");\n return toEdgeRow(row);\n },\n\n async getEdge(graphId: string, id: string): Promise<EdgeRow | undefined> {\n const query = ops.buildGetEdge(tables, graphId, id);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toEdgeRow(row) : undefined;\n },\n\n async updateEdge(params: UpdateEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = ops.buildUpdateEdge(tables, params, timestamp);\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Update edge failed: no row returned\");\n return toEdgeRow(row);\n },\n\n async deleteEdge(params: DeleteEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = ops.buildDeleteEdge(tables, params, timestamp);\n await execRun(query);\n },\n\n async hardDeleteEdge(params: HardDeleteEdgeParams): Promise<void> {\n const query = ops.buildHardDeleteEdge(tables, params);\n await execRun(query);\n },\n\n // === Edge Cardinality Operations ===\n\n async countEdgesFrom(params: CountEdgesFromParams): Promise<number> {\n const query = ops.buildCountEdgesFrom(tables, params);\n const row = await execGet<{ count: string | number }>(query);\n // PostgreSQL returns count as string for bigint\n return Number(row?.count ?? 0);\n },\n\n async edgeExistsBetween(params: EdgeExistsBetweenParams): Promise<boolean> {\n const query = ops.buildEdgeExistsBetween(tables, params);\n const row = await execGet<Record<string, unknown>>(query);\n return row !== undefined;\n },\n\n // === Edge Query Operations ===\n\n async findEdgesConnectedTo(\n params: FindEdgesConnectedToParams,\n ): Promise<readonly EdgeRow[]> {\n const query = ops.buildFindEdgesConnectedTo(tables, params);\n const rows = await execAll<Record<string, unknown>>(query);\n return rows.map((row) => toEdgeRow(row));\n },\n\n // === Collection Query Operations ===\n\n async findNodesByKind(\n params: FindNodesByKindParams,\n ): Promise<readonly NodeRow[]> {\n const query = ops.buildFindNodesByKind(tables, params);\n const rows = await execAll<Record<string, unknown>>(query);\n return rows.map((row) => toNodeRow(row));\n },\n\n async countNodesByKind(params: CountNodesByKindParams): Promise<number> {\n const query = ops.buildCountNodesByKind(tables, params);\n const row = await execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async findEdgesByKind(\n params: FindEdgesByKindParams,\n ): Promise<readonly EdgeRow[]> {\n const query = ops.buildFindEdgesByKind(tables, params);\n const rows = await execAll<Record<string, unknown>>(query);\n return rows.map((row) => toEdgeRow(row));\n },\n\n async countEdgesByKind(params: CountEdgesByKindParams): Promise<number> {\n const query = ops.buildCountEdgesByKind(tables, params);\n const row = await execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n // === Unique Constraint Operations ===\n\n async insertUnique(params: InsertUniqueParams): Promise<void> {\n const query = ops.buildInsertUnique(tables, \"postgres\", params);\n const result = await execGet<{ node_id: string }>(query);\n\n // Check if the returned node_id matches our input\n // If different, another node holds this key (race condition or conflict)\n if (result && result.node_id !== params.nodeId) {\n throw new UniquenessError({\n constraintName: params.constraintName,\n kind: params.nodeKind,\n existingId: result.node_id,\n newId: params.nodeId,\n fields: [], // Fields not available at this level\n });\n }\n },\n\n async deleteUnique(params: DeleteUniqueParams): Promise<void> {\n const timestamp = nowIso();\n const query = ops.buildDeleteUnique(tables, params, timestamp);\n await execRun(query);\n },\n\n async checkUnique(\n params: CheckUniqueParams,\n ): Promise<UniqueRow | undefined> {\n const query = ops.buildCheckUnique(tables, params);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toUniqueRow(row) : undefined;\n },\n\n // === Schema Operations ===\n\n async getActiveSchema(\n graphId: string,\n ): Promise<SchemaVersionRow | undefined> {\n const query = ops.buildGetActiveSchema(tables, graphId, \"postgres\");\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toSchemaVersionRow(row) : undefined;\n },\n\n async insertSchema(params: InsertSchemaParams): Promise<SchemaVersionRow> {\n const timestamp = nowIso();\n const query = ops.buildInsertSchema(tables, params, timestamp, \"postgres\");\n const row = await execGet<Record<string, unknown>>(query);\n if (!row) throw new Error(\"Insert schema failed: no row returned\");\n return toSchemaVersionRow(row);\n },\n\n async getSchemaVersion(\n graphId: string,\n version: number,\n ): Promise<SchemaVersionRow | undefined> {\n const query = ops.buildGetSchemaVersion(tables, graphId, version);\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toSchemaVersionRow(row) : undefined;\n },\n\n async setActiveSchema(graphId: string, version: number): Promise<void> {\n const queries = ops.buildSetActiveSchema(tables, graphId, version, \"postgres\");\n await execRun(queries.deactivateAll);\n await execRun(queries.activateVersion);\n },\n\n // === Embedding Operations ===\n\n async upsertEmbedding(params: UpsertEmbeddingParams): Promise<void> {\n const timestamp = nowIso();\n const query = ops.buildUpsertEmbeddingPostgres(tables, params, timestamp);\n await execRun(query);\n },\n\n async deleteEmbedding(params: DeleteEmbeddingParams): Promise<void> {\n const query = ops.buildDeleteEmbedding(tables, params);\n await execRun(query);\n },\n\n async getEmbedding(\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n ): Promise<EmbeddingRow | undefined> {\n const query = ops.buildGetEmbedding(\n tables,\n graphId,\n nodeKind,\n nodeId,\n fieldPath,\n );\n const row = await execGet<Record<string, unknown>>(query);\n return row ? toEmbeddingRow(row) : undefined;\n },\n\n async vectorSearch(\n params: VectorSearchParams,\n ): Promise<readonly VectorSearchResult[]> {\n const query = ops.buildVectorSearchPostgres(tables, params);\n const rows = await execAll<{ node_id: string; score: number }>(query);\n return rows.map((row) => ({\n nodeId: row.node_id,\n score: row.score,\n }));\n },\n\n // === Query Execution ===\n\n async execute<T>(query: SQL): Promise<readonly T[]> {\n return execAll<T>(query);\n },\n\n // === Transaction ===\n\n async transaction<T>(\n fn: (tx: TransactionBackend) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n // Map isolation levels to Drizzle format\n const txConfig = options?.isolationLevel\n ? {\n isolationLevel: options.isolationLevel.replace(\"_\", \" \") as\n | \"read uncommitted\"\n | \"read committed\"\n | \"repeatable read\"\n | \"serializable\",\n }\n : undefined;\n\n return db.transaction(async (tx) => {\n const txBackend = createTransactionBackend(\n tx as unknown as AnyPgDatabase,\n tables,\n );\n return fn(txBackend);\n }, txConfig);\n },\n\n // === Lifecycle ===\n\n async close(): Promise<void> {\n // Drizzle doesn't expose a close method\n // Users manage connection lifecycle themselves\n },\n };\n\n return backend;\n}\n\n/**\n * Creates a transaction backend from a Drizzle transaction.\n */\nfunction createTransactionBackend(\n tx: AnyPgDatabase,\n tables: PostgresTables,\n): TransactionBackend {\n // Create a new backend using the transaction\n const txBackend = createPostgresBackend(tx, { tables });\n\n // Return without transaction and close methods\n const { transaction: _tx, close: _close, ...ops } = txBackend;\n void _tx;\n void _close;\n return ops;\n}\n\n// Re-export schema utilities\nexport type { PostgresTables, TableNames } from \"./schema/postgres\";\nexport { createPostgresTables, tables } from \"./schema/postgres\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/backend/drizzle/schema/sqlite.ts"],"names":["nodes","edges","uniques","schemaVersions","embeddings"],"mappings":"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","file":"chunk-2QHQ2C4P.js","sourcesContent":["/**\n * Drizzle SQLite schema for TypeGraph.\n *\n * Provides table definitions that can be customized via the factory function.\n * Users import these tables into their Drizzle schema and use drizzle-kit\n * for migrations.\n *\n * @example\n * ```typescript\n * // Default table names\n * import { tables } from \"@nicia-ai/typegraph/drizzle/schema/sqlite\";\n *\n * // Custom table names\n * import { createSqliteTables } from \"@nicia-ai/typegraph/drizzle/schema/sqlite\";\n * const tables = createSqliteTables({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * });\n * ```\n */\nimport {\n blob,\n index,\n integer,\n primaryKey,\n sqliteTable,\n text,\n} from \"drizzle-orm/sqlite-core\";\n\nimport {\n buildSqliteEdgeIndexBuilders,\n buildSqliteNodeIndexBuilders,\n type TypeGraphIndex,\n} from \"../../../indexes\";\n\n/**\n * Table name configuration.\n */\nexport type TableNames = Readonly<{\n nodes: string;\n edges: string;\n uniques: string;\n schemaVersions: string;\n embeddings: string;\n}>;\n\nexport type CreateSqliteTablesOptions = Readonly<{\n /**\n * Additional TypeGraph indexes to include in the Drizzle schema.\n *\n * These become first-class Drizzle indexes, so drizzle-kit migrations will\n * pick them up automatically.\n */\n indexes?: readonly TypeGraphIndex[] | undefined;\n}>;\n\nconst DEFAULT_TABLE_NAMES: TableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n uniques: \"typegraph_node_uniques\",\n schemaVersions: \"typegraph_schema_versions\",\n embeddings: \"typegraph_node_embeddings\",\n};\n\n/**\n * Creates SQLite table definitions with customizable table names.\n * Index names are derived from table names.\n */\nexport function createSqliteTables(\n names: Partial<TableNames> = {},\n options: CreateSqliteTablesOptions = {},\n) {\n const n: TableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n const indexes = options.indexes ?? [];\n\n const nodes = sqliteTable(\n n.nodes,\n {\n graphId: text(\"graph_id\").notNull(),\n kind: text(\"kind\").notNull(),\n id: text(\"id\").notNull(),\n props: text(\"props\").notNull(),\n version: integer(\"version\").notNull().default(1),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.kind, t.id] }),\n index(`${n.nodes}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.nodes}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.nodes}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n ...buildSqliteNodeIndexBuilders(t, indexes),\n ],\n );\n\n const edges = sqliteTable(\n n.edges,\n {\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n kind: text(\"kind\").notNull(),\n fromKind: text(\"from_kind\").notNull(),\n fromId: text(\"from_id\").notNull(),\n toKind: text(\"to_kind\").notNull(),\n toId: text(\"to_id\").notNull(),\n props: text(\"props\").notNull(),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n index(`${n.edges}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.edges}_from_idx`).on(t.graphId, t.fromKind, t.fromId),\n index(`${n.edges}_to_idx`).on(t.graphId, t.toKind, t.toId),\n index(`${n.edges}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.edges}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n index(`${n.edges}_cardinality_idx`).on(\n t.graphId,\n t.kind,\n t.fromKind,\n t.fromId,\n t.validTo,\n ),\n ...buildSqliteEdgeIndexBuilders(t, indexes),\n ],\n );\n\n const uniques = sqliteTable(\n n.uniques,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n constraintName: text(\"constraint_name\").notNull(),\n key: text(\"key\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n concreteKind: text(\"concrete_kind\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.constraintName, t.key],\n }),\n index(`${n.uniques}_node_idx`).on(t.graphId, t.concreteKind, t.nodeId),\n ],\n );\n\n const schemaVersions = sqliteTable(\n n.schemaVersions,\n {\n graphId: text(\"graph_id\").notNull(),\n version: integer(\"version\").notNull(),\n schemaHash: text(\"schema_hash\").notNull(),\n schemaDoc: text(\"schema_doc\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n isActive: integer(\"is_active\", { mode: \"boolean\" })\n .notNull()\n .default(false),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.version] }),\n index(`${n.schemaVersions}_active_idx`).on(t.graphId, t.isActive),\n ],\n );\n\n /**\n * Embeddings table for vector search.\n *\n * Stores embeddings as BLOB (for sqlite-vec binary format) or as JSON text.\n * When sqlite-vec extension is loaded, the BLOB column can be used with\n * vec_f32() for similarity operations.\n */\n const embeddings = sqliteTable(\n n.embeddings,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n fieldPath: text(\"field_path\").notNull(),\n /**\n * Embedding vector.\n * Stored as BLOB for sqlite-vec binary format, or JSON text for fallback.\n * For sqlite-vec: use vec_f32() to convert JSON array to binary.\n */\n embedding: blob(\"embedding\", { mode: \"buffer\" }).notNull(),\n /** Number of dimensions (for validation) */\n dimensions: integer(\"dimensions\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.nodeId, t.fieldPath],\n }),\n // Index for looking up embeddings by node\n index(`${n.embeddings}_node_idx`).on(\n t.graphId,\n t.nodeKind,\n t.nodeId,\n ),\n // Index for filtering by kind and field (used in vector search)\n index(`${n.embeddings}_kind_field_idx`).on(\n t.graphId,\n t.nodeKind,\n t.fieldPath,\n ),\n ],\n );\n\n return { nodes, edges, uniques, schemaVersions, embeddings } as const;\n}\n\n/**\n * Default tables with standard TypeGraph table names.\n */\nexport const tables = createSqliteTables();\n\n/**\n * Convenience exports for default tables.\n */\nexport const { nodes, edges, uniques, schemaVersions, embeddings } = tables;\n\n/**\n * Type representing the tables object returned by createSqliteTables.\n */\nexport type SqliteTables = ReturnType<typeof createSqliteTables>;\n\n/**\n * Type for nodes table.\n */\nexport type NodesTable = SqliteTables[\"nodes\"];\n\n/**\n * Type for edges table.\n */\nexport type EdgesTable = SqliteTables[\"edges\"];\n\n/**\n * Type for uniques table.\n */\nexport type UniquesTable = SqliteTables[\"uniques\"];\n\n/**\n * Type for schema versions table.\n */\nexport type SchemaVersionsTable = SqliteTables[\"schemaVersions\"];\n\n/**\n * Type for embeddings table.\n */\nexport type EmbeddingsTable = SqliteTables[\"embeddings\"];\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/backend/drizzle/columns/vector.ts","../src/backend/drizzle/schema/postgres.ts"],"names":["nodes","edges","uniques","schemaVersions","embeddings"],"mappings":"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","file":"chunk-4PIEL2VO.js","sourcesContent":["/**\n * Custom Drizzle column type for pgvector's VECTOR type.\n *\n * Provides native support for PostgreSQL vector embeddings without\n * requiring runtime casts in queries.\n *\n * @example\n * ```typescript\n * import { pgTable, text, integer } from \"drizzle-orm/pg-core\";\n * import { vector } from \"./columns/vector\";\n *\n * const embeddings = pgTable(\"embeddings\", {\n * id: text(\"id\").primaryKey(),\n * embedding: vector(\"embedding\"),\n * dimensions: integer(\"dimensions\"),\n * });\n * ```\n */\nimport { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * PostgreSQL vector column type for pgvector extension.\n *\n * Stores embeddings as native VECTOR type, enabling efficient\n * similarity search without runtime casts.\n *\n * The column type is unparameterized (`VECTOR` not `VECTOR(N)`)\n * to support multiple embedding dimensions in a single table.\n * Dimension validation is handled at the application level.\n *\n * @example\n * ```typescript\n * // In table definition\n * embedding: vector(\"embedding\").notNull(),\n *\n * // In queries - no cast needed\n * db.execute(sql`\n * SELECT * FROM embeddings\n * WHERE embedding <=> ${formatVector([0.1, 0.2, 0.3])} < 0.5\n * `);\n * ```\n */\nexport const vector = customType<{\n data: number[];\n driverData: string;\n config: { dimensions?: number };\n}>({\n dataType(config) {\n // Use parameterized type if dimensions specified, otherwise unparameterized\n return config?.dimensions ? `vector(${config.dimensions})` : \"vector\";\n },\n\n toDriver(value: number[]): string {\n // Format as pgvector literal: [1.0,2.0,3.0]\n return `[${value.join(\",\")}]`;\n },\n\n fromDriver(value: string): number[] {\n // pgvector returns '[1,2,3]' format\n // Handle both string and already-parsed array (some drivers differ)\n if (Array.isArray(value)) {\n return value as number[];\n }\n // Parse the string representation\n const content = value.slice(1, -1); // Remove [ and ]\n if (content === \"\") {\n return [];\n }\n return content.split(\",\").map((s) => Number.parseFloat(s.trim()));\n },\n});\n\n/**\n * Formats a number array as a pgvector literal string.\n *\n * Use this when building raw SQL queries with embeddings.\n *\n * @example\n * ```typescript\n * const embedding = [0.1, 0.2, 0.3];\n * db.execute(sql`\n * SELECT * FROM embeddings\n * WHERE embedding <=> ${formatVector(embedding)}::vector < 0.5\n * `);\n * ```\n */\nexport function formatVector(embedding: readonly number[]): string {\n return `[${embedding.join(\",\")}]`;\n}\n","/**\n * Drizzle PostgreSQL schema for TypeGraph.\n *\n * Provides table definitions that can be customized via the factory function.\n * Uses PostgreSQL-native types: JSONB, TIMESTAMPTZ, BOOLEAN, VECTOR.\n *\n * The embeddings table uses pgvector's native VECTOR type. Ensure the\n * extension is enabled before creating tables:\n *\n * ```sql\n * CREATE EXTENSION IF NOT EXISTS vector;\n * ```\n *\n * @example\n * ```typescript\n * // Default table names\n * import { tables } from \"@nicia-ai/typegraph/drizzle/schema/postgres\";\n *\n * // Custom table names\n * import { createPostgresTables } from \"@nicia-ai/typegraph/drizzle/schema/postgres\";\n * const tables = createPostgresTables({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * });\n * ```\n */\nimport {\n boolean,\n index,\n integer,\n jsonb,\n pgTable,\n primaryKey,\n text,\n timestamp,\n} from \"drizzle-orm/pg-core\";\n\nimport {\n buildPostgresEdgeIndexBuilders,\n buildPostgresNodeIndexBuilders,\n type TypeGraphIndex,\n} from \"../../../indexes\";\nimport { vector } from \"../columns/vector\";\n\n/**\n * Table name configuration.\n */\nexport type TableNames = Readonly<{\n nodes: string;\n edges: string;\n uniques: string;\n schemaVersions: string;\n embeddings: string;\n}>;\n\nexport type CreatePostgresTablesOptions = Readonly<{\n /**\n * Additional TypeGraph indexes to include in the Drizzle schema.\n *\n * These become first-class Drizzle indexes, so drizzle-kit migrations will\n * pick them up automatically.\n */\n indexes?: readonly TypeGraphIndex[] | undefined;\n}>;\n\nconst DEFAULT_TABLE_NAMES: TableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n uniques: \"typegraph_node_uniques\",\n schemaVersions: \"typegraph_schema_versions\",\n embeddings: \"typegraph_node_embeddings\",\n};\n\n/**\n * Creates PostgreSQL table definitions with customizable table names.\n * Index names are derived from table names.\n */\nexport function createPostgresTables(\n names: Partial<TableNames> = {},\n options: CreatePostgresTablesOptions = {},\n) {\n const n: TableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n const indexes = options.indexes ?? [];\n\n const nodes = pgTable(\n n.nodes,\n {\n graphId: text(\"graph_id\").notNull(),\n kind: text(\"kind\").notNull(),\n id: text(\"id\").notNull(),\n props: jsonb(\"props\").notNull(),\n version: integer(\"version\").notNull().default(1),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }),\n validTo: timestamp(\"valid_to\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.kind, t.id] }),\n index(`${n.nodes}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.nodes}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.nodes}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n ...buildPostgresNodeIndexBuilders(t, indexes),\n ],\n );\n\n const edges = pgTable(\n n.edges,\n {\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n kind: text(\"kind\").notNull(),\n fromKind: text(\"from_kind\").notNull(),\n fromId: text(\"from_id\").notNull(),\n toKind: text(\"to_kind\").notNull(),\n toId: text(\"to_id\").notNull(),\n props: jsonb(\"props\").notNull(),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }),\n validTo: timestamp(\"valid_to\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n index(`${n.edges}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.edges}_from_idx`).on(t.graphId, t.fromKind, t.fromId),\n index(`${n.edges}_to_idx`).on(t.graphId, t.toKind, t.toId),\n index(`${n.edges}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.edges}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n index(`${n.edges}_cardinality_idx`).on(\n t.graphId,\n t.kind,\n t.fromKind,\n t.fromId,\n t.validTo,\n ),\n ...buildPostgresEdgeIndexBuilders(t, indexes),\n ],\n );\n\n const uniques = pgTable(\n n.uniques,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n constraintName: text(\"constraint_name\").notNull(),\n key: text(\"key\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n concreteKind: text(\"concrete_kind\").notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.constraintName, t.key],\n }),\n index(`${n.uniques}_node_idx`).on(t.graphId, t.concreteKind, t.nodeId),\n ],\n );\n\n const schemaVersions = pgTable(\n n.schemaVersions,\n {\n graphId: text(\"graph_id\").notNull(),\n version: integer(\"version\").notNull(),\n schemaHash: text(\"schema_hash\").notNull(),\n schemaDoc: jsonb(\"schema_doc\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n isActive: boolean(\"is_active\").notNull().default(false),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.version] }),\n index(`${n.schemaVersions}_active_idx`).on(t.graphId, t.isActive),\n ],\n );\n\n /**\n * Embeddings table for vector search.\n *\n * Stores embeddings using pgvector's native VECTOR type for efficient\n * similarity operations without runtime casts.\n *\n * The column uses unparameterized VECTOR type to support multiple\n * embedding dimensions in a single table. Dimension validation is\n * handled at the application level via the `dimensions` column.\n *\n * Requires pgvector extension:\n * CREATE EXTENSION IF NOT EXISTS vector;\n *\n * Vector indices (HNSW, IVFFlat) are created dynamically based on the\n * configured metric and dimensions.\n */\n const embeddings = pgTable(\n n.embeddings,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n fieldPath: text(\"field_path\").notNull(),\n /** Embedding vector stored as native pgvector type */\n embedding: vector(\"embedding\").notNull(),\n /** Number of dimensions (for validation) */\n dimensions: integer(\"dimensions\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.nodeId, t.fieldPath],\n }),\n // Index for looking up embeddings by node\n index(`${n.embeddings}_node_idx`).on(\n t.graphId,\n t.nodeKind,\n t.nodeId,\n ),\n // Index for filtering by kind and field (used in vector search)\n index(`${n.embeddings}_kind_field_idx`).on(\n t.graphId,\n t.nodeKind,\n t.fieldPath,\n ),\n ],\n );\n\n return { nodes, edges, uniques, schemaVersions, embeddings } as const;\n}\n\n/**\n * Default tables with standard TypeGraph table names.\n */\nexport const tables = createPostgresTables();\n\n/**\n * Convenience exports for default tables.\n */\nexport const { nodes, edges, uniques, schemaVersions, embeddings } = tables;\n\n/**\n * Type representing the tables object returned by createPostgresTables.\n */\nexport type PostgresTables = ReturnType<typeof createPostgresTables>;\n\n/**\n * Type for nodes table.\n */\nexport type NodesTable = PostgresTables[\"nodes\"];\n\n/**\n * Type for edges table.\n */\nexport type EdgesTable = PostgresTables[\"edges\"];\n\n/**\n * Type for uniques table.\n */\nexport type UniquesTable = PostgresTables[\"uniques\"];\n\n/**\n * Type for schema versions table.\n */\nexport type SchemaVersionsTable = PostgresTables[\"schemaVersions\"];\n\n/**\n * Type for embeddings table.\n */\nexport type EmbeddingsTable = PostgresTables[\"embeddings\"];\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/types.ts","../src/core/define-graph.ts","../src/utils/date.ts"],"names":["ConfigurationError","ValidationError"],"mappings":"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","file":"chunk-DBFCKELK.cjs","sourcesContent":["import { type z } from \"zod\";\n\n// ============================================================\n// Brand Keys for Nominal Typing\n// ============================================================\n\n/** Brand key for NodeType */\nexport const NODE_TYPE_BRAND = \"__nodeType\" as const;\n\n/** Brand key for EdgeType */\nexport const EDGE_TYPE_BRAND = \"__edgeType\" as const;\n\n/** Brand symbol for NodeId */\ndeclare const __nodeId: unique symbol;\n\n// ============================================================\n// Node Type\n// ============================================================\n\n/**\n * A node type definition.\n *\n * Created via `defineNode()`. Represents a type of node in the graph\n * with an associated Zod schema for properties.\n */\nexport type NodeType<\n K extends string = string,\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n [NODE_TYPE_BRAND]: true;\n name: K;\n schema: S;\n description: string | undefined;\n}>;\n\n/**\n * Branded node ID type.\n *\n * Prevents mixing IDs from different node types at compile time.\n */\nexport type NodeId<N extends NodeType> = string &\n Readonly<{\n [__nodeId]: N;\n }>;\n\n/**\n * Infer the props type from a NodeType.\n */\nexport type NodeProps<N extends NodeType> = z.infer<N[\"schema\"]>;\n\n// ============================================================\n// Edge Type\n// ============================================================\n\n/**\n * An edge type definition.\n *\n * Created via `defineEdge()`. Represents a type of edge in the graph\n * with an optional Zod schema for properties.\n *\n * Optionally includes `from` and `to` arrays that define the allowed\n * source and target node types (domain and range constraints).\n */\nexport type EdgeType<\n K extends string = string,\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined = undefined,\n To extends readonly NodeType[] | undefined = undefined,\n> = Readonly<{\n [EDGE_TYPE_BRAND]: true;\n name: K;\n schema: S;\n description: string | undefined;\n from: From;\n to: To;\n}>;\n\n/**\n * Base edge type for use in constraints - accepts any from/to configuration.\n */\nexport type AnyEdgeType = EdgeType<\n string,\n z.ZodObject<z.ZodRawShape>,\n readonly NodeType[] | undefined,\n readonly NodeType[] | undefined\n>;\n\n/**\n * An edge type that has both from and to constraints defined.\n * Can be used directly in defineGraph without an EdgeRegistration wrapper.\n */\nexport type EdgeTypeWithEndpoints = EdgeType<\n string,\n z.ZodObject<z.ZodRawShape>,\n readonly NodeType[],\n readonly NodeType[]\n>;\n\n/**\n * Infer the props type from an EdgeType.\n */\nexport type EdgeProps<E extends AnyEdgeType> = z.infer<E[\"schema\"]>;\n\n// ============================================================\n// Configuration Types\n// ============================================================\n\n/**\n * Delete behaviors for nodes.\n */\nexport type DeleteBehavior = \"restrict\" | \"cascade\" | \"disconnect\";\n\n/**\n * Edge cardinality constraints.\n */\nexport type Cardinality =\n | \"many\" // No constraint (default)\n | \"one\" // At most one edge of this kind from any source node\n | \"unique\" // At most one edge of this kind between any (source, target) pair\n | \"oneActive\"; // At most one edge with valid_to IS NULL from any source\n\n/**\n * Endpoint existence modes for edge validation.\n */\nexport type EndpointExistence =\n | \"notDeleted\" // Endpoint deleted_at IS NULL (default)\n | \"currentlyValid\" // Endpoint not deleted AND temporally valid\n | \"ever\"; // Endpoint exists in any state\n\n/**\n * Temporal query modes.\n */\nexport type TemporalMode =\n | \"current\" // Valid now AND not deleted\n | \"asOf\" // Valid at specific date AND not deleted\n | \"includeEnded\" // All validity periods AND not deleted\n | \"includeTombstones\"; // Everything including soft-deleted\n\n/**\n * Uniqueness constraint scope.\n */\nexport type UniquenessScope =\n | \"kind\" // Unique within this exact kind only\n | \"kindWithSubClasses\"; // Unique across this kind and all subclasses\n\n/**\n * Collation for uniqueness constraints.\n */\nexport type Collation = \"binary\" | \"caseInsensitive\";\n\n// ============================================================\n// Uniqueness Constraint\n// ============================================================\n\n/**\n * Uniqueness constraint definition.\n */\nexport type UniqueConstraint<\n S extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n name: string;\n fields: readonly (keyof z.infer<S> & string)[];\n where?: (\n props: UniqueConstraintPredicateBuilder<S>,\n ) => UniqueConstraintPredicate;\n scope: UniquenessScope;\n collation: Collation;\n}>;\n\n/**\n * Predicate builder for uniqueness constraint where clause.\n * Uses -? to make all fields required in the builder, even if optional in the schema.\n */\nexport type UniqueConstraintPredicateBuilder<\n S extends z.ZodObject<z.ZodRawShape>,\n> = Readonly<{\n [K in keyof z.infer<S>]-?: UniqueConstraintField;\n}>;\n\n/**\n * Field operations for uniqueness constraint predicates.\n */\ntype UniqueConstraintField = Readonly<{\n isNull: () => UniqueConstraintPredicate;\n isNotNull: () => UniqueConstraintPredicate;\n}>;\n\n/**\n * A uniqueness constraint predicate (internal representation).\n */\nexport type UniqueConstraintPredicate = Readonly<{\n __type: \"unique_predicate\";\n field: string;\n op: \"isNull\" | \"isNotNull\";\n}>;\n\n// ============================================================\n// Node Registration\n// ============================================================\n\n/**\n * Node registration in a graph definition.\n */\nexport type NodeRegistration<N extends NodeType = NodeType> = Readonly<{\n type: N;\n unique?: readonly UniqueConstraint<N[\"schema\"]>[];\n onDelete?: DeleteBehavior;\n}>;\n\n// ============================================================\n// Edge Registration\n// ============================================================\n\n/**\n * Edge registration in a graph definition.\n */\nexport type EdgeRegistration<\n E extends AnyEdgeType = AnyEdgeType,\n FromTypes extends NodeType = NodeType,\n ToTypes extends NodeType = NodeType,\n> = Readonly<{\n type: E;\n from: readonly FromTypes[];\n to: readonly ToTypes[];\n cardinality?: Cardinality;\n endpointExistence?: EndpointExistence;\n}>;\n\n// ============================================================\n// Graph Defaults\n// ============================================================\n\n/**\n * Default settings for a graph.\n */\nexport type GraphDefaults = Readonly<{\n onNodeDelete?: DeleteBehavior;\n temporalMode?: TemporalMode;\n}>;\n\n// ============================================================\n// Type Helpers\n// ============================================================\n\n/**\n * Checks if a value is a NodeType.\n */\nexport function isNodeType(value: unknown): value is NodeType {\n return (\n typeof value === \"object\" &&\n value !== null &&\n NODE_TYPE_BRAND in value &&\n (value as Record<string, unknown>)[NODE_TYPE_BRAND] === true\n );\n}\n\n/**\n * Checks if a value is an EdgeType.\n */\nexport function isEdgeType(value: unknown): value is AnyEdgeType {\n return (\n typeof value === \"object\" &&\n value !== null &&\n EDGE_TYPE_BRAND in value &&\n (value as Record<string, unknown>)[EDGE_TYPE_BRAND] === true\n );\n}\n\n/**\n * Checks if a value is an EdgeType with both from and to constraints defined.\n * Such edges can be used directly in defineGraph without an EdgeRegistration wrapper.\n */\nexport function isEdgeTypeWithEndpoints(\n value: unknown,\n): value is EdgeTypeWithEndpoints {\n return (\n isEdgeType(value) &&\n Array.isArray(value.from) &&\n value.from.length > 0 &&\n Array.isArray(value.to) &&\n value.to.length > 0\n );\n}\n","import { ConfigurationError } from \"../errors/index\";\nimport { type OntologyRelation } from \"../ontology/types\";\nimport {\n type DeleteBehavior,\n type EdgeRegistration,\n type EdgeTypeWithEndpoints,\n type GraphDefaults,\n isEdgeTypeWithEndpoints,\n type NodeRegistration,\n type NodeType,\n type TemporalMode,\n} from \"./types\";\n\n// ============================================================\n// Graph Definition Brand Symbol\n// ============================================================\n\n/** Brand key for GraphDef */\nconst GRAPH_DEF_BRAND = \"__graphDef\" as const;\n\n// ============================================================\n// Edge Entry Types\n// ============================================================\n\n/**\n * An edge entry in the graph definition.\n * Can be:\n * - EdgeType directly (if it has from/to defined)\n * - EdgeRegistration object (always works, can override/narrow defaults)\n */\ntype EdgeEntry = EdgeRegistration | EdgeTypeWithEndpoints;\n\n/**\n * Normalized edge map type - all entries become EdgeRegistration.\n */\ntype NormalizedEdges<TEdges extends Record<string, EdgeEntry>> = {\n [K in keyof TEdges]: TEdges[K] extends EdgeRegistration ? TEdges[K]\n : TEdges[K] extends EdgeTypeWithEndpoints ?\n EdgeRegistration<\n TEdges[K],\n TEdges[K][\"from\"][number],\n TEdges[K][\"to\"][number]\n >\n : never;\n};\n\n// ============================================================\n// Edge Normalization Functions\n// ============================================================\n\n/**\n * Validates that an EdgeRegistration's constraints don't widen beyond\n * the edge type's built-in domain/range constraints.\n */\nfunction validateConstraintNarrowing(\n name: string,\n edgeType: EdgeTypeWithEndpoints,\n registration: EdgeRegistration,\n): void {\n const builtInFromNames = new Set(edgeType.from.map((n) => n.name));\n for (const fromNode of registration.from) {\n if (!builtInFromNames.has(fromNode.name)) {\n throw new ConfigurationError(\n `Edge \"${name}\" registration has 'from' kind \"${fromNode.name}\" ` +\n `not in edge's built-in domain: [${[...builtInFromNames].join(\", \")}]`,\n {\n edgeName: name,\n invalidFrom: fromNode.name,\n allowedFrom: [...builtInFromNames],\n },\n {\n suggestion: `Edge registration can only narrow, not widen, the edge type's built-in constraints.`,\n },\n );\n }\n }\n\n const builtInToNames = new Set(edgeType.to.map((n) => n.name));\n for (const toNode of registration.to) {\n if (!builtInToNames.has(toNode.name)) {\n throw new ConfigurationError(\n `Edge \"${name}\" registration has 'to' kind \"${toNode.name}\" ` +\n `not in edge's built-in range: [${[...builtInToNames].join(\", \")}]`,\n {\n edgeName: name,\n invalidTo: toNode.name,\n allowedTo: [...builtInToNames],\n },\n {\n suggestion: `Edge registration can only narrow, not widen, the edge type's built-in constraints.`,\n },\n );\n }\n }\n}\n\n/**\n * Normalizes a single edge entry to EdgeRegistration.\n */\nfunction normalizeEdgeEntry(name: string, entry: EdgeEntry): EdgeRegistration {\n if (isEdgeTypeWithEndpoints(entry)) {\n // EdgeType with from/to - convert to EdgeRegistration\n return {\n type: entry,\n from: entry.from,\n to: entry.to,\n };\n }\n\n // Already EdgeRegistration - validate narrowing if edge has built-in constraints\n if (isEdgeTypeWithEndpoints(entry.type)) {\n validateConstraintNarrowing(name, entry.type, entry);\n }\n\n return entry;\n}\n\n/**\n * Normalizes all edge entries to EdgeRegistration.\n */\nfunction normalizeEdges(\n edges: Record<string, EdgeEntry>,\n): Record<string, EdgeRegistration> {\n const result: Record<string, EdgeRegistration> = {};\n for (const [name, entry] of Object.entries(edges)) {\n result[name] = normalizeEdgeEntry(name, entry);\n }\n return result;\n}\n\n// ============================================================\n// Graph Definition Configuration\n// ============================================================\n\n/**\n * Configuration for defineGraph.\n */\ntype GraphDefConfig<\n TNodes extends Record<string, NodeRegistration>,\n TEdges extends Record<string, EdgeEntry>,\n TOntology extends readonly OntologyRelation[],\n> = Readonly<{\n /** Unique identifier for this graph */\n id: string;\n /** Node registrations */\n nodes: TNodes;\n /** Edge registrations or EdgeTypes with built-in domain/range */\n edges: TEdges;\n /** Ontology relations */\n ontology?: TOntology;\n /** Graph-wide defaults */\n defaults?: GraphDefaults;\n}>;\n\n// ============================================================\n// Graph Definition Type\n// ============================================================\n\n/**\n * A graph definition.\n *\n * This is a compile-time artifact that describes the structure of a graph.\n * Use `createStore()` to create a runtime store from this definition.\n */\nexport type GraphDef<\n TNodes extends Record<string, NodeRegistration> = Record<\n string,\n NodeRegistration\n >,\n TEdges extends Record<string, EdgeRegistration> = Record<\n string,\n EdgeRegistration\n >,\n TOntology extends readonly OntologyRelation[] = readonly OntologyRelation[],\n> = Readonly<{\n [GRAPH_DEF_BRAND]: true;\n id: string;\n nodes: TNodes;\n edges: TEdges;\n ontology: TOntology;\n defaults: Readonly<{\n onNodeDelete: DeleteBehavior;\n temporalMode: TemporalMode;\n }>;\n}>;\n\n// ============================================================\n// Type Helpers\n// ============================================================\n\n/**\n * Extract node type names from a GraphDef.\n */\nexport type NodeTypeNames<G extends GraphDef> = keyof G[\"nodes\"] & string;\n\n/**\n * Extract edge type names from a GraphDef.\n */\nexport type EdgeTypeNames<G extends GraphDef> = keyof G[\"edges\"] & string;\n\n/**\n * Get a NodeType from a GraphDef by name.\n */\nexport type GetNodeType<\n G extends GraphDef,\n K extends NodeTypeNames<G>,\n> = G[\"nodes\"][K][\"type\"];\n\n/**\n * Get an EdgeType from a GraphDef by name.\n */\nexport type GetEdgeType<\n G extends GraphDef,\n K extends EdgeTypeNames<G>,\n> = G[\"edges\"][K][\"type\"];\n\n/**\n * Get all NodeTypes from a GraphDef.\n */\nexport type AllNodeTypes<G extends GraphDef> = {\n [K in NodeTypeNames<G>]: G[\"nodes\"][K][\"type\"];\n}[NodeTypeNames<G>];\n\n/**\n * Get all EdgeTypes from a GraphDef.\n */\nexport type AllEdgeTypes<G extends GraphDef> = {\n [K in EdgeTypeNames<G>]: G[\"edges\"][K][\"type\"];\n}[EdgeTypeNames<G>];\n\n// ============================================================\n// Define Graph Function\n// ============================================================\n\n/**\n * Creates a graph definition.\n *\n * @example\n * ```typescript\n * const graph = defineGraph({\n * id: \"my_graph\",\n * nodes: {\n * Person: { type: Person },\n * Company: { type: Company },\n * },\n * edges: {\n * // Traditional EdgeRegistration syntax\n * worksAt: {\n * type: worksAt,\n * from: [Person],\n * to: [Company],\n * cardinality: \"many\",\n * },\n * // Or use EdgeType directly if it has from/to defined\n * knows, // EdgeType with built-in domain/range\n * },\n * ontology: [\n * subClassOf(Company, Organization),\n * disjointWith(Person, Organization),\n * ],\n * defaults: {\n * onNodeDelete: \"restrict\",\n * temporalMode: \"current\",\n * },\n * });\n * ```\n */\nexport function defineGraph<\n TNodes extends Record<string, NodeRegistration<NodeType>>,\n TEdges extends Record<string, EdgeEntry>,\n TOntology extends readonly OntologyRelation[],\n>(\n config: GraphDefConfig<TNodes, TEdges, TOntology>,\n): GraphDef<TNodes, NormalizedEdges<TEdges>, TOntology> {\n const defaults = {\n onNodeDelete: config.defaults?.onNodeDelete ?? \"restrict\",\n temporalMode: config.defaults?.temporalMode ?? \"current\",\n } as const;\n\n const normalizedEdges = normalizeEdges(config.edges);\n\n return Object.freeze({\n [GRAPH_DEF_BRAND]: true as const,\n id: config.id,\n nodes: config.nodes,\n edges: normalizedEdges,\n ontology: config.ontology ?? ([] as unknown as TOntology),\n defaults,\n }) as GraphDef<TNodes, NormalizedEdges<TEdges>, TOntology>;\n}\n\n// ============================================================\n// Graph Definition Utilities\n// ============================================================\n\n/**\n * Checks if a value is a GraphDef.\n */\nexport function isGraphDef(value: unknown): value is GraphDef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n GRAPH_DEF_BRAND in value &&\n (value as Record<string, unknown>)[GRAPH_DEF_BRAND] === true\n );\n}\n\n/**\n * Gets all node type names from a GraphDef.\n */\nexport function getNodeTypeNames<G extends GraphDef>(\n graph: G,\n): readonly string[] {\n return Object.keys(graph.nodes);\n}\n\n/**\n * Gets all edge type names from a GraphDef.\n */\nexport function getEdgeTypeNames<G extends GraphDef>(\n graph: G,\n): readonly string[] {\n return Object.keys(graph.edges);\n}\n","/**\n * Date encoding utilities for consistent storage.\n *\n * Contract: All dates are stored as ISO 8601 strings in UTC.\n * - Always includes milliseconds\n * - Always UTC (Z suffix)\n * - Sorts correctly as strings\n */\n\nimport { ValidationError } from \"../errors\";\n\n/**\n * ISO 8601 datetime pattern.\n * Matches formats like:\n * - 2024-01-15T10:30:00.000Z\n * - 2024-01-15T10:30:00Z\n * - 2024-01-15T10:30:00.123Z\n */\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$/;\n\n/**\n * Checks if a string is a valid ISO 8601 datetime.\n *\n * @param value - String to validate\n * @returns True if valid ISO 8601 datetime\n */\nexport function isValidIsoDate(value: string): boolean {\n if (!ISO_DATE_PATTERN.test(value)) {\n return false;\n }\n // Also check that Date parsing produces a valid date\n const date = new Date(value);\n return !Number.isNaN(date.getTime());\n}\n\n/**\n * Validates that a string is a valid ISO 8601 datetime.\n * Throws ValidationError if invalid.\n *\n * @param value - String to validate\n * @param fieldName - Name of field for error message\n * @returns The validated string\n * @throws ValidationError if not a valid ISO datetime\n */\nexport function validateIsoDate(value: string, fieldName: string): string {\n if (!isValidIsoDate(value)) {\n throw new ValidationError(\n `Invalid ISO 8601 datetime for \"${fieldName}\": \"${value}\". ` +\n `Expected format: YYYY-MM-DDTHH:mm:ss.sssZ`,\n {\n issues: [\n {\n path: fieldName,\n message: `Invalid ISO 8601 datetime format. Expected: YYYY-MM-DDTHH:mm:ss.sssZ, got: \"${value}\"`,\n },\n ],\n },\n {\n suggestion: `Use a valid ISO 8601 UTC datetime like \"2024-01-15T10:30:00.000Z\"`,\n },\n );\n }\n return value;\n}\n\n/**\n * Validates an optional ISO date string.\n * Returns undefined if value is undefined, otherwise validates.\n */\nexport function validateOptionalIsoDate(\n value: string | undefined,\n fieldName: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return validateIsoDate(value, fieldName);\n}\n\n/**\n * Encodes a Date to an ISO 8601 string for storage.\n */\nexport function encodeDate(date: Date): string {\n return date.toISOString();\n}\n\n/**\n * Decodes an ISO 8601 string to a Date.\n * Validates the string format first.\n *\n * @throws ValidationError if not a valid ISO datetime\n */\nexport function decodeDate(isoString: string): Date {\n validateIsoDate(isoString, \"date\");\n return new Date(isoString);\n}\n\n/**\n * Returns the current timestamp as an ISO string.\n */\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n"]}