@noy-db/hub 0.8.0 → 0.9.0-pre.1
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 +49 -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-6EFD43KN.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-RJBFQSHE.js} +92 -31
- package/dist/backup-RJBFQSHE.js.map +1 -0
- 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/crypto.d.ts +18 -0
- package/dist/capsule/enclave-aes/index.d.ts +3 -3
- package/dist/capsule/enclave-aes/index.js +46 -14
- package/dist/capsule/enclave-aes/index.js.map +1 -1
- package/dist/capsule/index.d.ts +2 -2
- package/dist/capsule/plumbing/record-codec.d.ts +7 -0
- package/dist/{capsule-VOLX3QRQ.js → capsule-6LJAVQNM.js} +14 -8
- package/dist/cargo/index.js +35 -35
- package/dist/{chunk-GZT3NQRA.js → chunk-25FXU6WS.js} +8 -2
- package/dist/chunk-25FXU6WS.js.map +1 -0
- package/dist/{chunk-OYW3I5M4.js → chunk-2DOCDOPL.js} +6 -6
- package/dist/chunk-2DX4JCRI.js +1 -0
- package/dist/{chunk-FLPCETP6.js → chunk-2LBS62AC.js} +2 -2
- package/dist/{chunk-WXE4W2U6.js → chunk-2ST3WA3C.js} +4 -4
- package/dist/{chunk-DQESF6RP.js → chunk-3G3GOGZZ.js} +50 -40
- package/dist/chunk-3G3GOGZZ.js.map +1 -0
- package/dist/{chunk-O2IMQSNA.js → chunk-3YBIVLTC.js} +2 -2
- package/dist/{chunk-LGNDFRYC.js → chunk-4CFHL5RY.js} +1 -1
- package/dist/chunk-4CFHL5RY.js.map +1 -0
- package/dist/{chunk-DIZLQVAA.js → chunk-4CHM2TRS.js} +2 -2
- package/dist/{chunk-V7ADQF5O.js → chunk-4CUJLEOA.js} +4 -4
- package/dist/{chunk-3EWS67C7.js → chunk-4TG2ITRW.js} +2 -2
- package/dist/{chunk-HS554XAF.js → chunk-5HQFROZS.js} +2 -2
- package/dist/{chunk-IUBMZPHM.js → chunk-5ZVE3N5C.js} +5 -6
- package/dist/chunk-5ZVE3N5C.js.map +1 -0
- package/dist/{chunk-PP3K67AJ.js → chunk-654RE5YC.js} +3 -3
- package/dist/{chunk-FOEDQATO.js → chunk-66GD7XXU.js} +2 -2
- package/dist/{chunk-BNWA3WG5.js → chunk-72FQ46VW.js} +3 -3
- package/dist/{chunk-EYG2CY2X.js → chunk-7JPA3LIH.js} +11 -11
- package/dist/chunk-7JPA3LIH.js.map +1 -0
- package/dist/{chunk-JQYKPKG6.js → chunk-7K42TSCY.js} +4 -4
- package/dist/{chunk-BPWYQ25R.js → chunk-7Q6IU3R7.js} +4 -4
- package/dist/{chunk-BPWYQ25R.js.map → chunk-7Q6IU3R7.js.map} +1 -1
- package/dist/{chunk-T7IR4N2S.js → chunk-7UHLO4ZN.js} +37 -2
- package/dist/chunk-7UHLO4ZN.js.map +1 -0
- package/dist/{chunk-UEFOQH74.js → chunk-ADCXTW7L.js} +2 -2
- package/dist/{chunk-MBMTND6D.js → chunk-AGGPT4UE.js} +2 -2
- package/dist/{chunk-RB4DOPGZ.js → chunk-AKIEBFIJ.js} +10 -10
- package/dist/{chunk-VHBKYN2J.js → chunk-B3B6HV5S.js} +2 -2
- package/dist/{chunk-JWWYRR4Q.js → chunk-B6EWMGFX.js} +2 -2
- package/dist/{chunk-H7JBY4P7.js → chunk-B7Y2BRQA.js} +14 -14
- package/dist/chunk-B7Y2BRQA.js.map +1 -0
- package/dist/{chunk-4CIQDWRB.js → chunk-BFJE2GPP.js} +14 -8
- package/dist/{chunk-4CIQDWRB.js.map → chunk-BFJE2GPP.js.map} +1 -1
- package/dist/{chunk-WPOYWFSE.js → chunk-BJRKXNFP.js} +7 -7
- package/dist/{chunk-H427H63K.js → chunk-BPQ5CRJF.js} +2 -2
- package/dist/{chunk-VFHCKG5M.js → chunk-BVRJYMFZ.js} +3 -3
- package/dist/{chunk-244QBK7Z.js → chunk-C4XV3PSJ.js} +4 -4
- package/dist/{chunk-244QBK7Z.js.map → chunk-C4XV3PSJ.js.map} +1 -1
- package/dist/{chunk-SMV2HRDU.js → chunk-DFC4WTJW.js} +2 -2
- package/dist/{chunk-5A4345TG.js → chunk-DMIEKD24.js} +3 -3
- package/dist/{chunk-TKVUE4JF.js → chunk-DQAXA2GK.js} +9 -9
- package/dist/{chunk-AL6ML4LA.js → chunk-DWCFGF2K.js} +5 -5
- package/dist/{chunk-Y3LPTBG7.js → chunk-E2C6FFSI.js} +6 -9
- package/dist/chunk-E2C6FFSI.js.map +1 -0
- package/dist/{chunk-LNSVGRHO.js → chunk-EQ6C2ZPT.js} +17 -51
- package/dist/chunk-EQ6C2ZPT.js.map +1 -0
- package/dist/chunk-EZOFTI4K.js +60 -0
- package/dist/chunk-EZOFTI4K.js.map +1 -0
- package/dist/{chunk-PD64727P.js → chunk-FMINS2B6.js} +2 -2
- package/dist/chunk-FMINS2B6.js.map +1 -0
- package/dist/{chunk-QBLT6POL.js → chunk-FPF5HRBE.js} +2 -2
- package/dist/{chunk-UA372JHH.js → chunk-FZVCZEVI.js} +3 -3
- package/dist/chunk-FZVCZEVI.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-5WWDGFOS.js → chunk-GIQJGXV7.js} +2 -2
- package/dist/{chunk-V3RWOOSO.js → chunk-GYZICGRU.js} +4 -4
- package/dist/chunk-GYZICGRU.js.map +1 -0
- package/dist/{chunk-BVCUTXE3.js → chunk-H334G6KU.js} +2 -2
- package/dist/{chunk-AEQGFRU4.js → chunk-HE7EAHGS.js} +3 -3
- package/dist/chunk-HKB4HZDU.js +74 -0
- package/dist/chunk-HKB4HZDU.js.map +1 -0
- package/dist/{chunk-4V3Q35WG.js → chunk-ICF3TIGY.js} +3 -3
- package/dist/{chunk-3L2NBKDR.js → chunk-IF2M43G4.js} +2 -2
- package/dist/{chunk-37EPTBBR.js → chunk-IKPQ2GGB.js} +46 -4
- package/dist/chunk-IKPQ2GGB.js.map +1 -0
- package/dist/{chunk-DHHGL42E.js → chunk-IKS2CPAG.js} +27 -11
- package/dist/chunk-IKS2CPAG.js.map +1 -0
- package/dist/{chunk-3A5DUZ56.js → chunk-IMIQAGR7.js} +6 -6
- package/dist/{chunk-3A5DUZ56.js.map → chunk-IMIQAGR7.js.map} +1 -1
- package/dist/{chunk-A4XMIZT3.js → chunk-IQAJ4OR6.js} +41 -6
- package/dist/chunk-IQAJ4OR6.js.map +1 -0
- package/dist/{chunk-IUT3GWP3.js → chunk-IUD7WU67.js} +17 -93
- package/dist/chunk-IUD7WU67.js.map +1 -0
- package/dist/{chunk-AUKKUPVB.js → chunk-IVLRPRXM.js} +2 -2
- package/dist/{chunk-GUZET4SG.js → chunk-JAQHWHUN.js} +4 -4
- package/dist/chunk-JAQHWHUN.js.map +1 -0
- package/dist/{chunk-Y2RKVFKR.js → chunk-K4JSTGXT.js} +2 -2
- package/dist/{chunk-EJLV62NI.js → chunk-KN4LUMH6.js} +2 -2
- package/dist/{chunk-23D6M6VM.js → chunk-KZA3DITX.js} +4 -4
- package/dist/{chunk-E2N2T5ZO.js → chunk-L2VM64HK.js} +2 -2
- package/dist/chunk-L4UL4IAR.js +55 -0
- package/dist/chunk-L4UL4IAR.js.map +1 -0
- package/dist/{chunk-UIYESRD6.js → chunk-LUCQY3OM.js} +10 -10
- package/dist/{chunk-UIYESRD6.js.map → chunk-LUCQY3OM.js.map} +1 -1
- package/dist/{chunk-O46CHQT7.js → chunk-MAQBYBUX.js} +4 -4
- package/dist/{chunk-EZOAKKTB.js → chunk-MBPZMZVB.js} +2 -2
- package/dist/{chunk-XQRFSKYM.js → chunk-MCNNZBG7.js} +2 -2
- package/dist/{chunk-YRXFFWG4.js → chunk-MLVPMDOZ.js} +2 -2
- package/dist/{chunk-5FE75J4S.js → chunk-MMCN7TLK.js} +5 -5
- package/dist/{chunk-MXOQ5JCG.js → chunk-MRCR7ZMC.js} +686 -202
- package/dist/chunk-MRCR7ZMC.js.map +1 -0
- package/dist/{chunk-SYNY3VB5.js → chunk-NCTN2FW4.js} +2 -2
- package/dist/{chunk-4T3SE27M.js → chunk-ND6S2DKC.js} +2 -2
- package/dist/{chunk-3XJQBBZD.js → chunk-NTVKHQ3L.js} +2 -2
- package/dist/{chunk-RHVMZSUU.js → chunk-NV4OESHC.js} +1 -1
- package/dist/chunk-NV4OESHC.js.map +1 -0
- package/dist/chunk-NXQEOC3X.js +40 -0
- package/dist/chunk-NXQEOC3X.js.map +1 -0
- package/dist/{chunk-Q4UHJ5SN.js → chunk-O2VQ3K36.js} +2 -2
- 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-2GHDLTPE.js → chunk-OGKMRIIJ.js} +2 -2
- package/dist/{chunk-N7EVQD5S.js → chunk-ONZ3B5EW.js} +4 -4
- package/dist/{chunk-VKI2EB3N.js → chunk-OOPSMQX5.js} +3 -3
- package/dist/{chunk-VMV5SBE4.js → chunk-OYEBSWLE.js} +5 -5
- package/dist/{chunk-JDEYF3PJ.js → chunk-P6FATPXQ.js} +2 -2
- package/dist/chunk-P6FATPXQ.js.map +1 -0
- package/dist/{chunk-VVOLDVIR.js → chunk-PLTIJDQN.js} +2 -2
- package/dist/{chunk-OKSTSITU.js → chunk-PR7ILCIH.js} +3 -3
- package/dist/{chunk-7R2Q7CPL.js → chunk-QE3TLZ6Z.js} +7 -7
- package/dist/{chunk-G2MVBDFP.js → chunk-QFW4MYGN.js} +39 -9
- package/dist/chunk-QFW4MYGN.js.map +1 -0
- package/dist/{chunk-6QVKPHBF.js → chunk-QHG7GQKM.js} +2 -2
- package/dist/chunk-QJNAHPVT.js +91 -0
- package/dist/chunk-QJNAHPVT.js.map +1 -0
- package/dist/{chunk-LIOVX5TJ.js → chunk-QT5ITL25.js} +3 -3
- package/dist/{chunk-IMQKWR46.js → chunk-R2ZULFXU.js} +4 -5
- package/dist/chunk-R2ZULFXU.js.map +1 -0
- package/dist/{chunk-Q2XRFWOI.js → chunk-RRTQAQ3N.js} +2 -2
- package/dist/{chunk-H23XHRTT.js → chunk-RUE6TCES.js} +809 -101
- package/dist/chunk-RUE6TCES.js.map +1 -0
- package/dist/chunk-RWFQVNXR.js +24 -0
- package/dist/chunk-RWFQVNXR.js.map +1 -0
- package/dist/{chunk-2PVXF5CS.js → chunk-SALY3LIJ.js} +3 -3
- package/dist/{chunk-JOSPH3E5.js → chunk-SBAR5JQ6.js} +2 -2
- package/dist/{chunk-N7UDP5VU.js → chunk-SCH2F7R2.js} +7 -7
- package/dist/{chunk-MXKI4ABF.js → chunk-SOOAW6HK.js} +3 -3
- package/dist/{chunk-VQDZYB2B.js → chunk-T4VTRKCY.js} +3 -3
- package/dist/{chunk-VQDZYB2B.js.map → chunk-T4VTRKCY.js.map} +1 -1
- package/dist/{chunk-TEHHROZL.js → chunk-T5EXREMW.js} +5 -5
- package/dist/{chunk-M5B2W6YY.js → chunk-TDJVQTXD.js} +3 -3
- package/dist/{chunk-QMWY2FDS.js → chunk-THQ3BHLM.js} +2 -2
- package/dist/{chunk-VAORSCSU.js → chunk-TLIFNRU5.js} +2 -2
- package/dist/chunk-TLIFNRU5.js.map +1 -0
- package/dist/{chunk-FVH5QYY2.js → chunk-TRHUNPXP.js} +2 -2
- package/dist/{chunk-EGVJ7TM4.js → chunk-UL6MTRMJ.js} +8 -9
- package/dist/chunk-UL6MTRMJ.js.map +1 -0
- package/dist/chunk-UNL6YGL5.js +169 -0
- package/dist/chunk-UNL6YGL5.js.map +1 -0
- package/dist/{chunk-747G6CT3.js → chunk-UORWAG7K.js} +2 -2
- package/dist/{chunk-XSPFDUDG.js → chunk-V7AKGAXY.js} +314 -77
- package/dist/chunk-V7AKGAXY.js.map +1 -0
- package/dist/{chunk-TZZBXPZK.js → chunk-VLQ6KT7F.js} +2 -2
- package/dist/{chunk-NCO25JZO.js → chunk-VP37VUKQ.js} +4 -4
- package/dist/{chunk-52MGURXO.js → chunk-WBUHHMLN.js} +2 -2
- package/dist/{chunk-EZGV6F47.js → chunk-WRLWEYHY.js} +7 -1
- package/dist/chunk-WRLWEYHY.js.map +1 -0
- package/dist/{chunk-2MG3SW7Q.js → chunk-X6Z2SIRF.js} +2 -2
- package/dist/{chunk-U2FZNEWJ.js → chunk-XLKWF3L4.js} +8 -6
- package/dist/{chunk-U2FZNEWJ.js.map → chunk-XLKWF3L4.js.map} +1 -1
- package/dist/{chunk-5UMK7GRI.js → chunk-XPNJH7GN.js} +5 -5
- package/dist/{chunk-KZXDLBY6.js → chunk-XPW7T2GN.js} +5 -5
- package/dist/{chunk-SV2PM2OY.js → chunk-XX4R7TUB.js} +1 -1
- package/dist/chunk-XX4R7TUB.js.map +1 -0
- package/dist/{chunk-NBQ3KK6X.js → chunk-Y55XHMQB.js} +4 -4
- package/dist/chunk-Y55XHMQB.js.map +1 -0
- package/dist/{chunk-5KC7QYEC.js → chunk-YH4OUOSI.js} +33 -7
- package/dist/chunk-YH4OUOSI.js.map +1 -0
- package/dist/{chunk-FFJFE4T7.js → chunk-YJGKOSQD.js} +2 -2
- package/dist/{chunk-2AFX33YA.js → chunk-Z3STG43F.js} +3 -3
- package/dist/chunk-Z3STG43F.js.map +1 -0
- package/dist/{chunk-OIEO4WDL.js → chunk-ZD7WFMV2.js} +2 -2
- package/dist/chunk-ZD7WFMV2.js.map +1 -0
- package/dist/{chunk-42ALPZ2B.js → chunk-ZF6JECDT.js} +4 -4
- package/dist/{chunk-42ALPZ2B.js.map → chunk-ZF6JECDT.js.map} +1 -1
- package/dist/{chunk-4JPMZTJY.js → chunk-ZF7KNSLU.js} +2 -2
- package/dist/{chunk-2ODVB6LZ.js → chunk-ZGKODRGB.js} +2 -2
- package/dist/{chunk-JIBUPZHA.js → chunk-ZNEKQFGF.js} +4 -4
- package/dist/{chunk-DLD5LGDS.js → chunk-ZUTUNVFD.js} +3 -3
- package/dist/{chunk-JSMTXZR3.js → chunk-ZWMOHANW.js} +8 -6
- package/dist/chunk-ZWMOHANW.js.map +1 -0
- package/dist/{chunk-MILI22XQ.js → chunk-ZZZ4VCY2.js} +10 -10
- package/dist/chunk-ZZZ4VCY2.js.map +1 -0
- package/dist/classified/index.js +5 -5
- package/dist/{classified-marker-SIYKUU5L.js → classified-marker-WKP33U2R.js} +3 -3
- package/dist/collection-facade-COSGZKLC.js +41 -0
- package/dist/{computed-FAD7SED4.js → computed-WN6V53ZV.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-43WL3Y5H.js} +10 -10
- package/dist/debug/index.js +7 -7
- package/dist/delegation-5UWT4JGT.js +26 -0
- package/dist/derivations/index.js +24 -23
- package/dist/derive-IL5JNLEE.js +20 -0
- package/dist/directory/index.js +9 -9
- package/dist/{dispatch-JDZNGEB3.js → dispatch-LOQQD5JK.js} +20 -20
- package/dist/{dispatch-H4HV32AM.js → dispatch-SHKTG57L.js} +5 -5
- package/dist/executor-6PQ7WAGV.js +35 -0
- package/dist/executor-6ZPQA6HS.js +8 -0
- package/dist/executor-OXRA64TY.js +8 -0
- package/dist/export-accessible-XG3FKJWW.js +22 -0
- package/dist/extract-partition-33747NY5.js +35 -0
- package/dist/{fanout-sidecar-L7NHPIOC.js → fanout-sidecar-NEB6IYV7.js} +8 -8
- package/dist/find-VW543G3J.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 +15 -13
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.js +13 -13
- package/dist/index.d.ts +9 -6
- package/dist/index.js +126 -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-4ZPSY44M.js +19 -0
- package/dist/kernel/cache/index.d.ts +1 -1
- package/dist/kernel/collection.d.ts +86 -6
- package/dist/kernel/constants.d.ts +7 -0
- package/dist/kernel/errors.d.ts +42 -4
- package/dist/kernel/export-scope.d.ts +40 -0
- package/dist/kernel/merge-authority.d.ts +5 -1
- package/dist/kernel/noydb.d.ts +118 -21
- 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/rejection-seal.d.ts +13 -0
- package/dist/kernel/sync-wiring.d.ts +55 -0
- package/dist/kernel/tx-write-gate.d.ts +2 -4
- package/dist/kernel/types.d.ts +463 -14
- package/dist/kernel/validation.d.ts +0 -10
- package/dist/kernel/vault.d.ts +42 -4
- package/dist/kernel/via/reconcile.d.ts +1 -42
- package/dist/{ledger-5ZMGE44K.js → ledger-MZ25UFT2.js} +10 -10
- package/dist/liberate-OJIP2ZFX.js +25 -0
- package/dist/{link-set-MFXC24VK.js → link-set-4FRRAVTH.js} +10 -10
- package/dist/{managed-secret-MFTFT22X.js → managed-secret-SQWO2EUR.js} +9 -9
- package/dist/materialized-views/index.js +26 -26
- package/dist/{migrate-cek-DZRFFOHW.js → migrate-cek-JWEM4RP6.js} +2 -2
- package/dist/money/index.js +5 -5
- package/dist/noydb-U62OVKXB.js +100 -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 +71 -67
- package/dist/{pod-handle-A3LET7NO.js → pod-handle-R6Y4MILX.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/admission-authority.d.ts +34 -0
- package/dist/port/with/broker-strategy.d.ts +24 -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/rejection-courier.d.ts +37 -0
- package/dist/port/with/restore-host.d.ts +33 -0
- package/dist/port/with/service-bus.d.ts +20 -1
- package/dist/port/with/team-strategy.d.ts +2 -2
- package/dist/port/with/write-hooks.d.ts +2 -0
- package/dist/portability/index.js +8 -8
- package/dist/{post-register-7ND27CF2.js → post-register-GRVQHBOH.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-YJ5YLQ36.js +30 -0
- package/dist/registry-ICOHBQFD.js +8 -0
- package/dist/registry-MJ7MWCSW.js +35 -0
- package/dist/registry-MVEKKGWL.js +23 -0
- package/dist/registry-XP744FAP.js +8 -0
- package/dist/request-withdrawal-LSU4G6W3.js +28 -0
- package/dist/restore-to-DVBHAQAA.js +66 -0
- package/dist/restore-to-DVBHAQAA.js.map +1 -0
- package/dist/{reveal-B2TLP4JQ.js → reveal-AIHOIK2N.js} +7 -7
- package/dist/revoke-QUT7WWG3.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-GFLA4FCK.js} +136 -27
- package/dist/seed-GFLA4FCK.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-NYR4I3FO.js +23 -0
- package/dist/snapshots/index.js +9 -9
- package/dist/{stale-6GCFMOOR.js → stale-PIJPAL5T.js} +9 -9
- package/dist/storage-VH6SPXHC.js +21 -0
- package/dist/{store-coordination-provider-C4BPT5XF.js → store-coordination-provider-2KSHCOPU.js} +9 -9
- package/dist/sync/index.js +19 -13
- 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-PCFS4PNS.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-OZCN6LJS.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/guards/types.d.ts +2 -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 +6 -6
- package/dist/with-audit/tiers/strategy.d.ts +19 -0
- package/dist/with-cargo/extract-partition.d.ts +0 -46
- package/dist/with-commit/history/history.d.ts +16 -0
- package/dist/with-commit/history/restore-to.d.ts +40 -0
- 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 +29 -10
- package/dist/with-party/custody/strategy.d.ts +2 -2
- package/dist/with-party/policy/noydb-facade.d.ts +1 -31
- package/dist/with-party/team/delegation.d.ts +93 -7
- package/dist/with-party/team/echo-secret.d.ts +0 -2
- package/dist/with-party/team/index.d.ts +2 -0
- package/dist/with-party/team/keyring.d.ts +133 -24
- package/dist/with-party/team/magic-link-grant.d.ts +11 -1
- package/dist/with-party/team/noydb-facade.d.ts +19 -2
- 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-pod/backup.d.ts +9 -17
- 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/active.d.ts +28 -1
- package/dist/with-sync/engine.d.ts +88 -2
- package/dist/with-sync/index.d.ts +1 -0
- package/dist/with-sync/reserved-mirror.d.ts +112 -0
- package/dist/with-sync/strategy.d.ts +9 -0
- package/dist/with-sync/tab-write-relay.d.ts +0 -10
- package/dist/withdraw-accessible-MTFP7OIB.js +25 -0
- package/dist/withdraw-accessible-MTFP7OIB.js.map +1 -0
- package/package.json +3 -3
- package/dist/api-OS747DS4.js +0 -18
- package/dist/backup-YE2VQ26S.js.map +0 -1
- 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-5KC7QYEC.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-EZGV6F47.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-GZT3NQRA.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-LNSVGRHO.js.map +0 -1
- package/dist/chunk-MILI22XQ.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-T7IR4N2S.js.map +0 -1
- package/dist/chunk-UA372JHH.js.map +0 -1
- package/dist/chunk-UBSFPGVJ.js +0 -1
- package/dist/chunk-V3RWOOSO.js.map +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 +0 -102
- 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-6EFD43KN.js.map} +0 -0
- /package/dist/{capsule-VOLX3QRQ.js.map → capsule-6LJAVQNM.js.map} +0 -0
- /package/dist/{chunk-OYW3I5M4.js.map → chunk-2DOCDOPL.js.map} +0 -0
- /package/dist/{chunk-UBSFPGVJ.js.map → chunk-2DX4JCRI.js.map} +0 -0
- /package/dist/{chunk-FLPCETP6.js.map → chunk-2LBS62AC.js.map} +0 -0
- /package/dist/{chunk-WXE4W2U6.js.map → chunk-2ST3WA3C.js.map} +0 -0
- /package/dist/{chunk-O2IMQSNA.js.map → chunk-3YBIVLTC.js.map} +0 -0
- /package/dist/{chunk-DIZLQVAA.js.map → chunk-4CHM2TRS.js.map} +0 -0
- /package/dist/{chunk-V7ADQF5O.js.map → chunk-4CUJLEOA.js.map} +0 -0
- /package/dist/{chunk-3EWS67C7.js.map → chunk-4TG2ITRW.js.map} +0 -0
- /package/dist/{chunk-HS554XAF.js.map → chunk-5HQFROZS.js.map} +0 -0
- /package/dist/{chunk-PP3K67AJ.js.map → chunk-654RE5YC.js.map} +0 -0
- /package/dist/{chunk-FOEDQATO.js.map → chunk-66GD7XXU.js.map} +0 -0
- /package/dist/{chunk-BNWA3WG5.js.map → chunk-72FQ46VW.js.map} +0 -0
- /package/dist/{chunk-JQYKPKG6.js.map → chunk-7K42TSCY.js.map} +0 -0
- /package/dist/{chunk-UEFOQH74.js.map → chunk-ADCXTW7L.js.map} +0 -0
- /package/dist/{chunk-MBMTND6D.js.map → chunk-AGGPT4UE.js.map} +0 -0
- /package/dist/{chunk-RB4DOPGZ.js.map → chunk-AKIEBFIJ.js.map} +0 -0
- /package/dist/{chunk-VHBKYN2J.js.map → chunk-B3B6HV5S.js.map} +0 -0
- /package/dist/{chunk-JWWYRR4Q.js.map → chunk-B6EWMGFX.js.map} +0 -0
- /package/dist/{chunk-WPOYWFSE.js.map → chunk-BJRKXNFP.js.map} +0 -0
- /package/dist/{chunk-H427H63K.js.map → chunk-BPQ5CRJF.js.map} +0 -0
- /package/dist/{chunk-VFHCKG5M.js.map → chunk-BVRJYMFZ.js.map} +0 -0
- /package/dist/{chunk-SMV2HRDU.js.map → chunk-DFC4WTJW.js.map} +0 -0
- /package/dist/{chunk-5A4345TG.js.map → chunk-DMIEKD24.js.map} +0 -0
- /package/dist/{chunk-TKVUE4JF.js.map → chunk-DQAXA2GK.js.map} +0 -0
- /package/dist/{chunk-AL6ML4LA.js.map → chunk-DWCFGF2K.js.map} +0 -0
- /package/dist/{chunk-QBLT6POL.js.map → chunk-FPF5HRBE.js.map} +0 -0
- /package/dist/{chunk-5WWDGFOS.js.map → chunk-GIQJGXV7.js.map} +0 -0
- /package/dist/{chunk-BVCUTXE3.js.map → chunk-H334G6KU.js.map} +0 -0
- /package/dist/{chunk-AEQGFRU4.js.map → chunk-HE7EAHGS.js.map} +0 -0
- /package/dist/{chunk-4V3Q35WG.js.map → chunk-ICF3TIGY.js.map} +0 -0
- /package/dist/{chunk-3L2NBKDR.js.map → chunk-IF2M43G4.js.map} +0 -0
- /package/dist/{chunk-AUKKUPVB.js.map → chunk-IVLRPRXM.js.map} +0 -0
- /package/dist/{chunk-Y2RKVFKR.js.map → chunk-K4JSTGXT.js.map} +0 -0
- /package/dist/{chunk-EJLV62NI.js.map → chunk-KN4LUMH6.js.map} +0 -0
- /package/dist/{chunk-23D6M6VM.js.map → chunk-KZA3DITX.js.map} +0 -0
- /package/dist/{chunk-E2N2T5ZO.js.map → chunk-L2VM64HK.js.map} +0 -0
- /package/dist/{chunk-O46CHQT7.js.map → chunk-MAQBYBUX.js.map} +0 -0
- /package/dist/{chunk-EZOAKKTB.js.map → chunk-MBPZMZVB.js.map} +0 -0
- /package/dist/{chunk-XQRFSKYM.js.map → chunk-MCNNZBG7.js.map} +0 -0
- /package/dist/{chunk-YRXFFWG4.js.map → chunk-MLVPMDOZ.js.map} +0 -0
- /package/dist/{chunk-5FE75J4S.js.map → chunk-MMCN7TLK.js.map} +0 -0
- /package/dist/{chunk-SYNY3VB5.js.map → chunk-NCTN2FW4.js.map} +0 -0
- /package/dist/{chunk-4T3SE27M.js.map → chunk-ND6S2DKC.js.map} +0 -0
- /package/dist/{chunk-3XJQBBZD.js.map → chunk-NTVKHQ3L.js.map} +0 -0
- /package/dist/{chunk-Q4UHJ5SN.js.map → chunk-O2VQ3K36.js.map} +0 -0
- /package/dist/{chunk-2GHDLTPE.js.map → chunk-OGKMRIIJ.js.map} +0 -0
- /package/dist/{chunk-N7EVQD5S.js.map → chunk-ONZ3B5EW.js.map} +0 -0
- /package/dist/{chunk-VKI2EB3N.js.map → chunk-OOPSMQX5.js.map} +0 -0
- /package/dist/{chunk-VMV5SBE4.js.map → chunk-OYEBSWLE.js.map} +0 -0
- /package/dist/{chunk-VVOLDVIR.js.map → chunk-PLTIJDQN.js.map} +0 -0
- /package/dist/{chunk-OKSTSITU.js.map → chunk-PR7ILCIH.js.map} +0 -0
- /package/dist/{chunk-7R2Q7CPL.js.map → chunk-QE3TLZ6Z.js.map} +0 -0
- /package/dist/{chunk-6QVKPHBF.js.map → chunk-QHG7GQKM.js.map} +0 -0
- /package/dist/{chunk-LIOVX5TJ.js.map → chunk-QT5ITL25.js.map} +0 -0
- /package/dist/{chunk-Q2XRFWOI.js.map → chunk-RRTQAQ3N.js.map} +0 -0
- /package/dist/{chunk-2PVXF5CS.js.map → chunk-SALY3LIJ.js.map} +0 -0
- /package/dist/{chunk-JOSPH3E5.js.map → chunk-SBAR5JQ6.js.map} +0 -0
- /package/dist/{chunk-N7UDP5VU.js.map → chunk-SCH2F7R2.js.map} +0 -0
- /package/dist/{chunk-MXKI4ABF.js.map → chunk-SOOAW6HK.js.map} +0 -0
- /package/dist/{chunk-TEHHROZL.js.map → chunk-T5EXREMW.js.map} +0 -0
- /package/dist/{chunk-M5B2W6YY.js.map → chunk-TDJVQTXD.js.map} +0 -0
- /package/dist/{chunk-QMWY2FDS.js.map → chunk-THQ3BHLM.js.map} +0 -0
- /package/dist/{chunk-FVH5QYY2.js.map → chunk-TRHUNPXP.js.map} +0 -0
- /package/dist/{chunk-747G6CT3.js.map → chunk-UORWAG7K.js.map} +0 -0
- /package/dist/{chunk-TZZBXPZK.js.map → chunk-VLQ6KT7F.js.map} +0 -0
- /package/dist/{chunk-NCO25JZO.js.map → chunk-VP37VUKQ.js.map} +0 -0
- /package/dist/{chunk-52MGURXO.js.map → chunk-WBUHHMLN.js.map} +0 -0
- /package/dist/{chunk-2MG3SW7Q.js.map → chunk-X6Z2SIRF.js.map} +0 -0
- /package/dist/{chunk-5UMK7GRI.js.map → chunk-XPNJH7GN.js.map} +0 -0
- /package/dist/{chunk-KZXDLBY6.js.map → chunk-XPW7T2GN.js.map} +0 -0
- /package/dist/{chunk-FFJFE4T7.js.map → chunk-YJGKOSQD.js.map} +0 -0
- /package/dist/{chunk-4JPMZTJY.js.map → chunk-ZF7KNSLU.js.map} +0 -0
- /package/dist/{chunk-2ODVB6LZ.js.map → chunk-ZGKODRGB.js.map} +0 -0
- /package/dist/{chunk-JIBUPZHA.js.map → chunk-ZNEKQFGF.js.map} +0 -0
- /package/dist/{chunk-DLD5LGDS.js.map → chunk-ZUTUNVFD.js.map} +0 -0
- /package/dist/{classified-marker-SIYKUU5L.js.map → classified-marker-WKP33U2R.js.map} +0 -0
- /package/dist/{collection-facade-CS7CA2XO.js.map → collection-facade-COSGZKLC.js.map} +0 -0
- /package/dist/{computed-FAD7SED4.js.map → computed-WN6V53ZV.js.map} +0 -0
- /package/dist/{dead-filter-4F3LWYKH.js.map → dead-filter-43WL3Y5H.js.map} +0 -0
- /package/dist/{derive-XLOJVXPU.js.map → delegation-5UWT4JGT.js.map} +0 -0
- /package/dist/{executor-FMPVN6DT.js.map → derive-IL5JNLEE.js.map} +0 -0
- /package/dist/{dispatch-JDZNGEB3.js.map → dispatch-LOQQD5JK.js.map} +0 -0
- /package/dist/{dispatch-H4HV32AM.js.map → dispatch-SHKTG57L.js.map} +0 -0
- /package/dist/{executor-LBBBRTN5.js.map → executor-6PQ7WAGV.js.map} +0 -0
- /package/dist/{executor-OSRZST2U.js.map → executor-6ZPQA6HS.js.map} +0 -0
- /package/dist/{export-accessible-RAOJAAU5.js.map → executor-OXRA64TY.js.map} +0 -0
- /package/dist/{extract-partition-JD5CUSTG.js.map → export-accessible-XG3FKJWW.js.map} +0 -0
- /package/dist/{find-JRN4RNQ5.js.map → extract-partition-33747NY5.js.map} +0 -0
- /package/dist/{fanout-sidecar-L7NHPIOC.js.map → fanout-sidecar-NEB6IYV7.js.map} +0 -0
- /package/dist/{issue-YIVBZUTH.js.map → find-VW543G3J.js.map} +0 -0
- /package/dist/{ledger-5ZMGE44K.js.map → issue-4ZPSY44M.js.map} +0 -0
- /package/dist/{liberate-WZSZM2W6.js.map → ledger-MZ25UFT2.js.map} +0 -0
- /package/dist/{link-set-MFXC24VK.js.map → liberate-OJIP2ZFX.js.map} +0 -0
- /package/dist/{managed-secret-MFTFT22X.js.map → link-set-4FRRAVTH.js.map} +0 -0
- /package/dist/{noydb-ITIGNKUF.js.map → managed-secret-SQWO2EUR.js.map} +0 -0
- /package/dist/{migrate-cek-DZRFFOHW.js.map → migrate-cek-JWEM4RP6.js.map} +0 -0
- /package/dist/{register-DT5HZ2LZ.js.map → noydb-U62OVKXB.js.map} +0 -0
- /package/dist/{pod-handle-A3LET7NO.js.map → pod-handle-R6Y4MILX.js.map} +0 -0
- /package/dist/{post-register-7ND27CF2.js.map → post-register-GRVQHBOH.js.map} +0 -0
- /package/dist/{registry-BHRZGZHF.js.map → register-YJ5YLQ36.js.map} +0 -0
- /package/dist/{registry-ET6ZFFWA.js.map → registry-ICOHBQFD.js.map} +0 -0
- /package/dist/{registry-HXFGLGTG.js.map → registry-MJ7MWCSW.js.map} +0 -0
- /package/dist/{registry-THCPDEOD.js.map → registry-MVEKKGWL.js.map} +0 -0
- /package/dist/{request-withdrawal-AV2MJJKY.js.map → registry-XP744FAP.js.map} +0 -0
- /package/dist/{revoke-6DWIEOCV.js.map → request-withdrawal-LSU4G6W3.js.map} +0 -0
- /package/dist/{reveal-B2TLP4JQ.js.map → reveal-AIHOIK2N.js.map} +0 -0
- /package/dist/{signer-MHGW3OIL.js.map → revoke-QUT7WWG3.js.map} +0 -0
- /package/dist/{stale-6GCFMOOR.js.map → signer-NYR4I3FO.js.map} +0 -0
- /package/dist/{storage-BYN5LO6Z.js.map → stale-PIJPAL5T.js.map} +0 -0
- /package/dist/{walk-4VPK7AS4.js.map → storage-VH6SPXHC.js.map} +0 -0
- /package/dist/{store-coordination-provider-C4BPT5XF.js.map → store-coordination-provider-2KSHCOPU.js.map} +0 -0
- /package/dist/{verify-UKALW7C2.js.map → verify-PCFS4PNS.js.map} +0 -0
- /package/dist/{withdraw-accessible-HL7GACUE.js.map → walk-OZCN6LJS.js.map} +0 -0
|
@@ -1,34 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare class NoydbPolicy implements NoydbPolicyApi {
|
|
3
|
-
private readonly deps;
|
|
4
|
-
constructor(deps: NoydbPolicyDeps);
|
|
5
|
-
/**
|
|
6
|
-
* Touch the policy enforcer for a vault (records activity, resets
|
|
7
|
-
* idle timer). Also touches the legacy session timer. No-op if no enforcer.
|
|
8
|
-
*/
|
|
9
|
-
touchPolicy(vault?: string): void;
|
|
10
|
-
/**
|
|
11
|
-
* Check that a policy-guarded operation is permitted.
|
|
12
|
-
* Throws `SessionPolicyError` if re-auth is required.
|
|
13
|
-
*/
|
|
14
|
-
checkPolicyOperation(vault: string, op: ReAuthOperation): void;
|
|
15
|
-
/**
|
|
16
|
-
* Read the active policy for a vault. Loads from `_meta/policy` on
|
|
17
|
-
* first call; subsequent calls hit the in-memory cache. Throws
|
|
18
|
-
* `ValidationError` if the vault has not been opened.
|
|
19
|
-
*/
|
|
20
|
-
getPolicy(vault: string): Promise<VaultPolicy>;
|
|
21
|
-
/**
|
|
22
|
-
* Replace the policy document at `_meta/policy` and update the
|
|
23
|
-
* in-memory cache. Gated by the `enroll-user` policy (a policy
|
|
24
|
-
* change is fundamentally a privilege-management action).
|
|
25
|
-
*/
|
|
26
|
-
updatePolicy(vault: string, override: Partial<VaultPolicy>): Promise<VaultPolicy>;
|
|
27
|
-
/** Read or persist the vault policy at `_meta/policy` on first open. */
|
|
28
|
-
bootstrapPolicy(vault: string, opts?: {
|
|
29
|
-
skipManagedCheck?: boolean;
|
|
30
|
-
}): Promise<void>;
|
|
31
|
-
}
|
|
1
|
+
import type { NoydbPolicyFactory } from '../../kernel/types.js';
|
|
32
2
|
/**
|
|
33
3
|
* Factory that builds the `NoydbPolicy` service. `createNoydb()`
|
|
34
4
|
* pre-resolves this via a dynamic import (mirrors
|
|
@@ -19,11 +19,23 @@
|
|
|
19
19
|
* collection, // collection name OR null for "every collection"
|
|
20
20
|
* record, // optional specific record id
|
|
21
21
|
* until, // ISO timestamp — token expires at this instant
|
|
22
|
-
* wrappedDek, // base64 AES-KW-wrapped tier DEK,
|
|
22
|
+
* wrappedDek, // base64 AES-KW-wrapped tier DEK, under the token's content key
|
|
23
|
+
* sealedCek, // that content key, RSA-OAEP-sealed to the target's inbox public half
|
|
23
24
|
* createdAt, // ISO timestamp
|
|
24
25
|
* }
|
|
25
26
|
* ```
|
|
26
27
|
*
|
|
28
|
+
* ## Cross-user (core#65)
|
|
29
|
+
*
|
|
30
|
+
* The wrap key is a per-token CONTENT KEY, not anybody's KEK: the tier DEKs are
|
|
31
|
+
* AES-KW-wrapped under it exactly as they used to be under a KEK, and the key
|
|
32
|
+
* itself is RSA-OAEP-sealed to the target's INBOX PUBLIC HALF (core#96 mints
|
|
33
|
+
* that pair for every grantee, private half sealed under a DEK only that
|
|
34
|
+
* member's own KEK unwraps). So a grantor delegates to somebody whose secret it
|
|
35
|
+
* does not know — the thing this module could not do — while the slot NAMES
|
|
36
|
+
* stay readable to any member holding the `_delegations` DEK, which is what
|
|
37
|
+
* makes an audit enumeration possible without making the keys usable.
|
|
38
|
+
*
|
|
27
39
|
* The ciphertext is stored as a normal noy-db envelope — the
|
|
28
40
|
* `_delegations` collection has its own DEK shared across all vault
|
|
29
41
|
* users, so an operator can enumerate active delegations for audit
|
|
@@ -52,12 +64,57 @@ export interface DelegationToken {
|
|
|
52
64
|
readonly toUser: string;
|
|
53
65
|
readonly fromUser: string;
|
|
54
66
|
readonly tier: number;
|
|
55
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Collection name, or `null` for a COLLECTION-WIDE token — see
|
|
69
|
+
* {@link DelegationToken.wrappedDeks} for what that means and what it cannot
|
|
70
|
+
* mean.
|
|
71
|
+
*/
|
|
56
72
|
readonly collection: string | null;
|
|
57
73
|
/** Optional specific record id scope. */
|
|
58
74
|
readonly record?: string;
|
|
59
75
|
readonly until: string;
|
|
60
|
-
|
|
76
|
+
/**
|
|
77
|
+
* The delegated tier DEK for {@link DelegationToken.collection}, wrapped
|
|
78
|
+
* under the target's KEK. Present on a per-collection token; absent on a
|
|
79
|
+
* collection-wide one, which carries {@link DelegationToken.wrappedDeks}.
|
|
80
|
+
*/
|
|
81
|
+
readonly wrappedDek?: string;
|
|
82
|
+
/**
|
|
83
|
+
* A collection-wide token's payload: `<collection>#<tier>` → wrapped DEK, one
|
|
84
|
+
* entry per collection the grantor held at that tier (core#56).
|
|
85
|
+
*
|
|
86
|
+
* ## ⛔ Why a MAP and not one key
|
|
87
|
+
*
|
|
88
|
+
* Every collection has its OWN tier DEK — measured, `docs#1` and `ledger#1`
|
|
89
|
+
* are different keys. The original design tried to express "every collection"
|
|
90
|
+
* as a single DEK under a wildcard slot `__any#<tier>`, which cannot work: one
|
|
91
|
+
* key decrypts one collection. A wildcard accepted at the access gate would
|
|
92
|
+
* have passed the check and then failed decryption — a gate that says yes
|
|
93
|
+
* followed by a crypto error. `__any#` is gone; every entry here merges under
|
|
94
|
+
* its REAL `<collection>#<tier>` key, so `assertTierAccess` needs no wildcard
|
|
95
|
+
* and gains no new privilege surface.
|
|
96
|
+
*
|
|
97
|
+
* ## ⚠️ "Every collection" means "every collection AS OF ISSUE TIME"
|
|
98
|
+
*
|
|
99
|
+
* This is a SNAPSHOT. A collection created after the token was issued is not
|
|
100
|
+
* in it and will not be granted by it — the grantor did not hold its DEK to
|
|
101
|
+
* wrap. That is a real limit of the shape, not an oversight, and it is stated
|
|
102
|
+
* here because a caller who reads "all collections" will otherwise assume
|
|
103
|
+
* otherwise.
|
|
104
|
+
*/
|
|
105
|
+
readonly wrappedDeks?: Readonly<Record<string, string>>;
|
|
106
|
+
/**
|
|
107
|
+
* core#65 — the token's CONTENT KEY, RSA-OAEP-sealed to the target's inbox
|
|
108
|
+
* public half. `wrappedDek` / `wrappedDeks` are AES-KW-wrapped under it, so
|
|
109
|
+
* only the target can unwrap them, and only they can: the matching private
|
|
110
|
+
* half is sealed in their keyring under a DEK their own KEK unwraps.
|
|
111
|
+
*
|
|
112
|
+
* Absent on a token written before core#65, whose wraps are under the
|
|
113
|
+
* grantor's own KEK — those still load for a target that shares that KEK
|
|
114
|
+
* (the only case that ever worked) and are skipped for anyone else, exactly
|
|
115
|
+
* as before.
|
|
116
|
+
*/
|
|
117
|
+
readonly sealedCek?: string;
|
|
61
118
|
readonly createdAt: string;
|
|
62
119
|
}
|
|
63
120
|
export interface IssueDelegationOptions {
|
|
@@ -68,11 +125,40 @@ export interface IssueDelegationOptions {
|
|
|
68
125
|
readonly until: Date | string;
|
|
69
126
|
}
|
|
70
127
|
/**
|
|
71
|
-
* Build and persist a delegation token. The caller must hold a tier-N
|
|
72
|
-
*
|
|
73
|
-
*
|
|
128
|
+
* Build and persist a delegation token. The caller must hold a tier-N DEK; the
|
|
129
|
+
* target must have a keyring in this vault with an inbox key pair (core#96).
|
|
130
|
+
*
|
|
131
|
+
* core#65 — the wraps are keyed to a per-token content key sealed to that
|
|
132
|
+
* pair, so the grantor needs nothing of the target's but their PUBLIC half.
|
|
133
|
+
*/
|
|
134
|
+
export declare function issueDelegation(store: NoydbStore, vault: string, grantor: UnlockedKeyring, delegationsDek: EnclaveKey, opts: IssueDelegationOptions): Promise<DelegationToken>;
|
|
135
|
+
/**
|
|
136
|
+
* ## Why the vault calls this EXPLICITLY, and never from `openVault` (core#56)
|
|
137
|
+
*
|
|
138
|
+
* The module header above describes a runtime that scans on every open. Doing
|
|
139
|
+
* that automatically would call `getDEK('_delegations')`, which MINTS a DEK when
|
|
140
|
+
* absent and persists the keyring — so merely opening a vault would write to it.
|
|
141
|
+
* Worse, on a vault whose shared `_delegations` DEK this user does not hold, it
|
|
142
|
+
* would mint a WRONG one and then fail to decrypt every token under it.
|
|
143
|
+
*
|
|
144
|
+
* ⛔ A read path must not have that side effect. `Vault.refreshDelegations()`
|
|
145
|
+
* therefore lists first, returns `[]` when nothing is written, and looks the DEK
|
|
146
|
+
* up WITHOUT minting — which also makes the module header's "at each open"
|
|
147
|
+
* cheap to honour, and its "periodic intervals (tracked by the caller)" is what
|
|
148
|
+
* an explicit method is.
|
|
149
|
+
*
|
|
150
|
+
* ## Cross-user delegation (core#65) — and the one thing it still needs
|
|
151
|
+
*
|
|
152
|
+
* A token's wraps are keyed to a per-token content key sealed to the target's
|
|
153
|
+
* INBOX PUBLIC HALF, so any member can be a target. Opening one therefore needs
|
|
154
|
+
* that member's inbox PRIVATE half, which is sealed in their keyring file under
|
|
155
|
+
* `deks[INBOX_KEY_ID]` — so this function reads the caller's own keyring file,
|
|
156
|
+
* once, and only when a sealed token is actually addressed to them.
|
|
157
|
+
*
|
|
158
|
+
* ⚠️ A pre-core#65 token (no `sealedCek`) is wrapped under the GRANTOR's KEK and
|
|
159
|
+
* still requires `user.kek`; it is skipped for anyone who does not share it,
|
|
160
|
+
* which is the behaviour those tokens were written under.
|
|
74
161
|
*/
|
|
75
|
-
export declare function issueDelegation(store: NoydbStore, vault: string, grantor: UnlockedKeyring, targetKek: EnclaveKey | null, delegationsDek: EnclaveKey, opts: IssueDelegationOptions): Promise<DelegationToken>;
|
|
76
162
|
/**
|
|
77
163
|
* Enumerate every live (non-expired) delegation addressed to `toUser`
|
|
78
164
|
* and merge the unwrapped tier DEKs into their keyring. Returns the
|
|
@@ -31,8 +31,6 @@
|
|
|
31
31
|
import { type EchoSecretParts } from '../../capsule/index.js';
|
|
32
32
|
import type { KeyringEchoBlock } from '../../kernel/types.js';
|
|
33
33
|
import type { NoydbDeviceSeal } from './device-seal.js';
|
|
34
|
-
/** Same iteration floor as the KEK (spec resolved question 1). */
|
|
35
|
-
export declare const ECHO_KDF_ITERATIONS = 600000;
|
|
36
34
|
export type EchoRevealChoice = {
|
|
37
35
|
readonly kind: 'portable';
|
|
38
36
|
} | {
|
|
@@ -18,6 +18,8 @@ export { TeamNotEnabledError } from '../../kernel/errors.js';
|
|
|
18
18
|
export type { UnlockedKeyring } from './keyring.js';
|
|
19
19
|
export { loadKeyring, createOwnerKeyring, grant, revoke, changeSecret, listUsers, listUsersWithEnvelopes, ensureCollectionDEK, persistKeyring, updateKeyringIdentity, buildRecipientKeyringFile, } from './keyring.js';
|
|
20
20
|
export type { PodRecipient, ListUsersOptions } from './keyring.js';
|
|
21
|
+
export type { RotateResult, QuarantineResult, RosterVerifyResult } from './keyring.js';
|
|
22
|
+
export type { DelegationToken, IssueDelegationOptions } from './delegation.js';
|
|
21
23
|
export type { LoadKeyringOptions, CreateOwnerKeyringOptions, RotateKeysOptions, ChangeSecretOptions, } from './keyring.js';
|
|
22
24
|
export { enrollAuthenticator, removeAuthenticator, revokeAuthenticator, // #1445 — the three-step revocation; removeAuthenticator alone only hides
|
|
23
25
|
updateAuthenticator, findAuthenticator, } from './authenticators.js';
|
|
@@ -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
|
|
@@ -110,8 +99,18 @@ export interface LoadKeyringOptions {
|
|
|
110
99
|
* That user's secret — a single string for a standard keyring, or the
|
|
111
100
|
* structured 3-part {@link EchoSecretParts} for an echo keyring (spec
|
|
112
101
|
* #940, AG-1: a single string can never unlock an echo keyring).
|
|
102
|
+
* One of `secret` / `kek` is required.
|
|
113
103
|
*/
|
|
114
|
-
readonly secret
|
|
104
|
+
readonly secret?: string | EchoSecretParts;
|
|
105
|
+
/**
|
|
106
|
+
* core#96 — a KEK this session already HOLDS, instead of re-deriving one
|
|
107
|
+
* from a secret. The in-session roster reload (core#82) uses it: the secret
|
|
108
|
+
* the vault was opened with is stale after an in-session `rotateSecret`,
|
|
109
|
+
* and 600K PBKDF2 iterations are not needed to adopt a file this KEK
|
|
110
|
+
* already opens. A file re-keyed under this member by somebody else fails
|
|
111
|
+
* the canary and reports `InvalidKeyError` — a defined event, not a hang.
|
|
112
|
+
*/
|
|
113
|
+
readonly kek?: EnclaveKey;
|
|
115
114
|
}
|
|
116
115
|
/**
|
|
117
116
|
* KDF dispatch for tier-1 unlock (spec #940). An echo keyring accepts
|
|
@@ -120,6 +119,7 @@ export interface LoadKeyringOptions {
|
|
|
120
119
|
*/
|
|
121
120
|
export declare function deriveKekForKeyring(file: KeyringFile, secret: string | EchoSecretParts, salt: Uint8Array): Promise<EnclaveKey>;
|
|
122
121
|
/** Parse a raw keyring envelope. Single sanctioned reader of `_data` for keyring files. */
|
|
122
|
+
/** Parse a keyring envelope's body. Exported for `keyring-mirror.ts` (core#75) — the one non-crypto reader. */
|
|
123
123
|
export declare function parseKeyringEnvelope(envelope: EncryptedEnvelope): KeyringFile;
|
|
124
124
|
/** Fetch + parse a user's keyring file; undefined when the row is missing. */
|
|
125
125
|
export declare function readKeyringFile(store: NoydbStore, vault: string, userId: string): Promise<{
|
|
@@ -196,8 +196,18 @@ export interface CreateOwnerKeyringOptions extends SecretPolicy {
|
|
|
196
196
|
export declare function createOwnerKeyring(store: NoydbStore, vault: string, opts: CreateOwnerKeyringOptions): Promise<UnlockedKeyring>;
|
|
197
197
|
/** Grant access to a new user. Caller must have grant privilege. */
|
|
198
198
|
export declare function grant(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: GrantOptions): Promise<void>;
|
|
199
|
+
/**
|
|
200
|
+
* Reserved DEK-map slots that are KEYS, not collections, and can never be
|
|
201
|
+
* rotated — `rotateKeys` refuses each by name. Every caller that derives a
|
|
202
|
+
* rotation scope from a DEK map (`revoke`, `quarantineKeyring`) strips these
|
|
203
|
+
* first. ⛔ Kept as ONE set rather than a filter per caller: `quarantineKeyring`
|
|
204
|
+
* stripped only `_roster` and broke the moment the owner keyring gained an
|
|
205
|
+
* inbox key (core#65), which is the second time this list grew and a caller
|
|
206
|
+
* was missed.
|
|
207
|
+
*/
|
|
208
|
+
export declare const NON_ROTATABLE_SLOTS: ReadonlySet<string>;
|
|
199
209
|
/** Revoke a user's access. Optionally rotate keys for affected collections. */
|
|
200
|
-
export declare function revoke(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: RevokeOptions): Promise<
|
|
210
|
+
export declare function revoke(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: RevokeOptions): Promise<RevokeResult>;
|
|
201
211
|
/** What {@link verifyRoster} found. */
|
|
202
212
|
export interface RosterVerifyResult {
|
|
203
213
|
/**
|
|
@@ -316,7 +326,19 @@ export declare function quarantineKeyring(store: NoydbStore, vault: string, call
|
|
|
316
326
|
* @throws `ValidationError` when the diff is empty (nothing to update).
|
|
317
327
|
*
|
|
318
328
|
*/
|
|
319
|
-
|
|
329
|
+
/** What `updateKeyringIdentity` hands back to the kernel (core#96). */
|
|
330
|
+
export interface UpdateKeyringResult {
|
|
331
|
+
/** The role moved. The kernel re-registers the member with a broker host, if one is configured. */
|
|
332
|
+
readonly roleChanged: boolean;
|
|
333
|
+
/**
|
|
334
|
+
* A fresh `_broker_member` DEK, delivered through the inbox, when the member
|
|
335
|
+
* is (still) a sub-admin after a role change — the kernel seals the new seed
|
|
336
|
+
* under it and re-enrols. Absent otherwise (a promotion to owner/admin drops
|
|
337
|
+
* the slot: those roles use the shared `_broker` seed).
|
|
338
|
+
*/
|
|
339
|
+
readonly brokerMemberDek?: EnclaveKey;
|
|
340
|
+
}
|
|
341
|
+
export declare function updateKeyringIdentity(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: UpdateUserOptions): Promise<UpdateKeyringResult>;
|
|
320
342
|
/**
|
|
321
343
|
* Rotate DEKs for specified collections:
|
|
322
344
|
* 1. Generate new DEKs
|
|
@@ -361,11 +383,38 @@ export interface RotateResult {
|
|
|
361
383
|
readonly userId: string;
|
|
362
384
|
readonly reason: KeyringTamperedReason;
|
|
363
385
|
}>;
|
|
386
|
+
/**
|
|
387
|
+
* core#100 — every record this rotation re-encrypted, with its version.
|
|
388
|
+
* Rotation writes through the raw store, invisible to the sync dirty log,
|
|
389
|
+
* so a replica kept the OLD ciphertext until each record was edited again —
|
|
390
|
+
* a revoked member with store access went on reading it, and a survivor
|
|
391
|
+
* handed the new DEK read `TamperedError` (measured by pilot-1). The kernel
|
|
392
|
+
* dirty-tracks these on every sync engine so the next push carries them.
|
|
393
|
+
*/
|
|
394
|
+
readonly rewritten: ReadonlyArray<{
|
|
395
|
+
readonly collection: string;
|
|
396
|
+
readonly id: string;
|
|
397
|
+
readonly version: number;
|
|
398
|
+
}>;
|
|
399
|
+
}
|
|
400
|
+
/** core#100 — what `revoke` hands the kernel: the rotation's rewrites, for the dirty log. */
|
|
401
|
+
export interface RevokeResult {
|
|
402
|
+
readonly rewritten: RotateResult['rewritten'];
|
|
364
403
|
}
|
|
365
404
|
/** Options for {@link rotateKeys} (#846b — was a bare `string[]`). */
|
|
366
405
|
export interface RotateKeysOptions {
|
|
367
406
|
/** Collections whose DEKs are re-minted. */
|
|
368
407
|
readonly collections: readonly string[];
|
|
408
|
+
/**
|
|
409
|
+
* core#100 — members who must NOT be delivered the new keys: the member
|
|
410
|
+
* being revoked or quarantined (a store that suppresses the `_keyring`
|
|
411
|
+
* delete leaves their file in place — #1043 — and delivering to it would
|
|
412
|
+
* hand the revoked member the very key the rotation exists to take away),
|
|
413
|
+
* and a member being narrowed (the collection just left their file, but a
|
|
414
|
+
* pending inbox slot for it cannot be pulled out of its box). They get the
|
|
415
|
+
* drop, and appear in `needsRegrant` as before.
|
|
416
|
+
*/
|
|
417
|
+
readonly exclude?: readonly string[];
|
|
369
418
|
}
|
|
370
419
|
export declare function rotateKeys(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, opts: RotateKeysOptions): Promise<RotateResult>;
|
|
371
420
|
/** Options for {@link changeSecret} (#846b). */
|
|
@@ -513,21 +562,42 @@ export declare function listUsersWithEnvelopes<T = unknown>(store: NoydbStore, v
|
|
|
513
562
|
envelope: UserEnvelope<T> | null;
|
|
514
563
|
}>>;
|
|
515
564
|
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
565
|
/** Check if a user has write permission for a collection. */
|
|
527
566
|
export declare function hasWritePermission(keyring: UnlockedKeyring, collectionName: string): boolean;
|
|
528
567
|
/** Check if a user has any access to a collection. */
|
|
529
568
|
export declare function hasAccess(keyring: UnlockedKeyring, collectionName: string): boolean;
|
|
569
|
+
export declare function mintInboxKey(kek: EnclaveKey): Promise<{
|
|
570
|
+
wrappedInboxKey: string;
|
|
571
|
+
inboxKeyAes: EnclaveKey;
|
|
572
|
+
inboxKey: NonNullable<KeyringFile['inbox_key']>;
|
|
573
|
+
}>;
|
|
574
|
+
/** core#96 — the collections a member has pending in their inbox, over every box. */
|
|
575
|
+
export declare function inboxSlots(file: Pick<KeyringFile, 'inbox'>): string[];
|
|
576
|
+
/**
|
|
577
|
+
* core#65 — this member's INBOX KEY PAIR, rebuilt from their keyring file: the
|
|
578
|
+
* private half is sealed under `deks[INBOX_KEY_ID]`, which only their own KEK
|
|
579
|
+
* unwraps. The inbox drain below opens boxes with it; `with-party/team/
|
|
580
|
+
* delegation.ts` opens a delegation's content key with the same pair, so a
|
|
581
|
+
* grantor can hand a member a key without knowing their secret.
|
|
582
|
+
*/
|
|
583
|
+
export declare function openInboxKeyPair(inboxKey: NonNullable<KeyringFile['inbox_key']>, inboxKeyAes: EnclaveKey): Promise<CryptoKeyPair>;
|
|
530
584
|
/** Persist a keyring file to the store. */
|
|
585
|
+
/**
|
|
586
|
+
* ⛔⛔ core#132 — DO NOT ADD A RETRY HERE. An earlier cut of this change did,
|
|
587
|
+
* and it was wrong in a way that looked like a fix.
|
|
588
|
+
*
|
|
589
|
+
* This function writes the caller's in-memory `keyring.deks` WHOLESALE. If a
|
|
590
|
+
* CAS fails, the write that lost was based on a stale version — retrying it
|
|
591
|
+
* re-persists that same map over the winner's, which is exactly the clobber
|
|
592
|
+
* the CAS just caught, laundered into a success. The suite went green and the
|
|
593
|
+
* data loss stayed.
|
|
594
|
+
*
|
|
595
|
+
* ⭐ The resolution belongs where the intent is, not where the write is. The
|
|
596
|
+
* only caller that races in practice is the lazy DEK mint in
|
|
597
|
+
* `ensureCollectionDEK`, and it can resolve correctly because it has not
|
|
598
|
+
* encrypted anything yet: on conflict it adopts the winner's key and returns
|
|
599
|
+
* that. See the comment there.
|
|
600
|
+
*/
|
|
531
601
|
export declare function persistKeyring(store: NoydbStore, vault: string, keyring: UnlockedKeyring): Promise<void>;
|
|
532
602
|
/**
|
|
533
603
|
* Check whether a keyring is authorised for a given `@noy-db/as-*`
|
|
@@ -579,3 +649,42 @@ export declare function hasImportCapability(keyring: UnlockedKeyring, tier: 'bun
|
|
|
579
649
|
*/
|
|
580
650
|
export declare function evaluateImportCapability(capability: ImportCapability | undefined, role: Role, tier: 'plaintext', format: ExportFormat): boolean;
|
|
581
651
|
export declare function evaluateImportCapability(capability: ImportCapability | undefined, role: Role, tier: 'bundle'): boolean;
|
|
652
|
+
/**
|
|
653
|
+
* core#132 — what this write is based on.
|
|
654
|
+
*
|
|
655
|
+
* `{ on }` is the envelope the edit was computed from; the write then CASes
|
|
656
|
+
* against its `_v` and lands at `_v + 1`. `'create'` is a keyring that did not
|
|
657
|
+
* exist.
|
|
658
|
+
*
|
|
659
|
+
* ⭐ REQUIRED, not optional, and that is the point: keyring writes were a bare
|
|
660
|
+
* `store.put` with no `expectedVersion`, so two concurrent edits to one member
|
|
661
|
+
* were last-writer-wins, silently. Making the basis a required parameter means
|
|
662
|
+
* the COMPILER enumerates every call site — `NON_ROTATABLE_SLOTS`' own comment
|
|
663
|
+
* records two defects caused by enumerating callers with grep instead.
|
|
664
|
+
*
|
|
665
|
+
* ⛔ `'create'` is NOT protected, and the limit is in the store contract, not
|
|
666
|
+
* in this function: two concurrent creates of the same userId still clobber,
|
|
667
|
+
* because this path passes no `expectedVersion` at all. Do not read a
|
|
668
|
+
* `'create'` basis as protected.
|
|
669
|
+
*
|
|
670
|
+
* ⚠️ It is not that absence is inexpressible — core#134 measured that claim and
|
|
671
|
+
* it was wrong. Every version hub writes starts at 1, so on a store that
|
|
672
|
+
* compares only when the record is present, `expectedVersion: 0` lets the
|
|
673
|
+
* first create through and conflicts every later one: an exact "write only if
|
|
674
|
+
* absent", for free. Censused 2026-09-24, every record store in the family
|
|
675
|
+
* already behaves that way, `to-aws-s3` deliberately and by name.
|
|
676
|
+
*
|
|
677
|
+
* ⛔ What stops this call site adopting it is that NOTHING HOLDS that
|
|
678
|
+
* convergence: `@noy-db/ports/to` asserts none of it, so a third-party adapter
|
|
679
|
+
* owes it nothing and this would become a silent correctness dependency on
|
|
680
|
+
* behaviour no gate checks. Adopt it after the conformance case lands, not
|
|
681
|
+
* before. core#134 carries the decision.
|
|
682
|
+
*/
|
|
683
|
+
export type KeyringWriteBasis = {
|
|
684
|
+
readonly on: EncryptedEnvelope;
|
|
685
|
+
} | 'create';
|
|
686
|
+
/** The basis for a write computed from a `readKeyringFile` result. */
|
|
687
|
+
export declare const basisOf: (found: {
|
|
688
|
+
readonly envelope: EncryptedEnvelope;
|
|
689
|
+
} | undefined) => KeyringWriteBasis;
|
|
690
|
+
export declare function writeKeyringFile(store: NoydbStore, vault: string, userId: string, keyringFile: KeyringFile, basis: KeyringWriteBasis): Promise<void>;
|
|
@@ -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
|
|
@@ -24,7 +24,7 @@ import { type RotateSecretInput, type RecoverSecretInput, type RecoverSecretResu
|
|
|
24
24
|
import { type RecoverUserOptions } from './peer-recover.js';
|
|
25
25
|
import { type PaperRecoveryEntry, type ShamirRecoveryEntry } from './recovery.js';
|
|
26
26
|
import type { Vault } from '../../kernel/vault.js';
|
|
27
|
-
import type { UnlockedKeyring } from './keyring.js';
|
|
27
|
+
import type { UnlockedKeyring, RevokeResult } from './keyring.js';
|
|
28
28
|
import { type EnrollAuthenticatorOptions, type UpdateAuthenticatorOptions } from './authenticators.js';
|
|
29
29
|
import type { QuickUnlockStore, QuickUnlockState } from '../session/unlock-state.js';
|
|
30
30
|
import type { SecretPolicy } from '../../kernel/validation.js';
|
|
@@ -53,6 +53,13 @@ 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>;
|
|
61
|
+
/** core#96 — pull a member's keyring file from every sync target before an authority edit. */
|
|
62
|
+
refreshRoster(vault: string, userId: string): Promise<void>;
|
|
56
63
|
/** Managed-recovery enrolment check (kernel-resident). */
|
|
57
64
|
assertRecoveryEnrolled(vault: string, policy: VaultPolicy, opts?: {
|
|
58
65
|
skipManagedCheck?: boolean;
|
|
@@ -71,7 +78,7 @@ export declare class TeamFacade {
|
|
|
71
78
|
/** Gate + run a `grant` engine. See `Noydb.grant` for the public contract. */
|
|
72
79
|
runGrant(engine: (adapter: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: GrantOptions) => Promise<void>, vault: string, options: GrantOptions, factors?: FactorProofBundle): Promise<void>;
|
|
73
80
|
/** Gate + run a `revoke` engine. See `Noydb.revoke` for the public contract. */
|
|
74
|
-
runRevoke(engine: (adapter: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: RevokeOptions) => Promise<
|
|
81
|
+
runRevoke(engine: (adapter: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: RevokeOptions) => Promise<RevokeResult>, vault: string, options: RevokeOptions, factors?: FactorProofBundle): Promise<RevokeResult>;
|
|
75
82
|
/** Gate + run a `rotateKeys` engine. See `Noydb.rotate` for the public contract. */
|
|
76
83
|
runRotate(engine: (store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, opts: RotateKeysOptions) => Promise<RotateResult>, vault: string, collections: string[]): Promise<RotateResult>;
|
|
77
84
|
/** Gate + run the `verifyRoster` engine (#1121). See `Noydb.verifyRoster`. */
|
|
@@ -166,6 +173,7 @@ export declare class TeamFacade {
|
|
|
166
173
|
* meta: {
|
|
167
174
|
* credentialId: e.credentialId,
|
|
168
175
|
* wrapIv: e.wrapIv,
|
|
176
|
+
* rpId: e.rpId,
|
|
169
177
|
* prfUsed: e.prfUsed,
|
|
170
178
|
* beFlag: e.beFlag,
|
|
171
179
|
* requireSingleDevice: e.requireSingleDevice,
|
|
@@ -174,6 +182,15 @@ export declare class TeamFacade {
|
|
|
174
182
|
* })
|
|
175
183
|
* ```
|
|
176
184
|
*
|
|
185
|
+
* `meta` is a free-form blob — hub validates `credentialId` and nothing
|
|
186
|
+
* else, so this example IS the contract for what a slot carries. Record
|
|
187
|
+
* `rpId` (core#140): the slot rewrap / rotation ceremony falls back to
|
|
188
|
+
* `meta.rpId` when the caller passes no `options.rpId` and the enrollment
|
|
189
|
+
* record predates `WebAuthnEnrollment.rpId`. Omitting it does not break
|
|
190
|
+
* single-hostname deployments — absence correctly reads as "send no RP ID"
|
|
191
|
+
* — but on a shared registrable domain rotation then works only if every
|
|
192
|
+
* caller remembers to pass the RP ID by hand.
|
|
193
|
+
*
|
|
177
194
|
* Returns the WebAuthn `credentialId` (extracted from `meta.credentialId`)
|
|
178
195
|
* for the caller's lookup index (a bootstrap vault, a Cover,
|
|
179
196
|
* a server-side allowlist).
|
|
@@ -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' | 'inbox_key' | 'inbox'>;
|
|
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);
|