@nicia-ai/typegraph 0.49.0 → 0.50.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 (327) hide show
  1. package/dist/backend/drizzle/indexes.cjs +9 -9
  2. package/dist/backend/drizzle/indexes.d.cts +1 -1
  3. package/dist/backend/drizzle/indexes.d.ts +1 -1
  4. package/dist/backend/drizzle/indexes.js +5 -5
  5. package/dist/backend/index.cjs +56 -52
  6. package/dist/backend/index.d.cts +3 -3
  7. package/dist/backend/index.d.ts +3 -3
  8. package/dist/backend/index.js +11 -11
  9. package/dist/backend/postgres/index.cjs +34 -28
  10. package/dist/backend/postgres/index.d.cts +7 -7
  11. package/dist/backend/postgres/index.d.ts +7 -7
  12. package/dist/backend/postgres/index.js +17 -15
  13. package/dist/backend/postgres/pglite-store.cjs +36 -35
  14. package/dist/backend/postgres/pglite-store.cjs.map +1 -1
  15. package/dist/backend/postgres/pglite-store.d.cts +8 -8
  16. package/dist/backend/postgres/pglite-store.d.ts +8 -8
  17. package/dist/backend/postgres/pglite-store.js +32 -31
  18. package/dist/backend/postgres/pglite-store.js.map +1 -1
  19. package/dist/backend/postgres/pglite.cjs +19 -17
  20. package/dist/backend/postgres/pglite.d.cts +3 -3
  21. package/dist/backend/postgres/pglite.d.ts +3 -3
  22. package/dist/backend/postgres/pglite.js +18 -16
  23. package/dist/backend/sqlite/index.cjs +31 -25
  24. package/dist/backend/sqlite/index.d.cts +7 -7
  25. package/dist/backend/sqlite/index.d.ts +7 -7
  26. package/dist/backend/sqlite/index.js +15 -13
  27. package/dist/backend/sqlite/libsql.cjs +22 -20
  28. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  29. package/dist/backend/sqlite/libsql.d.cts +3 -3
  30. package/dist/backend/sqlite/libsql.d.ts +3 -3
  31. package/dist/backend/sqlite/libsql.js +17 -15
  32. package/dist/backend/sqlite/libsql.js.map +1 -1
  33. package/dist/backend/sqlite/local-store.cjs +37 -36
  34. package/dist/backend/sqlite/local-store.cjs.map +1 -1
  35. package/dist/backend/sqlite/local-store.d.cts +8 -8
  36. package/dist/backend/sqlite/local-store.d.ts +8 -8
  37. package/dist/backend/sqlite/local-store.js +33 -32
  38. package/dist/backend/sqlite/local-store.js.map +1 -1
  39. package/dist/backend/sqlite/local.cjs +20 -18
  40. package/dist/backend/sqlite/local.d.cts +3 -3
  41. package/dist/backend/sqlite/local.d.ts +3 -3
  42. package/dist/backend/sqlite/local.js +18 -16
  43. package/dist/{chunk-LTXQOEIC.js → chunk-2CYI5HRH.js} +248 -203
  44. package/dist/chunk-2CYI5HRH.js.map +1 -0
  45. package/dist/{chunk-KF6K7TGH.js → chunk-2GIV5X4P.js} +702 -422
  46. package/dist/chunk-2GIV5X4P.js.map +1 -0
  47. package/dist/{chunk-2TYSSBU5.js → chunk-2Q45FAIE.js} +15 -15
  48. package/dist/{chunk-2TYSSBU5.js.map → chunk-2Q45FAIE.js.map} +1 -1
  49. package/dist/{chunk-WODMN3Q2.cjs → chunk-45YZXI6X.cjs} +27 -27
  50. package/dist/{chunk-WODMN3Q2.cjs.map → chunk-45YZXI6X.cjs.map} +1 -1
  51. package/dist/{chunk-3DMMGT6S.js → chunk-46UGOVRW.js} +3 -3
  52. package/dist/{chunk-3DMMGT6S.js.map → chunk-46UGOVRW.js.map} +1 -1
  53. package/dist/{chunk-GLHXM7C4.js → chunk-5LKOVCPP.js} +60 -23
  54. package/dist/chunk-5LKOVCPP.js.map +1 -0
  55. package/dist/{chunk-JFRT7S3B.cjs → chunk-5OWHU7Z7.cjs} +261 -459
  56. package/dist/chunk-5OWHU7Z7.cjs.map +1 -0
  57. package/dist/{chunk-7SQSZN2J.js → chunk-5PP4KRPV.js} +5 -5
  58. package/dist/{chunk-7SQSZN2J.js.map → chunk-5PP4KRPV.js.map} +1 -1
  59. package/dist/chunk-6KQEICJ6.cjs +12 -0
  60. package/dist/{chunk-MKJ4KXL5.cjs.map → chunk-6KQEICJ6.cjs.map} +1 -1
  61. package/dist/{chunk-6SWPJEYN.js → chunk-6LEOAIIB.js} +40 -6
  62. package/dist/chunk-6LEOAIIB.js.map +1 -0
  63. package/dist/{chunk-DZAICA5J.js → chunk-6NKSE5AU.js} +4 -4
  64. package/dist/{chunk-DZAICA5J.js.map → chunk-6NKSE5AU.js.map} +1 -1
  65. package/dist/{chunk-OVI7IXYX.js → chunk-6S3PTHL4.js} +3 -3
  66. package/dist/{chunk-OVI7IXYX.js.map → chunk-6S3PTHL4.js.map} +1 -1
  67. package/dist/{chunk-3FPR224C.cjs → chunk-7CCMCMJO.cjs} +102 -102
  68. package/dist/{chunk-3FPR224C.cjs.map → chunk-7CCMCMJO.cjs.map} +1 -1
  69. package/dist/{chunk-SHFBB23Q.js → chunk-7OWE7WD6.js} +6 -4
  70. package/dist/chunk-7OWE7WD6.js.map +1 -0
  71. package/dist/chunk-7PRMDZIA.cjs +182 -0
  72. package/dist/chunk-7PRMDZIA.cjs.map +1 -0
  73. package/dist/{chunk-CHAOFCHV.js → chunk-AH2A74OZ.js} +3 -3
  74. package/dist/{chunk-CHAOFCHV.js.map → chunk-AH2A74OZ.js.map} +1 -1
  75. package/dist/{chunk-OORXGFL5.cjs → chunk-BYBDM423.cjs} +48 -48
  76. package/dist/{chunk-OORXGFL5.cjs.map → chunk-BYBDM423.cjs.map} +1 -1
  77. package/dist/{chunk-JB6T4GLL.cjs → chunk-C76WFIVZ.cjs} +808 -519
  78. package/dist/chunk-C76WFIVZ.cjs.map +1 -0
  79. package/dist/{chunk-3G5W2U2L.cjs → chunk-CS6JTQQ2.cjs} +302 -257
  80. package/dist/chunk-CS6JTQQ2.cjs.map +1 -0
  81. package/dist/{chunk-AOSSQDVO.cjs → chunk-CSNOYIB4.cjs} +13 -13
  82. package/dist/{chunk-AOSSQDVO.cjs.map → chunk-CSNOYIB4.cjs.map} +1 -1
  83. package/dist/{chunk-HEV35TGT.js → chunk-DI6VC62F.js} +13 -4
  84. package/dist/chunk-DI6VC62F.js.map +1 -0
  85. package/dist/{chunk-2QGYQBS2.cjs → chunk-DWUDZ66O.cjs} +10 -10
  86. package/dist/{chunk-2QGYQBS2.cjs.map → chunk-DWUDZ66O.cjs.map} +1 -1
  87. package/dist/{chunk-ZDKTPBGV.js → chunk-EDLKIQRI.js} +4 -4
  88. package/dist/{chunk-ZDKTPBGV.js.map → chunk-EDLKIQRI.js.map} +1 -1
  89. package/dist/chunk-EH3JZJUM.cjs +567 -0
  90. package/dist/chunk-EH3JZJUM.cjs.map +1 -0
  91. package/dist/{chunk-S5TERQVW.js → chunk-FX5ZW6PN.js} +196 -33
  92. package/dist/chunk-FX5ZW6PN.js.map +1 -0
  93. package/dist/{chunk-XVWOYKIK.js → chunk-FZHF5UWR.js} +3 -3
  94. package/dist/{chunk-XVWOYKIK.js.map → chunk-FZHF5UWR.js.map} +1 -1
  95. package/dist/{chunk-BFUOME67.cjs → chunk-G2TLHH6T.cjs} +20 -11
  96. package/dist/chunk-G2TLHH6T.cjs.map +1 -0
  97. package/dist/{chunk-5PRKMB24.cjs → chunk-GHZPZNFC.cjs} +12 -4
  98. package/dist/chunk-GHZPZNFC.cjs.map +1 -0
  99. package/dist/{chunk-ZFMCDJGB.js → chunk-GVYVGGPJ.js} +11 -199
  100. package/dist/chunk-GVYVGGPJ.js.map +1 -0
  101. package/dist/{chunk-SDBBMD4N.js → chunk-H3XP6BAV.js} +3 -3
  102. package/dist/{chunk-SDBBMD4N.js.map → chunk-H3XP6BAV.js.map} +1 -1
  103. package/dist/{chunk-ROR5ZR6A.cjs → chunk-HSEZ7X6Y.cjs} +45 -45
  104. package/dist/{chunk-ROR5ZR6A.cjs.map → chunk-HSEZ7X6Y.cjs.map} +1 -1
  105. package/dist/{chunk-LRQKXRXO.cjs → chunk-HY5BNOUN.cjs} +4 -4
  106. package/dist/{chunk-LRQKXRXO.cjs.map → chunk-HY5BNOUN.cjs.map} +1 -1
  107. package/dist/chunk-HZUB5CON.js +27 -0
  108. package/dist/chunk-HZUB5CON.js.map +1 -0
  109. package/dist/{chunk-MYKHJI2J.js → chunk-I5C6OTKR.js} +3 -3
  110. package/dist/{chunk-MYKHJI2J.js.map → chunk-I5C6OTKR.js.map} +1 -1
  111. package/dist/{chunk-3U5ABFDW.cjs → chunk-IHK5KA2Q.cjs} +31 -28
  112. package/dist/chunk-IHK5KA2Q.cjs.map +1 -0
  113. package/dist/{chunk-26YKDNUD.cjs → chunk-IPRP6TDL.cjs} +12 -10
  114. package/dist/chunk-IPRP6TDL.cjs.map +1 -0
  115. package/dist/{chunk-UGHG7PGX.js → chunk-IRPYOHRC.js} +26 -4
  116. package/dist/chunk-IRPYOHRC.js.map +1 -0
  117. package/dist/{chunk-7UOLHNWC.cjs → chunk-ISKCIQF2.cjs} +20 -20
  118. package/dist/{chunk-7UOLHNWC.cjs.map → chunk-ISKCIQF2.cjs.map} +1 -1
  119. package/dist/{chunk-7LZJNLA5.js → chunk-JG5XIJDY.js} +57 -31
  120. package/dist/chunk-JG5XIJDY.js.map +1 -0
  121. package/dist/{chunk-YYUHLYM2.cjs → chunk-K2XYLVVB.cjs} +134 -133
  122. package/dist/chunk-K2XYLVVB.cjs.map +1 -0
  123. package/dist/{chunk-5K2BKEBD.js → chunk-K46SDNQD.js} +10 -4
  124. package/dist/chunk-K46SDNQD.js.map +1 -0
  125. package/dist/{chunk-TZEGUG6D.cjs → chunk-K6VKTBST.cjs} +4 -4
  126. package/dist/{chunk-TZEGUG6D.cjs.map → chunk-K6VKTBST.cjs.map} +1 -1
  127. package/dist/chunk-KWNWG4RC.cjs +12 -0
  128. package/dist/{chunk-CICO5GXD.cjs.map → chunk-KWNWG4RC.cjs.map} +1 -1
  129. package/dist/{chunk-FQPEMEWX.cjs → chunk-LLVOQOWE.cjs} +80 -32
  130. package/dist/chunk-LLVOQOWE.cjs.map +1 -0
  131. package/dist/{chunk-TQHGE7UC.cjs → chunk-M5MSP3BI.cjs} +18 -10
  132. package/dist/chunk-M5MSP3BI.cjs.map +1 -0
  133. package/dist/{chunk-Z2JCLZFJ.js → chunk-MJPZNEJZ.js} +273 -291
  134. package/dist/chunk-MJPZNEJZ.js.map +1 -0
  135. package/dist/{chunk-TUNPBZY3.cjs → chunk-MM3JHVKZ.cjs} +4 -4
  136. package/dist/{chunk-TUNPBZY3.cjs.map → chunk-MM3JHVKZ.cjs.map} +1 -1
  137. package/dist/{chunk-BRRP76WO.js → chunk-MX7EKQPM.js} +457 -299
  138. package/dist/chunk-MX7EKQPM.js.map +1 -0
  139. package/dist/{chunk-D4QLTJSM.js → chunk-MZ34E2GN.js} +13 -12
  140. package/dist/chunk-MZ34E2GN.js.map +1 -0
  141. package/dist/{chunk-EDN4Y4ZG.cjs → chunk-OJHD3LXJ.cjs} +9 -9
  142. package/dist/{chunk-EDN4Y4ZG.cjs.map → chunk-OJHD3LXJ.cjs.map} +1 -1
  143. package/dist/{chunk-DO7SAMEK.cjs → chunk-ON47CBE4.cjs} +47 -47
  144. package/dist/{chunk-DO7SAMEK.cjs.map → chunk-ON47CBE4.cjs.map} +1 -1
  145. package/dist/{chunk-6LN7FIVU.js → chunk-PALYTHGM.js} +11 -4
  146. package/dist/chunk-PALYTHGM.js.map +1 -0
  147. package/dist/{chunk-YVF2EM7B.js → chunk-R7MRFE5P.js} +3 -3
  148. package/dist/{chunk-YVF2EM7B.js.map → chunk-R7MRFE5P.js.map} +1 -1
  149. package/dist/{chunk-EZEEWCFJ.cjs → chunk-RDP6ZRSM.cjs} +435 -265
  150. package/dist/chunk-RDP6ZRSM.cjs.map +1 -0
  151. package/dist/{chunk-GYEG3ZLZ.cjs → chunk-RJMHU2MG.cjs} +121 -18
  152. package/dist/chunk-RJMHU2MG.cjs.map +1 -0
  153. package/dist/chunk-RWUWTJQY.cjs +30 -0
  154. package/dist/chunk-RWUWTJQY.cjs.map +1 -0
  155. package/dist/{chunk-JPD2CTC3.js → chunk-S33YQEL7.js} +7 -7
  156. package/dist/{chunk-JPD2CTC3.js.map → chunk-S33YQEL7.js.map} +1 -1
  157. package/dist/chunk-S3SDEQMC.js +532 -0
  158. package/dist/chunk-S3SDEQMC.js.map +1 -0
  159. package/dist/{chunk-OI2GQ25X.cjs → chunk-SHC7BCG5.cjs} +7 -7
  160. package/dist/{chunk-OI2GQ25X.cjs.map → chunk-SHC7BCG5.cjs.map} +1 -1
  161. package/dist/{chunk-L3LQNR34.cjs → chunk-TEC24ZDA.cjs} +161 -161
  162. package/dist/{chunk-L3LQNR34.cjs.map → chunk-TEC24ZDA.cjs.map} +1 -1
  163. package/dist/{chunk-HDL2ARHX.cjs → chunk-TP4NJTI3.cjs} +63 -27
  164. package/dist/chunk-TP4NJTI3.cjs.map +1 -0
  165. package/dist/{chunk-UMGZDVOA.cjs → chunk-TTCOPKUL.cjs} +124 -124
  166. package/dist/{chunk-UMGZDVOA.cjs.map → chunk-TTCOPKUL.cjs.map} +1 -1
  167. package/dist/chunk-TUVD4DFR.cjs +1207 -0
  168. package/dist/chunk-TUVD4DFR.cjs.map +1 -0
  169. package/dist/{chunk-UGHQV7MP.cjs → chunk-TYGGUWMS.cjs} +178 -152
  170. package/dist/chunk-TYGGUWMS.cjs.map +1 -0
  171. package/dist/{chunk-WIC7DRXW.js → chunk-U3Z7XKAG.js} +7 -7
  172. package/dist/{chunk-WIC7DRXW.js.map → chunk-U3Z7XKAG.js.map} +1 -1
  173. package/dist/{chunk-NACVVDWB.js → chunk-U5EL6JUV.js} +10 -10
  174. package/dist/{chunk-NACVVDWB.js.map → chunk-U5EL6JUV.js.map} +1 -1
  175. package/dist/{chunk-OMZ37BM2.js → chunk-V76FGHY3.js} +5 -5
  176. package/dist/{chunk-OMZ37BM2.js.map → chunk-V76FGHY3.js.map} +1 -1
  177. package/dist/{chunk-6NGW27EO.cjs → chunk-VLBTRXA2.cjs} +10 -10
  178. package/dist/{chunk-6NGW27EO.cjs.map → chunk-VLBTRXA2.cjs.map} +1 -1
  179. package/dist/chunk-VTJVMP4I.js +1182 -0
  180. package/dist/chunk-VTJVMP4I.js.map +1 -0
  181. package/dist/{chunk-QTD6HX4O.js → chunk-W5SOCUBL.js} +5 -5
  182. package/dist/{chunk-QTD6HX4O.js.map → chunk-W5SOCUBL.js.map} +1 -1
  183. package/dist/{chunk-SR725PWF.cjs → chunk-WCLMKNQE.cjs} +1750 -1592
  184. package/dist/chunk-WCLMKNQE.cjs.map +1 -0
  185. package/dist/{chunk-2O4PCIZ6.cjs → chunk-WK23PGTP.cjs} +13 -13
  186. package/dist/{chunk-2O4PCIZ6.cjs.map → chunk-WK23PGTP.cjs.map} +1 -1
  187. package/dist/{chunk-KKBDXCLQ.js → chunk-WQBAQZHR.js} +4 -4
  188. package/dist/{chunk-KKBDXCLQ.js.map → chunk-WQBAQZHR.js.map} +1 -1
  189. package/dist/{chunk-MRDBBHIZ.cjs → chunk-X4GDXBOP.cjs} +2 -2
  190. package/dist/chunk-X4GDXBOP.cjs.map +1 -0
  191. package/dist/{chunk-3QNZ5SAJ.cjs → chunk-XMY2SXOH.cjs} +437 -455
  192. package/dist/chunk-XMY2SXOH.cjs.map +1 -0
  193. package/dist/{chunk-D5R42W5D.js → chunk-XZW2CTNO.js} +115 -12
  194. package/dist/chunk-XZW2CTNO.js.map +1 -0
  195. package/dist/{chunk-NVY5CJFP.js → chunk-Y55DLLEG.js} +9 -6
  196. package/dist/chunk-Y55DLLEG.js.map +1 -0
  197. package/dist/chunk-YA36ABIL.js +174 -0
  198. package/dist/chunk-YA36ABIL.js.map +1 -0
  199. package/dist/{chunk-ZLONH2UD.js → chunk-YDEJQWOL.js} +2 -2
  200. package/dist/chunk-YDEJQWOL.js.map +1 -0
  201. package/dist/{chunk-JONXFAPO.js → chunk-ZAQUKCUC.js} +5 -5
  202. package/dist/{chunk-JONXFAPO.js.map → chunk-ZAQUKCUC.js.map} +1 -1
  203. package/dist/{chunk-SIT26LAZ.cjs → chunk-ZBFZGLZE.cjs} +29 -5
  204. package/dist/chunk-ZBFZGLZE.cjs.map +1 -0
  205. package/dist/{chunk-P6YLZTRE.js → chunk-ZRJTM7MT.js} +3 -3
  206. package/dist/{chunk-P6YLZTRE.js.map → chunk-ZRJTM7MT.js.map} +1 -1
  207. package/dist/core/index.cjs +29 -28
  208. package/dist/core/index.d.cts +4 -4
  209. package/dist/core/index.d.ts +4 -4
  210. package/dist/core/index.js +9 -8
  211. package/dist/{ddl-D_oW-EVO.d.ts → ddl-B49O7dB_.d.ts} +3 -3
  212. package/dist/{ddl-BL1NZLMY.d.cts → ddl-DcZG660s.d.cts} +3 -3
  213. package/dist/graph-extension/index.cjs +21 -20
  214. package/dist/graph-extension/index.d.cts +4 -4
  215. package/dist/graph-extension/index.d.ts +4 -4
  216. package/dist/graph-extension/index.js +5 -4
  217. package/dist/graph-merge/index.cjs +305 -303
  218. package/dist/graph-merge/index.cjs.map +1 -1
  219. package/dist/graph-merge/index.d.cts +9 -9
  220. package/dist/graph-merge/index.d.ts +9 -9
  221. package/dist/graph-merge/index.js +29 -27
  222. package/dist/graph-merge/index.js.map +1 -1
  223. package/dist/{index-D7d1u2gr.d.ts → index-B0PrmE3K.d.cts} +16 -2
  224. package/dist/{index-COs_z6nV.d.cts → index-CwcXsL5R.d.ts} +16 -2
  225. package/dist/index.cjs +223 -222
  226. package/dist/index.cjs.map +1 -1
  227. package/dist/index.d.cts +12 -12
  228. package/dist/index.d.ts +12 -12
  229. package/dist/index.js +37 -36
  230. package/dist/index.js.map +1 -1
  231. package/dist/indexes/index.cjs +13 -13
  232. package/dist/indexes/index.d.cts +4 -4
  233. package/dist/indexes/index.d.ts +4 -4
  234. package/dist/indexes/index.js +6 -6
  235. package/dist/{ingestion-import-target-dNeL7iAv.d.ts → ingestion-import-target-CI8OWIkM.d.ts} +1 -1
  236. package/dist/{ingestion-import-target-XPxZYw89.d.cts → ingestion-import-target-DCpfM1PX.d.cts} +1 -1
  237. package/dist/interchange/index.cjs +55 -54
  238. package/dist/interchange/index.cjs.map +1 -1
  239. package/dist/interchange/index.d.cts +19 -8
  240. package/dist/interchange/index.d.ts +19 -8
  241. package/dist/interchange/index.js +19 -18
  242. package/dist/interchange/index.js.map +1 -1
  243. package/dist/{manager-D9eRT_ns.d.ts → manager-Cfg1ENj1.d.ts} +30 -2
  244. package/dist/{manager-CYaff3n3.d.cts → manager-D348fa6W.d.cts} +30 -2
  245. package/dist/{materialize-indexes-DJ3ykH59.d.ts → materialize-indexes-C9GG3O3C.d.ts} +1 -1
  246. package/dist/{materialize-indexes-DTtAnvfY.d.cts → materialize-indexes-CrSiW_lT.d.cts} +1 -1
  247. package/dist/{postgres-CcL4bAHS.d.ts → postgres-CH1kkM5J.d.cts} +279 -2
  248. package/dist/{postgres-DMj39MEu.d.cts → postgres-UStOycLI.d.ts} +279 -2
  249. package/dist/profiler/index.d.cts +9 -9
  250. package/dist/profiler/index.d.ts +9 -9
  251. package/dist/provenance/index.cjs +46 -44
  252. package/dist/provenance/index.cjs.map +1 -1
  253. package/dist/provenance/index.d.cts +7 -7
  254. package/dist/provenance/index.d.ts +7 -7
  255. package/dist/provenance/index.js +12 -10
  256. package/dist/provenance/index.js.map +1 -1
  257. package/dist/{repair-validity-windows-DlUSqwCg.d.ts → repair-validity-windows-BtOEe2pS.d.ts} +2 -2
  258. package/dist/{repair-validity-windows-BFNZvd_H.d.cts → repair-validity-windows-aWX7VNvv.d.cts} +2 -2
  259. package/dist/schema/index.cjs +46 -46
  260. package/dist/schema/index.d.cts +6 -6
  261. package/dist/schema/index.d.ts +6 -6
  262. package/dist/schema/index.js +19 -19
  263. package/dist/{searchable-DHJMh_nj.d.cts → searchable-C8-RrL3l.d.cts} +1 -1
  264. package/dist/{searchable-bpE1bBfc.d.ts → searchable-z4BiFfHI.d.ts} +1 -1
  265. package/dist/{sqlite-YppHrNFb.d.cts → sqlite-Cyx9j9o6.d.cts} +309 -2
  266. package/dist/{sqlite-D7Oz0SQh.d.ts → sqlite-axLw5Lo5.d.ts} +309 -2
  267. package/dist/{store-bphCSo7z.d.cts → store-CTfQ9taw.d.ts} +102 -13
  268. package/dist/{store-DRrFCx5x.d.ts → store-DR9J7JVB.d.cts} +102 -13
  269. package/dist/{temporal-5GqpYCk2.d.cts → temporal-B4Ky4wzh.d.cts} +1 -1
  270. package/dist/{temporal-CbnLzTmM.d.ts → temporal-CBOrERz5.d.ts} +1 -1
  271. package/dist/{types-CXAhpW-c.d.cts → types-BE921wRl.d.cts} +1 -1
  272. package/dist/{types-Bx74kaTt.d.ts → types-BScHXVM7.d.ts} +1 -1
  273. package/dist/{types-BqFZTQmV.d.cts → types-CWg4dTjj.d.cts} +257 -6
  274. package/dist/{types-BqFZTQmV.d.ts → types-CWg4dTjj.d.ts} +257 -6
  275. package/dist/{where-O-k2wgYm.d.ts → where-BWXUPV3C.d.ts} +1 -1
  276. package/dist/{where-DI_Fqz-X.d.cts → where-CNtx1aLc.d.cts} +1 -1
  277. package/package.json +3 -2
  278. package/dist/chunk-26YKDNUD.cjs.map +0 -1
  279. package/dist/chunk-3G5W2U2L.cjs.map +0 -1
  280. package/dist/chunk-3KOY4FH3.cjs +0 -934
  281. package/dist/chunk-3KOY4FH3.cjs.map +0 -1
  282. package/dist/chunk-3QNZ5SAJ.cjs.map +0 -1
  283. package/dist/chunk-3U5ABFDW.cjs.map +0 -1
  284. package/dist/chunk-5K2BKEBD.js.map +0 -1
  285. package/dist/chunk-5PRKMB24.cjs.map +0 -1
  286. package/dist/chunk-6LN7FIVU.js.map +0 -1
  287. package/dist/chunk-6SWPJEYN.js.map +0 -1
  288. package/dist/chunk-7LZJNLA5.js.map +0 -1
  289. package/dist/chunk-BFUOME67.cjs.map +0 -1
  290. package/dist/chunk-BRRP76WO.js.map +0 -1
  291. package/dist/chunk-CICO5GXD.cjs +0 -12
  292. package/dist/chunk-D4QLTJSM.js.map +0 -1
  293. package/dist/chunk-D5R42W5D.js.map +0 -1
  294. package/dist/chunk-EZEEWCFJ.cjs.map +0 -1
  295. package/dist/chunk-FA2AFWLP.cjs +0 -167
  296. package/dist/chunk-FA2AFWLP.cjs.map +0 -1
  297. package/dist/chunk-FQPEMEWX.cjs.map +0 -1
  298. package/dist/chunk-GLHXM7C4.js.map +0 -1
  299. package/dist/chunk-GYEG3ZLZ.cjs.map +0 -1
  300. package/dist/chunk-HDL2ARHX.cjs.map +0 -1
  301. package/dist/chunk-HEV35TGT.js.map +0 -1
  302. package/dist/chunk-I4GAZH5Z.js +0 -913
  303. package/dist/chunk-I4GAZH5Z.js.map +0 -1
  304. package/dist/chunk-JB6T4GLL.cjs.map +0 -1
  305. package/dist/chunk-JBQQ7THH.js +0 -20
  306. package/dist/chunk-JBQQ7THH.js.map +0 -1
  307. package/dist/chunk-JFRT7S3B.cjs.map +0 -1
  308. package/dist/chunk-KF6K7TGH.js.map +0 -1
  309. package/dist/chunk-LTXQOEIC.js.map +0 -1
  310. package/dist/chunk-MKJ4KXL5.cjs +0 -12
  311. package/dist/chunk-MRDBBHIZ.cjs.map +0 -1
  312. package/dist/chunk-NVY5CJFP.js.map +0 -1
  313. package/dist/chunk-PWLJ77UV.cjs +0 -23
  314. package/dist/chunk-PWLJ77UV.cjs.map +0 -1
  315. package/dist/chunk-S5TERQVW.js.map +0 -1
  316. package/dist/chunk-SHFBB23Q.js.map +0 -1
  317. package/dist/chunk-SIT26LAZ.cjs.map +0 -1
  318. package/dist/chunk-SR725PWF.cjs.map +0 -1
  319. package/dist/chunk-TQHGE7UC.cjs.map +0 -1
  320. package/dist/chunk-UGHG7PGX.js.map +0 -1
  321. package/dist/chunk-UGHQV7MP.cjs.map +0 -1
  322. package/dist/chunk-YIURNGXI.js +0 -155
  323. package/dist/chunk-YIURNGXI.js.map +0 -1
  324. package/dist/chunk-YYUHLYM2.cjs.map +0 -1
  325. package/dist/chunk-Z2JCLZFJ.js.map +0 -1
  326. package/dist/chunk-ZFMCDJGB.js.map +0 -1
  327. package/dist/chunk-ZLONH2UD.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/backend/row-mappers.ts","../src/backend/drizzle/operations/shared.ts","../src/backend/drizzle/operations/edge-claims.ts","../src/backend/drizzle/operations/uniques.ts"],"names":["sql","nowIso","getTableName"],"mappings":"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","file":"chunk-S3SDEQMC.js","sourcesContent":["/**\n * Shared database row-mapping utilities.\n */\n\nimport { DatabaseOperationError } from \"../errors\";\nimport { canonicalizeDatabaseTimestamp } from \"../utils/date\";\nimport {\n type EdgeRow,\n type NodeRow,\n rowPropsToJsonText,\n type SchemaVersionRow,\n type UniqueRow,\n} from \"./types\";\n\nfunction asString(value: unknown, field: string): string {\n if (typeof value !== \"string\") {\n throw new DatabaseOperationError(\n `Expected ${field} to be string, got ${typeof value}`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return value;\n}\n\nfunction asNumber(value: unknown, field: string): number {\n if (typeof value !== \"number\") {\n throw new DatabaseOperationError(\n `Expected ${field} to be number, got ${typeof value}`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return value;\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\n/**\n * Formats PostgreSQL timestamps used by internal status-table adapters.\n * Row metadata uses the stricter {@link normalizeRowTimestamp} contract.\n */\nexport function formatPostgresTimestamp(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"string\") {\n if (value.includes(\"T\")) return value;\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) return date.toISOString();\n return value;\n }\n return undefined;\n}\n\n/**\n * Canonicalizes database-driver timestamp values at the row-mapping boundary.\n * Every store and compiled-query metadata projection uses this owner so driver\n * rendering differences cannot become public values.\n */\nexport function normalizeRowTimestamp(\n value: unknown,\n field: string,\n): string | undefined {\n if (value === null || value === undefined) return undefined;\n const canonical = canonicalizeDatabaseTimestamp(value);\n if (canonical === undefined) {\n throw new DatabaseOperationError(\n `Expected ${field} to be a database timestamp, got ${typeof value}`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return canonical;\n}\n\nexport function normalizeRequiredRowTimestamp(\n value: unknown,\n field: string,\n): string {\n const timestamp = normalizeRowTimestamp(value, field);\n if (timestamp === undefined) {\n throw new DatabaseOperationError(`Expected non-null ${field} timestamp`, {\n operation: \"select\",\n entity: \"row\",\n });\n }\n return timestamp;\n}\n\n/**\n * Coerce a fulltext relevance score to `number` at the backend\n * boundary. Postgres returns `numeric` as a string to preserve\n * precision; a custom `FulltextStrategy` on either dialect could\n * likewise yield a string. Shared so both backends enforce the same\n * `FulltextSearchResult.score: number` contract and reject garbage\n * loudly instead of propagating `NaN`.\n */\nexport function coerceNumericScore(value: number | string): number {\n if (typeof value === \"number\") return value;\n const parsed = Number.parseFloat(value);\n if (Number.isNaN(parsed)) {\n throw new TypeError(\n `Backend returned non-numeric fulltext score: ${JSON.stringify(value)}`,\n );\n }\n return parsed;\n}\n\n/**\n * Normalizes a JSON column that may be returned as a parsed object (JSONB)\n * or string. PostgreSQL drivers hand jsonb back already parsed — keep the\n * object instead of re-stringifying it, so the read path pays zero JSON\n * work per row (consumers normalize via rowPropsToObject /\n * rowPropsToJsonText at the point of use). SQLite text passes through.\n */\nfunction normalizeJsonColumn(value: unknown): string | Record<string, unknown> {\n if (typeof value === \"string\") return value;\n if (value !== null && typeof value === \"object\") {\n return value as Record<string, unknown>;\n }\n return JSON.stringify(value ?? {});\n}\n\n/**\n * Dialect-specific configuration for row mappers.\n *\n * Row mapper factories accept this config to produce dialect-appropriate\n * mappers. Timestamp normalization is dialect-independent and owned by\n * {@link normalizeRowTimestamp}; only JSON columns need dialect configuration.\n */\ntype DialectRowMapperConfig = Readonly<{\n normalizeJson: (value: unknown) => string | Record<string, unknown>;\n}>;\n\n/**\n * SQLite row mapper config. JSON is stored as TEXT.\n */\nexport const SQLITE_ROW_MAPPER_CONFIG: DialectRowMapperConfig = {\n normalizeJson: (value) => {\n if (typeof value !== \"string\") {\n throw new DatabaseOperationError(\n `Expected JSON column to be string, got ${typeof value}`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return value;\n },\n};\n\n/**\n * PostgreSQL row mapper config. JSONB is returned as parsed objects.\n */\nexport const POSTGRES_ROW_MAPPER_CONFIG: DialectRowMapperConfig = {\n normalizeJson: normalizeJsonColumn,\n};\n\n// Trust boundary: Drizzle raw SQL returns Record<string, unknown> rows.\n// The field access patterns below are intentional unsafe casts at the\n// database driver boundary where we know the column shapes.\n\nexport function createNodeRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => NodeRow {\n return (row) => ({\n graph_id: asString(row[\"graph_id\"], \"graph_id\"),\n kind: asString(row[\"kind\"], \"kind\"),\n id: asString(row[\"id\"], \"id\"),\n props: config.normalizeJson(row[\"props\"]),\n version: asNumber(row[\"version\"], \"version\"),\n valid_from: normalizeRowTimestamp(row[\"valid_from\"], \"valid_from\"),\n valid_to: normalizeRowTimestamp(row[\"valid_to\"], \"valid_to\"),\n created_at: normalizeRequiredRowTimestamp(row[\"created_at\"], \"created_at\"),\n updated_at: normalizeRequiredRowTimestamp(row[\"updated_at\"], \"updated_at\"),\n deleted_at: normalizeRowTimestamp(row[\"deleted_at\"], \"deleted_at\"),\n });\n}\n\nexport function createEdgeRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => EdgeRow {\n return (row) => ({\n graph_id: asString(row[\"graph_id\"], \"graph_id\"),\n id: asString(row[\"id\"], \"id\"),\n kind: asString(row[\"kind\"], \"kind\"),\n from_kind: asString(row[\"from_kind\"], \"from_kind\"),\n from_id: asString(row[\"from_id\"], \"from_id\"),\n to_kind: asString(row[\"to_kind\"], \"to_kind\"),\n to_id: asString(row[\"to_id\"], \"to_id\"),\n props: config.normalizeJson(row[\"props\"]),\n valid_from: normalizeRowTimestamp(row[\"valid_from\"], \"valid_from\"),\n valid_to: normalizeRowTimestamp(row[\"valid_to\"], \"valid_to\"),\n created_at: normalizeRequiredRowTimestamp(row[\"created_at\"], \"created_at\"),\n updated_at: normalizeRequiredRowTimestamp(row[\"updated_at\"], \"updated_at\"),\n deleted_at: normalizeRowTimestamp(row[\"deleted_at\"], \"deleted_at\"),\n });\n}\n\nfunction mapUniqueRow(row: Record<string, unknown>): UniqueRow {\n return {\n graph_id: asString(row[\"graph_id\"], \"graph_id\"),\n node_kind: asString(row[\"node_kind\"], \"node_kind\"),\n constraint_name: asString(row[\"constraint_name\"], \"constraint_name\"),\n key: asString(row[\"key\"], \"key\"),\n node_id: asString(row[\"node_id\"], \"node_id\"),\n concrete_kind: asString(row[\"concrete_kind\"], \"concrete_kind\"),\n deleted_at: normalizeRowTimestamp(row[\"deleted_at\"], \"deleted_at\"),\n };\n}\n\nexport function createUniqueRowMapper(\n _config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => UniqueRow {\n return mapUniqueRow;\n}\n\nexport function createSchemaVersionRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => SchemaVersionRow {\n return (row) => {\n const isActiveValue = row[\"is_active\"];\n const isActive =\n isActiveValue === true || isActiveValue === 1 || isActiveValue === \"1\";\n\n return {\n graph_id: asString(row[\"graph_id\"], \"graph_id\"),\n version: asNumber(row[\"version\"], \"version\"),\n schema_hash: asString(row[\"schema_hash\"], \"schema_hash\"),\n schema_doc: rowPropsToJsonText(config.normalizeJson(row[\"schema_doc\"])),\n created_at: normalizeRequiredRowTimestamp(\n row[\"created_at\"],\n \"created_at\",\n ),\n is_active: isActive,\n };\n };\n}\n","import {\n getTableName,\n type SQL,\n sql,\n type SQLWrapper,\n} from \"drizzle-orm\";\n\nimport type { PrimaryKeyRelation } from \"../../../utils/sql-errors\";\nimport type { SqlDialect } from \"../../types\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\n\nexport type Tables = SqliteTables | PostgresTables;\n\n/**\n * The names a relation's PRIMARY KEY constraint can carry, given the relation\n * name and its key columns.\n *\n * Two, because TypeGraph supports two provisioning paths for the same schema\n * and they name the constraint differently:\n *\n * - TypeGraph's own DDL (`generatePostgresCreateTableSQL`) emits an UNNAMED\n * `PRIMARY KEY (...)` clause, which PostgreSQL names `<relation>_pkey`;\n * - `drizzle-kit` renders the Drizzle `primaryKey({ columns })` builder with\n * its explicit name, `<relation>_<column>_..._pk`.\n *\n * Both are derived rather than hardcoded so a custom table name is covered\n * too. Accepting only these two — never\n * an arbitrary unique constraint on the relation — is what keeps a declared\n * `unique: true` index violation out of the duplicate-identity classification.\n *\n * One declared bound: PostgreSQL clips every identifier to 63 bytes, and clips\n * the RELATION part to make room for the `_pkey` it appends, so a custom\n * relation name long enough to overflow that (58+ bytes) is named something\n * neither of these matches. Classification then simply does not happen and the\n * driver failure surfaces as it did before — no misattribution, just no\n * translation.\n */\nfunction primaryKeyConstraintNames(\n relation: string,\n keyColumns: readonly string[],\n): readonly string[] {\n return [`${relation}_pkey`, `${relation}_${keyColumns.join(\"_\")}_pk`];\n}\n\n/**\n * The nodes relation's identity constraint: `(graph_id, kind, id)`, the tuple\n * every node read also filters on.\n */\nexport function nodePrimaryKeyConstraint(\n nodes: Tables[\"nodes\"],\n): PrimaryKeyRelation {\n const relation = getTableName(nodes);\n return {\n table: relation,\n constraintNames: primaryKeyConstraintNames(relation, [\n nodes.graphId.name,\n nodes.kind.name,\n nodes.id.name,\n ]),\n };\n}\n\n/**\n * The edges relation's identity constraint: `(graph_id, id)`. An edge id is\n * unique per graph without its kind, so the key is one column shorter than a\n * node's.\n */\nexport function edgePrimaryKeyConstraint(\n edges: Tables[\"edges\"],\n): PrimaryKeyRelation {\n const relation = getTableName(edges);\n return {\n table: relation,\n constraintNames: primaryKeyConstraintNames(relation, [\n edges.graphId.name,\n edges.id.name,\n ]),\n };\n}\n\n/**\n * Converts undefined to SQL NULL for use in template literals.\n * Drizzle doesn't handle undefined in sql`` templates correctly.\n */\nexport function sqlNull(value: string | undefined): SQL | string {\n return value ?? sql.raw(\"NULL\");\n}\n\n/**\n * The `AND valid_from …` conjunction a write carries when its caller ASSERTED\n * the lower bound the target row already holds (see\n * {@link UpdateNodeParams.expectedValidFrom} /\n * {@link UpdateEdgeParams.expectedValidFrom}).\n *\n * NULL-SAFE by construction, and that is the whole point of routing both\n * entities through one builder: `valid_from` is nullable (an open-left window),\n * and `col = NULL` is UNKNOWN in SQL, so the obvious `AND col = ?` spelling\n * turns \"I checked that this row has no lower bound\" into a predicate that\n * matches NOTHING — an assertion that always fails is as wrong as one that\n * never runs. The three states are therefore distinct:\n *\n * - `undefined` — the caller asserted nothing; no predicate is emitted.\n * - `null` — the caller read an OPEN-LEFT window; emits `IS NULL`.\n * - a string — the caller read that bound; emits `= <bound>`.\n *\n * One owner: nodes and edges share this function so the two statements cannot\n * drift into disagreeing about what \"the bound I read\" means.\n */\nexport function expectedValidFromPredicate(\n column: SQLWrapper,\n expected: string | null | undefined,\n): SQL {\n if (expected === undefined) return sql.empty();\n if (expected === null) return sql` AND ${column} IS NULL`;\n return sql` AND ${column} = ${expected}`;\n}\n\nexport function quotedColumn(column: { name: string }): SQL {\n return sql.raw(`\"${column.name.replaceAll('\"', '\"\"')}\"`);\n}\n\n/**\n * Returns a quoted SQL identifier for a bare table name string.\n * Use when the operation targets a table that isn't represented as a\n * Drizzle table object (e.g. the FTS5 virtual table).\n */\nexport function quotedTableName(tableName: string): SQL {\n return sql.raw(`\"${tableName.replaceAll('\"', '\"\"')}\"`);\n}\n\nconst CODE_POINT_ORDER_BUILDERS = {\n postgres: (value: SQL) => sql`${value} COLLATE \"C\"`,\n sqlite: (value: SQL) => value,\n} satisfies Record<SqlDialect, (value: SQL) => SQL>;\n\n/**\n * `column` rendered so that ORDER BY sorts it by code point on both engines.\n *\n * Relevance-ranking SQL breaks score ties on `node_id`. Left bare, Postgres\n * sorts it under the column's collation — a linguistic collation such as\n * `en_US.UTF-8` orders `a, A, b, B` where byte order gives `A, B, a, b`, so\n * the same query returns different pages on two databases whose `datcollate`\n * differs. SQLite's default `BINARY` collation is already code-point order,\n * as is the store's `compareCodePoints`, which ranks the same rows whenever a\n * search falls back to fusing in JavaScript.\n *\n * Forcing the `C` collation on Postgres makes all three agree. The ranking is\n * sorted anyway (no index supplies the order), so this costs nothing.\n */\nexport function codePointOrderKey(column: SQL, dialect: SqlDialect): SQL {\n return CODE_POINT_ORDER_BUILDERS[dialect](column);\n}\n\n/**\n * Subquery yielding the ids of CURRENT nodes of one kind — the candidate\n * set a facade search statement is allowed to return. Passed into the\n * fulltext and vector search builders so top-k is computed over current\n * rows in SQL, instead of ranking side-table rows first and dropping\n * tombstoned/expired nodes after (which silently shrinks results below\n * `limit` under index drift).\n *\n * Currency matches a `current` read: non-tombstoned AND inside the\n * validity window. The instant is BOUND as a parameter (the backend's\n * clock, same source as its write timestamps) rather than compiled as a\n * per-row SQL now() call — on SQLite a per-row strftime() across two\n * search legs dominated unfiltered facade searches.\n */\nexport function liveNodeIdsSubquery(\n nodes: Tables[\"nodes\"],\n graphId: string,\n nodeKind: string,\n nowIso: string,\n): SQL {\n return sql`SELECT ${nodes.id} AS node_id FROM ${nodes} WHERE ${nodes.graphId} = ${graphId} AND ${nodes.kind} = ${nodeKind} AND ${nodes.deletedAt} IS NULL AND (${nodes.validFrom} IS NULL OR ${nodes.validFrom} <= ${nowIso}) AND (${nodes.validTo} IS NULL OR ${nodes.validTo} > ${nowIso})`;\n}\n\nexport function nodeColumnList(nodes: Tables[\"nodes\"]): SQL {\n return sql.raw(\n `\"${nodes.graphId.name}\", \"${nodes.kind.name}\", \"${nodes.id.name}\", \"${nodes.props.name}\", \"${nodes.version.name}\", \"${nodes.validFrom.name}\", \"${nodes.validTo.name}\", \"${nodes.createdAt.name}\", \"${nodes.updatedAt.name}\"`,\n );\n}\n\nexport function edgeColumnList(edges: Tables[\"edges\"]): SQL {\n return sql.raw(\n `\"${edges.graphId.name}\", \"${edges.id.name}\", \"${edges.kind.name}\", \"${edges.fromKind.name}\", \"${edges.fromId.name}\", \"${edges.toKind.name}\", \"${edges.toId.name}\", \"${edges.props.name}\", \"${edges.validFrom.name}\", \"${edges.validTo.name}\", \"${edges.createdAt.name}\", \"${edges.updatedAt.name}\"`,\n );\n}\n","import { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport {\n sql as fragmentSql,\n type SqlFragment,\n} from \"../../../query/sql-fragment\";\nimport {\n EDGE_CARDINALITY_SPECS,\n edgeCardinalityAxesForKind,\n edgeCardinalityClaimTarget,\n} from \"../../../store/claims/edge-claims\";\nimport type {\n ClaimEdgeCardinalityParams,\n PurgeEdgeClaimsParams,\n} from \"../../types\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\n/**\n * Qualifies a column with its relation, the one rendering both dialects read\n * identically. The claim statements name TWO relations (the claim rows and the\n * edges their holders are), so a bare column name would be ambiguous in the\n * takeover statement's correlated subquery.\n */\nfunction qualified(tableName: string, column: Readonly<{ name: string }>): SQL {\n return sql.raw(`\"${tableName}\".\"${column.name}\"`);\n}\n\n/**\n * Statement 1 — create-or-lock, decision-free.\n *\n * Its only job is to make the row exist, take its row lock, and report the\n * COMMITTED holder. The `DO UPDATE SET updated_at = <existing>.updated_at` is a\n * deliberate no-op write: it is what makes a conflicting row lock and report\n * itself through RETURNING, which a bare `DO NOTHING` would not. This is the\n * same statement shape `insertUnique` already uses, through the same\n * existing-row qualification, so it introduces no new dialect surface.\n *\n * A returned holder equal to the proposed edge means this writer owns the axis\n * and is done. Any other holder is decided by {@link buildTakeOverEdgeClaim},\n * against a FRESH snapshot — deciding inside this statement would read the\n * pre-lock snapshot of the edges relation and accept two concurrent writers.\n */\nexport function buildLockEdgeClaims(\n tables: Tables,\n entries: readonly ClaimEdgeCardinalityParams[],\n timestamp: string,\n): SQL {\n const { edgeClaims } = tables;\n const claimsName = getTableName(edgeClaims);\n\n const columns = sql.raw(\n `\"${edgeClaims.graphId.name}\", \"${edgeClaims.axis.name}\", \"${edgeClaims.key.name}\", \"${edgeClaims.edgeId.name}\", \"${edgeClaims.updatedAt.name}\"`,\n );\n const conflictColumns = sql.raw(\n `\"${edgeClaims.graphId.name}\", \"${edgeClaims.axis.name}\", \"${edgeClaims.key.name}\"`,\n );\n const valueRows = sql.join(\n entries.map((entry) => {\n const target = edgeCardinalityClaimTarget(entry);\n return sql`(${entry.graphId}, ${target.axis}, ${target.key}, ${entry.edgeId}, ${timestamp})`;\n }),\n sql`, `,\n );\n\n return sql`\n INSERT INTO ${edgeClaims} (${columns})\n VALUES ${valueRows}\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET ${quotedColumn(edgeClaims.updatedAt)} = ${qualified(claimsName, edgeClaims.updatedAt)}\n RETURNING\n ${quotedColumn(edgeClaims.axis)} as axis,\n ${quotedColumn(edgeClaims.key)} as key,\n ${quotedColumn(edgeClaims.edgeId)} as holder_edge_id\n `;\n}\n\n/**\n * Statement 2 — conditional takeover, on a fresh snapshot.\n *\n * Issued only when statement 1 reported a different holder. It succeeds exactly\n * when that holder is no longer an edge this axis and key describe, which is\n * what makes an abandoned claim self-healing: no release path has to have run\n * for a dead holder's axis to be reusable.\n *\n * **The holder is identified by more than its id.** Edge ids are\n * caller-suppliable and graph-unique, so a hard-deleted id can be reused by a\n * DIFFERENT edge; a claim naming that id would otherwise read as a live holder\n * and block its axis forever. The extra terms are exactly the components the\n * axis and key were built from — and exactly the columns `countEdgesFrom` /\n * `edgeExistsBetween` filter on — so the fence's liveness predicate and the\n * probe's read the same shape.\n *\n * The `valid_to IS NULL` term and the to-endpoint terms are not spelled here:\n * they are read from {@link EDGE_CARDINALITY_SPECS}, the same table the\n * TypeScript probe reads.\n */\nexport function buildTakeOverEdgeClaim(\n tables: Tables,\n params: ClaimEdgeCardinalityParams,\n timestamp: string,\n): SQL {\n const { edgeClaims, edges } = tables;\n const claimsName = getTableName(edgeClaims);\n const edgesName = getTableName(edges);\n const spec = EDGE_CARDINALITY_SPECS[params.cardinality];\n const target = edgeCardinalityClaimTarget(params);\n\n const toEndpointTerms =\n spec.keyShape === \"fromAndTo\" ?\n sql` AND ${qualified(edgesName, edges.toKind)} = ${params.toKind} AND ${qualified(edgesName, edges.toId)} = ${params.toId}`\n : sql``;\n const activeTerm =\n spec.holderLiveness === \"liveAndActive\" ?\n sql` AND ${qualified(edgesName, edges.validTo)} IS NULL`\n : sql``;\n\n return sql`\n UPDATE ${edgeClaims}\n SET ${quotedColumn(edgeClaims.edgeId)} = ${params.edgeId},\n ${quotedColumn(edgeClaims.updatedAt)} = ${timestamp}\n WHERE ${qualified(claimsName, edgeClaims.graphId)} = ${params.graphId}\n AND ${qualified(claimsName, edgeClaims.axis)} = ${target.axis}\n AND ${qualified(claimsName, edgeClaims.key)} = ${target.key}\n AND ${qualified(claimsName, edgeClaims.edgeId)} <> ${params.edgeId}\n AND NOT EXISTS (\n SELECT 1 FROM ${edges}\n WHERE ${qualified(edgesName, edges.graphId)} = ${qualified(claimsName, edgeClaims.graphId)}\n AND ${qualified(edgesName, edges.id)} = ${qualified(claimsName, edgeClaims.edgeId)}\n AND ${qualified(edgesName, edges.deletedAt)} IS NULL\n AND ${qualified(edgesName, edges.kind)} = ${params.edgeKind}\n AND ${qualified(edgesName, edges.fromKind)} = ${params.fromKind}\n AND ${qualified(edgesName, edges.fromId)} = ${params.fromId}${toEndpointTerms}${activeTerm}\n )\n RETURNING ${quotedColumn(edgeClaims.edgeId)} as holder_edge_id\n `;\n}\n\n/**\n * Housekeeping: drops the claims named edges hold.\n *\n * A hard delete or a `clearGraph` removes the edges a claim's liveness\n * predicate reads, so the claim would already be takeable; this only stops the\n * relation from growing without bound.\n */\nexport function buildPurgeEdgeClaims(\n tables: Tables,\n params: PurgeEdgeClaimsParams,\n): SQL {\n const { edgeClaims } = tables;\n return sql`\n DELETE FROM ${edgeClaims}\n WHERE ${edgeClaims.graphId} = ${params.graphId}\n AND ${edgeClaims.edgeId} IN (${sql.join(\n params.edgeIds.map((edgeId) => sql`${edgeId}`),\n sql`, `,\n )})\n `;\n}\n\n/**\n * THE definition of \"the cardinality claims an edge kind owns\": every row at\n * one of the kind's declared-cardinality axes.\n *\n * Keyed on the axis rather than on the holder's id because a removed kind's\n * edges are deleted in the same pass, which would leave a claim naming a row\n * that no longer exists — takeable, but never reaped. Takes the relation NAME\n * rather than the Drizzle table so `materializeRemovals`, which knows only its\n * configured table names, compiles the same statement.\n */\nexport function buildHardDeleteEdgeClaimsByEdgeKind(\n edgeClaimsTableName: string,\n params: Readonly<{ graphId: string; edgeKind: string }>,\n): SqlFragment {\n const axes = edgeCardinalityAxesForKind(params.edgeKind).map(\n (axis) => fragmentSql`${axis}`,\n );\n return fragmentSql`DELETE FROM ${fragmentSql.identifier(edgeClaimsTableName)} WHERE ${fragmentSql.identifier(\"graph_id\")} = ${params.graphId} AND ${fragmentSql.identifier(\"axis\")} IN (${fragmentSql.join(axes, fragmentSql`, `)})`;\n}\n\n/**\n * Housekeeping for node-kind removal: deletes every claim held by an edge whose\n * source or target has the removed kind.\n *\n * The holder ids are selected before those edges are deleted. Filtering claim\n * axes cannot express this ownership: an edge kind may connect several node\n * kinds, while its claim axis names only its cardinality and edge kind.\n */\nexport function buildHardDeleteEdgeClaimsByNodeKind(\n edgeClaimsTableName: string,\n edgesTableName: string,\n params: Readonly<{ graphId: string; nodeKind: string }>,\n): SqlFragment {\n return fragmentSql`DELETE FROM ${fragmentSql.identifier(edgeClaimsTableName)} WHERE ${fragmentSql.identifier(\"graph_id\")} = ${params.graphId} AND ${fragmentSql.identifier(\"edge_id\")} IN (SELECT ${fragmentSql.identifier(\"id\")} FROM ${fragmentSql.identifier(edgesTableName)} WHERE ${fragmentSql.identifier(\"graph_id\")} = ${params.graphId} AND (${fragmentSql.identifier(\"from_kind\")} = ${params.nodeKind} OR ${fragmentSql.identifier(\"to_kind\")} = ${params.nodeKind}))`;\n}\n","import { type Column, getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport {\n sql as fragmentSql,\n type SqlFragment,\n} from \"../../../query/sql-fragment\";\nimport { claimOwnerMatchesSql } from \"../../../store/claims/axis\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n DeleteUniqueParams,\n HardDeleteUniquesByConcreteKindParams,\n HardDeleteUniquesByNodeIdsParams,\n InsertUniqueParams,\n SqlDialect,\n} from \"../../types\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\ntype InsertUniqueDialectBuilder = (\n tables: Tables,\n params: InsertUniqueParams,\n) => SQL;\n\n/**\n * The proposed row's owner columns, as bound values — the single-row builders'\n * rendering of the `proposed` side of {@link claimOwnerMatchesSql}.\n */\nfunction boundOwnerColumn(\n uniques: Tables[\"uniques\"],\n params: InsertUniqueParams,\n): (column: Column) => SQL {\n return (column) =>\n column.name === uniques.nodeId.name ?\n sql`${params.nodeId}`\n : sql`${params.concreteKind}`;\n}\n\n/**\n * Builds an INSERT query for a uniqueness claim (SQLite).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing claim belongs to the same node — the OWNER PAIR\n * `(concrete_kind, node_id)`, because ids are unique only per kind — OR\n * 2. The existing claim is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING shows the conflicting owner.\n */\nfunction buildInsertUniqueSqlite(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`,\n );\n const conflictColumns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`,\n );\n\n const ownerMatches = claimOwnerMatchesSql(\n (column) => quotedColumn(column),\n boundOwnerColumn(uniques, params),\n uniques,\n );\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${ownerMatches} THEN ${params.nodeId}\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${quotedColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${ownerMatches} THEN ${params.concreteKind}\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${quotedColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${ownerMatches} THEN NULL\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${quotedColumn(uniques.deletedAt)}\n END\n RETURNING\n ${quotedColumn(uniques.nodeId)} as node_id,\n ${quotedColumn(uniques.concreteKind)} as concrete_kind\n `;\n}\n\n/**\n * Builds an INSERT query for a uniqueness claim (PostgreSQL).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing claim belongs to the same node — the OWNER PAIR\n * `(concrete_kind, node_id)`, because ids are unique only per kind — OR\n * 2. The existing claim is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING shows the conflicting owner.\n */\nfunction buildInsertUniquePostgres(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`,\n );\n const conflictColumns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`,\n );\n\n const tableName = getTableName(uniques);\n const existingColumn = (column: Readonly<{ name: string }>) =>\n sql.raw(`\"${tableName}\".\"${column.name}\"`);\n\n const ownerMatches = claimOwnerMatchesSql(\n (column) => existingColumn(column),\n boundOwnerColumn(uniques, params),\n uniques,\n );\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${ownerMatches} THEN ${params.nodeId}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${existingColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${ownerMatches} THEN ${params.concreteKind}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${existingColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${ownerMatches} THEN NULL\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${existingColumn(uniques.deletedAt)}\n END\n RETURNING\n ${quotedColumn(uniques.nodeId)} as node_id,\n ${quotedColumn(uniques.concreteKind)} as concrete_kind\n `;\n}\n\nconst UNIQUE_INSERT_BUILDERS: Record<SqlDialect, InsertUniqueDialectBuilder> = {\n postgres: buildInsertUniquePostgres,\n sqlite: buildInsertUniqueSqlite,\n};\n\n/**\n * Builds an INSERT query for a uniqueness entry.\n * Returns the node_id that now holds the key (may differ from input if conflict).\n */\nexport function buildInsertUnique(\n tables: Tables,\n dialect: SqlDialect,\n params: InsertUniqueParams,\n): SQL {\n const builder = UNIQUE_INSERT_BUILDERS[dialect];\n return builder(tables, params);\n}\n\n/**\n * Builds a multi-row INSERT for uniqueness claims with the same conflict\n * semantics as {@link buildInsertUnique}, expressed against `excluded`\n * (the proposed row) instead of per-statement bound values. RETURNING\n * exposes `(node_kind, constraint_name, key, node_id, concrete_kind)` for\n * every row — ON CONFLICT DO UPDATE returns updated rows too — so the caller\n * can attribute each entry's final OWNER PAIR and raise a uniqueness error for\n * the ones a different live node holds. `concrete_kind` is load-bearing in that\n * list: without it two batch rows sharing an id under different kinds would\n * both read their own `node_id` back and both be accepted.\n *\n * Callers must not pass two entries with the same conflict target\n * (`node_kind`, `constraint_name`, `key`): a multi-row upsert cannot\n * affect one row twice.\n */\nexport function buildInsertUniqueBatch(\n tables: Tables,\n dialect: SqlDialect,\n entries: readonly InsertUniqueParams[],\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`,\n );\n const conflictColumns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`,\n );\n\n // Mirror the single-row builders' dialect split for references to the\n // EXISTING row inside DO UPDATE: Postgres qualifies with the table name,\n // SQLite uses the bare quoted column.\n const tableName = getTableName(uniques);\n const existingColumn = (column: Readonly<{ name: string }>) => {\n switch (dialect) {\n case \"postgres\": {\n return sql.raw(`\"${tableName}\".\"${column.name}\"`);\n }\n case \"sqlite\": {\n return sql.raw(`\"${column.name}\"`);\n }\n default: {\n return dialect satisfies never;\n }\n }\n };\n const excludedColumn = (column: Readonly<{ name: string }>) =>\n sql.raw(`excluded.\"${column.name}\"`);\n\n const ownerMatches = claimOwnerMatchesSql(\n (column) => existingColumn(column),\n (column) => excludedColumn(column),\n uniques,\n );\n\n const valueRows = sql.join(\n entries.map(\n (params) =>\n sql`(${params.graphId}, ${params.nodeKind}, ${params.constraintName}, ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")})`,\n ),\n sql`, `,\n );\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES ${valueRows}\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${ownerMatches} THEN ${excludedColumn(uniques.nodeId)}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${excludedColumn(uniques.nodeId)}\n ELSE ${existingColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${ownerMatches} THEN ${excludedColumn(uniques.concreteKind)}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${excludedColumn(uniques.concreteKind)}\n ELSE ${existingColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${ownerMatches} THEN NULL\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${existingColumn(uniques.deletedAt)}\n END\n RETURNING\n ${quotedColumn(uniques.nodeKind)} as node_kind,\n ${quotedColumn(uniques.constraintName)} as constraint_name,\n ${quotedColumn(uniques.key)} as key,\n ${quotedColumn(uniques.nodeId)} as node_id,\n ${quotedColumn(uniques.concreteKind)} as concrete_kind\n `;\n}\n\n/**\n * Builds the owner-scoped soft DELETE that releases a uniqueness claim.\n * Uses raw column name in SET clause.\n *\n * The owner pair `(concrete_kind, node_id)` is always part of the predicate:\n * a release gives up the claims THIS node holds, never a namesake's under\n * another kind and never one that predates this node's write. `nodeKind`\n * additionally restricts the release to one claim axis — see\n * {@link DeleteUniqueParams} for the two shapes and who issues each.\n */\nexport function buildDeleteUnique(\n tables: Tables,\n params: DeleteUniqueParams,\n timestamp: string,\n): SQL {\n const { uniques } = tables;\n\n const axisTerm =\n params.nodeKind === undefined ?\n sql``\n : sql` AND ${uniques.nodeKind} = ${params.nodeKind}`;\n\n return sql`\n UPDATE ${uniques}\n SET ${quotedColumn(uniques.deletedAt)} = ${timestamp}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.concreteKind} = ${params.concreteKind}\n AND ${uniques.nodeId} = ${params.nodeId}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}${axisTerm}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for all uniqueness entries for a node.\n */\nexport function buildHardDeleteUniquesByNode(\n tables: Tables,\n graphId: string,\n concreteKind: string,\n nodeId: string,\n): SQL {\n return buildHardDeleteUniquesByNodeIds(tables, {\n graphId,\n concreteKind,\n nodeIds: [nodeId],\n });\n}\n\n/**\n * Builds a hard DELETE for every uniqueness entry owned by concrete nodes.\n */\nexport function buildHardDeleteUniquesByNodeIds(\n tables: Tables,\n params: HardDeleteUniquesByNodeIdsParams,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n DELETE FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.concreteKind} = ${params.concreteKind}\n AND ${uniques.nodeId} IN (${sql.join(\n params.nodeIds.map((nodeId) => sql`${nodeId}`),\n sql`, `,\n )})\n `;\n}\n\n/**\n * THE definition of \"the uniqueness claims nodes of this kind own\": every row\n * whose `concrete_kind` is the kind, at whatever axis the row sits on.\n *\n * Kind reaping is a different predicate from a lifecycle release — \"every claim\n * this kind's nodes own\" rather than \"this node's claim for one constraint and\n * key\" — and it is a hard delete rather than a tombstone, so it is its own\n * builder. It is nonetheless the ONLY spelling of that predicate: both the\n * `hardDeleteUniquesByConcreteKind` backend member and `materializeRemovals`'\n * removed-kind cleanup compile this fragment. Keying on `node_kind` instead\n * would leak a claim whose axis is a sibling kind, delete a surviving sibling's\n * claim when the removed kind IS the axis, and never match a claim whose axis\n * is not a kind at all.\n *\n * Takes the relation NAME rather than the Drizzle table so the store-side\n * caller, which knows only its configured table names, can build the same\n * statement; the fragment renders on either dialect.\n */\nexport function buildHardDeleteUniquesByConcreteKind(\n uniquesTableName: string,\n params: HardDeleteUniquesByConcreteKindParams,\n): SqlFragment {\n return fragmentSql`DELETE FROM ${fragmentSql.identifier(uniquesTableName)} WHERE ${fragmentSql.identifier(\"graph_id\")} = ${params.graphId} AND ${fragmentSql.identifier(\"concrete_kind\")} = ${params.concreteKind}`;\n}\n\n/**\n * Builds a SELECT query to check for uniqueness violations.\n */\nexport function buildCheckUnique(\n tables: Tables,\n params: CheckUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n if (params.includeDeleted) {\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n `;\n }\n\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a SELECT query to batch-check uniqueness entries by multiple keys.\n */\nexport function buildCheckUniqueBatch(\n tables: Tables,\n params: CheckUniqueBatchParams,\n): SQL {\n const { uniques } = tables;\n\n const keyPlaceholders = sql.join(\n params.keys.map((key) => sql`${key}`),\n sql`, `,\n );\n\n if (params.includeDeleted) {\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} IN (${keyPlaceholders})\n `;\n }\n\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} IN (${keyPlaceholders})\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkL3LQNR34_cjs = require('./chunk-L3LQNR34.cjs');
