@nicia-ai/typegraph 0.36.0 → 0.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/backend/postgres/index.cjs +24 -24
  2. package/dist/backend/postgres/index.d.cts +6 -6
  3. package/dist/backend/postgres/index.d.ts +6 -6
  4. package/dist/backend/postgres/index.js +11 -11
  5. package/dist/backend/postgres/pglite.cjs +16 -16
  6. package/dist/backend/postgres/pglite.d.cts +3 -3
  7. package/dist/backend/postgres/pglite.d.ts +3 -3
  8. package/dist/backend/postgres/pglite.js +11 -11
  9. package/dist/backend/sqlite/index.cjs +22 -21
  10. package/dist/backend/sqlite/index.d.cts +11 -9
  11. package/dist/backend/sqlite/index.d.ts +11 -9
  12. package/dist/backend/sqlite/index.js +10 -9
  13. package/dist/backend/sqlite/libsql.cjs +15 -14
  14. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  15. package/dist/backend/sqlite/libsql.d.cts +3 -3
  16. package/dist/backend/sqlite/libsql.d.ts +3 -3
  17. package/dist/backend/sqlite/libsql.js +11 -10
  18. package/dist/backend/sqlite/libsql.js.map +1 -1
  19. package/dist/backend/sqlite/local.cjs +30 -23
  20. package/dist/backend/sqlite/local.cjs.map +1 -1
  21. package/dist/backend/sqlite/local.d.cts +3 -3
  22. package/dist/backend/sqlite/local.d.ts +3 -3
  23. package/dist/backend/sqlite/local.js +18 -11
  24. package/dist/backend/sqlite/local.js.map +1 -1
  25. package/dist/{chunk-TCOCYN2P.cjs → chunk-27SSDCEP.cjs} +14 -14
  26. package/dist/{chunk-TCOCYN2P.cjs.map → chunk-27SSDCEP.cjs.map} +1 -1
  27. package/dist/{chunk-5AQIKK56.cjs → chunk-2N6EOBTH.cjs} +16 -16
  28. package/dist/{chunk-5AQIKK56.cjs.map → chunk-2N6EOBTH.cjs.map} +1 -1
  29. package/dist/{chunk-FN35DLCN.cjs → chunk-3C2RYI6L.cjs} +13 -107
  30. package/dist/chunk-3C2RYI6L.cjs.map +1 -0
  31. package/dist/{chunk-HW3LW7DH.cjs → chunk-3DS7Z4T4.cjs} +39 -39
  32. package/dist/{chunk-HW3LW7DH.cjs.map → chunk-3DS7Z4T4.cjs.map} +1 -1
  33. package/dist/{chunk-RSSQKPSZ.cjs → chunk-3GH67G4Z.cjs} +5 -5
  34. package/dist/{chunk-RSSQKPSZ.cjs.map → chunk-3GH67G4Z.cjs.map} +1 -1
  35. package/dist/{chunk-M75SUBFG.js → chunk-3RWZPJKV.js} +24 -9
  36. package/dist/chunk-3RWZPJKV.js.map +1 -0
  37. package/dist/{chunk-SKCOUWAX.js → chunk-3SLPDKHQ.js} +4 -4
  38. package/dist/chunk-3SLPDKHQ.js.map +1 -0
  39. package/dist/{chunk-5A6FNS6N.cjs → chunk-3XXGYU62.cjs} +11 -11
  40. package/dist/{chunk-5A6FNS6N.cjs.map → chunk-3XXGYU62.cjs.map} +1 -1
  41. package/dist/{chunk-IU46OHVW.js → chunk-44TA22QT.js} +58 -11
  42. package/dist/chunk-44TA22QT.js.map +1 -0
  43. package/dist/{chunk-7BQLPXK6.cjs → chunk-5AVRFNP4.cjs} +2955 -898
  44. package/dist/chunk-5AVRFNP4.cjs.map +1 -0
  45. package/dist/{chunk-2THZ3TQI.cjs → chunk-5KEQ74YU.cjs} +14 -14
  46. package/dist/chunk-5KEQ74YU.cjs.map +1 -0
  47. package/dist/{chunk-Q5TEXCTB.js → chunk-5KPNWT6X.js} +3 -3
  48. package/dist/{chunk-Q5TEXCTB.js.map → chunk-5KPNWT6X.js.map} +1 -1
  49. package/dist/{chunk-WI7ISNQF.js → chunk-5PNMDJ7J.js} +94 -5
  50. package/dist/chunk-5PNMDJ7J.js.map +1 -0
  51. package/dist/{chunk-AW4A3P5A.cjs → chunk-5VQM6VWP.cjs} +2 -2
  52. package/dist/{chunk-AW4A3P5A.cjs.map → chunk-5VQM6VWP.cjs.map} +1 -1
  53. package/dist/{chunk-A3W7QG7K.js → chunk-5WWVZMVX.js} +2 -2
  54. package/dist/{chunk-A3W7QG7K.js.map → chunk-5WWVZMVX.js.map} +1 -1
  55. package/dist/{chunk-FACJJWGF.cjs → chunk-6EEO3OVU.cjs} +7 -7
  56. package/dist/{chunk-FACJJWGF.cjs.map → chunk-6EEO3OVU.cjs.map} +1 -1
  57. package/dist/{chunk-DIK74MXX.cjs → chunk-BVRDGYXQ.cjs} +97 -4
  58. package/dist/chunk-BVRDGYXQ.cjs.map +1 -0
  59. package/dist/{chunk-4BCU6VFZ.cjs → chunk-DEFQM7JU.cjs} +7 -7
  60. package/dist/{chunk-4BCU6VFZ.cjs.map → chunk-DEFQM7JU.cjs.map} +1 -1
  61. package/dist/{chunk-456Z2U7Y.cjs → chunk-DIQ3AV5W.cjs} +574 -268
  62. package/dist/chunk-DIQ3AV5W.cjs.map +1 -0
  63. package/dist/{chunk-JFMEONLG.cjs → chunk-EJYMTO3K.cjs} +332 -188
  64. package/dist/chunk-EJYMTO3K.cjs.map +1 -0
  65. package/dist/{chunk-FPIZFYHE.js → chunk-EXU3RASM.js} +74 -15
  66. package/dist/chunk-EXU3RASM.js.map +1 -0
  67. package/dist/{chunk-5DIPR3L3.js → chunk-GA4TT3DH.js} +2338 -281
  68. package/dist/chunk-GA4TT3DH.js.map +1 -0
  69. package/dist/{chunk-H7YNSMA7.cjs → chunk-HAHNRASW.cjs} +20 -2
  70. package/dist/chunk-HAHNRASW.cjs.map +1 -0
  71. package/dist/{chunk-J3LEGNQB.cjs → chunk-IP3CGGPA.cjs} +8 -8
  72. package/dist/{chunk-J3LEGNQB.cjs.map → chunk-IP3CGGPA.cjs.map} +1 -1
  73. package/dist/{chunk-X4JBT642.cjs → chunk-IPSVVTWT.cjs} +94 -35
  74. package/dist/chunk-IPSVVTWT.cjs.map +1 -0
  75. package/dist/{chunk-VQEXF5D4.js → chunk-IXGYRP2P.js} +184 -92
  76. package/dist/chunk-IXGYRP2P.js.map +1 -0
  77. package/dist/{chunk-4GX2JJXS.js → chunk-K3Q3LJY3.js} +520 -221
  78. package/dist/chunk-K3Q3LJY3.js.map +1 -0
  79. package/dist/{chunk-OR5ZA5WP.js → chunk-K5UBVGJN.js} +4 -4
  80. package/dist/{chunk-OR5ZA5WP.js.map → chunk-K5UBVGJN.js.map} +1 -1
  81. package/dist/{chunk-UZV3AZKF.js → chunk-KQJ54OG5.js} +3 -3
  82. package/dist/{chunk-UZV3AZKF.js.map → chunk-KQJ54OG5.js.map} +1 -1
  83. package/dist/{chunk-SXGE7ITL.js → chunk-L7HQ2OSI.js} +4 -4
  84. package/dist/{chunk-SXGE7ITL.js.map → chunk-L7HQ2OSI.js.map} +1 -1
  85. package/dist/{chunk-RAXU3RMB.js → chunk-M6VES7V6.js} +4 -4
  86. package/dist/{chunk-RAXU3RMB.js.map → chunk-M6VES7V6.js.map} +1 -1
  87. package/dist/{chunk-PWGX5DF5.cjs → chunk-NUIG3BCV.cjs} +100 -85
  88. package/dist/chunk-NUIG3BCV.cjs.map +1 -0
  89. package/dist/{chunk-ZAMFOJ5P.cjs → chunk-NXQFATMF.cjs} +269 -177
  90. package/dist/chunk-NXQFATMF.cjs.map +1 -0
  91. package/dist/{chunk-KBGQIPRQ.js → chunk-PC2UBAUB.js} +20 -3
  92. package/dist/chunk-PC2UBAUB.js.map +1 -0
  93. package/dist/chunk-QARBLBXT.cjs +219 -0
  94. package/dist/chunk-QARBLBXT.cjs.map +1 -0
  95. package/dist/{chunk-6FR2MMS6.js → chunk-QERAIDRJ.js} +45 -4
  96. package/dist/chunk-QERAIDRJ.js.map +1 -0
  97. package/dist/chunk-QSXTWU4U.cjs +12 -0
  98. package/dist/{chunk-4BMPGT35.cjs.map → chunk-QSXTWU4U.cjs.map} +1 -1
  99. package/dist/{chunk-DN5VP4JC.js → chunk-RCVLFTCT.js} +9 -10
  100. package/dist/chunk-RCVLFTCT.js.map +1 -0
  101. package/dist/{chunk-ZIGXMKQQ.js → chunk-RRSNR3TP.js} +3 -3
  102. package/dist/{chunk-ZIGXMKQQ.js.map → chunk-RRSNR3TP.js.map} +1 -1
  103. package/dist/{chunk-4CAXEB2F.cjs → chunk-TGOMW4MB.cjs} +91 -92
  104. package/dist/chunk-TGOMW4MB.cjs.map +1 -0
  105. package/dist/{chunk-PZKNKG5M.js → chunk-TKT2XHED.js} +8 -8
  106. package/dist/{chunk-PZKNKG5M.js.map → chunk-TKT2XHED.js.map} +1 -1
  107. package/dist/{chunk-S5F7ZLP2.js → chunk-TPF25IG6.js} +3 -3
  108. package/dist/{chunk-S5F7ZLP2.js.map → chunk-TPF25IG6.js.map} +1 -1
  109. package/dist/{chunk-5SEGFTZX.js → chunk-UGZUAYAR.js} +3 -3
  110. package/dist/{chunk-5SEGFTZX.js.map → chunk-UGZUAYAR.js.map} +1 -1
  111. package/dist/{chunk-BJVEU3ZL.js → chunk-UV3WP5WZ.js} +265 -121
  112. package/dist/chunk-UV3WP5WZ.js.map +1 -0
  113. package/dist/{chunk-VHMPG6UL.js → chunk-UXLSNRYL.js} +11 -105
  114. package/dist/chunk-UXLSNRYL.js.map +1 -0
  115. package/dist/{chunk-FRV5Q5IO.js → chunk-UYQMBBWJ.js} +3 -3
  116. package/dist/{chunk-FRV5Q5IO.js.map → chunk-UYQMBBWJ.js.map} +1 -1
  117. package/dist/{chunk-UUT7UN2N.cjs → chunk-VGDDG3XJ.cjs} +7 -7
  118. package/dist/{chunk-UUT7UN2N.cjs.map → chunk-VGDDG3XJ.cjs.map} +1 -1
  119. package/dist/{chunk-5VTR2F2K.js → chunk-VKGKDOKR.js} +12 -10
  120. package/dist/chunk-VKGKDOKR.js.map +1 -0
  121. package/dist/{chunk-5W4L6DLF.cjs → chunk-VL2V6PEN.cjs} +11 -11
  122. package/dist/{chunk-5W4L6DLF.cjs.map → chunk-VL2V6PEN.cjs.map} +1 -1
  123. package/dist/{chunk-ZUNQ5BEP.cjs → chunk-WOJMKB3N.cjs} +82 -80
  124. package/dist/chunk-WOJMKB3N.cjs.map +1 -0
  125. package/dist/{chunk-UMDVATGY.cjs → chunk-WWFHO375.cjs} +6 -6
  126. package/dist/{chunk-UMDVATGY.cjs.map → chunk-WWFHO375.cjs.map} +1 -1
  127. package/dist/{chunk-JFUPDJXD.js → chunk-XGPUQ56G.js} +3 -3
  128. package/dist/{chunk-JFUPDJXD.js.map → chunk-XGPUQ56G.js.map} +1 -1
  129. package/dist/{chunk-D7ZEOS56.cjs → chunk-XGU7DZDA.cjs} +74 -14
  130. package/dist/chunk-XGU7DZDA.cjs.map +1 -0
  131. package/dist/{chunk-S55OV6PW.cjs → chunk-XPCZADMT.cjs} +54 -11
  132. package/dist/chunk-XPCZADMT.cjs.map +1 -0
  133. package/dist/{chunk-T2WUSPDA.js → chunk-XWV4JT34.js} +3 -3
  134. package/dist/{chunk-T2WUSPDA.js.map → chunk-XWV4JT34.js.map} +1 -1
  135. package/dist/chunk-YTSN73ND.js +212 -0
  136. package/dist/chunk-YTSN73ND.js.map +1 -0
  137. package/dist/{ddl-CZz7a0E8.d.cts → ddl-BD-ZfKeX.d.cts} +3 -3
  138. package/dist/{ddl-C2rZ-Aen.d.ts → ddl-CS0KUVwB.d.ts} +3 -3
  139. package/dist/{extension-types-ixRpJVUp.d.ts → extension-types-BM2ACfYO.d.cts} +6 -1
  140. package/dist/{extension-types-ixRpJVUp.d.cts → extension-types-BM2ACfYO.d.ts} +6 -1
  141. package/dist/{fulltext-strategy-CDkSSYhq.d.cts → fulltext-strategy-C27vXaeB.d.cts} +127 -8
  142. package/dist/{fulltext-strategy-B57yvC5Q.d.ts → fulltext-strategy-DebsMrqg.d.ts} +127 -8
  143. package/dist/graph-extension/index.cjs +19 -19
  144. package/dist/graph-extension/index.d.cts +4 -4
  145. package/dist/graph-extension/index.d.ts +4 -4
  146. package/dist/graph-extension/index.js +4 -4
  147. package/dist/graph-merge/index.cjs +88 -88
  148. package/dist/graph-merge/index.d.cts +6 -6
  149. package/dist/graph-merge/index.d.ts +6 -6
  150. package/dist/graph-merge/index.js +19 -19
  151. package/dist/{index-BLtQWKRj.d.cts → index-BPM59vsg.d.cts} +52 -7
  152. package/dist/{index-BFvdmBPV.d.ts → index-BeacbPoe.d.ts} +52 -7
  153. package/dist/index.cjs +224 -187
  154. package/dist/index.cjs.map +1 -1
  155. package/dist/index.d.cts +11 -11
  156. package/dist/index.d.ts +11 -11
  157. package/dist/index.js +53 -40
  158. package/dist/index.js.map +1 -1
  159. package/dist/indexes/index.cjs +30 -21
  160. package/dist/indexes/index.d.cts +5 -5
  161. package/dist/indexes/index.d.ts +5 -5
  162. package/dist/indexes/index.js +8 -7
  163. package/dist/interchange/index.cjs +207 -30
  164. package/dist/interchange/index.cjs.map +1 -1
  165. package/dist/interchange/index.d.cts +25 -8
  166. package/dist/interchange/index.d.ts +25 -8
  167. package/dist/interchange/index.js +190 -11
  168. package/dist/interchange/index.js.map +1 -1
  169. package/dist/{manager-DwQi8eV0.d.cts → manager-D00_NXvT.d.ts} +11 -2
  170. package/dist/{manager-ejUCB52T.d.ts → manager-nU1vTJLy.d.cts} +11 -2
  171. package/dist/{materialize-indexes-B4e9360H.d.cts → materialize-indexes-CuR3gAZb.d.cts} +8 -2
  172. package/dist/{materialize-indexes-te9TPMMJ.d.ts → materialize-indexes-zK2J_flP.d.ts} +8 -2
  173. package/dist/{postgres-CfEqsRMp.d.cts → postgres-IaBA4RgE.d.ts} +1 -1
  174. package/dist/{postgres-DQ5R6rzV.d.ts → postgres-YrYmPlaU.d.cts} +1 -1
  175. package/dist/profiler/index.cjs +3 -3
  176. package/dist/profiler/index.d.cts +7 -7
  177. package/dist/profiler/index.d.ts +7 -7
  178. package/dist/profiler/index.js +2 -2
  179. package/dist/provenance/index.cjs +32 -33
  180. package/dist/provenance/index.cjs.map +1 -1
  181. package/dist/provenance/index.d.cts +5 -5
  182. package/dist/provenance/index.d.ts +5 -5
  183. package/dist/provenance/index.js +5 -6
  184. package/dist/provenance/index.js.map +1 -1
  185. package/dist/schema/index.cjs +35 -35
  186. package/dist/schema/index.d.cts +7 -7
  187. package/dist/schema/index.d.ts +7 -7
  188. package/dist/schema/index.js +11 -11
  189. package/dist/{sqlite-DvQndLky.d.ts → sqlite-BUOHPx7p.d.ts} +1 -1
  190. package/dist/{sqlite-D7zBinNR.d.cts → sqlite-Pp8O19WE.d.cts} +1 -1
  191. package/dist/{store-view-DplHC3Nt.d.ts → store-view-ANL6mTph.d.ts} +213 -27
  192. package/dist/{store-view-9KDOpZzF.d.cts → store-view-X96Rd00T.d.cts} +213 -27
  193. package/dist/{types-Bv9DcS_E.d.cts → types-r-Zyq2Hz.d.cts} +2 -2
  194. package/dist/{types-CoxuV7EJ.d.ts → types-wsvuBgPK.d.ts} +2 -2
  195. package/dist/where-CJOpJj3a.d.ts +36 -0
  196. package/dist/where-K3uBP33l.d.cts +36 -0
  197. package/package.json +1 -1
  198. package/dist/chunk-2THZ3TQI.cjs.map +0 -1
  199. package/dist/chunk-456Z2U7Y.cjs.map +0 -1
  200. package/dist/chunk-4BMPGT35.cjs +0 -12
  201. package/dist/chunk-4CAXEB2F.cjs.map +0 -1
  202. package/dist/chunk-4GX2JJXS.js.map +0 -1
  203. package/dist/chunk-5DIPR3L3.js.map +0 -1
  204. package/dist/chunk-5VTR2F2K.js.map +0 -1
  205. package/dist/chunk-6FR2MMS6.js.map +0 -1
  206. package/dist/chunk-7BQLPXK6.cjs.map +0 -1
  207. package/dist/chunk-BJVEU3ZL.js.map +0 -1
  208. package/dist/chunk-D7ZEOS56.cjs.map +0 -1
  209. package/dist/chunk-DIK74MXX.cjs.map +0 -1
  210. package/dist/chunk-DN5VP4JC.js.map +0 -1
  211. package/dist/chunk-EOLERH7Y.cjs +0 -40
  212. package/dist/chunk-EOLERH7Y.cjs.map +0 -1
  213. package/dist/chunk-FN35DLCN.cjs.map +0 -1
  214. package/dist/chunk-FPIZFYHE.js.map +0 -1
  215. package/dist/chunk-H7YNSMA7.cjs.map +0 -1
  216. package/dist/chunk-IU46OHVW.js.map +0 -1
  217. package/dist/chunk-JFMEONLG.cjs.map +0 -1
  218. package/dist/chunk-KBGQIPRQ.js.map +0 -1
  219. package/dist/chunk-M75SUBFG.js.map +0 -1
  220. package/dist/chunk-PWGX5DF5.cjs.map +0 -1
  221. package/dist/chunk-S55OV6PW.cjs.map +0 -1
  222. package/dist/chunk-SKCOUWAX.js.map +0 -1
  223. package/dist/chunk-UT3S4SEN.js +0 -31
  224. package/dist/chunk-UT3S4SEN.js.map +0 -1
  225. package/dist/chunk-VHMPG6UL.js.map +0 -1
  226. package/dist/chunk-VQEXF5D4.js.map +0 -1
  227. package/dist/chunk-WI7ISNQF.js.map +0 -1
  228. package/dist/chunk-X4JBT642.cjs.map +0 -1
  229. package/dist/chunk-ZAMFOJ5P.cjs.map +0 -1
  230. package/dist/chunk-ZUNQ5BEP.cjs.map +0 -1
  231. package/dist/where-7RKFOsXt.d.ts +0 -11
  232. package/dist/where-DdMIXOtH.d.cts +0 -11
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/backend/drizzle/columns/fulltext.ts","../src/backend/drizzle/schema/postgres.ts","../src/backend/drizzle/ddl.ts","../src/backend/drizzle/vector-runtime.ts","../src/backend/drizzle/contribution-materializations.ts","../src/backend/drizzle/index-materializations.ts","../src/backend/drizzle/kind-removals.ts","../src/backend/drizzle/operations/hybrid.ts","../src/backend/drizzle/operations/clear.ts","../src/backend/drizzle/operations/collections.ts","../src/backend/drizzle/operations/edges.ts","../src/backend/drizzle/operations/fulltext.ts","../src/backend/drizzle/operations/nodes.ts","../src/backend/drizzle/operations/schema.ts","../src/backend/drizzle/operations/uniques.ts","../src/backend/drizzle/operations/strategy.ts","../src/backend/drizzle/operation-backend-core.ts","../src/backend/drizzle/execution/lru.ts","../src/backend/drizzle/execution/types.ts"],"names":["nodes","edges","recordedNodes","recordedEdges","recordedClock","uniques","schemaVersions","fulltext","tables","getSqliteTableConfig","sql","chunk","index","getPgTableConfig","timestamp","getTableName","is","nowIso"],"mappings":"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","file":"chunk-4GX2JJXS.js","sourcesContent":["/**\n * Custom Drizzle column types for the PostgreSQL `tsvectorStrategy`\n * fulltext table (`tsvector` + `regconfig`). Lets drizzle-kit\n * introspect the typed fulltext table the same way it introspects\n * `nodes`, `edges`, etc. Alternate strategies (pg_trgm, ParadeDB,\n * pgroonga) carry their own DDL via `FulltextStrategy.ownedTables()`\n * and don't use these columns.\n */\nimport { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * PostgreSQL `regconfig` column type — a registered text-search\n * configuration name (e.g. `'english'::regconfig`). Identical wire\n * format to `text`, but the `regconfig` SQL type lets a generated\n * column reference it inside `to_tsvector(\"language\", \"content\")`\n * as an immutable expression.\n */\nexport const regconfig = customType<{\n data: string;\n driverData: string;\n}>({\n dataType: () => \"regconfig\",\n});\n\n/**\n * PostgreSQL `tsvector` column type. Represents a parsed,\n * dictionary-normalized document; the GIN index that\n * `tsvectorFulltextTable` declares makes `@@ tsquery` lookups cheap.\n *\n * The on-the-wire driver representation is the canonical text form\n * (`'word1':1 'word2':2`); this type is read-only in practice — the\n * value is computed by a `GENERATED ALWAYS AS (...) STORED` clause —\n * so no `toDriver` mapping is provided.\n */\nexport const tsvector = customType<{\n data: string;\n driverData: string;\n}>({\n dataType: () => \"tsvector\",\n});\n","/**\n * Drizzle PostgreSQL schema for TypeGraph.\n *\n * Provides table definitions that can be customized via the factory function.\n * Uses PostgreSQL-native types: JSONB, TIMESTAMPTZ, BOOLEAN, VECTOR.\n *\n * The embeddings table uses pgvector's native VECTOR type. Ensure the\n * extension is enabled before creating tables:\n *\n * ```sql\n * CREATE EXTENSION IF NOT EXISTS vector;\n * ```\n *\n * @example\n * ```typescript\n * // Default table names\n * import { tables } from \"@nicia-ai/typegraph/postgres\";\n *\n * // Custom table names\n * import { createPostgresTables } from \"@nicia-ai/typegraph/postgres\";\n * const tables = createPostgresTables({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * });\n * ```\n */\nimport { sql } from \"drizzle-orm\";\nimport {\n boolean,\n index,\n integer,\n jsonb,\n pgTable,\n primaryKey,\n text,\n timestamp,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\n\nimport {\n buildPostgresEdgeIndexBuilders,\n buildPostgresNodeIndexBuilders,\n} from \"../../../indexes/drizzle\";\nimport { type IndexDeclaration } from \"../../../indexes/types\";\nimport { regconfig, tsvector } from \"../columns/fulltext\";\n\n/**\n * Table name configuration.\n */\nexport type PostgresTableNames = Readonly<{\n nodes: string;\n edges: string;\n recordedNodes: string;\n recordedEdges: string;\n recordedClock: string;\n revisionOrigins: string;\n uniques: string;\n schemaVersions: string;\n fulltext: string;\n indexMaterializations: string;\n contributionMaterializations: string;\n kindRemovals: string;\n reconciliationMarkers: string;\n}>;\n\nexport type CreatePostgresTablesOptions = Readonly<{\n /**\n * Additional TypeGraph indexes to include in the Drizzle schema.\n *\n * These become first-class Drizzle indexes, so drizzle-kit migrations will\n * pick them up automatically.\n */\n indexes?: readonly IndexDeclaration[] | undefined;\n}>;\n\nconst DEFAULT_TABLE_NAMES: PostgresTableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n recordedNodes: \"typegraph_recorded_nodes\",\n recordedEdges: \"typegraph_recorded_edges\",\n recordedClock: \"typegraph_recorded_clock\",\n revisionOrigins: \"typegraph_revision_origins\",\n uniques: \"typegraph_node_uniques\",\n schemaVersions: \"typegraph_schema_versions\",\n fulltext: \"typegraph_node_fulltext\",\n indexMaterializations: \"typegraph_index_materializations\",\n contributionMaterializations: \"typegraph_contribution_materializations\",\n kindRemovals: \"typegraph_kind_removals\",\n reconciliationMarkers: \"typegraph_reconciliation_markers\",\n};\n\n/**\n * Creates PostgreSQL table definitions with customizable table names.\n * Index names are derived from table names.\n */\nexport function createPostgresTables(\n names: Partial<PostgresTableNames> = {},\n options: CreatePostgresTablesOptions = {},\n) {\n const n: PostgresTableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n const indexes = options.indexes ?? [];\n\n const nodes = pgTable(\n n.nodes,\n {\n graphId: text(\"graph_id\").notNull(),\n kind: text(\"kind\").notNull(),\n id: text(\"id\").notNull(),\n props: jsonb(\"props\").notNull(),\n version: integer(\"version\").notNull().default(1),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }),\n validTo: timestamp(\"valid_to\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.kind, t.id] }),\n index(`${n.nodes}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.nodes}_kind_created_idx`).on(\n t.graphId,\n t.kind,\n t.deletedAt,\n t.createdAt,\n ),\n index(`${n.nodes}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.nodes}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n ...buildPostgresNodeIndexBuilders(t, indexes),\n ],\n );\n\n const edges = pgTable(\n n.edges,\n {\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n kind: text(\"kind\").notNull(),\n fromKind: text(\"from_kind\").notNull(),\n fromId: text(\"from_id\").notNull(),\n toKind: text(\"to_kind\").notNull(),\n toId: text(\"to_id\").notNull(),\n props: jsonb(\"props\").notNull(),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }),\n validTo: timestamp(\"valid_to\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n index(`${n.edges}_kind_idx`).on(t.graphId, t.kind),\n // 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 index(`${n.edges}_from_idx`).on(\n t.graphId,\n t.fromKind,\n t.fromId,\n t.kind,\n t.toKind,\n t.deletedAt,\n t.validFrom,\n t.validTo,\n t.toId,\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 index(`${n.edges}_to_idx`).on(\n t.graphId,\n t.toKind,\n t.toId,\n t.kind,\n t.fromKind,\n t.deletedAt,\n t.validFrom,\n t.validTo,\n t.fromId,\n ),\n index(`${n.edges}_kind_created_idx`).on(\n t.graphId,\n t.kind,\n t.deletedAt,\n t.createdAt,\n ),\n index(`${n.edges}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.edges}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n index(`${n.edges}_cardinality_idx`).on(\n t.graphId,\n t.kind,\n t.fromKind,\n t.fromId,\n t.validTo,\n ),\n ...buildPostgresEdgeIndexBuilders(t, indexes),\n ],\n );\n\n const recordedNodes = pgTable(\n n.recordedNodes,\n {\n historyId: text(\"history_id\").notNull(),\n graphId: text(\"graph_id\").notNull(),\n kind: text(\"kind\").notNull(),\n id: text(\"id\").notNull(),\n props: jsonb(\"props\").notNull(),\n version: integer(\"version\").notNull(),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }),\n validTo: timestamp(\"valid_to\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n recordedFrom: timestamp(\"recorded_from\", { withTimezone: true }).notNull(),\n recordedTo: timestamp(\"recorded_to\", { withTimezone: true }).notNull(),\n op: text(\"op\").notNull(),\n schemaVersion: integer(\"schema_version\"),\n txId: text(\"tx_id\"),\n meta: jsonb(\"meta\"),\n },\n (t) => [\n primaryKey({ columns: [t.historyId] }),\n index(`${n.recordedNodes}_entity_idx`).on(\n t.graphId,\n t.kind,\n t.id,\n t.recordedFrom,\n t.recordedTo,\n ),\n index(`${n.recordedNodes}_open_idx`).on(t.graphId, t.recordedTo),\n index(`${n.recordedNodes}_valid_idx`).on(\n t.graphId,\n t.validFrom,\n t.validTo,\n ),\n ],\n );\n\n const recordedEdges = pgTable(\n n.recordedEdges,\n {\n historyId: text(\"history_id\").notNull(),\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n kind: text(\"kind\").notNull(),\n fromKind: text(\"from_kind\").notNull(),\n fromId: text(\"from_id\").notNull(),\n toKind: text(\"to_kind\").notNull(),\n toId: text(\"to_id\").notNull(),\n props: jsonb(\"props\").notNull(),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }),\n validTo: timestamp(\"valid_to\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n recordedFrom: timestamp(\"recorded_from\", { withTimezone: true }).notNull(),\n recordedTo: timestamp(\"recorded_to\", { withTimezone: true }).notNull(),\n op: text(\"op\").notNull(),\n schemaVersion: integer(\"schema_version\"),\n txId: text(\"tx_id\"),\n meta: jsonb(\"meta\"),\n },\n (t) => [\n primaryKey({ columns: [t.historyId] }),\n index(`${n.recordedEdges}_entity_idx`).on(\n t.graphId,\n t.kind,\n t.id,\n t.recordedFrom,\n t.recordedTo,\n ),\n index(`${n.recordedEdges}_open_idx`).on(t.graphId, t.recordedTo),\n index(`${n.recordedEdges}_from_idx`).on(\n t.graphId,\n t.fromKind,\n t.fromId,\n t.kind,\n t.toKind,\n t.recordedFrom,\n t.recordedTo,\n ),\n index(`${n.recordedEdges}_to_idx`).on(\n t.graphId,\n t.toKind,\n t.toId,\n t.kind,\n t.fromKind,\n t.recordedFrom,\n t.recordedTo,\n ),\n index(`${n.recordedEdges}_valid_idx`).on(\n t.graphId,\n t.validFrom,\n t.validTo,\n ),\n ],\n );\n\n const recordedClock = pgTable(\n n.recordedClock,\n {\n graphId: text(\"graph_id\").notNull(),\n recordedAt: timestamp(\"recorded_at\", { withTimezone: true }).notNull(),\n },\n (t) => [primaryKey({ columns: [t.graphId] })],\n );\n\n const revisionOrigins = pgTable(\n n.revisionOrigins,\n {\n graphId: text(\"graph_id\").notNull(),\n origin: text(\"origin\").notNull(),\n },\n (t) => [primaryKey({ columns: [t.graphId] })],\n );\n\n const uniques = pgTable(\n n.uniques,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n constraintName: text(\"constraint_name\").notNull(),\n key: text(\"key\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n concreteKind: text(\"concrete_kind\").notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.constraintName, t.key],\n }),\n index(`${n.uniques}_node_idx`).on(t.graphId, t.concreteKind, t.nodeId),\n ],\n );\n\n const schemaVersions = pgTable(\n n.schemaVersions,\n {\n graphId: text(\"graph_id\").notNull(),\n version: integer(\"version\").notNull(),\n schemaHash: text(\"schema_hash\").notNull(),\n schemaDoc: jsonb(\"schema_doc\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n isActive: boolean(\"is_active\").notNull().default(false),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.version] }),\n index(`${n.schemaVersions}_active_idx`).on(t.graphId, t.isActive),\n // Partial unique index enforcing the \"at most one active version\n // per graph\" invariant at the storage layer. Defense in depth\n // against buggy backend implementations or out-of-band writes.\n // Forces the deactivate-then-activate ordering used by\n // `commitSchemaVersion` and `setActiveVersion`.\n uniqueIndex(`${n.schemaVersions}_one_active_per_graph_idx`)\n .on(t.graphId)\n .where(sql`${t.isActive} = TRUE`),\n ],\n );\n\n /**\n * Per-deployment record of which declared indexes have been\n * materialized against this database. Owned and written by\n * `store.materializeIndexes()`. Keyed on `index_name` because SQL\n * index names are physical, database-global identifiers — `graphId`\n * is provenance, not identity.\n */\n const indexMaterializations = pgTable(\n n.indexMaterializations,\n {\n indexName: text(\"index_name\").notNull(),\n graphId: text(\"graph_id\").notNull(),\n entity: text(\"entity\").notNull(),\n kind: text(\"kind\").notNull(),\n signature: text(\"signature\").notNull(),\n schemaVersion: integer(\"schema_version\").notNull(),\n materializedAt: timestamp(\"materialized_at\", { withTimezone: true }),\n lastAttemptedAt: timestamp(\"last_attempted_at\", {\n withTimezone: true,\n }).notNull(),\n lastError: text(\"last_error\"),\n // Cross-caller build claim: while `building_since` is fresh (within\n // the lease), exactly one materializer owns this index's CREATE\n // INDEX CONCURRENTLY. Serializes same-index CIC across processes —\n // two concurrent expression-index CICs deadlock each other (no\n // safe-snapshot exemption). NULL when no build is in flight.\n buildingSince: timestamp(\"building_since\", { withTimezone: true }),\n claimToken: text(\"claim_token\"),\n },\n (t) => [primaryKey({ columns: [t.indexName] })],\n );\n\n /**\n * Per-deployment record of extension kinds removed via\n * `store.removeKinds()` whose data has not yet been cleaned up by\n * `store.materializeRemovals()`. Same per-deployment rationale as\n * `indexMaterializations`: two replicas of the same `schema_doc` may\n * be at different stages of the data-cleanup phase. Keyed on\n * `(graph_id, kind_name, entity, schema_version)` — each remove\n * operation is its own row. `entity` separates a node and an edge\n * that share a kind name; the `schema_version` discriminator keeps a\n * re-add-then-re-remove cycle from collapsing onto the prior row,\n * where the COALESCE-on-failure rule would preserve the earlier\n * `removed_at` and silently skip the new pending cleanup.\n */\n const kindRemovals = pgTable(\n n.kindRemovals,\n {\n graphId: text(\"graph_id\").notNull(),\n kindName: text(\"kind_name\").notNull(),\n entity: text(\"entity\").notNull(),\n schemaVersion: integer(\"schema_version\").notNull(),\n removedAt: timestamp(\"removed_at\", { withTimezone: true }),\n lastAttemptedAt: timestamp(\"last_attempted_at\", {\n withTimezone: true,\n }).notNull(),\n lastError: text(\"last_error\"),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.kindName, t.entity, t.schemaVersion],\n }),\n ],\n );\n\n /**\n * Per-deployment high-water mark for `materializeRemovals`\n * reconciliation: the schema version up to which the historical\n * \"did every removal land in `kindRemovals`?\" walk has been\n * verified. Subsequent calls walk only versions newer than this\n * marker, instead of re-walking from version 1 every time.\n */\n const reconciliationMarkers = pgTable(\n n.reconciliationMarkers,\n {\n graphId: text(\"graph_id\").notNull(),\n reconciledToVersion: integer(\"reconciled_to_version\").notNull(),\n },\n (t) => [primaryKey({ columns: [t.graphId] })],\n );\n\n /**\n * Per-deployment durable marker that a strategy-owned table\n * contribution (#129 — fulltext today) has been materialized against\n * this database (#135). The single source of truth replacing the old\n * in-memory per-backend `fulltextEnsured` latch: \"is fulltext storage\n * materialized?\" is now a queryable database fact, written only by\n * the async boot path and read (cached) by the fulltext hot-path\n * gate.\n *\n * Keyed on `(graph_id, logical_name, owner, table_name)` — unlike\n * `indexMaterializations` (physical index name is database-global),\n * a contribution's identity is graph-scoped: two graphs can each own\n * a logically-identical fulltext table. `signature` is deliberately\n * NOT in the key: a same-identity row with a different signature is\n * detectable drift, surfaced as a loud error rather than a silent\n * re-materialize. `materialized_at` is null until the first success;\n * the COALESCE-on-failure rule preserves it across failed retries,\n * mirroring `indexMaterializations`.\n */\n const contributionMaterializations = pgTable(\n n.contributionMaterializations,\n {\n graphId: text(\"graph_id\").notNull(),\n logicalName: text(\"logical_name\").notNull(),\n owner: text(\"owner\").notNull(),\n tableName: text(\"table_name\").notNull(),\n signature: text(\"signature\").notNull(),\n materializedAt: timestamp(\"materialized_at\", { withTimezone: true }),\n lastAttemptedAt: timestamp(\"last_attempted_at\", {\n withTimezone: true,\n }).notNull(),\n lastError: text(\"last_error\"),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.logicalName, t.owner, t.tableName],\n }),\n ],\n );\n\n /**\n * Drizzle pg-core table for the default `tsvectorStrategy` so\n * drizzle-kit can introspect the fulltext table alongside the\n * others. Mirrors `tsvectorStrategy.ownedTables(...).createDdl` —\n * the typed shape and the strategy DDL must stay in sync (drift\n * sentinel lives in `tests/typed-fulltext-table.test.ts`).\n *\n * Why `regconfig` + GENERATED: `to_tsvector(\"language\", \"content\")`\n * needs an immutable language to qualify for use inside a\n * `STORED` generated column, so Postgres can own the\n * `content → tsv` invariant.\n *\n * Alternate strategies (pg_trgm, ParadeDB, pgroonga) bring their\n * own DDL; `generatePostgresDDL` skips this typed table for them\n * and defers to the active strategy's `ownedTables(...).createDdl`.\n * Drizzle-kit consumers on non-default strategies must override\n * `tables.fulltext` in their schema barrel.\n */\n const fulltext = pgTable(\n n.fulltext,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n content: text(\"content\").notNull(),\n language: regconfig(\"language\").notNull(),\n tsv: tsvector(\"tsv\")\n .generatedAlwaysAs(sql`to_tsvector(\"language\", \"content\")`)\n .notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.nodeKind, t.nodeId] }),\n index(`${n.fulltext}_tsv_idx`).using(\"gin\", t.tsv),\n index(`${n.fulltext}_kind_idx`).on(t.graphId, t.nodeKind),\n ],\n );\n\n return {\n nodes,\n edges,\n recordedNodes,\n recordedEdges,\n recordedClock,\n revisionOrigins,\n uniques,\n schemaVersions,\n indexMaterializations,\n contributionMaterializations,\n kindRemovals,\n reconciliationMarkers,\n fulltext,\n fulltextTableName: n.fulltext,\n } as const;\n}\n\n/**\n * Default tables with standard TypeGraph table names.\n */\nexport const tables = createPostgresTables();\n\n/**\n * Convenience exports for default tables.\n */\nexport const {\n nodes,\n edges,\n recordedNodes,\n recordedEdges,\n recordedClock,\n uniques,\n schemaVersions,\n fulltext,\n} = tables;\n\n/**\n * Type representing the tables object returned by createPostgresTables.\n */\nexport type PostgresTables = ReturnType<typeof createPostgresTables>;\n","/**\n * DDL generation utilities for TypeGraph backends.\n *\n * Provides utilities for generating DDL statements from Drizzle\n * table definitions. This ensures migrations match production schema.\n */\nimport { is } from \"drizzle-orm\";\nimport {\n getTableConfig as getPgTableConfig,\n type PgColumn,\n PgTable,\n type PgTableWithColumns,\n} from \"drizzle-orm/pg-core\";\nimport {\n getTableConfig as getSqliteTableConfig,\n type SQLiteColumn,\n SQLiteTable,\n type SQLiteTableWithColumns,\n} from \"drizzle-orm/sqlite-core\";\n\nimport {\n fts5Strategy,\n type FulltextStrategy,\n tsvectorStrategy,\n} from \"../../query/dialect\";\nimport {\n BASE_CONTRIBUTION_OWNER,\n type StrategyTableContribution,\n type TableContribution,\n} from \"../table-contribution\";\nimport {\n type PostgresTables,\n tables as postgresTables,\n} from \"./schema/postgres\";\nimport { type SqliteTables, tables as sqliteTables } from \"./schema/sqlite\";\n\n// Narrow interfaces for Drizzle column internals not exposed in public types.\n// These are accessed only in DDL generation for migration scripts.\ntype TimestampColumnConfig = Readonly<{\n config?: Readonly<{ withTimezone?: boolean }>;\n}>;\ntype CustomColumnType = Readonly<{\n getSQLType?: () => string;\n}>;\n\n// ============================================================\n// SQLite DDL Generation\n// ============================================================\n\n/**\n * Maps Drizzle column types to SQLite types.\n */\nfunction getSqliteColumnType(column: SQLiteColumn): string {\n switch (column.columnType) {\n case \"SQLiteText\": {\n return \"TEXT\";\n }\n case \"SQLiteInteger\": {\n return \"INTEGER\";\n }\n case \"SQLiteReal\": {\n return \"REAL\";\n }\n case \"SQLiteBlob\": {\n return \"BLOB\";\n }\n default: {\n return \"TEXT\";\n }\n }\n}\n\n/**\n * Formats a default value for SQLite.\n */\nfunction formatDefaultValue(value: unknown): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return `'${value}'`;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n // For other types, use JSON.stringify to avoid [object Object]\n return JSON.stringify(value);\n}\n\n/**\n * Generates CREATE TABLE SQL from a Drizzle SQLite table definition.\n */\nexport function generateSqliteCreateTableSQL(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: SQLiteTableWithColumns<any>,\n): string {\n const config = getSqliteTableConfig(table);\n const columnDefs: string[] = [];\n\n // Generate column definitions\n for (const column of config.columns) {\n const parts: string[] = [\n `\"${column.name}\"`,\n getSqliteColumnType(column as SQLiteColumn),\n ];\n\n if (column.notNull) {\n parts.push(\"NOT NULL\");\n }\n\n if (column.hasDefault && column.default !== undefined) {\n parts.push(`DEFAULT ${formatDefaultValue(column.default)}`);\n }\n\n columnDefs.push(parts.join(\" \"));\n }\n\n // Add primary key constraint\n const pk = config.primaryKeys[0];\n if (pk) {\n const pkColumns = pk.columns.map((c) => `\"${c.name}\"`).join(\", \");\n columnDefs.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n return `CREATE TABLE IF NOT EXISTS \"${config.name}\" (\\n ${columnDefs.join(\",\\n \")}\\n);`;\n}\n\n/**\n * Gets the column name from an index column, handling both Column and SQL types.\n */\nfunction renderIndexColumn(col: unknown): string {\n if (col && typeof col === \"object\" && \"name\" in col) {\n return `\"${(col as { name: string }).name}\"`;\n }\n\n const sql = tryInlineSql(col);\n if (sql !== undefined) {\n return sql;\n }\n\n return \"unknown\";\n}\n\nfunction tryInlineSql(value: unknown): string | undefined {\n if (value && typeof value === \"object\" && \"getSQL\" in value) {\n const maybe = value as { getSQL?: () => unknown };\n if (typeof maybe.getSQL === \"function\") {\n return inlineSql(maybe.getSQL());\n }\n }\n\n return inlineSql(value);\n}\n\nfunction flattenSqlChunk(chunk: unknown): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (typeof chunk === \"object\" && chunk !== null) {\n // Drizzle column references (SQLiteText, PgText, etc.) carry the\n // column name directly. Match these BEFORE the `getSQL` fallback —\n // a column's `.getSQL()` wraps the column back inside a SQL object\n // that points to itself, which would recurse infinitely.\n if (\"name\" in chunk && typeof chunk.name === \"string\") {\n return `\"${(chunk as { name: string }).name}\"`;\n }\n\n // Drizzle's StringChunk stores its literal as `.value`, usually as a\n // one-element array ([\"\"], [\"SELECT \"]) but sometimes as a plain string.\n if (\"value\" in chunk) {\n const value = chunk.value;\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((part) => flattenSqlChunk(part)).join(\"\");\n }\n }\n\n if (\"queryChunks\" in chunk && Array.isArray(chunk.queryChunks)) {\n return (chunk as { queryChunks: readonly unknown[] }).queryChunks\n .map((part) => flattenSqlChunk(part))\n .join(\"\");\n }\n\n if (\"getSQL\" in chunk) {\n const maybe = chunk as { getSQL?: () => unknown };\n if (typeof maybe.getSQL === \"function\") {\n return flattenSqlChunk(maybe.getSQL());\n }\n }\n }\n\n throw new Error(`Unable to inline SQL chunk: ${String(chunk)}`);\n}\n\nfunction inlineSql(value: unknown): string | undefined {\n try {\n return flattenSqlChunk(value);\n } catch {\n return undefined;\n }\n}\n\nfunction inlineSqlOrThrow(value: unknown, context: string): string {\n const inlined = inlineSql(value);\n if (inlined === undefined) {\n throw new Error(`Unable to inline SQL for ${context}`);\n }\n return inlined;\n}\n\n/**\n * Generates CREATE INDEX SQL statements from a Drizzle SQLite table definition.\n */\nfunction generateSqliteCreateIndexSQL(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: SQLiteTableWithColumns<any>,\n): string[] {\n const config = getSqliteTableConfig(table);\n const statements: string[] = [];\n\n for (const index of config.indexes) {\n const indexConfig = index.config;\n const columns = indexConfig.columns\n .map((c) => renderIndexColumn(c))\n .join(\", \");\n const unique = indexConfig.unique ? \"UNIQUE \" : \"\";\n const where =\n indexConfig.where ?\n ` WHERE ${inlineSqlOrThrow(indexConfig.where, `SQLite index \"${indexConfig.name}\" WHERE clause`)}`\n : \"\";\n\n statements.push(\n `CREATE ${unique}INDEX IF NOT EXISTS \"${indexConfig.name}\" ON \"${config.name}\" (${columns})${where};`,\n );\n }\n\n return statements;\n}\n\n/**\n * Whether a schema-barrel value is a Drizzle SQLite table. The barrel\n * exposes non-table values (e.g. `fulltextTableName: string`) the DDL\n * generators must skip — and a contribution's barrel key is its\n * materialization identity, so a misclassified non-table would corrupt\n * that identity, not just emit stray DDL.\n */\nfunction isSqliteTable(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): value is SQLiteTableWithColumns<any> {\n return is(value, SQLiteTable);\n}\n\n/**\n * Strategy-declared contributions flagged `runtimeEnsure`. Per the\n * `runtimeEnsure` invariant only strategy contributions can be runtime\n * (base tables never are), so this is the complete runtime set without\n * walking base tables.\n */\nexport function runtimeStrategyContributions(\n fulltextStrategy: FulltextStrategy,\n fulltextTableName: string,\n): readonly StrategyTableContribution[] {\n return fulltextStrategy\n .ownedTables(fulltextTableName)\n .filter((contribution) => contribution.runtimeEnsure);\n}\n\n/**\n * The authoritative set of tables the SQLite backend owns: every\n * base/status Drizzle table plus the resolved fulltext-strategy\n * contribution(s). Single source of truth for DDL generation, the\n * bootstrap ensure, and drizzle-kit visibility (#129).\n */\nexport function sqliteContributions(\n tables: SqliteTables = sqliteTables,\n fulltextStrategy: FulltextStrategy = fts5Strategy,\n): readonly TableContribution[] {\n const contributions: TableContribution[] = [];\n for (const [key, table] of Object.entries(tables)) {\n if (!isSqliteTable(table)) continue;\n // Stable factory key (`nodes`, `edges`, …) is the logicalName so\n // the #135 materialization identity survives custom table-name\n // overrides; the resolved SQL name is only the physical tableName.\n contributions.push({\n logicalName: key,\n owner: BASE_CONTRIBUTION_OWNER,\n tableName: getSqliteTableConfig(table).name,\n createDdl: [\n generateSqliteCreateTableSQL(table),\n ...generateSqliteCreateIndexSQL(table),\n ],\n runtimeEnsure: false,\n });\n }\n // Strategy declarations are already authoritative contributions;\n // emitted last (after base tables).\n for (const declared of fulltextStrategy.ownedTables(\n tables.fulltextTableName,\n )) {\n contributions.push(declared);\n }\n return contributions;\n}\n\n/**\n * Generates all DDL statements for the given SQLite tables.\n *\n * Iterates the unified contribution set (#129) — base tables first,\n * then strategy-owned tables. Per-contribution ordering is\n * table-then-its-own-indexes; safe because TypeGraph's tables carry no\n * cross-table foreign keys.\n */\nexport function generateSqliteDDL(\n tables: SqliteTables = sqliteTables,\n fulltextStrategy: FulltextStrategy = fts5Strategy,\n): string[] {\n return sqliteContributions(tables, fulltextStrategy).flatMap(\n (contribution) => [...contribution.createDdl],\n );\n}\n\n/**\n * Generates a single SQL string for SQLite migrations.\n * Convenience function that joins all DDL statements.\n */\nexport function generateSqliteMigrationSQL(\n tables: SqliteTables = sqliteTables,\n fulltextStrategy: FulltextStrategy = fts5Strategy,\n): string {\n return generateSqliteDDL(tables, fulltextStrategy).join(\"\\n\\n\");\n}\n\n// ============================================================\n// PostgreSQL DDL Generation\n// ============================================================\n\n/**\n * Maps Drizzle column types to PostgreSQL types.\n */\nfunction getPgColumnType(column: PgColumn): string {\n switch (column.columnType) {\n case \"PgText\": {\n return \"TEXT\";\n }\n case \"PgInteger\": {\n return \"INTEGER\";\n }\n case \"PgBoolean\": {\n return \"BOOLEAN\";\n }\n case \"PgJsonb\": {\n return \"JSONB\";\n }\n case \"PgTimestamp\": {\n return (column as unknown as TimestampColumnConfig).config?.withTimezone ?\n \"TIMESTAMPTZ\"\n : \"TIMESTAMP\";\n }\n case \"PgReal\": {\n return \"REAL\";\n }\n case \"PgDoublePrecision\": {\n return \"DOUBLE PRECISION\";\n }\n case \"PgCustomColumn\": {\n const dataType = (column as unknown as CustomColumnType).getSQLType?.();\n return dataType ?? \"TEXT\";\n }\n default: {\n return \"TEXT\";\n }\n }\n}\n\n/**\n * Formats a default value for PostgreSQL.\n */\nfunction formatPgDefaultValue(value: unknown): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return `'${value}'`;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n // For other types, use JSON.stringify to avoid [object Object]\n return JSON.stringify(value);\n}\n\n/**\n * Generates CREATE TABLE SQL from a Drizzle PostgreSQL table definition.\n */\nexport function generatePgCreateTableSQL(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: PgTableWithColumns<any>,\n): string {\n const config = getPgTableConfig(table);\n const columnDefs: string[] = [];\n\n // Generate column definitions\n for (const column of config.columns) {\n const parts: string[] = [`\"${column.name}\"`, getPgColumnType(column)];\n\n if (column.notNull) {\n parts.push(\"NOT NULL\");\n }\n\n if (column.hasDefault && column.default !== undefined) {\n parts.push(`DEFAULT ${formatPgDefaultValue(column.default)}`);\n }\n\n columnDefs.push(parts.join(\" \"));\n }\n\n // Add primary key constraint\n const pk = config.primaryKeys[0];\n if (pk) {\n const pkColumns = pk.columns.map((c) => `\"${c.name}\"`).join(\", \");\n columnDefs.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n return `CREATE TABLE IF NOT EXISTS \"${config.name}\" (\\n ${columnDefs.join(\",\\n \")}\\n);`;\n}\n\n/**\n * Generates CREATE INDEX SQL statements from a Drizzle PostgreSQL table definition.\n */\nfunction generatePgCreateIndexSQL(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: PgTableWithColumns<any>,\n): string[] {\n const config = getPgTableConfig(table);\n const statements: string[] = [];\n\n for (const index of config.indexes) {\n const indexConfig = index.config;\n const columns = indexConfig.columns\n .map((c) => renderIndexColumn(c))\n .join(\", \");\n const unique = indexConfig.unique ? \"UNIQUE \" : \"\";\n const method =\n indexConfig.method && indexConfig.method !== \"btree\" ?\n ` USING ${indexConfig.method}`\n : \"\";\n const where =\n indexConfig.where ?\n ` WHERE ${inlineSqlOrThrow(indexConfig.where, `PostgreSQL index \"${indexConfig.name}\" WHERE clause`)}`\n : \"\";\n\n statements.push(\n `CREATE ${unique}INDEX IF NOT EXISTS \"${indexConfig.name}\" ON \"${config.name}\"${method} (${columns})${where};`,\n );\n }\n\n return statements;\n}\n\n/**\n * Whether a schema-barrel value is a Drizzle Postgres table. See\n * {@link isSqliteTable} for why this uses Drizzle's brand check.\n */\nfunction isPgTable(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): value is PgTableWithColumns<any> {\n return is(value, PgTable);\n}\n\n/**\n * The authoritative set of tables the PostgreSQL backend owns: every\n * base/status Drizzle table plus the resolved fulltext-strategy\n * contribution(s). Single source of truth for DDL generation, the\n * bootstrap ensure, and drizzle-kit visibility (#129).\n *\n * The typed `tables.fulltext` object is **not** emitted via the\n * column-walker (it can't reproduce `GENERATED ALWAYS AS … STORED`);\n * instead the strategy's canonical DDL is carried as the fulltext\n * contribution's `createDdl`. drizzle-kit visibility for the default\n * tsvector strategy comes from `schema/postgres.ts` exporting that\n * same `tables.fulltext` object through the barrel — one object, not\n * two. (Non-default Postgres strategies must export their own table\n * for drizzle-kit; see `FulltextStrategy.ownedTables`.)\n */\nexport function postgresContributions(\n tables: PostgresTables = postgresTables,\n fulltextStrategy: FulltextStrategy = tsvectorStrategy,\n): readonly TableContribution[] {\n const contributions: TableContribution[] = [];\n for (const [key, table] of Object.entries(tables)) {\n if (!isPgTable(table)) continue;\n // The strategy owns the fulltext slot's DDL (the column-walker\n // can't reproduce its generated tsvector column); the strategy\n // declaration below is the authoritative fulltext contribution.\n if (table === tables.fulltext) continue;\n // Stable factory key (`nodes`, `edges`, …) is the logicalName so\n // the #135 materialization identity survives custom table-name\n // overrides; the resolved SQL name is only the physical tableName.\n contributions.push({\n logicalName: key,\n owner: BASE_CONTRIBUTION_OWNER,\n tableName: getPgTableConfig(table).name,\n createDdl: [\n generatePgCreateTableSQL(table),\n ...generatePgCreateIndexSQL(table),\n ],\n runtimeEnsure: false,\n });\n }\n for (const declared of fulltextStrategy.ownedTables(\n tables.fulltextTableName,\n )) {\n contributions.push(declared);\n }\n return contributions;\n}\n\n/**\n * Generates all DDL statements for the given PostgreSQL tables.\n *\n * Iterates the unified contribution set (#129) — base tables first,\n * then strategy-owned tables. Per-contribution ordering is\n * table-then-its-own-indexes; safe because TypeGraph's tables carry no\n * cross-table foreign keys.\n */\nexport function generatePostgresDDL(\n tables: PostgresTables = postgresTables,\n fulltextStrategy: FulltextStrategy = tsvectorStrategy,\n): string[] {\n return postgresContributions(tables, fulltextStrategy).flatMap(\n (contribution) => [...contribution.createDdl],\n );\n}\n\n/**\n * Generates a single SQL string for PostgreSQL migrations.\n * Convenience function that joins all DDL statements.\n *\n * Includes CREATE EXTENSION for pgvector since the per-`(kind, field)`\n * embedding tables `pgvectorStrategy` materializes at runtime use the\n * native VECTOR type.\n */\nexport function generatePostgresMigrationSQL(\n tables: PostgresTables = postgresTables,\n fulltextStrategy: FulltextStrategy = tsvectorStrategy,\n): string {\n // pgvector extension is required for the per-field embedding tables\n const extensionSql =\n \"-- Enable pgvector extension for vector similarity search\\nCREATE EXTENSION IF NOT EXISTS vector;\";\n const ddlSql = generatePostgresDDL(tables, fulltextStrategy).join(\"\\n\\n\");\n return `${extensionSql}\\n\\n${ddlSql}`;\n}\n","/**\n * Backend-runtime glue between a {@link VectorStrategy} and the Drizzle\n * SQLite / PostgreSQL backends. Holds the two responsibilities that belong\n * in the backend rather than the strategy:\n *\n * 1. **Slot construction.** The backend stays graph-agnostic: it never\n * inspects the graph/registry. The store resolves a field's\n * `dimensions` / `metric` / `indexType` from the schema and threads\n * them through `UpsertEmbeddingParams` / `VectorSearchParams` /\n * `CreateVectorIndexParams`; these helpers reshape those params into the\n * `VectorSlot` a strategy addresses its storage with.\n * 2. **The storage-ensure latch.** A per-storage-shape\n * in-process latch that runs `strategy.ownedTables(slot).createDdl`\n * (idempotent `CREATE ... IF NOT EXISTS`) once before the first write to\n * a slot, so a write never hits a missing per-field table. Shared across\n * the outer backend and every transaction-scoped backend within one\n * `createBackend` call. `materializeIndexes()` creates the same storage\n * idempotently, so the two never conflict.\n */\nimport { EmbeddingDimensionChangedError } from \"../../errors\";\nimport {\n type VectorSlot,\n type VectorStrategy,\n} from \"../../query/dialect/vector-strategy\";\nimport { parseDimensionMismatch } from \"../../utils/sql-errors\";\nimport {\n type CreateVectorIndexParams,\n type DropVectorIndexParams,\n} from \"../types\";\n\n/**\n * In-process per-storage-shape storage-ensure latch. The DDL it runs is\n * idempotent, so re-running it is harmless; the latch only avoids redundant\n * round-trips and de-duplicates concurrent ensures.\n */\nexport type VectorSlotLatch = Readonly<{\n ensure: (\n strategy: VectorStrategy,\n slot: VectorSlot,\n execDdl: (statement: string) => Promise<void>,\n ) => Promise<void>;\n}>;\n\nfunction vectorSlotKey(slot: VectorSlot): string {\n // JSON of the storage-shaping fields: collision-safe across arbitrary\n // graph/kind/field strings (a raw delimiter could otherwise appear in a name).\n // Metric and index type matter even when the physical table name does not:\n // libSQL folds DiskANN DDL into `ownedTables` only for ANN slots, and\n // sqlite-vec bakes the metric into its virtual-table declaration.\n return JSON.stringify([\n slot.graphId,\n slot.nodeKind,\n slot.fieldPath,\n slot.dimensions,\n slot.metric,\n slot.indexType,\n ]);\n}\n\nexport function createVectorSlotLatch(): VectorSlotLatch {\n const inFlight = new Map<string, Promise<void>>();\n\n return {\n ensure(strategy, slot, execDdl): Promise<void> {\n const key = vectorSlotKey(slot);\n const existing = inFlight.get(key);\n if (existing !== undefined) return existing;\n\n const run = (async (): Promise<void> => {\n for (const contribution of strategy.ownedTables(slot)) {\n for (const statement of contribution.createDdl) {\n await execDdl(statement);\n }\n }\n })();\n // Cache only the successful resolution: a failed CREATE (e.g. a\n // transient lock) must not poison the slot so the next write retries.\n const cached = run.catch((error: unknown) => {\n inFlight.delete(key);\n throw error;\n });\n inFlight.set(key, cached);\n return cached;\n },\n };\n}\n\n/**\n * Placeholder dimension for slots built from params that don't carry one\n * (`DropVectorIndexParams`). The dimension is never read on the drop path —\n * it addresses an index by `(nodeKind, fieldPath)` alone.\n */\nconst VECTOR_SLOT_PLACEHOLDER_DIMENSIONS = 1;\n\n/**\n * Reshapes the storage-addressing fields shared by every embedding param type\n * (upsert / search / delete) into a {@link VectorSlot}. Picks only the six slot\n * fields, dropping each param type's payload (`embedding`, `queryEmbedding`,\n * `limit`, …). Delete carries the real `dimensions`/`metric`/`indexType` (not\n * just `(nodeKind, fieldPath)`) so the backend can idempotently ensure the\n * correctly-shaped per-field table before deleting.\n */\n/**\n * Bound parameters per row in every strategy's embedding upsert SQL\n * (graph_id, node_id, created_at, updated_at, embedding). Backends derive\n * their batch chunk size from the connection's bound-parameter budget and\n * this count. sqlite-vec's companion IN-list DELETE binds one parameter per\n * row plus graph_id, which stays under the same budget.\n */\nexport const EMBEDDING_UPSERT_PARAM_COUNT = 5;\n\nexport function vectorSlotFromParams(\n params: Omit<VectorSlot, \"indexParams\">,\n): VectorSlot {\n return {\n graphId: params.graphId,\n nodeKind: params.nodeKind,\n fieldPath: params.fieldPath,\n dimensions: params.dimensions,\n metric: params.metric,\n indexType: params.indexType,\n };\n}\n\nexport function vectorSlotFromCreateIndexParams(\n params: CreateVectorIndexParams,\n): VectorSlot {\n return {\n ...vectorSlotFromParams(params),\n ...(params.indexParams === undefined\n ? {}\n : { indexParams: params.indexParams }),\n };\n}\n\n/**\n * A `VectorSlot` for `dropVectorIndex`. `DropVectorIndexParams` carries\n * only `(nodeKind, fieldPath)` — enough to address the index, whose name a\n * strategy derives from those alone (it is metric- and dimension-\n * independent). `indexType: \"hnsw\"` makes `buildDropIndex` emit a real\n * `DROP INDEX IF EXISTS` (harmless when none exists); the placeholder\n * `metric`/`dimensions` are never read on the drop path.\n */\nexport function vectorSlotFromDropIndexParams(\n params: DropVectorIndexParams,\n): VectorSlot {\n return {\n graphId: params.graphId,\n nodeKind: params.nodeKind,\n fieldPath: params.fieldPath,\n dimensions: VECTOR_SLOT_PLACEHOLDER_DIMENSIONS,\n metric: \"cosine\",\n indexType: \"hnsw\",\n };\n}\n\n/**\n * Maps a raw engine vector-dimension-mismatch failure from an embedding\n * upsert into a typed {@link EmbeddingDimensionChangedError} with actionable\n * guidance. Unrelated errors pass through unchanged. Used by both backends so\n * a write after a field's `embedding(N)` → `embedding(M)` change surfaces\n * \"run reembedVectorField\" instead of a cryptic `expected N dimensions` error.\n */\nexport function mapVectorWriteError(\n error: unknown,\n params: Readonly<{ nodeKind: string; fieldPath: string }>,\n): unknown {\n const mismatch = parseDimensionMismatch(error);\n if (mismatch === undefined) return error;\n const attempted = mismatch.actual ?? \"a different number of\";\n return new EmbeddingDimensionChangedError(\n `Embedding \"${params.nodeKind}.${params.fieldPath}\" was written with ${attempted} dimensions, but its per-field storage expects ${mismatch.expected}. The field's embedding dimension changed; existing vectors must be recreated and re-embedded.`,\n {\n kind: params.nodeKind,\n fieldPath: params.fieldPath,\n storedDimensions: mismatch.expected,\n ...(mismatch.actual === undefined ?\n {}\n : { declaredDimensions: mismatch.actual }),\n },\n { cause: error },\n );\n}\n","/**\n * Shared building blocks for the\n * `typegraph_contribution_materializations` durable-marker table on\n * both SQLite and Postgres backends (#135).\n *\n * Independent sibling of `index-materializations.ts`. It deliberately\n * mirrors that module's shape — dialect timestamp adapter, raw-row\n * mapper, insert/upsert value builders, the `materialized_at` COALESCE\n * preservation rule for failed re-attempts — but stays a separate\n * module because the two status tables have different identities:\n * declared indexes key on a database-global physical index name,\n * #129 contributions key on `(graph_id, logical_name, owner,\n * table_name)`. The declared-index path is untouched by #135; a future\n * PR may migrate it onto this contribution model.\n */\n\nimport { sql } from \"drizzle-orm\";\n\nimport {\n StoreNotInitializedError,\n type StoreNotInitializedReason,\n} from \"../../errors\";\nimport { type FulltextStrategy } from \"../../query/dialect/fulltext-strategy\";\nimport { type SqlDialect } from \"../../query/dialect/types\";\nimport { sortedReplacer } from \"../../schema/canonical\";\nimport { sha256Hex } from \"../../utils/hash\";\nimport { isMissingTableError } from \"../../utils/sql-errors\";\nimport type { StrategyTableContribution } from \"../table-contribution\";\nimport {\n type ContributionMaterializationIdentity,\n type ContributionMaterializationRow,\n createBackendOverlay,\n type RecordContributionMaterializationParams,\n type TransactionBackend,\n} from \"../types\";\nimport { runtimeStrategyContributions } from \"./ddl\";\nimport { formatPostgresTimestamp, nowIso } from \"./row-mappers\";\n\n/**\n * Bridges the dialect-specific timestamp column representation to the\n * canonical ISO-8601 strings used by the row/param types. `string` for\n * SQLite TEXT, `Date` for Postgres TIMESTAMPTZ — identical contract to\n * the index-materialization adapter, kept separate so the two status\n * subsystems stay independent.\n */\ntype ContributionMaterializationTimestampAdapter<TEncoded> = Readonly<{\n /** Convert a stored column value to ISO-8601 (or `undefined`). */\n decode(value: unknown): string | undefined;\n /** Convert an ISO-8601 string to the value Drizzle expects on insert. */\n encode(value: string): TEncoded;\n}>;\n\nexport const SQLITE_CONTRIBUTION_MAT_TIMESTAMPS: ContributionMaterializationTimestampAdapter<string> =\n {\n decode: (value) => (typeof value === \"string\" ? value : undefined),\n encode: (value) => value,\n };\n\nexport const POSTGRES_CONTRIBUTION_MAT_TIMESTAMPS: ContributionMaterializationTimestampAdapter<Date> =\n {\n decode: formatPostgresTimestamp,\n encode: (value) => new Date(value),\n };\n\n/**\n * Raw shape Drizzle returns for one row of\n * `typegraph_contribution_materializations`. The caller has already\n * narrowed via the typed table query; this just spells out the\n * dialect-shared field set so `mapContributionMaterializationRow` can\n * decode it.\n */\ntype RawContributionMaterializationRow = Readonly<{\n graphId: string;\n logicalName: string;\n owner: string;\n tableName: string;\n signature: string;\n materializedAt: unknown;\n lastAttemptedAt: unknown;\n lastError: string | null;\n}>;\n\nexport function mapContributionMaterializationRow(\n row: RawContributionMaterializationRow,\n decode: (value: unknown) => string | undefined,\n): ContributionMaterializationRow {\n const lastAttemptedAt = decode(row.lastAttemptedAt);\n if (lastAttemptedAt === undefined) {\n throw new Error(\n `contribution materialization row missing required ` +\n `last_attempted_at: ${row.graphId}/${row.logicalName}`,\n );\n }\n return {\n graphId: row.graphId,\n logicalName: row.logicalName,\n owner: row.owner,\n tableName: row.tableName,\n signature: row.signature,\n materializedAt: decode(row.materializedAt),\n lastAttemptedAt,\n lastError: row.lastError ?? undefined,\n };\n}\n\n/**\n * Build the column values for the upsert. Timestamp columns are encoded\n * through the adapter so the dialect's Drizzle column type gets the\n * value-shape it expects.\n */\nexport function buildContributionInsertValues<TEncoded>(\n params: RecordContributionMaterializationParams,\n encode: (value: string) => TEncoded,\n): Readonly<{\n graphId: string;\n logicalName: string;\n owner: string;\n tableName: string;\n signature: string;\n materializedAt: TEncoded | undefined;\n lastAttemptedAt: TEncoded;\n lastError: string | undefined;\n}> {\n return {\n graphId: params.graphId,\n logicalName: params.logicalName,\n owner: params.owner,\n tableName: params.tableName,\n signature: params.signature,\n materializedAt:\n params.materializedAt === undefined ?\n undefined\n : encode(params.materializedAt),\n lastAttemptedAt: encode(params.attemptedAt),\n lastError: params.error,\n };\n}\n\n/**\n * Build the `set` clause for the upsert's ON CONFLICT DO UPDATE.\n *\n * The identity columns are the conflict target (composite primary key)\n * so they are never in the set clause. `materializedAt` uses `COALESCE`\n * to preserve any prior successful timestamp when this attempt failed\n * (`materializedAt === undefined`); on success the new timestamp wins.\n * Identical preservation rule to `buildMaterializationOnConflictSet`,\n * keeping a stale/failed boot retry from erasing the historical\n * success another replica recorded.\n */\nexport function buildContributionOnConflictSet(\n materializedAtColumn: unknown,\n paramsMaterializedAt: string | undefined,\n): Readonly<Record<string, ReturnType<typeof sql>>> {\n const materializedAtSet =\n paramsMaterializedAt === undefined ?\n sql`COALESCE(excluded.${sql.identifier(\"materialized_at\")}, ${materializedAtColumn})`\n : sql`excluded.${sql.identifier(\"materialized_at\")}`;\n return {\n signature: sql`excluded.${sql.identifier(\"signature\")}`,\n materializedAt: materializedAtSet,\n lastAttemptedAt: sql`excluded.${sql.identifier(\"last_attempted_at\")}`,\n lastError: sql`excluded.${sql.identifier(\"last_error\")}`,\n };\n}\n\n/**\n * Canonical hash of a resolved contribution's drift surface:\n * `{ dialect, owner, logicalName, tableName, createDdl }`. #129\n * guarantees `createDdl` is deterministic for a given resolved\n * configuration, so this hash is a meaningful staleness discriminant.\n * A strategy swap (different `owner`) or a DDL change on the same\n * logical slot changes the signature → detectable drift. 32 hex chars\n * because it is compared against an externally-stored signature.\n */\nasync function computeContributionSignature(\n dialect: SqlDialect,\n identity: Readonly<{\n owner: string;\n logicalName: string;\n tableName: string;\n }>,\n createDdl: readonly string[],\n): Promise<string> {\n const hashable = {\n dialect,\n owner: identity.owner,\n logicalName: identity.logicalName,\n tableName: identity.tableName,\n createDdl,\n };\n return sha256Hex(JSON.stringify(hashable, sortedReplacer), 16);\n}\n\n/**\n * Whether a contribution is usable on the current connection, derived\n * from its durable marker row and the freshly-computed signature.\n *\n * - `missing`: no row — never initialized.\n * - `failed`: the last recorded attempt errored. Boot may retry; the\n * hot path must refuse.\n * - `stale`: a row exists but its recorded signature no longer matches\n * (strategy swap / DDL drift). Refuse rather than silently\n * re-materialize on a hot path.\n * - `initialized`: signature matches, a successful `materializedAt` is\n * recorded, and the last attempt did not error.\n */\n// The non-initialized states are exactly `StoreNotInitializedError`'s\n// reasons — derive the union so the two cannot drift apart and the\n// assert can pass the state straight through as the error reason.\ntype ContributionMaterializationState =\n | \"initialized\"\n | StoreNotInitializedReason;\n\nfunction evaluateContributionState(\n row: ContributionMaterializationRow | undefined,\n signature: string,\n): ContributionMaterializationState {\n if (row === undefined) return \"missing\";\n if (row.lastError !== undefined) return \"failed\";\n if (row.signature !== signature) return \"stale\";\n if (row.materializedAt === undefined) return \"missing\";\n return \"initialized\";\n}\n\nfunction identityOf(\n graphId: string,\n contribution: StrategyTableContribution,\n): ContributionMaterializationIdentity {\n return {\n graphId,\n logicalName: contribution.logicalName,\n owner: contribution.owner,\n tableName: contribution.tableName,\n };\n}\n\n/**\n * The fulltext-touching methods the durable-marker gate wraps. The five\n * `upsert*`/`delete*`/`fulltextSearch` are optional (a graph with no\n * `searchable()` fields has none); `hardDeleteNode` is always present\n * because its cascade unconditionally deletes from the fulltext table.\n */\nexport type GatableFulltextBackend = Pick<\n TransactionBackend,\n | \"upsertFulltext\"\n | \"deleteFulltext\"\n | \"upsertFulltextBatch\"\n | \"deleteFulltextBatch\"\n | \"fulltextSearch\"\n | \"hardDeleteNode\"\n>;\n\n/**\n * The fulltext point-of-use gate, as the wrapped overrides only. Each\n * method asserts the durable contribution marker before delegating; an\n * optional method is wrapped only when present. `assert` performs only\n * a (cached) SELECT — never DDL — so it is safe inside an open\n * transaction. The single source of the gating contract: both the\n * non-tx backend and the tx-scoped {@link gateFulltext} consume it.\n */\nexport function gateFulltextMethods(\n source: GatableFulltextBackend,\n assert: (graphId: string) => Promise<void>,\n): Partial<GatableFulltextBackend> {\n // Only assign an override when the raw method exists, so the \"wrap\n // only what's defined\" rule stays obvious instead of hiding behind\n // conditional spreads.\n const gated: {\n -readonly [K in keyof GatableFulltextBackend]?: GatableFulltextBackend[K];\n } = {};\n\n if (source.upsertFulltext) {\n const raw = source.upsertFulltext.bind(source);\n gated.upsertFulltext = async (params) => {\n await assert(params.graphId);\n await raw(params);\n };\n }\n if (source.deleteFulltext) {\n const raw = source.deleteFulltext.bind(source);\n gated.deleteFulltext = async (params) => {\n await assert(params.graphId);\n await raw(params);\n };\n }\n if (source.upsertFulltextBatch) {\n const raw = source.upsertFulltextBatch.bind(source);\n gated.upsertFulltextBatch = async (params) => {\n // A genuine no-op call asserts nothing — the \"empty input is\n // harmless\" contract.\n if (params.rows.length === 0) return;\n await assert(params.graphId);\n await raw(params);\n };\n }\n if (source.deleteFulltextBatch) {\n const raw = source.deleteFulltextBatch.bind(source);\n gated.deleteFulltextBatch = async (params) => {\n if (params.nodeIds.length === 0) return;\n await assert(params.graphId);\n await raw(params);\n };\n }\n if (source.fulltextSearch) {\n const raw = source.fulltextSearch.bind(source);\n gated.fulltextSearch = async (params) => {\n await assert(params.graphId);\n return raw(params);\n };\n }\n // Unconditional: the hard-delete cascade deletes from the fulltext\n // table even for graphs that declare no `searchable()` fields.\n const rawHardDelete = source.hardDeleteNode.bind(source);\n gated.hardDeleteNode = async (params) => {\n await assert(params.graphId);\n await rawHardDelete(params);\n };\n return gated;\n}\n\n/**\n * Tx-scoped variant: a {@link TransactionBackend} with its fulltext\n * methods gated. The tx-scoped backend exposes RAW fulltext methods (no\n * self-ensure); a transaction that never touches fulltext never\n * asserts, so non-fulltext transactions stay free of any fulltext-init\n * requirement.\n */\nexport function gateFulltext(\n tx: TransactionBackend,\n assert: (graphId: string) => Promise<void>,\n): TransactionBackend {\n return createBackendOverlay<TransactionBackend>(\n tx,\n gateFulltextMethods(tx, assert),\n );\n}\n\n// ============================================================\n// Materializer (#135) — the one place orchestration lives\n// ============================================================\n\n/**\n * The dialect-specific seams the materializer needs. Mirrors how the\n * index-materialization subsystem keeps orchestration dialect-agnostic\n * (`store/materialize-indexes.ts`) and leaves only thin primitives in\n * each backend.\n */\nexport type ContributionMaterializerDeps = Readonly<{\n dialect: SqlDialect;\n fulltextStrategy: FulltextStrategy;\n fulltextTableName: string;\n /** Run one raw DDL statement (dialect's `execute`/`run` of `sql.raw`). */\n execDdl: (statement: string) => Promise<void>;\n /** Idempotently create the `contribution_materializations` table. */\n ensureMarkerTable: () => Promise<void>;\n getMarker: (\n identity: ContributionMaterializationIdentity,\n ) => Promise<ContributionMaterializationRow | undefined>;\n recordMarker: (\n params: RecordContributionMaterializationParams,\n ) => Promise<void>;\n}>;\n\nexport type ContributionMaterializer = Readonly<{\n /** Canonical durable-marker writer: every `runtimeEnsure` contribution. */\n ensureRuntimeContributions: (graphId: string) => Promise<void>;\n /**\n * Hot-path / transaction gate: resolve the durable markers once per\n * backend instance (cached) and throw `StoreNotInitializedError` on\n * the first missing/stale/failed contribution. Zero DDL, zero writes.\n */\n assertInitialized: (graphId: string) => Promise<void>;\n}>;\n\nexport function createContributionMaterializer(\n deps: ContributionMaterializerDeps,\n): ContributionMaterializer {\n const { dialect, fulltextStrategy, fulltextTableName } = deps;\n\n // Positive-only cache: a graph id lands here once every runtime\n // contribution's durable marker has been observed materialized for\n // it. Missing/stale/failed verdicts are never cached, so a concurrent\n // boot that fixes the state is picked up on the next call.\n const initializedGraphIds = new Set<string>();\n\n function runtimeContributions(): readonly StrategyTableContribution[] {\n return runtimeStrategyContributions(fulltextStrategy, fulltextTableName);\n }\n\n async function materializeOne(\n graphId: string,\n contribution: StrategyTableContribution,\n ): Promise<void> {\n const signature = await computeContributionSignature(\n dialect,\n contribution,\n contribution.createDdl,\n );\n const identity = identityOf(graphId, contribution);\n const existing = await deps.getMarker(identity);\n\n // Already materialized at this exact shape — nothing to do.\n if (evaluateContributionState(existing, signature) === \"initialized\") {\n return;\n }\n const priorSuccess = existing?.materializedAt !== undefined;\n\n // Drift after a *recorded success*: the table physically exists with\n // the OLD shape, so the idempotent `CREATE ... IF NOT EXISTS` would\n // no-op and we'd silently bless the new signature against a stale\n // table. Refuse loudly instead — mirrors the index materializer's\n // signature-drift handling. (A row with no prior success, or one\n // whose last attempt errored, falls through and re-runs the DDL.)\n if (priorSuccess && existing.signature !== signature) {\n const error = new Error(\n `Contribution \"${contribution.logicalName}\" (owner ` +\n `\"${contribution.owner}\", table \"${contribution.tableName}\") was ` +\n `already materialized with a different signature. The recorded ` +\n `physical shape is stale relative to the current strategy/DDL — ` +\n `migrate or drop the table and retry, or restore the original ` +\n `strategy.`,\n );\n await deps.recordMarker({\n ...identity,\n signature,\n attemptedAt: nowIso(),\n materializedAt: undefined,\n error: error.message,\n });\n throw error;\n }\n\n const attemptedAt = nowIso();\n try {\n for (const statement of contribution.createDdl) {\n await deps.execDdl(statement);\n }\n } catch (error) {\n await deps.recordMarker({\n ...identity,\n signature,\n attemptedAt,\n materializedAt: undefined,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n await deps.recordMarker({\n ...identity,\n signature,\n attemptedAt,\n materializedAt: attemptedAt,\n error: undefined,\n });\n }\n\n /**\n * Durable state of a single contribution on the current connection:\n * its freshly-computed signature read back against the marker row. A\n * missing marker *table* (never bootstrapped) is reported as its own\n * variant so each caller decides what it means — `assertInitialized`\n * treats it as \"not initialized\" and throws; `ensureRuntimeContributions`\n * treats it as \"needs first materialization\" and falls through to DDL.\n * Any non-missing-table read fault (connection/permission/driver) is a\n * real system error and propagates as-is rather than being masked.\n */\n async function readContributionState(\n graphId: string,\n contribution: StrategyTableContribution,\n ): Promise<\n | Readonly<{ kind: \"state\"; state: ContributionMaterializationState }>\n | Readonly<{ kind: \"missing-table\"; error: unknown }>\n > {\n const signature = await computeContributionSignature(\n dialect,\n contribution,\n contribution.createDdl,\n );\n const identity = identityOf(graphId, contribution);\n try {\n const existing = await deps.getMarker(identity);\n return {\n kind: \"state\",\n state: evaluateContributionState(existing, signature),\n };\n } catch (error) {\n if (!isMissingTableError(error)) throw error;\n return { kind: \"missing-table\", error };\n }\n }\n\n /**\n * SELECT-only verdict over every runtime contribution: `true` only when\n * each one is already materialized at its current signature. Short-\n * circuits on the first non-initialized read — a missing marker table\n * or any missing/stale/failed contribution. Never runs DDL.\n */\n async function allContributionsInitialized(\n graphId: string,\n contributions: readonly StrategyTableContribution[],\n ): Promise<boolean> {\n for (const contribution of contributions) {\n const read = await readContributionState(graphId, contribution);\n if (read.kind !== \"state\" || read.state !== \"initialized\") return false;\n }\n return true;\n }\n\n async function ensureRuntimeContributions(graphId: string): Promise<void> {\n // Cache guard so a redundant boot call (the warm path materializes\n // via loadActiveSchemaWithBootstrap, then createStoreWithSchema\n // calls again) is a true O(1) no-op rather than a re-SELECT.\n if (initializedGraphIds.has(graphId)) return;\n const contributions = runtimeContributions();\n\n // Read-only pre-check mirroring `assertInitialized` (#149): when every\n // contribution is already materialized at its current signature, this\n // open needs no DDL — skip `ensureMarkerTable()` / `materializeOne`\n // entirely. A consumer that builds a fresh backend per request (empty\n // per-instance cache) therefore stays DDL-free on a warm graph instead\n // of re-running the marker `CREATE TABLE IF NOT EXISTS` on every open,\n // which fails on connections that can't run it. A missing marker table\n // or any missing/stale/failed contribution falls through to the\n // privileged first-materialization path below, unchanged.\n if (await allContributionsInitialized(graphId, contributions)) {\n initializedGraphIds.add(graphId);\n return;\n }\n\n await deps.ensureMarkerTable();\n for (const contribution of contributions) {\n await materializeOne(graphId, contribution);\n }\n initializedGraphIds.add(graphId);\n }\n\n async function assertInitialized(graphId: string): Promise<void> {\n if (initializedGraphIds.has(graphId)) return;\n for (const contribution of runtimeContributions()) {\n const read = await readContributionState(graphId, contribution);\n // A never-bootstrapped database has no marker table — that is\n // precisely \"not initialized\". `readContributionState` has already\n // rethrown any non-missing-table fault (connection, permission,\n // driver), so a real system error never surfaces here masked as a\n // user init error.\n if (read.kind === \"missing-table\") {\n throw new StoreNotInitializedError(graphId, \"missing\", {\n cause: read.error,\n details: { logicalName: contribution.logicalName },\n });\n }\n if (read.state !== \"initialized\") {\n throw new StoreNotInitializedError(graphId, read.state, {\n details: { logicalName: contribution.logicalName },\n });\n }\n }\n initializedGraphIds.add(graphId);\n }\n\n return { ensureRuntimeContributions, assertInitialized };\n}\n","/**\n * Shared building blocks for the `typegraph_index_materializations`\n * status-table operations on both SQLite and Postgres backends.\n *\n * The two dialect adapters used to carry near-identical implementations\n * of `getIndexMaterialization` and `recordIndexMaterialization`. They\n * differ only in (a) how timestamps cross the Drizzle boundary —\n * SQLite stores ISO strings in TEXT columns, Postgres stores `Date`\n * objects in TIMESTAMPTZ columns — and (b) the raw-DDL exec call used\n * to bootstrap the table. Everything else (the row shape, the\n * `onConflictDoUpdate` set clause, the `materializedAt` COALESCE\n * preservation rule for failed re-attempts) is dialect-agnostic and\n * lives here.\n */\n\nimport { sql } from \"drizzle-orm\";\n\nimport type { IndexEntity } from \"../../core/types\";\nimport type {\n IndexMaterializationRow,\n RecordIndexMaterializationParams,\n} from \"../types\";\nimport { formatPostgresTimestamp } from \"./row-mappers\";\n\n/**\n * Bridges the dialect-specific timestamp column representation to the\n * canonical ISO-8601 strings used by `IndexMaterializationRow` and\n * `RecordIndexMaterializationParams`. Generic over the encoded type so\n * each dialect's `.values()` call gets a Drizzle-compatible shape:\n * `string` for SQLite TEXT, `Date` for Postgres TIMESTAMPTZ.\n */\ntype IndexMaterializationTimestampAdapter<TEncoded> = Readonly<{\n /** Convert a stored column value to ISO-8601 (or `undefined`). */\n decode(value: unknown): string | undefined;\n /** Convert an ISO-8601 string to the value Drizzle expects on insert. */\n encode(value: string): TEncoded;\n}>;\n\nexport const SQLITE_INDEX_MAT_TIMESTAMPS: IndexMaterializationTimestampAdapter<string> =\n {\n decode: (value) => (typeof value === \"string\" ? value : undefined),\n encode: (value) => value,\n };\n\nexport const POSTGRES_INDEX_MAT_TIMESTAMPS: IndexMaterializationTimestampAdapter<Date> =\n {\n decode: formatPostgresTimestamp,\n encode: (value) => new Date(value),\n };\n\n/**\n * Raw shape returned by Drizzle for one row of the\n * `typegraph_index_materializations` table. The caller has already\n * narrowed via the typed table query; this type just spells out the\n * dialect-shared field set so `mapMaterializationRow` can decode it.\n */\ntype RawIndexMaterializationRow = Readonly<{\n indexName: string;\n graphId: string;\n entity: string;\n kind: string;\n signature: string;\n schemaVersion: number;\n materializedAt: unknown;\n lastAttemptedAt: unknown;\n lastError: string | null;\n}>;\n\nexport function mapMaterializationRow(\n row: RawIndexMaterializationRow,\n decode: (value: unknown) => string | undefined,\n): IndexMaterializationRow {\n const lastAttemptedAt = decode(row.lastAttemptedAt);\n if (lastAttemptedAt === undefined) {\n throw new Error(\n `materialization row missing required last_attempted_at: ${row.indexName}`,\n );\n }\n return {\n indexName: row.indexName,\n graphId: row.graphId,\n entity: row.entity as IndexEntity,\n kind: row.kind,\n signature: row.signature,\n schemaVersion: row.schemaVersion,\n materializedAt: decode(row.materializedAt),\n lastAttemptedAt,\n lastError: row.lastError ?? undefined,\n };\n}\n\n/**\n * Build the column values for the upsert. Timestamp columns are\n * encoded through the adapter so the dialect's Drizzle column type\n * gets the value-shape it expects.\n */\nexport function buildMaterializationInsertValues<TEncoded>(\n params: RecordIndexMaterializationParams,\n encode: (value: string) => TEncoded,\n): Readonly<{\n indexName: string;\n graphId: string;\n entity: IndexEntity;\n kind: string;\n signature: string;\n schemaVersion: number;\n materializedAt: TEncoded | undefined;\n lastAttemptedAt: TEncoded;\n lastError: string | undefined;\n}> {\n return {\n indexName: params.indexName,\n graphId: params.graphId,\n entity: params.entity,\n kind: params.kind,\n signature: params.signature,\n schemaVersion: params.schemaVersion,\n materializedAt:\n params.materializedAt === undefined ?\n undefined\n : encode(params.materializedAt),\n lastAttemptedAt: encode(params.attemptedAt),\n lastError: params.error,\n };\n}\n\n/**\n * Build the `set` clause for the upsert's ON CONFLICT DO UPDATE.\n *\n * The `materializedAt` column uses `COALESCE` to preserve any prior\n * successful timestamp when this attempt failed (`materializedAt ===\n * undefined`). On success the new timestamp wins. This keeps the\n * status table truthful: the most recent successful materialization\n * timestamp survives even if a subsequent re-attempt errored.\n */\nexport function buildMaterializationOnConflictSet(\n materializedAtColumn: unknown,\n paramsMaterializedAt: string | undefined,\n): Readonly<Record<string, ReturnType<typeof sql>>> {\n const materializedAtSet =\n paramsMaterializedAt === undefined ?\n sql`COALESCE(excluded.${sql.identifier(\"materialized_at\")}, ${materializedAtColumn})`\n : sql`excluded.${sql.identifier(\"materialized_at\")}`;\n return {\n graphId: sql`excluded.${sql.identifier(\"graph_id\")}`,\n entity: sql`excluded.${sql.identifier(\"entity\")}`,\n kind: sql`excluded.${sql.identifier(\"kind\")}`,\n signature: sql`excluded.${sql.identifier(\"signature\")}`,\n schemaVersion: sql`excluded.${sql.identifier(\"schema_version\")}`,\n materializedAt: materializedAtSet,\n lastAttemptedAt: sql`excluded.${sql.identifier(\"last_attempted_at\")}`,\n lastError: sql`excluded.${sql.identifier(\"last_error\")}`,\n };\n}\n","/**\n * Shared building blocks for the `typegraph_kind_removals` status-table\n * operations on both SQLite and Postgres backends.\n *\n * Same shape as `index-materializations.ts`: the dialects differ only\n * in (a) timestamp encoding (SQLite TEXT vs Postgres TIMESTAMPTZ) and\n * (b) the raw-DDL exec call used to bootstrap the table. The row\n * mapper, the `onConflictDoUpdate` set clause, and the\n * `removed_at` COALESCE-on-failure preservation rule are dialect-\n * agnostic and live here. Two near-identical adapter copies in\n * `sqlite.ts` / `postgres.ts` collapse to ~15 lines each.\n */\n\nimport { sql } from \"drizzle-orm\";\n\nimport type { KindEntity } from \"../../core/types\";\nimport type { KindRemovalRow, RecordKindRemovalParams } from \"../types\";\nimport { formatPostgresTimestamp } from \"./row-mappers\";\n\n/**\n * Bridges the dialect-specific timestamp column representation to the\n * canonical ISO-8601 strings used by `KindRemovalRow` and\n * `RecordKindRemovalParams`. Generic over the encoded type so each\n * dialect's `.values()` call gets a Drizzle-compatible shape: `string`\n * for SQLite TEXT, `Date` for Postgres TIMESTAMPTZ.\n */\ntype KindRemovalTimestampAdapter<TEncoded> = Readonly<{\n /** Convert a stored column value to ISO-8601 (or `undefined`). */\n decode(value: unknown): string | undefined;\n /** Convert an ISO-8601 string to the value Drizzle expects on insert. */\n encode(value: string): TEncoded;\n}>;\n\nexport const SQLITE_KIND_REMOVAL_TIMESTAMPS: KindRemovalTimestampAdapter<string> =\n {\n decode: (value) => (typeof value === \"string\" ? value : undefined),\n encode: (value) => value,\n };\n\nexport const POSTGRES_KIND_REMOVAL_TIMESTAMPS: KindRemovalTimestampAdapter<Date> =\n {\n decode: formatPostgresTimestamp,\n encode: (value) => new Date(value),\n };\n\n/**\n * Raw shape returned by Drizzle for one row of the\n * `typegraph_kind_removals` table.\n */\ntype RawKindRemovalRow = Readonly<{\n graphId: string;\n kindName: string;\n entity: string;\n schemaVersion: number;\n removedAt: unknown;\n lastAttemptedAt: unknown;\n lastError: string | null;\n}>;\n\nexport function mapKindRemovalRow(\n row: RawKindRemovalRow,\n decode: (value: unknown) => string | undefined,\n): KindRemovalRow {\n const lastAttemptedAt = decode(row.lastAttemptedAt);\n if (lastAttemptedAt === undefined) {\n throw new Error(\n `kind removal row missing required last_attempted_at: ${row.kindName}`,\n );\n }\n return {\n graphId: row.graphId,\n kindName: row.kindName,\n entity: row.entity as KindEntity,\n schemaVersion: row.schemaVersion,\n removedAt: decode(row.removedAt),\n lastAttemptedAt,\n lastError: row.lastError ?? undefined,\n };\n}\n\n/**\n * Build the column values for the upsert. Timestamp columns are\n * encoded through the adapter so the dialect's Drizzle column type\n * gets the value-shape it expects.\n */\nexport function buildKindRemovalInsertValues<TEncoded>(\n params: RecordKindRemovalParams,\n encode: (value: string) => TEncoded,\n): Readonly<{\n graphId: string;\n kindName: string;\n entity: KindEntity;\n schemaVersion: number;\n removedAt: TEncoded | undefined;\n lastAttemptedAt: TEncoded;\n lastError: string | undefined;\n}> {\n return {\n graphId: params.graphId,\n kindName: params.kindName,\n entity: params.entity,\n schemaVersion: params.schemaVersion,\n removedAt:\n params.removedAt === undefined ? undefined : encode(params.removedAt),\n lastAttemptedAt: encode(params.attemptedAt),\n lastError: params.error,\n };\n}\n\n/**\n * Build the `set` clause for the upsert's ON CONFLICT DO UPDATE.\n *\n * `removed_at` uses `COALESCE` to preserve any prior successful\n * timestamp when this attempt failed (`removedAt === undefined`). On\n * success, the new timestamp wins. Mirrors the materializations-table\n * preservation rule.\n */\nexport function buildKindRemovalOnConflictSet(\n removedAtColumn: unknown,\n paramsRemovedAt: string | undefined,\n): Readonly<Record<string, ReturnType<typeof sql>>> {\n const removedAtSet =\n paramsRemovedAt === undefined ?\n sql`COALESCE(excluded.${sql.identifier(\"removed_at\")}, ${removedAtColumn})`\n : sql`excluded.${sql.identifier(\"removed_at\")}`;\n return {\n entity: sql`excluded.${sql.identifier(\"entity\")}`,\n schemaVersion: sql`excluded.${sql.identifier(\"schema_version\")}`,\n removedAt: removedAtSet,\n lastAttemptedAt: sql`excluded.${sql.identifier(\"last_attempted_at\")}`,\n lastError: sql`excluded.${sql.identifier(\"last_error\")}`,\n };\n}\n","/**\n * Single-statement hybrid search: composes a vector source (the active\n * `VectorStrategy`'s search SQL) and a fulltext source (the shared\n * `buildFulltextSearch` SQL) into one statement that ranks each source,\n * fuses via weighted Reciprocal Rank Fusion, joins live node rows for\n * hydration, and pages the fused ranking — replacing the facade's two\n * search round trips plus id-hydration fetch with one round trip.\n *\n * Fusion math matches the store's JS implementation exactly:\n * `score = Σ_src weight_src / (fusionK + rank_src)`, ranked descending,\n * ties broken by node id. Ranks are per-source `ROW_NUMBER()` over the\n * source's own ordering (score, direction per metric convention), so the\n * statement requires window functions — backends whose capability profile\n * disables them fall back to the multi-statement path.\n *\n * The two-branch `UNION ALL` + `GROUP BY` fusion shape is deliberate: it\n * needs no FULL OUTER JOIN (absent from older SQLite builds) and keeps the\n * statement identical across dialects. The fused CTE is MATERIALIZED — a\n * fence, not a hint: Postgres inlines single-use CTEs, and the inlined\n * fusion subtree re-executed once per candidate node row under a\n * nested-loop join (2000x in the regression that motivated this).\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type SqlDialect } from \"../../../query/dialect/types\";\nimport { type HybridSearchRow, type NodeRow } from \"../../types\";\nimport { coerceNumericScore } from \"../row-mappers\";\nimport { codePointOrderKey, quotedColumn, type Tables } from \"./shared\";\n\n/**\n * The `node_id` tiebreak this statement uses three times: once in each\n * per-source `ROW_NUMBER()` rank, and once in the final fused ordering. Those\n * ranks *produce* the fused scores, so the tiebreak decides the page twice\n * over. Code-point ordered on both engines (see {@link codePointOrderKey}) so\n * it matches the multi-statement fallback's JS fusion row for row.\n */\nfunction nodeIdOrderKey(dialect: SqlDialect): SQL {\n return codePointOrderKey(sql.raw(\"node_id\"), dialect);\n}\n\nexport type HybridStatementInput = Readonly<{\n /**\n * The candidates set (liveness/currency filter, or the store-compiled\n * predicate query): `(node_id)` rows. Emitted ONCE as the\n * `tg_hybrid_cand` CTE; both source legs must reference it via\n * {@link hybridCandidatesRef} instead of embedding their own copy —\n * previously each leg re-executed the candidates subquery (with two\n * separate `nowIso()` stamps for the currency window, no less).\n */\n candidatesSql: SQL;\n /** Vector source SQL: `(node_id, score)` ordered best-first, bounded. */\n vectorSql: SQL;\n /**\n * Whether higher vector scores rank first (cosine similarity) or lower\n * (l2 / inner_product raw distance) — must match the source ordering.\n */\n vectorScoreDescending: boolean;\n /** Fulltext source SQL: `(node_id, score, snippet)`, score-descending. */\n fulltextSql: SQL;\n nodes: Tables[\"nodes\"];\n /** Selects the collation-independent `node_id` tiebreak. */\n dialect: SqlDialect;\n graphId: string;\n nodeKind: string;\n fusionK: number;\n vectorWeight: number;\n fulltextWeight: number;\n limit: number;\n offset: number;\n}>;\n\n/**\n * The raw column shape the statement returns: fusion fields plus the full\n * node row (aliased to the mapper's expected column names). `node_id`\n * (fusion side) and `id` (node side) intentionally coexist.\n */\n/**\n * The reference the vector/fulltext source legs embed in place of the\n * candidates subquery (their strategies emit `node_id IN (<this>)`).\n * Valid only inside {@link buildHybridSearchStatement}, which defines\n * the `tg_hybrid_cand` CTE first in its WITH list — CTEs are visible to\n * later members on both dialects, and a CTE referenced from both legs\n * is evaluated once.\n */\nexport function hybridCandidatesRef(): SQL {\n return sql`SELECT node_id FROM tg_hybrid_cand`;\n}\n\nexport function buildHybridSearchStatement(input: HybridStatementInput): SQL {\n const { nodes } = input;\n const nodeIdOrder = nodeIdOrderKey(input.dialect);\n const vectorOrder =\n input.vectorScoreDescending ?\n sql`score DESC, ${nodeIdOrder} ASC`\n : sql`score ASC, ${nodeIdOrder} ASC`;\n\n const columnPairs: readonly (readonly [{ name: string }, string])[] = [\n [nodes.graphId, \"graph_id\"],\n [nodes.kind, \"kind\"],\n [nodes.id, \"id\"],\n [nodes.props, \"props\"],\n [nodes.version, \"version\"],\n [nodes.validFrom, \"valid_from\"],\n [nodes.validTo, \"valid_to\"],\n [nodes.createdAt, \"created_at\"],\n [nodes.updatedAt, \"updated_at\"],\n [nodes.deletedAt, \"deleted_at\"],\n ];\n const nodeColumns = sql.raw(\n columnPairs\n .map(\n ([column, alias]) =>\n `tg_hybrid_node.\"${column.name.replaceAll('\"', '\"\"')}\" AS ${alias}`,\n )\n .join(\", \"),\n );\n\n // `* 1.0` forces float division: with integer binds, Postgres would\n // otherwise evaluate `weight / (k + rank)` in integer arithmetic and\n // collapse every contribution to zero.\n return sql`\n WITH tg_hybrid_cand AS (\n SELECT node_id FROM (${input.candidatesSql}) AS tg_hybrid_cand_src\n ),\n tg_hybrid_vec AS (\n SELECT node_id, score,\n ROW_NUMBER() OVER (ORDER BY ${vectorOrder}) AS ord\n FROM (${input.vectorSql}) AS tg_hybrid_vec_src\n ),\n tg_hybrid_fts AS (\n SELECT node_id, score, snippet,\n ROW_NUMBER() OVER (ORDER BY score DESC, ${nodeIdOrder} ASC) AS ord\n FROM (${input.fulltextSql}) AS tg_hybrid_fts_src\n ),\n tg_hybrid_pairs AS (\n SELECT node_id, ord AS vector_rank, score AS vector_score,\n NULL AS fulltext_rank, NULL AS fulltext_score, NULL AS snippet\n FROM tg_hybrid_vec\n UNION ALL\n SELECT node_id, NULL, NULL, ord, score, snippet\n FROM tg_hybrid_fts\n ),\n tg_hybrid_fused AS MATERIALIZED (\n SELECT node_id,\n SUM(\n COALESCE((${input.vectorWeight} * 1.0) / (${input.fusionK} + vector_rank), 0)\n + COALESCE((${input.fulltextWeight} * 1.0) / (${input.fusionK} + fulltext_rank), 0)\n ) AS fused_score,\n MAX(vector_rank) AS vector_rank,\n MAX(vector_score) AS vector_score,\n MAX(fulltext_rank) AS fulltext_rank,\n MAX(fulltext_score) AS fulltext_score,\n MAX(snippet) AS snippet\n FROM tg_hybrid_pairs\n GROUP BY node_id\n )\n SELECT\n tg_hybrid_fused.node_id AS node_id,\n tg_hybrid_fused.fused_score AS fused_score,\n tg_hybrid_fused.vector_rank AS vector_rank,\n tg_hybrid_fused.vector_score AS vector_score,\n tg_hybrid_fused.fulltext_rank AS fulltext_rank,\n tg_hybrid_fused.fulltext_score AS fulltext_score,\n tg_hybrid_fused.snippet AS snippet,\n ${nodeColumns}\n FROM tg_hybrid_fused\n JOIN ${nodes} AS tg_hybrid_node\n ON ${qualified(nodes, \"graphId\")} = ${input.graphId}\n AND ${qualified(nodes, \"kind\")} = ${input.nodeKind}\n AND ${qualified(nodes, \"id\")} = tg_hybrid_fused.node_id\n AND ${qualified(nodes, \"deletedAt\")} IS NULL\n ORDER BY fused_score DESC, ${nodeIdOrder} ASC\n LIMIT ${input.limit} OFFSET ${input.offset}\n `;\n}\n\nfunction qualified(\n nodes: Tables[\"nodes\"],\n member: \"graphId\" | \"kind\" | \"id\" | \"deletedAt\",\n): SQL {\n return sql`tg_hybrid_node.${quotedColumn(nodes[member])}`;\n}\n\nfunction present(value: unknown): boolean {\n return value !== null && value !== undefined;\n}\n\n/**\n * Maps one raw statement row into a {@link HybridSearchRow}. Rank columns\n * come from `ROW_NUMBER()` (bigint — node-postgres hands int8 back as a\n * string) and scores from engine-native rank math (Postgres `numeric`\n * can arrive as a string), so both coerce defensively.\n */\nexport function mapHybridSearchRow(\n row: Record<string, unknown>,\n toNodeRow: (raw: Record<string, unknown>) => NodeRow,\n): HybridSearchRow {\n return {\n node: toNodeRow(row),\n fusedScore: coerceNumericScore(row.fused_score as number | string),\n ...(present(row.vector_rank) ?\n { vectorRank: Number(row.vector_rank) }\n : {}),\n ...(present(row.vector_score) ?\n { vectorScore: coerceNumericScore(row.vector_score as number | string) }\n : {}),\n ...(present(row.fulltext_rank) ?\n { fulltextRank: Number(row.fulltext_rank) }\n : {}),\n ...(present(row.fulltext_score) ?\n {\n fulltextScore: coerceNumericScore(\n row.fulltext_score as number | string,\n ),\n }\n : {}),\n ...(present(row.snippet) ? { snippet: String(row.snippet) } : {}),\n };\n}\n","import { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport { quotedTableName, type Tables } from \"./shared\";\n\nexport type ClearGraphStatement = Readonly<{\n query: SQL;\n ignoreMissingTable?: boolean;\n requiredTableName?: string;\n}>;\n\n/**\n * Builds DELETE FROM statements for all per-graph base tables filtered by\n * graph_id. Delete order respects implicit FK-like dependencies:\n * fulltext → recorded_edges → recorded_nodes → recorded_clock → uniques →\n * edges → nodes → schema_versions.\n *\n * Embeddings are NOT cleared here: they live in per-`(nodeKind, fieldPath)`\n * strategy-owned tables that this graph-agnostic builder cannot enumerate.\n * The store's `clear()` drives their per-field cleanup through the active\n * vector strategy.\n *\n * Per-deployment status tables (`indexMaterializations`, `kindRemovals`,\n * `reconciliationMarkers`) also get cleaned because reuse of the same\n * graphId after `clearGraph` would otherwise inherit stale state. The\n * reconciliation marker is the sharpest case: a stale high-water mark\n * would cause `materializeRemovals` to skip the recovery walk entirely\n * for the freshly-created graph.\n */\nexport function buildClearGraph(\n tables: Tables,\n graphId: string,\n): readonly ClearGraphStatement[] {\n const fulltext = quotedTableName(tables.fulltextTableName);\n return [\n { query: sql`DELETE FROM ${fulltext} WHERE \"graph_id\" = ${graphId}` },\n {\n query: sql`DELETE FROM ${tables.recordedEdges} WHERE ${tables.recordedEdges.graphId} = ${graphId}`,\n ignoreMissingTable: true,\n requiredTableName: getTableName(tables.recordedEdges),\n },\n {\n query: sql`DELETE FROM ${tables.recordedNodes} WHERE ${tables.recordedNodes.graphId} = ${graphId}`,\n ignoreMissingTable: true,\n requiredTableName: getTableName(tables.recordedNodes),\n },\n {\n query: sql`DELETE FROM ${tables.recordedClock} WHERE ${tables.recordedClock.graphId} = ${graphId}`,\n ignoreMissingTable: true,\n requiredTableName: getTableName(tables.recordedClock),\n },\n {\n query: sql`DELETE FROM ${tables.uniques} WHERE ${tables.uniques.graphId} = ${graphId}`,\n },\n {\n query: sql`DELETE FROM ${tables.edges} WHERE ${tables.edges.graphId} = ${graphId}`,\n },\n {\n query: sql`DELETE FROM ${tables.nodes} WHERE ${tables.nodes.graphId} = ${graphId}`,\n },\n {\n query: sql`DELETE FROM ${tables.indexMaterializations} WHERE ${tables.indexMaterializations.graphId} = ${graphId}`,\n },\n {\n query: sql`DELETE FROM ${tables.kindRemovals} WHERE ${tables.kindRemovals.graphId} = ${graphId}`,\n },\n {\n query: sql`DELETE FROM ${tables.reconciliationMarkers} WHERE ${tables.reconciliationMarkers.graphId} = ${graphId}`,\n },\n {\n query: sql`DELETE FROM ${tables.schemaVersions} WHERE ${tables.schemaVersions.graphId} = ${graphId}`,\n },\n ];\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { type TemporalMode } from \"../../../core/types\";\nimport type {\n CountEdgesByKindParams,\n CountNodesByKindParams,\n FindEdgesByKindParams,\n FindNodesByKindParams,\n} from \"../../types\";\nimport type { Tables } from \"./shared\";\n\n/**\n * Builds temporal and soft-delete SQL conditions.\n *\n * - `includeTombstones`: no filtering at all (overrides excludeDeleted)\n * - `current` / `asOf`: exclude deleted + filter by validity range\n * - `includeEnded`: exclude deleted only\n * - no temporalMode: just apply excludeDeleted (backward-compatible)\n */\nfunction buildTemporalConditions(\n table: Pick<Tables[\"nodes\"], \"deletedAt\" | \"validFrom\" | \"validTo\">,\n params: Readonly<{\n temporalMode?: TemporalMode;\n asOf?: string;\n excludeDeleted?: boolean;\n }>,\n): SQL[] {\n const conditions: SQL[] = [];\n const mode = params.temporalMode;\n\n if (mode === \"includeTombstones\") return conditions;\n\n if (params.excludeDeleted !== false) {\n conditions.push(sql`${table.deletedAt} IS NULL`);\n }\n\n if (mode === \"current\" || mode === \"asOf\") {\n if (params.asOf === undefined) {\n throw new Error(\n `asOf timestamp is required for temporal mode \"${mode}\"`,\n );\n }\n conditions.push(\n sql`(${table.validFrom} IS NULL OR ${table.validFrom} <= ${params.asOf})`,\n sql`(${table.validTo} IS NULL OR ${table.validTo} > ${params.asOf})`,\n );\n }\n\n return conditions;\n}\n\n/**\n * Builds a query to find nodes by kind.\n *\n * Two pagination shapes are supported:\n * - Offset pagination (`limit` + `offset`): keeps the historical\n * `ORDER BY created_at DESC` ordering and adds `id DESC` as a\n * deterministic tiebreaker so shared timestamps don't shuffle rows.\n * - Keyset pagination (`orderBy: \"id\"` + optional `after`): iterates\n * by `id ASC` for stability under concurrent writes and shared\n * timestamps. Required by `rebuildFulltextIndex`.\n */\nexport function buildFindNodesByKind(\n tables: Tables,\n params: FindNodesByKindParams,\n): SQL {\n const { nodes } = tables;\n\n const conditions: SQL[] = [\n sql`${nodes.graphId} = ${params.graphId}`,\n sql`${nodes.kind} = ${params.kind}`,\n ...buildTemporalConditions(nodes, params),\n ];\n\n if (params.orderBy === \"id\" && params.after !== undefined) {\n conditions.push(sql`${nodes.id} > ${params.after}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n const orderByClause =\n params.orderBy === \"id\"\n ? sql`${nodes.id} ASC`\n : sql`${nodes.createdAt} DESC, ${nodes.id} DESC`;\n\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n if (params.limit !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\n `;\n}\n\n/**\n * Builds a query to count nodes by kind.\n */\nexport function buildCountNodesByKind(\n tables: Tables,\n params: CountNodesByKindParams,\n): SQL {\n const { nodes } = tables;\n\n const conditions: SQL[] = [\n sql`${nodes.graphId} = ${params.graphId}`,\n sql`${nodes.kind} = ${params.kind}`,\n ...buildTemporalConditions(nodes, params),\n ];\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n return sql`\n SELECT COUNT(*) as count FROM ${nodes}\n WHERE ${whereClause}\n `;\n}\n\n/**\n * Builds a query to find edges by kind with optional endpoint filters.\n *\n * Pagination mirrors {@link buildFindNodesByKind}:\n * - Offset pagination (`limit` + `offset`): keeps the historical\n * `ORDER BY created_at DESC` and adds `id DESC` as a deterministic tiebreaker\n * so a non-unique `created_at` can no longer shuffle rows across pages.\n * - Keyset pagination (`orderBy: \"id\"` + optional `after`): iterates by `id ASC`\n * over the unique `id`, a TOTAL order, so a full enumeration can neither skip\n * nor duplicate a row even when many edges share a `created_at`.\n */\nexport function buildFindEdgesByKind(\n tables: Tables,\n params: FindEdgesByKindParams,\n): SQL {\n const { edges } = tables;\n\n const conditions: SQL[] = [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ...buildTemporalConditions(edges, params),\n ];\n\n if (params.fromKind !== undefined) {\n conditions.push(sql`${edges.fromKind} = ${params.fromKind}`);\n }\n\n if (params.fromId !== undefined) {\n conditions.push(sql`${edges.fromId} = ${params.fromId}`);\n }\n\n if (params.toKind !== undefined) {\n conditions.push(sql`${edges.toKind} = ${params.toKind}`);\n }\n\n if (params.toId !== undefined) {\n conditions.push(sql`${edges.toId} = ${params.toId}`);\n }\n\n if (params.orderBy === \"id\" && params.after !== undefined) {\n conditions.push(sql`${edges.id} > ${params.after}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n const orderByClause =\n params.orderBy === \"id\"\n ? sql`${edges.id} ASC`\n : sql`${edges.createdAt} DESC, ${edges.id} DESC`;\n\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n if (params.limit !== undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\n `;\n}\n\n/**\n * Builds a query to count edges by kind with optional endpoint filters.\n */\nexport function buildCountEdgesByKind(\n tables: Tables,\n params: CountEdgesByKindParams,\n): SQL {\n const { edges } = tables;\n\n const conditions: SQL[] = [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ...buildTemporalConditions(edges, params),\n ];\n\n if (params.fromKind !== undefined) {\n conditions.push(sql`${edges.fromKind} = ${params.fromKind}`);\n }\n\n if (params.fromId !== undefined) {\n conditions.push(sql`${edges.fromId} = ${params.fromId}`);\n }\n\n if (params.toKind !== undefined) {\n conditions.push(sql`${edges.toKind} = ${params.toKind}`);\n }\n\n if (params.toId !== undefined) {\n conditions.push(sql`${edges.toId} = ${params.toId}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${whereClause}\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { sqlValueList } from \"../../../query/compiler/predicate-utils\";\nimport type {\n CountEdgesFromParams,\n DeleteEdgeParams,\n DeleteEdgesBatchParams,\n EdgeExistsBetweenParams,\n FindEdgesConnectedToParams,\n HardDeleteEdgeParams,\n InsertEdgeParams,\n UpdateEdgeParams,\n} from \"../../types\";\nimport {\n edgeColumnList,\n quotedColumn,\n resolveValidFrom,\n sqlNull,\n type Tables,\n} from \"./shared\";\n\n/**\n * Builds an INSERT query for an edge.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertEdge(\n tables: Tables,\n params: InsertEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = edgeColumnList(edges);\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES (\n ${params.graphId}, ${params.id}, ${params.kind},\n ${params.fromKind}, ${params.fromId}, ${params.toKind}, ${params.toId},\n ${propsJson}, ${sqlNull(resolveValidFrom(params.validFrom, timestamp))}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds an INSERT query for an edge without RETURNING payload.\n */\nexport function buildInsertEdgeNoReturn(\n tables: Tables,\n params: InsertEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = edgeColumnList(edges);\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES (\n ${params.graphId}, ${params.id}, ${params.kind},\n ${params.fromKind}, ${params.fromId}, ${params.toKind}, ${params.toId},\n ${propsJson}, ${sqlNull(resolveValidFrom(params.validFrom, timestamp))}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n `;\n}\n\n/**\n * Builds a batched INSERT query for edges without RETURNING payload.\n */\nexport function buildInsertEdgesBatch(\n tables: Tables,\n params: readonly InsertEdgeParams[],\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const columns = edgeColumnList(edges);\n const values = params.map((edgeParams) => {\n const propsJson = JSON.stringify(edgeParams.props);\n return sql`(${edgeParams.graphId}, ${edgeParams.id}, ${edgeParams.kind}, ${edgeParams.fromKind}, ${edgeParams.fromId}, ${edgeParams.toKind}, ${edgeParams.toId}, ${propsJson}, ${sqlNull(resolveValidFrom(edgeParams.validFrom, timestamp))}, ${sqlNull(edgeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n `;\n}\n\n/**\n * Builds a batched INSERT query for edges with RETURNING *.\n */\nexport function buildInsertEdgesBatchReturning(\n tables: Tables,\n params: readonly InsertEdgeParams[],\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const columns = edgeColumnList(edges);\n const values = params.map((edgeParams) => {\n const propsJson = JSON.stringify(edgeParams.props);\n return sql`(${edgeParams.graphId}, ${edgeParams.id}, ${edgeParams.kind}, ${edgeParams.fromKind}, ${edgeParams.fromId}, ${edgeParams.toKind}, ${edgeParams.toId}, ${propsJson}, ${sqlNull(resolveValidFrom(edgeParams.validFrom, timestamp))}, ${sqlNull(edgeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get an edge by id.\n * Returns the edge regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetEdge(tables: Tables, graphId: string, id: string): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND ${edges.id} = ${id}\n `;\n}\n\n/**\n * Builds a SELECT query to get multiple edges by ids.\n * Returns edges regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetEdges(\n tables: Tables,\n graphId: string,\n ids: readonly string[],\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND ${edges.id} IN (${sqlValueList(ids)})\n `;\n}\n\n/**\n * Builds an UPDATE query for an edge.\n * Uses raw column names in SET clause.\n */\nexport function buildUpdateEdge(\n tables: Tables,\n params: UpdateEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n\n const setParts: SQL[] = [\n sql`${quotedColumn(edges.props)} = ${propsJson}`,\n sql`${quotedColumn(edges.updatedAt)} = ${timestamp}`,\n ];\n\n if (params.validTo !== undefined) {\n setParts.push(sql`${quotedColumn(edges.validTo)} = ${params.validTo}`);\n }\n\n if (params.clearDeleted) {\n setParts.push(sql`${quotedColumn(edges.deletedAt)} = NULL`);\n }\n\n const setClause = sql.join(setParts, sql`, `);\n\n if (params.clearDeleted) {\n return sql`\n UPDATE ${edges}\n SET ${setClause}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n RETURNING *\n `;\n }\n\n return sql`\n UPDATE ${edges}\n SET ${setClause}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds a soft DELETE query for an edge (sets deleted_at).\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteEdge(\n tables: Tables,\n params: DeleteEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n UPDATE ${edges}\n SET ${quotedColumn(edges.deletedAt)} = ${timestamp}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds one soft-delete UPDATE covering a batch of edge ids. Matches\n * {@link buildDeleteEdge} semantics per row (idempotent via the\n * `deleted_at IS NULL` guard); the caller chunks ids to the bind budget.\n */\nexport function buildDeleteEdgesBatch(\n tables: Tables,\n params: DeleteEdgesBatchParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n UPDATE ${edges}\n SET ${quotedColumn(edges.deletedAt)} = ${timestamp}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} IN (${sqlValueList(params.ids)})\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds one hard DELETE covering a batch of edge ids. Matches\n * {@link buildHardDeleteEdge} semantics per row; the caller chunks ids to\n * the bind budget.\n */\nexport function buildHardDeleteEdgesBatch(\n tables: Tables,\n params: DeleteEdgesBatchParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n DELETE FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} IN (${sqlValueList(params.ids)})\n `;\n}\n\n/**\n * Builds a hard DELETE query for an edge (permanent removal).\n */\nexport function buildHardDeleteEdge(\n tables: Tables,\n params: HardDeleteEdgeParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n DELETE FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n `;\n}\n\n/**\n * Builds a hard DELETE query for all edges connected to a node (permanent removal).\n * Deletes edges where the node appears as either source or target.\n */\nexport function buildHardDeleteEdgesByNode(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n DELETE FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND (\n (${edges.fromKind} = ${nodeKind} AND ${edges.fromId} = ${nodeId})\n OR (${edges.toKind} = ${nodeKind} AND ${edges.toId} = ${nodeId})\n )\n `;\n}\n\n/**\n * Builds a query to count edges from a source node.\n */\nexport function buildCountEdgesFrom(\n tables: Tables,\n params: CountEdgesFromParams,\n): SQL {\n const { edges } = tables;\n\n if (params.activeOnly) {\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.validTo} IS NULL\n `;\n }\n\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a query to check if an edge exists between two nodes.\n */\nexport function buildEdgeExistsBetween(\n tables: Tables,\n params: EdgeExistsBetweenParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT 1 FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.toKind} = ${params.toKind}\n AND ${edges.toId} = ${params.toId}\n AND ${edges.deletedAt} IS NULL\n LIMIT 1\n `;\n}\n\n/**\n * Builds a query to find all edges connected to a node.\n */\nexport function buildFindEdgesConnectedTo(\n tables: Tables,\n params: FindEdgesConnectedToParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.fromKind} = ${params.nodeKind}\n AND ${edges.fromId} = ${params.nodeId}\n UNION ALL\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.toKind} = ${params.nodeKind}\n AND ${edges.toId} = ${params.nodeId}\n AND NOT (\n ${edges.fromKind} = ${params.nodeKind}\n AND ${edges.fromId} = ${params.nodeId}\n )\n `;\n}\n","/**\n * SQL builders for fulltext read operations.\n *\n * Write operations (upsert / delete, single and batch) are owned by the\n * active `FulltextStrategy` — see `src/query/dialect/fulltext-strategy.ts`.\n * A strategy-level `buildUpsert` / `buildBatchUpsert` / `buildDelete` /\n * `buildBatchDelete` means alternate backends (pg_trgm, ParadeDB/pg_search,\n * pgroonga) control the full write pipeline, not just read SQL.\n *\n * The search builder stays here because it composes fragments from the\n * strategy (`matchCondition`, `rankExpression`, `snippetExpression`) into\n * a single `SELECT` shape that is identical across dialects.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport type { FulltextStrategy } from \"../../../query/dialect/fulltext-strategy\";\nimport type {\n FulltextQueryMode,\n FulltextSearchParams,\n SqlDialect,\n} from \"../../types\";\nimport { codePointOrderKey, quotedTableName } from \"./shared\";\n\nfunction resolveMode(mode: FulltextQueryMode | undefined): FulltextQueryMode {\n return mode ?? \"websearch\";\n}\n\nexport function buildFulltextSearch(\n tableName: string,\n params: FulltextSearchParams,\n strategy: FulltextStrategy,\n dialect: SqlDialect,\n candidates?: SQL,\n): SQL {\n assertValidSearchParams(params);\n\n const mode = resolveMode(params.mode);\n const table = quotedTableName(tableName);\n const matchCondition = strategy.matchCondition(\n tableName,\n params.query,\n mode,\n params.language,\n );\n const rankExpression = strategy.rankExpression(\n tableName,\n params.query,\n mode,\n params.language,\n );\n\n const conditions: SQL[] = [\n matchCondition,\n sql`\"graph_id\" = ${params.graphId}`,\n sql`\"node_kind\" = ${params.nodeKind}`,\n ];\n if (params.minScore !== undefined) {\n conditions.push(sql`${rankExpression} >= ${params.minScore}`);\n }\n // Liveness pushdown: rank only rows whose node is current, so top-k can\n // never be crowded out by index drift (side-table rows for tombstoned or\n // expired nodes). Plain `IN (subquery)` on both engines: SQLite\n // materializes it once, and with fresh planner statistics Postgres\n // hashes it for ~0.5ms over the unfiltered scan. Like every candidate\n // membership shape (hash join, ANY(ARRAY), LATERAL all measured worse\n // or no better), it cliffs when statistics are stale — the answer is\n // `store.refreshStatistics()` after bulk loads (the documented setup),\n // not a cleverer SQL form.\n if (candidates !== undefined) {\n conditions.push(sql`\"node_id\" IN (${candidates})`);\n }\n\n const snippetExpr =\n params.includeSnippets === true && strategy.supportsSnippets\n ? strategy.snippetExpression(\n tableName,\n params.query,\n mode,\n params.language,\n )\n : sql`NULL`;\n\n const pageClause =\n params.offset === undefined || params.offset === 0 ?\n sql`LIMIT ${params.limit}`\n : sql`LIMIT ${params.limit} OFFSET ${params.offset}`;\n return sql`\n SELECT\n \"node_id\" AS node_id,\n ${rankExpression} AS score,\n ${snippetExpr} AS snippet\n FROM ${table}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${rankExpression} DESC, ${codePointOrderKey(sql.raw('\"node_id\"'), dialect)} ASC\n ${pageClause}\n `;\n}\n\nfunction assertValidSearchParams(params: FulltextSearchParams): void {\n if (!Number.isInteger(params.limit) || params.limit <= 0) {\n throw new Error(`limit must be a positive integer, got: ${params.limit}`);\n }\n if (params.minScore !== undefined && !Number.isFinite(params.minScore)) {\n throw new TypeError(\n `minScore must be a finite number, got: ${params.minScore}`,\n );\n }\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { sqlValueList } from \"../../../query/compiler/predicate-utils\";\nimport type {\n DeleteNodeParams,\n HardDeleteNodeParams,\n InsertNodeParams,\n UpdateNodeParams,\n} from \"../../types\";\nimport {\n nodeColumnList,\n quotedColumn,\n resolveValidFrom,\n sqlNull,\n type Tables,\n} from \"./shared\";\n\n/**\n * Builds an INSERT query for a node.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertNode(\n tables: Tables,\n params: InsertNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = nodeColumnList(nodes);\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES (\n ${params.graphId}, ${params.kind}, ${params.id}, ${propsJson},\n 1, ${sqlNull(resolveValidFrom(params.validFrom, timestamp))}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds an INSERT query for a node without RETURNING payload.\n */\nexport function buildInsertNodeNoReturn(\n tables: Tables,\n params: InsertNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = nodeColumnList(nodes);\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES (\n ${params.graphId}, ${params.kind}, ${params.id}, ${propsJson},\n 1, ${sqlNull(resolveValidFrom(params.validFrom, timestamp))}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n `;\n}\n\n/**\n * Builds a batched INSERT query for nodes without RETURNING payload.\n */\nexport function buildInsertNodesBatch(\n tables: Tables,\n params: readonly InsertNodeParams[],\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const columns = nodeColumnList(nodes);\n const values = params.map((nodeParams) => {\n const propsJson = JSON.stringify(nodeParams.props);\n return sql`(${nodeParams.graphId}, ${nodeParams.kind}, ${nodeParams.id}, ${propsJson}, 1, ${sqlNull(resolveValidFrom(nodeParams.validFrom, timestamp))}, ${sqlNull(nodeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n `;\n}\n\n/**\n * Builds a batched INSERT query for nodes with RETURNING *.\n */\nexport function buildInsertNodesBatchReturning(\n tables: Tables,\n params: readonly InsertNodeParams[],\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const columns = nodeColumnList(nodes);\n const values = params.map((nodeParams) => {\n const propsJson = JSON.stringify(nodeParams.props);\n return sql`(${nodeParams.graphId}, ${nodeParams.kind}, ${nodeParams.id}, ${propsJson}, 1, ${sqlNull(resolveValidFrom(nodeParams.validFrom, timestamp))}, ${sqlNull(nodeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get a node by kind and id.\n * Returns the node regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetNode(\n tables: Tables,\n graphId: string,\n kind: string,\n id: string,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${nodes.graphId} = ${graphId}\n AND ${nodes.kind} = ${kind}\n AND ${nodes.id} = ${id}\n `;\n}\n\n/**\n * Builds a SELECT query to get multiple nodes by kind and ids.\n * Returns nodes regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetNodes(\n tables: Tables,\n graphId: string,\n kind: string,\n ids: readonly string[],\n): SQL {\n const { nodes } = tables;\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${nodes.graphId} = ${graphId}\n AND ${nodes.kind} = ${kind}\n AND ${nodes.id} IN (${sqlValueList(ids)})\n `;\n}\n\n/**\n * Builds an UPDATE query for a node.\n * Uses raw column names in SET clause (required by SQL syntax).\n */\nexport function buildUpdateNode(\n tables: Tables,\n params: UpdateNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n\n const setParts: SQL[] = [\n sql`${quotedColumn(nodes.props)} = ${propsJson}`,\n sql`${quotedColumn(nodes.updatedAt)} = ${timestamp}`,\n ];\n\n if (params.incrementVersion) {\n setParts.push(\n sql`${quotedColumn(nodes.version)} = ${quotedColumn(nodes.version)} + 1`,\n );\n }\n\n if (params.validTo !== undefined) {\n setParts.push(sql`${quotedColumn(nodes.validTo)} = ${params.validTo}`);\n }\n\n if (params.clearDeleted) {\n setParts.push(sql`${quotedColumn(nodes.deletedAt)} = NULL`);\n }\n\n const setClause = sql.join(setParts, sql`, `);\n\n if (params.clearDeleted) {\n return sql`\n UPDATE ${nodes}\n SET ${setClause}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n RETURNING *\n `;\n }\n\n return sql`\n UPDATE ${nodes}\n SET ${setClause}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n AND ${nodes.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds a soft DELETE query for a node (sets deleted_at).\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteNode(\n tables: Tables,\n params: DeleteNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n UPDATE ${nodes}\n SET ${quotedColumn(nodes.deletedAt)} = ${timestamp}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n AND ${nodes.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for a node (permanent removal).\n */\nexport function buildHardDeleteNode(\n tables: Tables,\n params: HardDeleteNodeParams,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n DELETE FROM ${nodes}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type { InsertSchemaParams,SqlDialect } from \"../../types\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\ntype SchemaDialectStrategy = Readonly<{\n booleanLiteral: (value: boolean) => SQL;\n}>;\n\nfunction createSchemaDialectStrategy(dialect: SqlDialect): SchemaDialectStrategy {\n const trueLiteral = dialect === \"sqlite\" ? sql.raw(\"1\") : sql.raw(\"TRUE\");\n const falseLiteral = dialect === \"sqlite\" ? sql.raw(\"0\") : sql.raw(\"FALSE\");\n\n return {\n booleanLiteral(value: boolean): SQL {\n return value ? trueLiteral : falseLiteral;\n },\n };\n}\n\nconst SCHEMA_DIALECT_STRATEGIES: Record<SqlDialect, SchemaDialectStrategy> = {\n postgres: createSchemaDialectStrategy(\"postgres\"),\n sqlite: createSchemaDialectStrategy(\"sqlite\"),\n};\n\n/**\n * Builds an INSERT query for a schema version.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertSchema(\n tables: Tables,\n params: InsertSchemaParams,\n timestamp: string,\n dialect: SqlDialect = \"sqlite\",\n): SQL {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n const schemaDocumentJson = JSON.stringify(params.schemaDoc);\n const isActiveValue = strategy.booleanLiteral(params.isActive);\n\n const columns = sql.raw(`\"${schemaVersions.graphId.name}\", \"${schemaVersions.version.name}\", \"${schemaVersions.schemaHash.name}\", \"${schemaVersions.schemaDoc.name}\", \"${schemaVersions.createdAt.name}\", \"${schemaVersions.isActive.name}\"`);\n\n return sql`\n INSERT INTO ${schemaVersions} (${columns})\n VALUES (\n ${params.graphId}, ${params.version},\n ${params.schemaHash}, ${schemaDocumentJson},\n ${timestamp}, ${isActiveValue}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get the active schema for a graph.\n */\nexport function buildGetActiveSchema(\n tables: Tables,\n graphId: string,\n dialect: SqlDialect = \"sqlite\",\n): SQL {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n\n return sql`\n SELECT * FROM ${schemaVersions}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.isActive} = ${strategy.booleanLiteral(true)}\n `;\n}\n\n/**\n * Builds a SELECT query to get a specific schema version.\n */\nexport function buildGetSchemaVersion(\n tables: Tables,\n graphId: string,\n version: number,\n): SQL {\n const { schemaVersions } = tables;\n\n return sql`\n SELECT * FROM ${schemaVersions}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.version} = ${version}\n `;\n}\n\n/**\n * Builds UPDATE queries to set the active schema version.\n * Returns two queries: first deactivates all, second activates the specified version.\n * Uses raw column names in SET clause (SQLite doesn't allow table prefix there).\n */\nexport function buildSetActiveSchema(\n tables: Tables,\n graphId: string,\n version: number,\n dialect: SqlDialect = \"sqlite\",\n): { deactivateAll: SQL; activateVersion: SQL } {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n\n const deactivateAll = sql`\n UPDATE ${schemaVersions}\n SET ${quotedColumn(schemaVersions.isActive)} = ${strategy.booleanLiteral(false)}\n WHERE ${schemaVersions.graphId} = ${graphId}\n `;\n\n const activateVersion = sql`\n UPDATE ${schemaVersions}\n SET ${quotedColumn(schemaVersions.isActive)} = ${strategy.booleanLiteral(true)}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.version} = ${version}\n `;\n\n return { deactivateAll, activateVersion };\n}\n","import { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n DeleteUniqueParams,\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 * Builds an INSERT query for a uniqueness entry (SQLite).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing entry belongs to the same node (safe update), OR\n * 2. The existing entry 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 will show the conflicting node_id.\n */\nfunction buildInsertUniqueSqlite(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`);\n const conflictColumns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`);\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 ${quotedColumn(uniques.nodeId)} = ${params.nodeId} 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 ${quotedColumn(uniques.nodeId)} = ${params.nodeId} 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 ${quotedColumn(uniques.nodeId)} = ${params.nodeId} THEN NULL\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${quotedColumn(uniques.deletedAt)}\n END\n RETURNING ${quotedColumn(uniques.nodeId)} as node_id\n `;\n}\n\n/**\n * Builds an INSERT query for a uniqueness entry (PostgreSQL).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing entry belongs to the same node (safe update), OR\n * 2. The existing entry 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 will show the conflicting node_id.\n */\nfunction buildInsertUniquePostgres(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`);\n const conflictColumns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`);\n\n const tableName = getTableName(uniques);\n const existingColumn = (column: { name: string }) =>\n sql.raw(`\"${tableName}\".\"${column.name}\"`);\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 ${existingColumn(uniques.nodeId)} = ${params.nodeId} 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 ${existingColumn(uniques.nodeId)} = ${params.nodeId} 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 ${existingColumn(uniques.nodeId)} = ${params.nodeId} THEN NULL\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${existingColumn(uniques.deletedAt)}\n END\n RETURNING ${quotedColumn(uniques.nodeId)} as node_id\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 entries 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)` for every row —\n * ON CONFLICT DO UPDATE returns updated rows too — so the caller can\n * attribute each entry's final owner and raise a uniqueness error for the\n * ones a different live node holds.\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 dialect === \"postgres\" ?\n sql.raw(`\"${tableName}\".\"${column.name}\"`)\n : sql.raw(`\"${column.name}\"`);\n const excludedColumn = (column: Readonly<{ name: string }>) =>\n sql.raw(`excluded.\"${column.name}\"`);\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 ${existingColumn(uniques.nodeId)} = ${excludedColumn(uniques.nodeId)} 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 ${existingColumn(uniques.nodeId)} = ${excludedColumn(uniques.nodeId)} 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 ${existingColumn(uniques.nodeId)} = ${excludedColumn(uniques.nodeId)} 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 `;\n}\n\n/**\n * Builds a soft DELETE query for a uniqueness entry.\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteUnique(\n tables: Tables,\n params: DeleteUniqueParams,\n timestamp: string,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n UPDATE ${uniques}\n SET ${quotedColumn(uniques.deletedAt)} = ${timestamp}\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 hard DELETE query for all uniqueness entries for a node.\n */\nexport function buildHardDeleteUniquesByNode(\n tables: Tables,\n graphId: string,\n nodeId: string,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n DELETE FROM ${uniques}\n WHERE ${uniques.graphId} = ${graphId}\n AND ${uniques.nodeId} = ${nodeId}\n `;\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","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type { FulltextStrategy } from \"../../../query/dialect/fulltext-strategy\";\nimport { isPresent } from \"../../../utils/presence\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteEdgesBatchParams,\n DeleteFulltextBatchParams,\n DeleteFulltextParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n EdgeExistsBetweenParams,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n FulltextSearchParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n HybridSearchParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertSchemaParams,\n InsertUniqueParams,\n SqlDialect,\n UpdateEdgeParams,\n UpdateNodeParams,\n UpsertFulltextBatchParams,\n UpsertFulltextParams,\n} from \"../../types\";\nimport { nowIso } from \"../row-mappers\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\nimport { buildClearGraph, type ClearGraphStatement } from \"./clear\";\nimport {\n buildCountEdgesByKind,\n buildCountNodesByKind,\n buildFindEdgesByKind,\n buildFindNodesByKind,\n} from \"./collections\";\nimport {\n buildCountEdgesFrom,\n buildDeleteEdge,\n buildDeleteEdgesBatch,\n buildEdgeExistsBetween,\n buildFindEdgesConnectedTo,\n buildGetEdge,\n buildGetEdges,\n buildHardDeleteEdge,\n buildHardDeleteEdgesBatch,\n buildHardDeleteEdgesByNode,\n buildInsertEdge,\n buildInsertEdgeNoReturn,\n buildInsertEdgesBatch,\n buildInsertEdgesBatchReturning,\n buildUpdateEdge,\n} from \"./edges\";\nimport { buildFulltextSearch } from \"./fulltext\";\nimport { buildHybridSearchStatement, hybridCandidatesRef } from \"./hybrid\";\nimport {\n buildDeleteNode,\n buildGetNode,\n buildGetNodes,\n buildHardDeleteNode,\n buildInsertNode,\n buildInsertNodeNoReturn,\n buildInsertNodesBatch,\n buildInsertNodesBatchReturning,\n buildUpdateNode,\n} from \"./nodes\";\nimport {\n buildGetActiveSchema,\n buildGetSchemaVersion,\n buildInsertSchema,\n buildSetActiveSchema,\n} from \"./schema\";\nimport { liveNodeIdsSubquery, type Tables } from \"./shared\";\nimport {\n buildCheckUnique,\n buildCheckUniqueBatch,\n buildDeleteUnique,\n buildHardDeleteUniquesByNode,\n buildInsertUnique,\n buildInsertUniqueBatch,\n} from \"./uniques\";\n\nexport type CommonOperationStrategy = Readonly<{\n buildUpsertFulltext: (\n params: UpsertFulltextParams,\n timestamp: string,\n ) => readonly SQL[];\n buildDeleteFulltext: (params: DeleteFulltextParams) => readonly SQL[];\n buildDeleteFulltextByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ) => readonly SQL[];\n buildUpsertFulltextBatch: (\n params: UpsertFulltextBatchParams,\n timestamp: string,\n ) => readonly SQL[];\n buildDeleteFulltextBatch: (\n params: DeleteFulltextBatchParams,\n ) => readonly SQL[];\n buildFulltextSearch: (params: FulltextSearchParams) => SQL;\n /**\n * Subquery of live node ids for one `(graphId, nodeKind)` — the candidate\n * set passed to `VectorStrategy.buildSearch` so vector top-k, like the\n * fulltext search above, is computed over live rows in SQL.\n */\n buildLiveNodeIds: (graphId: string, nodeKind: string) => SQL;\n /**\n * Composes the single-statement hybrid search: the caller supplies the\n * vector source SQL (strategy-owned); this member builds the fulltext\n * source over the same candidate set and fuses both via\n * {@link buildHybridSearchStatement}.\n */\n buildHybridSearch: (\n params: HybridSearchParams,\n vectorSql: SQL,\n vectorScoreDescending: boolean,\n ) => SQL;\n buildInsertNode: (params: InsertNodeParams, timestamp: string) => SQL;\n buildInsertNodeNoReturn: (\n params: InsertNodeParams,\n timestamp: string,\n ) => SQL;\n buildInsertNodesBatch: (\n params: readonly InsertNodeParams[],\n timestamp: string,\n ) => SQL;\n buildInsertNodesBatchReturning: (\n params: readonly InsertNodeParams[],\n timestamp: string,\n ) => SQL;\n buildGetNode: (graphId: string, kind: string, id: string) => SQL;\n buildGetNodes: (graphId: string, kind: string, ids: readonly string[]) => SQL;\n buildUpdateNode: (params: UpdateNodeParams, timestamp: string) => SQL;\n buildDeleteNode: (params: DeleteNodeParams, timestamp: string) => SQL;\n buildHardDeleteNode: (params: HardDeleteNodeParams) => SQL;\n buildInsertEdge: (params: InsertEdgeParams, timestamp: string) => SQL;\n buildInsertEdgeNoReturn: (\n params: InsertEdgeParams,\n timestamp: string,\n ) => SQL;\n buildInsertEdgesBatch: (\n params: readonly InsertEdgeParams[],\n timestamp: string,\n ) => SQL;\n buildInsertEdgesBatchReturning: (\n params: readonly InsertEdgeParams[],\n timestamp: string,\n ) => SQL;\n buildGetEdge: (graphId: string, id: string) => SQL;\n buildGetEdges: (graphId: string, ids: readonly string[]) => SQL;\n buildUpdateEdge: (params: UpdateEdgeParams, timestamp: string) => SQL;\n buildDeleteEdge: (params: DeleteEdgeParams, timestamp: string) => SQL;\n buildDeleteEdgesBatch: (\n params: DeleteEdgesBatchParams,\n timestamp: string,\n ) => SQL;\n buildHardDeleteEdge: (params: HardDeleteEdgeParams) => SQL;\n buildHardDeleteEdgesBatch: (params: DeleteEdgesBatchParams) => SQL;\n buildHardDeleteEdgesByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ) => SQL;\n buildCountEdgesFrom: (params: CountEdgesFromParams) => SQL;\n buildEdgeExistsBetween: (params: EdgeExistsBetweenParams) => SQL;\n buildFindEdgesConnectedTo: (params: FindEdgesConnectedToParams) => SQL;\n buildFindNodesByKind: (params: FindNodesByKindParams) => SQL;\n buildCountNodesByKind: (params: CountNodesByKindParams) => SQL;\n buildFindEdgesByKind: (params: FindEdgesByKindParams) => SQL;\n buildCountEdgesByKind: (params: CountEdgesByKindParams) => SQL;\n buildInsertUnique: (params: InsertUniqueParams) => SQL;\n buildInsertUniqueBatch: (entries: readonly InsertUniqueParams[]) => SQL;\n buildDeleteUnique: (params: DeleteUniqueParams, timestamp: string) => SQL;\n buildHardDeleteUniquesByNode: (graphId: string, nodeId: string) => SQL;\n buildCheckUnique: (params: CheckUniqueParams) => SQL;\n buildCheckUniqueBatch: (params: CheckUniqueBatchParams) => SQL;\n buildGetActiveSchema: (graphId: string) => SQL;\n buildInsertSchema: (params: InsertSchemaParams, timestamp: string) => SQL;\n buildGetSchemaVersion: (graphId: string, version: number) => SQL;\n buildSetActiveSchema: (\n graphId: string,\n version: number,\n ) => Readonly<{ activateVersion: SQL; deactivateAll: SQL }>;\n buildTableExists: (tableName: string) => SQL;\n buildClearGraph: (graphId: string) => readonly ClearGraphStatement[];\n}>;\n\n/**\n * Vector embedding operations are no longer part of the dialect operation\n * strategy: the active {@link VectorStrategy} owns all embedding storage\n * and SQL (upsert / delete / search / index lifecycle) per-`(kind, field)`,\n * so both dialects share the same operation strategy shape.\n */\nexport type SqliteOperationStrategy = CommonOperationStrategy;\n\nexport type PostgresOperationStrategy = CommonOperationStrategy;\n\ntype TableOperationBuilder = (\n tables: Tables,\n ...args: never[]\n) => SQL;\n\ntype TableOperationBuilderMap = Readonly<Record<string, TableOperationBuilder>>;\n\ntype BoundTableOperationBuilderMap<TBuilders extends TableOperationBuilderMap> = Readonly<{\n [K in keyof TBuilders]: TBuilders[K] extends (\n tables: Tables,\n ...args: infer TArguments\n ) => SQL\n ? (...args: TArguments) => SQL\n : never;\n}>;\n\nfunction bindTableOperationBuilders<TBuilders extends TableOperationBuilderMap>(\n tables: Tables,\n builders: TBuilders,\n): BoundTableOperationBuilderMap<TBuilders> {\n const boundEntries = Object.entries(builders).map(([name, builder]) => {\n function boundBuilder(...args: never[]): SQL {\n return builder(tables, ...args);\n }\n\n return [name, boundBuilder] as const;\n });\n\n return Object.fromEntries(boundEntries) as BoundTableOperationBuilderMap<TBuilders>;\n}\n\nconst COMMON_TABLE_OPERATION_BUILDERS = {\n buildInsertNode,\n buildInsertNodeNoReturn,\n buildInsertNodesBatch,\n buildInsertNodesBatchReturning,\n buildGetNode,\n buildGetNodes,\n buildUpdateNode,\n buildDeleteNode,\n buildHardDeleteNode,\n buildInsertEdge,\n buildInsertEdgeNoReturn,\n buildInsertEdgesBatch,\n buildInsertEdgesBatchReturning,\n buildGetEdge,\n buildGetEdges,\n buildUpdateEdge,\n buildDeleteEdge,\n buildDeleteEdgesBatch,\n buildHardDeleteEdge,\n buildHardDeleteEdgesBatch,\n buildHardDeleteEdgesByNode,\n buildCountEdgesFrom,\n buildEdgeExistsBetween,\n buildFindEdgesConnectedTo,\n buildFindNodesByKind,\n buildCountNodesByKind,\n buildFindEdgesByKind,\n buildCountEdgesByKind,\n buildDeleteUnique,\n buildHardDeleteUniquesByNode,\n buildCheckUnique,\n buildCheckUniqueBatch,\n buildGetSchemaVersion,\n} as const satisfies TableOperationBuilderMap;\n\nfunction createCommonOperationStrategy(\n tables: Tables,\n dialect: SqlDialect,\n fulltextStrategy: FulltextStrategy,\n): CommonOperationStrategy {\n const tableOperations = bindTableOperationBuilders(\n tables,\n COMMON_TABLE_OPERATION_BUILDERS,\n );\n const fulltextTable = tables.fulltextTableName;\n\n // All fulltext write SQL is owned by the active strategy — so swapping\n // to pg_trgm / ParadeDB / pgroonga swaps the full CRUD pipeline, not\n // just the read-side fragments.\n const fulltextBuilders = {\n buildUpsertFulltext: (\n params: UpsertFulltextParams,\n timestamp: string,\n ): readonly SQL[] =>\n fulltextStrategy.buildUpsert(fulltextTable, params, timestamp),\n buildDeleteFulltext: (params: DeleteFulltextParams): readonly SQL[] =>\n fulltextStrategy.buildDelete(fulltextTable, params),\n buildDeleteFulltextByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ): readonly SQL[] =>\n fulltextStrategy.buildDelete(fulltextTable, {\n graphId,\n nodeKind,\n nodeId,\n }),\n buildUpsertFulltextBatch: (\n params: UpsertFulltextBatchParams,\n timestamp: string,\n ): readonly SQL[] =>\n fulltextStrategy.buildBatchUpsert(fulltextTable, params, timestamp),\n buildDeleteFulltextBatch: (\n params: DeleteFulltextBatchParams,\n ): readonly SQL[] =>\n fulltextStrategy.buildBatchDelete(fulltextTable, params),\n buildFulltextSearch: (params: FulltextSearchParams): SQL =>\n buildFulltextSearch(\n fulltextTable,\n params,\n fulltextStrategy,\n dialect,\n // Store-compiled candidates (predicates + subclass + currency)\n // take precedence; the live-node default covers direct backend use.\n params.candidates ??\n liveNodeIdsSubquery(tables.nodes, params.graphId, params.nodeKind, nowIso()),\n ),\n buildLiveNodeIds: (graphId: string, nodeKind: string): SQL =>\n liveNodeIdsSubquery(tables.nodes, graphId, nodeKind, nowIso()),\n buildHybridSearch: (\n params: HybridSearchParams,\n vectorSql: SQL,\n vectorScoreDescending: boolean,\n ): SQL => {\n const candidates =\n params.candidates ??\n liveNodeIdsSubquery(\n tables.nodes,\n params.graphId,\n params.nodeKind,\n nowIso(),\n );\n const fulltextSql = buildFulltextSearch(\n fulltextTable,\n {\n graphId: params.graphId,\n nodeKind: params.nodeKind,\n query: params.fulltext.query,\n limit: params.fulltext.k,\n ...(params.fulltext.mode === undefined ?\n {}\n : { mode: params.fulltext.mode }),\n ...(params.fulltext.language === undefined ?\n {}\n : { language: params.fulltext.language }),\n ...(params.fulltext.minScore === undefined ?\n {}\n : { minScore: params.fulltext.minScore }),\n ...(params.fulltext.includeSnippets === undefined ?\n {}\n : { includeSnippets: params.fulltext.includeSnippets }),\n },\n fulltextStrategy,\n dialect,\n // Reference, not copy: the statement evaluates the shared\n // tg_hybrid_cand CTE once for both legs.\n hybridCandidatesRef(),\n );\n return buildHybridSearchStatement({\n candidatesSql: candidates,\n vectorSql,\n vectorScoreDescending,\n fulltextSql,\n nodes: tables.nodes,\n dialect,\n graphId: params.graphId,\n nodeKind: params.nodeKind,\n fusionK: params.fusion.k,\n vectorWeight: params.fusion.vectorWeight,\n fulltextWeight: params.fusion.fulltextWeight,\n limit: params.limit,\n offset: params.offset ?? 0,\n });\n },\n };\n\n return {\n ...tableOperations,\n ...fulltextBuilders,\n buildInsertUnique(params: InsertUniqueParams): SQL {\n return buildInsertUnique(tables, dialect, params);\n },\n buildInsertUniqueBatch(entries: readonly InsertUniqueParams[]): SQL {\n return buildInsertUniqueBatch(tables, dialect, entries);\n },\n buildGetActiveSchema(graphId: string): SQL {\n return buildGetActiveSchema(tables, graphId, dialect);\n },\n buildInsertSchema(params: InsertSchemaParams, timestamp: string): SQL {\n return buildInsertSchema(tables, params, timestamp, dialect);\n },\n buildSetActiveSchema(\n graphId: string,\n version: number,\n ): Readonly<{ activateVersion: SQL; deactivateAll: SQL }> {\n return buildSetActiveSchema(tables, graphId, version, dialect);\n },\n buildTableExists(tableName: string): SQL {\n if (dialect === \"postgres\") {\n // `pg_table_is_visible` resolves visibility through the session\n // `search_path` — exactly how the unqualified DELETE / ANALYZE this\n // probe guards resolves `tableName`. Scoping to `current_schema()`\n // instead would report the table missing whenever it lives in a\n // search_path schema that is not the current one (a shared-schema /\n // multi-tenant deployment), skipping a statement that would in fact\n // have hit the table — a guard narrower than what it protects.\n return sql`\n SELECT c.relname AS table_name\n FROM pg_catalog.pg_class AS c\n WHERE c.relname = ${tableName}\n AND c.relkind IN ('r', 'p', 'v', 'm', 'f')\n AND pg_catalog.pg_table_is_visible(c.oid)\n LIMIT 1\n `;\n }\n return sql`SELECT name AS table_name FROM sqlite_master WHERE type IN ('table', 'view') AND name = ${tableName}`;\n },\n buildClearGraph(graphId: string): readonly ClearGraphStatement[] {\n return buildClearGraph(tables, graphId);\n },\n };\n}\n\n/**\n * Interprets the row returned by {@link CommonOperationStrategy.buildTableExists}.\n * The probe selects a single non-null column only when the table is present, so\n * an absent row — or a row whose columns are all null — means the table does not\n * exist. Shared by `clear()` and `refreshStatistics()` so the two callers can't\n * drift on how the probe result is read.\n */\nexport function tableExistsFromRow(\n row: Record<string, unknown> | undefined,\n): boolean {\n if (row === undefined) return false;\n return Object.values(row).some((value) => isPresent(value));\n}\n\n/**\n * Wraps a {@link CommonOperationStrategy.buildTableExists} probe in a\n * per-instance cache. A table confirmed present is cached by default for the\n * backend's lifetime, but callers may disable positive caching when the probe is\n * sensitive to session state such as PostgreSQL `search_path`. Missing tables\n * stay re-probable by default so a later focused bootstrap that creates one is\n * picked up; callers on a non-DDL path can opt into negative caching. Shared by\n * `clear()`'s ignore-missing guard and `refreshStatistics()`'s recorded ANALYZE\n * so the two cannot drift on caching or on how the probe row is read.\n *\n * `probe` runs the existence query and returns the single result row (or\n * `undefined`); the caller supplies it because the two sites execute through\n * different adapters (a single-row `execGet` vs. a row-array `execute`).\n */\nexport type TableExistenceCacheOptions = Readonly<{\n cacheExisting?: boolean | undefined;\n cacheMissing?: boolean | undefined;\n}>;\n\nexport function createCachedTableExistence(\n probe: (tableName: string) => Promise<Record<string, unknown> | undefined>,\n options?: TableExistenceCacheOptions,\n): (tableName: string) => Promise<boolean> {\n const cacheExisting = options?.cacheExisting !== false;\n const cacheMissing = options?.cacheMissing === true;\n const confirmedExisting = new Set<string>();\n const confirmedMissing = new Set<string>();\n return async function tableExists(tableName: string): Promise<boolean> {\n if (confirmedExisting.has(tableName)) return true;\n if (confirmedMissing.has(tableName)) return false;\n const exists = tableExistsFromRow(await probe(tableName));\n if (exists && cacheExisting) {\n confirmedExisting.add(tableName);\n }\n if (!exists && cacheMissing) {\n confirmedMissing.add(tableName);\n }\n return exists;\n };\n}\n\nexport function createSqliteOperationStrategy(\n tables: SqliteTables,\n fulltextStrategy: FulltextStrategy,\n): SqliteOperationStrategy {\n return createCommonOperationStrategy(tables, \"sqlite\", fulltextStrategy);\n}\n\nexport function createPostgresOperationStrategy(\n tables: PostgresTables,\n fulltextStrategy: FulltextStrategy,\n): PostgresOperationStrategy {\n return createCommonOperationStrategy(tables, \"postgres\", fulltextStrategy);\n}\n","import { is, type SQL } from \"drizzle-orm\";\n\nimport {\n ConfigurationError,\n DatabaseOperationError,\n MigrationError,\n SchemaContentConflictError,\n StaleVersionError,\n UniquenessError,\n} from \"../../errors\";\nimport { chunk as chunkArray } from \"../../utils/array\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n CommitSchemaVersionParams,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteEdgesBatchParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n EdgeExistsBetweenParams,\n EdgeRow,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertUniqueParams,\n NodeRow,\n SchemaVersionRow,\n SetActiveVersionParams,\n TransactionBackend,\n UniqueRow,\n UpdateEdgeParams,\n UpdateNodeParams,\n} from \"../types\";\nimport {\n type CommonOperationStrategy,\n createCachedTableExistence,\n type TableExistenceCacheOptions,\n} from \"./operations/strategy\";\nimport { nowIso as defaultNowIso } from \"./row-mappers\";\n\n/**\n * The internal operation backend — what `createCommonOperationBackend`\n * returns. Includes `commitSchemaVersion` and `setActiveVersion` so the\n * top-level backend wrappers can call them on a fresh tx-scoped\n * operation backend (created inside the dialect-specific\n * write-locking transaction). These methods are deliberately NOT on\n * the public `TransactionBackend` type — see the comment there.\n */\nexport type CommonOperationBackend = Pick<\n TransactionBackend,\n | \"checkUnique\"\n | \"checkUniqueBatch\"\n | \"clearGraph\"\n | \"countEdgesByKind\"\n | \"countEdgesFrom\"\n | \"countNodesByKind\"\n | \"deleteEdge\"\n | \"deleteEdgesBatch\"\n | \"deleteNode\"\n | \"deleteUnique\"\n | \"edgeExistsBetween\"\n | \"executeStatement\"\n | \"findEdgesByKind\"\n | \"findEdgesConnectedTo\"\n | \"findNodesByKind\"\n | \"getActiveSchema\"\n | \"getEdge\"\n | \"getEdges\"\n | \"getNode\"\n | \"getNodes\"\n | \"getSchemaVersion\"\n | \"hardDeleteEdge\"\n | \"hardDeleteEdgesBatch\"\n | \"hardDeleteNode\"\n | \"insertEdge\"\n | \"insertEdgeNoReturn\"\n | \"insertEdgesBatch\"\n | \"insertEdgesBatchReturning\"\n | \"insertNode\"\n | \"insertNodeNoReturn\"\n | \"insertNodesBatch\"\n | \"insertNodesBatchReturning\"\n | \"insertUnique\"\n | \"insertUniqueBatch\"\n | \"updateEdge\"\n | \"updateNode\"\n> &\n Readonly<{\n commitSchemaVersion: (\n params: CommitSchemaVersionParams,\n ) => Promise<SchemaVersionRow>;\n setActiveVersion: (params: SetActiveVersionParams) => Promise<void>;\n }>;\n\n/**\n * The full internal shape the dialect operation-backend factories\n * build: a {@link TransactionBackend} that also exposes the schema-write\n * methods ({@link CommonOperationBackend}). Internal callers holding the\n * dialect's write-lock (`runSchemaWriteTransaction`) use it directly;\n * the public `transaction()` / `adoptTransaction()` boundary narrows it\n * to `TransactionBackend` so user callbacks can't reach\n * `commitSchemaVersion` / `setActiveVersion` and bypass the lock.\n */\nexport type InternalOperationBackend = TransactionBackend &\n CommonOperationBackend;\n\n/**\n * Assert an externally-supplied transaction handle is the expected\n * Drizzle dialect, narrowing it for `adoptTransaction`. A wrong-dialect\n * handle would otherwise surface as an opaque driver error mid-\n * transaction; this fails it loudly at the boundary instead.\n */\nexport function assertAdoptedDialect<T>(\n externalTx: unknown,\n brand: Parameters<typeof is>[1],\n backend: \"postgres\" | \"sqlite\",\n): asserts externalTx is T {\n if (is(externalTx, brand)) return;\n const label = backend === \"postgres\" ? \"Postgres\" : \"SQLite\";\n throw new ConfigurationError(\n `adoptTransaction received a handle that is not a ${label} Drizzle ` +\n `transaction. Pass the \\`tx\\` from a ${label} ` +\n `\\`db.transaction(...)\\` opened on this backend's connection.`,\n { backend, capability: \"adoptTransaction\" },\n );\n}\n\ntype OperationBackendExecution = Readonly<{\n execAll: <TRow>(query: SQL) => Promise<readonly TRow[]>;\n execGet: <TRow>(query: SQL) => Promise<TRow | undefined>;\n execRun: (query: SQL) => Promise<void>;\n}>;\n\ntype OperationBackendBatchConfig = Readonly<{\n checkUniqueBatchChunkSize: number;\n edgeInsertBatchSize: number;\n getEdgesChunkSize: number;\n getNodesChunkSize: number;\n nodeInsertBatchSize: number;\n uniqueInsertBatchSize: number;\n}>;\n\ntype OperationBackendRowMappers = Readonly<{\n toEdgeRow: (row: Record<string, unknown>) => EdgeRow;\n toNodeRow: (row: Record<string, unknown>) => NodeRow;\n toSchemaVersionRow: (row: Record<string, unknown>) => SchemaVersionRow;\n toUniqueRow: (row: Record<string, unknown>) => UniqueRow;\n}>;\n\ntype CreateCommonOperationBackendOptions = Readonly<{\n batchConfig: OperationBackendBatchConfig;\n execution: OperationBackendExecution;\n nowIso?: (() => string) | undefined;\n operationStrategy: CommonOperationStrategy;\n rowMappers: OperationBackendRowMappers;\n tableExistenceCache?: TableExistenceCacheOptions | undefined;\n}>;\n\nfunction verifyExpectedActiveVersion(\n graphId: string,\n expected: CommitSchemaVersionParams[\"expected\"],\n actualActiveVersion: number,\n): void {\n const expectedVersion = expected.kind === \"active\" ? expected.version : 0;\n if (actualActiveVersion !== expectedVersion) {\n throw new StaleVersionError({\n graphId,\n expected: expectedVersion,\n actual: actualActiveVersion,\n });\n }\n}\n\nexport function createCommonOperationBackend(\n options: CreateCommonOperationBackendOptions,\n): CommonOperationBackend {\n const { batchConfig, execution, operationStrategy, rowMappers } = options;\n const nowIso = options.nowIso ?? defaultNowIso;\n\n // The clear() existence pre-check is the only thing that probes these tables.\n // Positive results are cached by default because on standard schemas the\n // recorded DDL is stable; Postgres disables that cache because visibility is\n // search_path-sensitive. Missing tables stay re-probable unless a caller opts\n // into negative caching.\n const requiredClearTableExists = createCachedTableExistence((tableName) =>\n execution.execGet<Record<string, unknown>>(\n operationStrategy.buildTableExists(tableName),\n ),\n options.tableExistenceCache,\n );\n\n async function runIgnorableClearStatement(\n statement: Readonly<{\n query: SQL;\n ignoreMissingTable?: boolean;\n requiredTableName?: string;\n }>,\n ): Promise<void> {\n // The existence pre-check is the guard for tables that predate a schema\n // addition (e.g. the recorded relations). It works in or out of a\n // transaction, unlike a SAVEPOINT — which is invalid in autocommit mode on\n // PostgreSQL and would break clear() on a non-transactional backend.\n if (\n statement.ignoreMissingTable === true &&\n statement.requiredTableName !== undefined &&\n !(await requiredClearTableExists(statement.requiredTableName))\n ) {\n return;\n }\n await execution.execRun(statement.query);\n }\n\n // Returns 0 when no row is currently active — that's the sentinel\n // `expected: { kind: \"initial\" }` matches against.\n async function readActiveVersion(graphId: string): Promise<number> {\n const row = await execution.execGet<Record<string, unknown>>(\n operationStrategy.buildGetActiveSchema(graphId),\n );\n return row === undefined ? 0 : rowMappers.toSchemaVersionRow(row).version;\n }\n\n return {\n async executeStatement(query: SQL): Promise<void> {\n await execution.execRun(query);\n },\n\n async insertNode(params: InsertNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertNode(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Insert node failed: no row returned\", { operation: \"insert\", entity: \"node\" });\n return rowMappers.toNodeRow(row);\n },\n\n async insertNodeNoReturn(params: InsertNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertNodeNoReturn(params, timestamp);\n await execution.execRun(query);\n },\n\n async insertNodesBatch(params: readonly InsertNodeParams[]): Promise<void> {\n if (params.length === 0) {\n return;\n }\n const timestamp = nowIso();\n for (const chunk of chunkArray(params, batchConfig.nodeInsertBatchSize)) {\n const query = operationStrategy.buildInsertNodesBatch(chunk, timestamp);\n await execution.execRun(query);\n }\n },\n\n async insertNodesBatchReturning(\n params: readonly InsertNodeParams[],\n ): Promise<readonly NodeRow[]> {\n if (params.length === 0) {\n return [];\n }\n const timestamp = nowIso();\n const allRows: NodeRow[] = [];\n for (const chunk of chunkArray(params, batchConfig.nodeInsertBatchSize)) {\n const query =\n operationStrategy.buildInsertNodesBatchReturning(chunk, timestamp);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toNodeRow(row)));\n }\n return allRows;\n },\n\n async getNode(\n graphId: string,\n kind: string,\n id: string,\n ): Promise<NodeRow | undefined> {\n const query = operationStrategy.buildGetNode(graphId, kind, id);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toNodeRow(row) : undefined;\n },\n\n async getNodes(\n graphId: string,\n kind: string,\n ids: readonly string[],\n ): Promise<readonly NodeRow[]> {\n if (ids.length === 0) return [];\n const allRows: NodeRow[] = [];\n for (const chunk of chunkArray(ids, batchConfig.getNodesChunkSize)) {\n const query = operationStrategy.buildGetNodes(graphId, kind, chunk);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toNodeRow(row)));\n }\n return allRows;\n },\n\n async updateNode(params: UpdateNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildUpdateNode(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Update node failed: no row returned\", { operation: \"update\", entity: \"node\" });\n return rowMappers.toNodeRow(row);\n },\n\n async deleteNode(params: DeleteNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteNode(params, timestamp);\n await execution.execRun(query);\n },\n\n // IMPORTANT: This cascade is not atomic. Callers must ensure this runs\n // within a transaction to prevent partial deletion on intermediate failure.\n //\n // Embeddings are NOT cleaned up here: they live in per-`(nodeKind,\n // fieldPath)` strategy-owned tables addressable only with the slot\n // context the graph-agnostic backend lacks. The store's hard-delete\n // path (`executeNodeHardDelete`) drives `deleteNodeEmbeddings`, which\n // resolves each embedding field and routes a per-field\n // `backend.deleteEmbedding` through the active vector strategy.\n async hardDeleteNode(params: HardDeleteNodeParams): Promise<void> {\n const deleteUniquesQuery = operationStrategy.buildHardDeleteUniquesByNode(\n params.graphId,\n params.id,\n );\n await execution.execRun(deleteUniquesQuery);\n\n const deleteFulltextStatements =\n operationStrategy.buildDeleteFulltextByNode(\n params.graphId,\n params.kind,\n params.id,\n );\n for (const stmt of deleteFulltextStatements) {\n await execution.execRun(stmt);\n }\n\n const deleteEdgesQuery = operationStrategy.buildHardDeleteEdgesByNode(\n params.graphId,\n params.kind,\n params.id,\n );\n await execution.execRun(deleteEdgesQuery);\n\n const query = operationStrategy.buildHardDeleteNode(params);\n await execution.execRun(query);\n },\n\n async insertEdge(params: InsertEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertEdge(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Insert edge failed: no row returned\", { operation: \"insert\", entity: \"edge\" });\n return rowMappers.toEdgeRow(row);\n },\n\n async insertEdgeNoReturn(params: InsertEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertEdgeNoReturn(params, timestamp);\n await execution.execRun(query);\n },\n\n async insertEdgesBatch(params: readonly InsertEdgeParams[]): Promise<void> {\n if (params.length === 0) {\n return;\n }\n const timestamp = nowIso();\n for (const chunk of chunkArray(params, batchConfig.edgeInsertBatchSize)) {\n const query = operationStrategy.buildInsertEdgesBatch(chunk, timestamp);\n await execution.execRun(query);\n }\n },\n\n async insertEdgesBatchReturning(\n params: readonly InsertEdgeParams[],\n ): Promise<readonly EdgeRow[]> {\n if (params.length === 0) {\n return [];\n }\n const timestamp = nowIso();\n const allRows: EdgeRow[] = [];\n for (const chunk of chunkArray(params, batchConfig.edgeInsertBatchSize)) {\n const query =\n operationStrategy.buildInsertEdgesBatchReturning(chunk, timestamp);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toEdgeRow(row)));\n }\n return allRows;\n },\n\n async getEdge(graphId: string, id: string): Promise<EdgeRow | undefined> {\n const query = operationStrategy.buildGetEdge(graphId, id);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toEdgeRow(row) : undefined;\n },\n\n async getEdges(\n graphId: string,\n ids: readonly string[],\n ): Promise<readonly EdgeRow[]> {\n if (ids.length === 0) return [];\n const allRows: EdgeRow[] = [];\n for (const chunk of chunkArray(ids, batchConfig.getEdgesChunkSize)) {\n const query = operationStrategy.buildGetEdges(graphId, chunk);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toEdgeRow(row)));\n }\n return allRows;\n },\n\n async updateEdge(params: UpdateEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildUpdateEdge(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Update edge failed: no row returned\", { operation: \"update\", entity: \"edge\" });\n return rowMappers.toEdgeRow(row);\n },\n\n async deleteEdge(params: DeleteEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteEdge(params, timestamp);\n await execution.execRun(query);\n },\n\n async hardDeleteEdge(params: HardDeleteEdgeParams): Promise<void> {\n const query = operationStrategy.buildHardDeleteEdge(params);\n await execution.execRun(query);\n },\n\n async deleteEdgesBatch(params: DeleteEdgesBatchParams): Promise<void> {\n if (params.ids.length === 0) return;\n const timestamp = nowIso();\n // The soft-delete UPDATE binds one extra parameter (the `deleted_at`\n // timestamp) on top of the graphId + id-list that `getEdgesChunkSize`\n // is budgeted for, so a full chunk would overflow the bind limit by 1.\n // Reserve a slot for the timestamp. The hard-delete batch below has no\n // such extra bind and keeps the full chunk size.\n const softDeleteChunkSize = Math.max(1, batchConfig.getEdgesChunkSize - 1);\n for (const chunk of chunkArray(params.ids, softDeleteChunkSize)) {\n const query = operationStrategy.buildDeleteEdgesBatch(\n { graphId: params.graphId, ids: chunk },\n timestamp,\n );\n await execution.execRun(query);\n }\n },\n\n async hardDeleteEdgesBatch(params: DeleteEdgesBatchParams): Promise<void> {\n if (params.ids.length === 0) return;\n for (const chunk of chunkArray(params.ids, batchConfig.getEdgesChunkSize)) {\n const query = operationStrategy.buildHardDeleteEdgesBatch({\n graphId: params.graphId,\n ids: chunk,\n });\n await execution.execRun(query);\n }\n },\n\n async countEdgesFrom(params: CountEdgesFromParams): Promise<number> {\n const query = operationStrategy.buildCountEdgesFrom(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async edgeExistsBetween(params: EdgeExistsBetweenParams): Promise<boolean> {\n const query = operationStrategy.buildEdgeExistsBetween(params);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row !== undefined;\n },\n\n async findEdgesConnectedTo(\n params: FindEdgesConnectedToParams,\n ): Promise<readonly EdgeRow[]> {\n const query = operationStrategy.buildFindEdgesConnectedTo(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toEdgeRow(row));\n },\n\n async findNodesByKind(\n params: FindNodesByKindParams,\n ): Promise<readonly NodeRow[]> {\n const query = operationStrategy.buildFindNodesByKind(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toNodeRow(row));\n },\n\n async countNodesByKind(params: CountNodesByKindParams): Promise<number> {\n const query = operationStrategy.buildCountNodesByKind(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async findEdgesByKind(\n params: FindEdgesByKindParams,\n ): Promise<readonly EdgeRow[]> {\n const query = operationStrategy.buildFindEdgesByKind(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toEdgeRow(row));\n },\n\n async countEdgesByKind(params: CountEdgesByKindParams): Promise<number> {\n const query = operationStrategy.buildCountEdgesByKind(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async insertUnique(params: InsertUniqueParams): Promise<void> {\n const query = operationStrategy.buildInsertUnique(params);\n const result = await execution.execGet<{ node_id: string }>(query);\n\n if (result && result.node_id !== params.nodeId) {\n throw new UniquenessError({\n constraintName: params.constraintName,\n kind: params.nodeKind,\n existingId: result.node_id,\n newId: params.nodeId,\n fields: [],\n });\n }\n },\n\n async insertUniqueBatch(\n entries: readonly InsertUniqueParams[],\n ): Promise<void> {\n if (entries.length === 0) return;\n\n // A multi-row upsert cannot affect one row twice, so collapse exact\n // duplicates and reject two entries claiming the same conflict target\n // for different nodes up front. Batch validation pre-rejects real\n // conflicts, so this is a defensive invariant, not a semantic path.\n const targetKey = (entry: InsertUniqueParams): string =>\n `${entry.nodeKind}\\u0000${entry.constraintName}\\u0000${entry.key}`;\n const byTarget = new Map<string, InsertUniqueParams>();\n for (const entry of entries) {\n const existing = byTarget.get(targetKey(entry));\n if (existing === undefined) {\n byTarget.set(targetKey(entry), entry);\n continue;\n }\n if (existing.nodeId !== entry.nodeId) {\n throw new UniquenessError({\n constraintName: entry.constraintName,\n kind: entry.nodeKind,\n existingId: existing.nodeId,\n newId: entry.nodeId,\n fields: [],\n });\n }\n }\n const deduped = [...byTarget.values()];\n\n for (const chunk of chunkArray(\n deduped,\n batchConfig.uniqueInsertBatchSize,\n )) {\n const query = operationStrategy.buildInsertUniqueBatch(chunk);\n const rows = await execution.execAll<{\n node_kind: string;\n constraint_name: string;\n key: string;\n node_id: string;\n }>(query);\n const ownerByTarget = new Map(\n rows.map((row) => [\n `${row.node_kind}\\u0000${row.constraint_name}\\u0000${row.key}`,\n row.node_id,\n ]),\n );\n for (const entry of chunk) {\n const owner = ownerByTarget.get(targetKey(entry));\n if (owner !== undefined && owner !== entry.nodeId) {\n throw new UniquenessError({\n constraintName: entry.constraintName,\n kind: entry.nodeKind,\n existingId: owner,\n newId: entry.nodeId,\n fields: [],\n });\n }\n }\n }\n },\n\n async deleteUnique(params: DeleteUniqueParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteUnique(params, timestamp);\n await execution.execRun(query);\n },\n\n async checkUnique(\n params: CheckUniqueParams,\n ): Promise<UniqueRow | undefined> {\n const query = operationStrategy.buildCheckUnique(params);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toUniqueRow(row) : undefined;\n },\n\n async checkUniqueBatch(\n params: CheckUniqueBatchParams,\n ): Promise<readonly UniqueRow[]> {\n if (params.keys.length === 0) return [];\n const allRows: UniqueRow[] = [];\n for (const chunk of chunkArray(params.keys, batchConfig.checkUniqueBatchChunkSize)) {\n const query = operationStrategy.buildCheckUniqueBatch({ ...params, keys: chunk });\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toUniqueRow(row)));\n }\n return allRows;\n },\n\n async getActiveSchema(\n graphId: string,\n ): Promise<SchemaVersionRow | undefined> {\n const query = operationStrategy.buildGetActiveSchema(graphId);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toSchemaVersionRow(row) : undefined;\n },\n\n async getSchemaVersion(\n graphId: string,\n version: number,\n ): Promise<SchemaVersionRow | undefined> {\n const query = operationStrategy.buildGetSchemaVersion(graphId, version);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toSchemaVersionRow(row) : undefined;\n },\n\n async commitSchemaVersion(\n params: CommitSchemaVersionParams,\n ): Promise<SchemaVersionRow> {\n // The top-level backend wraps this method in a transaction with\n // appropriate write-locking (BEGIN IMMEDIATE on SQLite,\n // pg_advisory_xact_lock on Postgres) so the read-then-write\n // sequence below is serialized against concurrent commits.\n\n const existingRaw = await execution.execGet<Record<string, unknown>>(\n operationStrategy.buildGetSchemaVersion(\n params.graphId,\n params.version,\n ),\n );\n const actualActiveVersion = await readActiveVersion(params.graphId);\n\n // Same-version-different-hash → content conflict. Always wins\n // over CAS: a hash disagreement is operator-intervention\n // territory regardless of which writer \"got there first.\"\n if (existingRaw !== undefined) {\n const existing = rowMappers.toSchemaVersionRow(existingRaw);\n if (existing.schema_hash !== params.schemaHash) {\n throw new SchemaContentConflictError({\n graphId: params.graphId,\n version: params.version,\n existingHash: existing.schema_hash,\n incomingHash: params.schemaHash,\n });\n }\n // Same-version-same-hash already active → idempotent success.\n // Skips the CAS intentionally: same hash means identical\n // content, so there's no disagreement for the caller to refetch.\n if (existing.is_active) {\n return existing;\n }\n // Same-version-same-hash but inactive: orphan row left by a\n // crashed earlier commit. Reactivation requires CAS because\n // we're about to flip the active pointer — fall through.\n verifyExpectedActiveVersion(\n params.graphId,\n params.expected,\n actualActiveVersion,\n );\n const reactivate = operationStrategy.buildSetActiveSchema(\n params.graphId,\n params.version,\n );\n await execution.execRun(reactivate.deactivateAll);\n await execution.execRun(reactivate.activateVersion);\n // Project the result instead of re-SELECTing: the partial\n // unique index guarantees this is the only active row for the\n // graph after the UPDATEs above.\n return { ...existing, is_active: true };\n }\n\n verifyExpectedActiveVersion(\n params.graphId,\n params.expected,\n actualActiveVersion,\n );\n\n // Fresh insert path. For the \"active\" expected case, deactivate\n // the prior active row first so the partial unique index (one\n // active per graph) is satisfied at every statement boundary.\n // The \"initial\" case has no prior active, so skip.\n if (params.expected.kind === \"active\") {\n const flip = operationStrategy.buildSetActiveSchema(\n params.graphId,\n params.version,\n );\n await execution.execRun(flip.deactivateAll);\n }\n\n const timestamp = nowIso();\n const insertQuery = operationStrategy.buildInsertSchema(\n {\n graphId: params.graphId,\n version: params.version,\n schemaHash: params.schemaHash,\n schemaDoc: params.schemaDoc,\n isActive: true,\n },\n timestamp,\n );\n const insertedRaw =\n await execution.execGet<Record<string, unknown>>(insertQuery);\n if (!insertedRaw) {\n throw new DatabaseOperationError(\n \"Insert schema failed: no row returned\",\n { operation: \"insert\", entity: \"schema\" },\n );\n }\n return rowMappers.toSchemaVersionRow(insertedRaw);\n },\n\n async setActiveVersion(params: SetActiveVersionParams): Promise<void> {\n const actualActiveVersion = await readActiveVersion(params.graphId);\n verifyExpectedActiveVersion(\n params.graphId,\n params.expected,\n actualActiveVersion,\n );\n\n const targetRaw = await execution.execGet<Record<string, unknown>>(\n operationStrategy.buildGetSchemaVersion(\n params.graphId,\n params.version,\n ),\n );\n if (!targetRaw) {\n throw new MigrationError(\n `Cannot activate version ${params.version}: version does not exist for graph \"${params.graphId}\".`,\n {\n graphId: params.graphId,\n fromVersion: actualActiveVersion,\n toVersion: params.version,\n },\n );\n }\n\n const queries = operationStrategy.buildSetActiveSchema(\n params.graphId,\n params.version,\n );\n await execution.execRun(queries.deactivateAll);\n await execution.execRun(queries.activateVersion);\n },\n\n async clearGraph(graphId: string): Promise<void> {\n const statements = operationStrategy.buildClearGraph(graphId);\n for (const statement of statements) {\n await runIgnorableClearStatement(statement);\n }\n },\n };\n}\n","/**\n * Get-or-create with LRU eviction on a `Map`.\n *\n * Map insertion order is the LRU order: cache hits delete + reinsert\n * the entry to promote it to most-recently-used; on miss, the oldest\n * entry is evicted once the map exceeds `cacheMax`. Used by both the\n * PostgreSQL prepared-statement-name cache and the SQLite prepared-\n * statement cache.\n */\nexport function getOrCreateLru<K, V>(\n cache: Map<K, V>,\n key: K,\n cacheMax: number,\n create: () => V,\n): V {\n const cached = cache.get(key);\n if (cached !== undefined) {\n cache.delete(key);\n cache.set(key, cached);\n return cached;\n }\n const value = create();\n cache.set(key, value);\n if (cache.size > cacheMax) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n return value;\n}\n","import { type SQL } from \"drizzle-orm\";\n\nexport type CompiledSqlQuery = Readonly<{\n params: readonly unknown[];\n sql: string;\n}>;\n\nexport type PreparedSqlStatement = Readonly<{\n execute: <TRow>(params: readonly unknown[]) => Promise<readonly TRow[]>;\n}>;\n\nexport type SqlExecutionAdapter = Readonly<{\n compile: (query: SQL) => CompiledSqlQuery;\n execute: <TRow>(query: SQL) => Promise<readonly TRow[]>;\n executeCompiled?: <TRow>(\n compiledQuery: CompiledSqlQuery,\n ) => Promise<readonly TRow[]>;\n prepare?: (sqlText: string) => PreparedSqlStatement;\n /**\n * Runs `critical` with exclusive use of the connection: no statement from\n * anywhere else can interleave with the ones it issues.\n *\n * Statement-at-a-time serialization is not enough for a *sequence* that must\n * be atomic. `SET LOCAL` around a query is the motivating case — snapshot,\n * set, select, restore. Two searches whose statements merely take turns can\n * still interleave as `A snapshot → B snapshot → A set → B set → A select`,\n * and `A` then runs under `B`'s settings.\n *\n * `critical` is handed the unqueued adapter, so it must not attempt to\n * re-enter the queue. Present only on transaction-scoped (serialized)\n * adapters; a pooled adapter needs no exclusion because every statement gets\n * its own connection.\n */\n runExclusive?: <T>(\n critical: (connection: SqlExecutionAdapter) => Promise<T>,\n ) => Promise<T>;\n}>;\n\ntype SqlCompiler = Readonly<{\n sqlToQuery: (query: SQL) => CompiledSqlQuery;\n}>;\n\ntype DatabaseWithCompiler = Readonly<{\n dialect?: SqlCompiler;\n}>;\n\nexport function compileQueryWithDialect(\n db: unknown,\n query: SQL,\n backendName: string,\n): CompiledSqlQuery {\n const databaseWithCompiler = db as DatabaseWithCompiler;\n const compiler = databaseWithCompiler.dialect;\n if (compiler === undefined) {\n throw new Error(`${backendName} backend is missing a SQL compiler`);\n }\n return compiler.sqlToQuery(query);\n}\n"]}