@nicia-ai/typegraph 0.28.0 → 0.29.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 (174) hide show
  1. package/dist/backend/postgres/index.cjs +23 -761
  2. package/dist/backend/postgres/index.cjs.map +1 -1
  3. package/dist/backend/postgres/index.d.cts +24 -5
  4. package/dist/backend/postgres/index.d.ts +24 -5
  5. package/dist/backend/postgres/index.js +10 -752
  6. package/dist/backend/postgres/index.js.map +1 -1
  7. package/dist/backend/postgres/pglite.cjs +52 -0
  8. package/dist/backend/postgres/pglite.cjs.map +1 -0
  9. package/dist/backend/postgres/pglite.d.cts +116 -0
  10. package/dist/backend/postgres/pglite.d.ts +116 -0
  11. package/dist/backend/postgres/pglite.js +50 -0
  12. package/dist/backend/postgres/pglite.js.map +1 -0
  13. package/dist/backend/sqlite/index.cjs +22 -26
  14. package/dist/backend/sqlite/index.d.cts +17 -15
  15. package/dist/backend/sqlite/index.d.ts +17 -15
  16. package/dist/backend/sqlite/index.js +9 -9
  17. package/dist/backend/sqlite/libsql.cjs +17 -13
  18. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  19. package/dist/backend/sqlite/libsql.d.cts +3 -3
  20. package/dist/backend/sqlite/libsql.d.ts +3 -3
  21. package/dist/backend/sqlite/libsql.js +16 -12
  22. package/dist/backend/sqlite/libsql.js.map +1 -1
  23. package/dist/backend/sqlite/local.cjs +17 -16
  24. package/dist/backend/sqlite/local.cjs.map +1 -1
  25. package/dist/backend/sqlite/local.d.cts +3 -3
  26. package/dist/backend/sqlite/local.d.ts +3 -3
  27. package/dist/backend/sqlite/local.js +15 -14
  28. package/dist/backend/sqlite/local.js.map +1 -1
  29. package/dist/{chunk-DFHLG75V.js → chunk-3DTLDGIM.js} +386 -1093
  30. package/dist/chunk-3DTLDGIM.js.map +1 -0
  31. package/dist/{chunk-WVQXAFP3.js → chunk-454I6GDF.js} +46 -5
  32. package/dist/chunk-454I6GDF.js.map +1 -0
  33. package/dist/chunk-4K6IHUW6.cjs +183 -0
  34. package/dist/chunk-4K6IHUW6.cjs.map +1 -0
  35. package/dist/{chunk-ZTREJOGB.js → chunk-7KLVFWXR.js} +113 -68
  36. package/dist/chunk-7KLVFWXR.js.map +1 -0
  37. package/dist/{chunk-UKG7XHZ3.js → chunk-A4H6QMV4.js} +110 -102
  38. package/dist/chunk-A4H6QMV4.js.map +1 -0
  39. package/dist/{chunk-E5ROA3MN.js → chunk-BMDF2S7S.js} +3 -3
  40. package/dist/{chunk-E5ROA3MN.js.map → chunk-BMDF2S7S.js.map} +1 -1
  41. package/dist/{chunk-PN37HVAV.cjs → chunk-C2RWFIYP.cjs} +121 -67
  42. package/dist/chunk-C2RWFIYP.cjs.map +1 -0
  43. package/dist/chunk-CUZGBWFT.js +206 -0
  44. package/dist/chunk-CUZGBWFT.js.map +1 -0
  45. package/dist/chunk-F2Q76CQ4.cjs +266 -0
  46. package/dist/chunk-F2Q76CQ4.cjs.map +1 -0
  47. package/dist/{chunk-YEDQLNVE.cjs → chunk-G6P3OVDY.cjs} +14 -2
  48. package/dist/chunk-G6P3OVDY.cjs.map +1 -0
  49. package/dist/chunk-GPUNAJFH.js +181 -0
  50. package/dist/chunk-GPUNAJFH.js.map +1 -0
  51. package/dist/chunk-HKN622O4.js +254 -0
  52. package/dist/chunk-HKN622O4.js.map +1 -0
  53. package/dist/{chunk-PYJOBZR3.cjs → chunk-HM6XMR3E.cjs} +52 -52
  54. package/dist/chunk-HM6XMR3E.cjs.map +1 -0
  55. package/dist/chunk-IE2TPFBT.js +305 -0
  56. package/dist/chunk-IE2TPFBT.js.map +1 -0
  57. package/dist/chunk-KGAJ5HFO.cjs +319 -0
  58. package/dist/chunk-KGAJ5HFO.cjs.map +1 -0
  59. package/dist/chunk-M6OC455F.js +65 -0
  60. package/dist/chunk-M6OC455F.js.map +1 -0
  61. package/dist/{chunk-U5ROKVRF.js → chunk-MB363HT5.js} +14 -3
  62. package/dist/chunk-MB363HT5.js.map +1 -0
  63. package/dist/{chunk-X53YKGHR.js → chunk-MRMD7S7E.js} +9 -9
  64. package/dist/{chunk-X53YKGHR.js.map → chunk-MRMD7S7E.js.map} +1 -1
  65. package/dist/{chunk-OOS2RKRH.js → chunk-N3VVQDMA.js} +3 -3
  66. package/dist/{chunk-OOS2RKRH.js.map → chunk-N3VVQDMA.js.map} +1 -1
  67. package/dist/{chunk-EJCDOA37.js → chunk-OGUH56BB.js} +4 -4
  68. package/dist/{chunk-EJCDOA37.js.map → chunk-OGUH56BB.js.map} +1 -1
  69. package/dist/chunk-Q3ZZLU3O.cjs +12 -0
  70. package/dist/{chunk-4FJVSF3K.cjs.map → chunk-Q3ZZLU3O.cjs.map} +1 -1
  71. package/dist/chunk-Q5ASTPM4.cjs +208 -0
  72. package/dist/chunk-Q5ASTPM4.cjs.map +1 -0
  73. package/dist/{chunk-WFUN6DCM.cjs → chunk-R2LA6MKR.cjs} +11 -11
  74. package/dist/chunk-R2LA6MKR.cjs.map +1 -0
  75. package/dist/chunk-RP7YITHX.cjs +70 -0
  76. package/dist/chunk-RP7YITHX.cjs.map +1 -0
  77. package/dist/{chunk-33K3ZYFG.cjs → chunk-RU5BBUU2.cjs} +132 -124
  78. package/dist/chunk-RU5BBUU2.cjs.map +1 -0
  79. package/dist/{chunk-TSGBRPNE.js → chunk-SFNUHFON.js} +45 -45
  80. package/dist/chunk-SFNUHFON.js.map +1 -0
  81. package/dist/chunk-UP4QAJND.cjs +740 -0
  82. package/dist/chunk-UP4QAJND.cjs.map +1 -0
  83. package/dist/{chunk-CTHNVU6K.cjs → chunk-UPBXUOW7.cjs} +8 -8
  84. package/dist/{chunk-CTHNVU6K.cjs.map → chunk-UPBXUOW7.cjs.map} +1 -1
  85. package/dist/{chunk-EK6RJ373.cjs → chunk-VGU26WIU.cjs} +5 -5
  86. package/dist/{chunk-EK6RJ373.cjs.map → chunk-VGU26WIU.cjs.map} +1 -1
  87. package/dist/{chunk-ZGEMI7MJ.cjs → chunk-XTQHSOIC.cjs} +101 -101
  88. package/dist/{chunk-ZGEMI7MJ.cjs.map → chunk-XTQHSOIC.cjs.map} +1 -1
  89. package/dist/chunk-Y52UNT66.js +738 -0
  90. package/dist/chunk-Y52UNT66.js.map +1 -0
  91. package/dist/{chunk-OYLF3IC7.js → chunk-Z36W5WUM.js} +4 -4
  92. package/dist/chunk-Z36W5WUM.js.map +1 -0
  93. package/dist/{chunk-X3244EKP.cjs → chunk-ZFWNO3GE.cjs} +48 -4
  94. package/dist/chunk-ZFWNO3GE.cjs.map +1 -0
  95. package/dist/{chunk-2E4VTD2E.cjs → chunk-ZYQEXGYC.cjs} +423 -1139
  96. package/dist/chunk-ZYQEXGYC.cjs.map +1 -0
  97. package/dist/ddl-BwH00BB6.d.ts +38 -0
  98. package/dist/ddl-D3o-RmsV.d.cts +38 -0
  99. package/dist/{extension-types-B78CZfA5.d.ts → extension-types-CwHV-Uk4.d.cts} +4 -4
  100. package/dist/{extension-types-B78CZfA5.d.cts → extension-types-CwHV-Uk4.d.ts} +4 -4
  101. package/dist/graph-extension/index.cjs +18 -18
  102. package/dist/graph-extension/index.d.cts +4 -4
  103. package/dist/graph-extension/index.d.ts +4 -4
  104. package/dist/graph-extension/index.js +3 -3
  105. package/dist/{index-CWdBFWbI.d.ts → index-CapHwi1a.d.ts} +22 -3
  106. package/dist/{index-Bilw0pYm.d.cts → index-jPPexxM5.d.cts} +22 -3
  107. package/dist/index.cjs +1211 -945
  108. package/dist/index.cjs.map +1 -1
  109. package/dist/index.d.cts +142 -12
  110. package/dist/index.d.ts +142 -12
  111. package/dist/index.js +778 -544
  112. package/dist/index.js.map +1 -1
  113. package/dist/indexes/index.cjs +18 -18
  114. package/dist/indexes/index.d.cts +9 -9
  115. package/dist/indexes/index.d.ts +9 -9
  116. package/dist/indexes/index.js +4 -4
  117. package/dist/interchange/index.cjs +8 -14
  118. package/dist/interchange/index.cjs.map +1 -1
  119. package/dist/interchange/index.d.cts +5 -16
  120. package/dist/interchange/index.d.ts +5 -16
  121. package/dist/interchange/index.js +3 -9
  122. package/dist/interchange/index.js.map +1 -1
  123. package/dist/{manager-ehLTTNq0.d.ts → manager-BUugwCYz.d.ts} +2 -2
  124. package/dist/{manager-c1MGaVVR.d.cts → manager-DpIpn1HQ.d.cts} +2 -2
  125. package/dist/{materialize-indexes-DFavFQah.d.ts → materialize-indexes-lkawaDor.d.ts} +1 -1
  126. package/dist/{materialize-indexes-BQfaAZKA.d.cts → materialize-indexes-oanE3RU0.d.cts} +1 -1
  127. package/dist/{ddl-0Ooc2dpL.d.ts → postgres-CQL9UIn2.d.cts} +2 -471
  128. package/dist/{ddl-Dza3kDrI.d.cts → postgres-CcRLaxz0.d.ts} +2 -471
  129. package/dist/profiler/index.cjs +4 -4
  130. package/dist/profiler/index.d.cts +7 -7
  131. package/dist/profiler/index.d.ts +7 -7
  132. package/dist/profiler/index.js +2 -2
  133. package/dist/schema/index.cjs +32 -32
  134. package/dist/schema/index.d.cts +7 -7
  135. package/dist/schema/index.d.ts +7 -7
  136. package/dist/schema/index.js +9 -9
  137. package/dist/{sqlite-BxZUPbyD.d.ts → sqlite-CZDFUfHS.d.ts} +2 -468
  138. package/dist/{sqlite-mvpXjEeB.d.cts → sqlite-Rj3xu4It.d.cts} +2 -468
  139. package/dist/{store-Ufc1Eoey.d.ts → store-B43FpOVX.d.cts} +84 -5
  140. package/dist/{store-D7YEMg2v.d.cts → store-De0Y33wP.d.ts} +84 -5
  141. package/dist/{types-B-sJJ4GQ.d.ts → types-B5GSeE3t.d.ts} +2 -2
  142. package/dist/{types-CmUA9sal.d.cts → types-Bwlp_yvu.d.cts} +2 -2
  143. package/dist/{types-CMQymcwk.d.cts → types-CmAT-Z47.d.ts} +250 -46
  144. package/dist/{types-CQ7xXJMP.d.ts → types-DXCSyxac.d.cts} +250 -46
  145. package/dist/{where-5zf15aFZ.d.cts → where-2dsyYt3d.d.cts} +2 -2
  146. package/dist/{where-CtrLu1Zf.d.ts → where-CP4qGIHd.d.ts} +2 -2
  147. package/package.json +20 -5
  148. package/dist/chunk-2E4VTD2E.cjs.map +0 -1
  149. package/dist/chunk-33K3ZYFG.cjs.map +0 -1
  150. package/dist/chunk-3EUKJEQ3.js +0 -77
  151. package/dist/chunk-3EUKJEQ3.js.map +0 -1
  152. package/dist/chunk-4FJVSF3K.cjs +0 -12
  153. package/dist/chunk-5H3BAMTB.js +0 -32
  154. package/dist/chunk-5H3BAMTB.js.map +0 -1
  155. package/dist/chunk-DFHLG75V.js.map +0 -1
  156. package/dist/chunk-HTGDWIDE.cjs +0 -89
  157. package/dist/chunk-HTGDWIDE.cjs.map +0 -1
  158. package/dist/chunk-IUIWCFG3.cjs +0 -36
  159. package/dist/chunk-IUIWCFG3.cjs.map +0 -1
  160. package/dist/chunk-LYRUNG6E.cjs +0 -52
  161. package/dist/chunk-LYRUNG6E.cjs.map +0 -1
  162. package/dist/chunk-OYLF3IC7.js.map +0 -1
  163. package/dist/chunk-PCHTTG42.js +0 -47
  164. package/dist/chunk-PCHTTG42.js.map +0 -1
  165. package/dist/chunk-PN37HVAV.cjs.map +0 -1
  166. package/dist/chunk-PYJOBZR3.cjs.map +0 -1
  167. package/dist/chunk-TSGBRPNE.js.map +0 -1
  168. package/dist/chunk-U5ROKVRF.js.map +0 -1
  169. package/dist/chunk-UKG7XHZ3.js.map +0 -1
  170. package/dist/chunk-WFUN6DCM.cjs.map +0 -1
  171. package/dist/chunk-WVQXAFP3.js.map +0 -1
  172. package/dist/chunk-X3244EKP.cjs.map +0 -1
  173. package/dist/chunk-YEDQLNVE.cjs.map +0 -1
  174. package/dist/chunk-ZTREJOGB.js.map +0 -1
