@noy-db/hub 0.6.0-pre.9 → 0.7.0-pre.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7127 -0
- package/README.md +1 -1
- package/codemods/0.4.0-pre.json +24 -0
- package/codemods/0.6.0-pre.json +229 -0
- package/codemods/0.7.0-pre.json +258 -0
- package/dist/api-EQYRTZO2.js +20 -0
- package/dist/as/index.js +146 -0
- package/dist/as/index.js.map +1 -0
- package/dist/at/index.js +23 -0
- package/dist/attestation/index.js +19 -19
- package/dist/{backup-KULFZ2T4.js → backup-Z7ZBTAQ6.js} +36 -18
- package/dist/backup-Z7ZBTAQ6.js.map +1 -0
- package/dist/blobs/index.js +22 -20
- package/dist/blobs/index.js.map +1 -1
- package/dist/broker/index.js +12 -12
- package/dist/by/index.js +11 -0
- package/dist/cargo/index.js +40 -36
- package/dist/{chunk-YAWK6AWF.js → chunk-225O5CXQ.js} +2 -2
- package/dist/{chunk-MSWYQLMQ.js → chunk-2GXEQUEX.js} +2 -2
- package/dist/chunk-2GXEQUEX.js.map +1 -0
- package/dist/{chunk-3URQC7EH.js → chunk-2LPVI4PX.js} +355 -132
- package/dist/chunk-2LPVI4PX.js.map +1 -0
- package/dist/{chunk-JJNOLSG5.js → chunk-3L2MVE36.js} +15 -16
- package/dist/chunk-3L2MVE36.js.map +1 -0
- package/dist/{chunk-OF3L2SD6.js → chunk-3QARDAYW.js} +2 -2
- package/dist/{chunk-WLZ47GSL.js → chunk-467SKJ65.js} +12 -10
- package/dist/{chunk-WLZ47GSL.js.map → chunk-467SKJ65.js.map} +1 -1
- package/dist/{chunk-W3TVWF6N.js → chunk-4A4TYISP.js} +2 -2
- package/dist/{chunk-ZJADGNYF.js → chunk-4AOERLTV.js} +1 -1
- package/dist/chunk-4AOERLTV.js.map +1 -0
- package/dist/{chunk-CCZJJ4I2.js → chunk-4G25SDQL.js} +6 -6
- package/dist/{chunk-4I72F5DF.js → chunk-4LPF226H.js} +11 -14
- package/dist/chunk-4LPF226H.js.map +1 -0
- package/dist/{chunk-7F4DBNSP.js → chunk-4ZPE6SKS.js} +135 -18
- package/dist/chunk-4ZPE6SKS.js.map +1 -0
- package/dist/{chunk-7TSYBD3E.js → chunk-5263OEM3.js} +2 -2
- package/dist/{chunk-WFUIE565.js → chunk-57JTHWLQ.js} +17 -14
- package/dist/chunk-57JTHWLQ.js.map +1 -0
- package/dist/{chunk-FNSMZQS4.js → chunk-5ACAVJUI.js} +2 -2
- package/dist/{chunk-PDLLCOGD.js → chunk-5AFMP532.js} +20 -17
- package/dist/chunk-5AFMP532.js.map +1 -0
- package/dist/{chunk-JRKZTEZZ.js → chunk-5W7YXFV5.js} +444 -73
- package/dist/chunk-5W7YXFV5.js.map +1 -0
- package/dist/chunk-6EW2UCVF.js +190 -0
- package/dist/chunk-6EW2UCVF.js.map +1 -0
- package/dist/{chunk-4VUPLMZ6.js → chunk-6FOGTKBY.js} +68 -73
- package/dist/chunk-6FOGTKBY.js.map +1 -0
- package/dist/{chunk-VMCCGUQB.js → chunk-7LYUJNU3.js} +2 -2
- package/dist/{chunk-52JPHN5N.js → chunk-A2YW5EMU.js} +27 -149
- package/dist/chunk-A2YW5EMU.js.map +1 -0
- package/dist/{chunk-WLYIROCJ.js → chunk-AB5P32RE.js} +2 -2
- package/dist/{chunk-PL2GHSCM.js → chunk-ALB64CZM.js} +157 -90
- package/dist/chunk-ALB64CZM.js.map +1 -0
- package/dist/{chunk-SUFG5E73.js → chunk-ALUNQEBY.js} +2 -2
- package/dist/{chunk-CADUYBQD.js → chunk-ATL3ZVXT.js} +2 -2
- package/dist/{chunk-BWVKEOPE.js → chunk-ATV637J7.js} +7 -11
- package/dist/chunk-ATV637J7.js.map +1 -0
- package/dist/{chunk-DG27IUVI.js → chunk-CBRS2NEK.js} +2 -11
- package/dist/chunk-CBRS2NEK.js.map +1 -0
- package/dist/{chunk-7MNBICB5.js → chunk-CN6B5PEN.js} +16 -14
- package/dist/chunk-CN6B5PEN.js.map +1 -0
- package/dist/{chunk-6FJWSWFT.js → chunk-DBNYPLWY.js} +3 -3
- package/dist/{chunk-5JY5TSVY.js → chunk-DFAUMLD7.js} +25 -31
- package/dist/chunk-DFAUMLD7.js.map +1 -0
- package/dist/{chunk-FFDNKRCY.js → chunk-DKWPJOYH.js} +2 -2
- package/dist/chunk-DKWPJOYH.js.map +1 -0
- package/dist/{chunk-VJFMXYKP.js → chunk-E6YA6UAP.js} +2 -2
- package/dist/{chunk-WASHZV34.js → chunk-F23WQK3G.js} +65 -27
- package/dist/chunk-F23WQK3G.js.map +1 -0
- package/dist/{chunk-JIUVJ4M7.js → chunk-F7ZFRPGQ.js} +3 -3
- package/dist/{chunk-HXGUIPQB.js → chunk-FOG7YEJP.js} +3 -3
- package/dist/{chunk-QULVCV3M.js → chunk-GK4DRVUD.js} +6 -6
- package/dist/chunk-GK4DRVUD.js.map +1 -0
- package/dist/{chunk-BRVW2GS5.js → chunk-H36KSN6X.js} +87 -34
- package/dist/chunk-H36KSN6X.js.map +1 -0
- package/dist/{chunk-O2ERS4UJ.js → chunk-H4M7ADXY.js} +81 -52
- package/dist/chunk-H4M7ADXY.js.map +1 -0
- package/dist/{chunk-FZ6NYJ7L.js → chunk-H7HP56F6.js} +11 -8
- package/dist/chunk-H7HP56F6.js.map +1 -0
- package/dist/chunk-HK67PX4J.js +27 -0
- package/dist/chunk-HK67PX4J.js.map +1 -0
- package/dist/{chunk-X56RTUK3.js → chunk-HM4JSXX2.js} +3 -3
- package/dist/{chunk-AHLJSVRL.js → chunk-HTGRQZFB.js} +5 -7
- package/dist/chunk-HTGRQZFB.js.map +1 -0
- package/dist/{chunk-GQ3BX5EA.js → chunk-I3ISCYT7.js} +2 -2
- package/dist/{chunk-Q6TEJXBX.js → chunk-IESNYJXZ.js} +31 -49
- package/dist/chunk-IESNYJXZ.js.map +1 -0
- package/dist/{chunk-FUHKW252.js → chunk-J4MN6XIU.js} +2 -2
- package/dist/{chunk-ADW22QSB.js → chunk-J4UJ5FRV.js} +4 -4
- package/dist/{chunk-HNGSV2YC.js → chunk-JBIV4FLR.js} +67 -10
- package/dist/chunk-JBIV4FLR.js.map +1 -0
- package/dist/{chunk-HVQGCKY4.js → chunk-JVLSU7S2.js} +2 -2
- package/dist/{chunk-AR2JDFAE.js → chunk-KDJGJR7F.js} +2 -2
- package/dist/{chunk-NPP5R7FF.js → chunk-KN4W2OQ4.js} +22 -18
- package/dist/chunk-KN4W2OQ4.js.map +1 -0
- package/dist/{chunk-G6S5VVHP.js → chunk-L6GTLZRK.js} +10 -10
- package/dist/chunk-L6GTLZRK.js.map +1 -0
- package/dist/{chunk-2BMRJ6LQ.js → chunk-LF6DMX4C.js} +8 -11
- package/dist/{chunk-2BMRJ6LQ.js.map → chunk-LF6DMX4C.js.map} +1 -1
- package/dist/chunk-LFUID7OW.js +163 -0
- package/dist/chunk-LFUID7OW.js.map +1 -0
- package/dist/{chunk-747LRSOO.js → chunk-LKFKXS5K.js} +2 -2
- package/dist/{chunk-U5O6GIWZ.js → chunk-LR4Z47QD.js} +3 -3
- package/dist/{chunk-VZ3XFUQ7.js → chunk-MTBXJAS4.js} +16 -22
- package/dist/chunk-MTBXJAS4.js.map +1 -0
- package/dist/chunk-N4CNVSUF.js +66 -0
- package/dist/chunk-N4CNVSUF.js.map +1 -0
- package/dist/{chunk-RTAMLDWP.js → chunk-NLKLXXTO.js} +2 -2
- package/dist/{chunk-IGJCYUT5.js → chunk-NSITFOCJ.js} +1 -1
- package/dist/chunk-NSITFOCJ.js.map +1 -0
- package/dist/{chunk-FDX7OWWI.js → chunk-OPXR4PB2.js} +2 -2
- package/dist/{chunk-4GZ6XOVW.js → chunk-OWLVBOWO.js} +44 -42
- package/dist/chunk-OWLVBOWO.js.map +1 -0
- package/dist/{chunk-Z45YRGFO.js → chunk-P6ASQOZR.js} +2 -2
- package/dist/{chunk-5O5HRRTV.js → chunk-PCQDY6QN.js} +7 -7
- package/dist/{chunk-5O5HRRTV.js.map → chunk-PCQDY6QN.js.map} +1 -1
- package/dist/{chunk-BEFVYAR5.js → chunk-PGFKIOR3.js} +4 -4
- package/dist/chunk-PGFKIOR3.js.map +1 -0
- package/dist/{chunk-3FSX6LDG.js → chunk-POS53FG6.js} +18 -3
- package/dist/{chunk-3FSX6LDG.js.map → chunk-POS53FG6.js.map} +1 -1
- package/dist/{chunk-3IXIU6FP.js → chunk-PQ6Z2TAP.js} +7 -10
- package/dist/chunk-PQ6Z2TAP.js.map +1 -0
- package/dist/{chunk-CEJWMBXO.js → chunk-PUJTKLPL.js} +6 -2
- package/dist/chunk-PUJTKLPL.js.map +1 -0
- package/dist/{chunk-GAG7QOVO.js → chunk-QGJ4XIA7.js} +53 -18
- package/dist/chunk-QGJ4XIA7.js.map +1 -0
- package/dist/{chunk-2DHSSLOD.js → chunk-QHJKK77B.js} +13 -15
- package/dist/chunk-QHJKK77B.js.map +1 -0
- package/dist/{chunk-2Z3NCLNX.js → chunk-QI5NWLVW.js} +7 -7
- package/dist/{chunk-6SAFL5YE.js → chunk-RC4BROYR.js} +3 -3
- package/dist/{chunk-NJDQ4YSV.js → chunk-RDHUZ674.js} +4 -4
- package/dist/{chunk-YPYHVOXP.js → chunk-RK7N4OQ5.js} +2 -2
- package/dist/chunk-RK7N4OQ5.js.map +1 -0
- package/dist/{chunk-3737A6EA.js → chunk-S2VG3ABP.js} +127 -31
- package/dist/chunk-S2VG3ABP.js.map +1 -0
- package/dist/{chunk-3JVXVJ7L.js → chunk-S35S77YU.js} +10 -10
- package/dist/{chunk-KUDZVJKQ.js → chunk-SHILAQH5.js} +2 -2
- package/dist/{chunk-4UVDI4XE.js → chunk-T3PHCEN4.js} +4 -4
- package/dist/{chunk-55LKVALY.js → chunk-T7IR4N2S.js} +1 -3
- package/dist/chunk-T7IR4N2S.js.map +1 -0
- package/dist/{chunk-RXYYFSBB.js → chunk-TOV6VMHF.js} +6 -6
- package/dist/chunk-TOV6VMHF.js.map +1 -0
- package/dist/{chunk-W77KZHCW.js → chunk-TVIFAHZR.js} +16 -17
- package/dist/chunk-TVIFAHZR.js.map +1 -0
- package/dist/chunk-UBSFPGVJ.js +1 -0
- package/dist/{chunk-FAXZQ5UF.js → chunk-UCUALOSM.js} +2 -2
- package/dist/{chunk-4HDYQL3J.js → chunk-VAG47QHV.js} +2 -2
- package/dist/{chunk-35EBKWQU.js → chunk-VFIWDPXZ.js} +4 -4
- package/dist/{chunk-5ZKS6ZE2.js → chunk-VTG7327U.js} +4 -4
- package/dist/chunk-VTG7327U.js.map +1 -0
- package/dist/{chunk-VCETL77O.js → chunk-W5LHQXZU.js} +36 -7
- package/dist/chunk-W5LHQXZU.js.map +1 -0
- package/dist/{chunk-6NVPFKN3.js → chunk-WK5FSW7T.js} +92 -35
- package/dist/chunk-WK5FSW7T.js.map +1 -0
- package/dist/{chunk-HNHCQ556.js → chunk-WLLUM35R.js} +2 -2
- package/dist/{chunk-YJ6IONGA.js → chunk-X62MEF2O.js} +13 -5
- package/dist/chunk-X62MEF2O.js.map +1 -0
- package/dist/{chunk-7G6VDWXB.js → chunk-X67FCULK.js} +5 -5
- package/dist/chunk-X67FCULK.js.map +1 -0
- package/dist/{chunk-UHXCLPGC.js → chunk-XDVVBETV.js} +2 -2
- package/dist/chunk-XDVVBETV.js.map +1 -0
- package/dist/chunk-XJ3FEKEY.js +15 -0
- package/dist/chunk-XJ3FEKEY.js.map +1 -0
- package/dist/{chunk-E6427JU2.js → chunk-XSN63FUS.js} +19 -3
- package/dist/chunk-XSN63FUS.js.map +1 -0
- package/dist/{chunk-JRCYZEHU.js → chunk-XVU7J43V.js} +2 -2
- package/dist/{chunk-2GAJGUNM.js → chunk-Y3YLJORD.js} +408 -260
- package/dist/chunk-Y3YLJORD.js.map +1 -0
- package/dist/{chunk-6BU3L4UE.js → chunk-Y6GZ2P4M.js} +7 -10
- package/dist/chunk-Y6GZ2P4M.js.map +1 -0
- package/dist/{chunk-DMQCLZ4Z.js → chunk-YCSM3GZU.js} +2 -2
- package/dist/{chunk-RV3ARMPN.js → chunk-YKPGQJFU.js} +30 -180
- package/dist/chunk-YKPGQJFU.js.map +1 -0
- package/dist/{chunk-FMQJZH4R.js → chunk-YMLQBZFJ.js} +6 -6
- package/dist/{chunk-6HFM7EIT.js → chunk-YPSOHDNC.js} +2 -2
- package/dist/{chunk-CDB2HVQW.js → chunk-YXA2TCTZ.js} +14 -15
- package/dist/chunk-YXA2TCTZ.js.map +1 -0
- package/dist/{chunk-N35NC4JH.js → chunk-Z2PWOSCJ.js} +2 -2
- package/dist/{chunk-XWX7GL56.js → chunk-Z2WK53N6.js} +47 -23
- package/dist/chunk-Z2WK53N6.js.map +1 -0
- package/dist/{chunk-HPLWFNG4.js → chunk-Z7ZXZL6Y.js} +2 -2
- package/dist/{chunk-PNKHAKQ7.js → chunk-ZO252Q5S.js} +17 -10
- package/dist/chunk-ZO252Q5S.js.map +1 -0
- package/dist/classified/index.js +5 -5
- package/dist/{classified-marker-2KJAXRRO.js → classified-marker-BSQHU4JT.js} +3 -3
- package/dist/collection-facade-LG3NYZVB.js +45 -0
- package/dist/{computed-6G5M3UPH.js → computed-ASBNTLOK.js} +3 -3
- package/dist/consent/index.js +10 -10
- package/dist/cover/index.js +10 -3
- package/dist/custody/index.js +12 -11
- package/dist/{dead-filter-DCB62VWW.js → dead-filter-QKU56XTQ.js} +2 -2
- package/dist/debug/index.js +1 -1
- package/dist/{delegation-MO7YZYJS.js → delegation-XWRPYODW.js} +24 -23
- package/dist/delegation-XWRPYODW.js.map +1 -0
- package/dist/derivations/index.js +12 -12
- package/dist/derive-CXHCY46K.js +22 -0
- package/dist/directory/index.js +10 -10
- package/dist/{dispatch-MJ6SHB3Y.js → dispatch-4AP4PUZU.js} +18 -18
- package/dist/{dispatch-FZEAWKVM.js → dispatch-VR4LRXZ7.js} +9 -6
- package/dist/dispatch-VR4LRXZ7.js.map +1 -0
- package/dist/{enclave-JU4YIEPB.js → enclave-NYPT7WA7.js} +31 -9
- package/dist/executor-3KFRQETS.js +29 -0
- package/dist/executor-AFHQYRAU.js +9 -0
- package/dist/executor-YYDW6XQI.js +9 -0
- package/dist/export-accessible-BX2ILB4C.js +23 -0
- package/dist/extract-partition-UPOVITFI.js +38 -0
- package/dist/{fanout-sidecar-NNAJQXMX.js → fanout-sidecar-IWP3R4RC.js} +18 -27
- package/dist/fanout-sidecar-IWP3R4RC.js.map +1 -0
- package/dist/{fence-watcher-DHQ775JB.js → fence-watcher-ZVSMLKQD.js} +1 -1
- package/dist/fence-watcher-ZVSMLKQD.js.map +1 -0
- package/dist/find-SZBL2HPB.js +11 -0
- package/dist/forget/index.js +9 -9
- package/dist/guards/index.js +4 -4
- package/dist/history/index.js +23 -20
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.js +14 -14
- package/dist/index.d.ts +35 -18
- package/dist/index.js +199 -204
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.js +4 -4
- package/dist/introspection/index.js +12 -11
- package/dist/issue-G53NB6EW.js +19 -0
- package/dist/kernel/collection-config.d.ts +9 -9
- package/dist/kernel/collection.d.ts +9 -3
- package/dist/kernel/constants.d.ts +36 -0
- package/dist/kernel/enclave/crypto.d.ts +52 -4
- package/dist/kernel/enclave/index.d.ts +10 -3
- package/dist/kernel/enclave/record-aad.d.ts +131 -0
- package/dist/kernel/enclave/record-envelope.d.ts +76 -0
- package/dist/kernel/enclave/record-keys/envelope-body.d.ts +34 -2
- package/dist/kernel/enclave/record-keys/lifecycle.d.ts +22 -5
- package/dist/kernel/enclave/record-keys/record-codec.d.ts +47 -14
- package/dist/kernel/enclave/record-keys/rekey-blob.d.ts +88 -0
- package/dist/kernel/enclave/record-keys/rekey.d.ts +91 -0
- package/dist/kernel/enclave/record-keys/tombstone.d.ts +3 -2
- package/dist/kernel/errors.d.ts +134 -14
- package/dist/kernel/merge-authority.d.ts +25 -0
- package/dist/kernel/noydb.d.ts +33 -10
- package/dist/kernel/query/builder.d.ts +51 -4
- package/dist/kernel/query/join.d.ts +27 -0
- package/dist/kernel/query/live.d.ts +31 -9
- package/dist/kernel/query/predicate.d.ts +9 -0
- package/dist/kernel/refs.d.ts +3 -1
- package/dist/kernel/secret-mode.d.ts +1 -1
- package/dist/kernel/sync-policy.d.ts +0 -2
- package/dist/kernel/tier-visibility.d.ts +34 -0
- package/dist/kernel/types.d.ts +145 -28
- package/dist/kernel/vault.d.ts +16 -7
- package/dist/kernel/via/compose.d.ts +3 -3
- package/dist/kernel/via/index.d.ts +15 -6
- package/dist/kernel/via/pipeline.d.ts +6 -6
- package/dist/kernel/via/reconcile.d.ts +14 -2
- package/dist/kernel/via/taint-binding.d.ts +3 -3
- package/dist/{ledger-AETNF4OM.js → ledger-T5K4P2D7.js} +11 -11
- package/dist/liberate-VEOZRESE.js +25 -0
- package/dist/{link-set-E5HNY67I.js → link-set-76JZ6YB4.js} +11 -11
- package/dist/{managed-secret-CWQ6PND5.js → managed-secret-6YC32VXG.js} +13 -5
- package/dist/materialized-views/index.js +27 -27
- package/dist/migrate-cek-LBRKYUZZ.js +19 -0
- package/dist/migrate-cek-LBRKYUZZ.js.map +1 -0
- package/dist/money/index.js +5 -5
- package/dist/noydb-EDJA4JNJ.js +86 -0
- package/dist/on/index.js +1 -0
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.js +12 -12
- package/dist/pod/index.js +79 -88
- package/dist/pod-handle-P6DPBM5U.js +41 -0
- package/dist/pod-handle-P6DPBM5U.js.map +1 -0
- package/dist/policy/index.js +11 -4
- package/dist/port/as/active.d.ts +10 -0
- package/dist/port/as/index.d.ts +32 -0
- package/dist/port/as/types.d.ts +113 -0
- package/dist/port/at/index.d.ts +37 -0
- package/dist/port/by/default-provider.d.ts +3 -3
- package/dist/port/by/index.d.ts +32 -10
- package/dist/port/by/types.d.ts +29 -11
- package/dist/port/on/index.d.ts +50 -0
- package/dist/port/to/index.d.ts +4 -4
- package/dist/port/to/locator.d.ts +54 -8
- package/dist/port/with/computed-strategy.d.ts +1 -1
- package/dist/port/with/device-seal-strategy.d.ts +2 -2
- package/dist/port/with/formats-strategy.d.ts +76 -0
- package/dist/port/with/i18n-strategy.d.ts +4 -1
- package/dist/port/with/lookup-strategy.d.ts +4 -1
- package/dist/port/with/merge-authority.d.ts +52 -0
- package/dist/port/with/service-bus.d.ts +0 -4
- package/dist/port/with/strategies.d.ts +13 -5
- package/dist/port/with/team-strategy.d.ts +5 -1
- package/dist/portability/index.js +8 -8
- package/dist/{post-register-2XSSMGEQ.js → post-register-53O7AJRZ.js} +6 -6
- package/dist/query/index.js +6 -6
- package/dist/reduce/index.js +6 -6
- package/dist/register-6TCBR6XD.js +32 -0
- package/dist/registry-DH2L4O2V.js +18 -0
- package/dist/registry-IWFMXCHX.js +9 -0
- package/dist/registry-Q3FG3OAX.js +9 -0
- package/dist/registry-YC3IFG3A.js +19 -0
- package/dist/request-withdrawal-NM5VYR6F.js +31 -0
- package/dist/{reveal-BW36KCOQ.js → reveal-XBIMHAXR.js} +6 -6
- package/dist/revoke-MJNYWO72.js +24 -0
- package/dist/satellites/index.js +1 -1
- package/dist/schema-update/index.js +2 -2
- package/dist/sealed-record/index.js +20 -13
- package/dist/sealed-record/index.js.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/{seed-GDV5PT4R.js → seed-NSNIGYXE.js} +20 -22
- package/dist/seed-NSNIGYXE.js.map +1 -0
- package/dist/sequence/index.js +9 -9
- package/dist/session/index.js +10 -10
- package/dist/shadow/index.js +2 -2
- package/dist/share-link/index.js +1 -1
- package/dist/signer-6XVS2AU3.js +25 -0
- package/dist/snapshots/index.js +10 -10
- package/dist/snapshots/index.js.map +1 -1
- package/dist/{stale-ARHFVL5U.js → stale-MCS46TFO.js} +10 -10
- package/dist/storage-ZXUT476I.js +23 -0
- package/dist/storage-ZXUT476I.js.map +1 -0
- package/dist/{store-coordination-provider-GFCUOBR6.js → store-coordination-provider-6FM26VQM.js} +22 -15
- package/dist/store-coordination-provider-6FM26VQM.js.map +1 -0
- package/dist/sync/index.js +11 -11
- package/dist/team/index.js +17 -16
- package/dist/tiers/index.js +11 -10
- package/dist/to/index.js +17 -9
- package/dist/to/index.js.map +1 -1
- package/dist/transactions/index.js +4 -4
- package/dist/{ulid-PTAIMDG4.js → ulid-VQW6ERQN.js} +2 -2
- package/dist/ulid-VQW6ERQN.js.map +1 -0
- package/dist/util/index.js +1 -1
- package/dist/vault-diff-FE5J35NJ.js +9 -0
- package/dist/vault-diff-FE5J35NJ.js.map +1 -0
- package/dist/vault-head/index.js +115 -0
- package/dist/vault-head/index.js.map +1 -0
- package/dist/{verify-RO5RTZOJ.js → verify-WYOFLSNA.js} +5 -5
- package/dist/via/blob/binding.d.ts +6 -6
- package/dist/via/blob/index.d.ts +3 -0
- package/dist/via/classified/binding.d.ts +9 -9
- package/dist/via/computed/binding.d.ts +2 -2
- package/dist/via/i18n/binding.d.ts +4 -4
- package/dist/via/lookup/binding.d.ts +5 -5
- package/dist/via/lookup/handle.d.ts +4 -1
- package/dist/via/lookup/index.d.ts +1 -1
- package/dist/via/lookup/snapshot.d.ts +1 -1
- package/dist/via/money/binding.d.ts +3 -3
- package/dist/via/money/normalize.d.ts +1 -1
- package/dist/via/money/where.d.ts +3 -3
- package/dist/walk-JNEOYCAU.js +21 -0
- package/dist/walk-JNEOYCAU.js.map +1 -0
- package/dist/with-audit/periods/periods.d.ts +1 -1
- package/dist/with-audit/periods/strategy.d.ts +1 -1
- package/dist/with-audit/sealed-record/index.d.ts +13 -0
- package/dist/with-audit/tiers/index.d.ts +17 -2
- package/dist/with-cargo/adopt-partition.d.ts +7 -7
- package/dist/with-cargo/extract-partition.d.ts +1 -1
- package/dist/with-cargo/floor.d.ts +1 -1
- package/dist/with-cargo/index.d.ts +2 -2
- package/dist/with-commit/history/history.d.ts +26 -0
- package/dist/with-commit/history/index.d.ts +2 -1
- package/dist/with-commit/history/ledger/store.d.ts +7 -1
- package/dist/with-commit/history/strategy.d.ts +11 -1
- package/dist/with-commit/numbering/index.d.ts +0 -5
- package/dist/with-commit/vault-head/active.d.ts +2 -0
- package/dist/with-commit/vault-head/head.d.ts +28 -0
- package/dist/with-commit/vault-head/index.d.ts +10 -0
- package/dist/with-commit/vault-head/strategy.d.ts +127 -0
- package/dist/with-commit/vault-head/verify.d.ts +90 -0
- package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +4 -0
- package/dist/with-formula/materialized-views/projection-legs.d.ts +59 -0
- package/dist/with-formula/materialized-views/registry.d.ts +50 -0
- package/dist/with-formula/materialized-views/types.d.ts +68 -10
- package/dist/with-party/directory/cover/storage.d.ts +0 -8
- package/dist/with-party/directory/storage.d.ts +0 -11
- package/dist/with-party/directory/visibility.d.ts +0 -21
- package/dist/with-party/policy/storage.d.ts +0 -10
- package/dist/with-party/team/deed.d.ts +4 -4
- package/dist/with-party/team/device-seal.d.ts +5 -5
- package/dist/with-party/team/echo-ceremony.d.ts +2 -2
- package/dist/with-party/team/echo-secret.d.ts +4 -4
- package/dist/with-party/team/index.d.ts +3 -3
- package/dist/with-party/team/keyring.d.ts +141 -4
- package/dist/with-party/team/managed-secret.d.ts +21 -11
- package/dist/with-party/team/noydb-facade.d.ts +7 -3
- package/dist/with-party/team/{shamir-recovery-provider.d.ts → noydb-shamir.d.ts} +1 -1
- package/dist/with-party/team/recovery.d.ts +3 -3
- package/dist/with-party/team/roster-tag.d.ts +101 -0
- package/dist/with-party/team/rotate-recover.d.ts +5 -5
- package/dist/with-party/team/tiers.d.ts +2 -1
- package/dist/with-pod/format.d.ts +11 -13
- package/dist/with-pod/index.d.ts +10 -10
- package/dist/with-pod/open.d.ts +2 -2
- package/dist/with-pod/pod-handle.d.ts +19 -0
- package/dist/with-pod/pod-store.d.ts +0 -8
- package/dist/with-pod/{bundle.d.ts → pod.d.ts} +17 -25
- package/dist/with-pod/ulid.d.ts +1 -1
- package/dist/with-shape/blobs/blob-compaction.d.ts +13 -0
- package/dist/with-shape/blobs/blob-set.d.ts +83 -11
- package/dist/with-shape/blobs/orphan-report.d.ts +62 -0
- package/dist/with-shape/introspection/describe.d.ts +2 -2
- package/dist/with-shape/schema-update/fence-controller.d.ts +4 -4
- package/dist/with-shape/schema-update/fence-watcher.d.ts +4 -4
- package/dist/with-shape/schema-update/store-coordination-provider.d.ts +7 -6
- package/dist/with-sync/engine.d.ts +54 -5
- package/dist/with-sync/strategy.d.ts +3 -0
- package/dist/withdraw-accessible-ILTSXTIE.js +28 -0
- package/dist/withdraw-accessible-ILTSXTIE.js.map +1 -0
- package/package.json +29 -5
- package/dist/api-RXUMEKT3.js +0 -20
- package/dist/backup-KULFZ2T4.js.map +0 -1
- package/dist/bundle-handle-GFNHT52M.js +0 -36
- package/dist/bundle-handle-GFNHT52M.js.map +0 -1
- package/dist/chunk-2DHSSLOD.js.map +0 -1
- package/dist/chunk-2GAJGUNM.js.map +0 -1
- package/dist/chunk-3737A6EA.js.map +0 -1
- package/dist/chunk-3IXIU6FP.js.map +0 -1
- package/dist/chunk-3URQC7EH.js.map +0 -1
- package/dist/chunk-4GZ6XOVW.js.map +0 -1
- package/dist/chunk-4I72F5DF.js.map +0 -1
- package/dist/chunk-4VUPLMZ6.js.map +0 -1
- package/dist/chunk-52JPHN5N.js.map +0 -1
- package/dist/chunk-55LKVALY.js.map +0 -1
- package/dist/chunk-5JY5TSVY.js.map +0 -1
- package/dist/chunk-5ZKS6ZE2.js.map +0 -1
- package/dist/chunk-6BU3L4UE.js.map +0 -1
- package/dist/chunk-6NVPFKN3.js.map +0 -1
- package/dist/chunk-7F4DBNSP.js.map +0 -1
- package/dist/chunk-7G6VDWXB.js.map +0 -1
- package/dist/chunk-7H73RIE3.js +0 -45
- package/dist/chunk-7H73RIE3.js.map +0 -1
- package/dist/chunk-7MNBICB5.js.map +0 -1
- package/dist/chunk-AFHQATY4.js +0 -47
- package/dist/chunk-AFHQATY4.js.map +0 -1
- package/dist/chunk-AHLJSVRL.js.map +0 -1
- package/dist/chunk-BEFVYAR5.js.map +0 -1
- package/dist/chunk-BRVW2GS5.js.map +0 -1
- package/dist/chunk-BWVKEOPE.js.map +0 -1
- package/dist/chunk-CDB2HVQW.js.map +0 -1
- package/dist/chunk-CEJWMBXO.js.map +0 -1
- package/dist/chunk-DG27IUVI.js.map +0 -1
- package/dist/chunk-E6427JU2.js.map +0 -1
- package/dist/chunk-FFDNKRCY.js.map +0 -1
- package/dist/chunk-FZ6NYJ7L.js.map +0 -1
- package/dist/chunk-G6S5VVHP.js.map +0 -1
- package/dist/chunk-GAG7QOVO.js.map +0 -1
- package/dist/chunk-HNGSV2YC.js.map +0 -1
- package/dist/chunk-IGJCYUT5.js.map +0 -1
- package/dist/chunk-JJNOLSG5.js.map +0 -1
- package/dist/chunk-JRKZTEZZ.js.map +0 -1
- package/dist/chunk-MSWYQLMQ.js.map +0 -1
- package/dist/chunk-NPP5R7FF.js.map +0 -1
- package/dist/chunk-O2ERS4UJ.js.map +0 -1
- package/dist/chunk-PDLLCOGD.js.map +0 -1
- package/dist/chunk-PL2GHSCM.js.map +0 -1
- package/dist/chunk-PNKHAKQ7.js.map +0 -1
- package/dist/chunk-Q6TEJXBX.js.map +0 -1
- package/dist/chunk-QULVCV3M.js.map +0 -1
- package/dist/chunk-RV3ARMPN.js.map +0 -1
- package/dist/chunk-RXYYFSBB.js.map +0 -1
- package/dist/chunk-UHXCLPGC.js.map +0 -1
- package/dist/chunk-VCETL77O.js.map +0 -1
- package/dist/chunk-VZ3XFUQ7.js.map +0 -1
- package/dist/chunk-W77KZHCW.js.map +0 -1
- package/dist/chunk-WASHZV34.js.map +0 -1
- package/dist/chunk-WFUIE565.js.map +0 -1
- package/dist/chunk-XWX7GL56.js.map +0 -1
- package/dist/chunk-YJ6IONGA.js.map +0 -1
- package/dist/chunk-YPYHVOXP.js.map +0 -1
- package/dist/chunk-ZJADGNYF.js.map +0 -1
- package/dist/collection-facade-QEJIM6BC.js +0 -45
- package/dist/delegation-MO7YZYJS.js.map +0 -1
- package/dist/derive-IUA6JFLB.js +0 -22
- package/dist/dispatch-FZEAWKVM.js.map +0 -1
- package/dist/executor-CYJQLKKI.js +0 -9
- package/dist/executor-S4QIKEHW.js +0 -9
- package/dist/executor-YIQB2S6N.js +0 -29
- package/dist/export-accessible-4S36PQNR.js +0 -23
- package/dist/extract-partition-IO7FDZ2P.js +0 -38
- package/dist/fanout-sidecar-NNAJQXMX.js.map +0 -1
- package/dist/fence-watcher-DHQ775JB.js.map +0 -1
- package/dist/find-RBBYKXI7.js +0 -11
- package/dist/issue-RIVHSY2S.js +0 -19
- package/dist/liberate-GFN4C7RR.js +0 -24
- package/dist/noydb-ASEXNJS6.js +0 -83
- package/dist/register-4EFJCVYD.js +0 -32
- package/dist/registry-4SDHHOJ7.js +0 -18
- package/dist/registry-CZVINVQH.js +0 -9
- package/dist/registry-IKUR2MXD.js +0 -9
- package/dist/registry-OYTFGWVK.js +0 -19
- package/dist/request-withdrawal-KGXGDPVQ.js +0 -31
- package/dist/revoke-JFN773KF.js +0 -24
- package/dist/seed-GDV5PT4R.js.map +0 -1
- package/dist/signer-TA55QB6R.js +0 -25
- package/dist/storage-V7MTFAQJ.js +0 -23
- package/dist/store-coordination-provider-GFCUOBR6.js.map +0 -1
- package/dist/walk-3ZECBFDA.js +0 -21
- package/dist/with-pod/bundle-handle.d.ts +0 -9
- package/dist/withdraw-accessible-7PG4DYQK.js +0 -28
- /package/dist/{api-RXUMEKT3.js.map → api-EQYRTZO2.js.map} +0 -0
- /package/dist/{collection-facade-QEJIM6BC.js.map → at/index.js.map} +0 -0
- /package/dist/{computed-6G5M3UPH.js.map → by/index.js.map} +0 -0
- /package/dist/{chunk-YAWK6AWF.js.map → chunk-225O5CXQ.js.map} +0 -0
- /package/dist/{chunk-OF3L2SD6.js.map → chunk-3QARDAYW.js.map} +0 -0
- /package/dist/{chunk-W3TVWF6N.js.map → chunk-4A4TYISP.js.map} +0 -0
- /package/dist/{chunk-CCZJJ4I2.js.map → chunk-4G25SDQL.js.map} +0 -0
- /package/dist/{chunk-7TSYBD3E.js.map → chunk-5263OEM3.js.map} +0 -0
- /package/dist/{chunk-FNSMZQS4.js.map → chunk-5ACAVJUI.js.map} +0 -0
- /package/dist/{chunk-VMCCGUQB.js.map → chunk-7LYUJNU3.js.map} +0 -0
- /package/dist/{chunk-WLYIROCJ.js.map → chunk-AB5P32RE.js.map} +0 -0
- /package/dist/{chunk-SUFG5E73.js.map → chunk-ALUNQEBY.js.map} +0 -0
- /package/dist/{chunk-CADUYBQD.js.map → chunk-ATL3ZVXT.js.map} +0 -0
- /package/dist/{chunk-6FJWSWFT.js.map → chunk-DBNYPLWY.js.map} +0 -0
- /package/dist/{chunk-VJFMXYKP.js.map → chunk-E6YA6UAP.js.map} +0 -0
- /package/dist/{chunk-JIUVJ4M7.js.map → chunk-F7ZFRPGQ.js.map} +0 -0
- /package/dist/{chunk-HXGUIPQB.js.map → chunk-FOG7YEJP.js.map} +0 -0
- /package/dist/{chunk-X56RTUK3.js.map → chunk-HM4JSXX2.js.map} +0 -0
- /package/dist/{chunk-GQ3BX5EA.js.map → chunk-I3ISCYT7.js.map} +0 -0
- /package/dist/{chunk-FUHKW252.js.map → chunk-J4MN6XIU.js.map} +0 -0
- /package/dist/{chunk-ADW22QSB.js.map → chunk-J4UJ5FRV.js.map} +0 -0
- /package/dist/{chunk-HVQGCKY4.js.map → chunk-JVLSU7S2.js.map} +0 -0
- /package/dist/{chunk-AR2JDFAE.js.map → chunk-KDJGJR7F.js.map} +0 -0
- /package/dist/{chunk-747LRSOO.js.map → chunk-LKFKXS5K.js.map} +0 -0
- /package/dist/{chunk-U5O6GIWZ.js.map → chunk-LR4Z47QD.js.map} +0 -0
- /package/dist/{chunk-RTAMLDWP.js.map → chunk-NLKLXXTO.js.map} +0 -0
- /package/dist/{chunk-FDX7OWWI.js.map → chunk-OPXR4PB2.js.map} +0 -0
- /package/dist/{chunk-Z45YRGFO.js.map → chunk-P6ASQOZR.js.map} +0 -0
- /package/dist/{chunk-2Z3NCLNX.js.map → chunk-QI5NWLVW.js.map} +0 -0
- /package/dist/{chunk-6SAFL5YE.js.map → chunk-RC4BROYR.js.map} +0 -0
- /package/dist/{chunk-NJDQ4YSV.js.map → chunk-RDHUZ674.js.map} +0 -0
- /package/dist/{chunk-3JVXVJ7L.js.map → chunk-S35S77YU.js.map} +0 -0
- /package/dist/{chunk-KUDZVJKQ.js.map → chunk-SHILAQH5.js.map} +0 -0
- /package/dist/{chunk-4UVDI4XE.js.map → chunk-T3PHCEN4.js.map} +0 -0
- /package/dist/{derive-IUA6JFLB.js.map → chunk-UBSFPGVJ.js.map} +0 -0
- /package/dist/{chunk-FAXZQ5UF.js.map → chunk-UCUALOSM.js.map} +0 -0
- /package/dist/{chunk-4HDYQL3J.js.map → chunk-VAG47QHV.js.map} +0 -0
- /package/dist/{chunk-35EBKWQU.js.map → chunk-VFIWDPXZ.js.map} +0 -0
- /package/dist/{chunk-HNHCQ556.js.map → chunk-WLLUM35R.js.map} +0 -0
- /package/dist/{chunk-JRCYZEHU.js.map → chunk-XVU7J43V.js.map} +0 -0
- /package/dist/{chunk-DMQCLZ4Z.js.map → chunk-YCSM3GZU.js.map} +0 -0
- /package/dist/{chunk-FMQJZH4R.js.map → chunk-YMLQBZFJ.js.map} +0 -0
- /package/dist/{chunk-6HFM7EIT.js.map → chunk-YPSOHDNC.js.map} +0 -0
- /package/dist/{chunk-N35NC4JH.js.map → chunk-Z2PWOSCJ.js.map} +0 -0
- /package/dist/{chunk-HPLWFNG4.js.map → chunk-Z7ZXZL6Y.js.map} +0 -0
- /package/dist/{classified-marker-2KJAXRRO.js.map → classified-marker-BSQHU4JT.js.map} +0 -0
- /package/dist/{enclave-JU4YIEPB.js.map → collection-facade-LG3NYZVB.js.map} +0 -0
- /package/dist/{executor-CYJQLKKI.js.map → computed-ASBNTLOK.js.map} +0 -0
- /package/dist/{dead-filter-DCB62VWW.js.map → dead-filter-QKU56XTQ.js.map} +0 -0
- /package/dist/{executor-S4QIKEHW.js.map → derive-CXHCY46K.js.map} +0 -0
- /package/dist/{dispatch-MJ6SHB3Y.js.map → dispatch-4AP4PUZU.js.map} +0 -0
- /package/dist/{executor-YIQB2S6N.js.map → enclave-NYPT7WA7.js.map} +0 -0
- /package/dist/{export-accessible-4S36PQNR.js.map → executor-3KFRQETS.js.map} +0 -0
- /package/dist/{extract-partition-IO7FDZ2P.js.map → executor-AFHQYRAU.js.map} +0 -0
- /package/dist/{find-RBBYKXI7.js.map → executor-YYDW6XQI.js.map} +0 -0
- /package/dist/{issue-RIVHSY2S.js.map → export-accessible-BX2ILB4C.js.map} +0 -0
- /package/dist/{ledger-AETNF4OM.js.map → extract-partition-UPOVITFI.js.map} +0 -0
- /package/dist/{liberate-GFN4C7RR.js.map → find-SZBL2HPB.js.map} +0 -0
- /package/dist/{link-set-E5HNY67I.js.map → issue-G53NB6EW.js.map} +0 -0
- /package/dist/{managed-secret-CWQ6PND5.js.map → ledger-T5K4P2D7.js.map} +0 -0
- /package/dist/{noydb-ASEXNJS6.js.map → liberate-VEOZRESE.js.map} +0 -0
- /package/dist/{register-4EFJCVYD.js.map → link-set-76JZ6YB4.js.map} +0 -0
- /package/dist/{registry-4SDHHOJ7.js.map → managed-secret-6YC32VXG.js.map} +0 -0
- /package/dist/{registry-CZVINVQH.js.map → noydb-EDJA4JNJ.js.map} +0 -0
- /package/dist/{registry-IKUR2MXD.js.map → on/index.js.map} +0 -0
- /package/dist/{post-register-2XSSMGEQ.js.map → post-register-53O7AJRZ.js.map} +0 -0
- /package/dist/{registry-OYTFGWVK.js.map → register-6TCBR6XD.js.map} +0 -0
- /package/dist/{request-withdrawal-KGXGDPVQ.js.map → registry-DH2L4O2V.js.map} +0 -0
- /package/dist/{revoke-JFN773KF.js.map → registry-IWFMXCHX.js.map} +0 -0
- /package/dist/{signer-TA55QB6R.js.map → registry-Q3FG3OAX.js.map} +0 -0
- /package/dist/{stale-ARHFVL5U.js.map → registry-YC3IFG3A.js.map} +0 -0
- /package/dist/{storage-V7MTFAQJ.js.map → request-withdrawal-NM5VYR6F.js.map} +0 -0
- /package/dist/{reveal-BW36KCOQ.js.map → reveal-XBIMHAXR.js.map} +0 -0
- /package/dist/{ulid-PTAIMDG4.js.map → revoke-MJNYWO72.js.map} +0 -0
- /package/dist/{walk-3ZECBFDA.js.map → signer-6XVS2AU3.js.map} +0 -0
- /package/dist/{withdraw-accessible-7PG4DYQK.js.map → stale-MCS46TFO.js.map} +0 -0
- /package/dist/{verify-RO5RTZOJ.js.map → verify-WYOFLSNA.js.map} +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A **Deed** is a vault owned by a *latent* principal who never
|
|
5
5
|
* authenticates. The owner credential (the random secret that
|
|
6
6
|
* derives `KEK_owner`) is minted machine-side and sealed under a
|
|
7
|
-
* **non-firm** {@link
|
|
7
|
+
* **non-firm** {@link NoydbSealer} — that sealing boundary is
|
|
8
8
|
* the cryptographic *inalienability anchor*: whoever holds the
|
|
9
9
|
* provider (the client / their KMS) is the only party that can ever
|
|
10
10
|
* re-derive `KEK_owner`. A firm-side custodian operates the vault
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import type { NoydbStore } from '../../kernel/types.js';
|
|
32
32
|
import type { UnlockedKeyring } from './keyring.js';
|
|
33
|
-
import type {
|
|
33
|
+
import type { NoydbSealer } from './managed-secret.js';
|
|
34
34
|
/** Reserved id for the Deed marker under `_meta`. */
|
|
35
35
|
export declare const DEED_RECORD_ID: "deed";
|
|
36
36
|
/**
|
|
@@ -43,7 +43,7 @@ export interface DeedMarker {
|
|
|
43
43
|
/** The latent owner principal — the user id of the `_keyring/<id>` owner file. */
|
|
44
44
|
readonly ownerUserId: string;
|
|
45
45
|
/**
|
|
46
|
-
* The `
|
|
46
|
+
* The `NoydbSealer.id` the owner credential is sealed under.
|
|
47
47
|
* The inalienability anchor: only the holder of this (non-firm)
|
|
48
48
|
* provider can re-derive `KEK_owner`. Audit metadata — never secret.
|
|
49
49
|
*/
|
|
@@ -74,7 +74,7 @@ export interface DeedMarker {
|
|
|
74
74
|
* There is deliberately no firm-controlled fallback: the marker's
|
|
75
75
|
* `sealedUnder` is the single cryptographic anchor of ownership.
|
|
76
76
|
*/
|
|
77
|
-
export declare function createDeedOwner(store: NoydbStore, vault: string, ownerUserId: string, sealing:
|
|
77
|
+
export declare function createDeedOwner(store: NoydbStore, vault: string, ownerUserId: string, sealing: NoydbSealer): Promise<UnlockedKeyring>;
|
|
78
78
|
/**
|
|
79
79
|
* Read the {@link DeedMarker} from `_meta/deed`, or `null` if the vault
|
|
80
80
|
* has no Deed marker (i.e. it is not a Deed vault). Plaintext read — no
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NoydbDeviceSeal } from '../../port/with/device-seal-strategy.js';
|
|
2
2
|
/**
|
|
3
3
|
* Device-local sealer for the echo reveal-blob (spec decision 5).
|
|
4
|
-
* DISTINCT from `
|
|
4
|
+
* DISTINCT from `NoydbSealer` (managed-secret mode, which seals
|
|
5
5
|
* the WHOLE secret): this seals only the echo part, and only so an
|
|
6
6
|
* enrolled device can display it during the unlock ceremony. The
|
|
7
7
|
* sealed bytes may sit in the (untrusted) keyring file — attacker-B
|
|
8
8
|
* resistance comes from `unseal` requiring this device's key store.
|
|
9
9
|
*
|
|
10
10
|
* The interface itself is declared on the `/with` port
|
|
11
|
-
* ({@link
|
|
11
|
+
* ({@link NoydbDeviceSeal} from `port/with/device-seal-strategy.js`)
|
|
12
12
|
* so the kernel spine can reference it without a static spine→service
|
|
13
13
|
* import; re-exported here as the canonical consumer-facing home.
|
|
14
14
|
*/
|
|
15
|
-
export type {
|
|
15
|
+
export type { NoydbDeviceSeal };
|
|
16
16
|
/** In-memory test provider — AES-GCM under a per-instance random key. */
|
|
17
|
-
export declare class
|
|
17
|
+
export declare class MemoryDeviceSeal implements NoydbDeviceSeal {
|
|
18
18
|
readonly id: string;
|
|
19
19
|
private readonly keyPromise;
|
|
20
20
|
constructor(opts: {
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
* @module
|
|
16
16
|
*/
|
|
17
17
|
import type { NoydbStore } from '../../kernel/types.js';
|
|
18
|
-
import type {
|
|
18
|
+
import type { NoydbDeviceSeal } from './device-seal.js';
|
|
19
19
|
import { type UnlockedKeyring } from './keyring.js';
|
|
20
20
|
/** Options for {@link beginEchoUnlock}. */
|
|
21
21
|
export interface BeginEchoUnlockOptions {
|
|
22
22
|
readonly userId: string;
|
|
23
23
|
readonly prompt: string;
|
|
24
|
-
readonly deviceSeal?:
|
|
24
|
+
readonly deviceSeal?: NoydbDeviceSeal;
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* A prompt-verified, in-progress echo unlock. Stateless w.r.t. attempts —
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - Building the reveal blob per the hybrid reveal policy (spec decision
|
|
12
12
|
* 4): `portable` (AES-GCM under the prompt, own salt), `sealed`
|
|
13
13
|
* (opaque to hub, unsealed only by the enrolling device's
|
|
14
|
-
* {@link
|
|
14
|
+
* {@link NoydbDeviceSeal}), or `none`.
|
|
15
15
|
* - Resolving the echo for display (`resolveEchoReveal`, `null` ⇒
|
|
16
16
|
* degraded typed-echo path) and verifying a typed echo
|
|
17
17
|
* (`verifyTypedEcho`) for that degraded path.
|
|
@@ -30,14 +30,14 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import { type EchoSecretParts } from '../../kernel/enclave/index.js';
|
|
32
32
|
import type { KeyringEchoBlock } from '../../kernel/types.js';
|
|
33
|
-
import type {
|
|
33
|
+
import type { NoydbDeviceSeal } from './device-seal.js';
|
|
34
34
|
/** Same iteration floor as the KEK (spec resolved question 1). */
|
|
35
35
|
export declare const ECHO_KDF_ITERATIONS = 600000;
|
|
36
36
|
export type EchoRevealChoice = {
|
|
37
37
|
readonly kind: 'portable';
|
|
38
38
|
} | {
|
|
39
39
|
readonly kind: 'sealed';
|
|
40
|
-
readonly deviceSeal:
|
|
40
|
+
readonly deviceSeal: NoydbDeviceSeal;
|
|
41
41
|
} | {
|
|
42
42
|
readonly kind: 'none';
|
|
43
43
|
};
|
|
@@ -52,5 +52,5 @@ export declare function verifyPrompt(block: KeyringEchoBlock, prompt: string): P
|
|
|
52
52
|
* @throws WrongPromptError when the prompt cannot open the portable reveal
|
|
53
53
|
* (callers should verifyPrompt first for a boolean check).
|
|
54
54
|
*/
|
|
55
|
-
export declare function resolveEchoReveal(block: KeyringEchoBlock, prompt: string, deviceSeal?:
|
|
55
|
+
export declare function resolveEchoReveal(block: KeyringEchoBlock, prompt: string, deviceSeal?: NoydbDeviceSeal): Promise<string | null>;
|
|
56
56
|
export declare function verifyTypedEcho(block: KeyringEchoBlock, echo: string): Promise<boolean>;
|
|
@@ -17,7 +17,7 @@ export { NO_TEAM, type TeamStrategy } from './strategy.js';
|
|
|
17
17
|
export { TeamNotEnabledError } from '../../kernel/errors.js';
|
|
18
18
|
export type { UnlockedKeyring } from './keyring.js';
|
|
19
19
|
export { loadKeyring, createOwnerKeyring, grant, revoke, changeSecret, listUsers, listUsersWithEnvelopes, ensureCollectionDEK, persistKeyring, updateKeyringIdentity, buildRecipientKeyringFile, } from './keyring.js';
|
|
20
|
-
export type {
|
|
20
|
+
export type { PodRecipient, ListUsersOptions } from './keyring.js';
|
|
21
21
|
export type { LoadKeyringOptions, CreateOwnerKeyringOptions, RotateKeysOptions, ChangeSecretOptions, } from './keyring.js';
|
|
22
22
|
export { enrollAuthenticator, removeAuthenticator, updateAuthenticator, findAuthenticator, } from './authenticators.js';
|
|
23
23
|
export type { EnrollAuthenticatorOptions, EnrollAuthenticatorWrappingKEKOptions, EnrollAuthenticatorWrappingDEKsOptions, UpdateAuthenticatorOptions, } from './authenticators.js';
|
|
@@ -36,8 +36,8 @@ export { buildEchoBlock, verifyPrompt, resolveEchoReveal, verifyTypedEcho, } fro
|
|
|
36
36
|
export type { EchoRevealChoice } from './echo-secret.js';
|
|
37
37
|
export { beginEchoUnlock } from './echo-ceremony.js';
|
|
38
38
|
export type { BeginEchoUnlockOptions, EchoCeremony } from './echo-ceremony.js';
|
|
39
|
-
export {
|
|
40
|
-
export type {
|
|
39
|
+
export { MemoryDeviceSeal } from './device-seal.js';
|
|
40
|
+
export type { NoydbDeviceSeal } from './device-seal.js';
|
|
41
41
|
export type { EchoSecretParts } from '../../kernel/enclave/index.js';
|
|
42
42
|
export type { KeyringEchoBlock, NoydbStore } from '../../kernel/types.js';
|
|
43
43
|
export { describeAuthConfig, diagramAuthConfig, describeUserAuth, describeAllUsersAuth, } from '../auth-introspection/index.js';
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { NoydbStore, KeyringFile, KeyringAuthenticator, Role, Permissions, GrantOptions, RevokeOptions, UpdateUserOptions, UserInfo, EncryptedEnvelope, ExportCapability, ExportFormat, ImportCapability, VaultPolicyOnDisk, UserEnvelope } from '../../kernel/types.js';
|
|
2
2
|
import { type EnclaveKey, type EchoSecretParts } from '../../kernel/enclave/index.js';
|
|
3
|
+
import type { KeyringTamperedReason } from '../../kernel/errors.js';
|
|
3
4
|
import { type SecretPolicy, type EchoSecretPolicy } from '../../kernel/validation.js';
|
|
4
|
-
import type {
|
|
5
|
+
import type { NoydbDeviceSeal } from './device-seal.js';
|
|
5
6
|
/** In-memory representation of an unlocked keyring. */
|
|
6
7
|
export interface UnlockedKeyring {
|
|
7
8
|
readonly userId: string;
|
|
@@ -9,6 +10,11 @@ export interface UnlockedKeyring {
|
|
|
9
10
|
readonly role: Role;
|
|
10
11
|
readonly permissions: Permissions;
|
|
11
12
|
readonly deks: Map<string, EnclaveKey>;
|
|
13
|
+
/**
|
|
14
|
+
* Unwrapped counterpart of {@link KeyringFile.pending_deks} — an
|
|
15
|
+
* uncommitted rotation (#1074). Empty in the normal state.
|
|
16
|
+
*/
|
|
17
|
+
readonly pendingDeks?: Map<string, EnclaveKey> | undefined;
|
|
12
18
|
/**
|
|
13
19
|
* The KEK, when this keyring was unlocked via tier 1 (secret) or
|
|
14
20
|
* a wrap-KEK tier-2 method (WebAuthn / OIDC). `null` when the
|
|
@@ -72,6 +78,23 @@ export interface UnlockedKeyring {
|
|
|
72
78
|
}
|
|
73
79
|
/** Mint a fresh wrapped-canary string. Deterministic for a given KEK. */
|
|
74
80
|
export declare function mintKeyringCanary(kek: EnclaveKey): Promise<string>;
|
|
81
|
+
/**
|
|
82
|
+
* The vault roster key held by this keyring, or `null` when the keyring
|
|
83
|
+
* carries none.
|
|
84
|
+
*
|
|
85
|
+
* Null is expected on the resume-style paths (`kek: null` sessions, tier-3
|
|
86
|
+
* PIN resume, plaintext mode) — none of which may write a keyring file.
|
|
87
|
+
* Every stamping site null-guards this exactly as it guards `kek`: minting a
|
|
88
|
+
* file without a verifiable `roster_tag` would be worse than refusing, since
|
|
89
|
+
* it is indistinguishable on the next load from a store having stripped it.
|
|
90
|
+
*/
|
|
91
|
+
export declare function rosterKeyOf(keyring: UnlockedKeyring): EnclaveKey | null;
|
|
92
|
+
/**
|
|
93
|
+
* Shared wording for the stamping-site guards — mirrors the `kek` guard's shape.
|
|
94
|
+
* Exported so every roster-stamping site in the hub raises ONE error with one
|
|
95
|
+
* wording, rather than each hand-copying it (`peer-recover`, `liberate`).
|
|
96
|
+
*/
|
|
97
|
+
export declare function requireRosterKey(keyring: UnlockedKeyring, fn: string): EnclaveKey;
|
|
75
98
|
/** Options for {@link loadKeyring} (#846b). */
|
|
76
99
|
export interface LoadKeyringOptions {
|
|
77
100
|
/** The user whose keyring to unlock. */
|
|
@@ -142,7 +165,7 @@ export interface CreateOwnerKeyringOptions extends SecretPolicy {
|
|
|
142
165
|
* ⇒ `reveal: 'sealed'` (attacker-B resistance); absent ⇒ `reveal:
|
|
143
166
|
* 'portable'` (spec resolved question 4). Ignored for a string secret.
|
|
144
167
|
*/
|
|
145
|
-
readonly deviceSeal?:
|
|
168
|
+
readonly deviceSeal?: NoydbDeviceSeal;
|
|
146
169
|
/** Echo enrollment only: optional display hint for the masked echo. */
|
|
147
170
|
readonly echoMaskHint?: string;
|
|
148
171
|
/**
|
|
@@ -168,6 +191,100 @@ export declare function createOwnerKeyring(store: NoydbStore, vault: string, opt
|
|
|
168
191
|
export declare function grant(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: GrantOptions): Promise<void>;
|
|
169
192
|
/** Revoke a user's access. Optionally rotate keys for affected collections. */
|
|
170
193
|
export declare function revoke(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: RevokeOptions): Promise<void>;
|
|
194
|
+
/** What {@link verifyRoster} found. */
|
|
195
|
+
export interface RosterVerifyResult {
|
|
196
|
+
/**
|
|
197
|
+
* How many `_keyring` files were examined.
|
|
198
|
+
*
|
|
199
|
+
* Reported first, and deliberately: "nothing unverified" is equally true of a
|
|
200
|
+
* sweep that examined nothing, and a roster check that silently covered zero
|
|
201
|
+
* members would look identical to a healthy vault. Same lesson as the vault
|
|
202
|
+
* head's `no-expectations` verdict (#1101).
|
|
203
|
+
*/
|
|
204
|
+
readonly checked: number;
|
|
205
|
+
/** The files that failed authentication, and why. */
|
|
206
|
+
readonly unverified: ReadonlyArray<{
|
|
207
|
+
readonly userId: string;
|
|
208
|
+
readonly reason: KeyringTamperedReason;
|
|
209
|
+
}>;
|
|
210
|
+
}
|
|
211
|
+
export declare function verifyRoster(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring): Promise<RosterVerifyResult>;
|
|
212
|
+
/** What {@link quarantineKeyring} did. */
|
|
213
|
+
export interface QuarantineResult {
|
|
214
|
+
readonly userId: string;
|
|
215
|
+
/** Why the file could not be authenticated — the justification for removing it. */
|
|
216
|
+
readonly reason: KeyringTamperedReason;
|
|
217
|
+
/** Collections re-keyed as part of the removal. */
|
|
218
|
+
readonly rotated: readonly string[];
|
|
219
|
+
/**
|
|
220
|
+
* (member, collection) pairs whose access the rotation dropped — the OTHER
|
|
221
|
+
* members, who must be re-granted.
|
|
222
|
+
*
|
|
223
|
+
* Passed through from `rotateKeys` rather than discarded, because a
|
|
224
|
+
* quarantine rotates broadly (see the scope note on the function) and so
|
|
225
|
+
* de-provisions more people than the one being removed. An operator who is
|
|
226
|
+
* not told this discovers it as unrelated `NoAccessError`s later.
|
|
227
|
+
*/
|
|
228
|
+
readonly needsRegrant: RotateResult['needsRegrant'];
|
|
229
|
+
/**
|
|
230
|
+
* OTHER members whose own files also failed authentication, found while
|
|
231
|
+
* rotating. One forged file is rarely the only one, and the operator is
|
|
232
|
+
* already holding the tool for them.
|
|
233
|
+
*/
|
|
234
|
+
readonly alsoUnverified: RotateResult['unverified'];
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Remove a `_keyring` file that cannot be authenticated, and re-key behind it
|
|
238
|
+
* (#1121).
|
|
239
|
+
*
|
|
240
|
+
* ## Why this is not a flag on `revoke`
|
|
241
|
+
*
|
|
242
|
+
* `revoke` reads the target's own `role` to decide whether the caller may
|
|
243
|
+
* revoke them, so it cannot act on a file it will not trust — which left a
|
|
244
|
+
* forged file removable only by editing the store by hand. Relaxing `revoke`
|
|
245
|
+
* conditionally would grow the safe path a parameter that turns it into the
|
|
246
|
+
* dangerous one; ADR 0003's standing rule is that if the implementation needs
|
|
247
|
+
* to weaken a guard, the design is wrong. This is a separate operation with its
|
|
248
|
+
* own contract, so `revoke`'s invariant stays absolute and the dangerous act is
|
|
249
|
+
* named at the call site rather than hidden in an option bag.
|
|
250
|
+
*
|
|
251
|
+
* ## The two properties that keep it from being a backdoor
|
|
252
|
+
*
|
|
253
|
+
* 1. **It refuses a file that verifies.** Otherwise it would delete any keyring
|
|
254
|
+
* while ignoring `canRevoke` — including an owner's, which `revoke` protects
|
|
255
|
+
* unconditionally.
|
|
256
|
+
* 2. **Because of (1) it can safely ignore the claimed `role` — and it must.**
|
|
257
|
+
* `canRevoke` refuses any target whose role reads `owner`, so a store that
|
|
258
|
+
* forged `"role":"owner"` onto its victim would otherwise make them
|
|
259
|
+
* permanently unremovable. Consulting the forged field is exactly the
|
|
260
|
+
* mistake this operation exists to avoid.
|
|
261
|
+
*
|
|
262
|
+
* Owner-only: the narrowest role that can always act, and quarantine
|
|
263
|
+
* deliberately consumes NO field of the file it is removing.
|
|
264
|
+
*
|
|
265
|
+
* ## Why it rotates, and why the scope comes from the CALLER
|
|
266
|
+
*
|
|
267
|
+
* Deleting the file is not a revocation — the store may decline the delete, and
|
|
268
|
+
* the member may already hold unwrapped DEKs. So this rotates, exactly as
|
|
269
|
+
* `revoke` does. The scope is every collection the CALLER holds, not the
|
|
270
|
+
* target's DEK map: that map is unauthenticated (#1115), so deriving the scope
|
|
271
|
+
* from it would let the store choose which collections survive a quarantine.
|
|
272
|
+
*
|
|
273
|
+
* ⚠️ **That is the security-correct scope, and it is NOT free.** An earlier
|
|
274
|
+
* draft of this comment called over-rotating "the safe direction"; a review
|
|
275
|
+
* probe disproved it. Rotation re-keys `store.list(vault, <name>)` plus the
|
|
276
|
+
* derived refs `rotateKeys` knows about, so a DEK slot whose ciphertext lives
|
|
277
|
+
* under a *different* collection name — `_blob`, whose data sits in
|
|
278
|
+
* `_blob_index`/`_blob_chunks`, and the `collection#tier` slots — is re-keyed
|
|
279
|
+
* without its data being re-encrypted, and that data then fails to open. That
|
|
280
|
+
* gap belongs to `rotateKeys` (it is reachable through an ordinary `revoke` of
|
|
281
|
+
* a whole-vault grantee, with no quarantine involved) and is filed as #1122,
|
|
282
|
+
* but a quarantine takes the maximal scope *unconditionally*, so it meets the
|
|
283
|
+
* gap every time rather than occasionally. Until that is fixed, treat a
|
|
284
|
+
* quarantine as an emergency operation with a real blast radius, and read
|
|
285
|
+
* `needsRegrant` afterwards.
|
|
286
|
+
*/
|
|
287
|
+
export declare function quarantineKeyring(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, userId: string): Promise<QuarantineResult>;
|
|
171
288
|
/**
|
|
172
289
|
* Mutate `role`, `displayName`, and/or `permissions` on an existing
|
|
173
290
|
* keyring. Pure plaintext-header rewrite — no DEK rewrap, no KEK
|
|
@@ -217,6 +334,26 @@ export interface RotateResult {
|
|
|
217
334
|
readonly userId: string;
|
|
218
335
|
readonly collection: string;
|
|
219
336
|
}>;
|
|
337
|
+
/**
|
|
338
|
+
* Members skipped because their `_keyring` file failed roster verification
|
|
339
|
+
* (#1114).
|
|
340
|
+
*
|
|
341
|
+
* Rotation hands a member re-wrapped DEKs, so skipping one gives them
|
|
342
|
+
* **less**, never more: the file is left untouched and its wrappings for the
|
|
343
|
+
* rotated collections go stale. That is the same fail-closed end state as
|
|
344
|
+
* `needsRegrant`, but it needs a different remedy and so gets a different
|
|
345
|
+
* field — a `needsRegrant` entry is fixed by `grant()`, whereas one of these
|
|
346
|
+
* is a file that no longer authenticates and cannot be repaired by granting
|
|
347
|
+
* over it.
|
|
348
|
+
*
|
|
349
|
+
* Before this existed, one such file threw and took `revoke` and
|
|
350
|
+
* `rotateKeys` down vault-wide — the two operations most needed when a
|
|
351
|
+
* roster is suspect.
|
|
352
|
+
*/
|
|
353
|
+
readonly unverified: ReadonlyArray<{
|
|
354
|
+
readonly userId: string;
|
|
355
|
+
readonly reason: KeyringTamperedReason;
|
|
356
|
+
}>;
|
|
220
357
|
}
|
|
221
358
|
/** Options for {@link rotateKeys} (#846b — was a bare `string[]`). */
|
|
222
359
|
export interface RotateKeysOptions {
|
|
@@ -261,7 +398,7 @@ export interface EchoRecipientSecret extends EchoSecretParts {
|
|
|
261
398
|
*
|
|
262
399
|
* @public
|
|
263
400
|
*/
|
|
264
|
-
export interface
|
|
401
|
+
export interface PodRecipient {
|
|
265
402
|
/** User id stamped onto the keyring file in the bundle. */
|
|
266
403
|
readonly id: string;
|
|
267
404
|
/** Optional display name. Defaults to `id`. */
|
|
@@ -312,7 +449,7 @@ export interface BundleRecipient {
|
|
|
312
449
|
*
|
|
313
450
|
* @internal
|
|
314
451
|
*/
|
|
315
|
-
export declare function buildRecipientKeyringFile(callerKeyring: UnlockedKeyring, recipient:
|
|
452
|
+
export declare function buildRecipientKeyringFile(callerKeyring: UnlockedKeyring, recipient: PodRecipient): Promise<KeyringFile>;
|
|
316
453
|
/** List all users with access to a vault. */
|
|
317
454
|
export declare function listUsers(store: NoydbStore, vault: string): Promise<UserInfo[]>;
|
|
318
455
|
/**
|
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A vault mode where the secret is machine-generated and never
|
|
5
5
|
* exposed to the user, sealed under a developer-provided
|
|
6
|
-
* {@link
|
|
6
|
+
* {@link NoydbSealer} (macOS Keychain, Windows Credential
|
|
7
7
|
* Manager, libsecret, AWS KMS, …). The user has no secret to give
|
|
8
8
|
* up to coercion — they can't reveal what they don't know.
|
|
9
9
|
*
|
|
10
10
|
* ## Components in this file
|
|
11
11
|
*
|
|
12
|
-
* - {@link
|
|
12
|
+
* - {@link NoydbSealer} — the interface concrete providers
|
|
13
13
|
* implement. Provider implementations live OUTSIDE hub (per-
|
|
14
14
|
* platform packages).
|
|
15
|
-
* - {@link
|
|
15
|
+
* - {@link MemorySealer} — in-memory test provider; uses
|
|
16
16
|
* a deterministic per-instance "key" so two providers with
|
|
17
17
|
* different ids cannot unseal each other's outputs.
|
|
18
18
|
* - {@link RecipientHint} — public material a sender uses to seal
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
* - {@link RecipientSealer} — interface for asymmetric/granted
|
|
23
23
|
* providers that support recipient-target sealing (RSA-OAEP,
|
|
24
24
|
* cloud-KMS asymmetric, etc.); distinct from self-only
|
|
25
|
-
* {@link
|
|
25
|
+
* {@link NoydbSealer} (macOS Keychain, WebAuthn-PRF).
|
|
26
26
|
* - {@link MemoryRecipientSealer} — in-process reference
|
|
27
27
|
* implementation of both `RecipientSealer` and
|
|
28
|
-
* `
|
|
28
|
+
* `NoydbSealer` using real WebCrypto RSA-OAEP + AES-GCM;
|
|
29
29
|
* safe for tests and same-process sender/recipient scenarios.
|
|
30
30
|
* - {@link loadSealedSecret} / {@link saveSealedSecret} —
|
|
31
31
|
* plaintext envelope storage at `_meta/sealed-secret`.
|
|
@@ -66,7 +66,7 @@ import type { NoydbStore, RecipientSealer } from '../../kernel/types.js';
|
|
|
66
66
|
* | Linux | `@noy-db/seal-libsecret` | libsecret / secret-service |
|
|
67
67
|
* | Cloud / server | `@noy-db/seal-aws-kms` | AWS KMS Decrypt |
|
|
68
68
|
*/
|
|
69
|
-
export interface
|
|
69
|
+
export interface NoydbSealer {
|
|
70
70
|
/**
|
|
71
71
|
* Non-sensitive identifier disclosed in the persisted envelope.
|
|
72
72
|
* Surfaced to consumers via `loadSealedSecret().providerId` so
|
|
@@ -97,13 +97,23 @@ export interface SealingKeyProvider {
|
|
|
97
97
|
*
|
|
98
98
|
* Replace with a real platform provider in production.
|
|
99
99
|
*/
|
|
100
|
-
export declare class
|
|
100
|
+
export declare class MemorySealer implements NoydbSealer {
|
|
101
101
|
readonly id: string;
|
|
102
102
|
private readonly fingerprint;
|
|
103
103
|
private readonly keyBytes;
|
|
104
104
|
constructor(opts: {
|
|
105
105
|
id: string;
|
|
106
106
|
});
|
|
107
|
+
/**
|
|
108
|
+
* Deterministic 4-byte integrity tag over the ciphertext, keyed by the
|
|
109
|
+
* same derived bytes. NOT a MAC and not forgery-resistant — a real
|
|
110
|
+
* provider authenticates with its backend. It exists because the contract
|
|
111
|
+
* says `unseal` MUST throw on tamper, and a double that silently returns
|
|
112
|
+
* corrupted bytes is not modelling the contract it stands in for. Without
|
|
113
|
+
* it, every managed-mode test ran against a provider that could not fail
|
|
114
|
+
* the way a real one must (found by @noy-db/test-sealer-conformance).
|
|
115
|
+
*/
|
|
116
|
+
private tag;
|
|
107
117
|
seal(secret: Uint8Array): Promise<Uint8Array>;
|
|
108
118
|
unseal(sealed: Uint8Array): Promise<Uint8Array>;
|
|
109
119
|
}
|
|
@@ -168,7 +178,7 @@ export declare function parseRsaOaepTlv(bytes: Uint8Array): {
|
|
|
168
178
|
*/
|
|
169
179
|
export declare function aesGcmOpen(cekBytes: Uint8Array, iv: Uint8Array, ct: Uint8Array): Promise<Uint8Array>;
|
|
170
180
|
/**
|
|
171
|
-
* Reference implementation of `RecipientSealer` + `
|
|
181
|
+
* Reference implementation of `RecipientSealer` + `NoydbSealer`.
|
|
172
182
|
* Uses WebCrypto RSA-OAEP-SHA256 (2048-bit) to wrap a fresh 32-byte
|
|
173
183
|
* AES-GCM CEK, AES-GCM-encrypts plaintext under it, and packs the
|
|
174
184
|
* result into a self-describing TLV:
|
|
@@ -190,7 +200,7 @@ export declare function aesGcmOpen(cekBytes: Uint8Array, iv: Uint8Array, ct: Uin
|
|
|
190
200
|
* keychain; use it for tests and for shipping bundles where the
|
|
191
201
|
* recipient instance lives in the same process as the sender (rare).
|
|
192
202
|
*/
|
|
193
|
-
export declare class MemoryRecipientSealer implements
|
|
203
|
+
export declare class MemoryRecipientSealer implements NoydbSealer, RecipientSealer {
|
|
194
204
|
readonly id: string;
|
|
195
205
|
private readonly keypair;
|
|
196
206
|
constructor(opts: {
|
|
@@ -213,7 +223,7 @@ export interface SealedSecret {
|
|
|
213
223
|
/**
|
|
214
224
|
* Wire-format envelope persisted at `_meta/sealed-secret` for
|
|
215
225
|
* managed-mode vaults. The provider produces raw sealed bytes via
|
|
216
|
-
* {@link
|
|
226
|
+
* {@link NoydbSealer.seal}; this wrapper carries the dispatch
|
|
217
227
|
* metadata hub needs to pick the right provider on the unseal path.
|
|
218
228
|
*
|
|
219
229
|
* Stability boundary: once shipped, the wire format only grows by
|
|
@@ -277,4 +287,4 @@ export declare function loadSealedSecret(store: NoydbStore, vault: string): Prom
|
|
|
277
287
|
*
|
|
278
288
|
* @internal — called from `createNoydb` / `getKeyringInternal`.
|
|
279
289
|
*/
|
|
280
|
-
export declare function resolveManagedSecret(store: NoydbStore, vault: string, provider:
|
|
290
|
+
export declare function resolveManagedSecret(store: NoydbStore, vault: string, provider: NoydbSealer): Promise<string>;
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* Internal service — reached through `noydb.team.rotateSecret(...)` etc.
|
|
20
20
|
*/
|
|
21
21
|
import type { NoydbOptions, NoydbStore, KeyringAuthenticator } from '../../kernel/types.js';
|
|
22
|
-
import type { RotateResult, RotateKeysOptions } from './keyring.js';
|
|
22
|
+
import type { RotateResult, RotateKeysOptions, RosterVerifyResult, QuarantineResult } from './keyring.js';
|
|
23
23
|
import { type RotateSecretInput, type RecoverSecretInput, type RecoverSecretResult, type RotateRecoveryOptions, type RotateRecoveryResult, type EnrollRecoveryResult, type RecoveryEnrollmentInput, type RecoveryProof } from './rotate-recover.js';
|
|
24
24
|
import { type RecoverUserOptions } from './peer-recover.js';
|
|
25
25
|
import { type PaperRecoveryEntry, type ShamirRecoveryEntry } from './recovery.js';
|
|
@@ -74,6 +74,10 @@ export declare class TeamFacade {
|
|
|
74
74
|
runRevoke(engine: (adapter: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: RevokeOptions) => Promise<void>, vault: string, options: RevokeOptions, factors?: FactorProofBundle): Promise<void>;
|
|
75
75
|
/** Gate + run a `rotateKeys` engine. See `Noydb.rotate` for the public contract. */
|
|
76
76
|
runRotate(engine: (store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, opts: RotateKeysOptions) => Promise<RotateResult>, vault: string, collections: string[]): Promise<RotateResult>;
|
|
77
|
+
/** Gate + run the `verifyRoster` engine (#1121). See `Noydb.verifyRoster`. */
|
|
78
|
+
runVerifyRoster(engine: (store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring) => Promise<RosterVerifyResult>, vault: string): Promise<RosterVerifyResult>;
|
|
79
|
+
/** Gate + run the `quarantineKeyring` engine (#1121). See `Noydb.quarantineKeyring`. */
|
|
80
|
+
runQuarantine(engine: (store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, userId: string) => Promise<QuarantineResult>, vault: string, userId: string, factors?: FactorProofBundle): Promise<QuarantineResult>;
|
|
77
81
|
/**
|
|
78
82
|
* Add a tier-2 authenticator slot to the calling user's keyring.
|
|
79
83
|
* Each slot independently wraps the SAME KEK under a method-specific
|
|
@@ -299,7 +303,7 @@ export declare class TeamFacade {
|
|
|
299
303
|
* const db = await createNoydb({
|
|
300
304
|
* store, user: 'alice',
|
|
301
305
|
* secretMode: 'managed',
|
|
302
|
-
* sealingKey:
|
|
306
|
+
* sealingKey: atMacosKeychain({ ... }),
|
|
303
307
|
* })
|
|
304
308
|
*
|
|
305
309
|
* const { vault, recoveryEnrollments } = await db.team.openVaultAndEnrollRecovery('acme', {
|
|
@@ -325,7 +329,7 @@ export declare class TeamFacade {
|
|
|
325
329
|
*
|
|
326
330
|
* Replaces the sealed secret of a managed-mode vault with a
|
|
327
331
|
* fresh 256-bit random, sealed under the configured
|
|
328
|
-
* `
|
|
332
|
+
* `NoydbSealer`. The user never sees the new secret.
|
|
329
333
|
*
|
|
330
334
|
* Internally:
|
|
331
335
|
* 1. Verify the recovery proof (Shamir today) and unwrap the
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* sees `RawShare` or the share codecs. Implemented by
|
|
5
5
|
* `shamirRecoveryProvider()` from `@noy-db/on-shamir`.
|
|
6
6
|
*/
|
|
7
|
-
export interface
|
|
7
|
+
export interface NoydbShamir {
|
|
8
8
|
/** Split `secret` into `n` base32 share strings; any `k` recombine it. */
|
|
9
9
|
splitToShares(secret: Uint8Array, k: number, n: number): string[];
|
|
10
10
|
/**
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
import type { NoydbStore } from '../../kernel/types.js';
|
|
26
26
|
import type { EnclaveKey } from '../../kernel/enclave/index.js';
|
|
27
27
|
import { type WrappedDeksBlob } from './wrapped-deks.js';
|
|
28
|
-
import type {
|
|
28
|
+
import type { NoydbShamir } from './noydb-shamir.js';
|
|
29
29
|
/**
|
|
30
30
|
* One paper recovery code as persisted in `_meta/recovery-paper`.
|
|
31
31
|
*
|
|
@@ -146,7 +146,7 @@ export declare function saveShamirRecoveryEntries(store: NoydbStore, vault: stri
|
|
|
146
146
|
* @param n - Total shares (k <= n <= 255).
|
|
147
147
|
* @param label - Optional caller label.
|
|
148
148
|
*/
|
|
149
|
-
export declare function mintShamirRecoveryEntry(provider:
|
|
149
|
+
export declare function mintShamirRecoveryEntry(provider: NoydbShamir, deks: Map<string, EnclaveKey>, entryId: string, k: number, n: number, label?: string): Promise<{
|
|
150
150
|
entry: ShamirRecoveryEntry;
|
|
151
151
|
shareStrings: string[];
|
|
152
152
|
}>;
|
|
@@ -161,7 +161,7 @@ export declare function mintShamirRecoveryEntry(provider: ShamirRecoveryProvider
|
|
|
161
161
|
* because they came from a different enrollment or were tampered
|
|
162
162
|
* with. Callers iterating multiple entries should catch.
|
|
163
163
|
*/
|
|
164
|
-
export declare function unwrapDeksFromShamirEntry(provider:
|
|
164
|
+
export declare function unwrapDeksFromShamirEntry(provider: NoydbShamir, entry: ShamirRecoveryEntry, shareStrings: readonly string[]): Promise<Map<string, EnclaveKey>>;
|
|
165
165
|
/**
|
|
166
166
|
* Generate one paper-recovery entry from an unlocked DEK set.
|
|
167
167
|
*
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1096 — the authenticated half of a `_keyring` file's AUTHORITY.
|
|
3
|
+
*
|
|
4
|
+
* A `_keyring` file is stored plaintext (`_iv: ''`) so admins can edit a
|
|
5
|
+
* member's authority without holding that member's credential. That means
|
|
6
|
+
* `role`/`permissions` were authenticated by NOTHING — a hostile store could
|
|
7
|
+
* promote a viewer to admin by editing one word (proven in
|
|
8
|
+
* `__tests__/keyring-replay-escalation.test.ts`).
|
|
9
|
+
*
|
|
10
|
+
* The fix is a vault-wide ROSTER KEY, carried as a reserved DEK-map entry
|
|
11
|
+
* (`deks['_roster']`, see `ROSTER_KEY_ID`) so it reaches every member through
|
|
12
|
+
* the channels a DEK already travels — grant's `_`-prefix propagation,
|
|
13
|
+
* `persistKeyring`, the wrapped-DEKs recovery blob, `peer-recover`, pod
|
|
14
|
+
* recipient slots — and a `roster_tag`: AES-GCM of the canonical authority
|
|
15
|
+
* fields under that key. Every roster EDITOR holds the key (constraint:
|
|
16
|
+
* admins edit authority they don't hold the target's credential for) — which
|
|
17
|
+
* is what sets the bound below.
|
|
18
|
+
*
|
|
19
|
+
* `user_id` is inside the canonical string so a genuine tag cannot be
|
|
20
|
+
* transplanted onto another member's file.
|
|
21
|
+
*
|
|
22
|
+
* ## What "authority half" does NOT cover
|
|
23
|
+
*
|
|
24
|
+
* The canonical string is exactly {@link RosterAuthorityFields} — the fields a
|
|
25
|
+
* privilege decision reads. Other plaintext fields are deliberately excluded
|
|
26
|
+
* and REMAIN FORGEABLE by the store: `display_name` (cosmetic), `policy`
|
|
27
|
+
* (round-tripped, never enforced at v1.0), `echo` and `authenticators` (each
|
|
28
|
+
* authenticated by its own wrapped key material — a forged one fails to
|
|
29
|
+
* unlock rather than granting anything), plus `created_at` / `salt` /
|
|
30
|
+
* `_noydb_keyring`. Adding a field to the tag means adding it to
|
|
31
|
+
* `rosterCanonical`; nothing else here is a claim about it.
|
|
32
|
+
*
|
|
33
|
+
* ## The bound
|
|
34
|
+
*
|
|
35
|
+
* This stops the STORE, which holds no keys. It deliberately does NOT stop a
|
|
36
|
+
* malicious MEMBER: every roster editor must hold the roster key, so anyone
|
|
37
|
+
* who legitimately holds it can forge any authority field for any member.
|
|
38
|
+
* That bound must be stated in `SECURITY.md` (tracked as part of the #1096
|
|
39
|
+
* PR) — it is not written there yet.
|
|
40
|
+
*/
|
|
41
|
+
import type { KeyringFile } from '../../kernel/types.js';
|
|
42
|
+
import type { EnclaveKey } from '../../kernel/enclave/index.js';
|
|
43
|
+
export interface RosterTag {
|
|
44
|
+
readonly iv: string;
|
|
45
|
+
readonly data: string;
|
|
46
|
+
}
|
|
47
|
+
export type RosterAuthorityFields = Pick<KeyringFile, 'user_id' | 'role' | 'permissions' | 'granted_by' | 'expires_at' | 'export_capability' | 'import_capability' | 'deks' | 'pending_deks'>;
|
|
48
|
+
export declare function rosterCanonical(file: RosterAuthorityFields): string;
|
|
49
|
+
export declare function mintRosterTag(file: RosterAuthorityFields, rosterKey: EnclaveKey): Promise<RosterTag>;
|
|
50
|
+
/**
|
|
51
|
+
* false on decrypt failure OR canonical mismatch — never throws.
|
|
52
|
+
*
|
|
53
|
+
* `null` is accepted alongside `undefined` because the tag arrives from
|
|
54
|
+
* JSON a store controls: `"roster_tag": null` is a shape the type system
|
|
55
|
+
* says is impossible and the wire permits.
|
|
56
|
+
*/
|
|
57
|
+
export declare function verifyRosterTag(file: RosterAuthorityFields, tag: RosterTag | undefined | null, rosterKey: EnclaveKey): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* #1096 — THE CHOKEPOINT. Verify a keyring file's plaintext AUTHORITY half
|
|
60
|
+
* against the roster key carried in its own, already-unwrapped, DEK set.
|
|
61
|
+
* Throws {@link KeyringTamperedError}; returns silently when the roster is
|
|
62
|
+
* authentic.
|
|
63
|
+
*
|
|
64
|
+
* **Every path that builds an `UnlockedKeyring` from a `KeyringFile` must call
|
|
65
|
+
* this — not just `loadKeyring`.** A tier-2 unlock that reconstructs
|
|
66
|
+
* `role`/`permissions` from the plaintext header without it accepts exactly
|
|
67
|
+
* the forgery tier-1 refuses, and the vault is only as strong as its weakest
|
|
68
|
+
* unlock path. That is not hypothetical: the wrap-DEKs password path shipped
|
|
69
|
+
* in this state until it was caught in review.
|
|
70
|
+
*
|
|
71
|
+
* Deliberately says nothing about the canary. The canary proves the KEK, and
|
|
72
|
+
* tier-2 paths have no KEK to prove — the roster key they hold comes from the
|
|
73
|
+
* slot's own wrapped-DEK blob, which is authenticated by its own AES-GCM tag.
|
|
74
|
+
* Callers that DO hold a KEK check the canary separately, before this.
|
|
75
|
+
*
|
|
76
|
+
* @param deks the caller's UNWRAPPED DEK set — a roster key here is proof of
|
|
77
|
+
* possession, so this must never be handed a map built from unverified input.
|
|
78
|
+
*/
|
|
79
|
+
export declare function assertRosterAuthenticated(file: KeyringFile, deks: ReadonlyMap<string, EnclaveKey>, userId: string): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* #1096 — VERIFY BEFORE YOU TRUST, and especially before you RESTAMP.
|
|
82
|
+
*
|
|
83
|
+
* The sibling of {@link assertRosterAuthenticated} for the other half of the
|
|
84
|
+
* problem. That one guards paths that *unlock* a keyring; this one guards paths
|
|
85
|
+
* that **read another member's file** — because the roster key is vault-wide, a
|
|
86
|
+
* caller holding it can verify any member's tag, not just their own.
|
|
87
|
+
*
|
|
88
|
+
* Every read-modify-write on a member's roster must call this **before** the
|
|
89
|
+
* modify. A flow that reads a forged file, edits one field and restamps does
|
|
90
|
+
* not merely tolerate the forgery — it **launders** it, converting a file
|
|
91
|
+
* `loadKeyring` refuses into one it accepts, under a genuine tag. `revoke`
|
|
92
|
+
* calls into such a flow unconditionally, so without this a single forged
|
|
93
|
+
* member plus any later revocation anywhere in the vault is a complete bypass.
|
|
94
|
+
*
|
|
95
|
+
* Fail-closed, deliberately: a forged member's file aborts the operation rather
|
|
96
|
+
* than being skipped. Skipping would complete the revoke while leaving the
|
|
97
|
+
* forgery in place, and an untrusted store can already refuse writes — so the
|
|
98
|
+
* availability it costs was never guaranteed, while the integrity it buys is
|
|
99
|
+
* the point of the mechanism.
|
|
100
|
+
*/
|
|
101
|
+
export declare function assertRosterTagValid(file: KeyringFile, rosterKey: EnclaveKey, userId: string): Promise<void>;
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
import type { NoydbStore } from '../../kernel/types.js';
|
|
20
20
|
import { type EnclaveKey, type EchoSecretParts } from '../../kernel/enclave/index.js';
|
|
21
21
|
import { type PaperRecoveryEntry } from './recovery.js';
|
|
22
|
-
import type {
|
|
22
|
+
import type { NoydbShamir } from './noydb-shamir.js';
|
|
23
23
|
import { type SecretPolicy, type EchoSecretPolicy } from '../../kernel/validation.js';
|
|
24
24
|
import type { UnlockedKeyring } from './keyring.js';
|
|
25
|
-
import type {
|
|
25
|
+
import type { NoydbDeviceSeal } from './device-seal.js';
|
|
26
26
|
import type { KeyringAuthenticator } from '../../kernel/types.js';
|
|
27
27
|
import type { EnrollAuthenticatorOptions } from './authenticators.js';
|
|
28
28
|
/**
|
|
@@ -38,7 +38,7 @@ interface RotateEchoOptions {
|
|
|
38
38
|
* absent ⇒ `reveal: 'portable'`. Mirrors
|
|
39
39
|
* {@link CreateOwnerKeyringOptions.deviceSeal}.
|
|
40
40
|
*/
|
|
41
|
-
readonly deviceSeal?:
|
|
41
|
+
readonly deviceSeal?: NoydbDeviceSeal;
|
|
42
42
|
/** Optional display hint for the masked echo. */
|
|
43
43
|
readonly maskHint?: string;
|
|
44
44
|
}
|
|
@@ -189,7 +189,7 @@ export type RecoveryProof = {
|
|
|
189
189
|
/** Optional disambiguator when multiple Shamir entries are enrolled.
|
|
190
190
|
* When omitted, hub tries each entry until one combines. */
|
|
191
191
|
readonly entryId?: string;
|
|
192
|
-
/** K or more opaque share strings, as returned by `
|
|
192
|
+
/** K or more opaque share strings, as returned by `NoydbShamir.splitToShares`. */
|
|
193
193
|
readonly shares: ReadonlyArray<string>;
|
|
194
194
|
};
|
|
195
195
|
};
|
|
@@ -365,5 +365,5 @@ export type RecoveryEnrollmentInput = {
|
|
|
365
365
|
* On success, the used recovery entry is burned (deleted from the
|
|
366
366
|
* stored set).
|
|
367
367
|
*/
|
|
368
|
-
export declare function recoverSecret(provider:
|
|
368
|
+
export declare function recoverSecret(provider: NoydbShamir | undefined, store: NoydbStore, vault: string, userId: string, input: RecoverSecretInput): Promise<UnlockedKeyring>;
|
|
369
369
|
export {};
|