@nicia-ai/typegraph 0.49.0 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/backend/drizzle/indexes.cjs +11 -9
- package/dist/backend/drizzle/indexes.d.cts +1 -1
- package/dist/backend/drizzle/indexes.d.ts +1 -1
- package/dist/backend/drizzle/indexes.js +7 -5
- package/dist/backend/index.cjs +190 -53
- package/dist/backend/index.d.cts +90 -4
- package/dist/backend/index.d.ts +90 -4
- package/dist/backend/index.js +9 -12
- package/dist/backend/postgres/index.cjs +36 -28
- package/dist/backend/postgres/index.d.cts +7 -7
- package/dist/backend/postgres/index.d.ts +7 -7
- package/dist/backend/postgres/index.js +19 -15
- package/dist/backend/postgres/pglite-store.cjs +7 -62
- package/dist/backend/postgres/pglite-store.cjs.map +1 -1
- package/dist/backend/postgres/pglite-store.d.cts +8 -8
- package/dist/backend/postgres/pglite-store.d.ts +8 -8
- package/dist/backend/postgres/pglite-store.js +7 -62
- package/dist/backend/postgres/pglite-store.js.map +1 -1
- package/dist/backend/postgres/pglite.cjs +21 -17
- package/dist/backend/postgres/pglite.d.cts +3 -3
- package/dist/backend/postgres/pglite.d.ts +3 -3
- package/dist/backend/postgres/pglite.js +20 -16
- package/dist/backend/sqlite/index.cjs +33 -25
- package/dist/backend/sqlite/index.d.cts +7 -7
- package/dist/backend/sqlite/index.d.ts +7 -7
- package/dist/backend/sqlite/index.js +17 -13
- package/dist/backend/sqlite/libsql.cjs +24 -20
- package/dist/backend/sqlite/libsql.cjs.map +1 -1
- package/dist/backend/sqlite/libsql.d.cts +3 -3
- package/dist/backend/sqlite/libsql.d.ts +3 -3
- package/dist/backend/sqlite/libsql.js +19 -15
- package/dist/backend/sqlite/libsql.js.map +1 -1
- package/dist/backend/sqlite/local-store.cjs +9 -64
- package/dist/backend/sqlite/local-store.cjs.map +1 -1
- package/dist/backend/sqlite/local-store.d.cts +8 -8
- package/dist/backend/sqlite/local-store.d.ts +8 -8
- package/dist/backend/sqlite/local-store.js +8 -64
- package/dist/backend/sqlite/local-store.js.map +1 -1
- package/dist/backend/sqlite/local.cjs +25 -20
- package/dist/backend/sqlite/local.d.cts +3 -3
- package/dist/backend/sqlite/local.d.ts +3 -3
- package/dist/backend/sqlite/local.js +21 -16
- package/dist/chunk-2CVDZCXH.cjs +1278 -0
- package/dist/chunk-2CVDZCXH.cjs.map +1 -0
- package/dist/{chunk-MYKHJI2J.js → chunk-2DWTBNSH.js} +3 -3
- package/dist/{chunk-MYKHJI2J.js.map → chunk-2DWTBNSH.js.map} +1 -1
- package/dist/{chunk-JB6T4GLL.cjs → chunk-2KCTP3U2.cjs} +870 -528
- package/dist/chunk-2KCTP3U2.cjs.map +1 -0
- package/dist/{chunk-OORXGFL5.cjs → chunk-322TBTOQ.cjs} +48 -48
- package/dist/{chunk-OORXGFL5.cjs.map → chunk-322TBTOQ.cjs.map} +1 -1
- package/dist/{chunk-FA2AFWLP.cjs → chunk-36SX6QXP.cjs} +31 -12
- package/dist/chunk-36SX6QXP.cjs.map +1 -0
- package/dist/{chunk-SDBBMD4N.js → chunk-36VYWVQU.js} +3 -3
- package/dist/{chunk-SDBBMD4N.js.map → chunk-36VYWVQU.js.map} +1 -1
- package/dist/chunk-4DKY6RIU.js +1253 -0
- package/dist/chunk-4DKY6RIU.js.map +1 -0
- package/dist/chunk-4QKOZYMV.js +9 -0
- package/dist/chunk-4QKOZYMV.js.map +1 -0
- package/dist/{chunk-WIC7DRXW.js → chunk-57JM6NW3.js} +9 -19
- package/dist/chunk-57JM6NW3.js.map +1 -0
- package/dist/chunk-5WWEYV4H.cjs +5113 -0
- package/dist/chunk-5WWEYV4H.cjs.map +1 -0
- package/dist/chunk-6KQEICJ6.cjs +12 -0
- package/dist/{chunk-MKJ4KXL5.cjs.map → chunk-6KQEICJ6.cjs.map} +1 -1
- package/dist/{chunk-DZAICA5J.js → chunk-6NKSE5AU.js} +4 -4
- package/dist/{chunk-DZAICA5J.js.map → chunk-6NKSE5AU.js.map} +1 -1
- package/dist/{chunk-KKBDXCLQ.js → chunk-6NLYIMJO.js} +4 -4
- package/dist/{chunk-KKBDXCLQ.js.map → chunk-6NLYIMJO.js.map} +1 -1
- package/dist/{chunk-BFUOME67.cjs → chunk-7B7I7YAW.cjs} +20 -11
- package/dist/chunk-7B7I7YAW.cjs.map +1 -0
- package/dist/{chunk-ZDKTPBGV.js → chunk-7G5IYROL.js} +6 -548
- package/dist/chunk-7G5IYROL.js.map +1 -0
- package/dist/{chunk-3DMMGT6S.js → chunk-7QFRK6PU.js} +4 -8
- package/dist/chunk-7QFRK6PU.js.map +1 -0
- package/dist/chunk-A4C4NJ5U.cjs +12 -0
- package/dist/chunk-A4C4NJ5U.cjs.map +1 -0
- package/dist/{chunk-CHAOFCHV.js → chunk-AH2A74OZ.js} +3 -3
- package/dist/{chunk-CHAOFCHV.js.map → chunk-AH2A74OZ.js.map} +1 -1
- package/dist/{chunk-UGHQV7MP.cjs → chunk-B3MN7EJR.cjs} +228 -162
- package/dist/chunk-B3MN7EJR.cjs.map +1 -0
- package/dist/{chunk-TZEGUG6D.cjs → chunk-BZ5MVITP.cjs} +4 -4
- package/dist/{chunk-TZEGUG6D.cjs.map → chunk-BZ5MVITP.cjs.map} +1 -1
- package/dist/{chunk-YVF2EM7B.js → chunk-CAI6SMP6.js} +3 -3
- package/dist/{chunk-YVF2EM7B.js.map → chunk-CAI6SMP6.js.map} +1 -1
- package/dist/{chunk-JONXFAPO.js → chunk-CBOD7TXH.js} +5 -5
- package/dist/{chunk-JONXFAPO.js.map → chunk-CBOD7TXH.js.map} +1 -1
- package/dist/{chunk-FQPEMEWX.cjs → chunk-CRZ56SZU.cjs} +81 -32
- package/dist/chunk-CRZ56SZU.cjs.map +1 -0
- package/dist/{chunk-DO7SAMEK.cjs → chunk-D3GWARN7.cjs} +47 -47
- package/dist/{chunk-DO7SAMEK.cjs.map → chunk-D3GWARN7.cjs.map} +1 -1
- package/dist/{chunk-QTD6HX4O.js → chunk-D3OUDFU7.js} +5 -5
- package/dist/{chunk-QTD6HX4O.js.map → chunk-D3OUDFU7.js.map} +1 -1
- package/dist/{chunk-2QGYQBS2.cjs → chunk-DWUDZ66O.cjs} +10 -10
- package/dist/{chunk-2QGYQBS2.cjs.map → chunk-DWUDZ66O.cjs.map} +1 -1
- package/dist/chunk-EKG2UXNX.cjs +23 -0
- package/dist/chunk-EKG2UXNX.cjs.map +1 -0
- package/dist/chunk-FMMW3KX7.cjs +148 -0
- package/dist/chunk-FMMW3KX7.cjs.map +1 -0
- package/dist/{chunk-XVWOYKIK.js → chunk-FZHF5UWR.js} +3 -3
- package/dist/{chunk-XVWOYKIK.js.map → chunk-FZHF5UWR.js.map} +1 -1
- package/dist/chunk-H2VWDQWC.cjs +571 -0
- package/dist/chunk-H2VWDQWC.cjs.map +1 -0
- package/dist/chunk-H4FY6OZK.js +13 -0
- package/dist/chunk-H4FY6OZK.js.map +1 -0
- package/dist/{chunk-EDN4Y4ZG.cjs → chunk-H5IJSROF.cjs} +9 -15
- package/dist/chunk-H5IJSROF.cjs.map +1 -0
- package/dist/chunk-HZUB5CON.js +27 -0
- package/dist/chunk-HZUB5CON.js.map +1 -0
- package/dist/{chunk-NACVVDWB.js → chunk-I5IOSA27.js} +103 -105
- package/dist/chunk-I5IOSA27.js.map +1 -0
- package/dist/{chunk-OI2GQ25X.cjs → chunk-I7YAY2VQ.cjs} +7 -7
- package/dist/{chunk-OI2GQ25X.cjs.map → chunk-I7YAY2VQ.cjs.map} +1 -1
- package/dist/chunk-IRCWIA3R.js +20 -0
- package/dist/chunk-IRCWIA3R.js.map +1 -0
- package/dist/chunk-IVQBLXBK.cjs +55 -0
- package/dist/chunk-IVQBLXBK.cjs.map +1 -0
- package/dist/{chunk-7SQSZN2J.js → chunk-IZD4HTCP.js} +5 -5
- package/dist/{chunk-7SQSZN2J.js.map → chunk-IZD4HTCP.js.map} +1 -1
- package/dist/{chunk-3FPR224C.cjs → chunk-JHRUZ73O.cjs} +116 -107
- package/dist/chunk-JHRUZ73O.cjs.map +1 -0
- package/dist/{chunk-EZEEWCFJ.cjs → chunk-JQKMEKKW.cjs} +525 -298
- package/dist/chunk-JQKMEKKW.cjs.map +1 -0
- package/dist/chunk-JVA3KDEA.cjs +691 -0
- package/dist/chunk-JVA3KDEA.cjs.map +1 -0
- package/dist/{chunk-5K2BKEBD.js → chunk-K46SDNQD.js} +10 -4
- package/dist/chunk-K46SDNQD.js.map +1 -0
- package/dist/{chunk-7LZJNLA5.js → chunk-K67P5DLL.js} +108 -42
- package/dist/chunk-K67P5DLL.js.map +1 -0
- package/dist/{chunk-3G5W2U2L.cjs → chunk-KACEYDYV.cjs} +335 -258
- package/dist/chunk-KACEYDYV.cjs.map +1 -0
- package/dist/{chunk-JFRT7S3B.cjs → chunk-L6EVYIID.cjs} +318 -478
- package/dist/chunk-L6EVYIID.cjs.map +1 -0
- package/dist/{chunk-SHFBB23Q.js → chunk-LI4K2KEJ.js} +6 -4
- package/dist/chunk-LI4K2KEJ.js.map +1 -0
- package/dist/chunk-LKZDQ2B4.js +1581 -0
- package/dist/chunk-LKZDQ2B4.js.map +1 -0
- package/dist/{chunk-WODMN3Q2.cjs → chunk-LLFPQOBA.cjs} +27 -27
- package/dist/{chunk-WODMN3Q2.cjs.map → chunk-LLFPQOBA.cjs.map} +1 -1
- package/dist/{chunk-P6YLZTRE.js → chunk-LZMQ3SFK.js} +3 -3
- package/dist/{chunk-P6YLZTRE.js.map → chunk-LZMQ3SFK.js.map} +1 -1
- package/dist/{chunk-HEV35TGT.js → chunk-M3VTS3F6.js} +13 -4
- package/dist/chunk-M3VTS3F6.js.map +1 -0
- package/dist/{chunk-TQHGE7UC.cjs → chunk-M5MSP3BI.cjs} +18 -10
- package/dist/chunk-M5MSP3BI.cjs.map +1 -0
- package/dist/{chunk-D4QLTJSM.js → chunk-NBOS7BY3.js} +63 -23
- package/dist/chunk-NBOS7BY3.js.map +1 -0
- package/dist/chunk-NGQDGL5X.js +140 -0
- package/dist/chunk-NGQDGL5X.js.map +1 -0
- package/dist/{chunk-SIT26LAZ.cjs → chunk-NLX5OWK7.cjs} +33 -5
- package/dist/chunk-NLX5OWK7.cjs.map +1 -0
- package/dist/chunk-NUQ2YFFH.cjs +1637 -0
- package/dist/chunk-NUQ2YFFH.cjs.map +1 -0
- package/dist/{chunk-UMGZDVOA.cjs → chunk-OGL4X4PH.cjs} +206 -208
- package/dist/chunk-OGL4X4PH.cjs.map +1 -0
- package/dist/{chunk-LRQKXRXO.cjs → chunk-OTNTGEXR.cjs} +4 -4
- package/dist/{chunk-LRQKXRXO.cjs.map → chunk-OTNTGEXR.cjs.map} +1 -1
- package/dist/chunk-OTWE63BW.js +53 -0
- package/dist/chunk-OTWE63BW.js.map +1 -0
- package/dist/chunk-PC5NGH5A.js +549 -0
- package/dist/chunk-PC5NGH5A.js.map +1 -0
- package/dist/{chunk-26YKDNUD.cjs → chunk-PS3TUWJM.cjs} +12 -10
- package/dist/chunk-PS3TUWJM.cjs.map +1 -0
- package/dist/{chunk-OMZ37BM2.js → chunk-PVFFH7TL.js} +5 -5
- package/dist/{chunk-OMZ37BM2.js.map → chunk-PVFFH7TL.js.map} +1 -1
- package/dist/chunk-QCD5JKU4.cjs +15 -0
- package/dist/chunk-QCD5JKU4.cjs.map +1 -0
- package/dist/{chunk-UGHG7PGX.js → chunk-QG5VEOKX.js} +30 -4
- package/dist/chunk-QG5VEOKX.js.map +1 -0
- package/dist/{chunk-TUNPBZY3.cjs → chunk-QLLZM5I3.cjs} +4 -4
- package/dist/{chunk-TUNPBZY3.cjs.map → chunk-QLLZM5I3.cjs.map} +1 -1
- package/dist/{chunk-BRRP76WO.js → chunk-RCBG6YMT.js} +781 -375
- package/dist/chunk-RCBG6YMT.js.map +1 -0
- package/dist/{chunk-LTXQOEIC.js → chunk-RI7RJH4G.js} +281 -204
- package/dist/chunk-RI7RJH4G.js.map +1 -0
- package/dist/{chunk-GYEG3ZLZ.cjs → chunk-RJMHU2MG.cjs} +121 -18
- package/dist/chunk-RJMHU2MG.cjs.map +1 -0
- package/dist/{chunk-GLHXM7C4.js → chunk-RVUL2HXY.js} +61 -23
- package/dist/chunk-RVUL2HXY.js.map +1 -0
- package/dist/chunk-RWUWTJQY.cjs +30 -0
- package/dist/chunk-RWUWTJQY.cjs.map +1 -0
- package/dist/{chunk-2O4PCIZ6.cjs → chunk-S5GU4LUN.cjs} +13 -13
- package/dist/{chunk-2O4PCIZ6.cjs.map → chunk-S5GU4LUN.cjs.map} +1 -1
- package/dist/{chunk-JPD2CTC3.js → chunk-SDPWO2Z5.js} +7 -7
- package/dist/{chunk-JPD2CTC3.js.map → chunk-SDPWO2Z5.js.map} +1 -1
- package/dist/{chunk-OVI7IXYX.js → chunk-SLGGT2XD.js} +3 -3
- package/dist/{chunk-OVI7IXYX.js.map → chunk-SLGGT2XD.js.map} +1 -1
- package/dist/{chunk-ROR5ZR6A.cjs → chunk-TIJUA4I6.cjs} +45 -45
- package/dist/{chunk-ROR5ZR6A.cjs.map → chunk-TIJUA4I6.cjs.map} +1 -1
- package/dist/{chunk-AOSSQDVO.cjs → chunk-TM54OBHX.cjs} +13 -13
- package/dist/{chunk-AOSSQDVO.cjs.map → chunk-TM54OBHX.cjs.map} +1 -1
- package/dist/{chunk-KF6K7TGH.js → chunk-TYEYRCXL.js} +766 -433
- package/dist/chunk-TYEYRCXL.js.map +1 -0
- package/dist/{chunk-Z2JCLZFJ.js → chunk-UKOVGCRN.js} +2151 -570
- package/dist/chunk-UKOVGCRN.js.map +1 -0
- package/dist/chunk-UYKDYE5D.cjs +12 -0
- package/dist/{chunk-CICO5GXD.cjs.map → chunk-UYKDYE5D.cjs.map} +1 -1
- package/dist/{chunk-S5TERQVW.js → chunk-VAAC7L57.js} +284 -66
- package/dist/chunk-VAAC7L57.js.map +1 -0
- package/dist/{chunk-7UOLHNWC.cjs → chunk-VKHXYVN7.cjs} +22 -33
- package/dist/chunk-VKHXYVN7.cjs.map +1 -0
- package/dist/{chunk-6NGW27EO.cjs → chunk-VLBTRXA2.cjs} +10 -10
- package/dist/{chunk-6NGW27EO.cjs.map → chunk-VLBTRXA2.cjs.map} +1 -1
- package/dist/{chunk-YIURNGXI.js → chunk-VUQZNUHU.js} +22 -6
- package/dist/chunk-VUQZNUHU.js.map +1 -0
- package/dist/{chunk-YYUHLYM2.cjs → chunk-WDM5WQK4.cjs} +183 -143
- package/dist/chunk-WDM5WQK4.cjs.map +1 -0
- package/dist/{chunk-ZFMCDJGB.js → chunk-WFSYYU4W.js} +70 -220
- package/dist/chunk-WFSYYU4W.js.map +1 -0
- package/dist/{chunk-SR725PWF.cjs → chunk-WRBV2FNH.cjs} +2065 -1659
- package/dist/chunk-WRBV2FNH.cjs.map +1 -0
- package/dist/{chunk-MRDBBHIZ.cjs → chunk-X4GDXBOP.cjs} +2 -2
- package/dist/chunk-X4GDXBOP.cjs.map +1 -0
- package/dist/chunk-XORONCV3.js +202 -0
- package/dist/chunk-XORONCV3.js.map +1 -0
- package/dist/{chunk-D5R42W5D.js → chunk-XZW2CTNO.js} +115 -12
- package/dist/chunk-XZW2CTNO.js.map +1 -0
- package/dist/{chunk-ZLONH2UD.js → chunk-YDEJQWOL.js} +2 -2
- package/dist/chunk-YDEJQWOL.js.map +1 -0
- package/dist/{chunk-2TYSSBU5.js → chunk-YT2IVFAI.js} +30 -21
- package/dist/chunk-YT2IVFAI.js.map +1 -0
- package/dist/chunk-ZGVTNKTX.cjs +217 -0
- package/dist/chunk-ZGVTNKTX.cjs.map +1 -0
- package/dist/core/index.cjs +29 -28
- package/dist/core/index.d.cts +4 -4
- package/dist/core/index.d.ts +4 -4
- package/dist/core/index.js +9 -8
- package/dist/{ddl-D_oW-EVO.d.ts → ddl-BvcbgzHo.d.ts} +3 -3
- package/dist/{ddl-BL1NZLMY.d.cts → ddl-Ufebz5q5.d.cts} +3 -3
- package/dist/graph-extension/index.cjs +21 -20
- package/dist/graph-extension/index.d.cts +2 -4
- package/dist/graph-extension/index.d.ts +2 -4
- package/dist/graph-extension/index.js +5 -4
- package/dist/graph-merge/index.cjs +324 -307
- package/dist/graph-merge/index.cjs.map +1 -1
- package/dist/graph-merge/index.d.cts +8 -9
- package/dist/graph-merge/index.d.ts +8 -9
- package/dist/graph-merge/index.js +51 -34
- package/dist/graph-merge/index.js.map +1 -1
- package/dist/index.cjs +224 -222
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -12
- package/dist/index.d.ts +11 -12
- package/dist/index.js +38 -36
- package/dist/index.js.map +1 -1
- package/dist/indexes/index.cjs +15 -13
- package/dist/indexes/index.d.cts +4 -4
- package/dist/indexes/index.d.ts +4 -4
- package/dist/indexes/index.js +8 -6
- package/dist/{ingestion-import-target-dNeL7iAv.d.ts → ingestion-import-target-CAs1OX-l.d.cts} +1 -1
- package/dist/{ingestion-import-target-XPxZYw89.d.cts → ingestion-import-target-DCQSPfNx.d.ts} +1 -1
- package/dist/interchange/index.cjs +57 -54
- package/dist/interchange/index.cjs.map +1 -1
- package/dist/interchange/index.d.cts +19 -8
- package/dist/interchange/index.d.ts +19 -8
- package/dist/interchange/index.js +21 -18
- package/dist/interchange/index.js.map +1 -1
- package/dist/local-store-impl-6DDTFM32.cjs +77 -0
- package/dist/local-store-impl-6DDTFM32.cjs.map +1 -0
- package/dist/local-store-impl-OXTOVU2J.js +75 -0
- package/dist/local-store-impl-OXTOVU2J.js.map +1 -0
- package/dist/{manager-CYaff3n3.d.cts → manager-B68OrPR2.d.ts} +29 -2
- package/dist/{manager-D9eRT_ns.d.ts → manager-D_t7oK69.d.cts} +29 -2
- package/dist/pglite-store-impl-6EMZGL7K.js +73 -0
- package/dist/pglite-store-impl-6EMZGL7K.js.map +1 -0
- package/dist/pglite-store-impl-GJG3Y7RP.cjs +75 -0
- package/dist/pglite-store-impl-GJG3Y7RP.cjs.map +1 -0
- package/dist/{postgres-CcL4bAHS.d.ts → postgres-BPLSVyHM.d.ts} +279 -2
- package/dist/{postgres-DMj39MEu.d.cts → postgres-CqvtFC2y.d.cts} +279 -2
- package/dist/profiler/index.d.cts +9 -9
- package/dist/profiler/index.d.ts +9 -9
- package/dist/provenance/index.cjs +59 -44
- package/dist/provenance/index.cjs.map +1 -1
- package/dist/provenance/index.d.cts +7 -7
- package/dist/provenance/index.d.ts +7 -7
- package/dist/provenance/index.js +28 -13
- package/dist/provenance/index.js.map +1 -1
- package/dist/{repair-validity-windows-BFNZvd_H.d.cts → repair-validity-windows-DEzCKAdy.d.cts} +7 -3
- package/dist/{repair-validity-windows-DlUSqwCg.d.ts → repair-validity-windows-GMdaS2AH.d.ts} +7 -3
- package/dist/resolve-D_H8MHtq.d.ts +1805 -0
- package/dist/resolve-WEW8gWws.d.cts +1805 -0
- package/dist/schema/index.cjs +48 -46
- package/dist/schema/index.d.cts +4 -6
- package/dist/schema/index.d.ts +4 -6
- package/dist/schema/index.js +21 -19
- package/dist/{searchable-bpE1bBfc.d.ts → searchable-C_UREI9K.d.ts} +1 -1
- package/dist/{searchable-DHJMh_nj.d.cts → searchable-ClgET_i7.d.cts} +1 -1
- package/dist/{sqlite-YppHrNFb.d.cts → sqlite-D1mXO9Kp.d.cts} +310 -2
- package/dist/{sqlite-D7Oz0SQh.d.ts → sqlite-MZA3oZNB.d.ts} +310 -2
- package/dist/{store-bphCSo7z.d.cts → store-CuFX7fCx.d.cts} +117 -31
- package/dist/{store-DRrFCx5x.d.ts → store-D-ZjXQpW.d.ts} +117 -31
- package/dist/{temporal-CbnLzTmM.d.ts → temporal-CpyEiRY8.d.cts} +1 -1
- package/dist/{temporal-5GqpYCk2.d.cts → temporal-y0Aep9Su.d.ts} +1 -1
- package/dist/{types-BqFZTQmV.d.cts → types-6yf0Vv-_.d.cts} +2016 -94
- package/dist/{types-BqFZTQmV.d.ts → types-6yf0Vv-_.d.ts} +2016 -94
- package/dist/{types-Bx74kaTt.d.ts → types-DzJ4dlzk.d.cts} +1 -1
- package/dist/{types-CXAhpW-c.d.cts → types-_vVSB9k-.d.ts} +1 -1
- package/dist/{where-O-k2wgYm.d.ts → where-DuG2LCLe.d.ts} +1 -1
- package/dist/{where-DI_Fqz-X.d.cts → where-Mhf_yyKX.d.cts} +1 -1
- package/package.json +7 -2
- package/dist/chunk-26YKDNUD.cjs.map +0 -1
- package/dist/chunk-2TYSSBU5.js.map +0 -1
- package/dist/chunk-3DMMGT6S.js.map +0 -1
- package/dist/chunk-3FPR224C.cjs.map +0 -1
- package/dist/chunk-3G5W2U2L.cjs.map +0 -1
- package/dist/chunk-3KOY4FH3.cjs +0 -934
- package/dist/chunk-3KOY4FH3.cjs.map +0 -1
- package/dist/chunk-3QNZ5SAJ.cjs +0 -3502
- package/dist/chunk-3QNZ5SAJ.cjs.map +0 -1
- package/dist/chunk-3U5ABFDW.cjs +0 -259
- package/dist/chunk-3U5ABFDW.cjs.map +0 -1
- package/dist/chunk-5K2BKEBD.js.map +0 -1
- package/dist/chunk-5PRKMB24.cjs +0 -124
- package/dist/chunk-5PRKMB24.cjs.map +0 -1
- package/dist/chunk-6LN7FIVU.js +0 -107
- package/dist/chunk-6LN7FIVU.js.map +0 -1
- package/dist/chunk-6SWPJEYN.js +0 -1126
- package/dist/chunk-6SWPJEYN.js.map +0 -1
- package/dist/chunk-7LZJNLA5.js.map +0 -1
- package/dist/chunk-7UOLHNWC.cjs.map +0 -1
- package/dist/chunk-BFUOME67.cjs.map +0 -1
- package/dist/chunk-BRRP76WO.js.map +0 -1
- package/dist/chunk-CICO5GXD.cjs +0 -12
- package/dist/chunk-D4QLTJSM.js.map +0 -1
- package/dist/chunk-D5R42W5D.js.map +0 -1
- package/dist/chunk-EDN4Y4ZG.cjs.map +0 -1
- package/dist/chunk-EZEEWCFJ.cjs.map +0 -1
- package/dist/chunk-FA2AFWLP.cjs.map +0 -1
- package/dist/chunk-FQPEMEWX.cjs.map +0 -1
- package/dist/chunk-GLHXM7C4.js.map +0 -1
- package/dist/chunk-GYEG3ZLZ.cjs.map +0 -1
- package/dist/chunk-HDL2ARHX.cjs +0 -1156
- package/dist/chunk-HDL2ARHX.cjs.map +0 -1
- package/dist/chunk-HEV35TGT.js.map +0 -1
- package/dist/chunk-I4GAZH5Z.js +0 -913
- package/dist/chunk-I4GAZH5Z.js.map +0 -1
- package/dist/chunk-JB6T4GLL.cjs.map +0 -1
- package/dist/chunk-JBQQ7THH.js +0 -20
- package/dist/chunk-JBQQ7THH.js.map +0 -1
- package/dist/chunk-JFRT7S3B.cjs.map +0 -1
- package/dist/chunk-KF6K7TGH.js.map +0 -1
- package/dist/chunk-L3LQNR34.cjs +0 -1254
- package/dist/chunk-L3LQNR34.cjs.map +0 -1
- package/dist/chunk-LTXQOEIC.js.map +0 -1
- package/dist/chunk-MKJ4KXL5.cjs +0 -12
- package/dist/chunk-MRDBBHIZ.cjs.map +0 -1
- package/dist/chunk-NACVVDWB.js.map +0 -1
- package/dist/chunk-NVY5CJFP.js +0 -244
- package/dist/chunk-NVY5CJFP.js.map +0 -1
- package/dist/chunk-PWLJ77UV.cjs +0 -23
- package/dist/chunk-PWLJ77UV.cjs.map +0 -1
- package/dist/chunk-S5TERQVW.js.map +0 -1
- package/dist/chunk-SHFBB23Q.js.map +0 -1
- package/dist/chunk-SIT26LAZ.cjs.map +0 -1
- package/dist/chunk-SR725PWF.cjs.map +0 -1
- package/dist/chunk-TQHGE7UC.cjs.map +0 -1
- package/dist/chunk-UGHG7PGX.js.map +0 -1
- package/dist/chunk-UGHQV7MP.cjs.map +0 -1
- package/dist/chunk-UMGZDVOA.cjs.map +0 -1
- package/dist/chunk-WIC7DRXW.js.map +0 -1
- package/dist/chunk-YIURNGXI.js.map +0 -1
- package/dist/chunk-YYUHLYM2.cjs.map +0 -1
- package/dist/chunk-Z2JCLZFJ.js.map +0 -1
- package/dist/chunk-ZDKTPBGV.js.map +0 -1
- package/dist/chunk-ZFMCDJGB.js.map +0 -1
- package/dist/chunk-ZLONH2UD.js.map +0 -1
- package/dist/index-COs_z6nV.d.cts +0 -1132
- package/dist/index-D7d1u2gr.d.ts +0 -1132
- package/dist/materialize-indexes-DJ3ykH59.d.ts +0 -266
- package/dist/materialize-indexes-DTtAnvfY.d.cts +0 -266
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/backend/drizzle/columns/fulltext.ts","../src/backend/drizzle/schema/postgres.ts","../src/backend/drizzle/schema/sqlite.ts","../src/backend/drizzle/ddl.ts","../src/backend/capabilities/declarations.ts","../src/backend/edge-endpoint-sets.ts","../src/backend/live-node-candidates.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/shared.ts","../src/backend/drizzle/operations/hybrid.ts","../src/backend/drizzle/operations/clear.ts","../src/backend/drizzle/operations/collections.ts","../src/backend/drizzle/operations/constraint-fence-audit.ts","../src/backend/drizzle/operations/edge-claims.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/trusted-import.ts","../src/backend/drizzle/execution/lru.ts"],"names":["nodes","edges","recordedNodes","recordedEdges","recordedClock","sql","uniques","edgeClaims","schemaVersions","fulltext","DEFAULT_TABLE_NAMES","text","integer","primaryKey","index","uniqueIndex","check","tables","getSqliteTableConfig","chunk","getPgTableConfig","quotedTableName","nowIso","getTableName","qualified","timestamp","is"],"mappings":"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","file":"chunk-UKOVGCRN.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/adapters/drizzle/postgres\";\n *\n * // Custom table names\n * import { createPostgresTables } from \"@nicia-ai/typegraph/adapters/drizzle/postgres\";\n * const tables = createPostgresTables({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * });\n * ```\n */\nimport { sql } from \"drizzle-orm\";\nimport {\n bigint,\n boolean,\n check,\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 buildPostgresSystemIndexBuilders,\n} from \"../../../indexes/drizzle\";\nimport { assertNoSystemIndexNameCollision } from \"../../../indexes/system\";\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 identityAssertions: string;\n recordedIdentityAssertions: string;\n identityClosure: string;\n identitySeparation: string;\n uniques: string;\n edgeClaims: 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 identityAssertions: \"typegraph_identity_assertions\",\n recordedIdentityAssertions: \"typegraph_recorded_identity_assertions\",\n identityClosure: \"typegraph_identity_closure\",\n identitySeparation: \"typegraph_identity_separation\",\n uniques: \"typegraph_node_uniques\",\n edgeClaims: \"typegraph_edge_claims\",\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 assertNoSystemIndexNameCollision(indexes, n);\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 // System indexes come from SYSTEM_INDEX_DECLARATIONS (single source\n // for both dialects + the runtime materializer).\n ...buildPostgresSystemIndexBuilders(\"nodes\", n.nodes, t),\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 ...buildPostgresSystemIndexBuilders(\"edges\", n.edges, t),\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: bigint(\"recorded_from\", { mode: \"number\" }).notNull(),\n recordedTo: bigint(\"recorded_to\", { mode: \"number\" }).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 ...buildPostgresSystemIndexBuilders(\"recordedNodes\", n.recordedNodes, t),\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: bigint(\"recorded_from\", { mode: \"number\" }).notNull(),\n recordedTo: bigint(\"recorded_to\", { mode: \"number\" }).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 ...buildPostgresSystemIndexBuilders(\"recordedEdges\", n.recordedEdges, t),\n ],\n );\n\n const recordedClock = pgTable(\n n.recordedClock,\n {\n graphId: text(\"graph_id\").notNull(),\n revision: bigint(\"revision\", { mode: \"number\" }).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 // The identity assertion ledger. `ended_by_kind` / `ended_by_id` record WHY\n // an assertion stopped being current: NULL for an explicit retraction,\n // populated with the deleted endpoint's `(kind, id)` when a node soft-delete\n // cascaded onto it. The CHECK holds the two invariants the writers rely on —\n // the pair is set or unset together, and a cause only ever names an ENDED\n // row's own endpoint.\n const identityAssertions = pgTable(\n n.identityAssertions,\n {\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n relation: text(\"rel\").notNull(),\n aKind: text(\"a_kind\").notNull(),\n aId: text(\"a_id\").notNull(),\n bKind: text(\"b_kind\").notNull(),\n bId: text(\"b_id\").notNull(),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }).notNull(),\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 endedByKind: text(\"ended_by_kind\"),\n endedById: text(\"ended_by_id\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n index(`${n.identityAssertions}_a_idx`).on(\n t.graphId,\n t.aKind,\n t.aId,\n t.validTo,\n ),\n index(`${n.identityAssertions}_b_idx`).on(\n t.graphId,\n t.bKind,\n t.bId,\n t.validTo,\n ),\n uniqueIndex(`${n.identityAssertions}_current_pair_idx`)\n .on(t.graphId, t.relation, t.aKind, t.aId, t.bKind, t.bId)\n .where(sql`${t.validTo} IS NULL`),\n check(\n `${n.identityAssertions}_ended_by_check`,\n sql`(ended_by_kind IS NULL) = (ended_by_id IS NULL) AND (ended_by_kind IS NULL OR (valid_to IS NOT NULL AND ((ended_by_kind = a_kind AND ended_by_id = a_id) OR (ended_by_kind = b_kind AND ended_by_id = b_id))))`,\n ),\n ],\n );\n\n const recordedIdentityAssertions = pgTable(\n n.recordedIdentityAssertions,\n {\n historyId: text(\"history_id\").notNull(),\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n relation: text(\"rel\").notNull(),\n aKind: text(\"a_kind\").notNull(),\n aId: text(\"a_id\").notNull(),\n bKind: text(\"b_kind\").notNull(),\n bId: text(\"b_id\").notNull(),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }).notNull(),\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 endedByKind: text(\"ended_by_kind\"),\n endedById: text(\"ended_by_id\"),\n recordedFrom: bigint(\"recorded_from\", { mode: \"number\" }).notNull(),\n recordedTo: bigint(\"recorded_to\", { mode: \"number\" }).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.recordedIdentityAssertions}_entity_idx`).on(\n t.graphId,\n t.id,\n t.recordedFrom,\n t.recordedTo,\n ),\n index(`${n.recordedIdentityAssertions}_a_idx`).on(\n t.graphId,\n t.aKind,\n t.aId,\n t.recordedFrom,\n t.recordedTo,\n ),\n index(`${n.recordedIdentityAssertions}_b_idx`).on(\n t.graphId,\n t.bKind,\n t.bId,\n t.recordedFrom,\n t.recordedTo,\n ),\n ],\n );\n\n const identityClosure = pgTable(\n n.identityClosure,\n {\n graphId: text(\"graph_id\").notNull(),\n memberKind: text(\"member_kind\").notNull(),\n memberId: text(\"member_id\").notNull(),\n classKind: text(\"class_kind\").notNull(),\n classId: text(\"class_id\").notNull(),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.memberKind, t.memberId] }),\n index(`${n.identityClosure}_class_idx`).on(\n t.graphId,\n t.classKind,\n t.classId,\n ),\n ],\n );\n\n // The identity separation relation: the `different` ledger lifted to whole\n // identity classes, one row per separated class pair. `class_key_low` /\n // `class_key_high` hold the persisted class-key encoding (see\n // `identity/separation.ts`), ordered by code point. The CHECK pins `COLLATE\n // \"C\"` because a database whose default collation is linguistic orders text\n // differently from the writer, which would reject legitimate pairs; under\n // `C` the comparison is byte order, which is exactly code-point order.\n // Fusing two separated classes relabels both sides of their shared row to\n // one key, so the contradiction cannot commit.\n const identitySeparation = pgTable(\n n.identitySeparation,\n {\n graphId: text(\"graph_id\").notNull(),\n classKeyLow: text(\"class_key_low\").notNull(),\n classKeyHigh: text(\"class_key_high\").notNull(),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.classKeyLow, t.classKeyHigh] }),\n index(`${n.identitySeparation}_high_idx`).on(t.graphId, t.classKeyHigh),\n check(\n `${n.identitySeparation}_ordered_pair_check`,\n sql`class_key_low COLLATE \"C\" < class_key_high COLLATE \"C\"`,\n ),\n ],\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 // The edge cardinality claim relation: one row per claim AXIS\n // (`<cardinality>:<edgeKind>`) and endpoint KEY, naming the edge that holds\n // it. Declared edge cardinality is a predicate over `(kind, from)` or\n // `(kind, from, to)`, which the edges primary key `(graph_id, id)` cannot\n // fence, so this relation's own primary key is what refuses a second\n // concurrent claimant. A claim whose holder is no longer live (or, for\n // `oneActive`, no longer active) is taken over in place, which is why the\n // relation needs no release path — see `store/claims/edge-claims.ts`.\n const edgeClaims = pgTable(\n n.edgeClaims,\n {\n graphId: text(\"graph_id\").notNull(),\n axis: text(\"axis\").notNull(),\n key: text(\"key\").notNull(),\n edgeId: text(\"edge_id\").notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.axis, t.key] }),\n index(`${n.edgeClaims}_edge_idx`).on(t.graphId, t.edgeId),\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 identityAssertions,\n recordedIdentityAssertions,\n identityClosure,\n identitySeparation,\n uniques,\n edgeClaims,\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 edgeClaims,\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 * Drizzle SQLite schema for TypeGraph.\n *\n * Provides table definitions that can be customized via the factory function.\n * Users import these tables into their Drizzle schema and use drizzle-kit\n * for migrations.\n *\n * @example\n * ```typescript\n * // Default table names\n * import { tables } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite\";\n *\n * // Custom table names\n * import { createSqliteTables } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite\";\n * const tables = createSqliteTables({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * });\n * ```\n */\nimport { sql } from \"drizzle-orm\";\nimport {\n check,\n index,\n integer,\n primaryKey,\n sqliteTable,\n text,\n uniqueIndex,\n} from \"drizzle-orm/sqlite-core\";\n\nimport {\n buildSqliteEdgeIndexBuilders,\n buildSqliteNodeIndexBuilders,\n buildSqliteSystemIndexBuilders,\n} from \"../../../indexes/drizzle\";\nimport { assertNoSystemIndexNameCollision } from \"../../../indexes/system\";\nimport { type IndexDeclaration } from \"../../../indexes/types\";\n\n/**\n * Table name configuration.\n */\nexport type SqliteTableNames = Readonly<{\n nodes: string;\n edges: string;\n recordedNodes: string;\n recordedEdges: string;\n recordedClock: string;\n revisionOrigins: string;\n identityAssertions: string;\n recordedIdentityAssertions: string;\n identityClosure: string;\n identitySeparation: string;\n uniques: string;\n edgeClaims: string;\n schemaVersions: string;\n fulltext: string;\n indexMaterializations: string;\n contributionMaterializations: string;\n kindRemovals: string;\n reconciliationMarkers: string;\n}>;\n\n// Moved to `../../table-names` (the module that owns physical table-name\n// resolution for the backend layer). Re-exported here so this module's own\n// callers and any external importer of `./adapters/drizzle/sqlite` see no\n// change. Resolved only by `tests/migrate-vectors.test.ts` — that import is\n// what keeps knip from reporting this re-export as unused.\nexport { LEGACY_EMBEDDINGS_TABLE_NAME } from \"../../table-names\";\n\nexport type CreateSqliteTablesOptions = 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: SqliteTableNames = {\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 identityAssertions: \"typegraph_identity_assertions\",\n recordedIdentityAssertions: \"typegraph_recorded_identity_assertions\",\n identityClosure: \"typegraph_identity_closure\",\n identitySeparation: \"typegraph_identity_separation\",\n uniques: \"typegraph_node_uniques\",\n edgeClaims: \"typegraph_edge_claims\",\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 SQLite table definitions with customizable table names.\n * Index names are derived from table names.\n */\nexport function createSqliteTables(\n names: Partial<SqliteTableNames> = {},\n options: CreateSqliteTablesOptions = {},\n) {\n const n: SqliteTableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n const indexes = options.indexes ?? [];\n assertNoSystemIndexNameCollision(indexes, n);\n\n const nodes = sqliteTable(\n n.nodes,\n {\n graphId: text(\"graph_id\").notNull(),\n kind: text(\"kind\").notNull(),\n id: text(\"id\").notNull(),\n props: text(\"props\").notNull(),\n version: integer(\"version\").notNull().default(1),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.kind, t.id] }),\n // System indexes come from SYSTEM_INDEX_DECLARATIONS (single source\n // for both dialects + the runtime materializer).\n ...buildSqliteSystemIndexBuilders(\"nodes\", n.nodes, t),\n ...buildSqliteNodeIndexBuilders(t, indexes),\n ],\n );\n\n const edges = sqliteTable(\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: text(\"props\").notNull(),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n ...buildSqliteSystemIndexBuilders(\"edges\", n.edges, t),\n ...buildSqliteEdgeIndexBuilders(t, indexes),\n ],\n );\n\n const recordedNodes = sqliteTable(\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: text(\"props\").notNull(),\n version: integer(\"version\").notNull(),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n recordedFrom: integer(\"recorded_from\").notNull(),\n recordedTo: integer(\"recorded_to\").notNull(),\n op: text(\"op\").notNull(),\n schemaVersion: integer(\"schema_version\"),\n txId: text(\"tx_id\"),\n meta: text(\"meta\"),\n },\n (t) => [\n primaryKey({ columns: [t.historyId] }),\n ...buildSqliteSystemIndexBuilders(\"recordedNodes\", n.recordedNodes, t),\n ],\n );\n\n const recordedEdges = sqliteTable(\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: text(\"props\").notNull(),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n recordedFrom: integer(\"recorded_from\").notNull(),\n recordedTo: integer(\"recorded_to\").notNull(),\n op: text(\"op\").notNull(),\n schemaVersion: integer(\"schema_version\"),\n txId: text(\"tx_id\"),\n meta: text(\"meta\"),\n },\n (t) => [\n primaryKey({ columns: [t.historyId] }),\n ...buildSqliteSystemIndexBuilders(\"recordedEdges\", n.recordedEdges, t),\n ],\n );\n\n const recordedClock = sqliteTable(\n n.recordedClock,\n {\n graphId: text(\"graph_id\").notNull(),\n revision: integer(\"revision\").notNull(),\n recordedAt: text(\"recorded_at\").notNull(),\n },\n (t) => [primaryKey({ columns: [t.graphId] })],\n );\n\n const revisionOrigins = sqliteTable(\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 // The identity assertion ledger. `ended_by_kind` / `ended_by_id` record WHY\n // an assertion stopped being current: NULL for an explicit retraction,\n // populated with the deleted endpoint's `(kind, id)` when a node soft-delete\n // cascaded onto it. The CHECK holds the two invariants the writers rely on —\n // the pair is set or unset together, and a cause only ever names an ENDED\n // row's own endpoint.\n const identityAssertions = sqliteTable(\n n.identityAssertions,\n {\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n relation: text(\"rel\").notNull(),\n aKind: text(\"a_kind\").notNull(),\n aId: text(\"a_id\").notNull(),\n bKind: text(\"b_kind\").notNull(),\n bId: text(\"b_id\").notNull(),\n validFrom: text(\"valid_from\").notNull(),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n endedByKind: text(\"ended_by_kind\"),\n endedById: text(\"ended_by_id\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n index(`${n.identityAssertions}_a_idx`).on(\n t.graphId,\n t.aKind,\n t.aId,\n t.validTo,\n ),\n index(`${n.identityAssertions}_b_idx`).on(\n t.graphId,\n t.bKind,\n t.bId,\n t.validTo,\n ),\n uniqueIndex(`${n.identityAssertions}_current_pair_idx`)\n .on(t.graphId, t.relation, t.aKind, t.aId, t.bKind, t.bId)\n .where(sql`${t.validTo} IS NULL`),\n check(\n `${n.identityAssertions}_ended_by_check`,\n sql`(ended_by_kind IS NULL) = (ended_by_id IS NULL) AND (ended_by_kind IS NULL OR (valid_to IS NOT NULL AND ((ended_by_kind = a_kind AND ended_by_id = a_id) OR (ended_by_kind = b_kind AND ended_by_id = b_id))))`,\n ),\n ],\n );\n\n const recordedIdentityAssertions = sqliteTable(\n n.recordedIdentityAssertions,\n {\n historyId: text(\"history_id\").notNull(),\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n relation: text(\"rel\").notNull(),\n aKind: text(\"a_kind\").notNull(),\n aId: text(\"a_id\").notNull(),\n bKind: text(\"b_kind\").notNull(),\n bId: text(\"b_id\").notNull(),\n validFrom: text(\"valid_from\").notNull(),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n endedByKind: text(\"ended_by_kind\"),\n endedById: text(\"ended_by_id\"),\n recordedFrom: integer(\"recorded_from\").notNull(),\n recordedTo: integer(\"recorded_to\").notNull(),\n op: text(\"op\").notNull(),\n schemaVersion: integer(\"schema_version\"),\n txId: text(\"tx_id\"),\n meta: text(\"meta\"),\n },\n (t) => [\n primaryKey({ columns: [t.historyId] }),\n index(`${n.recordedIdentityAssertions}_entity_idx`).on(\n t.graphId,\n t.id,\n t.recordedFrom,\n t.recordedTo,\n ),\n index(`${n.recordedIdentityAssertions}_a_idx`).on(\n t.graphId,\n t.aKind,\n t.aId,\n t.recordedFrom,\n t.recordedTo,\n ),\n index(`${n.recordedIdentityAssertions}_b_idx`).on(\n t.graphId,\n t.bKind,\n t.bId,\n t.recordedFrom,\n t.recordedTo,\n ),\n ],\n );\n\n const identityClosure = sqliteTable(\n n.identityClosure,\n {\n graphId: text(\"graph_id\").notNull(),\n memberKind: text(\"member_kind\").notNull(),\n memberId: text(\"member_id\").notNull(),\n classKind: text(\"class_kind\").notNull(),\n classId: text(\"class_id\").notNull(),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.memberKind, t.memberId] }),\n index(`${n.identityClosure}_class_idx`).on(\n t.graphId,\n t.classKind,\n t.classId,\n ),\n ],\n );\n\n // The identity separation relation: the `different` ledger lifted to whole\n // identity classes, one row per separated class pair. `class_key_low` /\n // `class_key_high` hold the persisted class-key encoding (see\n // `identity/separation.ts`), ordered by code point so the CHECK below —\n // SQLite compares TEXT with the BINARY collation, which is code-point order\n // — rejects `low = high`. Fusing two separated classes relabels both sides\n // of their shared row to one key, so the contradiction cannot commit.\n const identitySeparation = sqliteTable(\n n.identitySeparation,\n {\n graphId: text(\"graph_id\").notNull(),\n classKeyLow: text(\"class_key_low\").notNull(),\n classKeyHigh: text(\"class_key_high\").notNull(),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.classKeyLow, t.classKeyHigh] }),\n index(`${n.identitySeparation}_high_idx`).on(t.graphId, t.classKeyHigh),\n check(\n `${n.identitySeparation}_ordered_pair_check`,\n sql`class_key_low < class_key_high`,\n ),\n ],\n );\n\n const uniques = sqliteTable(\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: text(\"deleted_at\"),\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 // The edge cardinality claim relation — same shape and same role as the\n // PostgreSQL table, with a text timestamp, mirroring `uniques`. See\n // `store/claims/edge-claims.ts` for why it needs no release path.\n const edgeClaims = sqliteTable(\n n.edgeClaims,\n {\n graphId: text(\"graph_id\").notNull(),\n axis: text(\"axis\").notNull(),\n key: text(\"key\").notNull(),\n edgeId: text(\"edge_id\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.axis, t.key] }),\n index(`${n.edgeClaims}_edge_idx`).on(t.graphId, t.edgeId),\n ],\n );\n\n const schemaVersions = sqliteTable(\n n.schemaVersions,\n {\n graphId: text(\"graph_id\").notNull(),\n version: integer(\"version\").notNull(),\n schemaHash: text(\"schema_hash\").notNull(),\n schemaDoc: text(\"schema_doc\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n isActive: integer(\"is_active\", { mode: \"boolean\" })\n .notNull()\n .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} = 1`),\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 = sqliteTable(\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: text(\"materialized_at\"),\n lastAttemptedAt: text(\"last_attempted_at\").notNull(),\n lastError: text(\"last_error\"),\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()`. Keyed on `(graph_id, kind_name,\n * entity, schema_version)` — each remove operation is its own row.\n * `entity` separates a node and an edge that share a kind name; the\n * `schema_version` discriminator keeps a re-add-then-re-remove cycle\n * (Foo removed at v=N, re-added, then removed again at v=N+2) from\n * collapsing onto the prior row, where the COALESCE-on-failure rule\n * would preserve the earlier `removed_at` and silently skip the new\n * pending cleanup. `removed_at` is null until the data-cleanup pass\n * succeeds; the pending set is \"rows where removed_at IS NULL\".\n */\n const kindRemovals = sqliteTable(\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: text(\"removed_at\"),\n lastAttemptedAt: text(\"last_attempted_at\").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 the `materializeRemovals`\n * reconciliation walk. One row per `graph_id` carrying the schema\n * version up to which the historical \"did every removal land in\n * `kindRemovals`?\" walk has been verified. Lets subsequent calls\n * skip already-checked transitions instead of re-walking from\n * version 1 every time.\n */\n const reconciliationMarkers = sqliteTable(\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 — the FTS5 virtual table today) has been\n * materialized against this database (#135). Replaces the in-memory\n * per-backend `fulltextEnsured` latch with a queryable database fact.\n * Keyed on `(graph_id, logical_name, owner, table_name)`; `signature`\n * stays out of the key so same-identity drift is a loud error, not a\n * silent re-materialize. Same COALESCE-on-failure preservation rule\n * as `indexMaterializations`.\n */\n const contributionMaterializations = sqliteTable(\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: text(\"materialized_at\"),\n lastAttemptedAt: text(\"last_attempted_at\").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 return {\n nodes,\n edges,\n recordedNodes,\n recordedEdges,\n recordedClock,\n revisionOrigins,\n identityAssertions,\n recordedIdentityAssertions,\n identityClosure,\n identitySeparation,\n uniques,\n edgeClaims,\n schemaVersions,\n indexMaterializations,\n contributionMaterializations,\n kindRemovals,\n reconciliationMarkers,\n /**\n * The fulltext storage is a FTS5 virtual table which Drizzle cannot\n * represent. DDL is emitted as raw SQL and operations query it via\n * `sql.raw()`.\n */\n fulltextTableName: n.fulltext,\n } as const;\n}\n\n/**\n * Default tables with standard TypeGraph table names.\n */\nexport const tables = createSqliteTables();\n\n/**\n * Convenience exports for default tables.\n */\nexport const {\n nodes,\n edges,\n recordedNodes,\n recordedEdges,\n recordedClock,\n uniques,\n edgeClaims,\n schemaVersions,\n} = tables;\n\n/**\n * Type representing the tables object returned by createSqliteTables.\n */\nexport type SqliteTables = ReturnType<typeof createSqliteTables>;\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/fulltext-strategy\";\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 columnDefs.push(...renderTableChecks(config.checks, config.name));\n\n return `CREATE TABLE IF NOT EXISTS \"${config.name}\" (\\n ${columnDefs.join(\",\\n \")}\\n);`;\n}\n\n/**\n * Renders a Drizzle table's CHECK constraints as CREATE TABLE clauses.\n *\n * A CHECK is a correctness barrier, not a hint: the identity separation\n * relation relies on one to abort a contradictory transaction. Dropping it\n * from the emitted DDL would leave the barrier declared in the Drizzle schema\n * and absent from every runtime-provisioned database, so an unrenderable\n * expression throws rather than degrading to a table without it.\n */\nfunction renderTableChecks(\n checks: readonly Readonly<{ name: string; value: unknown }>[],\n tableName: string,\n): readonly string[] {\n return checks.map(\n (check) =>\n `CONSTRAINT \"${check.name}\" CHECK (${inlineSqlOrThrow(\n check.value,\n `table \"${tableName}\" CHECK constraint \"${check.name}\"`,\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 \"PgBigInt53\":\n case \"PgBigInt64\": {\n return \"BIGINT\";\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 columnDefs.push(...renderTableChecks(config.checks, config.name));\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 * Validates the bundled capability declarations a factory assembles before\n * exposing them, then clones and deep-freezes the object so nothing\n * downstream can mutate a capability sub-object after the fact (I14) without\n * freezing objects owned by the caller.\n */\nimport { ConfigurationError } from \"../../errors\";\nimport { type BackendCapabilities } from \"../types\";\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return value;\n }\n Object.freeze(value);\n for (const propertyValue of Object.values(value as Record<string, unknown>)) {\n deepFreeze(propertyValue);\n }\n return value;\n}\n\n/**\n * Refuses a bundled capability declaration that contradicts its own shape,\n * then returns a deep-frozen, backend-owned clone.\n *\n * Two contradictions are refused:\n *\n * 1. `recursiveTraversal.supported === false` with no `reason` — the\n * declaration claims the engine cannot recurse but does not say why.\n * 2. `recursiveTraversal.supported === true` with a dangling `reason` — the\n * declaration claims support while also carrying an explanation for a\n * lack of it.\n *\n * Deliberately narrow: no `pessimisticLocks` / `graphAnalytics` / surface\n * cross-checks here. An all-`false` lock declaration is legitimate on its\n * own, and declaration-vs-surface consistency is a different concern (a\n * resolved bundle's job, not a bundled declaration's).\n *\n * @throws {ConfigurationError} when a declaration contradicts its own shape.\n */\nexport function assertBundledCapabilityDeclarations(\n capabilities: BackendCapabilities,\n): BackendCapabilities {\n const { recursiveTraversal } = capabilities;\n if (\n recursiveTraversal?.supported === false &&\n recursiveTraversal.reason === undefined\n ) {\n throw new ConfigurationError(\n \"Backend capability declaration is contradictory: recursiveTraversal.supported is false but no reason is given.\",\n {\n code: \"CAPABILITY_DECLARATION_CONTRADICTION\",\n member: \"recursiveTraversal\",\n missing: \"reason\",\n },\n {\n suggestion:\n \"Supply a `reason` explaining why this backend cannot perform recursive traversal.\",\n },\n );\n }\n if (\n recursiveTraversal?.supported === true &&\n recursiveTraversal.reason !== undefined\n ) {\n throw new ConfigurationError(\n \"Backend capability declaration is contradictory: recursiveTraversal.supported is true but a dangling reason is present.\",\n {\n code: \"CAPABILITY_DECLARATION_CONTRADICTION\",\n member: \"recursiveTraversal\",\n danglingReason: recursiveTraversal.reason,\n },\n {\n suggestion:\n \"Remove `reason` when recursiveTraversal.supported is true — it is only meaningful alongside `supported: false`.\",\n },\n );\n }\n return deepFreeze(structuredClone(capabilities));\n}\n","/**\n * Shared rules for a `findEdgesByEndpointSet` read.\n *\n * Most of what an endpoint-set read has to get right is enforced by the shape\n * of {@link FindEdgesByEndpointSetParams} itself: one `side` means both\n * endpoints can never fan out at once, the absence of a scalar `fromId` /\n * `toId` means a scalar and a set can never disagree, and the absence of\n * `limit` / `offset` / `after` means no caller can ask for a global slice\n * across a read the backend splits into chunks.\n *\n * What is left needs code: the ids must be deduplicated before they are split\n * across bind-budget chunks, and `limitPerEndpoint` must be a usable number.\n * Both live here so every backend honoring the operation enforces them\n * identically.\n */\nimport { ConfigurationError } from \"../errors\";\nimport type {\n FindEdgesByEndpointSetParams,\n FindEdgesByHeterogeneousEndpointSetParams,\n} from \"./types\";\n\ntype EdgeEndpointReference =\n FindEdgesByHeterogeneousEndpointSetParams[\"endpoints\"][number];\n\n/**\n * Worst-case count of NON-id bound parameters in an endpoint-set read:\n * `graph_id`, `kind`, the endpoint kind, the two `asOf` comparisons, and\n * `limitPerEndpoint`. Every other bind in the statement is an endpoint id, so\n * a chunk of `maxBindParameters - FIND_EDGES_ENDPOINT_FIXED_PARAM_COUNT` ids\n * always fits.\n */\nexport const FIND_EDGES_ENDPOINT_FIXED_PARAM_COUNT = 6;\n\n/**\n * Worst-case non-source binds in a heterogeneous endpoint read: `graph_id`,\n * two `asOf` comparisons, and `limitPerEndpoint`. Edge-kind binds are accounted\n * for separately because their count is supplied by the caller.\n */\nconst FIND_EDGES_HETEROGENEOUS_FIXED_PARAM_COUNT = 4;\n\nfunction assertLimitPerEndpoint(\n operation: string,\n graphId: string,\n limitPerEndpoint: number | undefined,\n kind?: string,\n): void {\n if (\n limitPerEndpoint === undefined ||\n (Number.isInteger(limitPerEndpoint) && limitPerEndpoint > 0)\n ) {\n return;\n }\n throw new ConfigurationError(\n `${operation} \\`limitPerEndpoint\\` must be a positive integer, received ${String(limitPerEndpoint)}.`,\n {\n code: \"EDGE_ENDPOINT_SET_INVALID\",\n graphId,\n ...(kind === undefined ? {} : { kind }),\n },\n {\n suggestion:\n \"Pass a positive integer to cap each endpoint's rows, or omit it for an unbounded read.\",\n },\n );\n}\n\n/**\n * Validates an endpoint-set read and returns its deduplicated id list.\n *\n * Deduplication is a correctness requirement rather than a tidiness one: a\n * repeated id split across two chunks would return its edges twice.\n *\n * @throws {ConfigurationError} when `limitPerEndpoint` is not a positive\n * integer.\n */\nexport function resolveEdgeEndpointIds(\n params: FindEdgesByEndpointSetParams,\n): readonly string[] {\n assertLimitPerEndpoint(\n \"findEdgesByEndpointSet\",\n params.graphId,\n params.limitPerEndpoint,\n params.kind,\n );\n return [...new Set(params.endpointIds)];\n}\n\nfunction endpointKey(endpoint: EdgeEndpointReference): string {\n return `${endpoint.kind}\\0${endpoint.id}`;\n}\n\n/**\n * Validates and normalizes a heterogeneous endpoint-set read and computes how\n * many endpoint pairs fit in one statement.\n */\nexport function resolveHeterogeneousEdgeRead(\n params: FindEdgesByHeterogeneousEndpointSetParams,\n maxBindParameters: number,\n): Readonly<{\n edgeKinds: readonly string[];\n endpoints: readonly EdgeEndpointReference[];\n endpointChunkSize: number;\n}> {\n assertLimitPerEndpoint(\n \"findEdgesByHeterogeneousEndpointSet\",\n params.graphId,\n params.limitPerEndpoint,\n );\n\n const edgeKinds = [...new Set(params.edgeKinds)];\n const endpoints = [\n ...new Map(\n params.endpoints.map((endpoint) => [endpointKey(endpoint), endpoint]),\n ).values(),\n ];\n if (edgeKinds.length === 0 || endpoints.length === 0) {\n return { edgeKinds, endpoints, endpointChunkSize: 1 };\n }\n\n const endpointBindBudget =\n maxBindParameters -\n FIND_EDGES_HETEROGENEOUS_FIXED_PARAM_COUNT -\n edgeKinds.length;\n const endpointChunkSize = Math.floor(endpointBindBudget / 2);\n if (endpointChunkSize >= 1) {\n return { edgeKinds, endpoints, endpointChunkSize };\n }\n\n throw new ConfigurationError(\n \"findEdgesByHeterogeneousEndpointSet cannot fit one endpoint and the selected edge kinds within the backend bind-parameter budget.\",\n {\n code: \"EDGE_HETEROGENEOUS_READ_BIND_BUDGET_EXCEEDED\",\n graphId: params.graphId,\n edgeKindCount: edgeKinds.length,\n maxBindParameters,\n },\n {\n suggestion:\n \"Select fewer edge kinds in one call or use a backend with a larger bind-parameter budget.\",\n },\n );\n}\n","import { sql, type SqlFragment } from \"../query/sql-fragment\";\n\n/** Builds the portable current-node candidate set used by direct searches. */\nexport function buildLiveNodeCandidates(\n nodesTableName: string,\n graphId: string,\n nodeKind: string,\n now: string,\n): SqlFragment {\n const nodes = sql.identifier(nodesTableName);\n return sql`\n SELECT \"id\" AS node_id\n FROM ${nodes}\n WHERE \"graph_id\" = ${graphId}\n AND \"kind\" = ${nodeKind}\n AND \"deleted_at\" IS NULL\n AND (\"valid_from\" IS NULL OR \"valid_from\" <= ${now})\n AND (\"valid_to\" IS NULL OR \"valid_to\" > ${now})\n `;\n}\n","/**\n * Backend-runtime glue between a `VectorStrategy` and the Drizzle\n * SQLite / PostgreSQL backends. Holds the slot-construction and\n * write-error-mapping responsibilities that belong in the backend rather\n * than the strategy:\n *\n * - **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 * - **Write-error mapping.** Turns a raw engine dimension-mismatch into a\n * typed {@link EmbeddingDimensionChangedError} with actionable guidance.\n *\n * Per-field table creation is no longer done here: it rides the #135\n * durable-contribution machinery (`createContributionMaterializer`),\n * materialized by the privileged migrator at boot and asserted (SELECT,\n * never DDL) on the runtime hot path — see `contribution-materializations.ts`.\n */\nimport { EmbeddingDimensionChangedError } from \"../../errors\";\nimport { type VectorSlot } from \"../../query/dialect/vector-strategy\";\nimport { parseDimensionMismatch } from \"../../utils/sql-errors\";\nimport {\n type CreateVectorIndexParams,\n type DropVectorIndexParams,\n} from \"../types\";\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 ConfigurationError,\n ContributionRebuildUnsupportedError,\n ContributionUnavailableError,\n StoreNotInitializedError,\n type StoreNotInitializedReason,\n} from \"../../errors\";\nimport {\n buildForeignFulltextGraphProbe,\n buildFulltextGraphDelete,\n type FulltextStrategy,\n} from \"../../query/dialect/fulltext-strategy\";\nimport { type SqlDialect } from \"../../query/dialect/types\";\nimport {\n type VectorSlot,\n type VectorStrategy,\n} from \"../../query/dialect/vector-strategy\";\nimport { sql as portableSql } from \"../../query/sql-fragment\";\nimport {\n asCompiledRowsSql,\n asCompiledStatementSql,\n} from \"../../query/sql-intent\";\nimport { sortedReplacer } from \"../../schema/canonical\";\nimport { sha256Hex } from \"../../utils/hash\";\nimport { errorChain, isMissingTableError } from \"../../utils/sql-errors\";\nimport {\n requireWriteFence,\n resolveWriteFencePlan,\n type WriteFenceTarget,\n} from \"../capabilities/write-fence\";\nimport { deriveBackend } from \"../derive-backend\";\nimport { formatPostgresTimestamp, nowIso } from \"../row-mappers\";\nimport type { StrategyTableContribution } from \"../table-contribution\";\nimport {\n type ContributionDiagnostic,\n type ContributionDiagnosticState,\n type ContributionMaterializationIdentity,\n type ContributionMaterializationRow,\n type ContributionProbeContribution,\n type ContributionProbeEntry,\n type ContributionRebuildResult,\n type ContributionRebuildScope,\n type ContributionRepairEntry,\n type ContributionRepairResult,\n type ContributionRepopulationStats,\n type RecordContributionMaterializationParams,\n type SchemaWriteTransactionBackend,\n type TransactionBackend,\n} from \"../types\";\nimport { runtimeStrategyContributions } from \"./ddl\";\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 */\nfunction contributionSignatureInput(\n dialect: SqlDialect,\n identity: Readonly<{\n owner: string;\n logicalName: string;\n tableName: string;\n }>,\n createDdl: readonly string[],\n): string {\n const hashable = {\n dialect,\n owner: identity.owner,\n logicalName: identity.logicalName,\n tableName: identity.tableName,\n createDdl,\n };\n return JSON.stringify(hashable, sortedReplacer);\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 */\ntype ContributionMaterializationState =\n \"initialized\" | 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\n/**\n * Cross the durable marker verdict with physical-catalog reality and\n * name why the contribution is unusable, or `undefined` when it is fine.\n *\n * With the table ABSENT there are three cases, and only one of them is\n * silence:\n * - a marker recording a prior success is an `orphaned-marker`. Table\n * absence dominates whatever the marker claims about shape: once the\n * storage is gone the recorded signature is moot and the repair\n * (recreate, then re-stamp) is the same either way.\n * - a marker recording a FAILED attempt is `failed-materialization`.\n * Marker and catalog agree — provisioning was tried and it broke —\n * but agreement is not health, and staying silent here would hide the\n * exact state an operator is looking for.\n * - no marker row at all is genuinely silent: nothing has been\n * attempted, and boot will provision it on the next privileged run.\n *\n * With the table PRESENT, `missing` and same-signature `failed` collapse to\n * `missing-marker`: both mean \"storage exists but no marker attests it\", and\n * both are repaired by re-running the ensure. A prior success at another\n * signature stays `stale` even when the latest attempt failed, because its\n * repair is a shape change, not a re-stamp.\n */\nfunction diagnoseContribution(\n row: ContributionMaterializationRow | undefined,\n signature: string,\n tableExists: boolean,\n): ContributionDiagnosticState | undefined {\n if (!tableExists) {\n if (row === undefined) return undefined;\n if (row.materializedAt !== undefined) return \"orphaned-marker\";\n return row.lastError === undefined ? undefined : \"failed-materialization\";\n }\n // A prior success at another signature means the existing table has the old\n // physical shape. That remains `stale` even when a later failed attempt also\n // recorded an error: classifying it as `missing-marker` would invite an\n // idempotent CREATE + marker re-stamp to bless the unchanged stale table.\n if (row?.materializedAt !== undefined && row.signature !== signature) {\n return \"stale\";\n }\n const state = evaluateContributionState(row, signature);\n switch (state) {\n case \"initialized\": {\n return undefined;\n }\n case \"stale\": {\n return \"stale\";\n }\n case \"missing\":\n case \"failed\": {\n return \"missing-marker\";\n }\n default: {\n return state satisfies never;\n }\n }\n}\n\n/**\n * A contribution `verifyContributions` will check, tagged with the\n * vector-slot coordinates that produced it. Both tags are absent for the\n * runtime (fulltext) contributions, which are not per-`(kind, field)`.\n *\n * `projection` records which enumeration loop produced the target rather\n * than being re-derived from the contribution's `logicalName` later. The\n * probe groups by it, and reconstructing the grouping from a name\n * convention would put a second, silently divergent classifier next to\n * the one that actually built the set.\n */\ntype VerificationTarget = Readonly<{\n contribution: StrategyTableContribution;\n projection: ContributionProbeContribution;\n kind?: string;\n fieldPath?: string;\n}>;\n\ntype DiagnosedContribution = Readonly<{\n graphId: string;\n contribution: StrategyTableContribution;\n projection: ContributionProbeContribution;\n diagnostic: ContributionDiagnostic;\n}>;\n\n/**\n * Order probe entries are reported in. Fixed rather than derived from\n * declaration order so a result is stable enough to assert on and to\n * diff between two probes of the same store.\n */\nconst PROBE_PROJECTION_ORDER: readonly ContributionProbeContribution[] = [\n \"fulltext\",\n \"vector\",\n] as const;\n\n/** Why the projection is unusable, in one operator-facing clause. */\nconst PROBE_DETAIL_PHRASE: Readonly<\n Record<ContributionDiagnosticState, string>\n> = {\n \"orphaned-marker\": \"storage is missing\",\n \"missing-marker\": \"storage is not attested by a durable marker\",\n \"failed-materialization\": \"provisioning failed and produced no storage\",\n stale: \"storage exists at a different shape than the current declaration\",\n};\n\n/**\n * Names the affected contribution the way an operator would look for it:\n * a vector slot by its `(kind, field)` coordinates, fulltext by the\n * physical table, since fulltext has exactly one table per graph and its\n * name is what a caller would have dropped or renamed.\n */\nfunction describeProbeDiagnostic(diagnostic: ContributionDiagnostic): string {\n const subject =\n diagnostic.kind === undefined || diagnostic.fieldPath === undefined ?\n `table \"${diagnostic.physicalName}\"`\n : `${diagnostic.kind}.${diagnostic.fieldPath}`;\n return (\n `${subject}: ${PROBE_DETAIL_PHRASE[diagnostic.state]} ` +\n `(${diagnostic.state})`\n );\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\ntype RefuseUnavailableFulltext = (\n graphId: string,\n error: unknown,\n) => Promise<never>;\n\nfunction missingTableErrorNames(error: unknown, tableName: string): boolean {\n const quotedTableName = `\"${tableName.replaceAll('\"', '\"\"')}\"`;\n for (const link of errorChain(error)) {\n const message = errorMessage(link);\n if (typeof message !== \"string\") continue;\n\n // workerd appends `: SQLITE_ERROR` to SQLite's missing-table message.\n // Keep that diagnostic delimiter out of the physical identifier so the\n // exact-name check below sees the declared table, not `<table>:`.\n const sqliteMatch = /\\bno such table:\\s*([^\\s;:]+)/i.exec(message);\n const sqliteName = unquoteSqliteIdentifier(sqliteMatch?.[1]);\n if (sqliteName === tableName) return true;\n\n const namesPostgresTable =\n message.includes(`relation ${quotedTableName} does not exist`) ||\n message.includes(`table ${quotedTableName} does not exist`);\n if (namesPostgresTable) return true;\n }\n return false;\n}\n\nfunction errorMessage(error: unknown): string | undefined {\n if (typeof error === \"string\") return error;\n if (error instanceof Error) return error.message;\n if (typeof error !== \"object\" || error === null || !(\"message\" in error)) {\n return undefined;\n }\n return typeof error.message === \"string\" ? error.message : undefined;\n}\n\nfunction unquoteSqliteIdentifier(identifier: string | undefined): string | undefined {\n if (identifier === undefined) return undefined;\n const first = identifier.at(0);\n const last = identifier.at(-1);\n const isQuoted =\n (first === '\"' && last === '\"') ||\n (first === \"'\" && last === \"'\") ||\n (first === \"`\" && last === \"`\") ||\n (first === \"[\" && last === \"]\");\n return isQuoted ? identifier.slice(1, -1) : identifier;\n}\n\nasync function executeGatedFulltext<T>(\n graphId: string,\n assert: (graphId: string) => Promise<void>,\n refuseUnavailable: RefuseUnavailableFulltext,\n execute: () => Promise<T>,\n): Promise<T> {\n await assert(graphId);\n try {\n return await execute();\n } catch (error) {\n return refuseUnavailable(graphId, error);\n }\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 refuseUnavailable: RefuseUnavailableFulltext,\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;\n gated.upsertFulltext = async (params) => {\n await executeGatedFulltext(params.graphId, assert, refuseUnavailable, () =>\n raw(params),\n );\n };\n }\n if (source.deleteFulltext) {\n const raw = source.deleteFulltext;\n gated.deleteFulltext = async (params) => {\n await executeGatedFulltext(params.graphId, assert, refuseUnavailable, () =>\n raw(params),\n );\n };\n }\n if (source.upsertFulltextBatch) {\n const raw = source.upsertFulltextBatch;\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 executeGatedFulltext(params.graphId, assert, refuseUnavailable, () =>\n raw(params),\n );\n };\n }\n if (source.deleteFulltextBatch) {\n const raw = source.deleteFulltextBatch;\n gated.deleteFulltextBatch = async (params) => {\n if (params.nodeIds.length === 0) return;\n await executeGatedFulltext(params.graphId, assert, refuseUnavailable, () =>\n raw(params),\n );\n };\n }\n if (source.fulltextSearch) {\n const raw = source.fulltextSearch;\n gated.fulltextSearch = async (params) => {\n return executeGatedFulltext(\n params.graphId,\n assert,\n refuseUnavailable,\n () => raw(params),\n );\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;\n gated.hardDeleteNode = async (params) => {\n await executeGatedFulltext(params.graphId, assert, refuseUnavailable, () =>\n rawHardDelete(params),\n );\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 refuseUnavailable: RefuseUnavailableFulltext,\n): TransactionBackend {\n return deriveBackend<TransactionBackend>(\n tx,\n gateFulltextMethods(tx, assert, refuseUnavailable),\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 /**\n * The write-fence target `lockContributionDdl` / `lockSharedFulltextTable`\n * resolve a plan from — a small first-party-marked object rather than the\n * whole backend, so this module needs no more of `GraphBackend` than the\n * lock decision itself.\n */\n fenceTarget: WriteFenceTarget;\n fulltextStrategy: FulltextStrategy;\n fulltextTableName: string;\n /**\n * Active vector strategy, or `undefined` when vector support is\n * disabled. When present, its per-`(kind, field)` `ownedTables(slot)`\n * contributions ride this same durable-marker machinery — boot\n * materializes them under the privileged role, the runtime hot path\n * asserts them with a SELECT (never DDL), exactly like fulltext.\n */\n vectorStrategy: VectorStrategy | undefined;\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 /** Read every contribution marker for one graph in a single query. */\n getMarkers: (\n graphId: string,\n ) => Promise<readonly ContributionMaterializationRow[]>;\n recordMarker: (\n params: RecordContributionMaterializationParams,\n ) => Promise<void>;\n /**\n * Delete a marker row by identity. Used when a contribution's physical\n * table is torn down out-of-band (vector-field reclaim) so a later\n * re-provision sees \"missing\" and re-creates the table rather than\n * trusting an orphaned \"initialized\" marker.\n */\n deleteMarker: (\n identity: ContributionMaterializationIdentity,\n ) => Promise<void>;\n /**\n * Whether `tableName` exists in the connection's catalog right now.\n * The dialect-specific half of `verifyContributions`; the backend\n * supplies its `buildTableExists` probe. Must NOT be cached across\n * calls — a table confirmed present earlier is exactly the table this\n * diagnostic has to re-check.\n */\n tableExists: (tableName: string) => Promise<boolean>;\n /**\n * Run an administrative callback under the same per-graph fence as a\n * schema commit, with transaction-scoped DDL available. The destructive\n * rebuild's only seam: it makes drop → recreate → refill → stamp one\n * atomic unit, so an interrupted rebuild rolls back to the state it\n * started from instead of leaving storage attested but empty.\n *\n * Absent on a backend with no transactional schema fence, which\n * declines the rebuild rather than running it unfenced.\n */\n schemaWriteTransaction?: <T>(\n graphId: string,\n fn: (tx: SchemaWriteTransactionBackend) => Promise<T>,\n ) => Promise<T>;\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 * Error-path classification for a gated fulltext operation. Translates only\n * a missing-relation failure that names the declared fulltext table; every\n * other failure is rethrown unchanged.\n */\n refuseUnavailableFulltext: RefuseUnavailableFulltext;\n /**\n * Privileged materializer for one vector slot's `ownedTables`\n * contribution(s): creates the per-`(kind, field)` table and records\n * its durable marker, idempotently. Pass `{ force: true }` to bypass\n * the drift-guard and overwrite the marker at the current signature —\n * the sanctioned path for `reembedVectorField`'s deliberate\n * dimension change. Pass `{ onDrift: \"skip\" }` to leave a drifted slot\n * untouched (warn, no marker write, no throw) instead of refusing —\n * the boot/evolve path, where the declared shape may have moved ahead\n * of a `reembedVectorField` the operator has not run yet. No-op when\n * vector support is disabled.\n */\n ensureVectorSlot: (\n slot: VectorSlot,\n options?: Readonly<{ force?: boolean; onDrift?: \"throw\" | \"skip\" }>,\n ) => Promise<void>;\n /** Batch form used by boot to share marker reads across every vector slot. */\n ensureVectorSlots: (\n slots: readonly VectorSlot[],\n options?: Readonly<{ force?: boolean; onDrift?: \"throw\" | \"skip\" }>,\n ) => Promise<void>;\n /**\n * Hot-path gate for one vector slot: SELECT-only marker assert over\n * the slot's `ownedTables` contribution(s), cached per backend\n * instance. Throws `StoreNotInitializedError` when the slot is\n * missing/stale/failed. No-op when vector support is disabled.\n */\n assertVectorSlot: (slot: VectorSlot) => Promise<void>;\n /** Batch form used by verified attach to perform one marker read. */\n assertVectorSlots: (slots: readonly VectorSlot[]) => Promise<void>;\n /**\n * Forget a vector slot: delete its `ownedTables` contribution\n * marker(s) and evict the per-instance cache. Called after the slot's\n * physical table is dropped (vector-field reclaim) so a future\n * `ensureVectorSlot` re-creates the table instead of trusting an\n * orphaned marker. No-op when vector support is disabled.\n */\n dropVectorSlot: (slot: VectorSlot) => Promise<void>;\n /** Conservatively evict one slot from the process-local marker cache. */\n evictVectorSlot: (slot: VectorSlot) => void;\n /**\n * Diagnostic: cross each currently declared runtime contribution and each\n * supplied vector slot's `ownedTables` contribution against its durable\n * marker and the physical catalog. This includes a recorded failed\n * materialization even when marker and catalog agree that no table exists.\n * Contributions with neither marker nor table and marker rows outside this\n * declaration set are omitted. Read-only: no DDL, no marker writes, and no\n * effect on the per-instance caches the hot path relies on.\n */\n verifyContributions: (\n graphId: string,\n vectorSlots: readonly VectorSlot[],\n ) => Promise<readonly ContributionDiagnostic[]>;\n /**\n * Privileged repair pass over declarations resolved inside this\n * materializer. Only non-destructive states are repaired automatically.\n */\n repairContributions: (\n graphId: string,\n vectorSlots: readonly VectorSlot[],\n ) => Promise<ContributionRepairResult>;\n /**\n * Read-only readiness projection over the same audit\n * `verifyContributions` runs, one entry per search projection.\n */\n probeContributions: (\n graphId: string,\n vectorSlots: readonly VectorSlot[],\n ) => Promise<readonly ContributionProbeEntry[]>;\n /**\n * Destructive rebuild of one projection's storage: drop, recreate from\n * the current `createDdl`, refill through `repopulate`, stamp the\n * marker. Atomic under the backend's schema fence. Refuses rather than\n * destroying anything it cannot reconstruct.\n */\n rebuildContribution: (\n graphId: string,\n scope: ContributionRebuildScope,\n repopulate: (\n target: TransactionBackend,\n ) => Promise<ContributionRepopulationStats>,\n ) => Promise<ContributionRebuildResult>;\n}>;\n\n/**\n * Whether a fulltext rebuild can be served, given the active strategy and\n * whether the backend has a transactional schema fence to run it under.\n *\n * Exported so `capabilities.contributions.rebuild` and the runtime\n * refusal inside `rebuildContribution` are two readings of one predicate\n * rather than two predicates that have to be kept in step. A backend\n * whose advertised capability disagrees with what the call actually does\n * is worse than one that declines.\n */\nexport function contributionRebuildSupported(\n fulltextStrategy: FulltextStrategy,\n fulltextTableName: string,\n transactional: boolean,\n): boolean {\n return (\n transactional &&\n runtimeStrategyContributions(fulltextStrategy, fulltextTableName).every(\n (contribution) => contribution.dropDdl !== undefined,\n )\n );\n}\n\n/**\n * Advisory-lock key serializing contribution DDL across every graph in one\n * database. See `lockContributionDdl`.\n */\nconst CONTRIBUTION_DDL_LOCK_KEY = \"typegraph:contribution-ddl\";\n\n/**\n * How many other graph ids a refusal names. The probe only has to decide\n * whether the set is empty; the ids are there so an operator knows which\n * deployments share the table, and a full list of them would be unbounded.\n */\nconst FOREIGN_GRAPH_REPORT_LIMIT = 5;\n\n// NUL separator for the per-instance contribution cache key: collision-safe\n// across arbitrary graph ids / names (a printable delimiter could appear in a\n// caller-supplied graph id).\nconst CONTRIBUTION_KEY_SEPARATOR = String.fromCodePoint(0);\n\nfunction contributionKey(\n graphId: string,\n contribution: Readonly<{\n owner: string;\n logicalName: string;\n tableName: string;\n }>,\n): string {\n return [\n graphId,\n contribution.owner,\n contribution.logicalName,\n contribution.tableName,\n ].join(CONTRIBUTION_KEY_SEPARATOR);\n}\n\nexport function createContributionMaterializer(\n deps: ContributionMaterializerDeps,\n): ContributionMaterializer {\n const { dialect, fulltextStrategy, fulltextTableName } = deps;\n\n // Positive-only cache keyed per contribution identity\n // (`graphId | owner | logicalName | tableName`), holding the SIGNATURE the\n // marker was last observed materialized at on this connection. A cache hit\n // requires the freshly-computed signature to match the cached one, so a\n // changed shape (dimension, metric, storage DDL) on the same instance\n // misses the cache and falls through to the drift-guard / stale verdict —\n // the warm cache can never bless a contribution whose shape moved.\n // Per-contribution (not per-graph) so each per-`(kind, field)` vector slot\n // caches independently and the hot-path assert stays a small DDL-string\n // comparison plus `Map.get` after the first SELECT. Missing/stale/failed\n // verdicts are never cached, so a concurrent boot that fixes the state is\n // picked up on the next call.\n const initializedSignatures = new Map<string, string>();\n // A vector slot evicted during transactional cleanup cannot safely become a\n // positive cache hit again on this materializer: another request may read\n // the old marker before the cleanup commits, then finish after commit. Keep\n // evicted keys permanently read-through for this backend instance so such a\n // stale snapshot can never repopulate the positive cache. Re-added slots are\n // rare; their gates pay one marker SELECT instead of risking a silent pass.\n const uncacheableKeys = new Set<string>();\n // Computing the durable signature requires WebCrypto. Keep the canonical\n // DDL beside its digest so the hot path only compares the current DDL\n // strings. A same-instance shape change produces a mismatch and therefore\n // a fresh canonical input + digest; unchanged contributions reuse the\n // settled promise without serialization or new crypto work. The cache key\n // already covers every non-DDL signature field (owner/logical/table), while\n // dialect is fixed for the lifetime of this materializer.\n const computedSignatures = new Map<\n string,\n Readonly<{ createDdl: readonly string[]; signature: Promise<string> }>\n >();\n\n async function resolveContributionSignature(\n key: string,\n contribution: StrategyTableContribution,\n ): Promise<string> {\n const cached = computedSignatures.get(key);\n const cachedCreateDdl = cached?.createDdl;\n const cachedSignature = cached?.signature;\n if (\n cachedCreateDdl?.length === contribution.createDdl.length &&\n cachedSignature !== undefined &&\n contribution.createDdl.every(\n (statement, index) => cachedCreateDdl[index] === statement,\n )\n ) {\n return cachedSignature;\n }\n\n const input = contributionSignatureInput(\n dialect,\n contribution,\n contribution.createDdl,\n );\n const entry = {\n createDdl: [...contribution.createDdl],\n signature: sha256Hex(input, 16),\n } as const;\n computedSignatures.set(key, entry);\n try {\n return await entry.signature;\n } catch (error) {\n if (computedSignatures.get(key) === entry) {\n computedSignatures.delete(key);\n }\n throw error;\n }\n }\n\n function runtimeContributions(): readonly StrategyTableContribution[] {\n return runtimeStrategyContributions(fulltextStrategy, fulltextTableName);\n }\n\n function cacheInitializedSignature(key: string, signature: string): void {\n if (!uncacheableKeys.has(key)) {\n initializedSignatures.set(key, signature);\n }\n }\n\n async function materializeOne(\n graphId: string,\n contribution: StrategyTableContribution,\n signature: string,\n existing: ContributionMaterializationRow | undefined,\n options?: Readonly<{ force?: boolean; onDrift?: \"throw\" | \"skip\" }>,\n ): Promise<\"materialized\" | \"drift-skipped\"> {\n const force = options?.force === true;\n const identity = identityOf(graphId, contribution);\n\n // Already materialized at this exact shape — nothing to do. `force`\n // re-runs the DDL and re-stamps the marker even on a match: the path\n // `reembedVectorField` relies on after it has recreated the table.\n if (\n !force &&\n evaluateContributionState(existing, signature) === \"initialized\"\n ) {\n return \"materialized\";\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 // `force` deliberately bypasses this — the caller has already dropped\n // and recreated the table at the new shape (`reembedVectorField`).\n if (!force && priorSuccess && existing.signature !== signature) {\n // `onDrift: \"skip\"` (boot/evolve): leave the slot exactly as it is —\n // marker untouched (so old-shape reads keep their verdict), nothing\n // cached, no throw. Writes to the new shape fail as `stale` until\n // `store.reembedVectorField` recreates storage and force-restamps.\n if (options?.onDrift === \"skip\") {\n console.warn(\n `[typegraph] contribution \"${contribution.logicalName}\" (table ` +\n `\"${contribution.tableName}\") is provisioned at a different ` +\n `shape than the current declaration — left untouched. Writes ` +\n `to it will fail until store.reembedVectorField(kind, ` +\n `fieldPath) recreates the storage at the new shape.`,\n );\n return \"drift-skipped\";\n }\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 // Record the failed attempt but keep the RECORDED signature: it is\n // the only evidence of the shape the table actually has. Stamping\n // the shape we just refused to provision would leave a row matching\n // the current declaration with `last_error` set, which\n // `diagnoseContribution` reads as `missing-marker` — pointing the\n // operator at the idempotent re-stamp repair that blesses the\n // unchanged old-shape table, and letting the next attempt skip this\n // guard. Staying `stale` points at `store.rebuildContribution()`.\n await deps.recordMarker({\n ...identity,\n signature: existing.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 return \"materialized\";\n }\n\n function indexMarkerRows(\n graphId: string,\n rows: readonly ContributionMaterializationRow[],\n ): ReadonlyMap<string, ContributionMaterializationRow> {\n return new Map(\n rows.map((row) => [contributionKey(graphId, row), row] as const),\n );\n }\n\n /**\n * Read every marker for a graph in one round trip. A missing marker table\n * is its own verdict so boot can create it while hot-path asserts translate\n * it to `StoreNotInitializedError`. All other database faults propagate.\n */\n async function readMarkerRows(graphId: string): Promise<\n | Readonly<{\n kind: \"rows\";\n rows: ReadonlyMap<string, ContributionMaterializationRow>;\n }>\n | Readonly<{ kind: \"missing-table\"; error: unknown }>\n > {\n try {\n return {\n kind: \"rows\",\n rows: indexMarkerRows(graphId, await deps.getMarkers(graphId)),\n };\n } catch (error) {\n if (!isMissingTableError(error)) throw error;\n return { kind: \"missing-table\", error };\n }\n }\n\n /**\n * Privileged materialize over an arbitrary contribution set. Per\n * contribution: skip if cached at the current signature; else (unless\n * `force`) a read-only\n * pre-check short-circuits the whole pending set when every marker is\n * already initialized at its current signature, so a warm graph stays\n * DDL-free — the marker `CREATE TABLE IF NOT EXISTS` itself would fail\n * on a connection that can't run DDL (#149). Otherwise ensure the\n * marker table and `materializeOne` each pending contribution. `force`\n * re-runs the DDL and re-stamps the marker unconditionally (drift-guard\n * bypassed) — the `reembedVectorField` recreate path.\n */\n async function ensureContributions(\n graphId: string,\n contributions: readonly StrategyTableContribution[],\n options?: Readonly<{\n force?: boolean;\n onDrift?: \"throw\" | \"skip\";\n bypassCache?: boolean;\n }>,\n ): Promise<void> {\n const force = options?.force === true;\n const bypassCache = options?.bypassCache === true;\n const entries = await Promise.all(\n contributions.map(async (contribution) => {\n const key = contributionKey(graphId, contribution);\n return {\n contribution,\n key,\n signature: await resolveContributionSignature(key, contribution),\n };\n }),\n );\n if (bypassCache) {\n // Repair is invoked precisely when durable state may have changed behind\n // this materializer's positive cache. Keep every touched key read-through\n // from now on: deleting only the current entry would still let an assert\n // that started before the repair repopulate stale success after a failed\n // repair recorded the contribution as unusable.\n for (const entry of entries) {\n uncacheableKeys.add(entry.key);\n initializedSignatures.delete(entry.key);\n }\n }\n // A cache hit requires the signature to match — a contribution whose\n // shape changed on this instance falls through to the drift-guard.\n const pending =\n force || bypassCache ? entries : (\n entries.filter(\n (entry) =>\n uncacheableKeys.has(entry.key) ||\n initializedSignatures.get(entry.key) !== entry.signature,\n )\n );\n if (pending.length === 0) return;\n\n const initialRead = force ? undefined : await readMarkerRows(graphId);\n if (\n !force &&\n initialRead?.kind === \"rows\" &&\n pending.every(\n (entry) =>\n evaluateContributionState(\n initialRead.rows.get(entry.key),\n entry.signature,\n ) === \"initialized\",\n )\n ) {\n for (const entry of pending) {\n cacheInitializedSignature(entry.key, entry.signature);\n }\n return;\n }\n\n await deps.ensureMarkerTable();\n // Preserve the original race check after marker-table bootstrap, but\n // refresh every pending contribution in one query rather than one query\n // per slot.\n const existingRows = indexMarkerRows(\n graphId,\n await deps.getMarkers(graphId),\n );\n for (const entry of pending) {\n const outcome = await materializeOne(\n graphId,\n entry.contribution,\n entry.signature,\n existingRows.get(entry.key),\n {\n force,\n ...(options?.onDrift === undefined ?\n {}\n : { onDrift: options.onDrift }),\n },\n );\n // A drift-skipped contribution is deliberately NOT cached: nothing\n // was materialized at this signature, and asserts must keep reading\n // it as stale until reembedVectorField restamps it.\n if (outcome === \"materialized\") {\n cacheInitializedSignature(entry.key, entry.signature);\n }\n }\n }\n\n /**\n * SELECT-only gate over an arbitrary contribution set: throws\n * `StoreNotInitializedError` on the first missing/stale/failed\n * contribution (or a never-bootstrapped marker table). Caches each\n * confirmed-initialized contribution BY SIGNATURE so the steady state is a\n * crypto-free DDL-string comparison + `Map.get`. A shape change on the same\n * instance computes a fresh signature, misses the initialized cache, and\n * surfaces as `stale`. Never runs DDL or writes.\n */\n async function assertContributions(\n graphId: string,\n contributions: readonly StrategyTableContribution[],\n ): Promise<void> {\n const entries = await Promise.all(\n contributions.map(async (contribution) => {\n const key = contributionKey(graphId, contribution);\n return {\n contribution,\n key,\n signature: await resolveContributionSignature(key, contribution),\n };\n }),\n );\n const pending = entries.filter(\n (entry) =>\n uncacheableKeys.has(entry.key) ||\n initializedSignatures.get(entry.key) !== entry.signature,\n );\n if (pending.length === 0) return;\n\n const read = await readMarkerRows(graphId);\n if (read.kind === \"missing-table\") {\n const first = pending[0];\n if (first === undefined) return;\n throw new StoreNotInitializedError(graphId, \"missing\", {\n cause: read.error,\n details: { logicalName: first.contribution.logicalName },\n });\n }\n\n for (const entry of pending) {\n const { contribution, key, signature } = entry;\n const state = evaluateContributionState(read.rows.get(key), signature);\n if (state !== \"initialized\") {\n throw new StoreNotInitializedError(graphId, state, {\n details: { logicalName: contribution.logicalName },\n });\n }\n cacheInitializedSignature(key, signature);\n }\n }\n\n async function ensureRuntimeContributions(graphId: string): Promise<void> {\n await ensureContributions(graphId, runtimeContributions());\n }\n\n async function assertInitialized(graphId: string): Promise<void> {\n await assertContributions(graphId, runtimeContributions());\n }\n\n async function refuseUnavailableFulltext(\n graphId: string,\n error: unknown,\n ): Promise<never> {\n await Promise.resolve();\n if (!isMissingTableError(error)) throw error;\n\n // A failed transaction cannot run the uncached catalog audit on every\n // backend (Postgres marks it aborted; PGlite shares that one session).\n // The failed statement still names the missing physical table. That is\n // transaction-safe proof that the declared physical storage is\n // missing and avoids any healthy-path query. It does not prove the marker\n // still exists because the preceding assertion may have hit its cache.\n const missingContribution = runtimeContributions().find(\n (contribution) =>\n contribution.logicalName === \"fulltext\" &&\n missingTableErrorNames(error, contribution.tableName),\n );\n if (missingContribution !== undefined) {\n throw new ContributionUnavailableError(\n graphId,\n missingContribution.tableName,\n { cause: error },\n );\n }\n throw error;\n }\n\n async function ensureVectorSlot(\n slot: VectorSlot,\n options?: Readonly<{ force?: boolean; onDrift?: \"throw\" | \"skip\" }>,\n ): Promise<void> {\n await ensureVectorSlots([slot], options);\n }\n\n async function assertVectorSlot(slot: VectorSlot): Promise<void> {\n await assertVectorSlots([slot]);\n }\n\n function groupVectorContributions(\n slots: readonly VectorSlot[],\n ): ReadonlyMap<string, readonly StrategyTableContribution[]> {\n const grouped = new Map<string, readonly StrategyTableContribution[]>();\n if (deps.vectorStrategy === undefined) return grouped;\n for (const slot of slots) {\n grouped.set(slot.graphId, [\n ...(grouped.get(slot.graphId) ?? []),\n ...deps.vectorStrategy.ownedTables(slot),\n ]);\n }\n return grouped;\n }\n\n async function ensureVectorSlots(\n slots: readonly VectorSlot[],\n options?: Readonly<{ force?: boolean; onDrift?: \"throw\" | \"skip\" }>,\n ): Promise<void> {\n for (const [graphId, contributions] of groupVectorContributions(slots)) {\n await ensureContributions(graphId, contributions, options);\n }\n }\n\n async function assertVectorSlots(\n slots: readonly VectorSlot[],\n ): Promise<void> {\n for (const [graphId, contributions] of groupVectorContributions(slots)) {\n await assertContributions(graphId, contributions);\n }\n }\n\n function verificationTargetsByGraph(\n graphId: string,\n vectorSlots: readonly VectorSlot[],\n ): ReadonlyMap<string, readonly VerificationTarget[]> {\n const targets = new Map<string, VerificationTarget[]>();\n function addTarget(id: string, target: VerificationTarget): void {\n const existing = targets.get(id);\n if (existing === undefined) targets.set(id, [target]);\n else existing.push(target);\n }\n\n for (const contribution of runtimeContributions()) {\n addTarget(graphId, { contribution, projection: \"fulltext\" });\n }\n const { vectorStrategy } = deps;\n if (vectorStrategy !== undefined) {\n for (const slot of vectorSlots) {\n for (const contribution of vectorStrategy.ownedTables(slot)) {\n addTarget(slot.graphId, {\n contribution,\n projection: \"vector\",\n kind: slot.nodeKind,\n fieldPath: slot.fieldPath,\n });\n }\n }\n }\n return targets;\n }\n\n /**\n * The single detection pass every rung of the health ladder consults.\n * Takes the resolved target map rather than re-enumerating, so the\n * probe can group by the same declaration set this diagnosed — a second\n * enumeration would be free to disagree with the one that produced the\n * verdicts.\n */\n async function diagnoseTargets(\n targetsByGraph: ReadonlyMap<string, readonly VerificationTarget[]>,\n ): Promise<readonly DiagnosedContribution[]> {\n // One probe per distinct physical table, scoped to THIS call: a\n // strategy may own several contributions over one table, and paying a\n // round trip per contribution would be waste. Deliberately not the\n // backend's long-lived `createCachedTableExistence` — a cache that\n // outlived the call would answer from the very state this diagnostic\n // exists to re-check.\n const probes = new Map<string, Promise<boolean>>();\n function tableExists(tableName: string): Promise<boolean> {\n const pending = probes.get(tableName);\n if (pending !== undefined) return pending;\n const probe = deps.tableExists(tableName);\n probes.set(tableName, probe);\n return probe;\n }\n\n const diagnosed: DiagnosedContribution[] = [];\n for (const [id, targets] of targetsByGraph) {\n // A never-bootstrapped marker table means no contribution is marked,\n // which the per-target verdict already models as an empty row set.\n const read = await readMarkerRows(id);\n const rows =\n read.kind === \"rows\" ?\n read.rows\n : new Map<string, ContributionMaterializationRow>();\n for (const { contribution, projection, kind, fieldPath } of targets) {\n const key = contributionKey(id, contribution);\n const row = rows.get(key);\n const state = diagnoseContribution(\n row,\n await resolveContributionSignature(key, contribution),\n await tableExists(contribution.tableName),\n );\n if (state === undefined) continue;\n diagnosed.push({\n graphId: id,\n contribution,\n projection,\n diagnostic: {\n owner: contribution.owner,\n logicalName: contribution.logicalName,\n physicalName: contribution.tableName,\n ...(kind === undefined ? {} : { kind }),\n ...(fieldPath === undefined ? {} : { fieldPath }),\n state,\n // The recorded reason, carried through verbatim. `state` folds\n // several marker verdicts together because they share a repair;\n // this is what keeps the fold from also discarding the one thing\n // the catalog can never tell the operator.\n ...(row?.lastError === undefined ?\n {}\n : { lastError: row.lastError }),\n },\n });\n }\n }\n return diagnosed;\n }\n\n /**\n * Vector slots carry their own graph id, exactly as `ensureVectorSlots`\n * reads them, so the marker read stays one query per distinct graph.\n */\n async function diagnoseContributions(\n graphId: string,\n vectorSlots: readonly VectorSlot[],\n ): Promise<readonly DiagnosedContribution[]> {\n return diagnoseTargets(verificationTargetsByGraph(graphId, vectorSlots));\n }\n\n async function verifyContributions(\n graphId: string,\n vectorSlots: readonly VectorSlot[],\n ): Promise<readonly ContributionDiagnostic[]> {\n const diagnosed = await diagnoseContributions(graphId, vectorSlots);\n return diagnosed.map((entry) => entry.diagnostic);\n }\n\n async function probeContributions(\n graphId: string,\n vectorSlots: readonly VectorSlot[],\n ): Promise<readonly ContributionProbeEntry[]> {\n // One target enumeration shared with the diagnosis: a projection is\n // reported only when this graph actually declares contributions for\n // it, so an empty result reads as \"nothing to assess\" and never as\n // \"assessed and healthy\".\n const targetsByGraph = verificationTargetsByGraph(graphId, vectorSlots);\n const declared = new Set<ContributionProbeContribution>();\n for (const targets of targetsByGraph.values()) {\n for (const target of targets) declared.add(target.projection);\n }\n\n const diagnosed = await diagnoseTargets(targetsByGraph);\n const entries: ContributionProbeEntry[] = [];\n for (const projection of PROBE_PROJECTION_ORDER) {\n if (!declared.has(projection)) continue;\n const problems = diagnosed.filter(\n (entry) => entry.projection === projection,\n );\n if (problems.length === 0) {\n entries.push({ contribution: projection, state: \"ready\" });\n continue;\n }\n entries.push({\n contribution: projection,\n state: \"degraded\",\n detail: problems\n .map((entry) => describeProbeDiagnostic(entry.diagnostic))\n .join(\"; \"),\n });\n }\n return entries;\n }\n\n async function repairContributions(\n graphId: string,\n vectorSlots: readonly VectorSlot[],\n ): Promise<ContributionRepairResult> {\n const diagnosed = await diagnoseContributions(graphId, vectorSlots);\n const results: ContributionRepairEntry[] = [];\n for (const {\n graphId: targetGraphId,\n contribution,\n diagnostic,\n } of diagnosed) {\n if (\n diagnostic.state === \"stale\" ||\n diagnostic.state === \"orphaned-marker\"\n ) {\n results.push({ diagnostic, status: \"requires-rebuild\" });\n continue;\n }\n\n try {\n // A repair must bypass the positive process-local cache because the\n // marker may have been removed or failed after this backend cached a\n // healthy signature. This is intentionally NOT `force`: the normal\n // drift guard must still refuse to re-stamp stale physical storage.\n await ensureContributions(targetGraphId, [contribution], {\n bypassCache: true,\n });\n results.push({ diagnostic, status: \"repaired\" });\n } catch (error) {\n results.push({\n diagnostic,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return {\n results,\n remaining: await verifyContributions(graphId, vectorSlots),\n };\n }\n\n /**\n * The DATABASE-scoped critical section for the contribution ITSELF —\n * the logical slot, not the relation currently backing it.\n *\n * The schema-write fence is per GRAPH, but the fulltext table is one\n * physical table shared by every graph in the database, so two graphs\n * rebuilding at once are not serialized by that fence at all: they would\n * race the drop, the recreate, and each other's reading of \"does another\n * graph still have rows here?\". One constant-keyed transaction-scoped\n * advisory lock removes the race instead of recovering from it.\n *\n * It is NOT interchangeable with the relation lock\n * {@link lockSharedFulltextTable} takes, and neither replaces the other:\n *\n * - A relation lock cannot be taken when the relation does not exist, and\n * \"the table is missing\" is one of the states a rebuild resolves. Two\n * rebuilds racing that state have no relation to serialize on.\n * - A relation lock dies with its relation. The recreate path DROPs the\n * table and CREATEs a new one with a new oid, so a second rebuild\n * waiting on the old relation is released onto an object that no longer\n * exists. An advisory key survives the drop because it names the\n * contribution, not the object.\n *\n * ORDER: taken FIRST, before any relation lock, on every path that takes\n * both — and inside the per-graph schema fence, matching the identity DDL\n * lock's convention (per-graph fence → constant-keyed DDL lock → relation\n * locks). Nothing else in the system takes this key at all: ordinary\n * fulltext DML takes only relation-level locks and never an advisory one,\n * so no path can hold a fulltext relation lock while waiting for this key,\n * and the wait graph stays acyclic. Keyed distinctly from\n * `typegraph:identity-ddl`, in the two-argument lock space every\n * namespaced TypeGraph lock uses — the per-graph fence deliberately\n * occupies the one-argument space.\n *\n * SQLite needs nothing: `BEGIN IMMEDIATE` already holds the database's\n * single writer slot for the whole fence.\n */\n async function lockContributionDdl(\n tx: SchemaWriteTransactionBackend,\n ): Promise<void> {\n const plan = resolveWriteFencePlan(deps.fenceTarget);\n const fence = requireWriteFence(plan, \"contribution DDL\", \"advisory-lock\");\n switch (fence.kind) {\n case \"lock\": {\n await tx.execute(\n asCompiledRowsSql(\n portableSql`SELECT pg_advisory_xact_lock(hashtext(${CONTRIBUTION_DDL_LOCK_KEY}), 0)`,\n ),\n );\n return;\n }\n case \"engine-serialized\": {\n // SQLite needs nothing: `BEGIN IMMEDIATE` already holds the\n // database's single writer slot for the whole fence.\n return;\n }\n default: {\n fence satisfies never;\n }\n }\n }\n\n /**\n * Excludes every writer from the shared fulltext table for the rest of the\n * rebuild's transaction.\n *\n * The teardown VERDICT — \"no other graph has rows here, so dropping this\n * table destroys nothing\" — is only as good as the exclusion it was\n * computed under. Ordinary fulltext DML takes no advisory lock, so the\n * contribution lock above excludes other REBUILDS and nothing else: a\n * neighbouring graph's INSERT could commit between an unlocked probe and\n * the `DROP TABLE`, and be destroyed by a rebuild that had already decided\n * it was alone. `ACCESS EXCLUSIVE` is the lock scope that matches the\n * decision's resource — a writer that committed first is visible to the\n * re-probe (each statement takes a fresh snapshot; the fence sets no\n * isolation level, so it runs at the session default of READ COMMITTED),\n * and one that has not committed blocks until this rebuild does.\n *\n * Taken only on the path that may drop, and only after the contribution\n * advisory lock. The graph-scoped path needs nothing: its\n * `DELETE ... WHERE graph_id` touches only rows this graph owns and is\n * transactional, so it must not make every other graph's writers wait.\n *\n * Same shape as `lockPostgresTrustedImportTables`. SQLite has no relation\n * lock and needs none: `BEGIN IMMEDIATE` took the database's single writer\n * slot when the fence opened, so probe, drop and refill already run with\n * every other writer excluded.\n */\n async function lockSharedFulltextTable(\n tx: SchemaWriteTransactionBackend,\n tableName: string,\n ): Promise<void> {\n const plan = resolveWriteFencePlan(deps.fenceTarget);\n const fence = requireWriteFence(\n plan,\n \"shared fulltext table lock\",\n \"table-lock\",\n );\n switch (fence.kind) {\n case \"lock\": {\n await tx.executeStatement(\n asCompiledStatementSql(\n portableSql`LOCK TABLE ${portableSql.identifier(tableName)} IN ACCESS EXCLUSIVE MODE`,\n ),\n );\n return;\n }\n case \"engine-serialized\": {\n // SQLite has no relation lock and needs none: `BEGIN IMMEDIATE` took\n // the database's single writer slot when the fence opened, so probe,\n // drop and refill already run with every other writer excluded.\n return;\n }\n default: {\n fence satisfies never;\n }\n }\n }\n\n /**\n * Graph ids other than `graphId` with rows in the shared fulltext table.\n * Read inside the rebuild's transaction so the verdict cannot change\n * between the check and the teardown it authorizes.\n */\n async function readForeignGraphIds(\n tx: SchemaWriteTransactionBackend,\n tableName: string,\n graphId: string,\n ): Promise<readonly string[]> {\n const rows = await tx.execute<Readonly<{ graph_id: unknown }>>(\n asCompiledRowsSql(\n buildForeignFulltextGraphProbe(\n tableName,\n graphId,\n FOREIGN_GRAPH_REPORT_LIMIT,\n ),\n ),\n );\n return rows.map((row) => String(row.graph_id));\n }\n\n async function rebuildContribution(\n graphId: string,\n scope: ContributionRebuildScope,\n repopulate: (\n target: TransactionBackend,\n ) => Promise<ContributionRepopulationStats>,\n ): Promise<ContributionRebuildResult> {\n // Refuse before anything is dropped. Every precondition is checked\n // here rather than inside the fence so a refusal can never be\n // confused with a half-finished rebuild.\n if (scope === \"vector\") {\n throw new ContributionRebuildUnsupportedError(\n \"vector-source-unavailable\",\n { graphId, contribution: scope },\n );\n }\n const contributions = runtimeContributions();\n const withoutTeardown = contributions.find(\n (contribution) => contribution.dropDdl === undefined,\n );\n if (withoutTeardown !== undefined) {\n throw new ContributionRebuildUnsupportedError(\"no-drop-ddl\", {\n graphId,\n contribution: scope,\n owner: withoutTeardown.owner,\n logicalName: withoutTeardown.logicalName,\n physicalName: withoutTeardown.tableName,\n });\n }\n const fence = deps.schemaWriteTransaction;\n if (fence === undefined) {\n throw new ContributionRebuildUnsupportedError(\"no-schema-fence\", {\n graphId,\n contribution: scope,\n backend: dialect,\n });\n }\n\n // Hashing is async WebCrypto and independent of the fence, so the\n // signatures the stamps will carry are resolved before the schema\n // lock is taken rather than while it is held.\n const stamps = await Promise.all(\n contributions.map(async (contribution) => {\n const key = contributionKey(graphId, contribution);\n return {\n contribution,\n key,\n signature: await resolveContributionSignature(key, contribution),\n };\n }),\n );\n // The stamp below writes to the marker table; a database that has\n // never bootstrapped it would fail after the drop had already run.\n await deps.ensureMarkerTable();\n\n // This graph's durable markers, and whether the shared storage is on\n // disk at all. Both are read before the fence — the marker read decides\n // whether a rebuild that may not recreate the storage owes a refusal,\n // and a catalog probe cannot run inside the fence against a table that\n // may not exist without aborting the transaction on PostgreSQL.\n const markers = indexMarkerRows(graphId, await deps.getMarkers(graphId));\n const sharedTable = deps.fulltextTableName;\n const sharedTableExisted = await deps.tableExists(sharedTable);\n\n const rebuilt = await fence(graphId, async (tx) => {\n const record = tx.recordContributionMaterialization;\n if (record === undefined) {\n throw new ConfigurationError(\n \"rebuildContribution requires a transaction-scoped backend that \" +\n \"can write contribution markers; without it the drop, recreate, \" +\n \"and stamp could not commit together.\",\n {\n backend: dialect,\n capability: \"contributions\",\n operation: \"rebuild\",\n },\n );\n }\n\n // Database-scoped, because what follows may be database-global DDL\n // that the per-graph fence does not serialize at all.\n await lockContributionDdl(tx);\n\n // The decision this whole path turns on: `dropDdl` is a `DROP TABLE`\n // on ONE physical table that holds every graph's fulltext rows, so\n // running it under a per-graph fence would destroy content belonging\n // to graphs this process cannot even name — let alone rebuild, since\n // fulltext content is reconstructed from a graph's own nodes through\n // its own schema. The teardown is therefore graph-scoped by default\n // and only escalates to the drop when the drop takes nothing with it.\n //\n // Storage that was already absent is never dropped either: there is\n // nothing to tear down, and a table that appeared between the\n // pre-fence catalog probe and this lock would belong to whoever\n // created it. Recreating from `createDdl` and clearing this graph's\n // rows serves that state without betting on the probe.\n const unlockedForeignGraphIds =\n sharedTableExisted ?\n await readForeignGraphIds(tx, sharedTable, graphId)\n : [];\n // Two probes, deliberately. The first is unlocked and cheap, and its\n // only job is to keep the common case off the relation lock: a\n // \"another graph has rows\" verdict can only become MORE true while\n // this transaction runs, since nothing here deletes another graph's\n // rows, so acting on it without exclusion is safe. The drop verdict\n // is the unsafe direction — a writer committing after an unlocked\n // probe would be destroyed by the drop that probe authorized — so it\n // is never acted on until it has been re-established while holding\n // ACCESS EXCLUSIVE. A verdict that flips under the lock loses the\n // drop and keeps the lock, because PostgreSQL holds locks until\n // commit: that rebuild then serializes fulltext writers for its\n // duration, which is the rare and safe direction to be wrong in.\n const mayRecreate =\n sharedTableExisted && unlockedForeignGraphIds.length === 0;\n if (mayRecreate) await lockSharedFulltextTable(tx, sharedTable);\n const foreignGraphIds =\n mayRecreate ?\n await readForeignGraphIds(tx, sharedTable, graphId)\n : unlockedForeignGraphIds;\n const recreateStorage = mayRecreate && foreignGraphIds.length === 0;\n\n if (!recreateStorage) {\n // `stale` means the physical table is at a shape the current\n // declaration no longer produces, and the only repair for that is\n // the drop this rebuild just declined to run. Deleting this graph's\n // rows and re-stamping instead would publish the current signature\n // over a shape nothing verified — precisely the blessing the drift\n // guard exists to prevent. Refuse, before any DDL runs.\n const staleStamp = stamps.find(\n ({ key, signature }) =>\n diagnoseContribution(\n markers.get(key),\n signature,\n sharedTableExisted,\n ) === \"stale\",\n );\n if (staleStamp !== undefined) {\n throw new ContributionRebuildUnsupportedError(\n \"shared-storage-in-use\",\n {\n graphId,\n contribution: scope,\n owner: staleStamp.contribution.owner,\n logicalName: staleStamp.contribution.logicalName,\n physicalName: staleStamp.contribution.tableName,\n otherGraphIds: foreignGraphIds,\n },\n );\n }\n }\n\n for (const { contribution } of stamps) {\n if (recreateStorage) {\n // `dropDdl` is present on every entry — the refusal above\n // rejected the whole rebuild otherwise.\n for (const statement of contribution.dropDdl ?? []) {\n await tx.executeSchemaDdl(statement);\n }\n }\n for (const statement of contribution.createDdl) {\n await tx.executeSchemaDdl(statement);\n }\n }\n\n // Graph-scoped teardown when the storage was kept: the same\n // `DELETE ... WHERE graph_id` `clearGraph` owns, so the rebuild\n // removes exactly this graph's index content and nothing else. Only\n // the table the fulltext rows are keyed by `graph_id` in can be\n // scoped this way; a strategy that owns further tables keeps them\n // (they are recreated, never dropped, on this path).\n if (!recreateStorage) {\n await tx.executeStatement(\n asCompiledStatementSql(\n buildFulltextGraphDelete(sharedTable, graphId),\n ),\n );\n }\n\n // Refill before stamping, inside the same transaction. The order is\n // not cosmetic: a stamp that committed ahead of the content would\n // publish storage the hot-path gate considers healthy and that\n // answers every query with nothing.\n const stats = await repopulate(tx);\n\n const now = nowIso();\n for (const { contribution, signature } of stamps) {\n await record({\n ...identityOf(graphId, contribution),\n signature,\n attemptedAt: now,\n materializedAt: now,\n error: undefined,\n });\n }\n return {\n rebuilt: stamps.map(({ contribution }) => contribution.tableName),\n processed: stats.processed,\n repopulated: stats.repopulated,\n skipped: stats.skipped,\n } satisfies ContributionRebuildResult;\n });\n\n // Only after the fence commits: a positive cache entry written for a\n // rebuild that rolled back would bless a shape that is not on disk.\n for (const { key, signature } of stamps) {\n cacheInitializedSignature(key, signature);\n }\n return rebuilt;\n }\n\n function evictVectorSlot(slot: VectorSlot): void {\n if (deps.vectorStrategy === undefined) return;\n for (const contribution of deps.vectorStrategy.ownedTables(slot)) {\n const key = contributionKey(slot.graphId, contribution);\n uncacheableKeys.add(key);\n initializedSignatures.delete(key);\n computedSignatures.delete(key);\n }\n }\n\n async function dropVectorSlot(slot: VectorSlot): Promise<void> {\n if (deps.vectorStrategy === undefined) return;\n try {\n for (const contribution of deps.vectorStrategy.ownedTables(slot)) {\n await deps.deleteMarker(identityOf(slot.graphId, contribution));\n }\n } finally {\n // Cache eviction is conservative even when marker deletion fails: a\n // subsequent assertion re-reads durable state instead of trusting a\n // positive entry for a marker that may already have been deleted.\n evictVectorSlot(slot);\n }\n }\n\n return {\n ensureRuntimeContributions,\n assertInitialized,\n refuseUnavailableFulltext,\n ensureVectorSlot,\n ensureVectorSlots,\n assertVectorSlot,\n assertVectorSlots,\n dropVectorSlot,\n evictVectorSlot,\n verifyContributions,\n repairContributions,\n probeContributions,\n rebuildContribution,\n };\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 { formatPostgresTimestamp } from \"../row-mappers\";\nimport type {\n IndexMaterializationRow,\n RecordIndexMaterializationParams,\n} from \"../types\";\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 * A failed attempt (`materializedAt === undefined`) updates ONLY the\n * attempt bookkeeping (`lastAttemptedAt`/`lastError`): the row's shape\n * columns (`signature`, `entity`, `kind`, `graphId`, `schemaVersion`)\n * and `materializedAt` describe the index that IS materialized, and a\n * failed re-attempt must not overwrite them. In particular, a\n * signature-drift failure that rewrote `signature` to the new value\n * while keeping the old success `materializedAt` would settle as\n * `alreadyMaterialized` on the very next run — silencing the drift\n * signal after one report. Omitted columns are preserved by ON CONFLICT\n * DO UPDATE semantics. On success every column takes the new value.\n */\nexport function buildMaterializationOnConflictSet(\n paramsMaterializedAt: string | undefined,\n): Readonly<Record<string, ReturnType<typeof sql>>> {\n if (paramsMaterializedAt === undefined) {\n return {\n lastAttemptedAt: sql`excluded.${sql.identifier(\"last_attempted_at\")}`,\n lastError: sql`excluded.${sql.identifier(\"last_error\")}`,\n };\n }\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: sql`excluded.${sql.identifier(\"materialized_at\")}`,\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 { formatPostgresTimestamp } from \"../row-mappers\";\nimport type { KindRemovalRow, RecordKindRemovalParams } from \"../types\";\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","import {\n getTableName,\n type SQL,\n sql,\n type SQLWrapper,\n} from \"drizzle-orm\";\n\nimport type { PrimaryKeyRelation } from \"../../../utils/sql-errors\";\nimport type { SqlDialect } from \"../../types\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\n\nexport type Tables = SqliteTables | PostgresTables;\n\n/**\n * The names a relation's PRIMARY KEY constraint can carry, given the relation\n * name and its key columns.\n *\n * Two, because TypeGraph supports two provisioning paths for the same schema\n * and they name the constraint differently:\n *\n * - TypeGraph's own DDL (`generatePostgresCreateTableSQL`) emits an UNNAMED\n * `PRIMARY KEY (...)` clause, which PostgreSQL names `<relation>_pkey`;\n * - `drizzle-kit` renders the Drizzle `primaryKey({ columns })` builder with\n * its explicit name, `<relation>_<column>_..._pk`.\n *\n * Both are derived rather than hardcoded so a custom table name is covered\n * too. Accepting only these two — never\n * an arbitrary unique constraint on the relation — is what keeps a declared\n * `unique: true` index violation out of the duplicate-identity classification.\n *\n * One declared bound: PostgreSQL clips every identifier to 63 bytes, and clips\n * the RELATION part to make room for the `_pkey` it appends, so a custom\n * relation name long enough to overflow that (58+ bytes) is named something\n * neither of these matches. Classification then simply does not happen and the\n * driver failure surfaces as it did before — no misattribution, just no\n * translation.\n */\nfunction primaryKeyConstraintNames(\n relation: string,\n keyColumns: readonly string[],\n): readonly string[] {\n return [`${relation}_pkey`, `${relation}_${keyColumns.join(\"_\")}_pk`];\n}\n\n/**\n * The nodes relation's identity constraint: `(graph_id, kind, id)`, the tuple\n * every node read also filters on.\n */\nexport function nodePrimaryKeyConstraint(\n nodes: Tables[\"nodes\"],\n): PrimaryKeyRelation {\n const relation = getTableName(nodes);\n return {\n table: relation,\n constraintNames: primaryKeyConstraintNames(relation, [\n nodes.graphId.name,\n nodes.kind.name,\n nodes.id.name,\n ]),\n };\n}\n\n/**\n * The edges relation's identity constraint: `(graph_id, id)`. An edge id is\n * unique per graph without its kind, so the key is one column shorter than a\n * node's.\n */\nexport function edgePrimaryKeyConstraint(\n edges: Tables[\"edges\"],\n): PrimaryKeyRelation {\n const relation = getTableName(edges);\n return {\n table: relation,\n constraintNames: primaryKeyConstraintNames(relation, [\n edges.graphId.name,\n edges.id.name,\n ]),\n };\n}\n\n/**\n * Converts undefined to SQL NULL for use in template literals.\n * Drizzle doesn't handle undefined in sql`` templates correctly.\n */\nexport function sqlNull(value: string | undefined): SQL | string {\n return value ?? sql.raw(\"NULL\");\n}\n\n/**\n * The `AND valid_from …` conjunction a write carries when its caller ASSERTED\n * the lower bound the target row already holds (see\n * {@link UpdateNodeParams.expectedValidFrom} /\n * {@link UpdateEdgeParams.expectedValidFrom}).\n *\n * NULL-SAFE by construction, and that is the whole point of routing both\n * entities through one builder: `valid_from` is nullable (an open-left window),\n * and `col = NULL` is UNKNOWN in SQL, so the obvious `AND col = ?` spelling\n * turns \"I checked that this row has no lower bound\" into a predicate that\n * matches NOTHING — an assertion that always fails is as wrong as one that\n * never runs. The three states are therefore distinct:\n *\n * - `undefined` — the caller asserted nothing; no predicate is emitted.\n * - `null` — the caller read an OPEN-LEFT window; emits `IS NULL`.\n * - a string — the caller read that bound; emits `= <bound>`.\n *\n * One owner: nodes and edges share this function so the two statements cannot\n * drift into disagreeing about what \"the bound I read\" means.\n */\nexport function expectedValidFromPredicate(\n column: SQLWrapper,\n expected: string | null | undefined,\n): SQL {\n if (expected === undefined) return sql.empty();\n if (expected === null) return sql` AND ${column} IS NULL`;\n return sql` AND ${column} = ${expected}`;\n}\n\nexport function quotedColumn(column: { name: string }): SQL {\n return sql.raw(`\"${column.name.replaceAll('\"', '\"\"')}\"`);\n}\n\n/**\n * Returns a quoted SQL identifier for a bare table name string.\n * Use when the operation targets a table that isn't represented as a\n * Drizzle table object (e.g. the FTS5 virtual table).\n */\nexport function quotedTableName(tableName: string): SQL {\n return sql.raw(`\"${tableName.replaceAll('\"', '\"\"')}\"`);\n}\n\nconst CODE_POINT_ORDER_BUILDERS = {\n postgres: (value: SQL) => sql`${value} COLLATE \"C\"`,\n sqlite: (value: SQL) => value,\n} satisfies Record<SqlDialect, (value: SQL) => SQL>;\n\n/**\n * `column` rendered so that ORDER BY sorts it by code point on both engines.\n *\n * Relevance-ranking SQL breaks score ties on `node_id`. Left bare, Postgres\n * sorts it under the column's collation — a linguistic collation such as\n * `en_US.UTF-8` orders `a, A, b, B` where byte order gives `A, B, a, b`, so\n * the same query returns different pages on two databases whose `datcollate`\n * differs. SQLite's default `BINARY` collation is already code-point order,\n * as is the store's `compareCodePoints`, which ranks the same rows whenever a\n * search falls back to fusing in JavaScript.\n *\n * Forcing the `C` collation on Postgres makes all three agree. The ranking is\n * sorted anyway (no index supplies the order), so this costs nothing.\n */\nexport function codePointOrderKey(column: SQL, dialect: SqlDialect): SQL {\n return CODE_POINT_ORDER_BUILDERS[dialect](column);\n}\n\n/**\n * Subquery yielding the ids of CURRENT nodes of one kind — the candidate\n * set a facade search statement is allowed to return. Passed into the\n * fulltext and vector search builders so top-k is computed over current\n * rows in SQL, instead of ranking side-table rows first and dropping\n * tombstoned/expired nodes after (which silently shrinks results below\n * `limit` under index drift).\n *\n * Currency matches a `current` read: non-tombstoned AND inside the\n * validity window. The instant is BOUND as a parameter (the backend's\n * clock, same source as its write timestamps) rather than compiled as a\n * per-row SQL now() call — on SQLite a per-row strftime() across two\n * search legs dominated unfiltered facade searches.\n */\nexport function liveNodeIdsSubquery(\n nodes: Tables[\"nodes\"],\n graphId: string,\n nodeKind: string,\n nowIso: string,\n): SQL {\n return sql`SELECT ${nodes.id} AS node_id FROM ${nodes} WHERE ${nodes.graphId} = ${graphId} AND ${nodes.kind} = ${nodeKind} AND ${nodes.deletedAt} IS NULL AND (${nodes.validFrom} IS NULL OR ${nodes.validFrom} <= ${nowIso}) AND (${nodes.validTo} IS NULL OR ${nodes.validTo} > ${nowIso})`;\n}\n\nexport function nodeColumnList(nodes: Tables[\"nodes\"]): SQL {\n return sql.raw(\n `\"${nodes.graphId.name}\", \"${nodes.kind.name}\", \"${nodes.id.name}\", \"${nodes.props.name}\", \"${nodes.version.name}\", \"${nodes.validFrom.name}\", \"${nodes.validTo.name}\", \"${nodes.createdAt.name}\", \"${nodes.updatedAt.name}\"`,\n );\n}\n\nexport function edgeColumnList(edges: Tables[\"edges\"]): SQL {\n return sql.raw(\n `\"${edges.graphId.name}\", \"${edges.id.name}\", \"${edges.kind.name}\", \"${edges.fromKind.name}\", \"${edges.fromId.name}\", \"${edges.toKind.name}\", \"${edges.toId.name}\", \"${edges.props.name}\", \"${edges.validFrom.name}\", \"${edges.validTo.name}\", \"${edges.createdAt.name}\", \"${edges.updatedAt.name}\"`,\n );\n}\n","/**\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 { coerceNumericScore } from \"../../row-mappers\";\nimport { type HybridSearchRow, type NodeRow } from \"../../types\";\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, sql } from \"drizzle-orm\";\n\nimport { buildFulltextGraphDelete } from \"../../../query/dialect/fulltext-strategy\";\nimport { type ExecutableSql } from \"../execution/types\";\nimport { type Tables } from \"./shared\";\n\nexport type ClearGraphStatement = Readonly<{\n query: ExecutableSql;\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 identity/edges/nodes → identity closure/assertions →\n * recorded_clock → uniques → edge_claims → 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 return [\n // The fulltext table is shared by every graph in the database, so its\n // graph-scoped delete is owned by one builder the destructive\n // contribution rebuild calls too — see `buildFulltextGraphDelete`.\n { query: buildFulltextGraphDelete(tables.fulltextTableName, graphId) },\n {\n query: sql`DELETE FROM ${tables.recordedIdentityAssertions} WHERE ${tables.recordedIdentityAssertions.graphId} = ${graphId}`,\n ignoreMissingTable: true,\n requiredTableName: getTableName(tables.recordedIdentityAssertions),\n },\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.identitySeparation} WHERE ${tables.identitySeparation.graphId} = ${graphId}`,\n ignoreMissingTable: true,\n requiredTableName: getTableName(tables.identitySeparation),\n },\n {\n query: sql`DELETE FROM ${tables.identityClosure} WHERE ${tables.identityClosure.graphId} = ${graphId}`,\n ignoreMissingTable: true,\n requiredTableName: getTableName(tables.identityClosure),\n },\n {\n query: sql`DELETE FROM ${tables.identityAssertions} WHERE ${tables.identityAssertions.graphId} = ${graphId}`,\n ignoreMissingTable: true,\n requiredTableName: getTableName(tables.identityAssertions),\n },\n {\n query: sql`DELETE FROM ${tables.uniques} WHERE ${tables.uniques.graphId} = ${graphId}`,\n },\n // Edge claims name the edges they are held by, so they are cleared\n // BEFORE the edges — the same ordering `uniques` gets against `nodes`.\n // Tolerates absence for the reason the recorded relations do: bootstrap DDL\n // runs only on first boot, so a database initialized before this relation\n // existed has no such table, and clearing a graph must not become the\n // operation that fails on it.\n {\n query: sql`DELETE FROM ${tables.edgeClaims} WHERE ${tables.edgeClaims.graphId} = ${graphId}`,\n ignoreMissingTable: true,\n requiredTableName: getTableName(tables.edgeClaims),\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, type SQLWrapper } from \"drizzle-orm\";\n\nimport { type TemporalMode } from \"../../../core/types\";\nimport type {\n CountEdgesByKindParams,\n CountNodesByKindParams,\n FindEdgesByEndpointSetParams,\n FindEdgesByHeterogeneousEndpointSetParams,\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(`asOf timestamp is required for temporal mode \"${mode}\"`);\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/** Builds an `IN (...)` membership predicate over a non-empty id list. */\nfunction buildIdSetCondition(\n column: SQLWrapper,\n ids: readonly string[],\n): SQL {\n return sql`${column} IN (${sql.join(\n ids.map((id) => sql`${id}`),\n sql`, `,\n )})`;\n}\n\n/**\n * The edge read ordering in its two equivalent forms. `qualified` addresses the\n * edges table directly; `bare` addresses the derived table the per-endpoint\n * `ROW_NUMBER()` wrapper selects from, which re-exposes the same column names\n * under a different relation name. Both come from here so the window's ordering\n * and the statement's final ordering cannot drift apart.\n */\nfunction buildEdgeOrdering(\n tables: Tables,\n orderBy: FindEdgesByKindParams[\"orderBy\"],\n): Readonly<{ qualified: SQL; bare: SQL }> {\n const { edges } = tables;\n return orderBy === \"id\" ?\n { qualified: sql`${edges.id} ASC`, bare: sql.raw(`\"id\" ASC`) }\n : {\n qualified: sql`${edges.createdAt} DESC, ${edges.id} DESC`,\n bare: sql.raw(`\"created_at\" DESC, \"id\" DESC`),\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 { qualified: orderByClause } = buildEdgeOrdering(\n tables,\n params.orderBy,\n );\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 read the edges of a SET of endpoints.\n *\n * The id list compiles to `IN (...)` on the fanned-out side, scoped to one\n * `endpointKind` so the predicate is a prefix seek on the edge relation's\n * system index rather than a scan. `limitPerEndpoint` wraps the read in a\n * `ROW_NUMBER()` partitioned by that same column, capping each endpoint's rows\n * inside the statement instead of in the caller.\n *\n * Ordering matches {@link buildFindEdgesByKind}'s default so a set read\n * returns each endpoint's edges in the same order the singleton read does.\n */\nexport function buildFindEdgesByEndpointSet(\n tables: Tables,\n params: FindEdgesByEndpointSetParams,\n endpointIds: readonly string[],\n): SQL {\n const { edges } = tables;\n const fromSide = params.side === \"from\";\n const kindColumn = fromSide ? edges.fromKind : edges.toKind;\n const idColumn = fromSide ? edges.fromId : edges.toId;\n\n const whereClause = sql.join(\n [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ...buildTemporalConditions(edges, params),\n sql`${kindColumn} = ${params.endpointKind}`,\n buildIdSetCondition(idColumn, endpointIds),\n ],\n sql` AND `,\n );\n\n const { qualified: orderByClause, bare: derivedOrderByClause } =\n buildEdgeOrdering(tables, undefined);\n\n if (params.limitPerEndpoint === undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\n `;\n }\n\n const ranked = sql`\n SELECT *, ROW_NUMBER() OVER (\n PARTITION BY ${idColumn} ORDER BY ${orderByClause}\n ) AS endpoint_rank\n FROM ${edges}\n WHERE ${whereClause}\n `;\n return sql`\n SELECT * FROM (${ranked}) AS ranked_edges\n WHERE endpoint_rank <= ${params.limitPerEndpoint}\n ORDER BY ${derivedOrderByClause}\n `;\n}\n\n/**\n * Builds a multi-kind edge read from a heterogeneous endpoint relation.\n *\n * Joining a `VALUES` relation lets both engines seek the composite endpoint\n * index without generating one SQL branch for every licensed edge/source-kind\n * combination.\n */\nexport function buildFindEdgesByHeterogeneousEndpointSet(\n tables: Tables,\n params: FindEdgesByHeterogeneousEndpointSetParams,\n endpoints: readonly Readonly<{ kind: string; id: string }>[],\n edgeKinds: readonly string[],\n): SQL {\n const { edges } = tables;\n const fromSide = params.side === \"from\";\n const kindColumn = fromSide ? edges.fromKind : edges.toKind;\n const idColumn = fromSide ? edges.fromId : edges.toId;\n const requestedKind = sql.raw(`requested_endpoints.\"endpoint_kind\"`);\n const requestedId = sql.raw(`requested_endpoints.\"endpoint_id\"`);\n const requestedRows = sql.join(\n endpoints.map((endpoint) => sql`(${endpoint.kind}, ${endpoint.id})`),\n sql`, `,\n );\n const whereClause = sql.join(\n [\n sql`${edges.graphId} = ${params.graphId}`,\n buildIdSetCondition(edges.kind, edgeKinds),\n ...buildTemporalConditions(edges, params),\n ],\n sql` AND `,\n );\n const joinClause = sql`\n FROM ${edges}\n INNER JOIN requested_endpoints\n ON ${kindColumn} = ${requestedKind}\n AND ${idColumn} = ${requestedId}\n WHERE ${whereClause}\n `;\n const { qualified: orderByClause, bare: derivedOrderByClause } =\n buildEdgeOrdering(tables, undefined);\n\n if (params.limitPerEndpoint === undefined) {\n return sql`\n WITH requested_endpoints(endpoint_kind, endpoint_id) AS (\n VALUES ${requestedRows}\n )\n SELECT ${edges}.*\n ${joinClause}\n ORDER BY ${orderByClause}\n `;\n }\n\n const ranked = sql`\n SELECT ${edges}.*, ROW_NUMBER() OVER (\n PARTITION BY ${kindColumn}, ${idColumn} ORDER BY ${orderByClause}\n ) AS endpoint_rank\n ${joinClause}\n `;\n return sql`\n WITH requested_endpoints(endpoint_kind, endpoint_id) AS (\n VALUES ${requestedRows}\n )\n SELECT * FROM (${ranked}) AS ranked_edges\n WHERE endpoint_rank <= ${params.limitPerEndpoint}\n ORDER BY ${derivedOrderByClause}\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","/**\n * The read-only audit behind `store.verifyConstraintFences()`.\n *\n * Every statement here reads a relation the constraint is DECLARED over, never\n * a claim relation's primary key: a claim key admits one row per axis by\n * construction, and a database written before the claim relations existed holds\n * no edge claims at all, so a claim scan reports zero violations on exactly the\n * pre-existing data this audit exists to find. Uniqueness is the one family\n * whose pre-upgrade duplicate IS a pair of claim rows — two live `uniques` rows\n * at two different `node_kind`s — so it reads that relation for the ROWS while\n * leaving \"do these two axes fold together?\" to the caller.\n *\n * Each family is one statement with a correlated `EXISTS` over the same\n * relation, rather than a `GROUP BY … HAVING count(*) > 1` followed by a\n * second fetch of the members: one round trip, no tuple-list `IN` to render,\n * and the same rows either way.\n */\nimport { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport {\n type ConstrainedCardinality,\n EDGE_CARDINALITY_SPECS,\n} from \"../../../store/claims/edge-claims\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\n/** The alias the correlated subquery reads the same relation under. */\nconst PEER = \"peer\";\n\n/** Qualifies a column with a relation name, the rendering both dialects read. */\nfunction qualified(\n relation: string,\n column: Readonly<{ name: string }>,\n): SQL {\n return sql.raw(`\"${relation}\".\"${column.name}\"`);\n}\n\n/** A bound-parameter `IN (…)` list; callers never pass an empty one. */\nfunction inList(values: readonly string[]): SQL {\n return sql.join(\n values.map((value) => sql`${value}`),\n sql`, `,\n );\n}\n\n/**\n * Live `uniques` rows sharing a `(constraint_name, key)` with another live row,\n * restricted to constraint names the graph declares.\n *\n * The restriction is load-bearing, not a filter for speed: the same relation\n * holds disjointness claims under a reserved constraint name whose `node_kind`\n * is a PAIR label, and no uniqueness axis can be computed for one. Those rows\n * are audited from the nodes relation instead\n * ({@link buildDisjointOverlapAudit}).\n *\n * The peer test is `node_kind <> node_kind` because the relation's primary key\n * already makes two rows with equal `(graph_id, node_kind, constraint_name,\n * key)` impossible — so a peer is by definition a row at a DIFFERENT axis,\n * which is precisely the shape a pre-upgrade duplicate leaves behind.\n */\nexport function buildContendedUniqueRowAudit(\n tables: Tables,\n graphId: string,\n constraintNames: readonly string[],\n): SQL {\n const { uniques } = tables;\n const relation = getTableName(uniques);\n return sql`\n SELECT\n ${quotedColumn(uniques.nodeKind)} as node_kind,\n ${quotedColumn(uniques.constraintName)} as constraint_name,\n ${quotedColumn(uniques.key)} as key,\n ${quotedColumn(uniques.concreteKind)} as concrete_kind,\n ${quotedColumn(uniques.nodeId)} as node_id\n FROM ${uniques}\n WHERE ${qualified(relation, uniques.graphId)} = ${graphId}\n AND ${qualified(relation, uniques.constraintName)} IN (${inList(constraintNames)})\n AND ${qualified(relation, uniques.deletedAt)} IS NULL\n AND EXISTS (\n SELECT 1 FROM ${uniques} AS ${sql.raw(`\"${PEER}\"`)}\n WHERE ${qualified(PEER, uniques.graphId)} = ${qualified(relation, uniques.graphId)}\n AND ${qualified(PEER, uniques.constraintName)} = ${qualified(relation, uniques.constraintName)}\n AND ${qualified(PEER, uniques.key)} = ${qualified(relation, uniques.key)}\n AND ${qualified(PEER, uniques.deletedAt)} IS NULL\n AND ${qualified(PEER, uniques.nodeKind)} <> ${qualified(relation, uniques.nodeKind)}\n )\n `;\n}\n\n/**\n * Live edges of the named kinds sharing one declared cardinality's population\n * with another live edge.\n *\n * Which endpoints the population is keyed by and what a member must still BE\n * are read from {@link EDGE_CARDINALITY_SPECS} — the same table the probe and\n * the claim's SQL read — so the audit cannot report a population the fence does\n * not fence, or miss one it does. One statement per cardinality, because that\n * is the granularity at which the spec differs.\n */\nexport function buildContendedEdgeRowAudit(\n tables: Tables,\n graphId: string,\n cardinality: ConstrainedCardinality,\n edgeKinds: readonly string[],\n): SQL {\n const { edges } = tables;\n const relation = getTableName(edges);\n const spec = EDGE_CARDINALITY_SPECS[cardinality];\n const activeOnly =\n spec.holderLiveness === \"liveAndActive\" ?\n sql` AND ${qualified(relation, edges.validTo)} IS NULL`\n : sql.empty();\n const peerActiveOnly =\n spec.holderLiveness === \"liveAndActive\" ?\n sql` AND ${qualified(PEER, edges.validTo)} IS NULL`\n : sql.empty();\n const peerToEndpoints =\n spec.keyShape === \"fromAndTo\" ?\n sql`\n AND ${qualified(PEER, edges.toKind)} = ${qualified(relation, edges.toKind)}\n AND ${qualified(PEER, edges.toId)} = ${qualified(relation, edges.toId)}\n `\n : sql.empty();\n\n return sql`\n SELECT\n ${quotedColumn(edges.id)} as edge_id,\n ${quotedColumn(edges.kind)} as edge_kind,\n ${quotedColumn(edges.fromKind)} as from_kind,\n ${quotedColumn(edges.fromId)} as from_id,\n ${quotedColumn(edges.toKind)} as to_kind,\n ${quotedColumn(edges.toId)} as to_id\n FROM ${edges}\n WHERE ${qualified(relation, edges.graphId)} = ${graphId}\n AND ${qualified(relation, edges.kind)} IN (${inList(edgeKinds)})\n AND ${qualified(relation, edges.deletedAt)} IS NULL${activeOnly}\n AND EXISTS (\n SELECT 1 FROM ${edges} AS ${sql.raw(`\"${PEER}\"`)}\n WHERE ${qualified(PEER, edges.graphId)} = ${qualified(relation, edges.graphId)}\n AND ${qualified(PEER, edges.kind)} = ${qualified(relation, edges.kind)}\n AND ${qualified(PEER, edges.fromKind)} = ${qualified(relation, edges.fromKind)}\n AND ${qualified(PEER, edges.fromId)} = ${qualified(relation, edges.fromId)}${peerToEndpoints}\n AND ${qualified(PEER, edges.deletedAt)} IS NULL${peerActiveOnly}\n AND ${qualified(PEER, edges.id)} <> ${qualified(relation, edges.id)}\n )\n `;\n}\n\n/**\n * The ids live under BOTH kinds of one declared disjoint pair.\n *\n * The nodes relation, not the claim relation, for the same reason as the edge\n * families: a pre-upgrade overlap holds no disjointness claim. `INTERSECT`\n * rather than a self-join so the statement says what it means; one statement\n * per declared pair bounds the cost by the declaration, not by graph size.\n */\nexport function buildDisjointOverlapAudit(\n tables: Tables,\n graphId: string,\n kinds: readonly [string, string],\n): SQL {\n const { nodes } = tables;\n const relation = getTableName(nodes);\n const liveIdsOfKind = (kind: string): SQL => sql`\n SELECT ${quotedColumn(nodes.id)} as node_id\n FROM ${nodes}\n WHERE ${qualified(relation, nodes.graphId)} = ${graphId}\n AND ${qualified(relation, nodes.kind)} = ${kind}\n AND ${qualified(relation, nodes.deletedAt)} IS NULL\n `;\n return sql`${liveIdsOfKind(kinds[0])} INTERSECT ${liveIdsOfKind(kinds[1])}`;\n}\n","import { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport {\n EDGE_CARDINALITY_SPECS,\n edgeCardinalityClaimTarget,\n} from \"../../../store/claims/edge-claims\";\nimport type {\n ClaimEdgeCardinalityParams,\n PurgeEdgeClaimsParams,\n} from \"../../types\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\n/**\n * Qualifies a column with its relation, the one rendering both dialects read\n * identically. The claim statements name TWO relations (the claim rows and the\n * edges their holders are), so a bare column name would be ambiguous in the\n * takeover statement's correlated subquery.\n */\nfunction qualified(tableName: string, column: Readonly<{ name: string }>): SQL {\n return sql.raw(`\"${tableName}\".\"${column.name}\"`);\n}\n\n/**\n * Statement 1 — create-or-lock, decision-free.\n *\n * Its only job is to make the row exist, take its row lock, and report the\n * COMMITTED holder. The `DO UPDATE SET updated_at = <existing>.updated_at` is a\n * deliberate no-op write: it is what makes a conflicting row lock and report\n * itself through RETURNING, which a bare `DO NOTHING` would not. This is the\n * same statement shape `insertUnique` already uses, through the same\n * existing-row qualification, so it introduces no new dialect surface.\n *\n * A returned holder equal to the proposed edge means this writer owns the axis\n * and is done. Any other holder is decided by {@link buildTakeOverEdgeClaim},\n * against a FRESH snapshot — deciding inside this statement would read the\n * pre-lock snapshot of the edges relation and accept two concurrent writers.\n */\nexport function buildLockEdgeClaims(\n tables: Tables,\n entries: readonly ClaimEdgeCardinalityParams[],\n timestamp: string,\n): SQL {\n const { edgeClaims } = tables;\n const claimsName = getTableName(edgeClaims);\n\n const columns = sql.raw(\n `\"${edgeClaims.graphId.name}\", \"${edgeClaims.axis.name}\", \"${edgeClaims.key.name}\", \"${edgeClaims.edgeId.name}\", \"${edgeClaims.updatedAt.name}\"`,\n );\n const conflictColumns = sql.raw(\n `\"${edgeClaims.graphId.name}\", \"${edgeClaims.axis.name}\", \"${edgeClaims.key.name}\"`,\n );\n const valueRows = sql.join(\n entries.map((entry) => {\n const target = edgeCardinalityClaimTarget(entry);\n return sql`(${entry.graphId}, ${target.axis}, ${target.key}, ${entry.edgeId}, ${timestamp})`;\n }),\n sql`, `,\n );\n\n return sql`\n INSERT INTO ${edgeClaims} (${columns})\n VALUES ${valueRows}\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET ${quotedColumn(edgeClaims.updatedAt)} = ${qualified(claimsName, edgeClaims.updatedAt)}\n RETURNING\n ${quotedColumn(edgeClaims.axis)} as axis,\n ${quotedColumn(edgeClaims.key)} as key,\n ${quotedColumn(edgeClaims.edgeId)} as holder_edge_id\n `;\n}\n\n/**\n * Statement 2 — conditional takeover, on a fresh snapshot.\n *\n * Issued only when statement 1 reported a different holder. It succeeds exactly\n * when that holder is no longer an edge this axis and key describe, which is\n * what makes an abandoned claim self-healing: no release path has to have run\n * for a dead holder's axis to be reusable.\n *\n * **The holder is identified by more than its id.** Edge ids are\n * caller-suppliable and graph-unique, so a hard-deleted id can be reused by a\n * DIFFERENT edge; a claim naming that id would otherwise read as a live holder\n * and block its axis forever. The extra terms are exactly the components the\n * axis and key were built from — and exactly the columns `countEdgesFrom` /\n * `edgeExistsBetween` filter on — so the fence's liveness predicate and the\n * probe's read the same shape.\n *\n * The `valid_to IS NULL` term and the to-endpoint terms are not spelled here:\n * they are read from {@link EDGE_CARDINALITY_SPECS}, the same table the\n * TypeScript probe reads.\n */\nexport function buildTakeOverEdgeClaim(\n tables: Tables,\n params: ClaimEdgeCardinalityParams,\n timestamp: string,\n): SQL {\n const { edgeClaims, edges } = tables;\n const claimsName = getTableName(edgeClaims);\n const edgesName = getTableName(edges);\n const spec = EDGE_CARDINALITY_SPECS[params.cardinality];\n const target = edgeCardinalityClaimTarget(params);\n\n const toEndpointTerms =\n spec.keyShape === \"fromAndTo\" ?\n sql` AND ${qualified(edgesName, edges.toKind)} = ${params.toKind} AND ${qualified(edgesName, edges.toId)} = ${params.toId}`\n : sql``;\n const activeTerm =\n spec.holderLiveness === \"liveAndActive\" ?\n sql` AND ${qualified(edgesName, edges.validTo)} IS NULL`\n : sql``;\n\n return sql`\n UPDATE ${edgeClaims}\n SET ${quotedColumn(edgeClaims.edgeId)} = ${params.edgeId},\n ${quotedColumn(edgeClaims.updatedAt)} = ${timestamp}\n WHERE ${qualified(claimsName, edgeClaims.graphId)} = ${params.graphId}\n AND ${qualified(claimsName, edgeClaims.axis)} = ${target.axis}\n AND ${qualified(claimsName, edgeClaims.key)} = ${target.key}\n AND ${qualified(claimsName, edgeClaims.edgeId)} <> ${params.edgeId}\n AND NOT EXISTS (\n SELECT 1 FROM ${edges}\n WHERE ${qualified(edgesName, edges.graphId)} = ${qualified(claimsName, edgeClaims.graphId)}\n AND ${qualified(edgesName, edges.id)} = ${qualified(claimsName, edgeClaims.edgeId)}\n AND ${qualified(edgesName, edges.deletedAt)} IS NULL\n AND ${qualified(edgesName, edges.kind)} = ${params.edgeKind}\n AND ${qualified(edgesName, edges.fromKind)} = ${params.fromKind}\n AND ${qualified(edgesName, edges.fromId)} = ${params.fromId}${toEndpointTerms}${activeTerm}\n )\n RETURNING ${quotedColumn(edgeClaims.edgeId)} as holder_edge_id\n `;\n}\n\n/**\n * Housekeeping: drops the claims named edges hold.\n *\n * A hard delete or a `clearGraph` removes the edges a claim's liveness\n * predicate reads, so the claim would already be takeable; this only stops the\n * relation from growing without bound.\n */\nexport function buildPurgeEdgeClaims(\n tables: Tables,\n params: PurgeEdgeClaimsParams,\n): SQL {\n const { edgeClaims } = tables;\n return sql`\n DELETE FROM ${edgeClaims}\n WHERE ${edgeClaims.graphId} = ${params.graphId}\n AND ${edgeClaims.edgeId} IN (${sql.join(\n params.edgeIds.map((edgeId) => sql`${edgeId}`),\n sql`, `,\n )})\n `;\n}\n\n// Re-exported from their new owner. Resolved only by\n// `tests/claim-owner-sql-golden.test.ts` — that import is what keeps knip\n// from reporting these two re-exports as unused.\nexport {\n buildHardDeleteEdgeClaimsByEdgeKind,\n buildHardDeleteEdgeClaimsByNodeKind,\n} from \"../../../store/claims/removal-sql\";\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport {\n resolveStampedValidityLowerBound,\n resolveStatedValidityLowerBound,\n} from \"../../../utils/date\";\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 expectedValidFromPredicate,\n quotedColumn,\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 *\n * As for nodes, the stored lower bound is decided by\n * {@link resolveStampedValidityLowerBound} against the very `timestamp` this\n * statement binds into `created_at` / `updated_at` — see `buildInsertNode` for\n * why the decision lives in the builder rather than above it.\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(resolveStampedValidityLowerBound(params.validFrom, params.validTo, 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(resolveStampedValidityLowerBound(params.validFrom, params.validTo, 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(resolveStampedValidityLowerBound(edgeParams.validFrom, edgeParams.validTo, 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(resolveStampedValidityLowerBound(edgeParams.validFrom, edgeParams.validTo, 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 (${sql.join(\n ids.map((id) => sql`${id}`),\n sql`, `,\n )})\n `;\n}\n\n/**\n * The `AND <column> = ?` conjunction an edge write carries for every immutable\n * identity component its caller ASSERTED (see {@link UpdateEdgeParams}'s\n * `kind` / `fromKind` / `fromId` / `toKind` / `toId`).\n *\n * This is what makes a kind-scoped edge write SELF-VERIFYING: the identity the\n * caller checked and the row the statement mutates are resolved by ONE `WHERE`,\n * in ONE statement, so nothing a concurrent session does between the check and\n * the write can re-point the id at a row that fails an assertion this write\n * made. Kind alone is not sufficient for that: a `hardDelete` + recreate under\n * the SAME kind with DIFFERENT endpoints slips past a kind-only predicate, and\n * an upsert that asserted endpoints would then have written to an edge whose\n * endpoints it never checked.\n *\n * Only ASSERTED components are emitted. A component the caller left undefined\n * is one it made no claim about, and inventing a predicate for it would refuse\n * writes that are legitimate: the node delete cascade states no kind at all\n * because it removes every connected edge whatever its kind, and a plain\n * `update` states kind without endpoints because the collection is kind-scoped\n * and never looked at where the edge points.\n *\n * One owner: every edge write statement that accepts an expected identity\n * builds its predicate here, so `UPDATE`, soft `DELETE`, and hard `DELETE`\n * cannot drift into disagreeing about what \"the same edge\" means.\n */\nfunction expectedIdentityPredicate(\n tables: Tables,\n expected: Readonly<{\n kind?: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n }>,\n): SQL {\n const { edges } = tables;\n const parts = [\n expected.kind === undefined ?\n undefined\n : sql` AND ${edges.kind} = ${expected.kind}`,\n expected.fromKind === undefined ?\n undefined\n : sql` AND ${edges.fromKind} = ${expected.fromKind}`,\n expected.fromId === undefined ?\n undefined\n : sql` AND ${edges.fromId} = ${expected.fromId}`,\n expected.toKind === undefined ?\n undefined\n : sql` AND ${edges.toKind} = ${expected.toKind}`,\n expected.toId === undefined ?\n undefined\n : sql` AND ${edges.toId} = ${expected.toId}`,\n ].filter((part): part is SQL => part !== undefined);\n return parts.length === 0 ? sql.empty() : sql.join(parts, sql``);\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 // A resurrection that names `valid_from` is asserting a COMPLETE window, so\n // both endpoints are rewritten together — an omitted `valid_to` reopens the\n // window rather than leaving the tombstoned incarnation's upper bound behind\n // to truncate it. A resurrection that omits `valid_from` keeps the stored\n // window (only an explicit `valid_to` moves), which is what\n // `getOrCreateByEndpoints` relies on when it cardinality-checks the\n // tombstone's own `valid_to`.\n //\n // So this is the one window-writing site in the backend that does NOT stamp:\n // the gate above guarantees the caller named a bound, and there is no instant\n // to judge. It therefore passes the stated value through\n // (`resolveStatedValidityLowerBound`) rather than routing through the stamping\n // owner, which would silently turn \"the caller said this\" into \"the write\n // chose this\" on a path where nothing was chosen.\n if (params.clearDeleted && params.validFrom !== undefined) {\n setParts.push(\n sql`${quotedColumn(edges.validFrom)} = ${sqlNull(resolveStatedValidityLowerBound(params.validFrom))}`,\n sql`${quotedColumn(edges.validTo)} = ${sqlNull(params.validTo)}`,\n );\n } else if (params.clearValidTo === true) {\n setParts.push(sql`${quotedColumn(edges.validTo)} = NULL`);\n } else 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 const expectedIdentity = expectedIdentityPredicate(tables, params);\n // The bound the CALLER read, when it read one. Not part of the immutable\n // identity above — `valid_from` is mutable — so it is built by the shared\n // NULL-safe helper both entities use; see\n // `UpdateEdgeParams.expectedValidFrom`.\n const expectedValidFrom = expectedValidFromPredicate(\n edges.validFrom,\n params.expectedValidFrom,\n );\n const expectedValidTo = expectedValidFromPredicate(\n edges.validTo,\n params.expectedValidTo,\n );\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}${expectedIdentity}${expectedValidFrom}${expectedValidTo}\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}${expectedIdentity}${expectedValidFrom}${expectedValidTo}\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}${expectedIdentityPredicate(tables, params.kind === undefined ? {} : { kind: params.kind })}\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 (${sql.join(\n params.ids.map((id) => sql`${id}`),\n sql`, `,\n )})\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 (${sql.join(\n params.ids.map((id) => sql`${id}`),\n sql`, `,\n )})\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}${expectedIdentityPredicate(tables, params.kind === undefined ? {} : { kind: params.kind })}\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 { isSqlFragment, type SqlFragment } from \"../../../query/sql-fragment\";\nimport type {\n FulltextQueryMode,\n FulltextSearchParams,\n SqlDialect,\n} from \"../../types\";\nimport { toDrizzleSql } from \"../execution/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 | SqlFragment,\n): SQL {\n assertValidSearchParams(params);\n\n const mode = resolveMode(params.mode);\n const table = quotedTableName(tableName);\n const matchCondition = toDrizzleSql(\n strategy.matchCondition(tableName, params.query, mode, params.language),\n dialect,\n );\n const rankExpression = toDrizzleSql(\n strategy.rankExpression(tableName, params.query, mode, params.language),\n dialect,\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 const candidateSql =\n isSqlFragment(candidates) ? toDrizzleSql(candidates, dialect) : candidates;\n conditions.push(sql`\"node_id\" IN (${candidateSql})`);\n }\n\n const snippetExpr =\n params.includeSnippets === true && strategy.supportsSnippets ?\n toDrizzleSql(\n strategy.snippetExpression(\n tableName,\n params.query,\n mode,\n params.language,\n ),\n dialect,\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 { getDialect } from \"../../../query/dialect\";\nimport { sql as portableSql } from \"../../../query/sql-fragment\";\nimport { resolveStampedValidityLowerBound } from \"../../../utils/date\";\nimport type {\n DeleteNodeParams,\n HardDeleteNodeParams,\n InsertNodeParams,\n UpdateNodeParams,\n UpdateNodeSetParams,\n} from \"../../types\";\nimport { toDrizzleSql } from \"../execution/types\";\nimport {\n expectedValidFromPredicate,\n nodeColumnList,\n quotedColumn,\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 *\n * The stored lower bound is decided by {@link resolveStampedValidityLowerBound}\n * against the very `timestamp` this statement binds into `created_at` /\n * `updated_at`, so a row cannot be stamped with a bound that disagrees with the\n * instant it was created at. Deciding it HERE — below the store, below\n * interchange, below trusted import — is what makes \"no write stores a window\n * readable at no coordinate\" hold for every `GraphBackend` caller rather than for\n * the store paths one reviewer enumerated.\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(resolveStampedValidityLowerBound(params.validFrom, params.validTo, 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(resolveStampedValidityLowerBound(params.validFrom, params.validTo, 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(resolveStampedValidityLowerBound(nodeParams.validFrom, nodeParams.validTo, 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(resolveStampedValidityLowerBound(nodeParams.validFrom, nodeParams.validTo, 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 (${sql.join(\n ids.map((id) => sql`${id}`),\n sql`, `,\n )})\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 // A resurrection RESETS the window: `valid_from` is rewritten rather than\n // retained (an edge retains it — see `buildUpdateEdge`), so this leg STAMPS a\n // bound when the caller states none, and it makes that choice through the same\n // owner every insert builder uses. Two consequences, both load-bearing. A\n // resurrection carrying only a past `validTo` — which `create` on a tombstoned\n // id reaches with nothing stated — stores NO lower bound instead of a window\n // readable at no coordinate, whoever called the backend (issue #407). And\n // `timestamp` remains only the fallback: the operations layer passes the\n // instant its inverted-window guard measured against as an explicit\n // `validFrom`, so the bound this stores is the bound that was checked rather\n // than a strictly later sample the guard never saw (issue #413).\n if (params.clearDeleted) {\n setParts.push(\n sql`${quotedColumn(nodes.validFrom)} = ${sqlNull(resolveStampedValidityLowerBound(params.validFrom, params.validTo, timestamp))}`,\n sql`${quotedColumn(nodes.validTo)} = ${sqlNull(params.validTo)}`,\n );\n } else if (params.clearValidTo === true) {\n setParts.push(sql`${quotedColumn(nodes.validTo)} = NULL`);\n } else 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 // The bound the CALLER read, when it read one — see\n // `UpdateNodeParams.expectedValidFrom`. Emitted on both legs: a resurrecting\n // upsert that decided from the tombstone's window is fenced on the same terms\n // as a live-row update.\n const expectedValidFrom = expectedValidFromPredicate(\n nodes.validFrom,\n params.expectedValidFrom,\n );\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}${expectedValidFrom}\n AND ${nodes.deletedAt} IS NOT NULL\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}${expectedValidFrom}\n AND ${nodes.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds one set-based update over candidate ids selected by the shared query\n * compiler. The outer graph/kind/live-row predicates are deliberate write\n * fences and must not be delegated solely to the candidate subquery.\n */\nexport function buildUpdateNodeSet(\n tables: Tables,\n dialect: \"sqlite\" | \"postgres\",\n params: UpdateNodeSetParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const adapter = getDialect(dialect);\n const patchedProps = toDrizzleSql(\n adapter.jsonSetProperties(\n portableSql.identifier(nodes.props.name),\n params.patch,\n params.unsetProperties ?? [],\n ),\n dialect,\n );\n const candidateIds = toDrizzleSql(params.candidateIds, dialect);\n const candidateIdColumn = toDrizzleSql(\n portableSql.identifier(params.candidateIdColumn),\n dialect,\n );\n\n return sql`\n UPDATE ${nodes}\n SET ${quotedColumn(nodes.props)} = ${patchedProps},\n ${quotedColumn(nodes.updatedAt)} = ${timestamp},\n ${quotedColumn(nodes.version)} = ${quotedColumn(nodes.version)} + 1\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.deletedAt} IS NULL\n AND ${nodes.id} IN (\n SELECT ${candidateIdColumn}\n FROM (${candidateIds}) AS tg_set_candidates\n )\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(\n dialect: SqlDialect,\n): SchemaDialectStrategy {\n const literals = {\n postgres: { false: \"FALSE\", true: \"TRUE\" },\n sqlite: { false: \"0\", true: \"1\" },\n } as const satisfies Record<\n SqlDialect,\n Readonly<{ false: string; true: string }>\n >;\n const dialectLiterals = literals[dialect];\n const trueLiteral = sql.raw(dialectLiterals.true);\n const falseLiteral = sql.raw(dialectLiterals.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(\n `\"${schemaVersions.graphId.name}\", \"${schemaVersions.version.name}\", \"${schemaVersions.schemaHash.name}\", \"${schemaVersions.schemaDoc.name}\", \"${schemaVersions.createdAt.name}\", \"${schemaVersions.isActive.name}\"`,\n );\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 {\n type ClaimOwnerColumnNames,\n claimOwnerMatchesSql,\n} from \"../../../store/claims/axis\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n DeleteUniqueParams,\n HardDeleteUniquesByNodeIdsParams,\n InsertUniqueParams,\n SqlDialect,\n} from \"../../types\";\nimport { quotedColumn, quotedTableName, type Tables } from \"./shared\";\n\ntype InsertUniqueDialectBuilder = (\n tables: Tables,\n params: InsertUniqueParams,\n) => SQL;\n\n/** Adapts Drizzle's generic SQL tag to the representation-neutral claim owner. */\nfunction drizzleSqlTag(\n strings: TemplateStringsArray,\n ...expressions: readonly SQL[]\n): SQL {\n return sql(strings, ...expressions);\n}\n\n/**\n * The owner columns of the uniques relation, by physical column name — the\n * one owner {@link claimOwnerMatchesSql} is handed instead of a re-spelled\n * qualification decision.\n */\nfunction ownerColumnNames(uniques: Tables[\"uniques\"]): ClaimOwnerColumnNames {\n return {\n nodeId: uniques.nodeId.name,\n concreteKind: uniques.concreteKind.name,\n };\n}\n\n/**\n * The proposed row's owner columns, as bound values — the single-row builders'\n * rendering of the `proposed` side of {@link claimOwnerMatchesSql}.\n */\nfunction boundOwnerColumn(\n uniques: Tables[\"uniques\"],\n params: InsertUniqueParams,\n): (columnName: string) => SQL {\n return (columnName) =>\n columnName === uniques.nodeId.name ?\n sql`${params.nodeId}`\n : sql`${params.concreteKind}`;\n}\n\n/**\n * The batch builder's rendering of the `proposed` side of\n * {@link claimOwnerMatchesSql}: the row `ON CONFLICT DO UPDATE` is about to\n * write, read back off `excluded`.\n */\nfunction excludedColumnByName(columnName: string): SQL {\n return sql`excluded.${quotedColumn({ name: columnName })}`;\n}\n\nfunction excludedColumn(column: Readonly<{ name: string }>): SQL {\n return excludedColumnByName(column.name);\n}\n\n/**\n * Builds an INSERT query for a uniqueness claim (SQLite).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing claim belongs to the same node — the OWNER PAIR\n * `(concrete_kind, node_id)`, because ids are unique only per kind — OR\n * 2. The existing claim is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING shows the conflicting owner.\n */\nfunction buildInsertUniqueSqlite(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`,\n );\n const conflictColumns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`,\n );\n\n const ownerMatches = claimOwnerMatchesSql(\n drizzleSqlTag,\n (columnName) => quotedColumn({ name: columnName }),\n boundOwnerColumn(uniques, params),\n ownerColumnNames(uniques),\n );\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${ownerMatches} THEN ${params.nodeId}\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${quotedColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${ownerMatches} THEN ${params.concreteKind}\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${quotedColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${ownerMatches} THEN NULL\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${quotedColumn(uniques.deletedAt)}\n END\n RETURNING\n ${quotedColumn(uniques.nodeId)} as node_id,\n ${quotedColumn(uniques.concreteKind)} as concrete_kind\n `;\n}\n\n/**\n * Builds an INSERT query for a uniqueness claim (PostgreSQL).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing claim belongs to the same node — the OWNER PAIR\n * `(concrete_kind, node_id)`, because ids are unique only per kind — OR\n * 2. The existing claim is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING shows the conflicting owner.\n */\nfunction buildInsertUniquePostgres(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`,\n );\n const conflictColumns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`,\n );\n\n const tableName = getTableName(uniques);\n const existingColumnByName = (columnName: string): SQL =>\n sql`${quotedTableName(tableName)}.${quotedColumn({ name: columnName })}`;\n const existingColumn = (column: Readonly<{ name: string }>) =>\n existingColumnByName(column.name);\n\n const ownerMatches = claimOwnerMatchesSql(\n drizzleSqlTag,\n (columnName) => existingColumnByName(columnName),\n boundOwnerColumn(uniques, params),\n ownerColumnNames(uniques),\n );\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${ownerMatches} THEN ${params.nodeId}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${existingColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${ownerMatches} THEN ${params.concreteKind}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${existingColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${ownerMatches} THEN NULL\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${existingColumn(uniques.deletedAt)}\n END\n RETURNING\n ${quotedColumn(uniques.nodeId)} as node_id,\n ${quotedColumn(uniques.concreteKind)} as concrete_kind\n `;\n}\n\nconst UNIQUE_INSERT_BUILDERS: Record<SqlDialect, InsertUniqueDialectBuilder> = {\n postgres: buildInsertUniquePostgres,\n sqlite: buildInsertUniqueSqlite,\n};\n\n/**\n * Builds an INSERT query for a uniqueness entry.\n * Returns the node_id that now holds the key (may differ from input if conflict).\n */\nexport function buildInsertUnique(\n tables: Tables,\n dialect: SqlDialect,\n params: InsertUniqueParams,\n): SQL {\n const builder = UNIQUE_INSERT_BUILDERS[dialect];\n return builder(tables, params);\n}\n\n/**\n * Builds a multi-row INSERT for uniqueness claims with the same conflict\n * semantics as {@link buildInsertUnique}, expressed against `excluded`\n * (the proposed row) instead of per-statement bound values. RETURNING\n * exposes `(node_kind, constraint_name, key, node_id, concrete_kind)` for\n * every row — ON CONFLICT DO UPDATE returns updated rows too — so the caller\n * can attribute each entry's final OWNER PAIR and raise a uniqueness error for\n * the ones a different live node holds. `concrete_kind` is load-bearing in that\n * list: without it two batch rows sharing an id under different kinds would\n * both read their own `node_id` back and both be accepted.\n *\n * Callers must not pass two entries with the same conflict target\n * (`node_kind`, `constraint_name`, `key`): a multi-row upsert cannot\n * affect one row twice.\n */\nexport function buildInsertUniqueBatch(\n tables: Tables,\n dialect: SqlDialect,\n entries: readonly InsertUniqueParams[],\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`,\n );\n const conflictColumns = sql.raw(\n `\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`,\n );\n\n // Mirror the single-row builders' dialect split for references to the\n // EXISTING row inside DO UPDATE: Postgres qualifies with the table name,\n // SQLite uses the bare quoted column. This is the batch builder's own\n // switch — claimOwnerMatchesSql only composes whatever renderer it is\n // handed.\n const tableName = getTableName(uniques);\n const existingColumnByName = (columnName: string): SQL => {\n switch (dialect) {\n case \"postgres\": {\n return sql`${quotedTableName(tableName)}.${quotedColumn({ name: columnName })}`;\n }\n case \"sqlite\": {\n return quotedColumn({ name: columnName });\n }\n default: {\n return dialect satisfies never;\n }\n }\n };\n\n const existingColumn = (column: Readonly<{ name: string }>) =>\n existingColumnByName(column.name);\n\n const ownerMatches = claimOwnerMatchesSql(\n drizzleSqlTag,\n (columnName) => existingColumnByName(columnName),\n excludedColumnByName,\n ownerColumnNames(uniques),\n );\n\n const valueRows = sql.join(\n entries.map(\n (params) =>\n sql`(${params.graphId}, ${params.nodeKind}, ${params.constraintName}, ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")})`,\n ),\n sql`, `,\n );\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES ${valueRows}\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${ownerMatches} THEN ${excludedColumn(uniques.nodeId)}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${excludedColumn(uniques.nodeId)}\n ELSE ${existingColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${ownerMatches} THEN ${excludedColumn(uniques.concreteKind)}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${excludedColumn(uniques.concreteKind)}\n ELSE ${existingColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${ownerMatches} THEN NULL\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${existingColumn(uniques.deletedAt)}\n END\n RETURNING\n ${quotedColumn(uniques.nodeKind)} as node_kind,\n ${quotedColumn(uniques.constraintName)} as constraint_name,\n ${quotedColumn(uniques.key)} as key,\n ${quotedColumn(uniques.nodeId)} as node_id,\n ${quotedColumn(uniques.concreteKind)} as concrete_kind\n `;\n}\n\n/**\n * Builds the owner-scoped soft DELETE that releases a uniqueness claim.\n * Uses raw column name in SET clause.\n *\n * The owner pair `(concrete_kind, node_id)` is always part of the predicate:\n * a release gives up the claims THIS node holds, never a namesake's under\n * another kind and never one that predates this node's write. `nodeKind`\n * additionally restricts the release to one claim axis — see\n * {@link DeleteUniqueParams} for the two shapes and who issues each.\n */\nexport function buildDeleteUnique(\n tables: Tables,\n params: DeleteUniqueParams,\n timestamp: string,\n): SQL {\n const { uniques } = tables;\n\n const axisTerm =\n params.nodeKind === undefined ?\n sql``\n : sql` AND ${uniques.nodeKind} = ${params.nodeKind}`;\n\n return sql`\n UPDATE ${uniques}\n SET ${quotedColumn(uniques.deletedAt)} = ${timestamp}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.concreteKind} = ${params.concreteKind}\n AND ${uniques.nodeId} = ${params.nodeId}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}${axisTerm}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for all uniqueness entries for a node.\n */\nexport function buildHardDeleteUniquesByNode(\n tables: Tables,\n graphId: string,\n concreteKind: string,\n nodeId: string,\n): SQL {\n return buildHardDeleteUniquesByNodeIds(tables, {\n graphId,\n concreteKind,\n nodeIds: [nodeId],\n });\n}\n\n/**\n * Builds a hard DELETE for every uniqueness entry owned by concrete nodes.\n */\nexport function buildHardDeleteUniquesByNodeIds(\n tables: Tables,\n params: HardDeleteUniquesByNodeIdsParams,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n DELETE FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.concreteKind} = ${params.concreteKind}\n AND ${uniques.nodeId} IN (${sql.join(\n params.nodeIds.map((nodeId) => sql`${nodeId}`),\n sql`, `,\n )})\n `;\n}\n\n// Re-exported from its new owner so `operations/strategy.ts:117,256,597-600`\n// sees no change.\nexport { buildHardDeleteUniquesByConcreteKind } from \"../../../store/claims/removal-sql\";\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 { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport type { FulltextStrategy } from \"../../../query/dialect/fulltext-strategy\";\nimport { isSqlFragment, type SqlFragment } from \"../../../query/sql-fragment\";\nimport { type ConstrainedCardinality } from \"../../../store/claims/edge-claims\";\nimport { isPresent } from \"../../../utils/presence\";\nimport type { PrimaryKeyRelation } from \"../../../utils/sql-errors\";\nimport { nowIso } from \"../../row-mappers\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n ClaimEdgeCardinalityParams,\n ContributionMaterializationIdentity,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteEdgesBatchParams,\n DeleteFulltextBatchParams,\n DeleteFulltextParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n EdgeExistsBetweenParams,\n FindEdgesByEndpointSetParams,\n FindEdgesByHeterogeneousEndpointSetParams,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n FulltextSearchParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n HardDeleteUniquesByConcreteKindParams,\n HardDeleteUniquesByNodeIdsParams,\n HybridSearchParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertSchemaParams,\n InsertUniqueParams,\n PurgeEdgeClaimsParams,\n RecordContributionMaterializationParams,\n SqlDialect,\n UpdateEdgeParams,\n UpdateNodeParams,\n UpdateNodeSetParams,\n UpsertFulltextBatchParams,\n UpsertFulltextParams,\n} from \"../../types\";\nimport { toDrizzleSql } from \"../execution/types\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\nimport { buildClearGraph, type ClearGraphStatement } from \"./clear\";\nimport {\n buildCountEdgesByKind,\n buildCountNodesByKind,\n buildFindEdgesByEndpointSet,\n buildFindEdgesByHeterogeneousEndpointSet,\n buildFindEdgesByKind,\n buildFindNodesByKind,\n} from \"./collections\";\nimport {\n buildContendedEdgeRowAudit,\n buildContendedUniqueRowAudit,\n buildDisjointOverlapAudit,\n} from \"./constraint-fence-audit\";\nimport {\n buildLockEdgeClaims,\n buildPurgeEdgeClaims,\n buildTakeOverEdgeClaim,\n} from \"./edge-claims\";\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 buildUpdateNodeSet,\n} from \"./nodes\";\nimport {\n buildGetActiveSchema,\n buildGetSchemaVersion,\n buildInsertSchema,\n buildSetActiveSchema,\n} from \"./schema\";\nimport {\n edgePrimaryKeyConstraint,\n liveNodeIdsSubquery,\n nodePrimaryKeyConstraint,\n type Tables,\n} from \"./shared\";\nimport {\n buildCheckUnique,\n buildCheckUniqueBatch,\n buildDeleteUnique,\n buildHardDeleteUniquesByConcreteKind,\n buildHardDeleteUniquesByNode,\n buildHardDeleteUniquesByNodeIds,\n buildInsertUnique,\n buildInsertUniqueBatch,\n} from \"./uniques\";\n\n/**\n * Binds an absent value as a SQL `NULL` literal rather than as a bound\n * parameter, so the column's own type drives the insert instead of the\n * driver having to infer a type for a null placeholder.\n */\nfunction nullableText(value: string | undefined): SQL {\n return value === undefined ? sql`NULL` : sql`${value}`;\n}\n\nexport type CommonOperationStrategy = Readonly<{\n /**\n * The nodes and edges PRIMARY KEY constraints, as the engine names them — the\n * only scope in which a driver duplicate-key failure means \"this identity is\n * already taken\" rather than \"these values collide with another row's\".\n *\n * Data rather than SQL, and a member of this interface rather than a lookup at\n * the classification site, so it is derived once from the same `tables` the\n * insert builders render and every dialect is forced by the type checker to\n * supply it.\n */\n primaryKeyConstraints: Readonly<{\n nodes: PrimaryKeyRelation;\n edges: PrimaryKeyRelation;\n }>;\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 * 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: (params: InsertNodeParams, timestamp: string) => 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 buildUpdateNodeSet: (params: UpdateNodeSetParams, timestamp: string) => SQL;\n buildDeleteNode: (params: DeleteNodeParams, timestamp: string) => SQL;\n buildHardDeleteNode: (params: HardDeleteNodeParams) => SQL;\n buildInsertEdge: (params: InsertEdgeParams, timestamp: string) => SQL;\n buildInsertEdgeNoReturn: (params: InsertEdgeParams, timestamp: string) => 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 /**\n * Interface member rather than an optional one: every dialect must supply\n * an endpoint-set read, so the operation can never be silently skipped by a\n * dialect that forgot it. Both bundled dialects get it from the shared\n * builder.\n */\n buildFindEdgesByEndpointSet: (\n params: FindEdgesByEndpointSetParams,\n endpointIds: readonly string[],\n ) => SQL;\n buildFindEdgesByHeterogeneousEndpointSet: (\n params: FindEdgesByHeterogeneousEndpointSetParams,\n endpoints: readonly Readonly<{ kind: string; id: string }>[],\n edgeKinds: readonly string[],\n ) => 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: (\n graphId: string,\n concreteKind: string,\n nodeId: string,\n ) => SQL;\n buildHardDeleteUniquesByNodeIds: (\n params: HardDeleteUniquesByNodeIdsParams,\n ) => SQL;\n /**\n * Dialect-independent by construction — the fragment names only the\n * relation and two columns, so the store-side kind-removal cleanup compiles\n * the identical predicate through its own execution path.\n */\n buildHardDeleteUniquesByConcreteKind: (\n params: HardDeleteUniquesByConcreteKindParams,\n ) => SqlFragment;\n buildCheckUnique: (params: CheckUniqueParams) => SQL;\n buildCheckUniqueBatch: (params: CheckUniqueBatchParams) => SQL;\n /**\n * The two edge-claim statements, in the order the driver issues them: the\n * decision-free lock that reports the committed holder, then — only for a\n * foreign holder — the conditional takeover. Members of this interface rather\n * than dialect helpers, so the type checker forces both dialects to have them.\n */\n buildLockEdgeClaims: (\n entries: readonly ClaimEdgeCardinalityParams[],\n timestamp: string,\n ) => SQL;\n buildTakeOverEdgeClaim: (\n params: ClaimEdgeCardinalityParams,\n timestamp: string,\n ) => SQL;\n buildPurgeEdgeClaims: (params: PurgeEdgeClaimsParams) => SQL;\n /**\n * The three read-only fence-audit statements, one per constraint family.\n * Members of this interface for the same reason the claim statements are:\n * the type checker forces both dialects to have them, so a family cannot be\n * audited on one backend and silently skipped on the other.\n */\n buildContendedUniqueRowAudit: (\n graphId: string,\n constraintNames: readonly string[],\n ) => SQL;\n buildContendedEdgeRowAudit: (\n graphId: string,\n cardinality: ConstrainedCardinality,\n edgeKinds: readonly string[],\n ) => SQL;\n buildDisjointOverlapAudit: (\n graphId: string,\n kinds: readonly [string, string],\n ) => 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 /**\n * Write one contribution marker row outright (no conflict clause), for\n * the transaction-scoped stamp a destructive rebuild commits alongside\n * the DDL that produced it.\n */\n buildInsertContributionMaterialization: (\n params: RecordContributionMaterializationParams,\n ) => SQL;\n buildDeleteContributionMaterialization: (\n identity: ContributionMaterializationIdentity,\n ) => 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 = (tables: Tables, ...args: never[]) => SQL;\n\ntype TableOperationBuilderMap = Readonly<Record<string, TableOperationBuilder>>;\n\ntype BoundTableOperationBuilderMap<TBuilders extends TableOperationBuilderMap> =\n Readonly<{\n [K in keyof TBuilders]: TBuilders[K] extends (\n (tables: Tables, ...args: infer TArguments) => SQL\n ) ?\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(\n boundEntries,\n ) 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 buildFindEdgesByEndpointSet,\n buildFindEdgesByHeterogeneousEndpointSet,\n buildCountEdgesByKind,\n buildDeleteUnique,\n buildHardDeleteUniquesByNode,\n buildHardDeleteUniquesByNodeIds,\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 const contributionMaterializations = tables.contributionMaterializations;\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\n .buildUpsert(fulltextTable, params, timestamp)\n .map((statement) => toDrizzleSql(statement, dialect)),\n buildDeleteFulltext: (params: DeleteFulltextParams): readonly SQL[] =>\n fulltextStrategy\n .buildDelete(fulltextTable, params)\n .map((statement) => toDrizzleSql(statement, dialect)),\n buildDeleteFulltextByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ): readonly SQL[] =>\n fulltextStrategy\n .buildDelete(fulltextTable, {\n graphId,\n nodeKind,\n nodeId,\n })\n .map((statement) => toDrizzleSql(statement, dialect)),\n buildUpsertFulltextBatch: (\n params: UpsertFulltextBatchParams,\n timestamp: string,\n ): readonly SQL[] =>\n fulltextStrategy\n .buildBatchUpsert(fulltextTable, params, timestamp)\n .map((statement) => toDrizzleSql(statement, dialect)),\n buildDeleteFulltextBatch: (\n params: DeleteFulltextBatchParams,\n ): readonly SQL[] =>\n fulltextStrategy\n .buildBatchDelete(fulltextTable, params)\n .map((statement) => toDrizzleSql(statement, dialect)),\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(\n tables.nodes,\n params.graphId,\n params.nodeKind,\n nowIso(),\n ),\n ),\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:\n isSqlFragment(candidates) ?\n toDrizzleSql(candidates, dialect)\n : 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 /**\n * States one contribution marker row outright: every column takes the\n * supplied value whether or not a row already exists.\n *\n * Deliberately not the top-level backend's upsert, which COALESCEs\n * `materialized_at` so a *failed* re-attempt cannot erase an earlier\n * success. That rule is right when the attempt may have failed and\n * wrong for a completed destructive rebuild, whose whole point is that\n * the storage is new — the recorded timestamp must be the rebuild's,\n * not the shape it replaced.\n *\n * One statement rather than a delete/insert pair so the row is never\n * momentarily absent inside the transaction, and so a concurrent\n * `repairContributions()` racing the same identity resolves as a\n * conflict rather than a primary-key violation that would roll the\n * whole rebuild back.\n *\n * Dialect-shared: the composite primary key is the conflict target on\n * both engines, and the ISO timestamps bind straight into SQLite's TEXT\n * and Postgres' TIMESTAMPTZ columns, the same way every other write\n * builder here passes `nowIso()` through.\n */\n function buildInsertContributionMaterialization(\n params: RecordContributionMaterializationParams,\n ): SQL {\n return sql`\n INSERT INTO ${contributionMaterializations}\n (graph_id, logical_name, owner, table_name, signature,\n materialized_at, last_attempted_at, last_error)\n VALUES (\n ${params.graphId}, ${params.logicalName}, ${params.owner},\n ${params.tableName}, ${params.signature},\n ${nullableText(params.materializedAt)}, ${params.attemptedAt},\n ${nullableText(params.error)}\n )\n ON CONFLICT (graph_id, logical_name, owner, table_name) DO UPDATE SET\n signature = excluded.signature,\n materialized_at = excluded.materialized_at,\n last_attempted_at = excluded.last_attempted_at,\n last_error = excluded.last_error\n `;\n }\n\n function buildDeleteContributionMaterialization(\n identity: ContributionMaterializationIdentity,\n ): SQL {\n return sql`\n DELETE FROM ${contributionMaterializations}\n WHERE graph_id = ${identity.graphId}\n AND logical_name = ${identity.logicalName}\n AND owner = ${identity.owner}\n AND table_name = ${identity.tableName}\n `;\n }\n\n return {\n ...tableOperations,\n ...fulltextBuilders,\n primaryKeyConstraints: {\n nodes: nodePrimaryKeyConstraint(tables.nodes),\n edges: edgePrimaryKeyConstraint(tables.edges),\n },\n buildUpdateNodeSet(params: UpdateNodeSetParams, timestamp: string): SQL {\n return buildUpdateNodeSet(tables, dialect, params, timestamp);\n },\n buildDeleteContributionMaterialization,\n buildInsertContributionMaterialization,\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 buildHardDeleteUniquesByConcreteKind(\n params: HardDeleteUniquesByConcreteKindParams,\n ): SqlFragment {\n return buildHardDeleteUniquesByConcreteKind(\n getTableName(tables.uniques),\n params,\n );\n },\n buildLockEdgeClaims(\n entries: readonly ClaimEdgeCardinalityParams[],\n timestamp: string,\n ): SQL {\n return buildLockEdgeClaims(tables, entries, timestamp);\n },\n buildTakeOverEdgeClaim(\n params: ClaimEdgeCardinalityParams,\n timestamp: string,\n ): SQL {\n return buildTakeOverEdgeClaim(tables, params, timestamp);\n },\n buildPurgeEdgeClaims(params: PurgeEdgeClaimsParams): SQL {\n return buildPurgeEdgeClaims(tables, params);\n },\n buildContendedUniqueRowAudit(\n graphId: string,\n constraintNames: readonly string[],\n ): SQL {\n return buildContendedUniqueRowAudit(tables, graphId, constraintNames);\n },\n buildContendedEdgeRowAudit(\n graphId: string,\n cardinality: ConstrainedCardinality,\n edgeKinds: readonly string[],\n ): SQL {\n return buildContendedEdgeRowAudit(\n tables,\n graphId,\n cardinality,\n edgeKinds,\n );\n },\n buildDisjointOverlapAudit(\n graphId: string,\n kinds: readonly [string, string],\n ): SQL {\n return buildDisjointOverlapAudit(tables, graphId, kinds);\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 switch (dialect) {\n case \"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 case \"sqlite\": {\n return sql`SELECT name AS table_name FROM sqlite_master WHERE type IN ('table', 'view') AND name = ${tableName}`;\n }\n default: {\n return dialect satisfies never;\n }\n }\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 } from \"drizzle-orm\";\n\nimport {\n ConfigurationError,\n DatabaseOperationError,\n MigrationError,\n SchemaContentConflictError,\n StaleVersionError,\n UniquenessError,\n} from \"../../errors\";\nimport type { SqlDialect } from \"../../query/dialect/types\";\nimport type { VectorSlot } from \"../../query/dialect/vector-strategy\";\nimport { sql } from \"../../query/sql-fragment\";\nimport type {\n CompiledStatementSql,\n CompiledTemporaryStatementSql,\n} from \"../../query/sql-intent\";\nimport { asCompiledStatementSql } from \"../../query/sql-intent\";\nimport { type ClaimOwner, isSameClaimOwner } from \"../../store/claims/axis\";\nimport {\n type ConstrainedCardinality,\n edgeCardinalityClaimTarget,\n} from \"../../store/claims/edge-claims\";\nimport { chunk as chunkArray } from \"../../utils/array\";\nimport {\n isDuplicatePrimaryKeyError,\n type PrimaryKeyRelation,\n} from \"../../utils/sql-errors\";\nimport {\n resolveEdgeEndpointIds,\n resolveHeterogeneousEdgeRead,\n} from \"../edge-endpoint-sets\";\nimport { nowIso as defaultNowIso } from \"../row-mappers\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n ClaimEdgeCardinalityParams,\n CommitSchemaVersionIfKindsEmptyResult,\n CommitSchemaVersionParams,\n ConstraintFenceViolationRows,\n ContendedEdgeRow,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteEdgesBatchParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n DisjointOverlapRow,\n EdgeClaimOutcome,\n EdgeExistsBetweenParams,\n EdgeRow,\n FindEdgesByEndpointSetParams,\n FindEdgesByHeterogeneousEndpointSetParams,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n GraphBackend,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n HardDeleteUniquesByConcreteKindParams,\n HardDeleteUniquesByNodeIdsParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertUniqueParams,\n NodeRow,\n PopulatedSchemaKind,\n PurgeEdgeClaimsParams,\n ReadConstraintFenceViolationsParams,\n SchemaKindEmptinessProbe,\n SchemaVersionRow,\n SetActiveVersionParams,\n TransactionBackend,\n UniqueRow,\n UpdateEdgeParams,\n UpdateNodeParams,\n UpdateNodeSetParams,\n UpdateNodeSetResult,\n} from \"../types\";\nimport { type ExecutableSql } from \"./execution/types\";\nimport {\n type CommonOperationStrategy,\n createCachedTableExistence,\n type TableExistenceCacheOptions,\n} from \"./operations/strategy\";\n\n/**\n * The owner a claim write proposes. Reading it off the params in one place is\n * what keeps the accept/refuse test comparing the same pair the SQL arms do.\n */\nfunction claimOwnerOf(params: InsertUniqueParams): ClaimOwner {\n return { concreteKind: params.concreteKind, nodeId: params.nodeId };\n}\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 | \"executeTemporaryStatement\"\n | \"findEdgesByKind\"\n | \"findEdgesByEndpointSet\"\n | \"findEdgesByHeterogeneousEndpointSet\"\n | \"findEdgesConnectedTo\"\n | \"findNodesByKind\"\n | \"getActiveSchema\"\n | \"getEdge\"\n | \"getEdges\"\n | \"getNode\"\n | \"getNodes\"\n | \"getSchemaVersion\"\n | \"hardDeleteEdge\"\n | \"hardDeleteEdgesBatch\"\n | \"hardDeleteNode\"\n | \"claimEdgeCardinality\"\n | \"claimEdgeCardinalityBatch\"\n | \"hardDeleteUniquesByConcreteKind\"\n | \"hardDeleteUniquesByNodeIds\"\n | \"insertEdge\"\n | \"insertEdgeNoReturn\"\n | \"insertEdgesBatch\"\n | \"insertEdgesBatchReturning\"\n | \"insertNode\"\n | \"insertNodeNoReturn\"\n | \"insertNodesBatch\"\n | \"insertNodesBatchReturning\"\n | \"insertUnique\"\n | \"insertUniqueBatch\"\n | \"purgeEdgeClaims\"\n | \"updateEdge\"\n | \"updateNode\"\n | \"updateNodeSet\"\n> &\n Readonly<{\n /**\n * The read-only fence audit. Not a `TransactionBackend` member — it is a\n * diagnostic the store runs at the top-level backend, and nothing inside a\n * write transaction reads it — so it is declared here rather than picked.\n */\n readConstraintFenceViolations: NonNullable<\n GraphBackend[\"readConstraintFenceViolations\"]\n >;\n executeStatement: NonNullable<TransactionBackend[\"executeStatement\"]>;\n commitSchemaVersion: (\n params: CommitSchemaVersionParams,\n ) => Promise<SchemaVersionRow>;\n setActiveVersion: (params: SetActiveVersionParams) => Promise<void>;\n executeSchemaDdl: (ddl: string) => Promise<void>;\n tableExists: (tableName: string) => Promise<boolean>;\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 Readonly<{\n deleteSchemaVectorSlotContribution: (slot: VectorSlot) => Promise<void>;\n }>;\n\nconst DRIZZLE_DIALECT_LABELS = {\n postgres: \"Postgres\",\n sqlite: \"SQLite\",\n} as const satisfies Record<SqlDialect, string>;\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: SqlDialect,\n): asserts externalTx is T {\n if (is(externalTx, brand)) return;\n const label = DRIZZLE_DIALECT_LABELS[backend];\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: ExecutableSql) => Promise<readonly TRow[]>;\n execGet: <TRow>(query: ExecutableSql) => Promise<TRow | undefined>;\n execRun: (query: ExecutableSql) => Promise<void>;\n}>;\n\ntype OperationBackendBatchConfig = Readonly<{\n checkUniqueBatchChunkSize: number;\n edgeInsertBatchSize: number;\n findEdgesEndpointChunkSize: number;\n getEdgesChunkSize: number;\n getNodesChunkSize: number;\n nodeInsertBatchSize: number;\n uniqueDeleteChunkSize: 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 maxBindParameters: number;\n nowIso?: (() => string) | undefined;\n operationStrategy: CommonOperationStrategy;\n rowMappers: OperationBackendRowMappers;\n tableExistenceCache?: TableExistenceCacheOptions | undefined;\n}>;\n\n/**\n * The entity refs a duplicate-key classification reports back. Nodes carry a\n * kind of their own; an edge's `kind` is its edge kind, which the insert params\n * also carry.\n */\ntype AttemptedInsert = Readonly<{ kind: string; id: string }>;\n\n/**\n * Runs an insert and converts a PRIMARY KEY duplicate-key refusal into a\n * classified {@link DatabaseOperationError} carrying the rows it attempted.\n *\n * The translation stops here rather than reaching for the store's \"already\n * exists\" error because that is a store-level judgement: the backend's job is to\n * say *what the engine refused and why* in terms callers can branch on, instead\n * of letting a `DrizzleQueryError` whose `.message` is the raw INSERT text\n * escape as the operation's outcome (issue #410). The create paths translate it\n * onward; every other caller sees a system error, exactly as before.\n *\n * Any other failure — including a 23505 from a declared `unique: true` index on\n * the same relation — propagates untouched.\n */\nasync function withDuplicateKeyClassification<T>(\n run: () => Promise<T>,\n context: Readonly<{\n entity: \"node\" | \"edge\";\n relation: PrimaryKeyRelation;\n attempted: readonly AttemptedInsert[];\n }>,\n): Promise<T> {\n try {\n return await run();\n } catch (error) {\n if (!isDuplicatePrimaryKeyError(error, context.relation)) throw error;\n throw new DatabaseOperationError(\n `Insert ${context.entity} failed: a row with this identity already exists`,\n {\n operation: \"insert\",\n entity: context.entity,\n reason: \"duplicate_key\",\n attempted: context.attempted,\n },\n { cause: error },\n );\n }\n}\n\n/**\n * The entity refs of an insert's rows, copied out of the insert params so the\n * error carries identity alone and never the props alongside it.\n */\nfunction attemptedInserts(\n params: readonly AttemptedInsert[],\n): readonly AttemptedInsert[] {\n return params.map((item) => ({ kind: item.kind, id: item.id }));\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 assertActiveSchemaVersion(graphId, expectedVersion, actualActiveVersion);\n}\n\nexport function assertActiveSchemaVersion(\n graphId: string,\n expectedVersion: number,\n actualActiveVersion: number,\n): void {\n if (actualActiveVersion !== expectedVersion) {\n throw new StaleVersionError({\n graphId,\n expected: expectedVersion,\n actual: actualActiveVersion,\n });\n }\n}\n\n/**\n * Runs the populated-kind guard and schema commit on one transaction-scoped\n * backend. The dialect wrapper is responsible for fencing ordinary entity\n * writes before calling this helper.\n */\nexport async function commitSchemaVersionIfKindsEmpty(\n backend: CommonOperationBackend,\n params: CommitSchemaVersionParams,\n probes: readonly SchemaKindEmptinessProbe[],\n): Promise<CommitSchemaVersionIfKindsEmptyResult> {\n const [existing, active] = await Promise.all([\n backend.getSchemaVersion(params.graphId, params.version),\n backend.getActiveSchema(params.graphId),\n ]);\n\n // Preserve commitSchemaVersion's conflict and idempotency precedence. A\n // retry of an already-active identical version is success regardless of\n // current row counts; a conflicting same-version document remains a\n // content conflict rather than being masked as a populated-kind refusal.\n if (\n existing !== undefined &&\n (existing.is_active || existing.schema_hash !== params.schemaHash)\n ) {\n return {\n status: \"committed\",\n row: await backend.commitSchemaVersion(params),\n };\n }\n\n verifyExpectedActiveVersion(\n params.graphId,\n params.expected,\n active?.version ?? 0,\n );\n\n const populated: PopulatedSchemaKind[] = [];\n for (const probe of probes) {\n const count =\n probe.entity === \"node\" ?\n await backend.countNodesByKind({\n graphId: params.graphId,\n kind: probe.kind,\n })\n : await backend.countEdgesByKind({\n graphId: params.graphId,\n kind: probe.kind,\n });\n if (count > 0) populated.push({ ...probe, count });\n }\n\n if (populated.length > 0) {\n return { status: \"populated\", kinds: populated };\n }\n\n return {\n status: \"committed\",\n row: await backend.commitSchemaVersion(params),\n };\n}\n\nexport function createCommonOperationBackend(\n options: CreateCommonOperationBackendOptions,\n): CommonOperationBackend {\n const {\n batchConfig,\n execution,\n maxBindParameters,\n operationStrategy,\n rowMappers,\n } = options;\n const nowIso = options.nowIso ?? defaultNowIso;\n\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 tableExists = createCachedTableExistence(\n (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: ExecutableSql;\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 tableExists(statement.requiredTableName))\n ) {\n return;\n }\n await execution.execRun(statement.query);\n }\n\n /**\n * THE edge-claim driver, shared by the single and batch members: lock every\n * entry's row in one statement, then run the conditional takeover for the\n * entries a DIFFERENT edge holds.\n *\n * The two statements exist because one cannot do the job: deciding inside the\n * upsert reads the pre-lock snapshot of the edges relation under READ\n * COMMITTED, so two concurrent writers would both see \"the incumbent is not\n * live yet\" and both commit. Statement 1 is therefore decision-free — it only\n * makes the row exist, takes its lock and reports the COMMITTED holder — and\n * statement 2 re-evaluates liveness after that lock is held.\n *\n * Duplicate conflict targets are refused rather than collapsed: a multi-row\n * upsert cannot affect one row twice, so two entries claiming one axis would\n * silently leave one of them unfenced. The application layer's pending\n * cardinality state refuses in-batch collisions first, which makes this a\n * defensive invariant rather than a semantic path.\n */\n async function claimEdgeCardinalityEntries(\n entries: readonly ClaimEdgeCardinalityParams[],\n ): Promise<readonly EdgeClaimOutcome[]> {\n if (entries.length === 0) return [];\n\n const targetKey = (entry: ClaimEdgeCardinalityParams): string => {\n const target = edgeCardinalityClaimTarget(entry);\n return `${target.axis}\\u0000${target.key}`;\n };\n const seen = new Set<string>();\n for (const entry of entries) {\n const key = targetKey(entry);\n if (seen.has(key)) {\n throw new DatabaseOperationError(\n \"Two edge claims in one batch name the same cardinality axis and key; \" +\n \"a multi-row upsert cannot affect one row twice.\",\n { operation: \"insert\", entity: \"edge\" },\n );\n }\n seen.add(key);\n }\n\n const outcomes = new Map<string, EdgeClaimOutcome>();\n // One claim row per inserted edge, so the edge-insert budget is the right\n // ceiling for the multi-row lock statement.\n for (const chunk of chunkArray(entries, batchConfig.edgeInsertBatchSize)) {\n const lockQuery = operationStrategy.buildLockEdgeClaims(chunk, nowIso());\n const rows = await execution.execAll<{\n axis: string;\n key: string;\n holder_edge_id: string;\n }>(lockQuery);\n const holderByTarget = new Map(\n rows.map((row) => [`${row.axis}\\u0000${row.key}`, row.holder_edge_id]),\n );\n for (const entry of chunk) {\n const key = targetKey(entry);\n const holder = holderByTarget.get(key);\n if (holder === undefined || holder === entry.edgeId) {\n outcomes.set(key, { status: \"claimed\" });\n continue;\n }\n const takeOver = await execution.execAll<{ holder_edge_id: string }>(\n operationStrategy.buildTakeOverEdgeClaim(entry, nowIso()),\n );\n outcomes.set(\n key,\n takeOver.length > 0 ?\n { status: \"claimed\" }\n : { status: \"refused\", holderEdgeId: holder },\n );\n }\n }\n return entries.map(\n (entry) => outcomes.get(targetKey(entry)) ?? { status: \"claimed\" },\n );\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 tableExists,\n\n async executeSchemaDdl(ddl: string): Promise<void> {\n await execution.execRun(asCompiledStatementSql(sql.raw(ddl)));\n },\n\n async executeStatement(query: CompiledStatementSql): Promise<void> {\n await execution.execRun(query);\n },\n\n async executeTemporaryStatement(\n query: CompiledTemporaryStatementSql,\n ): 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 withDuplicateKeyClassification(\n () => execution.execGet<Record<string, unknown>>(query),\n {\n entity: \"node\",\n relation: operationStrategy.primaryKeyConstraints.nodes,\n attempted: attemptedInserts([params]),\n },\n );\n if (!row)\n throw new DatabaseOperationError(\n \"Insert node failed: no row returned\",\n {\n operation: \"insert\",\n entity: \"node\",\n reason: \"no_row_returned\",\n },\n );\n return rowMappers.toNodeRow(row);\n },\n\n async insertNodeNoReturn(params: InsertNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertNodeNoReturn(\n params,\n timestamp,\n );\n await withDuplicateKeyClassification(() => execution.execRun(query), {\n entity: \"node\",\n relation: operationStrategy.primaryKeyConstraints.nodes,\n attempted: attemptedInserts([params]),\n });\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 withDuplicateKeyClassification(() => execution.execRun(query), {\n entity: \"node\",\n relation: operationStrategy.primaryKeyConstraints.nodes,\n attempted: attemptedInserts(chunk),\n });\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 = operationStrategy.buildInsertNodesBatchReturning(\n chunk,\n timestamp,\n );\n const rows = await withDuplicateKeyClassification(\n () => execution.execAll<Record<string, unknown>>(query),\n {\n entity: \"node\",\n relation: operationStrategy.primaryKeyConstraints.nodes,\n attempted: attemptedInserts(chunk),\n },\n );\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)\n throw new DatabaseOperationError(\n \"Update node failed: no row returned\",\n {\n operation: \"update\",\n entity: \"node\",\n reason: \"no_row_returned\",\n },\n );\n return rowMappers.toNodeRow(row);\n },\n\n async updateNodeSet(\n params: UpdateNodeSetParams,\n ): Promise<UpdateNodeSetResult> {\n if (\n Object.keys(params.patch).length === 0 &&\n (params.unsetProperties?.length ?? 0) === 0\n ) {\n throw new ConfigurationError(\n \"Set-based node update requires at least one property\",\n { operation: \"updateNodeSet\", kind: params.kind },\n );\n }\n if (params.candidateIdColumn.length === 0) {\n throw new ConfigurationError(\n \"Set-based node update requires a candidate id column\",\n { operation: \"updateNodeSet\", kind: params.kind },\n );\n }\n const timestamp = nowIso();\n const query = operationStrategy.buildUpdateNodeSet(params, timestamp);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n const updatedRows = rows.map((row) => rowMappers.toNodeRow(row));\n return { affectedCount: updatedRows.length, rows: updatedRows };\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.kind,\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 withDuplicateKeyClassification(\n () => execution.execGet<Record<string, unknown>>(query),\n {\n entity: \"edge\",\n relation: operationStrategy.primaryKeyConstraints.edges,\n attempted: attemptedInserts([params]),\n },\n );\n if (!row)\n throw new DatabaseOperationError(\n \"Insert edge failed: no row returned\",\n {\n operation: \"insert\",\n entity: \"edge\",\n reason: \"no_row_returned\",\n },\n );\n return rowMappers.toEdgeRow(row);\n },\n\n async insertEdgeNoReturn(params: InsertEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertEdgeNoReturn(\n params,\n timestamp,\n );\n await withDuplicateKeyClassification(() => execution.execRun(query), {\n entity: \"edge\",\n relation: operationStrategy.primaryKeyConstraints.edges,\n attempted: attemptedInserts([params]),\n });\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 withDuplicateKeyClassification(() => execution.execRun(query), {\n entity: \"edge\",\n relation: operationStrategy.primaryKeyConstraints.edges,\n attempted: attemptedInserts(chunk),\n });\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 = operationStrategy.buildInsertEdgesBatchReturning(\n chunk,\n timestamp,\n );\n const rows = await withDuplicateKeyClassification(\n () => execution.execAll<Record<string, unknown>>(query),\n {\n entity: \"edge\",\n relation: operationStrategy.primaryKeyConstraints.edges,\n attempted: attemptedInserts(chunk),\n },\n );\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)\n throw new DatabaseOperationError(\n \"Update edge failed: no row returned\",\n {\n operation: \"update\",\n entity: \"edge\",\n reason: \"no_row_returned\",\n },\n );\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(\n 1,\n batchConfig.getEdgesChunkSize - 1,\n );\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(\n params.ids,\n batchConfig.getEdgesChunkSize,\n )) {\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 findEdgesByEndpointSet(\n params: FindEdgesByEndpointSetParams,\n ): Promise<readonly EdgeRow[]> {\n const ids = resolveEdgeEndpointIds(params);\n // Each endpoint id lands in exactly one chunk (the set is deduped), so\n // every endpoint's rows come back from a single statement in that\n // statement's order — the per-endpoint ordering and `limitPerEndpoint`\n // cap therefore hold across the whole read even though the concatenated\n // result is only globally ordered when one chunk covers the set.\n const edgeRows: EdgeRow[] = [];\n for (const idChunk of chunkArray(\n ids,\n batchConfig.findEdgesEndpointChunkSize,\n )) {\n const query = operationStrategy.buildFindEdgesByEndpointSet(\n params,\n idChunk,\n );\n const rows = await execution.execAll<Record<string, unknown>>(query);\n for (const row of rows) edgeRows.push(rowMappers.toEdgeRow(row));\n }\n return edgeRows;\n },\n\n async findEdgesByHeterogeneousEndpointSet(\n params: FindEdgesByHeterogeneousEndpointSetParams,\n ): Promise<readonly EdgeRow[]> {\n const { edgeKinds, endpoints, endpointChunkSize } =\n resolveHeterogeneousEdgeRead(params, maxBindParameters);\n if (edgeKinds.length === 0 || endpoints.length === 0) return [];\n\n const edgeRows: EdgeRow[] = [];\n for (const endpointChunk of chunkArray(endpoints, endpointChunkSize)) {\n const query =\n operationStrategy.buildFindEdgesByHeterogeneousEndpointSet(\n params,\n endpointChunk,\n edgeKinds,\n );\n const rows = await execution.execAll<Record<string, unknown>>(query);\n for (const row of rows) edgeRows.push(rowMappers.toEdgeRow(row));\n }\n return edgeRows;\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<{\n node_id: string;\n concrete_kind: string;\n }>(query);\n\n if (\n result &&\n !isSameClaimOwner(\n { concreteKind: result.concrete_kind, nodeId: result.node_id },\n claimOwnerOf(params),\n )\n ) {\n throw new UniquenessError({\n constraintName: params.constraintName,\n // The holder's own kind, never `nodeKind`: that column carries the\n // claim AXIS, which a shared scope folds across kinds, so it need not\n // be the holder's kind and usually is not.\n kind: result.concrete_kind,\n existingId: result.node_id,\n newId: params.nodeId,\n fields: [],\n // The axis THIS statement attempted — `mapClaimRefusal`'s only way to\n // tell two disjoint pairs (or two scoped constraints) sharing a key\n // apart, since `constraintName` alone does not.\n axis: params.nodeKind,\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 OWNERS up front. Comparing ids alone would dedupe a\n // namesake under another kind into the first entry's claim and accept\n // both — the in-statement twin of the conflict the row-level arms refuse.\n // Batch validation pre-rejects real conflicts, so this is a defensive\n // 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 (!isSameClaimOwner(claimOwnerOf(existing), claimOwnerOf(entry))) {\n throw new UniquenessError({\n constraintName: entry.constraintName,\n kind: existing.concreteKind,\n existingId: existing.nodeId,\n newId: entry.nodeId,\n fields: [],\n axis: entry.nodeKind,\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 concrete_kind: string;\n }>(query);\n const ownerByTarget = new Map<string, ClaimOwner>(\n rows.map((row) => [\n `${row.node_kind}\\u0000${row.constraint_name}\\u0000${row.key}`,\n { concreteKind: row.concrete_kind, nodeId: row.node_id },\n ]),\n );\n for (const entry of chunk) {\n const owner = ownerByTarget.get(targetKey(entry));\n if (\n owner !== undefined &&\n !isSameClaimOwner(owner, claimOwnerOf(entry))\n ) {\n throw new UniquenessError({\n constraintName: entry.constraintName,\n kind: owner.concreteKind,\n existingId: owner.nodeId,\n newId: entry.nodeId,\n fields: [],\n axis: entry.nodeKind,\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 hardDeleteUniquesByNodeIds(\n params: HardDeleteUniquesByNodeIdsParams,\n ): Promise<void> {\n const nodeIds = [...new Set(params.nodeIds)];\n for (const chunk of chunkArray(\n nodeIds,\n batchConfig.uniqueDeleteChunkSize,\n )) {\n const query = operationStrategy.buildHardDeleteUniquesByNodeIds({\n ...params,\n nodeIds: chunk,\n });\n await execution.execRun(query);\n }\n },\n\n async hardDeleteUniquesByConcreteKind(\n params: HardDeleteUniquesByConcreteKindParams,\n ): Promise<void> {\n const query =\n operationStrategy.buildHardDeleteUniquesByConcreteKind(params);\n await execution.execRun(query);\n },\n\n async claimEdgeCardinality(\n params: ClaimEdgeCardinalityParams,\n ): Promise<EdgeClaimOutcome> {\n const [outcome] = await claimEdgeCardinalityEntries([params]);\n return outcome ?? { status: \"claimed\" };\n },\n\n claimEdgeCardinalityBatch(\n entries: readonly ClaimEdgeCardinalityParams[],\n ): Promise<readonly EdgeClaimOutcome[]> {\n return claimEdgeCardinalityEntries(entries);\n },\n\n async purgeEdgeClaims(params: PurgeEdgeClaimsParams): Promise<void> {\n const edgeIds = [...new Set(params.edgeIds)];\n // One claim row per edge at most, so the edge-read chunk budget is the\n // right ceiling for a list of edge ids.\n for (const chunk of chunkArray(edgeIds, batchConfig.getEdgesChunkSize)) {\n const query = operationStrategy.buildPurgeEdgeClaims({\n ...params,\n edgeIds: chunk,\n });\n await execution.execRun(query);\n }\n },\n\n async readConstraintFenceViolations(\n params: ReadConstraintFenceViolationsParams,\n ): Promise<ConstraintFenceViolationRows> {\n const uniqueRows =\n params.uniqueConstraintNames.length === 0 ?\n []\n : await execution.execAll<{\n node_kind: string;\n constraint_name: string;\n key: string;\n concrete_kind: string;\n node_id: string;\n }>(\n operationStrategy.buildContendedUniqueRowAudit(\n params.graphId,\n params.uniqueConstraintNames,\n ),\n );\n const contendedUniqueRows = uniqueRows.map((row) => ({\n nodeKind: row.node_kind,\n constraintName: row.constraint_name,\n key: row.key,\n concreteKind: row.concrete_kind,\n nodeId: row.node_id,\n }));\n\n // One statement per declared cardinality, because that is the\n // granularity at which the population's key and liveness differ.\n const edgeKindsByCardinality = new Map<\n ConstrainedCardinality,\n string[]\n >();\n for (const declaration of params.edgeCardinalities) {\n const kinds = edgeKindsByCardinality.get(declaration.cardinality) ?? [];\n kinds.push(declaration.edgeKind);\n edgeKindsByCardinality.set(declaration.cardinality, kinds);\n }\n const contendedEdgeRows: ContendedEdgeRow[] = [];\n for (const [cardinality, edgeKinds] of edgeKindsByCardinality) {\n const rows = await execution.execAll<{\n edge_id: string;\n edge_kind: string;\n from_kind: string;\n from_id: string;\n to_kind: string;\n to_id: string;\n }>(\n operationStrategy.buildContendedEdgeRowAudit(\n params.graphId,\n cardinality,\n edgeKinds,\n ),\n );\n for (const row of rows) {\n contendedEdgeRows.push({\n edgeKind: row.edge_kind,\n cardinality,\n edgeId: row.edge_id,\n fromKind: row.from_kind,\n fromId: row.from_id,\n toKind: row.to_kind,\n toId: row.to_id,\n });\n }\n }\n\n const disjointOverlaps: DisjointOverlapRow[] = [];\n for (const kinds of params.disjointKindPairs) {\n const rows = await execution.execAll<{ node_id: string }>(\n operationStrategy.buildDisjointOverlapAudit(params.graphId, kinds),\n );\n for (const row of rows)\n disjointOverlaps.push({ kinds, nodeId: row.node_id });\n }\n\n return { contendedUniqueRows, contendedEdgeRows, disjointOverlaps };\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(\n params.keys,\n batchConfig.checkUniqueBatchChunkSize,\n )) {\n const query = operationStrategy.buildCheckUniqueBatch({\n ...params,\n keys: chunk,\n });\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(params.graphId, params.version),\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 //\n // `tests/backends/postgres/schema-write-fence-race.test.ts` reproduces\n // this ordering by hand to hold a flip uncommitted; changing it there\n // too keeps the Postgres write fence's race coverage honest.\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(params.graphId, params.version),\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 reason: \"version-not-found\",\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","import { TrustedImportError } from \"../../errors\";\nimport { sql } from \"../../query/sql-fragment\";\nimport { asCompiledStatementSql } from \"../../query/sql-intent\";\nimport { resolveStampedValidityLowerBound } from \"../../utils/date\";\nimport type {\n InsertEdgeParams,\n InsertNodeParams,\n TransactionBackend,\n TrustedImportSession,\n} from \"../types\";\nimport type { SqliteExecutionAdapter } from \"./execution/sqlite-execution\";\n\ntype TrustedImportTableNames = Readonly<{\n nodes: string;\n edges: string;\n}>;\n\ntype SqliteIndexDefinition = Readonly<{\n index_name: string;\n index_definition: string;\n}>;\n\ntype PostgresIndexDefinition = Readonly<{\n index_name: string;\n index_definition: string;\n}>;\n\n// Raw driver parameters need an explicit SQL NULL. `undefined` is rejected by\n// postgres.js and therefore cannot represent the same cross-driver value.\n// eslint-disable-next-line unicorn/no-null\nconst DATABASE_NULL = null;\n\nfunction quoteSqlIdentifier(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction requireRawExecution(\n backend: TransactionBackend,\n): NonNullable<TransactionBackend[\"executeRaw\"]> {\n if (backend.executeRaw === undefined) {\n throw new TrustedImportError(\n \"This backend cannot execute the raw statements required by trusted import.\",\n \"backend_unsupported\",\n );\n }\n return backend.executeRaw;\n}\n\nfunction requireStatementExecution(\n backend: TransactionBackend,\n): NonNullable<TransactionBackend[\"executeStatement\"]> {\n if (backend.executeStatement === undefined) {\n throw new TrustedImportError(\n \"This backend cannot execute the index lifecycle required by trusted import.\",\n \"backend_unsupported\",\n );\n }\n return backend.executeStatement;\n}\n\nfunction rowIndicatesExistingData(row: unknown): boolean {\n if (typeof row !== \"object\" || row === null) return false;\n const value = (row as Readonly<Record<string, unknown>>)[\"has_rows\"];\n return value === true || value === 1 || value === \"1\";\n}\n\nexport async function assertTrustedImportDatabaseEmpty(\n backend: TransactionBackend,\n tableNames: TrustedImportTableNames,\n): Promise<void> {\n const executeRaw = requireRawExecution(backend);\n const rows = await executeRaw<Record<string, unknown>>(\n `SELECT (\n EXISTS (SELECT 1 FROM ${quoteSqlIdentifier(tableNames.nodes)} LIMIT 1)\n OR EXISTS (SELECT 1 FROM ${quoteSqlIdentifier(tableNames.edges)} LIMIT 1)\n ) AS has_rows`,\n [],\n );\n if (!rowIndicatesExistingData(rows[0])) return;\n\n throw new TrustedImportError(\n \"Trusted import requires globally empty TypeGraph node and edge tables.\",\n \"database_not_empty\",\n { tables: [tableNames.nodes, tableNames.edges] },\n {\n suggestion:\n \"Run trusted import only against a fresh, dedicated database. Use importGraph or the collection bulk APIs to add data to an existing database.\",\n },\n );\n}\n\nexport async function lockPostgresTrustedImportTables(\n backend: TransactionBackend,\n tableNames: TrustedImportTableNames,\n): Promise<void> {\n const executeStatement = requireStatementExecution(backend);\n await executeStatement(\n asCompiledStatementSql(\n sql.raw(\n `LOCK TABLE ${quoteSqlIdentifier(tableNames.nodes)}, ${quoteSqlIdentifier(tableNames.edges)} IN ACCESS EXCLUSIVE MODE`,\n ),\n ),\n );\n}\n\nexport async function suspendSqliteSecondaryIndexes(\n backend: TransactionBackend,\n tableNames: TrustedImportTableNames,\n): Promise<readonly SqliteIndexDefinition[]> {\n const executeRaw = requireRawExecution(backend);\n const executeStatement = requireStatementExecution(backend);\n const definitions = await executeRaw<SqliteIndexDefinition>(\n `SELECT name AS index_name, sql AS index_definition\n FROM sqlite_schema\n WHERE type = 'index'\n AND tbl_name IN (?, ?)\n AND sql IS NOT NULL\n ORDER BY name`,\n [tableNames.nodes, tableNames.edges],\n );\n for (const definition of definitions) {\n await executeStatement(\n asCompiledStatementSql(\n sql.raw(`DROP INDEX ${quoteSqlIdentifier(definition.index_name)}`),\n ),\n );\n }\n return definitions;\n}\n\nexport async function suspendPostgresSecondaryIndexes(\n backend: TransactionBackend,\n tableNames: TrustedImportTableNames,\n): Promise<readonly PostgresIndexDefinition[]> {\n const executeRaw = requireRawExecution(backend);\n const executeStatement = requireStatementExecution(backend);\n const definitions = await executeRaw<PostgresIndexDefinition>(\n `SELECT index_class.relname AS index_name,\n pg_get_indexdef(index_class.oid) AS index_definition\n FROM pg_class AS table_class\n JOIN pg_namespace AS namespace\n ON namespace.oid = table_class.relnamespace\n JOIN pg_index AS index_metadata\n ON index_metadata.indrelid = table_class.oid\n JOIN pg_class AS index_class\n ON index_class.oid = index_metadata.indexrelid\n LEFT JOIN pg_constraint AS table_constraint\n ON table_constraint.conindid = index_class.oid\n WHERE namespace.nspname = current_schema()\n AND table_class.relname IN ($1, $2)\n AND table_constraint.oid IS NULL\n AND NOT index_metadata.indisprimary\n ORDER BY index_class.relname`,\n [tableNames.nodes, tableNames.edges],\n );\n for (const definition of definitions) {\n await executeStatement(\n asCompiledStatementSql(\n sql.raw(`DROP INDEX ${quoteSqlIdentifier(definition.index_name)}`),\n ),\n );\n }\n return definitions;\n}\n\nexport async function restoreSecondaryIndexes(\n backend: TransactionBackend,\n definitions: readonly Readonly<{ index_definition: string }>[],\n): Promise<void> {\n const executeStatement = requireStatementExecution(backend);\n for (const definition of definitions) {\n await executeStatement(\n asCompiledStatementSql(sql.raw(definition.index_definition)),\n );\n }\n}\n\nexport async function analyzeImportedTables(\n backend: TransactionBackend,\n tableNames: TrustedImportTableNames,\n): Promise<void> {\n const executeStatement = requireStatementExecution(backend);\n await executeStatement(\n asCompiledStatementSql(\n sql.raw(`ANALYZE ${quoteSqlIdentifier(tableNames.nodes)}`),\n ),\n );\n await executeStatement(\n asCompiledStatementSql(\n sql.raw(`ANALYZE ${quoteSqlIdentifier(tableNames.edges)}`),\n ),\n );\n}\n\n/**\n * Encodes one-dimensional Postgres arrays as text accepted by an explicit\n * `::text[]` / `::timestamptz[]` cast. postgres.js's raw `unsafe` parameters\n * do not infer a serializer for JavaScript arrays, while node-postgres does;\n * using the wire-neutral literal keeps both drivers on the same path.\n */\nfunction postgresArray(values: readonly (string | null)[]): string {\n return `{${values\n .map((value) =>\n value === DATABASE_NULL ? \"NULL\" : (\n `\"${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', String.raw`\\\"`)}\"`\n ),\n )\n .join(\",\")}}`;\n}\n\n/**\n * Both sessions below decide their stored lower bound through\n * {@link resolveStampedValidityLowerBound}, the same owner the Drizzle insert\n * builders use, mapping \"no bound\" to an explicit SQL NULL. Trusted import\n * bypasses those builders for throughput, so a private copy of the decision here\n * would keep minting rows readable at no coordinate long after the builders\n * stopped — which is exactly what it did before issue #407 was closed. Its\n * canonicality precondition is established per chunk by the stream's own format\n * check (`src/interchange/trusted-import.ts`), which is what makes the\n * lexicographic comparison inside the owner a chronological one here too.\n */\nexport function createSqliteTrustedImportSession(\n executionAdapter: SqliteExecutionAdapter,\n tableNames: TrustedImportTableNames,\n): TrustedImportSession {\n const executePreparedRunBatch = executionAdapter.executePreparedRunBatch;\n if (executePreparedRunBatch === undefined) {\n throw new TrustedImportError(\n \"Trusted import requires a synchronous SQLite driver with prepared statement support.\",\n \"backend_unsupported\",\n );\n }\n\n const nodeSql = `INSERT INTO ${quoteSqlIdentifier(tableNames.nodes)}\n (graph_id, kind, id, props, version, valid_from, valid_to, created_at, updated_at)\n VALUES (?, ?, ?, ?, 1, ?, ?, ?, ?)`;\n const edgeSql = `INSERT INTO ${quoteSqlIdentifier(tableNames.edges)}\n (graph_id, id, kind, from_kind, from_id, to_kind, to_id, props, valid_from, valid_to, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;\n\n return {\n async insertNodes(params: readonly InsertNodeParams[]): Promise<void> {\n if (params.length === 0) return;\n const timestamp = new Date().toISOString();\n await executePreparedRunBatch(\n nodeSql,\n params.map((item) => [\n item.graphId,\n item.kind,\n item.id,\n JSON.stringify(item.props),\n resolveStampedValidityLowerBound(item.validFrom, item.validTo, timestamp) ??\n DATABASE_NULL,\n item.validTo ?? DATABASE_NULL,\n timestamp,\n timestamp,\n ]),\n );\n },\n async insertEdges(params: readonly InsertEdgeParams[]): Promise<void> {\n if (params.length === 0) return;\n const timestamp = new Date().toISOString();\n await executePreparedRunBatch(\n edgeSql,\n params.map((item) => [\n item.graphId,\n item.id,\n item.kind,\n item.fromKind,\n item.fromId,\n item.toKind,\n item.toId,\n JSON.stringify(item.props),\n resolveStampedValidityLowerBound(item.validFrom, item.validTo, timestamp) ??\n DATABASE_NULL,\n item.validTo ?? DATABASE_NULL,\n timestamp,\n timestamp,\n ]),\n );\n },\n };\n}\n\nexport function createPostgresTrustedImportSession(\n backend: TransactionBackend,\n tableNames: TrustedImportTableNames,\n): TrustedImportSession {\n const executeRaw = requireRawExecution(backend);\n const nodeSql = `INSERT INTO ${quoteSqlIdentifier(tableNames.nodes)}\n (graph_id, kind, id, props, version, valid_from, valid_to, created_at, updated_at)\n SELECT graph_id, kind, id, props::jsonb, 1, valid_from, valid_to, created_at, created_at\n FROM UNNEST(\n $1::text[], $2::text[], $3::text[], $4::text[],\n $5::timestamptz[], $6::timestamptz[], $7::timestamptz[]\n ) AS imported(graph_id, kind, id, props, valid_from, valid_to, created_at)`;\n const edgeSql = `INSERT INTO ${quoteSqlIdentifier(tableNames.edges)}\n (graph_id, id, kind, from_kind, from_id, to_kind, to_id, props, valid_from, valid_to, created_at, updated_at)\n SELECT graph_id, id, kind, from_kind, from_id, to_kind, to_id, props::jsonb,\n valid_from, valid_to, created_at, created_at\n FROM UNNEST(\n $1::text[], $2::text[], $3::text[], $4::text[], $5::text[],\n $6::text[], $7::text[], $8::text[], $9::timestamptz[],\n $10::timestamptz[], $11::timestamptz[]\n ) AS imported(\n graph_id, id, kind, from_kind, from_id, to_kind, to_id, props,\n valid_from, valid_to, created_at\n )`;\n\n return {\n async insertNodes(params: readonly InsertNodeParams[]): Promise<void> {\n if (params.length === 0) return;\n const timestamp = new Date().toISOString();\n await executeRaw(nodeSql, [\n postgresArray(params.map((item) => item.graphId)),\n postgresArray(params.map((item) => item.kind)),\n postgresArray(params.map((item) => item.id)),\n postgresArray(params.map((item) => JSON.stringify(item.props))),\n postgresArray(\n params.map(\n (item) =>\n resolveStampedValidityLowerBound(item.validFrom, item.validTo, timestamp) ??\n DATABASE_NULL,\n ),\n ),\n postgresArray(params.map((item) => item.validTo ?? DATABASE_NULL)),\n postgresArray(params.map(() => timestamp)),\n ]);\n },\n async insertEdges(params: readonly InsertEdgeParams[]): Promise<void> {\n if (params.length === 0) return;\n const timestamp = new Date().toISOString();\n await executeRaw(edgeSql, [\n postgresArray(params.map((item) => item.graphId)),\n postgresArray(params.map((item) => item.id)),\n postgresArray(params.map((item) => item.kind)),\n postgresArray(params.map((item) => item.fromKind)),\n postgresArray(params.map((item) => item.fromId)),\n postgresArray(params.map((item) => item.toKind)),\n postgresArray(params.map((item) => item.toId)),\n postgresArray(params.map((item) => JSON.stringify(item.props))),\n postgresArray(\n params.map(\n (item) =>\n resolveStampedValidityLowerBound(item.validFrom, item.validTo, timestamp) ??\n DATABASE_NULL,\n ),\n ),\n postgresArray(params.map((item) => item.validTo ?? DATABASE_NULL)),\n postgresArray(params.map(() => timestamp)),\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"]}
|