@@ -0,0 +1,206 @@
1
+ import { quoteIdentifier, quotedTableName, vectorScoreExpression, vectorMinScoreCondition, VECTOR_CONTRIBUTION_PREFIX, vectorPhysicalName, assertFiniteEmbedding } from './chunk-7KLVFWXR.js';
2
+ import { sql } from 'drizzle-orm';
3
+
4
+ var TABLE_PREFIX = "tg_vec";
5
+ var INDEX_PREFIX = "tg_vecidx";
6
+ var LIBSQL_MAX_DIMENSIONS = 65536;
7
+ var LIBSQL_CAPABILITIES = {
8
+ supported: true,
9
+ metrics: ["cosine", "l2"],
10
+ // "hnsw" = portable ANN intent, realized as DiskANN. "none" = brute-force.
11
+ indexTypes: ["hnsw", "none"],
12
+ maxDimensions: LIBSQL_MAX_DIMENSIONS
13
+ };
14
+ function usesAnnIndex(slot) {
15
+ return slot.indexType === "hnsw";
16
+ }
17
+ function libsqlMetricToken(metric) {
18
+ switch (metric) {
19
+ case "cosine": {
20
+ return "cosine";
21
+ }
22
+ case "l2": {
23
+ return "l2";
24
+ }
25
+ case "inner_product": {
26
+ throw new Error(
27
+ "libSQL vector search does not support inner_product. Use 'cosine' or 'l2'."
28
+ );
29
+ }
30
+ default: {
31
+ const _exhaustive = metric;
32
+ throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);
33
+ }
34
+ }
35
+ }
36
+ function vector32Literal(embedding, name) {
37
+ assertFiniteEmbedding(embedding, name);
38
+ return sql`vector32(${`[${embedding.join(",")}]`})`;
39
+ }
40
+ function distanceExpression(embeddingColumn, queryEmbedding, metric) {
41
+ const query = vector32Literal(queryEmbedding, "queryEmbedding");
42
+ switch (metric) {
43
+ case "cosine": {
44
+ return sql`vector_distance_cos(${embeddingColumn}, ${query})`;
45
+ }
46
+ case "l2": {
47
+ return sql`vector_distance_l2(${embeddingColumn}, ${query})`;
48
+ }
49
+ case "inner_product": {
50
+ throw new Error(
51
+ "libSQL vector search does not support inner_product. Use 'cosine' or 'l2'."
52
+ );
53
+ }
54
+ default: {
55
+ const _exhaustive = metric;
56
+ throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);
57
+ }
58
+ }
59
+ }
60
+ var libsqlVectorStrategy = {
61
+ name: "libsql-native",
62
+ capabilities: LIBSQL_CAPABILITIES,
63
+ tableName(graphId, nodeKind, fieldPath) {
64
+ return vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
65
+ },
66
+ ownedTables(slot) {
67
+ const table = this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
68
+ const name = quoteIdentifier(table);
69
+ const createDdl = [
70
+ `CREATE TABLE IF NOT EXISTS ${name} (
71
+ "graph_id" TEXT NOT NULL,
72
+ "node_id" TEXT NOT NULL,
73
+ "embedding" F32_BLOB(${slot.dimensions}) NOT NULL,
74
+ "created_at" TEXT NOT NULL,
75
+ "updated_at" TEXT NOT NULL,
76
+ PRIMARY KEY ("graph_id", "node_id")
77
+ );`
78
+ ];
79
+ if (usesAnnIndex(slot)) {
80
+ createDdl.push(libsqlVectorIndexDdl(table, slot));
81
+ }
82
+ return [
83
+ {
84
+ logicalName: `${VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,
85
+ owner: "libsql-native",
86
+ tableName: table,
87
+ createDdl,
88
+ runtimeEnsure: true
89
+ }
90
+ ];
91
+ },
92
+ buildUpsert(slot, params, timestamp) {
93
+ const table = quotedTableName(
94
+ this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
95
+ );
96
+ const value = vector32Literal(params.embedding, "embedding");
97
+ return [
98
+ sql`
99
+ INSERT INTO ${table} ("graph_id", "node_id", "embedding", "created_at", "updated_at")
100
+ VALUES (${params.graphId}, ${params.nodeId}, ${value}, ${timestamp}, ${timestamp})
101
+ ON CONFLICT ("graph_id", "node_id")
102
+ DO UPDATE SET "embedding" = ${value}, "updated_at" = ${timestamp}
103
+ `
104
+ ];
105
+ },
106
+ buildDelete(slot, params) {
107
+ const table = quotedTableName(
108
+ this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
109
+ );
110
+ return [
111
+ sql`
112
+ DELETE FROM ${table}
113
+ WHERE "graph_id" = ${params.graphId} AND "node_id" = ${params.nodeId}
114
+ `
115
+ ];
116
+ },
117
+ buildSearch(slot, params) {
118
+ const table = this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
119
+ const quoted = quotedTableName(table);
120
+ const embeddingColumn = sql`${quoted}."embedding"`;
121
+ const distance = distanceExpression(
122
+ embeddingColumn,
123
+ params.queryEmbedding,
124
+ params.metric
125
+ );
126
+ const score = vectorScoreExpression(distance, params.metric);
127
+ if (usesAnnIndex(slot)) {
128
+ const indexName = libsqlIndexName(slot);
129
+ const query = vector32Literal(params.queryEmbedding, "queryEmbedding");
130
+ const conditions2 = [sql`${quoted}."graph_id" = ${params.graphId}`];
131
+ if (params.minScore !== void 0) {
132
+ conditions2.push(
133
+ vectorMinScoreCondition(distance, params.metric, params.minScore)
134
+ );
135
+ }
136
+ return sql`
137
+ SELECT ${quoted}."node_id" AS node_id, ${score} AS score
138
+ FROM vector_top_k(${indexName}, ${query}, ${params.limit})
139
+ JOIN ${quoted} ON ${quoted}.rowid = id
140
+ WHERE ${sql.join(conditions2, sql` AND `)}
141
+ ORDER BY ${distance} ASC
142
+ LIMIT ${params.limit}
143
+ `;
144
+ }
145
+ const conditions = [sql`${quoted}."graph_id" = ${params.graphId}`];
146
+ if (params.minScore !== void 0) {
147
+ conditions.push(
148
+ vectorMinScoreCondition(distance, params.metric, params.minScore)
149
+ );
150
+ }
151
+ return sql`
152
+ SELECT ${quoted}."node_id" AS node_id, ${score} AS score
153
+ FROM ${quoted}
154
+ WHERE ${sql.join(conditions, sql` AND `)}
155
+ ORDER BY ${distance} ASC
156
+ LIMIT ${params.limit}
157
+ `;
158
+ },
159
+ distanceExpression(embeddingColumn, queryEmbedding, metric) {
160
+ return distanceExpression(embeddingColumn, queryEmbedding, metric);
161
+ },
162
+ buildCreateIndex(slot) {
163
+ if (!usesAnnIndex(slot)) return void 0;
164
+ return sql.raw(
165
+ libsqlVectorIndexDdl(
166
+ this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath),
167
+ slot
168
+ )
169
+ );
170
+ },
171
+ buildDropIndex(slot) {
172
+ if (!usesAnnIndex(slot)) return void 0;
173
+ const indexName = libsqlIndexName(slot);
174
+ return sql.raw(`DROP INDEX IF EXISTS ${quoteIdentifier(indexName)}`);
175
+ },
176
+ buildDropStorage(slot) {
177
+ const table = quoteIdentifier(
178
+ this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
179
+ );
180
+ const statements = [];
181
+ if (usesAnnIndex(slot)) {
182
+ statements.push(
183
+ `DROP INDEX IF EXISTS ${quoteIdentifier(libsqlIndexName(slot))}`
184
+ );
185
+ }
186
+ statements.push(`DROP TABLE IF EXISTS ${table}`);
187
+ return statements;
188
+ }
189
+ };
190
+ function libsqlIndexName(slot) {
191
+ return vectorPhysicalName(
192
+ INDEX_PREFIX,
193
+ slot.graphId,
194
+ slot.nodeKind,
195
+ slot.fieldPath
196
+ );
197
+ }
198
+ function libsqlVectorIndexDdl(table, slot) {
199
+ const indexName = quoteIdentifier(libsqlIndexName(slot));
200
+ const metric = libsqlMetricToken(slot.metric);
201
+ return `CREATE INDEX IF NOT EXISTS ${indexName} ON ${quoteIdentifier(table)}(libsql_vector_idx("embedding", 'metric=${metric}'));`;
202
+ }
203
+
204
+ export { libsqlVectorStrategy };
205
+ //# sourceMappingURL=chunk-CUZGBWFT.js.map
206
+ //# sourceMappingURL=chunk-CUZGBWFT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query/dialect/vector/libsql-strategy.ts"],"names":["conditions"],"mappings":"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","file":"chunk-CUZGBWFT.js","sourcesContent":["/**\n * libSQL native vector strategy.\n *\n * libSQL ships vector search in core — no extension to load — so this\n * strategy is wired unconditionally by `createLibsqlBackend`. It backs each\n * `(nodeKind, fieldPath)` with its own `F32_BLOB(N)` table (the spike proved\n * the dimension MUST live in the column type for `libsql_vector_idx` to\n * build), brute-forces with `vector_distance_cos` / `vector_distance_l2`, and\n * accelerates with DiskANN (`libsql_vector_idx` + `vector_top_k`) when the\n * slot declares an approximate index.\n *\n * Metric support is `cosine` + `l2` (no `inner_product`), matching sqlite-vec\n * and advertised as data on `capabilities`. The generic `\"hnsw\"` index intent\n * (the portable \"give me an ANN index\" signal that `embedding()` defaults to)\n * is realized here as libSQL's DiskANN index; `\"ivfflat\"` is not supported and\n * a slot declaring it is materialized brute-force-only.\n *\n * The `pgvectorStrategy` and `sqliteVecStrategy` siblings follow the same\n * `VectorStrategy` contract for their engines.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { quotedTableName } from \"../../../backend/drizzle/operations/shared\";\nimport { type StrategyTableContribution } from \"../../../backend/table-contribution\";\nimport {\n type DeleteEmbeddingParams,\n type UpsertEmbeddingParams,\n type VectorCapabilities,\n type VectorMetric,\n type VectorSearchParams,\n} from \"../../../backend/types\";\nimport {\n assertFiniteEmbedding,\n quoteIdentifier,\n VECTOR_CONTRIBUTION_PREFIX,\n vectorMinScoreCondition,\n vectorPhysicalName,\n vectorScoreExpression,\n type VectorSlot,\n type VectorStrategy,\n} from \"../vector-strategy\";\n\n/** Physical-name prefixes for the per-field table and its DiskANN index. */\nconst TABLE_PREFIX = \"tg_vec\";\nconst INDEX_PREFIX = \"tg_vecidx\";\n\n/**\n * libSQL `F32_BLOB` caps at 65,536 dimensions (per Turso docs / spike §2).\n */\nconst LIBSQL_MAX_DIMENSIONS = 65_536;\n\nconst LIBSQL_CAPABILITIES: VectorCapabilities = {\n supported: true,\n metrics: [\"cosine\", \"l2\"],\n // \"hnsw\" = portable ANN intent, realized as DiskANN. \"none\" = brute-force.\n indexTypes: [\"hnsw\", \"none\"],\n maxDimensions: LIBSQL_MAX_DIMENSIONS,\n};\n\n/** Whether a slot's declared index type maps to a real libSQL ANN index. */\nfunction usesAnnIndex(slot: VectorSlot): boolean {\n return slot.indexType === \"hnsw\";\n}\n\n/** libSQL metric token accepted by `libsql_vector_idx(col, 'metric=…')`. */\nfunction libsqlMetricToken(metric: VectorMetric): string {\n switch (metric) {\n case \"cosine\": {\n return \"cosine\";\n }\n case \"l2\": {\n return \"l2\";\n }\n case \"inner_product\": {\n throw new Error(\n \"libSQL vector search does not support inner_product. Use 'cosine' or 'l2'.\",\n );\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\n/**\n * Formats an embedding as the text argument to `vector32(...)`. The value is\n * bound as a parameter (not interpolated) — `vector32` parses it into the\n * F32 blob. Finiteness is validated first so a NaN names its index.\n */\nfunction vector32Literal(embedding: readonly number[], name: string): SQL {\n assertFiniteEmbedding(embedding, name);\n return sql`vector32(${`[${embedding.join(\",\")}]`})`;\n}\n\nfunction distanceExpression(\n embeddingColumn: SQL,\n queryEmbedding: readonly number[],\n metric: VectorMetric,\n): SQL {\n const query = vector32Literal(queryEmbedding, \"queryEmbedding\");\n switch (metric) {\n case \"cosine\": {\n return sql`vector_distance_cos(${embeddingColumn}, ${query})`;\n }\n case \"l2\": {\n return sql`vector_distance_l2(${embeddingColumn}, ${query})`;\n }\n case \"inner_product\": {\n throw new Error(\n \"libSQL vector search does not support inner_product. Use 'cosine' or 'l2'.\",\n );\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\nexport const libsqlVectorStrategy: VectorStrategy = {\n name: \"libsql-native\",\n capabilities: LIBSQL_CAPABILITIES,\n\n tableName(graphId, nodeKind, fieldPath) {\n return vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);\n },\n\n ownedTables(slot): readonly StrategyTableContribution[] {\n const table = this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath);\n const name = quoteIdentifier(table);\n\n // No standalone graph_id index: the PRIMARY KEY (graph_id, node_id) already\n // covers `WHERE graph_id = ?` via its leading column, so a separate index\n // would be pure write amplification.\n const createDdl = [\n `CREATE TABLE IF NOT EXISTS ${name} (\n \"graph_id\" TEXT NOT NULL,\n \"node_id\" TEXT NOT NULL,\n \"embedding\" F32_BLOB(${slot.dimensions}) NOT NULL,\n \"created_at\" TEXT NOT NULL,\n \"updated_at\" TEXT NOT NULL,\n PRIMARY KEY (\"graph_id\", \"node_id\")\n);`,\n ];\n\n if (usesAnnIndex(slot)) {\n // The DiskANN index DDL is deterministic raw SQL; fold it into the\n // contribution so materialization creates table + index together.\n createDdl.push(libsqlVectorIndexDdl(table, slot));\n }\n\n return [\n {\n logicalName: `${VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,\n owner: \"libsql-native\",\n tableName: table,\n createDdl,\n runtimeEnsure: true,\n },\n ];\n },\n\n buildUpsert(slot, params: UpsertEmbeddingParams, timestamp): readonly SQL[] {\n const table = quotedTableName(\n this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const value = vector32Literal(params.embedding, \"embedding\");\n return [\n sql`\n INSERT INTO ${table} (\"graph_id\", \"node_id\", \"embedding\", \"created_at\", \"updated_at\")\n VALUES (${params.graphId}, ${params.nodeId}, ${value}, ${timestamp}, ${timestamp})\n ON CONFLICT (\"graph_id\", \"node_id\")\n DO UPDATE SET \"embedding\" = ${value}, \"updated_at\" = ${timestamp}\n `,\n ];\n },\n\n buildDelete(slot, params: DeleteEmbeddingParams): readonly SQL[] {\n const table = quotedTableName(\n this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n return [\n sql`\n DELETE FROM ${table}\n WHERE \"graph_id\" = ${params.graphId} AND \"node_id\" = ${params.nodeId}\n `,\n ];\n },\n\n buildSearch(slot, params: VectorSearchParams): SQL {\n const table = this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath);\n const quoted = quotedTableName(table);\n const embeddingColumn = sql`${quoted}.\"embedding\"`;\n const distance = distanceExpression(\n embeddingColumn,\n params.queryEmbedding,\n params.metric,\n );\n const score = vectorScoreExpression(distance, params.metric);\n\n if (usesAnnIndex(slot)) {\n // DiskANN: vector_top_k returns rowids from the per-field table; join\n // back, then scope by graph and compute the real distance/score.\n // `vector_top_k` is table-global, so single-graph deployments are exact;\n // multi-graph recall is bounded by the over-fetched k (documented).\n const indexName = libsqlIndexName(slot);\n const query = vector32Literal(params.queryEmbedding, \"queryEmbedding\");\n const conditions: SQL[] = [sql`${quoted}.\"graph_id\" = ${params.graphId}`];\n if (params.minScore !== undefined) {\n conditions.push(\n vectorMinScoreCondition(distance, params.metric, params.minScore),\n );\n }\n return sql`\n SELECT ${quoted}.\"node_id\" AS node_id, ${score} AS score\n FROM vector_top_k(${indexName}, ${query}, ${params.limit})\n JOIN ${quoted} ON ${quoted}.rowid = id\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distance} ASC\n LIMIT ${params.limit}\n `;\n }\n\n // Brute-force scan.\n const conditions: SQL[] = [sql`${quoted}.\"graph_id\" = ${params.graphId}`];\n if (params.minScore !== undefined) {\n conditions.push(\n vectorMinScoreCondition(distance, params.metric, params.minScore),\n );\n }\n return sql`\n SELECT ${quoted}.\"node_id\" AS node_id, ${score} AS score\n FROM ${quoted}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distance} ASC\n LIMIT ${params.limit}\n `;\n },\n\n distanceExpression(embeddingColumn, queryEmbedding, metric) {\n return distanceExpression(embeddingColumn, queryEmbedding, metric);\n },\n\n buildCreateIndex(slot): SQL | undefined {\n if (!usesAnnIndex(slot)) return undefined;\n return sql.raw(\n libsqlVectorIndexDdl(\n this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n slot,\n ),\n );\n },\n\n buildDropIndex(slot): SQL | undefined {\n if (!usesAnnIndex(slot)) return undefined;\n const indexName = libsqlIndexName(slot);\n return sql.raw(`DROP INDEX IF EXISTS ${quoteIdentifier(indexName)}`);\n },\n\n buildDropStorage(slot): readonly string[] {\n const table = quoteIdentifier(\n this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const statements: string[] = [];\n // Drop the DiskANN index first so libSQL reclaims its shadow tables,\n // then the table itself.\n if (usesAnnIndex(slot)) {\n statements.push(\n `DROP INDEX IF EXISTS ${quoteIdentifier(libsqlIndexName(slot))}`,\n );\n }\n statements.push(`DROP TABLE IF EXISTS ${table}`);\n return statements;\n },\n};\n\nfunction libsqlIndexName(slot: VectorSlot): string {\n return vectorPhysicalName(\n INDEX_PREFIX,\n slot.graphId,\n slot.nodeKind,\n slot.fieldPath,\n );\n}\n\nfunction libsqlVectorIndexDdl(table: string, slot: VectorSlot): string {\n const indexName = quoteIdentifier(libsqlIndexName(slot));\n const metric = libsqlMetricToken(slot.metric);\n return `CREATE INDEX IF NOT EXISTS ${indexName} ON ${quoteIdentifier(table)}(libsql_vector_idx(\"embedding\", 'metric=${metric}'));`;\n}\n"]}
@@ -0,0 +1,266 @@
1
+ 'use strict';
2
+
3
+ var chunkC2RWFIYP_cjs = require('./chunk-C2RWFIYP.cjs');
4
+ var drizzleOrm = require('drizzle-orm');
5
+ var sqliteCore = require('drizzle-orm/sqlite-core');
6
+
7
+ var LEGACY_EMBEDDINGS_TABLE_NAME = "typegraph_node_embeddings";
8
+ var DEFAULT_TABLE_NAMES = {
9
+ nodes: "typegraph_nodes",
10
+ edges: "typegraph_edges",
11
+ uniques: "typegraph_node_uniques",
12
+ schemaVersions: "typegraph_schema_versions",
13
+ fulltext: "typegraph_node_fulltext",
14
+ indexMaterializations: "typegraph_index_materializations",
15
+ contributionMaterializations: "typegraph_contribution_materializations",
16
+ kindRemovals: "typegraph_kind_removals",
17
+ reconciliationMarkers: "typegraph_reconciliation_markers"
18
+ };
19
+ function createSqliteTables(names = {}, options = {}) {
20
+ const n = { ...DEFAULT_TABLE_NAMES, ...names };
21
+ const indexes = options.indexes ?? [];
22
+ const nodes2 = sqliteCore.sqliteTable(
23
+ n.nodes,
24
+ {
25
+ graphId: sqliteCore.text("graph_id").notNull(),
26
+ kind: sqliteCore.text("kind").notNull(),
27
+ id: sqliteCore.text("id").notNull(),
28
+ props: sqliteCore.text("props").notNull(),
29
+ version: sqliteCore.integer("version").notNull().default(1),
30
+ validFrom: sqliteCore.text("valid_from"),
31
+ validTo: sqliteCore.text("valid_to"),
32
+ createdAt: sqliteCore.text("created_at").notNull(),
33
+ updatedAt: sqliteCore.text("updated_at").notNull(),
34
+ deletedAt: sqliteCore.text("deleted_at")
35
+ },
36
+ (t) => [
37
+ sqliteCore.primaryKey({ columns: [t.graphId, t.kind, t.id] }),
38
+ sqliteCore.index(`${n.nodes}_kind_idx`).on(t.graphId, t.kind),
39
+ sqliteCore.index(`${n.nodes}_kind_created_idx`).on(
40
+ t.graphId,
41
+ t.kind,
42
+ t.deletedAt,
43
+ t.createdAt
44
+ ),
45
+ sqliteCore.index(`${n.nodes}_deleted_idx`).on(t.graphId, t.deletedAt),
46
+ sqliteCore.index(`${n.nodes}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),
47
+ ...chunkC2RWFIYP_cjs.buildSqliteNodeIndexBuilders(t, indexes)
48
+ ]
49
+ );
50
+ const edges2 = sqliteCore.sqliteTable(
51
+ n.edges,
52
+ {
53
+ graphId: sqliteCore.text("graph_id").notNull(),
54
+ id: sqliteCore.text("id").notNull(),
55
+ kind: sqliteCore.text("kind").notNull(),
56
+ fromKind: sqliteCore.text("from_kind").notNull(),
57
+ fromId: sqliteCore.text("from_id").notNull(),
58
+ toKind: sqliteCore.text("to_kind").notNull(),
59
+ toId: sqliteCore.text("to_id").notNull(),
60
+ props: sqliteCore.text("props").notNull(),
61
+ validFrom: sqliteCore.text("valid_from"),
62
+ validTo: sqliteCore.text("valid_to"),
63
+ createdAt: sqliteCore.text("created_at").notNull(),
64
+ updatedAt: sqliteCore.text("updated_at").notNull(),
65
+ deletedAt: sqliteCore.text("deleted_at")
66
+ },
67
+ (t) => [
68
+ sqliteCore.primaryKey({ columns: [t.graphId, t.id] }),
69
+ sqliteCore.index(`${n.edges}_kind_idx`).on(t.graphId, t.kind),
70
+ // Directional traversal index (outgoing): supports endpoint lookups
71
+ // and extra filtering by edge kind / target kind.
72
+ sqliteCore.index(`${n.edges}_from_idx`).on(
73
+ t.graphId,
74
+ t.fromKind,
75
+ t.fromId,
76
+ t.kind,
77
+ t.toKind,
78
+ t.deletedAt,
79
+ t.validTo
80
+ ),
81
+ // Directional traversal index (incoming): mirrors from_idx for reverse traversals.
82
+ sqliteCore.index(`${n.edges}_to_idx`).on(
83
+ t.graphId,
84
+ t.toKind,
85
+ t.toId,
86
+ t.kind,
87
+ t.fromKind,
88
+ t.deletedAt,
89
+ t.validTo
90
+ ),
91
+ sqliteCore.index(`${n.edges}_kind_created_idx`).on(
92
+ t.graphId,
93
+ t.kind,
94
+ t.deletedAt,
95
+ t.createdAt
96
+ ),
97
+ sqliteCore.index(`${n.edges}_deleted_idx`).on(t.graphId, t.deletedAt),
98
+ sqliteCore.index(`${n.edges}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),
99
+ sqliteCore.index(`${n.edges}_cardinality_idx`).on(
100
+ t.graphId,
101
+ t.kind,
102
+ t.fromKind,
103
+ t.fromId,
104
+ t.validTo
105
+ ),
106
+ ...chunkC2RWFIYP_cjs.buildSqliteEdgeIndexBuilders(t, indexes)
107
+ ]
108
+ );
109
+ const uniques2 = sqliteCore.sqliteTable(
110
+ n.uniques,
111
+ {
112
+ graphId: sqliteCore.text("graph_id").notNull(),
113
+ nodeKind: sqliteCore.text("node_kind").notNull(),
114
+ constraintName: sqliteCore.text("constraint_name").notNull(),
115
+ key: sqliteCore.text("key").notNull(),
116
+ nodeId: sqliteCore.text("node_id").notNull(),
117
+ concreteKind: sqliteCore.text("concrete_kind").notNull(),
118
+ deletedAt: sqliteCore.text("deleted_at")
119
+ },
120
+ (t) => [
121
+ sqliteCore.primaryKey({
122
+ columns: [t.graphId, t.nodeKind, t.constraintName, t.key]
123
+ }),
124
+ sqliteCore.index(`${n.uniques}_node_idx`).on(t.graphId, t.concreteKind, t.nodeId)
125
+ ]
126
+ );
127
+ const schemaVersions2 = sqliteCore.sqliteTable(
128
+ n.schemaVersions,
129
+ {
130
+ graphId: sqliteCore.text("graph_id").notNull(),
131
+ version: sqliteCore.integer("version").notNull(),
132
+ schemaHash: sqliteCore.text("schema_hash").notNull(),
133
+ schemaDoc: sqliteCore.text("schema_doc").notNull(),
134
+ createdAt: sqliteCore.text("created_at").notNull(),
135
+ isActive: sqliteCore.integer("is_active", { mode: "boolean" }).notNull().default(false)
136
+ },
137
+ (t) => [
138
+ sqliteCore.primaryKey({ columns: [t.graphId, t.version] }),
139
+ sqliteCore.index(`${n.schemaVersions}_active_idx`).on(t.graphId, t.isActive),
140
+ // Partial unique index enforcing the "at most one active version
141
+ // per graph" invariant at the storage layer. Defense in depth
142
+ // against buggy backend implementations or out-of-band writes.
143
+ // Forces the deactivate-then-activate ordering used by
144
+ // `commitSchemaVersion` and `setActiveVersion`.
145
+ sqliteCore.uniqueIndex(`${n.schemaVersions}_one_active_per_graph_idx`).on(t.graphId).where(drizzleOrm.sql`${t.isActive} = 1`)
146
+ ]
147
+ );
148
+ const indexMaterializations = sqliteCore.sqliteTable(
149
+ n.indexMaterializations,
150
+ {
151
+ indexName: sqliteCore.text("index_name").notNull(),
152
+ graphId: sqliteCore.text("graph_id").notNull(),
153
+ entity: sqliteCore.text("entity").notNull(),
154
+ kind: sqliteCore.text("kind").notNull(),
155
+ signature: sqliteCore.text("signature").notNull(),
156
+ schemaVersion: sqliteCore.integer("schema_version").notNull(),
157
+ materializedAt: sqliteCore.text("materialized_at"),
158
+ lastAttemptedAt: sqliteCore.text("last_attempted_at").notNull(),
159
+ lastError: sqliteCore.text("last_error")
160
+ },
161
+ (t) => [sqliteCore.primaryKey({ columns: [t.indexName] })]
162
+ );
163
+ const kindRemovals = sqliteCore.sqliteTable(
164
+ n.kindRemovals,
165
+ {
166
+ graphId: sqliteCore.text("graph_id").notNull(),
167
+ kindName: sqliteCore.text("kind_name").notNull(),
168
+ entity: sqliteCore.text("entity").notNull(),
169
+ schemaVersion: sqliteCore.integer("schema_version").notNull(),
170
+ removedAt: sqliteCore.text("removed_at"),
171
+ lastAttemptedAt: sqliteCore.text("last_attempted_at").notNull(),
172
+ lastError: sqliteCore.text("last_error")
173
+ },
174
+ (t) => [
175
+ sqliteCore.primaryKey({
176
+ columns: [t.graphId, t.kindName, t.entity, t.schemaVersion]
177
+ })
178
+ ]
179
+ );
180
+ const reconciliationMarkers = sqliteCore.sqliteTable(
181
+ n.reconciliationMarkers,
182
+ {
183
+ graphId: sqliteCore.text("graph_id").notNull(),
184
+ reconciledToVersion: sqliteCore.integer("reconciled_to_version").notNull()
185
+ },
186
+ (t) => [sqliteCore.primaryKey({ columns: [t.graphId] })]
187
+ );
188
+ const contributionMaterializations = sqliteCore.sqliteTable(
189
+ n.contributionMaterializations,
190
+ {
191
+ graphId: sqliteCore.text("graph_id").notNull(),
192
+ logicalName: sqliteCore.text("logical_name").notNull(),
193
+ owner: sqliteCore.text("owner").notNull(),
194
+ tableName: sqliteCore.text("table_name").notNull(),
195
+ signature: sqliteCore.text("signature").notNull(),
196
+ materializedAt: sqliteCore.text("materialized_at"),
197
+ lastAttemptedAt: sqliteCore.text("last_attempted_at").notNull(),
198
+ lastError: sqliteCore.text("last_error")
199
+ },
200
+ (t) => [
201
+ sqliteCore.primaryKey({
202
+ columns: [t.graphId, t.logicalName, t.owner, t.tableName]
203
+ })
204
+ ]
205
+ );
206
+ return {
207
+ nodes: nodes2,
208
+ edges: edges2,
209
+ uniques: uniques2,
210
+ schemaVersions: schemaVersions2,
211
+ indexMaterializations,
212
+ contributionMaterializations,
213
+ kindRemovals,
214
+ reconciliationMarkers,
215
+ /**
216
+ * The fulltext storage is a FTS5 virtual table which Drizzle cannot
217
+ * represent. DDL is emitted as raw SQL and operations query it via
218
+ * `sql.raw()`.
219
+ */
220
+ fulltextTableName: n.fulltext
221
+ };
222
+ }
223
+ var tables = createSqliteTables();
224
+ var { nodes, edges, uniques, schemaVersions } = tables;
225
+
226
+ // src/backend/types.ts
227
+ function wrapWithManagedClose(backend, teardown) {
228
+ let isClosed = false;
229
+ return {
230
+ ...backend,
231
+ async close() {
232
+ if (isClosed) return;
233
+ isClosed = true;
234
+ await backend.close();
235
+ await teardown();
236
+ }
237
+ };
238
+ }
239
+ async function runOptionallyInTransaction(backend, fn, fallback) {
240
+ if (!backend.capabilities.transactions) {
241
+ return fn(fallback ?? backend);
242
+ }
243
+ return backend.transaction((tx) => fn(tx));
244
+ }
245
+ var SQLITE_CAPABILITIES = {
246
+ transactions: true
247
+ // SQLite supports transactions
248
+ };
249
+ var POSTGRES_CAPABILITIES = {
250
+ transactions: true
251
+ // PostgreSQL supports transactions
252
+ };
253
+
254
+ exports.LEGACY_EMBEDDINGS_TABLE_NAME = LEGACY_EMBEDDINGS_TABLE_NAME;
255
+ exports.POSTGRES_CAPABILITIES = POSTGRES_CAPABILITIES;
256
+ exports.SQLITE_CAPABILITIES = SQLITE_CAPABILITIES;
257
+ exports.createSqliteTables = createSqliteTables;
258
+ exports.edges = edges;
259
+ exports.nodes = nodes;
260
+ exports.runOptionallyInTransaction = runOptionallyInTransaction;
261
+ exports.schemaVersions = schemaVersions;
262
+ exports.tables = tables;
263
+ exports.uniques = uniques;
264
+ exports.wrapWithManagedClose = wrapWithManagedClose;
265
+ //# sourceMappingURL=chunk-F2Q76CQ4.cjs.map
266
+ //# sourceMappingURL=chunk-F2Q76CQ4.cjs.map