@noy-db/hub 0.7.1-pre.0 → 0.8.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/CHANGELOG.md +147 -14
- package/LICENSE +202 -21
- package/NOTICE +1 -0
- package/README.md +5 -5
- package/codemods/0.8.0-pre.json +61 -0
- package/dist/api-OS747DS4.js +18 -0
- package/dist/as/index.js +11 -12
- package/dist/as/index.js.map +1 -1
- package/dist/at/index.js +9 -10
- package/dist/attestation/index.js +37 -26
- package/dist/attestation/index.js.map +1 -1
- package/dist/{backup-XKCXVKV3.js → backup-YE2VQ26S.js} +15 -16
- package/dist/backup-YE2VQ26S.js.map +1 -0
- package/dist/blobs/index.js +13 -14
- package/dist/blobs/index.js.map +1 -1
- package/dist/broker/index.js +12 -13
- package/dist/broker/index.js.map +1 -1
- package/dist/by/index.js +2 -2
- package/dist/capsule/contract.d.ts +159 -0
- package/dist/capsule/contract.js +95 -0
- package/dist/capsule/enclave-aes/bound.d.ts +52 -0
- package/dist/capsule/enclave-aes/capabilities.d.ts +2 -0
- package/dist/capsule/enclave-aes/classify/compare.d.ts +20 -0
- package/dist/{kernel/enclave → capsule/enclave-aes}/classify/find.d.ts +1 -1
- package/dist/{kernel/enclave → capsule/enclave-aes}/classify/reveal.d.ts +1 -1
- package/dist/{kernel/enclave → capsule/enclave-aes}/classify/verify.d.ts +2 -2
- package/dist/{kernel/enclave → capsule/enclave-aes}/classify/write.d.ts +1 -1
- package/dist/{kernel/enclave → capsule/enclave-aes}/crypto.d.ts +33 -129
- package/dist/capsule/enclave-aes/index.d.ts +113 -0
- package/dist/capsule/enclave-aes/index.js +335 -0
- package/dist/capsule/enclave-aes/index.js.map +1 -0
- package/dist/capsule/enclave-aes/primitives.d.ts +29 -0
- package/dist/capsule/index.d.ts +27 -0
- package/dist/capsule/plumbing/ct-equal.d.ts +11 -0
- package/dist/{kernel/enclave/record-keys → capsule/plumbing}/deterministic.d.ts +8 -21
- package/dist/capsule/plumbing/digest.d.ts +122 -0
- package/dist/{kernel/enclave/record-keys → capsule/plumbing}/envelope-body.d.ts +44 -48
- package/dist/capsule/plumbing/index.d.ts +100 -0
- package/dist/capsule/plumbing/lifecycle.d.ts +50 -0
- package/dist/{kernel/enclave/record-keys → capsule/plumbing}/record-codec.d.ts +80 -20
- package/dist/{kernel/enclave → capsule/plumbing}/record-envelope.d.ts +1 -1
- package/dist/capsule/plumbing/rekey-blob.d.ts +33 -0
- package/dist/capsule/plumbing/rekey.d.ts +44 -0
- package/dist/capsule/plumbing/sealed-slot.d.ts +22 -0
- package/dist/capsule/plumbing/sealed-slots.d.ts +37 -0
- package/dist/capsule/plumbing/sealing.d.ts +29 -0
- package/dist/capsule/plumbing/sign.d.ts +9 -0
- package/dist/{kernel/enclave/record-keys → capsule/plumbing}/tombstone.d.ts +2 -2
- package/dist/capsule-VOLX3QRQ.js +209 -0
- package/dist/cargo/index.js +39 -36
- package/dist/{chunk-Q2MPFCQ7.js → chunk-23D6M6VM.js} +5 -5
- package/dist/chunk-23D6M6VM.js.map +1 -0
- package/dist/{chunk-R7BX2NB3.js → chunk-244QBK7Z.js} +4 -4
- package/dist/chunk-244QBK7Z.js.map +1 -0
- package/dist/chunk-2AFX33YA.js +936 -0
- package/dist/chunk-2AFX33YA.js.map +1 -0
- package/dist/{chunk-MVMXZYXT.js → chunk-2GHDLTPE.js} +2 -2
- package/dist/{chunk-GYGLAVCX.js → chunk-2MG3SW7Q.js} +6 -2
- package/dist/chunk-2MG3SW7Q.js.map +1 -0
- package/dist/{chunk-XLMEZIAJ.js → chunk-2ODVB6LZ.js} +2 -2
- package/dist/{chunk-HJUWN7JN.js → chunk-2PVXF5CS.js} +33 -8
- package/dist/chunk-2PVXF5CS.js.map +1 -0
- package/dist/{chunk-YJRT5UQM.js → chunk-2RH777HH.js} +21 -20
- package/dist/{chunk-YJRT5UQM.js.map → chunk-2RH777HH.js.map} +1 -1
- package/dist/{chunk-7O3Y4PPD.js → chunk-37EPTBBR.js} +153 -16
- package/dist/chunk-37EPTBBR.js.map +1 -0
- package/dist/{chunk-2ENE6445.js → chunk-3A5DUZ56.js} +102 -16
- package/dist/chunk-3A5DUZ56.js.map +1 -0
- package/dist/chunk-3EWS67C7.js +461 -0
- package/dist/chunk-3EWS67C7.js.map +1 -0
- package/dist/{chunk-SGZAIJCV.js → chunk-3L2NBKDR.js} +4 -8
- package/dist/chunk-3L2NBKDR.js.map +1 -0
- package/dist/{chunk-YMUFFJCO.js → chunk-3TDUWVWB.js} +5 -2
- package/dist/chunk-3TDUWVWB.js.map +1 -0
- package/dist/{chunk-4GVM6QZA.js → chunk-3XJQBBZD.js} +26 -28
- package/dist/chunk-3XJQBBZD.js.map +1 -0
- package/dist/{chunk-4ZS56W5S.js → chunk-42ALPZ2B.js} +672 -664
- package/dist/chunk-42ALPZ2B.js.map +1 -0
- package/dist/chunk-4CIQDWRB.js +524 -0
- package/dist/chunk-4CIQDWRB.js.map +1 -0
- package/dist/{chunk-RMS3NEA3.js → chunk-4JPMZTJY.js} +2 -2
- package/dist/{chunk-P3MG6QCN.js → chunk-4T3SE27M.js} +5 -9
- package/dist/chunk-4T3SE27M.js.map +1 -0
- package/dist/chunk-4V3Q35WG.js +204 -0
- package/dist/chunk-4V3Q35WG.js.map +1 -0
- package/dist/{chunk-NQKIUNW5.js → chunk-52MGURXO.js} +2 -2
- package/dist/{chunk-EQEYOJBM.js → chunk-5A4345TG.js} +4 -4
- package/dist/chunk-5A4345TG.js.map +1 -0
- package/dist/{chunk-334WSVOW.js → chunk-5FE75J4S.js} +6 -6
- package/dist/chunk-5FE75J4S.js.map +1 -0
- package/dist/chunk-5KC7QYEC.js +565 -0
- package/dist/chunk-5KC7QYEC.js.map +1 -0
- package/dist/{chunk-RSGLUIO6.js → chunk-5UMK7GRI.js} +13 -12
- package/dist/chunk-5UMK7GRI.js.map +1 -0
- package/dist/chunk-5WWDGFOS.js +275 -0
- package/dist/chunk-5WWDGFOS.js.map +1 -0
- package/dist/{chunk-QPQUVOZ2.js → chunk-6QVKPHBF.js} +3 -5
- package/dist/chunk-6QVKPHBF.js.map +1 -0
- package/dist/{chunk-ACAQ2DSG.js → chunk-747G6CT3.js} +2 -2
- package/dist/chunk-747G6CT3.js.map +1 -0
- package/dist/{chunk-QTQUH4DS.js → chunk-7R2Q7CPL.js} +16 -16
- package/dist/chunk-7R2Q7CPL.js.map +1 -0
- package/dist/{chunk-UGTBXF5U.js → chunk-7XMHMVTS.js} +3 -3
- package/dist/{chunk-YJX7EOJD.js → chunk-A4XMIZT3.js} +6 -6
- package/dist/{chunk-YJX7EOJD.js.map → chunk-A4XMIZT3.js.map} +1 -1
- package/dist/{chunk-A66I4JOA.js → chunk-AEQGFRU4.js} +4 -4
- package/dist/chunk-AEQGFRU4.js.map +1 -0
- package/dist/chunk-AL6ML4LA.js +1558 -0
- package/dist/chunk-AL6ML4LA.js.map +1 -0
- package/dist/{chunk-BZ3534YM.js → chunk-AUKKUPVB.js} +2 -2
- package/dist/{chunk-CUZLNGD5.js → chunk-B2YY6WDD.js} +1 -1
- package/dist/chunk-B2YY6WDD.js.map +1 -0
- package/dist/chunk-BKT776R5.js +1 -0
- package/dist/chunk-BNWA3WG5.js +22 -0
- package/dist/chunk-BNWA3WG5.js.map +1 -0
- package/dist/{chunk-VXANTWBJ.js → chunk-BPWYQ25R.js} +92 -6
- package/dist/{chunk-VXANTWBJ.js.map → chunk-BPWYQ25R.js.map} +1 -1
- package/dist/{chunk-6LKOJBV6.js → chunk-BVCUTXE3.js} +2 -2
- package/dist/chunk-CY2CYVWZ.js +41 -0
- package/dist/chunk-CY2CYVWZ.js.map +1 -0
- package/dist/{chunk-M4YPHYEH.js → chunk-DHHGL42E.js} +70 -25
- package/dist/chunk-DHHGL42E.js.map +1 -0
- package/dist/{chunk-VTFVLCUH.js → chunk-DIZLQVAA.js} +2 -2
- package/dist/{chunk-G73UVHCA.js → chunk-DLD5LGDS.js} +11 -12
- package/dist/chunk-DLD5LGDS.js.map +1 -0
- package/dist/{chunk-WQBG4SZS.js → chunk-DQESF6RP.js} +60 -49
- package/dist/chunk-DQESF6RP.js.map +1 -0
- package/dist/{chunk-LWBCUYZW.js → chunk-E2N2T5ZO.js} +2 -2
- package/dist/{chunk-3PGS7TYR.js → chunk-EGVJ7TM4.js} +29 -32
- package/dist/chunk-EGVJ7TM4.js.map +1 -0
- package/dist/{chunk-JVIBCBC7.js → chunk-EJLV62NI.js} +2 -2
- package/dist/{chunk-KKEESNPE.js → chunk-EYG2CY2X.js} +126 -19
- package/dist/chunk-EYG2CY2X.js.map +1 -0
- package/dist/{enclave-55PAM4YO.js → chunk-EZGV6F47.js} +83 -56
- package/dist/chunk-EZGV6F47.js.map +1 -0
- package/dist/{chunk-CHQCZZWC.js → chunk-EZOAKKTB.js} +36 -27
- package/dist/chunk-EZOAKKTB.js.map +1 -0
- package/dist/chunk-F6NCB7KT.js +13 -0
- package/dist/chunk-F6NCB7KT.js.map +1 -0
- package/dist/chunk-FFJFE4T7.js +100 -0
- package/dist/chunk-FFJFE4T7.js.map +1 -0
- package/dist/{chunk-JMGDHKQF.js → chunk-FLPCETP6.js} +2 -2
- package/dist/chunk-FOEDQATO.js +53 -0
- package/dist/chunk-FOEDQATO.js.map +1 -0
- package/dist/{chunk-DGOZ4UZD.js → chunk-FVH5QYY2.js} +2 -2
- package/dist/{chunk-HIWCKBEY.js → chunk-G2MVBDFP.js} +54 -28
- package/dist/chunk-G2MVBDFP.js.map +1 -0
- package/dist/chunk-GMKGGY7V.js +234 -0
- package/dist/chunk-GMKGGY7V.js.map +1 -0
- package/dist/{chunk-EIPVYUEP.js → chunk-GQ4MF3CM.js} +3 -3
- package/dist/chunk-GQ4MF3CM.js.map +1 -0
- package/dist/{chunk-PEOZ34EM.js → chunk-GSAK56VF.js} +1 -1
- package/dist/chunk-GSAK56VF.js.map +1 -0
- package/dist/{chunk-5VCRVKOZ.js → chunk-GUZET4SG.js} +12 -4
- package/dist/chunk-GUZET4SG.js.map +1 -0
- package/dist/{chunk-JBDFMYKQ.js → chunk-GZT3NQRA.js} +2 -2
- package/dist/{chunk-K23VKTN4.js → chunk-H23XHRTT.js} +19 -34
- package/dist/chunk-H23XHRTT.js.map +1 -0
- package/dist/{chunk-TFR7DSOV.js → chunk-H427H63K.js} +2 -2
- package/dist/{chunk-DFMWUOU5.js → chunk-H7JBY4P7.js} +23 -32
- package/dist/chunk-H7JBY4P7.js.map +1 -0
- package/dist/{chunk-SKGMN35F.js → chunk-HS554XAF.js} +3 -3
- package/dist/chunk-HS554XAF.js.map +1 -0
- package/dist/{chunk-HK67PX4J.js → chunk-HW7CMKUG.js} +1 -1
- package/dist/chunk-HW7CMKUG.js.map +1 -0
- package/dist/{chunk-3BVH633C.js → chunk-IMQKWR46.js} +5 -7
- package/dist/chunk-IMQKWR46.js.map +1 -0
- package/dist/{chunk-R42NSZI6.js → chunk-IUBMZPHM.js} +7 -7
- package/dist/chunk-IUBMZPHM.js.map +1 -0
- package/dist/{chunk-CUQPWYRX.js → chunk-IUT3GWP3.js} +75 -386
- package/dist/chunk-IUT3GWP3.js.map +1 -0
- package/dist/{chunk-RF6D3Y5E.js → chunk-JDEYF3PJ.js} +4 -8
- package/dist/{chunk-RF6D3Y5E.js.map → chunk-JDEYF3PJ.js.map} +1 -1
- package/dist/{chunk-PPTHY5QO.js → chunk-JIBUPZHA.js} +99 -8
- package/dist/chunk-JIBUPZHA.js.map +1 -0
- package/dist/{chunk-SMH6SRX7.js → chunk-JOSPH3E5.js} +2 -2
- package/dist/chunk-JQYKPKG6.js +193 -0
- package/dist/chunk-JQYKPKG6.js.map +1 -0
- package/dist/{chunk-7APJ6CO6.js → chunk-JSMTXZR3.js} +45 -13
- package/dist/chunk-JSMTXZR3.js.map +1 -0
- package/dist/chunk-JWWYRR4Q.js +12 -0
- package/dist/chunk-JWWYRR4Q.js.map +1 -0
- package/dist/{chunk-BVN6KXL2.js → chunk-KZXDLBY6.js} +14 -9
- package/dist/chunk-KZXDLBY6.js.map +1 -0
- package/dist/chunk-LGNDFRYC.js +23 -0
- package/dist/chunk-LGNDFRYC.js.map +1 -0
- package/dist/{chunk-XKWGNJ26.js → chunk-LIOVX5TJ.js} +7 -11
- package/dist/chunk-LIOVX5TJ.js.map +1 -0
- package/dist/{chunk-AYX7AINO.js → chunk-LNSVGRHO.js} +5 -7
- package/dist/chunk-LNSVGRHO.js.map +1 -0
- package/dist/chunk-M5B2W6YY.js +293 -0
- package/dist/chunk-M5B2W6YY.js.map +1 -0
- package/dist/chunk-MBMTND6D.js +456 -0
- package/dist/chunk-MBMTND6D.js.map +1 -0
- package/dist/{chunk-3BZZJJMQ.js → chunk-MILI22XQ.js} +3 -3
- package/dist/{chunk-A2HKRLPV.js → chunk-MXKI4ABF.js} +18 -59
- package/dist/chunk-MXKI4ABF.js.map +1 -0
- package/dist/{chunk-ZYIYHJ5R.js → chunk-MXOQ5JCG.js} +869 -238
- package/dist/chunk-MXOQ5JCG.js.map +1 -0
- package/dist/{chunk-V7ZRRCRJ.js → chunk-N7EVQD5S.js} +9 -13
- package/dist/chunk-N7EVQD5S.js.map +1 -0
- package/dist/chunk-N7UDP5VU.js +757 -0
- package/dist/chunk-N7UDP5VU.js.map +1 -0
- package/dist/chunk-NBQ3KK6X.js +270 -0
- package/dist/chunk-NBQ3KK6X.js.map +1 -0
- package/dist/{chunk-ZORTV6NH.js → chunk-NCO25JZO.js} +88 -4
- package/dist/chunk-NCO25JZO.js.map +1 -0
- package/dist/chunk-NH2UOV3B.js +18 -0
- package/dist/chunk-NH2UOV3B.js.map +1 -0
- package/dist/chunk-NYMLINRP.js +28 -0
- package/dist/chunk-NYMLINRP.js.map +1 -0
- package/dist/{chunk-YYP7WSEB.js → chunk-O2IMQSNA.js} +2 -2
- package/dist/chunk-O46CHQT7.js +215 -0
- package/dist/chunk-O46CHQT7.js.map +1 -0
- package/dist/chunk-OIEO4WDL.js +27 -0
- package/dist/chunk-OIEO4WDL.js.map +1 -0
- package/dist/{chunk-TRGTKX5E.js → chunk-OKSTSITU.js} +27 -4
- package/dist/chunk-OKSTSITU.js.map +1 -0
- package/dist/chunk-OYW3I5M4.js +31 -0
- package/dist/chunk-OYW3I5M4.js.map +1 -0
- package/dist/{chunk-Q7HZX3IF.js → chunk-PD64727P.js} +2 -2
- package/dist/chunk-PD64727P.js.map +1 -0
- package/dist/{chunk-FET5XCAT.js → chunk-PP3K67AJ.js} +34 -6
- package/dist/chunk-PP3K67AJ.js.map +1 -0
- package/dist/chunk-Q2XRFWOI.js +40 -0
- package/dist/chunk-Q2XRFWOI.js.map +1 -0
- package/dist/{chunk-QIZPZMUI.js → chunk-Q4UHJ5SN.js} +2 -2
- package/dist/{chunk-FAHMLERK.js → chunk-QBLT6POL.js} +2 -2
- package/dist/chunk-QMWY2FDS.js +157 -0
- package/dist/chunk-QMWY2FDS.js.map +1 -0
- package/dist/{chunk-LH5A3ZPG.js → chunk-RB4DOPGZ.js} +150 -22
- package/dist/chunk-RB4DOPGZ.js.map +1 -0
- package/dist/chunk-RHVMZSUU.js +7 -0
- package/dist/chunk-RHVMZSUU.js.map +1 -0
- package/dist/{chunk-BUE2D7PX.js → chunk-SMV2HRDU.js} +2 -2
- package/dist/chunk-SUZKW6UR.js +25 -0
- package/dist/chunk-SUZKW6UR.js.map +1 -0
- package/dist/{chunk-7MG7SJT7.js → chunk-SV2PM2OY.js} +1 -1
- package/dist/chunk-SV2PM2OY.js.map +1 -0
- package/dist/{chunk-UXVWEX5L.js → chunk-SYNY3VB5.js} +6 -2
- package/dist/chunk-SYNY3VB5.js.map +1 -0
- package/dist/{chunk-4GFX6MPA.js → chunk-TEHHROZL.js} +6 -8
- package/dist/chunk-TEHHROZL.js.map +1 -0
- package/dist/chunk-TKVUE4JF.js +1289 -0
- package/dist/chunk-TKVUE4JF.js.map +1 -0
- package/dist/{chunk-SFAWCTEM.js → chunk-TZZBXPZK.js} +2 -2
- package/dist/{chunk-F3W6YMDC.js → chunk-U2FZNEWJ.js} +4 -4
- package/dist/chunk-U2FZNEWJ.js.map +1 -0
- package/dist/{chunk-BLN54W3L.js → chunk-UA372JHH.js} +56 -3
- package/dist/chunk-UA372JHH.js.map +1 -0
- package/dist/{chunk-6YXCPL4T.js → chunk-UEFOQH74.js} +2 -2
- package/dist/chunk-UEFOQH74.js.map +1 -0
- package/dist/{chunk-2N5ML6HT.js → chunk-UIYESRD6.js} +9 -11
- package/dist/chunk-UIYESRD6.js.map +1 -0
- package/dist/{chunk-UHHPLO3I.js → chunk-V3RWOOSO.js} +4 -4
- package/dist/{chunk-KTFRCC5C.js → chunk-V7ADQF5O.js} +82 -8
- package/dist/chunk-V7ADQF5O.js.map +1 -0
- package/dist/{chunk-453F654R.js → chunk-VAORSCSU.js} +3 -3
- package/dist/chunk-VAORSCSU.js.map +1 -0
- package/dist/{chunk-GPNTB4Y7.js → chunk-VFHCKG5M.js} +6 -10
- package/dist/chunk-VFHCKG5M.js.map +1 -0
- package/dist/{chunk-2577DKXB.js → chunk-VHBKYN2J.js} +3 -3
- package/dist/chunk-VHBKYN2J.js.map +1 -0
- package/dist/chunk-VHM7HCKB.js +220 -0
- package/dist/chunk-VHM7HCKB.js.map +1 -0
- package/dist/{chunk-ZHKOPKE3.js → chunk-VKI2EB3N.js} +3 -3
- package/dist/chunk-VKI2EB3N.js.map +1 -0
- package/dist/{chunk-UDHWDSRL.js → chunk-VMV5SBE4.js} +16 -17
- package/dist/chunk-VMV5SBE4.js.map +1 -0
- package/dist/{chunk-SPYWXKJN.js → chunk-VQDZYB2B.js} +3 -3
- package/dist/chunk-VQDZYB2B.js.map +1 -0
- package/dist/{chunk-Q2PU57HC.js → chunk-VVOLDVIR.js} +2 -2
- package/dist/{chunk-3VF3WQ4F.js → chunk-WPOYWFSE.js} +7 -7
- package/dist/{chunk-3VF3WQ4F.js.map → chunk-WPOYWFSE.js.map} +1 -1
- package/dist/{chunk-OTQZ7ZWU.js → chunk-WXE4W2U6.js} +7 -11
- package/dist/chunk-WXE4W2U6.js.map +1 -0
- package/dist/chunk-XBKH4FOC.js +195 -0
- package/dist/chunk-XBKH4FOC.js.map +1 -0
- package/dist/{chunk-TUFM4UZP.js → chunk-XQRFSKYM.js} +2 -2
- package/dist/{chunk-3V4KWFX7.js → chunk-XSPFDUDG.js} +58 -53
- package/dist/chunk-XSPFDUDG.js.map +1 -0
- package/dist/{chunk-GY4WYNNG.js → chunk-Y2RKVFKR.js} +2 -2
- package/dist/{chunk-UP4BECPY.js → chunk-Y3LPTBG7.js} +89 -27
- package/dist/chunk-Y3LPTBG7.js.map +1 -0
- package/dist/{chunk-4OZNXTO4.js → chunk-YRXFFWG4.js} +2 -2
- package/dist/classified/index.js +5 -5
- package/dist/{classified-marker-BWOFVYAC.js → classified-marker-SIYKUU5L.js} +3 -3
- package/dist/classified-marker-SIYKUU5L.js.map +1 -0
- package/dist/collection-facade-CS7CA2XO.js +47 -0
- package/dist/{computed-VPOKQK4N.js → computed-FAD7SED4.js} +3 -3
- package/dist/consent/index.js +10 -11
- package/dist/consent/index.js.map +1 -1
- package/dist/cover/index.js +10 -11
- package/dist/coverage/index.js +306 -0
- package/dist/coverage/index.js.map +1 -0
- package/dist/custody/index.js +12 -13
- package/dist/{dead-filter-PKQDLOT4.js → dead-filter-4F3LWYKH.js} +11 -3
- package/dist/dead-filter-4F3LWYKH.js.map +1 -0
- package/dist/debug/index.js +11 -2
- package/dist/debug/index.js.map +1 -1
- package/dist/{delegation-DS5NRILW.js → delegation-NANZDG4N.js} +13 -16
- package/dist/delegation-NANZDG4N.js.map +1 -0
- package/dist/derivations/index.js +25 -23
- package/dist/derive-XLOJVXPU.js +20 -0
- package/dist/directory/index.js +10 -11
- package/dist/{dispatch-IEPAVQUM.js → dispatch-H4HV32AM.js} +5 -5
- package/dist/{dispatch-Q6MWLOJY.js → dispatch-JDZNGEB3.js} +20 -21
- package/dist/dispatch-JDZNGEB3.js.map +1 -0
- package/dist/executor-FMPVN6DT.js +35 -0
- package/dist/executor-LBBBRTN5.js +8 -0
- package/dist/executor-OSRZST2U.js +8 -0
- package/dist/export-accessible-RAOJAAU5.js +22 -0
- package/dist/extract-partition-JD5CUSTG.js +37 -0
- package/dist/{fanout-sidecar-S3QL53YX.js → fanout-sidecar-L7NHPIOC.js} +13 -15
- package/dist/fanout-sidecar-L7NHPIOC.js.map +1 -0
- package/dist/find-JRN4RNQ5.js +10 -0
- package/dist/forget/index.js +9 -10
- package/dist/forget/index.js.map +1 -1
- package/dist/guards/index.js +4 -4
- package/dist/history/index.js +13 -14
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.js +14 -15
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.d.ts +36 -14
- package/dist/index.js +970 -163
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.js +13 -5
- package/dist/indexing/index.js.map +1 -1
- package/dist/introspection/index.js +11 -12
- package/dist/issue-YIVBZUTH.js +19 -0
- package/dist/ivf-flat-UZ6DQDLS.js +314 -0
- package/dist/ivf-flat-UZ6DQDLS.js.map +1 -0
- package/dist/{json-schema-V3M5MUCM.js → json-schema-3SHX72CC.js} +2 -1
- package/dist/json-schema-3SHX72CC.js.map +1 -0
- package/dist/kernel/attestation-types.d.ts +62 -0
- package/dist/kernel/collection-config.d.ts +5 -68
- package/dist/kernel/collection.d.ts +30 -9
- package/dist/kernel/cutover-transform.d.ts +1 -1
- package/dist/kernel/errors.d.ts +257 -38
- package/dist/kernel/generation-map.d.ts +48 -0
- package/dist/kernel/merge-authority.d.ts +1 -1
- package/dist/kernel/noydb.d.ts +6 -1
- package/dist/kernel/paths.d.ts +29 -5
- package/dist/kernel/prepared-write.d.ts +1 -1
- package/dist/kernel/present-cache.d.ts +58 -0
- package/dist/kernel/query/all.d.ts +7 -0
- package/dist/kernel/query/builder.d.ts +601 -270
- package/dist/kernel/query/civil-date.d.ts +64 -0
- package/dist/kernel/query/cursor.d.ts +40 -0
- package/dist/kernel/query/distinct-key.d.ts +98 -0
- package/dist/kernel/query/hydration.d.ts +76 -0
- package/dist/kernel/query/index.d.ts +31 -15
- package/dist/kernel/query/internal/core.d.ts +30 -0
- package/dist/kernel/query/internal/hooks.d.ts +22 -0
- package/dist/kernel/query/internal/maintenance.d.ts +43 -0
- package/dist/kernel/query/live/incremental.d.ts +314 -0
- package/dist/kernel/query/live/index.d.ts +22 -0
- package/dist/kernel/query/live/install.d.ts +2 -0
- package/dist/kernel/query/{live.d.ts → live/live.d.ts} +39 -9
- package/dist/kernel/query/live/methods.d.ts +107 -0
- package/dist/kernel/query/predicate.d.ts +119 -1
- package/dist/kernel/query/reduce/date-trunc.d.ts +75 -0
- package/dist/kernel/query/reduce/index.d.ts +36 -0
- package/dist/kernel/query/reduce/install.d.ts +2 -0
- package/dist/kernel/query/reduce/methods.d.ts +259 -0
- package/dist/kernel/query/reduce/scan-methods.d.ts +121 -0
- package/dist/kernel/query/relate/explain.d.ts +199 -0
- package/dist/kernel/query/relate/index.d.ts +48 -0
- package/dist/kernel/query/relate/install.d.ts +2 -0
- package/dist/kernel/query/relate/join-on.d.ts +126 -0
- package/dist/kernel/query/relate/join-reduce.d.ts +16 -0
- package/dist/kernel/query/relate/join.d.ts +452 -0
- package/dist/kernel/query/relate/methods.d.ts +426 -0
- package/dist/kernel/query/relate/partition.d.ts +87 -0
- package/dist/kernel/query/relate/scan-methods.d.ts +163 -0
- package/dist/kernel/query/relate/traverse.d.ts +109 -0
- package/dist/kernel/query/scan-builder.d.ts +79 -176
- package/dist/kernel/query/sort-key.d.ts +52 -0
- package/dist/kernel/secret-mode.d.ts +1 -1
- package/dist/kernel/tx-write-gate.d.ts +77 -0
- package/dist/kernel/types.d.ts +113 -8
- package/dist/kernel/validation.d.ts +27 -10
- package/dist/kernel/vault.d.ts +11 -6
- package/dist/kernel/via/compose.d.ts +3 -0
- package/dist/kernel/via/index.d.ts +56 -0
- package/dist/kernel/via/pipeline.d.ts +48 -0
- package/dist/kernel/write-queue.d.ts +17 -0
- package/dist/{ledger-EDXFFZQL.js → ledger-5ZMGE44K.js} +11 -12
- package/dist/liberate-WZSZM2W6.js +24 -0
- package/dist/link-set-MFXC24VK.js +29 -0
- package/dist/{managed-secret-NCWEMPUQ.js → managed-secret-MFTFT22X.js} +10 -11
- package/dist/materialized-views/index.js +30 -24
- package/dist/{migrate-cek-5ENH64AA.js → migrate-cek-DZRFFOHW.js} +2 -2
- package/dist/money/index.js +5 -5
- package/dist/noydb-ITIGNKUF.js +96 -0
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.js +12 -13
- package/dist/pod/index.js +74 -67
- package/dist/{pod-handle-ECVCDIXW.js → pod-handle-A3LET7NO.js} +10 -11
- package/dist/pod-handle-A3LET7NO.js.map +1 -0
- package/dist/policy/index.js +10 -11
- package/dist/port/on/index.d.ts +1 -1
- package/dist/port/to/index.d.ts +1 -1
- package/dist/port/with/blob-strategy.d.ts +10 -1
- package/dist/port/with/classified-strategy.d.ts +1 -1
- package/dist/port/with/collection-options.d.ts +6 -1
- package/dist/port/with/collection-registries.d.ts +1 -1
- package/dist/port/with/coverage-strategy.d.ts +83 -0
- package/dist/port/with/lookup-strategy.d.ts +2 -2
- package/dist/port/with/service-bus.d.ts +46 -0
- package/dist/port/with/strategies.d.ts +2 -0
- package/dist/portability/index.js +8 -8
- package/dist/{post-register-3IPCSG6Q.js → post-register-7ND27CF2.js} +6 -6
- package/dist/post-register-7ND27CF2.js.map +1 -0
- package/dist/query/all/index.js +31 -0
- package/dist/query/index.js +20 -32
- package/dist/query/live/index.js +21 -0
- package/dist/query/live/index.js.map +1 -0
- package/dist/query/reduce/index.js +33 -0
- package/dist/query/reduce/index.js.map +1 -0
- package/dist/query/relate/index.js +56 -0
- package/dist/query/relate/index.js.map +1 -0
- package/dist/reduce/index.js +72 -18
- package/dist/reduce/index.js.map +1 -1
- package/dist/register-DT5HZ2LZ.js +30 -0
- package/dist/registry-BHRZGZHF.js +8 -0
- package/dist/registry-ET6ZFFWA.js +34 -0
- package/dist/registry-HXFGLGTG.js +8 -0
- package/dist/registry-THCPDEOD.js +23 -0
- package/dist/request-withdrawal-AV2MJJKY.js +30 -0
- package/dist/{reveal-QZDHSGD4.js → reveal-B2TLP4JQ.js} +10 -9
- package/dist/reveal-B2TLP4JQ.js.map +1 -0
- package/dist/revoke-6DWIEOCV.js +24 -0
- package/dist/satellites/index.js +1 -1
- package/dist/schema-update/index.js +2 -2
- package/dist/sealed-record/index.js +16 -18
- package/dist/sealed-record/index.js.map +1 -1
- package/dist/search/index.js +11 -5
- package/dist/{seed-X5CC22CQ.js → seed-XNSE4U3S.js} +15 -18
- package/dist/seed-XNSE4U3S.js.map +1 -0
- package/dist/sequence/index.js +9 -10
- package/dist/session/index.js +9 -10
- package/dist/session/index.js.map +1 -1
- package/dist/shadow/index.js +2 -2
- package/dist/signer-MHGW3OIL.js +23 -0
- package/dist/snapshots/index.js +11 -11
- package/dist/stale-6GCFMOOR.js +28 -0
- package/dist/storage-BYN5LO6Z.js +21 -0
- package/dist/storage-BYN5LO6Z.js.map +1 -0
- package/dist/store/index.js +1 -1
- package/dist/{store-coordination-provider-4WZAIRHC.js → store-coordination-provider-C4BPT5XF.js} +11 -12
- package/dist/store-coordination-provider-C4BPT5XF.js.map +1 -0
- package/dist/sync/index.js +10 -11
- package/dist/sync/index.js.map +1 -1
- package/dist/team/index.js +17 -16
- package/dist/tiers/index.js +13 -12
- package/dist/to/index.js +2 -2
- package/dist/transactions/index.js +3 -3
- package/dist/util/index.js +1 -1
- package/dist/vault-head/index.js +11 -14
- package/dist/vault-head/index.js.map +1 -1
- package/dist/{verify-6MDTIUEV.js → verify-UKALW7C2.js} +14 -12
- package/dist/verify-UKALW7C2.js.map +1 -0
- package/dist/via/blob/index.d.ts +1 -0
- package/dist/via/classified/binding.d.ts +2 -2
- package/dist/via/classified/config-drift.d.ts +2 -2
- package/dist/via/classified/errors.d.ts +1 -1
- package/dist/via/geo/binding.d.ts +31 -0
- package/dist/via/geo/descriptor.d.ts +54 -0
- package/dist/via/geo/geohash.d.ts +95 -0
- package/dist/via/geo/index.d.ts +13 -0
- package/dist/via/geo/where.d.ts +50 -0
- package/dist/via/i18n/core.d.ts +1 -1
- package/dist/via/lookup/handle.d.ts +4 -4
- package/dist/via/lookup/registry.d.ts +1 -1
- package/dist/via/lookup/snapshot.d.ts +3 -3
- package/dist/walk-4VPK7AS4.js +20 -0
- package/dist/walk-4VPK7AS4.js.map +1 -0
- package/dist/with-audit/attestation/index.d.ts +2 -1
- package/dist/with-audit/attestation/issue.d.ts +2 -2
- package/dist/with-audit/attestation/revoke.d.ts +2 -2
- package/dist/with-audit/attestation/scheme.d.ts +7 -0
- package/dist/with-audit/attestation/signer.d.ts +1 -1
- package/dist/with-audit/attestation/strategy.d.ts +2 -2
- package/dist/with-audit/attestation/types.d.ts +10 -0
- package/dist/with-audit/attestation/vault-facade.d.ts +2 -2
- package/dist/with-audit/attestation/verifier.d.ts +6 -0
- package/dist/with-audit/consent/consent.d.ts +1 -1
- package/dist/with-audit/consent/strategy.d.ts +1 -1
- package/dist/with-audit/coverage/accounting.d.ts +112 -0
- package/dist/with-audit/coverage/active.d.ts +29 -0
- package/dist/with-audit/coverage/index.d.ts +61 -0
- package/dist/with-audit/coverage/sketch.d.ts +75 -0
- package/dist/with-audit/forget/subject-index.d.ts +1 -1
- package/dist/with-audit/periods/periods.d.ts +55 -7
- package/dist/with-audit/periods/reserved-collections.d.ts +3 -0
- package/dist/with-audit/periods/vault-facade.d.ts +18 -1
- package/dist/with-audit/sealed-record/index.d.ts +2 -2
- package/dist/with-audit/sealed-record/strategy.d.ts +1 -1
- package/dist/with-audit/tiers/index.d.ts +53 -2
- package/dist/with-audit/tiers/strategy.d.ts +8 -0
- package/dist/with-cargo/adopt-partition.d.ts +1 -1
- package/dist/with-cargo/extract-partition.d.ts +1 -1
- package/dist/with-cargo/floor.d.ts +3 -3
- package/dist/with-commit/history/history.d.ts +2 -2
- package/dist/with-commit/history/index.d.ts +1 -1
- package/dist/with-commit/history/ledger/store.d.ts +1 -1
- package/dist/with-commit/history/strategy.d.ts +1 -1
- package/dist/with-commit/history/time-machine.d.ts +1 -1
- package/dist/with-commit/numbering/index.d.ts +1 -1
- package/dist/with-commit/sequence/index.d.ts +1 -1
- package/dist/with-commit/tx/invariants.d.ts +1 -1
- package/dist/with-commit/tx/transaction.d.ts +13 -3
- package/dist/with-commit/vault-head/head.d.ts +1 -1
- package/dist/with-commit/vault-head/index.d.ts +1 -1
- package/dist/with-commit/vault-head/strategy.d.ts +1 -1
- package/dist/with-commit/vault-head/verify.d.ts +1 -1
- package/dist/with-formula/derivations/dispatch.d.ts +1 -1
- package/dist/with-formula/derivations/fanout-sidecar.d.ts +1 -1
- package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +4 -3
- package/dist/with-formula/materialized-views/emit-memo.d.ts +40 -0
- package/dist/with-formula/materialized-views/executor.d.ts +8 -0
- package/dist/with-formula/materialized-views/index.d.ts +1 -1
- package/dist/with-formula/materialized-views/registry.d.ts +15 -0
- package/dist/with-formula/materialized-views/types.d.ts +106 -14
- package/dist/with-formula/materialized-views/window-stage.d.ts +11 -0
- package/dist/with-formula/overlay-views/types.d.ts +1 -1
- package/dist/with-formula/overlay-views/virtual-collection.d.ts +13 -4
- package/dist/with-lookup/embeddings/chunks.d.ts +79 -0
- package/dist/with-lookup/embeddings/descriptor.d.ts +21 -0
- package/dist/with-lookup/embeddings/index.d.ts +3 -0
- package/dist/with-lookup/embeddings/ivf-flat.d.ts +93 -0
- package/dist/with-lookup/embeddings/vector-index.d.ts +73 -0
- package/dist/with-lookup/embeddings/vector-set.d.ts +94 -1
- package/dist/with-lookup/embeddings/with-vector-index.d.ts +67 -0
- package/dist/with-lookup/indexing/collection-facade.d.ts +86 -3
- package/dist/with-lookup/indexing/compound-indexes.d.ts +129 -0
- package/dist/with-lookup/indexing/eager-indexes.d.ts +170 -1
- package/dist/with-lookup/indexing/index-snapshot.d.ts +62 -0
- package/dist/with-lookup/indexing/lazy-builder.d.ts +33 -0
- package/dist/with-lookup/indexing/persisted-field-indexes.d.ts +104 -0
- package/dist/with-lookup/indexing/persisted-indexes.d.ts +12 -0
- package/dist/with-lookup/indexing/sorted-indexes.d.ts +117 -0
- package/dist/with-lookup/indexing/unique-constraints.d.ts +106 -23
- package/dist/with-lookup/reduce/active.d.ts +2 -24
- package/dist/with-lookup/reduce/group-core.d.ts +43 -0
- package/dist/with-lookup/reduce/groupby.d.ts +195 -36
- package/dist/with-lookup/reduce/incremental-group.d.ts +153 -0
- package/dist/with-lookup/reduce/index.d.ts +26 -5
- package/dist/with-lookup/reduce/reducers.d.ts +255 -1
- package/dist/with-lookup/reduce/reduction.d.ts +44 -13
- package/dist/with-lookup/reduce/strategy.d.ts +43 -3
- package/dist/with-lookup/reduce/window.d.ts +262 -0
- package/dist/with-lookup/search/collection-facade.d.ts +45 -9
- package/dist/with-lookup/search/index-store.d.ts +5 -3
- package/dist/with-lookup/search/index.d.ts +4 -2
- package/dist/with-lookup/search/inverted-index.d.ts +38 -2
- package/dist/with-lookup/search/persisted-index-store.d.ts +5 -2
- package/dist/with-lookup/search/phrase.d.ts +28 -0
- package/dist/with-lookup/search/retrieve-types.d.ts +57 -1
- package/dist/with-lookup/search/serialize.d.ts +29 -3
- package/dist/with-lookup/search/strategy.d.ts +2 -6
- package/dist/with-party/broker/index.d.ts +3 -3
- package/dist/with-party/directory/cover/index.d.ts +1 -1
- package/dist/with-party/directory/cover/storage.d.ts +1 -1
- package/dist/with-party/directory/cover/types.d.ts +1 -1
- package/dist/with-party/directory/index.d.ts +1 -1
- package/dist/with-party/directory/types.d.ts +1 -1
- package/dist/with-party/directory/user-envelope/api.d.ts +1 -1
- package/dist/with-party/directory/user-envelope/storage.d.ts +1 -1
- package/dist/with-party/policy/engine.d.ts +1 -1
- package/dist/with-party/policy/index.d.ts +1 -1
- package/dist/with-party/policy/presets.d.ts +1 -1
- package/dist/with-party/team/authenticators.d.ts +91 -1
- package/dist/with-party/team/delegation.d.ts +1 -1
- package/dist/with-party/team/echo-secret.d.ts +2 -2
- package/dist/with-party/team/index.d.ts +4 -3
- package/dist/with-party/team/keyring.d.ts +2 -2
- package/dist/with-party/team/magic-link-grant.d.ts +1 -1
- package/dist/with-party/team/managed-secret.d.ts +1 -1
- package/dist/with-party/team/noydb-facade.d.ts +12 -3
- package/dist/with-party/team/recovery.d.ts +1 -1
- package/dist/with-party/team/roster-tag.d.ts +1 -1
- package/dist/with-party/team/rotate-recover.d.ts +1 -1
- package/dist/with-party/team/wrapped-deks.d.ts +1 -1
- package/dist/with-pod/format.d.ts +1 -1
- package/dist/with-pod/index.d.ts +1 -1
- package/dist/with-pod/pod.d.ts +1 -1
- package/dist/with-shape/blobs/blob-compaction.d.ts +17 -1
- package/dist/with-shape/blobs/blob-intent.d.ts +1 -1
- package/dist/with-shape/blobs/blob-set.d.ts +23 -4
- package/dist/with-shape/blobs/legacy-sweep.d.ts +35 -0
- package/dist/with-shape/introspection/describe.d.ts +7 -1
- package/dist/with-shape/introspection/field-meta.d.ts +18 -0
- package/dist/with-shape/introspection/types.d.ts +57 -1
- package/dist/with-shape/introspection/walk.d.ts +1 -1
- package/dist/with-shape/links/lazy-handle.d.ts +1 -1
- package/dist/with-shape/links/link-set.d.ts +1 -1
- package/dist/with-shape/links/vault-facade.d.ts +1 -1
- package/dist/with-shape/manifest/derive.d.ts +1 -1
- package/dist/with-shape/manifest/storage.d.ts +1 -1
- package/dist/with-shape/persisted-schemas/register.d.ts +1 -1
- package/dist/with-shape/persisted-schemas/storage.d.ts +1 -1
- package/dist/with-shape/satellites/dead-filter.d.ts +1 -1
- package/dist/with-shape/satellites/declare.d.ts +1 -1
- package/dist/with-shape/satellites/marker.d.ts +1 -1
- package/dist/with-shape/satellites/post-register.d.ts +1 -1
- package/dist/with-store/partitioned/index.d.ts +337 -0
- package/dist/with-sync/change-broadcast.d.ts +153 -0
- package/dist/with-sync/presence.d.ts +5 -10
- package/dist/withdraw-accessible-HL7GACUE.js +27 -0
- package/dist/withdraw-accessible-HL7GACUE.js.map +1 -0
- package/package.json +48 -12
- package/dist/api-WYW4YEQG.js +0 -19
- package/dist/backup-XKCXVKV3.js.map +0 -1
- package/dist/chunk-2577DKXB.js.map +0 -1
- package/dist/chunk-2ENE6445.js.map +0 -1
- package/dist/chunk-2N5ML6HT.js.map +0 -1
- package/dist/chunk-334WSVOW.js.map +0 -1
- package/dist/chunk-3BVH633C.js.map +0 -1
- package/dist/chunk-3PGS7TYR.js.map +0 -1
- package/dist/chunk-3V4KWFX7.js.map +0 -1
- package/dist/chunk-453F654R.js.map +0 -1
- package/dist/chunk-4GFX6MPA.js.map +0 -1
- package/dist/chunk-4GVM6QZA.js.map +0 -1
- package/dist/chunk-4ZS56W5S.js.map +0 -1
- package/dist/chunk-5VCRVKOZ.js.map +0 -1
- package/dist/chunk-6YXCPL4T.js.map +0 -1
- package/dist/chunk-7APJ6CO6.js.map +0 -1
- package/dist/chunk-7MG2LHO5.js +0 -1616
- package/dist/chunk-7MG2LHO5.js.map +0 -1
- package/dist/chunk-7MG7SJT7.js.map +0 -1
- package/dist/chunk-7O3Y4PPD.js.map +0 -1
- package/dist/chunk-A2HKRLPV.js.map +0 -1
- package/dist/chunk-A66I4JOA.js.map +0 -1
- package/dist/chunk-ACAQ2DSG.js.map +0 -1
- package/dist/chunk-ATL3ZVXT.js +0 -151
- package/dist/chunk-ATL3ZVXT.js.map +0 -1
- package/dist/chunk-AYX7AINO.js.map +0 -1
- package/dist/chunk-BLN54W3L.js.map +0 -1
- package/dist/chunk-BRLKZUBT.js +0 -95
- package/dist/chunk-BRLKZUBT.js.map +0 -1
- package/dist/chunk-BTDR2PXY.js +0 -29
- package/dist/chunk-BTDR2PXY.js.map +0 -1
- package/dist/chunk-BVN6KXL2.js.map +0 -1
- package/dist/chunk-CHQCZZWC.js.map +0 -1
- package/dist/chunk-CUQPWYRX.js.map +0 -1
- package/dist/chunk-CUZLNGD5.js.map +0 -1
- package/dist/chunk-DFMWUOU5.js.map +0 -1
- package/dist/chunk-EIPVYUEP.js.map +0 -1
- package/dist/chunk-EQEYOJBM.js.map +0 -1
- package/dist/chunk-F3W6YMDC.js.map +0 -1
- package/dist/chunk-FET5XCAT.js.map +0 -1
- package/dist/chunk-G73UVHCA.js.map +0 -1
- package/dist/chunk-GPNTB4Y7.js.map +0 -1
- package/dist/chunk-GYGLAVCX.js.map +0 -1
- package/dist/chunk-HIWCKBEY.js.map +0 -1
- package/dist/chunk-HJUWN7JN.js.map +0 -1
- package/dist/chunk-HK67PX4J.js.map +0 -1
- package/dist/chunk-HPVZCW43.js +0 -479
- package/dist/chunk-HPVZCW43.js.map +0 -1
- package/dist/chunk-I3ISCYT7.js +0 -159
- package/dist/chunk-I3ISCYT7.js.map +0 -1
- package/dist/chunk-K23VKTN4.js.map +0 -1
- package/dist/chunk-KKEESNPE.js.map +0 -1
- package/dist/chunk-KTFRCC5C.js.map +0 -1
- package/dist/chunk-LH5A3ZPG.js.map +0 -1
- package/dist/chunk-LP7BEXCT.js +0 -32
- package/dist/chunk-LP7BEXCT.js.map +0 -1
- package/dist/chunk-M4YPHYEH.js.map +0 -1
- package/dist/chunk-NSITFOCJ.js +0 -99
- package/dist/chunk-NSITFOCJ.js.map +0 -1
- package/dist/chunk-OTQZ7ZWU.js.map +0 -1
- package/dist/chunk-P3MG6QCN.js.map +0 -1
- package/dist/chunk-PEOZ34EM.js.map +0 -1
- package/dist/chunk-PPTHY5QO.js.map +0 -1
- package/dist/chunk-Q2MPFCQ7.js.map +0 -1
- package/dist/chunk-Q7HZX3IF.js.map +0 -1
- package/dist/chunk-QPQUVOZ2.js.map +0 -1
- package/dist/chunk-QTQUH4DS.js.map +0 -1
- package/dist/chunk-R42NSZI6.js.map +0 -1
- package/dist/chunk-R7BX2NB3.js.map +0 -1
- package/dist/chunk-RSGLUIO6.js.map +0 -1
- package/dist/chunk-RTBJ5IOO.js +0 -87
- package/dist/chunk-RTBJ5IOO.js.map +0 -1
- package/dist/chunk-SGZAIJCV.js.map +0 -1
- package/dist/chunk-SKGMN35F.js.map +0 -1
- package/dist/chunk-SPYWXKJN.js.map +0 -1
- package/dist/chunk-SZJ3DLZA.js +0 -66
- package/dist/chunk-SZJ3DLZA.js.map +0 -1
- package/dist/chunk-TRGTKX5E.js.map +0 -1
- package/dist/chunk-UDHWDSRL.js.map +0 -1
- package/dist/chunk-UP4BECPY.js.map +0 -1
- package/dist/chunk-UXVWEX5L.js.map +0 -1
- package/dist/chunk-V7ZRRCRJ.js.map +0 -1
- package/dist/chunk-WQBG4SZS.js.map +0 -1
- package/dist/chunk-XKWGNJ26.js.map +0 -1
- package/dist/chunk-YMUFFJCO.js.map +0 -1
- package/dist/chunk-ZHKOPKE3.js.map +0 -1
- package/dist/chunk-ZN4FD4PE.js +0 -364
- package/dist/chunk-ZN4FD4PE.js.map +0 -1
- package/dist/chunk-ZORTV6NH.js.map +0 -1
- package/dist/chunk-ZYIYHJ5R.js.map +0 -1
- package/dist/classified-marker-BWOFVYAC.js.map +0 -1
- package/dist/collection-facade-JSJYIKS4.js +0 -45
- package/dist/dead-filter-PKQDLOT4.js.map +0 -1
- package/dist/delegation-DS5NRILW.js.map +0 -1
- package/dist/derive-E642AOUB.js +0 -21
- package/dist/dispatch-Q6MWLOJY.js.map +0 -1
- package/dist/executor-5NIMLSKZ.js +0 -8
- package/dist/executor-7UQ3BZ4F.js +0 -29
- package/dist/executor-AQVXV5GZ.js +0 -8
- package/dist/export-accessible-ORMKLA3E.js +0 -22
- package/dist/extract-partition-NKYO3WNG.js +0 -37
- package/dist/fanout-sidecar-S3QL53YX.js.map +0 -1
- package/dist/find-NOGJ25VX.js +0 -10
- package/dist/issue-3DTQ7VJJ.js +0 -18
- package/dist/json-schema-V3M5MUCM.js.map +0 -1
- package/dist/kernel/enclave/classify/compare.d.ts +0 -10
- package/dist/kernel/enclave/index.d.ts +0 -87
- package/dist/kernel/enclave/record-keys/lifecycle.d.ts +0 -124
- package/dist/kernel/enclave/record-keys/rekey-blob.d.ts +0 -88
- package/dist/kernel/enclave/record-keys/rekey.d.ts +0 -91
- package/dist/kernel/enclave/record-keys/sealed-slot.d.ts +0 -14
- package/dist/kernel/enclave/record-keys/sealed-slots.d.ts +0 -123
- package/dist/kernel/enclave/record-keys/sealing.d.ts +0 -70
- package/dist/kernel/query/join.d.ts +0 -232
- package/dist/liberate-V35QUHJP.js +0 -24
- package/dist/link-set-2TTM3IZC.js +0 -30
- package/dist/noydb-62MX4QUG.js +0 -90
- package/dist/pod-handle-ECVCDIXW.js.map +0 -1
- package/dist/post-register-3IPCSG6Q.js.map +0 -1
- package/dist/register-HHLXEQDN.js +0 -31
- package/dist/registry-23WF3TGH.js +0 -8
- package/dist/registry-4AYVUNXK.js +0 -8
- package/dist/registry-JS3YFQQM.js +0 -18
- package/dist/registry-XX2Z7B46.js +0 -32
- package/dist/request-withdrawal-CHPATE4G.js +0 -30
- package/dist/reveal-QZDHSGD4.js.map +0 -1
- package/dist/revoke-7M2VW4ON.js +0 -23
- package/dist/seed-X5CC22CQ.js.map +0 -1
- package/dist/signer-SJQJVSM6.js +0 -24
- package/dist/stale-BZS6H2RY.js +0 -29
- package/dist/storage-RW4QBS23.js +0 -22
- package/dist/store-coordination-provider-4WZAIRHC.js.map +0 -1
- package/dist/verify-6MDTIUEV.js.map +0 -1
- package/dist/walk-ZURCH6RZ.js +0 -21
- package/dist/withdraw-accessible-PXR4IXDX.js +0 -27
- /package/dist/{api-WYW4YEQG.js.map → api-OS747DS4.js.map} +0 -0
- /package/dist/{computed-VPOKQK4N.js.map → capsule/contract.js.map} +0 -0
- /package/dist/{kernel/enclave → capsule/enclave-aes}/broker/proof.d.ts +0 -0
- /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/bidx.d.ts +0 -0
- /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/digest.d.ts +0 -0
- /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/vdig.d.ts +0 -0
- /package/dist/{kernel/enclave/classify → capsule/plumbing}/kofn.d.ts +0 -0
- /package/dist/{kernel/enclave/classify → capsule/plumbing}/normalize.d.ts +0 -0
- /package/dist/{kernel/enclave → capsule/plumbing}/record-aad.d.ts +0 -0
- /package/dist/{collection-facade-JSJYIKS4.js.map → capsule-VOLX3QRQ.js.map} +0 -0
- /package/dist/{chunk-MVMXZYXT.js.map → chunk-2GHDLTPE.js.map} +0 -0
- /package/dist/{chunk-XLMEZIAJ.js.map → chunk-2ODVB6LZ.js.map} +0 -0
- /package/dist/{chunk-RMS3NEA3.js.map → chunk-4JPMZTJY.js.map} +0 -0
- /package/dist/{chunk-NQKIUNW5.js.map → chunk-52MGURXO.js.map} +0 -0
- /package/dist/{chunk-UGTBXF5U.js.map → chunk-7XMHMVTS.js.map} +0 -0
- /package/dist/{chunk-BZ3534YM.js.map → chunk-AUKKUPVB.js.map} +0 -0
- /package/dist/{derive-E642AOUB.js.map → chunk-BKT776R5.js.map} +0 -0
- /package/dist/{chunk-6LKOJBV6.js.map → chunk-BVCUTXE3.js.map} +0 -0
- /package/dist/{chunk-VTFVLCUH.js.map → chunk-DIZLQVAA.js.map} +0 -0
- /package/dist/{chunk-LWBCUYZW.js.map → chunk-E2N2T5ZO.js.map} +0 -0
- /package/dist/{chunk-JVIBCBC7.js.map → chunk-EJLV62NI.js.map} +0 -0
- /package/dist/{chunk-JMGDHKQF.js.map → chunk-FLPCETP6.js.map} +0 -0
- /package/dist/{chunk-DGOZ4UZD.js.map → chunk-FVH5QYY2.js.map} +0 -0
- /package/dist/{chunk-JBDFMYKQ.js.map → chunk-GZT3NQRA.js.map} +0 -0
- /package/dist/{chunk-TFR7DSOV.js.map → chunk-H427H63K.js.map} +0 -0
- /package/dist/{chunk-SMH6SRX7.js.map → chunk-JOSPH3E5.js.map} +0 -0
- /package/dist/{chunk-3BZZJJMQ.js.map → chunk-MILI22XQ.js.map} +0 -0
- /package/dist/{chunk-YYP7WSEB.js.map → chunk-O2IMQSNA.js.map} +0 -0
- /package/dist/{chunk-QIZPZMUI.js.map → chunk-Q4UHJ5SN.js.map} +0 -0
- /package/dist/{chunk-FAHMLERK.js.map → chunk-QBLT6POL.js.map} +0 -0
- /package/dist/{chunk-BUE2D7PX.js.map → chunk-SMV2HRDU.js.map} +0 -0
- /package/dist/{chunk-SFAWCTEM.js.map → chunk-TZZBXPZK.js.map} +0 -0
- /package/dist/{chunk-UHHPLO3I.js.map → chunk-V3RWOOSO.js.map} +0 -0
- /package/dist/{chunk-Q2PU57HC.js.map → chunk-VVOLDVIR.js.map} +0 -0
- /package/dist/{chunk-TUFM4UZP.js.map → chunk-XQRFSKYM.js.map} +0 -0
- /package/dist/{chunk-GY4WYNNG.js.map → chunk-Y2RKVFKR.js.map} +0 -0
- /package/dist/{chunk-4OZNXTO4.js.map → chunk-YRXFFWG4.js.map} +0 -0
- /package/dist/{enclave-55PAM4YO.js.map → collection-facade-CS7CA2XO.js.map} +0 -0
- /package/dist/{executor-5NIMLSKZ.js.map → computed-FAD7SED4.js.map} +0 -0
- /package/dist/{executor-7UQ3BZ4F.js.map → derive-XLOJVXPU.js.map} +0 -0
- /package/dist/{dispatch-IEPAVQUM.js.map → dispatch-H4HV32AM.js.map} +0 -0
- /package/dist/{executor-AQVXV5GZ.js.map → executor-FMPVN6DT.js.map} +0 -0
- /package/dist/{export-accessible-ORMKLA3E.js.map → executor-LBBBRTN5.js.map} +0 -0
- /package/dist/{extract-partition-NKYO3WNG.js.map → executor-OSRZST2U.js.map} +0 -0
- /package/dist/{find-NOGJ25VX.js.map → export-accessible-RAOJAAU5.js.map} +0 -0
- /package/dist/{issue-3DTQ7VJJ.js.map → extract-partition-JD5CUSTG.js.map} +0 -0
- /package/dist/{ledger-EDXFFZQL.js.map → find-JRN4RNQ5.js.map} +0 -0
- /package/dist/{liberate-V35QUHJP.js.map → issue-YIVBZUTH.js.map} +0 -0
- /package/dist/{link-set-2TTM3IZC.js.map → ledger-5ZMGE44K.js.map} +0 -0
- /package/dist/{managed-secret-NCWEMPUQ.js.map → liberate-WZSZM2W6.js.map} +0 -0
- /package/dist/{noydb-62MX4QUG.js.map → link-set-MFXC24VK.js.map} +0 -0
- /package/dist/{register-HHLXEQDN.js.map → managed-secret-MFTFT22X.js.map} +0 -0
- /package/dist/{migrate-cek-5ENH64AA.js.map → migrate-cek-DZRFFOHW.js.map} +0 -0
- /package/dist/{registry-23WF3TGH.js.map → noydb-ITIGNKUF.js.map} +0 -0
- /package/dist/{registry-4AYVUNXK.js.map → query/all/index.js.map} +0 -0
- /package/dist/{registry-JS3YFQQM.js.map → register-DT5HZ2LZ.js.map} +0 -0
- /package/dist/{registry-XX2Z7B46.js.map → registry-BHRZGZHF.js.map} +0 -0
- /package/dist/{request-withdrawal-CHPATE4G.js.map → registry-ET6ZFFWA.js.map} +0 -0
- /package/dist/{revoke-7M2VW4ON.js.map → registry-HXFGLGTG.js.map} +0 -0
- /package/dist/{signer-SJQJVSM6.js.map → registry-THCPDEOD.js.map} +0 -0
- /package/dist/{stale-BZS6H2RY.js.map → request-withdrawal-AV2MJJKY.js.map} +0 -0
- /package/dist/{storage-RW4QBS23.js.map → revoke-6DWIEOCV.js.map} +0 -0
- /package/dist/{walk-ZURCH6RZ.js.map → signer-MHGW3OIL.js.map} +0 -0
- /package/dist/{withdraw-accessible-PXR4IXDX.js.map → stale-6GCFMOOR.js.map} +0 -0
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FieldNotQueryableError,
|
|
3
|
+
ValidationError
|
|
4
|
+
} from "./chunk-37EPTBBR.js";
|
|
5
|
+
|
|
6
|
+
// src/kernel/via/pipeline.ts
|
|
7
|
+
var ViaPipeline = class _ViaPipeline {
|
|
8
|
+
constructor(bindings, taint) {
|
|
9
|
+
this.bindings = bindings;
|
|
10
|
+
this.taint = taint;
|
|
11
|
+
const moneyVias = bindings.filter((b) => b.brand === "money");
|
|
12
|
+
const computedVias = bindings.filter((b) => b.brand === "computed");
|
|
13
|
+
const restBindings = bindings.filter((b) => b.brand !== "money" && b.brand !== "computed");
|
|
14
|
+
this._presentOrder = [...moneyVias, ...computedVias, ...restBindings];
|
|
15
|
+
this._presentLateBoundary = moneyVias.length + computedVias.length;
|
|
16
|
+
}
|
|
17
|
+
bindings;
|
|
18
|
+
taint;
|
|
19
|
+
/**
|
|
20
|
+
* Present-phase-ONLY order (#665, corrected under #665 review) — a stable
|
|
21
|
+
* THREE-WAY partition of `bindings` computed once here at construction:
|
|
22
|
+
* every `'money'`-brand binding first (existing relative order), then
|
|
23
|
+
* every `'computed'`-brand binding (existing relative order), then
|
|
24
|
+
* everything else (existing relative order). `present()` folds over this
|
|
25
|
+
* instead of `bindings` so a `mode: 'virtual'` computed field's value
|
|
26
|
+
* exists before i18n/lookup's dressing `present()` hooks run on it
|
|
27
|
+
* (today's `compileVias` order is money→i18n→lookup→classified→
|
|
28
|
+
* blob→computed, `collection-config.ts:554`, so dressing unconditionally
|
|
29
|
+
* ran BEFORE the value it dresses existed). This reorder is binding-level,
|
|
30
|
+
* not conditioned on any particular field composition — it applies to
|
|
31
|
+
* EVERY collection that compiles a `'computed'` binding at all, not only
|
|
32
|
+
* ones stacking a dresser on the SAME field as a computed one. EVERY other
|
|
33
|
+
* phase (`ingest`/`encodeWrite`/`encodeAtRest`/`enforceWrite`/etc.) keeps
|
|
34
|
+
* folding over `bindings` unchanged — those write/query phases need
|
|
35
|
+
* money-first (`_applyMoneyFields` PREPENDS money, `_applyClassifiedFields`
|
|
36
|
+
* APPENDS classified to preserve it, `kernel/collection.ts:1275-1284,1364-
|
|
37
|
+
* 1368`).
|
|
38
|
+
*
|
|
39
|
+
* Money is deliberately carved OUT of the generic "everything else" slice
|
|
40
|
+
* and kept FIRST — the original two-way `[computed..., rest...]` partition
|
|
41
|
+
* regressed money's composed-field behavior from a benign missing-dressing
|
|
42
|
+
* gap into VALUE CORRUPTION: money's `present()` DECODES its input as a
|
|
43
|
+
* STORED SCALED-INT (and derives `<field>Formatted` from it) — it is not a
|
|
44
|
+
* pure dressing CONSUMER like i18n/lookup, which only ADD a `<field>Label`
|
|
45
|
+
* key and never rewrite the field's own value. Running money AFTER
|
|
46
|
+
* computed on a field composing `computed(virtual)` + `money(...)` on
|
|
47
|
+
* ITSELF means money's decode sees the virtual field's raw MAJOR-unit
|
|
48
|
+
* output (e.g. `21`) and misreads it as a scaled-int, producing a
|
|
49
|
+
* corrupted value (`'0.21'`) instead of the pre-#665 result (the raw `21`
|
|
50
|
+
* surviving untouched, with no `Formatted` key added — a benign
|
|
51
|
+
* missing-dressing gap, not a wrong value). Money-first restores money's
|
|
52
|
+
* exact pre-#665 present position — byte-identical money behavior; the
|
|
53
|
+
* materialized composition pins from the #631 work and the money suites
|
|
54
|
+
* all ran under money-first. i18n/lookup are genuine dressing consumers
|
|
55
|
+
* (they only ADD, never rewrite), so they stay after computed, which is
|
|
56
|
+
* the fix #665 intended. A `'taint'` binding (appended LAST by
|
|
57
|
+
* `via/graph-wiring.ts#applyTaintOverlay`) stays last here too (it's
|
|
58
|
+
* neither money nor computed, so it lands at the tail of the "everything
|
|
59
|
+
* else" slice), preserving its "runs after computed, redacts tainted
|
|
60
|
+
* virtual output" contract (`via/taint-binding.ts`'s `taintBinding` doc
|
|
61
|
+
* comment).
|
|
62
|
+
*
|
|
63
|
+
* Money-dressing a virtual computed field's OWN output (the composed
|
|
64
|
+
* `computed(virtual) + money` case) is NOT resolved by this partition
|
|
65
|
+
* alone — #669 resolves it with a separate mid-fold hook instead:
|
|
66
|
+
* `NoydbVia.presentLate` runs after every binding's `present()` in this
|
|
67
|
+
* money+computed segment, before the "everything else" segment below, so
|
|
68
|
+
* money can quantize/reinterpret a virtual field's fresh MAJOR-UNITS
|
|
69
|
+
* output as if it were a stored value, without perturbing this ordering
|
|
70
|
+
* or the #665 invariant above it (`_presentLateBoundary` below marks
|
|
71
|
+
* exactly where that mid-fold point sits within `_presentOrder`).
|
|
72
|
+
*/
|
|
73
|
+
_presentOrder;
|
|
74
|
+
/** #669 — index into `_presentOrder` where the money+computed segment ends and the
|
|
75
|
+
* "everything else" segment begins (`moneyVias.length + computedVias.length`);
|
|
76
|
+
* `present()` runs every binding's `presentLate` at exactly this boundary. */
|
|
77
|
+
_presentLateBoundary;
|
|
78
|
+
/** undefined when there is nothing to enforce — the zero-via fast path is
|
|
79
|
+
* `this.via === undefined` (#553: keeps an all-plain collection sync). A
|
|
80
|
+
* `'*'`-defaulted output collection (#642) counts as "something to enforce"
|
|
81
|
+
* even with zero field-specific postures and zero bindings. */
|
|
82
|
+
static build(bindings, taint) {
|
|
83
|
+
if (bindings.length === 0 && (!taint || taint.postures.size === 0 && taint.defaultPosture === void 0)) return void 0;
|
|
84
|
+
return new _ViaPipeline(bindings, taint);
|
|
85
|
+
}
|
|
86
|
+
/** Refuse a write before crypto runs: awaits each binding's `enforceWrite` in order — first throw wins. */
|
|
87
|
+
async enforceWrite(record, ctx) {
|
|
88
|
+
for (const b of this.bindings) if (b.enforceWrite) await b.enforceWrite(record, ctx);
|
|
89
|
+
}
|
|
90
|
+
ingest(record) {
|
|
91
|
+
let r = record;
|
|
92
|
+
for (const b of this.bindings) if (b.ingest) r = b.ingest(r);
|
|
93
|
+
return r;
|
|
94
|
+
}
|
|
95
|
+
canonicalizeStored(record) {
|
|
96
|
+
let r = record;
|
|
97
|
+
for (const b of this.bindings) if (b.canonicalizeStored) r = b.canonicalizeStored(r);
|
|
98
|
+
return r;
|
|
99
|
+
}
|
|
100
|
+
async encodeWrite(record, ctx) {
|
|
101
|
+
let r = record;
|
|
102
|
+
for (const b of this.bindings) if (b.encodeWrite) r = await b.encodeWrite(r, ctx);
|
|
103
|
+
return r;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Final write-pipeline stage: folds each binding's `encodeAtRest` in
|
|
107
|
+
* order, threading the record and accumulating the sealed-slot map. A
|
|
108
|
+
* field belongs to exactly one via feature — two bindings sealing the
|
|
109
|
+
* same field is a brand-keyed collision and throws.
|
|
110
|
+
*/
|
|
111
|
+
async encodeAtRest(record, crypto) {
|
|
112
|
+
let r = record;
|
|
113
|
+
let sealed;
|
|
114
|
+
const sealedBy = /* @__PURE__ */ new Map();
|
|
115
|
+
for (const b of this.bindings) {
|
|
116
|
+
if (!b.encodeAtRest) continue;
|
|
117
|
+
const result = await b.encodeAtRest(r, crypto);
|
|
118
|
+
r = result.record;
|
|
119
|
+
if (!result.sealed) continue;
|
|
120
|
+
for (const [field, ref] of Object.entries(result.sealed)) {
|
|
121
|
+
const priorBrand = sealedBy.get(field);
|
|
122
|
+
if (priorBrand !== void 0) {
|
|
123
|
+
throw new ValidationError(
|
|
124
|
+
`via encodeAtRest: field "${field}" sealed by binding "${priorBrand}" is also sealed by binding "${b.brand}"`
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
sealedBy.set(field, b.brand);
|
|
128
|
+
sealed ??= {};
|
|
129
|
+
sealed[field] = ref;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return sealed ? { record: r, sealed } : { record: r };
|
|
133
|
+
}
|
|
134
|
+
/** First read-pipeline stage: folds each binding's `decodeAtRest` in order. */
|
|
135
|
+
async decodeAtRest(record, sealed, crypto, opts) {
|
|
136
|
+
let r = record;
|
|
137
|
+
for (const b of this.bindings) if (b.decodeAtRest) r = await b.decodeAtRest(r, sealed, crypto, opts);
|
|
138
|
+
return r;
|
|
139
|
+
}
|
|
140
|
+
async present(record, ctx) {
|
|
141
|
+
let r = record;
|
|
142
|
+
for (let i = 0; i < this._presentLateBoundary; i++) {
|
|
143
|
+
const b = this._presentOrder[i];
|
|
144
|
+
if (b.present) r = await b.present(r, ctx);
|
|
145
|
+
}
|
|
146
|
+
for (const b of this.bindings) if (b.presentLate) r = await b.presentLate(r, ctx);
|
|
147
|
+
for (let i = this._presentLateBoundary; i < this._presentOrder.length; i++) {
|
|
148
|
+
const b = this._presentOrder[i];
|
|
149
|
+
if (b.present) r = await b.present(r, ctx);
|
|
150
|
+
}
|
|
151
|
+
return r;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* #1416 — the synchronous half of {@link present}, for the query path.
|
|
155
|
+
*
|
|
156
|
+
* `query().toArray()` is SYNCHRONOUS (#1413) and so cannot await `present`,
|
|
157
|
+
* which is why it ran `decodeResults` instead — money's stored→canonical
|
|
158
|
+
* decode and nothing else. The visible cost was that a
|
|
159
|
+
* `computed({ mode:'virtual' })` field read `undefined` on a query row while
|
|
160
|
+
* `get()` and `list()` returned it, so the same record had two shapes
|
|
161
|
+
* depending on which read verb produced it, and a caller summing that field
|
|
162
|
+
* over a query result got `NaN` with no error.
|
|
163
|
+
*
|
|
164
|
+
* This folds the SAME order as `present`, skipping any binding that has not
|
|
165
|
+
* declared {@link ViaBinding.presentIsSync}. `money` and `computed` do, which
|
|
166
|
+
* is the pair that carries values; `i18n` and `lookup` are genuinely async
|
|
167
|
+
* and are reported in `skipped` rather than silently dropped — the caller can
|
|
168
|
+
* then say so instead of leaving a hole.
|
|
169
|
+
*
|
|
170
|
+
* ⚠️ Ordering is preserved exactly, including the `presentLate` boundary,
|
|
171
|
+
* because money's `presentLate` exists to react to computed's virtual output
|
|
172
|
+
* (#669). Reordering here would corrupt a field that is both money and
|
|
173
|
+
* virtual.
|
|
174
|
+
*/
|
|
175
|
+
presentSync(record, ctx) {
|
|
176
|
+
let r = record;
|
|
177
|
+
const skipped = [];
|
|
178
|
+
const note = (b) => {
|
|
179
|
+
if (!skipped.includes(b.brand)) skipped.push(b.brand);
|
|
180
|
+
};
|
|
181
|
+
const runnable = (b) => {
|
|
182
|
+
if (b.presentIsSync === true) return true;
|
|
183
|
+
if (b.present || b.presentLate) note(b);
|
|
184
|
+
return false;
|
|
185
|
+
};
|
|
186
|
+
for (let i = 0; i < this._presentLateBoundary; i++) {
|
|
187
|
+
const b = this._presentOrder[i];
|
|
188
|
+
if (b.present && runnable(b)) r = b.present(r, ctx);
|
|
189
|
+
}
|
|
190
|
+
for (const b of this.bindings) {
|
|
191
|
+
if (b.presentLate && runnable(b)) r = b.presentLate(r, ctx);
|
|
192
|
+
}
|
|
193
|
+
for (let i = this._presentLateBoundary; i < this._presentOrder.length; i++) {
|
|
194
|
+
const b = this._presentOrder[i];
|
|
195
|
+
if (b.present && runnable(b)) r = b.present(r, ctx);
|
|
196
|
+
}
|
|
197
|
+
return { record: r, skipped };
|
|
198
|
+
}
|
|
199
|
+
/** True iff some binding's presentation can only run on the async path (#1416). */
|
|
200
|
+
get hasAsyncPresent() {
|
|
201
|
+
return this.bindings.some((b) => (b.present !== void 0 || b.presentLate !== void 0) && b.presentIsSync !== true);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* #1447 — which bindings cover which fields, for `dumpSchema()`.
|
|
205
|
+
*
|
|
206
|
+
* Field name → the brands covering it, sorted. A field can appear under more
|
|
207
|
+
* than one brand: a money field that is also `computed({ mode:'virtual' })`
|
|
208
|
+
* is covered by both, and collapsing that to one would misreport what the
|
|
209
|
+
* datastore does to it.
|
|
210
|
+
*
|
|
211
|
+
* ⛔ BRAND AND FIELD ONLY — never a binding's configuration, and the reason
|
|
212
|
+
* is not payload size. A schema dump travels further than a vault does, and
|
|
213
|
+
* a report saying "this field is classified, sensitivity pii" is a map of
|
|
214
|
+
* which columns are worth attacking, in an artefact that by design leaves
|
|
215
|
+
* the vault. The consumer who asked for this said brand-plus-field is the
|
|
216
|
+
* whole of their need, so there is no trade being made.
|
|
217
|
+
*
|
|
218
|
+
* A binding that declares no {@link NoydbVia.coveredFields} is omitted
|
|
219
|
+
* rather than reported as covering nothing — absence of a declaration is not
|
|
220
|
+
* evidence of absence of coverage.
|
|
221
|
+
*/
|
|
222
|
+
fieldCoverage() {
|
|
223
|
+
const byField = /* @__PURE__ */ new Map();
|
|
224
|
+
for (const b of this.bindings) {
|
|
225
|
+
if (b.coveredFields === void 0) continue;
|
|
226
|
+
for (const f of b.coveredFields) {
|
|
227
|
+
let brands = byField.get(f);
|
|
228
|
+
if (!brands) {
|
|
229
|
+
brands = /* @__PURE__ */ new Set();
|
|
230
|
+
byField.set(f, brands);
|
|
231
|
+
}
|
|
232
|
+
brands.add(b.brand);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const out = {};
|
|
236
|
+
for (const f of [...byField.keys()].sort()) out[f] = [...byField.get(f)].sort();
|
|
237
|
+
return out;
|
|
238
|
+
}
|
|
239
|
+
buildClause(field, op, value) {
|
|
240
|
+
for (const b of this.bindings) {
|
|
241
|
+
const payload = b.buildClause?.(field, op, value);
|
|
242
|
+
if (payload !== void 0) return { brand: b.brand, payload };
|
|
243
|
+
}
|
|
244
|
+
return void 0;
|
|
245
|
+
}
|
|
246
|
+
evaluateClause(clause, actual, op) {
|
|
247
|
+
const b = this.bindings.find((x) => x.brand === clause.brand);
|
|
248
|
+
return b?.evaluateClause ? b.evaluateClause(actual, op, clause.payload) : false;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Resolve a `buildClause` payload to an index-probe operand (#625) —
|
|
252
|
+
* mirrors `evaluateClause`'s brand dispatch. `undefined` (a binding
|
|
253
|
+
* with no `indexProbe`, or one that declines to probe this op/payload)
|
|
254
|
+
* means the caller (`candidateRecords()`) must fall back to a scan.
|
|
255
|
+
*/
|
|
256
|
+
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
257
|
+
indexProbe(clause, op) {
|
|
258
|
+
const b = this.bindings.find((x) => x.brand === clause.brand);
|
|
259
|
+
return b?.indexProbe ? b.indexProbe(op, clause.payload) : void 0;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Resolve a raw STORED field value to its canonical eager-index bucket
|
|
263
|
+
* key (#672) — folds every binding's `canonicalizeIndexKey`, first
|
|
264
|
+
* non-undefined wins (same fold discipline as `buildClause`). `undefined`
|
|
265
|
+
* means no binding claims `field` (or the value can't be canonicalized)
|
|
266
|
+
* — the caller buckets the raw stringified value, unchanged from before
|
|
267
|
+
* this hook existed.
|
|
268
|
+
*/
|
|
269
|
+
canonicalizeIndexKey(field, rawValue) {
|
|
270
|
+
for (const b of this.bindings) {
|
|
271
|
+
const key = b.canonicalizeIndexKey?.(field, rawValue);
|
|
272
|
+
if (key !== void 0) return key;
|
|
273
|
+
}
|
|
274
|
+
return void 0;
|
|
275
|
+
}
|
|
276
|
+
decodeResults(record) {
|
|
277
|
+
let r = record;
|
|
278
|
+
for (const b of this.bindings) if (b.decodeResults) r = b.decodeResults(r);
|
|
279
|
+
return r;
|
|
280
|
+
}
|
|
281
|
+
/** undefined = no binding covers the field → caller falls back to generic compare. */
|
|
282
|
+
compareForOrder(field, a, b) {
|
|
283
|
+
for (const bind of this.bindings) {
|
|
284
|
+
const c = bind.compareForOrder?.(field, a, b);
|
|
285
|
+
if (c !== void 0) return c;
|
|
286
|
+
}
|
|
287
|
+
return void 0;
|
|
288
|
+
}
|
|
289
|
+
/** undefined = no binding resolves an order-sort label for `key` at `field`/`locale` (#650 Task 7 —
|
|
290
|
+
* the `orderBy(..., {by:'label'})` per-call-locale channel `compareForOrder` above can't serve). */
|
|
291
|
+
resolveOrderLabel(field, key, locale) {
|
|
292
|
+
for (const bind of this.bindings) {
|
|
293
|
+
const label = bind.resolveOrderLabel?.(field, key, locale);
|
|
294
|
+
if (label !== void 0) return label;
|
|
295
|
+
}
|
|
296
|
+
return void 0;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Which posture governs `field`, if any binding covers it — `undefined`
|
|
300
|
+
* means no binding declares `field` (the generic, non-via query path
|
|
301
|
+
* applies). #629 Task 8's posture consumer: `.where()`/`.orderBy()`
|
|
302
|
+
* consult this before building/evaluating a clause, refusing fields whose
|
|
303
|
+
* posture is `queryable: 'none'` (e.g. blob); every other posture
|
|
304
|
+
* ('det-exact'/'ordered'/'full') is left to the existing per-binding
|
|
305
|
+
* buildClause/evaluateClause/compareForOrder machinery, unchanged.
|
|
306
|
+
*
|
|
307
|
+
* #638 Task 3: the graph-computed taint overlay is consulted FIRST — a
|
|
308
|
+
* derived field's assigned (most-restrictive-of-sources) posture wins over
|
|
309
|
+
* whatever a binding would otherwise report for that field name (no
|
|
310
|
+
* binding covers a computed/derived field today, so this never actually
|
|
311
|
+
* shadows one — see `via/taint-binding.ts`'s `taintBinding.covers`, which
|
|
312
|
+
* only claims the sealed subset for `encodeAtRest`/`decodeAtRest`, not for
|
|
313
|
+
* this lookup).
|
|
314
|
+
*/
|
|
315
|
+
postureFor(field) {
|
|
316
|
+
const t = this.taint?.postures.get(field);
|
|
317
|
+
if (t) return t;
|
|
318
|
+
for (const b of this.bindings) {
|
|
319
|
+
if (b.covers?.(field)) return b.posture;
|
|
320
|
+
}
|
|
321
|
+
return this.taint?.defaultPosture;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Refuse any field-based reducer over a `queryable: 'none'` field (blob) —
|
|
325
|
+
* metadata-only: walks each reducer's `.field` and checks posture, no
|
|
326
|
+
* rewriting. Reducers with no `.field` (e.g. `count()`) are skipped.
|
|
327
|
+
*
|
|
328
|
+
* Shared by `wrapReducers` below (which ALSO applies each binding's
|
|
329
|
+
* rewrite, e.g. money's exact-BigInt reducer swap) and by
|
|
330
|
+
* `ScanBuilder.aggregate()` (#629 Task 8 review fix wave 1), which must
|
|
331
|
+
* call THIS, not `wrapReducers` — wiring full `wrapReducers` into
|
|
332
|
+
* `ScanBuilder.aggregate()` would newly activate money/i18n reducer
|
|
333
|
+
* wrapping on a path that has never run it, a parity-breaking behavior
|
|
334
|
+
* change for existing brands.
|
|
335
|
+
*/
|
|
336
|
+
refuseUnqueryableReducers(spec) {
|
|
337
|
+
for (const reducer of Object.values(spec)) {
|
|
338
|
+
const field = reducer?.field;
|
|
339
|
+
if (field !== void 0 && this.postureFor(field)?.queryable === "none") {
|
|
340
|
+
throw new FieldNotQueryableError(field);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Rewrite an aggregate spec (money exact reducers), then refuse any
|
|
346
|
+
* field-based reducer over a `queryable: 'none'` field (blob) — the same
|
|
347
|
+
* posture gate `.where()`/`.orderBy()` apply, extended to `.aggregate()`
|
|
348
|
+
* (both the bare-spec and builder forms funnel through here).
|
|
349
|
+
*/
|
|
350
|
+
wrapReducers(spec) {
|
|
351
|
+
this.refuseUnqueryableReducers(spec);
|
|
352
|
+
let s = spec;
|
|
353
|
+
for (const b of this.bindings) if (b.wrapReducers) s = b.wrapReducers(s);
|
|
354
|
+
return s;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Deliberate export-layer redaction (#629 Task 9's posture consumer):
|
|
358
|
+
* for every OWN field the decoded record carries, if the covering
|
|
359
|
+
* binding's posture declares `exportable: false` (classified today;
|
|
360
|
+
* money/i18n/blob are all `true`), replace the value with
|
|
361
|
+
* {@link EXPORT_REDACTION_MARKER} — the same `'[sealed]'` string
|
|
362
|
+
* `SealedHandle.toJSON()` (`kernel/types.ts`) already emits, so this is
|
|
363
|
+
* byte-parity with today's accidental redaction, now independent of the
|
|
364
|
+
* field's runtime shape. `SealedHandle.toJSON()` stays untouched as
|
|
365
|
+
* defense-in-depth: a record read via `collection.get()` and
|
|
366
|
+
* JSON.stringify'd outside `exportStream()` still gets the accident's
|
|
367
|
+
* redaction on its own. Never mutates the input; returns a new object
|
|
368
|
+
* only when a field was actually redacted.
|
|
369
|
+
*/
|
|
370
|
+
redactForExport(record) {
|
|
371
|
+
let out;
|
|
372
|
+
for (const field of Object.keys(record)) {
|
|
373
|
+
if (this.postureFor(field)?.exportable === false) {
|
|
374
|
+
out ??= { ...record };
|
|
375
|
+
out[field] = EXPORT_REDACTION_MARKER;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return out ?? record;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Shared fold over a subset of `this.bindings`: runs each binding's
|
|
382
|
+
* `erase`, concatenating shredded/retainedShared counts and residue.
|
|
383
|
+
* Consults `posture.forgettable` (#629 Task 10) — a binding declaring
|
|
384
|
+
* `forgettable: false` is skipped even if it defines `erase` (none does
|
|
385
|
+
* today; a future non-forgettable binding is supported without a brand check).
|
|
386
|
+
*/
|
|
387
|
+
async foldErase(ctx, bindings) {
|
|
388
|
+
let shredded = 0;
|
|
389
|
+
let retainedShared = 0;
|
|
390
|
+
const residue = [];
|
|
391
|
+
for (const b of bindings) {
|
|
392
|
+
if (!b.erase || b.posture.forgettable === false) continue;
|
|
393
|
+
const report = await b.erase(ctx);
|
|
394
|
+
shredded += report.shredded;
|
|
395
|
+
retainedShared += report.retainedShared ?? 0;
|
|
396
|
+
residue.push(...report.residue);
|
|
397
|
+
}
|
|
398
|
+
return retainedShared > 0 ? { shredded, residue, retainedShared } : { shredded, residue };
|
|
399
|
+
}
|
|
400
|
+
/** `forget()`'s per-ref erasure door: folds every binding's `erase`. */
|
|
401
|
+
async erase(ctx) {
|
|
402
|
+
return this.foldErase(ctx, this.bindings);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* `forget()`'s SEALED-posture-only erase fold (#629 Task 10, `Collection._onViaErase`'s
|
|
406
|
+
* one caller) — classified today; metadata-filtered on
|
|
407
|
+
* `posture.encryptedAtRest`, not brand-checked. `undefined` when no
|
|
408
|
+
* sealed-posture binding is compiled in — `vault.ts` then falls back to
|
|
409
|
+
* its own bare-`sensitive` classification, which no via binding covers.
|
|
410
|
+
*/
|
|
411
|
+
async eraseSealed(ctx) {
|
|
412
|
+
const sealed = this.bindings.filter((b) => b.posture.encryptedAtRest === "sealed");
|
|
413
|
+
return sealed.length === 0 ? void 0 : this.foldErase(ctx, sealed);
|
|
414
|
+
}
|
|
415
|
+
/** True iff any binding implements decodeResults (query fast-path gating). */
|
|
416
|
+
get hasResultDecode() {
|
|
417
|
+
return this.bindings.some((b) => b.decodeResults !== void 0);
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* True iff any binding declares an at-rest hook (`encodeAtRest`/
|
|
421
|
+
* `decodeAtRest`) — the codec boundary's async-stack gate (#629 Task 3
|
|
422
|
+
* consults this to choose between the hook path and today's inline
|
|
423
|
+
* sealed-slot path; a stack with only sync hooks, e.g. money-only, stays
|
|
424
|
+
* `false`).
|
|
425
|
+
*/
|
|
426
|
+
get hasAtRestHooks() {
|
|
427
|
+
return this.bindings.some((b) => b.encodeAtRest !== void 0 || b.decodeAtRest !== void 0);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Fold every binding's `describeFragment()` into one `brand -> fragment`
|
|
431
|
+
* map (#650 Task 7 — the first-ever consumer; `describeFragment` was
|
|
432
|
+
* declared at `via/index.ts:136` since #623 with zero callers until this task).
|
|
433
|
+
* `undefined` when no compiled binding implements it. Consumed by
|
|
434
|
+
* `Collection.describe()`/`describeAsync()`, threaded to `buildDescription`
|
|
435
|
+
* as `BuildDescriptionInput.viaFragments`.
|
|
436
|
+
*/
|
|
437
|
+
describeFragments() {
|
|
438
|
+
let out;
|
|
439
|
+
for (const b of this.bindings) {
|
|
440
|
+
const f = b.describeFragment?.();
|
|
441
|
+
if (f !== void 0) {
|
|
442
|
+
out ??= {};
|
|
443
|
+
out[b.brand] = f;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return out;
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
var EXPORT_REDACTION_MARKER = "[sealed]";
|
|
450
|
+
function exportRedact(coll, record) {
|
|
451
|
+
if (record === null || typeof record !== "object") return record;
|
|
452
|
+
const via = coll._via;
|
|
453
|
+
return via ? via.redactForExport(record) : record;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export {
|
|
457
|
+
ViaPipeline,
|
|
458
|
+
EXPORT_REDACTION_MARKER,
|
|
459
|
+
exportRedact
|
|
460
|
+
};
|
|
461
|
+
//# sourceMappingURL=chunk-3EWS67C7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/kernel/via/pipeline.ts"],"sourcesContent":["import type { NoydbVia, ViaPosture, ViaWriteCtx, ViaReadCtx, ViaCryptoCtx, SealedSlotRef, ViaEraseCtx, ViaEraseReport } from './index.js'\nimport { ValidationError, FieldNotQueryableError } from '../errors.js'\n\n/** Opaque per-clause query payload carried on FieldClause (replaces the money-only slot). */\nexport interface ViaClause {\n readonly brand: string\n readonly payload: unknown\n}\n\n/**\n * The graph-computed taint overlay (#638 Task 3) — `postureFor`'s\n * assignment→enforcement bridge. `postures`/`sealFields` are the\n * enforcement-facing shapes `via/taint-binding.ts#buildTaintOverlay`\n * produces from `ViaGraph.taintedPostures`/`taintSealedFields`;\n * `provenance` (optional — introspection only, never consulted by\n * `postureFor`) is `ViaGraph.taintProvenance`'s output, surfaced by\n * `describe()`.\n */\nexport interface ViaTaintOverlay {\n readonly postures: ReadonlyMap<string, ViaPosture>\n readonly sealFields: ReadonlySet<string>\n readonly provenance?: ReadonlyMap<string, readonly string[]>\n /** #642 — the whole-record floor for a derivation/MV/overlay OUTPUT collection (the '*' target's\n * folded, clamped effective posture). postureFor falls back to it for ANY field; redactForExport\n * picks it up per-field; a sealed default drives taintBinding's sealAllFields mode. O(1) read. */\n readonly defaultPosture?: ViaPosture\n}\n\nexport class ViaPipeline {\n /**\n * Present-phase-ONLY order (#665, corrected under #665 review) — a stable\n * THREE-WAY partition of `bindings` computed once here at construction:\n * every `'money'`-brand binding first (existing relative order), then\n * every `'computed'`-brand binding (existing relative order), then\n * everything else (existing relative order). `present()` folds over this\n * instead of `bindings` so a `mode: 'virtual'` computed field's value\n * exists before i18n/lookup's dressing `present()` hooks run on it\n * (today's `compileVias` order is money→i18n→lookup→classified→\n * blob→computed, `collection-config.ts:554`, so dressing unconditionally\n * ran BEFORE the value it dresses existed). This reorder is binding-level,\n * not conditioned on any particular field composition — it applies to\n * EVERY collection that compiles a `'computed'` binding at all, not only\n * ones stacking a dresser on the SAME field as a computed one. EVERY other\n * phase (`ingest`/`encodeWrite`/`encodeAtRest`/`enforceWrite`/etc.) keeps\n * folding over `bindings` unchanged — those write/query phases need\n * money-first (`_applyMoneyFields` PREPENDS money, `_applyClassifiedFields`\n * APPENDS classified to preserve it, `kernel/collection.ts:1275-1284,1364-\n * 1368`).\n *\n * Money is deliberately carved OUT of the generic \"everything else\" slice\n * and kept FIRST — the original two-way `[computed..., rest...]` partition\n * regressed money's composed-field behavior from a benign missing-dressing\n * gap into VALUE CORRUPTION: money's `present()` DECODES its input as a\n * STORED SCALED-INT (and derives `<field>Formatted` from it) — it is not a\n * pure dressing CONSUMER like i18n/lookup, which only ADD a `<field>Label`\n * key and never rewrite the field's own value. Running money AFTER\n * computed on a field composing `computed(virtual)` + `money(...)` on\n * ITSELF means money's decode sees the virtual field's raw MAJOR-unit\n * output (e.g. `21`) and misreads it as a scaled-int, producing a\n * corrupted value (`'0.21'`) instead of the pre-#665 result (the raw `21`\n * surviving untouched, with no `Formatted` key added — a benign\n * missing-dressing gap, not a wrong value). Money-first restores money's\n * exact pre-#665 present position — byte-identical money behavior; the\n * materialized composition pins from the #631 work and the money suites\n * all ran under money-first. i18n/lookup are genuine dressing consumers\n * (they only ADD, never rewrite), so they stay after computed, which is\n * the fix #665 intended. A `'taint'` binding (appended LAST by\n * `via/graph-wiring.ts#applyTaintOverlay`) stays last here too (it's\n * neither money nor computed, so it lands at the tail of the \"everything\n * else\" slice), preserving its \"runs after computed, redacts tainted\n * virtual output\" contract (`via/taint-binding.ts`'s `taintBinding` doc\n * comment).\n *\n * Money-dressing a virtual computed field's OWN output (the composed\n * `computed(virtual) + money` case) is NOT resolved by this partition\n * alone — #669 resolves it with a separate mid-fold hook instead:\n * `NoydbVia.presentLate` runs after every binding's `present()` in this\n * money+computed segment, before the \"everything else\" segment below, so\n * money can quantize/reinterpret a virtual field's fresh MAJOR-UNITS\n * output as if it were a stored value, without perturbing this ordering\n * or the #665 invariant above it (`_presentLateBoundary` below marks\n * exactly where that mid-fold point sits within `_presentOrder`).\n */\n private readonly _presentOrder: readonly NoydbVia[]\n /** #669 — index into `_presentOrder` where the money+computed segment ends and the\n * \"everything else\" segment begins (`moneyVias.length + computedVias.length`);\n * `present()` runs every binding's `presentLate` at exactly this boundary. */\n private readonly _presentLateBoundary: number\n\n private constructor(readonly bindings: readonly NoydbVia[], readonly taint?: ViaTaintOverlay) {\n const moneyVias = bindings.filter((b) => b.brand === 'money')\n const computedVias = bindings.filter((b) => b.brand === 'computed')\n const restBindings = bindings.filter((b) => b.brand !== 'money' && b.brand !== 'computed')\n this._presentOrder = [...moneyVias, ...computedVias, ...restBindings]\n this._presentLateBoundary = moneyVias.length + computedVias.length\n }\n\n /** undefined when there is nothing to enforce — the zero-via fast path is\n * `this.via === undefined` (#553: keeps an all-plain collection sync). A\n * `'*'`-defaulted output collection (#642) counts as \"something to enforce\"\n * even with zero field-specific postures and zero bindings. */\n static build(bindings: readonly NoydbVia[], taint?: ViaTaintOverlay): ViaPipeline | undefined {\n if (bindings.length === 0 && (!taint || (taint.postures.size === 0 && taint.defaultPosture === undefined))) return undefined\n return new ViaPipeline(bindings, taint)\n }\n\n /** Refuse a write before crypto runs: awaits each binding's `enforceWrite` in order — first throw wins. */\n async enforceWrite(record: Record<string, unknown>, ctx: ViaWriteCtx): Promise<void> {\n for (const b of this.bindings) if (b.enforceWrite) await b.enforceWrite(record, ctx)\n }\n\n ingest(record: Record<string, unknown>): Record<string, unknown> {\n let r = record\n for (const b of this.bindings) if (b.ingest) r = b.ingest(r)\n return r\n }\n\n canonicalizeStored(record: Record<string, unknown>): Record<string, unknown> {\n let r = record\n for (const b of this.bindings) if (b.canonicalizeStored) r = b.canonicalizeStored(r)\n return r\n }\n\n async encodeWrite(record: Record<string, unknown>, ctx: ViaWriteCtx): Promise<Record<string, unknown>> {\n let r = record\n for (const b of this.bindings) if (b.encodeWrite) r = await b.encodeWrite(r, ctx)\n return r\n }\n\n /**\n * Final write-pipeline stage: folds each binding's `encodeAtRest` in\n * order, threading the record and accumulating the sealed-slot map. A\n * field belongs to exactly one via feature — two bindings sealing the\n * same field is a brand-keyed collision and throws.\n */\n async encodeAtRest(\n record: Record<string, unknown>,\n crypto: ViaCryptoCtx,\n ): Promise<{ record: Record<string, unknown>; sealed?: Record<string, SealedSlotRef> }> {\n let r = record\n let sealed: Record<string, SealedSlotRef> | undefined\n const sealedBy = new Map<string, string>()\n for (const b of this.bindings) {\n if (!b.encodeAtRest) continue\n const result = await b.encodeAtRest(r, crypto)\n r = result.record\n if (!result.sealed) continue\n for (const [field, ref] of Object.entries(result.sealed)) {\n const priorBrand = sealedBy.get(field)\n if (priorBrand !== undefined) {\n throw new ValidationError(\n `via encodeAtRest: field \"${field}\" sealed by binding \"${priorBrand}\" is also sealed by binding \"${b.brand}\"`,\n )\n }\n sealedBy.set(field, b.brand)\n sealed ??= {}\n sealed[field] = ref\n }\n }\n return sealed ? { record: r, sealed } : { record: r }\n }\n\n /** First read-pipeline stage: folds each binding's `decodeAtRest` in order. */\n async decodeAtRest(\n record: Record<string, unknown>,\n sealed: Record<string, SealedSlotRef>,\n crypto: ViaCryptoCtx,\n opts: { asHandles: boolean },\n ): Promise<Record<string, unknown>> {\n let r = record\n for (const b of this.bindings) if (b.decodeAtRest) r = await b.decodeAtRest(r, sealed, crypto, opts)\n return r\n }\n\n async present(record: Record<string, unknown>, ctx: ViaReadCtx): Promise<Record<string, unknown>> {\n let r = record\n for (let i = 0; i < this._presentLateBoundary; i++) {\n const b = this._presentOrder[i]!\n if (b.present) r = await b.present(r, ctx)\n }\n for (const b of this.bindings) if (b.presentLate) r = await b.presentLate(r, ctx)\n for (let i = this._presentLateBoundary; i < this._presentOrder.length; i++) {\n const b = this._presentOrder[i]!\n if (b.present) r = await b.present(r, ctx)\n }\n return r\n }\n\n /**\n * #1416 — the synchronous half of {@link present}, for the query path.\n *\n * `query().toArray()` is SYNCHRONOUS (#1413) and so cannot await `present`,\n * which is why it ran `decodeResults` instead — money's stored→canonical\n * decode and nothing else. The visible cost was that a\n * `computed({ mode:'virtual' })` field read `undefined` on a query row while\n * `get()` and `list()` returned it, so the same record had two shapes\n * depending on which read verb produced it, and a caller summing that field\n * over a query result got `NaN` with no error.\n *\n * This folds the SAME order as `present`, skipping any binding that has not\n * declared {@link ViaBinding.presentIsSync}. `money` and `computed` do, which\n * is the pair that carries values; `i18n` and `lookup` are genuinely async\n * and are reported in `skipped` rather than silently dropped — the caller can\n * then say so instead of leaving a hole.\n *\n * ⚠️ Ordering is preserved exactly, including the `presentLate` boundary,\n * because money's `presentLate` exists to react to computed's virtual output\n * (#669). Reordering here would corrupt a field that is both money and\n * virtual.\n */\n presentSync(\n record: Record<string, unknown>,\n ctx: ViaReadCtx,\n ): { record: Record<string, unknown>; skipped: readonly string[] } {\n let r = record\n const skipped: string[] = []\n const note = (b: NoydbVia): void => { if (!skipped.includes(b.brand)) skipped.push(b.brand) }\n const runnable = (b: NoydbVia): boolean => {\n if (b.presentIsSync === true) return true\n if (b.present || b.presentLate) note(b)\n return false\n }\n for (let i = 0; i < this._presentLateBoundary; i++) {\n const b = this._presentOrder[i]!\n if (b.present && runnable(b)) r = b.present(r, ctx) as Record<string, unknown>\n }\n for (const b of this.bindings) {\n if (b.presentLate && runnable(b)) r = b.presentLate(r, ctx) as Record<string, unknown>\n }\n for (let i = this._presentLateBoundary; i < this._presentOrder.length; i++) {\n const b = this._presentOrder[i]!\n if (b.present && runnable(b)) r = b.present(r, ctx) as Record<string, unknown>\n }\n return { record: r, skipped }\n }\n\n /** True iff some binding's presentation can only run on the async path (#1416). */\n get hasAsyncPresent(): boolean {\n return this.bindings.some((b) => (b.present !== undefined || b.presentLate !== undefined) && b.presentIsSync !== true)\n }\n\n /**\n * #1447 — which bindings cover which fields, for `dumpSchema()`.\n *\n * Field name → the brands covering it, sorted. A field can appear under more\n * than one brand: a money field that is also `computed({ mode:'virtual' })`\n * is covered by both, and collapsing that to one would misreport what the\n * datastore does to it.\n *\n * ⛔ BRAND AND FIELD ONLY — never a binding's configuration, and the reason\n * is not payload size. A schema dump travels further than a vault does, and\n * a report saying \"this field is classified, sensitivity pii\" is a map of\n * which columns are worth attacking, in an artefact that by design leaves\n * the vault. The consumer who asked for this said brand-plus-field is the\n * whole of their need, so there is no trade being made.\n *\n * A binding that declares no {@link NoydbVia.coveredFields} is omitted\n * rather than reported as covering nothing — absence of a declaration is not\n * evidence of absence of coverage.\n */\n fieldCoverage(): Record<string, readonly string[]> {\n const byField = new Map<string, Set<string>>()\n for (const b of this.bindings) {\n if (b.coveredFields === undefined) continue\n for (const f of b.coveredFields) {\n let brands = byField.get(f)\n if (!brands) { brands = new Set(); byField.set(f, brands) }\n brands.add(b.brand)\n }\n }\n const out: Record<string, readonly string[]> = {}\n for (const f of [...byField.keys()].sort()) out[f] = [...byField.get(f)!].sort()\n return out\n }\n\n buildClause(field: string, op: string, value: unknown): ViaClause | undefined {\n for (const b of this.bindings) {\n const payload = b.buildClause?.(field, op, value)\n if (payload !== undefined) return { brand: b.brand, payload }\n }\n return undefined\n }\n\n evaluateClause(clause: ViaClause, actual: unknown, op: string): boolean {\n const b = this.bindings.find((x) => x.brand === clause.brand)\n // buildClause and evaluateClause are produced/consumed by the same binding by construction.\n return b?.evaluateClause ? b.evaluateClause(actual, op, clause.payload) : false\n }\n\n /**\n * Resolve a `buildClause` payload to an index-probe operand (#625) —\n * mirrors `evaluateClause`'s brand dispatch. `undefined` (a binding\n * with no `indexProbe`, or one that declines to probe this op/payload)\n * means the caller (`candidateRecords()`) must fall back to a scan.\n */\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n indexProbe(clause: ViaClause, op: string): unknown | undefined {\n const b = this.bindings.find((x) => x.brand === clause.brand)\n return b?.indexProbe ? b.indexProbe(op, clause.payload) : undefined\n }\n\n /**\n * Resolve a raw STORED field value to its canonical eager-index bucket\n * key (#672) — folds every binding's `canonicalizeIndexKey`, first\n * non-undefined wins (same fold discipline as `buildClause`). `undefined`\n * means no binding claims `field` (or the value can't be canonicalized)\n * — the caller buckets the raw stringified value, unchanged from before\n * this hook existed.\n */\n canonicalizeIndexKey(field: string, rawValue: unknown): string | undefined {\n for (const b of this.bindings) {\n const key = b.canonicalizeIndexKey?.(field, rawValue)\n if (key !== undefined) return key\n }\n return undefined\n }\n\n decodeResults(record: unknown): unknown {\n let r = record\n for (const b of this.bindings) if (b.decodeResults) r = b.decodeResults(r)\n return r\n }\n\n /** undefined = no binding covers the field → caller falls back to generic compare. */\n compareForOrder(field: string, a: unknown, b: unknown): number | undefined {\n for (const bind of this.bindings) {\n const c = bind.compareForOrder?.(field, a, b)\n if (c !== undefined) return c\n }\n return undefined\n }\n\n /** undefined = no binding resolves an order-sort label for `key` at `field`/`locale` (#650 Task 7 —\n * the `orderBy(..., {by:'label'})` per-call-locale channel `compareForOrder` above can't serve). */\n resolveOrderLabel(field: string, key: string, locale: string | undefined): string | undefined {\n for (const bind of this.bindings) {\n const label = bind.resolveOrderLabel?.(field, key, locale)\n if (label !== undefined) return label\n }\n return undefined\n }\n\n /**\n * Which posture governs `field`, if any binding covers it — `undefined`\n * means no binding declares `field` (the generic, non-via query path\n * applies). #629 Task 8's posture consumer: `.where()`/`.orderBy()`\n * consult this before building/evaluating a clause, refusing fields whose\n * posture is `queryable: 'none'` (e.g. blob); every other posture\n * ('det-exact'/'ordered'/'full') is left to the existing per-binding\n * buildClause/evaluateClause/compareForOrder machinery, unchanged.\n *\n * #638 Task 3: the graph-computed taint overlay is consulted FIRST — a\n * derived field's assigned (most-restrictive-of-sources) posture wins over\n * whatever a binding would otherwise report for that field name (no\n * binding covers a computed/derived field today, so this never actually\n * shadows one — see `via/taint-binding.ts`'s `taintBinding.covers`, which\n * only claims the sealed subset for `encodeAtRest`/`decodeAtRest`, not for\n * this lookup).\n */\n postureFor(field: string): ViaPosture | undefined {\n const t = this.taint?.postures.get(field)\n if (t) return t\n for (const b of this.bindings) {\n if (b.covers?.(field)) return b.posture\n }\n // #642 — a '*'-defaulted output collection's whole-record floor: O(1) read,\n // no fold (the fold ran once at applyTaintOverlay/reapply time).\n return this.taint?.defaultPosture\n }\n\n /**\n * Refuse any field-based reducer over a `queryable: 'none'` field (blob) —\n * metadata-only: walks each reducer's `.field` and checks posture, no\n * rewriting. Reducers with no `.field` (e.g. `count()`) are skipped.\n *\n * Shared by `wrapReducers` below (which ALSO applies each binding's\n * rewrite, e.g. money's exact-BigInt reducer swap) and by\n * `ScanBuilder.aggregate()` (#629 Task 8 review fix wave 1), which must\n * call THIS, not `wrapReducers` — wiring full `wrapReducers` into\n * `ScanBuilder.aggregate()` would newly activate money/i18n reducer\n * wrapping on a path that has never run it, a parity-breaking behavior\n * change for existing brands.\n */\n refuseUnqueryableReducers<S>(spec: S): void {\n for (const reducer of Object.values(spec as unknown as Record<string, { readonly field?: string }>)) {\n const field = reducer?.field\n if (field !== undefined && this.postureFor(field)?.queryable === 'none') {\n throw new FieldNotQueryableError(field)\n }\n }\n }\n\n /**\n * Rewrite an aggregate spec (money exact reducers), then refuse any\n * field-based reducer over a `queryable: 'none'` field (blob) — the same\n * posture gate `.where()`/`.orderBy()` apply, extended to `.aggregate()`\n * (both the bare-spec and builder forms funnel through here).\n */\n wrapReducers<S>(spec: S): S {\n this.refuseUnqueryableReducers(spec)\n let s: unknown = spec\n for (const b of this.bindings) if (b.wrapReducers) s = b.wrapReducers(s)\n return s as S\n }\n\n /**\n * Deliberate export-layer redaction (#629 Task 9's posture consumer):\n * for every OWN field the decoded record carries, if the covering\n * binding's posture declares `exportable: false` (classified today;\n * money/i18n/blob are all `true`), replace the value with\n * {@link EXPORT_REDACTION_MARKER} — the same `'[sealed]'` string\n * `SealedHandle.toJSON()` (`kernel/types.ts`) already emits, so this is\n * byte-parity with today's accidental redaction, now independent of the\n * field's runtime shape. `SealedHandle.toJSON()` stays untouched as\n * defense-in-depth: a record read via `collection.get()` and\n * JSON.stringify'd outside `exportStream()` still gets the accident's\n * redaction on its own. Never mutates the input; returns a new object\n * only when a field was actually redacted.\n */\n redactForExport(record: Record<string, unknown>): Record<string, unknown> {\n let out: Record<string, unknown> | undefined\n for (const field of Object.keys(record)) {\n if (this.postureFor(field)?.exportable === false) {\n out ??= { ...record }\n out[field] = EXPORT_REDACTION_MARKER\n }\n }\n return out ?? record\n }\n\n /**\n * Shared fold over a subset of `this.bindings`: runs each binding's\n * `erase`, concatenating shredded/retainedShared counts and residue.\n * Consults `posture.forgettable` (#629 Task 10) — a binding declaring\n * `forgettable: false` is skipped even if it defines `erase` (none does\n * today; a future non-forgettable binding is supported without a brand check).\n */\n private async foldErase(ctx: ViaEraseCtx, bindings: readonly NoydbVia[]): Promise<ViaEraseReport> {\n let shredded = 0\n let retainedShared = 0\n const residue: unknown[] = []\n for (const b of bindings) {\n if (!b.erase || b.posture.forgettable === false) continue\n const report = await b.erase(ctx)\n shredded += report.shredded\n retainedShared += report.retainedShared ?? 0\n residue.push(...report.residue)\n }\n return retainedShared > 0 ? { shredded, residue, retainedShared } : { shredded, residue }\n }\n\n /** `forget()`'s per-ref erasure door: folds every binding's `erase`. */\n async erase(ctx: ViaEraseCtx): Promise<ViaEraseReport> {\n return this.foldErase(ctx, this.bindings)\n }\n\n /**\n * `forget()`'s SEALED-posture-only erase fold (#629 Task 10, `Collection._onViaErase`'s\n * one caller) — classified today; metadata-filtered on\n * `posture.encryptedAtRest`, not brand-checked. `undefined` when no\n * sealed-posture binding is compiled in — `vault.ts` then falls back to\n * its own bare-`sensitive` classification, which no via binding covers.\n */\n async eraseSealed(ctx: ViaEraseCtx): Promise<ViaEraseReport | undefined> {\n const sealed = this.bindings.filter((b) => b.posture.encryptedAtRest === 'sealed')\n return sealed.length === 0 ? undefined : this.foldErase(ctx, sealed)\n }\n\n /** True iff any binding implements decodeResults (query fast-path gating). */\n get hasResultDecode(): boolean {\n return this.bindings.some((b) => b.decodeResults !== undefined)\n }\n\n /**\n * True iff any binding declares an at-rest hook (`encodeAtRest`/\n * `decodeAtRest`) — the codec boundary's async-stack gate (#629 Task 3\n * consults this to choose between the hook path and today's inline\n * sealed-slot path; a stack with only sync hooks, e.g. money-only, stays\n * `false`).\n */\n get hasAtRestHooks(): boolean {\n return this.bindings.some((b) => b.encodeAtRest !== undefined || b.decodeAtRest !== undefined)\n }\n\n /**\n * Fold every binding's `describeFragment()` into one `brand -> fragment`\n * map (#650 Task 7 — the first-ever consumer; `describeFragment` was\n * declared at `via/index.ts:136` since #623 with zero callers until this task).\n * `undefined` when no compiled binding implements it. Consumed by\n * `Collection.describe()`/`describeAsync()`, threaded to `buildDescription`\n * as `BuildDescriptionInput.viaFragments`.\n */\n describeFragments(): Record<string, Record<string, unknown>> | undefined {\n let out: Record<string, Record<string, unknown>> | undefined\n for (const b of this.bindings) {\n const f = b.describeFragment?.()\n if (f !== undefined) { out ??= {}; out[b.brand] = f }\n }\n return out\n }\n}\n\n/**\n * The marker `redactForExport` writes for a non-exportable field —\n * intentionally the same literal `SealedHandle.toJSON()` (`kernel/types.ts`)\n * returns, so the two independent redaction layers (deliberate + accident)\n * produce byte-identical export output. Duplicated, not imported, because\n * `SealedHandle.toJSON()` is untouched by #629 Task 9 (belt-and-braces —\n * `via/export-posture-b.test.ts` asserts both layers agree on this string).\n */\nexport const EXPORT_REDACTION_MARKER = '[sealed]'\n\n/**\n * Structural shape `exportRedact` needs from a collection: just the typed\n * `_via` accessor `Collection` exposes (`kernel/collection.ts`, #634). A\n * named interface rather than the real `Collection` type, because\n * `collection.ts` imports `ViaPipeline` from this module — importing\n * `Collection` back here would be circular.\n */\ninterface HasViaPipeline {\n readonly _via: ViaPipeline | undefined\n}\n\n/**\n * Widened sibling of {@link HasViaPipeline}: `via/graph-wiring.ts`'s\n * `applyTaintOverlay` (#666) needs to REASSIGN the live pipeline, not just\n * read it — `_setVia` is `Collection`'s typed writer seam (`kernel/\n * collection.ts`, beside `_via`), replacing the earlier untyped `coll as {\n * via; codec: { setVia } }` cast. Exported (unlike `HasViaPipeline`) because\n * its one consumer lives in a different module.\n */\nexport interface HasWritableViaPipeline extends HasViaPipeline {\n _setVia(pipeline: ViaPipeline | undefined): void\n}\n\n/**\n * `vault.ts`'s `exportStream()` reach-in (#629 Task 9): apply the owning\n * collection's export redaction to one decoded record. Typed via {@link\n * HasViaPipeline} against `Collection`'s `_via` accessor (#634) — replaces\n * the earlier untyped any-cast reach-in.\n */\nexport function exportRedact(coll: HasViaPipeline, record: unknown): unknown {\n if (record === null || typeof record !== 'object') return record\n const via = coll._via\n return via ? via.redactForExport(record as Record<string, unknown>) : record\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildRecordAad,
|
|
3
|
+
buildRecordEnvelope,
|
|
4
|
+
encrypt,
|
|
3
5
|
openEnvelopeJson
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import {
|
|
6
|
-
buildRecordEnvelope
|
|
7
|
-
} from "./chunk-SZJ3DLZA.js";
|
|
8
|
-
import {
|
|
9
|
-
encrypt
|
|
10
|
-
} from "./chunk-HPVZCW43.js";
|
|
6
|
+
} from "./chunk-EZGV6F47.js";
|
|
11
7
|
|
|
12
8
|
// src/with-shape/persisted-schemas/storage.ts
|
|
13
9
|
var SCHEMAS_COLLECTION = "_schemas";
|
|
@@ -45,4 +41,4 @@ export {
|
|
|
45
41
|
loadPersistedSchema,
|
|
46
42
|
savePersistedSchema
|
|
47
43
|
};
|
|
48
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-3L2NBKDR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/with-shape/persisted-schemas/storage.ts"],"sourcesContent":["/**\n * Read / write the per-collection persisted-schema envelope. Mirrors the\n * standard noy-db record envelope shape and is **AES-GCM encrypted with\n * the collection's DEK** — the schema body (field names, enum values,\n * constraints) is sensitive metadata, so it gets the same encryption\n * envelope as the records it describes.\n *\n * Storage layout:\n *\n * <vault>/_schemas/<collection> → EncryptedEnvelope\n *\n * The DEK passed to {@link savePersistedSchema} / {@link loadPersistedSchema}\n * is the same key the collection uses for its records.\n *\n * @module\n */\n\nimport { buildRecordAad, buildRecordEnvelope, encrypt, openEnvelopeJson, type EnclaveKey } from '../../capsule/index.js'\nimport type { NoydbStore } from '../../kernel/types.js'\nimport type { PersistedSchemaEnvelope } from './types.js'\n\n/** Reserved collection name where persisted schemas live. */\nexport const SCHEMAS_COLLECTION = '_schemas' as const\n\n/**\n * A decrypted persisted-schema read paired with the wrapping envelope's\n * `_v`. The version is the optimistic-concurrency token: pass it back to\n * {@link savePersistedSchema} as `expectedVersion` to make the write a CAS\n * that rejects a stale put (see #583 — the `_schemas` record is shared by\n * the JSON-Schema writer and the classified-marker writer).\n */\nexport interface PersistedSchemaEntry {\n /** Wrapping envelope `_v` (0 when no record exists yet). */\n readonly version: number\n /** Decrypted payload, or `undefined` when absent/corrupt/wrong-DEK. */\n readonly payload: PersistedSchemaEnvelope | undefined\n}\n\n/**\n * Read the persisted-schema envelope for one collection together with its\n * wrapping `_v`. The version reflects the raw stored envelope even when the\n * payload cannot be decrypted/parsed (so a CAS still guards a corrupt record\n * rather than silently clobbering it).\n */\nexport async function loadPersistedSchemaEntry(\n store: NoydbStore,\n vault: string,\n collection: string,\n dek: EnclaveKey,\n): Promise<PersistedSchemaEntry> {\n const envelope = await store.get(vault, SCHEMAS_COLLECTION, collection)\n if (!envelope) return { version: 0, payload: undefined }\n const version = envelope._v\n try {\n const plaintext = await openEnvelopeJson({ collection: SCHEMAS_COLLECTION, id: collection }, envelope, dek)\n const parsed = JSON.parse(plaintext) as PersistedSchemaEnvelope\n if (parsed._noydb_schema !== 1) return { version, payload: undefined }\n return { version, payload: parsed }\n } catch {\n return { version, payload: undefined }\n }\n}\n\n/**\n * Read and decrypt the persisted-schema envelope for one collection.\n * Returns `undefined` when no envelope has been written or when decryption\n * fails (e.g. wrong DEK passed). Tolerates corrupted records — JSON parse\n * failures surface as `undefined`, mirroring `_meta/handle`'s contract.\n */\nexport async function loadPersistedSchema(\n store: NoydbStore,\n vault: string,\n collection: string,\n dek: EnclaveKey,\n): Promise<PersistedSchemaEnvelope | undefined> {\n return (await loadPersistedSchemaEntry(store, vault, collection, dek)).payload\n}\n\n/**\n * Encrypt and persist a schema envelope for one collection. Always\n * overwrites any prior write (callers gate on hash equality before calling\n * to avoid no-op writes).\n *\n * Pass `expectedVersion` — the `version` from {@link loadPersistedSchemaEntry}\n * captured at load time — to make the write an optimistic CAS: on a store with\n * `casAtomic`, `store.put` throws {@link ConflictError} when the record was\n * bumped concurrently, so a lost update on the shared `_schemas` record is\n * rejected instead of silently clobbering the other writer's field (#583).\n * When omitted, keeps the legacy unconditional last-writer-wins behaviour.\n */\nexport async function savePersistedSchema(\n store: NoydbStore,\n vault: string,\n collection: string,\n dek: EnclaveKey,\n payload: PersistedSchemaEnvelope,\n expectedVersion?: number,\n): Promise<void> {\n const json = JSON.stringify(payload)\n const baseVersion = expectedVersion ?? (await store.get(vault, SCHEMAS_COLLECTION, collection))?._v ?? 0\n const identity = { collection: SCHEMAS_COLLECTION, id: collection, version: baseVersion + 1 }\n const { iv, data } = await encrypt(json, dek, buildRecordAad(identity))\n const env = buildRecordEnvelope(\n identity,\n { iv, data },\n )\n await store.put(vault, SCHEMAS_COLLECTION, collection, env, expectedVersion)\n}\n"],"mappings":";;;;;;;;AAsBO,IAAM,qBAAqB;AAsBlC,eAAsB,yBACpB,OACA,OACA,YACA,KAC+B;AAC/B,QAAM,WAAW,MAAM,MAAM,IAAI,OAAO,oBAAoB,UAAU;AACtE,MAAI,CAAC,SAAU,QAAO,EAAE,SAAS,GAAG,SAAS,OAAU;AACvD,QAAM,UAAU,SAAS;AACzB,MAAI;AACF,UAAM,YAAY,MAAM,iBAAiB,EAAE,YAAY,oBAAoB,IAAI,WAAW,GAAG,UAAU,GAAG;AAC1G,UAAM,SAAS,KAAK,MAAM,SAAS;AACnC,QAAI,OAAO,kBAAkB,EAAG,QAAO,EAAE,SAAS,SAAS,OAAU;AACrE,WAAO,EAAE,SAAS,SAAS,OAAO;AAAA,EACpC,QAAQ;AACN,WAAO,EAAE,SAAS,SAAS,OAAU;AAAA,EACvC;AACF;AAQA,eAAsB,oBACpB,OACA,OACA,YACA,KAC8C;AAC9C,UAAQ,MAAM,yBAAyB,OAAO,OAAO,YAAY,GAAG,GAAG;AACzE;AAcA,eAAsB,oBACpB,OACA,OACA,YACA,KACA,SACA,iBACe;AACf,QAAM,OAAO,KAAK,UAAU,OAAO;AACnC,QAAM,cAAc,oBAAoB,MAAM,MAAM,IAAI,OAAO,oBAAoB,UAAU,IAAI,MAAM;AACvG,QAAM,WAAW,EAAE,YAAY,oBAAoB,IAAI,YAAY,SAAS,cAAc,EAAE;AAC5F,QAAM,EAAE,IAAI,KAAK,IAAI,MAAM,QAAQ,MAAM,KAAK,eAAe,QAAQ,CAAC;AACtE,QAAM,MAAM;AAAA,IACV;AAAA,IACA,EAAE,IAAI,KAAK;AAAA,EACb;AACA,QAAM,MAAM,IAAI,OAAO,oBAAoB,YAAY,KAAK,eAAe;AAC7E;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/with-lookup/reduce/strategy.ts
|
|
2
2
|
var NOT_ENABLED = new Error(
|
|
3
|
-
'Aggregate / groupBy is not enabled on this Noydb instance. Import `{ withReduce }` from "@noy-db/hub/reduce" and pass it to `createNoydb({ reduceStrategy: withReduce() })`.'
|
|
3
|
+
'Aggregate / groupBy / window is not enabled on this Noydb instance. Import `{ withReduce }` from "@noy-db/hub/reduce" and pass it to `createNoydb({ reduceStrategy: withReduce() })`.'
|
|
4
4
|
);
|
|
5
5
|
var NO_REDUCE = {
|
|
6
6
|
aggregate() {
|
|
@@ -12,6 +12,9 @@ var NO_REDUCE = {
|
|
|
12
12
|
groupByN() {
|
|
13
13
|
throw NOT_ENABLED;
|
|
14
14
|
},
|
|
15
|
+
window() {
|
|
16
|
+
throw NOT_ENABLED;
|
|
17
|
+
},
|
|
15
18
|
scanAggregate() {
|
|
16
19
|
throw NOT_ENABLED;
|
|
17
20
|
}
|
|
@@ -20,4 +23,4 @@ var NO_REDUCE = {
|
|
|
20
23
|
export {
|
|
21
24
|
NO_REDUCE
|
|
22
25
|
};
|
|
23
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
//# sourceMappingURL=chunk-3TDUWVWB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/with-lookup/reduce/strategy.ts"],"sourcesContent":["/**\n * Strategy seam between the core Query / ScanBuilder chain and the\n * optional aggregate / groupBy service. Core imports\n * `ReduceStrategy` as a TYPE-ONLY symbol and `NO_REDUCE` as a\n * tiny runtime stub.\n *\n * The heavy machinery — `Reduction`, `GroupedQuery`, the\n * reducer-step logic — is only reachable from `withReduce()` in\n * `./active.ts`, which is only exported through the\n * `@noy-db/hub/reduce` subpath. Consumers that don't import the\n * subpath ship none of the ~886 LOC.\n *\n * @internal\n */\n\nimport type {\n Reduction,\n ReduceSpec,\n ReduceResult,\n ReductionUpstream,\n} from './reduction.js'\nimport type { GroupedQuery, GroupedQueryN } from './groupby.js'\nimport type { GroupMaintenanceSource } from '../../kernel/query/live/incremental.js'\nimport type { WindowFactory, WindowSpec, WindowedQuery } from './window.js'\n/**\n * Re-exported so `kernel/query/builder.ts` can name `.window()`'s spec and\n * return type WITHOUT a second spine→service import specifier: this strategy\n * module is the seam the kernel is allowed to reach (`check-architecture.mjs`\n * → PRE_EXISTING_SPINE_SERVICE_IMPORTS), and adding a new grandfathered path\n * there for a type-only import would loosen the ratchet for no gain.\n */\nexport type { WindowSpec, WindowedQuery } from './window.js'\n\n/**\n * Options for {@link withReduce}. `window` is the {@link WindowFactory}\n * returned by `withWindow()` — omitted, `.window()` throws and the window\n * engine stays out of the bundle entirely (see `window.ts` § \"Opting in\").\n */\nexport interface ReduceOptions {\n readonly window?: WindowFactory\n}\nimport type { ViaPipeline } from '../../kernel/via/pipeline.js'\nimport type { HydrationGate } from '../../kernel/query/hydration.js'\n\n/**\n * Seam interface. `@internal` — will promote to public only when the\n * aggregate service is extracted into its own package.\n *\n * @internal\n */\nexport interface ReduceStrategy {\n /**\n * Build an `Reduction<R>` for `Query.aggregate(spec)`. `executeRecords`\n * is a closure that produces the matching record set when the\n * reduction runs. NO_REDUCE throws; the active strategy\n * constructs a real `Reduction`.\n */\n aggregate<Spec extends ReduceSpec>(\n executeRecords: () => readonly unknown[],\n spec: Spec,\n upstreams: readonly ReductionUpstream[],\n /** #1414 — the source collection's cold gate, when there is one. */\n gate?: HydrationGate,\n ): Reduction<ReduceResult<Spec>>\n\n /**\n * Build a `GroupedQuery<T, F, S>` for `Query.groupBy(field)`. Same\n * closure / upstream inputs as `aggregate` plus the group key field.\n */\n groupBy<T, F extends string, S extends keyof T = never, M extends keyof T & string = never>(\n executeRecords: () => readonly unknown[],\n field: F,\n upstreams: readonly ReductionUpstream[],\n dictLabelResolver?: (\n key: string,\n locale: string,\n fallback?: string | readonly string[],\n ) => Promise<string | undefined>,\n via?: ViaPipeline,\n /**\n * #1341 (grouped half) — the delta-maintenance seam. Supplied by\n * `Query.groupBy()` only for a plan `canMaintainIncrementally()` admits;\n * omitted, `.groupBy().aggregate().live()` re-runs in full as before.\n */\n maintenance?: GroupMaintenanceSource,\n ): GroupedQuery<T, F, S, M>\n\n /**\n * Variadic-keyed sibling — builds a `GroupedQueryN<T, F, S>` for\n * `Query.groupBy(...fields)`. No dictLabelResolver — `<field>Label`\n * projection only applies to single-field groupings, which dispatch\n * through `groupBy` above.\n */\n groupByN<T, F extends readonly string[], S extends keyof T = never, M extends keyof T & string = never>(\n executeRecords: () => readonly unknown[],\n fields: F,\n upstreams: readonly ReductionUpstream[],\n via?: ViaPipeline,\n /** #1341 (grouped half) — see `groupBy` above. */\n maintenance?: GroupMaintenanceSource,\n ): GroupedQueryN<T, F, S, M>\n\n /**\n * Build a `WindowedQuery<T>` for `Query.window(spec)` (#1349). Same closure\n * / upstream inputs as `groupBy`, plus the window definition. The Via\n * pipeline is threaded so `.select()` gets the same money/distinct reducer\n * rewriting `.aggregate()` gets.\n *\n * Throws unless the strategy was built as `withReduce({ window: withWindow() })`\n * — the second opt-in exists so the window engine is not charged to a\n * consumer who only aggregates. See `window.ts` § \"Opting in\".\n */\n window<T>(\n executeRecords: () => readonly unknown[],\n spec: WindowSpec,\n upstreams: readonly ReductionUpstream[],\n via?: ViaPipeline,\n ): WindowedQuery<T>\n\n /**\n * Terminal streaming aggregator for `ScanBuilder.aggregate(spec)`.\n * Takes an async iterable of decrypted records + the spec and\n * returns the reduced result.\n */\n scanAggregate<Spec extends ReduceSpec>(\n iter: AsyncIterable<unknown>,\n spec: Spec,\n ): Promise<ReduceResult<Spec>>\n}\n\nconst NOT_ENABLED = new Error(\n 'Aggregate / groupBy / window is not enabled on this Noydb instance. ' +\n 'Import `{ withReduce }` from \"@noy-db/hub/reduce\" and pass it to ' +\n '`createNoydb({ reduceStrategy: withReduce() })`.',\n)\n\n/**\n * No-aggregate stub. Every `.aggregate()` / `.groupBy()` / streaming\n * `scan().aggregate()` call throws with a pointer at the subpath. The\n * real `Reduction` / `GroupedQuery` classes are never referenced at\n * runtime, so the bundler drops the ~886 LOC.\n *\n * @internal\n */\nexport const NO_REDUCE: ReduceStrategy = {\n aggregate() { throw NOT_ENABLED },\n groupBy() { throw NOT_ENABLED },\n groupByN() { throw NOT_ENABLED },\n window() { throw NOT_ENABLED },\n scanAggregate() { throw NOT_ENABLED },\n}\n"],"mappings":";AAkIA,IAAM,cAAc,IAAI;AAAA,EACtB;AAGF;AAUO,IAAM,YAA4B;AAAA,EACvC,YAAY;AAAE,UAAM;AAAA,EAAY;AAAA,EAChC,UAAU;AAAE,UAAM;AAAA,EAAY;AAAA,EAC9B,WAAW;AAAE,UAAM;AAAA,EAAY;AAAA,EAC/B,SAAS;AAAE,UAAM;AAAA,EAAY;AAAA,EAC7B,gBAAgB;AAAE,UAAM;AAAA,EAAY;AACtC;","names":[]}
|