@nicia-ai/typegraph 0.37.1 → 0.39.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 (372) hide show
  1. package/README.md +12 -10
  2. package/dist/backend/drizzle/indexes.cjs +32 -0
  3. package/dist/backend/drizzle/indexes.cjs.map +1 -0
  4. package/dist/backend/drizzle/indexes.d.cts +43 -0
  5. package/dist/backend/drizzle/indexes.d.ts +43 -0
  6. package/dist/backend/drizzle/indexes.js +11 -0
  7. package/dist/backend/drizzle/indexes.js.map +1 -0
  8. package/dist/backend/index.cjs +161 -0
  9. package/dist/backend/index.cjs.map +1 -0
  10. package/dist/backend/index.d.cts +3 -0
  11. package/dist/backend/index.d.ts +3 -0
  12. package/dist/backend/index.js +8 -0
  13. package/dist/backend/index.js.map +1 -0
  14. package/dist/backend/postgres/index.cjs +32 -28
  15. package/dist/backend/postgres/index.d.cts +13 -12
  16. package/dist/backend/postgres/index.d.ts +13 -12
  17. package/dist/backend/postgres/index.js +19 -15
  18. package/dist/backend/postgres/pglite-store.cjs +67 -0
  19. package/dist/backend/postgres/pglite-store.cjs.map +1 -0
  20. package/dist/backend/postgres/pglite-store.d.cts +38 -0
  21. package/dist/backend/postgres/pglite-store.d.ts +38 -0
  22. package/dist/backend/postgres/pglite-store.js +65 -0
  23. package/dist/backend/postgres/pglite-store.js.map +1 -0
  24. package/dist/backend/postgres/pglite.cjs +25 -50
  25. package/dist/backend/postgres/pglite.cjs.map +1 -1
  26. package/dist/backend/postgres/pglite.d.cts +10 -9
  27. package/dist/backend/postgres/pglite.d.ts +10 -9
  28. package/dist/backend/postgres/pglite.js +20 -52
  29. package/dist/backend/postgres/pglite.js.map +1 -1
  30. package/dist/backend/sqlite/index.cjs +29 -25
  31. package/dist/backend/sqlite/index.d.cts +11 -11
  32. package/dist/backend/sqlite/index.d.ts +11 -11
  33. package/dist/backend/sqlite/index.js +17 -13
  34. package/dist/backend/sqlite/libsql.cjs +23 -19
  35. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  36. package/dist/backend/sqlite/libsql.d.cts +9 -10
  37. package/dist/backend/sqlite/libsql.d.ts +9 -10
  38. package/dist/backend/sqlite/libsql.js +19 -15
  39. package/dist/backend/sqlite/libsql.js.map +1 -1
  40. package/dist/backend/sqlite/local-store.cjs +72 -0
  41. package/dist/backend/sqlite/local-store.cjs.map +1 -0
  42. package/dist/backend/sqlite/local-store.d.cts +42 -0
  43. package/dist/backend/sqlite/local-store.d.ts +42 -0
  44. package/dist/backend/sqlite/local-store.js +67 -0
  45. package/dist/backend/sqlite/local-store.js.map +1 -0
  46. package/dist/backend/sqlite/local.cjs +28 -183
  47. package/dist/backend/sqlite/local.cjs.map +1 -1
  48. package/dist/backend/sqlite/local.d.cts +8 -81
  49. package/dist/backend/sqlite/local.d.ts +8 -81
  50. package/dist/backend/sqlite/local.js +20 -180
  51. package/dist/backend/sqlite/local.js.map +1 -1
  52. package/dist/chunk-2EBMPJBO.js +16 -0
  53. package/dist/chunk-2EBMPJBO.js.map +1 -0
  54. package/dist/chunk-35S6P5ZU.js +27 -0
  55. package/dist/chunk-35S6P5ZU.js.map +1 -0
  56. package/dist/chunk-3LKL3S6X.js +50 -0
  57. package/dist/chunk-3LKL3S6X.js.map +1 -0
  58. package/dist/{chunk-RCVLFTCT.js → chunk-3SK4SVTW.js} +13 -12
  59. package/dist/chunk-3SK4SVTW.js.map +1 -0
  60. package/dist/chunk-3YFDFOYB.cjs +192 -0
  61. package/dist/chunk-3YFDFOYB.cjs.map +1 -0
  62. package/dist/{chunk-WOJMKB3N.cjs → chunk-5ELKD2FQ.cjs} +1677 -308
  63. package/dist/chunk-5ELKD2FQ.cjs.map +1 -0
  64. package/dist/{chunk-5AVRFNP4.cjs → chunk-6SRLCSAV.cjs} +3012 -1513
  65. package/dist/chunk-6SRLCSAV.cjs.map +1 -0
  66. package/dist/chunk-6XDBRDZE.js +312 -0
  67. package/dist/chunk-6XDBRDZE.js.map +1 -0
  68. package/dist/chunk-764JHTLT.cjs +15 -0
  69. package/dist/chunk-764JHTLT.cjs.map +1 -0
  70. package/dist/chunk-76HE7DJP.js +68 -0
  71. package/dist/chunk-76HE7DJP.js.map +1 -0
  72. package/dist/{chunk-VGDDG3XJ.cjs → chunk-7M3NACL3.cjs} +12 -12
  73. package/dist/{chunk-VGDDG3XJ.cjs.map → chunk-7M3NACL3.cjs.map} +1 -1
  74. package/dist/chunk-AOL64O4Z.js +165 -0
  75. package/dist/chunk-AOL64O4Z.js.map +1 -0
  76. package/dist/{chunk-27SSDCEP.cjs → chunk-B63IFHXR.cjs} +53 -74
  77. package/dist/chunk-B63IFHXR.cjs.map +1 -0
  78. package/dist/{chunk-3XXGYU62.cjs → chunk-BKAKAVRW.cjs} +56 -53
  79. package/dist/chunk-BKAKAVRW.cjs.map +1 -0
  80. package/dist/{chunk-YTSN73ND.js → chunk-BQITNFQJ.js} +3 -3
  81. package/dist/{chunk-YTSN73ND.js.map → chunk-BQITNFQJ.js.map} +1 -1
  82. package/dist/{chunk-GA4TT3DH.js → chunk-CBK2IVI2.js} +1999 -503
  83. package/dist/chunk-CBK2IVI2.js.map +1 -0
  84. package/dist/{chunk-6EEO3OVU.cjs → chunk-CWX77JB4.cjs} +22 -59
  85. package/dist/chunk-CWX77JB4.cjs.map +1 -0
  86. package/dist/{chunk-UGZUAYAR.js → chunk-D7PG5D5K.js} +4 -3
  87. package/dist/chunk-D7PG5D5K.js.map +1 -0
  88. package/dist/chunk-DDCIXXOO.js +9 -0
  89. package/dist/chunk-DDCIXXOO.js.map +1 -0
  90. package/dist/chunk-DDCYVIVV.cjs +44 -0
  91. package/dist/chunk-DDCYVIVV.cjs.map +1 -0
  92. package/dist/{chunk-UV3WP5WZ.js → chunk-DOKUXLFH.js} +61 -29
  93. package/dist/chunk-DOKUXLFH.js.map +1 -0
  94. package/dist/{chunk-XPCZADMT.cjs → chunk-DOVMTPKE.cjs} +89 -27
  95. package/dist/chunk-DOVMTPKE.cjs.map +1 -0
  96. package/dist/{chunk-5PNMDJ7J.js → chunk-DPNA466P.js} +14 -9
  97. package/dist/chunk-DPNA466P.js.map +1 -0
  98. package/dist/{chunk-BYPOGQWK.js → chunk-DRACN6XG.js} +6 -4
  99. package/dist/chunk-DRACN6XG.js.map +1 -0
  100. package/dist/{chunk-TGOMW4MB.cjs → chunk-E2Q7SP2K.cjs} +110 -109
  101. package/dist/chunk-E2Q7SP2K.cjs.map +1 -0
  102. package/dist/chunk-E6TXEISH.cjs +175 -0
  103. package/dist/chunk-E6TXEISH.cjs.map +1 -0
  104. package/dist/{chunk-3C2RYI6L.cjs → chunk-EOJFGECD.cjs} +11 -11
  105. package/dist/chunk-EOJFGECD.cjs.map +1 -0
  106. package/dist/{chunk-XWV4JT34.js → chunk-ERZ4QPQX.js} +27 -22
  107. package/dist/chunk-ERZ4QPQX.js.map +1 -0
  108. package/dist/{chunk-DFVLCOP6.js → chunk-EZH7FNUS.js} +3 -3
  109. package/dist/{chunk-DFVLCOP6.js.map → chunk-EZH7FNUS.js.map} +1 -1
  110. package/dist/{chunk-WWFHO375.cjs → chunk-FJMPR3OH.cjs} +4 -3
  111. package/dist/chunk-FJMPR3OH.cjs.map +1 -0
  112. package/dist/chunk-FMNUSGZ4.cjs +12 -0
  113. package/dist/chunk-FMNUSGZ4.cjs.map +1 -0
  114. package/dist/{chunk-EXU3RASM.js → chunk-G3CSQLLT.js} +20 -474
  115. package/dist/chunk-G3CSQLLT.js.map +1 -0
  116. package/dist/{chunk-EJYMTO3K.cjs → chunk-GKQU44SQ.cjs} +150 -118
  117. package/dist/chunk-GKQU44SQ.cjs.map +1 -0
  118. package/dist/chunk-GNPGGLAE.cjs +212 -0
  119. package/dist/chunk-GNPGGLAE.cjs.map +1 -0
  120. package/dist/{chunk-QARBLBXT.cjs → chunk-GUUWKPTK.cjs} +7 -7
  121. package/dist/{chunk-QARBLBXT.cjs.map → chunk-GUUWKPTK.cjs.map} +1 -1
  122. package/dist/chunk-GYA4JRP5.js +31 -0
  123. package/dist/chunk-GYA4JRP5.js.map +1 -0
  124. package/dist/{chunk-3GH67G4Z.cjs → chunk-HP6LWBLB.cjs} +16 -42
  125. package/dist/chunk-HP6LWBLB.cjs.map +1 -0
  126. package/dist/{chunk-NXQFATMF.cjs → chunk-HTQOBY75.cjs} +153 -123
  127. package/dist/chunk-HTQOBY75.cjs.map +1 -0
  128. package/dist/chunk-I6FX7AAG.js +39 -0
  129. package/dist/chunk-I6FX7AAG.js.map +1 -0
  130. package/dist/{chunk-VKGKDOKR.js → chunk-IFDXG2YJ.js} +1539 -206
  131. package/dist/chunk-IFDXG2YJ.js.map +1 -0
  132. package/dist/{chunk-IXGYRP2P.js → chunk-IFRPHG7O.js} +79 -49
  133. package/dist/chunk-IFRPHG7O.js.map +1 -0
  134. package/dist/chunk-IMQKXL4E.cjs +12 -0
  135. package/dist/{chunk-QSXTWU4U.cjs.map → chunk-IMQKXL4E.cjs.map} +1 -1
  136. package/dist/chunk-J6IJARLG.js +94 -0
  137. package/dist/chunk-J6IJARLG.js.map +1 -0
  138. package/dist/{chunk-3DS7Z4T4.cjs → chunk-JD2YC62H.cjs} +44 -43
  139. package/dist/chunk-JD2YC62H.cjs.map +1 -0
  140. package/dist/{chunk-W63OVYY4.js → chunk-K34OPSJK.js} +3 -3
  141. package/dist/{chunk-W63OVYY4.js.map → chunk-K34OPSJK.js.map} +1 -1
  142. package/dist/chunk-KAFXPB2L.js +184 -0
  143. package/dist/chunk-KAFXPB2L.js.map +1 -0
  144. package/dist/chunk-KIZSHRUI.cjs +49 -0
  145. package/dist/chunk-KIZSHRUI.cjs.map +1 -0
  146. package/dist/{chunk-K3Q3LJY3.js → chunk-KXFUQNF2.js} +201 -100
  147. package/dist/chunk-KXFUQNF2.js.map +1 -0
  148. package/dist/{chunk-UXLSNRYL.js → chunk-MTNEGGM2.js} +4 -4
  149. package/dist/chunk-MTNEGGM2.js.map +1 -0
  150. package/dist/{chunk-IP3CGGPA.cjs → chunk-N2V3HJFV.cjs} +92 -185
  151. package/dist/chunk-N2V3HJFV.cjs.map +1 -0
  152. package/dist/chunk-NAUA4PW5.cjs +28 -0
  153. package/dist/chunk-NAUA4PW5.cjs.map +1 -0
  154. package/dist/chunk-NMQ6C6TS.cjs +61 -0
  155. package/dist/chunk-NMQ6C6TS.cjs.map +1 -0
  156. package/dist/{chunk-2N6EOBTH.cjs → chunk-NPWACFQJ.cjs} +58 -53
  157. package/dist/chunk-NPWACFQJ.cjs.map +1 -0
  158. package/dist/{chunk-TKT2XHED.js → chunk-NQBYTLPW.js} +13 -12
  159. package/dist/chunk-NQBYTLPW.js.map +1 -0
  160. package/dist/{chunk-5KEQ74YU.cjs → chunk-NT6ILURI.cjs} +9 -86
  161. package/dist/chunk-NT6ILURI.cjs.map +1 -0
  162. package/dist/{chunk-3SLPDKHQ.js → chunk-PH4IJ3V5.js} +5 -77
  163. package/dist/chunk-PH4IJ3V5.js.map +1 -0
  164. package/dist/chunk-PWXGB77L.cjs +56 -0
  165. package/dist/chunk-PWXGB77L.cjs.map +1 -0
  166. package/dist/chunk-PZHC5GCD.js +193 -0
  167. package/dist/chunk-PZHC5GCD.js.map +1 -0
  168. package/dist/chunk-QMQLUA66.js +12 -0
  169. package/dist/chunk-QMQLUA66.js.map +1 -0
  170. package/dist/{chunk-5WWVZMVX.js → chunk-QZ7A6HBM.js} +2 -2
  171. package/dist/{chunk-5WWVZMVX.js.map → chunk-QZ7A6HBM.js.map} +1 -1
  172. package/dist/chunk-RW24SAHI.cjs +74 -0
  173. package/dist/chunk-RW24SAHI.cjs.map +1 -0
  174. package/dist/{chunk-BVRDGYXQ.cjs → chunk-SAFZ6JTI.cjs} +14 -9
  175. package/dist/chunk-SAFZ6JTI.cjs.map +1 -0
  176. package/dist/{chunk-L7HQ2OSI.js → chunk-SCTZRFW5.js} +87 -166
  177. package/dist/chunk-SCTZRFW5.js.map +1 -0
  178. package/dist/{chunk-5KPNWT6X.js → chunk-SDHV2MWU.js} +24 -45
  179. package/dist/chunk-SDHV2MWU.js.map +1 -0
  180. package/dist/{chunk-3RWZPJKV.js → chunk-SU7VQOJ3.js} +21 -78
  181. package/dist/chunk-SU7VQOJ3.js.map +1 -0
  182. package/dist/chunk-SVJ5GEXW.cjs +45 -0
  183. package/dist/chunk-SVJ5GEXW.cjs.map +1 -0
  184. package/dist/chunk-SVUKGWSN.cjs +102 -0
  185. package/dist/chunk-SVUKGWSN.cjs.map +1 -0
  186. package/dist/chunk-TAUGGLNQ.js +59 -0
  187. package/dist/chunk-TAUGGLNQ.js.map +1 -0
  188. package/dist/{chunk-A42GCBGX.cjs → chunk-TRF4EBJT.cjs} +6 -4
  189. package/dist/chunk-TRF4EBJT.cjs.map +1 -0
  190. package/dist/{chunk-KQJ54OG5.js → chunk-U4JDJKPD.js} +19 -56
  191. package/dist/chunk-U4JDJKPD.js.map +1 -0
  192. package/dist/chunk-UH2USOMG.cjs +627 -0
  193. package/dist/chunk-UH2USOMG.cjs.map +1 -0
  194. package/dist/{chunk-XGPUQ56G.js → chunk-UUIBACKJ.js} +15 -38
  195. package/dist/chunk-UUIBACKJ.js.map +1 -0
  196. package/dist/{chunk-5VQM6VWP.cjs → chunk-UWG5GX6E.cjs} +2 -2
  197. package/dist/{chunk-5VQM6VWP.cjs.map → chunk-UWG5GX6E.cjs.map} +1 -1
  198. package/dist/{chunk-K5UBVGJN.js → chunk-VDYA2HMS.js} +6 -6
  199. package/dist/{chunk-K5UBVGJN.js.map → chunk-VDYA2HMS.js.map} +1 -1
  200. package/dist/{chunk-NUIG3BCV.cjs → chunk-VXAFOF6Z.cjs} +93 -155
  201. package/dist/chunk-VXAFOF6Z.cjs.map +1 -0
  202. package/dist/chunk-X4PVHAZ6.cjs +83 -0
  203. package/dist/chunk-X4PVHAZ6.cjs.map +1 -0
  204. package/dist/{chunk-UYQMBBWJ.js → chunk-X6CNEA32.js} +23 -20
  205. package/dist/chunk-X6CNEA32.js.map +1 -0
  206. package/dist/chunk-X6RDQ5NB.cjs +335 -0
  207. package/dist/chunk-X6RDQ5NB.cjs.map +1 -0
  208. package/dist/{chunk-DEFQM7JU.cjs → chunk-XRU7V7FF.cjs} +7 -7
  209. package/dist/{chunk-DEFQM7JU.cjs.map → chunk-XRU7V7FF.cjs.map} +1 -1
  210. package/dist/{chunk-TPF25IG6.js → chunk-XZA3Y4YH.js} +3 -3
  211. package/dist/{chunk-TPF25IG6.js.map → chunk-XZA3Y4YH.js.map} +1 -1
  212. package/dist/{chunk-DIQ3AV5W.cjs → chunk-Y6UA55YS.cjs} +324 -224
  213. package/dist/chunk-Y6UA55YS.cjs.map +1 -0
  214. package/dist/chunk-Y7M44XEK.js +462 -0
  215. package/dist/chunk-Y7M44XEK.js.map +1 -0
  216. package/dist/{chunk-RRSNR3TP.js → chunk-YIRLBUNN.js} +3 -3
  217. package/dist/{chunk-RRSNR3TP.js.map → chunk-YIRLBUNN.js.map} +1 -1
  218. package/dist/chunk-YPUNPG2T.js +47 -0
  219. package/dist/chunk-YPUNPG2T.js.map +1 -0
  220. package/dist/{chunk-QERAIDRJ.js → chunk-Z2PPIVOO.js} +82 -22
  221. package/dist/chunk-Z2PPIVOO.js.map +1 -0
  222. package/dist/chunk-Z5QHVL5U.cjs +12 -0
  223. package/dist/chunk-Z5QHVL5U.cjs.map +1 -0
  224. package/dist/chunk-ZDH3DX3C.cjs +30 -0
  225. package/dist/chunk-ZDH3DX3C.cjs.map +1 -0
  226. package/dist/chunk-ZE6NVENI.js +77 -0
  227. package/dist/chunk-ZE6NVENI.js.map +1 -0
  228. package/dist/chunk-ZKZAIX42.cjs +479 -0
  229. package/dist/chunk-ZKZAIX42.cjs.map +1 -0
  230. package/dist/{chunk-TEDRJXOG.cjs → chunk-ZY4GXIVN.cjs} +5 -5
  231. package/dist/{chunk-TEDRJXOG.cjs.map → chunk-ZY4GXIVN.cjs.map} +1 -1
  232. package/dist/core/index.cjs +117 -0
  233. package/dist/core/index.cjs.map +1 -0
  234. package/dist/core/index.d.cts +225 -0
  235. package/dist/core/index.d.ts +225 -0
  236. package/dist/core/index.js +12 -0
  237. package/dist/core/index.js.map +1 -0
  238. package/dist/{ddl-CS0KUVwB.d.ts → ddl-Dx3Z0_WC.d.ts} +3 -3
  239. package/dist/{ddl-BD-ZfKeX.d.cts → ddl-J6sDyABg.d.cts} +3 -3
  240. package/dist/define-graph-CzEvA_8F.d.cts +174 -0
  241. package/dist/define-graph-DRo9xpYN.d.ts +174 -0
  242. package/dist/{extension-types-BM2ACfYO.d.cts → extension-types-BLEVH4SG.d.cts} +1 -1
  243. package/dist/{extension-types-BM2ACfYO.d.ts → extension-types-BLEVH4SG.d.ts} +1 -1
  244. package/dist/graph-extension/index.cjs +21 -19
  245. package/dist/graph-extension/index.d.cts +4 -4
  246. package/dist/graph-extension/index.d.ts +4 -4
  247. package/dist/graph-extension/index.js +6 -4
  248. package/dist/graph-merge/index.cjs +267 -218
  249. package/dist/graph-merge/index.cjs.map +1 -1
  250. package/dist/graph-merge/index.d.cts +17 -93
  251. package/dist/graph-merge/index.d.ts +17 -93
  252. package/dist/graph-merge/index.js +143 -94
  253. package/dist/graph-merge/index.js.map +1 -1
  254. package/dist/{index-BeacbPoe.d.ts → index-BD_3TCgh.d.ts} +6 -4
  255. package/dist/{index-BPM59vsg.d.cts → index-BihFPsPu.d.cts} +6 -4
  256. package/dist/{fulltext-strategy-C27vXaeB.d.cts → index-Bq7vSPHy.d.ts} +3195 -2646
  257. package/dist/{fulltext-strategy-DebsMrqg.d.ts → index-CrFL_ENI.d.cts} +3195 -2646
  258. package/dist/index.cjs +326 -315
  259. package/dist/index.cjs.map +1 -1
  260. package/dist/index.d.cts +59 -240
  261. package/dist/index.d.ts +59 -240
  262. package/dist/index.js +46 -79
  263. package/dist/index.js.map +1 -1
  264. package/dist/indexes/index.cjs +26 -38
  265. package/dist/indexes/index.d.cts +6 -41
  266. package/dist/indexes/index.d.ts +6 -41
  267. package/dist/indexes/index.js +14 -10
  268. package/dist/interchange/index.cjs +48 -39
  269. package/dist/interchange/index.cjs.map +1 -1
  270. package/dist/interchange/index.d.cts +7 -8
  271. package/dist/interchange/index.d.ts +7 -8
  272. package/dist/interchange/index.js +23 -14
  273. package/dist/interchange/index.js.map +1 -1
  274. package/dist/local-options-CZ1BnIoF.d.cts +29 -0
  275. package/dist/local-options-CZ1BnIoF.d.ts +29 -0
  276. package/dist/{manager-D00_NXvT.d.ts → manager-CASfhmzV.d.ts} +4 -173
  277. package/dist/{manager-nU1vTJLy.d.cts → manager-nCEJiYBb.d.cts} +4 -173
  278. package/dist/{materialize-indexes-zK2J_flP.d.ts → materialize-indexes-D4iei4Kp.d.ts} +1 -1
  279. package/dist/{materialize-indexes-CuR3gAZb.d.cts → materialize-indexes-ExQ6OrAh.d.cts} +1 -1
  280. package/dist/{postgres-IaBA4RgE.d.ts → postgres-Cl1ZAN1G.d.ts} +1 -1
  281. package/dist/{postgres-YrYmPlaU.d.cts → postgres-DMgIKQU-.d.cts} +1 -1
  282. package/dist/postgres-execution-fKW0qRiN.d.cts +14 -0
  283. package/dist/postgres-execution-fKW0qRiN.d.ts +14 -0
  284. package/dist/profiler/index.cjs +9 -8
  285. package/dist/profiler/index.cjs.map +1 -1
  286. package/dist/profiler/index.d.cts +9 -17
  287. package/dist/profiler/index.d.ts +9 -17
  288. package/dist/profiler/index.js +8 -7
  289. package/dist/profiler/index.js.map +1 -1
  290. package/dist/provenance/index.cjs +61 -55
  291. package/dist/provenance/index.cjs.map +1 -1
  292. package/dist/provenance/index.d.cts +7 -8
  293. package/dist/provenance/index.d.ts +7 -8
  294. package/dist/provenance/index.js +34 -28
  295. package/dist/provenance/index.js.map +1 -1
  296. package/dist/schema/index.cjs +46 -37
  297. package/dist/schema/index.cjs.map +1 -1
  298. package/dist/schema/index.d.cts +8 -10
  299. package/dist/schema/index.d.ts +8 -10
  300. package/dist/schema/index.js +22 -13
  301. package/dist/schema/index.js.map +1 -1
  302. package/dist/{sqlite-BUOHPx7p.d.ts → sqlite-BDkW39aa.d.cts} +1 -1
  303. package/dist/{sqlite-Pp8O19WE.d.cts → sqlite-CYfhvESj.d.ts} +1 -1
  304. package/dist/sqlite-execution-DwbE2a9y.d.cts +32 -0
  305. package/dist/sqlite-execution-DwbE2a9y.d.ts +32 -0
  306. package/dist/{store-view-X96Rd00T.d.cts → store-view-BJd6Vwpt.d.cts} +427 -1404
  307. package/dist/{store-view-ANL6mTph.d.ts → store-view-CLIhwMMX.d.ts} +427 -1404
  308. package/dist/temporal-BC_NQV5Y.d.cts +281 -0
  309. package/dist/temporal-DqtOEo_B.d.ts +281 -0
  310. package/dist/{types-r-Zyq2Hz.d.cts → types-COq3-vMC.d.cts} +2 -2
  311. package/dist/{types-wsvuBgPK.d.ts → types-CUevi_D1.d.ts} +2 -2
  312. package/dist/{where-CJOpJj3a.d.ts → where-BdE_cYtx.d.ts} +5 -5
  313. package/dist/{where-K3uBP33l.d.cts → where-C92TXCzT.d.cts} +5 -5
  314. package/package.json +37 -6
  315. package/dist/chunk-27SSDCEP.cjs.map +0 -1
  316. package/dist/chunk-2N6EOBTH.cjs.map +0 -1
  317. package/dist/chunk-3C2RYI6L.cjs.map +0 -1
  318. package/dist/chunk-3DS7Z4T4.cjs.map +0 -1
  319. package/dist/chunk-3GH67G4Z.cjs.map +0 -1
  320. package/dist/chunk-3RWZPJKV.js.map +0 -1
  321. package/dist/chunk-3SLPDKHQ.js.map +0 -1
  322. package/dist/chunk-3XXGYU62.cjs.map +0 -1
  323. package/dist/chunk-44TA22QT.js +0 -1478
  324. package/dist/chunk-44TA22QT.js.map +0 -1
  325. package/dist/chunk-5AVRFNP4.cjs.map +0 -1
  326. package/dist/chunk-5KEQ74YU.cjs.map +0 -1
  327. package/dist/chunk-5KPNWT6X.js.map +0 -1
  328. package/dist/chunk-5PNMDJ7J.js.map +0 -1
  329. package/dist/chunk-6EEO3OVU.cjs.map +0 -1
  330. package/dist/chunk-7YSP4V4R.cjs +0 -69
  331. package/dist/chunk-7YSP4V4R.cjs.map +0 -1
  332. package/dist/chunk-A42GCBGX.cjs.map +0 -1
  333. package/dist/chunk-BVRDGYXQ.cjs.map +0 -1
  334. package/dist/chunk-BYPOGQWK.js.map +0 -1
  335. package/dist/chunk-CUHM5CWJ.cjs +0 -12
  336. package/dist/chunk-CUHM5CWJ.cjs.map +0 -1
  337. package/dist/chunk-DIQ3AV5W.cjs.map +0 -1
  338. package/dist/chunk-EJYMTO3K.cjs.map +0 -1
  339. package/dist/chunk-EXU3RASM.js.map +0 -1
  340. package/dist/chunk-GA4TT3DH.js.map +0 -1
  341. package/dist/chunk-IP3CGGPA.cjs.map +0 -1
  342. package/dist/chunk-IPSVVTWT.cjs +0 -1540
  343. package/dist/chunk-IPSVVTWT.cjs.map +0 -1
  344. package/dist/chunk-IXGYRP2P.js.map +0 -1
  345. package/dist/chunk-K3Q3LJY3.js.map +0 -1
  346. package/dist/chunk-KQJ54OG5.js.map +0 -1
  347. package/dist/chunk-L7HQ2OSI.js.map +0 -1
  348. package/dist/chunk-M6VES7V6.js +0 -239
  349. package/dist/chunk-M6VES7V6.js.map +0 -1
  350. package/dist/chunk-NUIG3BCV.cjs.map +0 -1
  351. package/dist/chunk-NXQFATMF.cjs.map +0 -1
  352. package/dist/chunk-OHMP6N2J.js +0 -47
  353. package/dist/chunk-OHMP6N2J.js.map +0 -1
  354. package/dist/chunk-QERAIDRJ.js.map +0 -1
  355. package/dist/chunk-QSXTWU4U.cjs +0 -12
  356. package/dist/chunk-RCVLFTCT.js.map +0 -1
  357. package/dist/chunk-TGOMW4MB.cjs.map +0 -1
  358. package/dist/chunk-TKT2XHED.js.map +0 -1
  359. package/dist/chunk-UGZUAYAR.js.map +0 -1
  360. package/dist/chunk-UV3WP5WZ.js.map +0 -1
  361. package/dist/chunk-UXLSNRYL.js.map +0 -1
  362. package/dist/chunk-UYQMBBWJ.js.map +0 -1
  363. package/dist/chunk-VKGKDOKR.js.map +0 -1
  364. package/dist/chunk-VL2V6PEN.cjs +0 -261
  365. package/dist/chunk-VL2V6PEN.cjs.map +0 -1
  366. package/dist/chunk-WOJMKB3N.cjs.map +0 -1
  367. package/dist/chunk-WWFHO375.cjs.map +0 -1
  368. package/dist/chunk-XGPUQ56G.js.map +0 -1
  369. package/dist/chunk-XGU7DZDA.cjs +0 -1095
  370. package/dist/chunk-XGU7DZDA.cjs.map +0 -1
  371. package/dist/chunk-XPCZADMT.cjs.map +0 -1
  372. package/dist/chunk-XWV4JT34.js.map +0 -1
