@noy-db/hub 0.2.0-pre.4 → 0.2.0-pre.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aggregate/index.cjs.map +1 -1
- package/dist/aggregate/index.js +4 -4
- package/dist/attestation/index.cjs.map +1 -1
- package/dist/attestation/index.d.cts +4 -4
- package/dist/attestation/index.d.ts +4 -4
- package/dist/attestation/index.js +6 -6
- package/dist/blobs/index.cjs.map +1 -1
- package/dist/blobs/index.d.cts +5 -5
- package/dist/blobs/index.d.ts +5 -5
- package/dist/blobs/index.js +5 -5
- package/dist/bundle/index.cjs +496 -344
- package/dist/bundle/index.cjs.map +1 -1
- package/dist/bundle/index.d.cts +17 -17
- package/dist/bundle/index.d.ts +17 -17
- package/dist/bundle/index.js +10 -10
- package/dist/bundle/index.js.map +1 -1
- package/dist/{chunk-YL2DR3HY.js → chunk-25WFLKOH.js} +2 -2
- package/dist/chunk-25WFLKOH.js.map +1 -0
- package/dist/{chunk-EMEX37ZN.js → chunk-2GMRNNI3.js} +3 -3
- package/dist/chunk-2GMRNNI3.js.map +1 -0
- package/dist/{chunk-NGSPBLLE.js → chunk-34XGYMQT.js} +3 -3
- package/dist/chunk-34XGYMQT.js.map +1 -0
- package/dist/{chunk-FXQYZNOW.js → chunk-5OVIFUQE.js} +1 -1
- package/dist/chunk-5OVIFUQE.js.map +1 -0
- package/dist/{chunk-P6256WTJ.js → chunk-5QPF2MJ5.js} +3 -3
- package/dist/chunk-5QPF2MJ5.js.map +1 -0
- package/dist/{chunk-5ZGZ6HIZ.js → chunk-5VMTAX4Y.js} +2 -2
- package/dist/{chunk-74JEQFMT.js → chunk-6A4AMQ2H.js} +5 -5
- package/dist/chunk-6A4AMQ2H.js.map +1 -0
- package/dist/{chunk-YDLAFP36.js → chunk-6HJ2ZALB.js} +1 -1
- package/dist/chunk-6HJ2ZALB.js.map +1 -0
- package/dist/{chunk-GDTCGIPX.js → chunk-7TX7HN42.js} +2 -2
- package/dist/chunk-7TX7HN42.js.map +1 -0
- package/dist/{chunk-EPK6A3WJ.js → chunk-A3JMGXPG.js} +2 -2
- package/dist/chunk-A3JMGXPG.js.map +1 -0
- package/dist/{chunk-75QDHSE4.js → chunk-A4JNVBPF.js} +5 -5
- package/dist/{chunk-IS5HWQO7.js → chunk-ARZAHCCF.js} +3 -3
- package/dist/{chunk-4OQWR46B.js → chunk-CCC25PA7.js} +5 -5
- package/dist/{chunk-NSLTPGEN.js → chunk-CGJFCT3X.js} +2 -2
- package/dist/{chunk-YK72A4IT.js → chunk-CKH247ZR.js} +4 -4
- package/dist/{chunk-HGZ7DC5H.js → chunk-DFCINPB5.js} +2 -2
- package/dist/chunk-DFCINPB5.js.map +1 -0
- package/dist/{chunk-4X2S7PBF.js → chunk-E225X5CQ.js} +3 -3
- package/dist/chunk-E225X5CQ.js.map +1 -0
- package/dist/{chunk-5YHWBPOT.js → chunk-ED3E3OLO.js} +2 -2
- package/dist/{chunk-UOF74WQY.js → chunk-EKTOYEZ3.js} +2 -2
- package/dist/{chunk-SAVQ6E2O.js → chunk-G26QAQNI.js} +2 -2
- package/dist/{chunk-YMYK7US4.js → chunk-HIELMTUK.js} +2 -2
- package/dist/{chunk-MRIBLZL3.js → chunk-ICH4AIGL.js} +1 -1
- package/dist/chunk-ICH4AIGL.js.map +1 -0
- package/dist/{chunk-KMI2NBBF.js → chunk-JICBEFBT.js} +181 -6
- package/dist/chunk-JICBEFBT.js.map +1 -0
- package/dist/{chunk-LOL725S4.js → chunk-JSYTGEX4.js} +3 -3
- package/dist/{chunk-FBMXWVGP.js → chunk-KGFV72WK.js} +5 -5
- package/dist/{chunk-GVXBHCZ2.js → chunk-LJO6Q3X6.js} +5 -5
- package/dist/chunk-LJO6Q3X6.js.map +1 -0
- package/dist/{chunk-ZC2AAE6J.js → chunk-LWFQYT4N.js} +2 -2
- package/dist/chunk-LWFQYT4N.js.map +1 -0
- package/dist/{chunk-K5PVGKE4.js → chunk-MDIC4FAU.js} +2 -2
- package/dist/{chunk-ZUMGGHRB.js → chunk-OPD3PZOG.js} +4 -4
- package/dist/{chunk-LS3JLEIB.js → chunk-PS5G6A3Y.js} +4 -4
- package/dist/{chunk-KYKMKLJ6.js → chunk-PX3MJ6RB.js} +3 -3
- package/dist/{chunk-FCDO7UAO.js → chunk-R4LTCI6O.js} +2 -2
- package/dist/{chunk-BFI3RS42.js → chunk-R7JTYCRX.js} +2 -2
- package/dist/chunk-R7JTYCRX.js.map +1 -0
- package/dist/{chunk-WRLHNG6H.js → chunk-RIHZBSWJ.js} +4 -4
- package/dist/chunk-RIHZBSWJ.js.map +1 -0
- package/dist/{chunk-UVPGJXVO.js → chunk-SGSHQ4PH.js} +5 -5
- package/dist/{chunk-TLFUDXVV.js → chunk-T6MTNGBM.js} +5 -5
- package/dist/chunk-T6MTNGBM.js.map +1 -0
- package/dist/{chunk-6S3LLAQ5.js → chunk-TNBIWSQ7.js} +2 -2
- package/dist/{chunk-GD3BGKAR.js → chunk-UGVDIOY7.js} +2 -2
- package/dist/{chunk-T6HQMVML.js → chunk-W277AG6N.js} +411 -308
- package/dist/chunk-W277AG6N.js.map +1 -0
- package/dist/{chunk-FS7A4XNF.js → chunk-WEA4TDTJ.js} +3 -3
- package/dist/{chunk-4UBOTYP5.js → chunk-XDW37COG.js} +5 -5
- package/dist/chunk-XDW37COG.js.map +1 -0
- package/dist/{chunk-QAU5HM6Q.js → chunk-XVJFFGTG.js} +3 -3
- package/dist/{chunk-2EYC3WDT.js → chunk-Y3P5DEMZ.js} +6 -6
- package/dist/chunk-Y3P5DEMZ.js.map +1 -0
- package/dist/{chunk-G7PAZ3TD.js → chunk-YEHUEUNP.js} +4 -4
- package/dist/chunk-YEHUEUNP.js.map +1 -0
- package/dist/{chunk-2XLVPKXG.js → chunk-YJ46RFCD.js} +2 -2
- package/dist/{chunk-NCO2JGKK.js → chunk-Z6FNBOTC.js} +1 -1
- package/dist/chunk-Z6FNBOTC.js.map +1 -0
- package/dist/{chunk-GAUBWHAF.js → chunk-ZQMYB56Z.js} +4 -4
- package/dist/consent/index.cjs.map +1 -1
- package/dist/consent/index.d.cts +5 -5
- package/dist/consent/index.d.ts +5 -5
- package/dist/consent/index.js +3 -3
- package/dist/{crypto-H2Y3DDFW.js → crypto-5UDZZL26.js} +3 -3
- package/dist/{delegation-QSC7G5QC.js → delegation-42LO4WFO.js} +5 -5
- package/dist/derivations/index.cjs +1 -1
- package/dist/derivations/index.cjs.map +1 -1
- package/dist/derivations/index.d.cts +8 -8
- package/dist/derivations/index.d.ts +8 -8
- package/dist/derivations/index.js +4 -4
- package/dist/{dev-unlock-Cf2B7Kih.d.ts → dev-unlock-Cvo-xCQC.d.ts} +1 -1
- package/dist/{dev-unlock-De3mjQWv.d.cts → dev-unlock-Dy1qVpkL.d.cts} +1 -1
- package/dist/executor-AWCHQ2KN.js +8 -0
- package/dist/executor-RWICJI7J.js +11 -0
- package/dist/executor-SOLEQVUB.js +8 -0
- package/dist/{fanout-sidecar-NRBWSLRK.js → fanout-sidecar-EVICRM46.js} +2 -2
- package/dist/fanout-sidecar-EVICRM46.js.map +1 -0
- package/dist/guards/index.cjs +1 -1
- package/dist/guards/index.cjs.map +1 -1
- package/dist/guards/index.d.cts +6 -6
- package/dist/guards/index.d.ts +6 -6
- package/dist/guards/index.js +4 -4
- package/dist/{hash-gVn_uKhp.d.ts → hash-BAlWR4WD.d.ts} +1 -1
- package/dist/{hash-vBCB0-Ps.d.cts → hash-BgEQklQc.d.cts} +1 -1
- package/dist/history/index.cjs.map +1 -1
- package/dist/history/index.d.cts +6 -6
- package/dist/history/index.d.ts +6 -6
- package/dist/history/index.js +6 -6
- package/dist/i18n/index.cjs +75 -10
- package/dist/i18n/index.cjs.map +1 -1
- package/dist/i18n/index.d.cts +5 -5
- package/dist/i18n/index.d.ts +5 -5
- package/dist/i18n/index.js +16 -14
- package/dist/{index-DVkvrgpm.d.cts → index-5I0MZ0jQ.d.cts} +12 -12
- package/dist/{index-BF1B2HB9.d.ts → index-fIPPh5dg.d.ts} +12 -12
- package/dist/index.cjs +538 -378
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +20 -22
- package/dist/index.d.ts +20 -22
- package/dist/index.js +50 -52
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.cjs +1 -1
- package/dist/indexing/index.cjs.map +1 -1
- package/dist/indexing/index.d.cts +3 -3
- package/dist/indexing/index.d.ts +3 -3
- package/dist/indexing/index.js +4 -4
- package/dist/issue-IODMTPME.js +12 -0
- package/dist/{lazy-builder-Rpd-V3jP.d.ts → lazy-builder-D1MyR1qH.d.ts} +2 -2
- package/dist/{lazy-builder-C-rPfWG0.d.cts → lazy-builder-DXlSCNCJ.d.cts} +2 -2
- package/dist/{ledger-WOEJUYTP.js → ledger-UX4QIHWI.js} +6 -6
- package/dist/materialized-views/index.cjs.map +1 -1
- package/dist/materialized-views/index.d.cts +18 -18
- package/dist/materialized-views/index.d.ts +18 -18
- package/dist/materialized-views/index.js +7 -7
- package/dist/noydb-FY2666NY.js +34 -0
- package/dist/overlay-views/index.cjs +1 -1
- package/dist/overlay-views/index.cjs.map +1 -1
- package/dist/overlay-views/index.d.cts +8 -8
- package/dist/overlay-views/index.d.ts +8 -8
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.cjs.map +1 -1
- package/dist/periods/index.d.cts +5 -5
- package/dist/periods/index.d.ts +5 -5
- package/dist/periods/index.js +6 -6
- package/dist/{predicate-Dnu81tsS.d.cts → predicate-B0IKeBXx.d.cts} +1 -1
- package/dist/{predicate-Dnu81tsS.d.ts → predicate-B0IKeBXx.d.ts} +1 -1
- package/dist/{public-envelope-OHQ5UZFM.js → public-envelope-YKHKP74C.js} +4 -4
- package/dist/query/index.cjs +2 -2
- package/dist/query/index.cjs.map +1 -1
- package/dist/query/index.d.cts +2 -2
- package/dist/query/index.d.ts +2 -2
- package/dist/query/index.js +6 -6
- package/dist/registry-446I2NMN.js +8 -0
- package/dist/{registry-CDHASH73.js → registry-4NEW7LQY.js} +3 -3
- package/dist/registry-524KJZG4.js +8 -0
- package/dist/registry-DKEXOJVO.js +7 -0
- package/dist/{revoke-7JOVLZFD.js → revoke-R5NIQ74J.js} +6 -6
- package/dist/session/index.cjs.map +1 -1
- package/dist/session/index.d.cts +6 -6
- package/dist/session/index.d.ts +6 -6
- package/dist/session/index.js +3 -3
- package/dist/shadow/index.cjs.map +1 -1
- package/dist/shadow/index.d.cts +5 -5
- package/dist/shadow/index.d.ts +5 -5
- package/dist/shadow/index.js +2 -2
- package/dist/{signer-M4K5HBLD.js → signer-WGDJNWSU.js} +5 -5
- package/dist/{stale-PAGCS4K5.js → stale-74WGLVZ2.js} +2 -2
- package/dist/store/index.cjs.map +1 -1
- package/dist/store/index.d.cts +5 -5
- package/dist/store/index.d.ts +5 -5
- package/dist/store/index.js +2 -2
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.d.cts +4 -4
- package/dist/sync/index.d.ts +4 -4
- package/dist/sync/index.js +4 -4
- package/dist/team/index.cjs +1 -1
- package/dist/team/index.cjs.map +1 -1
- package/dist/team/index.d.cts +5 -5
- package/dist/team/index.d.ts +5 -5
- package/dist/team/index.js +8 -8
- package/dist/tx/index.cjs +2 -2
- package/dist/tx/index.cjs.map +1 -1
- package/dist/tx/index.d.cts +5 -5
- package/dist/tx/index.d.ts +5 -5
- package/dist/tx/index.js +3 -3
- package/dist/tx/index.js.map +1 -1
- package/dist/{types-CSLcfytP.d.cts → types-DVlvNn2c.d.cts} +362 -307
- package/dist/{types-D9eB0Rvh.d.ts → types-DlnZh1_i.d.ts} +362 -307
- package/dist/{ulid-CiM2OAeM.d.ts → ulid-CzPONlhG.d.ts} +19 -19
- package/dist/{ulid-CG2YvAbg.d.cts → ulid-r98nkjVd.d.cts} +19 -19
- package/dist/util/index.cjs.map +1 -1
- package/dist/util/index.js +1 -1
- package/dist/{with-derivation-Bzpj6UTv.d.ts → with-derivation-B98shCV8.d.ts} +1 -1
- package/dist/{with-derivation-DWajFh4K.d.cts → with-derivation-BMQ9pIHe.d.cts} +1 -1
- package/dist/{with-guard-DF_Ul3DT.d.cts → with-guard-DUnC3JDN.d.cts} +1 -1
- package/dist/{with-guard-DR7U-l4v.d.ts → with-guard-DmT50nVG.d.ts} +1 -1
- package/dist/{with-materialized-view-qtoJ3xKJ.d.ts → with-materialized-view-Bp_M3sNG.d.ts} +2 -2
- package/dist/{with-materialized-view-_piodoIz.d.cts → with-materialized-view-eMTZ65_J.d.cts} +2 -2
- package/dist/{with-overlayed-view-DFaRfgMr.d.ts → with-overlayed-view-BoY6PB3n.d.cts} +2 -2
- package/dist/{with-overlayed-view-DwzCKxn2.d.cts → with-overlayed-view-zzSnRQmS.d.ts} +2 -2
- package/package.json +3 -3
- package/dist/chunk-2EYC3WDT.js.map +0 -1
- package/dist/chunk-4UBOTYP5.js.map +0 -1
- package/dist/chunk-4X2S7PBF.js.map +0 -1
- package/dist/chunk-74JEQFMT.js.map +0 -1
- package/dist/chunk-A6SWRXUQ.js +0 -118
- package/dist/chunk-A6SWRXUQ.js.map +0 -1
- package/dist/chunk-BFI3RS42.js.map +0 -1
- package/dist/chunk-EMEX37ZN.js.map +0 -1
- package/dist/chunk-EPK6A3WJ.js.map +0 -1
- package/dist/chunk-FXQYZNOW.js.map +0 -1
- package/dist/chunk-G7PAZ3TD.js.map +0 -1
- package/dist/chunk-GDTCGIPX.js.map +0 -1
- package/dist/chunk-GVXBHCZ2.js.map +0 -1
- package/dist/chunk-HGZ7DC5H.js.map +0 -1
- package/dist/chunk-KMI2NBBF.js.map +0 -1
- package/dist/chunk-MRIBLZL3.js.map +0 -1
- package/dist/chunk-NCO2JGKK.js.map +0 -1
- package/dist/chunk-NGSPBLLE.js.map +0 -1
- package/dist/chunk-P6256WTJ.js.map +0 -1
- package/dist/chunk-T6HQMVML.js.map +0 -1
- package/dist/chunk-TLFUDXVV.js.map +0 -1
- package/dist/chunk-WRLHNG6H.js.map +0 -1
- package/dist/chunk-YDLAFP36.js.map +0 -1
- package/dist/chunk-YL2DR3HY.js.map +0 -1
- package/dist/chunk-ZC2AAE6J.js.map +0 -1
- package/dist/executor-BZKFZVRC.js +0 -8
- package/dist/executor-GFZFDQXV.js +0 -8
- package/dist/executor-KT2IOZVP.js +0 -11
- package/dist/fanout-sidecar-NRBWSLRK.js.map +0 -1
- package/dist/issue-BAJ7ZB4S.js +0 -12
- package/dist/noydb-XNQSKXGO.js +0 -34
- package/dist/registry-2IEARCGT.js +0 -7
- package/dist/registry-EMGLZGR6.js +0 -8
- package/dist/registry-NQALYR77.js +0 -8
- /package/dist/{chunk-5ZGZ6HIZ.js.map → chunk-5VMTAX4Y.js.map} +0 -0
- /package/dist/{chunk-75QDHSE4.js.map → chunk-A4JNVBPF.js.map} +0 -0
- /package/dist/{chunk-IS5HWQO7.js.map → chunk-ARZAHCCF.js.map} +0 -0
- /package/dist/{chunk-4OQWR46B.js.map → chunk-CCC25PA7.js.map} +0 -0
- /package/dist/{chunk-NSLTPGEN.js.map → chunk-CGJFCT3X.js.map} +0 -0
- /package/dist/{chunk-YK72A4IT.js.map → chunk-CKH247ZR.js.map} +0 -0
- /package/dist/{chunk-5YHWBPOT.js.map → chunk-ED3E3OLO.js.map} +0 -0
- /package/dist/{chunk-UOF74WQY.js.map → chunk-EKTOYEZ3.js.map} +0 -0
- /package/dist/{chunk-SAVQ6E2O.js.map → chunk-G26QAQNI.js.map} +0 -0
- /package/dist/{chunk-YMYK7US4.js.map → chunk-HIELMTUK.js.map} +0 -0
- /package/dist/{chunk-LOL725S4.js.map → chunk-JSYTGEX4.js.map} +0 -0
- /package/dist/{chunk-FBMXWVGP.js.map → chunk-KGFV72WK.js.map} +0 -0
- /package/dist/{chunk-K5PVGKE4.js.map → chunk-MDIC4FAU.js.map} +0 -0
- /package/dist/{chunk-ZUMGGHRB.js.map → chunk-OPD3PZOG.js.map} +0 -0
- /package/dist/{chunk-LS3JLEIB.js.map → chunk-PS5G6A3Y.js.map} +0 -0
- /package/dist/{chunk-KYKMKLJ6.js.map → chunk-PX3MJ6RB.js.map} +0 -0
- /package/dist/{chunk-FCDO7UAO.js.map → chunk-R4LTCI6O.js.map} +0 -0
- /package/dist/{chunk-UVPGJXVO.js.map → chunk-SGSHQ4PH.js.map} +0 -0
- /package/dist/{chunk-6S3LLAQ5.js.map → chunk-TNBIWSQ7.js.map} +0 -0
- /package/dist/{chunk-GD3BGKAR.js.map → chunk-UGVDIOY7.js.map} +0 -0
- /package/dist/{chunk-FS7A4XNF.js.map → chunk-WEA4TDTJ.js.map} +0 -0
- /package/dist/{chunk-QAU5HM6Q.js.map → chunk-XVJFFGTG.js.map} +0 -0
- /package/dist/{chunk-2XLVPKXG.js.map → chunk-YJ46RFCD.js.map} +0 -0
- /package/dist/{chunk-GAUBWHAF.js.map → chunk-ZQMYB56Z.js.map} +0 -0
- /package/dist/{crypto-H2Y3DDFW.js.map → crypto-5UDZZL26.js.map} +0 -0
- /package/dist/{delegation-QSC7G5QC.js.map → delegation-42LO4WFO.js.map} +0 -0
- /package/dist/{executor-BZKFZVRC.js.map → executor-AWCHQ2KN.js.map} +0 -0
- /package/dist/{executor-GFZFDQXV.js.map → executor-RWICJI7J.js.map} +0 -0
- /package/dist/{executor-KT2IOZVP.js.map → executor-SOLEQVUB.js.map} +0 -0
- /package/dist/{issue-BAJ7ZB4S.js.map → issue-IODMTPME.js.map} +0 -0
- /package/dist/{ledger-WOEJUYTP.js.map → ledger-UX4QIHWI.js.map} +0 -0
- /package/dist/{noydb-XNQSKXGO.js.map → noydb-FY2666NY.js.map} +0 -0
- /package/dist/{public-envelope-OHQ5UZFM.js.map → public-envelope-YKHKP74C.js.map} +0 -0
- /package/dist/{registry-2IEARCGT.js.map → registry-446I2NMN.js.map} +0 -0
- /package/dist/{registry-CDHASH73.js.map → registry-4NEW7LQY.js.map} +0 -0
- /package/dist/{registry-EMGLZGR6.js.map → registry-524KJZG4.js.map} +0 -0
- /package/dist/{registry-NQALYR77.js.map → registry-DKEXOJVO.js.map} +0 -0
- /package/dist/{revoke-7JOVLZFD.js.map → revoke-R5NIQ74J.js.map} +0 -0
- /package/dist/{signer-M4K5HBLD.js.map → signer-WGDJNWSU.js.map} +0 -0
- /package/dist/{stale-PAGCS4K5.js.map → stale-74WGLVZ2.js.map} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { I as IndexStrategy, d as LazyQuery } from './lazy-builder-
|
|
1
|
+
import { I as IndexStrategy, d as LazyQuery } from './lazy-builder-D1MyR1qH.js';
|
|
2
2
|
import { b as AggregateSpec, A as AggregateStrategy } from './strategy-DSTrsZ8t.js';
|
|
3
3
|
import { C as CrdtStrategy, a as CrdtMode, b as CrdtState } from './strategy-BSxFXGzb.js';
|
|
4
|
-
import { N as NoydbError, Q as Query, ar as RefRegistry, ao as RefDescriptor, a2 as JoinableSource, at as RefViolation, au as ScanBuilder } from './index-
|
|
5
|
-
import { F as FieldClause, I as IndexDef, C as CollectionIndexes } from './predicate-
|
|
4
|
+
import { N as NoydbError, Q as Query, ar as RefRegistry, ao as RefDescriptor, a2 as JoinableSource, at as RefViolation, au as ScanBuilder } from './index-fIPPh5dg.js';
|
|
5
|
+
import { F as FieldClause, I as IndexDef, C as CollectionIndexes } from './predicate-B0IKeBXx.js';
|
|
6
6
|
import { AttestationFieldSchema, RevocationList } from '@noy-db/attestation';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -797,7 +797,7 @@ interface LedgerEntry {
|
|
|
797
797
|
* below for the structured payload.
|
|
798
798
|
*
|
|
799
799
|
* `'lifecycle'` records a non-data audit event (e.g. partition
|
|
800
|
-
* handover
|
|
800
|
+
* handover) — `collection`/`id` are empty and the event detail
|
|
801
801
|
* lives in `reason` (e.g. `'partition-handed-over:<sealId>'`). Like
|
|
802
802
|
* `amendment`, it carries no data envelope, so `verifyBackupIntegrity`
|
|
803
803
|
* skips it in the data cross-check (it still participates in the
|
|
@@ -828,8 +828,8 @@ interface LedgerEntry {
|
|
|
828
828
|
*/
|
|
829
829
|
readonly payloadHash: string;
|
|
830
830
|
/**
|
|
831
|
-
* Optional human-readable tag describing why this mutation happened
|
|
832
|
-
*
|
|
831
|
+
* Optional human-readable tag describing why this mutation happened.
|
|
832
|
+
* Threaded through `collection.put(_, _, { reason })`. Common
|
|
833
833
|
* values include `'import:csv'`, `'import:json'`, `'import:xlsx'` from
|
|
834
834
|
* `as-*` ImportPlan.apply(), but consumers can use any string for
|
|
835
835
|
* domain-specific audit filtering. Auto-strip via `canonicalJson` —
|
|
@@ -1106,8 +1106,8 @@ interface AppendInput {
|
|
|
1106
1106
|
*/
|
|
1107
1107
|
amendment?: LedgerEntry['amendment'];
|
|
1108
1108
|
/**
|
|
1109
|
-
* Optional human-readable tag describing why this mutation happened
|
|
1110
|
-
*
|
|
1109
|
+
* Optional human-readable tag describing why this mutation happened.
|
|
1110
|
+
* Threaded from `collection.put(_, _, { reason })`.
|
|
1111
1111
|
* Carried verbatim onto the resulting ledger entry's `reason` field;
|
|
1112
1112
|
* omitted from canonical JSON when undefined.
|
|
1113
1113
|
*/
|
|
@@ -1769,17 +1769,34 @@ declare function validateI18nTextValue(value: unknown, field: string, descriptor
|
|
|
1769
1769
|
*/
|
|
1770
1770
|
declare function resolveI18nText(value: Record<string, string>, locale: string, fallback?: string | readonly string[], field?: string): string | Record<string, string>;
|
|
1771
1771
|
/**
|
|
1772
|
-
*
|
|
1772
|
+
* Return all leaf values at `path`, expanding `[].` array wildcards.
|
|
1773
|
+
*
|
|
1774
|
+
* - `'name'` → `[obj.name]`
|
|
1775
|
+
* - `'address.lineOne'` → `[obj.address.lineOne]`
|
|
1776
|
+
* - `'contacts[].title'` → `[obj.contacts[0].title, obj.contacts[1].title, …]`
|
|
1777
|
+
*
|
|
1778
|
+
* Returns an empty array when the path does not resolve (missing key,
|
|
1779
|
+
* wrong type, etc.). Used by `enforceI18nOnPut` to validate nested fields.
|
|
1780
|
+
*/
|
|
1781
|
+
declare function getAtPath(obj: Record<string, unknown>, path: string): unknown[];
|
|
1782
|
+
/**
|
|
1783
|
+
* Mutate `obj` in-place, setting `value` at the nested `path`.
|
|
1784
|
+
* Supports dot notation (`'address.lineOne'`) but not array wildcards —
|
|
1785
|
+
* auto-translate on `contacts[].title` style paths is not supported.
|
|
1786
|
+
*/
|
|
1787
|
+
declare function setAtPathInPlace(obj: Record<string, unknown>, path: string, value: unknown): void;
|
|
1788
|
+
/**
|
|
1789
|
+
* Apply locale resolution to a single record, returning a new copy.
|
|
1773
1790
|
*
|
|
1774
1791
|
* For each field registered as an `i18nText` descriptor:
|
|
1775
1792
|
* - If `locale === 'raw'`, the field value is left as the stored map.
|
|
1776
1793
|
* - Otherwise, the field value is replaced with the resolved string.
|
|
1777
1794
|
*
|
|
1778
|
-
*
|
|
1779
|
-
*
|
|
1795
|
+
* Field paths support dot notation (`'address.lineOne'`) and array
|
|
1796
|
+
* wildcards (`'contacts[].title'`). Top-level fields work as before.
|
|
1780
1797
|
*
|
|
1781
1798
|
* @param record The decrypted record.
|
|
1782
|
-
* @param i18nFields Map of field
|
|
1799
|
+
* @param i18nFields Map of field path → `I18nTextDescriptor`.
|
|
1783
1800
|
* @param locale The requested locale (or `'raw'`).
|
|
1784
1801
|
* @param fallback Fallback chain (optional).
|
|
1785
1802
|
*/
|
|
@@ -1848,7 +1865,6 @@ interface PassphrasePolicy {
|
|
|
1848
1865
|
* double-space). For non-space-delimited word semantics, use
|
|
1849
1866
|
* {@link customValidator} instead.
|
|
1850
1867
|
*
|
|
1851
|
-
* Added in pre.8 (#31).
|
|
1852
1868
|
*/
|
|
1853
1869
|
readonly pattern?: RegExp;
|
|
1854
1870
|
/**
|
|
@@ -1866,7 +1882,6 @@ interface PassphrasePolicy {
|
|
|
1866
1882
|
* {@link assertStrongPassphrase} dispatches on — `ok: true` accepts;
|
|
1867
1883
|
* `ok: false` throws `WeakPassphraseError` with the supplied reason.
|
|
1868
1884
|
*
|
|
1869
|
-
* Added in pre.8 (#31).
|
|
1870
1885
|
*/
|
|
1871
1886
|
readonly customValidator?: (phrase: string) => PassphraseValidationResult;
|
|
1872
1887
|
}
|
|
@@ -1983,7 +1998,7 @@ interface UnlockedKeyring {
|
|
|
1983
1998
|
* - Unencrypted mode (no KEK exists)
|
|
1984
1999
|
* - Tier-3 PIN quick-resume (`@noy-db/on-pin`)
|
|
1985
2000
|
* - Wrap-DEKs tier-2 unlock (`@noy-db/on-password`'s
|
|
1986
|
-
* `verifyPasswordSlot`
|
|
2001
|
+
* `verifyPasswordSlot`)
|
|
1987
2002
|
* - Session-state restore (`session/session.ts`)
|
|
1988
2003
|
* - Dev-unlock fixture (`session/dev-unlock.ts`)
|
|
1989
2004
|
*
|
|
@@ -1992,9 +2007,8 @@ interface UnlockedKeyring {
|
|
|
1992
2007
|
* null-check and throw a clear error if absent — re-authenticate
|
|
1993
2008
|
* at tier 1 first to recover the KEK.
|
|
1994
2009
|
*
|
|
1995
|
-
* Tightened from `CryptoKey` to `CryptoKey | null
|
|
1996
|
-
*
|
|
1997
|
-
* matches reality.
|
|
2010
|
+
* Tightened from `CryptoKey` to `CryptoKey | null`; the runtime
|
|
2011
|
+
* contract has always allowed null, the type now matches reality.
|
|
1998
2012
|
*/
|
|
1999
2013
|
readonly kek: CryptoKey | null;
|
|
2000
2014
|
readonly salt: Uint8Array;
|
|
@@ -2015,7 +2029,7 @@ interface UnlockedKeyring {
|
|
|
2015
2029
|
/**
|
|
2016
2030
|
* Tier-2 authenticator slots — readonly snapshot loaded from the
|
|
2017
2031
|
* keyring file. Mutations go through `enrollAuthenticator` /
|
|
2018
|
-
* `removeAuthenticator
|
|
2032
|
+
* `removeAuthenticator`, which write back via
|
|
2019
2033
|
* `persistKeyring`. Always defined; loads with an empty array for
|
|
2020
2034
|
* keyrings written before the multi-slot extension landed.
|
|
2021
2035
|
*/
|
|
@@ -2068,7 +2082,6 @@ declare function revoke(adapter: NoydbStore, vault: string, callerKeyring: Unloc
|
|
|
2068
2082
|
* @throws `PermissionDeniedError` when the role hierarchy rejects.
|
|
2069
2083
|
* @throws `ValidationError` when the diff is empty (nothing to update).
|
|
2070
2084
|
*
|
|
2071
|
-
* @see #54
|
|
2072
2085
|
*/
|
|
2073
2086
|
declare function updateKeyringIdentity(adapter: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: UpdateUserOptions): Promise<void>;
|
|
2074
2087
|
/**
|
|
@@ -2163,7 +2176,7 @@ interface ListUsersOptions {
|
|
|
2163
2176
|
* `userEnvelopeDek` is the vault's `_users` collection DEK
|
|
2164
2177
|
* (`vault.getDEK('_users')`); used to decrypt every envelope.
|
|
2165
2178
|
*
|
|
2166
|
-
* `callerRole`
|
|
2179
|
+
* `callerRole` drives the directory-visibility checks:
|
|
2167
2180
|
*
|
|
2168
2181
|
* - When the vault's `_meta/directory` document has `enabled: false`,
|
|
2169
2182
|
* only `owner` and `admin` callers may enumerate; anyone else gets
|
|
@@ -2173,7 +2186,7 @@ interface ListUsersOptions {
|
|
|
2173
2186
|
* `{ includeHidden: true }` to see them; lower roles passing that
|
|
2174
2187
|
* option get `PermissionDeniedError`.
|
|
2175
2188
|
*
|
|
2176
|
-
* Honest caveat
|
|
2189
|
+
* Honest caveat: these filters are a UX hint, not a security
|
|
2177
2190
|
* boundary. The keyring file is still listed at `_keyring/*` and the
|
|
2178
2191
|
* envelope ciphertext at `_users/*`. A caller with direct store access
|
|
2179
2192
|
* — or a caller that calls this function with `callerRole: 'owner'`
|
|
@@ -2550,7 +2563,7 @@ interface I18nStrategy {
|
|
|
2550
2563
|
}
|
|
2551
2564
|
|
|
2552
2565
|
/**
|
|
2553
|
-
* Observable write-queue
|
|
2566
|
+
* Observable write-queue.
|
|
2554
2567
|
*
|
|
2555
2568
|
* Tracks outstanding in-flight *logical* writes (a full Collection.put /
|
|
2556
2569
|
* delete, including ledger + cache + derivation + MV dispatch — not just
|
|
@@ -2597,7 +2610,7 @@ declare class WriteQueueTracker implements WriteQueue {
|
|
|
2597
2610
|
}
|
|
2598
2611
|
|
|
2599
2612
|
/**
|
|
2600
|
-
* Hub-level write lifecycle hooks
|
|
2613
|
+
* Hub-level write lifecycle hooks. `onBeforeWrite` may abort (throw);
|
|
2601
2614
|
* `onAfterWrite` is awaited and its errors are warned, not thrown. A
|
|
2602
2615
|
* re-entrancy flag suppresses nested firing so a handler that writes can't
|
|
2603
2616
|
* loop. Held on the Noydb instance, threaded into every Collection.
|
|
@@ -2616,15 +2629,15 @@ interface WriteEvent {
|
|
|
2616
2629
|
readonly txId: string;
|
|
2617
2630
|
}
|
|
2618
2631
|
type WriteHook = (event: WriteEvent) => void | Promise<void>;
|
|
2619
|
-
type Unsubscribe$
|
|
2632
|
+
type Unsubscribe$3 = () => void;
|
|
2620
2633
|
declare class WriteHookRegistry {
|
|
2621
2634
|
#private;
|
|
2622
2635
|
/** True while handlers are running — used by the write path to skip nested firing. */
|
|
2623
2636
|
get suppressed(): boolean;
|
|
2624
2637
|
/** True when any hook is registered (cheap gate for the write path). */
|
|
2625
2638
|
get hasHandlers(): boolean;
|
|
2626
|
-
onBeforeWrite(handler: WriteHook): Unsubscribe$
|
|
2627
|
-
onAfterWrite(handler: WriteHook): Unsubscribe$
|
|
2639
|
+
onBeforeWrite(handler: WriteHook): Unsubscribe$3;
|
|
2640
|
+
onAfterWrite(handler: WriteHook): Unsubscribe$3;
|
|
2628
2641
|
/** Run before-hooks (awaited, in order). A throw propagates and aborts the write. */
|
|
2629
2642
|
runBefore(event: WriteEvent): Promise<void>;
|
|
2630
2643
|
/** Run after-hooks (awaited, in order). Per-handler errors are warned, not thrown. */
|
|
@@ -2632,7 +2645,113 @@ declare class WriteHookRegistry {
|
|
|
2632
2645
|
}
|
|
2633
2646
|
|
|
2634
2647
|
/**
|
|
2635
|
-
*
|
|
2648
|
+
* Generic per-instance **observe** bus. Observe-class
|
|
2649
|
+
* subsystems (devtools inspector, audit, sync-dirty notification) register
|
|
2650
|
+
* handlers against named lifecycle points instead of the kernel naming each
|
|
2651
|
+
* subsystem. Mirrors the registry pattern of {@link WriteHookRegistry} but is
|
|
2652
|
+
* internal and keyed by lifecycle point.
|
|
2653
|
+
*
|
|
2654
|
+
* OBSERVE SEMANTICS: handlers react to a write that already happened. A
|
|
2655
|
+
* handler throw is warned, not propagated — it can never abort a write. Write-
|
|
2656
|
+
* *gating* subsystems (guards, periods) need a throw-propagating gate bus.
|
|
2657
|
+
* Add observe points by extending {@link LifecycleEventMap}. Write-*gating*
|
|
2658
|
+
* subsystems use the sibling gate API on this same class
|
|
2659
|
+
* (`registerGate`/`dispatchGate`, throw-propagating); see {@link GateEventMap}.
|
|
2660
|
+
*
|
|
2661
|
+
* @module
|
|
2662
|
+
*/
|
|
2663
|
+
|
|
2664
|
+
/** Typed map of OBSERVE lifecycle point → event payload. Extend by adding keys. */
|
|
2665
|
+
interface LifecycleEventMap {
|
|
2666
|
+
afterPut: WriteEvent;
|
|
2667
|
+
afterDelete: WriteEvent;
|
|
2668
|
+
}
|
|
2669
|
+
type LifecyclePoint = keyof LifecycleEventMap;
|
|
2670
|
+
type BusHandler<P extends LifecyclePoint> = (event: LifecycleEventMap[P]) => void | Promise<void>;
|
|
2671
|
+
type Unsubscribe$2 = () => void;
|
|
2672
|
+
/** Payload for a `beforePut` gate — carries the data guards and periods need to validate or reject a write. */
|
|
2673
|
+
interface GatePutEvent {
|
|
2674
|
+
readonly op: 'create' | 'update';
|
|
2675
|
+
readonly vault: string;
|
|
2676
|
+
readonly collection: string;
|
|
2677
|
+
readonly docId: string;
|
|
2678
|
+
/** The record about to be written (pre schema-validation). */
|
|
2679
|
+
readonly incoming: unknown;
|
|
2680
|
+
/** Decrypted prior record, or null on create / when prior is unreadable. */
|
|
2681
|
+
readonly existing: unknown;
|
|
2682
|
+
/** Prior envelope version, or 0 when none. */
|
|
2683
|
+
readonly existingVersion: number;
|
|
2684
|
+
/** Prior envelope timestamp (`_ts` ISO string), or undefined when none — periods compares against this. */
|
|
2685
|
+
readonly existingTs: string | undefined;
|
|
2686
|
+
readonly userId: string;
|
|
2687
|
+
readonly role: Role;
|
|
2688
|
+
}
|
|
2689
|
+
/** Payload for a `beforeDelete` gate. Like {@link GatePutEvent} without `incoming`. */
|
|
2690
|
+
interface GateDeleteEvent {
|
|
2691
|
+
readonly vault: string;
|
|
2692
|
+
readonly collection: string;
|
|
2693
|
+
readonly docId: string;
|
|
2694
|
+
/** True for system-internal (housekeeping) deletes — handlers branch on this. */
|
|
2695
|
+
readonly internal: boolean;
|
|
2696
|
+
readonly existing: unknown;
|
|
2697
|
+
readonly existingVersion: number;
|
|
2698
|
+
readonly existingTs: string | undefined;
|
|
2699
|
+
readonly userId: string;
|
|
2700
|
+
readonly role: Role;
|
|
2701
|
+
}
|
|
2702
|
+
/** Typed map of GATE lifecycle point → event payload. Extend by adding keys. */
|
|
2703
|
+
interface GateEventMap {
|
|
2704
|
+
beforePut: GatePutEvent;
|
|
2705
|
+
beforeDelete: GateDeleteEvent;
|
|
2706
|
+
}
|
|
2707
|
+
type GatePoint = keyof GateEventMap;
|
|
2708
|
+
type GateHandler<P extends GatePoint> = (event: GateEventMap[P]) => void | Promise<void>;
|
|
2709
|
+
declare class SubsystemBus {
|
|
2710
|
+
#private;
|
|
2711
|
+
/** Register a handler for an observe point. Returns an unsubscribe fn. */
|
|
2712
|
+
register<P extends LifecyclePoint>(point: P, handler: BusHandler<P>): Unsubscribe$2;
|
|
2713
|
+
/** Cheap gate for the write path — true when any handler is registered for the point. */
|
|
2714
|
+
hasHandlers(point: LifecyclePoint): boolean;
|
|
2715
|
+
/**
|
|
2716
|
+
* True while one or more dispatches are in flight. Backed by a depth counter
|
|
2717
|
+
* so that two concurrent async dispatches (`Promise.all([put('a'), put('b')])`
|
|
2718
|
+
* each captured `busAfterPut=true` at their respective put() tops while depth
|
|
2719
|
+
* was 0) both proceed independently — the counter stays > 0 until BOTH finish,
|
|
2720
|
+
* so any nested write attempted by a handler still sees `dispatching === true`
|
|
2721
|
+
* and is suppressed by the write-path gate in `collection.ts`
|
|
2722
|
+
* (`busAfterPut = hasHandlers('afterPut') && !dispatching`). Re-entrancy
|
|
2723
|
+
* suppression lives exclusively on that write-path gate; concurrent independent
|
|
2724
|
+
* dispatches must not drop each other's events.
|
|
2725
|
+
*/
|
|
2726
|
+
get dispatching(): boolean;
|
|
2727
|
+
/**
|
|
2728
|
+
* Dispatch in registration order, awaited. Per-handler errors are warned, not
|
|
2729
|
+
* thrown — an observe handler must never abort a completed write. A
|
|
2730
|
+
* re-entrancy guard suppresses nested firing so a handler that itself writes
|
|
2731
|
+
* cannot loop (same rationale as WriteHookRegistry.#suppressed).
|
|
2732
|
+
*/
|
|
2733
|
+
dispatch<P extends LifecyclePoint>(point: P, event: LifecycleEventMap[P]): Promise<void>;
|
|
2734
|
+
/** Register a write-gating handler. A throw from the handler ABORTS the write. Returns an unsubscribe fn. */
|
|
2735
|
+
registerGate<P extends GatePoint>(point: P, handler: GateHandler<P>): Unsubscribe$2;
|
|
2736
|
+
/** Cheap gate for the write path — true when any gate handler is registered for the point. */
|
|
2737
|
+
hasGateHandlers(point: GatePoint): boolean;
|
|
2738
|
+
/**
|
|
2739
|
+
* Run gate handlers in registration order, awaited. Unlike `dispatch`
|
|
2740
|
+
* (observe), a handler throw is NOT swallowed — it PROPAGATES, aborting the
|
|
2741
|
+
* write before it reaches the store. The first throw stops the remaining
|
|
2742
|
+
* handlers (fail-fast). This is the seam guards/periods migrate onto.
|
|
2743
|
+
*
|
|
2744
|
+
* Note: gate handlers are validators that read, not write. A gate handler
|
|
2745
|
+
* that writes back into the same collection would re-enter the write path
|
|
2746
|
+
* and re-dispatch this point; loop-suppression for that case is deferred to
|
|
2747
|
+
* the migration slice (contract: gate handlers must not perform writes that
|
|
2748
|
+
* re-trigger their own point).
|
|
2749
|
+
*/
|
|
2750
|
+
dispatchGate<P extends GatePoint>(point: P, event: GateEventMap[P]): Promise<void>;
|
|
2751
|
+
}
|
|
2752
|
+
|
|
2753
|
+
/**
|
|
2754
|
+
* Schema-update strategy framework types (M12 §3a).
|
|
2636
2755
|
*
|
|
2637
2756
|
* The hub core detects a schema change (SchemaDelta) and dispatches it
|
|
2638
2757
|
* through a collection's ordered strategy list. Strategies decide what
|
|
@@ -2661,13 +2780,13 @@ interface SchemaDelta {
|
|
|
2661
2780
|
interface UpdateContext {
|
|
2662
2781
|
readonly collection: string;
|
|
2663
2782
|
}
|
|
2664
|
-
/** Bulk transform run by the coordinatedCutover strategy
|
|
2783
|
+
/** Bulk transform run by the coordinatedCutover strategy. */
|
|
2665
2784
|
type TransformFn = (doc: Record<string, unknown>) => Record<string, unknown>;
|
|
2666
2785
|
/**
|
|
2667
2786
|
* A strategy's verdict on a detected schema change.
|
|
2668
2787
|
* - `allow` — no objection; the dispatcher falls through to the next strategy.
|
|
2669
2788
|
* - `reject` — terminal: refuse the change; `error` is thrown at the write path.
|
|
2670
|
-
* - `cutover` — terminal: run a coordinated drain-barrier (handled by
|
|
2789
|
+
* - `cutover` — terminal: run a coordinated drain-barrier (handled by coordinatedCutover).
|
|
2671
2790
|
* New terminal actions may be added without breaking existing strategies.
|
|
2672
2791
|
*/
|
|
2673
2792
|
type UpdateDecision = {
|
|
@@ -2686,7 +2805,7 @@ interface SchemaUpdateStrategy {
|
|
|
2686
2805
|
}
|
|
2687
2806
|
|
|
2688
2807
|
/**
|
|
2689
|
-
* Per-collection write gate
|
|
2808
|
+
* Per-collection write gate. Holds the (async) update decision
|
|
2690
2809
|
* computed at registration; `Collection.put`/`delete` await it before
|
|
2691
2810
|
* writing and throw the strategy's rejection error.
|
|
2692
2811
|
*
|
|
@@ -2703,7 +2822,7 @@ declare class SchemaUpdateGate {
|
|
|
2703
2822
|
}
|
|
2704
2823
|
|
|
2705
2824
|
/**
|
|
2706
|
-
* Schema-fence document
|
|
2825
|
+
* Schema-fence document. Vault-level generation counter + drain
|
|
2707
2826
|
* state, stored at `_meta/schema-fence` using the plaintext-envelope
|
|
2708
2827
|
* pattern of `_meta/policy` (no PII — a counter + a state enum).
|
|
2709
2828
|
*/
|
|
@@ -2715,7 +2834,7 @@ interface FenceDoc {
|
|
|
2715
2834
|
}
|
|
2716
2835
|
|
|
2717
2836
|
/**
|
|
2718
|
-
* Vault-level schema-fence controller
|
|
2837
|
+
* Vault-level schema-fence controller.
|
|
2719
2838
|
*
|
|
2720
2839
|
* Owns the open-time generation snapshot, the pending-cutover registry,
|
|
2721
2840
|
* and the cutover orchestration. 3a: single-client (the caller is the
|
|
@@ -3313,7 +3432,7 @@ declare class SyncEngine {
|
|
|
3313
3432
|
}
|
|
3314
3433
|
|
|
3315
3434
|
/**
|
|
3316
|
-
* **Wrap-DEKs primitive
|
|
3435
|
+
* **Wrap-DEKs primitive** — a single canonical shape for the
|
|
3317
3436
|
* pattern of "serialize a DEK set, encrypt it under a credential-derived
|
|
3318
3437
|
* AES-GCM key." Used by:
|
|
3319
3438
|
*
|
|
@@ -3331,7 +3450,7 @@ declare class SyncEngine {
|
|
|
3331
3450
|
* `PIN_PBKDF2_ITERATIONS` and the threat-model rationale in its
|
|
3332
3451
|
* module docstring.
|
|
3333
3452
|
*
|
|
3334
|
-
*
|
|
3453
|
+
* Previously, the same crypto lived in two places: `mintPaperRecoveryEntry`
|
|
3335
3454
|
* (in `team/recovery.ts`) and `enrollPasswordAuthenticator` (in
|
|
3336
3455
|
* `@noy-db/on-password`). Both functions did identical work — PBKDF2
|
|
3337
3456
|
* the credential, AES-GCM-encrypt the JSON-serialized DEK set — but
|
|
@@ -3358,7 +3477,7 @@ declare class SyncEngine {
|
|
|
3358
3477
|
* Composition: `PaperRecoveryEntry extends WrappedDeksBlob` plus
|
|
3359
3478
|
* `{ codeId, enrolledAt }`. `KeyringAuthenticatorWrappingDEKs`
|
|
3360
3479
|
* carries the same three fields with `salt` stored in `meta` for
|
|
3361
|
-
* slot-format back-compat (
|
|
3480
|
+
* slot-format back-compat (defers moving it to top-level).
|
|
3362
3481
|
*/
|
|
3363
3482
|
interface WrappedDeksBlob {
|
|
3364
3483
|
/** Base64 PBKDF2 salt for the credential-derived wrapping key. */
|
|
@@ -3415,9 +3534,9 @@ interface ShamirRecoveryProvider {
|
|
|
3415
3534
|
}
|
|
3416
3535
|
|
|
3417
3536
|
/**
|
|
3418
|
-
* Recovery profile persistence + dispatch
|
|
3537
|
+
* Recovery profile persistence + dispatch.
|
|
3419
3538
|
*
|
|
3420
|
-
*
|
|
3539
|
+
* Wires the **paper** profile end-to-end through
|
|
3421
3540
|
* `@noy-db/on-recovery`. The other three profiles (Shamir,
|
|
3422
3541
|
* multi-channel, admin-mediated) ship the API surface and throw
|
|
3423
3542
|
* {@link RecoveryProfileNotImplementedError} during use; per-profile
|
|
@@ -3454,7 +3573,7 @@ interface ShamirRecoveryProvider {
|
|
|
3454
3573
|
* PBKDF2-derived key), and it sidesteps the non-extractable-KEK
|
|
3455
3574
|
* constraint cleanly.
|
|
3456
3575
|
*
|
|
3457
|
-
* Type-level composition
|
|
3576
|
+
* Type-level composition: `PaperRecoveryEntry extends
|
|
3458
3577
|
* WrappedDeksBlob` — the three crypto fields (`salt`, `iv`,
|
|
3459
3578
|
* `wrappedDeks`) come from the shared primitive; `codeId` and
|
|
3460
3579
|
* `enrolledAt` are paper-recovery's own metadata. Wire format
|
|
@@ -3568,7 +3687,7 @@ declare function unwrapDeksFromShamirEntry(provider: ShamirRecoveryProvider, ent
|
|
|
3568
3687
|
* {@link savePaperRecoveryEntries}). The recovery flow unwraps the
|
|
3569
3688
|
* DEK set, then mints a fresh KEK from the user's new passphrase.
|
|
3570
3689
|
*
|
|
3571
|
-
* Thin wrapper over {@link mintWrappedDeksBlob}
|
|
3690
|
+
* Thin wrapper over {@link mintWrappedDeksBlob} — the crypto
|
|
3572
3691
|
* lives in the shared primitive; this function just adds paper-
|
|
3573
3692
|
* recovery's own metadata (`codeId`, `enrolledAt`).
|
|
3574
3693
|
*
|
|
@@ -3583,14 +3702,14 @@ declare function mintPaperRecoveryEntry(deks: Map<string, CryptoKey>, code: stri
|
|
|
3583
3702
|
* Decrypt a recovery entry to recover the raw DEK set. Used by the
|
|
3584
3703
|
* `recoverPassphrase` flow after the user's code has been parsed.
|
|
3585
3704
|
*
|
|
3586
|
-
* Thin wrapper over {@link unwrapDeksFromBlob}
|
|
3705
|
+
* Thin wrapper over {@link unwrapDeksFromBlob}.
|
|
3587
3706
|
*
|
|
3588
3707
|
* @throws when the code does not match the entry (AES-GCM auth tag fail).
|
|
3589
3708
|
*/
|
|
3590
3709
|
declare function unwrapDeksFromPaperEntry(entry: PaperRecoveryEntry, code: string): Promise<Map<string, CryptoKey>>;
|
|
3591
3710
|
|
|
3592
3711
|
/**
|
|
3593
|
-
* Tier-2 authenticator slot management
|
|
3712
|
+
* Tier-2 authenticator slot management.
|
|
3594
3713
|
*
|
|
3595
3714
|
* Each slot independently wraps the SAME KEK under a method-specific
|
|
3596
3715
|
* derived key (LUKS pattern). Enrolling adds a slot; removing drops
|
|
@@ -3640,15 +3759,14 @@ type EnrollAuthenticatorOptions = EnrollAuthenticatorWrappingKEKOptions | Enroll
|
|
|
3640
3759
|
*/
|
|
3641
3760
|
declare function enrollAuthenticator(store: NoydbStore, vault: string, keyring: UnlockedKeyring, options: EnrollAuthenticatorOptions): Promise<UnlockedKeyring>;
|
|
3642
3761
|
/**
|
|
3643
|
-
* Caller payload for {@link updateAuthenticator}
|
|
3762
|
+
* Caller payload for {@link updateAuthenticator}. Mutates only
|
|
3644
3763
|
* `meta` — the slot's id, method, and wrap material are immutable
|
|
3645
3764
|
* through this primitive, preserving the anti-slot-swap guard.
|
|
3646
3765
|
*
|
|
3647
3766
|
* `meta` is **merged** at the top level: keys absent from the patch
|
|
3648
3767
|
* are preserved, keys present overwrite. To clear a meta key, pass
|
|
3649
|
-
* `null` for that key explicitly. (Same semantics as
|
|
3650
|
-
* `UserApi.updateMe`,
|
|
3651
|
-
* into nested meta values.)
|
|
3768
|
+
* `null` for that key explicitly. (Same top-level merge semantics as
|
|
3769
|
+
* `UserApi.updateMe`, non-recursive — meta is a flat label bag.)
|
|
3652
3770
|
*/
|
|
3653
3771
|
interface UpdateAuthenticatorOptions {
|
|
3654
3772
|
readonly meta?: Record<string, unknown>;
|
|
@@ -3670,7 +3788,6 @@ interface UpdateAuthenticatorOptions {
|
|
|
3670
3788
|
* @throws `NoAccessError` when no slot with the given id exists.
|
|
3671
3789
|
* @throws `ValidationError` when no patch field is provided.
|
|
3672
3790
|
*
|
|
3673
|
-
* @see #55
|
|
3674
3791
|
*/
|
|
3675
3792
|
declare function updateAuthenticator(store: NoydbStore, vault: string, keyring: UnlockedKeyring, slotId: string, options: UpdateAuthenticatorOptions): Promise<UnlockedKeyring>;
|
|
3676
3793
|
/**
|
|
@@ -3687,7 +3804,7 @@ declare function findAuthenticator(keyring: UnlockedKeyring, slotId: string): Ke
|
|
|
3687
3804
|
|
|
3688
3805
|
/**
|
|
3689
3806
|
* Tier-1 change flows — `rotatePassphrase` (user remembers old) and
|
|
3690
|
-
* `recoverPassphrase` (user supplies a recovery proof).
|
|
3807
|
+
* `recoverPassphrase` (user supplies a recovery proof).
|
|
3691
3808
|
*
|
|
3692
3809
|
* The two flows share the post-verification half — fresh salt, fresh
|
|
3693
3810
|
* KEK, rewrap every DEK — and differ only in how they re-derive the
|
|
@@ -3753,10 +3870,9 @@ interface RotatePassphraseInput {
|
|
|
3753
3870
|
* Map of slot id → re-enrolment ceremony. Slots whose id appears
|
|
3754
3871
|
* here are PRESERVED across rotation (the ceremony re-derives the
|
|
3755
3872
|
* method-specific wrapping under the new keyring); slots whose id
|
|
3756
|
-
* is absent are DROPPED (the pre
|
|
3873
|
+
* is absent are DROPPED (the pre-slot-ceremony behavior).
|
|
3757
3874
|
*
|
|
3758
|
-
* Without this map, `rotatePassphrase`
|
|
3759
|
-
* behavior of wiping every tier-2 slot. Consumers building a
|
|
3875
|
+
* Without this map, `rotatePassphrase` wipes every tier-2 slot. Consumers building a
|
|
3760
3876
|
* "rotate without losing my biometric" flow supply ceremonies for
|
|
3761
3877
|
* each slot they want to keep.
|
|
3762
3878
|
*
|
|
@@ -3764,7 +3880,7 @@ interface RotatePassphraseInput {
|
|
|
3764
3880
|
* state. Callers wrap individual ceremonies in try/catch + return
|
|
3765
3881
|
* a sentinel if they want graceful degradation per slot.
|
|
3766
3882
|
*
|
|
3767
|
-
* Added
|
|
3883
|
+
* Added when slot-ceremony rewrapping landed.
|
|
3768
3884
|
*/
|
|
3769
3885
|
readonly slotCeremonies?: {
|
|
3770
3886
|
readonly [slotId: string]: SlotRewrapCeremony;
|
|
@@ -3775,10 +3891,10 @@ interface RotatePassphraseInput {
|
|
|
3775
3891
|
* under a freshly-derived KEK from `newPassphrase`, and persist.
|
|
3776
3892
|
*
|
|
3777
3893
|
* Tier-2 authenticator slots are dropped UNLESS the caller supplies
|
|
3778
|
-
* a `slotCeremonies` map
|
|
3894
|
+
* a `slotCeremonies` map — each ceremony re-derives its
|
|
3779
3895
|
* method-specific wrapping under the new keyring, and hub persists
|
|
3780
3896
|
* the rewrapped slots atomically with the rotation. Slots whose id
|
|
3781
|
-
* isn't in the map are still dropped
|
|
3897
|
+
* isn't in the map are still dropped.
|
|
3782
3898
|
*
|
|
3783
3899
|
* @throws `InvalidKeyError` if `oldPassphrase` does not unwrap the keyring.
|
|
3784
3900
|
* @throws `WeakPassphraseError` if `newPassphrase` fails the strength rule.
|
|
@@ -3789,7 +3905,7 @@ declare function rotatePassphrase(store: NoydbStore, vault: string, userId: stri
|
|
|
3789
3905
|
/**
|
|
3790
3906
|
* Caller payload for {@link recoverPassphrase}.
|
|
3791
3907
|
*
|
|
3792
|
-
*
|
|
3908
|
+
* `paper` and `shamir` are wired end-to-end.
|
|
3793
3909
|
* The remaining two profiles (`multi-channel`, `admin-mediated`)
|
|
3794
3910
|
* stay outside the union and throw
|
|
3795
3911
|
* {@link RecoveryProfileNotImplementedError} at the runtime guard
|
|
@@ -3819,7 +3935,7 @@ interface RecoverPassphraseInput {
|
|
|
3819
3935
|
* After a successful paper-recovery, replace ALL remaining recovery
|
|
3820
3936
|
* entries with freshly-minted ones. Defaults to `true` (defensive).
|
|
3821
3937
|
*
|
|
3822
|
-
* Rationale
|
|
3938
|
+
* Rationale: the user just demonstrated they had access
|
|
3823
3939
|
* to AT LEAST one code. The remaining codes from the same printed
|
|
3824
3940
|
* sheet may also be compromised — photographed, leaked via a
|
|
3825
3941
|
* screen-share slip, or in the hands of whoever stole the sheet.
|
|
@@ -3869,7 +3985,7 @@ interface RecoverPassphraseResult {
|
|
|
3869
3985
|
readonly newCodes: readonly string[];
|
|
3870
3986
|
}
|
|
3871
3987
|
/**
|
|
3872
|
-
* Input for {@link Noydb.rotateRecovery}
|
|
3988
|
+
* Input for {@link Noydb.rotateRecovery} — deliberate
|
|
3873
3989
|
* recovery-credential regeneration when the user knows their
|
|
3874
3990
|
* passphrase but wants a fresh sheet (paper) or fresh shares
|
|
3875
3991
|
* (shamir). Symmetric to {@link RotatePassphraseInput}.
|
|
@@ -3920,7 +4036,7 @@ interface EnrollRecoveryResult {
|
|
|
3920
4036
|
}
|
|
3921
4037
|
/**
|
|
3922
4038
|
* Input shape for {@link Noydb.enrollRecovery} and
|
|
3923
|
-
* {@link Noydb.openVaultAndEnrollRecovery}
|
|
4039
|
+
* {@link Noydb.openVaultAndEnrollRecovery}. Discriminated
|
|
3924
4040
|
* union over recovery profiles.
|
|
3925
4041
|
*
|
|
3926
4042
|
* - `paper`: caller pre-mints entries (typically via
|
|
@@ -3946,9 +4062,8 @@ type RecoveryEnrollmentInput = {
|
|
|
3946
4062
|
readonly entryId?: string;
|
|
3947
4063
|
};
|
|
3948
4064
|
/**
|
|
3949
|
-
* Reset the user's passphrase using a recovery proof.
|
|
3950
|
-
*
|
|
3951
|
-
* persisted in `_meta/recovery-paper`. The other three profiles throw
|
|
4065
|
+
* Reset the user's passphrase using a recovery proof.
|
|
4066
|
+
* Supports `'paper'` and `'shamir'` profiles. The other profiles throw
|
|
3952
4067
|
* {@link RecoveryProfileNotImplementedError}.
|
|
3953
4068
|
*
|
|
3954
4069
|
* On success, the used recovery entry is burned (deleted from the
|
|
@@ -3957,7 +4072,7 @@ type RecoveryEnrollmentInput = {
|
|
|
3957
4072
|
declare function recoverPassphrase(provider: ShamirRecoveryProvider | undefined, store: NoydbStore, vault: string, userId: string, input: RecoverPassphraseInput): Promise<UnlockedKeyring>;
|
|
3958
4073
|
|
|
3959
4074
|
/**
|
|
3960
|
-
* Atomic peer-recovery primitive
|
|
4075
|
+
* Atomic peer-recovery primitive.
|
|
3961
4076
|
*
|
|
3962
4077
|
* `recoverUser` is a SEPARATE operation from `revoke + grant`. It
|
|
3963
4078
|
* exists because peer-recovery has different semantics than account
|
|
@@ -3986,7 +4101,7 @@ declare function recoverPassphrase(provider: ShamirRecoveryProvider | undefined,
|
|
|
3986
4101
|
*
|
|
3987
4102
|
* Caller must be at least as privileged as the target. The hub
|
|
3988
4103
|
* `db.recoverUser` method gates this with the `peer-recover-user`
|
|
3989
|
-
* policy gate (
|
|
4104
|
+
* policy gate (the `peer-recover-user` factor-proof requirement); the function below
|
|
3990
4105
|
* enforces only the role + anti-privilege-escalation invariants.
|
|
3991
4106
|
*
|
|
3992
4107
|
* @module
|
|
@@ -4142,7 +4257,7 @@ declare function validatePublicEnvelopeInput(input: SetPublicEnvelopeInput, sche
|
|
|
4142
4257
|
declare function isPublicEnvelope(x: unknown): x is PublicEnvelope;
|
|
4143
4258
|
|
|
4144
4259
|
/**
|
|
4145
|
-
* Multi-tab coordination
|
|
4260
|
+
* Multi-tab coordination: primary/secondary election (Web Locks)
|
|
4146
4261
|
* + presence heartbeat (BroadcastChannel). Browser-only; opt-in; no-op
|
|
4147
4262
|
* when the APIs are absent. The lock/channel interfaces are hub-local
|
|
4148
4263
|
* (structurally compatible with @noy-db/by-peer + @noy-db/by-tabs, but
|
|
@@ -4186,20 +4301,20 @@ interface TabCoordinationOptions {
|
|
|
4186
4301
|
*/
|
|
4187
4302
|
readonly closeChannelOnDispose?: boolean;
|
|
4188
4303
|
/**
|
|
4189
|
-
* Also propagate committed writes to other tabs
|
|
4304
|
+
* Also propagate committed writes to other tabs. Default true:
|
|
4190
4305
|
* when tab coordination is enabled and a channel is available, a write in
|
|
4191
4306
|
* one tab refreshes that document in every other tab. Set false to opt out.
|
|
4192
4307
|
*/
|
|
4193
4308
|
readonly propagateWrites?: boolean;
|
|
4194
4309
|
/**
|
|
4195
|
-
* Channel for write propagation
|
|
4310
|
+
* Channel for write propagation — distinct from the presence
|
|
4196
4311
|
* channel. Default: an inline BroadcastChannel on `noydb:tab-writes`.
|
|
4197
4312
|
*/
|
|
4198
4313
|
readonly writeChannel?: TabChannel;
|
|
4199
4314
|
}
|
|
4200
4315
|
|
|
4201
4316
|
/**
|
|
4202
|
-
* Per-vault tier-3 (PIN / quick-resume) state
|
|
4317
|
+
* Per-vault tier-3 (PIN / quick-resume) state.
|
|
4203
4318
|
*
|
|
4204
4319
|
* The hub holds a `PinResumeState`-shaped record in memory, keyed by
|
|
4205
4320
|
* vault. `enrollUnlock` populates it; `unlockViaPin` consumes it via
|
|
@@ -4315,7 +4430,7 @@ interface StagedOp {
|
|
|
4315
4430
|
expectedVersion?: number;
|
|
4316
4431
|
/**
|
|
4317
4432
|
* Optional human-readable tag forwarded to the resulting ledger
|
|
4318
|
-
* entry's `reason` field
|
|
4433
|
+
* entry's `reason` field. Set by callers via
|
|
4319
4434
|
* `tx.vault(v).collection(c).put(id, record, { reason })`.
|
|
4320
4435
|
*/
|
|
4321
4436
|
reason?: string;
|
|
@@ -4347,7 +4462,7 @@ interface AmendmentTxOptions {
|
|
|
4347
4462
|
* facade; its `put`/`delete`/`get` calls stage ops against the tx.
|
|
4348
4463
|
*/
|
|
4349
4464
|
declare class TxContext {
|
|
4350
|
-
/** Stable id for this transaction; shared by all writes it performs
|
|
4465
|
+
/** Stable id for this transaction; shared by all writes it performs. */
|
|
4351
4466
|
readonly txId: string;
|
|
4352
4467
|
/** @internal */
|
|
4353
4468
|
readonly _ops: StagedOp[];
|
|
@@ -4357,7 +4472,7 @@ declare class TxContext {
|
|
|
4357
4472
|
* restore prior state via `revertExecuted`. Side-effect writes (e.g.
|
|
4358
4473
|
* recursive derivation outputs fired inside `Collection.put`) are
|
|
4359
4474
|
* appended here in execution order so they roll back alongside the
|
|
4360
|
-
* main staged ops
|
|
4475
|
+
* main staged ops.
|
|
4361
4476
|
*/
|
|
4362
4477
|
readonly _executed: ExecutedOp[];
|
|
4363
4478
|
/** @internal */
|
|
@@ -4429,12 +4544,12 @@ declare class TxCollection<T> {
|
|
|
4429
4544
|
* in `noydb.ts`. `Collection.putManyAtomic` runs its own Phase 2 loop
|
|
4430
4545
|
* but shares the `_activeTxContext` mechanism (and the `revertExecuted`
|
|
4431
4546
|
* helper) so nested side-effect derivation writes get registered for
|
|
4432
|
-
* revert alongside the bulk-put source ops
|
|
4547
|
+
* revert alongside the bulk-put source ops.
|
|
4433
4548
|
*/
|
|
4434
4549
|
declare function runTransaction<T>(db: Noydb, fn: (tx: TxContext) => Promise<T> | T, options?: AmendmentTxOptions): Promise<T>;
|
|
4435
4550
|
|
|
4436
4551
|
/**
|
|
4437
|
-
* Dry-run transactions
|
|
4552
|
+
* Dry-run transactions. Runs the tx body to STAGE ops, then builds
|
|
4438
4553
|
* the directly-affected diff (before = current committed via collection.get,
|
|
4439
4554
|
* after = staged record) and collects guard violations — without executing
|
|
4440
4555
|
* phase 2. No adapter writes, no write-hooks, no commit. MV/derivation
|
|
@@ -4462,7 +4577,7 @@ interface DryRunResult {
|
|
|
4462
4577
|
}
|
|
4463
4578
|
|
|
4464
4579
|
/**
|
|
4465
|
-
* Policy gate DSL types
|
|
4580
|
+
* Policy gate DSL types.
|
|
4466
4581
|
*
|
|
4467
4582
|
* Sensitive operations (rotate the passphrase, enroll an authenticator,
|
|
4468
4583
|
* export plaintext, grant a user, …) are gated by a typed policy
|
|
@@ -4496,12 +4611,10 @@ interface DryRunResult {
|
|
|
4496
4611
|
* devices — policies can require ANY of them or insist on a count of 2
|
|
4497
4612
|
* to force a mix.
|
|
4498
4613
|
*
|
|
4499
|
-
*
|
|
4500
|
-
*
|
|
4501
|
-
*
|
|
4502
|
-
*
|
|
4503
|
-
* pin "any second factor I have wired" without losing the freshness
|
|
4504
|
-
* guarantee.
|
|
4614
|
+
* `webauthn-platform`, `password`, `pin` — for consumers with no
|
|
4615
|
+
* off-device infrastructure (no TOTP, no email-OTP, paper recovery not
|
|
4616
|
+
* enrolled) who want to require "any second factor I have wired"
|
|
4617
|
+
* without losing the freshness guarantee.
|
|
4505
4618
|
*/
|
|
4506
4619
|
type FactorKind = 'totp' | 'email-otp' | 'recovery' | 'shamir' | 'webauthn-roaming' | 'webauthn-platform' | 'password' | 'pin';
|
|
4507
4620
|
/**
|
|
@@ -4545,7 +4658,7 @@ interface GatePolicy {
|
|
|
4545
4658
|
type BuiltInGateName = 'rotate-passphrase' | 'recover-passphrase' | 'enroll-authenticator' | 'remove-authenticator'
|
|
4546
4659
|
/**
|
|
4547
4660
|
* Authorize a deliberate paper-recovery-code regeneration —
|
|
4548
|
-
* `db.rotateRecovery
|
|
4661
|
+
* `db.rotateRecovery`. Symmetric to `rotate-passphrase` for
|
|
4549
4662
|
* the case where the user remembers their passphrase but wants a
|
|
4550
4663
|
* fresh sheet (lost the printout, suspect compromise of the off-site
|
|
4551
4664
|
* copy). PERSONAL allows tier-1; STRICT requires an off-device
|
|
@@ -4555,19 +4668,19 @@ type BuiltInGateName = 'rotate-passphrase' | 'recover-passphrase' | 'enroll-auth
|
|
|
4555
4668
|
| 'rotate-recovery'
|
|
4556
4669
|
/**
|
|
4557
4670
|
* Authorize a meta-only mutation on an existing authenticator slot —
|
|
4558
|
-
* `db.updateAuthenticator
|
|
4671
|
+
* `db.updateAuthenticator`. The slot's wrap material, id, and
|
|
4559
4672
|
* method are immutable through this gate; only the `meta` blob
|
|
4560
4673
|
* (nicknames, method-specific labels) can change. Anti-slot-swap
|
|
4561
4674
|
* guard is preserved structurally regardless of this gate's
|
|
4562
4675
|
* settings.
|
|
4563
4676
|
*/
|
|
4564
4677
|
| 'update-authenticator' | 'rotate-unlock' | 'enroll-user' | 'revoke-user' | 'export-bundle' | 'export-plaintext' | 'view-user-auth'
|
|
4565
|
-
/** Authorize a write to one's own user envelope
|
|
4678
|
+
/** Authorize a write to one's own user envelope. */
|
|
4566
4679
|
| 'edit-own-profile'
|
|
4567
|
-
/** Authorize reading other principals' user envelopes
|
|
4680
|
+
/** Authorize reading other principals' user envelopes. */
|
|
4568
4681
|
| 'view-team-profiles'
|
|
4569
4682
|
/**
|
|
4570
|
-
* Authorize an atomic peer-recovery — `db.recoverUser
|
|
4683
|
+
* Authorize an atomic peer-recovery — `db.recoverUser`.
|
|
4571
4684
|
* Distinct from `revoke-user` because peer-recovery is intentional
|
|
4572
4685
|
* re-issuance of someone's keyring under a temp passphrase, NOT
|
|
4573
4686
|
* removal. Allows owner→owner natively (matches the threat model:
|
|
@@ -4577,7 +4690,7 @@ type BuiltInGateName = 'rotate-passphrase' | 'recover-passphrase' | 'enroll-auth
|
|
|
4577
4690
|
*/
|
|
4578
4691
|
| 'peer-recover-user'
|
|
4579
4692
|
/**
|
|
4580
|
-
* Authorize a post-grant identity mutation — `db.updateUser
|
|
4693
|
+
* Authorize a post-grant identity mutation — `db.updateUser`.
|
|
4581
4694
|
* Covers `role`, `displayName`, `permissions` changes on an existing
|
|
4582
4695
|
* keyring. Pure plaintext-header rewrite — no DEKs touched, no KEK
|
|
4583
4696
|
* required. The role-elevation guard inside the implementation
|
|
@@ -4590,7 +4703,7 @@ type GateName = BuiltInGateName | `app:${string}`;
|
|
|
4590
4703
|
/**
|
|
4591
4704
|
* Top-level policy object. Persisted at `_meta/policy` once at vault
|
|
4592
4705
|
* creation. The `passphrase` block configures the strength rules
|
|
4593
|
-
* applied at every passphrase ingress
|
|
4706
|
+
* applied at every passphrase ingress; `gates` configures
|
|
4594
4707
|
* the action-level requirements.
|
|
4595
4708
|
*/
|
|
4596
4709
|
interface VaultPolicy {
|
|
@@ -4614,7 +4727,7 @@ interface FactorProof {
|
|
|
4614
4727
|
* `db.recoverUser`, `db.enrollUnlock`, `db.describeUserAuth`,
|
|
4615
4728
|
* `db.describeAllUsersAuth`.
|
|
4616
4729
|
*
|
|
4617
|
-
*
|
|
4730
|
+
* Previously this type was inlined at every call site as
|
|
4618
4731
|
* `{ factors?: ReadonlyArray<FactorProof>; sharedDevice?: boolean }`
|
|
4619
4732
|
* and parameter names alternated between `factors` and `presented`.
|
|
4620
4733
|
* Now exported so consumers can name their helpers and so the param
|
|
@@ -4634,13 +4747,14 @@ declare class Noydb {
|
|
|
4634
4747
|
private readonly emitter;
|
|
4635
4748
|
private readonly writeQueueTracker;
|
|
4636
4749
|
private readonly writeHooks;
|
|
4750
|
+
private readonly subsystemBus;
|
|
4637
4751
|
private readonly clientId;
|
|
4638
4752
|
private readonly vaultCache;
|
|
4639
4753
|
private readonly keyringCache;
|
|
4640
4754
|
private readonly syncEngines;
|
|
4641
4755
|
/**
|
|
4642
4756
|
* Per-vault active session tier — defaults to `1` after a passphrase
|
|
4643
|
-
* unlock; tier-2 / tier-3 unlocks
|
|
4757
|
+
* unlock; tier-2 / tier-3 unlocks downgrade it. Used by
|
|
4644
4758
|
* {@link checkGate} to evaluate `gate.minTier`.
|
|
4645
4759
|
*/
|
|
4646
4760
|
private readonly activeTier;
|
|
@@ -4650,14 +4764,14 @@ declare class Noydb {
|
|
|
4650
4764
|
*/
|
|
4651
4765
|
private readonly policyCache;
|
|
4652
4766
|
/**
|
|
4653
|
-
* One-shot bypass for the managed-mode strong-recovery check
|
|
4767
|
+
* One-shot bypass for the managed-mode strong-recovery check.
|
|
4654
4768
|
* Set true by {@link openVaultAndEnrollRecovery} for the duration of
|
|
4655
4769
|
* the bootstrap window so the keyring can be created before the
|
|
4656
4770
|
* strong recovery is enrolled. Always cleared (try/finally).
|
|
4657
4771
|
* @internal
|
|
4658
4772
|
*/
|
|
4659
4773
|
private _skipNextManagedRecoveryCheck;
|
|
4660
|
-
/** Per-vault tier-3 (PIN / quick-resume) state
|
|
4774
|
+
/** Per-vault tier-3 (PIN / quick-resume) state. */
|
|
4661
4775
|
private readonly quickUnlock;
|
|
4662
4776
|
/**
|
|
4663
4777
|
* Resolved public-envelope schema. Lazily computed once from
|
|
@@ -4667,9 +4781,9 @@ declare class Noydb {
|
|
|
4667
4781
|
private readonly publicEnvelopeSchema;
|
|
4668
4782
|
private closed;
|
|
4669
4783
|
private sessionTimer;
|
|
4670
|
-
/** Same-device multi-tab coordinator
|
|
4784
|
+
/** Same-device multi-tab coordinator; created on `enableTabCoordination()`. */
|
|
4671
4785
|
private tabCoordinator;
|
|
4672
|
-
/** Cross-tab write relay
|
|
4786
|
+
/** Cross-tab write relay; created on `enableTabCoordination()`. */
|
|
4673
4787
|
private writeRelay;
|
|
4674
4788
|
/** Per-vault policy enforcers. */
|
|
4675
4789
|
private readonly policyEnforcers;
|
|
@@ -4682,8 +4796,8 @@ declare class Noydb {
|
|
|
4682
4796
|
* the same function's `finally` block. Side-effect writes triggered
|
|
4683
4797
|
* during a staged op's `Collection.put` (today: eager derivation
|
|
4684
4798
|
* outputs) register their pre-write envelope on `_executed` here so
|
|
4685
|
-
* a mid-batch failure rolls them back alongside the main staged ops
|
|
4686
|
-
*
|
|
4799
|
+
* a mid-batch failure rolls them back alongside the main staged ops.
|
|
4800
|
+
* `null` outside of Phase 2.
|
|
4687
4801
|
* @internal
|
|
4688
4802
|
*/
|
|
4689
4803
|
private _activeTxContext;
|
|
@@ -4786,8 +4900,6 @@ declare class Noydb {
|
|
|
4786
4900
|
* @throws `NoAccessError` when no keyring exists for the target.
|
|
4787
4901
|
* @throws `PermissionDeniedError` when the role hierarchy rejects.
|
|
4788
4902
|
* @throws `ValidationError` when no field is provided.
|
|
4789
|
-
*
|
|
4790
|
-
* @see #54
|
|
4791
4903
|
*/
|
|
4792
4904
|
updateUser(vault: string, options: UpdateUserOptions, factors?: FactorProofBundle): Promise<void>;
|
|
4793
4905
|
/**
|
|
@@ -4975,7 +5087,7 @@ declare class Noydb {
|
|
|
4975
5087
|
*/
|
|
4976
5088
|
transaction<T>(options: AmendmentTxOptions, fn: (tx: TxContext) => Promise<T> | T): Promise<T>;
|
|
4977
5089
|
/**
|
|
4978
|
-
* Dry-run a transaction
|
|
5090
|
+
* Dry-run a transaction: run the body to stage ops, then return
|
|
4979
5091
|
* the directly-affected diff + collected guard violations WITHOUT
|
|
4980
5092
|
* committing (no adapter writes, no write hooks). MV/derivation cascade
|
|
4981
5093
|
* is not simulated. Requires `withTransactions()`.
|
|
@@ -5003,7 +5115,7 @@ declare class Noydb {
|
|
|
5003
5115
|
* Phase 2. `Collection.dispatchDerivations` consults this so a
|
|
5004
5116
|
* recursive derived-output write inside `Collection.put` can register
|
|
5005
5117
|
* its envelope onto `ctx._executed` and roll back with the main
|
|
5006
|
-
* staged ops on mid-batch failure
|
|
5118
|
+
* staged ops on mid-batch failure.
|
|
5007
5119
|
*
|
|
5008
5120
|
* @internal
|
|
5009
5121
|
*/
|
|
@@ -5028,7 +5140,7 @@ declare class Noydb {
|
|
|
5028
5140
|
* `Collection.putManyAtomic` (via `derivationSource.createTxContext`)
|
|
5029
5141
|
* to publish an active context for the duration of its bulk-atomic
|
|
5030
5142
|
* Phase 2 loop, so recursive derivation-output writes register on
|
|
5031
|
-
* `ctx._executed` and roll back together with the source ops
|
|
5143
|
+
* `ctx._executed` and roll back together with the source ops.
|
|
5032
5144
|
*
|
|
5033
5145
|
* @internal
|
|
5034
5146
|
*/
|
|
@@ -5064,19 +5176,19 @@ declare class Noydb {
|
|
|
5064
5176
|
*/
|
|
5065
5177
|
get _writeQueueTracker(): WriteQueueTracker;
|
|
5066
5178
|
/**
|
|
5067
|
-
* Register a hook that runs before each write
|
|
5179
|
+
* Register a hook that runs before each write. Awaited; a throw
|
|
5068
5180
|
* aborts the write. Returns an unsubscribe function.
|
|
5069
5181
|
*/
|
|
5070
|
-
onBeforeWrite(handler: WriteHook): Unsubscribe$
|
|
5182
|
+
onBeforeWrite(handler: WriteHook): Unsubscribe$3;
|
|
5071
5183
|
/**
|
|
5072
|
-
* Register a hook that runs after each committed write
|
|
5184
|
+
* Register a hook that runs after each committed write. Awaited;
|
|
5073
5185
|
* a handler error is warned, never rolled back. Returns an unsubscribe fn.
|
|
5074
5186
|
*/
|
|
5075
|
-
onAfterWrite(handler: WriteHook): Unsubscribe$
|
|
5076
|
-
/** Subscribe to cross-tab write conflicts
|
|
5077
|
-
onWriteConflict(fn: (c: WriteConflict) => void): Unsubscribe$
|
|
5187
|
+
onAfterWrite(handler: WriteHook): Unsubscribe$3;
|
|
5188
|
+
/** Subscribe to cross-tab write conflicts. Returns an unsubscribe. */
|
|
5189
|
+
onWriteConflict(fn: (c: WriteConflict) => void): Unsubscribe$3;
|
|
5078
5190
|
/**
|
|
5079
|
-
* Enable same-device multi-tab coordination
|
|
5191
|
+
* Enable same-device multi-tab coordination: primary/secondary
|
|
5080
5192
|
* election + presence. Browser-only — a graceful no-op (role 'unknown')
|
|
5081
5193
|
* when Web Locks / BroadcastChannel are unavailable and nothing is
|
|
5082
5194
|
* injected. Idempotent; returns a disposer.
|
|
@@ -5087,11 +5199,13 @@ declare class Noydb {
|
|
|
5087
5199
|
private disableTabCoordination;
|
|
5088
5200
|
get tabRole(): TabRole;
|
|
5089
5201
|
activeTabs(): TabPresence[];
|
|
5090
|
-
onTabRoleChange(fn: (r: TabRole) => void): Unsubscribe$
|
|
5091
|
-
onActiveTabsChange(fn: (t: TabPresence[]) => void): Unsubscribe$
|
|
5202
|
+
onTabRoleChange(fn: (r: TabRole) => void): Unsubscribe$3;
|
|
5203
|
+
onActiveTabsChange(fn: (t: TabPresence[]) => void): Unsubscribe$3;
|
|
5092
5204
|
/** @internal The write-hook registry, threaded into each Collection. */
|
|
5093
5205
|
get _writeHooks(): WriteHookRegistry;
|
|
5094
|
-
/** @internal
|
|
5206
|
+
/** @internal The observe bus, threaded into every Collection. */
|
|
5207
|
+
get _subsystemBus(): SubsystemBus;
|
|
5208
|
+
/** @internal Stable per-instance id for schema-cutover coordination. */
|
|
5095
5209
|
get _clientId(): string;
|
|
5096
5210
|
/**
|
|
5097
5211
|
* Soft-lock a single vault: clear its in-memory keyring, DEKs, vault
|
|
@@ -5109,10 +5223,6 @@ declare class Noydb {
|
|
|
5109
5223
|
* survives lock; nothing about it changes when DEKs are scrubbed).
|
|
5110
5224
|
*
|
|
5111
5225
|
* No-op when `vault` is not currently in cache (idempotent).
|
|
5112
|
-
*
|
|
5113
|
-
* Unblocks vLannaAi/niwat#33.
|
|
5114
|
-
*
|
|
5115
|
-
* @see #17
|
|
5116
5226
|
*/
|
|
5117
5227
|
lockVault(vault: string): void;
|
|
5118
5228
|
close(): void;
|
|
@@ -5146,7 +5256,7 @@ declare class Noydb {
|
|
|
5146
5256
|
*/
|
|
5147
5257
|
updatePolicy(vault: string, override: Partial<VaultPolicy>): Promise<VaultPolicy>;
|
|
5148
5258
|
/**
|
|
5149
|
-
* Read the current vault-level user-directory toggle
|
|
5259
|
+
* Read the current vault-level user-directory toggle. Returns
|
|
5150
5260
|
* the default-on shape (`{ enabled: true }`) when no `_meta/directory`
|
|
5151
5261
|
* document has been persisted yet.
|
|
5152
5262
|
*
|
|
@@ -5154,7 +5264,7 @@ declare class Noydb {
|
|
|
5154
5264
|
*/
|
|
5155
5265
|
getDirectoryEnabled(vault: string): Promise<boolean>;
|
|
5156
5266
|
/**
|
|
5157
|
-
* Toggle the vault's user-directory listing on or off
|
|
5267
|
+
* Toggle the vault's user-directory listing on or off.
|
|
5158
5268
|
* Owner-only. When disabled, `listUsersWithEnvelopes()` throws
|
|
5159
5269
|
* {@link import('./errors.js').DirectoryDisabledError} for callers
|
|
5160
5270
|
* whose role is neither `owner` nor `admin`.
|
|
@@ -5186,7 +5296,7 @@ declare class Noydb {
|
|
|
5186
5296
|
*
|
|
5187
5297
|
* Two enforcement modes:
|
|
5188
5298
|
*
|
|
5189
|
-
* 1. **Managed-mode mandatory strong-recovery
|
|
5299
|
+
* 1. **Managed-mode mandatory strong-recovery.** When
|
|
5190
5300
|
* `passphraseMode === 'managed'`, the vault MUST have at least
|
|
5191
5301
|
* one **strong** recovery profile (Shamir today). Paper alone is
|
|
5192
5302
|
* rejected because under managed mode the user has no memorized
|
|
@@ -5206,7 +5316,7 @@ declare class Noydb {
|
|
|
5206
5316
|
*/
|
|
5207
5317
|
private assertRecoveryEnrolled;
|
|
5208
5318
|
/**
|
|
5209
|
-
* Internal accessor used by tier-2/tier-3 unlock paths
|
|
5319
|
+
* Internal accessor used by tier-2/tier-3 unlock paths
|
|
5210
5320
|
* to mark the active session tier.
|
|
5211
5321
|
* @internal
|
|
5212
5322
|
*/
|
|
@@ -5230,7 +5340,7 @@ declare class Noydb {
|
|
|
5230
5340
|
* `remove-authenticator`.
|
|
5231
5341
|
*/
|
|
5232
5342
|
removeAuthenticator(vault: string, slotId: string, factors?: FactorProofBundle): Promise<void>;
|
|
5233
|
-
/** Read the slot list for a vault. Internal — `describeAuthConfig`
|
|
5343
|
+
/** Read the slot list for a vault. Internal — `describeAuthConfig` consumes this. */
|
|
5234
5344
|
listAuthenticators(vault: string): Promise<ReadonlyArray<KeyringAuthenticator>>;
|
|
5235
5345
|
/**
|
|
5236
5346
|
* Mutate the `meta` blob on an existing authenticator slot — slot
|
|
@@ -5239,7 +5349,7 @@ declare class Noydb {
|
|
|
5239
5349
|
* are immutable through this method. Anti-slot-swap is structural,
|
|
5240
5350
|
* not gate-driven.
|
|
5241
5351
|
*
|
|
5242
|
-
* `meta` patch semantics (
|
|
5352
|
+
* `meta` patch semantics (top-level merge):
|
|
5243
5353
|
* - Top-level merge — absent keys preserved
|
|
5244
5354
|
* - `null` value — delete that meta key
|
|
5245
5355
|
* - Other values — replace verbatim
|
|
@@ -5257,12 +5367,10 @@ declare class Noydb {
|
|
|
5257
5367
|
*
|
|
5258
5368
|
* @throws `NoAccessError` when no slot with the given id exists.
|
|
5259
5369
|
* @throws `ValidationError` when no patch field is provided.
|
|
5260
|
-
*
|
|
5261
|
-
* @see #55
|
|
5262
5370
|
*/
|
|
5263
5371
|
updateAuthenticator(vault: string, slotId: string, options: UpdateAuthenticatorOptions, factors?: FactorProofBundle): Promise<void>;
|
|
5264
5372
|
/**
|
|
5265
|
-
* Native WebAuthn enrollment using the **real** internal keyring
|
|
5373
|
+
* Native WebAuthn enrollment using the **real** internal keyring.
|
|
5266
5374
|
*
|
|
5267
5375
|
* Why this exists: when a consumer is using `createNoydb({ secret })`,
|
|
5268
5376
|
* they cannot reach the live `UnlockedKeyring` to feed it to
|
|
@@ -5305,8 +5413,6 @@ declare class Noydb {
|
|
|
5305
5413
|
* a server-side allowlist).
|
|
5306
5414
|
*
|
|
5307
5415
|
* Gated by `enroll-authenticator` like `enrollAuthenticator()` itself.
|
|
5308
|
-
*
|
|
5309
|
-
* @see #16
|
|
5310
5416
|
*/
|
|
5311
5417
|
enrollWebAuthn(vault: string, ceremony: (keyring: UnlockedKeyring) => Promise<EnrollAuthenticatorOptions>, factors?: FactorProofBundle): Promise<{
|
|
5312
5418
|
credentialId: string;
|
|
@@ -5317,8 +5423,6 @@ declare class Noydb {
|
|
|
5317
5423
|
* deciding when a new device prompt should appear. Identity is
|
|
5318
5424
|
* `id` + `enrolled_at`; the `meta.credentialId` (base64) is used by
|
|
5319
5425
|
* `allowCredentials` at unlock time.
|
|
5320
|
-
*
|
|
5321
|
-
* @see #16
|
|
5322
5426
|
*/
|
|
5323
5427
|
listWebAuthnSlots(vault: string): Promise<ReadonlyArray<{
|
|
5324
5428
|
id: string;
|
|
@@ -5382,8 +5486,7 @@ declare class Noydb {
|
|
|
5382
5486
|
*
|
|
5383
5487
|
* Tier-2 authenticator slots are dropped — each slot wraps the old
|
|
5384
5488
|
* KEK and would need its derivation key to be re-presented. Re-enrol
|
|
5385
|
-
* via `db.enrollAuthenticator` after rotation.
|
|
5386
|
-
* v0.1.0-pre.5 limitation.
|
|
5489
|
+
* via `db.enrollAuthenticator` after rotation.
|
|
5387
5490
|
*
|
|
5388
5491
|
* @throws `WeakPassphraseError` on a weak new phrase.
|
|
5389
5492
|
* @throws `PolicyDeniedError` when the gate denies (missing factor, …).
|
|
@@ -5392,14 +5495,14 @@ declare class Noydb {
|
|
|
5392
5495
|
rotatePassphrase(vault: string, input: RotatePassphraseInput, factors?: FactorProofBundle): Promise<void>;
|
|
5393
5496
|
/**
|
|
5394
5497
|
* Reset the passphrase using a recovery proof (user forgot the old).
|
|
5395
|
-
*
|
|
5396
|
-
* other
|
|
5498
|
+
* Currently supports the `'paper'` profile end-to-end; the
|
|
5499
|
+
* other profiles throw {@link RecoveryProfileNotImplementedError}.
|
|
5397
5500
|
*
|
|
5398
5501
|
* Burns the used recovery entry on success.
|
|
5399
5502
|
*/
|
|
5400
5503
|
recoverPassphrase(vault: string, input: RecoverPassphraseInput, factors?: FactorProofBundle): Promise<RecoverPassphraseResult>;
|
|
5401
5504
|
/**
|
|
5402
|
-
* Deliberate paper-recovery-code regeneration
|
|
5505
|
+
* Deliberate paper-recovery-code regeneration. User knows their
|
|
5403
5506
|
* passphrase but wants a fresh sheet — they lost the printout or
|
|
5404
5507
|
* suspect compromise of the off-site copy.
|
|
5405
5508
|
*
|
|
@@ -5409,7 +5512,7 @@ declare class Noydb {
|
|
|
5409
5512
|
*
|
|
5410
5513
|
* Gated by the `rotate-recovery` policy gate:
|
|
5411
5514
|
* - PERSONAL_POLICY: `{ minTier: 1 }` — knowing the passphrase
|
|
5412
|
-
* suffices, matching the
|
|
5515
|
+
* suffices, matching the lower-level flow's bar.
|
|
5413
5516
|
* - STRICT_POLICY: `{ minTier: 1, factors: [{ anyOf: ['totp',
|
|
5414
5517
|
* 'email-otp', 'webauthn-roaming'] }] }` — rotation is an
|
|
5415
5518
|
* off-site-trust event; require an off-device factor so a
|
|
@@ -5445,7 +5548,7 @@ declare class Noydb {
|
|
|
5445
5548
|
private rotateRecoveryPaper;
|
|
5446
5549
|
private rotateRecoveryShamir;
|
|
5447
5550
|
/**
|
|
5448
|
-
* **Atomic create-and-enroll for managed-mode vaults
|
|
5551
|
+
* **Atomic create-and-enroll for managed-mode vaults.**
|
|
5449
5552
|
*
|
|
5450
5553
|
* Bootstraps a managed-mode vault and enrolls strong recovery in
|
|
5451
5554
|
* a single ceremony. Under `passphraseMode: 'managed'`, every
|
|
@@ -5490,7 +5593,7 @@ declare class Noydb {
|
|
|
5490
5593
|
readonly recoveryEnrollments: ReadonlyArray<EnrollRecoveryResult>;
|
|
5491
5594
|
}>;
|
|
5492
5595
|
/**
|
|
5493
|
-
* **Recovery flow under managed-passphrase mode
|
|
5596
|
+
* **Recovery flow under managed-passphrase mode.**
|
|
5494
5597
|
*
|
|
5495
5598
|
* Replaces the sealed passphrase of a managed-mode vault with a
|
|
5496
5599
|
* fresh 256-bit random, sealed under the configured
|
|
@@ -5507,7 +5610,7 @@ declare class Noydb {
|
|
|
5507
5610
|
* 5. Drop the keyring cache so the next operation re-derives.
|
|
5508
5611
|
*
|
|
5509
5612
|
* The vault's strong-recovery enrollment is preserved across
|
|
5510
|
-
* recovery (Shamir entries are not burned on use
|
|
5613
|
+
* recovery (Shamir entries are not burned on use).
|
|
5511
5614
|
*
|
|
5512
5615
|
* @throws ValidationError if the Noydb instance is not in managed mode.
|
|
5513
5616
|
*/
|
|
@@ -5517,7 +5620,7 @@ declare class Noydb {
|
|
|
5517
5620
|
}): Promise<void>;
|
|
5518
5621
|
/**
|
|
5519
5622
|
* Atomic peer-recovery — re-wraps an EXISTING user's keyring under
|
|
5520
|
-
* a fresh temp passphrase in a single store write. Closes
|
|
5623
|
+
* a fresh temp passphrase in a single store write. Closes the
|
|
5521
5624
|
* partial-failure window (the previous compose-from-primitives
|
|
5522
5625
|
* pattern was `db.revoke + db.grant`, two writes — if the issuer
|
|
5523
5626
|
* cancelled between them the target was locked out entirely).
|
|
@@ -5527,7 +5630,7 @@ declare class Noydb {
|
|
|
5527
5630
|
* - Same `userId`, role, permissions, capabilities preserved.
|
|
5528
5631
|
* - DEKs unchanged → every other principal in the vault keeps
|
|
5529
5632
|
* access. No key rotation.
|
|
5530
|
-
* - Allows owner→owner natively
|
|
5633
|
+
* - Allows owner→owner natively. The existing
|
|
5531
5634
|
* `db.revoke` retains its block — peer-recovery is a separate,
|
|
5532
5635
|
* intentionally-named operation.
|
|
5533
5636
|
* - Tier-2 slots dropped (they wrap the old KEK).
|
|
@@ -5556,11 +5659,10 @@ declare class Noydb {
|
|
|
5556
5659
|
* @throws `PrivilegeEscalationError` when the caller lacks a DEK
|
|
5557
5660
|
* the target previously had access to.
|
|
5558
5661
|
*
|
|
5559
|
-
* @see #33 #34 — the issues this method closes.
|
|
5560
5662
|
*/
|
|
5561
5663
|
recoverUser(vault: string, options: RecoverUserOptions, factors?: FactorProofBundle): Promise<void>;
|
|
5562
5664
|
/**
|
|
5563
|
-
* Persist a recovery enrollment.
|
|
5665
|
+
* Persist a recovery enrollment. Accepts the `'paper'`
|
|
5564
5666
|
* profile.
|
|
5565
5667
|
*
|
|
5566
5668
|
* The hub wraps the user's DEK set (not the KEK) under a code-derived
|
|
@@ -5580,7 +5682,7 @@ declare class Noydb {
|
|
|
5580
5682
|
* showCodesToUser(codes)
|
|
5581
5683
|
* ```
|
|
5582
5684
|
*
|
|
5583
|
-
*
|
|
5685
|
+
* `@noy-db/on-recovery`'s `generateRecoveryCodeSet`
|
|
5584
5686
|
* delegates to `mintPaperRecoveryEntry` internally — its output is
|
|
5585
5687
|
* fed directly to this API. Pick whichever fits your code-gen layer:
|
|
5586
5688
|
*
|
|
@@ -5591,7 +5693,7 @@ declare class Noydb {
|
|
|
5591
5693
|
* ```
|
|
5592
5694
|
*/
|
|
5593
5695
|
enrollRecovery(vault: string, enrollment: RecoveryEnrollmentInput): Promise<EnrollRecoveryResult>;
|
|
5594
|
-
/** Read the persisted recovery entries (paper + Shamir). Used by `describeAuthConfig
|
|
5696
|
+
/** Read the persisted recovery entries (paper + Shamir). Used by `describeAuthConfig`. */
|
|
5595
5697
|
listRecoveryEntries(vault: string): Promise<{
|
|
5596
5698
|
paper: ReadonlyArray<PaperRecoveryEntry>;
|
|
5597
5699
|
shamir: ReadonlyArray<ShamirRecoveryEntry>;
|
|
@@ -5619,11 +5721,11 @@ declare class Noydb {
|
|
|
5619
5721
|
/** Drop the tier-3 state for a vault — explicit logout. */
|
|
5620
5722
|
clearQuickUnlock(vault: string): void;
|
|
5621
5723
|
/**
|
|
5622
|
-
* Public accessor for the unlocked keyring of a vault
|
|
5724
|
+
* Public accessor for the unlocked keyring of a vault.
|
|
5623
5725
|
*
|
|
5624
5726
|
* Returns a **defensive shallow copy** so consumers can read the DEK
|
|
5625
5727
|
* map and authenticator list without the risk of mutating the hub's
|
|
5626
|
-
* internal cache
|
|
5728
|
+
* internal cache. Internal hub code paths use a live reference
|
|
5627
5729
|
* via `getKeyringInternal`; ceremonies and external consumers always
|
|
5628
5730
|
* get a snapshot.
|
|
5629
5731
|
*
|
|
@@ -5864,8 +5966,8 @@ interface GuardStrategy<T extends Record<string, unknown>> {
|
|
|
5864
5966
|
* })
|
|
5865
5967
|
* ```
|
|
5866
5968
|
*
|
|
5867
|
-
* Also skipped on system-internal deletes (derivation tombstones
|
|
5868
|
-
*
|
|
5969
|
+
* Also skipped on system-internal deletes (derivation tombstones,
|
|
5970
|
+
* MV refresh from Dim 14 v2) — those use `_internalDelete`
|
|
5869
5971
|
* which bypasses every user-facing delete hook. Housekeeping ops are
|
|
5870
5972
|
* NOT user-initiated and should not trip user invariants.
|
|
5871
5973
|
*
|
|
@@ -5924,14 +6026,14 @@ interface RecordOutputSpec {
|
|
|
5924
6026
|
* `undefined`) for this output key. The executor interprets that as
|
|
5925
6027
|
* "no output for this invocation": a previously-emitted output at
|
|
5926
6028
|
* the same id is deleted (mirroring the empty-group / empty-aggregate
|
|
5927
|
-
* semantics
|
|
6029
|
+
* semantics for empty groups); a never-emitted output is a silent
|
|
5928
6030
|
* no-op. When `false` (default), returning `null` throws
|
|
5929
6031
|
* `DerivationOutputShapeError` — same as v1.
|
|
5930
6032
|
*/
|
|
5931
6033
|
optional?: boolean;
|
|
5932
6034
|
}
|
|
5933
6035
|
/**
|
|
5934
|
-
* Array-shape output
|
|
6036
|
+
* Array-shape output — one source row produces a variable-length
|
|
5935
6037
|
* list of output rows, each with its own id (from the `key` extractor).
|
|
5936
6038
|
*
|
|
5937
6039
|
* On every source-row change, the dispatcher diffs the previously
|
|
@@ -6154,7 +6256,7 @@ interface MaterializedViewStrategy<TRow extends Record<string, unknown>> {
|
|
|
6154
6256
|
*/
|
|
6155
6257
|
query?: (db: MVQueryContext) => Query<TRow>;
|
|
6156
6258
|
/**
|
|
6157
|
-
* UNION-form sources
|
|
6259
|
+
* UNION-form sources: an explicit list of sibling collections
|
|
6158
6260
|
* that contribute rows to a single MV. Each arm's `map` projects a
|
|
6159
6261
|
* source row into the MV's unified row shape; the mapped streams are
|
|
6160
6262
|
* concatenated, then {@link groupBy} + {@link aggregate} run on the
|
|
@@ -6170,7 +6272,7 @@ interface MaterializedViewStrategy<TRow extends Record<string, unknown>> {
|
|
|
6170
6272
|
*/
|
|
6171
6273
|
unionSources?: ReadonlyArray<UnionSource<TRow>>;
|
|
6172
6274
|
/**
|
|
6173
|
-
* Group-key field(s) for UNION mode
|
|
6275
|
+
* Group-key field(s) for UNION mode. Applied to the
|
|
6174
6276
|
* concatenated mapped-row stream from {@link unionSources} before
|
|
6175
6277
|
* {@link aggregate} runs. Accepts a single field name or a tuple of
|
|
6176
6278
|
* field names for multi-key grouping (same shape as
|
|
@@ -6182,7 +6284,7 @@ interface MaterializedViewStrategy<TRow extends Record<string, unknown>> {
|
|
|
6182
6284
|
*/
|
|
6183
6285
|
groupBy?: string | ReadonlyArray<string>;
|
|
6184
6286
|
/**
|
|
6185
|
-
* Aggregation spec for UNION mode
|
|
6287
|
+
* Aggregation spec for UNION mode. Applied per-group after
|
|
6186
6288
|
* {@link groupBy} buckets the concatenated mapped-row stream from
|
|
6187
6289
|
* {@link unionSources}. Same shape as the `AggregateSpec` passed to
|
|
6188
6290
|
* `Query.aggregate()`.
|
|
@@ -6193,11 +6295,11 @@ interface MaterializedViewStrategy<TRow extends Record<string, unknown>> {
|
|
|
6193
6295
|
/**
|
|
6194
6296
|
* Pure function from a materialized row → stable id used in the
|
|
6195
6297
|
* output collection. Required — explicit always beats default-with-pitfalls
|
|
6196
|
-
* (
|
|
6298
|
+
* (explicit always beats default-with-pitfalls; see the slash-collision rationale).
|
|
6197
6299
|
*/
|
|
6198
6300
|
rowKey: (row: TRow) => string;
|
|
6199
6301
|
/**
|
|
6200
|
-
* Explicit source collections
|
|
6302
|
+
* Explicit source collections. Required when `query()` returns
|
|
6201
6303
|
* an `Aggregation` or `GroupedAggregation` rather than a `Query<T>`
|
|
6202
6304
|
* — the dependency analyzer can't introspect through `groupBy().aggregate()`
|
|
6203
6305
|
* back to the source. Optional for plain `Query<T>` results — the
|
|
@@ -6207,7 +6309,7 @@ interface MaterializedViewStrategy<TRow extends Record<string, unknown>> {
|
|
|
6207
6309
|
*/
|
|
6208
6310
|
sources?: ReadonlyArray<string>;
|
|
6209
6311
|
/**
|
|
6210
|
-
* Declared deterministic predicates
|
|
6312
|
+
* Declared deterministic predicates. Each entry pairs a
|
|
6211
6313
|
* consumer-stable `hash` with a function. The `query()` callback's
|
|
6212
6314
|
* Query<T> can invoke them via `.wherePredicate(name, ctx?)`. The
|
|
6213
6315
|
* predicate's `hash` + a canonical-JSON hash of `ctx` both fold
|
|
@@ -6244,8 +6346,8 @@ interface MaterializedViewStrategy<TRow extends Record<string, unknown>> {
|
|
|
6244
6346
|
*
|
|
6245
6347
|
* - `'delete'` (default) — tombstone the prior MV row via
|
|
6246
6348
|
* `Collection._internalDelete` (system housekeeping bypasses user
|
|
6247
|
-
* `onDelete` guards on the output collection —
|
|
6248
|
-
* composition fix).
|
|
6349
|
+
* `onDelete` guards on the output collection — the housekeeping
|
|
6350
|
+
* bypass composition fix).
|
|
6249
6351
|
* - `'keep'` — leave the prior MV row in place. Useful when zero
|
|
6250
6352
|
* is a meaningful state.
|
|
6251
6353
|
*/
|
|
@@ -6253,7 +6355,7 @@ interface MaterializedViewStrategy<TRow extends Record<string, unknown>> {
|
|
|
6253
6355
|
/**
|
|
6254
6356
|
* `true` re-throws on any row-write failure → composes with
|
|
6255
6357
|
* `withTransactions` to roll back the source-write atomically via
|
|
6256
|
-
* `revertExecuted
|
|
6358
|
+
* `revertExecuted`. Default `false` (failed rows are
|
|
6257
6359
|
* isolated; other rows commit).
|
|
6258
6360
|
*/
|
|
6259
6361
|
strict?: boolean;
|
|
@@ -6287,7 +6389,7 @@ interface RegisteredMV {
|
|
|
6287
6389
|
* Top-level FieldClauses on the partition field, captured at
|
|
6288
6390
|
* registration time. Used by the cycle detector to resolve
|
|
6289
6391
|
* same-collection-as-source edges via the partition-discriminator
|
|
6290
|
-
* check
|
|
6392
|
+
* check. Empty when `spec.output?.partition` is undefined.
|
|
6291
6393
|
*/
|
|
6292
6394
|
readonly partitionClauses: readonly FieldClause[];
|
|
6293
6395
|
}
|
|
@@ -6339,7 +6441,7 @@ declare class MaterializedViewRegistry {
|
|
|
6339
6441
|
}
|
|
6340
6442
|
|
|
6341
6443
|
/**
|
|
6342
|
-
* Read-shadow overlay primitive (
|
|
6444
|
+
* Read-shadow overlay primitive (MV v2 spec § Composition with
|
|
6343
6445
|
* operator-editable lifecycle). Binds an MV's read-only base output
|
|
6344
6446
|
* to a separate user-writable overlay collection; reads merge via a
|
|
6345
6447
|
* single shadow predicate, writes route to the overlay.
|
|
@@ -6442,7 +6544,7 @@ declare class GuardRegistry {
|
|
|
6442
6544
|
register<T extends Record<string, unknown>>(spec: GuardStrategy<T>): void;
|
|
6443
6545
|
/** All guards registered against `collection` in registration order. */
|
|
6444
6546
|
guardsFor(collection: string): ReadonlyArray<AnyGuard>;
|
|
6445
|
-
/** Per-collection guard counts, for introspection
|
|
6547
|
+
/** Per-collection guard counts, for introspection. */
|
|
6446
6548
|
summary(): {
|
|
6447
6549
|
collection: string;
|
|
6448
6550
|
count: number;
|
|
@@ -6883,7 +6985,7 @@ declare function magicLinkGrantRecordId(token: string, index: number): string;
|
|
|
6883
6985
|
declare function isMagicLinkGrantExpired(payload: MagicLinkGrantPayload, now?: Date): boolean;
|
|
6884
6986
|
|
|
6885
6987
|
/**
|
|
6886
|
-
* Type surface for the user-list visibility subsystem
|
|
6988
|
+
* Type surface for the user-list visibility subsystem.
|
|
6887
6989
|
*
|
|
6888
6990
|
* Two complementary flags:
|
|
6889
6991
|
* - {@link DirectoryConfig} — vault-level "is the directory listing
|
|
@@ -6934,7 +7036,7 @@ interface UserVisibility {
|
|
|
6934
7036
|
* own keyringId. **Own-only write rule** is structural — no method
|
|
6935
7037
|
* exists to write someone else's envelope.
|
|
6936
7038
|
* - Read-anyone: `get` / `list` — read other principals' envelopes
|
|
6937
|
-
* (subject to `view-team-profiles` policy gate
|
|
7039
|
+
* (subject to `view-team-profiles` policy gate).
|
|
6938
7040
|
* - Reactive: `subscribe` / `live` — in-process event emission on local
|
|
6939
7041
|
* writes. Cross-instance updates land via the team/sync engine and
|
|
6940
7042
|
* surface to subscribers when the sync diff replays through this API.
|
|
@@ -6954,7 +7056,7 @@ type DeepPartial<T> = T extends object ? {
|
|
|
6954
7056
|
} : T;
|
|
6955
7057
|
/**
|
|
6956
7058
|
* Recursive partial with `null` allowed at every level — used by
|
|
6957
|
-
* `updateMe`
|
|
7059
|
+
* `updateMe` to express deletion intent in addition to merge.
|
|
6958
7060
|
*
|
|
6959
7061
|
* Semantics inside `updateMe`:
|
|
6960
7062
|
* - `undefined` (or absent key) — skip; source value preserved
|
|
@@ -6963,8 +7065,8 @@ type DeepPartial<T> = T extends object ? {
|
|
|
6963
7065
|
* replace for primitives / arrays)
|
|
6964
7066
|
*
|
|
6965
7067
|
* Matches lodash `_.merge` behavior on `null` and Firestore's
|
|
6966
|
-
* `FieldValue.delete()` semantics. Loosened from `DeepPartial<T
|
|
6967
|
-
*
|
|
7068
|
+
* `FieldValue.delete()` semantics. Loosened from `DeepPartial<T>`.
|
|
7069
|
+
* Consumers wanting the original "merge-only" surface can keep
|
|
6968
7070
|
* importing `DeepPartial` and avoid passing `null`.
|
|
6969
7071
|
*/
|
|
6970
7072
|
type DeepPartialOrNull<T> = T extends object ? {
|
|
@@ -7036,7 +7138,7 @@ declare class UserApi {
|
|
|
7036
7138
|
* the envelope on first call. Optimistic-concurrency safe — a stale
|
|
7037
7139
|
* `_v` (parallel writer on another device) throws `ConflictError`.
|
|
7038
7140
|
*
|
|
7039
|
-
* Patch semantics
|
|
7141
|
+
* Patch semantics:
|
|
7040
7142
|
* - `undefined` (or omitted key) — skip; existing value preserved
|
|
7041
7143
|
* - `null` — delete the field from the merged result
|
|
7042
7144
|
* - any other value — overwrite (deep-merge for plain objects,
|
|
@@ -7190,7 +7292,7 @@ interface PersistedSchemaEnvelope {
|
|
|
7190
7292
|
* @module
|
|
7191
7293
|
*/
|
|
7192
7294
|
|
|
7193
|
-
/** Flat snapshot of a vault's registered schema
|
|
7295
|
+
/** Flat snapshot of a vault's registered schema. */
|
|
7194
7296
|
interface SchemaIntrospection {
|
|
7195
7297
|
readonly collections: ReadonlyArray<{
|
|
7196
7298
|
name: string;
|
|
@@ -7367,23 +7469,23 @@ declare class Vault {
|
|
|
7367
7469
|
* `null` for vaults that never register any guard strategy. The
|
|
7368
7470
|
* runtime class is dynamic-imported on demand so consumers that
|
|
7369
7471
|
* never use guards don't pull `GuardRegistry`/`GuardExecutor` into
|
|
7370
|
-
* their bundle
|
|
7472
|
+
* their bundle.
|
|
7371
7473
|
*/
|
|
7372
7474
|
private guardRegistry;
|
|
7373
7475
|
/**
|
|
7374
7476
|
* Per-vault derivation registry. Same lazy-load contract as
|
|
7375
7477
|
* `guardRegistry` — `null` until `_initDerivations()` runs with at
|
|
7376
|
-
* least one strategy handle.
|
|
7478
|
+
* least one strategy handle.
|
|
7377
7479
|
*/
|
|
7378
7480
|
private derivationRegistry;
|
|
7379
7481
|
/**
|
|
7380
|
-
* Per-vault materialized-view registry
|
|
7482
|
+
* Per-vault materialized-view registry. Same lazy-load
|
|
7381
7483
|
* contract as `derivationRegistry` — `null` until
|
|
7382
7484
|
* `_initMaterializedViews()` runs with at least one MV handle.
|
|
7383
7485
|
*/
|
|
7384
7486
|
private materializedViewRegistry;
|
|
7385
7487
|
/**
|
|
7386
|
-
* Per-vault overlay registry
|
|
7488
|
+
* Per-vault overlay registry. Same lazy-load contract as
|
|
7387
7489
|
* `materializedViewRegistry` — `null` until `_initOverlayedViews()`
|
|
7388
7490
|
* runs with at least one handle.
|
|
7389
7491
|
*/
|
|
@@ -7404,7 +7506,7 @@ declare class Vault {
|
|
|
7404
7506
|
* target this vault session's keyringId. There is no method to write
|
|
7405
7507
|
* another principal's envelope (own-only write rule, structural).
|
|
7406
7508
|
* - Read-anyone: `get(keyringId)`, `list()` — read other principals'
|
|
7407
|
-
* envelopes, subject to the `view-team-profiles` policy gate
|
|
7509
|
+
* envelopes, subject to the `view-team-profiles` policy gate.
|
|
7408
7510
|
* - Reactive: `subscribe(id, cb)`, `live(id)` — fire on local writes.
|
|
7409
7511
|
*
|
|
7410
7512
|
* @see docs/superpowers/specs/2026-05-05-user-envelope-design.md
|
|
@@ -7424,7 +7526,7 @@ declare class Vault {
|
|
|
7424
7526
|
*/
|
|
7425
7527
|
private readonly reloadKeyring;
|
|
7426
7528
|
private readonly collectionCache;
|
|
7427
|
-
/**
|
|
7529
|
+
/** Vault-level schema cutover fence/controller. */
|
|
7428
7530
|
readonly schemaFence: SchemaFenceController;
|
|
7429
7531
|
/**
|
|
7430
7532
|
* per-collection `blobFields` retention/TTL config.
|
|
@@ -7498,8 +7600,7 @@ declare class Vault {
|
|
|
7498
7600
|
* Cache of closed/opened accounting periods.
|
|
7499
7601
|
* Populated on first `closePeriod` / `openPeriod` / `listPeriods` /
|
|
7500
7602
|
* per-collection write call. Kept in memory as an ordered list (by
|
|
7501
|
-
* `closedAt`) so
|
|
7502
|
-
* each collection's put/delete path.
|
|
7603
|
+
* `closedAt`) so period checks run fast when the gate bus fires.
|
|
7503
7604
|
*
|
|
7504
7605
|
* Sentinel `null` means "not yet loaded" — the first consumer
|
|
7505
7606
|
* triggers a one-time `loadPeriods()` pass. Every subsequent
|
|
@@ -7659,7 +7760,7 @@ declare class Vault {
|
|
|
7659
7760
|
*/
|
|
7660
7761
|
persistJsonSchema?: boolean;
|
|
7661
7762
|
/**
|
|
7662
|
-
* Ordered schema-update strategies
|
|
7763
|
+
* Ordered schema-update strategies. On a detected schema
|
|
7663
7764
|
* change, evaluated in order; the first non-`allow` decision wins.
|
|
7664
7765
|
* A `reject` is enforced at the write path (`put`/`delete` throw).
|
|
7665
7766
|
* Requires `persistJsonSchema: true` (detection needs the baseline).
|
|
@@ -7675,7 +7776,7 @@ declare class Vault {
|
|
|
7675
7776
|
*/
|
|
7676
7777
|
_drainPendingSchemaWrites(): Promise<void>;
|
|
7677
7778
|
/**
|
|
7678
|
-
* Run a coordinated schema cutover
|
|
7779
|
+
* Run a coordinated schema cutover. Drains pending writes, waits
|
|
7679
7780
|
* for the active client set to quiesce (the ack-barrier), applies every
|
|
7680
7781
|
* pending collection transform in bulk, bumps the vault schema generation,
|
|
7681
7782
|
* and clears the fence. Returns the count of collections migrated.
|
|
@@ -7687,15 +7788,15 @@ declare class Vault {
|
|
|
7687
7788
|
migrated: number;
|
|
7688
7789
|
}>;
|
|
7689
7790
|
/**
|
|
7690
|
-
*
|
|
7791
|
+
* Refresh a loaded collection's view of one document from a peer
|
|
7691
7792
|
* tab's broadcast. No-op when the collection isn't loaded in this tab
|
|
7692
|
-
* (it will read fresh on next open). Mirrors
|
|
7793
|
+
* (it will read fresh on next open). Mirrors `#runCutoverTransform`'s guard.
|
|
7693
7794
|
*/
|
|
7694
7795
|
_applyRemoteWrite(collectionName: string, docId: string, action: 'put' | 'delete'): Promise<void>;
|
|
7695
7796
|
/**
|
|
7696
|
-
*
|
|
7797
|
+
* For a detected conflict: capture this tab's clobbered record,
|
|
7697
7798
|
* read the common ancestor from history, converge the cache to the store's
|
|
7698
|
-
* authoritative value (the
|
|
7799
|
+
* authoritative value (the re-read), and return all three for the
|
|
7699
7800
|
* WriteConflict payload. Returns null when the collection isn't loaded.
|
|
7700
7801
|
*/
|
|
7701
7802
|
_captureAndConverge(collectionName: string, docId: string, action: 'put' | 'delete', baseV: number): Promise<{
|
|
@@ -7703,11 +7804,11 @@ declare class Vault {
|
|
|
7703
7804
|
remote: unknown;
|
|
7704
7805
|
base: unknown;
|
|
7705
7806
|
} | null>;
|
|
7706
|
-
/** Recover a stuck cutover fence
|
|
7807
|
+
/** Recover a stuck cutover fence — reset to normal without bumping. */
|
|
7707
7808
|
abortSchemaCutover(): Promise<void>;
|
|
7708
|
-
/** Current schema-cutover fence state for this vault
|
|
7809
|
+
/** Current schema-cutover fence state for this vault. Thin live read. */
|
|
7709
7810
|
schemaFenceState(): Promise<FenceDoc>;
|
|
7710
|
-
/** @internal Start the per-client heartbeat + fence watcher once a cutover is registered
|
|
7811
|
+
/** @internal Start the per-client heartbeat + fence watcher once a cutover is registered. */
|
|
7711
7812
|
_ensureFenceCoordination(): void;
|
|
7712
7813
|
/** @internal Stop the heartbeat/watcher (vault lock/close). */
|
|
7713
7814
|
_stopFenceCoordination(): void;
|
|
@@ -8023,7 +8124,7 @@ declare class Vault {
|
|
|
8023
8124
|
* Dynamic-imports `GuardRegistry` + `ReadOnlyVaultFacade` and seeds
|
|
8024
8125
|
* the registry with the supplied strategy handles. No-op when the
|
|
8025
8126
|
* handles array is empty — keeps the guard subsystem out of the
|
|
8026
|
-
* floor bundle for consumers that don't use guards
|
|
8127
|
+
* floor bundle for consumers that don't use guards.
|
|
8027
8128
|
*
|
|
8028
8129
|
* The read-only facade is eagerly instantiated here so the sync
|
|
8029
8130
|
* accessor `_getReadOnlyFacade()` (called from the tx amendment
|
|
@@ -8031,10 +8132,9 @@ declare class Vault {
|
|
|
8031
8132
|
*/
|
|
8032
8133
|
_initGuards(handles: ReadonlyArray<GuardStrategyHandleAny>): Promise<void>;
|
|
8033
8134
|
/**
|
|
8034
|
-
* @internal —
|
|
8035
|
-
* vaults that never registered any guard
|
|
8036
|
-
* gate on null
|
|
8037
|
-
* `Collection` already do this transitively).
|
|
8135
|
+
* @internal — The gate handler in Noydb.#registerGuardGate calls into
|
|
8136
|
+
* this. Returns `null` for vaults that never registered any guard
|
|
8137
|
+
* strategy. Callers MUST gate on null.
|
|
8038
8138
|
*/
|
|
8039
8139
|
_getGuardRegistry(): GuardRegistry | null;
|
|
8040
8140
|
/**
|
|
@@ -8043,7 +8143,7 @@ declare class Vault {
|
|
|
8043
8143
|
* derivation strategies (async because `strategyHash` computation
|
|
8044
8144
|
* goes through `crypto.subtle.digest`). No-op when the handles
|
|
8045
8145
|
* array is empty — keeps the derivation subsystem out of the floor
|
|
8046
|
-
* bundle for consumers that don't use derivations
|
|
8146
|
+
* bundle for consumers that don't use derivations. Throws
|
|
8047
8147
|
* `DerivationCycleError` if a cycle is detected after registration.
|
|
8048
8148
|
*/
|
|
8049
8149
|
_initDerivations(handles: ReadonlyArray<DerivationStrategyHandle>): Promise<void>;
|
|
@@ -8058,7 +8158,7 @@ declare class Vault {
|
|
|
8058
8158
|
* MV spec (which invokes its `query()` once for dependency
|
|
8059
8159
|
* analysis), then runs the unified cycle detection across the MV +
|
|
8060
8160
|
* derivation graphs. No-op when the handles array is empty — keeps
|
|
8061
|
-
* the MV subsystem out of the floor bundle (mirrors
|
|
8161
|
+
* the MV subsystem out of the floor bundle (mirrors the derivation lazy-import pattern).
|
|
8062
8162
|
* Throws `MaterializedViewCycleError` if a cycle is detected.
|
|
8063
8163
|
*/
|
|
8064
8164
|
_initMaterializedViews(handles: ReadonlyArray<MaterializedViewStrategyHandle>): Promise<void>;
|
|
@@ -8080,13 +8180,13 @@ declare class Vault {
|
|
|
8080
8180
|
*/
|
|
8081
8181
|
_getOverlayedViewRegistry(): OverlayedViewRegistry | null;
|
|
8082
8182
|
/**
|
|
8083
|
-
* Manual re-materialize for a single registered MV
|
|
8183
|
+
* Manual re-materialize for a single registered MV. Useful
|
|
8084
8184
|
* for `refresh: 'manual'` MVs (whose consumer drives refreshes
|
|
8085
8185
|
* externally), for stale-bit recovery on vault re-open, and as the
|
|
8086
8186
|
* explicit bulk-recompute escape hatch after a strategy change.
|
|
8087
8187
|
*
|
|
8088
|
-
* Returns `{ written, deleted, failed }`. `deleted` is always 0
|
|
8089
|
-
*
|
|
8188
|
+
* Returns `{ written, deleted, failed }`. `deleted` is always 0
|
|
8189
|
+
* when tombstoning is not enabled.
|
|
8090
8190
|
*
|
|
8091
8191
|
* Throws if `name` is not a registered MV.
|
|
8092
8192
|
*/
|
|
@@ -8109,20 +8209,17 @@ declare class Vault {
|
|
|
8109
8209
|
/**
|
|
8110
8210
|
* @internal — exposed for `runTransaction({ amendment: true })` so
|
|
8111
8211
|
* the amendment invariant runner can pass the SAME read-only vault
|
|
8112
|
-
* facade that the
|
|
8113
|
-
*
|
|
8114
|
-
* `
|
|
8115
|
-
*
|
|
8116
|
-
*
|
|
8212
|
+
* facade that the gate handler in Noydb.#registerGuardGate uses.
|
|
8213
|
+
* Eagerly instantiated by `_initGuards()` so this accessor stays
|
|
8214
|
+
* synchronous; returns `null` for vaults that never registered any
|
|
8215
|
+
* guard (amendments require at least one guard, so the caller should
|
|
8216
|
+
* never see null).
|
|
8117
8217
|
*/
|
|
8118
8218
|
_getReadOnlyFacade(): ReadOnlyVaultFacade | null;
|
|
8119
8219
|
/**
|
|
8120
|
-
* Internal lazy-allocator for the read-only facade. Used
|
|
8121
|
-
*
|
|
8122
|
-
*
|
|
8123
|
-
* invocation (theoretically impossible — `Noydb.openVault` awaits
|
|
8124
|
-
* `_initGuards` before returning — but we keep the defensive lazy
|
|
8125
|
-
* path so the closure's contract stays "always returns a facade").
|
|
8220
|
+
* Internal lazy-allocator for the read-only facade. Used as a
|
|
8221
|
+
* defensive fallback; in practice `_initGuards()` eagerly
|
|
8222
|
+
* instantiates this, so the lazy path is a no-op.
|
|
8126
8223
|
*/
|
|
8127
8224
|
private _ensureReadOnlyFacade;
|
|
8128
8225
|
/**
|
|
@@ -8329,7 +8426,7 @@ declare class Vault {
|
|
|
8329
8426
|
listPeriods(): Promise<readonly PeriodRecord[]>;
|
|
8330
8427
|
/** Look up a single period by name. Returns `null` if not found. */
|
|
8331
8428
|
getPeriod(name: string): Promise<PeriodRecord | null>;
|
|
8332
|
-
/** @internal —
|
|
8429
|
+
/** @internal — called by the gate bus before put/delete. */
|
|
8333
8430
|
_assertTsWritable(existing: {
|
|
8334
8431
|
ts: string | null;
|
|
8335
8432
|
record: Record<string, unknown> | null;
|
|
@@ -8360,7 +8457,7 @@ declare class Vault {
|
|
|
8360
8457
|
*/
|
|
8361
8458
|
dumpSchema(opts?: DumpSchemaOptions): Promise<VaultSchemaSnapshot>;
|
|
8362
8459
|
/**
|
|
8363
|
-
* Lightweight read of the vault's registered schema
|
|
8460
|
+
* Lightweight read of the vault's registered schema: collections
|
|
8364
8461
|
* (+ doc counts), guards, materialized views, schema-update strategies,
|
|
8365
8462
|
* and the unlocked user's grants. Cheap — one `adapter.list` per
|
|
8366
8463
|
* collection, no decryption. For a full snapshot + stats use dumpSchema().
|
|
@@ -8854,6 +8951,7 @@ declare class Collection<T> {
|
|
|
8854
8951
|
private readonly schemaUpdateGate;
|
|
8855
8952
|
private readonly schemaFence;
|
|
8856
8953
|
private readonly writeHooks;
|
|
8954
|
+
private readonly subsystemBus;
|
|
8857
8955
|
private readonly activeTxId;
|
|
8858
8956
|
private readonly getDEK;
|
|
8859
8957
|
private readonly onDirty;
|
|
@@ -9035,42 +9133,14 @@ declare class Collection<T> {
|
|
|
9035
9133
|
private readonly syncAdapter;
|
|
9036
9134
|
/** — consent-audit hook, no-op when no scope is active. */
|
|
9037
9135
|
private readonly onAccess;
|
|
9038
|
-
/**
|
|
9039
|
-
* accounting-period write guard. Called BEFORE any
|
|
9040
|
-
* adapter write with:
|
|
9041
|
-
* - `existing` — the prior envelope's `_ts` and decrypted record
|
|
9042
|
-
* (or `null` if no prior envelope exists)
|
|
9043
|
-
* - `incoming` — the record being written (or `null` for delete)
|
|
9044
|
-
*
|
|
9045
|
-
* Throws `PeriodClosedError` if either side falls inside a closed
|
|
9046
|
-
* period. Installed by Vault; no-op when no period has been closed.
|
|
9047
|
-
* Async so the Vault can lazy-load the period list from the
|
|
9048
|
-
* adapter on first use.
|
|
9049
|
-
*/
|
|
9050
|
-
private readonly periodGuard;
|
|
9051
|
-
/**
|
|
9052
|
-
* Optional back-reference to the owning vault's guard registry + a
|
|
9053
|
-
* read-only vault facade. When present, `Collection.put` and
|
|
9054
|
-
* `Collection.delete` consult the registry for guards declared
|
|
9055
|
-
* against this collection and run their `check` + `frozenFields`
|
|
9056
|
-
* before the adapter write. Absent in unit tests that construct
|
|
9057
|
-
* a Collection directly; production code always sets it via
|
|
9058
|
-
* `Vault.collection()`.
|
|
9059
|
-
*
|
|
9060
|
-
* Typed structurally rather than as `Vault` to avoid a circular
|
|
9061
|
-
* import (mirrors the `refEnforcer` / `joinResolver` pattern).
|
|
9062
|
-
*/
|
|
9063
|
-
private readonly guardSource;
|
|
9064
9136
|
/**
|
|
9065
9137
|
* Vault-internal hook for derivation dispatch. When set,
|
|
9066
9138
|
* `Collection.put` consults the registry after the source-write
|
|
9067
9139
|
* commits and writes derived outputs through `getCollection(name).put`.
|
|
9068
|
-
* Same structural-interface pattern as `guardSource` to avoid a
|
|
9069
|
-
* circular Vault import.
|
|
9070
9140
|
*/
|
|
9071
9141
|
private readonly derivationSource;
|
|
9072
9142
|
/**
|
|
9073
|
-
* Vault-internal hook for materialized-view dispatch
|
|
9143
|
+
* Vault-internal hook for materialized-view dispatch.
|
|
9074
9144
|
* Parallel to `derivationSource` — when set, `Collection.put` fires
|
|
9075
9145
|
* `MaterializedViewRegistry.onSourceWrite` after the source-write
|
|
9076
9146
|
* commits + after `dispatchDerivations` has run.
|
|
@@ -9123,19 +9193,21 @@ declare class Collection<T> {
|
|
|
9123
9193
|
encrypted: boolean;
|
|
9124
9194
|
emitter: NoydbEventEmitter;
|
|
9125
9195
|
/**
|
|
9126
|
-
* Vault-level in-flight write tracker
|
|
9196
|
+
* Vault-level in-flight write tracker. When present,
|
|
9127
9197
|
* `put`/`delete` run inside `writeQueue.track()` so `hub.writeQueue`
|
|
9128
9198
|
* reflects outstanding writes. Optional so direct Collection
|
|
9129
9199
|
* construction in tests still works untracked.
|
|
9130
9200
|
*/
|
|
9131
9201
|
writeQueue?: WriteQueueTracker | undefined;
|
|
9132
|
-
/**
|
|
9202
|
+
/** Per-collection schema-update gate; `put`/`delete` await it. */
|
|
9133
9203
|
schemaUpdateGate?: SchemaUpdateGate | undefined;
|
|
9134
|
-
/**
|
|
9204
|
+
/** Vault-level fence controller; `put`/`delete` consult it. */
|
|
9135
9205
|
schemaFence?: SchemaFenceController | undefined;
|
|
9136
|
-
/**
|
|
9206
|
+
/** Hub-level write-hook registry; fired around put/delete. */
|
|
9137
9207
|
writeHooks?: WriteHookRegistry | undefined;
|
|
9138
|
-
/**
|
|
9208
|
+
/** The observe bus, threaded from Noydb. */
|
|
9209
|
+
subsystemBus?: SubsystemBus | undefined;
|
|
9210
|
+
/** Active transaction id supplier (null outside a transaction). */
|
|
9139
9211
|
activeTxId?: (() => string | null) | undefined;
|
|
9140
9212
|
getDEK: (collectionName: string) => Promise<CryptoKey>;
|
|
9141
9213
|
historyConfig?: HistoryConfig | undefined;
|
|
@@ -9340,33 +9412,19 @@ declare class Collection<T> {
|
|
|
9340
9412
|
* to the ledger.
|
|
9341
9413
|
*/
|
|
9342
9414
|
onCrossTierAccess?: ((event: CrossTierAccessEvent) => void) | undefined;
|
|
9343
|
-
periodGuard?: (existing: {
|
|
9344
|
-
ts: string | null;
|
|
9345
|
-
record: Record<string, unknown> | null;
|
|
9346
|
-
} | null, incoming: Record<string, unknown> | null) => Promise<void>;
|
|
9347
9415
|
/**
|
|
9348
|
-
* Optional back-reference to the owning vault's guard registry +
|
|
9349
|
-
* read-only facade. When present, put/delete consult registered
|
|
9350
|
-
* guards for this collection. Same structural-interface pattern
|
|
9351
|
-
* as `refEnforcer` to avoid a circular Vault import.
|
|
9352
|
-
*/
|
|
9353
|
-
guardSource?: {
|
|
9354
|
-
registry(): GuardRegistry;
|
|
9355
|
-
readOnlyVault(): ReadOnlyVaultFacade$1;
|
|
9356
|
-
} | undefined;
|
|
9357
9416
|
/**
|
|
9358
9417
|
* Optional back-reference to the owning vault's derivation
|
|
9359
9418
|
* registry + collection accessor. When present, successful
|
|
9360
9419
|
* `put()` dispatches registered derivation strategies for the
|
|
9361
|
-
* source collection.
|
|
9362
|
-
* `guardSource` to avoid a circular Vault import.
|
|
9420
|
+
* source collection.
|
|
9363
9421
|
*/
|
|
9364
9422
|
derivationSource?: {
|
|
9365
9423
|
registry(): DerivationRegistry;
|
|
9366
9424
|
getCollection(name: string): Collection<Record<string, unknown>>;
|
|
9367
9425
|
/**
|
|
9368
9426
|
* Read-only vault facade handed to `derive(source, ctx)` so a
|
|
9369
|
-
* derivation can fetch sibling records
|
|
9427
|
+
* derivation can fetch sibling records. Same shape and
|
|
9370
9428
|
* instance the guards subsystem uses for `check(incoming, ctx)`.
|
|
9371
9429
|
*/
|
|
9372
9430
|
getReadOnlyFacade(): ReadOnlyVaultFacade$1;
|
|
@@ -9375,13 +9433,13 @@ declare class Collection<T> {
|
|
|
9375
9433
|
* transaction context, or `null` when no transaction is running.
|
|
9376
9434
|
* `dispatchDerivations` consults this so a recursive derived-output
|
|
9377
9435
|
* write can register its pre-write envelope onto `ctx._executed`
|
|
9378
|
-
* and roll back alongside the source op on mid-batch failure
|
|
9436
|
+
* and roll back alongside the source op on mid-batch failure.
|
|
9379
9437
|
*/
|
|
9380
9438
|
getActiveTxContext(): TxContext | null;
|
|
9381
9439
|
/**
|
|
9382
9440
|
* Construct a transient TxContext bound to the owning Noydb. Used
|
|
9383
9441
|
* by `Collection.putManyAtomic` to publish an active context for
|
|
9384
|
-
* its Phase 2 loop
|
|
9442
|
+
* its Phase 2 loop.
|
|
9385
9443
|
*/
|
|
9386
9444
|
createTxContext(): TxContext;
|
|
9387
9445
|
/** Publish a TxContext for the duration of a bulk-atomic loop. */
|
|
@@ -9390,7 +9448,7 @@ declare class Collection<T> {
|
|
|
9390
9448
|
clearActiveTxContext(ctx: TxContext): void;
|
|
9391
9449
|
} | undefined;
|
|
9392
9450
|
/**
|
|
9393
|
-
* Vault-internal hook for materialized-view dispatch
|
|
9451
|
+
* Vault-internal hook for materialized-view dispatch.
|
|
9394
9452
|
* Parallel to `derivationSource`. When set, `Collection.put` fires
|
|
9395
9453
|
* registered MV `onSourceWrite` after the standard derivation
|
|
9396
9454
|
* dispatch.
|
|
@@ -9453,14 +9511,14 @@ declare class Collection<T> {
|
|
|
9453
9511
|
}): PresenceHandle<P>;
|
|
9454
9512
|
/**
|
|
9455
9513
|
* Create or update a record. Runs inside the hub's write-queue tracker
|
|
9456
|
-
*
|
|
9514
|
+
* so `hub.writeQueue.pending` reflects this write.
|
|
9457
9515
|
*
|
|
9458
9516
|
* @param id Record identifier.
|
|
9459
9517
|
* @param record The record body (validated by the collection's schema
|
|
9460
9518
|
* if one was attached at `vault.collection(...)` time).
|
|
9461
9519
|
* @param options Optional metadata for audit + import workflows.
|
|
9462
9520
|
* `reason` is stamped onto the resulting ledger entry
|
|
9463
|
-
*
|
|
9521
|
+
* so audit consumers can filter via
|
|
9464
9522
|
* `entries.filter(e => e.reason?.startsWith('import:'))`.
|
|
9465
9523
|
*/
|
|
9466
9524
|
put(id: string, record: T, options?: {
|
|
@@ -9472,7 +9530,7 @@ declare class Collection<T> {
|
|
|
9472
9530
|
* Fire registered MV strategies whose dependency set includes this
|
|
9473
9531
|
* collection. Eager-mode MVs re-materialize inline via
|
|
9474
9532
|
* `MaterializedViewExecutor.refresh`; lazy / manual modes are
|
|
9475
|
-
* no-ops in the foundation
|
|
9533
|
+
* no-ops in the foundation; wired in the lazy-mode implementation.
|
|
9476
9534
|
*
|
|
9477
9535
|
* Skips entirely when the record being written is itself an
|
|
9478
9536
|
* MV-emitted row (carries `_materializedFrom`) — defensive guard
|
|
@@ -9495,11 +9553,11 @@ declare class Collection<T> {
|
|
|
9495
9553
|
private dispatchDerivations;
|
|
9496
9554
|
/**
|
|
9497
9555
|
* Delete a record by ID. Runs inside the hub's write-queue tracker
|
|
9498
|
-
*
|
|
9556
|
+
* so `hub.writeQueue.pending` reflects this write.
|
|
9499
9557
|
*/
|
|
9500
9558
|
delete(id: string): Promise<void>;
|
|
9501
9559
|
/**
|
|
9502
|
-
* @internal
|
|
9560
|
+
* @internal — bulk-rewrite every record through a cutover transform.
|
|
9503
9561
|
* Raw adapter path (bypasses the write gate + guards — the transform is
|
|
9504
9562
|
* trusted and runs only during the `migrating` phase). Bumps each
|
|
9505
9563
|
* record's `_v` and appends a ledger `op:'migration'` entry.
|
|
@@ -9509,8 +9567,7 @@ declare class Collection<T> {
|
|
|
9509
9567
|
private deleteInternal;
|
|
9510
9568
|
/**
|
|
9511
9569
|
* @internal — system-internal delete that bypasses user-facing
|
|
9512
|
-
* delete hooks (`onDelete`,
|
|
9513
|
-
* enforcer). Used by derivation tombstones (#144) and MV refresh
|
|
9570
|
+
* delete hooks (`onDelete`, FK ref enforcer). Used by derivation tombstones and MV refresh
|
|
9514
9571
|
* (Dim 14 v2) — system housekeeping shouldn't trip user invariants
|
|
9515
9572
|
* registered against the output collection. The ledger entry and
|
|
9516
9573
|
* history snapshot still fire so backup integrity and time-travel
|
|
@@ -9522,7 +9579,7 @@ declare class Collection<T> {
|
|
|
9522
9579
|
*
|
|
9523
9580
|
* When a `txCtx` is supplied, the prior envelope is captured and
|
|
9524
9581
|
* pushed onto `txCtx._executed` BEFORE the delete fires — mirrors
|
|
9525
|
-
* the
|
|
9582
|
+
* the rollback hardening for puts. Callers outside a
|
|
9526
9583
|
* multi-record transaction pass `null` and skip the tracking.
|
|
9527
9584
|
*
|
|
9528
9585
|
* Amendment composition: if `_internalDelete` runs while a vault's
|
|
@@ -9549,7 +9606,7 @@ declare class Collection<T> {
|
|
|
9549
9606
|
private _doDelete;
|
|
9550
9607
|
/**
|
|
9551
9608
|
* Cascade deletes of array-shape derived rows when a source row is
|
|
9552
|
-
* deleted
|
|
9609
|
+
* deleted. Reads each registered strategy's fanout sidecar
|
|
9553
9610
|
* for this source id, deletes every listed derived row, then
|
|
9554
9611
|
* deletes the sidecar itself.
|
|
9555
9612
|
*
|
|
@@ -9560,8 +9617,8 @@ declare class Collection<T> {
|
|
|
9560
9617
|
*/
|
|
9561
9618
|
private dispatchArrayDerivationsOnDelete;
|
|
9562
9619
|
/**
|
|
9563
|
-
* Mirror of {@link dispatchMaterializedViews} for the delete path
|
|
9564
|
-
*
|
|
9620
|
+
* Mirror of {@link dispatchMaterializedViews} for the delete path.
|
|
9621
|
+
* No record content is available (it's gone), so the
|
|
9565
9622
|
* `_materializedFrom` skip used by the put-side dispatch doesn't
|
|
9566
9623
|
* apply here — instead, the recursion guard is the `internal` gate
|
|
9567
9624
|
* at the `_doDelete` call site above.
|
|
@@ -9643,7 +9700,7 @@ declare class Collection<T> {
|
|
|
9643
9700
|
* the filtered records directly (the API). Prefer the chainable
|
|
9644
9701
|
* form for new code.
|
|
9645
9702
|
*
|
|
9646
|
-
* **Lazy-MV gap
|
|
9703
|
+
* **Lazy-MV gap:** `query()` is synchronous and does NOT
|
|
9647
9704
|
* trigger lazy materialized-view resolve-on-read. If this
|
|
9648
9705
|
* collection is a lazy MV's output and the MV is currently stale,
|
|
9649
9706
|
* `query().toArray()` returns the pre-stale snapshot. To force a
|
|
@@ -9804,7 +9861,7 @@ declare class Collection<T> {
|
|
|
9804
9861
|
* .aggregate({ total: sum('amount'), n: count() })
|
|
9805
9862
|
* ```
|
|
9806
9863
|
*
|
|
9807
|
-
* **Lazy-MV gap
|
|
9864
|
+
* **Lazy-MV gap:** `scan()` is synchronous-build and does
|
|
9808
9865
|
* NOT trigger lazy materialized-view resolve-on-read. For lazy
|
|
9809
9866
|
* MVs, call `list()` (which DOES resolve) or `vault.refreshView(name)`
|
|
9810
9867
|
* before scanning. Same shape as the `query()` limitation.
|
|
@@ -9844,13 +9901,13 @@ declare class Collection<T> {
|
|
|
9844
9901
|
*/
|
|
9845
9902
|
_invalidateCacheEntry(id: string): Promise<void>;
|
|
9846
9903
|
/**
|
|
9847
|
-
*
|
|
9904
|
+
* Apply a peer tab's committed write to THIS tab's in-memory view:
|
|
9848
9905
|
* re-read the (already-persisted) envelope from the shared store + refresh
|
|
9849
9906
|
* cache/indexes, then emit a `change` event so reactive consumers re-render.
|
|
9850
9907
|
* Never writes to the store and never fires write hooks, so it cannot loop.
|
|
9851
9908
|
*/
|
|
9852
9909
|
_applyRemoteChange(id: string, action: 'put' | 'delete'): Promise<void>;
|
|
9853
|
-
/** @internal
|
|
9910
|
+
/** @internal — the current in-memory record without a store read (for conflict capture). */
|
|
9854
9911
|
_peekCached(id: string): T | null;
|
|
9855
9912
|
private ensureHydrated;
|
|
9856
9913
|
/** Hydrate from a pre-loaded snapshot (used by Vault). */
|
|
@@ -10408,7 +10465,7 @@ interface SessionStrategy {
|
|
|
10408
10465
|
}
|
|
10409
10466
|
|
|
10410
10467
|
/**
|
|
10411
|
-
* Managed-passphrase mode —
|
|
10468
|
+
* Managed-passphrase mode — rubber-hose-resistant vaults.
|
|
10412
10469
|
*
|
|
10413
10470
|
* A vault mode where the passphrase is machine-generated and never
|
|
10414
10471
|
* exposed to the user, sealed under a developer-provided
|
|
@@ -10447,9 +10504,9 @@ interface SessionStrategy {
|
|
|
10447
10504
|
* Returns the plaintext passphrase string that the rest of the
|
|
10448
10505
|
* `createNoydb` keyring path consumes.
|
|
10449
10506
|
*
|
|
10450
|
-
*
|
|
10507
|
+
* Deferred to follow-ups:
|
|
10451
10508
|
* - Block `rotate-passphrase` policy gate under managed mode.
|
|
10452
|
-
* - Mandatory strong-recovery enforcement
|
|
10509
|
+
* - Mandatory strong-recovery enforcement.
|
|
10453
10510
|
* - Recovery flow under managed mode (generates fresh sealed phrase).
|
|
10454
10511
|
*
|
|
10455
10512
|
* @see docs/subsystems/session-tiers.md → Managed-passphrase mode
|
|
@@ -10609,12 +10666,12 @@ interface SealedPassphrase {
|
|
|
10609
10666
|
*
|
|
10610
10667
|
* v1 shape (this release): `{ v: 1, _noydb_sealed: 1, pid, payload }`.
|
|
10611
10668
|
*
|
|
10612
|
-
* Legacy shape (
|
|
10669
|
+
* Legacy shape (earlier releases): `{ _noydb_sealed: 1, providerId, sealed }`
|
|
10613
10670
|
* — accepted on read for backwards compatibility; never produced on
|
|
10614
10671
|
* write going forward.
|
|
10615
10672
|
*/
|
|
10616
10673
|
interface SealedEnvelope {
|
|
10617
|
-
/** Envelope schema version. v1 is the shape
|
|
10674
|
+
/** Envelope schema version. v1 is the current shape. */
|
|
10618
10675
|
readonly v: 1;
|
|
10619
10676
|
/** Magic marker for forensics + legacy-shape detection. */
|
|
10620
10677
|
readonly _noydb_sealed: 1;
|
|
@@ -10628,9 +10685,9 @@ interface SealedEnvelope {
|
|
|
10628
10685
|
* in-memory {@link SealedPassphrase} representation. Accepts both:
|
|
10629
10686
|
*
|
|
10630
10687
|
* 1. v1 wire format `{ v: 1, _noydb_sealed: 1, pid, payload }` —
|
|
10631
|
-
* the shape
|
|
10688
|
+
* the current shape.
|
|
10632
10689
|
* 2. Legacy wire format `{ _noydb_sealed: 1, providerId, sealed }` —
|
|
10633
|
-
*
|
|
10690
|
+
* read-only; never written
|
|
10634
10691
|
* going forward.
|
|
10635
10692
|
*
|
|
10636
10693
|
* Returns `undefined` for any input that doesn't match either shape,
|
|
@@ -11015,9 +11072,9 @@ interface ImportCapability {
|
|
|
11015
11072
|
*/
|
|
11016
11073
|
type VaultPolicyOnDisk = Record<string, unknown>;
|
|
11017
11074
|
/**
|
|
11018
|
-
* Recovery profile enrolled at vault creation
|
|
11075
|
+
* Recovery profile enrolled at vault creation.
|
|
11019
11076
|
*
|
|
11020
|
-
* - `paper` — `on-recovery` codes (the
|
|
11077
|
+
* - `paper` — `on-recovery` codes (the standard end-to-end profile).
|
|
11021
11078
|
* - `shamir` / `multi-channel` / `admin-mediated` — API surface ships;
|
|
11022
11079
|
* per-profile dispatch lands in follow-up issues. Calling
|
|
11023
11080
|
* `db.recoverPassphrase` against these throws
|
|
@@ -11080,7 +11137,7 @@ interface KeyringAuthenticatorBase {
|
|
|
11080
11137
|
* extractable KEK from its own credential — WebAuthn (PRF-derived
|
|
11081
11138
|
* wrapping key) and split-key OIDC.
|
|
11082
11139
|
*
|
|
11083
|
-
* `wrapKind` is optional/absent on slots
|
|
11140
|
+
* `wrapKind` is optional/absent on older slots — those
|
|
11084
11141
|
* legacy slots are treated as wrap-KEK by default at unlock time.
|
|
11085
11142
|
*/
|
|
11086
11143
|
interface KeyringAuthenticatorWrappingKEK extends KeyringAuthenticatorBase {
|
|
@@ -11143,11 +11200,11 @@ interface KeyringFile {
|
|
|
11143
11200
|
readonly granted_by: string;
|
|
11144
11201
|
/**
|
|
11145
11202
|
* Passphrase canary — base64 AES-KW-wrapped form of a known constant
|
|
11146
|
-
* 256-bit value, wrapped under the keyring's KEK
|
|
11203
|
+
* 256-bit value, wrapped under the keyring's KEK.
|
|
11147
11204
|
*
|
|
11148
|
-
* Optional:
|
|
11149
|
-
* the multi-DEK corruption heuristic
|
|
11150
|
-
*
|
|
11205
|
+
* Optional: older keyrings load with no canary and fall back to
|
|
11206
|
+
* the multi-DEK corruption heuristic. Newer keyrings
|
|
11207
|
+
* carry one and let `loadKeyring` distinguish wrong-passphrase
|
|
11151
11208
|
* from corruption even when ALL DEKs (including a single-DEK keyring's
|
|
11152
11209
|
* sole DEK) are corrupted.
|
|
11153
11210
|
*
|
|
@@ -11370,7 +11427,7 @@ interface Conflict {
|
|
|
11370
11427
|
readonly resolve?: (winner: EncryptedEnvelope | null) => void;
|
|
11371
11428
|
}
|
|
11372
11429
|
/**
|
|
11373
|
-
*
|
|
11430
|
+
* A same-device cross-tab write conflict: another tab overwrote a
|
|
11374
11431
|
* document this tab had written, having diverged from an older base. Records
|
|
11375
11432
|
* are decrypted (cross-tab handlers reconcile in plaintext). `base` is the
|
|
11376
11433
|
* common ancestor from history, or null when history is unavailable.
|
|
@@ -11473,8 +11530,8 @@ interface NoydbEventMap {
|
|
|
11473
11530
|
'change': ChangeEvent;
|
|
11474
11531
|
'error': Error;
|
|
11475
11532
|
/**
|
|
11476
|
-
* Same-instance signal that this vault's schema-fence state changed
|
|
11477
|
-
*
|
|
11533
|
+
* Same-instance signal that this vault's schema-fence state changed.
|
|
11534
|
+
* For UI integration. Cross-client coordination goes
|
|
11478
11535
|
* through the store, not this event.
|
|
11479
11536
|
*/
|
|
11480
11537
|
'schema:fence-changed': {
|
|
@@ -11580,7 +11637,7 @@ interface GrantOptions {
|
|
|
11580
11637
|
readonly initialProfile?: unknown;
|
|
11581
11638
|
}
|
|
11582
11639
|
/**
|
|
11583
|
-
* Caller payload for `db.updateUser
|
|
11640
|
+
* Caller payload for `db.updateUser`. Mutate one or more
|
|
11584
11641
|
* identity fields on an existing keyring without rotating any keys.
|
|
11585
11642
|
*
|
|
11586
11643
|
* `role`, `displayName`, and `permissions` live in the plaintext header
|
|
@@ -11594,7 +11651,7 @@ interface GrantOptions {
|
|
|
11594
11651
|
* `null` on `displayName` clears the field (stored as the empty string;
|
|
11595
11652
|
* UI consumers typically render the empty case by falling back to the
|
|
11596
11653
|
* user id). `undefined` / absent leaves the field untouched. Mirrors
|
|
11597
|
-
* the `null`-as-clear convention `UserApi.updateMe` uses
|
|
11654
|
+
* the `null`-as-clear convention `UserApi.updateMe` uses.
|
|
11598
11655
|
*
|
|
11599
11656
|
* `permissions`, however, is a **full replacement** at the map level —
|
|
11600
11657
|
* passing `{ invoices: 'rw' }` REPLACES the entire permissions map,
|
|
@@ -11608,8 +11665,6 @@ interface GrantOptions {
|
|
|
11608
11665
|
* do anything. Non-admin callers (operator/viewer/client) cannot call
|
|
11609
11666
|
* `db.updateUser` at all — for self-displayName changes, use
|
|
11610
11667
|
* `vault.user.updateMe` (the user-envelope API).
|
|
11611
|
-
*
|
|
11612
|
-
* @see #54
|
|
11613
11668
|
*/
|
|
11614
11669
|
interface UpdateUserOptions {
|
|
11615
11670
|
readonly userId: string;
|
|
@@ -12201,7 +12256,7 @@ interface NoydbOptions {
|
|
|
12201
12256
|
*/
|
|
12202
12257
|
readonly derivationStrategies?: ReadonlyArray<DerivationStrategyHandle>;
|
|
12203
12258
|
/**
|
|
12204
|
-
* Optional materialized-view strategies
|
|
12259
|
+
* Optional materialized-view strategies.
|
|
12205
12260
|
* Each handle returned by `withMaterializedView()` from
|
|
12206
12261
|
* `@noy-db/hub/materialized-views`. The vault runs unified cycle
|
|
12207
12262
|
* detection across the MV + derivation graphs at `openVault`; a
|
|
@@ -12209,7 +12264,7 @@ interface NoydbOptions {
|
|
|
12209
12264
|
*/
|
|
12210
12265
|
readonly materializedViewStrategies?: ReadonlyArray<MaterializedViewStrategyHandle>;
|
|
12211
12266
|
/**
|
|
12212
|
-
* Optional overlay strategies
|
|
12267
|
+
* Optional overlay strategies. Each handle returned by
|
|
12213
12268
|
* `withOverlayedView()` from `@noy-db/hub/overlay-views`. The vault
|
|
12214
12269
|
* validates name uniqueness + base concreteness + overlay
|
|
12215
12270
|
* availability at `openVault`; a clash throws one of the
|
|
@@ -12262,7 +12317,7 @@ interface NoydbOptions {
|
|
|
12262
12317
|
*/
|
|
12263
12318
|
readonly getKeyring?: (vault: string) => Promise<UnlockedKeyring>;
|
|
12264
12319
|
/**
|
|
12265
|
-
* Passphrase mode
|
|
12320
|
+
* Passphrase mode. Default `'standard'`.
|
|
12266
12321
|
*
|
|
12267
12322
|
* - `'standard'` — the legacy flow. `secret` supplies the
|
|
12268
12323
|
* plaintext passphrase, the user knows it, and the policy gate
|
|
@@ -12323,14 +12378,14 @@ interface NoydbOptions {
|
|
|
12323
12378
|
readonly sessionPolicy?: SessionPolicy;
|
|
12324
12379
|
/**
|
|
12325
12380
|
* Validate passphrase strength against the phrase format
|
|
12326
|
-
*
|
|
12381
|
+
* on first-time keyring creation. When
|
|
12327
12382
|
* `true`, weak phrases throw {@link WeakPassphraseError} from
|
|
12328
12383
|
* `createNoydb()` / `db.rotatePassphrase()`. Default: `false` for
|
|
12329
|
-
* back-compat
|
|
12384
|
+
* back-compat; planned to flip to `true` in a future major release.
|
|
12330
12385
|
*/
|
|
12331
12386
|
readonly validatePassphrase?: boolean;
|
|
12332
12387
|
/**
|
|
12333
|
-
* Vault-level policy gate document
|
|
12388
|
+
* Vault-level policy gate document. When present, the hub
|
|
12334
12389
|
* persists the merged policy at `_meta/policy` on first-time vault
|
|
12335
12390
|
* creation and gates sensitive operations (`db.rotatePassphrase`,
|
|
12336
12391
|
* `db.export*`, …) against it. Omitted ⇒ the engine uses
|
|
@@ -12346,14 +12401,14 @@ interface NoydbOptions {
|
|
|
12346
12401
|
*/
|
|
12347
12402
|
readonly policy?: VaultPolicy;
|
|
12348
12403
|
/**
|
|
12349
|
-
* Mandatory recovery profile enrollment
|
|
12404
|
+
* Mandatory recovery profile enrollment. Vaults with
|
|
12350
12405
|
* `recover-passphrase` enabled MUST register at least one profile
|
|
12351
12406
|
* before being production-ready, otherwise `createNoydb()` throws
|
|
12352
12407
|
* {@link RecoveryNotEnrolledError}. Set
|
|
12353
12408
|
* `policy.gates['recover-passphrase'].enabled = false` to
|
|
12354
12409
|
* deliberately opt out of recovery (passphrase loss = data loss).
|
|
12355
12410
|
*
|
|
12356
|
-
*
|
|
12411
|
+
* The `'paper'` profile is supported end-to-end. Other
|
|
12357
12412
|
* profiles ship the API shape and throw
|
|
12358
12413
|
* {@link RecoveryProfileNotImplementedError} during use.
|
|
12359
12414
|
*/
|
|
@@ -12361,9 +12416,9 @@ interface NoydbOptions {
|
|
|
12361
12416
|
/**
|
|
12362
12417
|
* When `true`, `createNoydb` rejects vaults with no recovery
|
|
12363
12418
|
* entries persisted (per the spec's mandatory-enrollment
|
|
12364
|
-
* requirement). Default `false` for
|
|
12365
|
-
* flip to `true`
|
|
12366
|
-
* turn this on now.
|
|
12419
|
+
* requirement). Default `false` for back-compat; planned to
|
|
12420
|
+
* flip to `true` in a future major release. Apps in regulated
|
|
12421
|
+
* environments should turn this on now.
|
|
12367
12422
|
*/
|
|
12368
12423
|
readonly requireRecovery?: boolean;
|
|
12369
12424
|
/**
|
|
@@ -12490,4 +12545,4 @@ interface DeleteManyResult {
|
|
|
12490
12545
|
}>;
|
|
12491
12546
|
}
|
|
12492
12547
|
|
|
12493
|
-
export { type ConsentAuditEntry as $, type BlobObject as A, type BlobStrategy as B, type BlobPutOptions as C, DICT_COLLECTION_PREFIX as D, type BlobResponseOptions as E, BlobSet as F, type BlobStrategyOpenArgs as G, type CompactRunOptions as H, type I18nStrategy as I, type CompactionContext as J, type CompactionResult as K, DEFAULT_CHUNK_SIZE as L, EXPORT_AUDIT_COLLECTION as M, ExportBlobsAbortedError as N, type ExportBlobsAuditEntry as O, PolicyEnforcer as P, type ExportBlobsHandle as Q, type ExportBlobsOptions as R, type SessionStrategy as S, type ExportedBlob as T, type SlotInfo as U, type SlotRecord as V, type VersionRecord as W, createExportBlobsHandle as X, runCompaction as Y, type ConsentStrategy as Z, CONSENT_AUDIT_COLLECTION as _, type DictEntry as a, VaultInstant as a$, type ConsentAuditFilter as a0, type ConsentContext as a1, type ConsentOp as a2, loadConsentEntries as a3, writeConsentEntry as a4, type PeriodsStrategy as a5, type CarryForwardContext as a6, type ClosePeriodOptions as a7, type OpenPeriodOptions as a8, PERIODS_COLLECTION as a9, type DerivationStrategyHandle as aA, type DerivedFromMeta as aB, type OutputSpec as aC, type RecordOutputSpec as aD, type MaterializedViewStrategy as aE, type MaterializedViewStrategyHandle as aF, type OverlayedViewStrategy as aG, Collection as aH, OverlayedViewRegistry as aI, type OverlayedViewStrategyHandle as aJ, type SyncStrategy as aK, type Role as aL, type UnlockedKeyring as aM, type HistoryStrategy as aN, type NoydbStore as aO, type HistoryOptions as aP, type EncryptedEnvelope as aQ, type PruneOptions as aR, type AppendInput as aS, type ChangeType as aT, CollectionInstant as aU, type DiffEntry as aV, type JsonPatch as aW, type JsonPatchOp as aX, type LedgerEntry as aY, LedgerStore as aZ, type VaultEngine as a_, type PeriodRecord as aa, type ReadOnlyCollection as ab, appendPeriodLedgerEntry as ac, assertTsWritable as ad, chainAnchor as ae, loadPeriods as af, validatePeriodName as ag, type GuardStrategy as ah, type GuardChange as ai, type GuardContext as aj, GuardRegistry as ak, type GuardStrategyHandle as al, ReadOnlyVaultFacade as am, type ShadowStrategy as an, CollectionFrame as ao, VaultFrame as ap, type TxStrategy as aq, type AmendmentTxOptions as ar, TxCollection as as, TxContext as at, TxVault as au, runTransaction as av, type DerivationStrategy as aw, type DerivationContext as ax, type ArrayOutputSpec as ay, DerivationRegistry as az, type DictKeyDescriptor as b, type EnrollAuthenticatorOptions as b$, type VerifyResult as b0, applyPatch as b1, canonicalJson as b2, computePatch as b3, diff as b4, formatDiff as b5, hashEntry as b6, paddedIndex as b7, parseIndex as b8, sha256Hex as b9, type AccessibleVault as bA, type AffectedDocument as bB, BUNDLE_STORE_POLICY as bC, type BuiltInGateName as bD, type CacheOptions as bE, type CacheStats as bF, type ChangeEvent as bG, type CollectionChangeEvent as bH, type CollectionConflictResolver as bI, type CollectionDescriptor as bJ, type CollectionStats as bK, type Conflict as bL, type ConflictPolicy as bM, type ConflictStrategy as bN, type CrossTierAccessEvent as bO, DEFAULT_PUBLIC_ENVELOPE_SCHEMA as bP, DELEGATIONS_COLLECTION as bQ, type DeepPartial as bR, type DeepPartialOrNull as bS, type DelegationToken as bT, type DeleteManyResult as bU, type DerivationDescriptor as bV, type DirtyEntry as bW, type DryRunResult as bX, type DumpSchemaOptions as bY, ELEVATION_AUDIT_COLLECTION as bZ, ElevatedHandle as b_, type PublicEnvelope as ba, type SealingKeyProvider as bb, type BundleRecipient as bc, type RecipientSealer as bd, type RecipientHint as be, Vault as bf, type RecoveryEnrollmentInput as bg, type ShamirRecoveryProvider as bh, type MVQueryContext as bi, type RegisteredMV as bj, MaterializedViewRegistry as bk, type MaterializedFromMeta as bl, type MaterializedViewOutput as bm, type UnionSource as bn, type UserEnvelope as bo, type GateName as bp, type GatePolicy as bq, type VaultPolicy as br, type ActiveTier as bs, type FactorProof as bt, type SchemaUpdateStrategy as bu, type TransformFn as bv, type PersistedSchemaEnvelope as bw, type UpdateDecision as bx, type DirectoryConfig as by, type UserVisibility as bz, DictionaryHandle as c, type PlaintextTranslatorContext as c$, type EnrollAuthenticatorWrappingDEKsOptions as c0, type EnrollAuthenticatorWrappingKEKOptions as c1, type EnrollRecoveryResult as c2, type ExportCapability as c3, type ExportChunk as c4, type ExportFormat as c5, type ExportStreamOptions as c6, type FactorKind as c7, type FactorProofBundle as c8, type FactorRequirement as c9, type LruOptions as cA, type LruStats as cB, MAGIC_LINK_CONTENT_INFO_PREFIX as cC, MAGIC_LINK_GRANTS_COLLECTION as cD, MAGIC_LINK_KEK_INFO_PREFIX as cE, type MagicLinkGrantPayload as cF, type MagicLinkGrantRecord as cG, type MaterializedViewDescriptor as cH, MemoryRecipientSealer as cI, MemorySealingKeyProvider as cJ, NOYDB_BACKUP_VERSION as cK, NOYDB_FORMAT_VERSION as cL, NOYDB_KEYRING_VERSION as cM, NOYDB_SYNC_VERSION as cN, Noydb as cO, type NoydbBundleStore as cP, type NoydbEventMap as cQ, type NoydbOptions as cR, type OverlayViewDescriptor as cS, PUBLIC_ENVELOPE_FIELDS as cT, type PaperRecoveryDoc as cU, type PaperRecoveryEntry as cV, type PassphrasePolicy as cW, type PassphraseValidationResult as cX, type Permission as cY, type Permissions as cZ, type PersistedSchemaKind as c_, type FenceDoc as ca, type FenceState as cb, type FieldChange as cc, type FieldDescriptor as cd, type FieldSource as ce, type GhostRecord as cf, type GrantOptions as cg, type GuardViolation as ch, type HistoryConfig as ci, type HistoryEntry as cj, INDEXED_STORE_POLICY as ck, type ImportCapability as cl, type InferOutput as cm, type InternalCollectionStats as cn, type IssueDelegationOptions as co, type IssueMagicLinkGrantOptions as cp, type KeyringAuthenticator as cq, type KeyringAuthenticatorWrappingDEKs as cr, type KeyringAuthenticatorWrappingKEK as cs, type KeyringFile as ct, type ListAccessibleVaultsOptions as cu, type ListPageResult as cv, type ListUsersOptions as cw, type LiveUserEnvelope as cx, type LocaleReadOptions as cy, Lru as cz, type DictionaryOptions as d, type TabRole as d$, type PlaintextTranslatorFn as d0, PresenceHandle as d1, type PresencePeer as d2, type PublicEnvelopeField as d3, type PublicEnvelopeSchema as d4, type PublicEnvelopeText as d5, type PullMode as d6, type PullOptions as d7, type PullPolicy as d8, type PullResult as d9, type SealedPassphrase as dA, type SessionPolicy as dB, type SetPublicEnvelopeInput as dC, type ShamirRecoveryDoc as dD, type ShamirRecoveryEntry as dE, type SlotRewrapCeremony as dF, type SlotRewrapContext as dG, type StandardSchemaV1 as dH, type StandardSchemaV1Issue as dI, type StandardSchemaV1SyncResult as dJ, type StoreAuth as dK, type StoreAuthKind as dL, type StoreCapabilities as dM, SyncEngine as dN, type SyncMetadata as dO, type SyncPolicy as dP, SyncScheduler as dQ, type SyncSchedulerStatus as dR, type SyncStatus as dS, type SyncTarget as dT, type SyncTargetRole as dU, SyncTransaction as dV, type SyncTransactionResult as dW, type TabChannel as dX, type TabCoordinationOptions as dY, type TabLockManager as dZ, type TabPresence as d_, type PushMode as da, type PushOptions as db, type PushPolicy as dc, type PushResult as dd, type PutManyItemOptions as de, type PutManyOptions as df, type PutManyResult as dg, type QueryAcrossOptions as dh, type QueryAcrossResult as di, type QuickUnlockState as dj, QuickUnlockStore as dk, type ReAuthOperation as dl, type RecoverPassphraseInput as dm, type RecoverPassphraseResult as dn, type RecoverUserOptions as dp, type RecoveryProof as dq, type ResolvedPublicEnvelopeSchema as dr, type RevokeOptions as ds, type RotatePassphraseInput as dt, type RotateRecoveryOptions as du, type RotateRecoveryResult as dv, SEALED_PASSPHRASE_RECORD_ID as dw, type SchemaDelta as dx, type SchemaIntrospection as dy, type SealedEnvelope as dz, type I18nTextDescriptor as e, savePaperRecoveryEntries as e$, type TierMode as e0, type TranslatorAuditEntry as e1, type TxOp as e2, USER_ENVELOPE_COLLECTION as e3, USER_ENVELOPE_MAX_BYTES as e4, type Unsubscribe as e5, type UpdateAuthenticatorOptions as e6, type UpdateContext as e7, type UpdateUserOptions as e8, UserApi as e9, findAuthenticator as eA, hasExportCapability as eB, hasImportCapability as eC, hasRecoveryEnrolled as eD, isMagicLinkGrantExpired as eE, isPublicEnvelope as eF, issueDelegation as eG, recoverPassphrase as eH, rotatePassphrase as eI, listMagicLinkGrants as eJ, listUsers as eK, listUsersWithEnvelopes as eL, loadActiveDelegations as eM, loadPaperRecoveryEntries as eN, loadSealedPassphrase as eO, loadShamirRecoveryEntries as eP, magicLinkGrantRecordId as eQ, mintPaperRecoveryEntry as eR, mintShamirRecoveryEntry as eS, mintWrappedDeksBlob as eT, parseSealedEnvelope as eU, readMagicLinkGrantRecord as eV, recoverUser as eW, removeAuthenticator as eX, resolveSchema as eY, revokeDelegation as eZ, revokeMagicLinkGrant as e_, type UserEnvelopeCheckGate as ea, UserEnvelopeOversizedError as eb, type UserEnvelopePresented as ec, type UserInfo as ed, type VaultBackup as ee, type VaultPolicyOnDisk as ef, type VaultSchemaSnapshot as eg, type VaultSnapshot as eh, type WarningRules as ei, WeakPassphraseError as ej, type WeakPassphraseReason as ek, type WrappedDeksBlob as el, type WriteConflict as em, type WriteEvent as en, type WriteHook as eo, type WriteQueue as ep, assertStrongPassphrase as eq, buildRecipientKeyringFile as er, burnPaperRecoveryEntry as es, createNoydb as et, createStore as eu, deriveMagicLinkContentKey as ev, enrollAuthenticator as ew, estimateEntropy as ex, evaluateExportCapability as ey, evaluateImportCapability as ez, type I18nTextOptions as f, saveSealedPassphrase as f0, saveShamirRecoveryEntries as f1, unwrapDeksFromBlob as f2, unwrapDeksFromPaperEntry as f3, unwrapDeksFromShamirEntry as f4, unwrapMagicLinkGrant as f5, validatePassphrase as f6, validatePublicEnvelopeInput as f7, validateSchemaInput as f8, validateSchemaOutput as f9, writeMagicLinkGrant as fa, changeSecret as fb, createOwnerKeyring as fc, ensureCollectionDEK as fd, grant as fe, loadKeyring as ff, persistKeyring as fg, revoke as fh, updateAuthenticator as fi, updateKeyringIdentity as fj, applyI18nLocale as g, dictCollectionName as h, dictKey as i, i18nText as j, isDictCollectionName as k, isDictKeyDescriptor as l, isI18nTextDescriptor as m, createEnforcer as n, validateSessionPolicy as o, BLOB_CHUNKS_COLLECTION as p, BLOB_COLLECTION as q, resolveI18nText as r, BLOB_EVICTION_AUDIT_COLLECTION as s, BLOB_INDEX_COLLECTION as t, BLOB_SLOTS_PREFIX as u, validateI18nTextValue as v, BLOB_VERSIONS_PREFIX as w, type BlobEvictionEntry as x, type BlobFieldPolicy as y, type BlobFieldsConfig as z };
|
|
12548
|
+
export { type ConsentStrategy as $, type BlobFieldPolicy as A, type BlobStrategy as B, type BlobFieldsConfig as C, DICT_COLLECTION_PREFIX as D, type BlobObject as E, type BlobPutOptions as F, type BlobResponseOptions as G, BlobSet as H, type I18nStrategy as I, type BlobStrategyOpenArgs as J, type CompactRunOptions as K, type CompactionContext as L, type CompactionResult as M, DEFAULT_CHUNK_SIZE as N, EXPORT_AUDIT_COLLECTION as O, PolicyEnforcer as P, ExportBlobsAbortedError as Q, type ExportBlobsAuditEntry as R, type SessionStrategy as S, type ExportBlobsHandle as T, type ExportBlobsOptions as U, type ExportedBlob as V, type SlotInfo as W, type SlotRecord as X, type VersionRecord as Y, createExportBlobsHandle as Z, runCompaction as _, type DictEntry as a, LedgerStore as a$, CONSENT_AUDIT_COLLECTION as a0, type ConsentAuditEntry as a1, type ConsentAuditFilter as a2, type ConsentContext as a3, type ConsentOp as a4, loadConsentEntries as a5, writeConsentEntry as a6, type PeriodsStrategy as a7, type CarryForwardContext as a8, type ClosePeriodOptions as a9, type ArrayOutputSpec as aA, DerivationRegistry as aB, type DerivationStrategyHandle as aC, type DerivedFromMeta as aD, type OutputSpec as aE, type RecordOutputSpec as aF, type MaterializedViewStrategy as aG, type MaterializedViewStrategyHandle as aH, type OverlayedViewStrategy as aI, Collection as aJ, OverlayedViewRegistry as aK, type OverlayedViewStrategyHandle as aL, type SyncStrategy as aM, type Role as aN, type UnlockedKeyring as aO, type HistoryStrategy as aP, type NoydbStore as aQ, type HistoryOptions as aR, type EncryptedEnvelope as aS, type PruneOptions as aT, type AppendInput as aU, type ChangeType as aV, CollectionInstant as aW, type DiffEntry as aX, type JsonPatch as aY, type JsonPatchOp as aZ, type LedgerEntry as a_, type OpenPeriodOptions as aa, PERIODS_COLLECTION as ab, type PeriodRecord as ac, type ReadOnlyCollection as ad, appendPeriodLedgerEntry as ae, assertTsWritable as af, chainAnchor as ag, loadPeriods as ah, validatePeriodName as ai, type GuardStrategy as aj, type GuardChange as ak, type GuardContext as al, GuardRegistry as am, type GuardStrategyHandle as an, ReadOnlyVaultFacade as ao, type ShadowStrategy as ap, CollectionFrame as aq, VaultFrame as ar, type TxStrategy as as, type AmendmentTxOptions as at, TxCollection as au, TxContext as av, TxVault as aw, runTransaction as ax, type DerivationStrategy as ay, type DerivationContext as az, type DictKeyDescriptor as b, ELEVATION_AUDIT_COLLECTION as b$, type VaultEngine as b0, VaultInstant as b1, type VerifyResult as b2, applyPatch as b3, canonicalJson as b4, computePatch as b5, diff as b6, formatDiff as b7, hashEntry as b8, paddedIndex as b9, type DirectoryConfig as bA, type UserVisibility as bB, type AccessibleVault as bC, type AffectedDocument as bD, BUNDLE_STORE_POLICY as bE, type BuiltInGateName as bF, type CacheOptions as bG, type CacheStats as bH, type ChangeEvent as bI, type CollectionChangeEvent as bJ, type CollectionConflictResolver as bK, type CollectionDescriptor as bL, type CollectionStats as bM, type Conflict as bN, type ConflictPolicy as bO, type ConflictStrategy as bP, type CrossTierAccessEvent as bQ, DEFAULT_PUBLIC_ENVELOPE_SCHEMA as bR, DELEGATIONS_COLLECTION as bS, type DeepPartial as bT, type DeepPartialOrNull as bU, type DelegationToken as bV, type DeleteManyResult as bW, type DerivationDescriptor as bX, type DirtyEntry as bY, type DryRunResult as bZ, type DumpSchemaOptions as b_, parseIndex as ba, sha256Hex as bb, type PublicEnvelope as bc, type SealingKeyProvider as bd, type BundleRecipient as be, type RecipientSealer as bf, type RecipientHint as bg, Vault as bh, type RecoveryEnrollmentInput as bi, type ShamirRecoveryProvider as bj, type MVQueryContext as bk, type RegisteredMV as bl, MaterializedViewRegistry as bm, type MaterializedFromMeta as bn, type MaterializedViewOutput as bo, type UnionSource as bp, type UserEnvelope as bq, type GateName as br, type GatePolicy as bs, type VaultPolicy as bt, type ActiveTier as bu, type FactorProof as bv, type SchemaUpdateStrategy as bw, type TransformFn as bx, type PersistedSchemaEnvelope as by, type UpdateDecision as bz, DictionaryHandle as c, type Permissions as c$, ElevatedHandle as c0, type EnrollAuthenticatorOptions as c1, type EnrollAuthenticatorWrappingDEKsOptions as c2, type EnrollAuthenticatorWrappingKEKOptions as c3, type EnrollRecoveryResult as c4, type ExportCapability as c5, type ExportChunk as c6, type ExportFormat as c7, type ExportStreamOptions as c8, type FactorKind as c9, type LocaleReadOptions as cA, Lru as cB, type LruOptions as cC, type LruStats as cD, MAGIC_LINK_CONTENT_INFO_PREFIX as cE, MAGIC_LINK_GRANTS_COLLECTION as cF, MAGIC_LINK_KEK_INFO_PREFIX as cG, type MagicLinkGrantPayload as cH, type MagicLinkGrantRecord as cI, type MaterializedViewDescriptor as cJ, MemoryRecipientSealer as cK, MemorySealingKeyProvider as cL, NOYDB_BACKUP_VERSION as cM, NOYDB_FORMAT_VERSION as cN, NOYDB_KEYRING_VERSION as cO, NOYDB_SYNC_VERSION as cP, Noydb as cQ, type NoydbBundleStore as cR, type NoydbEventMap as cS, type NoydbOptions as cT, type OverlayViewDescriptor as cU, PUBLIC_ENVELOPE_FIELDS as cV, type PaperRecoveryDoc as cW, type PaperRecoveryEntry as cX, type PassphrasePolicy as cY, type PassphraseValidationResult as cZ, type Permission as c_, type FactorProofBundle as ca, type FactorRequirement as cb, type FenceDoc as cc, type FenceState as cd, type FieldChange as ce, type FieldDescriptor as cf, type FieldSource as cg, type GhostRecord as ch, type GrantOptions as ci, type GuardViolation as cj, type HistoryConfig as ck, type HistoryEntry as cl, INDEXED_STORE_POLICY as cm, type ImportCapability as cn, type InferOutput as co, type InternalCollectionStats as cp, type IssueDelegationOptions as cq, type IssueMagicLinkGrantOptions as cr, type KeyringAuthenticator as cs, type KeyringAuthenticatorWrappingDEKs as ct, type KeyringAuthenticatorWrappingKEK as cu, type KeyringFile as cv, type ListAccessibleVaultsOptions as cw, type ListPageResult as cx, type ListUsersOptions as cy, type LiveUserEnvelope as cz, type DictionaryOptions as d, type TabLockManager as d$, type PersistedSchemaKind as d0, type PlaintextTranslatorContext as d1, type PlaintextTranslatorFn as d2, PresenceHandle as d3, type PresencePeer as d4, type PublicEnvelopeField as d5, type PublicEnvelopeSchema as d6, type PublicEnvelopeText as d7, type PullMode as d8, type PullOptions as d9, type SchemaIntrospection as dA, type SealedEnvelope as dB, type SealedPassphrase as dC, type SessionPolicy as dD, type SetPublicEnvelopeInput as dE, type ShamirRecoveryDoc as dF, type ShamirRecoveryEntry as dG, type SlotRewrapCeremony as dH, type SlotRewrapContext as dI, type StandardSchemaV1 as dJ, type StandardSchemaV1Issue as dK, type StandardSchemaV1SyncResult as dL, type StoreAuth as dM, type StoreAuthKind as dN, type StoreCapabilities as dO, SyncEngine as dP, type SyncMetadata as dQ, type SyncPolicy as dR, SyncScheduler as dS, type SyncSchedulerStatus as dT, type SyncStatus as dU, type SyncTarget as dV, type SyncTargetRole as dW, SyncTransaction as dX, type SyncTransactionResult as dY, type TabChannel as dZ, type TabCoordinationOptions as d_, type PullPolicy as da, type PullResult as db, type PushMode as dc, type PushOptions as dd, type PushPolicy as de, type PushResult as df, type PutManyItemOptions as dg, type PutManyOptions as dh, type PutManyResult as di, type QueryAcrossOptions as dj, type QueryAcrossResult as dk, type QuickUnlockState as dl, QuickUnlockStore as dm, type ReAuthOperation as dn, type RecoverPassphraseInput as dp, type RecoverPassphraseResult as dq, type RecoverUserOptions as dr, type RecoveryProof as ds, type ResolvedPublicEnvelopeSchema as dt, type RevokeOptions as du, type RotatePassphraseInput as dv, type RotateRecoveryOptions as dw, type RotateRecoveryResult as dx, SEALED_PASSPHRASE_RECORD_ID as dy, type SchemaDelta as dz, type I18nTextDescriptor as e, revokeDelegation as e$, type TabPresence as e0, type TabRole as e1, type TierMode as e2, type TranslatorAuditEntry as e3, type TxOp as e4, USER_ENVELOPE_COLLECTION as e5, USER_ENVELOPE_MAX_BYTES as e6, type Unsubscribe as e7, type UpdateAuthenticatorOptions as e8, type UpdateContext as e9, evaluateExportCapability as eA, evaluateImportCapability as eB, findAuthenticator as eC, hasExportCapability as eD, hasImportCapability as eE, hasRecoveryEnrolled as eF, isMagicLinkGrantExpired as eG, isPublicEnvelope as eH, issueDelegation as eI, recoverPassphrase as eJ, rotatePassphrase as eK, listMagicLinkGrants as eL, listUsers as eM, listUsersWithEnvelopes as eN, loadActiveDelegations as eO, loadPaperRecoveryEntries as eP, loadSealedPassphrase as eQ, loadShamirRecoveryEntries as eR, magicLinkGrantRecordId as eS, mintPaperRecoveryEntry as eT, mintShamirRecoveryEntry as eU, mintWrappedDeksBlob as eV, parseSealedEnvelope as eW, readMagicLinkGrantRecord as eX, recoverUser as eY, removeAuthenticator as eZ, resolveSchema as e_, type UpdateUserOptions as ea, UserApi as eb, type UserEnvelopeCheckGate as ec, UserEnvelopeOversizedError as ed, type UserEnvelopePresented as ee, type UserInfo as ef, type VaultBackup as eg, type VaultPolicyOnDisk as eh, type VaultSchemaSnapshot as ei, type VaultSnapshot as ej, type WarningRules as ek, WeakPassphraseError as el, type WeakPassphraseReason as em, type WrappedDeksBlob as en, type WriteConflict as eo, type WriteEvent as ep, type WriteHook as eq, type WriteQueue as er, assertStrongPassphrase as es, buildRecipientKeyringFile as et, burnPaperRecoveryEntry as eu, createNoydb as ev, createStore as ew, deriveMagicLinkContentKey as ex, enrollAuthenticator as ey, estimateEntropy as ez, type I18nTextOptions as f, revokeMagicLinkGrant as f0, savePaperRecoveryEntries as f1, saveSealedPassphrase as f2, saveShamirRecoveryEntries as f3, unwrapDeksFromBlob as f4, unwrapDeksFromPaperEntry as f5, unwrapDeksFromShamirEntry as f6, unwrapMagicLinkGrant as f7, validatePassphrase as f8, validatePublicEnvelopeInput as f9, validateSchemaInput as fa, validateSchemaOutput as fb, writeMagicLinkGrant as fc, changeSecret as fd, createOwnerKeyring as fe, ensureCollectionDEK as ff, grant as fg, loadKeyring as fh, persistKeyring as fi, revoke as fj, updateAuthenticator as fk, updateKeyringIdentity as fl, applyI18nLocale as g, dictCollectionName as h, dictKey as i, getAtPath as j, i18nText as k, isDictCollectionName as l, isDictKeyDescriptor as m, isI18nTextDescriptor as n, createEnforcer as o, validateSessionPolicy as p, BLOB_CHUNKS_COLLECTION as q, resolveI18nText as r, setAtPathInPlace as s, BLOB_COLLECTION as t, BLOB_EVICTION_AUDIT_COLLECTION as u, validateI18nTextValue as v, BLOB_INDEX_COLLECTION as w, BLOB_SLOTS_PREFIX as x, BLOB_VERSIONS_PREFIX as y, type BlobEvictionEntry as z };
|