@nicia-ai/typegraph 0.49.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/drizzle/indexes.cjs +9 -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 +5 -5
- package/dist/backend/index.cjs +56 -52
- package/dist/backend/index.d.cts +3 -3
- package/dist/backend/index.d.ts +3 -3
- package/dist/backend/index.js +11 -11
- package/dist/backend/postgres/index.cjs +34 -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 +17 -15
- package/dist/backend/postgres/pglite-store.cjs +36 -35
- 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 +32 -31
- package/dist/backend/postgres/pglite-store.js.map +1 -1
- package/dist/backend/postgres/pglite.cjs +19 -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 +18 -16
- package/dist/backend/sqlite/index.cjs +31 -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 +15 -13
- package/dist/backend/sqlite/libsql.cjs +22 -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 +17 -15
- package/dist/backend/sqlite/libsql.js.map +1 -1
- package/dist/backend/sqlite/local-store.cjs +37 -36
- 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 +33 -32
- package/dist/backend/sqlite/local-store.js.map +1 -1
- package/dist/backend/sqlite/local.cjs +20 -18
- package/dist/backend/sqlite/local.d.cts +3 -3
- package/dist/backend/sqlite/local.d.ts +3 -3
- package/dist/backend/sqlite/local.js +18 -16
- package/dist/{chunk-LTXQOEIC.js → chunk-2CYI5HRH.js} +248 -203
- package/dist/chunk-2CYI5HRH.js.map +1 -0
- package/dist/{chunk-KF6K7TGH.js → chunk-2GIV5X4P.js} +702 -422
- package/dist/chunk-2GIV5X4P.js.map +1 -0
- package/dist/{chunk-2TYSSBU5.js → chunk-2Q45FAIE.js} +15 -15
- package/dist/{chunk-2TYSSBU5.js.map → chunk-2Q45FAIE.js.map} +1 -1
- package/dist/{chunk-WODMN3Q2.cjs → chunk-45YZXI6X.cjs} +27 -27
- package/dist/{chunk-WODMN3Q2.cjs.map → chunk-45YZXI6X.cjs.map} +1 -1
- package/dist/{chunk-3DMMGT6S.js → chunk-46UGOVRW.js} +3 -3
- package/dist/{chunk-3DMMGT6S.js.map → chunk-46UGOVRW.js.map} +1 -1
- package/dist/{chunk-GLHXM7C4.js → chunk-5LKOVCPP.js} +60 -23
- package/dist/chunk-5LKOVCPP.js.map +1 -0
- package/dist/{chunk-JFRT7S3B.cjs → chunk-5OWHU7Z7.cjs} +261 -459
- package/dist/chunk-5OWHU7Z7.cjs.map +1 -0
- package/dist/{chunk-7SQSZN2J.js → chunk-5PP4KRPV.js} +5 -5
- package/dist/{chunk-7SQSZN2J.js.map → chunk-5PP4KRPV.js.map} +1 -1
- package/dist/chunk-6KQEICJ6.cjs +12 -0
- package/dist/{chunk-MKJ4KXL5.cjs.map → chunk-6KQEICJ6.cjs.map} +1 -1
- package/dist/{chunk-6SWPJEYN.js → chunk-6LEOAIIB.js} +40 -6
- package/dist/chunk-6LEOAIIB.js.map +1 -0
- 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-OVI7IXYX.js → chunk-6S3PTHL4.js} +3 -3
- package/dist/{chunk-OVI7IXYX.js.map → chunk-6S3PTHL4.js.map} +1 -1
- package/dist/{chunk-3FPR224C.cjs → chunk-7CCMCMJO.cjs} +102 -102
- package/dist/{chunk-3FPR224C.cjs.map → chunk-7CCMCMJO.cjs.map} +1 -1
- package/dist/{chunk-SHFBB23Q.js → chunk-7OWE7WD6.js} +6 -4
- package/dist/chunk-7OWE7WD6.js.map +1 -0
- package/dist/chunk-7PRMDZIA.cjs +182 -0
- package/dist/chunk-7PRMDZIA.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-OORXGFL5.cjs → chunk-BYBDM423.cjs} +48 -48
- package/dist/{chunk-OORXGFL5.cjs.map → chunk-BYBDM423.cjs.map} +1 -1
- package/dist/{chunk-JB6T4GLL.cjs → chunk-C76WFIVZ.cjs} +808 -519
- package/dist/chunk-C76WFIVZ.cjs.map +1 -0
- package/dist/{chunk-3G5W2U2L.cjs → chunk-CS6JTQQ2.cjs} +302 -257
- package/dist/chunk-CS6JTQQ2.cjs.map +1 -0
- package/dist/{chunk-AOSSQDVO.cjs → chunk-CSNOYIB4.cjs} +13 -13
- package/dist/{chunk-AOSSQDVO.cjs.map → chunk-CSNOYIB4.cjs.map} +1 -1
- package/dist/{chunk-HEV35TGT.js → chunk-DI6VC62F.js} +13 -4
- package/dist/chunk-DI6VC62F.js.map +1 -0
- 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-ZDKTPBGV.js → chunk-EDLKIQRI.js} +4 -4
- package/dist/{chunk-ZDKTPBGV.js.map → chunk-EDLKIQRI.js.map} +1 -1
- package/dist/chunk-EH3JZJUM.cjs +567 -0
- package/dist/chunk-EH3JZJUM.cjs.map +1 -0
- package/dist/{chunk-S5TERQVW.js → chunk-FX5ZW6PN.js} +196 -33
- package/dist/chunk-FX5ZW6PN.js.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-BFUOME67.cjs → chunk-G2TLHH6T.cjs} +20 -11
- package/dist/chunk-G2TLHH6T.cjs.map +1 -0
- package/dist/{chunk-5PRKMB24.cjs → chunk-GHZPZNFC.cjs} +12 -4
- package/dist/chunk-GHZPZNFC.cjs.map +1 -0
- package/dist/{chunk-ZFMCDJGB.js → chunk-GVYVGGPJ.js} +11 -199
- package/dist/chunk-GVYVGGPJ.js.map +1 -0
- package/dist/{chunk-SDBBMD4N.js → chunk-H3XP6BAV.js} +3 -3
- package/dist/{chunk-SDBBMD4N.js.map → chunk-H3XP6BAV.js.map} +1 -1
- package/dist/{chunk-ROR5ZR6A.cjs → chunk-HSEZ7X6Y.cjs} +45 -45
- package/dist/{chunk-ROR5ZR6A.cjs.map → chunk-HSEZ7X6Y.cjs.map} +1 -1
- package/dist/{chunk-LRQKXRXO.cjs → chunk-HY5BNOUN.cjs} +4 -4
- package/dist/{chunk-LRQKXRXO.cjs.map → chunk-HY5BNOUN.cjs.map} +1 -1
- package/dist/chunk-HZUB5CON.js +27 -0
- package/dist/chunk-HZUB5CON.js.map +1 -0
- package/dist/{chunk-MYKHJI2J.js → chunk-I5C6OTKR.js} +3 -3
- package/dist/{chunk-MYKHJI2J.js.map → chunk-I5C6OTKR.js.map} +1 -1
- package/dist/{chunk-3U5ABFDW.cjs → chunk-IHK5KA2Q.cjs} +31 -28
- package/dist/chunk-IHK5KA2Q.cjs.map +1 -0
- package/dist/{chunk-26YKDNUD.cjs → chunk-IPRP6TDL.cjs} +12 -10
- package/dist/chunk-IPRP6TDL.cjs.map +1 -0
- package/dist/{chunk-UGHG7PGX.js → chunk-IRPYOHRC.js} +26 -4
- package/dist/chunk-IRPYOHRC.js.map +1 -0
- package/dist/{chunk-7UOLHNWC.cjs → chunk-ISKCIQF2.cjs} +20 -20
- package/dist/{chunk-7UOLHNWC.cjs.map → chunk-ISKCIQF2.cjs.map} +1 -1
- package/dist/{chunk-7LZJNLA5.js → chunk-JG5XIJDY.js} +57 -31
- package/dist/chunk-JG5XIJDY.js.map +1 -0
- package/dist/{chunk-YYUHLYM2.cjs → chunk-K2XYLVVB.cjs} +134 -133
- package/dist/chunk-K2XYLVVB.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-TZEGUG6D.cjs → chunk-K6VKTBST.cjs} +4 -4
- package/dist/{chunk-TZEGUG6D.cjs.map → chunk-K6VKTBST.cjs.map} +1 -1
- package/dist/chunk-KWNWG4RC.cjs +12 -0
- package/dist/{chunk-CICO5GXD.cjs.map → chunk-KWNWG4RC.cjs.map} +1 -1
- package/dist/{chunk-FQPEMEWX.cjs → chunk-LLVOQOWE.cjs} +80 -32
- package/dist/chunk-LLVOQOWE.cjs.map +1 -0
- package/dist/{chunk-TQHGE7UC.cjs → chunk-M5MSP3BI.cjs} +18 -10
- package/dist/chunk-M5MSP3BI.cjs.map +1 -0
- package/dist/{chunk-Z2JCLZFJ.js → chunk-MJPZNEJZ.js} +273 -291
- package/dist/chunk-MJPZNEJZ.js.map +1 -0
- package/dist/{chunk-TUNPBZY3.cjs → chunk-MM3JHVKZ.cjs} +4 -4
- package/dist/{chunk-TUNPBZY3.cjs.map → chunk-MM3JHVKZ.cjs.map} +1 -1
- package/dist/{chunk-BRRP76WO.js → chunk-MX7EKQPM.js} +457 -299
- package/dist/chunk-MX7EKQPM.js.map +1 -0
- package/dist/{chunk-D4QLTJSM.js → chunk-MZ34E2GN.js} +13 -12
- package/dist/chunk-MZ34E2GN.js.map +1 -0
- package/dist/{chunk-EDN4Y4ZG.cjs → chunk-OJHD3LXJ.cjs} +9 -9
- package/dist/{chunk-EDN4Y4ZG.cjs.map → chunk-OJHD3LXJ.cjs.map} +1 -1
- package/dist/{chunk-DO7SAMEK.cjs → chunk-ON47CBE4.cjs} +47 -47
- package/dist/{chunk-DO7SAMEK.cjs.map → chunk-ON47CBE4.cjs.map} +1 -1
- package/dist/{chunk-6LN7FIVU.js → chunk-PALYTHGM.js} +11 -4
- package/dist/chunk-PALYTHGM.js.map +1 -0
- package/dist/{chunk-YVF2EM7B.js → chunk-R7MRFE5P.js} +3 -3
- package/dist/{chunk-YVF2EM7B.js.map → chunk-R7MRFE5P.js.map} +1 -1
- package/dist/{chunk-EZEEWCFJ.cjs → chunk-RDP6ZRSM.cjs} +435 -265
- package/dist/chunk-RDP6ZRSM.cjs.map +1 -0
- package/dist/{chunk-GYEG3ZLZ.cjs → chunk-RJMHU2MG.cjs} +121 -18
- package/dist/chunk-RJMHU2MG.cjs.map +1 -0
- package/dist/chunk-RWUWTJQY.cjs +30 -0
- package/dist/chunk-RWUWTJQY.cjs.map +1 -0
- package/dist/{chunk-JPD2CTC3.js → chunk-S33YQEL7.js} +7 -7
- package/dist/{chunk-JPD2CTC3.js.map → chunk-S33YQEL7.js.map} +1 -1
- package/dist/chunk-S3SDEQMC.js +532 -0
- package/dist/chunk-S3SDEQMC.js.map +1 -0
- package/dist/{chunk-OI2GQ25X.cjs → chunk-SHC7BCG5.cjs} +7 -7
- package/dist/{chunk-OI2GQ25X.cjs.map → chunk-SHC7BCG5.cjs.map} +1 -1
- package/dist/{chunk-L3LQNR34.cjs → chunk-TEC24ZDA.cjs} +161 -161
- package/dist/{chunk-L3LQNR34.cjs.map → chunk-TEC24ZDA.cjs.map} +1 -1
- package/dist/{chunk-HDL2ARHX.cjs → chunk-TP4NJTI3.cjs} +63 -27
- package/dist/chunk-TP4NJTI3.cjs.map +1 -0
- package/dist/{chunk-UMGZDVOA.cjs → chunk-TTCOPKUL.cjs} +124 -124
- package/dist/{chunk-UMGZDVOA.cjs.map → chunk-TTCOPKUL.cjs.map} +1 -1
- package/dist/chunk-TUVD4DFR.cjs +1207 -0
- package/dist/chunk-TUVD4DFR.cjs.map +1 -0
- package/dist/{chunk-UGHQV7MP.cjs → chunk-TYGGUWMS.cjs} +178 -152
- package/dist/chunk-TYGGUWMS.cjs.map +1 -0
- package/dist/{chunk-WIC7DRXW.js → chunk-U3Z7XKAG.js} +7 -7
- package/dist/{chunk-WIC7DRXW.js.map → chunk-U3Z7XKAG.js.map} +1 -1
- package/dist/{chunk-NACVVDWB.js → chunk-U5EL6JUV.js} +10 -10
- package/dist/{chunk-NACVVDWB.js.map → chunk-U5EL6JUV.js.map} +1 -1
- package/dist/{chunk-OMZ37BM2.js → chunk-V76FGHY3.js} +5 -5
- package/dist/{chunk-OMZ37BM2.js.map → chunk-V76FGHY3.js.map} +1 -1
- 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-VTJVMP4I.js +1182 -0
- package/dist/chunk-VTJVMP4I.js.map +1 -0
- package/dist/{chunk-QTD6HX4O.js → chunk-W5SOCUBL.js} +5 -5
- package/dist/{chunk-QTD6HX4O.js.map → chunk-W5SOCUBL.js.map} +1 -1
- package/dist/{chunk-SR725PWF.cjs → chunk-WCLMKNQE.cjs} +1750 -1592
- package/dist/chunk-WCLMKNQE.cjs.map +1 -0
- package/dist/{chunk-2O4PCIZ6.cjs → chunk-WK23PGTP.cjs} +13 -13
- package/dist/{chunk-2O4PCIZ6.cjs.map → chunk-WK23PGTP.cjs.map} +1 -1
- package/dist/{chunk-KKBDXCLQ.js → chunk-WQBAQZHR.js} +4 -4
- package/dist/{chunk-KKBDXCLQ.js.map → chunk-WQBAQZHR.js.map} +1 -1
- package/dist/{chunk-MRDBBHIZ.cjs → chunk-X4GDXBOP.cjs} +2 -2
- package/dist/chunk-X4GDXBOP.cjs.map +1 -0
- package/dist/{chunk-3QNZ5SAJ.cjs → chunk-XMY2SXOH.cjs} +437 -455
- package/dist/chunk-XMY2SXOH.cjs.map +1 -0
- package/dist/{chunk-D5R42W5D.js → chunk-XZW2CTNO.js} +115 -12
- package/dist/chunk-XZW2CTNO.js.map +1 -0
- package/dist/{chunk-NVY5CJFP.js → chunk-Y55DLLEG.js} +9 -6
- package/dist/chunk-Y55DLLEG.js.map +1 -0
- package/dist/chunk-YA36ABIL.js +174 -0
- package/dist/chunk-YA36ABIL.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-JONXFAPO.js → chunk-ZAQUKCUC.js} +5 -5
- package/dist/{chunk-JONXFAPO.js.map → chunk-ZAQUKCUC.js.map} +1 -1
- package/dist/{chunk-SIT26LAZ.cjs → chunk-ZBFZGLZE.cjs} +29 -5
- package/dist/chunk-ZBFZGLZE.cjs.map +1 -0
- package/dist/{chunk-P6YLZTRE.js → chunk-ZRJTM7MT.js} +3 -3
- package/dist/{chunk-P6YLZTRE.js.map → chunk-ZRJTM7MT.js.map} +1 -1
- 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-B49O7dB_.d.ts} +3 -3
- package/dist/{ddl-BL1NZLMY.d.cts → ddl-DcZG660s.d.cts} +3 -3
- package/dist/graph-extension/index.cjs +21 -20
- package/dist/graph-extension/index.d.cts +4 -4
- package/dist/graph-extension/index.d.ts +4 -4
- package/dist/graph-extension/index.js +5 -4
- package/dist/graph-merge/index.cjs +305 -303
- package/dist/graph-merge/index.cjs.map +1 -1
- package/dist/graph-merge/index.d.cts +9 -9
- package/dist/graph-merge/index.d.ts +9 -9
- package/dist/graph-merge/index.js +29 -27
- package/dist/graph-merge/index.js.map +1 -1
- package/dist/{index-D7d1u2gr.d.ts → index-B0PrmE3K.d.cts} +16 -2
- package/dist/{index-COs_z6nV.d.cts → index-CwcXsL5R.d.ts} +16 -2
- package/dist/index.cjs +223 -222
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -12
- package/dist/index.d.ts +12 -12
- package/dist/index.js +37 -36
- package/dist/index.js.map +1 -1
- package/dist/indexes/index.cjs +13 -13
- package/dist/indexes/index.d.cts +4 -4
- package/dist/indexes/index.d.ts +4 -4
- package/dist/indexes/index.js +6 -6
- package/dist/{ingestion-import-target-dNeL7iAv.d.ts → ingestion-import-target-CI8OWIkM.d.ts} +1 -1
- package/dist/{ingestion-import-target-XPxZYw89.d.cts → ingestion-import-target-DCpfM1PX.d.cts} +1 -1
- package/dist/interchange/index.cjs +55 -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 +19 -18
- package/dist/interchange/index.js.map +1 -1
- package/dist/{manager-D9eRT_ns.d.ts → manager-Cfg1ENj1.d.ts} +30 -2
- package/dist/{manager-CYaff3n3.d.cts → manager-D348fa6W.d.cts} +30 -2
- package/dist/{materialize-indexes-DJ3ykH59.d.ts → materialize-indexes-C9GG3O3C.d.ts} +1 -1
- package/dist/{materialize-indexes-DTtAnvfY.d.cts → materialize-indexes-CrSiW_lT.d.cts} +1 -1
- package/dist/{postgres-CcL4bAHS.d.ts → postgres-CH1kkM5J.d.cts} +279 -2
- package/dist/{postgres-DMj39MEu.d.cts → postgres-UStOycLI.d.ts} +279 -2
- package/dist/profiler/index.d.cts +9 -9
- package/dist/profiler/index.d.ts +9 -9
- package/dist/provenance/index.cjs +46 -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 +12 -10
- package/dist/provenance/index.js.map +1 -1
- package/dist/{repair-validity-windows-DlUSqwCg.d.ts → repair-validity-windows-BtOEe2pS.d.ts} +2 -2
- package/dist/{repair-validity-windows-BFNZvd_H.d.cts → repair-validity-windows-aWX7VNvv.d.cts} +2 -2
- package/dist/schema/index.cjs +46 -46
- package/dist/schema/index.d.cts +6 -6
- package/dist/schema/index.d.ts +6 -6
- package/dist/schema/index.js +19 -19
- package/dist/{searchable-DHJMh_nj.d.cts → searchable-C8-RrL3l.d.cts} +1 -1
- package/dist/{searchable-bpE1bBfc.d.ts → searchable-z4BiFfHI.d.ts} +1 -1
- package/dist/{sqlite-YppHrNFb.d.cts → sqlite-Cyx9j9o6.d.cts} +309 -2
- package/dist/{sqlite-D7Oz0SQh.d.ts → sqlite-axLw5Lo5.d.ts} +309 -2
- package/dist/{store-bphCSo7z.d.cts → store-CTfQ9taw.d.ts} +102 -13
- package/dist/{store-DRrFCx5x.d.ts → store-DR9J7JVB.d.cts} +102 -13
- package/dist/{temporal-5GqpYCk2.d.cts → temporal-B4Ky4wzh.d.cts} +1 -1
- package/dist/{temporal-CbnLzTmM.d.ts → temporal-CBOrERz5.d.ts} +1 -1
- package/dist/{types-CXAhpW-c.d.cts → types-BE921wRl.d.cts} +1 -1
- package/dist/{types-Bx74kaTt.d.ts → types-BScHXVM7.d.ts} +1 -1
- package/dist/{types-BqFZTQmV.d.cts → types-CWg4dTjj.d.cts} +257 -6
- package/dist/{types-BqFZTQmV.d.ts → types-CWg4dTjj.d.ts} +257 -6
- package/dist/{where-O-k2wgYm.d.ts → where-BWXUPV3C.d.ts} +1 -1
- package/dist/{where-DI_Fqz-X.d.cts → where-CNtx1aLc.d.cts} +1 -1
- package/package.json +3 -2
- package/dist/chunk-26YKDNUD.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.map +0 -1
- package/dist/chunk-3U5ABFDW.cjs.map +0 -1
- package/dist/chunk-5K2BKEBD.js.map +0 -1
- package/dist/chunk-5PRKMB24.cjs.map +0 -1
- package/dist/chunk-6LN7FIVU.js.map +0 -1
- package/dist/chunk-6SWPJEYN.js.map +0 -1
- package/dist/chunk-7LZJNLA5.js.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-EZEEWCFJ.cjs.map +0 -1
- package/dist/chunk-FA2AFWLP.cjs +0 -167
- 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.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-LTXQOEIC.js.map +0 -1
- package/dist/chunk-MKJ4KXL5.cjs +0 -12
- package/dist/chunk-MRDBBHIZ.cjs.map +0 -1
- 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-YIURNGXI.js +0 -155
- 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-ZFMCDJGB.js.map +0 -1
- package/dist/chunk-ZLONH2UD.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { NODE_TYPE_BRAND, EDGE_TYPE_BRAND } from './chunk-
|
|
2
|
-
import {
|
|
1
|
+
import { NODE_TYPE_BRAND, EDGE_TYPE_BRAND } from './chunk-DI6VC62F.js';
|
|
2
|
+
import { assertClaimAxisSafe } from './chunk-5LKOVCPP.js';
|
|
3
|
+
import { assertJsonValue, assertSchemaKeysAreFree, RESERVED_NODE_KEYS, RESERVED_EDGE_KEYS } from './chunk-FZHF5UWR.js';
|
|
3
4
|
import { z } from 'zod';
|
|
4
5
|
|
|
5
6
|
// src/core/node.ts
|
|
@@ -7,6 +8,7 @@ function validateSchemaKeys(schema, name) {
|
|
|
7
8
|
assertSchemaKeysAreFree("Node", name, schema, RESERVED_NODE_KEYS);
|
|
8
9
|
}
|
|
9
10
|
function defineNode(name, options) {
|
|
11
|
+
assertClaimAxisSafe(name, "Node kind");
|
|
10
12
|
validateSchemaKeys(options.schema, name);
|
|
11
13
|
if (options.annotations !== void 0) {
|
|
12
14
|
assertJsonValue(options.annotations, "annotations", `Node "${name}"`);
|
|
@@ -53,5 +55,5 @@ function getTypeName(typeOrIri) {
|
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
export { META_EDGE_BRAND, defineEdge, defineNode, getTypeName, isMetaEdge };
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
58
|
+
//# sourceMappingURL=chunk-7OWE7WD6.js.map
|
|
59
|
+
//# sourceMappingURL=chunk-7OWE7WD6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/node.ts","../src/core/edge.ts","../src/ontology/types.ts"],"names":["validateSchemaKeys"],"mappings":";;;;;;AAoCA,SAAS,kBAAA,CACP,QACA,IAAA,EACM;AACN,EAAA,uBAAA,CAAwB,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,kBAAkB,CAAA;AAClE;AAgBO,SAAS,UAAA,CAGd,MAAS,OAAA,EAA+C;AAGxD,EAAA,mBAAA,CAAoB,MAAM,WAAW,CAAA;AACrC,EAAA,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACvC,EAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,IAAA,eAAA,CAAgB,OAAA,CAAQ,WAAA,EAAa,aAAA,EAAe,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACtE;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,CAAC,eAAe,GAAG,IAAA;AAAA,IACnB,IAAA,EAAM,IAAA;AAAA,IACN,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,aAAa,OAAA,CAAQ;AAAA,GACtB,CAAA;AACH;AC5BA,IAAM,YAAA,GAAe,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAOhC,SAASA,mBAAAA,CACP,QACA,IAAA,EACM;AACN,EAAA,uBAAA,CAAwB,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,kBAAkB,CAAA;AAClE;AAgDO,SAAS,UAAA,CAMd,MACA,OAAA,EACqD;AACrD,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,YAAA;AAClC,EAAAA,mBAAAA,CAAmB,QAAQ,IAAI,CAAA;AAC/B,EAAA,IAAI,OAAA,EAAS,gBAAgB,MAAA,EAAW;AACtC,IAAA,eAAA,CAAgB,OAAA,CAAQ,WAAA,EAAa,aAAA,EAAe,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACtE;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,CAAC,eAAe,GAAG,IAAA;AAAA,IACnB,IAAA,EAAM,IAAA;AAAA,IACN,MAAA;AAAA,IACA,aAAa,OAAA,EAAS,WAAA;AAAA,IACtB,aAAa,OAAA,EAAS,WAAA;AAAA,IACtB,MAAM,OAAA,EAAS,IAAA;AAAA,IACf,IAAI,OAAA,EAAS;AAAA,GACd,CAAA;AACH;;;AC7HO,IAAM,eAAA,GAAkB;AA+ExB,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,OACE,OAAO,UAAU,QAAA,IACjB,KAAA,KAAU,QACV,eAAA,IAAmB,KAAA,IAClB,KAAA,CAAkC,eAAe,CAAA,KAAM,IAAA;AAE5D;AAKO,SAAS,YAAY,SAAA,EAAiD;AAC3E,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA,CAAU,IAAA;AACnB","file":"chunk-7OWE7WD6.js","sourcesContent":["import { type z } from \"zod\";\n\nimport { assertClaimAxisSafe } from \"../store/claims/axis\";\nimport {\n assertSchemaKeysAreFree,\n RESERVED_NODE_KEYS,\n} from \"../store/reserved-keys\";\nimport { assertJsonValue } from \"./json-value\";\nimport { type KindAnnotations, NODE_TYPE_BRAND, type NodeType } from \"./types\";\n\n// ============================================================\n// Node Factory Options\n// ============================================================\n\n/**\n * Options for defining a node type.\n */\nexport type DefineNodeOptions<S extends z.ZodObject<z.ZodRawShape>> = Readonly<{\n /** Zod schema for node properties */\n schema: S;\n /** Optional description for documentation */\n description?: string;\n /**\n * Consumer-owned structured annotations for the kind.\n *\n * Stored in the canonical schema and **participates in schema hashing** —\n * any change bumps the schema version and shows up as a `safe`-severity\n * diff in `getSchemaChanges`. See `KindAnnotations` for the contract.\n */\n annotations?: KindAnnotations;\n}>;\n\n// ============================================================\n// Node Factory\n// ============================================================\n\nfunction validateSchemaKeys(\n schema: z.ZodObject<z.ZodRawShape>,\n name: string,\n): void {\n assertSchemaKeysAreFree(\"Node\", name, schema, RESERVED_NODE_KEYS);\n}\n\n/**\n * Creates a node type definition.\n *\n * @example\n * ```typescript\n * const Person = defineNode(\"Person\", {\n * schema: z.object({\n * fullName: z.string().min(1),\n * email: z.string().email().optional(),\n * }),\n * description: \"A person in the system\",\n * });\n * ```\n */\nexport function defineNode<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n>(name: K, options: DefineNodeOptions<S>): NodeType<K, S> {\n // A kind name is a claim axis, so it may not contain the code point reserved\n // for building the axes that are not kinds.\n assertClaimAxisSafe(name, \"Node kind\");\n validateSchemaKeys(options.schema, name);\n if (options.annotations !== undefined) {\n assertJsonValue(options.annotations, \"annotations\", `Node \"${name}\"`);\n }\n\n return Object.freeze({\n [NODE_TYPE_BRAND]: true as const,\n kind: name,\n schema: options.schema,\n description: options.description,\n annotations: options.annotations,\n });\n}\n","import { z } from \"zod\";\n\nimport {\n assertSchemaKeysAreFree,\n RESERVED_EDGE_KEYS,\n} from \"../store/reserved-keys\";\nimport { assertJsonValue } from \"./json-value\";\nimport {\n EDGE_TYPE_BRAND,\n type EdgeType,\n type KindAnnotations,\n type NodeType,\n} from \"./types\";\n\n// ============================================================\n// Edge Factory Options\n// ============================================================\n\n/**\n * Options for defining an edge type.\n */\nexport type DefineEdgeOptions<\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined = undefined,\n To extends readonly NodeType[] | undefined = undefined,\n> = Readonly<{\n /** Zod schema for edge properties (defaults to empty object) */\n schema?: S;\n /** Optional description for documentation */\n description?: string;\n /**\n * Consumer-owned structured annotations for the kind.\n *\n * Stored in the canonical schema and **participates in schema hashing** —\n * any change bumps the schema version and shows up as a `safe`-severity\n * diff in `getSchemaChanges`. See `KindAnnotations` for the contract.\n */\n annotations?: KindAnnotations;\n /** Node types that can be the source of this edge (domain constraint) */\n from?: From;\n /** Node types that can be the target of this edge (range constraint) */\n to?: To;\n}>;\n\n// ============================================================\n// Empty Schema\n// ============================================================\n\nconst EMPTY_SCHEMA = z.object({});\ntype EmptySchema = typeof EMPTY_SCHEMA;\n\n// ============================================================\n// Edge Factory\n// ============================================================\n\nfunction validateSchemaKeys(\n schema: z.ZodObject<z.ZodRawShape>,\n name: string,\n): void {\n assertSchemaKeysAreFree(\"Edge\", name, schema, RESERVED_EDGE_KEYS);\n}\n\n/**\n * Creates an edge type definition.\n *\n * @example\n * ```typescript\n * // Edge with no properties\n * const hasEpisode = defineEdge(\"hasEpisode\");\n *\n * // Edge with properties\n * const employedAt = defineEdge(\"employedAt\", {\n * schema: z.object({\n * isPrimary: z.boolean().default(true),\n * startedAt: z.date(),\n * }),\n * description: \"Employment relationship\",\n * });\n *\n * // Edge with domain/range constraints (can be used directly in defineGraph)\n * const worksAt = defineEdge(\"worksAt\", {\n * schema: z.object({ role: z.string() }),\n * from: [Person],\n * to: [Company],\n * });\n * ```\n */\n// Overload: no options - returns edge without domain/range\nexport function defineEdge<K extends string>(name: K): EdgeType<K, EmptySchema>;\n\n// Overload: options with both from and to - returns edge with domain/range\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[],\n To extends readonly NodeType[],\n>(\n name: K,\n options: DefineEdgeOptions<S, From, To> & { from: From; to: To },\n): EdgeType<K, S, From, To>;\n\n// Overload: options without from/to - returns edge without domain/range\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n>(name: K, options: DefineEdgeOptions<S>): EdgeType<K, S>;\n\n// Implementation\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined,\n To extends readonly NodeType[] | undefined,\n>(\n name: K,\n options?: DefineEdgeOptions<S, From, To>,\n): EdgeType<K, S, From, To> | EdgeType<K, EmptySchema> {\n const schema = options?.schema ?? EMPTY_SCHEMA;\n validateSchemaKeys(schema, name);\n if (options?.annotations !== undefined) {\n assertJsonValue(options.annotations, \"annotations\", `Edge \"${name}\"`);\n }\n\n return Object.freeze({\n [EDGE_TYPE_BRAND]: true as const,\n kind: name,\n schema,\n description: options?.description,\n annotations: options?.annotations,\n from: options?.from,\n to: options?.to,\n }) as EdgeType<K, S, From, To> | EdgeType<K, EmptySchema>;\n}\n","import { type EdgeType, type NodeType } from \"../core/types\";\n\n// ============================================================\n// Brand Key\n// ============================================================\n\n/** Brand key for MetaEdge */\nexport const META_EDGE_BRAND = \"__metaEdge\" as const;\n\n// ============================================================\n// Inference Types\n// ============================================================\n\n/**\n * How a meta-edge affects queries and validation.\n */\nexport type InferenceType =\n | \"subsumption\" // Query for X includes instances of subclasses\n | \"hierarchy\" // Enables broader/narrower traversal\n | \"substitution\" // Can substitute equivalent types\n | \"constraint\" // Validation rules\n | \"composition\" // Part-whole navigation\n | \"association\" // Discovery/recommendation\n | \"none\"; // No automatic inference\n\n// ============================================================\n// Meta-Edge Properties\n// ============================================================\n\n/**\n * Properties of a meta-edge.\n */\nexport type MetaEdgeProperties = Readonly<{\n transitive: boolean; // A→B, B→C implies A→C\n symmetric: boolean; // A→B implies B→A\n reflexive: boolean; // A→A is always true\n inverse: string | undefined; // Name of inverse meta-edge\n inference: InferenceType; // How this affects queries\n description: string | undefined;\n}>;\n\n// ============================================================\n// Meta-Edge Type\n// ============================================================\n\n/**\n * A meta-edge definition.\n *\n * Meta-edges represent type-level relationships (between kinds),\n * not instance-level relationships (between nodes).\n */\nexport type MetaEdge<K extends string = string> = Readonly<{\n [META_EDGE_BRAND]: true;\n name: K;\n properties: MetaEdgeProperties;\n}>;\n\n// ============================================================\n// Ontology Relation\n// ============================================================\n\n/**\n * A relation in the ontology (instance of meta-edge between types).\n *\n * @example\n * ```typescript\n * // Podcast subClassOf Media\n * subClassOf(Podcast, Media)\n *\n * // Person equivalentTo schema:Person\n * equivalentTo(Person, \"https://schema.org/Person\")\n * ```\n */\nexport type OntologyRelation = Readonly<{\n metaEdge: MetaEdge;\n from: NodeType | EdgeType | string; // string for external IRIs\n to: NodeType | EdgeType | string;\n}>;\n\n// ============================================================\n// Type Guards\n// ============================================================\n\n/**\n * Checks if a value is a MetaEdge.\n */\nexport function isMetaEdge(value: unknown): value is MetaEdge {\n return (\n typeof value === \"object\" &&\n value !== null &&\n META_EDGE_BRAND in value &&\n (value as Record<string, unknown>)[META_EDGE_BRAND] === true\n );\n}\n\n/**\n * Gets the type name from a NodeType, EdgeType, or IRI string.\n */\nexport function getTypeName(typeOrIri: NodeType | EdgeType | string): string {\n if (typeof typeOrIri === \"string\") {\n return typeOrIri;\n }\n return typeOrIri.kind;\n}\n"]}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkZBFZGLZE_cjs = require('./chunk-ZBFZGLZE.cjs');
|
|
4
|
+
var chunkLLVOQOWE_cjs = require('./chunk-LLVOQOWE.cjs');
|
|
5
|
+
var chunkX4GDXBOP_cjs = require('./chunk-X4GDXBOP.cjs');
|
|
6
|
+
var chunkN66HCGCY_cjs = require('./chunk-N66HCGCY.cjs');
|
|
7
|
+
|
|
8
|
+
// src/store/claims/backing.ts
|
|
9
|
+
var CLAIM_MEMBER_NAMES = [
|
|
10
|
+
"claimEdgeCardinality",
|
|
11
|
+
"claimEdgeCardinalityBatch",
|
|
12
|
+
"purgeEdgeClaims",
|
|
13
|
+
"hardDeleteUniquesByConcreteKind"
|
|
14
|
+
];
|
|
15
|
+
function claimSupport(target) {
|
|
16
|
+
const declared = target.capabilities.constraintClaims === true;
|
|
17
|
+
const present = CLAIM_MEMBER_NAMES.filter(
|
|
18
|
+
(name) => target[name] !== void 0
|
|
19
|
+
);
|
|
20
|
+
if (declared && present.length === CLAIM_MEMBER_NAMES.length) {
|
|
21
|
+
return {
|
|
22
|
+
supported: true,
|
|
23
|
+
claims: {
|
|
24
|
+
claimEdgeCardinality: chunkN66HCGCY_cjs.requireDefined(target.claimEdgeCardinality),
|
|
25
|
+
claimEdgeCardinalityBatch: chunkN66HCGCY_cjs.requireDefined(
|
|
26
|
+
target.claimEdgeCardinalityBatch
|
|
27
|
+
),
|
|
28
|
+
purgeEdgeClaims: chunkN66HCGCY_cjs.requireDefined(target.purgeEdgeClaims),
|
|
29
|
+
hardDeleteUniquesByConcreteKind: chunkN66HCGCY_cjs.requireDefined(
|
|
30
|
+
target.hardDeleteUniquesByConcreteKind
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (!declared && present.length === 0) return { supported: false };
|
|
36
|
+
const missing = CLAIM_MEMBER_NAMES.filter(
|
|
37
|
+
(name) => target[name] === void 0
|
|
38
|
+
);
|
|
39
|
+
throw new chunkX4GDXBOP_cjs.ConfigurationError(
|
|
40
|
+
declared ? `This backend declares \`constraintClaims: true\` but does not implement ${missing.join(", ")}. A declared constraint would then be written without the fence the declaration promises.` : `This backend implements ${present.join(", ")} but does not declare \`constraintClaims: true\`. Claim support is read from the declaration, so these members would never be called.`,
|
|
41
|
+
{ code: "CONSTRAINT_CLAIM_SURFACE_MISMATCH", missing, present },
|
|
42
|
+
{
|
|
43
|
+
suggestion: declared ? "Implement the missing members, or drop `constraintClaims` from the backend's capabilities." : "Declare `constraintClaims: true` in the backend's capabilities, or drop the claim members."
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/store/claims/edge-claims.ts
|
|
49
|
+
var EDGE_CARDINALITY_SPECS = {
|
|
50
|
+
one: { keyShape: "from", claimsWhenBornEnded: true, holderLiveness: "live" },
|
|
51
|
+
unique: {
|
|
52
|
+
keyShape: "fromAndTo",
|
|
53
|
+
claimsWhenBornEnded: true,
|
|
54
|
+
holderLiveness: "live"
|
|
55
|
+
},
|
|
56
|
+
oneActive: {
|
|
57
|
+
keyShape: "from",
|
|
58
|
+
claimsWhenBornEnded: false,
|
|
59
|
+
holderLiveness: "liveAndActive"
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
function edgeCardinalityAxesForKind(edgeKind) {
|
|
63
|
+
return Object.keys(EDGE_CARDINALITY_SPECS).map(
|
|
64
|
+
(cardinality) => chunkLLVOQOWE_cjs.edgeCardinalityAxis(cardinality, edgeKind)
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function edgeCardinalityClaimTarget(params) {
|
|
68
|
+
const spec = EDGE_CARDINALITY_SPECS[params.cardinality];
|
|
69
|
+
return {
|
|
70
|
+
relation: "edgeClaims",
|
|
71
|
+
graphId: params.graphId,
|
|
72
|
+
axis: chunkLLVOQOWE_cjs.edgeCardinalityAxis(params.cardinality, params.edgeKind),
|
|
73
|
+
key: spec.keyShape === "from" ? chunkLLVOQOWE_cjs.encodeTupleKey([params.fromKind, params.fromId]) : chunkLLVOQOWE_cjs.encodeTupleKey([
|
|
74
|
+
params.fromKind,
|
|
75
|
+
params.fromId,
|
|
76
|
+
params.toKind,
|
|
77
|
+
params.toId
|
|
78
|
+
])
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function edgeCardinalityClaim(cardinality, subject) {
|
|
82
|
+
if (cardinality === "many") return void 0;
|
|
83
|
+
if (!EDGE_CARDINALITY_SPECS[cardinality].claimsWhenBornEnded && subject.validTo !== void 0) {
|
|
84
|
+
return void 0;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
graphId: subject.graphId,
|
|
88
|
+
cardinality,
|
|
89
|
+
edgeKind: subject.kind,
|
|
90
|
+
edgeId: subject.id,
|
|
91
|
+
fromKind: subject.fromKind,
|
|
92
|
+
fromId: subject.fromId,
|
|
93
|
+
toKind: subject.toKind,
|
|
94
|
+
toId: subject.toId
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function edgeClaimRefusal(params) {
|
|
98
|
+
const error = params.cardinality === "unique" ? chunkLLVOQOWE_cjs.checkUniqueEdge(
|
|
99
|
+
params.edgeKind,
|
|
100
|
+
params.fromKind,
|
|
101
|
+
params.fromId,
|
|
102
|
+
params.toKind,
|
|
103
|
+
params.toId,
|
|
104
|
+
1
|
|
105
|
+
) : chunkLLVOQOWE_cjs.checkCardinality(
|
|
106
|
+
params.edgeKind,
|
|
107
|
+
params.fromKind,
|
|
108
|
+
params.fromId,
|
|
109
|
+
params.cardinality,
|
|
110
|
+
1,
|
|
111
|
+
true
|
|
112
|
+
);
|
|
113
|
+
return error ?? new chunkX4GDXBOP_cjs.CardinalityError({
|
|
114
|
+
edgeKind: params.edgeKind,
|
|
115
|
+
fromKind: params.fromKind,
|
|
116
|
+
fromId: params.fromId,
|
|
117
|
+
cardinality: params.cardinality,
|
|
118
|
+
existingCount: 1
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async function withEdgeClaimRelationPrecondition(graphId, issue) {
|
|
122
|
+
try {
|
|
123
|
+
return await issue();
|
|
124
|
+
} catch (error) {
|
|
125
|
+
if (!chunkZBFZGLZE_cjs.isMissingTableError(error)) throw error;
|
|
126
|
+
throw new chunkX4GDXBOP_cjs.ConfigurationError(
|
|
127
|
+
"Enforcing a declared edge cardinality needs the edge claim relation (typegraph_edge_claims), and this database does not have it. Databases initialized before this relation existed were never sent its CREATE TABLE, because the bootstrap DDL runs only on first boot.",
|
|
128
|
+
{ code: "EDGE_CLAIM_RELATION_MISSING", graphId },
|
|
129
|
+
{
|
|
130
|
+
cause: error,
|
|
131
|
+
suggestion: 'Run the generated migration SQL (generatePostgresMigrationSQL / generateSqliteMigrationSQL) against this database, or declare the edge kind `cardinality: "many"` and enforce the limit in application code.'
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function claimEdgeCardinality(backend, claim) {
|
|
137
|
+
const support = claimSupport(backend);
|
|
138
|
+
if (!support.supported) return;
|
|
139
|
+
const outcome = await withEdgeClaimRelationPrecondition(
|
|
140
|
+
claim.graphId,
|
|
141
|
+
() => support.claims.claimEdgeCardinality(claim)
|
|
142
|
+
);
|
|
143
|
+
if (outcome.status === "refused") throw edgeClaimRefusal(claim);
|
|
144
|
+
}
|
|
145
|
+
async function claimEdgeCardinalityBatch(backend, claims) {
|
|
146
|
+
if (claims.length === 0) return;
|
|
147
|
+
const support = claimSupport(backend);
|
|
148
|
+
if (!support.supported) return;
|
|
149
|
+
const ordered = claims.map((claim) => ({ claim, target: edgeCardinalityClaimTarget(claim) })).toSorted((left, right) => chunkLLVOQOWE_cjs.compareClaimTargets(left.target, right.target));
|
|
150
|
+
const graphId = ordered[0]?.claim.graphId ?? "";
|
|
151
|
+
const outcomes = await withEdgeClaimRelationPrecondition(
|
|
152
|
+
graphId,
|
|
153
|
+
() => support.claims.claimEdgeCardinalityBatch(
|
|
154
|
+
ordered.map((entry) => entry.claim)
|
|
155
|
+
)
|
|
156
|
+
);
|
|
157
|
+
for (const [index, outcome] of outcomes.entries()) {
|
|
158
|
+
const entry = ordered[index];
|
|
159
|
+
if (entry !== void 0 && outcome.status === "refused") {
|
|
160
|
+
throw edgeClaimRefusal(entry.claim);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function purgeEdgeClaims(backend, graphId, edgeIds) {
|
|
165
|
+
if (edgeIds.length === 0) return;
|
|
166
|
+
const support = claimSupport(backend);
|
|
167
|
+
if (!support.supported) return;
|
|
168
|
+
await withEdgeClaimRelationPrecondition(
|
|
169
|
+
graphId,
|
|
170
|
+
() => support.claims.purgeEdgeClaims({ graphId, edgeIds })
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
exports.EDGE_CARDINALITY_SPECS = EDGE_CARDINALITY_SPECS;
|
|
175
|
+
exports.claimEdgeCardinality = claimEdgeCardinality;
|
|
176
|
+
exports.claimEdgeCardinalityBatch = claimEdgeCardinalityBatch;
|
|
177
|
+
exports.edgeCardinalityAxesForKind = edgeCardinalityAxesForKind;
|
|
178
|
+
exports.edgeCardinalityClaim = edgeCardinalityClaim;
|
|
179
|
+
exports.edgeCardinalityClaimTarget = edgeCardinalityClaimTarget;
|
|
180
|
+
exports.purgeEdgeClaims = purgeEdgeClaims;
|
|
181
|
+
//# sourceMappingURL=chunk-7PRMDZIA.cjs.map
|
|
182
|
+
//# sourceMappingURL=chunk-7PRMDZIA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store/claims/backing.ts","../src/store/claims/edge-claims.ts"],"names":["requireDefined","ConfigurationError","edgeCardinalityAxis","encodeTupleKey","checkUniqueEdge","checkCardinality","CardinalityError","isMissingTableError","compareClaimTargets"],"mappings":"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","file":"chunk-7PRMDZIA.cjs","sourcesContent":["/**\n * What backs each constraint fence class.\n *\n * A constrained write is fenced by one of two things: a per-graph lock that\n * serializes the probe with the write it guards, or a CLAIM row whose primary\n * key refuses a second claimant outright. The second is strictly stronger — it\n * holds without a lock, which is what an import needs — and this module records\n * which class has reached it, so \"is this fence a lock or a key?\" is answered\n * from one table rather than inferred from whichever module a reader lands in.\n *\n * It also owns the runtime half of the same question — {@link claimSupport},\n * the one reader of \"can THIS object hold a claim?\" — so the declaration and\n * the surface are reconciled in one place rather than at each claim site.\n */\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { ConfigurationError } from \"../../errors\";\nimport { requireDefined } from \"../../utils/presence\";\n\n/**\n * The runtime extent of the fence classes. {@link ConstraintFenceReason} is\n * DERIVED from it rather than declared beside it: a union type has no runtime\n * extent, so a totality test over a map keyed by the union could only iterate\n * that map's own keys and would be trivially true.\n */\nexport const CONSTRAINT_FENCE_REASONS = [\n \"edgeCardinality\",\n \"edgeMatchKeyConvergence\",\n \"nodeDisjointness\",\n \"nodeUniquenessClaim\",\n \"nodeUniquenessScope\",\n] as const;\n\n/**\n * WHICH declared constraint makes a write constrained.\n *\n * The classification names the reason rather than answering yes/no, because\n * the reason is load-bearing twice over: it is what the fence is taken FOR, and\n * — on a backend that cannot hold the fence — it is what the refusal has to\n * tell the caller. \"This backend cannot fence constrained writes\" is unusable\n * advice; \"your `cardinality: 'one'` edge cannot be enforced here\" is\n * actionable, and only the classifier knows which it was.\n */\nexport type ConstraintFenceReason = (typeof CONSTRAINT_FENCE_REASONS)[number];\n\n/** The relation whose key fences a class, or `lockOnly` when nothing does yet. */\ntype ConstraintFenceBacking = \"uniques\" | \"edgeClaims\" | \"lockOnly\";\n\n/**\n * Which claim relation backs each fence class. The `satisfies` forces totality:\n * a new reason cannot be added without stating what backs it.\n *\n * `nodeUniquenessScope` is `\"uniques\"` because a shared-scope claim is now\n * written at the scope's axis, so two writers of two kinds in one hierarchy\n * contend for one row. `nodeUniquenessClaim` is the same relation seen from the\n * other side: the claim row is the fence, and the class exists because a write\n * that must issue it BEFORE the row it gates needs a transaction to undo the\n * pair together — which is what its refusal names. `nodeDisjointness` is the\n * same relation again, at a third kind of axis: a claim keyed on the declared\n * PAIR and on the node's id, which is the axis disjointness actually declares\n * and the one the nodes primary key `(graph_id, kind, id)` cannot fence.\n * `edgeCardinality` is the other relation: a claim keyed on\n * `(<cardinality>:<edgeKind>, endpoint identity)`, which is the axis the\n * declaration actually spans and the one the edges primary key `(graph_id, id)`\n * cannot fence. The classes still marked `lockOnly` are fenced by the per-graph\n * write lock alone, which is why they are also the classes a non-transactional\n * backend refuses.\n */\nexport const CONSTRAINT_FENCE_BACKING = {\n edgeCardinality: \"edgeClaims\",\n edgeMatchKeyConvergence: \"lockOnly\",\n nodeDisjointness: \"uniques\",\n nodeUniquenessClaim: \"uniques\",\n nodeUniquenessScope: \"uniques\",\n} as const satisfies Record<ConstraintFenceReason, ConstraintFenceBacking>;\n\n/**\n * The claim members, narrowed to present. A caller holding this has been told\n * by ONE reader that this object both declares claim support and carries every\n * member that support consists of.\n */\ntype RequiredClaimMembers = Readonly<{\n claimEdgeCardinality: NonNullable<GraphBackend[\"claimEdgeCardinality\"]>;\n claimEdgeCardinalityBatch: NonNullable<\n GraphBackend[\"claimEdgeCardinalityBatch\"]\n >;\n purgeEdgeClaims: NonNullable<GraphBackend[\"purgeEdgeClaims\"]>;\n hardDeleteUniquesByConcreteKind: NonNullable<\n GraphBackend[\"hardDeleteUniquesByConcreteKind\"]\n >;\n}>;\n\n/** The decision {@link claimSupport} returns — never a flag a caller re-derives. */\nexport type ClaimSupport =\n /** Capability declared AND every claim member present: the members, narrowed. */\n | Readonly<{ supported: true; claims: RequiredClaimMembers }>\n /** Capability absent or false AND no claim member present: the declared gap. */\n | Readonly<{ supported: false }>;\n\n/** The members `constraintClaims: true` promises, in one list. */\nconst CLAIM_MEMBER_NAMES = [\n \"claimEdgeCardinality\",\n \"claimEdgeCardinalityBatch\",\n \"purgeEdgeClaims\",\n \"hardDeleteUniquesByConcreteKind\",\n] as const satisfies readonly (keyof RequiredClaimMembers)[];\n\n/**\n * THE one reader of \"can this object hold a claim?\", asked about the object the\n * claim is about to be written to.\n *\n * It reads BOTH the declaration and the surface, and returns the decision — the\n * narrowed members — rather than a boolean a caller then re-derives the members\n * from. Reading only `capabilities` would let a projection that forwards the\n * capability verbatim while dropping a method produce a verdict about a\n * different object than the write goes to; reading only member presence would\n * be the `undefined`-means-something inference the capability exists to\n * replace.\n *\n * @throws ConfigurationError (`CONSTRAINT_CLAIM_SURFACE_MISMATCH`) when the two\n * disagree in either direction — a backend or projection declaring\n * `constraintClaims: true` while missing a member, or one shipping the\n * members without declaring the capability. Both are defects in the object,\n * and a silent fallback would unfence exactly the writes the capability\n * exists to fence.\n */\nexport function claimSupport(\n target: GraphBackend | TransactionBackend,\n): ClaimSupport {\n const declared = target.capabilities.constraintClaims === true;\n const present = CLAIM_MEMBER_NAMES.filter(\n (name) => target[name] !== undefined,\n );\n if (declared && present.length === CLAIM_MEMBER_NAMES.length) {\n return {\n supported: true,\n claims: {\n claimEdgeCardinality: requireDefined(target.claimEdgeCardinality),\n claimEdgeCardinalityBatch: requireDefined(\n target.claimEdgeCardinalityBatch,\n ),\n purgeEdgeClaims: requireDefined(target.purgeEdgeClaims),\n hardDeleteUniquesByConcreteKind: requireDefined(\n target.hardDeleteUniquesByConcreteKind,\n ),\n },\n };\n }\n if (!declared && present.length === 0) return { supported: false };\n\n const missing = CLAIM_MEMBER_NAMES.filter(\n (name) => target[name] === undefined,\n );\n throw new ConfigurationError(\n declared ?\n `This backend declares \\`constraintClaims: true\\` but does not implement ${missing.join(\", \")}. ` +\n \"A declared constraint would then be written without the fence the \" +\n \"declaration promises.\"\n : `This backend implements ${present.join(\", \")} but does not declare \\`constraintClaims: true\\`. ` +\n \"Claim support is read from the declaration, so these members would \" +\n \"never be called.\",\n { code: \"CONSTRAINT_CLAIM_SURFACE_MISMATCH\", missing, present },\n {\n suggestion:\n declared ?\n \"Implement the missing members, or drop `constraintClaims` from the backend's capabilities.\"\n : \"Declare `constraintClaims: true` in the backend's capabilities, or drop the claim members.\",\n },\n );\n}\n","/**\n * Edge claims — what an edge write reserves on a declared cardinality axis.\n *\n * A declared cardinality is a predicate over `(kind, from)` or\n * `(kind, from, to)`, and the edges relation's only uniqueness is its\n * `(graph_id, id)` primary key, so nothing in the schema re-decides at write\n * time what the probe decided at read time. This module is the reservation that\n * does: one row per `(graph_id, axis, key)` in `typegraph_edge_claims`, whose\n * primary key refuses a second concurrent claimant.\n *\n * The claim needs no release path. A claim whose holder is no longer live (or,\n * for `oneActive`, no longer active) fails the liveness predicate the takeover\n * statement carries and is taken over in place, so the fence never depends on\n * any delete path having run. `purgeEdgeClaims` exists to bound table growth,\n * not to make the fence correct.\n */\nimport {\n type ClaimEdgeCardinalityParams,\n type GraphBackend,\n type InsertEdgeParams,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { checkCardinality, checkUniqueEdge } from \"../../constraints\";\nimport { type Cardinality } from \"../../core/types\";\nimport { CardinalityError, ConfigurationError } from \"../../errors\";\nimport { isMissingTableError } from \"../../utils/sql-errors\";\nimport { encodeTupleKey } from \"../../utils/tuple-key\";\nimport {\n type ClaimTarget,\n compareClaimTargets,\n edgeCardinalityAxis,\n} from \"./axis\";\nimport { claimSupport } from \"./backing\";\n\n/** A cardinality that declares something — `many` declares nothing. */\nexport type ConstrainedCardinality = Exclude<Cardinality, \"many\">;\n\n/**\n * What one declared cardinality means to every layer that has to agree about\n * it: which endpoints its axis key covers, whether an edge born already ended\n * claims at all, and what a holder must still BE for its claim to stand.\n */\nexport type EdgeCardinalitySpec = Readonly<{\n /** Which endpoints the axis key covers. */\n keyShape: \"from\" | \"fromAndTo\";\n /** Whether a new edge that is born ENDED makes a claim at all. */\n claimsWhenBornEnded: boolean;\n /** What a holder must still be for its claim to stand. */\n holderLiveness: \"live\" | \"liveAndActive\";\n}>;\n\n/**\n * THE table both renderers of the cardinality predicate read: the TypeScript\n * probe ({@link file://../constraints.ts checkCardinalityConstraint}) and the\n * SQL takeover statement\n * ({@link file://../../backend/drizzle/operations/edge-claims.ts}).\n *\n * Two renderers, one table, exhaustive by type: a new cardinality cannot be\n * added without stating all three facts, and the probe and the fence cannot\n * disagree about any of them — a disagreement is exactly the shape where the\n * probe accepts a write the fence then refuses forever (or the reverse).\n */\nexport const EDGE_CARDINALITY_SPECS = {\n one: { keyShape: \"from\", claimsWhenBornEnded: true, holderLiveness: \"live\" },\n unique: {\n keyShape: \"fromAndTo\",\n claimsWhenBornEnded: true,\n holderLiveness: \"live\",\n },\n oneActive: {\n keyShape: \"from\",\n claimsWhenBornEnded: false,\n holderLiveness: \"liveAndActive\",\n },\n} as const satisfies Record<ConstrainedCardinality, EdgeCardinalitySpec>;\n\n/** Every axis an edge kind's claims can sit on, for housekeeping reaps. */\nexport function edgeCardinalityAxesForKind(\n edgeKind: string,\n): readonly string[] {\n return Object.keys(EDGE_CARDINALITY_SPECS).map((cardinality) =>\n edgeCardinalityAxis(cardinality, edgeKind),\n );\n}\n\n/**\n * THE claim row one edge write reserves: its axis, and the endpoint identity\n * the axis is keyed by.\n *\n * The key is {@link encodeTupleKey}, not a delimiter join: node ids are\n * arbitrary caller data (only kind names pass `assertClaimAxisSafe`), and a\n * delimiter that a value may contain makes two different endpoint tuples\n * collapse onto one key — which would refuse a write no constraint forbids.\n */\nexport function edgeCardinalityClaimTarget(\n params: ClaimEdgeCardinalityParams,\n): ClaimTarget {\n const spec = EDGE_CARDINALITY_SPECS[params.cardinality];\n return {\n relation: \"edgeClaims\",\n graphId: params.graphId,\n axis: edgeCardinalityAxis(params.cardinality, params.edgeKind),\n key:\n spec.keyShape === \"from\" ?\n encodeTupleKey([params.fromKind, params.fromId])\n : encodeTupleKey([\n params.fromKind,\n params.fromId,\n params.toKind,\n params.toId,\n ]),\n };\n}\n\n/**\n * The fields a claim is decided from: the row's identity and the upper bound\n * that decides whether it joins an active-only population. Narrower than\n * {@link InsertEdgeParams} on purpose — a resurrect has no insert params to\n * hand over, and passing an invented `props` to satisfy a type would be a\n * fabricated value a reader has to check is unread.\n */\nexport type EdgeClaimSubject = Pick<\n InsertEdgeParams,\n \"graphId\" | \"id\" | \"kind\" | \"fromKind\" | \"fromId\" | \"toKind\" | \"toId\"\n> &\n Readonly<{ validTo?: string }>;\n\n/**\n * THE claim an edge insert owes, or `undefined` when it owes none.\n *\n * `many` declares no constraint, and an `oneActive` edge born already ended\n * joins no active population — `claimsWhenBornEnded` is the one place that\n * second exemption is written down, and the probe reads the same field, so the\n * two cannot drift into \"probed but unclaimed\" (a silent hole) or \"claimed but\n * unprobed\" (a refusal with no matching error).\n */\nexport function edgeCardinalityClaim(\n cardinality: Cardinality,\n subject: EdgeClaimSubject,\n): ClaimEdgeCardinalityParams | undefined {\n if (cardinality === \"many\") return undefined;\n if (\n !EDGE_CARDINALITY_SPECS[cardinality].claimsWhenBornEnded &&\n subject.validTo !== undefined\n ) {\n return undefined;\n }\n return {\n graphId: subject.graphId,\n cardinality,\n edgeKind: subject.kind,\n edgeId: subject.id,\n fromKind: subject.fromKind,\n fromId: subject.fromId,\n toKind: subject.toKind,\n toId: subject.toId,\n };\n}\n\n/**\n * The refusal a lost claim raises — built by the SAME owners the probe calls,\n * so the fence's error is `instanceof` the same class and carries the same\n * payload as the probe's for the same violation (I3).\n */\nfunction edgeClaimRefusal(\n params: ClaimEdgeCardinalityParams,\n): CardinalityError {\n const error =\n params.cardinality === \"unique\" ?\n checkUniqueEdge(\n params.edgeKind,\n params.fromKind,\n params.fromId,\n params.toKind,\n params.toId,\n 1,\n )\n : checkCardinality(\n params.edgeKind,\n params.fromKind,\n params.fromId,\n params.cardinality,\n 1,\n true,\n );\n // Both owners refuse for an incumbent count of one on every constrained\n // cardinality; the fallback keeps the return type honest without inventing a\n // second spelling of the message.\n return (\n error ??\n new CardinalityError({\n edgeKind: params.edgeKind,\n fromKind: params.fromKind,\n fromId: params.fromId,\n cardinality: params.cardinality,\n existingCount: 1,\n })\n );\n}\n\n/**\n * Converts the engine's \"relation does not exist\" into a typed precondition\n * error naming the relation and the way to create it.\n *\n * Checked at FIRST USE rather than at store construction: a graph with no\n * constrained edge kind never issues a claim and must not pay a catalog read\n * for a relation it will never touch. A database bootstrapped before this\n * relation existed reaches it here, on the first constrained edge write, with\n * an error that says what to run instead of an opaque driver failure.\n */\nasync function withEdgeClaimRelationPrecondition<T>(\n graphId: string,\n issue: () => Promise<T>,\n): Promise<T> {\n try {\n return await issue();\n } catch (error) {\n if (!isMissingTableError(error)) throw error;\n throw new ConfigurationError(\n \"Enforcing a declared edge cardinality needs the edge claim relation \" +\n \"(typegraph_edge_claims), and this database does not have it. \" +\n \"Databases initialized before this relation existed were never sent \" +\n \"its CREATE TABLE, because the bootstrap DDL runs only on first boot.\",\n { code: \"EDGE_CLAIM_RELATION_MISSING\", graphId },\n {\n cause: error,\n suggestion:\n \"Run the generated migration SQL (generatePostgresMigrationSQL / \" +\n \"generateSqliteMigrationSQL) against this database, or declare the \" +\n 'edge kind `cardinality: \"many\"` and enforce the limit in ' +\n \"application code.\",\n },\n );\n }\n}\n\n/** The backend an edge claim is written to — the object inside the transaction. */\ntype ClaimTargetBackend = GraphBackend | TransactionBackend;\n\n/**\n * Issues ONE edge cardinality claim against the object the row write goes to,\n * refusing with the declared error when a live incumbent holds the axis.\n *\n * A backend that declares no claim support writes no claim and keeps exactly\n * the fence it has today (the per-graph write lock around the probe) — a\n * declared gap with a parity-matrix row, never a silent unfencing and never a\n * new refusal.\n */\nexport async function claimEdgeCardinality(\n backend: ClaimTargetBackend,\n claim: ClaimEdgeCardinalityParams,\n): Promise<void> {\n const support = claimSupport(backend);\n if (!support.supported) return;\n const outcome = await withEdgeClaimRelationPrecondition(claim.graphId, () =>\n support.claims.claimEdgeCardinality(claim),\n );\n if (outcome.status === \"refused\") throw edgeClaimRefusal(claim);\n}\n\n/**\n * Issues a batch's claims as ONE statement, entries sorted by\n * {@link compareClaimTargets}.\n *\n * One statement takes its row locks in a fixed order, so a batch cannot\n * deadlock against itself; sorting is what stops two writers of the same two\n * axes from taking them in opposite orders. In-batch duplicates are refused\n * before this by the batch validation wrapper's pending-cardinality state, so\n * the backend's duplicate-conflict-target guard stays a defensive invariant.\n */\nexport async function claimEdgeCardinalityBatch(\n backend: ClaimTargetBackend,\n claims: readonly ClaimEdgeCardinalityParams[],\n): Promise<void> {\n if (claims.length === 0) return;\n const support = claimSupport(backend);\n if (!support.supported) return;\n const ordered = claims\n .map((claim) => ({ claim, target: edgeCardinalityClaimTarget(claim) }))\n .toSorted((left, right) => compareClaimTargets(left.target, right.target));\n const graphId = ordered[0]?.claim.graphId ?? \"\";\n const outcomes = await withEdgeClaimRelationPrecondition(graphId, () =>\n support.claims.claimEdgeCardinalityBatch(\n ordered.map((entry) => entry.claim),\n ),\n );\n for (const [index, outcome] of outcomes.entries()) {\n const entry = ordered[index];\n if (entry !== undefined && outcome.status === \"refused\") {\n throw edgeClaimRefusal(entry.claim);\n }\n }\n}\n\n/**\n * Housekeeping: drops the claim rows named edges held.\n *\n * Never a fence and never load-bearing — a claim whose holder is gone already\n * fails the takeover statement's liveness predicate, so the axis is reusable\n * whether or not this ran. It exists so a hard delete does not leave a row\n * behind forever. A backend without claim support has nothing to purge.\n */\nexport async function purgeEdgeClaims(\n backend: ClaimTargetBackend,\n graphId: string,\n edgeIds: readonly string[],\n): Promise<void> {\n if (edgeIds.length === 0) return;\n const support = claimSupport(backend);\n if (!support.supported) return;\n await withEdgeClaimRelationPrecondition(graphId, () =>\n support.claims.purgeEdgeClaims({ graphId, edgeIds }),\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { unwrap, validateGraphExtension } from './chunk-
|
|
1
|
+
import { unwrap, validateGraphExtension } from './chunk-XZW2CTNO.js';
|
|
2
2
|
|
|
3
3
|
// src/graph-extension/define-graph-extension.ts
|
|
4
4
|
function defineGraphExtension(input) {
|
|
@@ -6,5 +6,5 @@ function defineGraphExtension(input) {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export { defineGraphExtension };
|
|
9
|
-
//# sourceMappingURL=chunk-
|
|
10
|
-
//# sourceMappingURL=chunk-
|
|
9
|
+
//# sourceMappingURL=chunk-AH2A74OZ.js.map
|
|
10
|
+
//# sourceMappingURL=chunk-AH2A74OZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graph-extension/define-graph-extension.ts"],"names":[],"mappings":";;;AAyDO,SAAS,qBAAqB,KAAA,EAAuC;AAC1E,EAAA,OAAO,OAAO,sBAAA,CAAuB,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAC/D","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/graph-extension/define-graph-extension.ts"],"names":[],"mappings":";;;AAyDO,SAAS,qBAAqB,KAAA,EAAuC;AAC1E,EAAA,OAAO,OAAO,sBAAA,CAAuB,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAC/D","file":"chunk-AH2A74OZ.js","sourcesContent":["/**\n * Public entry for declaring a graph extension.\n *\n * Pure value: validates the input, deeply freezes the result, and returns\n * a `GraphExtension`. Invalid documents throw\n * `GraphExtensionValidationError` carrying every issue with a\n * JSON-pointer `path` to the offending field.\n */\nimport { unwrap } from \"../utils/result\";\nimport { type GraphExtension } from \"./extension-types\";\nimport { validateGraphExtension } from \"./validation\";\n\n/**\n * Validates and freezes a graph-extension document.\n *\n * Authoring entry point — runs validation in **strict** mode: unknown\n * top-level keys (e.g. `node` instead of `nodes`) and unsupported\n * string formats (e.g. `\"date-time\"` with a hyphen instead of\n * `\"datetime\"`) fail loudly with `UNKNOWN_DOCUMENT_KEY` /\n * `UNSUPPORTED_STRING_FORMAT`. The persistence-load path leaves both\n * checks off so a document committed by a future v1.x writer with\n * additive fields still parses on an older v1 reader. Callers\n * accepting raw JSON from an untyped source (e.g. an LLM proposal)\n * should validate first via `validateGraphExtension` and surface\n * the structured issues, then pass the validated document here.\n *\n * @param input - Document describing additional node kinds, edge\n * kinds, and ontology relations. Must satisfy the v1 property-type\n * subset documented in `ExtensionPropertyType`.\n *\n * @returns The same document, deeply frozen and shape-checked.\n *\n * @throws {GraphExtensionValidationError} when the document violates\n * the v1 property-type subset, references undeclared kinds, contains\n * ontology cycles, etc. The thrown error's `details.issues` array\n * carries every failure with a JSON-pointer path.\n * @throws {GraphExtensionVersionUnsupportedError} when the document\n * declares a future major version this library cannot safely decode.\n *\n * @example\n * ```typescript\n * const extension = defineGraphExtension({\n * nodes: {\n * Paper: {\n * properties: {\n * doi: { type: \"string\" },\n * title: { type: \"string\", searchable: { language: \"english\" } },\n * },\n * unique: [{ name: \"paper_doi\", fields: [\"doi\"] }],\n * },\n * },\n * });\n *\n * const evolved = await store.evolve(extension);\n * const papers = evolved.getNodeCollectionOrThrow(\"Paper\");\n * ```\n */\nexport function defineGraphExtension(input: GraphExtension): GraphExtension {\n return unwrap(validateGraphExtension(input, { strict: true }));\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunkKWNWG4RC_cjs = require('./chunk-KWNWG4RC.cjs');
|
|
4
|
+
var chunkTEC24ZDA_cjs = require('./chunk-TEC24ZDA.cjs');
|
|
5
|
+
var chunkOJHD3LXJ_cjs = require('./chunk-OJHD3LXJ.cjs');
|
|
6
6
|
|
|
7
7
|
// src/query/dialect/vector/sqlite-vec-strategy.ts
|
|
8
8
|
var TABLE_PREFIX = "tg_vec";
|
|
@@ -57,17 +57,17 @@ function sqliteVecMetricToken(metric) {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
function vecF32Literal(embedding, name) {
|
|
60
|
-
|
|
61
|
-
return
|
|
60
|
+
chunkTEC24ZDA_cjs.assertFiniteEmbedding(embedding, name);
|
|
61
|
+
return chunkOJHD3LXJ_cjs.sql`vec_f32(${JSON.stringify(embedding)})`;
|
|
62
62
|
}
|
|
63
63
|
function distanceExpression(embeddingColumn, queryEmbedding, metric) {
|
|
64
64
|
const query = vecF32Literal(queryEmbedding, "queryEmbedding");
|
|
65
65
|
switch (metric) {
|
|
66
66
|
case "cosine": {
|
|
67
|
-
return
|
|
67
|
+
return chunkOJHD3LXJ_cjs.sql`vec_distance_cosine(${embeddingColumn}, ${query})`;
|
|
68
68
|
}
|
|
69
69
|
case "l2": {
|
|
70
|
-
return
|
|
70
|
+
return chunkOJHD3LXJ_cjs.sql`vec_distance_l2(${embeddingColumn}, ${query})`;
|
|
71
71
|
}
|
|
72
72
|
case "inner_product": {
|
|
73
73
|
throw new Error(
|
|
@@ -81,7 +81,7 @@ function distanceExpression(embeddingColumn, queryEmbedding, metric) {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
function tableName(graphId, nodeKind, fieldPath) {
|
|
84
|
-
return
|
|
84
|
+
return chunkTEC24ZDA_cjs.vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
|
|
85
85
|
}
|
|
86
86
|
var sqliteVecStrategy = {
|
|
87
87
|
name: "sqlite-vec",
|
|
@@ -89,11 +89,11 @@ var sqliteVecStrategy = {
|
|
|
89
89
|
tableName,
|
|
90
90
|
ownedTables(slot) {
|
|
91
91
|
const table = tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
|
|
92
|
-
const name =
|
|
92
|
+
const name = chunkTEC24ZDA_cjs.quoteIdentifier(table);
|
|
93
93
|
const metric = sqliteVecMetricToken(slot.metric);
|
|
94
94
|
return [
|
|
95
95
|
{
|
|
96
|
-
logicalName: `${
|
|
96
|
+
logicalName: `${chunkTEC24ZDA_cjs.VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,
|
|
97
97
|
owner: "sqlite-vec",
|
|
98
98
|
tableName: table,
|
|
99
99
|
createDdl: [
|
|
@@ -110,52 +110,52 @@ var sqliteVecStrategy = {
|
|
|
110
110
|
];
|
|
111
111
|
},
|
|
112
112
|
buildUpsert(slot, params, timestamp) {
|
|
113
|
-
const table =
|
|
113
|
+
const table = chunkOJHD3LXJ_cjs.sql.identifier(
|
|
114
114
|
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
115
115
|
);
|
|
116
116
|
const value = vecF32Literal(params.embedding, "embedding");
|
|
117
117
|
return [
|
|
118
|
-
|
|
118
|
+
chunkOJHD3LXJ_cjs.sql`
|
|
119
119
|
DELETE FROM ${table}
|
|
120
120
|
WHERE "node_id" = ${params.nodeId} AND "graph_id" = ${params.graphId}
|
|
121
121
|
`,
|
|
122
|
-
|
|
122
|
+
chunkOJHD3LXJ_cjs.sql`
|
|
123
123
|
INSERT INTO ${table} ("node_id", "graph_id", "created_at", "updated_at", "embedding")
|
|
124
124
|
VALUES (${params.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${value})
|
|
125
125
|
`
|
|
126
126
|
];
|
|
127
127
|
},
|
|
128
128
|
buildUpsertBatch(slot, params, timestamp) {
|
|
129
|
-
const table =
|
|
129
|
+
const table = chunkOJHD3LXJ_cjs.sql.identifier(
|
|
130
130
|
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
131
131
|
);
|
|
132
|
-
const nodeIds =
|
|
133
|
-
params.rows.map((row) =>
|
|
134
|
-
|
|
132
|
+
const nodeIds = chunkOJHD3LXJ_cjs.sql.join(
|
|
133
|
+
params.rows.map((row) => chunkOJHD3LXJ_cjs.sql`${row.nodeId}`),
|
|
134
|
+
chunkOJHD3LXJ_cjs.sql`, `
|
|
135
135
|
);
|
|
136
|
-
const valueRows =
|
|
136
|
+
const valueRows = chunkOJHD3LXJ_cjs.sql.join(
|
|
137
137
|
params.rows.map(
|
|
138
|
-
(row) =>
|
|
138
|
+
(row) => chunkOJHD3LXJ_cjs.sql`(${row.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${vecF32Literal(row.embedding, "embedding")})`
|
|
139
139
|
),
|
|
140
|
-
|
|
140
|
+
chunkOJHD3LXJ_cjs.sql`, `
|
|
141
141
|
);
|
|
142
142
|
return [
|
|
143
|
-
|
|
143
|
+
chunkOJHD3LXJ_cjs.sql`
|
|
144
144
|
DELETE FROM ${table}
|
|
145
145
|
WHERE "graph_id" = ${params.graphId} AND "node_id" IN (${nodeIds})
|
|
146
146
|
`,
|
|
147
|
-
|
|
147
|
+
chunkOJHD3LXJ_cjs.sql`
|
|
148
148
|
INSERT INTO ${table} ("node_id", "graph_id", "created_at", "updated_at", "embedding")
|
|
149
149
|
VALUES ${valueRows}
|
|
150
150
|
`
|
|
151
151
|
];
|
|
152
152
|
},
|
|
153
153
|
buildDelete(slot, params) {
|
|
154
|
-
const table =
|
|
154
|
+
const table = chunkOJHD3LXJ_cjs.sql.identifier(
|
|
155
155
|
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
156
156
|
);
|
|
157
157
|
return [
|
|
158
|
-
|
|
158
|
+
chunkOJHD3LXJ_cjs.sql`
|
|
159
159
|
DELETE FROM ${table}
|
|
160
160
|
WHERE "node_id" = ${params.nodeId} AND "graph_id" = ${params.graphId}
|
|
161
161
|
`
|
|
@@ -163,13 +163,13 @@ var sqliteVecStrategy = {
|
|
|
163
163
|
},
|
|
164
164
|
buildDeleteBatch(slot, params) {
|
|
165
165
|
if (params.nodeIds.length === 0) return [];
|
|
166
|
-
const table =
|
|
166
|
+
const table = chunkOJHD3LXJ_cjs.sql.identifier(
|
|
167
167
|
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
168
168
|
);
|
|
169
169
|
return [
|
|
170
|
-
|
|
171
|
-
params.nodeIds.map((nodeId) =>
|
|
172
|
-
|
|
170
|
+
chunkOJHD3LXJ_cjs.sql`DELETE FROM ${table} WHERE "graph_id" = ${params.graphId} AND "node_id" IN (${chunkOJHD3LXJ_cjs.sql.join(
|
|
171
|
+
params.nodeIds.map((nodeId) => chunkOJHD3LXJ_cjs.sql`${nodeId}`),
|
|
172
|
+
chunkOJHD3LXJ_cjs.sql`, `
|
|
173
173
|
)})`
|
|
174
174
|
];
|
|
175
175
|
},
|
|
@@ -179,63 +179,63 @@ var sqliteVecStrategy = {
|
|
|
179
179
|
// route the NON-approximate `.similarTo()` branch through this form.
|
|
180
180
|
searchIsExact: true,
|
|
181
181
|
buildSearch(slot, params, candidates) {
|
|
182
|
-
const table =
|
|
182
|
+
const table = chunkOJHD3LXJ_cjs.sql.identifier(
|
|
183
183
|
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
184
184
|
);
|
|
185
|
-
const embeddingColumn =
|
|
185
|
+
const embeddingColumn = chunkOJHD3LXJ_cjs.sql`${table}."embedding"`;
|
|
186
186
|
const distance = distanceExpression(
|
|
187
187
|
embeddingColumn,
|
|
188
188
|
params.queryEmbedding,
|
|
189
189
|
params.metric
|
|
190
190
|
);
|
|
191
|
-
const score =
|
|
191
|
+
const score = chunkTEC24ZDA_cjs.vectorScoreExpression(distance, params.metric);
|
|
192
192
|
if (usesAnnIndex(slot)) {
|
|
193
193
|
const query = vecF32Literal(params.queryEmbedding, "queryEmbedding");
|
|
194
194
|
const knnK = params.limit + (params.offset ?? 0);
|
|
195
195
|
const conditions2 = [
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
196
|
+
chunkOJHD3LXJ_cjs.sql`${table}."embedding" MATCH ${query}`,
|
|
197
|
+
chunkOJHD3LXJ_cjs.sql`k = ${knnK}`,
|
|
198
|
+
chunkOJHD3LXJ_cjs.sql`${table}."graph_id" = ${params.graphId}`
|
|
199
199
|
];
|
|
200
200
|
if (params.minScore !== void 0) {
|
|
201
201
|
conditions2.push(
|
|
202
|
-
|
|
202
|
+
chunkTEC24ZDA_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
|
|
203
203
|
);
|
|
204
204
|
}
|
|
205
205
|
if (candidates !== void 0) {
|
|
206
|
-
conditions2.push(
|
|
206
|
+
conditions2.push(chunkOJHD3LXJ_cjs.sql`${table}."node_id" IN (${candidates})`);
|
|
207
207
|
}
|
|
208
|
-
const knnBody =
|
|
208
|
+
const knnBody = chunkOJHD3LXJ_cjs.sql`
|
|
209
209
|
SELECT ${table}."node_id" AS node_id, ${score} AS score
|
|
210
210
|
FROM ${table}
|
|
211
|
-
WHERE ${
|
|
211
|
+
WHERE ${chunkOJHD3LXJ_cjs.sql.join(conditions2, chunkOJHD3LXJ_cjs.sql` AND `)}
|
|
212
212
|
ORDER BY distance ASC
|
|
213
213
|
`;
|
|
214
214
|
if (params.offset === void 0 || params.offset === 0) {
|
|
215
215
|
return knnBody;
|
|
216
216
|
}
|
|
217
|
-
return
|
|
217
|
+
return chunkOJHD3LXJ_cjs.sql`
|
|
218
218
|
WITH knn_page AS MATERIALIZED (${knnBody})
|
|
219
219
|
SELECT node_id, score FROM knn_page
|
|
220
220
|
LIMIT ${params.limit} OFFSET ${params.offset}
|
|
221
221
|
`;
|
|
222
222
|
}
|
|
223
223
|
const conditions = [
|
|
224
|
-
|
|
224
|
+
chunkOJHD3LXJ_cjs.sql`${table}."graph_id" = ${params.graphId}`
|
|
225
225
|
];
|
|
226
226
|
if (candidates !== void 0) {
|
|
227
|
-
conditions.push(
|
|
227
|
+
conditions.push(chunkOJHD3LXJ_cjs.sql`${table}."node_id" IN (${candidates})`);
|
|
228
228
|
}
|
|
229
229
|
if (params.minScore !== void 0) {
|
|
230
230
|
conditions.push(
|
|
231
|
-
|
|
231
|
+
chunkTEC24ZDA_cjs.vectorMinScoreCondition(distance, params.metric, params.minScore)
|
|
232
232
|
);
|
|
233
233
|
}
|
|
234
|
-
const pageClause =
|
|
235
|
-
return
|
|
234
|
+
const pageClause = chunkKWNWG4RC_cjs.vectorPageClause(params.limit, params.offset);
|
|
235
|
+
return chunkOJHD3LXJ_cjs.sql`
|
|
236
236
|
SELECT ${table}."node_id" AS node_id, ${score} AS score
|
|
237
237
|
FROM ${table}
|
|
238
|
-
WHERE ${
|
|
238
|
+
WHERE ${chunkOJHD3LXJ_cjs.sql.join(conditions, chunkOJHD3LXJ_cjs.sql` AND `)}
|
|
239
239
|
ORDER BY ${distance} ASC
|
|
240
240
|
${pageClause}
|
|
241
241
|
`;
|
|
@@ -252,7 +252,7 @@ var sqliteVecStrategy = {
|
|
|
252
252
|
return void 0;
|
|
253
253
|
},
|
|
254
254
|
buildDropStorage(slot) {
|
|
255
|
-
const table =
|
|
255
|
+
const table = chunkTEC24ZDA_cjs.quoteIdentifier(
|
|
256
256
|
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
257
257
|
);
|
|
258
258
|
return [`DROP TABLE IF EXISTS ${table}`];
|
|
@@ -260,5 +260,5 @@ var sqliteVecStrategy = {
|
|
|
260
260
|
};
|
|
261
261
|
|
|
262
262
|
exports.sqliteVecStrategy = sqliteVecStrategy;
|
|
263
|
-
//# sourceMappingURL=chunk-
|
|
264
|
-
//# sourceMappingURL=chunk-
|
|
263
|
+
//# sourceMappingURL=chunk-BYBDM423.cjs.map
|
|
264
|
+
//# sourceMappingURL=chunk-BYBDM423.cjs.map
|