@noy-db/hub 0.8.0 → 0.9.0-pre.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 +28 -0
- package/README.md +8 -8
- package/codemods/0.4.0-pre.json +1 -1
- package/codemods/0.8.0-pre.json +1 -1
- package/dist/api-MSJXVYQG.js +18 -0
- package/dist/as/index.js +33 -23
- package/dist/as/index.js.map +1 -1
- package/dist/at/index.js +8 -8
- package/dist/attestation/index.js +18 -18
- package/dist/{backup-YE2VQ26S.js → backup-7RKNZMQO.js} +11 -11
- package/dist/blobs/index.js +12 -12
- package/dist/broker/index.js +19 -11
- package/dist/broker/index.js.map +1 -1
- package/dist/by/index.js +2 -2
- package/dist/capsule/contract.d.ts +1 -1
- package/dist/capsule/contract.js +6 -6
- package/dist/capsule/enclave-aes/broker/proof.d.ts +12 -3
- package/dist/capsule/enclave-aes/index.d.ts +1 -1
- package/dist/capsule/enclave-aes/index.js +40 -14
- package/dist/capsule/enclave-aes/index.js.map +1 -1
- package/dist/capsule/index.d.ts +1 -1
- package/dist/capsule/plumbing/record-codec.d.ts +7 -0
- package/dist/{capsule-VOLX3QRQ.js → capsule-57BDK7LG.js} +8 -8
- package/dist/cargo/index.js +32 -32
- package/dist/{chunk-A4XMIZT3.js → chunk-226V6XXJ.js} +41 -6
- package/dist/chunk-226V6XXJ.js.map +1 -0
- package/dist/{chunk-LNSVGRHO.js → chunk-2A56DSRI.js} +2 -2
- package/dist/chunk-2DX4JCRI.js +1 -0
- package/dist/{chunk-SV2PM2OY.js → chunk-2ELOCEXE.js} +1 -1
- package/dist/chunk-2ELOCEXE.js.map +1 -0
- package/dist/{chunk-6QVKPHBF.js → chunk-2WJKJZSO.js} +2 -2
- package/dist/{chunk-TKVUE4JF.js → chunk-2ZFD2UJC.js} +9 -9
- package/dist/{chunk-2AFX33YA.js → chunk-3V6LZHUO.js} +3 -3
- package/dist/chunk-3V6LZHUO.js.map +1 -0
- package/dist/{chunk-4JPMZTJY.js → chunk-3Y5JLSXS.js} +2 -2
- package/dist/{chunk-XSPFDUDG.js → chunk-45VHWE4C.js} +51 -16
- package/dist/chunk-45VHWE4C.js.map +1 -0
- package/dist/{chunk-LGNDFRYC.js → chunk-4CFHL5RY.js} +1 -1
- package/dist/chunk-4CFHL5RY.js.map +1 -0
- package/dist/{chunk-EZGV6F47.js → chunk-4J3MNVVX.js} +1 -1
- package/dist/{chunk-EZGV6F47.js.map → chunk-4J3MNVVX.js.map} +1 -1
- package/dist/{chunk-O2IMQSNA.js → chunk-4UIP3QNW.js} +2 -2
- package/dist/{chunk-EJLV62NI.js → chunk-55P6OBB7.js} +2 -2
- package/dist/{chunk-Y3LPTBG7.js → chunk-5HNW4ZTA.js} +6 -9
- package/dist/chunk-5HNW4ZTA.js.map +1 -0
- package/dist/{chunk-TEHHROZL.js → chunk-5LMCVBMY.js} +5 -5
- package/dist/{chunk-4V3Q35WG.js → chunk-5UUJE4FP.js} +3 -3
- package/dist/{chunk-JWWYRR4Q.js → chunk-5XONHAFD.js} +2 -2
- package/dist/{chunk-PD64727P.js → chunk-6QLCS7ET.js} +2 -2
- package/dist/chunk-6QLCS7ET.js.map +1 -0
- package/dist/{chunk-QBLT6POL.js → chunk-6WS35E6X.js} +2 -2
- package/dist/{chunk-IUBMZPHM.js → chunk-6Y5E4SJU.js} +5 -6
- package/dist/chunk-6Y5E4SJU.js.map +1 -0
- package/dist/{chunk-GZT3NQRA.js → chunk-72XBVN4J.js} +8 -2
- package/dist/{chunk-GZT3NQRA.js.map → chunk-72XBVN4J.js.map} +1 -1
- package/dist/{chunk-EYG2CY2X.js → chunk-7BMOS4JQ.js} +11 -11
- package/dist/chunk-7BMOS4JQ.js.map +1 -0
- package/dist/{chunk-UA372JHH.js → chunk-7CT6SX4M.js} +3 -3
- package/dist/chunk-7CT6SX4M.js.map +1 -0
- package/dist/{chunk-EZOAKKTB.js → chunk-ABU6A4Z5.js} +2 -2
- package/dist/{chunk-VKI2EB3N.js → chunk-AJFPAHMW.js} +3 -3
- package/dist/{chunk-DQESF6RP.js → chunk-APFFJN5T.js} +29 -16
- package/dist/chunk-APFFJN5T.js.map +1 -0
- package/dist/{chunk-2ODVB6LZ.js → chunk-B65CC6Z6.js} +2 -2
- package/dist/{chunk-MBMTND6D.js → chunk-BJH77UY2.js} +2 -2
- package/dist/{chunk-VAORSCSU.js → chunk-BMHQHH7Q.js} +2 -2
- package/dist/chunk-BMHQHH7Q.js.map +1 -0
- package/dist/{chunk-FFJFE4T7.js → chunk-BNFNQNEP.js} +2 -2
- package/dist/chunk-BU2ABHFW.js +74 -0
- package/dist/chunk-BU2ABHFW.js.map +1 -0
- package/dist/{chunk-5WWDGFOS.js → chunk-BUE7R3B5.js} +2 -2
- package/dist/{chunk-5FE75J4S.js → chunk-BVF3SXD7.js} +5 -5
- package/dist/{chunk-VFHCKG5M.js → chunk-BYHCKX73.js} +3 -3
- package/dist/{chunk-BVCUTXE3.js → chunk-C53ER7AG.js} +2 -2
- package/dist/{chunk-MILI22XQ.js → chunk-CAD7N6HQ.js} +3 -3
- package/dist/{chunk-5KC7QYEC.js → chunk-CB4467G3.js} +5 -5
- package/dist/{chunk-JIBUPZHA.js → chunk-D4V5JJAK.js} +4 -4
- package/dist/{chunk-DLD5LGDS.js → chunk-D5A3GCZ4.js} +3 -3
- package/dist/{chunk-FOEDQATO.js → chunk-DHU2AQ6T.js} +2 -2
- package/dist/{chunk-VHBKYN2J.js → chunk-DL6BZKP3.js} +2 -2
- package/dist/{chunk-NBQ3KK6X.js → chunk-EA4VDI5D.js} +4 -4
- package/dist/chunk-EA4VDI5D.js.map +1 -0
- package/dist/{chunk-E2N2T5ZO.js → chunk-ECGXA4LT.js} +2 -2
- package/dist/{chunk-PP3K67AJ.js → chunk-EMAWOGVH.js} +3 -3
- package/dist/{chunk-WXE4W2U6.js → chunk-EUD3HQM4.js} +4 -4
- package/dist/{chunk-MXOQ5JCG.js → chunk-FSQNGPHH.js} +171 -124
- package/dist/chunk-FSQNGPHH.js.map +1 -0
- package/dist/{chunk-LIOVX5TJ.js → chunk-FZXRLNJO.js} +3 -3
- package/dist/{chunk-WPOYWFSE.js → chunk-G46JSSVX.js} +7 -7
- package/dist/{chunk-JSMTXZR3.js → chunk-G5EDYVSE.js} +8 -6
- package/dist/chunk-G5EDYVSE.js.map +1 -0
- package/dist/chunk-G66YXUTY.js +60 -0
- package/dist/chunk-G66YXUTY.js.map +1 -0
- package/dist/{chunk-FFWI7UH7.js → chunk-GAGT3YZN.js} +1 -1
- package/dist/chunk-GAGT3YZN.js.map +1 -0
- package/dist/{chunk-AEQGFRU4.js → chunk-GCUMOKTN.js} +3 -3
- package/dist/{chunk-244QBK7Z.js → chunk-GETUTTZU.js} +4 -4
- package/dist/{chunk-244QBK7Z.js.map → chunk-GETUTTZU.js.map} +1 -1
- package/dist/{chunk-V3RWOOSO.js → chunk-GOJQ5DZA.js} +4 -4
- package/dist/{chunk-UEFOQH74.js → chunk-GRS2HIV6.js} +2 -2
- package/dist/{chunk-3L2NBKDR.js → chunk-H3YM66EI.js} +2 -2
- package/dist/{chunk-3A5DUZ56.js → chunk-IVMFIKNA.js} +6 -6
- package/dist/{chunk-3A5DUZ56.js.map → chunk-IVMFIKNA.js.map} +1 -1
- package/dist/{chunk-747G6CT3.js → chunk-J4KAPKBJ.js} +2 -2
- package/dist/{chunk-H23XHRTT.js → chunk-JA25QG5M.js} +211 -6
- package/dist/chunk-JA25QG5M.js.map +1 -0
- package/dist/{chunk-T7IR4N2S.js → chunk-JBMMWYOH.js} +3 -1
- package/dist/{chunk-T7IR4N2S.js.map → chunk-JBMMWYOH.js.map} +1 -1
- package/dist/{chunk-MXKI4ABF.js → chunk-JPSL5GIZ.js} +3 -3
- package/dist/{chunk-2GHDLTPE.js → chunk-JSWKVZCR.js} +2 -2
- package/dist/{chunk-BNWA3WG5.js → chunk-JZ4EDEIP.js} +3 -3
- package/dist/{chunk-GUZET4SG.js → chunk-K673OO6B.js} +4 -4
- package/dist/chunk-K673OO6B.js.map +1 -0
- package/dist/{chunk-5UMK7GRI.js → chunk-K7RW7FI4.js} +5 -5
- package/dist/{chunk-N7EVQD5S.js → chunk-L2F3CFCH.js} +4 -4
- package/dist/{chunk-2PVXF5CS.js → chunk-L5A3KR7R.js} +3 -3
- package/dist/{chunk-O46CHQT7.js → chunk-LGGIFKJP.js} +4 -4
- package/dist/{chunk-Y2RKVFKR.js → chunk-MQ7YWBQ5.js} +2 -2
- package/dist/{chunk-4CIQDWRB.js → chunk-MRJDLXI3.js} +14 -8
- package/dist/{chunk-4CIQDWRB.js.map → chunk-MRJDLXI3.js.map} +1 -1
- package/dist/{chunk-YRXFFWG4.js → chunk-NIXRB5BP.js} +2 -2
- package/dist/{chunk-RHVMZSUU.js → chunk-NV4OESHC.js} +1 -1
- package/dist/chunk-NV4OESHC.js.map +1 -0
- package/dist/{chunk-V7ADQF5O.js → chunk-NYJBYVBG.js} +4 -4
- package/dist/{chunk-23D6M6VM.js → chunk-NZULV7LK.js} +4 -4
- package/dist/{chunk-HW7CMKUG.js → chunk-OFD2HD6F.js} +1 -1
- package/dist/{chunk-HW7CMKUG.js.map → chunk-OFD2HD6F.js.map} +1 -1
- package/dist/{chunk-BPWYQ25R.js → chunk-OJU67C23.js} +4 -4
- package/dist/{chunk-BPWYQ25R.js.map → chunk-OJU67C23.js.map} +1 -1
- package/dist/{chunk-AUKKUPVB.js → chunk-OK57EATL.js} +2 -2
- package/dist/{chunk-42ALPZ2B.js → chunk-OM3SEDI4.js} +4 -4
- package/dist/{chunk-42ALPZ2B.js.map → chunk-OM3SEDI4.js.map} +1 -1
- package/dist/{chunk-OYW3I5M4.js → chunk-PCYPXLEX.js} +6 -6
- package/dist/{chunk-2MG3SW7Q.js → chunk-PFCTSXHU.js} +2 -2
- package/dist/{chunk-FVH5QYY2.js → chunk-PGC35KXE.js} +2 -2
- package/dist/{chunk-NCO25JZO.js → chunk-PT2YCQVK.js} +4 -4
- package/dist/{chunk-SYNY3VB5.js → chunk-PTJY5R3O.js} +2 -2
- package/dist/{chunk-QMWY2FDS.js → chunk-PUBI455O.js} +2 -2
- package/dist/{chunk-VMV5SBE4.js → chunk-QDHHHI5Q.js} +5 -5
- package/dist/{chunk-JQYKPKG6.js → chunk-QGFEBNHO.js} +4 -4
- package/dist/{chunk-52MGURXO.js → chunk-QGSNJD3B.js} +2 -2
- package/dist/chunk-QJNAHPVT.js +91 -0
- package/dist/chunk-QJNAHPVT.js.map +1 -0
- package/dist/{chunk-VVOLDVIR.js → chunk-QSHATAXJ.js} +2 -2
- package/dist/{chunk-G2MVBDFP.js → chunk-QXJXG7DN.js} +39 -9
- package/dist/chunk-QXJXG7DN.js.map +1 -0
- package/dist/{chunk-KZXDLBY6.js → chunk-RDOEOPOI.js} +5 -5
- package/dist/{chunk-FLPCETP6.js → chunk-RIZTZJX6.js} +2 -2
- package/dist/{chunk-H427H63K.js → chunk-RNACRT5H.js} +2 -2
- package/dist/chunk-RWFQVNXR.js +24 -0
- package/dist/chunk-RWFQVNXR.js.map +1 -0
- package/dist/{chunk-JOSPH3E5.js → chunk-SFCD6OU7.js} +2 -2
- package/dist/{chunk-IMQKWR46.js → chunk-SNM7LSYG.js} +4 -5
- package/dist/chunk-SNM7LSYG.js.map +1 -0
- package/dist/{chunk-Q2XRFWOI.js → chunk-SPPOUJLN.js} +2 -2
- package/dist/{chunk-EGVJ7TM4.js → chunk-SWXLZ4HX.js} +8 -9
- package/dist/chunk-SWXLZ4HX.js.map +1 -0
- package/dist/{chunk-H7JBY4P7.js → chunk-TFWFPZRU.js} +13 -13
- package/dist/chunk-TFWFPZRU.js.map +1 -0
- package/dist/{chunk-VQDZYB2B.js → chunk-TMIJAR2X.js} +3 -3
- package/dist/{chunk-VQDZYB2B.js.map → chunk-TMIJAR2X.js.map} +1 -1
- package/dist/{chunk-RB4DOPGZ.js → chunk-TZYTMZZY.js} +10 -10
- package/dist/{chunk-Q4UHJ5SN.js → chunk-UAKY6E4N.js} +2 -2
- package/dist/chunk-UHFGK6YA.js +40 -0
- package/dist/chunk-UHFGK6YA.js.map +1 -0
- package/dist/{chunk-DIZLQVAA.js → chunk-UNSQZSZP.js} +2 -2
- package/dist/{chunk-4T3SE27M.js → chunk-UOZOWN73.js} +2 -2
- package/dist/{chunk-OKSTSITU.js → chunk-V55JASXO.js} +3 -3
- package/dist/{chunk-37EPTBBR.js → chunk-VSUQI5Q6.js} +32 -4
- package/dist/chunk-VSUQI5Q6.js.map +1 -0
- package/dist/{chunk-XQRFSKYM.js → chunk-WFWFXDNS.js} +2 -2
- package/dist/{chunk-N7UDP5VU.js → chunk-WHOKGHJ3.js} +7 -7
- package/dist/{chunk-7R2Q7CPL.js → chunk-X2RP4TO5.js} +7 -7
- package/dist/{chunk-U2FZNEWJ.js → chunk-XA34THLF.js} +8 -6
- package/dist/{chunk-U2FZNEWJ.js.map → chunk-XA34THLF.js.map} +1 -1
- package/dist/{chunk-UIYESRD6.js → chunk-XITHENBI.js} +9 -9
- package/dist/{chunk-UIYESRD6.js.map → chunk-XITHENBI.js.map} +1 -1
- package/dist/{chunk-3XJQBBZD.js → chunk-XKBTJGFP.js} +2 -2
- package/dist/{chunk-SMV2HRDU.js → chunk-XXNWU5QZ.js} +2 -2
- package/dist/{chunk-TZZBXPZK.js → chunk-XXQ5XIYY.js} +2 -2
- package/dist/{chunk-3EWS67C7.js → chunk-YFFMPZPY.js} +2 -2
- package/dist/{chunk-M5B2W6YY.js → chunk-YKGJ44Z7.js} +3 -3
- package/dist/{chunk-5A4345TG.js → chunk-YQFBH5ZJ.js} +3 -3
- package/dist/{chunk-DHHGL42E.js → chunk-Z3ZXVB2Y.js} +22 -6
- package/dist/chunk-Z3ZXVB2Y.js.map +1 -0
- package/dist/{chunk-OIEO4WDL.js → chunk-ZBUAX4EF.js} +2 -2
- package/dist/chunk-ZBUAX4EF.js.map +1 -0
- package/dist/{chunk-HS554XAF.js → chunk-ZHQJAV6D.js} +2 -2
- package/dist/{chunk-IUT3GWP3.js → chunk-ZMVSKYTJ.js} +17 -93
- package/dist/chunk-ZMVSKYTJ.js.map +1 -0
- package/dist/{chunk-AL6ML4LA.js → chunk-ZVSKSUGI.js} +5 -5
- package/dist/{chunk-JDEYF3PJ.js → chunk-ZWF3EWZA.js} +2 -2
- package/dist/chunk-ZWF3EWZA.js.map +1 -0
- package/dist/classified/index.js +5 -5
- package/dist/{classified-marker-SIYKUU5L.js → classified-marker-KHDOYIJB.js} +3 -3
- package/dist/collection-facade-LZIF7GWD.js +41 -0
- package/dist/{computed-FAD7SED4.js → computed-XMFTHAXV.js} +3 -3
- package/dist/consent/index.js +8 -8
- package/dist/cover/index.js +8 -8
- package/dist/coverage/index.js +1 -1
- package/dist/custody/index.js +12 -11
- package/dist/{dead-filter-4F3LWYKH.js → dead-filter-CXV5NS67.js} +10 -10
- package/dist/debug/index.js +7 -7
- package/dist/{delegation-NANZDG4N.js → delegation-ONLM4JFI.js} +49 -25
- package/dist/delegation-ONLM4JFI.js.map +1 -0
- package/dist/derivations/index.js +24 -23
- package/dist/derive-3YSIS36W.js +20 -0
- package/dist/directory/index.js +9 -9
- package/dist/{dispatch-JDZNGEB3.js → dispatch-2MQFMEGY.js} +20 -20
- package/dist/{dispatch-H4HV32AM.js → dispatch-OFDA4WQV.js} +5 -5
- package/dist/executor-E6YDJ7YA.js +8 -0
- package/dist/executor-NJX3YQQ4.js +35 -0
- package/dist/executor-WWM3DD4P.js +8 -0
- package/dist/export-accessible-RLHU5G4W.js +22 -0
- package/dist/extract-partition-QII2EDCS.js +35 -0
- package/dist/{fanout-sidecar-L7NHPIOC.js → fanout-sidecar-BO67PCPO.js} +8 -8
- package/dist/find-6M7GYDUZ.js +10 -0
- package/dist/forget/index.js +25 -8
- package/dist/forget/index.js.map +1 -1
- package/dist/guards/index.js +4 -4
- package/dist/history/index.js +12 -12
- package/dist/i18n/index.js +13 -13
- package/dist/index.d.ts +8 -6
- package/dist/index.js +122 -110
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.js +6 -6
- package/dist/introspection/index.js +15 -11
- package/dist/issue-LPEEEMPP.js +19 -0
- package/dist/kernel/cache/index.d.ts +1 -1
- package/dist/kernel/collection.d.ts +1 -0
- package/dist/kernel/errors.d.ts +33 -4
- package/dist/kernel/export-scope.d.ts +40 -0
- package/dist/kernel/noydb.d.ts +3 -1
- package/dist/kernel/put-many-atomic.d.ts +1 -1
- package/dist/kernel/query/live/live.d.ts +2 -1
- package/dist/kernel/query/sort-key.d.ts +0 -2
- package/dist/kernel/tx-write-gate.d.ts +2 -4
- package/dist/kernel/types.d.ts +93 -6
- package/dist/kernel/validation.d.ts +0 -10
- package/dist/kernel/vault.d.ts +4 -0
- package/dist/kernel/via/reconcile.d.ts +1 -42
- package/dist/{ledger-5ZMGE44K.js → ledger-MSJGWKGW.js} +10 -10
- package/dist/liberate-LEKDYKTC.js +25 -0
- package/dist/{link-set-MFXC24VK.js → link-set-QXXSPPHL.js} +10 -10
- package/dist/{managed-secret-MFTFT22X.js → managed-secret-VSK7ANQI.js} +9 -9
- package/dist/materialized-views/index.js +26 -26
- package/dist/{migrate-cek-DZRFFOHW.js → migrate-cek-GEBFYBDC.js} +2 -2
- package/dist/money/index.js +5 -5
- package/dist/noydb-F2AUF6KL.js +98 -0
- package/dist/on/index.js +25 -0
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.js +11 -11
- package/dist/pod/index.js +69 -67
- package/dist/{pod-handle-A3LET7NO.js → pod-handle-YE7CT66T.js} +8 -8
- package/dist/policy/index.js +9 -9
- package/dist/port/as/active.d.ts +4 -0
- package/dist/port/as/index.d.ts +1 -0
- package/dist/port/by/index.d.ts +14 -5
- package/dist/port/on/index.d.ts +26 -0
- package/dist/port/to/index.d.ts +1 -1
- package/dist/port/with/broker-strategy.d.ts +14 -0
- package/dist/port/with/coverage-strategy.d.ts +17 -1
- package/dist/port/with/formats-strategy.d.ts +34 -1
- package/dist/port/with/lookup-strategy.d.ts +85 -4
- package/dist/port/with/service-bus.d.ts +2 -1
- package/dist/portability/index.js +8 -8
- package/dist/{post-register-7ND27CF2.js → post-register-QC5TEAW3.js} +6 -6
- package/dist/query/all/index.js +16 -16
- package/dist/query/index.js +8 -8
- package/dist/query/live/index.js +7 -7
- package/dist/query/reduce/index.js +10 -10
- package/dist/query/relate/index.js +10 -10
- package/dist/reduce/index.js +8 -8
- package/dist/register-SN72QALV.js +30 -0
- package/dist/registry-253FF7C6.js +35 -0
- package/dist/registry-3AZWQTDT.js +23 -0
- package/dist/registry-7UEBTHWG.js +8 -0
- package/dist/registry-IVJ67NFQ.js +8 -0
- package/dist/request-withdrawal-UKVJZKX2.js +28 -0
- package/dist/{reveal-B2TLP4JQ.js → reveal-YQTRNQFH.js} +7 -7
- package/dist/revoke-G2KXJQA5.js +24 -0
- package/dist/satellites/index.js +1 -1
- package/dist/schema-update/index.js +2 -2
- package/dist/sealed-record/index.js +11 -11
- package/dist/search/index.js +4 -4
- package/dist/{seed-XNSE4U3S.js → seed-JMQTRKRE.js} +121 -27
- package/dist/seed-JMQTRKRE.js.map +1 -0
- package/dist/sequence/index.js +8 -8
- package/dist/session/index.js +8 -8
- package/dist/shadow/index.js +2 -2
- package/dist/signer-IUIYR3CX.js +23 -0
- package/dist/snapshots/index.js +9 -9
- package/dist/{stale-6GCFMOOR.js → stale-SKV33PBU.js} +9 -9
- package/dist/storage-NPBYP2SM.js +21 -0
- package/dist/{store-coordination-provider-C4BPT5XF.js → store-coordination-provider-Z6HKPOGM.js} +9 -9
- package/dist/sync/index.js +17 -11
- package/dist/sync/index.js.map +1 -1
- package/dist/team/index.js +17 -15
- package/dist/tiers/index.js +10 -10
- 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 +8 -8
- package/dist/{verify-UKALW7C2.js → verify-KWQIWLGH.js} +7 -7
- package/dist/via/classified/presets.d.ts +29 -0
- package/dist/via/classified/resolve.d.ts +7 -0
- package/dist/via/geo/binding.d.ts +0 -4
- package/dist/via/lookup/index.d.ts +32 -0
- package/dist/via/money/binding.d.ts +0 -9
- package/dist/walk-F4OLXI5H.js +20 -0
- package/dist/with-audit/attestation/strategy.d.ts +2 -1
- package/dist/with-audit/attestation/vault-facade.d.ts +7 -0
- package/dist/with-audit/forget/completeness.d.ts +66 -0
- package/dist/with-audit/forget/index.d.ts +2 -0
- package/dist/with-audit/forget/strategy.d.ts +65 -0
- package/dist/with-audit/periods/periods.d.ts +0 -9
- package/dist/with-audit/periods/reserved-collections.d.ts +7 -0
- package/dist/with-audit/portability/request-withdrawal.d.ts +0 -1
- package/dist/with-audit/portability/withdraw-accessible.d.ts +0 -1
- package/dist/with-audit/tiers/index.d.ts +1 -1
- package/dist/with-audit/tiers/strategy.d.ts +19 -0
- package/dist/with-cargo/extract-partition.d.ts +0 -46
- package/dist/with-commit/numbering/index.d.ts +0 -2
- package/dist/with-commit/tx/transaction.d.ts +2 -24
- package/dist/with-commit/vault-head/strategy.d.ts +7 -0
- package/dist/with-fork/snapshots/noydb-facade.d.ts +7 -0
- package/dist/with-formula/derivations/trigger-match.d.ts +8 -5
- package/dist/with-formula/materialized-views/emit-memo.d.ts +0 -2
- package/dist/with-lookup/embeddings/index.d.ts +1 -2
- package/dist/with-lookup/indexing/collection-facade.d.ts +1 -15
- package/dist/with-lookup/indexing/eager-indexes.d.ts +2 -1
- package/dist/with-lookup/search/collection-facade.d.ts +0 -12
- package/dist/with-party/broker/index.d.ts +2 -2
- package/dist/with-party/broker/seed.d.ts +25 -10
- package/dist/with-party/policy/noydb-facade.d.ts +1 -31
- package/dist/with-party/team/delegation.d.ts +58 -2
- package/dist/with-party/team/echo-secret.d.ts +0 -2
- package/dist/with-party/team/keyring.d.ts +1 -21
- package/dist/with-party/team/magic-link-grant.d.ts +11 -1
- package/dist/with-party/team/noydb-facade.d.ts +5 -0
- package/dist/with-party/team/reserved-secret-collections.d.ts +10 -8
- package/dist/with-party/team/roster-tag.d.ts +42 -1
- package/dist/with-party/team/tiers.d.ts +36 -5
- package/dist/with-shape/blobs/blob-set.d.ts +23 -0
- package/dist/with-shape/blobs/legacy-sweep.d.ts +16 -0
- package/dist/with-shape/introspection/describe.d.ts +1 -2
- package/dist/with-shape/introspection/index.d.ts +1 -0
- package/dist/with-shape/introspection/types.d.ts +2 -1
- package/dist/with-shape/schema-update/fence.d.ts +7 -0
- package/dist/with-sync/engine.d.ts +30 -1
- package/dist/with-sync/reserved-mirror.d.ts +89 -0
- package/dist/with-sync/strategy.d.ts +7 -0
- package/dist/with-sync/tab-write-relay.d.ts +0 -10
- package/dist/withdraw-accessible-ZKPLZ66E.js +25 -0
- package/package.json +3 -3
- package/dist/api-OS747DS4.js +0 -18
- package/dist/chunk-2AFX33YA.js.map +0 -1
- package/dist/chunk-2RH777HH.js +0 -126
- package/dist/chunk-2RH777HH.js.map +0 -1
- package/dist/chunk-37EPTBBR.js.map +0 -1
- package/dist/chunk-7XMHMVTS.js +0 -20
- package/dist/chunk-7XMHMVTS.js.map +0 -1
- package/dist/chunk-A4XMIZT3.js.map +0 -1
- package/dist/chunk-DHHGL42E.js.map +0 -1
- package/dist/chunk-DQESF6RP.js.map +0 -1
- package/dist/chunk-EGVJ7TM4.js.map +0 -1
- package/dist/chunk-EYG2CY2X.js.map +0 -1
- package/dist/chunk-FFWI7UH7.js.map +0 -1
- package/dist/chunk-G2MVBDFP.js.map +0 -1
- package/dist/chunk-GUZET4SG.js.map +0 -1
- package/dist/chunk-H23XHRTT.js.map +0 -1
- package/dist/chunk-H7JBY4P7.js.map +0 -1
- package/dist/chunk-IMQKWR46.js.map +0 -1
- package/dist/chunk-IUBMZPHM.js.map +0 -1
- package/dist/chunk-IUT3GWP3.js.map +0 -1
- package/dist/chunk-JDEYF3PJ.js.map +0 -1
- package/dist/chunk-JSMTXZR3.js.map +0 -1
- package/dist/chunk-LGNDFRYC.js.map +0 -1
- package/dist/chunk-MXOQ5JCG.js.map +0 -1
- package/dist/chunk-NBQ3KK6X.js.map +0 -1
- package/dist/chunk-OIEO4WDL.js.map +0 -1
- package/dist/chunk-PD64727P.js.map +0 -1
- package/dist/chunk-RHVMZSUU.js.map +0 -1
- package/dist/chunk-SV2PM2OY.js.map +0 -1
- package/dist/chunk-UA372JHH.js.map +0 -1
- package/dist/chunk-UBSFPGVJ.js +0 -1
- package/dist/chunk-VAORSCSU.js.map +0 -1
- package/dist/chunk-XSPFDUDG.js.map +0 -1
- package/dist/chunk-Y3LPTBG7.js.map +0 -1
- package/dist/collection-facade-CS7CA2XO.js +0 -47
- package/dist/delegation-NANZDG4N.js.map +0 -1
- package/dist/derive-XLOJVXPU.js +0 -20
- package/dist/executor-FMPVN6DT.js +0 -35
- package/dist/executor-LBBBRTN5.js +0 -8
- package/dist/executor-OSRZST2U.js +0 -8
- package/dist/export-accessible-RAOJAAU5.js +0 -22
- package/dist/extract-partition-JD5CUSTG.js +0 -37
- package/dist/find-JRN4RNQ5.js +0 -10
- package/dist/issue-YIVBZUTH.js +0 -19
- package/dist/liberate-WZSZM2W6.js +0 -24
- package/dist/noydb-ITIGNKUF.js +0 -96
- package/dist/register-DT5HZ2LZ.js +0 -30
- package/dist/registry-BHRZGZHF.js +0 -8
- package/dist/registry-ET6ZFFWA.js +0 -34
- package/dist/registry-HXFGLGTG.js +0 -8
- package/dist/registry-THCPDEOD.js +0 -23
- package/dist/request-withdrawal-AV2MJJKY.js +0 -30
- package/dist/revoke-6DWIEOCV.js +0 -24
- package/dist/seed-XNSE4U3S.js.map +0 -1
- package/dist/signer-MHGW3OIL.js +0 -23
- package/dist/storage-BYN5LO6Z.js +0 -21
- package/dist/walk-4VPK7AS4.js +0 -20
- package/dist/withdraw-accessible-HL7GACUE.js +0 -27
- /package/dist/{api-OS747DS4.js.map → api-MSJXVYQG.js.map} +0 -0
- /package/dist/{backup-YE2VQ26S.js.map → backup-7RKNZMQO.js.map} +0 -0
- /package/dist/{capsule-VOLX3QRQ.js.map → capsule-57BDK7LG.js.map} +0 -0
- /package/dist/{chunk-LNSVGRHO.js.map → chunk-2A56DSRI.js.map} +0 -0
- /package/dist/{chunk-UBSFPGVJ.js.map → chunk-2DX4JCRI.js.map} +0 -0
- /package/dist/{chunk-6QVKPHBF.js.map → chunk-2WJKJZSO.js.map} +0 -0
- /package/dist/{chunk-TKVUE4JF.js.map → chunk-2ZFD2UJC.js.map} +0 -0
- /package/dist/{chunk-4JPMZTJY.js.map → chunk-3Y5JLSXS.js.map} +0 -0
- /package/dist/{chunk-O2IMQSNA.js.map → chunk-4UIP3QNW.js.map} +0 -0
- /package/dist/{chunk-EJLV62NI.js.map → chunk-55P6OBB7.js.map} +0 -0
- /package/dist/{chunk-TEHHROZL.js.map → chunk-5LMCVBMY.js.map} +0 -0
- /package/dist/{chunk-4V3Q35WG.js.map → chunk-5UUJE4FP.js.map} +0 -0
- /package/dist/{chunk-JWWYRR4Q.js.map → chunk-5XONHAFD.js.map} +0 -0
- /package/dist/{chunk-QBLT6POL.js.map → chunk-6WS35E6X.js.map} +0 -0
- /package/dist/{chunk-EZOAKKTB.js.map → chunk-ABU6A4Z5.js.map} +0 -0
- /package/dist/{chunk-VKI2EB3N.js.map → chunk-AJFPAHMW.js.map} +0 -0
- /package/dist/{chunk-2ODVB6LZ.js.map → chunk-B65CC6Z6.js.map} +0 -0
- /package/dist/{chunk-MBMTND6D.js.map → chunk-BJH77UY2.js.map} +0 -0
- /package/dist/{chunk-FFJFE4T7.js.map → chunk-BNFNQNEP.js.map} +0 -0
- /package/dist/{chunk-5WWDGFOS.js.map → chunk-BUE7R3B5.js.map} +0 -0
- /package/dist/{chunk-5FE75J4S.js.map → chunk-BVF3SXD7.js.map} +0 -0
- /package/dist/{chunk-VFHCKG5M.js.map → chunk-BYHCKX73.js.map} +0 -0
- /package/dist/{chunk-BVCUTXE3.js.map → chunk-C53ER7AG.js.map} +0 -0
- /package/dist/{chunk-MILI22XQ.js.map → chunk-CAD7N6HQ.js.map} +0 -0
- /package/dist/{chunk-5KC7QYEC.js.map → chunk-CB4467G3.js.map} +0 -0
- /package/dist/{chunk-JIBUPZHA.js.map → chunk-D4V5JJAK.js.map} +0 -0
- /package/dist/{chunk-DLD5LGDS.js.map → chunk-D5A3GCZ4.js.map} +0 -0
- /package/dist/{chunk-FOEDQATO.js.map → chunk-DHU2AQ6T.js.map} +0 -0
- /package/dist/{chunk-VHBKYN2J.js.map → chunk-DL6BZKP3.js.map} +0 -0
- /package/dist/{chunk-E2N2T5ZO.js.map → chunk-ECGXA4LT.js.map} +0 -0
- /package/dist/{chunk-PP3K67AJ.js.map → chunk-EMAWOGVH.js.map} +0 -0
- /package/dist/{chunk-WXE4W2U6.js.map → chunk-EUD3HQM4.js.map} +0 -0
- /package/dist/{chunk-LIOVX5TJ.js.map → chunk-FZXRLNJO.js.map} +0 -0
- /package/dist/{chunk-WPOYWFSE.js.map → chunk-G46JSSVX.js.map} +0 -0
- /package/dist/{chunk-AEQGFRU4.js.map → chunk-GCUMOKTN.js.map} +0 -0
- /package/dist/{chunk-V3RWOOSO.js.map → chunk-GOJQ5DZA.js.map} +0 -0
- /package/dist/{chunk-UEFOQH74.js.map → chunk-GRS2HIV6.js.map} +0 -0
- /package/dist/{chunk-3L2NBKDR.js.map → chunk-H3YM66EI.js.map} +0 -0
- /package/dist/{chunk-747G6CT3.js.map → chunk-J4KAPKBJ.js.map} +0 -0
- /package/dist/{chunk-MXKI4ABF.js.map → chunk-JPSL5GIZ.js.map} +0 -0
- /package/dist/{chunk-2GHDLTPE.js.map → chunk-JSWKVZCR.js.map} +0 -0
- /package/dist/{chunk-BNWA3WG5.js.map → chunk-JZ4EDEIP.js.map} +0 -0
- /package/dist/{chunk-5UMK7GRI.js.map → chunk-K7RW7FI4.js.map} +0 -0
- /package/dist/{chunk-N7EVQD5S.js.map → chunk-L2F3CFCH.js.map} +0 -0
- /package/dist/{chunk-2PVXF5CS.js.map → chunk-L5A3KR7R.js.map} +0 -0
- /package/dist/{chunk-O46CHQT7.js.map → chunk-LGGIFKJP.js.map} +0 -0
- /package/dist/{chunk-Y2RKVFKR.js.map → chunk-MQ7YWBQ5.js.map} +0 -0
- /package/dist/{chunk-YRXFFWG4.js.map → chunk-NIXRB5BP.js.map} +0 -0
- /package/dist/{chunk-V7ADQF5O.js.map → chunk-NYJBYVBG.js.map} +0 -0
- /package/dist/{chunk-23D6M6VM.js.map → chunk-NZULV7LK.js.map} +0 -0
- /package/dist/{chunk-AUKKUPVB.js.map → chunk-OK57EATL.js.map} +0 -0
- /package/dist/{chunk-OYW3I5M4.js.map → chunk-PCYPXLEX.js.map} +0 -0
- /package/dist/{chunk-2MG3SW7Q.js.map → chunk-PFCTSXHU.js.map} +0 -0
- /package/dist/{chunk-FVH5QYY2.js.map → chunk-PGC35KXE.js.map} +0 -0
- /package/dist/{chunk-NCO25JZO.js.map → chunk-PT2YCQVK.js.map} +0 -0
- /package/dist/{chunk-SYNY3VB5.js.map → chunk-PTJY5R3O.js.map} +0 -0
- /package/dist/{chunk-QMWY2FDS.js.map → chunk-PUBI455O.js.map} +0 -0
- /package/dist/{chunk-VMV5SBE4.js.map → chunk-QDHHHI5Q.js.map} +0 -0
- /package/dist/{chunk-JQYKPKG6.js.map → chunk-QGFEBNHO.js.map} +0 -0
- /package/dist/{chunk-52MGURXO.js.map → chunk-QGSNJD3B.js.map} +0 -0
- /package/dist/{chunk-VVOLDVIR.js.map → chunk-QSHATAXJ.js.map} +0 -0
- /package/dist/{chunk-KZXDLBY6.js.map → chunk-RDOEOPOI.js.map} +0 -0
- /package/dist/{chunk-FLPCETP6.js.map → chunk-RIZTZJX6.js.map} +0 -0
- /package/dist/{chunk-H427H63K.js.map → chunk-RNACRT5H.js.map} +0 -0
- /package/dist/{chunk-JOSPH3E5.js.map → chunk-SFCD6OU7.js.map} +0 -0
- /package/dist/{chunk-Q2XRFWOI.js.map → chunk-SPPOUJLN.js.map} +0 -0
- /package/dist/{chunk-RB4DOPGZ.js.map → chunk-TZYTMZZY.js.map} +0 -0
- /package/dist/{chunk-Q4UHJ5SN.js.map → chunk-UAKY6E4N.js.map} +0 -0
- /package/dist/{chunk-DIZLQVAA.js.map → chunk-UNSQZSZP.js.map} +0 -0
- /package/dist/{chunk-4T3SE27M.js.map → chunk-UOZOWN73.js.map} +0 -0
- /package/dist/{chunk-OKSTSITU.js.map → chunk-V55JASXO.js.map} +0 -0
- /package/dist/{chunk-XQRFSKYM.js.map → chunk-WFWFXDNS.js.map} +0 -0
- /package/dist/{chunk-N7UDP5VU.js.map → chunk-WHOKGHJ3.js.map} +0 -0
- /package/dist/{chunk-7R2Q7CPL.js.map → chunk-X2RP4TO5.js.map} +0 -0
- /package/dist/{chunk-3XJQBBZD.js.map → chunk-XKBTJGFP.js.map} +0 -0
- /package/dist/{chunk-SMV2HRDU.js.map → chunk-XXNWU5QZ.js.map} +0 -0
- /package/dist/{chunk-TZZBXPZK.js.map → chunk-XXQ5XIYY.js.map} +0 -0
- /package/dist/{chunk-3EWS67C7.js.map → chunk-YFFMPZPY.js.map} +0 -0
- /package/dist/{chunk-M5B2W6YY.js.map → chunk-YKGJ44Z7.js.map} +0 -0
- /package/dist/{chunk-5A4345TG.js.map → chunk-YQFBH5ZJ.js.map} +0 -0
- /package/dist/{chunk-HS554XAF.js.map → chunk-ZHQJAV6D.js.map} +0 -0
- /package/dist/{chunk-AL6ML4LA.js.map → chunk-ZVSKSUGI.js.map} +0 -0
- /package/dist/{classified-marker-SIYKUU5L.js.map → classified-marker-KHDOYIJB.js.map} +0 -0
- /package/dist/{collection-facade-CS7CA2XO.js.map → collection-facade-LZIF7GWD.js.map} +0 -0
- /package/dist/{computed-FAD7SED4.js.map → computed-XMFTHAXV.js.map} +0 -0
- /package/dist/{dead-filter-4F3LWYKH.js.map → dead-filter-CXV5NS67.js.map} +0 -0
- /package/dist/{derive-XLOJVXPU.js.map → derive-3YSIS36W.js.map} +0 -0
- /package/dist/{dispatch-JDZNGEB3.js.map → dispatch-2MQFMEGY.js.map} +0 -0
- /package/dist/{dispatch-H4HV32AM.js.map → dispatch-OFDA4WQV.js.map} +0 -0
- /package/dist/{executor-FMPVN6DT.js.map → executor-E6YDJ7YA.js.map} +0 -0
- /package/dist/{executor-LBBBRTN5.js.map → executor-NJX3YQQ4.js.map} +0 -0
- /package/dist/{executor-OSRZST2U.js.map → executor-WWM3DD4P.js.map} +0 -0
- /package/dist/{export-accessible-RAOJAAU5.js.map → export-accessible-RLHU5G4W.js.map} +0 -0
- /package/dist/{extract-partition-JD5CUSTG.js.map → extract-partition-QII2EDCS.js.map} +0 -0
- /package/dist/{fanout-sidecar-L7NHPIOC.js.map → fanout-sidecar-BO67PCPO.js.map} +0 -0
- /package/dist/{find-JRN4RNQ5.js.map → find-6M7GYDUZ.js.map} +0 -0
- /package/dist/{issue-YIVBZUTH.js.map → issue-LPEEEMPP.js.map} +0 -0
- /package/dist/{ledger-5ZMGE44K.js.map → ledger-MSJGWKGW.js.map} +0 -0
- /package/dist/{liberate-WZSZM2W6.js.map → liberate-LEKDYKTC.js.map} +0 -0
- /package/dist/{link-set-MFXC24VK.js.map → link-set-QXXSPPHL.js.map} +0 -0
- /package/dist/{managed-secret-MFTFT22X.js.map → managed-secret-VSK7ANQI.js.map} +0 -0
- /package/dist/{migrate-cek-DZRFFOHW.js.map → migrate-cek-GEBFYBDC.js.map} +0 -0
- /package/dist/{noydb-ITIGNKUF.js.map → noydb-F2AUF6KL.js.map} +0 -0
- /package/dist/{pod-handle-A3LET7NO.js.map → pod-handle-YE7CT66T.js.map} +0 -0
- /package/dist/{post-register-7ND27CF2.js.map → post-register-QC5TEAW3.js.map} +0 -0
- /package/dist/{register-DT5HZ2LZ.js.map → register-SN72QALV.js.map} +0 -0
- /package/dist/{registry-BHRZGZHF.js.map → registry-253FF7C6.js.map} +0 -0
- /package/dist/{registry-ET6ZFFWA.js.map → registry-3AZWQTDT.js.map} +0 -0
- /package/dist/{registry-HXFGLGTG.js.map → registry-7UEBTHWG.js.map} +0 -0
- /package/dist/{registry-THCPDEOD.js.map → registry-IVJ67NFQ.js.map} +0 -0
- /package/dist/{request-withdrawal-AV2MJJKY.js.map → request-withdrawal-UKVJZKX2.js.map} +0 -0
- /package/dist/{reveal-B2TLP4JQ.js.map → reveal-YQTRNQFH.js.map} +0 -0
- /package/dist/{revoke-6DWIEOCV.js.map → revoke-G2KXJQA5.js.map} +0 -0
- /package/dist/{signer-MHGW3OIL.js.map → signer-IUIYR3CX.js.map} +0 -0
- /package/dist/{stale-6GCFMOOR.js.map → stale-SKV33PBU.js.map} +0 -0
- /package/dist/{storage-BYN5LO6Z.js.map → storage-NPBYP2SM.js.map} +0 -0
- /package/dist/{store-coordination-provider-C4BPT5XF.js.map → store-coordination-provider-Z6HKPOGM.js.map} +0 -0
- /package/dist/{verify-UKALW7C2.js.map → verify-KWQIWLGH.js.map} +0 -0
- /package/dist/{walk-4VPK7AS4.js.map → walk-F4OLXI5H.js.map} +0 -0
- /package/dist/{withdraw-accessible-HL7GACUE.js.map → withdraw-accessible-ZKPLZ66E.js.map} +0 -0
|
@@ -85,17 +85,6 @@ export interface UnlockedKeyring {
|
|
|
85
85
|
}
|
|
86
86
|
/** Mint a fresh wrapped-canary string. Deterministic for a given KEK. */
|
|
87
87
|
export declare function mintKeyringCanary(kek: EnclaveKey): Promise<string>;
|
|
88
|
-
/**
|
|
89
|
-
* The vault roster key held by this keyring, or `null` when the keyring
|
|
90
|
-
* carries none.
|
|
91
|
-
*
|
|
92
|
-
* Null is expected on the resume-style paths (`kek: null` sessions, tier-3
|
|
93
|
-
* PIN resume, plaintext mode) — none of which may write a keyring file.
|
|
94
|
-
* Every stamping site null-guards this exactly as it guards `kek`: minting a
|
|
95
|
-
* file without a verifiable `roster_tag` would be worse than refusing, since
|
|
96
|
-
* it is indistinguishable on the next load from a store having stripped it.
|
|
97
|
-
*/
|
|
98
|
-
export declare function rosterKeyOf(keyring: UnlockedKeyring): EnclaveKey | null;
|
|
99
88
|
/**
|
|
100
89
|
* Shared wording for the stamping-site guards — mirrors the `kek` guard's shape.
|
|
101
90
|
* Exported so every roster-stamping site in the hub raises ONE error with one
|
|
@@ -120,6 +109,7 @@ export interface LoadKeyringOptions {
|
|
|
120
109
|
*/
|
|
121
110
|
export declare function deriveKekForKeyring(file: KeyringFile, secret: string | EchoSecretParts, salt: Uint8Array): Promise<EnclaveKey>;
|
|
122
111
|
/** Parse a raw keyring envelope. Single sanctioned reader of `_data` for keyring files. */
|
|
112
|
+
/** Parse a keyring envelope's body. Exported for `keyring-mirror.ts` (core#75) — the one non-crypto reader. */
|
|
123
113
|
export declare function parseKeyringEnvelope(envelope: EncryptedEnvelope): KeyringFile;
|
|
124
114
|
/** Fetch + parse a user's keyring file; undefined when the row is missing. */
|
|
125
115
|
export declare function readKeyringFile(store: NoydbStore, vault: string, userId: string): Promise<{
|
|
@@ -513,16 +503,6 @@ export declare function listUsersWithEnvelopes<T = unknown>(store: NoydbStore, v
|
|
|
513
503
|
envelope: UserEnvelope<T> | null;
|
|
514
504
|
}>>;
|
|
515
505
|
export declare function ensureCollectionDEK(store: NoydbStore, vault: string, keyring: UnlockedKeyring): Promise<(collectionName: string) => Promise<EnclaveKey>>;
|
|
516
|
-
/**
|
|
517
|
-
* The `Permissions` catch-all key (#1010). `Permissions` has always documented
|
|
518
|
-
* `'*'` as "the wildcard collection matching all collections in the vault", but
|
|
519
|
-
* nothing expanded it — a grantee handed the documented catch-all got no keys
|
|
520
|
-
* at all. It is honoured in three places, and they must agree: the DEK wrapping
|
|
521
|
-
* in `grant()`, and both permission checks below.
|
|
522
|
-
*/
|
|
523
|
-
export declare const PERMISSION_WILDCARD = "*";
|
|
524
|
-
/** Does this permission map hand over the whole vault? */
|
|
525
|
-
export declare function permissionsAreWildcard(permissions: Permissions | undefined): boolean;
|
|
526
506
|
/** Check if a user has write permission for a collection. */
|
|
527
507
|
export declare function hasWritePermission(keyring: UnlockedKeyring, collectionName: string): boolean;
|
|
528
508
|
/** Check if a user has any access to a collection. */
|
|
@@ -54,7 +54,17 @@ import { type EnclaveKey } from '../../capsule/index.js';
|
|
|
54
54
|
export declare const MAGIC_LINK_GRANTS_COLLECTION = "_magic_link_grants";
|
|
55
55
|
/** HKDF `info` for the AES-GCM content key. Version-namespaced. */
|
|
56
56
|
export declare const MAGIC_LINK_CONTENT_INFO_PREFIX = "noydb-magic-link-content-v1:";
|
|
57
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* HKDF `info` for the AES-KW KEK. Matches `@noy-db/on-magic-link`.
|
|
59
|
+
*
|
|
60
|
+
* No importer inside hub, and that is not a defect: this is one half of a
|
|
61
|
+
* CROSS-PACKAGE protocol constant. The satellite derives the same KEK from
|
|
62
|
+
* the same string, so the value has to be stated here to be reviewable
|
|
63
|
+
* against it. Deleting it would leave the wire format pinned in one repo
|
|
64
|
+
* only (#55).
|
|
65
|
+
*
|
|
66
|
+
* @seam
|
|
67
|
+
*/
|
|
58
68
|
export declare const MAGIC_LINK_KEK_INFO_PREFIX = "noydb-magic-link-v1:";
|
|
59
69
|
/**
|
|
60
70
|
* Decrypted payload of a magic-link grant record. Mirrors
|
|
@@ -53,6 +53,11 @@ export interface TeamFacadeDeps {
|
|
|
53
53
|
getKeyringInternal(vault: string, opts?: {
|
|
54
54
|
create: boolean;
|
|
55
55
|
}): Promise<UnlockedKeyring>;
|
|
56
|
+
/** core#73 — re-enrol a recovered member with the broker host (kernel-resident; no-op without a broker). */
|
|
57
|
+
enrolBrokerMember(vault: string, member: {
|
|
58
|
+
readonly userId: string;
|
|
59
|
+
readonly secret: string;
|
|
60
|
+
}): Promise<void>;
|
|
56
61
|
/** Managed-recovery enrolment check (kernel-resident). */
|
|
57
62
|
assertRecoveryEnrolled(vault: string, policy: VaultPolicy, opts?: {
|
|
58
63
|
skipManagedCheck?: boolean;
|
|
@@ -25,17 +25,19 @@
|
|
|
25
25
|
/** Reserved collection holding per-adapter sync transport secrets. */
|
|
26
26
|
export declare const SYNC_CREDENTIALS_COLLECTION = "_sync_credentials";
|
|
27
27
|
/**
|
|
28
|
-
* Reserved
|
|
29
|
-
*
|
|
30
|
-
* handle nor grant propagation can ever expose it before its dedicated,
|
|
31
|
-
* role-gated API lands.
|
|
28
|
+
* Reserved collection holding the credential broker's SHARED seed (#479):
|
|
29
|
+
* one record per `brokerId`, owner/admin only.
|
|
32
30
|
*/
|
|
33
31
|
export declare const BROKER_COLLECTION = "_broker";
|
|
34
32
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* `
|
|
33
|
+
* Reserved collection holding each MEMBER's own broker seed (core#73): one
|
|
34
|
+
* record per `userId`, each encrypted under a DEK minted for that grantee
|
|
35
|
+
* alone at `grant()` time. Secret-bearing like `_broker`, with one twist the
|
|
36
|
+
* propagation loops must honour: the grantor never HOLDS this DEK (it is
|
|
37
|
+
* per-grantee, minted and wrapped in one step), so there is nothing to
|
|
38
|
+
* withhold — the guard exists so the name can never be served by
|
|
39
|
+
* `vault.collection()`.
|
|
38
40
|
*/
|
|
39
|
-
export declare const
|
|
41
|
+
export declare const BROKER_MEMBER_COLLECTION = "_broker_member";
|
|
40
42
|
/** True when `name` is a secret-bearing reserved collection. */
|
|
41
43
|
export declare function isSecretBearingReservedCollection(name: string): boolean;
|
|
@@ -44,7 +44,7 @@ export interface RosterTag {
|
|
|
44
44
|
readonly iv: string;
|
|
45
45
|
readonly data: string;
|
|
46
46
|
}
|
|
47
|
-
export type RosterAuthorityFields = Pick<KeyringFile, 'user_id' | 'role' | 'permissions' | 'granted_by' | 'expires_at' | 'export_capability' | 'import_capability' | 'deks' | 'pending_deks' | 'roster_epoch'>;
|
|
47
|
+
export type RosterAuthorityFields = Pick<KeyringFile, 'user_id' | 'role' | 'permissions' | 'granted_by' | 'expires_at' | 'export_capability' | 'import_capability' | 'deks' | 'pending_deks' | 'roster_epoch' | 'clearance'>;
|
|
48
48
|
export declare function rosterCanonical(file: RosterAuthorityFields): string;
|
|
49
49
|
export declare function mintRosterTag(file: RosterAuthorityFields, rosterKey: EnclaveKey): Promise<RosterTag>;
|
|
50
50
|
/**
|
|
@@ -99,3 +99,44 @@ export declare function assertRosterAuthenticated(file: KeyringFile, deks: Reado
|
|
|
99
99
|
* the point of the mechanism.
|
|
100
100
|
*/
|
|
101
101
|
export declare function assertRosterTagValid(file: KeyringFile, rosterKey: EnclaveKey, userId: string): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* ⚠️ MOVED HERE from `roster-epoch.ts` (core#58), and the move is the point.
|
|
104
|
+
*
|
|
105
|
+
* That module carries an output-domain invariant — every function it exports
|
|
106
|
+
* must reach a published entry point — because its CALLER API
|
|
107
|
+
* (`assertRosterEpochCurrent`) once shipped reachable from nowhere (#1097).
|
|
108
|
+
* `stampAuthority` is writer-side plumbing and has no business on the published
|
|
109
|
+
* surface, so satisfying that invariant by exporting it would have been the
|
|
110
|
+
* wrong repair.
|
|
111
|
+
*
|
|
112
|
+
* It belongs here regardless: it stamps the derived fields that
|
|
113
|
+
* `rosterCanonical` below BINDS, and the two must change together. Adding a
|
|
114
|
+
* derived field means editing both functions in this one file.
|
|
115
|
+
*/
|
|
116
|
+
/**
|
|
117
|
+
* Stamp a keyring's authority half with BOTH derived fields at once — the next
|
|
118
|
+
* roster epoch and the advisory clearance (core#58).
|
|
119
|
+
*
|
|
120
|
+
* ## Why one helper and not two call sites
|
|
121
|
+
*
|
|
122
|
+
* There are thirteen places that build a `KeyringFile`'s authority half, across
|
|
123
|
+
* `keyring.ts`, `rotate-recover.ts`, `peer-recover.ts`, `custody/liberate.ts`
|
|
124
|
+
* and `with-cargo/adopt-partition.ts`. Every one of them must stamp every
|
|
125
|
+
* derived field, or the field FLICKERS: present after a grant, absent after the
|
|
126
|
+
* next rotate or partition adopt, with no error anywhere.
|
|
127
|
+
*
|
|
128
|
+
* ⛔ That is not a hypothetical — it is the exact failure `clearance` already
|
|
129
|
+
* had in a weaker form, and adding a fourteenth call site is how it would come
|
|
130
|
+
* back. **Adding a derived field means adding it HERE**, which makes covering
|
|
131
|
+
* all thirteen sites the default rather than a thing to remember.
|
|
132
|
+
*
|
|
133
|
+
* `clearance` is derived from the DEK slot names in the very object being
|
|
134
|
+
* stamped, so it cannot disagree with them; see `keyringClearance` for why it
|
|
135
|
+
* is advisory and must stay so.
|
|
136
|
+
*/
|
|
137
|
+
export declare function stampAuthority<T extends {
|
|
138
|
+
readonly deks?: Record<string, string>;
|
|
139
|
+
}>(authority: T, previousEpoch: number | undefined): T & {
|
|
140
|
+
roster_epoch: number;
|
|
141
|
+
clearance: number;
|
|
142
|
+
};
|
|
@@ -21,12 +21,43 @@ import type { UnlockedKeyring } from './keyring.js';
|
|
|
21
21
|
import { dekKey } from '../../kernel/tier-visibility.js';
|
|
22
22
|
export { dekKey };
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* The user's effective clearance for ONE collection: the maximum tier for which
|
|
25
|
+
* their keyring holds a DEK. `0` when only the tier-0 DEK is held (or none —
|
|
26
|
+
* the `getDEK` caller raises separately).
|
|
27
|
+
*
|
|
28
|
+
* Takes DEK SLOT NAMES rather than an `UnlockedKeyring` (core#58), because the
|
|
29
|
+
* callers that need this are the ones BUILDING a `KeyringFile`, where the slot
|
|
30
|
+
* names exist and an unlocked keyring may not. Not published from any entry, so
|
|
31
|
+
* the signature is free to say what it means.
|
|
32
|
+
*
|
|
33
|
+
* ⚠️ `kernel/vault.ts`'s `elevate()` scan is NOT this predicate: that asks
|
|
34
|
+
* whether ANY collection has a DEK at ONE tier (`#N` suffix match); this asks
|
|
35
|
+
* the MAXIMUM tier for ONE collection (`name#` prefix match).
|
|
36
|
+
*/
|
|
37
|
+
export declare function effectiveClearance(dekSlots: Iterable<string>, collection: string): number;
|
|
38
|
+
/**
|
|
39
|
+
* The whole keyring's clearance: the highest tier held for ANY collection.
|
|
40
|
+
*
|
|
41
|
+
* ## What this is, and the one thing it must never become (core#58)
|
|
42
|
+
*
|
|
43
|
+
* This is the value persisted as `KeyringFile.clearance`. It is **derived**,
|
|
44
|
+
* not independent — a pure function of the DEK slot names written into the same
|
|
45
|
+
* file — and that is deliberate on two counts:
|
|
46
|
+
*
|
|
47
|
+
* 1. `dek_slots` is already bound into the roster tag (#1115), so a clearance
|
|
48
|
+
* computed from it carries no authority the tag does not already cover. A
|
|
49
|
+
* store that forges one contradicts data it cannot forge.
|
|
50
|
+
* 2. Being derived at every write is what stops it drifting. A value computed
|
|
51
|
+
* once at grant time and carried forward goes stale the moment a tier DEK
|
|
52
|
+
* is added or revoked.
|
|
53
|
+
*
|
|
54
|
+
* ⛔ **It is ADVISORY and must stay advisory.** The real check is whether the
|
|
55
|
+
* DEK map carries a `collection#tier` entry — `assertTierAccess` is the gate,
|
|
56
|
+
* and access in this system IS the key. Never branch a privilege decision on
|
|
57
|
+
* this number: it would be a second, weaker representation of access sitting
|
|
58
|
+
* beside the authoritative one, which is how the two come to disagree.
|
|
28
59
|
*/
|
|
29
|
-
export declare function
|
|
60
|
+
export declare function keyringClearance(dekSlots: Iterable<string>): number;
|
|
30
61
|
/**
|
|
31
62
|
* Assert the caller is cleared for the requested tier. Owners and
|
|
32
63
|
* admins always pass (they can mint any new tier DEK on demand);
|
|
@@ -608,6 +608,8 @@ export declare class BlobSet {
|
|
|
608
608
|
shredded: string[];
|
|
609
609
|
retainedShared: string[];
|
|
610
610
|
residue: string[];
|
|
611
|
+
/** #28 — the eTag half of `residue` alone: the join key to `compact()`'s sweep. */
|
|
612
|
+
residueETags: string[];
|
|
611
613
|
}>;
|
|
612
614
|
/**
|
|
613
615
|
* Resolve a SHRED `BlobIntent` for this record, or `null` when the entry
|
|
@@ -1294,6 +1296,27 @@ export declare class BlobSet {
|
|
|
1294
1296
|
* and "its attachments are released" are one operation. Ungated: the record
|
|
1295
1297
|
* delete itself already passed the gate bus. Ref-counted like any release —
|
|
1296
1298
|
* content another record still holds survives.
|
|
1299
|
+
*
|
|
1300
|
+
* ⛔ RELEASE IS NOT ERASURE, AND THE API CANNOT TELL YOU WHICH YOU GOT
|
|
1301
|
+
* (noy-db/core#28). Releasing the slot is unconditional; when the BYTES
|
|
1302
|
+
* leave the store depends on the collection's key mode:
|
|
1303
|
+
*
|
|
1304
|
+
* - `perRecordKeys: true` — crypto-shredded on the spot at refCount 0.
|
|
1305
|
+
* - legacy (shared DEK) — chunks RETAINED under the collection DEK until
|
|
1306
|
+
* `vault.compact({ reclaimLegacyBlobs: true })` runs (#1453).
|
|
1307
|
+
*
|
|
1308
|
+
* Both give the caller the same `null` from `blob(id).get(slot)`, and the
|
|
1309
|
+
* record, the slot list and the store listing all agree it is gone — so
|
|
1310
|
+
* every signal a consumer has says "erased" while the ciphertext is still
|
|
1311
|
+
* on disk, recoverable by anyone holding the DEK. pilot-1 measured exactly
|
|
1312
|
+
* this (chunks 2 → 2 on delete) and reasonably read the deferral as a
|
|
1313
|
+
* broken cascade.
|
|
1314
|
+
*
|
|
1315
|
+
* ⭐ So: if a delete is meant to ERASE — a subject-access request, a
|
|
1316
|
+
* retention policy — either put the blobs on a `perRecordKeys` collection
|
|
1317
|
+
* or run the reclaim pass, and assert on `compact()`'s
|
|
1318
|
+
* `unreferencedLegacyBlobs.reclaimed`, never on the null read. The seam is
|
|
1319
|
+
* pinned in `__tests__/1451-delete-releases-blobs.test.ts`.
|
|
1297
1320
|
*/
|
|
1298
1321
|
releaseAll(): Promise<void>;
|
|
1299
1322
|
/** The body of {@link delete}, minus the owner gate. */
|
|
@@ -26,6 +26,22 @@ export interface UnreferencedLegacyBlobReport {
|
|
|
26
26
|
readonly chunks: number;
|
|
27
27
|
/** How many of those blobs this run deleted (chunks first, then the index row). */
|
|
28
28
|
readonly reclaimed: number;
|
|
29
|
+
/**
|
|
30
|
+
* #28 — the eTags this run actually deleted, so a deferred erasure set can be
|
|
31
|
+
* reconciled against the reclaim that finished it:
|
|
32
|
+
*
|
|
33
|
+
* ```ts
|
|
34
|
+
* const still = before.blobResidueETags.filter((e) => !report.reclaimedETags.includes(e))
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* ⛔ DO NOT PERSIST. An eTag is a content hash — see
|
|
38
|
+
* `ForgetResult.blobResidueETags` for why a stored receipt of them is a
|
|
39
|
+
* re-identification oracle. Reconcile in memory, persist the verdict.
|
|
40
|
+
*
|
|
41
|
+
* Empty on a `dryRun` (nothing was deleted), even though `blobs`/`chunks`
|
|
42
|
+
* still count what WOULD be.
|
|
43
|
+
*/
|
|
44
|
+
readonly reclaimedETags: readonly string[];
|
|
29
45
|
}
|
|
30
46
|
export declare function sweepUnreferencedLegacyBlobs(ctx: {
|
|
31
47
|
adapter: NoydbStore;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* @module
|
|
12
12
|
*/
|
|
13
13
|
import type { FieldMeta } from './field-meta.js';
|
|
14
|
-
import {
|
|
14
|
+
import { schemaFieldKeys } from './field-meta.js';
|
|
15
15
|
export { schemaFieldKeys };
|
|
16
16
|
import type { CollectionMeta } from './meta.js';
|
|
17
17
|
import type { ViaDescriptor, ViaPosture } from '../../kernel/via/index.js';
|
|
@@ -275,7 +275,6 @@ export interface BuildDescriptionInput {
|
|
|
275
275
|
*/
|
|
276
276
|
readonly fieldIds?: Record<string, string> | undefined;
|
|
277
277
|
}
|
|
278
|
-
export { FieldMetaUnknownFieldError };
|
|
279
278
|
/**
|
|
280
279
|
* Pure assembler: no I/O, no side effects.
|
|
281
280
|
* Builds a {@link CollectionDescription} from the collection's in-memory config.
|
|
@@ -13,6 +13,7 @@ export type { VaultIntrospectState } from './walk.js';
|
|
|
13
13
|
export { jsonSchemaToFields } from './fields.js';
|
|
14
14
|
export type { SchemaIntrospection } from './types.js';
|
|
15
15
|
export type { FieldMeta, SemanticType } from './field-meta.js';
|
|
16
|
+
export { FieldMetaUnknownFieldError } from './field-meta.js';
|
|
16
17
|
export type { CollectionDescription, DescribedField, DescribeOptions } from './describe.js';
|
|
17
18
|
export type { StandardSchemaV1Issue } from '../../kernel/schema.js';
|
|
18
19
|
export { applyListProjection } from './projection.js';
|
|
@@ -174,7 +174,7 @@ export interface InternalCollectionStats {
|
|
|
174
174
|
* documentation gate switching to the live report passes VACUOUSLY on a hub
|
|
175
175
|
* too old to answer. Measured by a consumer attempting that adoption.
|
|
176
176
|
*/
|
|
177
|
-
|
|
177
|
+
type SnapshotReport = 'via' | 'stats';
|
|
178
178
|
export interface VaultSchemaSnapshot {
|
|
179
179
|
readonly _noydb_snapshot: 2;
|
|
180
180
|
/**
|
|
@@ -209,3 +209,4 @@ export interface DumpSchemaOptions {
|
|
|
209
209
|
/** Sample N records per collection lacking a persisted/live schema. Default 50. `0` disables sampling. */
|
|
210
210
|
readonly sampleSize?: number;
|
|
211
211
|
}
|
|
212
|
+
export {};
|
|
@@ -18,6 +18,13 @@ export interface FenceDoc {
|
|
|
18
18
|
*/
|
|
19
19
|
readonly schemaHash?: string;
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* `FENCE_RECORD_ID` — PUBLISHED API, reachable from @noy-db/hub, @noy-db/hub/cover. Flagged as unused because
|
|
23
|
+
* nothing inside hub imports it from this module; a consumer does. Do not narrow
|
|
24
|
+
* or delete without a seam change (#55).
|
|
25
|
+
*
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
21
28
|
export declare const FENCE_RECORD_ID = "schema-fence";
|
|
22
29
|
export declare const DEFAULT_FENCE: FenceDoc;
|
|
23
30
|
export declare function loadFence(store: NoydbStore, vault: string): Promise<FenceDoc>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NoydbStore, DirtyEntry, ConflictStrategy, CollectionConflictResolver, PushOptions, PullOptions, PushResult, PullResult, SyncStatus, SyncTargetRole } from '../kernel/types.js';
|
|
1
|
+
import type { NoydbStore, DirtyEntry, ConflictStrategy, CollectionConflictResolver, PushOptions, PullOptions, PushResult, PullResult, SyncStatus, SyncTargetRole, RealignResult } from '../kernel/types.js';
|
|
2
2
|
import type { MergeAuthority } from '../port/with/merge-authority.js';
|
|
3
3
|
import { type PeriodPullSource } from './period-scope.js';
|
|
4
4
|
import type { NoydbEventEmitter } from '../kernel/events.js';
|
|
@@ -89,11 +89,27 @@ export declare class SyncEngine {
|
|
|
89
89
|
private periodPullSource?;
|
|
90
90
|
/** Wire the period-window source (#807). Same injection pattern as `setReservedLookupSource`. */
|
|
91
91
|
setPeriodPullSource(source: PeriodPullSource): void;
|
|
92
|
+
/** core#82 — when a pull replaces the caller's OWN keyring file, the vault reloads it in place. */
|
|
93
|
+
private rosterReload?;
|
|
94
|
+
/** Wire the roster-reload seam (core#82). Same injection pattern as `setCacheInvalidator`. */
|
|
95
|
+
setRosterReload(seam: {
|
|
96
|
+
userId: string;
|
|
97
|
+
reload: () => Promise<void>;
|
|
98
|
+
}): void;
|
|
99
|
+
/** core#81 — the running sync's latest progress sample; `null` when idle. Read by `status()`. */
|
|
100
|
+
private inFlight;
|
|
101
|
+
private progressLastEmit;
|
|
102
|
+
private progressLastRecords;
|
|
103
|
+
/** Emit `sync:progress` no more than every 25 records or ~250 ms; `force` for the final sample. */
|
|
104
|
+
private progress;
|
|
105
|
+
private progressDone;
|
|
92
106
|
/** #807: KPI accumulator `applyRemote` feeds during a period-scoped `pull()` — pointed at the
|
|
93
107
|
* active phase's counters (summaries → records) and cleared before pull returns. Approximate
|
|
94
108
|
* by design: a push interleaved mid-pull on the same engine would attribute its converge
|
|
95
109
|
* applies to the open phase; the counters are a download-budget KPI, not an audit source. */
|
|
96
110
|
private pullByteSink;
|
|
111
|
+
/** core#81 — ciphertext bytes applied by the running pull, for `sync:progress`. */
|
|
112
|
+
private pullBytes;
|
|
97
113
|
constructor(opts: {
|
|
98
114
|
local: NoydbStore;
|
|
99
115
|
remote: NoydbStore;
|
|
@@ -181,6 +197,19 @@ export declare class SyncEngine {
|
|
|
181
197
|
*/
|
|
182
198
|
private recordOutcome;
|
|
183
199
|
/** Get current sync status. */
|
|
200
|
+
/**
|
|
201
|
+
* core#82 — re-align a CORRUPTED local from the target. An ordinary pull
|
|
202
|
+
* cannot repair a damaged local envelope: it keeps its `_v`, so it wins
|
|
203
|
+
* (or ties) against the target's healthy copy. Here every local
|
|
204
|
+
* user-collection envelope is verified with the same `MergeAuthority`
|
|
205
|
+
* check pull runs on remote envelopes; one that fails is replaced by the
|
|
206
|
+
* target's copy when THAT verifies, and the dirty log is dropped (a dirty
|
|
207
|
+
* entry over a damaged record would push the damage). Records at a tier
|
|
208
|
+
* the caller holds no key for pass unverified, as in pull — this repairs
|
|
209
|
+
* what the caller can read. Requires a `MergeAuthority` (a vault-attached
|
|
210
|
+
* engine on an encrypted vault).
|
|
211
|
+
*/
|
|
212
|
+
realign(): Promise<RealignResult>;
|
|
184
213
|
status(): SyncStatus;
|
|
185
214
|
/** Start auto-sync: listen for online/offline events, optional periodic sync. */
|
|
186
215
|
startAutoSync(intervalMs?: number): void;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reserved-record replication between two stores (core#75, core#83, core#82).
|
|
3
|
+
*
|
|
4
|
+
* `loadAll()` skips every `_`-prefixed collection, so nothing reserved
|
|
5
|
+
* travels through a sync target unless it is named here. `_keyring` was the
|
|
6
|
+
* first (core#75): a target was never a full replica — a device that lost
|
|
7
|
+
* its local store re-opened by MINTING a new owner keyring whose DEKs open
|
|
8
|
+
* nothing, and a granted member could not open on their own device at all.
|
|
9
|
+
* The invite audit doc was the second (core#83): `acceptInvite` refuses
|
|
10
|
+
* without it, by design, so magic-link onboarding onto a fresh sync-peer
|
|
11
|
+
* device was closed.
|
|
12
|
+
*
|
|
13
|
+
* ## Declared, never blanket
|
|
14
|
+
*
|
|
15
|
+
* `_meta` mixes VAULT state (deed, adoption, recovery docs, invite audit
|
|
16
|
+
* docs) with DEVICE/SESSION state (`schema-fence`, the pod `handle`) that
|
|
17
|
+
* must never reach another device — a replicated fence would break every
|
|
18
|
+
* other device's cutover. So replication is a declared set of
|
|
19
|
+
* `(collection, id prefix)` rules, each with its own ordering, and a
|
|
20
|
+
* reserved record travels only when a rule names it. The decision per
|
|
21
|
+
* collection, written down (core#82):
|
|
22
|
+
*
|
|
23
|
+
* | collection | rule | why |
|
|
24
|
+
* |---|---|---|
|
|
25
|
+
* | `_keyring` | higher `roster_epoch` wins | the roster; replay-anchored by #1097 |
|
|
26
|
+
* | `_meta/invite-audit-*` | higher `_v` wins | single-use evidence for magic links (core#83) |
|
|
27
|
+
* | `_users` | higher `_v` wins | the directory's user envelopes; a member app renders these |
|
|
28
|
+
* | `_delegations` | higher `_v` wins | delegation tokens; revocation is a delete |
|
|
29
|
+
* | `_history`, `_ledger` | NOT replicated | per-device evidence: the ledger is a hash chain per writer, two devices appending would fork it; `vault.at(T)` runs where history lives |
|
|
30
|
+
* | `_sync` | NOT replicated | this device's dirty log and watermarks |
|
|
31
|
+
* | `_meta/schema-fence`, `_meta/handle`, other `_meta` | NOT replicated | session and instance state; the rest of `_meta` is decided one id at a time |
|
|
32
|
+
*
|
|
33
|
+
* DEK-free by construction: every rule compares a field the mover can read
|
|
34
|
+
* without a key — `roster_epoch` (plaintext JSON on purpose, #1097, read
|
|
35
|
+
* through `team/keyring.ts`'s parser) or the envelope's `_v`.
|
|
36
|
+
*
|
|
37
|
+
* ## The one rule, both directions
|
|
38
|
+
*
|
|
39
|
+
* **The candidate wins when it supersedes; the absent side receives; equal
|
|
40
|
+
* is a no-op.** For `_keyring`, a file with no epoch (pre-#1097) never
|
|
41
|
+
* overwrites one that has an epoch. Why an ordering and not bytes: a device
|
|
42
|
+
* holding a STALE copy (epoch 3, or `_v` 1) must not push it over the newer
|
|
43
|
+
* one (epoch 4, `_v` 2) — byte-difference alone would re-introduce exactly
|
|
44
|
+
* the replay the ordering exists to anchor.
|
|
45
|
+
*
|
|
46
|
+
* ## Deletion
|
|
47
|
+
*
|
|
48
|
+
* A revocation (keyring, delegation, user envelope) deletes the record on
|
|
49
|
+
* the acting device and is pushed through the dirty log as
|
|
50
|
+
* `(collection, id, 'delete')`. On PULL, a record the remote lacks and the
|
|
51
|
+
* local holds is deleted locally only when (a) the remote carries at least
|
|
52
|
+
* one record of that collection — a target never pushed to is not evidence
|
|
53
|
+
* of revocation — and (b) no dirty entry protects it (a grant made offline,
|
|
54
|
+
* not yet pushed). Invite audit docs are never deleted; revocation is a
|
|
55
|
+
* field update, which the `_v` rule carries.
|
|
56
|
+
*/
|
|
57
|
+
import type { NoydbStore } from '../kernel/types.js';
|
|
58
|
+
export interface ReservedMirrorResult {
|
|
59
|
+
/** Records written to `to`. */
|
|
60
|
+
readonly copied: number;
|
|
61
|
+
/** Records deleted from `to` (pull-side revocation propagation only). */
|
|
62
|
+
readonly deleted: number;
|
|
63
|
+
/** Ids of `_keyring` files copied — the roster reload seam reads this for the caller's own file. */
|
|
64
|
+
readonly keyringsCopied: readonly string[];
|
|
65
|
+
}
|
|
66
|
+
/** The push half: mirror every declared rule from `local` to `remote`. Never deletes. */
|
|
67
|
+
export declare function pushReserved(local: NoydbStore, remote: NoydbStore, vault: string): Promise<ReservedMirrorResult>;
|
|
68
|
+
/**
|
|
69
|
+
* The pull half: mirror every declared rule from `remote` into `local`, then
|
|
70
|
+
* propagate revocations under the two guards in the module doc.
|
|
71
|
+
* `protectedIds` maps a collection to the ids a pending local dirty entry
|
|
72
|
+
* protects.
|
|
73
|
+
*
|
|
74
|
+
* Costs one `list()` per rule per pull, and nothing at all for a vault with
|
|
75
|
+
* no local keyring: an encrypted vault always holds the caller's own file
|
|
76
|
+
* after open (bootstrapped or minted), so "no local keyring" means
|
|
77
|
+
* `encrypt: false` — nothing reserved to mirror, nothing to ask.
|
|
78
|
+
*/
|
|
79
|
+
export declare function pullReserved(remote: NoydbStore, local: NoydbStore, vault: string, protectedIds: ReadonlyMap<string, ReadonlySet<string>>): Promise<ReservedMirrorResult>;
|
|
80
|
+
/**
|
|
81
|
+
* Open-path bootstrap: an EMPTY local store is not evidence of a new vault
|
|
82
|
+
* when a `sync-peer` already carries the roster. Mirror its keyring files in
|
|
83
|
+
* first; `assertKeyringOpenAllowed` then decides — own file → open, other
|
|
84
|
+
* principals only → refuse, still nothing → genuinely new. Backups are
|
|
85
|
+
* never consulted (never pulled from, #616). No-op when the local already
|
|
86
|
+
* holds any keyring. Only the roster: the rest of the declared set arrives
|
|
87
|
+
* on the first `pull()`.
|
|
88
|
+
*/
|
|
89
|
+
export declare function bootstrapKeyrings(local: NoydbStore, peer: NoydbStore | undefined, vault: string): Promise<void>;
|
|
@@ -56,6 +56,13 @@ export interface BuildSyncEngineOptions {
|
|
|
56
56
|
*/
|
|
57
57
|
export interface SyncStrategy {
|
|
58
58
|
buildSyncEngine(opts: BuildSyncEngineOptions): SyncEngine;
|
|
59
|
+
/**
|
|
60
|
+
* core#75 — open-path roster bootstrap: an EMPTY local store is not a new
|
|
61
|
+
* vault when a `sync-peer` already carries the roster. Runs inside keyring
|
|
62
|
+
* resolution, BEFORE any engine exists; the un-opted-in stub is a no-op
|
|
63
|
+
* (no sync ⇒ no target to bootstrap from).
|
|
64
|
+
*/
|
|
65
|
+
bootstrapKeyrings(local: NoydbStore, peer: NoydbStore | undefined, vault: string): Promise<void>;
|
|
59
66
|
buildSyncTransaction(vault: Vault, engine: SyncEngine): SyncTransaction;
|
|
60
67
|
buildPresence<P>(opts: PresenceHandleOpts): PresenceHandle<P>;
|
|
61
68
|
}
|
|
@@ -7,16 +7,6 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { TabChannel, Unsubscribe } from './tab-coordination.js';
|
|
9
9
|
import type { WriteEvent } from '../port/with/write-hooks.js';
|
|
10
|
-
export interface TabWriteMsg {
|
|
11
|
-
readonly kind: 'tab-write';
|
|
12
|
-
readonly writerId: string;
|
|
13
|
-
readonly vault: string;
|
|
14
|
-
readonly collection: string;
|
|
15
|
-
readonly docId: string;
|
|
16
|
-
readonly action: 'put' | 'delete';
|
|
17
|
-
readonly baseV: number;
|
|
18
|
-
readonly v: number;
|
|
19
|
-
}
|
|
20
10
|
export interface CrossTabWriteRelayOptions {
|
|
21
11
|
/** The broadcast channel (its own — distinct from the presence channel). */
|
|
22
12
|
readonly channel: TabChannel;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
freezeAndDeleteClosure,
|
|
3
|
+
freezeSnapshotOnly,
|
|
4
|
+
randomId,
|
|
5
|
+
withdrawAccessibleData
|
|
6
|
+
} from "./chunk-SNM7LSYG.js";
|
|
7
|
+
import "./chunk-55P6OBB7.js";
|
|
8
|
+
import "./chunk-RDOEOPOI.js";
|
|
9
|
+
import "./chunk-YQFBH5ZJ.js";
|
|
10
|
+
import "./chunk-GMKGGY7V.js";
|
|
11
|
+
import "./chunk-4J3MNVVX.js";
|
|
12
|
+
import "./chunk-ZBUAX4EF.js";
|
|
13
|
+
import "./chunk-SPPOUJLN.js";
|
|
14
|
+
import "./chunk-NH2UOV3B.js";
|
|
15
|
+
import "./chunk-OM3SEDI4.js";
|
|
16
|
+
import "./chunk-PUBI455O.js";
|
|
17
|
+
import "./chunk-2ELOCEXE.js";
|
|
18
|
+
import "./chunk-VSUQI5Q6.js";
|
|
19
|
+
export {
|
|
20
|
+
freezeAndDeleteClosure,
|
|
21
|
+
freezeSnapshotOnly,
|
|
22
|
+
randomId,
|
|
23
|
+
withdrawAccessibleData
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=withdraw-accessible-ZKPLZ66E.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noy-db/hub",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0-pre.0",
|
|
4
4
|
"description": "Zero-knowledge, offline-first, encrypted document store — core library with AES-256-GCM, PBKDF2, multi-user keyring, and sync engine",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "vLannaAi <vicio@lanna.ai>",
|
|
@@ -276,8 +276,8 @@
|
|
|
276
276
|
"happy-dom": "^18.0.0",
|
|
277
277
|
"zod": "^4.0.0",
|
|
278
278
|
"zod-to-json-schema": "^3.25.2",
|
|
279
|
-
"@noy-db/attestation": "0.
|
|
280
|
-
"@noy-db/shamir": "0.
|
|
279
|
+
"@noy-db/attestation": "0.9.0-pre.0",
|
|
280
|
+
"@noy-db/shamir": "0.9.0-pre.0"
|
|
281
281
|
},
|
|
282
282
|
"peerDependencies": {
|
|
283
283
|
"zod": "^3.0.0 || ^4.0.0",
|
package/dist/api-OS747DS4.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
UserApi,
|
|
3
|
-
createUserApi
|
|
4
|
-
} from "./chunk-AEQGFRU4.js";
|
|
5
|
-
import "./chunk-LIOVX5TJ.js";
|
|
6
|
-
import "./chunk-EZGV6F47.js";
|
|
7
|
-
import "./chunk-OIEO4WDL.js";
|
|
8
|
-
import "./chunk-Q2XRFWOI.js";
|
|
9
|
-
import "./chunk-NH2UOV3B.js";
|
|
10
|
-
import "./chunk-42ALPZ2B.js";
|
|
11
|
-
import "./chunk-QMWY2FDS.js";
|
|
12
|
-
import "./chunk-SV2PM2OY.js";
|
|
13
|
-
import "./chunk-37EPTBBR.js";
|
|
14
|
-
export {
|
|
15
|
-
UserApi,
|
|
16
|
-
createUserApi
|
|
17
|
-
};
|
|
18
|
-
//# sourceMappingURL=api-OS747DS4.js.map
|