@@ -1,32 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkCUHM5CWJ_cjs = require('./chunk-CUHM5CWJ.cjs');
4
- var chunkXGU7DZDA_cjs = require('./chunk-XGU7DZDA.cjs');
5
- var chunk7YSP4V4R_cjs = require('./chunk-7YSP4V4R.cjs');
6
- var drizzleOrm = require('drizzle-orm');
7
- var pgCore = require('drizzle-orm/pg-core');
8
-
9
- pgCore.customType({
10
- dataType(config) {
11
- return config?.dimensions ? `vector(${config.dimensions})` : "vector";
12
- },
13
- toDriver(value) {
14
- return `[${value.join(",")}]`;
15
- },
16
- fromDriver(value) {
17
- if (Array.isArray(value)) {
18
- return value;
19
- }
20
- const content = value.slice(1, -1);
21
- if (content === "") {
22
- return [];
23
- }
24
- return content.split(",").map((s) => Number.parseFloat(s.trim()));
25
- }
26
- });
27
- function formatVector(embedding) {
28
- return `[${embedding.join(",")}]`;
29
- }
3
+ var chunkFMNUSGZ4_cjs = require('./chunk-FMNUSGZ4.cjs');
4
+ var chunkZKZAIX42_cjs = require('./chunk-ZKZAIX42.cjs');
5
+ var chunkX6RDQ5NB_cjs = require('./chunk-X6RDQ5NB.cjs');
30
6
 
