@nicia-ai/typegraph 0.43.0 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/drizzle/indexes.cjs +9 -9
- package/dist/backend/drizzle/indexes.d.cts +1 -1
- package/dist/backend/drizzle/indexes.d.ts +1 -1
- package/dist/backend/drizzle/indexes.js +5 -5
- package/dist/backend/index.cjs +50 -50
- package/dist/backend/index.d.cts +3 -3
- package/dist/backend/index.d.ts +3 -3
- package/dist/backend/index.js +11 -11
- package/dist/backend/postgres/index.cjs +26 -26
- package/dist/backend/postgres/index.d.cts +6 -5
- package/dist/backend/postgres/index.d.ts +6 -5
- package/dist/backend/postgres/index.js +13 -13
- package/dist/backend/postgres/pglite-store.cjs +32 -33
- package/dist/backend/postgres/pglite-store.cjs.map +1 -1
- package/dist/backend/postgres/pglite-store.d.cts +7 -7
- package/dist/backend/postgres/pglite-store.d.ts +7 -7
- package/dist/backend/postgres/pglite-store.js +28 -29
- package/dist/backend/postgres/pglite-store.js.map +1 -1
- package/dist/backend/postgres/pglite.cjs +15 -15
- package/dist/backend/postgres/pglite.d.cts +3 -2
- package/dist/backend/postgres/pglite.d.ts +3 -2
- package/dist/backend/postgres/pglite.js +14 -14
- package/dist/backend/sqlite/index.cjs +23 -23
- package/dist/backend/sqlite/index.d.cts +7 -6
- package/dist/backend/sqlite/index.d.ts +7 -6
- package/dist/backend/sqlite/index.js +11 -11
- package/dist/backend/sqlite/libsql.cjs +17 -17
- package/dist/backend/sqlite/libsql.cjs.map +1 -1
- package/dist/backend/sqlite/libsql.d.cts +3 -2
- package/dist/backend/sqlite/libsql.d.ts +3 -2
- package/dist/backend/sqlite/libsql.js +13 -13
- package/dist/backend/sqlite/libsql.js.map +1 -1
- package/dist/backend/sqlite/local-store.cjs +33 -34
- package/dist/backend/sqlite/local-store.cjs.map +1 -1
- package/dist/backend/sqlite/local-store.d.cts +8 -7
- package/dist/backend/sqlite/local-store.d.ts +8 -7
- package/dist/backend/sqlite/local-store.js +29 -30
- package/dist/backend/sqlite/local-store.js.map +1 -1
- package/dist/backend/sqlite/local.cjs +16 -16
- package/dist/backend/sqlite/local.d.cts +3 -2
- package/dist/backend/sqlite/local.d.ts +3 -2
- package/dist/backend/sqlite/local.js +14 -14
- package/dist/{chunk-2OOY4OYT.js → chunk-2L54C2C2.js} +4 -4
- package/dist/{chunk-2OOY4OYT.js.map → chunk-2L54C2C2.js.map} +1 -1
- package/dist/{chunk-4WYFRACU.js → chunk-42PYUGLS.js} +58 -4
- package/dist/chunk-42PYUGLS.js.map +1 -0
- package/dist/{chunk-EQOQOT55.js → chunk-4GUBTVPV.js} +4 -5
- package/dist/chunk-4GUBTVPV.js.map +1 -0
- package/dist/{chunk-ZIRC2U6G.js → chunk-4GUTQPVO.js} +102 -16
- package/dist/chunk-4GUTQPVO.js.map +1 -0
- package/dist/{chunk-OYJSYDIH.js → chunk-4MB3AQAQ.js} +13 -3
- package/dist/chunk-4MB3AQAQ.js.map +1 -0
- package/dist/{chunk-5Q3P6OIC.cjs → chunk-4MEWSUVM.cjs} +12 -12
- package/dist/chunk-4MEWSUVM.cjs.map +1 -0
- package/dist/{chunk-VC26BUNP.js → chunk-4QIKLIGG.js} +17 -5
- package/dist/chunk-4QIKLIGG.js.map +1 -0
- package/dist/chunk-4SZ6XPTG.cjs +12 -0
- package/dist/{chunk-VGMNGWBR.cjs.map → chunk-4SZ6XPTG.cjs.map} +1 -1
- package/dist/{chunk-UZLEQFTV.js → chunk-55ITBQJI.js} +4 -4
- package/dist/chunk-55ITBQJI.js.map +1 -0
- package/dist/{chunk-JOYPNY33.js → chunk-5EKPX6QU.js} +9 -9
- package/dist/{chunk-JOYPNY33.js.map → chunk-5EKPX6QU.js.map} +1 -1
- package/dist/{chunk-TRC646QQ.cjs → chunk-5GAONX5G.cjs} +7 -7
- package/dist/{chunk-TRC646QQ.cjs.map → chunk-5GAONX5G.cjs.map} +1 -1
- package/dist/{chunk-M4GYQF2H.js → chunk-6DCB664D.js} +7 -4
- package/dist/chunk-6DCB664D.js.map +1 -0
- package/dist/{chunk-64LERBFM.cjs → chunk-6RYPD3NJ.cjs} +75 -65
- package/dist/chunk-6RYPD3NJ.cjs.map +1 -0
- package/dist/{chunk-5AERZSHC.cjs → chunk-7PF2L3H6.cjs} +4 -4
- package/dist/{chunk-5AERZSHC.cjs.map → chunk-7PF2L3H6.cjs.map} +1 -1
- package/dist/chunk-B3F2D3SP.cjs +12 -0
- package/dist/{chunk-U3YRCZ5L.cjs.map → chunk-B3F2D3SP.cjs.map} +1 -1
- package/dist/{chunk-Z3WIL6S3.js → chunk-BGYJW37L.js} +5 -5
- package/dist/{chunk-Z3WIL6S3.js.map → chunk-BGYJW37L.js.map} +1 -1
- package/dist/{chunk-DMZEVJGL.cjs → chunk-BNS75YNF.cjs} +12 -13
- package/dist/chunk-BNS75YNF.cjs.map +1 -0
- package/dist/{chunk-KTBTSHU6.cjs → chunk-C4F7VJ5D.cjs} +13 -3
- package/dist/chunk-C4F7VJ5D.cjs.map +1 -0
- package/dist/{chunk-L2BYRYHC.js → chunk-CBKG6HEP.js} +43 -33
- package/dist/chunk-CBKG6HEP.js.map +1 -0
- package/dist/{chunk-CVK4T34X.cjs → chunk-CPEL3YIR.cjs} +22 -22
- package/dist/{chunk-CVK4T34X.cjs.map → chunk-CPEL3YIR.cjs.map} +1 -1
- package/dist/{chunk-O2GZM7UK.cjs → chunk-D54WH24V.cjs} +62 -7
- package/dist/chunk-D54WH24V.cjs.map +1 -0
- package/dist/{chunk-33PAKPED.cjs → chunk-D56XG4EI.cjs} +53 -41
- package/dist/chunk-D56XG4EI.cjs.map +1 -0
- package/dist/{chunk-O3USVVWS.js → chunk-DK2S42XB.js} +3 -3
- package/dist/{chunk-O3USVVWS.js.map → chunk-DK2S42XB.js.map} +1 -1
- package/dist/{chunk-HHBKGPEI.js → chunk-DXEEHSGN.js} +517 -26
- package/dist/chunk-DXEEHSGN.js.map +1 -0
- package/dist/{chunk-UJRWOV5B.js → chunk-EFEOOCJ3.js} +5 -5
- package/dist/{chunk-UJRWOV5B.js.map → chunk-EFEOOCJ3.js.map} +1 -1
- package/dist/{chunk-ECU53PMN.cjs → chunk-EKFUG4G7.cjs} +5 -5
- package/dist/chunk-EKFUG4G7.cjs.map +1 -0
- package/dist/{chunk-FSCJOTHF.cjs → chunk-EQ7JKLZO.cjs} +10 -10
- package/dist/{chunk-FSCJOTHF.cjs.map → chunk-EQ7JKLZO.cjs.map} +1 -1
- package/dist/{chunk-AQR6BHB3.cjs → chunk-F4NHQHEZ.cjs} +10 -10
- package/dist/{chunk-AQR6BHB3.cjs.map → chunk-F4NHQHEZ.cjs.map} +1 -1
- package/dist/{chunk-2G6ZEGYO.js → chunk-FL5UQRES.js} +4 -4
- package/dist/{chunk-2G6ZEGYO.js.map → chunk-FL5UQRES.js.map} +1 -1
- package/dist/{chunk-ZP2KPDNN.js → chunk-FLEQ2HBK.js} +3 -3
- package/dist/{chunk-ZP2KPDNN.js.map → chunk-FLEQ2HBK.js.map} +1 -1
- package/dist/{chunk-RAWG2FEU.js → chunk-FQ7ZPOTZ.js} +264 -18
- package/dist/chunk-FQ7ZPOTZ.js.map +1 -0
- package/dist/{chunk-O7XVCLXW.cjs → chunk-H7VE3FL4.cjs} +577 -82
- package/dist/chunk-H7VE3FL4.cjs.map +1 -0
- package/dist/{chunk-JNXZQBN3.js → chunk-ID4WXTKL.js} +1039 -482
- package/dist/chunk-ID4WXTKL.js.map +1 -0
- package/dist/{chunk-ZGOUVMVS.js → chunk-ISLPNELU.js} +17 -5
- package/dist/chunk-ISLPNELU.js.map +1 -0
- package/dist/{chunk-I73ATSAH.cjs → chunk-IX64T5OL.cjs} +4 -4
- package/dist/{chunk-I73ATSAH.cjs.map → chunk-IX64T5OL.cjs.map} +1 -1
- package/dist/{chunk-XDMPDUKL.cjs → chunk-J2ICGNHO.cjs} +8 -9
- package/dist/chunk-J2ICGNHO.cjs.map +1 -0
- package/dist/{chunk-KDRF3NR2.cjs → chunk-J7LXTUTP.cjs} +295 -201
- package/dist/chunk-J7LXTUTP.cjs.map +1 -0
- package/dist/{chunk-AO2WPYFZ.cjs → chunk-JQXSZHF2.cjs} +14 -4
- package/dist/chunk-JQXSZHF2.cjs.map +1 -0
- package/dist/{chunk-UTTW2Q3M.cjs → chunk-JXUTCSXX.cjs} +197 -133
- package/dist/chunk-JXUTCSXX.cjs.map +1 -0
- package/dist/{chunk-GT7NEXSU.js → chunk-KCO5EFJU.js} +3 -3
- package/dist/{chunk-GT7NEXSU.js.map → chunk-KCO5EFJU.js.map} +1 -1
- package/dist/{chunk-ARN3ZODS.cjs → chunk-KKYELPZ2.cjs} +6 -6
- package/dist/{chunk-ARN3ZODS.cjs.map → chunk-KKYELPZ2.cjs.map} +1 -1
- package/dist/{chunk-7Y6BV3TK.cjs → chunk-KMXWZLQX.cjs} +100 -100
- package/dist/{chunk-7Y6BV3TK.cjs.map → chunk-KMXWZLQX.cjs.map} +1 -1
- package/dist/{chunk-CDYRPI5U.js → chunk-MIJKEVV7.js} +4 -4
- package/dist/{chunk-CDYRPI5U.js.map → chunk-MIJKEVV7.js.map} +1 -1
- package/dist/{chunk-FFQGI67R.cjs → chunk-NAAMUYMS.cjs} +56 -44
- package/dist/chunk-NAAMUYMS.cjs.map +1 -0
- package/dist/{chunk-6TJ6PKPS.cjs → chunk-OOA273IJ.cjs} +27 -27
- package/dist/{chunk-6TJ6PKPS.cjs.map → chunk-OOA273IJ.cjs.map} +1 -1
- package/dist/{chunk-F2KVJ6FF.cjs → chunk-P7GTYOLB.cjs} +203 -117
- package/dist/chunk-P7GTYOLB.cjs.map +1 -0
- package/dist/{chunk-42XYPKZU.js → chunk-PVUI6KGR.js} +67 -3
- package/dist/chunk-PVUI6KGR.js.map +1 -0
- package/dist/{chunk-L5AUCL5P.js → chunk-Q6EDCUXV.js} +274 -14
- package/dist/chunk-Q6EDCUXV.js.map +1 -0
- package/dist/{chunk-ZPCKPLMX.cjs → chunk-QB6VMOJ2.cjs} +8 -8
- package/dist/{chunk-ZPCKPLMX.cjs.map → chunk-QB6VMOJ2.cjs.map} +1 -1
- package/dist/{chunk-3RPQDGUE.cjs → chunk-QC4MCOFV.cjs} +5 -5
- package/dist/{chunk-3RPQDGUE.cjs.map → chunk-QC4MCOFV.cjs.map} +1 -1
- package/dist/{chunk-4XRP2N6B.js → chunk-QLUXRWKL.js} +3 -3
- package/dist/{chunk-4XRP2N6B.js.map → chunk-QLUXRWKL.js.map} +1 -1
- package/dist/{chunk-OM6RIOA5.cjs → chunk-QR24DJDF.cjs} +13 -13
- package/dist/{chunk-OM6RIOA5.cjs.map → chunk-QR24DJDF.cjs.map} +1 -1
- package/dist/{chunk-YPVQYM3L.js → chunk-QRNYDV5Z.js} +138 -31
- package/dist/chunk-QRNYDV5Z.js.map +1 -0
- package/dist/{chunk-ZOHCFYXE.js → chunk-QT6V3YRH.js} +3 -3
- package/dist/{chunk-ZOHCFYXE.js.map → chunk-QT6V3YRH.js.map} +1 -1
- package/dist/{chunk-5C75HQYQ.js → chunk-RFRM3Q5K.js} +17 -5
- package/dist/chunk-RFRM3Q5K.js.map +1 -0
- package/dist/{chunk-NXIZL7ZZ.js → chunk-RUQS6M7G.js} +6 -6
- package/dist/chunk-RUQS6M7G.js.map +1 -0
- package/dist/{chunk-CI5NPLXX.js → chunk-S3ZRKJHY.js} +3 -3
- package/dist/{chunk-CI5NPLXX.js.map → chunk-S3ZRKJHY.js.map} +1 -1
- package/dist/{chunk-3V6D5DEC.js → chunk-S4KQ5LV4.js} +3 -3
- package/dist/{chunk-3V6D5DEC.js.map → chunk-S4KQ5LV4.js.map} +1 -1
- package/dist/{chunk-CTWZPYJW.js → chunk-TKORQCG4.js} +108 -15
- package/dist/chunk-TKORQCG4.js.map +1 -0
- package/dist/{chunk-2HKIID5K.js → chunk-TKP5T34P.js} +4 -5
- package/dist/chunk-TKP5T34P.js.map +1 -0
- package/dist/{chunk-X2XOQZT3.cjs → chunk-U5W4LKZV.cjs} +13 -9
- package/dist/chunk-U5W4LKZV.cjs.map +1 -0
- package/dist/{chunk-BLBG2VZ5.cjs → chunk-UCQ3BFSY.cjs} +372 -110
- package/dist/chunk-UCQ3BFSY.cjs.map +1 -0
- package/dist/{chunk-CUPJL6TS.js → chunk-V34A6R5V.js} +13 -4
- package/dist/chunk-V34A6R5V.js.map +1 -0
- package/dist/{chunk-LQLVJWUH.js → chunk-VTN3C3CH.js} +7 -7
- package/dist/chunk-VTN3C3CH.js.map +1 -0
- package/dist/{chunk-FY4VY5EV.cjs → chunk-VVQM4CZD.cjs} +20 -20
- package/dist/chunk-VVQM4CZD.cjs.map +1 -0
- package/dist/{chunk-LDCWO5B6.js → chunk-WDAVPX46.js} +3 -3
- package/dist/{chunk-LDCWO5B6.js.map → chunk-WDAVPX46.js.map} +1 -1
- package/dist/{chunk-5GV4JQNA.cjs → chunk-WDBXJOU5.cjs} +55 -43
- package/dist/chunk-WDBXJOU5.cjs.map +1 -0
- package/dist/{chunk-FMPZPOUD.js → chunk-WUFASQUO.js} +3 -3
- package/dist/{chunk-FMPZPOUD.js.map → chunk-WUFASQUO.js.map} +1 -1
- package/dist/{chunk-5ZPRE4CV.cjs → chunk-YDWLUT5V.cjs} +237 -130
- package/dist/chunk-YDWLUT5V.cjs.map +1 -0
- package/dist/{chunk-CVNGKTHO.js → chunk-YMTXMPV6.js} +4 -4
- package/dist/{chunk-CVNGKTHO.js.map → chunk-YMTXMPV6.js.map} +1 -1
- package/dist/{chunk-NDQLPKBX.cjs → chunk-YOALGKRE.cjs} +2092 -1535
- package/dist/chunk-YOALGKRE.cjs.map +1 -0
- package/dist/{chunk-OMQ2NBOR.cjs → chunk-Z3WO6MND.cjs} +27 -27
- package/dist/{chunk-OMQ2NBOR.cjs.map → chunk-Z3WO6MND.cjs.map} +1 -1
- package/dist/{chunk-V2GZBPY2.cjs → chunk-ZI6VQSZA.cjs} +310 -61
- package/dist/chunk-ZI6VQSZA.cjs.map +1 -0
- package/dist/{chunk-ZBV4LQD2.cjs → chunk-ZTAJL4DT.cjs} +4 -4
- package/dist/{chunk-ZBV4LQD2.cjs.map → chunk-ZTAJL4DT.cjs.map} +1 -1
- package/dist/core/index.cjs +27 -28
- package/dist/core/index.d.cts +5 -5
- package/dist/core/index.d.ts +5 -5
- package/dist/core/index.js +7 -8
- package/dist/{ddl-3unqC-kg.d.cts → ddl-BG4J805L.d.cts} +3 -3
- package/dist/{ddl-Bc4Dl8fu.d.ts → ddl-CgiS9QLj.d.ts} +3 -3
- package/dist/{define-graph-DBFnc7u_.d.ts → define-graph-BGrJahvp.d.ts} +1 -1
- package/dist/{define-graph-Byslw2OO.d.cts → define-graph-alREY2wj.d.cts} +1 -1
- package/dist/graph-extension/index.cjs +19 -20
- package/dist/graph-extension/index.d.cts +4 -4
- package/dist/graph-extension/index.d.ts +4 -4
- package/dist/graph-extension/index.js +4 -5
- package/dist/graph-merge/index.cjs +103 -104
- package/dist/graph-merge/index.cjs.map +1 -1
- package/dist/graph-merge/index.d.cts +9 -8
- package/dist/graph-merge/index.d.ts +9 -8
- package/dist/graph-merge/index.js +23 -24
- package/dist/graph-merge/index.js.map +1 -1
- package/dist/{index-DHXw7QAl.d.cts → index-BBxZCUdu.d.ts} +37 -7
- package/dist/{index-DQzVJBHa.d.ts → index-C3y_98iN.d.cts} +37 -7
- package/dist/index.cjs +209 -202
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -13
- package/dist/index.d.ts +13 -13
- package/dist/index.js +33 -34
- package/dist/index.js.map +1 -1
- package/dist/indexes/index.cjs +13 -13
- package/dist/indexes/index.d.cts +4 -4
- package/dist/indexes/index.d.ts +4 -4
- package/dist/indexes/index.js +6 -6
- package/dist/interchange/index.cjs +50 -41
- package/dist/interchange/index.cjs.map +1 -1
- package/dist/interchange/index.d.cts +11 -11
- package/dist/interchange/index.d.ts +11 -11
- package/dist/interchange/index.js +24 -15
- package/dist/interchange/index.js.map +1 -1
- package/dist/{manager-U9_zopqr.d.cts → manager-KS7CGQQT.d.cts} +44 -6
- package/dist/{manager-Dl0-er1G.d.ts → manager-YoLEfcc1.d.ts} +44 -6
- package/dist/{materialize-indexes-BM3u0aXE.d.ts → materialize-indexes-Bhhyb1B3.d.ts} +1 -1
- package/dist/{materialize-indexes-DzMCetZe.d.cts → materialize-indexes-OHRWypW6.d.cts} +1 -1
- package/dist/{postgres-DpJqtbSX.d.cts → postgres-DpkW3R5Y.d.cts} +1 -1
- package/dist/{postgres-C5-WMKFA.d.ts → postgres-DwqyIniy.d.ts} +1 -1
- package/dist/profiler/index.d.cts +10 -9
- package/dist/profiler/index.d.ts +10 -9
- package/dist/provenance/index.cjs +38 -38
- package/dist/provenance/index.cjs.map +1 -1
- package/dist/provenance/index.d.cts +7 -7
- package/dist/provenance/index.d.ts +7 -7
- package/dist/provenance/index.js +8 -8
- package/dist/provenance/index.js.map +1 -1
- package/dist/schema/index.cjs +40 -41
- package/dist/schema/index.d.cts +7 -7
- package/dist/schema/index.d.ts +7 -7
- package/dist/schema/index.js +13 -14
- package/dist/{searchable-B4mUXZT6.d.cts → searchable-CIZL8Hyw.d.cts} +2 -2
- package/dist/{searchable-C7jmPNLT.d.ts → searchable-DLWEfC4a.d.ts} +2 -2
- package/dist/{sqlite-Ch5tSYQY.d.ts → sqlite-DY0WODUK.d.cts} +1 -1
- package/dist/{sqlite-Da7jiYu9.d.cts → sqlite-L-VIRzqA.d.ts} +1 -1
- package/dist/{store-view-DdwBNjZQ.d.ts → store-view-66p92IPi.d.ts} +1974 -1751
- package/dist/{store-view-D1F6KqsE.d.cts → store-view-A85FFRnk.d.cts} +1974 -1751
- package/dist/{temporal-CMpigMCW.d.cts → temporal-BNbjXqer.d.cts} +1 -1
- package/dist/{temporal-BtrTYTiB.d.ts → temporal-Bob6Nfbp.d.ts} +1 -1
- package/dist/{types-Dh-EgT-w.d.cts → types-Ch9a0Dx6.d.cts} +483 -20
- package/dist/{types-Dh-EgT-w.d.ts → types-Ch9a0Dx6.d.ts} +483 -20
- package/dist/{types-D2rU5Taq.d.ts → types-ClCzT-dT.d.ts} +1 -1
- package/dist/{types-G4sVM-76.d.cts → types-DeORZhxn.d.cts} +1 -1
- package/dist/{where-DbZ9XDOI.d.cts → where-DPw52ksb.d.cts} +1 -1
- package/dist/{where-B8Y21kig.d.ts → where-kWUZPvEA.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-2HKIID5K.js.map +0 -1
- package/dist/chunk-33PAKPED.cjs.map +0 -1
- package/dist/chunk-42XYPKZU.js.map +0 -1
- package/dist/chunk-4WYFRACU.js.map +0 -1
- package/dist/chunk-5C75HQYQ.js.map +0 -1
- package/dist/chunk-5GV4JQNA.cjs.map +0 -1
- package/dist/chunk-5Q3P6OIC.cjs.map +0 -1
- package/dist/chunk-5ZPRE4CV.cjs.map +0 -1
- package/dist/chunk-64LERBFM.cjs.map +0 -1
- package/dist/chunk-AO2WPYFZ.cjs.map +0 -1
- package/dist/chunk-BLBG2VZ5.cjs.map +0 -1
- package/dist/chunk-CTWZPYJW.js.map +0 -1
- package/dist/chunk-CUPJL6TS.js.map +0 -1
- package/dist/chunk-DMZEVJGL.cjs.map +0 -1
- package/dist/chunk-ECU53PMN.cjs.map +0 -1
- package/dist/chunk-EQOQOT55.js.map +0 -1
- package/dist/chunk-F2KVJ6FF.cjs.map +0 -1
- package/dist/chunk-F7TDKSVB.cjs +0 -61
- package/dist/chunk-F7TDKSVB.cjs.map +0 -1
- package/dist/chunk-FFQGI67R.cjs.map +0 -1
- package/dist/chunk-FY4VY5EV.cjs.map +0 -1
- package/dist/chunk-HHBKGPEI.js.map +0 -1
- package/dist/chunk-JNXZQBN3.js.map +0 -1
- package/dist/chunk-KDRF3NR2.cjs.map +0 -1
- package/dist/chunk-KTBTSHU6.cjs.map +0 -1
- package/dist/chunk-L2BYRYHC.js.map +0 -1
- package/dist/chunk-L5AUCL5P.js.map +0 -1
- package/dist/chunk-LQLVJWUH.js.map +0 -1
- package/dist/chunk-M4GYQF2H.js.map +0 -1
- package/dist/chunk-NDQLPKBX.cjs.map +0 -1
- package/dist/chunk-NXIZL7ZZ.js.map +0 -1
- package/dist/chunk-O2GZM7UK.cjs.map +0 -1
- package/dist/chunk-O7XVCLXW.cjs.map +0 -1
- package/dist/chunk-OYJSYDIH.js.map +0 -1
- package/dist/chunk-RAWG2FEU.js.map +0 -1
- package/dist/chunk-RXOAXO3R.js +0 -59
- package/dist/chunk-RXOAXO3R.js.map +0 -1
- package/dist/chunk-U3YRCZ5L.cjs +0 -12
- package/dist/chunk-UTTW2Q3M.cjs.map +0 -1
- package/dist/chunk-UZLEQFTV.js.map +0 -1
- package/dist/chunk-V2GZBPY2.cjs.map +0 -1
- package/dist/chunk-VC26BUNP.js.map +0 -1
- package/dist/chunk-VGMNGWBR.cjs +0 -12
- package/dist/chunk-X2XOQZT3.cjs.map +0 -1
- package/dist/chunk-XDMPDUKL.cjs.map +0 -1
- package/dist/chunk-YPVQYM3L.js.map +0 -1
- package/dist/chunk-ZGOUVMVS.js.map +0 -1
- package/dist/chunk-ZIRC2U6G.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/query/dialect/vector/sqlite-vec-strategy.ts"],"names":["conditions"],"mappings":"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","file":"chunk-VC26BUNP.js","sourcesContent":["/**\n * sqlite-vec strategy — real `vec0` KNN for local SQLite.\n *\n * This upgrades `createLocalSqliteBackend` (better-sqlite3 + the sqlite-vec\n * extension) from the legacy brute-force-on-a-shared-table model to genuine\n * approximate-nearest-neighbor search on per-`(nodeKind, fieldPath)` storage.\n *\n * ## Storage choice: a `vec0` virtual table per field\n *\n * Each slot is backed by its own `vec0` virtual table:\n *\n * ```sql\n * CREATE VIRTUAL TABLE tg_vec_<kind>_<field> USING vec0(\n * node_id TEXT PRIMARY KEY,\n * graph_id TEXT PARTITION KEY,\n * +created_at TEXT,\n * +updated_at TEXT,\n * embedding float[<N>] distance_metric=<cosine|l2>\n * );\n * ```\n *\n * Verified against the installed `sqlite-vec` `v0.1.9`:\n *\n * - **vec0 over a plain `vec_f32` BLOB column.** The shipped option (a) — a\n * `vec0` virtual table — is chosen over option (b) — a regular table whose\n * `vec_f32` BLOB column is brute-forced — because vec0 is the *only* form\n * that gives local SQLite a real ANN index (today's code only ever\n * brute-forces). vec0 indexes inline (the virtual table *is* the index), so\n * there is no separate `CREATE INDEX` step.\n * - **KNN with partition-correct filtering.** `WHERE embedding MATCH vec_f32(q)\n * AND k = ? AND graph_id = ?` returns the nearest `k`, ordered by `distance`,\n * scoped to one graph — a near vector in another `graph_id` partition does\n * not leak. This is strictly better than libSQL's table-global `vector_top_k`\n * (which over-fetches for multi-graph correctness): vec0's `PARTITION KEY`\n * makes the per-graph KNN exact.\n * - **One table serves both read paths.** The same `embedding` column answers\n * the compiler's brute-force `distanceExpression` (`vec_distance_cosine` /\n * `vec_distance_l2` over the column, `ORDER BY … LIMIT`, no `MATCH`), so the\n * `.where(field.similarTo(...))` CTE path needs no second structure.\n * - **`k` and `LIMIT` are mutually exclusive** in a vec0 `MATCH` query, so the\n * ANN path uses `k = <limit>` with no `LIMIT`, and the brute-force path uses\n * `LIMIT <limit>` with no `MATCH`.\n * - **No `ON CONFLICT` / `INSERT OR REPLACE`** on a vec0 primary key, so upsert\n * is `DELETE` + `INSERT` (atomic under the caller's outer transaction),\n * mirroring the FTS5 strategy.\n *\n * Metric support is `cosine` + `l2` (no `inner_product` — sqlite-vec has no\n * `vec_distance_ip`), advertised as data on `capabilities`. The table's\n * `distance_metric` is fixed at creation from the slot's metric, alongside its\n * fixed dimension `N`.\n *\n * The libSQL and pgvector siblings implement the same `VectorStrategy`\n * contract for their engines.\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 prefix for the per-field `vec0` virtual table. */\nconst TABLE_PREFIX = \"tg_vec\";\n\n/**\n * sqlite-vec stores each dimension as a 32-bit float; `float[N]` accepts\n * large `N`, but we advertise the same conservative ceiling the legacy\n * SQLite path used so capability discovery is stable across the swap.\n */\nconst SQLITE_VEC_MAX_DIMENSIONS = 8000;\n\nconst SQLITE_VEC_CAPABILITIES: VectorCapabilities = {\n supported: true,\n metrics: [\"cosine\", \"l2\"],\n // vec0 always indexes inline, so the portable ANN intent (\"hnsw\", the\n // `embedding()` default) is honored by real KNN; \"none\" stays brute-force.\n // Both map to the same vec0 table — only `buildSearch` differs.\n indexTypes: [\"hnsw\", \"none\"],\n maxDimensions: SQLITE_VEC_MAX_DIMENSIONS,\n // vec0's KNN accepts primary-key `IN (SELECT …)` pushdown (verified on\n // sqlite-vec v0.1.9), so the candidate filter constrains the KNN itself and\n // a filtered search returns `k` live rows — no over-fetch, no scan bound, no\n // under-fill. The only bundled engine that can promise a full page.\n filteredApproximateSearch: {\n mode: \"filter-pushdown\",\n guaranteesFullPage: true,\n },\n};\n\n/** Whether a slot's declared index type maps to vec0's `MATCH … k =` KNN. */\nfunction usesAnnIndex(slot: VectorSlot): boolean {\n return slot.indexType === \"hnsw\";\n}\n\n/** vec0 `distance_metric` token accepted in the virtual-table definition. */\nfunction sqliteVecMetricToken(metric: VectorMetric): string {\n switch (metric) {\n case \"cosine\": {\n return \"cosine\";\n }\n case \"l2\": {\n return \"l2\";\n }\n case \"inner_product\": {\n throw new Error(\n \"sqlite-vec does not support inner_product. Use 'cosine' or 'l2'.\",\n );\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 the bound JSON argument to `vec_f32(...)`. The\n * value rides as a parameter (not interpolated) — `vec_f32` parses the JSON\n * array into the packed float blob. Finiteness is validated first so a\n * NaN/Infinity names its index before JSON.stringify masks it as `null`.\n */\nfunction vecF32Literal(\n embedding: readonly number[],\n name: string,\n): SqlFragment {\n assertFiniteEmbedding(embedding, name);\n return sql`vec_f32(${JSON.stringify(embedding)})`;\n}\n\nfunction distanceExpression(\n embeddingColumn: SqlFragment,\n queryEmbedding: readonly number[],\n metric: VectorMetric,\n): SqlFragment {\n const query = vecF32Literal(queryEmbedding, \"queryEmbedding\");\n switch (metric) {\n case \"cosine\": {\n return sql`vec_distance_cosine(${embeddingColumn}, ${query})`;\n }\n case \"l2\": {\n return sql`vec_distance_l2(${embeddingColumn}, ${query})`;\n }\n case \"inner_product\": {\n throw new Error(\n \"sqlite-vec does not support inner_product. Use 'cosine' or 'l2'.\",\n );\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 sqliteVecStrategy: VectorStrategy = {\n name: \"sqlite-vec\",\n capabilities: SQLITE_VEC_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 const metric = sqliteVecMetricToken(slot.metric);\n\n // vec0 virtual tables cannot be modeled as a Drizzle table, so this is a\n // raw-ddl contribution — emitted verbatim and invisible to drizzle-kit.\n // `graph_id` is a PARTITION KEY so per-graph KNN is exact; `created_at` /\n // `updated_at` are auxiliary (`+`) columns (stored, not filtered on). The\n // virtual table *is* the index — no separate CREATE INDEX is emitted.\n return [\n {\n logicalName: `${VECTOR_CONTRIBUTION_PREFIX}:${slot.nodeKind}.${slot.fieldPath}`,\n owner: \"sqlite-vec\",\n tableName: table,\n createDdl: [\n `CREATE VIRTUAL TABLE IF NOT EXISTS ${name} USING vec0(\n node_id TEXT PRIMARY KEY,\n graph_id TEXT PARTITION KEY,\n +created_at TEXT,\n +updated_at TEXT,\n embedding float[${slot.dimensions}] distance_metric=${metric}\n);`,\n ],\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 = vecF32Literal(params.embedding, \"embedding\");\n // vec0 rejects ON CONFLICT / INSERT OR REPLACE on its primary key —\n // emulate upsert with DELETE + INSERT, atomic under the caller's\n // outer transaction (mirrors the FTS5 fulltext strategy).\n return [\n sql`\n DELETE FROM ${table}\n WHERE \"node_id\" = ${params.nodeId} AND \"graph_id\" = ${params.graphId}\n `,\n sql`\n INSERT INTO ${table} (\"node_id\", \"graph_id\", \"created_at\", \"updated_at\", \"embedding\")\n VALUES (${params.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${value})\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 // Same DELETE + INSERT upsert emulation as buildUpsert, in multi-row\n // form: one IN-list delete, one multi-row insert.\n const nodeIds = sql.join(\n params.rows.map((row) => sql`${row.nodeId}`),\n sql`, `,\n );\n const valueRows = sql.join(\n params.rows.map(\n (row) =>\n sql`(${row.nodeId}, ${params.graphId}, ${timestamp}, ${timestamp}, ${vecF32Literal(row.embedding, \"embedding\")})`,\n ),\n sql`, `,\n );\n return [\n sql`\n DELETE FROM ${table}\n WHERE \"graph_id\" = ${params.graphId} AND \"node_id\" IN (${nodeIds})\n `,\n sql`\n INSERT INTO ${table} (\"node_id\", \"graph_id\", \"created_at\", \"updated_at\", \"embedding\")\n VALUES ${valueRows}\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 \"node_id\" = ${params.nodeId} AND \"graph_id\" = ${params.graphId}\n `,\n ];\n },\n\n // vec0's KNN is brute force in C — exact by construction (the\n // \"index\" is a partitioned scan, not a graph) — and the non-indexed\n // fallback below is a plain SQL scan. The compiler may therefore\n // route the NON-approximate `.similarTo()` branch through this form.\n searchIsExact: true,\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 if (usesAnnIndex(slot)) {\n // vec0 KNN. `k` and `LIMIT` are mutually exclusive in a MATCH query, so\n // bound `k = limit` and omit LIMIT. `graph_id` filters by the partition\n // key (exact, no recall loss). Order by vec0's own `distance` column —\n // the recomputed `distance` expression is reused only for score/minScore\n // so the math matches the brute-force path and the shared helpers.\n const query = vecF32Literal(params.queryEmbedding, \"queryEmbedding\");\n // `k` covers the requested page: vec0 has no OFFSET inside a MATCH\n // query, so fetch `limit + offset` neighbors and page in a wrapper.\n const knnK = params.limit + (params.offset ?? 0);\n const conditions: SqlFragment[] = [\n sql`${table}.\"embedding\" MATCH ${query}`,\n sql`k = ${knnK}`,\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 // vec0 KNN accepts primary-key `IN (SELECT ...)` pushdown (verified on\n // sqlite-vec v0.1.9): the filter constrains the KNN candidate set\n // itself, so `k` live results come back — exact, no over-fetch.\n if (candidates !== undefined) {\n conditions.push(sql`${table}.\"node_id\" IN (${candidates})`);\n }\n const knnBody = 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 `;\n if (params.offset === undefined || params.offset === 0) {\n return knnBody;\n }\n // MATERIALIZED fences the page wrapper: SQLite would otherwise\n // flatten the subquery and push the outer LIMIT into the vec0 MATCH\n // query, which rejects `k = ?` and LIMIT together.\n return sql`\n WITH knn_page AS MATERIALIZED (${knnBody})\n SELECT node_id, score FROM knn_page\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n // Brute-force scan: no MATCH, so LIMIT is allowed (and required).\n const conditions: SqlFragment[] = [\n sql`${table}.\"graph_id\" = ${params.graphId}`,\n ];\n if (candidates !== undefined) {\n conditions.push(sql`${table}.\"node_id\" IN (${candidates})`);\n }\n if (params.minScore !== undefined) {\n conditions.push(\n vectorMinScoreCondition(distance, params.metric, params.minScore),\n );\n }\n const pageClause = vectorPageClause(params.limit, params.offset);\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 // vec0 indexes inline (the virtual table is the index), so there is no\n // standalone ANN index to create or drop — both return undefined.\n buildCreateIndex(): SqlFragment | undefined {\n return undefined;\n },\n\n buildDropIndex(): SqlFragment | undefined {\n return undefined;\n },\n\n buildDropStorage(slot): readonly string[] {\n const table = quoteIdentifier(\n tableName(slot.graphId, slot.nodeKind, slot.fieldPath),\n );\n // Dropping the vec0 virtual table removes its backing shadow tables too.\n return [`DROP TABLE IF EXISTS ${table}`];\n },\n};\n"]}
|
package/dist/chunk-VGMNGWBR.cjs
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkX2XOQZT3_cjs = require('./chunk-X2XOQZT3.cjs');
|
|
4
|
-
|
|
5
|
-
// src/query/dialect/vector/pagination.ts
|
|
6
|
-
function vectorPageClause(limit, offset) {
|
|
7
|
-
return offset === void 0 || offset === 0 ? chunkX2XOQZT3_cjs.sql`LIMIT ${limit}` : chunkX2XOQZT3_cjs.sql`LIMIT ${limit} OFFSET ${offset}`;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
exports.vectorPageClause = vectorPageClause;
|
|
11
|
-
//# sourceMappingURL=chunk-VGMNGWBR.cjs.map
|
|
12
|
-
//# sourceMappingURL=chunk-VGMNGWBR.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/global-symbol.ts","../src/query/dialect/profile.ts","../src/query/sql-intent.ts","../src/query/sql-fragment.ts","../src/query/dialect/like-escape.ts"],"names":["ConfigurationError"],"mappings":"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","file":"chunk-X2XOQZT3.cjs","sourcesContent":["type TypeGraphGlobalSymbolName =\n | \"sql-fragment\"\n | \"sql-placeholder\"\n | \"sql-intent-registry\"\n | \"internal-temporary-writes-v1\"\n | \"external-recorded-read-source-v1\"\n | \"sql-schema-v1\"\n | \"store-runtime-v1\"\n | \"typegraph-recorded-read-source-v1\"\n | \"transaction-runtime-v1\";\n\n/** Returns a process-wide symbol shared across ESM/CJS package instances. */\nexport function typeGraphGlobalSymbol<TSymbol extends symbol>(\n name: TypeGraphGlobalSymbolName,\n): TSymbol {\n return Symbol.for(`@nicia-ai/typegraph/${name}`) as TSymbol;\n}\n","import { type SqlDialect } from \"./types\";\n\nexport type SqlDialectProfile = Readonly<{\n bindValue: (value: unknown) => unknown;\n booleanLiteralString: (value: boolean) => string;\n placeholder: (index: number) => string;\n}>;\n\nconst SQL_DIALECT_PROFILES = {\n postgres: {\n bindValue: (value: unknown) => value,\n booleanLiteralString: (value: boolean) => (value ? \"TRUE\" : \"FALSE\"),\n placeholder: (index: number) => `$${index}`,\n },\n sqlite: {\n bindValue: (value: unknown) =>\n typeof value === \"boolean\" ?\n value ? 1\n : 0\n : value,\n booleanLiteralString: (value: boolean) => (value ? \"1\" : \"0\"),\n placeholder: () => \"?\",\n },\n} satisfies Record<SqlDialect, SqlDialectProfile>;\n\nconst SQL_STRING_LITERAL_RENDERERS = {\n postgres: (value: string) => {\n if (value.includes(\"\\\\\")) {\n return `E'${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"'\", \"''\")}'`;\n }\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n },\n sqlite: (value: string) => `'${value.replaceAll(\"'\", \"''\")}'`,\n} satisfies Record<SqlDialect, (value: string) => string>;\n\n/** Returns the primitive rendering and binding rules for a SQL dialect. */\nexport function getSqlDialectProfile(dialect: SqlDialect): SqlDialectProfile {\n return SQL_DIALECT_PROFILES[dialect];\n}\n\n/** Maps a JavaScript value to the representation expected by a SQL driver. */\nexport function bindSqlValue(value: unknown, dialect: SqlDialect): unknown {\n if (value instanceof Date) return value.toISOString();\n return getSqlDialectProfile(dialect).bindValue(value);\n}\n\n/** Renders one SQL string literal using the dialect's escaping rules. */\nexport function inlineSqlStringLiteral(\n value: string,\n dialect: SqlDialect,\n): string {\n return SQL_STRING_LITERAL_RENDERERS[dialect](value);\n}\n","import { typeGraphGlobalSymbol } from \"../utils/global-symbol\";\nimport { type SqlFragment } from \"./sql-fragment\";\n\ndeclare const SqlIntentBrand: unique symbol;\n\nexport type SqlIntent = \"rows\" | \"statement\" | \"temporary-statement\";\n\nexport type IntentSql<I extends SqlIntent> = SqlFragment &\n Readonly<{ [SqlIntentBrand]: I }>;\n\nexport type CompiledRowsSql = IntentSql<\"rows\">;\nexport type CompiledSelectSql = CompiledRowsSql;\nexport type CompiledStatementSql = IntentSql<\"statement\">;\nexport type CompiledTemporaryStatementSql = IntentSql<\"temporary-statement\">;\n\nexport function asCompiledRowsSql(query: SqlFragment): CompiledRowsSql {\n return query as CompiledRowsSql;\n}\n\nexport function asCompiledSelectSql(query: SqlFragment): CompiledSelectSql {\n return asCompiledRowsSql(query);\n}\n\nexport function asCompiledStatementSql(\n query: SqlFragment,\n): CompiledStatementSql {\n return query as CompiledStatementSql;\n}\n\n/**\n * Marks an internal statement that may write only connection-local temporary\n * state. This is intentionally separate from the public raw-statement intent:\n * history-enabled stores block arbitrary raw writes but iterative graph\n * operations still need to manage ephemeral working tables.\n */\nexport function asCompiledTemporaryStatementSql(\n query: SqlFragment,\n): CompiledTemporaryStatementSql {\n return query as CompiledTemporaryStatementSql;\n}\n\n/**\n * Statements whose good plan depends on the bound parameter values —\n * e.g. an id-array membership filter where the array cardinality varies\n * per call. PostgreSQL's prepared-statement machinery switches to a\n * generic (parameter-blind) plan after five executions, which for these\n * statements is catastrophically wrong (measured 21ms -> 310ms on the\n * subgraph edge fetch). Marked statements are executed unnamed so every\n * call is planned against the actual parameters; the re-parse cost is\n * ~1ms, the generic-plan cliff it avoids is 10-300ms.\n */\ntype SqlIntentRegistry = Readonly<{\n annIndexScanQueries: WeakMap<SqlFragment, readonly string[]>;\n forceCustomPlanQueries: WeakSet<SqlFragment>;\n}>;\n\nconst SQL_INTENT_REGISTRY: unique symbol = typeGraphGlobalSymbol(\n \"sql-intent-registry\",\n);\nconst globalWithSqlIntentRegistry = globalThis as typeof globalThis &\n Readonly<{\n [SQL_INTENT_REGISTRY]?: SqlIntentRegistry;\n }>;\nconst sqlIntentRegistry =\n globalWithSqlIntentRegistry[SQL_INTENT_REGISTRY] ??\n (() => {\n const registry: SqlIntentRegistry = {\n annIndexScanQueries: new WeakMap(),\n forceCustomPlanQueries: new WeakSet(),\n };\n Object.defineProperty(globalWithSqlIntentRegistry, SQL_INTENT_REGISTRY, {\n configurable: false,\n enumerable: false,\n value: registry,\n writable: false,\n });\n return registry;\n })();\n\nexport function markForceCustomPlan(query: SqlFragment): void {\n sqlIntentRegistry.forceCustomPlanQueries.add(query);\n}\n\nexport function shouldForceCustomPlan(query: SqlFragment): boolean {\n return sqlIntentRegistry.forceCustomPlanQueries.has(query);\n}\n\n/**\n * Statements whose plan includes an engine ANN index scan (the inline\n * `.similarTo(..., { approximate: true })` branch). The PostgreSQL\n * backend wraps their execution with the same pgvector GUC overrides\n * the search facade applies (`hnsw.iterative_scan = strict_order` /\n * `ivfflat.iterative_scan = relaxed_order` on pgvector >= 0.8), so a\n * filtered approximate query keeps scanning past the default ef_search\n * frontier instead of starving. Carries the slot index types so the\n * backend knows which GUCs apply. Backends without GUC semantics\n * ignore the brand.\n */\nexport function markAnnIndexScan(\n query: SqlFragment,\n indexTypes: readonly string[],\n): void {\n sqlIntentRegistry.annIndexScanQueries.set(query, indexTypes);\n}\n\nexport function annIndexScanTypes(\n query: SqlFragment,\n): readonly string[] | undefined {\n return sqlIntentRegistry.annIndexScanQueries.get(query);\n}\n\n/** @internal Copies execution semantics when immutable fragments are composed. */\nexport function copySqlIntents(\n target: SqlFragment,\n sources: readonly SqlFragment[],\n): void {\n if (sources.some((source) => shouldForceCustomPlan(source))) {\n markForceCustomPlan(target);\n }\n\n const indexTypes = new Set<string>();\n for (const source of sources) {\n for (const indexType of annIndexScanTypes(source) ?? []) {\n indexTypes.add(indexType);\n }\n }\n if (indexTypes.size > 0) markAnnIndexScan(target, [...indexTypes]);\n}\n\n/**\n * Whether a compiled statement can be run as raw text (`executeRaw`) without\n * losing execution semantics. Both brands above ride on the SQL *object* and\n * are honored only by `backend.execute`: the force-custom-plan flag makes\n * PostgreSQL re-plan against the actual parameters (opposed to reusing a\n * cached statement), and the ANN-scan brand drives the pgvector iterative-scan\n * GUC wrapper. A statement carrying either must not be flattened to text and\n * cached — callers fall back to `backend.execute`. Keeping this predicate\n * beside the brands means a future brand updates one place, not every caller.\n */\nexport function isRawExecutable(query: SqlFragment): boolean {\n return (\n !shouldForceCustomPlan(query) && annIndexScanTypes(query) === undefined\n );\n}\n","import { ConfigurationError } from \"../errors\";\nimport { typeGraphGlobalSymbol } from \"../utils/global-symbol\";\nimport {\n bindSqlValue,\n getSqlDialectProfile,\n inlineSqlStringLiteral,\n} from \"./dialect/profile\";\nimport { type SqlDialect } from \"./dialect/types\";\nimport { copySqlIntents } from \"./sql-intent\";\n\n/** Nominal identity shared by every package entrypoint. */\nconst SQL_FRAGMENT_BRAND: unique symbol = typeGraphGlobalSymbol(\"sql-fragment\");\nconst SQL_PLACEHOLDER_BRAND: unique symbol =\n typeGraphGlobalSymbol(\"sql-placeholder\");\n\nexport type SqlTextChunk = Readonly<{\n kind: \"text\";\n value: string;\n}>;\n\nexport type SqlParameterChunk = Readonly<{\n kind: \"parameter\";\n value: unknown;\n}>;\n\nexport type SqlIdentifierChunk = Readonly<{\n kind: \"identifier\";\n value: string;\n}>;\n\nexport type SqlPlaceholderChunk = Readonly<{\n kind: \"placeholder\";\n value: Placeholder;\n}>;\n\n/** One immutable unit in a database-independent SQL fragment. */\nexport type SqlChunk =\n SqlTextChunk | SqlParameterChunk | SqlIdentifierChunk | SqlPlaceholderChunk;\n\n/**\n * An immutable, database-independent SQL expression.\n *\n * Fragments contain syntax and bound values as separate nodes. A database\n * adapter renders the same fragment with its native placeholder convention at\n * the final execution boundary.\n */\nexport type SqlFragment = Readonly<{\n [SQL_FRAGMENT_BRAND]: true;\n append: (fragment: SqlFragment) => SqlFragment;\n chunks: readonly SqlChunk[];\n}>;\n\n/** A named value resolved when a prepared statement is executed. */\nexport class Placeholder {\n readonly [SQL_PLACEHOLDER_BRAND] = true as const;\n readonly name: string;\n\n constructor(name: string) {\n this.name = name;\n Object.freeze(this);\n }\n}\n\nclass SqlFragmentValue implements SqlFragment {\n readonly [SQL_FRAGMENT_BRAND] = true as const;\n\n readonly chunks: readonly SqlChunk[];\n\n constructor(chunks: readonly SqlChunk[]) {\n this.chunks = Object.freeze([...chunks]);\n Object.freeze(this);\n }\n\n append(fragment: SqlFragment): SqlFragment {\n return createFragment(\n [...this.chunks, ...getChunks(fragment)],\n [this, fragment],\n );\n }\n}\n\nfunction createFragment(\n chunks: readonly SqlChunk[],\n intentSources: readonly SqlFragment[] = [],\n): SqlFragment {\n const fragment = new SqlFragmentValue(chunks);\n copySqlIntents(fragment, intentSources);\n return fragment;\n}\n\nfunction getChunks(fragment: SqlFragment): readonly SqlChunk[] {\n if (!isSqlFragment(fragment)) {\n throw new ConfigurationError(\n \"Expected a SQL fragment created by TypeGraph's sql helper\",\n );\n }\n return fragment.chunks;\n}\n\n/** Returns whether a value is a TypeGraph-owned SQL fragment. */\nexport function isSqlFragment(value: unknown): value is SqlFragment {\n return (\n typeof value === \"object\" &&\n value !== null &&\n SQL_FRAGMENT_BRAND in value &&\n value[SQL_FRAGMENT_BRAND] === true &&\n \"chunks\" in value &&\n Array.isArray(value.chunks) &&\n \"append\" in value &&\n typeof value.append === \"function\"\n );\n}\n\n/** Returns whether a value is a TypeGraph named SQL placeholder. */\nexport function isSqlPlaceholder(value: unknown): value is Placeholder {\n return (\n typeof value === \"object\" &&\n value !== null &&\n SQL_PLACEHOLDER_BRAND in value &&\n value[SQL_PLACEHOLDER_BRAND] === true &&\n \"name\" in value &&\n typeof value.name === \"string\"\n );\n}\n\n/** @internal Enforces exhaustive handling at every fragment boundary. */\nexport function throwUnsupportedSqlChunk(chunk: never): never {\n throw new ConfigurationError(\"Unsupported SQL fragment chunk\", { chunk });\n}\n\nfunction textNode(value: string): SqlTextChunk {\n return Object.freeze({ kind: \"text\", value });\n}\n\nfunction parameterNode(value: unknown): SqlParameterChunk {\n return Object.freeze({ kind: \"parameter\", value });\n}\n\nfunction identifierNode(value: string): SqlIdentifierChunk {\n return Object.freeze({ kind: \"identifier\", value });\n}\n\nfunction placeholderNode(value: Placeholder): SqlPlaceholderChunk {\n return Object.freeze({ kind: \"placeholder\", value });\n}\n\nfunction templateSql(\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n): SqlFragment {\n const chunks: SqlChunk[] = [];\n const intentSources: SqlFragment[] = [];\n\n for (const [index, text] of strings.entries()) {\n if (text.length > 0) chunks.push(textNode(text));\n\n if (index >= values.length) continue;\n const value = values[index];\n if (isSqlFragment(value)) {\n chunks.push(...getChunks(value));\n intentSources.push(value);\n } else if (isSqlPlaceholder(value)) {\n chunks.push(placeholderNode(value));\n } else {\n chunks.push(parameterNode(value));\n }\n }\n\n return createFragment(chunks, intentSources);\n}\n\nfunction rawSql(value: string): SqlFragment {\n return createFragment(value.length === 0 ? [] : [textNode(value)]);\n}\n\nfunction identifierSql(value: string): SqlFragment {\n return createFragment([identifierNode(value)]);\n}\n\nfunction joinSql(\n fragments: readonly SqlFragment[],\n separator: SqlFragment = EMPTY_SQL,\n): SqlFragment {\n const chunks: SqlChunk[] = [];\n const intentSources: SqlFragment[] = [separator];\n\n for (const [index, fragment] of fragments.entries()) {\n if (index > 0) chunks.push(...getChunks(separator));\n chunks.push(...getChunks(fragment));\n intentSources.push(fragment);\n }\n\n return createFragment(chunks, intentSources);\n}\n\nfunction placeholderSql(name: string): SqlFragment {\n return createFragment([placeholderNode(new Placeholder(name))]);\n}\n\nconst EMPTY_SQL = createFragment([]);\n\n/** TypeGraph's database-independent SQL template and composition helpers. */\nexport type SqlTag = Readonly<{\n empty: () => SqlFragment;\n identifier: (value: string) => SqlFragment;\n join: (\n fragments: readonly SqlFragment[],\n separator?: SqlFragment,\n ) => SqlFragment;\n placeholder: (name: string) => SqlFragment;\n raw: (value: string) => SqlFragment;\n}> &\n ((\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ) => SqlFragment);\n\n/** TypeGraph's database-independent SQL template and composition helpers. */\nexport const sql: SqlTag = Object.assign(templateSql, {\n empty: function empty(): SqlFragment {\n return EMPTY_SQL;\n },\n identifier: identifierSql,\n join: joinSql,\n placeholder: placeholderSql,\n raw: rawSql,\n});\n\n/** A rendered statement and its ordered bound parameters. */\nexport type RenderedSql = Readonly<{\n sql: string;\n params: readonly unknown[];\n}>;\n\nfunction quotedIdentifier(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction resolvedPlaceholder(\n placeholder: Placeholder,\n bindings: Readonly<Record<string, unknown>> | undefined,\n dialect: SqlDialect,\n): unknown {\n if (bindings === undefined) return placeholder;\n\n if (!Object.hasOwn(bindings, placeholder.name)) {\n throw new ConfigurationError(\n `Missing binding for parameter \"${placeholder.name}\"`,\n { parameterName: placeholder.name },\n );\n }\n return bindSqlValue(bindings[placeholder.name], dialect);\n}\n\n/**\n * Renders a fragment for a database adapter.\n *\n * Named placeholders remain in `params` when `bindings` is omitted, allowing\n * a prepared template to resolve them later. Passing `bindings` resolves every\n * placeholder eagerly.\n */\nexport function renderSql(\n fragment: SqlFragment,\n dialect: SqlDialect,\n bindings?: Readonly<Record<string, unknown>>,\n): RenderedSql {\n const parts: string[] = [];\n const params: unknown[] = [];\n const profile = getSqlDialectProfile(dialect);\n\n for (const node of getChunks(fragment)) {\n switch (node.kind) {\n case \"text\": {\n parts.push(node.value);\n break;\n }\n case \"identifier\": {\n parts.push(quotedIdentifier(node.value));\n break;\n }\n case \"parameter\": {\n params.push(bindSqlValue(node.value, dialect));\n parts.push(profile.placeholder(params.length));\n break;\n }\n case \"placeholder\": {\n params.push(resolvedPlaceholder(node.value, bindings, dialect));\n parts.push(profile.placeholder(params.length));\n break;\n }\n default: {\n throwUnsupportedSqlChunk(node);\n }\n }\n }\n\n return Object.freeze({\n sql: parts.join(\"\"),\n params: Object.freeze(params),\n });\n}\n\n/** Renders a fragment using SQLite's `?` placeholders. */\nexport function renderSqlite(\n fragment: SqlFragment,\n bindings?: Readonly<Record<string, unknown>>,\n): RenderedSql {\n return renderSql(fragment, \"sqlite\", bindings);\n}\n\n/** Renders a fragment using PostgreSQL's numbered placeholders. */\nexport function renderPostgres(\n fragment: SqlFragment,\n bindings?: Readonly<Record<string, unknown>>,\n): RenderedSql {\n return renderSql(fragment, \"postgres\", bindings);\n}\n\nfunction inlineLiteral(value: unknown, dialect: SqlDialect): string {\n if (value === undefined || value === null) return \"NULL\";\n if (typeof value === \"string\") return inlineSqlStringLiteral(value, dialect);\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new ConfigurationError(\"Cannot inline a non-finite SQL number\", {\n value,\n });\n }\n return String(value);\n }\n if (typeof value === \"bigint\") return String(value);\n if (typeof value === \"boolean\") {\n return getSqlDialectProfile(dialect).booleanLiteralString(value);\n }\n if (value instanceof Date) {\n return inlineSqlStringLiteral(value.toISOString(), dialect);\n }\n\n throw new ConfigurationError(\"Cannot inline this SQL parameter value\", {\n value,\n });\n}\n\n/**\n * Renders a fragment with safe scalar literals instead of bound parameters.\n *\n * This is intentionally limited to DDL paths whose drivers cannot bind values.\n * Application queries should always use {@link renderSql}.\n */\nexport function renderSqlInline(\n fragment: SqlFragment,\n dialect: SqlDialect,\n): string {\n const parts: string[] = [];\n\n for (const node of getChunks(fragment)) {\n switch (node.kind) {\n case \"text\": {\n parts.push(node.value);\n break;\n }\n case \"identifier\": {\n parts.push(quotedIdentifier(node.value));\n break;\n }\n case \"parameter\": {\n parts.push(inlineLiteral(node.value, dialect));\n break;\n }\n case \"placeholder\": {\n throw new ConfigurationError(\n `Cannot inline unresolved SQL placeholder \"${node.value.name}\"`,\n { parameterName: node.value.name },\n );\n }\n default: {\n throwUnsupportedSqlChunk(node);\n }\n }\n }\n\n return parts.join(\"\");\n}\n","/**\n * Shared LIKE-escape clause for the query compiler.\n *\n * The compiler builds `contains` / `startsWith` / `endsWith` patterns by\n * escaping the literal `%`, `_`, and `\\` in user input with a backslash (see\n * the pattern builders in `compiler/predicates.ts`). For that escaping to take\n * effect the emitted `LIKE` / `ILIKE` must declare backslash as its escape\n * character. PostgreSQL's default LIKE escape is already backslash, so this\n * clause is a no-op there; SQLite has *no* default escape character, so without\n * it an escaped `\\%` matches a literal backslash followed by any character —\n * silently diverging from Postgres. Emitting it on every compiled predicate\n * makes the two backends match by construction.\n */\nimport { sql, type SqlFragment } from \"../sql-fragment\";\n\n/**\n * The backslash escape character used by the JS pattern builder\n * (`compileStringPattern` in `compiler/predicates.ts`) to prefix the literal\n * `%`, `_`, and `\\` in user input. It must match the character declared by\n * {@link likeEscapeClause}: the builder prefixes wildcards with this character,\n * and the clause tells SQL to treat it as the escape. Both are backslash.\n */\nexport const LIKE_ESCAPE_CHARACTER = \"\\\\\";\n\n/**\n * `ESCAPE '\\'` clause appended to every compiled `LIKE` / `ILIKE` predicate,\n * declaring {@link LIKE_ESCAPE_CHARACTER} as the escape character. The single\n * backslash inside the quotes is a literal in both PostgreSQL (with\n * `standard_conforming_strings`, the default) and SQLite.\n */\nexport const likeEscapeClause: SqlFragment = sql`ESCAPE '\\\\'`;\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
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","TypeGraphError","ALL_META_EDGE_NAMES","encodeJsonPointerSegment","isPlainObject","compactUndefined","RESERVED_NODE_KEYS","RESERVED_EDGE_KEYS","assertJsonValue","ConfigurationError","freezeDeep"],"mappings":"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","file":"chunk-XDMPDUKL.cjs","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"]}
|