@nicia-ai/typegraph 0.37.1 → 0.38.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 -10
- package/dist/backend/drizzle/indexes.cjs +32 -0
- package/dist/backend/drizzle/indexes.cjs.map +1 -0
- package/dist/backend/drizzle/indexes.d.cts +43 -0
- package/dist/backend/drizzle/indexes.d.ts +43 -0
- package/dist/backend/drizzle/indexes.js +11 -0
- package/dist/backend/drizzle/indexes.js.map +1 -0
- package/dist/backend/index.cjs +161 -0
- package/dist/backend/index.cjs.map +1 -0
- package/dist/backend/index.d.cts +3 -0
- package/dist/backend/index.d.ts +3 -0
- package/dist/backend/index.js +8 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/postgres/index.cjs +32 -28
- package/dist/backend/postgres/index.d.cts +13 -12
- package/dist/backend/postgres/index.d.ts +13 -12
- package/dist/backend/postgres/index.js +19 -15
- package/dist/backend/postgres/pglite-store.cjs +67 -0
- package/dist/backend/postgres/pglite-store.cjs.map +1 -0
- package/dist/backend/postgres/pglite-store.d.cts +38 -0
- package/dist/backend/postgres/pglite-store.d.ts +38 -0
- package/dist/backend/postgres/pglite-store.js +65 -0
- package/dist/backend/postgres/pglite-store.js.map +1 -0
- package/dist/backend/postgres/pglite.cjs +25 -50
- package/dist/backend/postgres/pglite.cjs.map +1 -1
- package/dist/backend/postgres/pglite.d.cts +10 -9
- package/dist/backend/postgres/pglite.d.ts +10 -9
- package/dist/backend/postgres/pglite.js +20 -52
- package/dist/backend/postgres/pglite.js.map +1 -1
- package/dist/backend/sqlite/index.cjs +29 -25
- package/dist/backend/sqlite/index.d.cts +11 -11
- package/dist/backend/sqlite/index.d.ts +11 -11
- package/dist/backend/sqlite/index.js +17 -13
- package/dist/backend/sqlite/libsql.cjs +23 -19
- package/dist/backend/sqlite/libsql.cjs.map +1 -1
- package/dist/backend/sqlite/libsql.d.cts +9 -10
- package/dist/backend/sqlite/libsql.d.ts +9 -10
- package/dist/backend/sqlite/libsql.js +19 -15
- package/dist/backend/sqlite/libsql.js.map +1 -1
- package/dist/backend/sqlite/local-store.cjs +72 -0
- package/dist/backend/sqlite/local-store.cjs.map +1 -0
- package/dist/backend/sqlite/local-store.d.cts +42 -0
- package/dist/backend/sqlite/local-store.d.ts +42 -0
- package/dist/backend/sqlite/local-store.js +67 -0
- package/dist/backend/sqlite/local-store.js.map +1 -0
- package/dist/backend/sqlite/local.cjs +28 -183
- package/dist/backend/sqlite/local.cjs.map +1 -1
- package/dist/backend/sqlite/local.d.cts +8 -81
- package/dist/backend/sqlite/local.d.ts +8 -81
- package/dist/backend/sqlite/local.js +20 -180
- package/dist/backend/sqlite/local.js.map +1 -1
- package/dist/chunk-2EBMPJBO.js +16 -0
- package/dist/chunk-2EBMPJBO.js.map +1 -0
- package/dist/{chunk-5AVRFNP4.cjs → chunk-2SL7OGPR.cjs} +2866 -1507
- package/dist/chunk-2SL7OGPR.cjs.map +1 -0
- package/dist/chunk-35S6P5ZU.js +27 -0
- package/dist/chunk-35S6P5ZU.js.map +1 -0
- package/dist/chunk-3LKL3S6X.js +50 -0
- package/dist/chunk-3LKL3S6X.js.map +1 -0
- package/dist/chunk-6G5CQ6JX.js +47 -0
- package/dist/chunk-6G5CQ6JX.js.map +1 -0
- package/dist/chunk-6XDBRDZE.js +312 -0
- package/dist/chunk-6XDBRDZE.js.map +1 -0
- package/dist/chunk-764JHTLT.cjs +15 -0
- package/dist/chunk-764JHTLT.cjs.map +1 -0
- package/dist/chunk-76HE7DJP.js +68 -0
- package/dist/chunk-76HE7DJP.js.map +1 -0
- package/dist/{chunk-VGDDG3XJ.cjs → chunk-7M3NACL3.cjs} +12 -12
- package/dist/{chunk-VGDDG3XJ.cjs.map → chunk-7M3NACL3.cjs.map} +1 -1
- package/dist/{chunk-NXQFATMF.cjs → chunk-7VLCN3JB.cjs} +153 -123
- package/dist/chunk-7VLCN3JB.cjs.map +1 -0
- package/dist/{chunk-GA4TT3DH.js → chunk-A2FGSWMQ.js} +1845 -489
- package/dist/chunk-A2FGSWMQ.js.map +1 -0
- package/dist/chunk-AOL64O4Z.js +165 -0
- package/dist/chunk-AOL64O4Z.js.map +1 -0
- package/dist/{chunk-27SSDCEP.cjs → chunk-B63IFHXR.cjs} +53 -74
- package/dist/chunk-B63IFHXR.cjs.map +1 -0
- package/dist/{chunk-3XXGYU62.cjs → chunk-BKAKAVRW.cjs} +56 -53
- package/dist/chunk-BKAKAVRW.cjs.map +1 -0
- package/dist/{chunk-YTSN73ND.js → chunk-BQITNFQJ.js} +3 -3
- package/dist/{chunk-YTSN73ND.js.map → chunk-BQITNFQJ.js.map} +1 -1
- package/dist/{chunk-NUIG3BCV.cjs → chunk-CQC6VBAF.cjs} +93 -155
- package/dist/chunk-CQC6VBAF.cjs.map +1 -0
- package/dist/{chunk-6EEO3OVU.cjs → chunk-CWX77JB4.cjs} +22 -59
- package/dist/chunk-CWX77JB4.cjs.map +1 -0
- package/dist/{chunk-UGZUAYAR.js → chunk-D7PG5D5K.js} +4 -3
- package/dist/chunk-D7PG5D5K.js.map +1 -0
- package/dist/chunk-DDCIXXOO.js +9 -0
- package/dist/chunk-DDCIXXOO.js.map +1 -0
- package/dist/chunk-DDCYVIVV.cjs +44 -0
- package/dist/chunk-DDCYVIVV.cjs.map +1 -0
- package/dist/{chunk-XPCZADMT.cjs → chunk-DOVMTPKE.cjs} +89 -27
- package/dist/chunk-DOVMTPKE.cjs.map +1 -0
- package/dist/{chunk-5PNMDJ7J.js → chunk-DPNA466P.js} +14 -9
- package/dist/chunk-DPNA466P.js.map +1 -0
- package/dist/{chunk-BYPOGQWK.js → chunk-DRACN6XG.js} +6 -4
- package/dist/chunk-DRACN6XG.js.map +1 -0
- package/dist/chunk-E6TXEISH.cjs +175 -0
- package/dist/chunk-E6TXEISH.cjs.map +1 -0
- package/dist/{chunk-TKT2XHED.js → chunk-E6YZRKMM.js} +13 -12
- package/dist/chunk-E6YZRKMM.js.map +1 -0
- package/dist/{chunk-3C2RYI6L.cjs → chunk-EOJFGECD.cjs} +11 -11
- package/dist/chunk-EOJFGECD.cjs.map +1 -0
- package/dist/{chunk-XWV4JT34.js → chunk-ERZ4QPQX.js} +27 -22
- package/dist/chunk-ERZ4QPQX.js.map +1 -0
- package/dist/{chunk-DFVLCOP6.js → chunk-EZH7FNUS.js} +3 -3
- package/dist/{chunk-DFVLCOP6.js.map → chunk-EZH7FNUS.js.map} +1 -1
- package/dist/{chunk-WWFHO375.cjs → chunk-FJMPR3OH.cjs} +4 -3
- package/dist/chunk-FJMPR3OH.cjs.map +1 -0
- package/dist/chunk-FMNUSGZ4.cjs +12 -0
- package/dist/chunk-FMNUSGZ4.cjs.map +1 -0
- package/dist/{chunk-K3Q3LJY3.js → chunk-G32AO634.js} +201 -100
- package/dist/chunk-G32AO634.js.map +1 -0
- package/dist/{chunk-EXU3RASM.js → chunk-G3CSQLLT.js} +20 -474
- package/dist/chunk-G3CSQLLT.js.map +1 -0
- package/dist/chunk-GNPGGLAE.cjs +212 -0
- package/dist/chunk-GNPGGLAE.cjs.map +1 -0
- package/dist/{chunk-QARBLBXT.cjs → chunk-GUUWKPTK.cjs} +7 -7
- package/dist/{chunk-QARBLBXT.cjs.map → chunk-GUUWKPTK.cjs.map} +1 -1
- package/dist/chunk-GYA4JRP5.js +31 -0
- package/dist/chunk-GYA4JRP5.js.map +1 -0
- package/dist/chunk-I6FX7AAG.js +39 -0
- package/dist/chunk-I6FX7AAG.js.map +1 -0
- package/dist/chunk-IMQKXL4E.cjs +12 -0
- package/dist/{chunk-QSXTWU4U.cjs.map → chunk-IMQKXL4E.cjs.map} +1 -1
- package/dist/chunk-J6IJARLG.js +94 -0
- package/dist/chunk-J6IJARLG.js.map +1 -0
- package/dist/{chunk-W63OVYY4.js → chunk-K34OPSJK.js} +3 -3
- package/dist/{chunk-W63OVYY4.js.map → chunk-K34OPSJK.js.map} +1 -1
- package/dist/{chunk-TGOMW4MB.cjs → chunk-KCLZHYPU.cjs} +110 -109
- package/dist/chunk-KCLZHYPU.cjs.map +1 -0
- package/dist/{chunk-XGPUQ56G.js → chunk-KFLXWVUJ.js} +4 -38
- package/dist/chunk-KFLXWVUJ.js.map +1 -0
- package/dist/{chunk-3DS7Z4T4.cjs → chunk-LZ3TVJY4.cjs} +44 -43
- package/dist/chunk-LZ3TVJY4.cjs.map +1 -0
- package/dist/{chunk-UXLSNRYL.js → chunk-MTNEGGM2.js} +4 -4
- package/dist/chunk-MTNEGGM2.js.map +1 -0
- package/dist/{chunk-IP3CGGPA.cjs → chunk-N2V3HJFV.cjs} +92 -185
- package/dist/chunk-N2V3HJFV.cjs.map +1 -0
- package/dist/chunk-NAUA4PW5.cjs +28 -0
- package/dist/chunk-NAUA4PW5.cjs.map +1 -0
- package/dist/chunk-NMQ6C6TS.cjs +61 -0
- package/dist/chunk-NMQ6C6TS.cjs.map +1 -0
- package/dist/{chunk-2N6EOBTH.cjs → chunk-NPWACFQJ.cjs} +58 -53
- package/dist/chunk-NPWACFQJ.cjs.map +1 -0
- package/dist/{chunk-5KEQ74YU.cjs → chunk-NT6ILURI.cjs} +9 -86
- package/dist/chunk-NT6ILURI.cjs.map +1 -0
- package/dist/chunk-NU23DUSJ.cjs +192 -0
- package/dist/chunk-NU23DUSJ.cjs.map +1 -0
- package/dist/{chunk-WOJMKB3N.cjs → chunk-NWYCOFEZ.cjs} +1677 -308
- package/dist/chunk-NWYCOFEZ.cjs.map +1 -0
- package/dist/{chunk-3GH67G4Z.cjs → chunk-O5H62ZWJ.cjs} +4 -42
- package/dist/chunk-O5H62ZWJ.cjs.map +1 -0
- package/dist/{chunk-3SLPDKHQ.js → chunk-PH4IJ3V5.js} +5 -77
- package/dist/chunk-PH4IJ3V5.js.map +1 -0
- package/dist/chunk-PWXGB77L.cjs +56 -0
- package/dist/chunk-PWXGB77L.cjs.map +1 -0
- package/dist/chunk-PZHC5GCD.js +193 -0
- package/dist/chunk-PZHC5GCD.js.map +1 -0
- package/dist/chunk-QMQLUA66.js +12 -0
- package/dist/chunk-QMQLUA66.js.map +1 -0
- package/dist/{chunk-5WWVZMVX.js → chunk-QZ7A6HBM.js} +2 -2
- package/dist/{chunk-5WWVZMVX.js.map → chunk-QZ7A6HBM.js.map} +1 -1
- package/dist/{chunk-VKGKDOKR.js → chunk-RQPRCEIO.js} +1539 -206
- package/dist/chunk-RQPRCEIO.js.map +1 -0
- package/dist/chunk-RW24SAHI.cjs +74 -0
- package/dist/chunk-RW24SAHI.cjs.map +1 -0
- package/dist/{chunk-BVRDGYXQ.cjs → chunk-SAFZ6JTI.cjs} +14 -9
- package/dist/chunk-SAFZ6JTI.cjs.map +1 -0
- package/dist/{chunk-L7HQ2OSI.js → chunk-SCTZRFW5.js} +87 -166
- package/dist/chunk-SCTZRFW5.js.map +1 -0
- package/dist/{chunk-5KPNWT6X.js → chunk-SDHV2MWU.js} +24 -45
- package/dist/chunk-SDHV2MWU.js.map +1 -0
- package/dist/chunk-SVJ5GEXW.cjs +45 -0
- package/dist/chunk-SVJ5GEXW.cjs.map +1 -0
- package/dist/chunk-SVUKGWSN.cjs +102 -0
- package/dist/chunk-SVUKGWSN.cjs.map +1 -0
- package/dist/chunk-TAUGGLNQ.js +59 -0
- package/dist/chunk-TAUGGLNQ.js.map +1 -0
- package/dist/{chunk-UV3WP5WZ.js → chunk-TE5ZA4VX.js} +55 -27
- package/dist/chunk-TE5ZA4VX.js.map +1 -0
- package/dist/{chunk-A42GCBGX.cjs → chunk-TRF4EBJT.cjs} +6 -4
- package/dist/chunk-TRF4EBJT.cjs.map +1 -0
- package/dist/{chunk-KQJ54OG5.js → chunk-U4JDJKPD.js} +19 -56
- package/dist/chunk-U4JDJKPD.js.map +1 -0
- package/dist/chunk-UH2USOMG.cjs +627 -0
- package/dist/chunk-UH2USOMG.cjs.map +1 -0
- package/dist/{chunk-RCVLFTCT.js → chunk-UPXDVI3T.js} +13 -12
- package/dist/chunk-UPXDVI3T.js.map +1 -0
- package/dist/{chunk-5VQM6VWP.cjs → chunk-UWG5GX6E.cjs} +2 -2
- package/dist/{chunk-5VQM6VWP.cjs.map → chunk-UWG5GX6E.cjs.map} +1 -1
- package/dist/{chunk-3RWZPJKV.js → chunk-VBH7ZXSZ.js} +21 -78
- package/dist/chunk-VBH7ZXSZ.js.map +1 -0
- package/dist/{chunk-K5UBVGJN.js → chunk-VDYA2HMS.js} +6 -6
- package/dist/{chunk-K5UBVGJN.js.map → chunk-VDYA2HMS.js.map} +1 -1
- package/dist/chunk-X4PVHAZ6.cjs +83 -0
- package/dist/chunk-X4PVHAZ6.cjs.map +1 -0
- package/dist/{chunk-UYQMBBWJ.js → chunk-X6CNEA32.js} +23 -20
- package/dist/chunk-X6CNEA32.js.map +1 -0
- package/dist/chunk-X6RDQ5NB.cjs +335 -0
- package/dist/chunk-X6RDQ5NB.cjs.map +1 -0
- package/dist/chunk-XD6X7O5R.js +184 -0
- package/dist/chunk-XD6X7O5R.js.map +1 -0
- package/dist/{chunk-DIQ3AV5W.cjs → chunk-XFY73JWD.cjs} +324 -224
- package/dist/chunk-XFY73JWD.cjs.map +1 -0
- package/dist/{chunk-DEFQM7JU.cjs → chunk-XRU7V7FF.cjs} +7 -7
- package/dist/{chunk-DEFQM7JU.cjs.map → chunk-XRU7V7FF.cjs.map} +1 -1
- package/dist/{chunk-TPF25IG6.js → chunk-XZA3Y4YH.js} +3 -3
- package/dist/{chunk-TPF25IG6.js.map → chunk-XZA3Y4YH.js.map} +1 -1
- package/dist/chunk-Y7M44XEK.js +462 -0
- package/dist/chunk-Y7M44XEK.js.map +1 -0
- package/dist/{chunk-RRSNR3TP.js → chunk-YIRLBUNN.js} +3 -3
- package/dist/{chunk-RRSNR3TP.js.map → chunk-YIRLBUNN.js.map} +1 -1
- package/dist/{chunk-IXGYRP2P.js → chunk-YJDSPA5E.js} +79 -49
- package/dist/chunk-YJDSPA5E.js.map +1 -0
- package/dist/{chunk-EJYMTO3K.cjs → chunk-YLINFV7Z.cjs} +144 -116
- package/dist/chunk-YLINFV7Z.cjs.map +1 -0
- package/dist/{chunk-QERAIDRJ.js → chunk-Z2PPIVOO.js} +82 -22
- package/dist/chunk-Z2PPIVOO.js.map +1 -0
- package/dist/chunk-Z5QHVL5U.cjs +12 -0
- package/dist/chunk-Z5QHVL5U.cjs.map +1 -0
- package/dist/chunk-ZDH3DX3C.cjs +30 -0
- package/dist/chunk-ZDH3DX3C.cjs.map +1 -0
- package/dist/chunk-ZE6NVENI.js +77 -0
- package/dist/chunk-ZE6NVENI.js.map +1 -0
- package/dist/chunk-ZHX4KEM7.cjs +49 -0
- package/dist/chunk-ZHX4KEM7.cjs.map +1 -0
- package/dist/chunk-ZKZAIX42.cjs +479 -0
- package/dist/chunk-ZKZAIX42.cjs.map +1 -0
- package/dist/{chunk-TEDRJXOG.cjs → chunk-ZY4GXIVN.cjs} +5 -5
- package/dist/{chunk-TEDRJXOG.cjs.map → chunk-ZY4GXIVN.cjs.map} +1 -1
- package/dist/core/index.cjs +117 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +225 -0
- package/dist/core/index.d.ts +225 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/{ddl-CS0KUVwB.d.ts → ddl-Dx3Z0_WC.d.ts} +3 -3
- package/dist/{ddl-BD-ZfKeX.d.cts → ddl-J6sDyABg.d.cts} +3 -3
- package/dist/define-graph-CzEvA_8F.d.cts +174 -0
- package/dist/define-graph-DRo9xpYN.d.ts +174 -0
- package/dist/{extension-types-BM2ACfYO.d.cts → extension-types-BLEVH4SG.d.cts} +1 -1
- package/dist/{extension-types-BM2ACfYO.d.ts → extension-types-BLEVH4SG.d.ts} +1 -1
- package/dist/graph-extension/index.cjs +21 -19
- package/dist/graph-extension/index.d.cts +4 -4
- package/dist/graph-extension/index.d.ts +4 -4
- package/dist/graph-extension/index.js +6 -4
- package/dist/graph-merge/index.cjs +265 -214
- package/dist/graph-merge/index.cjs.map +1 -1
- package/dist/graph-merge/index.d.cts +8 -89
- package/dist/graph-merge/index.d.ts +8 -89
- package/dist/graph-merge/index.js +141 -90
- package/dist/graph-merge/index.js.map +1 -1
- package/dist/{index-BeacbPoe.d.ts → index-BD_3TCgh.d.ts} +6 -4
- package/dist/{index-BPM59vsg.d.cts → index-BihFPsPu.d.cts} +6 -4
- package/dist/{fulltext-strategy-C27vXaeB.d.cts → index-Bq7vSPHy.d.ts} +3195 -2646
- package/dist/{fulltext-strategy-DebsMrqg.d.ts → index-CrFL_ENI.d.cts} +3195 -2646
- package/dist/index.cjs +326 -315
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +59 -240
- package/dist/index.d.ts +59 -240
- package/dist/index.js +46 -79
- package/dist/index.js.map +1 -1
- package/dist/indexes/index.cjs +26 -38
- package/dist/indexes/index.d.cts +6 -41
- package/dist/indexes/index.d.ts +6 -41
- package/dist/indexes/index.js +14 -10
- package/dist/interchange/index.cjs +48 -39
- package/dist/interchange/index.cjs.map +1 -1
- package/dist/interchange/index.d.cts +7 -8
- package/dist/interchange/index.d.ts +7 -8
- package/dist/interchange/index.js +23 -14
- package/dist/interchange/index.js.map +1 -1
- package/dist/local-options-CZ1BnIoF.d.cts +29 -0
- package/dist/local-options-CZ1BnIoF.d.ts +29 -0
- package/dist/{manager-D00_NXvT.d.ts → manager-CASfhmzV.d.ts} +4 -173
- package/dist/{manager-nU1vTJLy.d.cts → manager-nCEJiYBb.d.cts} +4 -173
- package/dist/{materialize-indexes-zK2J_flP.d.ts → materialize-indexes-D4iei4Kp.d.ts} +1 -1
- package/dist/{materialize-indexes-CuR3gAZb.d.cts → materialize-indexes-ExQ6OrAh.d.cts} +1 -1
- package/dist/{postgres-IaBA4RgE.d.ts → postgres-Cl1ZAN1G.d.ts} +1 -1
- package/dist/{postgres-YrYmPlaU.d.cts → postgres-DMgIKQU-.d.cts} +1 -1
- package/dist/postgres-execution-fKW0qRiN.d.cts +14 -0
- package/dist/postgres-execution-fKW0qRiN.d.ts +14 -0
- package/dist/profiler/index.cjs +9 -8
- package/dist/profiler/index.cjs.map +1 -1
- package/dist/profiler/index.d.cts +9 -17
- package/dist/profiler/index.d.ts +9 -17
- package/dist/profiler/index.js +8 -7
- package/dist/profiler/index.js.map +1 -1
- package/dist/provenance/index.cjs +61 -55
- package/dist/provenance/index.cjs.map +1 -1
- package/dist/provenance/index.d.cts +7 -8
- package/dist/provenance/index.d.ts +7 -8
- package/dist/provenance/index.js +34 -28
- package/dist/provenance/index.js.map +1 -1
- package/dist/schema/index.cjs +46 -37
- package/dist/schema/index.cjs.map +1 -1
- package/dist/schema/index.d.cts +8 -10
- package/dist/schema/index.d.ts +8 -10
- package/dist/schema/index.js +22 -13
- package/dist/schema/index.js.map +1 -1
- package/dist/{sqlite-BUOHPx7p.d.ts → sqlite-BDkW39aa.d.cts} +1 -1
- package/dist/{sqlite-Pp8O19WE.d.cts → sqlite-CYfhvESj.d.ts} +1 -1
- package/dist/sqlite-execution-DwbE2a9y.d.cts +32 -0
- package/dist/sqlite-execution-DwbE2a9y.d.ts +32 -0
- package/dist/{store-view-X96Rd00T.d.cts → store-view-BoHqdHjB.d.cts} +394 -1393
- package/dist/{store-view-ANL6mTph.d.ts → store-view-Ctq-3OHy.d.ts} +394 -1393
- package/dist/temporal-BC_NQV5Y.d.cts +281 -0
- package/dist/temporal-DqtOEo_B.d.ts +281 -0
- package/dist/{types-r-Zyq2Hz.d.cts → types-COq3-vMC.d.cts} +2 -2
- package/dist/{types-wsvuBgPK.d.ts → types-CUevi_D1.d.ts} +2 -2
- package/dist/{where-CJOpJj3a.d.ts → where-BdE_cYtx.d.ts} +5 -5
- package/dist/{where-K3uBP33l.d.cts → where-C92TXCzT.d.cts} +5 -5
- package/package.json +37 -6
- package/dist/chunk-27SSDCEP.cjs.map +0 -1
- package/dist/chunk-2N6EOBTH.cjs.map +0 -1
- package/dist/chunk-3C2RYI6L.cjs.map +0 -1
- package/dist/chunk-3DS7Z4T4.cjs.map +0 -1
- package/dist/chunk-3GH67G4Z.cjs.map +0 -1
- package/dist/chunk-3RWZPJKV.js.map +0 -1
- package/dist/chunk-3SLPDKHQ.js.map +0 -1
- package/dist/chunk-3XXGYU62.cjs.map +0 -1
- package/dist/chunk-44TA22QT.js +0 -1478
- package/dist/chunk-44TA22QT.js.map +0 -1
- package/dist/chunk-5AVRFNP4.cjs.map +0 -1
- package/dist/chunk-5KEQ74YU.cjs.map +0 -1
- package/dist/chunk-5KPNWT6X.js.map +0 -1
- package/dist/chunk-5PNMDJ7J.js.map +0 -1
- package/dist/chunk-6EEO3OVU.cjs.map +0 -1
- package/dist/chunk-7YSP4V4R.cjs +0 -69
- package/dist/chunk-7YSP4V4R.cjs.map +0 -1
- package/dist/chunk-A42GCBGX.cjs.map +0 -1
- package/dist/chunk-BVRDGYXQ.cjs.map +0 -1
- package/dist/chunk-BYPOGQWK.js.map +0 -1
- package/dist/chunk-CUHM5CWJ.cjs +0 -12
- package/dist/chunk-CUHM5CWJ.cjs.map +0 -1
- package/dist/chunk-DIQ3AV5W.cjs.map +0 -1
- package/dist/chunk-EJYMTO3K.cjs.map +0 -1
- package/dist/chunk-EXU3RASM.js.map +0 -1
- package/dist/chunk-GA4TT3DH.js.map +0 -1
- package/dist/chunk-IP3CGGPA.cjs.map +0 -1
- package/dist/chunk-IPSVVTWT.cjs +0 -1540
- package/dist/chunk-IPSVVTWT.cjs.map +0 -1
- package/dist/chunk-IXGYRP2P.js.map +0 -1
- package/dist/chunk-K3Q3LJY3.js.map +0 -1
- package/dist/chunk-KQJ54OG5.js.map +0 -1
- package/dist/chunk-L7HQ2OSI.js.map +0 -1
- package/dist/chunk-M6VES7V6.js +0 -239
- package/dist/chunk-M6VES7V6.js.map +0 -1
- package/dist/chunk-NUIG3BCV.cjs.map +0 -1
- package/dist/chunk-NXQFATMF.cjs.map +0 -1
- package/dist/chunk-OHMP6N2J.js +0 -47
- package/dist/chunk-OHMP6N2J.js.map +0 -1
- package/dist/chunk-QERAIDRJ.js.map +0 -1
- package/dist/chunk-QSXTWU4U.cjs +0 -12
- package/dist/chunk-RCVLFTCT.js.map +0 -1
- package/dist/chunk-TGOMW4MB.cjs.map +0 -1
- package/dist/chunk-TKT2XHED.js.map +0 -1
- package/dist/chunk-UGZUAYAR.js.map +0 -1
- package/dist/chunk-UV3WP5WZ.js.map +0 -1
- package/dist/chunk-UXLSNRYL.js.map +0 -1
- package/dist/chunk-UYQMBBWJ.js.map +0 -1
- package/dist/chunk-VKGKDOKR.js.map +0 -1
- package/dist/chunk-VL2V6PEN.cjs +0 -261
- package/dist/chunk-VL2V6PEN.cjs.map +0 -1
- package/dist/chunk-WOJMKB3N.cjs.map +0 -1
- package/dist/chunk-WWFHO375.cjs.map +0 -1
- package/dist/chunk-XGPUQ56G.js.map +0 -1
- package/dist/chunk-XGU7DZDA.cjs +0 -1095
- package/dist/chunk-XGU7DZDA.cjs.map +0 -1
- package/dist/chunk-XPCZADMT.cjs.map +0 -1
- package/dist/chunk-XWV4JT34.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ontology/closures.ts","../src/graph-extension/errors.ts","../src/utils/result.ts","../src/graph-extension/extension-types.ts","../src/graph-extension/validation.ts"],"names":["index"],"mappings":"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","file":"chunk-SCTZRFW5.js","sourcesContent":["/**\n * Transitive closure computation for ontology relationships.\n *\n * Uses Warshall's algorithm for efficient closure computation.\n */\n\n/**\n * Computes the transitive closure of a set of directed relations.\n *\n * Given relations like [A→B, B→C], computes all transitive paths [A→B, A→C, B→C].\n *\n * @param relations - Array of [from, to] pairs representing direct relationships\n * @returns Map from each 'from' to the set of all reachable 'to' values\n */\nexport function computeTransitiveClosure(\n relations: readonly (readonly [string, string])[],\n): ReadonlyMap<string, ReadonlySet<string>> {\n // Build mutable map for computation\n const closure = new Map<string, Set<string>>();\n\n // Collect all nodes\n const allNodes = new Set<string>();\n for (const [from, to] of relations) {\n allNodes.add(from);\n allNodes.add(to);\n }\n\n // Initialize empty sets for all nodes\n for (const node of allNodes) {\n closure.set(node, new Set());\n }\n\n // Add direct relationships\n for (const [from, to] of relations) {\n closure.get(from)?.add(to);\n }\n\n // Warshall's algorithm for transitive closure\n // For each intermediate node k, check if i→k and k→j implies i→j\n for (const k of allNodes) {\n for (const index of allNodes) {\n const indexReaches = closure.get(index);\n if (!indexReaches?.has(k)) continue;\n\n const kReaches = closure.get(k);\n if (!kReaches) continue;\n\n for (const index of kReaches) {\n indexReaches.add(index);\n }\n }\n }\n\n return closure;\n}\n\n/**\n * Computes the inverse of a transitive closure map.\n *\n * Given A→{B, C}, returns B→{A}, C→{A}.\n */\nexport function invertClosure(\n closure: ReadonlyMap<string, ReadonlySet<string>>,\n): ReadonlyMap<string, ReadonlySet<string>> {\n const result = new Map<string, Set<string>>();\n\n for (const [from, tos] of closure) {\n for (const to of tos) {\n const existing = result.get(to) ?? new Set();\n existing.add(from);\n result.set(to, existing);\n }\n }\n\n return result;\n}\n\n/**\n * Checks if there's a path from source to target in the closure.\n */\nexport function isReachable(\n closure: ReadonlyMap<string, ReadonlySet<string>>,\n source: string,\n target: string,\n): boolean {\n return closure.get(source)?.has(target) ?? false;\n}\n","/**\n * Errors raised across the graph-extension surface.\n *\n * Two flavours:\n *\n * - **Validation issues** (`GraphExtensionValidationError` +\n * `GraphExtensionIssue` / `GraphExtensionIssueCode`) — produced by\n * `validateGraphExtension`. The issue list batches every failure\n * with a JSON-pointer `path` so a UI can highlight every offending\n * field at once.\n * - **Operation errors** (every other class in this file, all extending\n * `GraphExtensionError`) — thrown one at a time from `evolve`,\n * `removeKinds`, `materializeIndexes`, search, etc. Each carries a\n * stable string `code` for logging / serialization PLUS a typed\n * shape so consumers can `instanceof` for control flow.\n */\nimport type { KindEntity } from \"../core/types\";\nimport { type ErrorCategory, TypeGraphError } from \"../errors\";\n\n// ============================================================\n// Validation issues (multi-issue batch)\n// ============================================================\n\n/**\n * One specific issue raised during graph-extension validation.\n */\nexport type GraphExtensionIssue = Readonly<{\n /**\n * JSON-pointer path to the offending value, rooted at the document\n * (e.g. `/nodes/Paper/properties/title/pattern`). The empty string\n * `\"\"` means \"the document itself\".\n */\n path: string;\n /** Human-readable explanation of the failure. */\n message: string;\n /**\n * Stable machine-readable code so callers (and tests) can branch on\n * specific failure modes without parsing messages. New codes are\n * additive.\n */\n code: GraphExtensionIssueCode;\n}>;\n\n/**\n * Stable machine codes for every validation failure produced by the\n * document validator. New codes are additive — existing codes never\n * change meaning.\n *\n * Note: codes here describe per-field validation problems. Operation-\n * level errors (kind not found, version mismatch on persisted doc,\n * compile-time-kind removal, etc.) surface as typed Error subclasses\n * exported below — not as issue codes.\n */\n/**\n * Every issue code emitted by `validateGraphExtension`. Const-array form\n * so tests, codegen, and runtime introspection can iterate the full set\n * without restating it.\n */\nexport const GRAPH_EXTENSION_ISSUE_CODES = [\n \"UNSUPPORTED_PROPERTY_TYPE\",\n \"INVALID_PROPERTY_REFINEMENT\",\n \"NESTED_ARRAY\",\n \"NESTED_OBJECT_TOO_DEEP\",\n \"INVALID_MODIFIER_TARGET\",\n \"INVALID_ENUM_VALUES\",\n \"INVALID_NUMBER_BOUNDS\",\n \"INVALID_LENGTH_BOUNDS\",\n \"INVALID_PATTERN\",\n \"INVALID_EMBEDDING_DIMENSIONS\",\n \"INVALID_SEARCHABLE_LANGUAGE\",\n \"RESERVED_PROPERTY_NAME\",\n \"INVALID_KIND_NAME\",\n \"DUPLICATE_KIND_NAME\",\n \"EMPTY_PROPERTIES\",\n \"EMPTY_FROM_OR_TO\",\n \"DUPLICATE_UNIQUE_CONSTRAINT\",\n \"EMPTY_UNIQUE_FIELDS\",\n \"DUPLICATE_UNIQUE_FIELD\",\n \"UNKNOWN_UNIQUE_FIELD\",\n \"INVALID_UNIQUE_WHERE_OP\",\n \"UNKNOWN_UNIQUE_WHERE_FIELD\",\n \"INVALID_ANNOTATION\",\n \"UNKNOWN_META_EDGE\",\n \"ONTOLOGY_CYCLE\",\n \"ONTOLOGY_SELF_LOOP\",\n \"ONTOLOGY_DISJOINT_CONFLICT\",\n \"DUPLICATE_ONTOLOGY_RELATION\",\n \"INVALID_DOCUMENT_SHAPE\",\n \"UNKNOWN_DOCUMENT_KEY\",\n \"UNSUPPORTED_STRING_FORMAT\",\n \"INVALID_INDEX_DECLARATION\",\n \"DUPLICATE_INDEX_NAME\",\n \"EMPTY_INDEX_FIELDS\",\n \"UNKNOWN_PROPERTY_KEY\",\n] as const;\n\nexport type GraphExtensionIssueCode =\n (typeof GRAPH_EXTENSION_ISSUE_CODES)[number];\n\n// ============================================================\n// Operation errors (typed, single-error throws)\n// ============================================================\n\n/**\n * Base class for every graph-extension error. Consumers can catch\n * the family with one `instanceof GraphExtensionError` check and\n * branch on the concrete subclass beneath. Carries the same\n * `code` / `category` / `details` slots as `TypeGraphError` so existing\n * `isTypeGraphError` / `isUserRecoverable` helpers continue to apply.\n */\nexport abstract class GraphExtensionError extends TypeGraphError {\n // The concrete `code` is set as a literal-typed property on each\n // subclass so consumers can branch on it with full type narrowing.\n declare readonly code: string;\n\n protected constructor(spec: {\n message: string;\n code: string;\n details: Readonly<Record<string, unknown>>;\n suggestion: string;\n category?: ErrorCategory;\n cause?: unknown;\n }) {\n super(spec.message, spec.code, {\n details: spec.details,\n category: spec.category ?? \"user\",\n suggestion: spec.suggestion,\n ...(spec.cause === undefined ? {} : { cause: spec.cause }),\n });\n // `new.target.name` resolves to the concrete subclass at construction\n // time, eliminating per-subclass `this.name = \"ClassName\"` repetition.\n this.name = new.target.name;\n }\n}\n\n/**\n * Thrown when `validateGraphExtension` (or `defineGraphExtension`)\n * rejects an input document for one or more shape/content reasons.\n *\n * The `issues` array carries every failure with a JSON-pointer\n * `path`, so callers presenting the document to a human reviewer can\n * highlight every offending field at once.\n */\nexport class GraphExtensionValidationError extends GraphExtensionError {\n override readonly code = \"GRAPH_EXTENSION_INVALID\" as const;\n readonly issues: readonly GraphExtensionIssue[];\n declare readonly details: Readonly<{\n issues: readonly GraphExtensionIssue[];\n }>;\n\n constructor(issues: readonly GraphExtensionIssue[], cause?: unknown) {\n const frozenIssues = Object.freeze([...issues]);\n super({\n message: `Graph extension document is invalid (${issues.length} issue${\n issues.length === 1 ? \"\" : \"s\"\n }): ${summarizeIssues(issues)}`,\n code: \"GRAPH_EXTENSION_INVALID\",\n details: { issues: frozenIssues },\n suggestion: `Inspect error.issues for per-field paths and codes; each issue's \"path\" is a JSON pointer into the source document.`,\n cause,\n });\n this.issues = frozenIssues;\n }\n}\n\n/**\n * Generic \"first N items + overflow tail\" summary for inclusion in an\n * Error message. Shared by `summarizeIssues` and `summarizeChanges`\n * because the overflow shape is identical; only the per-item\n * formatting differs.\n */\nfunction summarizeWithOverflow<T>(\n items: readonly T[],\n formatItem: (item: T) => string,\n emptyMessage: string,\n): string {\n if (items.length === 0) return emptyMessage;\n const head = items\n .slice(0, 3)\n .map((item) => formatItem(item))\n .join(\"; \");\n const overflow = items.length > 3 ? ` (+${items.length - 3} more)` : \"\";\n return `${head}${overflow}`;\n}\n\nfunction summarizeIssues(issues: readonly GraphExtensionIssue[]): string {\n return summarizeWithOverflow(\n issues,\n (issue) => `${issue.path || \"(root)\"} — ${issue.message}`,\n \"no specific issues recorded\",\n );\n}\n\n/**\n * Thrown when an extension declares a kind whose name collides with an\n * existing compile-time kind. The graph-extension contract is\n * additive: graph-extension-declared kinds cannot shadow compile-time kinds.\n */\nexport class KindCollisionError extends GraphExtensionError {\n override readonly code = \"KIND_COLLISION\" as const;\n readonly kindName: string;\n readonly entity: KindEntity;\n\n constructor(kindName: string, entity: KindEntity, graphId: string) {\n super({\n message: `Graph extension declares ${entity} kind \"${kindName}\" which already exists as a compile-time kind on graph \"${graphId}\". Graph-extension-declared kinds cannot collide with compile-time kinds.`,\n code: \"KIND_COLLISION\",\n details: { kindName, entity, graphId },\n suggestion:\n \"Pick a different graph-extension-declared kind name, or remove the compile-time declaration.\",\n });\n this.kindName = kindName;\n this.entity = entity;\n }\n}\n\n/**\n * One classified delta in a `IncompatibleChangeError`.\n *\n * `field` is `undefined` for kind-level changes (e.g. tightening edge\n * endpoints, adding a unique constraint to a populated kind). `detail`\n * is human-readable and intended for surfaces showing the change to a\n * reviewer (e.g. `\"minLength: 5 → 10\"`).\n */\n/**\n * Every incompatible-change classification produced by `evolve`'s\n * delta classifier. Const-array form so tests and reviewer UIs can\n * enumerate the set without restating it.\n */\nexport const INCOMPATIBLE_CHANGE_TYPES = [\n \"REMOVE_PROPERTY\",\n \"ADD_REQUIRED_PROPERTY\",\n \"TIGHTEN_OPTIONALITY\",\n \"TIGHTEN_CONSTRAINT\",\n \"ADD_PATTERN\",\n \"CHANGE_PATTERN\",\n \"ADD_FORMAT\",\n \"CHANGE_FORMAT\",\n \"TIGHTEN_INT\",\n \"TIGHTEN_ENUM\",\n \"TYPE_CHANGE\",\n \"ADD_UNIQUE_ON_POPULATED\",\n \"TIGHTEN_EDGE_ENDPOINTS\",\n] as const;\n\nexport type IncompatibleChangeType = (typeof INCOMPATIBLE_CHANGE_TYPES)[number];\n\nexport type IncompatibleChange = Readonly<{\n kind: string;\n field?: string;\n type: IncompatibleChangeType;\n detail?: string;\n}>;\n\n/**\n * Thrown when `evolve` rejects one or more deltas against an existing\n * extension kind. Carries a structured `changes` list so a reviewer\n * UI can show the incompatible deltas across every affected kind in\n * one shot.\n */\nexport class IncompatibleChangeError extends GraphExtensionError {\n override readonly code = \"INCOMPATIBLE_CHANGE\" as const;\n readonly changes: readonly IncompatibleChange[];\n\n constructor(changes: readonly IncompatibleChange[], graphId: string) {\n const frozenChanges = Object.freeze([...changes]);\n super({\n message: `Graph extension contains ${changes.length} incompatible change${\n changes.length === 1 ? \"\" : \"s\"\n } against existing graph-extension kinds on graph \"${graphId}\": ${summarizeChanges(changes)}`,\n code: \"INCOMPATIBLE_CHANGE\",\n details: { graphId, changes: frozenChanges },\n suggestion:\n \"Inspect error.changes for the per-field rejections. Compatible options: change the modification to an additive one (e.g. `optional: true`), or apply the change against an empty kind.\",\n });\n this.changes = frozenChanges;\n }\n}\n\nfunction summarizeChanges(changes: readonly IncompatibleChange[]): string {\n return summarizeWithOverflow(\n changes,\n (change) => {\n const field = change.field === undefined ? \"\" : `.${change.field}`;\n const detail = change.detail === undefined ? \"\" : ` (${change.detail})`;\n return `${change.kind}${field}: ${change.type}${detail}`;\n },\n \"(no specific changes recorded)\",\n );\n}\n\n/**\n * Thrown when an extension's edge or ontology endpoint references a\n * kind that exists in neither the extension nor the host graph.\n * Distinct from `KindNotFoundError` because the cause is a\n * stale persisted extension (a compile-time kind was removed from\n * source after the extension was committed) rather than a\n * call-site typo.\n */\nexport class GraphExtensionUnresolvedEndpointError extends GraphExtensionError {\n override readonly code = \"GRAPH_EXTENSION_UNRESOLVED_ENDPOINT\" as const;\n readonly edgeKind: string;\n readonly side: \"from\" | \"to\";\n readonly endpoint: string;\n\n constructor(\n edgeKind: string,\n side: \"from\" | \"to\",\n endpoint: string,\n graphId: string,\n ) {\n super({\n message: `Graph-extension edge \"${edgeKind}\" ${side}-endpoint \"${endpoint}\" does not resolve to any kind on graph \"${graphId}\". The compile-time kind may have been removed since the extension was committed.`,\n code: \"GRAPH_EXTENSION_UNRESOLVED_ENDPOINT\",\n details: { edgeKind, side, endpoint, graphId },\n suggestion:\n \"Restore the compile-time kind, or remove the graph-extension-declared kind via store.removeKinds before redeploying without it.\",\n });\n this.edgeKind = edgeKind;\n this.side = side;\n this.endpoint = endpoint;\n }\n}\n\n/**\n * Thrown by `removeKinds` when the removal list contains a compile-\n * time kind. Compile-time kinds are removed by recompiling and\n * redeploying — persisting \"removed-compile-time-kind\" state in\n * `schema_doc` is incoherent because the kind would resurrect on the\n * next deploy.\n */\nexport class RemoveCompileTimeKindError extends GraphExtensionError {\n override readonly code = \"REMOVE_COMPILE_TIME_KIND\" as const;\n readonly kindName: string;\n readonly entity: KindEntity;\n\n constructor(kindName: string, entity: KindEntity, graphId: string) {\n super({\n message: `Cannot remove compile-time ${entity} kind \"${kindName}\" via store.removeKinds. Compile-time kinds are removed by recompiling and redeploying without them on graph \"${graphId}\".`,\n code: \"REMOVE_COMPILE_TIME_KIND\",\n details: { kindName, entity, graphId },\n suggestion:\n \"Drop the kind from your defineGraph call and redeploy. Only graph-extension kinds (added via store.evolve) are removable through removeKinds.\",\n });\n this.kindName = kindName;\n this.entity = entity;\n }\n}\n\n/**\n * Thrown by `removeKinds` when a compile-time edge or ontology\n * relation references the graph-extension kind being removed. Removing the\n * kind would orphan compile-time references — incoherent at the next\n * deploy.\n */\nexport class KindHasReferentsError extends GraphExtensionError {\n override readonly code = \"KIND_HAS_REFERENTS\" as const;\n readonly kindName: string;\n readonly referents: readonly KindReferent[];\n\n constructor(\n kindName: string,\n referents: readonly KindReferent[],\n graphId: string,\n ) {\n const summary = referents\n .map((referent) => `${referent.type}:${referent.name}`)\n .join(\", \");\n const frozenReferents = Object.freeze([...referents]);\n super({\n message: `Cannot remove graph-extension kind \"${kindName}\" on graph \"${graphId}\" — it is referenced by compile-time declarations: ${summary}.`,\n code: \"KIND_HAS_REFERENTS\",\n details: { kindName, graphId, referents: frozenReferents },\n suggestion:\n \"Remove the compile-time references first (drop the edge or ontology relation from defineGraph), or pick a different kind to remove.\",\n });\n this.kindName = kindName;\n this.referents = frozenReferents;\n }\n}\n\nexport type KindReferent = Readonly<{\n type: \"compile-time-edge\" | \"compile-time-ontology\";\n name: string;\n}>;\n\n/**\n * Thrown when a persisted graph extension was authored against a\n * higher major version of the graph-extension format than the\n * current library supports. The library refuses to load it rather\n * than risk silently misreading newer fields.\n */\nexport class GraphExtensionVersionUnsupportedError extends GraphExtensionError {\n override readonly code = \"GRAPH_EXTENSION_VERSION_UNSUPPORTED\" as const;\n readonly persistedVersion: number;\n readonly currentVersion: number;\n\n constructor(persistedVersion: number, currentVersion: number) {\n super({\n message: `Persisted extension was authored against graph-extension format v${persistedVersion}, but this library only supports up to v${currentVersion}. Upgrade @nicia-ai/typegraph.`,\n code: \"GRAPH_EXTENSION_VERSION_UNSUPPORTED\",\n details: { persistedVersion, currentVersion },\n category: \"system\",\n suggestion: `Upgrade @nicia-ai/typegraph to a version that supports graph-extension format v${persistedVersion}, or downgrade the writer.`,\n });\n this.persistedVersion = persistedVersion;\n this.currentVersion = currentVersion;\n }\n}\n","/**\n * Result type for error handling without exceptions.\n * Use at service boundaries and for operations that can fail.\n */\nexport type Result<T, E = Error> =\n Readonly<{ success: true; data: T }> | Readonly<{ success: false; error: E }>;\n\n/**\n * Creates a successful result.\n */\nexport function ok<T = undefined>(data?: T): Result<T, never> {\n return { success: true, data: data as T };\n}\n\n/**\n * Creates a failed result.\n */\nexport function err<E>(error: E): Result<never, E> {\n return { success: false, error };\n}\n\n/**\n * Unwraps a result, throwing if it's an error.\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.success) {\n return result.data;\n }\n throw result.error;\n}\n\n/**\n * Unwraps a result or returns a default value.\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.success) {\n return result.data;\n }\n return defaultValue;\n}\n\n/**\n * Type guard to check if result is successful.\n *\n * Narrows to the `Readonly<{...}>` success arm so that an early-return on the\n * negative branch (`if (isErr(x)) return; x.data`) leaves the success arm\n * reachable — the union members are themselves `Readonly`, so a mutable\n * predicate target would subtract nothing and break narrowing for callers.\n */\nexport function isOk<T, E>(\n result: Result<T, E>,\n): result is Readonly<{ success: true; data: T }> {\n return result.success;\n}\n\n/**\n * Type guard to check if result is an error. See {@link isOk} for why the\n * predicate narrows to the `Readonly<{...}>` arm.\n */\nexport function isErr<T, E>(\n result: Result<T, E>,\n): result is Readonly<{ success: false; error: E }> {\n return !result.success;\n}\n\n/**\n * Transforms the success value of a result.\n */\nexport function map<T, U, E>(\n result: Result<T, E>,\n fn: (data: T) => U,\n): Result<U, E> {\n if (result.success) return ok(fn(result.data));\n return result;\n}\n\n/**\n * Transforms the error value of a result.\n */\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F,\n): Result<T, F> {\n if (result.success) return result;\n return err(fn(result.error));\n}\n\n/**\n * Chains an operation that returns a Result on the success value.\n */\nexport function flatMap<T, U, E>(\n result: Result<T, E>,\n fn: (data: T) => Result<U, E>,\n): Result<U, E> {\n if (result.success) return fn(result.data);\n return result;\n}\n\n/**\n * Recovers from an error by producing an alternative Result.\n */\nexport function orElse<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => Result<T, F>,\n): Result<T, F> {\n if (result.success) return result;\n return fn(result.error);\n}\n","/**\n * Pure-value document format for graph extensions.\n *\n * A `GraphExtension` is a plain JSON-serializable description of\n * additional node kinds, edge kinds, and ontology relations that should\n * be merged into a graph at runtime. The document is the canonical\n * artifact: every restart re-compiles it back to the same Zod-bearing\n * `NodeType` / `EdgeType` / `OntologyRelation` shapes.\n *\n * The supported property-type subset is intentionally narrower than full\n * JSON Schema — only what compiles cleanly to Zod and what real\n * agent-induced schemas use in practice. Anything outside this set fails\n * loudly at `defineGraphExtension(...)`.\n */\nimport { type KindAnnotations, type NullCheckOp } from \"../core/types\";\nimport { type MetaEdgeName } from \"../ontology/constants\";\n\n// ============================================================\n// Property Types\n// ============================================================\n\n/**\n * Per-property modifier: tag the field as fulltext-searchable.\n *\n * Compiles to a `searchable({ language })`-wrapped Zod string when applied\n * to a `string` property. Rejected on any other property type at validation\n * time.\n */\nexport type ExtensionSearchableModifier = Readonly<{\n language?: string;\n}>;\n\n/**\n * Per-property modifier: declare a vector embedding with the given\n * dimensionality. Compiles to `embedding(dimensions)` and is only valid on\n * `array` properties whose item type is `number`. Rejected elsewhere.\n */\nexport type ExtensionEmbeddingModifier = Readonly<{\n dimensions: number;\n}>;\n\n/**\n * Modifiers shared by every graph-extension property type.\n *\n * `optional: true` flips the field from required-with-graph-extension-validation\n * to `.optional()` and removes it from the parent object's `required`\n * list. `searchable` and `embedding` only apply to specific underlying\n * types — see the per-modifier docs.\n */\nexport type ExtensionPropertyModifiers = Readonly<{\n optional?: boolean;\n searchable?: ExtensionSearchableModifier;\n embedding?: ExtensionEmbeddingModifier;\n description?: string;\n}>;\n\n/**\n * String property. Compiles to `z.string()` plus the requested refinements.\n * `format` accepts the two formats motivated by induced schemas in\n * practice — covers ISO datetimes, URIs, email addresses, UUIDs, and\n * date-only strings. Each format routes to the corresponding Zod\n * factory (`z.iso.datetime()`, `z.url()`, `z.email()`, `z.uuid()`,\n * `z.iso.date()`); other JSON-Schema formats are deliberately not\n * supported in v1.\n */\nexport type ExtensionStringProperty = Readonly<{\n type: \"string\";\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: \"datetime\" | \"uri\" | \"email\" | \"uuid\" | \"date\";\n}> &\n ExtensionPropertyModifiers;\n\n/**\n * Number property. `int: true` requires whole numbers; `min` / `max` are\n * inclusive bounds. Compiles to `z.number().int()?.min(...)?.max(...)`.\n */\nexport type ExtensionNumberProperty = Readonly<{\n type: \"number\";\n min?: number;\n max?: number;\n int?: boolean;\n}> &\n ExtensionPropertyModifiers;\n\n/**\n * Boolean property. Compiles to `z.boolean()`.\n */\nexport type ExtensionBooleanProperty = Readonly<{\n type: \"boolean\";\n}> &\n ExtensionPropertyModifiers;\n\n/**\n * Closed-set string enum. Compiles to `z.enum([...values])`. Must contain\n * at least one value; duplicate values are rejected at validation time.\n */\nexport type ExtensionEnumProperty = Readonly<{\n type: \"enum\";\n values: readonly string[];\n}> &\n ExtensionPropertyModifiers;\n\n/**\n * Array property. `items` is any of the scalar property types or an\n * object property — nested arrays are forbidden in v1. Compiles to\n * `z.array(<items>)`. The `embedding` modifier turns this into a\n * vector embedding instead of a generic array.\n */\nexport type ExtensionArrayProperty = Readonly<{\n type: \"array\";\n items: ExtensionArrayItemType;\n}> &\n ExtensionPropertyModifiers;\n\n/**\n * Element types allowed inside an array — every leaf property type plus\n * single-level object. Nesting an array inside an array is rejected at\n * validation time so the v1 surface stays a flat tree.\n */\nexport type ExtensionArrayItemType =\n | ExtensionStringProperty\n | ExtensionNumberProperty\n | ExtensionBooleanProperty\n | ExtensionEnumProperty\n | ExtensionObjectProperty;\n\n/**\n * Object property. `properties` is a single nesting level; deeper objects\n * are rejected at validation time so the v1 surface is auditable at a\n * glance.\n */\nexport type ExtensionObjectProperty = Readonly<{\n type: \"object\";\n properties: Readonly<Record<string, ExtensionObjectFieldProperty>>;\n}> &\n ExtensionPropertyModifiers;\n\n/**\n * Property types allowed inside an `object`'s `properties` — leaf scalars\n * and arrays only. Nested objects are blocked here to enforce the\n * single-nesting-level rule.\n */\nexport type ExtensionObjectFieldProperty =\n | ExtensionStringProperty\n | ExtensionNumberProperty\n | ExtensionBooleanProperty\n | ExtensionEnumProperty\n | ExtensionArrayProperty;\n\n/**\n * Top-level property descriptor for a node or edge field.\n *\n * The discriminated union covers every type in the v1 subset; arbitrary\n * `unknown` inputs are validated against this set at\n * `defineGraphExtension(...)` time.\n */\nexport type ExtensionPropertyType =\n | ExtensionStringProperty\n | ExtensionNumberProperty\n | ExtensionBooleanProperty\n | ExtensionEnumProperty\n | ExtensionArrayProperty\n | ExtensionObjectProperty;\n\n// ============================================================\n// Unique Constraints\n// ============================================================\n\n/**\n * Document-side `where` clause for a unique constraint.\n *\n * Mirrors `serializeWherePredicate`'s capability — the only operations\n * round-trippable through the persisted form are `isNull` and `isNotNull`.\n * Anything richer (equality, `in`, etc.) is rejected at validation time.\n */\nexport type ExtensionUniqueWhere = Readonly<{\n field: string;\n op: NullCheckOp;\n}>;\n\n/**\n * Unique constraint declaration. `fields` must reference declared\n * properties on the kind. Defaults match the existing `UniqueConstraint`:\n * `scope: \"kind\"`, `collation: \"binary\"`.\n */\nexport type ExtensionUniqueConstraint = Readonly<{\n name: string;\n fields: readonly string[];\n scope?: \"kind\" | \"kindWithSubClasses\";\n collation?: \"binary\" | \"caseInsensitive\";\n where?: ExtensionUniqueWhere;\n}>;\n\n// ============================================================\n// Node and Edge Documents\n// ============================================================\n\n/**\n * Graph-extension declaration of a node kind.\n *\n * Property names follow the same reserved-key rules as compile-time\n * `defineNode` (`id`, `kind`, `meta`, and the `$`-prefix accessor\n * namespace are forbidden). Annotation values must be JSON.\n */\nexport type ExtensionNodeDef = Readonly<{\n description?: string;\n annotations?: KindAnnotations;\n properties: Readonly<Record<string, ExtensionPropertyType>>;\n unique?: readonly ExtensionUniqueConstraint[];\n}>;\n\n/**\n * Graph-extension declaration of an edge kind.\n *\n * `from` / `to` reference node kind names — either kinds declared in this\n * same document or compile-time kinds the document is being merged into.\n * Endpoints that resolve to nothing within the document are flagged as\n * soft references at validation time but not rejected; the final\n * cross-graph check happens when the document is merged into a host\n * `GraphDef`.\n */\nexport type ExtensionEdgeDef = Readonly<{\n description?: string;\n annotations?: KindAnnotations;\n from: readonly string[];\n to: readonly string[];\n properties?: Readonly<Record<string, ExtensionPropertyType>>;\n}>;\n\n// ============================================================\n// Indexes (relational)\n// ============================================================\n\n/**\n * Document-level analogue of compile-time `defineNodeIndex` /\n * `defineEdgeIndex`. Mirrors `serializeWherePredicate`'s persistence-\n * round-trippable subset: only `isNull` / `isNotNull` predicates are\n * supported in v1, matching `ExtensionUniqueWhere`.\n */\nexport type ExtensionIndexWhere = Readonly<{\n field: string;\n op: NullCheckOp;\n}>;\n\n/**\n * Graph-extension-declared node index. `kind` references either a kind\n * declared in this same document or a compile-time host kind resolved\n * at merge time. `fields` and `coveringFields` are top-level property\n * names — JSON-pointer paths are not supported in v1, matching the\n * `ExtensionUniqueConstraint` v1 surface.\n */\nexport type ExtensionNodeIndex = Readonly<{\n entity: \"node\";\n kind: string;\n name?: string;\n fields: readonly string[];\n coveringFields?: readonly string[];\n unique?: boolean;\n scope?: \"graphAndKind\" | \"graph\" | \"none\";\n where?: ExtensionIndexWhere;\n}>;\n\n/**\n * Graph-extension-declared edge index. `direction` mirrors\n * `EdgeIndexDirection`; `kind` references a graph-extension or compile-time\n * edge kind.\n */\nexport type ExtensionEdgeIndex = Readonly<{\n entity: \"edge\";\n kind: string;\n name?: string;\n direction?: \"out\" | \"in\" | \"none\";\n fields: readonly string[];\n coveringFields?: readonly string[];\n unique?: boolean;\n scope?: \"graphAndKind\" | \"graph\" | \"none\";\n where?: ExtensionIndexWhere;\n}>;\n\nexport type ExtensionIndex = ExtensionNodeIndex | ExtensionEdgeIndex;\n\n// ============================================================\n// Ontology\n// ============================================================\n\n/**\n * Graph-extension ontology relation. `metaEdge` is one of the built-in\n * meta-edge names (subClassOf, broader, disjointWith, etc.).\n *\n * `from` / `to` are either node-kind names declared in this document or\n * external IRI strings. The pure-value document does not distinguish the\n * two — the compiler treats endpoints that match a declared kind as\n * `NodeType` references and falls back to passing the raw string for\n * IRIs (matching the existing `OntologyRelation` shape, where\n * `from`/`to` are `NodeType | EdgeType | string`).\n */\nexport type ExtensionOntologyRelation = Readonly<{\n metaEdge: MetaEdgeName;\n from: string;\n to: string;\n}>;\n\n// ============================================================\n// Document\n// ============================================================\n\n/**\n * Stable default major used when a stored document omits `version`.\n *\n * Pinned to `1` permanently. Pre-versioning documents (those persisted\n * before the field existed) and documents that explicitly omit\n * `version` are interpreted as `1` regardless of which major the\n * library currently supports. Splitting this from\n * `CURRENT_GRAPH_EXTENSION_VERSION` is load-bearing for future major\n * bumps: when v2 ships, `CURRENT` becomes `2` but `LEGACY` stays at\n * `1`, so a v1-era stored document still parses as v1 (and the\n * version-mismatch path can route it through a migration) rather than\n * being silently misinterpreted as v2.\n */\nexport const LEGACY_GRAPH_EXTENSION_VERSION = 1 as const;\n\n/**\n * Current major version of the `GraphExtension` format.\n *\n * Documents with a higher major version than this constant are\n * rejected with `GRAPH_EXTENSION_VERSION_UNSUPPORTED` — there is no\n * automatic downgrade path. Minor / additive changes ride forward-\n * compat via `.loose()` on every nested object schema.\n */\nexport const CURRENT_GRAPH_EXTENSION_VERSION = 1 as const;\n\n/**\n * Type of the `GraphExtension.version` field. Stays `number`\n * rather than `typeof CURRENT_GRAPH_EXTENSION_VERSION` because the\n * field can carry any major across the library version range a\n * stored document might have been written by — the\n * document-vs-supported check happens in the validator, not at the\n * type level. Pinning to the current literal would prevent a v1\n * v1 library from typing a v2 document at all, which is the wrong\n * relationship: we WANT a v1 library to receive v2 documents and\n * report `GRAPH_EXTENSION_VERSION_UNSUPPORTED` cleanly.\n */\nexport type GraphExtensionVersion = number;\n\n/**\n * The canonical pure-value graph-extension document.\n *\n * Frozen at construction. Round-trips losslessly through `JSON.stringify`\n * / `JSON.parse`; the `GraphExtension → CompiledExtension` direction\n * is provided by `compileGraphExtension(...)`. There is no\n * `Zod → GraphExtension` direction because graph-extension kinds always\n * originate as documents.\n *\n * `version` is the major-version tag for the document format. The\n * compiler accepts documents whose version is equal to the current\n * supported major (today: 1) or absent (the canonical persisted form\n * omits `version` when it equals the legacy default — see\n * `serializer.ts` — so the round-trip default is \"absent means legacy\n * major\"). Higher majors surface as\n * `GRAPH_EXTENSION_VERSION_UNSUPPORTED` so a newer-version extension\n * committed by a future writer can't be silently misread by an older\n * runtime. See `graph-extensions.md` for the format-versioning policy.\n */\nexport type GraphExtension = Readonly<{\n version?: GraphExtensionVersion;\n nodes?: Readonly<Record<string, ExtensionNodeDef>>;\n edges?: Readonly<Record<string, ExtensionEdgeDef>>;\n ontology?: readonly ExtensionOntologyRelation[];\n /**\n * Graph-extension-declared relational indexes. Each entry references a\n * node or edge kind by name — either declared in this document or\n * a compile-time host kind that the document is being merged into.\n * Vector indexes auto-derive from `embedding()` modifiers on\n * graph-extension kinds; this slot is for explicit relational indexes\n * (analogue of compile-time `defineGraph({ indexes: [...] })`).\n */\n indexes?: readonly ExtensionIndex[];\n}>;\n\n/**\n * Top-level v1 slots a `GraphExtension` document may carry. Single\n * source of truth for both the strict-authoring validator (typo rejection\n * via `defineGraphExtension`) and the persistence Zod schema (which\n * leaves the field set loose for forward compatibility but uses this\n * list to drive the Zod object shape).\n */\nexport const GRAPH_EXTENSION_TOP_LEVEL_KEYS = [\n \"version\",\n \"nodes\",\n \"edges\",\n \"ontology\",\n \"indexes\",\n] as const;\n\nexport type GraphExtensionTopLevelKey =\n (typeof GRAPH_EXTENSION_TOP_LEVEL_KEYS)[number];\n","/**\n * Pure structural validation for `GraphExtension`.\n *\n * Walks the document and accumulates every issue (no fail-fast) so a\n * caller showing the document to a human reviewer can surface all\n * problems in one round. Cross-document references — edge endpoints,\n * ontology endpoints — resolve only against this document; resolution\n * against an existing compile-time graph happens later, when the\n * document is merged into a host `GraphDef`.\n */\nimport { assertJsonValue } from \"../core/json-value\";\nimport {\n type KindAnnotations,\n type KindEntity,\n type NullCheckOp,\n} from \"../core/types\";\nimport { ConfigurationError } from \"../errors\";\nimport { computeTransitiveClosure } from \"../ontology/closures\";\nimport { ALL_META_EDGE_NAMES, type MetaEdgeName } from \"../ontology/constants\";\nimport { encodeJsonPointerSegment } from \"../query/json-pointer\";\nimport { RESERVED_EDGE_KEYS, RESERVED_NODE_KEYS } from \"../store/reserved-keys\";\nimport { compactUndefined, freezeDeep, isPlainObject } from \"../utils/object\";\nimport { err, ok, type Result } from \"../utils/result\";\nimport {\n type GraphExtensionIssue,\n type GraphExtensionIssueCode,\n GraphExtensionValidationError,\n GraphExtensionVersionUnsupportedError,\n} from \"./errors\";\nimport {\n CURRENT_GRAPH_EXTENSION_VERSION,\n type ExtensionArrayProperty,\n type ExtensionBooleanProperty,\n type ExtensionEdgeDef,\n type ExtensionEnumProperty,\n type ExtensionIndex,\n type ExtensionNodeDef,\n type ExtensionNumberProperty,\n type ExtensionObjectFieldProperty,\n type ExtensionObjectProperty,\n type ExtensionOntologyRelation,\n type ExtensionPropertyType,\n type ExtensionStringProperty,\n type ExtensionUniqueConstraint,\n GRAPH_EXTENSION_TOP_LEVEL_KEYS,\n type GraphExtension,\n type GraphExtensionVersion,\n LEGACY_GRAPH_EXTENSION_VERSION,\n} from \"./extension-types\";\n\nconst META_EDGE_NAME_SET: ReadonlySet<string> = new Set(ALL_META_EDGE_NAMES);\n\nconst SUPPORTED_PROPERTY_TYPES = new Set([\n \"string\",\n \"number\",\n \"boolean\",\n \"enum\",\n \"array\",\n \"object\",\n]);\n\n// Unknown per-property-type refinement keys are intentionally accepted\n// for forward compatibility: a future v1.x.y writer may emit additive\n// refinements an older v1 reader doesn't recognize. Recognized\n// refinements are read inline by the per-type validators\n// (e.g. `minLength` in `validateStringProperty`).\n\nconst SUPPORTED_STRING_FORMATS = new Set([\n \"datetime\",\n \"uri\",\n \"email\",\n \"uuid\",\n \"date\",\n]);\n\n/**\n * Recognized keys shared by every property-type descriptor. The strict\n * authoring path rejects unknown sibling keys against the union of this\n * set and the per-type allowlist below; the loose persistence-load path\n * passes them through untouched (a future v1.x.y writer may emit\n * additive keys an older v1 reader doesn't recognize).\n */\nconst COMMON_PROPERTY_KEYS: ReadonlySet<string> = new Set([\n \"type\",\n \"optional\",\n \"description\",\n \"searchable\",\n \"embedding\",\n]);\n\nconst PROPERTY_TYPE_KEYS: Readonly<Record<string, ReadonlySet<string>>> = {\n string: new Set([\"minLength\", \"maxLength\", \"pattern\", \"format\"]),\n number: new Set([\"min\", \"max\", \"int\"]),\n boolean: new Set(),\n enum: new Set([\"values\"]),\n array: new Set([\"items\"]),\n object: new Set([\"properties\"]),\n};\n\n/**\n * In strict mode, surface an `UNKNOWN_PROPERTY_KEY` issue for every\n * key on `raw` that's not in either allowlist. This is the LLM /\n * agent-trust-boundary check: a typo like `minLenght: 5` on a string\n * field, or a refinement key from a future v1.x that this library\n * doesn't recognize, would otherwise compile to a weaker schema with\n * no signal to the reviewer.\n */\nfunction rejectUnknownPropertyKeys(\n raw: Record<string, unknown>,\n type: string,\n path: string,\n issues: GraphExtensionIssue[],\n): void {\n const typeKeys = PROPERTY_TYPE_KEYS[type] ?? new Set<string>();\n const recognized = [...COMMON_PROPERTY_KEYS, ...typeKeys];\n for (const key of Object.keys(raw)) {\n if (COMMON_PROPERTY_KEYS.has(key) || typeKeys.has(key)) continue;\n issues.push({\n path: `${path}/${encodeJsonPointerSegment(key)}`,\n message: `Unknown property key \"${key}\" for type \"${type}\". Recognized keys: ${recognized.join(\", \")}.`,\n code: \"UNKNOWN_PROPERTY_KEY\",\n });\n }\n}\n\n/**\n * Sibling of `rejectUnknownPropertyKeys` for the non-property strict-mode\n * checks (top-level slots, node/edge/ontology body keys, unique constraint\n * body, where-clause body, …). Each call site previously open-coded the\n * same `for-key-of-Object.keys` walk — this helper consolidates them.\n */\nfunction rejectUnknownObjectKeys(\n raw: Readonly<Record<string, unknown>>,\n allowed: ReadonlySet<string>,\n label: string,\n path: string,\n code: GraphExtensionIssueCode,\n issues: GraphExtensionIssue[],\n): void {\n for (const key of Object.keys(raw)) {\n if (allowed.has(key)) continue;\n issues.push({\n path: `${path}/${encodeJsonPointerSegment(key)}`,\n message: `Unknown ${label} key \"${key}\". Allowed: ${[...allowed].join(\", \")}.`,\n code,\n });\n }\n}\n\n/**\n * Top-level slots accepted in v1 documents. Strict-authoring callers\n * reject unknown sibling keys to surface typos like `node` instead of\n * `nodes`; the loose persistence-load path leaves unknowns untouched\n * for forward compatibility.\n */\nconst KNOWN_DOCUMENT_KEYS: ReadonlySet<string> = new Set(\n GRAPH_EXTENSION_TOP_LEVEL_KEYS,\n);\n\n/**\n * Recognized body-level key sets — one per document-shape that the\n * strict-authoring path validates. Drives both the per-shape allowlist\n * check (`rejectUnknownObjectKeys`) and the human-readable \"Allowed:\"\n * tail in the error messages.\n */\nconst NODE_BODY_KEYS: ReadonlySet<string> = new Set([\n \"description\",\n \"annotations\",\n \"properties\",\n \"unique\",\n]);\nconst EDGE_BODY_KEYS: ReadonlySet<string> = new Set([\n \"description\",\n \"annotations\",\n \"from\",\n \"to\",\n \"properties\",\n]);\nconst ONTOLOGY_ENTRY_KEYS: ReadonlySet<string> = new Set([\n \"metaEdge\",\n \"from\",\n \"to\",\n]);\nconst UNIQUE_CONSTRAINT_KEYS: ReadonlySet<string> = new Set([\n \"name\",\n \"fields\",\n \"scope\",\n \"collation\",\n \"where\",\n]);\nconst WHERE_CLAUSE_KEYS: ReadonlySet<string> = new Set([\"field\", \"op\"]);\nconst NODE_INDEX_KEYS: ReadonlySet<string> = new Set([\n \"entity\",\n \"kind\",\n \"name\",\n \"fields\",\n \"coveringFields\",\n \"unique\",\n \"scope\",\n \"where\",\n]);\nconst EDGE_INDEX_KEYS: ReadonlySet<string> = new Set([\n \"entity\",\n \"kind\",\n \"name\",\n \"fields\",\n \"coveringFields\",\n \"unique\",\n \"scope\",\n \"direction\",\n \"where\",\n]);\n\ntype ValidateGraphExtensionOptions = Readonly<{\n /**\n * Reject unknown top-level keys and unsupported string formats.\n * Used by `defineGraphExtension`, where the document is being\n * authored fresh against the current library version — typos in\n * `nodes` / `format: \"date-time\"` etc. should fail loudly. The\n * persistence-load path leaves this off so a document committed by\n * a future v1.x writer with additive fields still parses on an\n * older v1 reader.\n */\n strict?: boolean;\n}>;\n\n/**\n * Validates a graph extension.\n *\n * Returns the (frozen, deeply normalized) extension on success, or a\n * `GraphExtensionValidationError` carrying every issue on authoring\n * failure. Unsupported future major versions throw\n * `GraphExtensionVersionUnsupportedError` immediately because the\n * current library cannot safely decode the rest of the document.\n * Callers that prefer exceptions for validation failures wrap the\n * returned `Result` with `unwrap()`.\n */\nexport function validateGraphExtension(\n input: unknown,\n options: ValidateGraphExtensionOptions = {},\n): Result<GraphExtension, GraphExtensionValidationError> {\n const issues: GraphExtensionIssue[] = [];\n const strict = options.strict === true;\n\n if (!isPlainObject(input)) {\n issues.push({\n path: \"\",\n message: \"Document must be a plain object.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return err(new GraphExtensionValidationError(issues));\n }\n\n const documentRecord = input;\n\n // Forward-compat: in non-strict (persistence-load) mode, unknown\n // top-level keys are intentionally NOT rejected. The persistence-\n // side zod schema is `.loose()` on every nested object, and the\n // documented format-versioning policy promises that additive minor\n // changes (a new top-level slice in a future v1.x.y) ride forward\n // without bumping the major. In strict (authoring) mode, unknown\n // keys surface as `UNKNOWN_DOCUMENT_KEY` so a typo like `node`\n // instead of `nodes` fails loudly instead of silently producing an\n // empty extension.\n if (strict) {\n for (const key of Object.keys(documentRecord)) {\n if (!KNOWN_DOCUMENT_KEYS.has(key)) {\n issues.push({\n path: `/${encodeJsonPointerSegment(key)}`,\n message: `Unknown top-level key \"${key}\". Did you mean one of: ${[...KNOWN_DOCUMENT_KEYS].join(\", \")}?`,\n code: \"UNKNOWN_DOCUMENT_KEY\",\n });\n }\n }\n }\n\n const version = validateVersion(documentRecord[\"version\"], issues);\n\n const nodes = validateNodesSection(documentRecord[\"nodes\"], issues, strict);\n const edges = validateEdgesSection(documentRecord[\"edges\"], issues, strict);\n\n // Edge endpoints can reference (a) kinds declared in this same document,\n // (b) compile-time host kinds resolved at merge time, or (c) external\n // IRIs. The cross-graph resolution check happens at merge time, not\n // here.\n\n const ontology = validateOntologySection(\n documentRecord[\"ontology\"],\n issues,\n strict,\n );\n if (ontology !== undefined) {\n validateOntology(ontology, nodes, issues);\n }\n\n const indexes = validateIndexesSection(\n documentRecord[\"indexes\"],\n issues,\n strict,\n );\n\n if (issues.length > 0) {\n return err(new GraphExtensionValidationError(issues));\n }\n\n return ok(freezeDocument({ version, nodes, edges, ontology, indexes }));\n}\n\n/**\n * Validates the `version` field against the current supported major.\n *\n * Absent → resolved to `LEGACY_GRAPH_EXTENSION_VERSION` (a stable\n * `1`). The serializer omits `version` from the canonical persisted\n * form when it equals the legacy default, so the on-disk shape is\n * always version-less for v1 documents — the validator's absent →\n * legacy mapping closes that round-trip. Splitting `LEGACY` from\n * `CURRENT` is forward-looking design for future major bumps: when\n * v2 ships, `CURRENT` becomes `2` but `LEGACY` stays `1`, so a v1-era\n * stored document still parses as v1.\n *\n * Equal to current → accepted. Higher major → rejected with\n * `GRAPH_EXTENSION_VERSION_UNSUPPORTED`. Non-integer / non-positive\n * → rejected with `INVALID_DOCUMENT_SHAPE`.\n */\nfunction validateVersion(\n raw: unknown,\n issues: GraphExtensionIssue[],\n): GraphExtensionVersion {\n if (raw === undefined) return LEGACY_GRAPH_EXTENSION_VERSION;\n if (typeof raw !== \"number\" || !Number.isInteger(raw) || raw < 1) {\n issues.push({\n path: \"/version\",\n message: `Document version must be a positive integer; received ${JSON.stringify(raw)}.`,\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return LEGACY_GRAPH_EXTENSION_VERSION;\n }\n if (raw > CURRENT_GRAPH_EXTENSION_VERSION) {\n // Version mismatch is unrecoverable — the rest of the document\n // may use fields the current library can't decode. Throw the\n // typed class directly rather than batching into the issue list,\n // which is reserved for per-field validation problems a UI can\n // surface alongside others.\n throw new GraphExtensionVersionUnsupportedError(\n raw,\n CURRENT_GRAPH_EXTENSION_VERSION,\n );\n }\n return raw;\n}\n\n// ============================================================\n// Section: nodes\n// ============================================================\n\nfunction validateNodesSection(\n rawNodes: unknown,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): Record<string, ExtensionNodeDef> | undefined {\n if (rawNodes === undefined) return undefined;\n\n if (!isPlainObject(rawNodes)) {\n issues.push({\n path: \"/nodes\",\n message: \"`nodes` must be a plain object keyed by node-kind name.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n const result: Record<string, ExtensionNodeDef> = {};\n const recorded = new Set<string>();\n\n for (const [kindName, rawNode] of Object.entries(rawNodes)) {\n const path = `/nodes/${encodeJsonPointerSegment(kindName)}`;\n\n if (!isValidKindName(kindName)) {\n issues.push({\n path,\n message: `Node kind name \"${kindName}\" must match /^[A-Za-z_][A-Za-z0-9_]*$/.`,\n code: \"INVALID_KIND_NAME\",\n });\n continue;\n }\n\n if (recorded.has(kindName)) {\n issues.push({\n path,\n message: `Duplicate node kind name \"${kindName}\".`,\n code: \"DUPLICATE_KIND_NAME\",\n });\n continue;\n }\n\n const node = validateNodeDocument(kindName, rawNode, path, issues, strict);\n if (node === undefined) continue;\n result[kindName] = node;\n recorded.add(kindName);\n }\n\n return result;\n}\n\nfunction validateNodeDocument(\n kindName: string,\n raw: unknown,\n path: string,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionNodeDef | undefined {\n if (!isPlainObject(raw)) {\n issues.push({\n path,\n message: `Node \"${kindName}\" must be a plain object.`,\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n if (strict) {\n rejectUnknownObjectKeys(\n raw,\n NODE_BODY_KEYS,\n \"node-level\",\n path,\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n }\n\n const description = validateOptionalString(\n raw[\"description\"],\n `${path}/description`,\n \"`description`\",\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n\n const annotations = validateAnnotations(\n raw[\"annotations\"],\n `${path}/annotations`,\n `Node \"${kindName}\"`,\n issues,\n );\n\n const propertiesRaw = raw[\"properties\"];\n const properties = validatePropertiesMap(\n propertiesRaw,\n `${path}/properties`,\n \"node\",\n kindName,\n issues,\n strict,\n );\n if (properties === undefined) return undefined;\n\n const uniqueRaw = raw[\"unique\"];\n const unique = validateUniqueConstraints(\n uniqueRaw,\n `${path}/unique`,\n properties,\n issues,\n strict,\n );\n\n return compactUndefined<ExtensionNodeDef>({\n description,\n annotations,\n properties,\n unique,\n });\n}\n\n// ============================================================\n// Section: edges\n// ============================================================\n\nfunction validateEdgesSection(\n rawEdges: unknown,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): Record<string, ExtensionEdgeDef> | undefined {\n if (rawEdges === undefined) return undefined;\n\n if (!isPlainObject(rawEdges)) {\n issues.push({\n path: \"/edges\",\n message: \"`edges` must be a plain object keyed by edge-kind name.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n const result: Record<string, ExtensionEdgeDef> = {};\n const recorded = new Set<string>();\n\n for (const [kindName, rawEdge] of Object.entries(rawEdges)) {\n const path = `/edges/${encodeJsonPointerSegment(kindName)}`;\n\n if (!isValidKindName(kindName)) {\n issues.push({\n path,\n message: `Edge kind name \"${kindName}\" must match /^[A-Za-z_][A-Za-z0-9_]*$/.`,\n code: \"INVALID_KIND_NAME\",\n });\n continue;\n }\n\n if (recorded.has(kindName)) {\n issues.push({\n path,\n message: `Duplicate edge kind name \"${kindName}\".`,\n code: \"DUPLICATE_KIND_NAME\",\n });\n continue;\n }\n\n const edge = validateEdgeDocument(kindName, rawEdge, path, issues, strict);\n if (edge === undefined) continue;\n result[kindName] = edge;\n recorded.add(kindName);\n }\n\n return result;\n}\n\nfunction validateEdgeDocument(\n kindName: string,\n raw: unknown,\n path: string,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionEdgeDef | undefined {\n if (!isPlainObject(raw)) {\n issues.push({\n path,\n message: `Edge \"${kindName}\" must be a plain object.`,\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n if (strict) {\n rejectUnknownObjectKeys(\n raw,\n EDGE_BODY_KEYS,\n \"edge-level\",\n path,\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n }\n\n const description = validateOptionalString(\n raw[\"description\"],\n `${path}/description`,\n \"`description`\",\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n\n const annotations = validateAnnotations(\n raw[\"annotations\"],\n `${path}/annotations`,\n `Edge \"${kindName}\"`,\n issues,\n );\n\n const from = validateEndpointList(raw[\"from\"], `${path}/from`, issues);\n const to = validateEndpointList(raw[\"to\"], `${path}/to`, issues);\n if (from === undefined || to === undefined) return undefined;\n\n const propertiesRaw = raw[\"properties\"];\n const properties =\n propertiesRaw === undefined ?\n {}\n : validatePropertiesMap(\n propertiesRaw,\n `${path}/properties`,\n \"edge\",\n kindName,\n issues,\n strict,\n );\n if (properties === undefined) return undefined;\n\n return compactUndefined<ExtensionEdgeDef>({\n description,\n annotations,\n from,\n to,\n properties,\n });\n}\n\nfunction validateEndpointList(\n raw: unknown,\n path: string,\n issues: GraphExtensionIssue[],\n): readonly string[] | undefined {\n if (!Array.isArray(raw)) {\n issues.push({\n path,\n message: \"Edge endpoint list must be an array of node-kind names.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n if (raw.length === 0) {\n issues.push({\n path,\n message: \"Edge endpoint list must contain at least one node-kind name.\",\n code: \"EMPTY_FROM_OR_TO\",\n });\n return undefined;\n }\n const names: string[] = [];\n for (const [index, value] of raw.entries()) {\n if (typeof value !== \"string\" || value.length === 0) {\n issues.push({\n path: `${path}/${index}`,\n message: \"Edge endpoint must be a non-empty string node-kind name.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n names.push(value);\n }\n return names;\n}\n\n// ============================================================\n// Section: ontology\n// ============================================================\n\nfunction validateOntologySection(\n raw: unknown,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionOntologyRelation[] | undefined {\n if (raw === undefined) return undefined;\n if (!Array.isArray(raw)) {\n issues.push({\n path: \"/ontology\",\n message: \"`ontology` must be an array of relation objects.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n const result: ExtensionOntologyRelation[] = [];\n for (const [index, entry] of raw.entries()) {\n const path = `/ontology/${index}`;\n if (!isPlainObject(entry)) {\n issues.push({\n path,\n message: \"Ontology entry must be a plain object.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n continue;\n }\n if (strict) {\n rejectUnknownObjectKeys(\n entry,\n ONTOLOGY_ENTRY_KEYS,\n \"ontology-entry\",\n path,\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n }\n\n const metaEdge = entry[\"metaEdge\"];\n const from = entry[\"from\"];\n const to = entry[\"to\"];\n\n if (typeof metaEdge !== \"string\" || !META_EDGE_NAME_SET.has(metaEdge)) {\n issues.push({\n path: `${path}/metaEdge`,\n message: `Unknown meta-edge ${describeUnknownValue(metaEdge)}. Allowed: ${[...ALL_META_EDGE_NAMES].join(\", \")}.`,\n code: \"UNKNOWN_META_EDGE\",\n });\n continue;\n }\n if (typeof from !== \"string\" || from.length === 0) {\n issues.push({\n path: `${path}/from`,\n message: \"Ontology relation `from` must be a non-empty string.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n continue;\n }\n if (typeof to !== \"string\" || to.length === 0) {\n issues.push({\n path: `${path}/to`,\n message: \"Ontology relation `to` must be a non-empty string.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n continue;\n }\n\n result.push({ metaEdge: metaEdge as MetaEdgeName, from, to });\n }\n return result;\n}\n\nfunction validateOntology(\n ontology: readonly ExtensionOntologyRelation[],\n _nodes: Record<string, ExtensionNodeDef> | undefined,\n issues: GraphExtensionIssue[],\n): void {\n const seenKey = new Set<string>();\n\n for (const [index, relation] of ontology.entries()) {\n const path = `/ontology/${index}`;\n\n if (\n relation.from === relation.to &&\n isStrictlyHierarchicalMetaEdge(relation.metaEdge)\n ) {\n issues.push({\n path,\n message: `Hierarchical meta-edge \"${relation.metaEdge}\" cannot be a self-loop (\"${relation.from}\" → \"${relation.to}\").`,\n code: \"ONTOLOGY_SELF_LOOP\",\n });\n }\n\n const key = `${relation.metaEdge}::${relation.from}->${relation.to}`;\n if (seenKey.has(key)) {\n issues.push({\n path,\n message: `Duplicate ontology relation \"${relation.metaEdge}\" (${relation.from} → ${relation.to}).`,\n code: \"DUPLICATE_ONTOLOGY_RELATION\",\n });\n continue;\n }\n seenKey.add(key);\n }\n\n // Cycle detection on transitive hierarchical relations declared *within*\n // this document. Cross-document cycles will be caught at evolve() time\n // when the graph extension is merged with the existing graph.\n detectHierarchicalCycles(ontology, issues);\n\n // disjointWith ↔ subClassOf contradictions: declaring two kinds as\n // both subclass-related (subClassOf, broader, narrower) AND\n // disjointWith is incoherent — a subclass instance is also an\n // instance of its parent, so they can't be in disjoint sets.\n // Detect within the document; cross-document detection happens at\n // merge time when the registry's closures are rebuilt.\n detectDisjointHierarchyContradictions(ontology, issues);\n}\n\nconst STRICTLY_HIERARCHICAL: ReadonlySet<MetaEdgeName> = new Set([\n \"subClassOf\",\n \"broader\",\n \"narrower\",\n \"partOf\",\n \"hasPart\",\n]);\n\nfunction isStrictlyHierarchicalMetaEdge(name: MetaEdgeName): boolean {\n return STRICTLY_HIERARCHICAL.has(name);\n}\n\n/**\n * Maps each hierarchical meta-edge to the canonical group it normalizes\n * into, mirroring the registry's relation-table flattening\n * (`computeClosuresFromOntology`). `narrower A→B` is the inverse of\n * `broader A→B`; `hasPart A→B` is the inverse of `partOf A→B`. Cycle\n * detection must run on the same normalized set the registry will, or\n * mixed-direction cycles like `broader A→B` + `narrower A→B` slip\n * through validation and surface only at runtime.\n */\nconst HIERARCHICAL_NORMALIZATION: ReadonlyMap<\n MetaEdgeName,\n Readonly<{ canonical: MetaEdgeName; flip: boolean }>\n> = new Map([\n [\"subClassOf\", { canonical: \"subClassOf\", flip: false }],\n [\"broader\", { canonical: \"broader\", flip: false }],\n [\"narrower\", { canonical: \"broader\", flip: true }],\n [\"partOf\", { canonical: \"partOf\", flip: false }],\n [\"hasPart\", { canonical: \"partOf\", flip: true }],\n]);\n\ntype NormalizedHierarchicalEdge = Readonly<{\n from: string;\n to: string;\n originalIndex: number;\n}>;\n\n/**\n * Group ontology relations by their canonical hierarchical meta-edge,\n * flipping `narrower` / `hasPart` entries into their canonical direction.\n * Mirrors `computeClosuresFromOntology`'s flattening so cycle and\n * disjoint-contradiction detection see the same edge set the registry\n * will. `skipSelfLoops` is set by the cycle detector (self-loops are\n * already reported by `detectOntologySelfLoops`) and unset by the\n * disjoint-contradiction detector (which still wants `(A, A)` in the\n * closure for a `disjointWith(A, A)` check).\n */\nfunction buildHierarchicalGroups(\n ontology: readonly ExtensionOntologyRelation[],\n options: Readonly<{ skipSelfLoops: boolean }>,\n): Map<MetaEdgeName, NormalizedHierarchicalEdge[]> {\n const groups = new Map<MetaEdgeName, NormalizedHierarchicalEdge[]>();\n for (const [index, relation] of ontology.entries()) {\n const normalization = HIERARCHICAL_NORMALIZATION.get(relation.metaEdge);\n if (normalization === undefined) continue;\n if (options.skipSelfLoops && relation.from === relation.to) continue;\n\n const from = normalization.flip ? relation.to : relation.from;\n const to = normalization.flip ? relation.from : relation.to;\n\n const list = groups.get(normalization.canonical) ?? [];\n list.push({ from, to, originalIndex: index });\n groups.set(normalization.canonical, list);\n }\n return groups;\n}\n\nfunction detectHierarchicalCycles(\n ontology: readonly ExtensionOntologyRelation[],\n issues: GraphExtensionIssue[],\n): void {\n const groups = buildHierarchicalGroups(ontology, { skipSelfLoops: true });\n\n for (const [name, edges] of groups) {\n const closure = computeTransitiveClosure(\n edges.map((edge) => [edge.from, edge.to] as const),\n );\n const reportedNodes = new Set<string>();\n for (const [from, reachable] of closure) {\n if (!reachable.has(from) || reportedNodes.has(from)) continue;\n reportedNodes.add(from);\n const offendingEdge = edges.find((edge) => edge.from === from);\n const path =\n offendingEdge === undefined ? \"/ontology\" : (\n `/ontology/${offendingEdge.originalIndex}`\n );\n issues.push({\n path,\n message: `Cycle detected in \"${name}\" relations involving \"${from}\".`,\n code: \"ONTOLOGY_CYCLE\",\n });\n }\n }\n}\n\n/**\n * Detects `disjointWith` ↔ subClassOf-family contradictions: declaring\n * `(A, B) disjointWith` AND `(A, B) subClassOf` (or any subclass-\n * relating meta-edge) in the same document is incoherent — a subclass\n * instance is also an instance of its parent, so they can't be in\n * disjoint sets.\n *\n * Detection runs against the closure of the hierarchical relations\n * because `(A, B) subClassOf` plus `(B, C) subClassOf` makes A and C\n * disjoint-incompatible too. `narrower` / `hasPart` are flipped to\n * their canonical direction during normalization, mirroring how\n * `detectHierarchicalCycles` builds its groups.\n *\n * Cross-document contradictions (extension declares `disjointWith(A,B)`\n * while a previously-evolved extension declared `subClassOf(A,B)`) are\n * caught at merge time when the registry's closures are rebuilt.\n */\nfunction detectDisjointHierarchyContradictions(\n ontology: readonly ExtensionOntologyRelation[],\n issues: GraphExtensionIssue[],\n): void {\n const disjointPairs = new Set<string>();\n const disjointPath = new Map<string, string>();\n for (const [index, relation] of ontology.entries()) {\n if (relation.metaEdge !== \"disjointWith\") continue;\n // disjointWith is symmetric; record both orderings so the closure\n // check below catches the contradiction regardless of which side\n // the subclass relation orders by.\n disjointPairs.add(`${relation.from}|${relation.to}`);\n disjointPairs.add(`${relation.to}|${relation.from}`);\n disjointPath.set(`${relation.from}|${relation.to}`, `/ontology/${index}`);\n disjointPath.set(`${relation.to}|${relation.from}`, `/ontology/${index}`);\n }\n if (disjointPairs.size === 0) return;\n\n // Walk the closure of every hierarchical group; any (from, reachable)\n // pair that also appears in `disjointPairs` is a contradiction.\n const groups = buildHierarchicalGroups(ontology, { skipSelfLoops: false });\n const reported = new Set<string>();\n for (const [name, edges] of groups) {\n const closure = computeTransitiveClosure(\n edges.map((edge) => [edge.from, edge.to] as const),\n );\n for (const [from, reachable] of closure) {\n for (const to of reachable) {\n const pairKey = `${from}|${to}`;\n if (!disjointPairs.has(pairKey)) continue;\n if (reported.has(pairKey)) continue;\n reported.add(pairKey);\n issues.push({\n path: disjointPath.get(pairKey) ?? \"/ontology\",\n message: `Contradiction: \"${from}\" and \"${to}\" are declared disjointWith but also related by \"${name}\" (directly or transitively).`,\n code: \"ONTOLOGY_DISJOINT_CONFLICT\",\n });\n }\n }\n }\n}\n\n// ============================================================\n// Section: indexes\n// ============================================================\n\nconst INDEX_SCOPE_VALUES = [\"graphAndKind\", \"graph\", \"none\"] as const;\nconst EDGE_INDEX_DIRECTION_VALUES = [\"out\", \"in\", \"none\"] as const;\n\nconst RUNTIME_INDEX_WHERE_OPS: ReadonlySet<string> = new Set([\n \"isNull\",\n \"isNotNull\",\n]);\n\nfunction validateIndexesSection(\n rawIndexes: unknown,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): readonly ExtensionIndex[] | undefined {\n if (rawIndexes === undefined) return undefined;\n if (!Array.isArray(rawIndexes)) {\n issues.push({\n path: \"/indexes\",\n message: \"`indexes` must be an array of index declarations.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n const result: ExtensionIndex[] = [];\n const seenNames = new Set<string>();\n\n for (const [arrayIndex, entry] of rawIndexes.entries()) {\n const path = `/indexes/${arrayIndex}`;\n const validated = validateIndexEntry(entry, path, issues, strict);\n if (validated === undefined) continue;\n\n if (validated.name !== undefined) {\n if (seenNames.has(validated.name)) {\n issues.push({\n path: `${path}/name`,\n message: `Duplicate index name \"${validated.name}\".`,\n code: \"DUPLICATE_INDEX_NAME\",\n });\n continue;\n }\n seenNames.add(validated.name);\n }\n result.push(validated);\n }\n\n return result;\n}\n\nfunction validateIndexEntry(\n raw: unknown,\n path: string,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionIndex | undefined {\n if (!isPlainObject(raw)) {\n issues.push({\n path,\n message: \"Index entry must be a plain object.\",\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n\n const entity = raw[\"entity\"];\n if (entity !== \"node\" && entity !== \"edge\") {\n issues.push({\n path: `${path}/entity`,\n message: `Index \\`entity\\` must be \"node\" or \"edge\"; received ${describeUnknownValue(entity)}.`,\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n\n // Strict-authoring typo check: `coveringField` (singular), `wheres`,\n // etc. would otherwise compile to a weaker index with no signal.\n // Allowlist switches on `entity` so edge-only `direction` is valid\n // on edges but flagged on nodes.\n if (strict) {\n rejectUnknownObjectKeys(\n raw,\n entity === \"node\" ? NODE_INDEX_KEYS : EDGE_INDEX_KEYS,\n `${entity}-index`,\n path,\n \"INVALID_INDEX_DECLARATION\",\n issues,\n );\n }\n\n if (typeof raw[\"kind\"] !== \"string\" || !isValidKindName(raw[\"kind\"])) {\n issues.push({\n path: `${path}/kind`,\n message:\n \"Index `kind` must be a non-empty kind name matching /^[A-Za-z_][A-Za-z0-9_]*$/.\",\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n\n const fields = validateStringList(raw[\"fields\"], `${path}/fields`, issues, {\n allowEmpty: false,\n label: \"fields\",\n emptyCode: \"EMPTY_INDEX_FIELDS\",\n });\n if (fields === undefined) return undefined;\n\n const coveringFields = validateStringList(\n raw[\"coveringFields\"],\n `${path}/coveringFields`,\n issues,\n { allowEmpty: true, label: \"coveringFields\" },\n );\n\n if (raw[\"unique\"] !== undefined && typeof raw[\"unique\"] !== \"boolean\") {\n issues.push({\n path: `${path}/unique`,\n message: \"Index `unique` must be a boolean.\",\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n\n let name: string | undefined;\n if (raw[\"name\"] !== undefined) {\n if (typeof raw[\"name\"] !== \"string\" || raw[\"name\"].length === 0) {\n issues.push({\n path: `${path}/name`,\n message: \"Index `name` must be a non-empty string.\",\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n name = raw[\"name\"];\n }\n\n const scopeResult = validateOptionalLiteral(\n raw[\"scope\"],\n INDEX_SCOPE_VALUES,\n `${path}/scope`,\n \"Index `scope`\",\n \"INVALID_INDEX_DECLARATION\",\n issues,\n );\n if (!scopeResult.ok) return undefined;\n const scope = scopeResult.value;\n\n const where = validateGraphExtensionIndexWhere(\n raw[\"where\"],\n `${path}/where`,\n issues,\n strict,\n );\n\n if (entity === \"node\") {\n return compactUndefined<ExtensionIndex>({\n entity: \"node\",\n kind: raw[\"kind\"],\n name,\n fields,\n coveringFields,\n unique: raw[\"unique\"],\n scope,\n where,\n });\n }\n\n const directionResult = validateOptionalLiteral(\n raw[\"direction\"],\n EDGE_INDEX_DIRECTION_VALUES,\n `${path}/direction`,\n \"Edge index `direction`\",\n \"INVALID_INDEX_DECLARATION\",\n issues,\n );\n if (!directionResult.ok) return undefined;\n const direction = directionResult.value;\n\n return compactUndefined<ExtensionIndex>({\n entity: \"edge\",\n kind: raw[\"kind\"],\n name,\n direction,\n fields,\n coveringFields,\n unique: raw[\"unique\"],\n scope,\n where,\n });\n}\n\nfunction validateStringList(\n raw: unknown,\n path: string,\n issues: GraphExtensionIssue[],\n options: Readonly<{\n allowEmpty: boolean;\n label: string;\n emptyCode?: GraphExtensionIssueCode;\n }>,\n): readonly string[] | undefined {\n if (raw === undefined) {\n if (options.allowEmpty) return undefined;\n issues.push({\n path,\n message: `\\`${options.label}\\` is required and must contain at least one entry.`,\n code: options.emptyCode ?? \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n if (!Array.isArray(raw)) {\n issues.push({\n path,\n message: `\\`${options.label}\\` must be an array of strings.`,\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n const seen = new Set<string>();\n const result: string[] = [];\n for (const [index, value] of raw.entries()) {\n if (typeof value !== \"string\" || value.length === 0) {\n issues.push({\n path: `${path}/${index}`,\n message: `\\`${options.label}[${index}]\\` must be a non-empty string.`,\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n if (seen.has(value)) {\n issues.push({\n path: `${path}/${index}`,\n message: `Duplicate ${options.label} entry \"${value}\".`,\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n seen.add(value);\n result.push(value);\n }\n if (!options.allowEmpty && result.length === 0) {\n issues.push({\n path,\n message: `\\`${options.label}\\` must contain at least one entry.`,\n code: options.emptyCode ?? \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n return result;\n}\n\nfunction validateGraphExtensionIndexWhere(\n raw: unknown,\n path: string,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionIndex[\"where\"] {\n if (raw === undefined) return undefined;\n if (!isPlainObject(raw)) {\n issues.push({\n path,\n message: \"Index `where` must be a plain object.\",\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n if (strict) {\n rejectUnknownObjectKeys(\n raw,\n WHERE_CLAUSE_KEYS,\n \"where-clause\",\n path,\n \"INVALID_INDEX_DECLARATION\",\n issues,\n );\n }\n if (typeof raw[\"field\"] !== \"string\" || raw[\"field\"].length === 0) {\n issues.push({\n path: `${path}/field`,\n message: \"`where.field` must be a non-empty string.\",\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n if (\n typeof raw[\"op\"] !== \"string\" ||\n !RUNTIME_INDEX_WHERE_OPS.has(raw[\"op\"])\n ) {\n issues.push({\n path: `${path}/op`,\n message: '`where.op` must be \"isNull\" or \"isNotNull\" in v1.',\n code: \"INVALID_INDEX_DECLARATION\",\n });\n return undefined;\n }\n return Object.freeze({\n field: raw[\"field\"],\n op: raw[\"op\"] as NullCheckOp,\n });\n}\n\n// ============================================================\n// Properties and refinements\n// ============================================================\n\nfunction validatePropertiesMap(\n raw: unknown,\n path: string,\n ownerType: KindEntity,\n ownerName: string,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): Record<string, ExtensionPropertyType> | undefined {\n if (!isPlainObject(raw)) {\n issues.push({\n path,\n message: `\\`properties\\` must be a plain object.`,\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n const reserved =\n ownerType === \"node\" ? RESERVED_NODE_KEYS : RESERVED_EDGE_KEYS;\n const result: Record<string, ExtensionPropertyType> = {};\n for (const [propertyName, propertyValue] of Object.entries(raw)) {\n const propertyPath = `${path}/${encodeJsonPointerSegment(propertyName)}`;\n if (reserved.has(propertyName)) {\n issues.push({\n path: propertyPath,\n message: `Property name \"${propertyName}\" is reserved for ${ownerType} \"${ownerName}\".`,\n code: \"RESERVED_PROPERTY_NAME\",\n });\n continue;\n }\n if (propertyName.startsWith(\"$\")) {\n issues.push({\n path: propertyPath,\n message: `Property name \"${propertyName}\" uses the reserved \"$\" prefix.`,\n code: \"RESERVED_PROPERTY_NAME\",\n });\n continue;\n }\n const validated = validateProperty(\n propertyValue,\n propertyPath,\n 0,\n issues,\n strict,\n );\n if (validated === undefined) continue;\n result[propertyName] = validated;\n }\n\n return result;\n}\n\nfunction validateProperty(\n raw: unknown,\n path: string,\n depth: number,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionPropertyType | undefined {\n if (!isPlainObject(raw)) {\n issues.push({\n path,\n message:\n \"Property descriptor must be a plain object with a `type` field.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n const property = raw;\n const type = property[\"type\"];\n if (typeof type !== \"string\" || !SUPPORTED_PROPERTY_TYPES.has(type)) {\n issues.push({\n path: `${path}/type`,\n message: `Unsupported property type ${describeUnknownValue(type)}. Supported: ${[...SUPPORTED_PROPERTY_TYPES].join(\", \")}.`,\n code: \"UNSUPPORTED_PROPERTY_TYPE\",\n });\n return undefined;\n }\n\n // Strict authoring mode: reject unknown sibling keys against the\n // per-type allowlist BEFORE dispatch. A typo like `minLenght` on a\n // string property would otherwise compile to a `z.string()` with no\n // length constraint and ship through to ingest. Persistence-load\n // mode skips this so a future v1.x.y writer's additive keys ride\n // forward.\n if (strict) rejectUnknownPropertyKeys(property, type, path, issues);\n\n switch (type) {\n case \"string\": {\n return validateStringProperty(property, path, issues, strict);\n }\n case \"number\": {\n return validateNumberProperty(property, path, issues);\n }\n case \"boolean\": {\n return validateBooleanProperty(property, path, issues);\n }\n case \"enum\": {\n return validateEnumProperty(property, path, issues);\n }\n case \"array\": {\n return validateArrayProperty(property, path, depth, issues, strict);\n }\n case \"object\": {\n return validateObjectProperty(property, path, depth, issues, strict);\n }\n }\n return undefined;\n}\n\nfunction validateStringProperty(\n raw: Record<string, unknown>,\n path: string,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionStringProperty | undefined {\n const minLength = validateNonNegativeInteger(\n raw[\"minLength\"],\n `${path}/minLength`,\n \"string.minLength\",\n \"INVALID_LENGTH_BOUNDS\",\n issues,\n );\n const maxLength = validateNonNegativeInteger(\n raw[\"maxLength\"],\n `${path}/maxLength`,\n \"string.maxLength\",\n \"INVALID_LENGTH_BOUNDS\",\n issues,\n );\n if (\n minLength !== undefined &&\n maxLength !== undefined &&\n minLength > maxLength\n ) {\n issues.push({\n path,\n message: `string.minLength (${minLength}) cannot exceed string.maxLength (${maxLength}).`,\n code: \"INVALID_LENGTH_BOUNDS\",\n });\n }\n\n let pattern: string | undefined;\n if (raw[\"pattern\"] !== undefined) {\n if (typeof raw[\"pattern\"] === \"string\") {\n try {\n new RegExp(raw[\"pattern\"]);\n pattern = raw[\"pattern\"];\n } catch (error) {\n issues.push({\n path: `${path}/pattern`,\n message: `Pattern is not a valid regular expression: ${\n error instanceof Error ? error.message : String(error)\n }`,\n code: \"INVALID_PATTERN\",\n });\n }\n } else {\n issues.push({\n path: `${path}/pattern`,\n message: \"`pattern` must be a string regular expression.\",\n code: \"INVALID_PATTERN\",\n });\n }\n }\n\n let format: ExtensionStringProperty[\"format\"];\n if (raw[\"format\"] !== undefined) {\n if (typeof raw[\"format\"] !== \"string\") {\n issues.push({\n path: `${path}/format`,\n message: `String format must be a string; received ${describeUnknownValue(raw[\"format\"])}.`,\n code: \"INVALID_PROPERTY_REFINEMENT\",\n });\n } else if (SUPPORTED_STRING_FORMATS.has(raw[\"format\"])) {\n format = raw[\"format\"] as ExtensionStringProperty[\"format\"];\n } else if (strict) {\n // Authoring-mode reject. A typo like `\"date-time\"` (no\n // hyphen) silently compiled to a plain `z.string()` in earlier\n // versions, so `safeParse(\"not-a-date\")` succeeded — surfacing\n // the typo here is the contract.\n issues.push({\n path: `${path}/format`,\n message: `Unsupported string format \"${raw[\"format\"]}\". Supported: ${[...SUPPORTED_STRING_FORMATS].join(\", \")}.`,\n code: \"UNSUPPORTED_STRING_FORMAT\",\n });\n }\n // Non-strict (persistence-load) path: unknown format silently\n // drops to a plain `z.string()`. A future v1.x.y writer may\n // introduce a new format identifier; an older v1 reader still\n // parses the document, just without the new format's behaviour.\n }\n\n const modifiers = validatePropertyModifiers(raw, path, \"string\", issues);\n if (modifiers === undefined) return undefined;\n\n if (format !== undefined && modifiers.searchable !== undefined) {\n issues.push({\n path,\n message:\n \"`searchable` cannot be combined with `format` on a string property — the format-specific schema cannot carry the searchable brand. Drop one, or split into two fields.\",\n code: \"INVALID_PROPERTY_REFINEMENT\",\n });\n return undefined;\n }\n\n if (\n format !== undefined &&\n (minLength !== undefined ||\n maxLength !== undefined ||\n pattern !== undefined)\n ) {\n issues.push({\n path,\n message:\n \"`format` cannot be combined with `minLength`, `maxLength`, or `pattern` on a string property — the format-routed schema (`z.iso.datetime` / `z.url`) is not a `z.ZodString` and cannot carry length or pattern refinements. Drop the refinement, or drop the format and validate the shape with `pattern`.\",\n code: \"INVALID_PROPERTY_REFINEMENT\",\n });\n return undefined;\n }\n\n return finalizeProperty<ExtensionStringProperty>(\n \"string\",\n { minLength, maxLength, pattern, format },\n modifiers,\n );\n}\n\nfunction validateNumberProperty(\n raw: Record<string, unknown>,\n path: string,\n issues: GraphExtensionIssue[],\n): ExtensionNumberProperty | undefined {\n // Forward-compat: unknown refinement keys are silently accepted.\n const min = validateOptionalFiniteNumber(\n raw[\"min\"],\n `${path}/min`,\n \"`min`\",\n \"INVALID_NUMBER_BOUNDS\",\n issues,\n );\n const max = validateOptionalFiniteNumber(\n raw[\"max\"],\n `${path}/max`,\n \"`max`\",\n \"INVALID_NUMBER_BOUNDS\",\n issues,\n );\n if (min !== undefined && max !== undefined && min > max) {\n issues.push({\n path,\n message: `number.min (${min}) cannot exceed number.max (${max}).`,\n code: \"INVALID_NUMBER_BOUNDS\",\n });\n }\n\n const int = validateOptionalBoolean(\n raw[\"int\"],\n `${path}/int`,\n \"`int`\",\n \"INVALID_PROPERTY_REFINEMENT\",\n issues,\n );\n\n // Integer + non-integer bounds: reject early so the compiled Zod schema\n // doesn't silently swallow values like `min: 1.5, int: true`.\n if (int === true) {\n if (min !== undefined && !Number.isInteger(min)) {\n issues.push({\n path: `${path}/min`,\n message: \"`min` must be an integer when `int: true`.\",\n code: \"INVALID_NUMBER_BOUNDS\",\n });\n }\n if (max !== undefined && !Number.isInteger(max)) {\n issues.push({\n path: `${path}/max`,\n message: \"`max` must be an integer when `int: true`.\",\n code: \"INVALID_NUMBER_BOUNDS\",\n });\n }\n }\n\n const modifiers = validatePropertyModifiers(raw, path, \"number\", issues);\n if (modifiers === undefined) return undefined;\n\n return finalizeProperty<ExtensionNumberProperty>(\n \"number\",\n { min, max, int },\n modifiers,\n );\n}\n\nfunction validateBooleanProperty(\n raw: Record<string, unknown>,\n path: string,\n issues: GraphExtensionIssue[],\n): ExtensionBooleanProperty | undefined {\n const modifiers = validatePropertyModifiers(raw, path, \"boolean\", issues);\n if (modifiers === undefined) return undefined;\n return finalizeProperty<ExtensionBooleanProperty>(\"boolean\", {}, modifiers);\n}\n\nfunction validateEnumProperty(\n raw: Record<string, unknown>,\n path: string,\n issues: GraphExtensionIssue[],\n): ExtensionEnumProperty | undefined {\n // Forward-compat: unknown refinement keys are silently accepted.\n const valuesRaw = raw[\"values\"];\n if (!Array.isArray(valuesRaw) || valuesRaw.length === 0) {\n issues.push({\n path: `${path}/values`,\n message: \"`enum.values` must be a non-empty array of strings.\",\n code: \"INVALID_ENUM_VALUES\",\n });\n return undefined;\n }\n\n const values: string[] = [];\n const seen = new Set<string>();\n for (const [index, value] of valuesRaw.entries()) {\n if (typeof value !== \"string\") {\n issues.push({\n path: `${path}/values/${index}`,\n message: \"`enum.values` entries must be strings.\",\n code: \"INVALID_ENUM_VALUES\",\n });\n return undefined;\n }\n if (seen.has(value)) {\n issues.push({\n path: `${path}/values/${index}`,\n message: `Duplicate enum value \"${value}\".`,\n code: \"INVALID_ENUM_VALUES\",\n });\n return undefined;\n }\n seen.add(value);\n values.push(value);\n }\n\n const modifiers = validatePropertyModifiers(raw, path, \"enum\", issues);\n if (modifiers === undefined) return undefined;\n\n return finalizeProperty<ExtensionEnumProperty>(\"enum\", { values }, modifiers);\n}\n\nfunction validateArrayProperty(\n raw: Record<string, unknown>,\n path: string,\n depth: number,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionArrayProperty | undefined {\n // Forward-compat: unknown refinement keys are silently accepted.\n const itemsRaw = raw[\"items\"];\n if (itemsRaw === undefined) {\n issues.push({\n path: `${path}/items`,\n message: \"`array.items` is required.\",\n code: \"INVALID_PROPERTY_REFINEMENT\",\n });\n return undefined;\n }\n if (!isPlainObject(itemsRaw)) {\n issues.push({\n path: `${path}/items`,\n message: \"`array.items` must be a plain property descriptor.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n const itemType = itemsRaw[\"type\"];\n if (itemType === \"array\") {\n issues.push({\n path: `${path}/items`,\n message: \"Nested arrays are not supported in v1.\",\n code: \"NESTED_ARRAY\",\n });\n return undefined;\n }\n const items = validateProperty(\n itemsRaw,\n `${path}/items`,\n depth + 1,\n issues,\n strict,\n );\n if (items === undefined) return undefined;\n if (items.type === \"array\") {\n // Type-narrow only: `validateProperty` returns the wider\n // `ExtensionPropertyType`, but `ExtensionArrayItemType` excludes\n // nested arrays. The earlier `itemType === \"array\"` check above\n // already rejected this at the raw-shape level, so this branch\n // is unreachable at runtime.\n return undefined;\n }\n\n const modifiers = validatePropertyModifiers(raw, path, \"array\", issues);\n if (modifiers === undefined) return undefined;\n\n return finalizeProperty<ExtensionArrayProperty>(\n \"array\",\n { items },\n modifiers,\n );\n}\n\nfunction validateObjectProperty(\n raw: Record<string, unknown>,\n path: string,\n depth: number,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): ExtensionObjectProperty | undefined {\n // Forward-compat: unknown refinement keys are silently accepted.\n if (depth >= 1) {\n issues.push({\n path,\n message: \"Nested objects are limited to a single level in v1.\",\n code: \"NESTED_OBJECT_TOO_DEEP\",\n });\n return undefined;\n }\n\n const propertiesRaw = raw[\"properties\"];\n if (!isPlainObject(propertiesRaw)) {\n issues.push({\n path: `${path}/properties`,\n message: \"`object.properties` must be a plain object.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n const propertiesEntries = Object.entries(propertiesRaw);\n if (propertiesEntries.length === 0) {\n issues.push({\n path: `${path}/properties`,\n message: \"`object.properties` must declare at least one field.\",\n code: \"EMPTY_PROPERTIES\",\n });\n return undefined;\n }\n\n const fields: Record<string, ExtensionObjectFieldProperty> = {};\n for (const [name, value] of propertiesEntries) {\n const fieldPath = `${path}/properties/${encodeJsonPointerSegment(name)}`;\n if (!isPlainObject(value)) {\n issues.push({\n path: fieldPath,\n message: \"Object field descriptor must be a plain object.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n continue;\n }\n const fieldType = value[\"type\"];\n if (fieldType === \"object\") {\n issues.push({\n path: fieldPath,\n message: \"Nested objects are limited to a single level in v1.\",\n code: \"NESTED_OBJECT_TOO_DEEP\",\n });\n continue;\n }\n const field = validateProperty(value, fieldPath, depth + 1, issues, strict);\n if (field === undefined) continue;\n fields[name] = field as ExtensionObjectFieldProperty;\n }\n\n const modifiers = validatePropertyModifiers(raw, path, \"object\", issues);\n if (modifiers === undefined) return undefined;\n\n return finalizeProperty<ExtensionObjectProperty>(\n \"object\",\n { properties: fields },\n modifiers,\n );\n}\n\n// ============================================================\n// Modifiers\n// ============================================================\n\ntype NormalizedModifiers = Readonly<{\n optional?: boolean;\n searchable?: { language?: string };\n embedding?: { dimensions: number };\n description?: string;\n}>;\n\n/**\n * Assemble a final property descriptor from a type-specific field map\n * plus the already-validated modifiers. Centralizes the modifier-spread\n * boilerplate so adding a new modifier slot (or tweaking how undefineds\n * are pruned) touches one site instead of six.\n *\n * Callers run `validatePropertyModifiers` first because some types\n * (`string`) need cross-modifier validation (e.g. `format` ↔ `searchable`)\n * after the modifiers are known but before the final shape is built.\n */\nfunction finalizeProperty<T extends ExtensionPropertyType>(\n type: T[\"type\"],\n specific: Record<string, unknown>,\n modifiers: NormalizedModifiers,\n): T {\n return compactUndefined<Record<string, unknown>>({\n type,\n ...specific,\n optional: modifiers.optional,\n searchable: modifiers.searchable,\n embedding: modifiers.embedding,\n description: modifiers.description,\n }) as T;\n}\n\nfunction validatePropertyModifiers(\n raw: Record<string, unknown>,\n path: string,\n propertyType: ExtensionPropertyType[\"type\"],\n issues: GraphExtensionIssue[],\n): NormalizedModifiers | undefined {\n // Mirrors `issues.length` rather than carrying its own boolean: any\n // helper that pushes also signals failure here.\n const issuesAtEntry = issues.length;\n\n const optional = validateOptionalBoolean(\n raw[\"optional\"],\n `${path}/optional`,\n \"`optional`\",\n \"INVALID_PROPERTY_REFINEMENT\",\n issues,\n );\n\n let searchable: { language?: string } | undefined;\n if (raw[\"searchable\"] !== undefined) {\n if (propertyType !== \"string\") {\n issues.push({\n path: `${path}/searchable`,\n message: `\\`searchable\\` is only valid on string properties (got \"${propertyType}\").`,\n code: \"INVALID_MODIFIER_TARGET\",\n });\n } else if (isPlainObject(raw[\"searchable\"])) {\n const searchableRaw = raw[\"searchable\"];\n const language = searchableRaw[\"language\"];\n if (language === undefined) {\n searchable = {};\n } else {\n if (typeof language !== \"string\" || language.length === 0) {\n issues.push({\n path: `${path}/searchable/language`,\n message: \"`searchable.language` must be a non-empty string.\",\n code: \"INVALID_SEARCHABLE_LANGUAGE\",\n });\n } else {\n searchable = { language };\n }\n }\n } else {\n issues.push({\n path: `${path}/searchable`,\n message: \"`searchable` must be a plain object (use `{}` for defaults).\",\n code: \"INVALID_PROPERTY_REFINEMENT\",\n });\n }\n }\n\n let embedding: { dimensions: number } | undefined;\n if (raw[\"embedding\"] !== undefined) {\n if (propertyType === \"array\") {\n const itemsRaw = raw[\"items\"];\n const itemType = isPlainObject(itemsRaw) ? itemsRaw[\"type\"] : undefined;\n if (itemType !== \"number\") {\n issues.push({\n path: `${path}/embedding`,\n message: '`embedding` requires `array.items.type === \"number\"`.',\n code: \"INVALID_MODIFIER_TARGET\",\n });\n } else if (isPlainObject(raw[\"embedding\"])) {\n const dim = raw[\"embedding\"][\"dimensions\"];\n if (typeof dim !== \"number\" || !Number.isInteger(dim) || dim <= 0) {\n issues.push({\n path: `${path}/embedding/dimensions`,\n message: \"`embedding.dimensions` must be a positive integer.\",\n code: \"INVALID_EMBEDDING_DIMENSIONS\",\n });\n } else {\n // `embedding(dimensions)` replaces the array's item validator with a\n // length+finite-number check; any extra refinements on the items\n // (min, max, int) would silently disappear at compile time.\n const itemsObject = isPlainObject(itemsRaw) ? itemsRaw : {};\n const extraneous = Object.keys(itemsObject).filter(\n (key) => key !== \"type\",\n );\n if (extraneous.length > 0) {\n issues.push({\n path: `${path}/items`,\n message: `\\`embedding\\` arrays must declare items as \\`{ type: \"number\" }\\` only — additional refinements (${extraneous.join(\", \")}) are silently dropped by the embedding schema. Drop the refinements, or drop \\`embedding\\` and use a plain array.`,\n code: \"INVALID_PROPERTY_REFINEMENT\",\n });\n } else {\n embedding = { dimensions: dim };\n }\n }\n } else {\n issues.push({\n path: `${path}/embedding`,\n message:\n \"`embedding` must be a plain object with a `dimensions` field.\",\n code: \"INVALID_PROPERTY_REFINEMENT\",\n });\n }\n } else {\n issues.push({\n path: `${path}/embedding`,\n message: `\\`embedding\\` is only valid on array-of-number properties (got \"${propertyType}\").`,\n code: \"INVALID_MODIFIER_TARGET\",\n });\n }\n }\n\n let description: string | undefined;\n if (raw[\"description\"] !== undefined) {\n if (typeof raw[\"description\"] === \"string\") {\n description = raw[\"description\"];\n } else {\n issues.push({\n path: `${path}/description`,\n message: \"`description` must be a string.\",\n code: \"INVALID_PROPERTY_REFINEMENT\",\n });\n }\n }\n\n if (issues.length > issuesAtEntry) return undefined;\n return compactUndefined<NormalizedModifiers>({\n optional,\n searchable,\n embedding,\n description,\n });\n}\n\n// ============================================================\n// Unique constraints\n// ============================================================\n\nfunction validateUniqueConstraints(\n raw: unknown,\n path: string,\n properties: Record<string, ExtensionPropertyType>,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): readonly ExtensionUniqueConstraint[] | undefined {\n if (raw === undefined) return undefined;\n if (!Array.isArray(raw)) {\n issues.push({\n path,\n message: \"`unique` must be an array of constraint declarations.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n\n const result: ExtensionUniqueConstraint[] = [];\n const names = new Set<string>();\n for (const [index, entry] of raw.entries()) {\n const constraintPath = `${path}/${index}`;\n if (!isPlainObject(entry)) {\n issues.push({\n path: constraintPath,\n message: \"Unique constraint must be a plain object.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n continue;\n }\n\n if (strict) {\n rejectUnknownObjectKeys(\n entry,\n UNIQUE_CONSTRAINT_KEYS,\n \"unique-constraint\",\n constraintPath,\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n }\n\n const constraint = entry;\n const name = constraint[\"name\"];\n if (typeof name !== \"string\" || name.length === 0) {\n issues.push({\n path: `${constraintPath}/name`,\n message: \"Unique constraint `name` must be a non-empty string.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n continue;\n }\n if (names.has(name)) {\n issues.push({\n path: `${constraintPath}/name`,\n message: `Duplicate unique constraint name \"${name}\".`,\n code: \"DUPLICATE_UNIQUE_CONSTRAINT\",\n });\n continue;\n }\n names.add(name);\n\n const fieldsRaw = constraint[\"fields\"];\n if (!Array.isArray(fieldsRaw) || fieldsRaw.length === 0) {\n issues.push({\n path: `${constraintPath}/fields`,\n message:\n \"Unique constraint `fields` must be a non-empty array of property names.\",\n code: \"EMPTY_UNIQUE_FIELDS\",\n });\n continue;\n }\n\n const fields: string[] = [];\n const seenFields = new Set<string>();\n let fieldsValid = true;\n for (const [fieldIndex, field] of fieldsRaw.entries()) {\n if (typeof field !== \"string\" || field.length === 0) {\n issues.push({\n path: `${constraintPath}/fields/${fieldIndex}`,\n message: \"Unique constraint field must be a non-empty string.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n fieldsValid = false;\n break;\n }\n if (seenFields.has(field)) {\n issues.push({\n path: `${constraintPath}/fields/${fieldIndex}`,\n message: `Duplicate field \"${field}\" in unique constraint.`,\n code: \"DUPLICATE_UNIQUE_FIELD\",\n });\n fieldsValid = false;\n break;\n }\n if (!(field in properties)) {\n issues.push({\n path: `${constraintPath}/fields/${fieldIndex}`,\n message: `Unique constraint field \"${field}\" is not declared on this kind.`,\n code: \"UNKNOWN_UNIQUE_FIELD\",\n });\n fieldsValid = false;\n break;\n }\n seenFields.add(field);\n fields.push(field);\n }\n if (!fieldsValid) continue;\n\n const scopeResult = validateOptionalLiteral(\n constraint[\"scope\"],\n [\"kind\", \"kindWithSubClasses\"] as const,\n `${constraintPath}/scope`,\n \"Unique constraint `scope`\",\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n if (!scopeResult.ok) continue;\n const scope = scopeResult.value;\n\n const collationResult = validateOptionalLiteral(\n constraint[\"collation\"],\n [\"binary\", \"caseInsensitive\"] as const,\n `${constraintPath}/collation`,\n \"Unique constraint `collation`\",\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n if (!collationResult.ok) continue;\n const collation = collationResult.value;\n\n const where: { field: string; op: NullCheckOp } | undefined =\n constraint[\"where\"] === undefined ?\n undefined\n : validateUniqueWhere(\n constraint[\"where\"],\n `${constraintPath}/where`,\n properties,\n issues,\n strict,\n );\n if (constraint[\"where\"] !== undefined && where === undefined) continue;\n\n result.push(\n compactUndefined<ExtensionUniqueConstraint>({\n name,\n fields,\n scope,\n collation,\n where,\n }),\n );\n }\n\n return result;\n}\n\nfunction validateUniqueWhere(\n raw: unknown,\n path: string,\n properties: Record<string, ExtensionPropertyType>,\n issues: GraphExtensionIssue[],\n strict: boolean,\n): { field: string; op: NullCheckOp } | undefined {\n if (!isPlainObject(raw)) {\n issues.push({\n path,\n message: \"Unique constraint `where` must be `{ field, op }`.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n if (strict) {\n rejectUnknownObjectKeys(\n raw,\n WHERE_CLAUSE_KEYS,\n \"where-clause\",\n path,\n \"INVALID_DOCUMENT_SHAPE\",\n issues,\n );\n }\n const field = raw[\"field\"];\n const op = raw[\"op\"];\n if (typeof field !== \"string\" || field.length === 0) {\n issues.push({\n path: `${path}/field`,\n message: \"Unique `where.field` must be a non-empty string.\",\n code: \"INVALID_DOCUMENT_SHAPE\",\n });\n return undefined;\n }\n if (!(field in properties)) {\n issues.push({\n path: `${path}/field`,\n message: `Unique \\`where.field\\` \"${field}\" is not declared on this kind.`,\n code: \"UNKNOWN_UNIQUE_WHERE_FIELD\",\n });\n return undefined;\n }\n if (op !== \"isNull\" && op !== \"isNotNull\") {\n issues.push({\n path: `${path}/op`,\n message: `Unique \\`where.op\\` must be \"isNull\" or \"isNotNull\" (got ${describeUnknownValue(op)}).`,\n code: \"INVALID_UNIQUE_WHERE_OP\",\n });\n return undefined;\n }\n return { field, op };\n}\n\n// ============================================================\n// Annotations\n// ============================================================\n\nfunction validateAnnotations(\n raw: unknown,\n path: string,\n ownerLabel: string,\n issues: GraphExtensionIssue[],\n): KindAnnotations | undefined {\n if (raw === undefined) return undefined;\n if (!isPlainObject(raw)) {\n issues.push({\n path,\n message: `Annotations must be a plain JSON object.`,\n code: \"INVALID_ANNOTATION\",\n });\n return undefined;\n }\n\n try {\n assertJsonValue(raw, \"annotations\", ownerLabel);\n } catch (error) {\n if (error instanceof ConfigurationError) {\n const detailPath = (error.details as Record<string, unknown>)[\"path\"];\n const annotationPath =\n typeof detailPath === \"string\" ?\n `${path}/${detailPath\n .replace(/^annotations\\.?/, \"\")\n .replaceAll(\".\", \"/\")}`\n : path;\n issues.push({\n path: annotationPath,\n message: error.message,\n code: \"INVALID_ANNOTATION\",\n });\n return undefined;\n }\n throw error;\n }\n\n return raw as KindAnnotations;\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\n// Two-mode unknown-key handling — see `rejectUnknownPropertyKeys`\n// above. Strict authoring (`defineGraphExtension`,\n// `validateGraphExtension(_, { strict: true })`) rejects unknown\n// sibling keys at every property level so a `minLenght`-style typo\n// from an LLM proposal surfaces with a JSON-pointer path instead of\n// silently compiling to a weaker schema. Persistence load\n// (`validateGraphExtension(_, { strict: false })`, used by the\n// `createStoreWithSchema` reader) ignores unknown keys so a future\n// v1.x.y writer with additive refinements still parses on an older\n// v1 reader — the older compiler builds the Zod schema from the\n// refinements it recognizes, and the new modifier's behavior simply\n// isn't applied. `ExtensionPropertyType` is exported so consumers\n// writing runtime-shape generators can add their own strict-key check\n// if needed for additional validation slots beyond what this\n// validator covers.\n\nfunction validateNonNegativeInteger(\n value: unknown,\n path: string,\n label: string,\n code: GraphExtensionIssueCode,\n issues: GraphExtensionIssue[],\n): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n issues.push({\n path,\n message: `${label} must be a non-negative integer.`,\n code,\n });\n return undefined;\n }\n return value;\n}\n\nfunction validateOptionalString(\n value: unknown,\n path: string,\n label: string,\n code: GraphExtensionIssueCode,\n issues: GraphExtensionIssue[],\n): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") {\n issues.push({ path, message: `${label} must be a string.`, code });\n return undefined;\n }\n return value;\n}\n\nfunction validateOptionalBoolean(\n value: unknown,\n path: string,\n label: string,\n code: GraphExtensionIssueCode,\n issues: GraphExtensionIssue[],\n): boolean | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"boolean\") {\n issues.push({ path, message: `${label} must be a boolean.`, code });\n return undefined;\n }\n return value;\n}\n\nfunction validateOptionalFiniteNumber(\n value: unknown,\n path: string,\n label: string,\n code: GraphExtensionIssueCode,\n issues: GraphExtensionIssue[],\n): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n issues.push({ path, message: `${label} must be a finite number.`, code });\n return undefined;\n }\n return value;\n}\n\n/**\n * Discriminated result for optional-literal validation: callers branch\n * on `ok` so \"absent\" (`{ ok: true, value: undefined }`) is distinct from\n * \"invalid\" (`{ ok: false }`). Replaces the prior issue-counter trick\n * (`const before = issues.length; … if (issues.length > before) …`)\n * which conflated those two outcomes when the underlying helper\n * returned `T | undefined`.\n */\ntype OptionalLiteralResult<T> =\n Readonly<{ ok: true; value: T | undefined }> | Readonly<{ ok: false }>;\n\nfunction validateOptionalLiteral<T extends string>(\n value: unknown,\n allowed: readonly T[],\n path: string,\n label: string,\n code: GraphExtensionIssueCode,\n issues: GraphExtensionIssue[],\n): OptionalLiteralResult<T> {\n if (value === undefined) return { ok: true, value: undefined };\n if (typeof value !== \"string\" || !allowed.includes(value as T)) {\n const list = allowed.map((entry) => `\"${entry}\"`).join(\", \");\n issues.push({ path, message: `${label} must be one of: ${list}.`, code });\n return { ok: false };\n }\n return { ok: true, value: value as T };\n}\n\nfunction isValidKindName(name: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name);\n}\n\n/**\n * Renders an unknown value for inclusion in an error message without\n * tripping `[object Object]` from a generic `String()` call. Strings\n * are quoted; numbers, booleans, and null pass through; other values\n * use `JSON.stringify` and fall back to `typeof` if that fails.\n */\nfunction describeUnknownValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${value}\"`;\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return JSON.stringify(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return `(${typeof value})`;\n }\n}\n\n// ============================================================\n// Freezing\n// ============================================================\n\nfunction freezeDocument(input: {\n version: GraphExtensionVersion;\n nodes: Record<string, ExtensionNodeDef> | undefined;\n edges: Record<string, ExtensionEdgeDef> | undefined;\n ontology: readonly ExtensionOntologyRelation[] | undefined;\n indexes: readonly ExtensionIndex[] | undefined;\n}): GraphExtension {\n return Object.freeze(\n compactUndefined<{\n version: GraphExtensionVersion;\n nodes?: Record<string, ExtensionNodeDef>;\n edges?: Record<string, ExtensionEdgeDef>;\n ontology?: readonly ExtensionOntologyRelation[];\n indexes?: readonly ExtensionIndex[];\n }>({\n version: input.version,\n nodes: input.nodes === undefined ? undefined : freezeDeep(input.nodes),\n edges: input.edges === undefined ? undefined : freezeDeep(input.edges),\n ontology:\n input.ontology === undefined ?\n undefined\n : Object.freeze(\n input.ontology.map((entry) => Object.freeze({ ...entry })),\n ),\n indexes:\n input.indexes === undefined ?\n undefined\n : Object.freeze(input.indexes.map((entry) => freezeDeep({ ...entry }))),\n }),\n );\n}\n"]}
|
|
@@ -1,30 +1,6 @@
|
|
|
1
|
-
import { vectorPageClause } from './chunk-
|
|
2
|
-
import { quoteIdentifier, vectorScoreExpression, vectorMinScoreCondition, VECTOR_CONTRIBUTION_PREFIX,
|
|
3
|
-
import {
|
|
4
|
-
import { sql } from 'drizzle-orm';
|
|
5
|
-
import { customType } from 'drizzle-orm/pg-core';
|
|
6
|
-
|
|
7
|
-
customType({
|
|
8
|
-
dataType(config) {
|
|
9
|
-
return config?.dimensions ? `vector(${config.dimensions})` : "vector";
|
|
10
|
-
},
|
|
11
|
-
toDriver(value) {
|
|
12
|
-
return `[${value.join(",")}]`;
|
|
13
|
-
},
|
|
14
|
-
fromDriver(value) {
|
|
15
|
-
if (Array.isArray(value)) {
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
const content = value.slice(1, -1);
|
|
19
|
-
if (content === "") {
|
|
20
|
-
return [];
|
|
21
|
-
}
|
|
22
|
-
return content.split(",").map((s) => Number.parseFloat(s.trim()));
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
function formatVector(embedding) {
|
|
26
|
-
return `[${embedding.join(",")}]`;
|
|
27
|
-
}
|
|
1
|
+
import { vectorPageClause } from './chunk-EZH7FNUS.js';
|
|
2
|
+
import { vectorPhysicalName, quoteIdentifier, vectorScoreExpression, vectorMinScoreCondition, VECTOR_CONTRIBUTION_PREFIX, assertFiniteEmbedding } from './chunk-Y7M44XEK.js';
|
|
3
|
+
import { sql } from './chunk-6XDBRDZE.js';
|
|
28
4
|
|
|
29
5
|
// src/query/dialect/vector/pgvector-strategy.ts
|
|
30
6
|
var TABLE_PREFIX = "tg_vec";
|
|
@@ -86,7 +62,7 @@ function operatorClass(metric) {
|
|
|
86
62
|
}
|
|
87
63
|
function vectorLiteral(embedding, name) {
|
|
88
64
|
assertFiniteEmbedding(embedding, name);
|
|
89
|
-
return sql`${
|
|
65
|
+
return sql`${`[${embedding.join(",")}]`}::vector`;
|
|
90
66
|
}
|
|
91
67
|
function distanceExpression(embeddingColumn, queryEmbedding, metric) {
|
|
92
68
|
const query = vectorLiteral(queryEmbedding, "queryEmbedding");
|
|
@@ -106,14 +82,15 @@ function distanceExpression(embeddingColumn, queryEmbedding, metric) {
|
|
|
106
82
|
}
|
|
107
83
|
}
|
|
108
84
|
}
|
|
85
|
+
function tableName(graphId, nodeKind, fieldPath) {
|
|
86
|
+
return vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
|
|
87
|
+
}
|
|
109
88
|
var pgvectorStrategy = {
|
|
110
89
|
name: "pgvector",
|
|
111
90
|
capabilities: PGVECTOR_CAPABILITIES,
|
|
112
|
-
tableName
|
|
113
|
-
return vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);
|
|
114
|
-
},
|
|
91
|
+
tableName,
|
|
115
92
|
ownedTables(slot) {
|
|
116
|
-
const table =
|
|
93
|
+
const table = tableName(slot.graphId, slot.nodeKind, slot.fieldPath);
|
|
117
94
|
const name = quoteIdentifier(table);
|
|
118
95
|
const createDdl = [
|
|
119
96
|
`CREATE TABLE IF NOT EXISTS ${name} (
|
|
@@ -136,8 +113,8 @@ var pgvectorStrategy = {
|
|
|
136
113
|
];
|
|
137
114
|
},
|
|
138
115
|
buildUpsert(slot, params, timestamp) {
|
|
139
|
-
const table =
|
|
140
|
-
|
|
116
|
+
const table = sql.identifier(
|
|
117
|
+
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
141
118
|
);
|
|
142
119
|
const value = vectorLiteral(params.embedding, "embedding");
|
|
143
120
|
return [
|
|
@@ -150,8 +127,8 @@ var pgvectorStrategy = {
|
|
|
150
127
|
];
|
|
151
128
|
},
|
|
152
129
|
buildUpsertBatch(slot, params, timestamp) {
|
|
153
|
-
const table =
|
|
154
|
-
|
|
130
|
+
const table = sql.identifier(
|
|
131
|
+
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
155
132
|
);
|
|
156
133
|
const valueRows = sql.join(
|
|
157
134
|
params.rows.map(
|
|
@@ -169,8 +146,8 @@ var pgvectorStrategy = {
|
|
|
169
146
|
];
|
|
170
147
|
},
|
|
171
148
|
buildDelete(slot, params) {
|
|
172
|
-
const table =
|
|
173
|
-
|
|
149
|
+
const table = sql.identifier(
|
|
150
|
+
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
174
151
|
);
|
|
175
152
|
return [
|
|
176
153
|
sql`
|
|
@@ -180,8 +157,8 @@ var pgvectorStrategy = {
|
|
|
180
157
|
];
|
|
181
158
|
},
|
|
182
159
|
buildSearch(slot, params, candidates) {
|
|
183
|
-
const table =
|
|
184
|
-
|
|
160
|
+
const table = sql.identifier(
|
|
161
|
+
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
185
162
|
);
|
|
186
163
|
const embeddingColumn = sql`${table}."embedding"`;
|
|
187
164
|
const distance = distanceExpression(
|
|
@@ -190,7 +167,9 @@ var pgvectorStrategy = {
|
|
|
190
167
|
params.metric
|
|
191
168
|
);
|
|
192
169
|
const score = vectorScoreExpression(distance, params.metric);
|
|
193
|
-
const conditions = [
|
|
170
|
+
const conditions = [
|
|
171
|
+
sql`${table}."graph_id" = ${params.graphId}`
|
|
172
|
+
];
|
|
194
173
|
if (params.minScore !== void 0) {
|
|
195
174
|
conditions.push(
|
|
196
175
|
vectorMinScoreCondition(distance, params.metric, params.minScore)
|
|
@@ -232,7 +211,7 @@ var pgvectorStrategy = {
|
|
|
232
211
|
if (!usesAnnIndex(slot)) return void 0;
|
|
233
212
|
return sql.raw(
|
|
234
213
|
pgvectorIndexDdl(
|
|
235
|
-
|
|
214
|
+
tableName(slot.graphId, slot.nodeKind, slot.fieldPath),
|
|
236
215
|
slot,
|
|
237
216
|
options?.concurrent === true
|
|
238
217
|
)
|
|
@@ -245,7 +224,7 @@ var pgvectorStrategy = {
|
|
|
245
224
|
},
|
|
246
225
|
buildDropStorage(slot) {
|
|
247
226
|
const table = quoteIdentifier(
|
|
248
|
-
|
|
227
|
+
tableName(slot.graphId, slot.nodeKind, slot.fieldPath)
|
|
249
228
|
);
|
|
250
229
|
return [`DROP TABLE IF EXISTS ${table} CASCADE`];
|
|
251
230
|
}
|
|
@@ -286,5 +265,5 @@ function pgvectorIndexDdl(table, slot, concurrent) {
|
|
|
286
265
|
}
|
|
287
266
|
|
|
288
267
|
export { assertPgvectorEfSearch, pgvectorStrategy };
|
|
289
|
-
//# sourceMappingURL=chunk-
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
268
|
+
//# sourceMappingURL=chunk-SDHV2MWU.js.map
|
|
269
|
+
//# sourceMappingURL=chunk-SDHV2MWU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/query/dialect/vector/pgvector-strategy.ts"],"names":[],"mappings":"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","file":"chunk-SDHV2MWU.js","sourcesContent":["/**\n * pgvector strategy.\n *\n * Postgres' pgvector extension is the one engine where the *same* SQL serves\n * brute-force and ANN: `ORDER BY embedding <=> q LIMIT k` scans sequentially\n * with no index and is rewritten to an HNSW/IVFFlat scan the moment a matching\n * index exists — the planner picks it up automatically. So `buildSearch` never\n * branches on `slot.indexType`; it emits one relevance scan and lets Postgres\n * decide. (Contrast libSQL/sqlite-vec, whose ANN needs distinct syntax.)\n *\n * Storage is per-`(nodeKind, fieldPath)`: a `vector(N)` column carrying the\n * field's fixed dimension `N`, with the operator-class-typed ANN index folded\n * into the same table contribution so materialization builds table + index\n * together. The typed column means the index does not need the legacy\n * `::vector(N)` cast-in-index escape hatch the old shared table relied on.\n *\n * Metric support is the full pgvector set — `cosine`, `l2`, `inner_product` —\n * advertised as data on `capabilities`, mirroring `vector_cosine_ops` /\n * `vector_l2_ops` / `vector_ip_ops` and the `<=>` / `<->` / `<#>` operators.\n *\n * Mirrors the `libsqlVectorStrategy` / `sqliteVecStrategy` structure while\n * letting Postgres' planner pick the ANN index when one exists.\n */\nimport { type StrategyTableContribution } from \"../../../backend/table-contribution\";\nimport {\n type DeleteEmbeddingParams,\n type UpsertEmbeddingBatchParams,\n type UpsertEmbeddingParams,\n type VectorCapabilities,\n type VectorMetric,\n type VectorSearchParams,\n} from \"../../../backend/types\";\nimport { sql, type SqlFragment } from \"../../sql-fragment\";\nimport {\n assertFiniteEmbedding,\n quoteIdentifier,\n VECTOR_CONTRIBUTION_PREFIX,\n vectorMinScoreCondition,\n vectorPhysicalName,\n vectorScoreExpression,\n type VectorSlot,\n type VectorStrategy,\n} from \"../vector-strategy\";\nimport { vectorPageClause } from \"./pagination\";\n\n/** Physical-name prefixes for the per-field table and its ANN index. */\nconst TABLE_PREFIX = \"tg_vec\";\nconst INDEX_PREFIX = \"tg_vecidx\";\n\n/**\n * pgvector defines `hnsw.ef_search` as an integer GUC with a valid range\n * of 1..1000; `SET hnsw.ef_search = 1001` errors at the server. The\n * backend validates a per-search `efSearch` against this ceiling before\n * inlining it into `SET LOCAL`, surfacing a clear message instead of a raw\n * pgvector error.\n */\nexport const MAX_HNSW_EF_SEARCH = 1000;\n\n/**\n * Validates a per-search `efSearch` override against pgvector's\n * `hnsw.ef_search` valid range. `undefined` (no override) is accepted.\n */\nexport function assertPgvectorEfSearch(efSearch?: number): void {\n if (efSearch === undefined) return;\n if (!Number.isInteger(efSearch) || efSearch <= 0) {\n throw new Error(`efSearch must be a positive integer, got: ${efSearch}`);\n }\n if (efSearch > MAX_HNSW_EF_SEARCH) {\n throw new RangeError(\n `efSearch must be ≤ ${MAX_HNSW_EF_SEARCH} (pgvector's hnsw.ef_search ` +\n `valid range is 1..${MAX_HNSW_EF_SEARCH}), got: ${efSearch}`,\n );\n }\n}\n\n/**\n * pgvector's `vector` type caps at 16,000 dimensions for a stored column\n * (2,000 for an indexed column, but the column-type ceiling is what governs\n * storage; recall degradation beyond 2,000 is a tuning concern, not a hard\n * limit advertised here).\n */\nconst PGVECTOR_MAX_DIMENSIONS = 16_000;\n\n/** Default HNSW `m` (max connections per layer) — pgvector's own default. */\nconst DEFAULT_HNSW_M = 16;\n/** Default HNSW `ef_construction` (build candidate list) — pgvector's own default. */\nconst DEFAULT_HNSW_EF_CONSTRUCTION = 64;\n/** Default IVFFlat `lists` (inverted lists) — pgvector's own default. */\nconst DEFAULT_IVFFLAT_LISTS = 100;\n\nconst PGVECTOR_CAPABILITIES: VectorCapabilities = {\n supported: true,\n metrics: [\"cosine\", \"l2\", \"inner_product\"],\n indexTypes: [\"hnsw\", \"ivfflat\", \"none\"],\n maxDimensions: PGVECTOR_MAX_DIMENSIONS,\n // The backend probes `pg_extension.extversion` once and turns on\n // `hnsw.iterative_scan` / `ivfflat.iterative_scan` when pgvector >= 0.8, so a\n // filtered scan re-enters the index for more candidates.\n //\n // NOT a full-page guarantee, on either axis. The iterative scan stops at\n // `hnsw.max_scan_tuples` / `ivfflat.max_probes`; and on pgvector < 0.8 there\n // is no iterative scan at all, so the search stays `ef_search`-bounded and\n // behaves like a post-filter. A statically-declared mode cannot express\n // either, which is why the guarantee is its own field.\n filteredApproximateSearch: {\n mode: \"iterative-scan\",\n guaranteesFullPage: false,\n },\n};\n\n/** Whether a slot's declared index type materializes a real pgvector ANN index. */\nfunction usesAnnIndex(slot: VectorSlot): boolean {\n return slot.indexType === \"hnsw\" || slot.indexType === \"ivfflat\";\n}\n\n/**\n * pgvector operator class for a metric's ANN index — `vector_cosine_ops` /\n * `vector_l2_ops` / `vector_ip_ops`, mirroring the `<=>` / `<->` / `<#>`\n * distance operators this strategy emits.\n */\nfunction operatorClass(metric: VectorMetric): string {\n switch (metric) {\n case \"cosine\": {\n return \"vector_cosine_ops\";\n }\n case \"l2\": {\n return \"vector_l2_ops\";\n }\n case \"inner_product\": {\n return \"vector_ip_ops\";\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\n/**\n * Formats an embedding as a `::vector` literal. The value is bound as a\n * parameter (not interpolated) — Postgres parses the `[a,b,c]` text and the\n * cast types it. Finiteness is validated first so a NaN names its index.\n */\nfunction vectorLiteral(\n embedding: readonly number[],\n name: string,\n): SqlFragment {\n assertFiniteEmbedding(embedding, name);\n return sql`${`[${embedding.join(\",\")}]`}::vector`;\n}\n\nfunction distanceExpression(\n embeddingColumn: SqlFragment,\n queryEmbedding: readonly number[],\n metric: VectorMetric,\n): SqlFragment {\n const query = vectorLiteral(queryEmbedding, \"queryEmbedding\");\n switch (metric) {\n case \"cosine\": {\n return sql`(${embeddingColumn} <=> ${query})`;\n }\n case \"l2\": {\n return sql`(${embeddingColumn} <-> ${query})`;\n }\n case \"inner_product\": {\n return sql`(${embeddingColumn} <#> ${query})`;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\nfunction tableName(\n graphId: string,\n nodeKind: string,\n fieldPath: string,\n): string {\n return vectorPhysicalName(TABLE_PREFIX, graphId, nodeKind, fieldPath);\n}\n\nexport const pgvectorStrategy: VectorStrategy = {\n name: \"pgvector\",\n capabilities: PGVECTOR_CAPABILITIES,\n\n tableName,\n\n ownedTables(slot): readonly StrategyTableContribution[] {\n const table = tableName(slot.graphId, slot.nodeKind, slot.fieldPath);\n const name = quoteIdentifier(table);\n\n // No standalone graph_id index: the PRIMARY KEY (graph_id, node_id) already\n // covers `WHERE graph_id = ?` via its leading column, so a separate index\n // would be pure write amplification.\n const createDdl = [\n `CREATE TABLE IF NOT EXISTS ${name} (\n \"graph_id\" TEXT NOT NULL,\n \"node_id\" TEXT NOT NULL,\n \"embedding\" vector(${slot.dimensions}) NOT NULL,\n \"created_at\" TIMESTAMPTZ NOT NULL,\n \"updated_at\" TIMESTAMPTZ NOT NULL,\n PRIMARY KEY (\"graph_id\", \"node_id\")\n);`,\n ];\n\n // The HNSW/IVFFlat index is intentionally NOT created here. pgvector\n // similarity SQL is planner-driven (`ORDER BY embedding <=> q LIMIT k`\n // uses the index when present, sequential-scans when not), so the index\n // is a pure materialization concern: `buildCreateIndex` builds it through\n // `materializeIndexes()` with the field's declared `m`/`ef_construction`/\n // `lists`. Building it eagerly here would bake in default tuning (the\n // write-ensure slot has no `indexParams`) and `CREATE INDEX IF NOT EXISTS`\n // would then mask the tuned index materialization would emit.\n\n return [\n {\n logicalName: `${VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,\n owner: \"pgvector\",\n tableName: table,\n createDdl,\n runtimeEnsure: true,\n },\n ];\n },\n\n buildUpsert(\n slot,\n params: UpsertEmbeddingParams,\n timestamp,\n ): readonly SqlFragment[] {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const value = vectorLiteral(params.embedding, \"embedding\");\n return [\n sql`\n INSERT INTO ${table} (\"graph_id\", \"node_id\", \"embedding\", \"created_at\", \"updated_at\")\n VALUES (${params.graphId}, ${params.nodeId}, ${value}, ${timestamp}, ${timestamp})\n ON CONFLICT (\"graph_id\", \"node_id\")\n DO UPDATE SET \"embedding\" = EXCLUDED.\"embedding\", \"updated_at\" = EXCLUDED.\"updated_at\"\n `,\n ];\n },\n\n buildUpsertBatch(\n slot,\n params: UpsertEmbeddingBatchParams,\n timestamp,\n ): readonly SqlFragment[] {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const valueRows = sql.join(\n params.rows.map(\n (row) =>\n sql`(${params.graphId}, ${row.nodeId}, ${vectorLiteral(row.embedding, \"embedding\")}, ${timestamp}, ${timestamp})`,\n ),\n sql`, `,\n );\n return [\n sql`\n INSERT INTO ${table} (\"graph_id\", \"node_id\", \"embedding\", \"created_at\", \"updated_at\")\n VALUES ${valueRows}\n ON CONFLICT (\"graph_id\", \"node_id\")\n DO UPDATE SET \"embedding\" = EXCLUDED.\"embedding\", \"updated_at\" = EXCLUDED.\"updated_at\"\n `,\n ];\n },\n\n buildDelete(slot, params: DeleteEmbeddingParams): readonly SqlFragment[] {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n return [\n sql`\n DELETE FROM ${table}\n WHERE \"graph_id\" = ${params.graphId} AND \"node_id\" = ${params.nodeId}\n `,\n ];\n },\n\n buildSearch(\n slot,\n params: VectorSearchParams,\n candidates?: SqlFragment,\n ): SqlFragment {\n const table = sql.identifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n const embeddingColumn = sql`${table}.\"embedding\"`;\n const distance = distanceExpression(\n embeddingColumn,\n params.queryEmbedding,\n params.metric,\n );\n const score = vectorScoreExpression(distance, params.metric);\n\n // Same SQL for brute-force and ANN: with a matching HNSW/IVFFlat index the\n // Postgres planner rewrites this `ORDER BY distance LIMIT k` into an index\n // scan automatically, so the strategy never branches on `slot.indexType`.\n const conditions: SqlFragment[] = [\n sql`${table}.\"graph_id\" = ${params.graphId}`,\n ];\n if (params.minScore !== undefined) {\n conditions.push(\n vectorMinScoreCondition(distance, params.metric, params.minScore),\n );\n }\n // Candidate pushdown keeps the HNSW scan (verified plan: HNSW Index Scan\n // -> Nested Loop probe of the nodes pkey -> Limit). Exact under\n // `hnsw.iterative_scan` (pgvector >= 0.8, applied by the backend);\n // bounded by `ef_search` on older pgvector — still strictly better than\n // ranking tombstones into top-k and dropping them post-hoc.\n //\n // Plain `IN (subquery)`: with fresh statistics the planner hashes it\n // (brute-force scans) or drives per-row probes of the nodes pkey\n // under the ordered HNSW scan — the plan-verified shape the liveness\n // pushdown was built on. Stale statistics degrade any membership\n // form; the answer is `store.refreshStatistics()` after bulk loads,\n // not a cleverer SQL shape.\n if (candidates !== undefined) {\n conditions.push(sql`${table}.\"node_id\" IN (${candidates})`);\n }\n // Pagination is rank-relative: the scan fetches `limit + offset`\n // ordered candidates and OFFSET discards the leading page.\n const pageOffset = params.offset ?? 0;\n const pageClause = vectorPageClause(params.limit, params.offset);\n // IVFFlat's iterative scan only offers `relaxed_order` (no\n // strict_order mode), so under the backend-applied\n // `ivfflat.iterative_scan` the index may emit the candidate set\n // slightly out of distance order. Re-sort the bounded set inside a\n // MATERIALIZED wrapper — the fence stops the planner from collapsing\n // the sort back into the index scan's claimed ordering — and page in\n // the wrapper: an OFFSET inside the relaxed scan could discard the\n // wrong rows. Score is monotone in distance, so ordering by score per\n // the metric's direction restores exact ranking.\n if (slot.indexType === \"ivfflat\") {\n const direction =\n params.metric === \"cosine\" ? sql.raw(\"DESC\") : sql.raw(\"ASC\");\n const relaxedBody = sql`\n SELECT ${table}.\"node_id\" AS node_id, ${score} AS score\n FROM ${table}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distance} ASC\n LIMIT ${params.limit + pageOffset}\n `;\n return sql`\n WITH tg_vec_relaxed AS MATERIALIZED (${relaxedBody})\n SELECT node_id, score FROM tg_vec_relaxed\n ORDER BY score ${direction}, node_id ASC\n ${pageClause}\n `;\n }\n return sql`\n SELECT ${table}.\"node_id\" AS node_id, ${score} AS score\n FROM ${table}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distance} ASC\n ${pageClause}\n `;\n },\n\n distanceExpression(embeddingColumn, queryEmbedding, metric) {\n return distanceExpression(embeddingColumn, queryEmbedding, metric);\n },\n\n buildCreateIndex(slot, options): SqlFragment | undefined {\n if (!usesAnnIndex(slot)) return undefined;\n return sql.raw(\n pgvectorIndexDdl(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n slot,\n options?.concurrent === true,\n ),\n );\n },\n\n buildDropIndex(slot): SqlFragment | undefined {\n if (!usesAnnIndex(slot)) return undefined;\n const indexName = pgvectorIndexName(slot);\n return sql.raw(`DROP INDEX IF EXISTS ${quoteIdentifier(indexName)}`);\n },\n\n buildDropStorage(slot): readonly string[] {\n const table = quoteIdentifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n // CASCADE drops the ANN index along with the table.\n return [`DROP TABLE IF EXISTS ${table} CASCADE`];\n },\n};\n\nfunction pgvectorIndexName(slot: VectorSlot): string {\n return vectorPhysicalName(\n INDEX_PREFIX,\n slot.graphId,\n slot.nodeKind,\n slot.fieldPath,\n );\n}\n\nfunction pgvectorIndexDdl(\n table: string,\n slot: VectorSlot,\n concurrent: boolean,\n): string {\n const indexName = quoteIdentifier(pgvectorIndexName(slot));\n const quotedTable = quoteIdentifier(table);\n const opClass = operatorClass(slot.metric);\n // Honor the field's declared tuning; fall back to pgvector defaults.\n const m = slot.indexParams?.m ?? DEFAULT_HNSW_M;\n const efConstruction =\n slot.indexParams?.efConstruction ?? DEFAULT_HNSW_EF_CONSTRUCTION;\n const lists = slot.indexParams?.lists ?? DEFAULT_IVFFLAT_LISTS;\n // CONCURRENTLY builds without taking a write-blocking lock on the live table\n // (materializeIndexes passes concurrent on Postgres). Run outside a tx.\n const create = `CREATE INDEX${concurrent ? \" CONCURRENTLY\" : \"\"} IF NOT EXISTS`;\n\n switch (slot.indexType) {\n case \"hnsw\": {\n return `${create} ${indexName} ON ${quotedTable} USING hnsw (\"embedding\" ${opClass}) WITH (m = ${m}, ef_construction = ${efConstruction});`;\n }\n case \"ivfflat\": {\n return `${create} ${indexName} ON ${quotedTable} USING ivfflat (\"embedding\" ${opClass}) WITH (lists = ${lists});`;\n }\n case \"none\": {\n throw new Error(\n \"pgvectorIndexDdl called for a brute-force-only slot (indexType 'none').\",\n );\n }\n default: {\n const _exhaustive: never = slot.indexType;\n throw new Error(`Unsupported vector index type: ${String(_exhaustive)}`);\n }\n }\n}\n"]}
|