@nicia-ai/typegraph 0.34.0 → 0.35.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 (287) hide show
  1. package/dist/backend/postgres/index.cjs +29 -29
  2. package/dist/backend/postgres/index.d.cts +39 -7
  3. package/dist/backend/postgres/index.d.ts +39 -7
  4. package/dist/backend/postgres/index.js +16 -16
  5. package/dist/backend/postgres/pglite.cjs +21 -21
  6. package/dist/backend/postgres/pglite.d.cts +4 -4
  7. package/dist/backend/postgres/pglite.d.ts +4 -4
  8. package/dist/backend/postgres/pglite.js +16 -16
  9. package/dist/backend/sqlite/index.cjs +25 -26
  10. package/dist/backend/sqlite/index.d.cts +8 -8
  11. package/dist/backend/sqlite/index.d.ts +8 -8
  12. package/dist/backend/sqlite/index.js +13 -14
  13. package/dist/backend/sqlite/libsql.cjs +19 -19
  14. package/dist/backend/sqlite/libsql.d.cts +4 -4
  15. package/dist/backend/sqlite/libsql.d.ts +4 -4
  16. package/dist/backend/sqlite/libsql.js +15 -15
  17. package/dist/backend/sqlite/local.cjs +101 -21
  18. package/dist/backend/sqlite/local.cjs.map +1 -1
  19. package/dist/backend/sqlite/local.d.cts +95 -5
  20. package/dist/backend/sqlite/local.d.ts +95 -5
  21. package/dist/backend/sqlite/local.js +95 -16
  22. package/dist/backend/sqlite/local.js.map +1 -1
  23. package/dist/{chunk-ZV5N4DBG.js → chunk-3TWF3SH4.js} +300 -58
  24. package/dist/chunk-3TWF3SH4.js.map +1 -0
  25. package/dist/chunk-4JEZZJ6S.cjs +1271 -0
  26. package/dist/chunk-4JEZZJ6S.cjs.map +1 -0
  27. package/dist/{chunk-UNNPKQUG.cjs → chunk-4TOD4LBZ.cjs} +246 -155
  28. package/dist/chunk-4TOD4LBZ.cjs.map +1 -0
  29. package/dist/{chunk-QV245VMN.js → chunk-55MZDDZV.js} +100 -6
  30. package/dist/chunk-55MZDDZV.js.map +1 -0
  31. package/dist/{chunk-GQANNXXT.cjs → chunk-5A6FNS6N.cjs} +75 -20
  32. package/dist/chunk-5A6FNS6N.cjs.map +1 -0
  33. package/dist/{chunk-3Z6TW3CT.cjs → chunk-5AQIKK56.cjs} +65 -25
  34. package/dist/chunk-5AQIKK56.cjs.map +1 -0
  35. package/dist/{chunk-BVTWD66D.js → chunk-5SEGFTZX.js} +3 -3
  36. package/dist/{chunk-BVTWD66D.js.map → chunk-5SEGFTZX.js.map} +1 -1
  37. package/dist/{chunk-6GNSY7AV.js → chunk-6FR2MMS6.js} +7 -7
  38. package/dist/chunk-6FR2MMS6.js.map +1 -0
  39. package/dist/chunk-7YSP4V4R.cjs +69 -0
  40. package/dist/chunk-7YSP4V4R.cjs.map +1 -0
  41. package/dist/chunk-A42GCBGX.cjs +28 -0
  42. package/dist/chunk-A42GCBGX.cjs.map +1 -0
  43. package/dist/{chunk-RHZWOJVA.cjs → chunk-BLZDPRXT.cjs} +52 -4
  44. package/dist/chunk-BLZDPRXT.cjs.map +1 -0
  45. package/dist/chunk-BYPOGQWK.js +25 -0
  46. package/dist/chunk-BYPOGQWK.js.map +1 -0
  47. package/dist/{chunk-6HVOHZHS.cjs → chunk-CK5BVQOW.cjs} +213 -168
  48. package/dist/chunk-CK5BVQOW.cjs.map +1 -0
  49. package/dist/{chunk-JJRCLAUN.cjs → chunk-CTTSDJLY.cjs} +116 -10
  50. package/dist/chunk-CTTSDJLY.cjs.map +1 -0
  51. package/dist/chunk-CUHM5CWJ.cjs +12 -0
  52. package/dist/chunk-CUHM5CWJ.cjs.map +1 -0
  53. package/dist/{chunk-A7SZZFAG.js → chunk-CZQ3FO2Q.js} +409 -99
  54. package/dist/chunk-CZQ3FO2Q.js.map +1 -0
  55. package/dist/{chunk-2JXB3NYJ.cjs → chunk-D7ZEOS56.cjs} +25 -32
  56. package/dist/chunk-D7ZEOS56.cjs.map +1 -0
  57. package/dist/chunk-DFVLCOP6.js +10 -0
  58. package/dist/chunk-DFVLCOP6.js.map +1 -0
  59. package/dist/{chunk-UJLOZYKT.cjs → chunk-EM3CWPND.cjs} +441 -115
  60. package/dist/chunk-EM3CWPND.cjs.map +1 -0
  61. package/dist/chunk-EMF62TZG.cjs +1176 -0
  62. package/dist/chunk-EMF62TZG.cjs.map +1 -0
  63. package/dist/chunk-EOLERH7Y.cjs +40 -0
  64. package/dist/chunk-EOLERH7Y.cjs.map +1 -0
  65. package/dist/{chunk-TGJE22RM.cjs → chunk-FACJJWGF.cjs} +24 -6
  66. package/dist/chunk-FACJJWGF.cjs.map +1 -0
  67. package/dist/{chunk-HK5SATYM.cjs → chunk-FL472AMI.cjs} +16 -109
  68. package/dist/chunk-FL472AMI.cjs.map +1 -0
  69. package/dist/{chunk-WVC2Q2FD.cjs → chunk-FN35DLCN.cjs} +31 -9
  70. package/dist/chunk-FN35DLCN.cjs.map +1 -0
  71. package/dist/{chunk-KUTNI6SI.js → chunk-FPIZFYHE.js} +10 -18
  72. package/dist/chunk-FPIZFYHE.js.map +1 -0
  73. package/dist/{chunk-VCGO4V26.js → chunk-FRV5Q5IO.js} +64 -9
  74. package/dist/chunk-FRV5Q5IO.js.map +1 -0
  75. package/dist/{chunk-K5P5OZXS.js → chunk-G6Q5UM7U.js} +2 -2
  76. package/dist/{chunk-K5P5OZXS.js.map → chunk-G6Q5UM7U.js.map} +1 -1
  77. package/dist/chunk-GSQ6NPH6.cjs +100 -0
  78. package/dist/chunk-GSQ6NPH6.cjs.map +1 -0
  79. package/dist/chunk-GUR2FNB5.cjs +12 -0
  80. package/dist/{chunk-HMFK4BXR.cjs.map → chunk-GUR2FNB5.cjs.map} +1 -1
  81. package/dist/{chunk-JQGIPGVL.cjs → chunk-H7YNSMA7.cjs} +43 -2
  82. package/dist/chunk-H7YNSMA7.cjs.map +1 -0
  83. package/dist/{chunk-2MRAX3UE.js → chunk-I7ZUZKFD.js} +47 -4
  84. package/dist/chunk-I7ZUZKFD.js.map +1 -0
  85. package/dist/{chunk-3BRVBQQD.cjs → chunk-J7WFGBJR.cjs} +2445 -2367
  86. package/dist/chunk-J7WFGBJR.cjs.map +1 -0
  87. package/dist/{chunk-V3QNTB7Z.js → chunk-JBTOYDMN.js} +194 -114
  88. package/dist/chunk-JBTOYDMN.js.map +1 -0
  89. package/dist/{chunk-K2TGS3EN.js → chunk-K3PPLHY7.js} +138 -89
  90. package/dist/chunk-K3PPLHY7.js.map +1 -0
  91. package/dist/{chunk-Z5XBMDXU.js → chunk-KBGQIPRQ.js} +42 -3
  92. package/dist/chunk-KBGQIPRQ.js.map +1 -0
  93. package/dist/chunk-KMI7LYAF.js +1252 -0
  94. package/dist/chunk-KMI7LYAF.js.map +1 -0
  95. package/dist/{chunk-JIEJCTDS.cjs → chunk-LGEALRC6.cjs} +21 -4
  96. package/dist/chunk-LGEALRC6.cjs.map +1 -0
  97. package/dist/{chunk-TQOYM4LN.js → chunk-MP2JQKSG.js} +21 -5
  98. package/dist/chunk-MP2JQKSG.js.map +1 -0
  99. package/dist/{chunk-ZP5WHI4C.cjs → chunk-O7UN7OXA.cjs} +358 -116
  100. package/dist/chunk-O7UN7OXA.cjs.map +1 -0
  101. package/dist/chunk-OHMP6N2J.js +47 -0
  102. package/dist/chunk-OHMP6N2J.js.map +1 -0
  103. package/dist/{chunk-4DIBPQNJ.js → chunk-OR5ZA5WP.js} +135 -25
  104. package/dist/chunk-OR5ZA5WP.js.map +1 -0
  105. package/dist/{chunk-DEQFL35G.js → chunk-Q5TEXCTB.js} +61 -7
  106. package/dist/chunk-Q5TEXCTB.js.map +1 -0
  107. package/dist/chunk-QNKSQTKQ.js +1312 -0
  108. package/dist/chunk-QNKSQTKQ.js.map +1 -0
  109. package/dist/{chunk-ZURTTSCM.js → chunk-QOTI55H7.js} +6 -94
  110. package/dist/chunk-QOTI55H7.js.map +1 -0
  111. package/dist/{chunk-CHXTTSC6.js → chunk-QWEUYILR.js} +104 -5
  112. package/dist/chunk-QWEUYILR.js.map +1 -0
  113. package/dist/{chunk-LANHCOXB.js → chunk-RGP33ZJ5.js} +485 -83
  114. package/dist/chunk-RGP33ZJ5.js.map +1 -0
  115. package/dist/chunk-RGPG7EOJ.js +94 -0
  116. package/dist/chunk-RGPG7EOJ.js.map +1 -0
  117. package/dist/{chunk-G6SOJEDI.cjs → chunk-S55OV6PW.cjs} +15 -15
  118. package/dist/chunk-S55OV6PW.cjs.map +1 -0
  119. package/dist/{chunk-3E7SNSIA.cjs → chunk-SJDMVITW.cjs} +4 -4
  120. package/dist/{chunk-3E7SNSIA.cjs.map → chunk-SJDMVITW.cjs.map} +1 -1
  121. package/dist/{chunk-XLUNB2TZ.js → chunk-SNXVDZAJ.js} +3 -3
  122. package/dist/{chunk-XLUNB2TZ.js.map → chunk-SNXVDZAJ.js.map} +1 -1
  123. package/dist/{chunk-RBV7YCQD.js → chunk-T2WUSPDA.js} +49 -9
  124. package/dist/chunk-T2WUSPDA.js.map +1 -0
  125. package/dist/{chunk-KGC4LY5T.cjs → chunk-TCOCYN2P.cjs} +75 -21
  126. package/dist/chunk-TCOCYN2P.cjs.map +1 -0
  127. package/dist/{chunk-FLRCVI2G.cjs → chunk-TDXIBCGY.cjs} +2 -2
  128. package/dist/{chunk-FLRCVI2G.cjs.map → chunk-TDXIBCGY.cjs.map} +1 -1
  129. package/dist/{chunk-ZY4GXIVN.cjs → chunk-TEDRJXOG.cjs} +5 -5
  130. package/dist/{chunk-ZY4GXIVN.cjs.map → chunk-TEDRJXOG.cjs.map} +1 -1
  131. package/dist/{chunk-WLRIWYHQ.js → chunk-UES55P7G.js} +1863 -1785
  132. package/dist/chunk-UES55P7G.js.map +1 -0
  133. package/dist/{chunk-WL2SG7ZV.cjs → chunk-UMDVATGY.cjs} +6 -6
  134. package/dist/{chunk-WL2SG7ZV.cjs.map → chunk-UMDVATGY.cjs.map} +1 -1
  135. package/dist/chunk-UT3S4SEN.js +31 -0
  136. package/dist/chunk-UT3S4SEN.js.map +1 -0
  137. package/dist/{chunk-RRKQAKD6.cjs → chunk-UUT7UN2N.cjs} +149 -39
  138. package/dist/chunk-UUT7UN2N.cjs.map +1 -0
  139. package/dist/{chunk-SHLY4MCM.js → chunk-UZV3AZKF.js} +21 -3
  140. package/dist/chunk-UZV3AZKF.js.map +1 -0
  141. package/dist/{chunk-CYX2JTDG.js → chunk-VHMPG6UL.js} +29 -7
  142. package/dist/chunk-VHMPG6UL.js.map +1 -0
  143. package/dist/{chunk-T6SPUYLX.cjs → chunk-VPYHY3LJ.cjs} +116 -10
  144. package/dist/chunk-VPYHY3LJ.cjs.map +1 -0
  145. package/dist/{chunk-T46GR2VY.js → chunk-VSPCZAXF.js} +3 -3
  146. package/dist/{chunk-T46GR2VY.js.map → chunk-VSPCZAXF.js.map} +1 -1
  147. package/dist/{chunk-K34OPSJK.js → chunk-W63OVYY4.js} +3 -3
  148. package/dist/{chunk-K34OPSJK.js.map → chunk-W63OVYY4.js.map} +1 -1
  149. package/dist/{chunk-RY2VIWAM.js → chunk-WDBCBWC4.js} +355 -32
  150. package/dist/chunk-WDBCBWC4.js.map +1 -0
  151. package/dist/chunk-WJT7OU7E.cjs +1334 -0
  152. package/dist/chunk-WJT7OU7E.cjs.map +1 -0
  153. package/dist/{chunk-5IQIX7LU.cjs → chunk-XOX22WHL.cjs} +476 -163
  154. package/dist/chunk-XOX22WHL.cjs.map +1 -0
  155. package/dist/{ddl-BrmPg61z.d.ts → ddl-C2rZ-Aen.d.ts} +4 -4
  156. package/dist/{ddl-j1-sH6lE.d.cts → ddl-CZz7a0E8.d.cts} +4 -4
  157. package/dist/{extension-types-YGFJPrzK.d.cts → extension-types-ixRpJVUp.d.cts} +24 -1
  158. package/dist/{extension-types-YGFJPrzK.d.ts → extension-types-ixRpJVUp.d.ts} +24 -1
  159. package/dist/{types-DkNnF-7K.d.cts → fulltext-strategy-B57yvC5Q.d.ts} +2562 -2133
  160. package/dist/{types-D1Sqeyxy.d.ts → fulltext-strategy-CDkSSYhq.d.cts} +2562 -2133
  161. package/dist/graph-extension/index.cjs +20 -19
  162. package/dist/graph-extension/index.d.cts +4 -4
  163. package/dist/graph-extension/index.d.ts +4 -4
  164. package/dist/graph-extension/index.js +5 -4
  165. package/dist/graph-merge/index.cjs +255 -164
  166. package/dist/graph-merge/index.cjs.map +1 -1
  167. package/dist/graph-merge/index.d.cts +63 -33
  168. package/dist/graph-merge/index.d.ts +63 -33
  169. package/dist/graph-merge/index.js +135 -44
  170. package/dist/graph-merge/index.js.map +1 -1
  171. package/dist/{index-DGX6D9j1.d.ts → index-6CSUAq-x.d.ts} +234 -93
  172. package/dist/{index-SEvUHDA6.d.cts → index-Bks_3HHK.d.cts} +234 -93
  173. package/dist/index.cjs +208 -188
  174. package/dist/index.d.cts +11 -11
  175. package/dist/index.d.ts +11 -11
  176. package/dist/index.js +33 -33
  177. package/dist/indexes/index.cjs +19 -20
  178. package/dist/indexes/index.d.cts +5 -5
  179. package/dist/indexes/index.d.ts +5 -5
  180. package/dist/indexes/index.js +10 -11
  181. package/dist/interchange/index.cjs +47 -26
  182. package/dist/interchange/index.d.cts +126 -12
  183. package/dist/interchange/index.d.ts +126 -12
  184. package/dist/interchange/index.js +14 -13
  185. package/dist/{manager-ms9cKdc6.d.cts → manager-DwQi8eV0.d.cts} +9 -2
  186. package/dist/{manager-BZUeN_BU.d.ts → manager-ejUCB52T.d.ts} +9 -2
  187. package/dist/{materialize-indexes-D20xNluI.d.cts → materialize-indexes-B4e9360H.d.cts} +20 -4
  188. package/dist/{materialize-indexes-CAkIYFV-.d.ts → materialize-indexes-te9TPMMJ.d.ts} +20 -4
  189. package/dist/{postgres-BhpxGMC5.d.cts → postgres-CfEqsRMp.d.cts} +152 -1
  190. package/dist/{postgres-CWHLwNl1.d.ts → postgres-DQ5R6rzV.d.ts} +152 -1
  191. package/dist/profiler/index.cjs +11 -11
  192. package/dist/profiler/index.d.cts +7 -7
  193. package/dist/profiler/index.d.ts +7 -7
  194. package/dist/profiler/index.js +4 -4
  195. package/dist/provenance/index.cjs +40 -41
  196. package/dist/provenance/index.cjs.map +1 -1
  197. package/dist/provenance/index.d.cts +5 -5
  198. package/dist/provenance/index.d.ts +5 -5
  199. package/dist/provenance/index.js +11 -12
  200. package/dist/provenance/index.js.map +1 -1
  201. package/dist/schema/index.cjs +53 -40
  202. package/dist/schema/index.cjs.map +1 -1
  203. package/dist/schema/index.d.cts +57 -57
  204. package/dist/schema/index.d.ts +57 -57
  205. package/dist/schema/index.js +28 -15
  206. package/dist/schema/index.js.map +1 -1
  207. package/dist/{sqlite-XrDxNaa7.d.cts → sqlite-D7zBinNR.d.cts} +92 -1
  208. package/dist/{sqlite-CGu5SLsw.d.ts → sqlite-DvQndLky.d.ts} +92 -1
  209. package/dist/{store-view-D09po4H6.d.cts → store-view-BSpqvAxK.d.cts} +415 -44
  210. package/dist/{store-view-BlgnhEYf.d.ts → store-view-CKbHFRnn.d.ts} +415 -44
  211. package/dist/{types-DiE1AO7p.d.cts → types-Bv9DcS_E.d.cts} +2 -2
  212. package/dist/{types-B1TbZJYS.d.ts → types-CoxuV7EJ.d.ts} +2 -2
  213. package/dist/{where-DKjuofPr.d.cts → where-7RKFOsXt.d.ts} +2 -2
  214. package/dist/{where-DrUIIWHb.d.ts → where-DdMIXOtH.d.cts} +2 -2
  215. package/package.json +14 -13
  216. package/dist/chunk-2EBMPJBO.js +0 -16
  217. package/dist/chunk-2EBMPJBO.js.map +0 -1
  218. package/dist/chunk-2JXB3NYJ.cjs.map +0 -1
  219. package/dist/chunk-2MRAX3UE.js.map +0 -1
  220. package/dist/chunk-3BRVBQQD.cjs.map +0 -1
  221. package/dist/chunk-3EUKJEQ3.js +0 -77
  222. package/dist/chunk-3EUKJEQ3.js.map +0 -1
  223. package/dist/chunk-3Z6TW3CT.cjs.map +0 -1
  224. package/dist/chunk-4DIBPQNJ.js.map +0 -1
  225. package/dist/chunk-4S2FXGBJ.js +0 -9
  226. package/dist/chunk-4S2FXGBJ.js.map +0 -1
  227. package/dist/chunk-5IQIX7LU.cjs.map +0 -1
  228. package/dist/chunk-6GNSY7AV.js.map +0 -1
  229. package/dist/chunk-6HVOHZHS.cjs.map +0 -1
  230. package/dist/chunk-6SCVW4AS.js +0 -20
  231. package/dist/chunk-6SCVW4AS.js.map +0 -1
  232. package/dist/chunk-A7SZZFAG.js.map +0 -1
  233. package/dist/chunk-CHXTTSC6.js.map +0 -1
  234. package/dist/chunk-CYX2JTDG.js.map +0 -1
  235. package/dist/chunk-DEQFL35G.js.map +0 -1
  236. package/dist/chunk-G6SOJEDI.cjs.map +0 -1
  237. package/dist/chunk-GQANNXXT.cjs.map +0 -1
  238. package/dist/chunk-GZCNZ7QW.js +0 -24
  239. package/dist/chunk-GZCNZ7QW.js.map +0 -1
  240. package/dist/chunk-HK5SATYM.cjs.map +0 -1
  241. package/dist/chunk-HMFK4BXR.cjs +0 -12
  242. package/dist/chunk-HTGDWIDE.cjs +0 -89
  243. package/dist/chunk-HTGDWIDE.cjs.map +0 -1
  244. package/dist/chunk-JIEJCTDS.cjs.map +0 -1
  245. package/dist/chunk-JJRCLAUN.cjs.map +0 -1
  246. package/dist/chunk-JQGIPGVL.cjs.map +0 -1
  247. package/dist/chunk-K2TGS3EN.js.map +0 -1
  248. package/dist/chunk-KGC4LY5T.cjs.map +0 -1
  249. package/dist/chunk-KNHYNQQ3.cjs +0 -663
  250. package/dist/chunk-KNHYNQQ3.cjs.map +0 -1
  251. package/dist/chunk-KUTNI6SI.js.map +0 -1
  252. package/dist/chunk-LANHCOXB.js.map +0 -1
  253. package/dist/chunk-N6WTUSBV.cjs +0 -23
  254. package/dist/chunk-N6WTUSBV.cjs.map +0 -1
  255. package/dist/chunk-NAUA4PW5.cjs +0 -28
  256. package/dist/chunk-NAUA4PW5.cjs.map +0 -1
  257. package/dist/chunk-QV245VMN.js.map +0 -1
  258. package/dist/chunk-RBV7YCQD.js.map +0 -1
  259. package/dist/chunk-RHZWOJVA.cjs.map +0 -1
  260. package/dist/chunk-RRKQAKD6.cjs.map +0 -1
  261. package/dist/chunk-RY2VIWAM.js.map +0 -1
  262. package/dist/chunk-SHLY4MCM.js.map +0 -1
  263. package/dist/chunk-T2DWPQNE.js +0 -649
  264. package/dist/chunk-T2DWPQNE.js.map +0 -1
  265. package/dist/chunk-T6SPUYLX.cjs.map +0 -1
  266. package/dist/chunk-TGJE22RM.cjs.map +0 -1
  267. package/dist/chunk-TOTPVGOG.cjs +0 -774
  268. package/dist/chunk-TOTPVGOG.cjs.map +0 -1
  269. package/dist/chunk-TQOYM4LN.js.map +0 -1
  270. package/dist/chunk-UJLOZYKT.cjs.map +0 -1
  271. package/dist/chunk-UNNPKQUG.cjs.map +0 -1
  272. package/dist/chunk-V3QNTB7Z.js.map +0 -1
  273. package/dist/chunk-VCGO4V26.js.map +0 -1
  274. package/dist/chunk-WLRIWYHQ.js.map +0 -1
  275. package/dist/chunk-WVC2Q2FD.cjs.map +0 -1
  276. package/dist/chunk-XXVEULWX.js +0 -39
  277. package/dist/chunk-XXVEULWX.js.map +0 -1
  278. package/dist/chunk-YAZE7QZR.cjs +0 -32
  279. package/dist/chunk-YAZE7QZR.cjs.map +0 -1
  280. package/dist/chunk-YC6PWTHY.cjs +0 -44
  281. package/dist/chunk-YC6PWTHY.cjs.map +0 -1
  282. package/dist/chunk-Z5HBYM7U.cjs +0 -11
  283. package/dist/chunk-Z5HBYM7U.cjs.map +0 -1
  284. package/dist/chunk-Z5XBMDXU.js.map +0 -1
  285. package/dist/chunk-ZP5WHI4C.cjs.map +0 -1
  286. package/dist/chunk-ZURTTSCM.js.map +0 -1
  287. package/dist/chunk-ZV5N4DBG.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/query/field-type-info.ts"],"names":["parseJsonPointer"],"mappings":";;;;;AAGA,SAAS,mBAAmB,OAAA,EAA0B;AACpD,EAAA,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC7B;AAEO,SAAS,iCAAA,CACd,UACA,OAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAWA,mCAAiB,OAAO,CAAA;AAEzC,EAAA,IAAI,OAAA,GAAqC,QAAA;AACzC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,cAAc,OAAA,EAAS;AACjC,MAAA,IAAI,CAAC,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,yBAAyB,OAAO,CAAA,4BAAA;AAAA,SAClC;AAAA,MACF;AACA,MAAA,OAAA,GAAU,OAAA,CAAQ,eAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,cAAc,QAAA,EAAU;AAClC,MAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,IAAW,OAAA,CAAQ,KAAA,EAAO;AAC7C,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA,OAAA,GAAU,OAAA,CAAQ,eAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,yBAAyB,OAAO,CAAA,iCAAA;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,sBAAA,EAAyB,OAAO,CAAA,kBAAA,EAAqB,OAAA,CAAQ,SAAS,CAAA;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT","file":"chunk-3E7SNSIA.cjs","sourcesContent":["import { type JsonPointer, parseJsonPointer } from \"./json-pointer\";\nimport { type FieldTypeInfo } from \"./schema-introspector\";\n\nfunction isJsonPointerIndex(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\nexport function resolveFieldTypeInfoAtJsonPointer(\n typeInfo: FieldTypeInfo | undefined,\n pointer: JsonPointer,\n): FieldTypeInfo | undefined {\n if (!typeInfo) {\n return undefined;\n }\n\n const segments = parseJsonPointer(pointer);\n\n let current: FieldTypeInfo | undefined = typeInfo;\n for (const segment of segments) {\n if (!current) {\n return undefined;\n }\n\n if (current.valueType === \"array\") {\n if (!isJsonPointerIndex(segment)) {\n throw new Error(\n `JSON Pointer segment \"${segment}\" is not a valid array index`,\n );\n }\n current = current.elementTypeInfo;\n continue;\n }\n\n if (current.valueType === \"object\") {\n if (isJsonPointerIndex(segment)) {\n throw new Error(\n \"JSON Pointer numeric segments are only valid for arrays\",\n );\n }\n if (current.shape && segment in current.shape) {\n current = current.shape[segment];\n continue;\n }\n if (current.recordValueType) {\n current = current.recordValueType;\n continue;\n }\n throw new Error(\n `JSON Pointer segment \"${segment}\" is not defined on object schema`,\n );\n }\n\n throw new Error(\n `JSON Pointer segment \"${segment}\" cannot traverse ${current.valueType}`,\n );\n }\n\n return current;\n}\n"]}