3
+ var chunkTEC24ZDA_cjs = require('./chunk-TEC24ZDA.cjs');
4
4
 
5
5
  // src/indexes/system.ts
6
6
  var SYSTEM_INDEX_DECLARATIONS = [
@@ -175,7 +175,7 @@ var MAX_SQL_IDENTIFIER_LENGTH = 63;
175
175
  function systemIndexName(physicalTableName, suffix) {
176
176
  const full = `${physicalTableName}_${suffix}`;
177
177
  if (full.length <= MAX_SQL_IDENTIFIER_LENGTH) return full;
178
- const hash = chunkL3LQNR34_cjs.shortHash(JSON.stringify([physicalTableName, suffix]));
178
+ const hash = chunkTEC24ZDA_cjs.shortHash(JSON.stringify([physicalTableName, suffix]));
179
179
  return `${full.slice(0, MAX_SQL_IDENTIFIER_LENGTH - 1 - hash.length)}_${hash}`;
180
180
  }
181
181
  function resolveSystemIndexNames(overrides) {
@@ -200,11 +200,11 @@ function assertNoSystemIndexNameCollision(indexes, overrides) {
200
200
  }
201
201
  }
202
202
  function generateSystemIndexDDL(declaration, physicalTableName, options) {
203
- const name = chunkL3LQNR34_cjs.quoteIdentifier(
203
+ const name = chunkTEC24ZDA_cjs.quoteIdentifier(
204
204
  systemIndexName(physicalTableName, declaration.suffix)
205
205
  );
206
- const table = chunkL3LQNR34_cjs.quoteIdentifier(physicalTableName);
207
- const columns = declaration.columns.map((column) => chunkL3LQNR34_cjs.quoteIdentifier(column)).join(", ");
206
+ const table = chunkTEC24ZDA_cjs.quoteIdentifier(physicalTableName);
207
+ const columns = declaration.columns.map((column) => chunkTEC24ZDA_cjs.quoteIdentifier(column)).join(", ");
208
208
  const concurrently = options.concurrent ? "CONCURRENTLY " : "";
209
209
  return `CREATE INDEX ${concurrently}IF NOT EXISTS ${name} ON ${table} (${columns});`;
210
210
  }
@@ -215,5 +215,5 @@ exports.generateSystemIndexDDL = generateSystemIndexDDL;
215
215
  exports.resolveSystemIndexNames = resolveSystemIndexNames;
216
216
  exports.resolveSystemIndexTableName = resolveSystemIndexTableName;
217
217
  exports.systemIndexName = systemIndexName;
218
- //# sourceMappingURL=chunk-OI2GQ25X.cjs.map
219
- //# sourceMappingURL=chunk-OI2GQ25X.cjs.map
218
+ //# sourceMappingURL=chunk-SHC7BCG5.cjs.map
219
+ //# sourceMappingURL=chunk-SHC7BCG5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/indexes/system.ts"],"names":["shortHash","quoteIdentifier"],"mappings":"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","file":"chunk-OI2GQ25X.cjs","sourcesContent":["/**\n * System-index declarations — the single source of truth for the plain\n * btree indexes TypeGraph ships on its own relations.\n *\n * Both dialect schema factories (`createSqliteTables` /\n * `createPostgresTables`) derive their Drizzle index builders from this\n * list, so the two dialects cannot drift, and\n * `materializeSystemIndexes()` derives the same indexes as runtime DDL so\n * an index added in a new library version reaches already-initialized\n * databases (bootstrap DDL only runs on first boot — see\n * `loadActiveSchemaWithBootstrap`).\n *\n * Scope: non-unique btree column indexes on the four graph relations,\n * where performance iteration actually happens. Primary keys, unique /\n * partial-unique constraints, and status-table indexes are structural —\n * they are created with their table and never retrofitted — and stay in\n * the schema files.\n *\n * Changing a declaration's shape under the same suffix is a signature\n * drift: `materializeSystemIndexes` reports `failed` for it until the\n * operator drops the old physical index. Rename (new suffix) instead,\n * exactly like graph-declared indexes. Two acknowledged limits of that\n * contract: on databases whose indexes were bootstrap-created (no status\n * rows) an in-place reshape is undetectable at runtime — the rename rule\n * is enforced by review and the parity tests; and a renamed suffix\n * strands the old physical index (the runner only adds). When the first\n * rename actually happens, add a retired-suffixes list + drop path here.\n */\nimport { quoteIdentifier, shortHash } from \"../query/dialect/vector-strategy\";\n\n/** The TypeGraph relations that carry system indexes. */\nexport type SystemIndexTable =\n \"nodes\" | \"edges\" | \"recordedNodes\" | \"recordedEdges\";\n\ntype LiveColumn =\n | \"graph_id\"\n | \"kind\"\n | \"id\"\n | \"deleted_at\"\n | \"valid_from\"\n | \"valid_to\"\n | \"created_at\";\n\ntype LiveEdgeColumn =\n LiveColumn | \"from_kind\" | \"from_id\" | \"to_kind\" | \"to_id\";\n\ntype RecordedColumn =\n | \"graph_id\"\n | \"kind\"\n | \"id\"\n | \"valid_from\"\n | \"valid_to\"\n | \"recorded_from\"\n | \"recorded_to\";\n\ntype RecordedEdgeColumn =\n RecordedColumn | \"from_kind\" | \"from_id\" | \"to_kind\" | \"to_id\";\n\ntype SystemIndexColumnsFor<T extends SystemIndexTable> =\n T extends \"nodes\" ? LiveColumn\n : T extends \"edges\" ? LiveEdgeColumn\n : T extends \"recordedNodes\" ? RecordedColumn\n : RecordedEdgeColumn;\n\ntype SystemIndexDeclarationFor<T extends SystemIndexTable> = Readonly<{\n table: T;\n /** Physical index name is `${physicalTableName}_${suffix}`. */\n suffix: string;\n columns: readonly [SystemIndexColumnsFor<T>, ...SystemIndexColumnsFor<T>[]];\n}>;\n\nexport type SystemIndexDeclaration =\n | SystemIndexDeclarationFor<\"nodes\">\n | SystemIndexDeclarationFor<\"edges\">\n | SystemIndexDeclarationFor<\"recordedNodes\">\n | SystemIndexDeclarationFor<\"recordedEdges\">;\n\nexport const SYSTEM_INDEX_DECLARATIONS: readonly SystemIndexDeclaration[] = [\n // ---------------------------------------------------------- nodes\n { table: \"nodes\", suffix: \"kind_idx\", columns: [\"graph_id\", \"kind\"] },\n // Listing shape: kind partition ordered by creation with the\n // soft-delete column ahead of it so `deleted_at IS NULL` list queries\n // stay index-served.\n {\n table: \"nodes\",\n suffix: \"kind_created_idx\",\n columns: [\"graph_id\", \"kind\", \"deleted_at\", \"created_at\"],\n },\n {\n table: \"nodes\",\n suffix: \"deleted_idx\",\n columns: [\"graph_id\", \"deleted_at\"],\n },\n {\n table: \"nodes\",\n suffix: \"valid_idx\",\n columns: [\"graph_id\", \"valid_from\", \"valid_to\"],\n },\n // Bare-id lookup: the primary key leads with `kind` (graph_id, kind,\n // id), so a `WHERE graph_id = ? AND id = ?` probe that doesn't know the\n // kind can't seek it — SQLite falls back to a graph_id-only scan of\n // every node in the graph (~3M at LDBC SF1).\n // `store.algorithms.degree`'s node-kind subquery does exactly that\n // lookup (it resolves the seed's kind by id), so without this index\n // degree is a full nodes scan (~95ms at SF1). See typegraph#280.\n { table: \"nodes\", suffix: \"id_idx\", columns: [\"graph_id\", \"id\"] },\n\n // ---------------------------------------------------------- edges\n { table: \"edges\", suffix: \"kind_idx\", columns: [\"graph_id\", \"kind\"] },\n // Directional traversal index (outgoing): supports endpoint lookups\n // and extra filtering by edge kind / target kind. Includes every\n // system column the compiled query's soft-delete/temporal-validity\n // predicate touches (deleted_at, valid_from, valid_to), trailed by\n // to_id — the compiled traversal join reads `n.id = e.to_id` for an\n // outgoing traversal (standard-builders.ts), so without to_id here\n // the join still fetches the edge's heap row for that one column\n // even with the seek/predicate columns covered.\n {\n table: \"edges\",\n suffix: \"from_idx\",\n columns: [\n \"graph_id\",\n \"from_kind\",\n \"from_id\",\n \"kind\",\n \"to_kind\",\n \"deleted_at\",\n \"valid_from\",\n \"valid_to\",\n \"to_id\",\n ],\n },\n // Directional traversal index (incoming): mirrors from_idx for\n // reverse traversals, trailed by from_id for the same reason\n // (`n.id = e.from_id` for an incoming traversal).\n {\n table: \"edges\",\n suffix: \"to_idx\",\n columns: [\n \"graph_id\",\n \"to_kind\",\n \"to_id\",\n \"kind\",\n \"from_kind\",\n \"deleted_at\",\n \"valid_from\",\n \"valid_to\",\n \"from_id\",\n ],\n },\n {\n table: \"edges\",\n suffix: \"kind_created_idx\",\n columns: [\"graph_id\", \"kind\", \"deleted_at\", \"created_at\"],\n },\n {\n table: \"edges\",\n suffix: \"deleted_idx\",\n columns: [\"graph_id\", \"deleted_at\"],\n },\n {\n table: \"edges\",\n suffix: \"valid_idx\",\n columns: [\"graph_id\", \"valid_from\", \"valid_to\"],\n },\n // Cardinality enforcement: the one-per-endpoint check probes for a\n // currently-valid edge of a kind from a specific endpoint.\n {\n table: \"edges\",\n suffix: \"cardinality_idx\",\n columns: [\"graph_id\", \"kind\", \"from_kind\", \"from_id\", \"valid_to\"],\n },\n\n // ---------------------------------------------------------- recordedNodes\n {\n table: \"recordedNodes\",\n suffix: \"entity_idx\",\n columns: [\"graph_id\", \"kind\", \"id\", \"recorded_from\", \"recorded_to\"],\n },\n {\n table: \"recordedNodes\",\n suffix: \"open_idx\",\n columns: [\"graph_id\", \"recorded_to\"],\n },\n {\n table: \"recordedNodes\",\n suffix: \"valid_idx\",\n columns: [\"graph_id\", \"valid_from\", \"valid_to\"],\n },\n // Bare-id lookup parity with the live nodes table: recorded-pinned\n // reads swap this relation in as the node source, and `entity_idx`\n // leads with `kind`, so the same kind-by-bare-id probe (e.g.\n // `degree()` at a recorded coordinate) would otherwise scan every\n // historical version in the graph. See typegraph#280.\n { table: \"recordedNodes\", suffix: \"id_idx\", columns: [\"graph_id\", \"id\"] },\n\n // ---------------------------------------------------------- recordedEdges\n {\n table: \"recordedEdges\",\n suffix: \"entity_idx\",\n columns: [\"graph_id\", \"kind\", \"id\", \"recorded_from\", \"recorded_to\"],\n },\n {\n table: \"recordedEdges\",\n suffix: \"open_idx\",\n columns: [\"graph_id\", \"recorded_to\"],\n },\n {\n table: \"recordedEdges\",\n suffix: \"from_idx\",\n columns: [\n \"graph_id\",\n \"from_kind\",\n \"from_id\",\n \"kind\",\n \"to_kind\",\n \"recorded_from\",\n \"recorded_to\",\n ],\n },\n {\n table: \"recordedEdges\",\n suffix: \"to_idx\",\n columns: [\n \"graph_id\",\n \"to_kind\",\n \"to_id\",\n \"kind\",\n \"from_kind\",\n \"recorded_from\",\n \"recorded_to\",\n ],\n },\n {\n table: \"recordedEdges\",\n suffix: \"valid_idx\",\n columns: [\"graph_id\", \"valid_from\", \"valid_to\"],\n },\n];\n\n/** Default physical table names for the system-index relations. */\nconst DEFAULT_SYSTEM_INDEX_TABLE_NAMES: Readonly<\n Record<SystemIndexTable, string>\n> = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n recordedNodes: \"typegraph_recorded_nodes\",\n recordedEdges: \"typegraph_recorded_edges\",\n};\n\n/**\n * Resolves the physical table name for a system-index relation, honoring\n * a backend's table-name overrides.\n */\nexport function resolveSystemIndexTableName(\n table: SystemIndexTable,\n overrides:\n Readonly<Partial<Record<SystemIndexTable, string | undefined>>> | undefined,\n): string {\n return overrides?.[table] ?? DEFAULT_SYSTEM_INDEX_TABLE_NAMES[table];\n}\n\n/**\n * PostgreSQL truncates identifiers to NAMEDATALEN-1 = 63 bytes SILENTLY —\n * two suffixes of one long custom table name would collide after\n * truncation, and the catalog probes (which compare by exact name) would\n * never match the stored name, re-attempting the build on every boot.\n * SQLite has no such limit but uses the same bound so the two dialects'\n * index sets stay in byte-for-byte parity. (Char-based like the vector\n * identifier bound — multibyte table names are out of scope.)\n */\nconst MAX_SQL_IDENTIFIER_LENGTH = 63;\n\n/**\n * Physical index name: `${physicalTableName}_${suffix}`, deterministically\n * truncated + hash-suffixed past the 63-char identifier bound so distinct\n * indexes stay distinct. Single choke point — the Drizzle builders, the\n * runtime DDL, the catalog probes, and the status keys all derive the\n * name here, so they can never disagree.\n */\nexport function systemIndexName(\n physicalTableName: string,\n suffix: string,\n): string {\n const full = `${physicalTableName}_${suffix}`;\n if (full.length <= MAX_SQL_IDENTIFIER_LENGTH) return full;\n const hash = shortHash(JSON.stringify([physicalTableName, suffix]));\n return `${full.slice(0, MAX_SQL_IDENTIFIER_LENGTH - 1 - hash.length)}_${hash}`;\n}\n\n/**\n * Every system index name for a deployment's (possibly overridden) table\n * names. Graph-declared index names must not collide with these: a\n * colliding `CREATE INDEX IF NOT EXISTS` would silently no-op against the\n * system index (wrong shape) while recording a false success — see the\n * guards in the schema factories and `materializeIndexes`.\n */\nexport function resolveSystemIndexNames(\n overrides:\n Readonly<Partial<Record<SystemIndexTable, string | undefined>>> | undefined,\n): ReadonlySet<string> {\n return new Set(\n SYSTEM_INDEX_DECLARATIONS.map((declaration) =>\n systemIndexName(\n resolveSystemIndexTableName(declaration.table, overrides),\n declaration.suffix,\n ),\n ),\n );\n}\n\n/**\n * Rejects graph-declared indexes whose names collide with this\n * deployment's system index names. Called by both dialect schema\n * factories so a colliding declaration fails at table-definition time\n * instead of silently no-opping against the (differently shaped) system\n * index at CREATE INDEX IF NOT EXISTS time. `materializeIndexes` applies\n * the same check per-declaration on its runtime path.\n */\nexport function assertNoSystemIndexNameCollision(\n indexes: readonly Readonly<{ name: string }>[],\n overrides:\n Readonly<Partial<Record<SystemIndexTable, string | undefined>>> | undefined,\n): void {\n if (indexes.length === 0) return;\n const reserved = resolveSystemIndexNames(overrides);\n for (const index of indexes) {\n if (reserved.has(index.name)) {\n throw new Error(\n `Index name \"${index.name}\" collides with a TypeGraph system ` +\n `index. Choose a different name — system index names are ` +\n `reserved, and a same-named CREATE INDEX IF NOT EXISTS would ` +\n `silently no-op against the system index instead of creating ` +\n `the declared one.`,\n );\n }\n }\n}\n\n/**\n * Runtime DDL for one system index — byte-compatible with the index the\n * bootstrap path creates from the Drizzle schema (same name, same\n * columns), plus `CONCURRENTLY` where the dialect supports building\n * without blocking writes.\n */\nexport function generateSystemIndexDDL(\n declaration: SystemIndexDeclaration,\n physicalTableName: string,\n options: Readonly<{ concurrent: boolean }>,\n): string {\n const name = quoteIdentifier(\n systemIndexName(physicalTableName, declaration.suffix),\n );\n const table = quoteIdentifier(physicalTableName);\n const columns = declaration.columns\n .map((column) => quoteIdentifier(column))\n .join(\", \");\n const concurrently = options.concurrent ? \"CONCURRENTLY \" : \"\";\n return `CREATE INDEX ${concurrently}IF NOT EXISTS ${name} ON ${table} (${columns});`;\n}\n"]}
1
+ {"version":3,"sources":["../src/indexes/system.ts"],"names":["shortHash","quoteIdentifier"],"mappings":"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","file":"chunk-SHC7BCG5.cjs","sourcesContent":["/**\n * System-index declarations — the single source of truth for the plain\n * btree indexes TypeGraph ships on its own relations.\n *\n * Both dialect schema factories (`createSqliteTables` /\n * `createPostgresTables`) derive their Drizzle index builders from this\n * list, so the two dialects cannot drift, and\n * `materializeSystemIndexes()` derives the same indexes as runtime DDL so\n * an index added in a new library version reaches already-initialized\n * databases (bootstrap DDL only runs on first boot — see\n * `loadActiveSchemaWithBootstrap`).\n *\n * Scope: non-unique btree column indexes on the four graph relations,\n * where performance iteration actually happens. Primary keys, unique /\n * partial-unique constraints, and status-table indexes are structural —\n * they are created with their table and never retrofitted — and stay in\n * the schema files.\n *\n * Changing a declaration's shape under the same suffix is a signature\n * drift: `materializeSystemIndexes` reports `failed` for it until the\n * operator drops the old physical index. Rename (new suffix) instead,\n * exactly like graph-declared indexes. Two acknowledged limits of that\n * contract: on databases whose indexes were bootstrap-created (no status\n * rows) an in-place reshape is undetectable at runtime — the rename rule\n * is enforced by review and the parity tests; and a renamed suffix\n * strands the old physical index (the runner only adds). When the first\n * rename actually happens, add a retired-suffixes list + drop path here.\n */\nimport { quoteIdentifier, shortHash } from \"../query/dialect/vector-strategy\";\n\n/** The TypeGraph relations that carry system indexes. */\nexport type SystemIndexTable =\n \"nodes\" | \"edges\" | \"recordedNodes\" | \"recordedEdges\";\n\ntype LiveColumn =\n | \"graph_id\"\n | \"kind\"\n | \"id\"\n | \"deleted_at\"\n | \"valid_from\"\n | \"valid_to\"\n | \"created_at\";\n\ntype LiveEdgeColumn =\n LiveColumn | \"from_kind\" | \"from_id\" | \"to_kind\" | \"to_id\";\n\ntype RecordedColumn =\n | \"graph_id\"\n | \"kind\"\n | \"id\"\n | \"valid_from\"\n | \"valid_to\"\n | \"recorded_from\"\n | \"recorded_to\";\n\ntype RecordedEdgeColumn =\n RecordedColumn | \"from_kind\" | \"from_id\" | \"to_kind\" | \"to_id\";\n\ntype SystemIndexColumnsFor<T extends SystemIndexTable> =\n T extends \"nodes\" ? LiveColumn\n : T extends \"edges\" ? LiveEdgeColumn\n : T extends \"recordedNodes\" ? RecordedColumn\n : RecordedEdgeColumn;\n\ntype SystemIndexDeclarationFor<T extends SystemIndexTable> = Readonly<{\n table: T;\n /** Physical index name is `${physicalTableName}_${suffix}`. */\n suffix: string;\n columns: readonly [SystemIndexColumnsFor<T>, ...SystemIndexColumnsFor<T>[]];\n}>;\n\nexport type SystemIndexDeclaration =\n | SystemIndexDeclarationFor<\"nodes\">\n | SystemIndexDeclarationFor<\"edges\">\n | SystemIndexDeclarationFor<\"recordedNodes\">\n | SystemIndexDeclarationFor<\"recordedEdges\">;\n\nexport const SYSTEM_INDEX_DECLARATIONS: readonly SystemIndexDeclaration[] = [\n // ---------------------------------------------------------- nodes\n { table: \"nodes\", suffix: \"kind_idx\", columns: [\"graph_id\", \"kind\"] },\n // Listing shape: kind partition ordered by creation with the\n // soft-delete column ahead of it so `deleted_at IS NULL` list queries\n // stay index-served.\n {\n table: \"nodes\",\n suffix: \"kind_created_idx\",\n columns: [\"graph_id\", \"kind\", \"deleted_at\", \"created_at\"],\n },\n {\n table: \"nodes\",\n suffix: \"deleted_idx\",\n columns: [\"graph_id\", \"deleted_at\"],\n },\n {\n table: \"nodes\",\n suffix: \"valid_idx\",\n columns: [\"graph_id\", \"valid_from\", \"valid_to\"],\n },\n // Bare-id lookup: the primary key leads with `kind` (graph_id, kind,\n // id), so a `WHERE graph_id = ? AND id = ?` probe that doesn't know the\n // kind can't seek it — SQLite falls back to a graph_id-only scan of\n // every node in the graph (~3M at LDBC SF1).\n // `store.algorithms.degree`'s node-kind subquery does exactly that\n // lookup (it resolves the seed's kind by id), so without this index\n // degree is a full nodes scan (~95ms at SF1). See typegraph#280.\n { table: \"nodes\", suffix: \"id_idx\", columns: [\"graph_id\", \"id\"] },\n\n // ---------------------------------------------------------- edges\n { table: \"edges\", suffix: \"kind_idx\", columns: [\"graph_id\", \"kind\"] },\n // Directional traversal index (outgoing): supports endpoint lookups\n // and extra filtering by edge kind / target kind. Includes every\n // system column the compiled query's soft-delete/temporal-validity\n // predicate touches (deleted_at, valid_from, valid_to), trailed by\n // to_id — the compiled traversal join reads `n.id = e.to_id` for an\n // outgoing traversal (standard-builders.ts), so without to_id here\n // the join still fetches the edge's heap row for that one column\n // even with the seek/predicate columns covered.\n {\n table: \"edges\",\n suffix: \"from_idx\",\n columns: [\n \"graph_id\",\n \"from_kind\",\n \"from_id\",\n \"kind\",\n \"to_kind\",\n \"deleted_at\",\n \"valid_from\",\n \"valid_to\",\n \"to_id\",\n ],\n },\n // Directional traversal index (incoming): mirrors from_idx for\n // reverse traversals, trailed by from_id for the same reason\n // (`n.id = e.from_id` for an incoming traversal).\n {\n table: \"edges\",\n suffix: \"to_idx\",\n columns: [\n \"graph_id\",\n \"to_kind\",\n \"to_id\",\n \"kind\",\n \"from_kind\",\n \"deleted_at\",\n \"valid_from\",\n \"valid_to\",\n \"from_id\",\n ],\n },\n {\n table: \"edges\",\n suffix: \"kind_created_idx\",\n columns: [\"graph_id\", \"kind\", \"deleted_at\", \"created_at\"],\n },\n {\n table: \"edges\",\n suffix: \"deleted_idx\",\n columns: [\"graph_id\", \"deleted_at\"],\n },\n {\n table: \"edges\",\n suffix: \"valid_idx\",\n columns: [\"graph_id\", \"valid_from\", \"valid_to\"],\n },\n // Cardinality enforcement: the one-per-endpoint check probes for a\n // currently-valid edge of a kind from a specific endpoint.\n {\n table: \"edges\",\n suffix: \"cardinality_idx\",\n columns: [\"graph_id\", \"kind\", \"from_kind\", \"from_id\", \"valid_to\"],\n },\n\n // ---------------------------------------------------------- recordedNodes\n {\n table: \"recordedNodes\",\n suffix: \"entity_idx\",\n columns: [\"graph_id\", \"kind\", \"id\", \"recorded_from\", \"recorded_to\"],\n },\n {\n table: \"recordedNodes\",\n suffix: \"open_idx\",\n columns: [\"graph_id\", \"recorded_to\"],\n },\n {\n table: \"recordedNodes\",\n suffix: \"valid_idx\",\n columns: [\"graph_id\", \"valid_from\", \"valid_to\"],\n },\n // Bare-id lookup parity with the live nodes table: recorded-pinned\n // reads swap this relation in as the node source, and `entity_idx`\n // leads with `kind`, so the same kind-by-bare-id probe (e.g.\n // `degree()` at a recorded coordinate) would otherwise scan every\n // historical version in the graph. See typegraph#280.\n { table: \"recordedNodes\", suffix: \"id_idx\", columns: [\"graph_id\", \"id\"] },\n\n // ---------------------------------------------------------- recordedEdges\n {\n table: \"recordedEdges\",\n suffix: \"entity_idx\",\n columns: [\"graph_id\", \"kind\", \"id\", \"recorded_from\", \"recorded_to\"],\n },\n {\n table: \"recordedEdges\",\n suffix: \"open_idx\",\n columns: [\"graph_id\", \"recorded_to\"],\n },\n {\n table: \"recordedEdges\",\n suffix: \"from_idx\",\n columns: [\n \"graph_id\",\n \"from_kind\",\n \"from_id\",\n \"kind\",\n \"to_kind\",\n \"recorded_from\",\n \"recorded_to\",\n ],\n },\n {\n table: \"recordedEdges\",\n suffix: \"to_idx\",\n columns: [\n \"graph_id\",\n \"to_kind\",\n \"to_id\",\n \"kind\",\n \"from_kind\",\n \"recorded_from\",\n \"recorded_to\",\n ],\n },\n {\n table: \"recordedEdges\",\n suffix: \"valid_idx\",\n columns: [\"graph_id\", \"valid_from\", \"valid_to\"],\n },\n];\n\n/** Default physical table names for the system-index relations. */\nconst DEFAULT_SYSTEM_INDEX_TABLE_NAMES: Readonly<\n Record<SystemIndexTable, string>\n> = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n recordedNodes: \"typegraph_recorded_nodes\",\n recordedEdges: \"typegraph_recorded_edges\",\n};\n\n/**\n * Resolves the physical table name for a system-index relation, honoring\n * a backend's table-name overrides.\n */\nexport function resolveSystemIndexTableName(\n table: SystemIndexTable,\n overrides:\n Readonly<Partial<Record<SystemIndexTable, string | undefined>>> | undefined,\n): string {\n return overrides?.[table] ?? DEFAULT_SYSTEM_INDEX_TABLE_NAMES[table];\n}\n\n/**\n * PostgreSQL truncates identifiers to NAMEDATALEN-1 = 63 bytes SILENTLY —\n * two suffixes of one long custom table name would collide after\n * truncation, and the catalog probes (which compare by exact name) would\n * never match the stored name, re-attempting the build on every boot.\n * SQLite has no such limit but uses the same bound so the two dialects'\n * index sets stay in byte-for-byte parity. (Char-based like the vector\n * identifier bound — multibyte table names are out of scope.)\n */\nconst MAX_SQL_IDENTIFIER_LENGTH = 63;\n\n/**\n * Physical index name: `${physicalTableName}_${suffix}`, deterministically\n * truncated + hash-suffixed past the 63-char identifier bound so distinct\n * indexes stay distinct. Single choke point — the Drizzle builders, the\n * runtime DDL, the catalog probes, and the status keys all derive the\n * name here, so they can never disagree.\n */\nexport function systemIndexName(\n physicalTableName: string,\n suffix: string,\n): string {\n const full = `${physicalTableName}_${suffix}`;\n if (full.length <= MAX_SQL_IDENTIFIER_LENGTH) return full;\n const hash = shortHash(JSON.stringify([physicalTableName, suffix]));\n return `${full.slice(0, MAX_SQL_IDENTIFIER_LENGTH - 1 - hash.length)}_${hash}`;\n}\n\n/**\n * Every system index name for a deployment's (possibly overridden) table\n * names. Graph-declared index names must not collide with these: a\n * colliding `CREATE INDEX IF NOT EXISTS` would silently no-op against the\n * system index (wrong shape) while recording a false success — see the\n * guards in the schema factories and `materializeIndexes`.\n */\nexport function resolveSystemIndexNames(\n overrides:\n Readonly<Partial<Record<SystemIndexTable, string | undefined>>> | undefined,\n): ReadonlySet<string> {\n return new Set(\n SYSTEM_INDEX_DECLARATIONS.map((declaration) =>\n systemIndexName(\n resolveSystemIndexTableName(declaration.table, overrides),\n declaration.suffix,\n ),\n ),\n );\n}\n\n/**\n * Rejects graph-declared indexes whose names collide with this\n * deployment's system index names. Called by both dialect schema\n * factories so a colliding declaration fails at table-definition time\n * instead of silently no-opping against the (differently shaped) system\n * index at CREATE INDEX IF NOT EXISTS time. `materializeIndexes` applies\n * the same check per-declaration on its runtime path.\n */\nexport function assertNoSystemIndexNameCollision(\n indexes: readonly Readonly<{ name: string }>[],\n overrides:\n Readonly<Partial<Record<SystemIndexTable, string | undefined>>> | undefined,\n): void {\n if (indexes.length === 0) return;\n const reserved = resolveSystemIndexNames(overrides);\n for (const index of indexes) {\n if (reserved.has(index.name)) {\n throw new Error(\n `Index name \"${index.name}\" collides with a TypeGraph system ` +\n `index. Choose a different name — system index names are ` +\n `reserved, and a same-named CREATE INDEX IF NOT EXISTS would ` +\n `silently no-op against the system index instead of creating ` +\n `the declared one.`,\n );\n }\n }\n}\n\n/**\n * Runtime DDL for one system index — byte-compatible with the index the\n * bootstrap path creates from the Drizzle schema (same name, same\n * columns), plus `CONCURRENTLY` where the dialect supports building\n * without blocking writes.\n */\nexport function generateSystemIndexDDL(\n declaration: SystemIndexDeclaration,\n physicalTableName: string,\n options: Readonly<{ concurrent: boolean }>,\n): string {\n const name = quoteIdentifier(\n systemIndexName(physicalTableName, declaration.suffix),\n );\n const table = quoteIdentifier(physicalTableName);\n const columns = declaration.columns\n .map((column) => quoteIdentifier(column))\n .join(\", \");\n const concurrently = options.concurrent ? \"CONCURRENTLY \" : \"\";\n return `CREATE INDEX ${concurrently}IF NOT EXISTS ${name} ON ${table} (${columns});`;\n}\n"]}