31
7
  // src/query/dialect/vector/pgvector-strategy.ts
32
8
  var TABLE_PREFIX = "tg_vec";
@@ -87,20 +63,20 @@ function operatorClass(metric) {
87
63
  }
88
64
  }
89
65
  function vectorLiteral(embedding, name) {
90
- chunkXGU7DZDA_cjs.assertFiniteEmbedding(embedding, name);
91
- return drizzleOrm.sql`${formatVector(embedding)}::vector`;
66
+ chunkZKZAIX42_cjs.assertFiniteEmbedding(embedding, name);
67
+ return chunkX6RDQ5NB_cjs.sql`${`[${embedding.join(",")}]`}::vector`;
92
68
  }
93
69
  function distanceExpression(embeddingColumn, queryEmbedding, metric) {
94
70
  const query = vectorLiteral(queryEmbedding, "queryEmbedding");
95
71
  switch (metric) {
96
72
  case "cosine": {
97
- return drizzleOrm.sql`(${embeddingColumn} <=> ${query})`;
73
+ return chunkX6RDQ5NB_cjs.sql`(${embeddingColumn} <=> ${query})`;
98
74
  }
99
75
  case "l2": {
100
- return drizzleOrm.sql`(${embeddingColumn} <-> ${query})`;
76
+ return chunkX6RDQ5NB_cjs.sql`(${embeddingColumn} <-> ${query})`;
101
77
  }
102
78
  case "inner_product": {
103
- return drizzleOrm.sql`(${embeddingColumn} <#> ${query})`;
79
+ return chunkX6RDQ5NB_cjs.sql`(${embeddingColumn} <#> ${query})`;
104
80
  }
105
81
  default: {
106
82
  const _exhaustive = metric;
@@ -108,15 +84,16 @@ function distanceExpression(embeddingColumn, queryEmbedding, metric) {
108
84
  }
109
85
  }
110
86
  }
87
+ function tableName(graphId, nodeKind, fieldPath) {
88
+ return chunkZKZAIX42_cjs.vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
89
+ }
111
90
  var pgvectorStrategy = {
112
91
  name: "pgvector",
113
92
  capabilities: PGVECTOR_CAPABILITIES,
114
- tableName(graphId, nodeKind, fieldPath) {
115
- return chunkXGU7DZDA_cjs.vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
116
- },
93
+ tableName,
117
94
  ownedTables(slot) {
118
- const table = this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
119
- const name = chunkXGU7DZDA_cjs.quoteIdentifier(table);
95
+ const table = tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
96
+ const name = chunkZKZAIX42_cjs.quoteIdentifier(table);
120
97
  const createDdl = [
121
98
  `CREATE TABLE IF NOT EXISTS ${name} (
122
99
  "graph_id" TEXT NOT NULL,
@@ -129,7 +106,7 @@ var pgvectorStrategy = {
129
106
  ];
130
107
  return [
131
108
  {
132
- logicalName: `${chunkXGU7DZDA_cjs.VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,
109
+ logicalName: `${chunkZKZAIX42_cjs.VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,
133
110
  owner: "pgvector",
134
111
  tableName: table,
135
112
  createDdl,
@@ -138,12 +115,12 @@ var pgvectorStrategy = {
138
115
  ];
139
116
  },
140
117
  buildUpsert(slot, params, timestamp) {
141
- const table = chunk7YSP4V4R_cjs.quotedTableName(
142
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
118
+ const table = chunkX6RDQ5NB_cjs.sql.identifier(
119
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
143
120
  );
144
121
  const value = vectorLiteral(params.embedding, "embedding");
145
122
  return [
146
- drizzleOrm.sql`
123
+ chunkX6RDQ5NB_cjs.sql`
147
124
  INSERT INTO ${table} ("graph_id", "node_id", "embedding", "created_at", "updated_at")
148
125
  VALUES (${params.graphId}, ${params.nodeId}, ${value}, ${timestamp}, ${timestamp})
149
126
  ON CONFLICT ("graph_id", "node_id")
@@ -152,17 +129,17 @@ var pgvectorStrategy = {
152
129
  ];
153
130
  },
154
131
  buildUpsertBatch(slot, params, timestamp) {
155
- const table = chunk7YSP4V4R_cjs.quotedTableName(
156
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
132
+ const table = chunkX6RDQ5NB_cjs.sql.identifier(
133
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
157
134
  );
158
- const valueRows = drizzleOrm.sql.join(
135
+ const valueRows = chunkX6RDQ5NB_cjs.sql.join(
159
136
  params.rows.map(
160
- (row) => drizzleOrm.sql`(${params.graphId}, ${row.nodeId}, ${vectorLiteral(row.embedding, "embedding")}, ${timestamp}, ${timestamp})`
137
+ (row) => chunkX6RDQ5NB_cjs.sql`(${params.graphId}, ${row.nodeId}, ${vectorLiteral(row.embedding, "embedding")}, ${timestamp}, ${timestamp})`
161
138
  ),
162
- drizzleOrm.sql`, `
139
+ chunkX6RDQ5NB_cjs.sql`, `
163
140
  );
164
141
  return [
165
- drizzleOrm.sql`
142
+ chunkX6RDQ5NB_cjs.sql`
166
143
  INSERT INTO ${table} ("graph_id", "node_id", "embedding", "created_at", "updated_at")
167
144
  VALUES ${valueRows}
168
145
  ON CONFLICT ("graph_id", "node_id")
@@ -171,58 +148,60 @@ var pgvectorStrategy = {
171
148
  ];
172
149
  },
173
150
  buildDelete(slot, params) {
174
- const table = chunk7YSP4V4R_cjs.quotedTableName(
175
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
151
+ const table = chunkX6RDQ5NB_cjs.sql.identifier(
152
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
176
153
  );
177
154
  return [
178
- drizzleOrm.sql`
155
+ chunkX6RDQ5NB_cjs.sql`
179
156
  DELETE FROM ${table}
180
157
  WHERE "graph_id" = ${params.graphId} AND "node_id" = ${params.nodeId}
181
158
  `
182
159
  ];
183
160
  },
184
161
  buildSearch(slot, params, candidates) {
185
- const table = chunk7YSP4V4R_cjs.quotedTableName(
186
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
162
+ const table = chunkX6RDQ5NB_cjs.sql.identifier(
163
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
187
164
  );
188
- const embeddingColumn = drizzleOrm.sql`${table}."embedding"`;
165
+ const embeddingColumn = chunkX6RDQ5NB_cjs.sql`${table}."embedding"`;
189
166
  const distance = distanceExpression(
190
167
  embeddingColumn,
191
168
  params.queryEmbedding,
192
169
  params.metric
193
170
  );
194
- const score = chunkXGU7DZDA_cjs.vectorScoreExpression(distance, params.metric);
195
- const conditions = [drizzleOrm.sql`${table}."graph_id" = ${params.graphId}`];
171
+ const score = chunkZKZAIX42_cjs.vectorScoreExpression(distance, params.metric);
172
+ const conditions = [
173
+ chunkX6RDQ5NB_cjs.sql`${table}."graph_id" = ${params.graphId}`
174
+ ];
196
175
  if (params.minScore !== void 0) {
197
176
  conditions.push(
198
- chunkXGU7DZDA_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
177
+ chunkZKZAIX42_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
199
178
  );
200
179
  }
201
180
  if (candidates !== void 0) {
202
- conditions.push(drizzleOrm.sql`${table}."node_id" IN (${candidates})`);
181
+ conditions.push(chunkX6RDQ5NB_cjs.sql`${table}."node_id" IN (${candidates})`);
203
182
  }
204
183
  const pageOffset = params.offset ?? 0;
205
- const pageClause = chunkCUHM5CWJ_cjs.vectorPageClause(params.limit, params.offset);
184
+ const pageClause = chunkFMNUSGZ4_cjs.vectorPageClause(params.limit, params.offset);
206
185
  if (slot.indexType === "ivfflat") {
207
- const direction = params.metric === "cosine" ? drizzleOrm.sql.raw("DESC") : drizzleOrm.sql.raw("ASC");
208
- const relaxedBody = drizzleOrm.sql`
186
+ const direction = params.metric === "cosine" ? chunkX6RDQ5NB_cjs.sql.raw("DESC") : chunkX6RDQ5NB_cjs.sql.raw("ASC");
187
+ const relaxedBody = chunkX6RDQ5NB_cjs.sql`
209
188
  SELECT ${table}."node_id" AS node_id, ${score} AS score
210
189
  FROM ${table}
211
- WHERE ${drizzleOrm.sql.join(conditions, drizzleOrm.sql` AND `)}
190
+ WHERE ${chunkX6RDQ5NB_cjs.sql.join(conditions, chunkX6RDQ5NB_cjs.sql` AND `)}
212
191
  ORDER BY ${distance} ASC
213
192
  LIMIT ${params.limit + pageOffset}
214
193
  `;
215
- return drizzleOrm.sql`
194
+ return chunkX6RDQ5NB_cjs.sql`
216
195
  WITH tg_vec_relaxed AS MATERIALIZED (${relaxedBody})
217
196
  SELECT node_id, score FROM tg_vec_relaxed
218
197
  ORDER BY score ${direction}, node_id ASC
219
198
  ${pageClause}
220
199
  `;
221
200
  }
222
- return drizzleOrm.sql`
201
+ return chunkX6RDQ5NB_cjs.sql`
223
202
  SELECT ${table}."node_id" AS node_id, ${score} AS score
224
203
  FROM ${table}
225
- WHERE ${drizzleOrm.sql.join(conditions, drizzleOrm.sql` AND `)}
204
+ WHERE ${chunkX6RDQ5NB_cjs.sql.join(conditions, chunkX6RDQ5NB_cjs.sql` AND `)}
226
205
  ORDER BY ${distance} ASC
227
206
  ${pageClause}
228
207
  `;
@@ -232,9 +211,9 @@ var pgvectorStrategy = {
232
211
  },
233
212
  buildCreateIndex(slot, options) {
234
213
  if (!usesAnnIndex(slot)) return void 0;
235
- return drizzleOrm.sql.raw(
214
+ return chunkX6RDQ5NB_cjs.sql.raw(
236
215
  pgvectorIndexDdl(
237
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath),
216
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath),
238
217
  slot,
239
218
  options?.concurrent === true
240
219
  )
@@ -243,17 +222,17 @@ var pgvectorStrategy = {
243
222
  buildDropIndex(slot) {
244
223
  if (!usesAnnIndex(slot)) return void 0;
245
224
  const indexName = pgvectorIndexName(slot);
246
- return drizzleOrm.sql.raw(`DROP INDEX IF EXISTS ${chunkXGU7DZDA_cjs.quoteIdentifier(indexName)}`);
225
+ return chunkX6RDQ5NB_cjs.sql.raw(`DROP INDEX IF EXISTS ${chunkZKZAIX42_cjs.quoteIdentifier(indexName)}`);
247
226
  },
248
227
  buildDropStorage(slot) {
249
- const table = chunkXGU7DZDA_cjs.quoteIdentifier(
250
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
228
+ const table = chunkZKZAIX42_cjs.quoteIdentifier(
229
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
251
230
  );
252
231
  return [`DROP TABLE IF EXISTS ${table} CASCADE`];
253
232
  }
254
233
  };
255
234
  function pgvectorIndexName(slot) {
256
- return chunkXGU7DZDA_cjs.vectorPhysicalName(
235
+ return chunkZKZAIX42_cjs.vectorPhysicalName(
257
236
  INDEX_PREFIX,
258
237
  slot.graphId,
259
238
  slot.nodeKind,
@@ -261,8 +240,8 @@ function pgvectorIndexName(slot) {
261
240
  );
262
241
  }
263
242
  function pgvectorIndexDdl(table, slot, concurrent) {
264
- const indexName = chunkXGU7DZDA_cjs.quoteIdentifier(pgvectorIndexName(slot));
265
- const quotedTable = chunkXGU7DZDA_cjs.quoteIdentifier(table);
243
+ const indexName = chunkZKZAIX42_cjs.quoteIdentifier(pgvectorIndexName(slot));
244
+ const quotedTable = chunkZKZAIX42_cjs.quoteIdentifier(table);
266
245
  const opClass = operatorClass(slot.metric);
267
246
  const m = slot.indexParams?.m ?? DEFAULT_HNSW_M;
268
247
  const efConstruction = slot.indexParams?.efConstruction ?? DEFAULT_HNSW_EF_CONSTRUCTION;
@@ -289,5 +268,5 @@ function pgvectorIndexDdl(table, slot, concurrent) {
289
268
 
290
269
  exports.assertPgvectorEfSearch = assertPgvectorEfSearch;
291
270
  exports.pgvectorStrategy = pgvectorStrategy;
292
- //# sourceMappingURL=chunk-27SSDCEP.cjs.map
293
- //# sourceMappingURL=chunk-27SSDCEP.cjs.map
271
+ //# sourceMappingURL=chunk-B63IFHXR.cjs.map
272
+ //# sourceMappingURL=chunk-B63IFHXR.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query/dialect/vector/pgvector-strategy.ts"],"names":["assertFiniteEmbedding","sql","vectorPhysicalName","quoteIdentifier","VECTOR_CONTRIBUTION_PREFIX","vectorScoreExpression","vectorMinScoreCondition","vectorPageClause"],"mappings":"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","file":"chunk-B63IFHXR.cjs","sourcesContent":["/**\n * pgvector strategy.\n *\n * Postgres' pgvector extension is the one engine where the *same* SQL serves\n * brute-force and ANN: `ORDER BY embedding <=> q LIMIT k` scans sequentially\n * with no index and is rewritten to an HNSW/IVFFlat scan the moment a matching\n * index exists — the planner picks it up automatically. So `buildSearch` never\n * branches on `slot.indexType`; it emits one relevance scan and lets Postgres\n * decide. (Contrast libSQL/sqlite-vec, whose ANN needs distinct syntax.)\n *\n * Storage is per-`(nodeKind, fieldPath)`: a `vector(N)` column carrying the\n * field's fixed dimension `N`, with the operator-class-typed ANN index folded\n * into the same table contribution so materialization builds table + index\n * together. The typed column means the index does not need the legacy\n * `::vector(N)` cast-in-index escape hatch the old shared table relied on.\n *\n * Metric support is the full pgvector set — `cosine`, `l2`, `inner_product` —\n * advertised as data on `capabilities`, mirroring `vector_cosine_ops` /\n * `vector_l2_ops` / `vector_ip_ops` and the `<=>` / `<->` / `<#>` operators.\n *\n * Mirrors the `libsqlVectorStrategy` / `sqliteVecStrategy` structure while\n * letting Postgres' planner pick the ANN index when one exists.\n */\nimport { type StrategyTableContribution } from \"../../../backend/table-contribution\";\nimport {\n type DeleteEmbeddingParams,\n type UpsertEmbeddingBatchParams,\n type UpsertEmbeddingParams,\n type VectorCapabilities,\n type VectorMetric,\n type VectorSearchParams,\n} from \"../../../backend/types\";\nimport { sql, type SqlFragment } from \"../../sql-fragment\";\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\";\nimport { vectorPageClause } from \"./pagination\";\n\n/** Physical-name prefixes for the per-field table and its ANN index. */\nconst TABLE_PREFIX = \"tg_vec\";\nconst INDEX_PREFIX = \"tg_vecidx\";\n\n/**\n * pgvector defines `hnsw.ef_search` as an integer GUC with a valid range\n * of 1..1000; `SET hnsw.ef_search = 1001` errors at the server. The\n * backend validates a per-search `efSearch` against this ceiling before\n * inlining it into `SET LOCAL`, surfacing a clear message instead of a raw\n * pgvector error.\n */\nexport const MAX_HNSW_EF_SEARCH = 1000;\n\n/**\n * Validates a per-search `efSearch` override against pgvector's\n * `hnsw.ef_search` valid range. `undefined` (no override) is accepted.\n */\nexport function assertPgvectorEfSearch(efSearch?: number): void {\n if (efSearch === undefined) return;\n if (!Number.isInteger(efSearch) || efSearch <= 0) {\n throw new Error(`efSearch must be a positive integer, got: ${efSearch}`);\n }\n if (efSearch > MAX_HNSW_EF_SEARCH) {\n throw new RangeError(\n `efSearch must be ≤ ${MAX_HNSW_EF_SEARCH} (pgvector's hnsw.ef_search ` +\n `valid range is 1..${MAX_HNSW_EF_SEARCH}), got: ${efSearch}`,\n );\n }\n}\n\n/**\n * pgvector's `vector` type caps at 16,000 dimensions for a stored column\n * (2,000 for an indexed column, but the column-type ceiling is what governs\n * storage; recall degradation beyond 2,000 is a tuning concern, not a hard\n * limit advertised here).\n */\nconst PGVECTOR_MAX_DIMENSIONS = 16_000;\n\n/** Default HNSW `m` (max connections per layer) — pgvector's own default. */\nconst DEFAULT_HNSW_M = 16;\n/** Default HNSW `ef_construction` (build candidate list) — pgvector's own default. */\nconst DEFAULT_HNSW_EF_CONSTRUCTION = 64;\n/** Default IVFFlat `lists` (inverted lists) — pgvector's own default. */\nconst DEFAULT_IVFFLAT_LISTS = 100;\n\nconst PGVECTOR_CAPABILITIES: VectorCapabilities = {\n supported: true,\n metrics: [\"cosine\", \"l2\", \"inner_product\"],\n indexTypes: [\"hnsw\", \"ivfflat\", \"none\"],\n maxDimensions: PGVECTOR_MAX_DIMENSIONS,\n // The backend probes `pg_extension.extversion` once and turns on\n // `hnsw.iterative_scan` / `ivfflat.iterative_scan` when pgvector >= 0.8, so a\n // filtered scan re-enters the index for more candidates.\n //\n // NOT a full-page guarantee, on either axis. The iterative scan stops at\n // `hnsw.max_scan_tuples` / `ivfflat.max_probes`; and on pgvector < 0.8 there\n // is no iterative scan at all, so the search stays `ef_search`-bounded and\n // behaves like a post-filter. A statically-declared mode cannot express\n // either, which is why the guarantee is its own field.\n filteredApproximateSearch: {\n mode: \"iterative-scan\",\n guaranteesFullPage: false,\n },\n};\n\n/** Whether a slot's declared index type materializes a real pgvector ANN index. */\nfunction usesAnnIndex(slot: VectorSlot): boolean {\n return slot.indexType === \"hnsw\" || slot.indexType === \"ivfflat\";\n}\n\n/**\n * pgvector operator class for a metric's ANN index — `vector_cosine_ops` /\n * `vector_l2_ops` / `vector_ip_ops`, mirroring the `<=>` / `<->` / `<#>`\n * distance operators this strategy emits.\n */\nfunction operatorClass(metric: VectorMetric): string {\n switch (metric) {\n case \"cosine\": {\n return \"vector_cosine_ops\";\n }\n case \"l2\": {\n return \"vector_l2_ops\";\n }\n case \"inner_product\": {\n return \"vector_ip_ops\";\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 a `::vector` literal. The value is bound as a\n * parameter (not interpolated) — Postgres parses the `[a,b,c]` text and the\n * cast types it. Finiteness is validated first so a NaN names its index.\n */\nfunction vectorLiteral(\n embedding: readonly number[],\n name: string,\n): SqlFragment {\n assertFiniteEmbedding(embedding, name);\n return sql`${`[${embedding.join(\",\")}]`}::vector`;\n}\n\nfunction distanceExpression(\n embeddingColumn: SqlFragment,\n queryEmbedding: readonly number[],\n metric: VectorMetric,\n): SqlFragment {\n const query = vectorLiteral(queryEmbedding, \"queryEmbedding\");\n switch (metric) {\n case \"cosine\": {\n return sql`(${embeddingColumn} <=> ${query})`;\n }\n case \"l2\": {\n return sql`(${embeddingColumn} <-> ${query})`;\n }\n case \"inner_product\": {\n return sql`(${embeddingColumn} <#> ${query})`;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\nfunction tableName(\n graphId: string,\n nodeKind: string,\n fieldPath: string,\n): string {\n return vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);\n}\n\nexport const pgvectorStrategy: VectorStrategy = {\n name: \"pgvector\",\n capabilities: PGVECTOR_CAPABILITIES,\n\n tableName,\n\n ownedTables(slot): readonly StrategyTableContribution[] {\n const table = 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\" vector(${slot.dimensions}) NOT NULL,\n \"created_at\" TIMESTAMPTZ NOT NULL,\n \"updated_at\" TIMESTAMPTZ NOT NULL,\n PRIMARY KEY (\"graph_id\", \"node_id\")\n);`,\n ];\n\n // The HNSW/IVFFlat index is intentionally NOT created here. pgvector\n // similarity SQL is planner-driven (`ORDER BY embedding <=> q LIMIT k`\n // uses the index when present, sequential-scans when not), so the index\n // is a pure materialization concern: `buildCreateIndex` builds it through\n // `materializeIndexes()` with the field's declared `m`/`ef_construction`/\n // `lists`. Building it eagerly here would bake in default tuning (the\n // write-ensure slot has no `indexParams`) and `CREATE INDEX IF NOT EXISTS`\n // would then mask the tuned index materialization would emit.\n\n return [\n {\n logicalName: `${VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,\n owner: \"pgvector\",\n tableName: table,\n createDdl,\n runtimeEnsure: true,\n },\n ];\n },\n\n buildUpsert(\n slot,\n params: UpsertEmbeddingParams,\n timestamp,\n ): readonly SqlFragment[] {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const value = vectorLiteral(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\" = EXCLUDED.\"embedding\", \"updated_at\" = EXCLUDED.\"updated_at\"\n `,\n ];\n },\n\n buildUpsertBatch(\n slot,\n params: UpsertEmbeddingBatchParams,\n timestamp,\n ): readonly SqlFragment[] {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const valueRows = sql.join(\n params.rows.map(\n (row) =>\n sql`(${params.graphId}, ${row.nodeId}, ${vectorLiteral(row.embedding, \"embedding\")}, ${timestamp}, ${timestamp})`,\n ),\n sql`, `,\n );\n return [\n sql`\n INSERT INTO ${table} (\"graph_id\", \"node_id\", \"embedding\", \"created_at\", \"updated_at\")\n VALUES ${valueRows}\n ON CONFLICT (\"graph_id\", \"node_id\")\n DO UPDATE SET \"embedding\" = EXCLUDED.\"embedding\", \"updated_at\" = EXCLUDED.\"updated_at\"\n `,\n ];\n },\n\n buildDelete(slot, params: DeleteEmbeddingParams): readonly SqlFragment[] {\n const table = sql.identifier(\n 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(\n slot,\n params: VectorSearchParams,\n candidates?: SqlFragment,\n ): SqlFragment {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const embeddingColumn = sql`${table}.\"embedding\"`;\n const distance = distanceExpression(\n embeddingColumn,\n params.queryEmbedding,\n params.metric,\n );\n const score = vectorScoreExpression(distance, params.metric);\n\n // Same SQL for brute-force and ANN: with a matching HNSW/IVFFlat index the\n // Postgres planner rewrites this `ORDER BY distance LIMIT k` into an index\n // scan automatically, so the strategy never branches on `slot.indexType`.\n const conditions: SqlFragment[] = [\n sql`${table}.\"graph_id\" = ${params.graphId}`,\n ];\n if (params.minScore !== undefined) {\n conditions.push(\n vectorMinScoreCondition(distance, params.metric, params.minScore),\n );\n }\n // Candidate pushdown keeps the HNSW scan (verified plan: HNSW Index Scan\n // -> Nested Loop probe of the nodes pkey -> Limit). Exact under\n // `hnsw.iterative_scan` (pgvector >= 0.8, applied by the backend);\n // bounded by `ef_search` on older pgvector — still strictly better than\n // ranking tombstones into top-k and dropping them post-hoc.\n //\n // Plain `IN (subquery)`: with fresh statistics the planner hashes it\n // (brute-force scans) or drives per-row probes of the nodes pkey\n // under the ordered HNSW scan — the plan-verified shape the liveness\n // pushdown was built on. Stale statistics degrade any membership\n // form; the answer is `store.refreshStatistics()` after bulk loads,\n // not a cleverer SQL shape.\n if (candidates !== undefined) {\n conditions.push(sql`${table}.\"node_id\" IN (${candidates})`);\n }\n // Pagination is rank-relative: the scan fetches `limit + offset`\n // ordered candidates and OFFSET discards the leading page.\n const pageOffset = params.offset ?? 0;\n const pageClause = vectorPageClause(params.limit, params.offset);\n // IVFFlat's iterative scan only offers `relaxed_order` (no\n // strict_order mode), so under the backend-applied\n // `ivfflat.iterative_scan` the index may emit the candidate set\n // slightly out of distance order. Re-sort the bounded set inside a\n // MATERIALIZED wrapper — the fence stops the planner from collapsing\n // the sort back into the index scan's claimed ordering — and page in\n // the wrapper: an OFFSET inside the relaxed scan could discard the\n // wrong rows. Score is monotone in distance, so ordering by score per\n // the metric's direction restores exact ranking.\n if (slot.indexType === \"ivfflat\") {\n const direction =\n params.metric === \"cosine\" ? sql.raw(\"DESC\") : sql.raw(\"ASC\");\n const relaxedBody = sql`\n SELECT ${table}.\"node_id\" AS node_id, ${score} AS score\n FROM ${table}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distance} ASC\n LIMIT ${params.limit + pageOffset}\n `;\n return sql`\n WITH tg_vec_relaxed AS MATERIALIZED (${relaxedBody})\n SELECT node_id, score FROM tg_vec_relaxed\n ORDER BY score ${direction}, node_id ASC\n ${pageClause}\n `;\n }\n return sql`\n SELECT ${table}.\"node_id\" AS node_id, ${score} AS score\n FROM ${table}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distance} ASC\n ${pageClause}\n `;\n },\n\n distanceExpression(embeddingColumn, queryEmbedding, metric) {\n return distanceExpression(embeddingColumn, queryEmbedding, metric);\n },\n\n buildCreateIndex(slot, options): SqlFragment | undefined {\n if (!usesAnnIndex(slot)) return undefined;\n return sql.raw(\n pgvectorIndexDdl(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n slot,\n options?.concurrent === true,\n ),\n );\n },\n\n buildDropIndex(slot): SqlFragment | undefined {\n if (!usesAnnIndex(slot)) return undefined;\n const indexName = pgvectorIndexName(slot);\n return sql.raw(`DROP INDEX IF EXISTS ${quoteIdentifier(indexName)}`);\n },\n\n buildDropStorage(slot): readonly string[] {\n const table = quoteIdentifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n // CASCADE drops the ANN index along with the table.\n return [`DROP TABLE IF EXISTS ${table} CASCADE`];\n },\n};\n\nfunction pgvectorIndexName(slot: VectorSlot): string {\n return vectorPhysicalName(\n INDEX_PREFIX,\n slot.graphId,\n slot.nodeKind,\n slot.fieldPath,\n );\n}\n\nfunction pgvectorIndexDdl(\n table: string,\n slot: VectorSlot,\n concurrent: boolean,\n): string {\n const indexName = quoteIdentifier(pgvectorIndexName(slot));\n const quotedTable = quoteIdentifier(table);\n const opClass = operatorClass(slot.metric);\n // Honor the field's declared tuning; fall back to pgvector defaults.\n const m = slot.indexParams?.m ?? DEFAULT_HNSW_M;\n const efConstruction =\n slot.indexParams?.efConstruction ?? DEFAULT_HNSW_EF_CONSTRUCTION;\n const lists = slot.indexParams?.lists ?? DEFAULT_IVFFLAT_LISTS;\n // CONCURRENTLY builds without taking a write-blocking lock on the live table\n // (materializeIndexes passes concurrent on Postgres). Run outside a tx.\n const create = `CREATE INDEX${concurrent ? \" CONCURRENTLY\" : \"\"} IF NOT EXISTS`;\n\n switch (slot.indexType) {\n case \"hnsw\": {\n return `${create} ${indexName} ON ${quotedTable} USING hnsw (\"embedding\" ${opClass}) WITH (m = ${m}, ef_construction = ${efConstruction});`;\n }\n case \"ivfflat\": {\n return `${create} ${indexName} ON ${quotedTable} USING ivfflat (\"embedding\" ${opClass}) WITH (lists = ${lists});`;\n }\n case \"none\": {\n throw new Error(\n \"pgvectorIndexDdl called for a brute-force-only slot (indexType 'none').\",\n );\n }\n default: {\n const _exhaustive: never = slot.indexType;\n throw new Error(`Unsupported vector index type: ${String(_exhaustive)}`);\n }\n }\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkCUHM5CWJ_cjs = require('./chunk-CUHM5CWJ.cjs');
4
- var chunkXGU7DZDA_cjs = require('./chunk-XGU7DZDA.cjs');
5
- var chunk7YSP4V4R_cjs = require('./chunk-7YSP4V4R.cjs');
6
- var drizzleOrm = require('drizzle-orm');
3
+ var chunkFMNUSGZ4_cjs = require('./chunk-FMNUSGZ4.cjs');
4
+ var chunkZKZAIX42_cjs = require('./chunk-ZKZAIX42.cjs');
5
+ var chunkX6RDQ5NB_cjs = require('./chunk-X6RDQ5NB.cjs');
7
6
 
7
+ // src/query/dialect/vector/sqlite-vec-strategy.ts
8
8
  var TABLE_PREFIX = "tg_vec";
9
9
  var SQLITE_VEC_MAX_DIMENSIONS = 8e3;
10
10
  var SQLITE_VEC_CAPABILITIES = {
@@ -47,17 +47,17 @@ function sqliteVecMetricToken(metric) {
47
47
  }
48
48
  }
49
49
  function vecF32Literal(embedding, name) {
50
- chunkXGU7DZDA_cjs.assertFiniteEmbedding(embedding, name);
51
- return drizzleOrm.sql`vec_f32(${JSON.stringify(embedding)})`;
50
+ chunkZKZAIX42_cjs.assertFiniteEmbedding(embedding, name);
51
+ return chunkX6RDQ5NB_cjs.sql`vec_f32(${JSON.stringify(embedding)})`;
52
52
  }
53
53
  function distanceExpression(embeddingColumn, queryEmbedding, metric) {
54
54
  const query = vecF32Literal(queryEmbedding, "queryEmbedding");
55
55
  switch (metric) {
56
56
  case "cosine": {
57
- return drizzleOrm.sql`vec_distance_cosine(${embeddingColumn}, ${query})`;
57
+ return chunkX6RDQ5NB_cjs.sql`vec_distance_cosine(${embeddingColumn}, ${query})`;
58
58
  }
59
59
  case "l2": {
60
- return drizzleOrm.sql`vec_distance_l2(${embeddingColumn}, ${query})`;
60
+ return chunkX6RDQ5NB_cjs.sql`vec_distance_l2(${embeddingColumn}, ${query})`;
61
61
  }
62
62
  case "inner_product": {
63
63
  throw new Error(
@@ -70,19 +70,20 @@ function distanceExpression(embeddingColumn, queryEmbedding, metric) {
70
70
  }
71
71
  }
72
72
  }
73
+ function tableName(graphId, nodeKind, fieldPath) {
74
+ return chunkZKZAIX42_cjs.vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
75
+ }
73
76
  var sqliteVecStrategy = {
74
77
  name: "sqlite-vec",
75
78
  capabilities: SQLITE_VEC_CAPABILITIES,
76
- tableName(graphId, nodeKind, fieldPath) {
77
- return chunkXGU7DZDA_cjs.vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
78
- },
79
+ tableName,
79
80
  ownedTables(slot) {
80
- const table = this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
81
- const name = chunkXGU7DZDA_cjs.quoteIdentifier(table);
81
+ const table = tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
82
+ const name = chunkZKZAIX42_cjs.quoteIdentifier(table);
82
83
  const metric = sqliteVecMetricToken(slot.metric);
83
84
  return [
84
85
  {
85
- logicalName: `${chunkXGU7DZDA_cjs.VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,
86
+ logicalName: `${chunkZKZAIX42_cjs.VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,
86
87
  owner: "sqlite-vec",
87
88
  tableName: table,
88
89
  createDdl: [
@@ -99,52 +100,52 @@ var sqliteVecStrategy = {
99
100
  ];
100
101
  },
101
102
  buildUpsert(slot, params, timestamp) {
102
- const table = chunk7YSP4V4R_cjs.quotedTableName(
103
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
103
+ const table = chunkX6RDQ5NB_cjs.sql.identifier(
104
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
104
105
  );
105
106
  const value = vecF32Literal(params.embedding, "embedding");
106
107
  return [
107
- drizzleOrm.sql`
108
+ chunkX6RDQ5NB_cjs.sql`
108
109
  DELETE FROM ${table}
109
110
  WHERE "node_id" = ${params.nodeId} AND "graph_id" = ${params.graphId}
110
111
  `,
111
- drizzleOrm.sql`
112
+ chunkX6RDQ5NB_cjs.sql`
112
113
  INSERT INTO ${table} ("node_id", "graph_id", "created_at", "updated_at", "embedding")
113
114
  VALUES (${params.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${value})
114
115
  `
115
116
  ];
116
117
  },
117
118
  buildUpsertBatch(slot, params, timestamp) {
118
- const table = chunk7YSP4V4R_cjs.quotedTableName(
119
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
119
+ const table = chunkX6RDQ5NB_cjs.sql.identifier(
120
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
120
121
  );
121
- const nodeIds = drizzleOrm.sql.join(
122
- params.rows.map((row) => drizzleOrm.sql`${row.nodeId}`),
123
- drizzleOrm.sql`, `
122
+ const nodeIds = chunkX6RDQ5NB_cjs.sql.join(
123
+ params.rows.map((row) => chunkX6RDQ5NB_cjs.sql`${row.nodeId}`),
124
+ chunkX6RDQ5NB_cjs.sql`, `
124
125
  );
125
- const valueRows = drizzleOrm.sql.join(
126
+ const valueRows = chunkX6RDQ5NB_cjs.sql.join(
126
127
  params.rows.map(
127
- (row) => drizzleOrm.sql`(${row.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${vecF32Literal(row.embedding, "embedding")})`
128
+ (row) => chunkX6RDQ5NB_cjs.sql`(${row.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${vecF32Literal(row.embedding, "embedding")})`
128
129
  ),
129
- drizzleOrm.sql`, `
130
+ chunkX6RDQ5NB_cjs.sql`, `
130
131
  );
131
132
  return [
132
- drizzleOrm.sql`
133
+ chunkX6RDQ5NB_cjs.sql`
133
134
  DELETE FROM ${table}
134
135
  WHERE "graph_id" = ${params.graphId} AND "node_id" IN (${nodeIds})
135
136
  `,
136
- drizzleOrm.sql`
137
+ chunkX6RDQ5NB_cjs.sql`
137
138
  INSERT INTO ${table} ("node_id", "graph_id", "created_at", "updated_at", "embedding")
138
139
  VALUES ${valueRows}
139
140
  `
140
141
  ];
141
142
  },
142
143
  buildDelete(slot, params) {
143
- const table = chunk7YSP4V4R_cjs.quotedTableName(
144
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
144
+ const table = chunkX6RDQ5NB_cjs.sql.identifier(
145
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
145
146
  );
146
147
  return [
147
- drizzleOrm.sql`
148
+ chunkX6RDQ5NB_cjs.sql`
148
149
  DELETE FROM ${table}
149
150
  WHERE "node_id" = ${params.nodeId} AND "graph_id" = ${params.graphId}
150
151
  `
@@ -156,61 +157,63 @@ var sqliteVecStrategy = {
156
157
  // route the NON-approximate `.similarTo()` branch through this form.
157
158
  searchIsExact: true,
158
159
  buildSearch(slot, params, candidates) {
159
- const table = chunk7YSP4V4R_cjs.quotedTableName(
160
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
160
+ const table = chunkX6RDQ5NB_cjs.sql.identifier(
161
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
161
162
  );
162
- const embeddingColumn = drizzleOrm.sql`${table}."embedding"`;
163
+ const embeddingColumn = chunkX6RDQ5NB_cjs.sql`${table}."embedding"`;
163
164
  const distance = distanceExpression(
164
165
  embeddingColumn,
165
166
  params.queryEmbedding,
166
167
  params.metric
167
168
  );
168
- const score = chunkXGU7DZDA_cjs.vectorScoreExpression(distance, params.metric);
169
+ const score = chunkZKZAIX42_cjs.vectorScoreExpression(distance, params.metric);
169
170
  if (usesAnnIndex(slot)) {
170
171
  const query = vecF32Literal(params.queryEmbedding, "queryEmbedding");
171
172
  const knnK = params.limit + (params.offset ?? 0);
172
173
  const conditions2 = [
173
- drizzleOrm.sql`${table}."embedding" MATCH ${query}`,
174
- drizzleOrm.sql`k = ${knnK}`,
175
- drizzleOrm.sql`${table}."graph_id" = ${params.graphId}`
174
+ chunkX6RDQ5NB_cjs.sql`${table}."embedding" MATCH ${query}`,
175
+ chunkX6RDQ5NB_cjs.sql`k = ${knnK}`,
176
+ chunkX6RDQ5NB_cjs.sql`${table}."graph_id" = ${params.graphId}`
176
177
  ];
177
178
  if (params.minScore !== void 0) {
178
179
  conditions2.push(
179
- chunkXGU7DZDA_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
180
+ chunkZKZAIX42_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
180
181
  );
181
182
  }
182
183
  if (candidates !== void 0) {
183
- conditions2.push(drizzleOrm.sql`${table}."node_id" IN (${candidates})`);
184
+ conditions2.push(chunkX6RDQ5NB_cjs.sql`${table}."node_id" IN (${candidates})`);
184
185
  }
185
- const knnBody = drizzleOrm.sql`
186
+ const knnBody = chunkX6RDQ5NB_cjs.sql`
186
187
  SELECT ${table}."node_id" AS node_id, ${score} AS score
187
188
  FROM ${table}
188
- WHERE ${drizzleOrm.sql.join(conditions2, drizzleOrm.sql` AND `)}
189
+ WHERE ${chunkX6RDQ5NB_cjs.sql.join(conditions2, chunkX6RDQ5NB_cjs.sql` AND `)}
189
190
  ORDER BY distance ASC
190
191
  `;
191
192
  if (params.offset === void 0 || params.offset === 0) {
192
193
  return knnBody;
193
194
  }
194
- return drizzleOrm.sql`
195
+ return chunkX6RDQ5NB_cjs.sql`
195
196
  WITH knn_page AS MATERIALIZED (${knnBody})
196
197
  SELECT node_id, score FROM knn_page
197
198
  LIMIT ${params.limit} OFFSET ${params.offset}
198
199
  `;
199
200
  }
200
- const conditions = [drizzleOrm.sql`${table}."graph_id" = ${params.graphId}`];
201
+ const conditions = [
202
+ chunkX6RDQ5NB_cjs.sql`${table}."graph_id" = ${params.graphId}`
203
+ ];
201
204
  if (candidates !== void 0) {
202
- conditions.push(drizzleOrm.sql`${table}."node_id" IN (${candidates})`);
205
+ conditions.push(chunkX6RDQ5NB_cjs.sql`${table}."node_id" IN (${candidates})`);
203
206
  }
204
207
  if (params.minScore !== void 0) {
205
208
  conditions.push(
206
- chunkXGU7DZDA_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
209
+ chunkZKZAIX42_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
207
210
  );
208
211
  }
209
- const pageClause = chunkCUHM5CWJ_cjs.vectorPageClause(params.limit, params.offset);
210
- return drizzleOrm.sql`
212
+ const pageClause = chunkFMNUSGZ4_cjs.vectorPageClause(params.limit, params.offset);
213
+ return chunkX6RDQ5NB_cjs.sql`
211
214
  SELECT ${table}."node_id" AS node_id, ${score} AS score
212
215
  FROM ${table}
213
- WHERE ${drizzleOrm.sql.join(conditions, drizzleOrm.sql` AND `)}
216
+ WHERE ${chunkX6RDQ5NB_cjs.sql.join(conditions, chunkX6RDQ5NB_cjs.sql` AND `)}
214
217
  ORDER BY ${distance} ASC
215
218
  ${pageClause}
216
219
  `;
@@ -227,13 +230,13 @@ var sqliteVecStrategy = {
227
230
  return void 0;
228
231
  },
229
232
  buildDropStorage(slot) {
230
- const table = chunkXGU7DZDA_cjs.quoteIdentifier(
231
- this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
233
+ const table = chunkZKZAIX42_cjs.quoteIdentifier(
234
+ tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
232
235
  );
233
236
  return [`DROP TABLE IF EXISTS ${table}`];
234
237
  }
235
238
  };
236
239
 
237
240
  exports.sqliteVecStrategy = sqliteVecStrategy;
238
- //# sourceMappingURL=chunk-3XXGYU62.cjs.map
239
- //# sourceMappingURL=chunk-3XXGYU62.cjs.map
241
+ //# sourceMappingURL=chunk-BKAKAVRW.cjs.map
242
+ //# sourceMappingURL=chunk-BKAKAVRW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query/dialect/vector/sqlite-vec-strategy.ts"],"names":["assertFiniteEmbedding","sql","vectorPhysicalName","quoteIdentifier","VECTOR_CONTRIBUTION_PREFIX","vectorScoreExpression","conditions","vectorMinScoreCondition","vectorPageClause"],"mappings":"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","file":"chunk-BKAKAVRW.cjs","sourcesContent":["/**\n * sqlite-vec strategy — real `vec0` KNN for local SQLite.\n *\n * This upgrades `createLocalSqliteBackend` (better-sqlite3 + the sqlite-vec\n * extension) from the legacy brute-force-on-a-shared-table model to genuine\n * approximate-nearest-neighbor search on per-`(nodeKind, fieldPath)` storage.\n *\n * ## Storage choice: a `vec0` virtual table per field\n *\n * Each slot is backed by its own `vec0` virtual table:\n *\n * ```sql\n * CREATE VIRTUAL TABLE tg_vec_<kind>_<field> USING vec0(\n * node_id TEXT PRIMARY KEY,\n * graph_id TEXT PARTITION KEY,\n * +created_at TEXT,\n * +updated_at TEXT,\n * embedding float[<N>] distance_metric=<cosine|l2>\n * );\n * ```\n *\n * Verified against the installed `sqlite-vec` `v0.1.9`:\n *\n * - **vec0 over a plain `vec_f32` BLOB column.** The shipped option (a) — a\n * `vec0` virtual table — is chosen over option (b) — a regular table whose\n * `vec_f32` BLOB column is brute-forced — because vec0 is the *only* form\n * that gives local SQLite a real ANN index (today's code only ever\n * brute-forces). vec0 indexes inline (the virtual table *is* the index), so\n * there is no separate `CREATE INDEX` step.\n * - **KNN with partition-correct filtering.** `WHERE embedding MATCH vec_f32(q)\n * AND k = ? AND graph_id = ?` returns the nearest `k`, ordered by `distance`,\n * scoped to one graph — a near vector in another `graph_id` partition does\n * not leak. This is strictly better than libSQL's table-global `vector_top_k`\n * (which over-fetches for multi-graph correctness): vec0's `PARTITION KEY`\n * makes the per-graph KNN exact.\n * - **One table serves both read paths.** The same `embedding` column answers\n * the compiler's brute-force `distanceExpression` (`vec_distance_cosine` /\n * `vec_distance_l2` over the column, `ORDER BY … LIMIT`, no `MATCH`), so the\n * `.where(field.similarTo(...))` CTE path needs no second structure.\n * - **`k` and `LIMIT` are mutually exclusive** in a vec0 `MATCH` query, so the\n * ANN path uses `k = <limit>` with no `LIMIT`, and the brute-force path uses\n * `LIMIT <limit>` with no `MATCH`.\n * - **No `ON CONFLICT` / `INSERT OR REPLACE`** on a vec0 primary key, so upsert\n * is `DELETE` + `INSERT` (atomic under the caller's outer transaction),\n * mirroring the FTS5 strategy.\n *\n * Metric support is `cosine` + `l2` (no `inner_product` — sqlite-vec has no\n * `vec_distance_ip`), advertised as data on `capabilities`. The table's\n * `distance_metric` is fixed at creation from the slot's metric, alongside its\n * fixed dimension `N`.\n *\n * The libSQL and pgvector siblings implement the same `VectorStrategy`\n * contract for their engines.\n */\nimport { type StrategyTableContribution } from \"../../../backend/table-contribution\";\nimport {\n type DeleteEmbeddingParams,\n type UpsertEmbeddingBatchParams,\n type UpsertEmbeddingParams,\n type VectorCapabilities,\n type VectorMetric,\n type VectorSearchParams,\n} from \"../../../backend/types\";\nimport { sql, type SqlFragment } from \"../../sql-fragment\";\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\";\nimport { vectorPageClause } from \"./pagination\";\n\n/** Physical-name prefix for the per-field `vec0` virtual table. */\nconst TABLE_PREFIX = \"tg_vec\";\n\n/**\n * sqlite-vec stores each dimension as a 32-bit float; `float[N]` accepts\n * large `N`, but we advertise the same conservative ceiling the legacy\n * SQLite path used so capability discovery is stable across the swap.\n */\nconst SQLITE_VEC_MAX_DIMENSIONS = 8000;\n\nconst SQLITE_VEC_CAPABILITIES: VectorCapabilities = {\n supported: true,\n metrics: [\"cosine\", \"l2\"],\n // vec0 always indexes inline, so the portable ANN intent (\"hnsw\", the\n // `embedding()` default) is honored by real KNN; \"none\" stays brute-force.\n // Both map to the same vec0 table — only `buildSearch` differs.\n indexTypes: [\"hnsw\", \"none\"],\n maxDimensions: SQLITE_VEC_MAX_DIMENSIONS,\n // vec0's KNN accepts primary-key `IN (SELECT …)` pushdown (verified on\n // sqlite-vec v0.1.9), so the candidate filter constrains the KNN itself and\n // a filtered search returns `k` live rows — no over-fetch, no scan bound, no\n // under-fill. The only bundled engine that can promise a full page.\n filteredApproximateSearch: {\n mode: \"filter-pushdown\",\n guaranteesFullPage: true,\n },\n};\n\n/** Whether a slot's declared index type maps to vec0's `MATCH … k =` KNN. */\nfunction usesAnnIndex(slot: VectorSlot): boolean {\n return slot.indexType === \"hnsw\";\n}\n\n/** vec0 `distance_metric` token accepted in the virtual-table definition. */\nfunction sqliteVecMetricToken(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 \"sqlite-vec 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 bound JSON argument to `vec_f32(...)`. The\n * value rides as a parameter (not interpolated) — `vec_f32` parses the JSON\n * array into the packed float blob. Finiteness is validated first so a\n * NaN/Infinity names its index before JSON.stringify masks it as `null`.\n */\nfunction vecF32Literal(\n embedding: readonly number[],\n name: string,\n): SqlFragment {\n assertFiniteEmbedding(embedding, name);\n return sql`vec_f32(${JSON.stringify(embedding)})`;\n}\n\nfunction distanceExpression(\n embeddingColumn: SqlFragment,\n queryEmbedding: readonly number[],\n metric: VectorMetric,\n): SqlFragment {\n const query = vecF32Literal(queryEmbedding, \"queryEmbedding\");\n switch (metric) {\n case \"cosine\": {\n return sql`vec_distance_cosine(${embeddingColumn}, ${query})`;\n }\n case \"l2\": {\n return sql`vec_distance_l2(${embeddingColumn}, ${query})`;\n }\n case \"inner_product\": {\n throw new Error(\n \"sqlite-vec 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\nfunction tableName(\n graphId: string,\n nodeKind: string,\n fieldPath: string,\n): string {\n return vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);\n}\n\nexport const sqliteVecStrategy: VectorStrategy = {\n name: \"sqlite-vec\",\n capabilities: SQLITE_VEC_CAPABILITIES,\n\n tableName,\n\n ownedTables(slot): readonly StrategyTableContribution[] {\n const table = tableName(slot.graphId, slot.nodeKind, slot.fieldPath);\n const name = quoteIdentifier(table);\n const metric = sqliteVecMetricToken(slot.metric);\n\n // vec0 virtual tables cannot be modeled as a Drizzle table, so this is a\n // raw-ddl contribution — emitted verbatim and invisible to drizzle-kit.\n // `graph_id` is a PARTITION KEY so per-graph KNN is exact; `created_at` /\n // `updated_at` are auxiliary (`+`) columns (stored, not filtered on). The\n // virtual table *is* the index — no separate CREATE INDEX is emitted.\n return [\n {\n logicalName: `${VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,\n owner: \"sqlite-vec\",\n tableName: table,\n createDdl: [\n `CREATE VIRTUAL TABLE IF NOT EXISTS ${name} USING vec0(\n node_id TEXT PRIMARY KEY,\n graph_id TEXT PARTITION KEY,\n +created_at TEXT,\n +updated_at TEXT,\n embedding float[${slot.dimensions}] distance_metric=${metric}\n);`,\n ],\n runtimeEnsure: true,\n },\n ];\n },\n\n buildUpsert(\n slot,\n params: UpsertEmbeddingParams,\n timestamp,\n ): readonly SqlFragment[] {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const value = vecF32Literal(params.embedding, \"embedding\");\n // vec0 rejects ON CONFLICT / INSERT OR REPLACE on its primary key —\n // emulate upsert with DELETE + INSERT, atomic under the caller's\n // outer transaction (mirrors the FTS5 fulltext strategy).\n return [\n sql`\n DELETE FROM ${table}\n WHERE \"node_id\" = ${params.nodeId} AND \"graph_id\" = ${params.graphId}\n `,\n sql`\n INSERT INTO ${table} (\"node_id\", \"graph_id\", \"created_at\", \"updated_at\", \"embedding\")\n VALUES (${params.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${value})\n `,\n ];\n },\n\n buildUpsertBatch(\n slot,\n params: UpsertEmbeddingBatchParams,\n timestamp,\n ): readonly SqlFragment[] {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n // Same DELETE + INSERT upsert emulation as buildUpsert, in multi-row\n // form: one IN-list delete, one multi-row insert.\n const nodeIds = sql.join(\n params.rows.map((row) => sql`${row.nodeId}`),\n sql`, `,\n );\n const valueRows = sql.join(\n params.rows.map(\n (row) =>\n sql`(${row.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${vecF32Literal(row.embedding, \"embedding\")})`,\n ),\n sql`, `,\n );\n return [\n sql`\n DELETE FROM ${table}\n WHERE \"graph_id\" = ${params.graphId} AND \"node_id\" IN (${nodeIds})\n `,\n sql`\n INSERT INTO ${table} (\"node_id\", \"graph_id\", \"created_at\", \"updated_at\", \"embedding\")\n VALUES ${valueRows}\n `,\n ];\n },\n\n buildDelete(slot, params: DeleteEmbeddingParams): readonly SqlFragment[] {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n return [\n sql`\n DELETE FROM ${table}\n WHERE \"node_id\" = ${params.nodeId} AND \"graph_id\" = ${params.graphId}\n `,\n ];\n },\n\n // vec0's KNN is brute force in C — exact by construction (the\n // \"index\" is a partitioned scan, not a graph) — and the non-indexed\n // fallback below is a plain SQL scan. The compiler may therefore\n // route the NON-approximate `.similarTo()` branch through this form.\n searchIsExact: true,\n\n buildSearch(\n slot,\n params: VectorSearchParams,\n candidates?: SqlFragment,\n ): SqlFragment {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const embeddingColumn = sql`${table}.\"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 // vec0 KNN. `k` and `LIMIT` are mutually exclusive in a MATCH query, so\n // bound `k = limit` and omit LIMIT. `graph_id` filters by the partition\n // key (exact, no recall loss). Order by vec0's own `distance` column —\n // the recomputed `distance` expression is reused only for score/minScore\n // so the math matches the brute-force path and the shared helpers.\n const query = vecF32Literal(params.queryEmbedding, \"queryEmbedding\");\n // `k` covers the requested page: vec0 has no OFFSET inside a MATCH\n // query, so fetch `limit + offset` neighbors and page in a wrapper.\n const knnK = params.limit + (params.offset ?? 0);\n const conditions: SqlFragment[] = [\n sql`${table}.\"embedding\" MATCH ${query}`,\n sql`k = ${knnK}`,\n sql`${table}.\"graph_id\" = ${params.graphId}`,\n ];\n if (params.minScore !== undefined) {\n conditions.push(\n vectorMinScoreCondition(distance, params.metric, params.minScore),\n );\n }\n // vec0 KNN accepts primary-key `IN (SELECT ...)` pushdown (verified on\n // sqlite-vec v0.1.9): the filter constrains the KNN candidate set\n // itself, so `k` live results come back — exact, no over-fetch.\n if (candidates !== undefined) {\n conditions.push(sql`${table}.\"node_id\" IN (${candidates})`);\n }\n const knnBody = sql`\n SELECT ${table}.\"node_id\" AS node_id, ${score} AS score\n FROM ${table}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY distance ASC\n `;\n if (params.offset === undefined || params.offset === 0) {\n return knnBody;\n }\n // MATERIALIZED fences the page wrapper: SQLite would otherwise\n // flatten the subquery and push the outer LIMIT into the vec0 MATCH\n // query, which rejects `k = ?` and LIMIT together.\n return sql`\n WITH knn_page AS MATERIALIZED (${knnBody})\n SELECT node_id, score FROM knn_page\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n // Brute-force scan: no MATCH, so LIMIT is allowed (and required).\n const conditions: SqlFragment[] = [\n sql`${table}.\"graph_id\" = ${params.graphId}`,\n ];\n if (candidates !== undefined) {\n conditions.push(sql`${table}.\"node_id\" IN (${candidates})`);\n }\n if (params.minScore !== undefined) {\n conditions.push(\n vectorMinScoreCondition(distance, params.metric, params.minScore),\n );\n }\n const pageClause = vectorPageClause(params.limit, params.offset);\n return sql`\n SELECT ${table}.\"node_id\" AS node_id, ${score} AS score\n FROM ${table}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distance} ASC\n ${pageClause}\n `;\n },\n\n distanceExpression(embeddingColumn, queryEmbedding, metric) {\n return distanceExpression(embeddingColumn, queryEmbedding, metric);\n },\n\n // vec0 indexes inline (the virtual table is the index), so there is no\n // standalone ANN index to create or drop — both return undefined.\n buildCreateIndex(): SqlFragment | undefined {\n return undefined;\n },\n\n buildDropIndex(): SqlFragment | undefined {\n return undefined;\n },\n\n buildDropStorage(slot): readonly string[] {\n const table = quoteIdentifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n // Dropping the vec0 virtual table removes its backing shadow tables too.\n return [`DROP TABLE IF EXISTS ${table}`];\n },\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { shortHash, quoteIdentifier } from './chunk-EXU3RASM.js';
1
+ import { shortHash, quoteIdentifier } from './chunk-Y7M44XEK.js';
2
2
 
3
3
  // src/indexes/system.ts
4
4
  var SYSTEM_INDEX_DECLARATIONS = [
@@ -208,5 +208,5 @@ function generateSystemIndexDDL(declaration, physicalTableName, options) {
208
208
  }
209
209
 
210
210
  export { SYSTEM_INDEX_DECLARATIONS, assertNoSystemIndexNameCollision, generateSystemIndexDDL, resolveSystemIndexNames, resolveSystemIndexTableName, systemIndexName };
211
- //# sourceMappingURL=chunk-YTSN73ND.js.map
212
- //# sourceMappingURL=chunk-YTSN73ND.js.map
211
+ //# sourceMappingURL=chunk-BQITNFQJ.js.map
212
+ //# sourceMappingURL=chunk-BQITNFQJ.js.map