1
+ {"version":3,"sources":["../src/query/field-type-info.ts"],"names":["parseJsonPointer"],"mappings":";;;;;AAGA,SAAS,mBAAmB,OAAA,EAA0B;AACpD,EAAA,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC7B;AAEO,SAAS,iCAAA,CACd,UACA,OAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAWA,mCAAiB,OAAO,CAAA;AAEzC,EAAA,IAAI,OAAA,GAAqC,QAAA;AACzC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,cAAc,OAAA,EAAS;AACjC,MAAA,IAAI,CAAC,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,yBAAyB,OAAO,CAAA,4BAAA;AAAA,SAClC;AAAA,MACF;AACA,MAAA,OAAA,GAAU,OAAA,CAAQ,eAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,cAAc,QAAA,EAAU;AAClC,MAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,IAAW,OAAA,CAAQ,KAAA,EAAO;AAC7C,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA,OAAA,GAAU,OAAA,CAAQ,eAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,yBAAyB,OAAO,CAAA,iCAAA;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,sBAAA,EAAyB,OAAO,CAAA,kBAAA,EAAqB,OAAA,CAAQ,SAAS,CAAA;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT","file":"chunk-SJDMVITW.cjs","sourcesContent":["import { type JsonPointer, parseJsonPointer } from \"./json-pointer\";\nimport { type FieldTypeInfo } from \"./schema-introspector\";\n\nfunction isJsonPointerIndex(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\nexport function resolveFieldTypeInfoAtJsonPointer(\n typeInfo: FieldTypeInfo | undefined,\n pointer: JsonPointer,\n): FieldTypeInfo | undefined {\n if (!typeInfo) {\n return undefined;\n }\n\n const segments = parseJsonPointer(pointer);\n\n let current: FieldTypeInfo | undefined = typeInfo;\n for (const segment of segments) {\n if (!current) {\n return undefined;\n }\n\n if (current.valueType === \"array\") {\n if (!isJsonPointerIndex(segment)) {\n throw new Error(\n `JSON Pointer segment \"${segment}\" is not a valid array index`,\n );\n }\n current = current.elementTypeInfo;\n continue;\n }\n\n if (current.valueType === \"object\") {\n if (isJsonPointerIndex(segment)) {\n throw new Error(\n \"JSON Pointer numeric segments are only valid for arrays\",\n );\n }\n if (current.shape && segment in current.shape) {\n current = current.shape[segment];\n continue;\n }\n if (current.recordValueType) {\n current = current.recordValueType;\n continue;\n }\n throw new Error(\n `JSON Pointer segment \"${segment}\" is not defined on object schema`,\n );\n }\n\n throw new Error(\n `JSON Pointer segment \"${segment}\" cannot traverse ${current.valueType}`,\n );\n }\n\n return current;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { parseJsonPointer } from './chunk-K5P5OZXS.js';
1
+ import { parseJsonPointer } from './chunk-G6Q5UM7U.js';
2
2
 
3
3
  // src/query/field-type-info.ts
4
4
  function isJsonPointerIndex(segment) {
@@ -49,5 +49,5 @@ function resolveFieldTypeInfoAtJsonPointer(typeInfo, pointer) {
49
49
  }
50
50
 
51
51
  export { resolveFieldTypeInfoAtJsonPointer };
52
- //# sourceMappingURL=chunk-XLUNB2TZ.js.map
53
- //# sourceMappingURL=chunk-XLUNB2TZ.js.map
52
+ //# sourceMappingURL=chunk-SNXVDZAJ.js.map
53
+ //# sourceMappingURL=chunk-SNXVDZAJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/query/field-type-info.ts"],"names":[],"mappings":";;;AAGA,SAAS,mBAAmB,OAAA,EAA0B;AACpD,EAAA,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC7B;AAEO,SAAS,iCAAA,CACd,UACA,OAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AAEzC,EAAA,IAAI,OAAA,GAAqC,QAAA;AACzC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,cAAc,OAAA,EAAS;AACjC,MAAA,IAAI,CAAC,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,yBAAyB,OAAO,CAAA,4BAAA;AAAA,SAClC;AAAA,MACF;AACA,MAAA,OAAA,GAAU,OAAA,CAAQ,eAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,cAAc,QAAA,EAAU;AAClC,MAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,IAAW,OAAA,CAAQ,KAAA,EAAO;AAC7C,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA,OAAA,GAAU,OAAA,CAAQ,eAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,yBAAyB,OAAO,CAAA,iCAAA;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,sBAAA,EAAyB,OAAO,CAAA,kBAAA,EAAqB,OAAA,CAAQ,SAAS,CAAA;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT","file":"chunk-XLUNB2TZ.js","sourcesContent":["import { type JsonPointer, parseJsonPointer } from \"./json-pointer\";\nimport { type FieldTypeInfo } from \"./schema-introspector\";\n\nfunction isJsonPointerIndex(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\nexport function resolveFieldTypeInfoAtJsonPointer(\n typeInfo: FieldTypeInfo | undefined,\n pointer: JsonPointer,\n): FieldTypeInfo | undefined {\n if (!typeInfo) {\n return undefined;\n }\n\n const segments = parseJsonPointer(pointer);\n\n let current: FieldTypeInfo | undefined = typeInfo;\n for (const segment of segments) {\n if (!current) {\n return undefined;\n }\n\n if (current.valueType === \"array\") {\n if (!isJsonPointerIndex(segment)) {\n throw new Error(\n `JSON Pointer segment \"${segment}\" is not a valid array index`,\n );\n }\n current = current.elementTypeInfo;\n continue;\n }\n\n if (current.valueType === \"object\") {\n if (isJsonPointerIndex(segment)) {\n throw new Error(\n \"JSON Pointer numeric segments are only valid for arrays\",\n );\n }\n if (current.shape && segment in current.shape) {\n current = current.shape[segment];\n continue;\n }\n if (current.recordValueType) {\n current = current.recordValueType;\n continue;\n }\n throw new Error(\n `JSON Pointer segment \"${segment}\" is not defined on object schema`,\n );\n }\n\n throw new Error(\n `JSON Pointer segment \"${segment}\" cannot traverse ${current.valueType}`,\n );\n }\n\n return current;\n}\n"]}
1
+ {"version":3,"sources":["../src/query/field-type-info.ts"],"names":[],"mappings":";;;AAGA,SAAS,mBAAmB,OAAA,EAA0B;AACpD,EAAA,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC7B;AAEO,SAAS,iCAAA,CACd,UACA,OAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AAEzC,EAAA,IAAI,OAAA,GAAqC,QAAA;AACzC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,cAAc,OAAA,EAAS;AACjC,MAAA,IAAI,CAAC,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,yBAAyB,OAAO,CAAA,4BAAA;AAAA,SAClC;AAAA,MACF;AACA,MAAA,OAAA,GAAU,OAAA,CAAQ,eAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,cAAc,QAAA,EAAU;AAClC,MAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,IAAW,OAAA,CAAQ,KAAA,EAAO;AAC7C,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA,OAAA,GAAU,OAAA,CAAQ,eAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,yBAAyB,OAAO,CAAA,iCAAA;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,sBAAA,EAAyB,OAAO,CAAA,kBAAA,EAAqB,OAAA,CAAQ,SAAS,CAAA;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT","file":"chunk-SNXVDZAJ.js","sourcesContent":["import { type JsonPointer, parseJsonPointer } from \"./json-pointer\";\nimport { type FieldTypeInfo } from \"./schema-introspector\";\n\nfunction isJsonPointerIndex(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\nexport function resolveFieldTypeInfoAtJsonPointer(\n typeInfo: FieldTypeInfo | undefined,\n pointer: JsonPointer,\n): FieldTypeInfo | undefined {\n if (!typeInfo) {\n return undefined;\n }\n\n const segments = parseJsonPointer(pointer);\n\n let current: FieldTypeInfo | undefined = typeInfo;\n for (const segment of segments) {\n if (!current) {\n return undefined;\n }\n\n if (current.valueType === \"array\") {\n if (!isJsonPointerIndex(segment)) {\n throw new Error(\n `JSON Pointer segment \"${segment}\" is not a valid array index`,\n );\n }\n current = current.elementTypeInfo;\n continue;\n }\n\n if (current.valueType === \"object\") {\n if (isJsonPointerIndex(segment)) {\n throw new Error(\n \"JSON Pointer numeric segments are only valid for arrays\",\n );\n }\n if (current.shape && segment in current.shape) {\n current = current.shape[segment];\n continue;\n }\n if (current.recordValueType) {\n current = current.recordValueType;\n continue;\n }\n throw new Error(\n `JSON Pointer segment \"${segment}\" is not defined on object schema`,\n );\n }\n\n throw new Error(\n `JSON Pointer segment \"${segment}\" cannot traverse ${current.valueType}`,\n );\n }\n\n return current;\n}\n"]}
@@ -1,5 +1,6 @@
1
- import { quoteIdentifier, vectorScoreExpression, vectorMinScoreCondition, VECTOR_CONTRIBUTION_PREFIX, vectorPhysicalName, assertFiniteEmbedding } from './chunk-KUTNI6SI.js';
2
- import { quotedTableName } from './chunk-GZCNZ7QW.js';
1
+ import { vectorPageClause } from './chunk-DFVLCOP6.js';
2
+ import { quoteIdentifier, vectorScoreExpression, vectorMinScoreCondition, VECTOR_CONTRIBUTION_PREFIX, vectorPhysicalName, assertFiniteEmbedding } from './chunk-FPIZFYHE.js';
3
+ import { quotedTableName } from './chunk-OHMP6N2J.js';
3
4
  import { sql } from 'drizzle-orm';
4
5
 
5
6
  var TABLE_PREFIX = "tg_vec";
@@ -10,7 +11,16 @@ var LIBSQL_CAPABILITIES = {
10
11
  metrics: ["cosine", "l2"],
11
12
  // "hnsw" = portable ANN intent, realized as DiskANN. "none" = brute-force.
12
13
  indexTypes: ["hnsw", "none"],
13
- maxDimensions: LIBSQL_MAX_DIMENSIONS
14
+ maxDimensions: LIBSQL_MAX_DIMENSIONS,
15
+ // `vector_top_k` is a table function: no filter pushdown, no way to re-enter
16
+ // the index. A filtered DiskANN search over-fetches by
17
+ // CANDIDATE_FILTER_OVERFETCH and filters afterwards, so it under-fills once
18
+ // more than the headroom is filtered out. Unlike sqlite-vec (pushdown) and
19
+ // pgvector >= 0.8 (iterative scan), libSQL has no recovery at all.
20
+ filteredApproximateSearch: {
21
+ mode: "post-filter",
22
+ guaranteesFullPage: false
23
+ }
14
24
  };
15
25
  function usesAnnIndex(slot) {
16
26
  return slot.indexType === "hnsw";
@@ -104,6 +114,25 @@ var libsqlVectorStrategy = {
104
114
  `
105
115
  ];
106
116
  },
117
+ buildUpsertBatch(slot, params, timestamp) {
118
+ const table = quotedTableName(
119
+ this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
120
+ );
121
+ const valueRows = sql.join(
122
+ params.rows.map(
123
+ (row) => sql`(${params.graphId}, ${row.nodeId}, ${vector32Literal(row.embedding, "embedding")}, ${timestamp}, ${timestamp})`
124
+ ),
125
+ sql`, `
126
+ );
127
+ return [
128
+ sql`
129
+ INSERT INTO ${table} ("graph_id", "node_id", "embedding", "created_at", "updated_at")
130
+ VALUES ${valueRows}
131
+ ON CONFLICT ("graph_id", "node_id")
132
+ DO UPDATE SET "embedding" = excluded."embedding", "updated_at" = excluded."updated_at"
133
+ `
134
+ ];
135
+ },
107
136
  buildDelete(slot, params) {
108
137
  const table = quotedTableName(
109
138
  this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
@@ -115,7 +144,7 @@ var libsqlVectorStrategy = {
115
144
  `
116
145
  ];
117
146
  },
118
- buildSearch(slot, params) {
147
+ buildSearch(slot, params, candidates) {
119
148
  const table = this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
120
149
  const quoted = quotedTableName(table);
121
150
  const embeddingColumn = sql`${quoted}."embedding"`;
@@ -134,27 +163,37 @@ var libsqlVectorStrategy = {
134
163
  vectorMinScoreCondition(distance, params.metric, params.minScore)
135
164
  );
136
165
  }
166
+ if (candidates !== void 0) {
167
+ conditions2.push(sql`${quoted}."node_id" IN (${candidates})`);
168
+ }
169
+ const pageK = params.limit + (params.offset ?? 0);
170
+ const annK = candidates === void 0 ? pageK : pageK * CANDIDATE_FILTER_OVERFETCH;
171
+ const pageClause2 = vectorPageClause(params.limit, params.offset);
137
172
  return sql`
138
173
  SELECT ${quoted}."node_id" AS node_id, ${score} AS score
139
- FROM vector_top_k(${indexName}, ${query}, ${params.limit})
174
+ FROM vector_top_k(${indexName}, ${query}, ${annK})
140
175
  JOIN ${quoted} ON ${quoted}.rowid = id
141
176
  WHERE ${sql.join(conditions2, sql` AND `)}
142
177
  ORDER BY ${distance} ASC
143
- LIMIT ${params.limit}
178
+ ${pageClause2}
144
179
  `;
145
180
  }
146
181
  const conditions = [sql`${quoted}."graph_id" = ${params.graphId}`];
182
+ if (candidates !== void 0) {
183
+ conditions.push(sql`${quoted}."node_id" IN (${candidates})`);
184
+ }
147
185
  if (params.minScore !== void 0) {
148
186
  conditions.push(
149
187
  vectorMinScoreCondition(distance, params.metric, params.minScore)
150
188
  );
151
189
  }
190
+ const pageClause = vectorPageClause(params.limit, params.offset);
152
191
  return sql`
153
192
  SELECT ${quoted}."node_id" AS node_id, ${score} AS score
154
193
  FROM ${quoted}
155
194
  WHERE ${sql.join(conditions, sql` AND `)}
156
195
  ORDER BY ${distance} ASC
157
- LIMIT ${params.limit}
196
+ ${pageClause}
158
197
  `;
159
198
  },
160
199
  distanceExpression(embeddingColumn, queryEmbedding, metric) {
@@ -188,6 +227,7 @@ var libsqlVectorStrategy = {
188
227
  return statements;
189
228
  }
190
229
  };
230
+ var CANDIDATE_FILTER_OVERFETCH = 4;
191
231
  function libsqlIndexName(slot) {
192
232
  return vectorPhysicalName(
193
233
  INDEX_PREFIX,
@@ -203,5 +243,5 @@ function libsqlVectorIndexDdl(table, slot) {
203
243
  }
204
244
 
205
245
  export { libsqlVectorStrategy };
206
- //# sourceMappingURL=chunk-RBV7YCQD.js.map
207
- //# sourceMappingURL=chunk-RBV7YCQD.js.map
246
+ //# sourceMappingURL=chunk-T2WUSPDA.js.map
247
+ //# sourceMappingURL=chunk-T2WUSPDA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query/dialect/vector/libsql-strategy.ts"],"names":["conditions","pageClause"],"mappings":"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","file":"chunk-T2WUSPDA.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 UpsertEmbeddingBatchParams,\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\";\nimport { vectorPageClause } from \"./pagination\";\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 // `vector_top_k` is a table function: no filter pushdown, no way to re-enter\n // the index. A filtered DiskANN search over-fetches by\n // CANDIDATE_FILTER_OVERFETCH and filters afterwards, so it under-fills once\n // more than the headroom is filtered out. Unlike sqlite-vec (pushdown) and\n // pgvector >= 0.8 (iterative scan), libSQL has no recovery at all.\n filteredApproximateSearch: {\n mode: \"post-filter\",\n guaranteesFullPage: false,\n },\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 buildUpsertBatch(\n slot,\n params: UpsertEmbeddingBatchParams,\n timestamp,\n ): readonly SQL[] {\n const table = quotedTableName(\n this.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}, ${vector32Literal(row.embedding, \"embedding\")}, ${timestamp}, ${timestamp})`,\n ),\n sql`, `,\n );\n // `excluded.\"embedding\"` reuses the row's already-converted F32_BLOB\n // value, so the multi-row form needs no per-row conversion in the\n // update arm (unlike buildUpsert's single bound value).\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 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, candidates?: SQL): 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 // `vector_top_k` is a table function with no filter pushdown, so a\n // candidate filter can only be applied AFTER the ANN retrieval.\n // Over-fetch the DiskANN k to leave headroom for filtered-out rows;\n // recall is bounded by the over-fetch, and the page under-fills once\n // more than the headroom is filtered out. Declared, not merely noted:\n // `capabilities.filteredApproximateSearch.mode === \"post-filter\"`.\n if (candidates !== undefined) {\n conditions.push(sql`${quoted}.\"node_id\" IN (${candidates})`);\n }\n // `pageK` covers the requested page (`limit + offset`); the\n // candidate-filter over-fetch multiplies on top of it.\n const pageK = params.limit + (params.offset ?? 0);\n const annK =\n candidates === undefined ? pageK : pageK * CANDIDATE_FILTER_OVERFETCH;\n const pageClause = vectorPageClause(params.limit, params.offset);\n return sql`\n SELECT ${quoted}.\"node_id\" AS node_id, ${score} AS score\n FROM vector_top_k(${indexName}, ${query}, ${annK})\n JOIN ${quoted} ON ${quoted}.rowid = id\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distance} ASC\n ${pageClause}\n `;\n }\n\n // Brute-force scan.\n const conditions: SQL[] = [sql`${quoted}.\"graph_id\" = ${params.graphId}`];\n if (candidates !== undefined) {\n conditions.push(sql`${quoted}.\"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 ${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 ${pageClause}\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\n/**\n * DiskANN over-fetch multiplier applied when a candidate filter is present:\n * `vector_top_k` cannot pre-filter, so fetch `4k` neighbors and filter after.\n * Mirrors the hybrid facade's 4x over-fetch. Recall for the filtered search\n * is bounded by this headroom — if more than `3k` of the top `4k` neighbors\n * are filtered out, fewer than `k` rows return. That is the observable\n * meaning of `capabilities.filteredApproximateSearch.guaranteesFullPage`.\n */\nconst CANDIDATE_FILTER_OVERFETCH = 4;\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"]}
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunk2JXB3NYJ_cjs = require('./chunk-2JXB3NYJ.cjs');
4
- var chunkYAZE7QZR_cjs = require('./chunk-YAZE7QZR.cjs');
3
+ var chunkCUHM5CWJ_cjs = require('./chunk-CUHM5CWJ.cjs');
4
+ var chunkD7ZEOS56_cjs = require('./chunk-D7ZEOS56.cjs');
5
+ var chunk7YSP4V4R_cjs = require('./chunk-7YSP4V4R.cjs');
5
6
  var drizzleOrm = require('drizzle-orm');
6
7
  var pgCore = require('drizzle-orm/pg-core');
7
8
 
@@ -50,7 +51,20 @@ var PGVECTOR_CAPABILITIES = {
50
51
  supported: true,
51
52
  metrics: ["cosine", "l2", "inner_product"],
52
53
  indexTypes: ["hnsw", "ivfflat", "none"],
53
- maxDimensions: PGVECTOR_MAX_DIMENSIONS
54
+ maxDimensions: PGVECTOR_MAX_DIMENSIONS,
55
+ // The backend probes `pg_extension.extversion` once and turns on
56
+ // `hnsw.iterative_scan` / `ivfflat.iterative_scan` when pgvector >= 0.8, so a
57
+ // filtered scan re-enters the index for more candidates.
58
+ //
59
+ // NOT a full-page guarantee, on either axis. The iterative scan stops at
60
+ // `hnsw.max_scan_tuples` / `ivfflat.max_probes`; and on pgvector < 0.8 there
61
+ // is no iterative scan at all, so the search stays `ef_search`-bounded and
62
+ // behaves like a post-filter. A statically-declared mode cannot express
63
+ // either, which is why the guarantee is its own field.
64
+ filteredApproximateSearch: {
65
+ mode: "iterative-scan",
66
+ guaranteesFullPage: false
67
+ }
54
68
  };
55
69
  function usesAnnIndex(slot) {
56
70
  return slot.indexType === "hnsw" || slot.indexType === "ivfflat";
@@ -73,7 +87,7 @@ function operatorClass(metric) {
73
87
  }
74
88
  }
75
89
  function vectorLiteral(embedding, name) {
76
- chunk2JXB3NYJ_cjs.assertFiniteEmbedding(embedding, name);
90
+ chunkD7ZEOS56_cjs.assertFiniteEmbedding(embedding, name);
77
91
  return drizzleOrm.sql`${formatVector(embedding)}::vector`;
78
92
  }
79
93
  function distanceExpression(embeddingColumn, queryEmbedding, metric) {
@@ -98,11 +112,11 @@ var pgvectorStrategy = {
98
112
  name: "pgvector",
99
113
  capabilities: PGVECTOR_CAPABILITIES,
100
114
  tableName(graphId, nodeKind, fieldPath) {
101
- return chunk2JXB3NYJ_cjs.vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
115
+ return chunkD7ZEOS56_cjs.vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
102
116
  },
103
117
  ownedTables(slot) {
104
118
  const table = this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
105
- const name = chunk2JXB3NYJ_cjs.quoteIdentifier(table);
119
+ const name = chunkD7ZEOS56_cjs.quoteIdentifier(table);
106
120
  const createDdl = [
107
121
  `CREATE TABLE IF NOT EXISTS ${name} (
108
122
  "graph_id" TEXT NOT NULL,
@@ -115,7 +129,7 @@ var pgvectorStrategy = {
115
129
  ];
116
130
  return [
117
131
  {
118
- logicalName: `${chunk2JXB3NYJ_cjs.VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,
132
+ logicalName: `${chunkD7ZEOS56_cjs.VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,
119
133
  owner: "pgvector",
120
134
  tableName: table,
121
135
  createDdl,
@@ -124,7 +138,7 @@ var pgvectorStrategy = {
124
138
  ];
125
139
  },
126
140
  buildUpsert(slot, params, timestamp) {
127
- const table = chunkYAZE7QZR_cjs.quotedTableName(
141
+ const table = chunk7YSP4V4R_cjs.quotedTableName(
128
142
  this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
129
143
  );
130
144
  const value = vectorLiteral(params.embedding, "embedding");
@@ -137,8 +151,27 @@ var pgvectorStrategy = {
137
151
  `
138
152
  ];
139
153
  },
154
+ buildUpsertBatch(slot, params, timestamp) {
155
+ const table = chunk7YSP4V4R_cjs.quotedTableName(
156
+ this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
157
+ );
158
+ const valueRows = drizzleOrm.sql.join(
159
+ params.rows.map(
160
+ (row) => drizzleOrm.sql`(${params.graphId}, ${row.nodeId}, ${vectorLiteral(row.embedding, "embedding")}, ${timestamp}, ${timestamp})`
161
+ ),
162
+ drizzleOrm.sql`, `
163
+ );
164
+ return [
165
+ drizzleOrm.sql`
166
+ INSERT INTO ${table} ("graph_id", "node_id", "embedding", "created_at", "updated_at")
167
+ VALUES ${valueRows}
168
+ ON CONFLICT ("graph_id", "node_id")
169
+ DO UPDATE SET "embedding" = EXCLUDED."embedding", "updated_at" = EXCLUDED."updated_at"
170
+ `
171
+ ];
172
+ },
140
173
  buildDelete(slot, params) {
141
- const table = chunkYAZE7QZR_cjs.quotedTableName(
174
+ const table = chunk7YSP4V4R_cjs.quotedTableName(
142
175
  this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
143
176
  );
144
177
  return [
@@ -148,8 +181,8 @@ var pgvectorStrategy = {
148
181
  `
149
182
  ];
150
183
  },
151
- buildSearch(slot, params) {
152
- const table = chunkYAZE7QZR_cjs.quotedTableName(
184
+ buildSearch(slot, params, candidates) {
185
+ const table = chunk7YSP4V4R_cjs.quotedTableName(
153
186
  this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
154
187
  );
155
188
  const embeddingColumn = drizzleOrm.sql`${table}."embedding"`;
@@ -158,19 +191,40 @@ var pgvectorStrategy = {
158
191
  params.queryEmbedding,
159
192
  params.metric
160
193
  );
161
- const score = chunk2JXB3NYJ_cjs.vectorScoreExpression(distance, params.metric);
194
+ const score = chunkD7ZEOS56_cjs.vectorScoreExpression(distance, params.metric);
162
195
  const conditions = [drizzleOrm.sql`${table}."graph_id" = ${params.graphId}`];
163
196
  if (params.minScore !== void 0) {
164
197
  conditions.push(
165
- chunk2JXB3NYJ_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
198
+ chunkD7ZEOS56_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
166
199
  );
167
200
  }
201
+ if (candidates !== void 0) {
202
+ conditions.push(drizzleOrm.sql`${table}."node_id" IN (${candidates})`);
203
+ }
204
+ const pageOffset = params.offset ?? 0;
205
+ const pageClause = chunkCUHM5CWJ_cjs.vectorPageClause(params.limit, params.offset);
206
+ if (slot.indexType === "ivfflat") {
207
+ const direction = params.metric === "cosine" ? drizzleOrm.sql.raw("DESC") : drizzleOrm.sql.raw("ASC");
208
+ const relaxedBody = drizzleOrm.sql`
209
+ SELECT ${table}."node_id" AS node_id, ${score} AS score
210
+ FROM ${table}
211
+ WHERE ${drizzleOrm.sql.join(conditions, drizzleOrm.sql` AND `)}
212
+ ORDER BY ${distance} ASC
213
+ LIMIT ${params.limit + pageOffset}
214
+ `;
215
+ return drizzleOrm.sql`
216
+ WITH tg_vec_relaxed AS MATERIALIZED (${relaxedBody})
217
+ SELECT node_id, score FROM tg_vec_relaxed
218
+ ORDER BY score ${direction}, node_id ASC
219
+ ${pageClause}
220
+ `;
221
+ }
168
222
  return drizzleOrm.sql`
169
223
  SELECT ${table}."node_id" AS node_id, ${score} AS score
170
224
  FROM ${table}
171
225
  WHERE ${drizzleOrm.sql.join(conditions, drizzleOrm.sql` AND `)}
172
226
  ORDER BY ${distance} ASC
173
- LIMIT ${params.limit}
227
+ ${pageClause}
174
228
  `;
175
229
  },
176
230
  distanceExpression(embeddingColumn, queryEmbedding, metric) {
@@ -189,17 +243,17 @@ var pgvectorStrategy = {
189
243
  buildDropIndex(slot) {
190
244
  if (!usesAnnIndex(slot)) return void 0;
191
245
  const indexName = pgvectorIndexName(slot);
192
- return drizzleOrm.sql.raw(`DROP INDEX IF EXISTS ${chunk2JXB3NYJ_cjs.quoteIdentifier(indexName)}`);
246
+ return drizzleOrm.sql.raw(`DROP INDEX IF EXISTS ${chunkD7ZEOS56_cjs.quoteIdentifier(indexName)}`);
193
247
  },
194
248
  buildDropStorage(slot) {
195
- const table = chunk2JXB3NYJ_cjs.quoteIdentifier(
249
+ const table = chunkD7ZEOS56_cjs.quoteIdentifier(
196
250
  this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
197
251
  );
198
252
  return [`DROP TABLE IF EXISTS ${table} CASCADE`];
199
253
  }
200
254
  };
201
255
  function pgvectorIndexName(slot) {
202
- return chunk2JXB3NYJ_cjs.vectorPhysicalName(
256
+ return chunkD7ZEOS56_cjs.vectorPhysicalName(
203
257
  INDEX_PREFIX,
204
258
  slot.graphId,
205
259
  slot.nodeKind,
@@ -207,8 +261,8 @@ function pgvectorIndexName(slot) {
207
261
  );
208
262
  }
209
263
  function pgvectorIndexDdl(table, slot, concurrent) {
210
- const indexName = chunk2JXB3NYJ_cjs.quoteIdentifier(pgvectorIndexName(slot));
211
- const quotedTable = chunk2JXB3NYJ_cjs.quoteIdentifier(table);
264
+ const indexName = chunkD7ZEOS56_cjs.quoteIdentifier(pgvectorIndexName(slot));
265
+ const quotedTable = chunkD7ZEOS56_cjs.quoteIdentifier(table);
212
266
  const opClass = operatorClass(slot.metric);
213
267
  const m = slot.indexParams?.m ?? DEFAULT_HNSW_M;
214
268
  const efConstruction = slot.indexParams?.efConstruction ?? DEFAULT_HNSW_EF_CONSTRUCTION;
@@ -235,5 +289,5 @@ function pgvectorIndexDdl(table, slot, concurrent) {
235
289
 
236
290
  exports.assertPgvectorEfSearch = assertPgvectorEfSearch;
237
291
  exports.pgvectorStrategy = pgvectorStrategy;
238
- //# sourceMappingURL=chunk-KGC4LY5T.cjs.map
239
- //# sourceMappingURL=chunk-KGC4LY5T.cjs.map
292
+ //# sourceMappingURL=chunk-TCOCYN2P.cjs.map
293
+ //# sourceMappingURL=chunk-TCOCYN2P.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/backend/drizzle/columns/vector.ts","../src/query/dialect/vector/pgvector-strategy.ts"],"names":["customType","assertFiniteEmbedding","sql","vectorPhysicalName","quoteIdentifier","VECTOR_CONTRIBUTION_PREFIX","quotedTableName","vectorScoreExpression","vectorMinScoreCondition","vectorPageClause"],"mappings":"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","file":"chunk-TCOCYN2P.cjs","sourcesContent":["/**\n * Custom Drizzle column type for pgvector's VECTOR type.\n *\n * Provides native support for PostgreSQL vector embeddings without\n * requiring runtime casts in queries.\n *\n * @example\n * ```typescript\n * import { pgTable, text, integer } from \"drizzle-orm/pg-core\";\n * import { vector } from \"./columns/vector\";\n *\n * const embeddings = pgTable(\"embeddings\", {\n * id: text(\"id\").primaryKey(),\n * embedding: vector(\"embedding\"),\n * dimensions: integer(\"dimensions\"),\n * });\n * ```\n */\nimport { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * PostgreSQL vector column type for pgvector extension.\n *\n * Stores embeddings as native VECTOR type, enabling efficient\n * similarity search without runtime casts.\n *\n * The column type is unparameterized (`VECTOR` not `VECTOR(N)`)\n * to support multiple embedding dimensions in a single table.\n * Dimension validation is handled at the application level.\n *\n * @example\n * ```typescript\n * // In table definition\n * embedding: vector(\"embedding\").notNull(),\n *\n * // In queries - no cast needed\n * db.execute(sql`\n * SELECT * FROM embeddings\n * WHERE embedding <=> ${formatVector([0.1, 0.2, 0.3])} < 0.5\n * `);\n * ```\n */\nexport const vector = customType<{\n data: number[];\n driverData: string;\n config: { dimensions?: number };\n}>({\n dataType(config) {\n // Use parameterized type if dimensions specified, otherwise unparameterized\n return config?.dimensions ? `vector(${config.dimensions})` : \"vector\";\n },\n\n toDriver(value: number[]): string {\n // Format as pgvector literal: [1.0,2.0,3.0]\n return `[${value.join(\",\")}]`;\n },\n\n fromDriver(value: string): number[] {\n // pgvector returns '[1,2,3]' format\n // Handle both string and already-parsed array (some drivers differ)\n if (Array.isArray(value)) {\n return value as number[];\n }\n // Parse the string representation\n const content = value.slice(1, -1); // Remove [ and ]\n if (content === \"\") {\n return [];\n }\n return content.split(\",\").map((s) => Number.parseFloat(s.trim()));\n },\n});\n\n/**\n * Formats a number array as a pgvector literal string.\n *\n * Use this when building raw SQL queries with embeddings.\n *\n * @example\n * ```typescript\n * const embedding = [0.1, 0.2, 0.3];\n * db.execute(sql`\n * SELECT * FROM embeddings\n * WHERE embedding <=> ${formatVector(embedding)}::vector < 0.5\n * `);\n * ```\n */\nexport function formatVector(embedding: readonly number[]): string {\n return `[${embedding.join(\",\")}]`;\n}\n","/**\n * 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 SQL, sql } from \"drizzle-orm\";\n\nimport { formatVector } from \"../../../backend/drizzle/columns/vector\";\nimport { quotedTableName } from \"../../../backend/drizzle/operations/shared\";\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 {\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(embedding: readonly number[], name: string): SQL {\n assertFiniteEmbedding(embedding, name);\n return sql`${formatVector(embedding)}::vector`;\n}\n\nfunction distanceExpression(\n embeddingColumn: SQL,\n queryEmbedding: readonly number[],\n metric: VectorMetric,\n): SQL {\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\nexport const pgvectorStrategy: VectorStrategy = {\n name: \"pgvector\",\n capabilities: PGVECTOR_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\" 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(slot, params: UpsertEmbeddingParams, timestamp): readonly SQL[] {\n const table = quotedTableName(\n this.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 SQL[] {\n const table = quotedTableName(\n this.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 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, candidates?: SQL): SQL {\n const table = quotedTableName(\n this.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: SQL[] = [sql`${table}.\"graph_id\" = ${params.graphId}`];\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): SQL | undefined {\n if (!usesAnnIndex(slot)) return undefined;\n return sql.raw(\n pgvectorIndexDdl(\n this.tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n slot,\n options?.concurrent === true,\n ),\n );\n },\n\n buildDropIndex(slot): SQL | 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 this.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"]}
@@ -118,5 +118,5 @@ exports.jsonPointer = jsonPointer;
118
118
  exports.normalizeJsonPointer = normalizeJsonPointer;
119
119
  exports.parseJsonPointer = parseJsonPointer;
120
120
  exports.resolveJsonPointer = resolveJsonPointer;
121
- //# sourceMappingURL=chunk-FLRCVI2G.cjs.map
122
- //# sourceMappingURL=chunk-FLRCVI2G.cjs.map
121
+ //# sourceMappingURL=chunk-TDXIBCGY.cjs.map
122
+ //# sourceMappingURL=chunk-TDXIBCGY.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/query/json-pointer.ts"],"names":[],"mappings":"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","file":"chunk-FLRCVI2G.cjs","sourcesContent":["// JSON Pointer utilities and types.\n\nexport const MAX_JSON_POINTER_DEPTH = 5 as const;\n\nexport type JsonPointer = string & { readonly __jsonPointer: unique symbol };\nexport type JsonPointerSegment = string | number;\nexport type JsonPointerSegments = readonly JsonPointerSegment[];\n\ntype Depth = 0 | 1 | 2 | 3 | 4 | 5;\n\ninterface DepthDecrementMap {\n 0: 0;\n 1: 0;\n 2: 1;\n 3: 2;\n 4: 3;\n 5: 4;\n}\n\ntype Decrement<Current extends Depth> = DepthDecrementMap[Current];\n\ntype NonNegativeIntegerString = Exclude<`${bigint}`, `-${string}`>;\ntype ObjectPointerKey<T> = Exclude<\n Extract<keyof T, string>,\n NonNegativeIntegerString\n>;\n\ntype EncodeTilde<S extends string> =\n S extends `${infer Head}~${infer Tail}` ?\n `${EncodeTilde<Head>}~0${EncodeTilde<Tail>}`\n : S;\n\ntype EncodeSlash<S extends string> =\n S extends `${infer Head}/${infer Tail}` ?\n `${EncodeSlash<Head>}~1${EncodeSlash<Tail>}`\n : S;\n\ntype EncodePointerSegment<S extends string> = EncodeSlash<EncodeTilde<S>>;\n\ntype DecodePointerSegment<S extends string> =\n S extends `${infer Head}~1${infer Tail}` ?\n `${DecodePointerSegment<Head>}/${DecodePointerSegment<Tail>}`\n : S extends `${infer Head}~0${infer Tail}` ?\n `${DecodePointerSegment<Head>}~${DecodePointerSegment<Tail>}`\n : S;\n\ntype PointerForArray<T, Current extends Depth> =\n | `/${NonNegativeIntegerString}`\n | (Current extends 1 ? never\n : `/${NonNegativeIntegerString}${JsonPointerFor<T, Decrement<Current>>}`);\n\ntype PointerForObject<T, Current extends Depth> = {\n [K in ObjectPointerKey<T>]:\n | `/${EncodePointerSegment<K>}`\n | (Current extends 1 ? never\n : `/${EncodePointerSegment<K>}${JsonPointerFor<T[K], Decrement<Current>>}`);\n}[ObjectPointerKey<T>];\n\nexport type JsonPointerFor<T, Current extends Depth = 5> =\n | \"\"\n | (Current extends 0 ? \"\"\n : T extends readonly (infer U)[] ? PointerForArray<U, Current>\n : never)\n | (Current extends 0 ? \"\"\n : T extends Record<string, unknown> ? PointerForObject<T, Current>\n : never);\n\ntype PointerSegmentsForArray<T, Current extends Depth> =\n | readonly [number]\n | (Current extends 1 ? readonly [number]\n : readonly [number, ...JsonPointerSegmentsFor<T, Decrement<Current>>]);\n\ntype PointerSegmentsForObject<T, Current extends Depth> = {\n [K in ObjectPointerKey<T>]:\n | readonly [K]\n | (Current extends 1 ? readonly [K]\n : readonly [K, ...JsonPointerSegmentsFor<T[K], Decrement<Current>>]);\n}[ObjectPointerKey<T>];\n\nexport type JsonPointerSegmentsFor<T, Current extends Depth = 5> =\n | readonly []\n | (Current extends 0 ? readonly []\n : T extends readonly (infer U)[] ? PointerSegmentsForArray<U, Current>\n : never)\n | (Current extends 0 ? readonly []\n : T extends Record<string, unknown> ? PointerSegmentsForObject<T, Current>\n : never);\n\nexport type JsonPointerInput<T> =\n | JsonPointerFor<T>\n | JsonPointerSegmentsFor<T>\n | JsonPointer;\n\nexport type ResolveJsonPointer<T, Pointer extends string> =\n Pointer extends \"\" ? T\n : Pointer extends `/${infer Head}/${infer Tail}` ?\n ResolveJsonPointer<\n ResolvePointerSegment<T, DecodePointerSegment<Head>>,\n `/${Tail}`\n >\n : Pointer extends `/${infer Head}` ?\n ResolvePointerSegment<T, DecodePointerSegment<Head>>\n : unknown;\n\ntype ResolvePointerSegment<T, Segment extends string> =\n T extends readonly (infer U)[] ?\n Segment extends NonNegativeIntegerString ?\n U\n : unknown\n : T extends Record<string, unknown> ?\n Segment extends keyof T ?\n Segment extends NonNegativeIntegerString ?\n unknown\n : T[Segment]\n : unknown\n : unknown;\n\nexport type ResolveJsonPointerSegments<\n T,\n Segments extends readonly JsonPointerSegment[],\n> =\n Segments extends readonly [] ? T\n : Segments extends readonly [infer Head, ...infer Tail] ?\n ResolveJsonPointerSegments<\n ResolvePointerSegment<T, SegmentToString<Head>>,\n Extract<Tail, readonly JsonPointerSegment[]>\n >\n : unknown;\n\ntype SegmentToString<Segment> =\n Segment extends number ? `${Segment}`\n : Segment extends string ? Segment\n : string;\n\nexport function jsonPointer(segments: JsonPointerSegments): JsonPointer {\n if (segments.length > MAX_JSON_POINTER_DEPTH) {\n throw new Error(\n `JSON Pointer exceeds max depth ${MAX_JSON_POINTER_DEPTH}: ${segments.length}`,\n );\n }\n\n if (segments.length === 0) {\n return \"\" as JsonPointer;\n }\n\n const encoded = segments.map((segment) => {\n if (segment === \"-\") {\n throw new Error(\n \"JSON Pointer '-' segment is not allowed for query access\",\n );\n }\n if (typeof segment === \"number\") {\n if (!Number.isInteger(segment) || segment < 0) {\n throw new Error(\n `JSON Pointer index must be a non-negative integer: ${segment}`,\n );\n }\n return segment.toString();\n }\n return encodeJsonPointerSegment(segment);\n });\n\n return `/${encoded.join(\"/\")}` as JsonPointer;\n}\n\nfunction isJsonPointerSegments(\n input: unknown,\n): input is readonly JsonPointerSegment[] {\n return Array.isArray(input);\n}\n\nexport function normalizeJsonPointer<T>(\n input: JsonPointerInput<T>,\n): JsonPointer {\n if (isJsonPointerSegments(input)) {\n return jsonPointer(input);\n }\n\n return assertJsonPointer(input);\n}\n\nexport function parseJsonPointer(pointer: JsonPointer): readonly string[] {\n if (pointer === \"\") {\n return [];\n }\n\n const rawSegments = pointer.slice(1).split(\"/\");\n return rawSegments.map((segment) => decodeJsonPointerSegment(segment));\n}\n\n/**\n * Resolves the value at a JSON pointer within a plain JS value, returning\n * `undefined` if any segment is missing or traverses a non-object.\n */\nexport function resolveJsonPointer(\n value: unknown,\n pointer: JsonPointer,\n): unknown {\n let current = value;\n for (const segment of parseJsonPointer(pointer)) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nexport function joinJsonPointers(\n base: JsonPointer | undefined,\n relative: JsonPointer,\n): JsonPointer {\n if (!base || base === \"\") {\n return relative;\n }\n if (relative === \"\") {\n return base;\n }\n\n const combinedSegments = [\n ...parseJsonPointer(base),\n ...parseJsonPointer(relative),\n ];\n return jsonPointer(combinedSegments);\n}\n\nfunction assertJsonPointer(pointer: string): JsonPointer {\n if (pointer !== \"\" && !pointer.startsWith(\"/\")) {\n throw new Error(\"JSON Pointer must be empty or start with '/'\");\n }\n\n const segments = pointer === \"\" ? [] : pointer.slice(1).split(\"/\");\n if (segments.length > MAX_JSON_POINTER_DEPTH) {\n throw new Error(\n `JSON Pointer exceeds max depth ${MAX_JSON_POINTER_DEPTH}: ${segments.length}`,\n );\n }\n\n for (const segment of segments) {\n if (segment === \"-\") {\n throw new Error(\n \"JSON Pointer '-' segment is not allowed for query access\",\n );\n }\n if (!isValidPointerEncoding(segment)) {\n throw new Error(\n `Invalid JSON Pointer escape sequence in segment: ${segment}`,\n );\n }\n }\n\n return pointer as JsonPointer;\n}\n\n/**\n * Escape a single JSON Pointer reference segment per RFC 6901: `~`\n * becomes `~0`, `/` becomes `~1`. Callers join the result with `/`.\n */\nexport function encodeJsonPointerSegment(segment: string): string {\n return segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n}\n\nfunction decodeJsonPointerSegment(segment: string): string {\n return segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n}\n\nfunction isValidPointerEncoding(segment: string): boolean {\n for (let index = 0; index < segment.length; index += 1) {\n if (segment[index] !== \"~\") {\n continue;\n }\n const next = segment[index + 1];\n if (next !== \"0\" && next !== \"1\") {\n return false;\n }\n index += 1;\n }\n return true;\n}\n"]}
1
+ {"version":3,"sources":["../src/query/json-pointer.ts"],"names":[],"mappings":"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","file":"chunk-TDXIBCGY.cjs","sourcesContent":["// JSON Pointer utilities and types.\n\nexport const MAX_JSON_POINTER_DEPTH = 5 as const;\n\nexport type JsonPointer = string & { readonly __jsonPointer: unique symbol };\nexport type JsonPointerSegment = string | number;\nexport type JsonPointerSegments = readonly JsonPointerSegment[];\n\ntype Depth = 0 | 1 | 2 | 3 | 4 | 5;\n\ninterface DepthDecrementMap {\n 0: 0;\n 1: 0;\n 2: 1;\n 3: 2;\n 4: 3;\n 5: 4;\n}\n\ntype Decrement<Current extends Depth> = DepthDecrementMap[Current];\n\ntype NonNegativeIntegerString = Exclude<`${bigint}`, `-${string}`>;\ntype ObjectPointerKey<T> = Exclude<\n Extract<keyof T, string>,\n NonNegativeIntegerString\n>;\n\ntype EncodeTilde<S extends string> =\n S extends `${infer Head}~${infer Tail}` ?\n `${EncodeTilde<Head>}~0${EncodeTilde<Tail>}`\n : S;\n\ntype EncodeSlash<S extends string> =\n S extends `${infer Head}/${infer Tail}` ?\n `${EncodeSlash<Head>}~1${EncodeSlash<Tail>}`\n : S;\n\ntype EncodePointerSegment<S extends string> = EncodeSlash<EncodeTilde<S>>;\n\ntype DecodePointerSegment<S extends string> =\n S extends `${infer Head}~1${infer Tail}` ?\n `${DecodePointerSegment<Head>}/${DecodePointerSegment<Tail>}`\n : S extends `${infer Head}~0${infer Tail}` ?\n `${DecodePointerSegment<Head>}~${DecodePointerSegment<Tail>}`\n : S;\n\ntype PointerForArray<T, Current extends Depth> =\n | `/${NonNegativeIntegerString}`\n | (Current extends 1 ? never\n : `/${NonNegativeIntegerString}${JsonPointerFor<T, Decrement<Current>>}`);\n\ntype PointerForObject<T, Current extends Depth> = {\n [K in ObjectPointerKey<T>]:\n | `/${EncodePointerSegment<K>}`\n | (Current extends 1 ? never\n : `/${EncodePointerSegment<K>}${JsonPointerFor<T[K], Decrement<Current>>}`);\n}[ObjectPointerKey<T>];\n\nexport type JsonPointerFor<T, Current extends Depth = 5> =\n | \"\"\n | (Current extends 0 ? \"\"\n : T extends readonly (infer U)[] ? PointerForArray<U, Current>\n : never)\n | (Current extends 0 ? \"\"\n : T extends Record<string, unknown> ? PointerForObject<T, Current>\n : never);\n\ntype PointerSegmentsForArray<T, Current extends Depth> =\n | readonly [number]\n | (Current extends 1 ? readonly [number]\n : readonly [number, ...JsonPointerSegmentsFor<T, Decrement<Current>>]);\n\ntype PointerSegmentsForObject<T, Current extends Depth> = {\n [K in ObjectPointerKey<T>]:\n | readonly [K]\n | (Current extends 1 ? readonly [K]\n : readonly [K, ...JsonPointerSegmentsFor<T[K], Decrement<Current>>]);\n}[ObjectPointerKey<T>];\n\nexport type JsonPointerSegmentsFor<T, Current extends Depth = 5> =\n | readonly []\n | (Current extends 0 ? readonly []\n : T extends readonly (infer U)[] ? PointerSegmentsForArray<U, Current>\n : never)\n | (Current extends 0 ? readonly []\n : T extends Record<string, unknown> ? PointerSegmentsForObject<T, Current>\n : never);\n\nexport type JsonPointerInput<T> =\n JsonPointerFor<T> | JsonPointerSegmentsFor<T> | JsonPointer;\n\nexport type ResolveJsonPointer<T, Pointer extends string> =\n Pointer extends \"\" ? T\n : Pointer extends `/${infer Head}/${infer Tail}` ?\n ResolveJsonPointer<\n ResolvePointerSegment<T, DecodePointerSegment<Head>>,\n `/${Tail}`\n >\n : Pointer extends `/${infer Head}` ?\n ResolvePointerSegment<T, DecodePointerSegment<Head>>\n : unknown;\n\ntype ResolvePointerSegment<T, Segment extends string> =\n T extends readonly (infer U)[] ?\n Segment extends NonNegativeIntegerString ?\n U\n : unknown\n : T extends Record<string, unknown> ?\n Segment extends keyof T ?\n Segment extends NonNegativeIntegerString ?\n unknown\n : T[Segment]\n : unknown\n : unknown;\n\nexport type ResolveJsonPointerSegments<\n T,\n Segments extends readonly JsonPointerSegment[],\n> =\n Segments extends readonly [] ? T\n : Segments extends readonly [infer Head, ...infer Tail] ?\n ResolveJsonPointerSegments<\n ResolvePointerSegment<T, SegmentToString<Head>>,\n Extract<Tail, readonly JsonPointerSegment[]>\n >\n : unknown;\n\ntype SegmentToString<Segment> =\n Segment extends number ? `${Segment}`\n : Segment extends string ? Segment\n : string;\n\nexport function jsonPointer(segments: JsonPointerSegments): JsonPointer {\n if (segments.length > MAX_JSON_POINTER_DEPTH) {\n throw new Error(\n `JSON Pointer exceeds max depth ${MAX_JSON_POINTER_DEPTH}: ${segments.length}`,\n );\n }\n\n if (segments.length === 0) {\n return \"\" as JsonPointer;\n }\n\n const encoded = segments.map((segment) => {\n if (segment === \"-\") {\n throw new Error(\n \"JSON Pointer '-' segment is not allowed for query access\",\n );\n }\n if (typeof segment === \"number\") {\n if (!Number.isInteger(segment) || segment < 0) {\n throw new Error(\n `JSON Pointer index must be a non-negative integer: ${segment}`,\n );\n }\n return segment.toString();\n }\n return encodeJsonPointerSegment(segment);\n });\n\n return `/${encoded.join(\"/\")}` as JsonPointer;\n}\n\nfunction isJsonPointerSegments(\n input: unknown,\n): input is readonly JsonPointerSegment[] {\n return Array.isArray(input);\n}\n\nexport function normalizeJsonPointer<T>(\n input: JsonPointerInput<T>,\n): JsonPointer {\n if (isJsonPointerSegments(input)) {\n return jsonPointer(input);\n }\n\n return assertJsonPointer(input);\n}\n\nexport function parseJsonPointer(pointer: JsonPointer): readonly string[] {\n if (pointer === \"\") {\n return [];\n }\n\n const rawSegments = pointer.slice(1).split(\"/\");\n return rawSegments.map((segment) => decodeJsonPointerSegment(segment));\n}\n\n/**\n * Resolves the value at a JSON pointer within a plain JS value, returning\n * `undefined` if any segment is missing or traverses a non-object.\n */\nexport function resolveJsonPointer(\n value: unknown,\n pointer: JsonPointer,\n): unknown {\n let current = value;\n for (const segment of parseJsonPointer(pointer)) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nexport function joinJsonPointers(\n base: JsonPointer | undefined,\n relative: JsonPointer,\n): JsonPointer {\n if (!base || base === \"\") {\n return relative;\n }\n if (relative === \"\") {\n return base;\n }\n\n const combinedSegments = [\n ...parseJsonPointer(base),\n ...parseJsonPointer(relative),\n ];\n return jsonPointer(combinedSegments);\n}\n\nfunction assertJsonPointer(pointer: string): JsonPointer {\n if (pointer !== \"\" && !pointer.startsWith(\"/\")) {\n throw new Error(\"JSON Pointer must be empty or start with '/'\");\n }\n\n const segments = pointer === \"\" ? [] : pointer.slice(1).split(\"/\");\n if (segments.length > MAX_JSON_POINTER_DEPTH) {\n throw new Error(\n `JSON Pointer exceeds max depth ${MAX_JSON_POINTER_DEPTH}: ${segments.length}`,\n );\n }\n\n for (const segment of segments) {\n if (segment === \"-\") {\n throw new Error(\n \"JSON Pointer '-' segment is not allowed for query access\",\n );\n }\n if (!isValidPointerEncoding(segment)) {\n throw new Error(\n `Invalid JSON Pointer escape sequence in segment: ${segment}`,\n );\n }\n }\n\n return pointer as JsonPointer;\n}\n\n/**\n * Escape a single JSON Pointer reference segment per RFC 6901: `~`\n * becomes `~0`, `/` becomes `~1`. Callers join the result with `/`.\n */\nexport function encodeJsonPointerSegment(segment: string): string {\n return segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n}\n\nfunction decodeJsonPointerSegment(segment: string): string {\n return segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n}\n\nfunction isValidPointerEncoding(segment: string): boolean {\n for (let index = 0; index < segment.length; index += 1) {\n if (segment[index] !== \"~\") {\n continue;\n }\n const next = segment[index + 1];\n if (next !== \"0\" && next !== \"1\") {\n return false;\n }\n index += 1;\n }\n return true;\n}\n"]}
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkNAUA4PW5_cjs = require('./chunk-NAUA4PW5.cjs');
3
+ var chunk7YSP4V4R_cjs = require('./chunk-7YSP4V4R.cjs');
4
4
 
5
5
  // src/utils/hash.ts
6
6
  function fnv1aBase36(input) {
7
- let hash = chunkNAUA4PW5_cjs.FNV1A_OFFSET_BASIS;
7
+ let hash = chunk7YSP4V4R_cjs.FNV1A_OFFSET_BASIS;
8
8
  for (const character of input) {
9
9
  const codePoint = character.codePointAt(0);
10
10
  if (codePoint === void 0) continue;
11
11
  hash ^= codePoint;
12
- hash = Math.imul(hash, chunkNAUA4PW5_cjs.FNV1A_PRIME);
12
+ hash = Math.imul(hash, chunk7YSP4V4R_cjs.FNV1A_PRIME);
13
13
  }
14
14
  return (hash >>> 0).toString(36);
15
15
  }
@@ -28,5 +28,5 @@ async function sha256Hex(input, byteLength = 8) {
28
28
 
29
29
  exports.fnv1aBase36 = fnv1aBase36;
30
30
  exports.sha256Hex = sha256Hex;
31
- //# sourceMappingURL=chunk-ZY4GXIVN.cjs.map
32
- //# sourceMappingURL=chunk-ZY4GXIVN.cjs.map
31
+ //# sourceMappingURL=chunk-TEDRJXOG.cjs.map
32
+ //# sourceMappingURL=chunk-TEDRJXOG.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/hash.ts"],"names":["FNV1A_OFFSET_BASIS","FNV1A_PRIME"],"mappings":";;;;;AAWO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,IAAA,GAAOA,oCAAA;AACX,EAAA,KAAA,MAAW,aAAa,KAAA,EAAO;AAC7B,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,CAAY,CAAC,CAAA;AACzC,IAAA,IAAI,cAAc,MAAA,EAAW;AAC7B,IAAA,IAAA,IAAQ,SAAA;AACR,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAMC,6BAAW,CAAA;AAAA,EACpC;AACA,EAAA,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA;AACjC;AAWA,eAAsB,SAAA,CACpB,KAAA,EACA,UAAA,GAAa,CAAA,EACI;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY,CAAE,OAAO,KAAK,CAAA;AAC9C,EAAA,MAAM,SAAS,MAAM,UAAA,CAAW,OAAO,MAAA,CAAO,MAAA,CAAO,WAAW,OAAO,CAAA;AACvE,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,UAAA,EAAY,KAAA,EAAA,EAAS;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,IAAA,IAAI,SAAS,MAAA,EAAW;AACxB,IAAA,GAAA,IAAO,KAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-ZY4GXIVN.cjs","sourcesContent":["/**\n * Hash utilities — FNV-1a for fast non-cryptographic identifier\n * generation, SHA-256 (truncated) for collision-resistant signatures.\n */\nimport { FNV1A_OFFSET_BASIS, FNV1A_PRIME } from \"../constants\";\n\n/**\n * FNV-1a hash of `input`, returned as a base-36 encoded string. Used for\n * generating short, deterministic identifiers (column aliases, index\n * name suffixes, etc.).\n */\nexport function fnv1aBase36(input: string): string {\n let hash = FNV1A_OFFSET_BASIS;\n for (const character of input) {\n const codePoint = character.codePointAt(0);\n if (codePoint === undefined) continue;\n hash ^= codePoint;\n hash = Math.imul(hash, FNV1A_PRIME);\n }\n return (hash >>> 0).toString(36);\n}\n\n/**\n * Hex-truncated SHA-256 of `input` via the Web Crypto API. Works in\n * Node.js 16+, Cloudflare Workers, Deno, and browsers.\n *\n * `byteLength` controls how many bytes of the digest are emitted —\n * default 8 (16 hex chars, ~64 bits, sufficient for schema-version and\n * per-graph index signatures). Pass 16 (32 hex chars) when hashes are\n * compared against externally-stored signatures.\n */\nexport async function sha256Hex(\n input: string,\n byteLength = 8,\n): Promise<string> {\n const encoded = new TextEncoder().encode(input);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", encoded);\n const bytes = new Uint8Array(digest);\n let hex = \"\";\n for (let index = 0; index < byteLength; index++) {\n const byte = bytes[index];\n if (byte === undefined) break;\n hex += byte.toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/hash.ts"],"names":["FNV1A_OFFSET_BASIS","FNV1A_PRIME"],"mappings":";;;;;AAWO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,IAAA,GAAOA,oCAAA;AACX,EAAA,KAAA,MAAW,aAAa,KAAA,EAAO;AAC7B,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,CAAY,CAAC,CAAA;AACzC,IAAA,IAAI,cAAc,MAAA,EAAW;AAC7B,IAAA,IAAA,IAAQ,SAAA;AACR,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAMC,6BAAW,CAAA;AAAA,EACpC;AACA,EAAA,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA;AACjC;AAWA,eAAsB,SAAA,CACpB,KAAA,EACA,UAAA,GAAa,CAAA,EACI;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY,CAAE,OAAO,KAAK,CAAA;AAC9C,EAAA,MAAM,SAAS,MAAM,UAAA,CAAW,OAAO,MAAA,CAAO,MAAA,CAAO,WAAW,OAAO,CAAA;AACvE,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,UAAA,EAAY,KAAA,EAAA,EAAS;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,IAAA,IAAI,SAAS,MAAA,EAAW;AACxB,IAAA,GAAA,IAAO,KAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-TEDRJXOG.cjs","sourcesContent":["/**\n * Hash utilities — FNV-1a for fast non-cryptographic identifier\n * generation, SHA-256 (truncated) for collision-resistant signatures.\n */\nimport { FNV1A_OFFSET_BASIS, FNV1A_PRIME } from \"../constants\";\n\n/**\n * FNV-1a hash of `input`, returned as a base-36 encoded string. Used for\n * generating short, deterministic identifiers (column aliases, index\n * name suffixes, etc.).\n */\nexport function fnv1aBase36(input: string): string {\n let hash = FNV1A_OFFSET_BASIS;\n for (const character of input) {\n const codePoint = character.codePointAt(0);\n if (codePoint === undefined) continue;\n hash ^= codePoint;\n hash = Math.imul(hash, FNV1A_PRIME);\n }\n return (hash >>> 0).toString(36);\n}\n\n/**\n * Hex-truncated SHA-256 of `input` via the Web Crypto API. Works in\n * Node.js 16+, Cloudflare Workers, Deno, and browsers.\n *\n * `byteLength` controls how many bytes of the digest are emitted —\n * default 8 (16 hex chars, ~64 bits, sufficient for schema-version and\n * per-graph index signatures). Pass 16 (32 hex chars) when hashes are\n * compared against externally-stored signatures.\n */\nexport async function sha256Hex(\n input: string,\n byteLength = 8,\n): Promise<string> {\n const encoded = new TextEncoder().encode(input);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", encoded);\n const bytes = new Uint8Array(digest);\n let hex = \"\";\n for (let index = 0; index < byteLength; index++) {\n const byte = bytes[index];\n if (byte === undefined) break;\n hex += byte.toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n"]}