@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
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import type { UnlockedKeyring } from './keyring.js';
|
|
20
20
|
/** Canonical DEK key for a given collection + tier. Tier 0 → bare name. */
|
|
21
|
-
|
|
21
|
+
import { dekKey } from '../../kernel/tier-visibility.js';
|
|
22
|
+
export { dekKey };
|
|
22
23
|
/**
|
|
23
24
|
* Returns the user's effective clearance for a given collection: the
|
|
24
25
|
* maximum tier for which their keyring holds a DEK. Falls back to 0
|
|
@@ -47,14 +47,14 @@
|
|
|
47
47
|
*/
|
|
48
48
|
import type { Cover } from '../with-party/directory/cover/types.js';
|
|
49
49
|
import type { Redirect } from './redirect.js';
|
|
50
|
-
/** Magic bytes 'NDB1' (ASCII)
|
|
51
|
-
export declare const
|
|
50
|
+
/** Magic bytes 'NDB1' (ASCII) — `NoyDB 1` — identifying a NOYDB pod (`.noydb` container). */
|
|
51
|
+
export declare const NOYDB_POD_MAGIC: Uint8Array<ArrayBuffer>;
|
|
52
52
|
/** Total fixed prefix before the header JSON: 4+1+1+4 bytes. */
|
|
53
|
-
export declare const
|
|
53
|
+
export declare const NOYDB_POD_PREFIX_BYTES = 10;
|
|
54
54
|
/** Current bundle format version. Bumped on layout changes. Default for unsigned pods. */
|
|
55
|
-
export declare const
|
|
55
|
+
export declare const NOYDB_POD_FORMAT_VERSION = 1;
|
|
56
56
|
/** Format version for pods carrying a header signature (`sig`/`keyId`/`sigAlg`). */
|
|
57
|
-
export declare const
|
|
57
|
+
export declare const NOYDB_POD_FORMAT_VERSION_SIGNED = 2;
|
|
58
58
|
/**
|
|
59
59
|
* Bitfield interpretation of the flags byte.
|
|
60
60
|
*
|
|
@@ -85,7 +85,7 @@ export type CompressionAlgo = 0 | 1 | 2;
|
|
|
85
85
|
*
|
|
86
86
|
* **Minimum-disclosure rules:** these are the ONLY allowed keys.
|
|
87
87
|
* Any other key in a parsed header causes
|
|
88
|
-
* `
|
|
88
|
+
* `validatePodHeaderFields` to throw. The set is kept short to
|
|
89
89
|
* minimize attack surface from cloud-storage metadata indexing —
|
|
90
90
|
* see the file-level doc comment for the rationale.
|
|
91
91
|
*
|
|
@@ -132,7 +132,7 @@ export interface NoydbPodHeader {
|
|
|
132
132
|
* Auto-unlock material indicator. When present, the bundle
|
|
133
133
|
* body wraps the dump JSON in a structure carrying per-user
|
|
134
134
|
* secrets — either plaintext (`'unsealed'`, public-by-design)
|
|
135
|
-
* or sealed under a `
|
|
135
|
+
* or sealed under a `NoydbSealer` (`'sealed'`, requires
|
|
136
136
|
* matching provider on the recipient side).
|
|
137
137
|
*
|
|
138
138
|
* Visible pre-decompression so cloud listing UIs can warn before
|
|
@@ -249,8 +249,6 @@ export interface NoydbPodHeader {
|
|
|
249
249
|
* family (see `unlockMethods` doc comment on `NoydbPodHeader`).
|
|
250
250
|
*/
|
|
251
251
|
export type UnlockMethod = 'password' | 'webauthn' | 'oidc' | 'totp' | 'email-otp' | 'magic-link' | 'pin' | 'recovery' | 'shamir';
|
|
252
|
-
/** @deprecated Use `NoydbPodHeader`. */
|
|
253
|
-
export type NoydbBundleHeader = NoydbPodHeader;
|
|
254
252
|
/**
|
|
255
253
|
* Validate a parsed bundle header. Throws on any deviation from
|
|
256
254
|
* the minimum-disclosure schema:
|
|
@@ -266,18 +264,18 @@ export type NoydbBundleHeader = NoydbPodHeader;
|
|
|
266
264
|
* The error messages name the offending field so consumers can
|
|
267
265
|
* fix the producer rather than the reader.
|
|
268
266
|
*/
|
|
269
|
-
export declare function
|
|
267
|
+
export declare function validatePodHeaderFields(parsed: unknown): asserts parsed is NoydbPodHeader;
|
|
270
268
|
/**
|
|
271
269
|
* Encode a header object to UTF-8 JSON bytes after validating
|
|
272
270
|
* minimum disclosure. Used by the writer to serialize the header
|
|
273
271
|
* region of the container.
|
|
274
272
|
*/
|
|
275
|
-
export declare function
|
|
273
|
+
export declare function encodePodHeader(header: NoydbPodHeader): Uint8Array;
|
|
276
274
|
/**
|
|
277
275
|
* Parse a bundle header from its UTF-8 JSON bytes. Throws on
|
|
278
276
|
* invalid JSON or any minimum-disclosure violation.
|
|
279
277
|
*/
|
|
280
|
-
export declare function
|
|
278
|
+
export declare function decodePodHeader(bytes: Uint8Array): NoydbPodHeader;
|
|
281
279
|
/**
|
|
282
280
|
* Read a uint32 from `bytes` at `offset` in big-endian byte order.
|
|
283
281
|
* No bounds check — callers must guarantee `offset + 4 <= bytes.length`.
|
|
@@ -295,4 +293,4 @@ export declare function writeUint32BE(bytes: Uint8Array, offset: number, value:
|
|
|
295
293
|
* 4 bytes match `NDB1`. Used by readers as a fast file-type check
|
|
296
294
|
* before any further parsing.
|
|
297
295
|
*/
|
|
298
|
-
export declare function
|
|
296
|
+
export declare function hasNoydbPodMagic(bytes: Uint8Array): boolean;
|
package/dist/with-pod/index.d.ts
CHANGED
|
@@ -11,19 +11,19 @@
|
|
|
11
11
|
* omit this subpath and save ~805 LOC of format code + Brotli/gzip
|
|
12
12
|
* wiring.
|
|
13
13
|
*/
|
|
14
|
-
export { writePod, readPod, readPodHeader, readPodCover,
|
|
14
|
+
export { writePod, readPod, readPodHeader, readPodCover, resetBrotliSupportCache, } from './pod.js';
|
|
15
15
|
export type { Cover } from '../with-party/directory/cover/types.js';
|
|
16
|
-
export type { WritePodOptions,
|
|
17
|
-
export { verifyPodHeader } from './
|
|
18
|
-
export type { PodVerifyResult } from './
|
|
16
|
+
export type { WritePodOptions, ReadPodOptions, PodReadResult, } from './pod.js';
|
|
17
|
+
export { verifyPodHeader } from './pod.js';
|
|
18
|
+
export type { PodVerifyResult } from './pod.js';
|
|
19
19
|
export { signRecord, verifyRecord, signedBytes, POD_SIG_ALG } from './signature.js';
|
|
20
|
-
export {
|
|
21
|
-
export type { CompressionAlgo, NoydbPodHeader,
|
|
20
|
+
export { NOYDB_POD_MAGIC, NOYDB_POD_PREFIX_BYTES, NOYDB_POD_FORMAT_VERSION, FLAG_COMPRESSED, FLAG_HAS_INTEGRITY_HASH, COMPRESSION_NONE, COMPRESSION_GZIP, COMPRESSION_BROTLI, validatePodHeaderFields, encodePodHeader, hasNoydbPodMagic, } from './format.js';
|
|
21
|
+
export type { CompressionAlgo, NoydbPodHeader, UnlockMethod, } from './format.js';
|
|
22
22
|
export { generateULID, isULID } from './ulid.js';
|
|
23
|
-
export { wrapPodStore, createPodStore
|
|
24
|
-
export type { WrappedPodNoydbStore, WrapPodStoreOptions,
|
|
25
|
-
export {
|
|
26
|
-
export { readPodRedirect } from './
|
|
23
|
+
export { wrapPodStore, createPodStore } from './pod-store.js';
|
|
24
|
+
export type { WrappedPodNoydbStore, WrapPodStoreOptions, } from './pod-store.js';
|
|
25
|
+
export { PodIntegrityError, PodSealMismatchError, PodVersionConflictError, BackupLedgerError, BackupCorruptedError, } from '../kernel/errors.js';
|
|
26
|
+
export { readPodRedirect } from './pod.js';
|
|
27
27
|
export { signRedirect, verifyRedirect, followRedirects } from './redirect.js';
|
|
28
28
|
export type { Redirect, RedirectHop, FollowRedirectsResult } from './redirect.js';
|
|
29
29
|
export type { DocSigner } from '../with-audit/attestation/signer.js';
|
package/dist/with-pod/open.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* reachable through published seams). Composes, in order:
|
|
7
7
|
*
|
|
8
8
|
* 1. `readPod` — parse + integrity-check the container (throws
|
|
9
|
-
* `
|
|
9
|
+
* `PodIntegrityError` on a corrupted/truncated pod).
|
|
10
10
|
* 2. `verifyPodHeader` — only when `opts.trustedKeys` is supplied.
|
|
11
11
|
* `'unsigned'` is benign (legacy pod, or `writePod({ sign: false })`)
|
|
12
12
|
* and open() proceeds; `'untrusted'` / `'tampered'` are fail-closed —
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
* @module
|
|
64
64
|
*/
|
|
65
65
|
import type { NoydbPodHeader } from './format.js';
|
|
66
|
-
import type { PodVerifyResult } from './
|
|
66
|
+
import type { PodVerifyResult } from './pod.js';
|
|
67
67
|
import type { Noydb } from '../kernel/noydb.js';
|
|
68
68
|
import type { Vault } from '../kernel/vault.js';
|
|
69
69
|
import type { NoydbOptions, NoydbStore, EchoSecretParts } from '../kernel/types.js';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault bundle handle — the stable opaque ULID identifying a vault
|
|
3
|
+
* across `.noydb` exports.
|
|
4
|
+
*
|
|
5
|
+
* Behaviour is byte-identical to the inline `Vault.getPodHandle`
|
|
6
|
+
* method this function replaced. `Vault` keeps the public method as
|
|
7
|
+
* a thin delegator.
|
|
8
|
+
*
|
|
9
|
+
* Internal — reached through `vault.getPodHandle()`.
|
|
10
|
+
*/
|
|
11
|
+
import type { NoydbStore } from '../kernel/types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Return the stable opaque bundle handle for the given vault adapter,
|
|
14
|
+
* generating and persisting a fresh ULID on first call.
|
|
15
|
+
*
|
|
16
|
+
* See {@link import('../kernel/vault.js').Vault.getPodHandle} for
|
|
17
|
+
* the full rationale and storage-path documentation.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildPodHandle(adapter: NoydbStore, name: string): Promise<string>;
|
|
@@ -44,11 +44,3 @@ export declare function wrapPodStore(bundle: NoydbPodStore, options?: WrapPodSto
|
|
|
44
44
|
* analogous to `createStore` for KV stores.
|
|
45
45
|
*/
|
|
46
46
|
export declare function createPodStore<TOptions>(factory: (options: TOptions) => NoydbPodStore): (options: TOptions) => NoydbPodStore;
|
|
47
|
-
/** @deprecated Use wrapPodStore. */
|
|
48
|
-
export declare const wrapBundleStore: typeof wrapPodStore;
|
|
49
|
-
/** @deprecated Use createPodStore. */
|
|
50
|
-
export declare const createBundleStore: typeof createPodStore;
|
|
51
|
-
/** @deprecated Use WrappedPodNoydbStore. */
|
|
52
|
-
export type WrappedBundleNoydbStore = WrappedPodNoydbStore;
|
|
53
|
-
/** @deprecated Use WrapPodStoreOptions. */
|
|
54
|
-
export type WrapBundleStoreOptions = WrapPodStoreOptions;
|
|
@@ -36,9 +36,9 @@ import { type NoydbPodHeader, type UnlockMethod } from './format.js';
|
|
|
36
36
|
import type { Redirect } from './redirect.js';
|
|
37
37
|
import type { DocSigner } from '../with-audit/attestation/signer.js';
|
|
38
38
|
import type { Vault } from '../kernel/vault.js';
|
|
39
|
-
import type {
|
|
39
|
+
import type { PodRecipient } from '../with-party/team/keyring.js';
|
|
40
40
|
import type { Cover } from '../with-party/directory/cover/types.js';
|
|
41
|
-
import type {
|
|
41
|
+
import type { NoydbSealer, RecipientSealer, RecipientHint } from '../with-party/team/managed-secret.js';
|
|
42
42
|
/**
|
|
43
43
|
* The credential kinds that can be bundled for auto-unlock.
|
|
44
44
|
* WebAuthn is intentionally excluded — it is hardware-bound and
|
|
@@ -128,7 +128,7 @@ export interface WritePodOptions {
|
|
|
128
128
|
* the bundle inherits the source keyring as-is (today's behaviour,
|
|
129
129
|
* suited to personal backup-and-restore).
|
|
130
130
|
*/
|
|
131
|
-
readonly recipients?: readonly
|
|
131
|
+
readonly recipients?: readonly PodRecipient[];
|
|
132
132
|
/**
|
|
133
133
|
* Auto-unlock — unsealed per-user credentials.
|
|
134
134
|
*
|
|
@@ -152,7 +152,7 @@ export interface WritePodOptions {
|
|
|
152
152
|
};
|
|
153
153
|
/**
|
|
154
154
|
* Auto-unlock — per-user credentials sealed under a
|
|
155
|
-
* {@link
|
|
155
|
+
* {@link NoydbSealer}.
|
|
156
156
|
*
|
|
157
157
|
* Generalises `sealedSecrets` to support any bundleable
|
|
158
158
|
* credential kind (`secret` | `password` | `pin`).
|
|
@@ -177,7 +177,7 @@ export interface WritePodOptions {
|
|
|
177
177
|
*/
|
|
178
178
|
readonly sealedCredentials?: {
|
|
179
179
|
readonly mode: 'self-target';
|
|
180
|
-
readonly provider:
|
|
180
|
+
readonly provider: NoydbSealer;
|
|
181
181
|
readonly perUser: Record<string, AutoCredential>;
|
|
182
182
|
} | {
|
|
183
183
|
readonly mode: 'recipient-target';
|
|
@@ -211,7 +211,7 @@ export interface WritePodOptions {
|
|
|
211
211
|
* @deprecated Use `sealedCredentials` instead.
|
|
212
212
|
*
|
|
213
213
|
* Auto-unlock — per-user secrets sealed under a
|
|
214
|
-
* {@link
|
|
214
|
+
* {@link NoydbSealer} (self-target only).
|
|
215
215
|
*
|
|
216
216
|
* The hub seals each user's plaintext secret under `provider`
|
|
217
217
|
* and embeds the resulting sealed envelopes in the bundle. The
|
|
@@ -229,7 +229,7 @@ export interface WritePodOptions {
|
|
|
229
229
|
*/
|
|
230
230
|
readonly sealedSecrets?: {
|
|
231
231
|
readonly mode: 'self-target';
|
|
232
|
-
readonly provider:
|
|
232
|
+
readonly provider: NoydbSealer;
|
|
233
233
|
readonly perUser: Record<string, string>;
|
|
234
234
|
};
|
|
235
235
|
/**
|
|
@@ -266,8 +266,6 @@ export interface WritePodOptions {
|
|
|
266
266
|
*/
|
|
267
267
|
readonly redirect?: Redirect;
|
|
268
268
|
}
|
|
269
|
-
/** @deprecated Use `WritePodOptions`. */
|
|
270
|
-
export type WriteNoydbBundleOptions = WritePodOptions;
|
|
271
269
|
/**
|
|
272
270
|
* Every key `writePod` reads, in declaration order (#991).
|
|
273
271
|
*
|
|
@@ -289,7 +287,7 @@ export declare const WRITE_POD_OPTION_KEYS: readonly ["compression", "collection
|
|
|
289
287
|
* actually restore a vault. Splitting the layers keeps the
|
|
290
288
|
* bundle module free of crypto concerns — see file-level docs.
|
|
291
289
|
*/
|
|
292
|
-
export interface
|
|
290
|
+
export interface PodReadResult {
|
|
293
291
|
readonly header: NoydbPodHeader;
|
|
294
292
|
readonly dumpJson: string;
|
|
295
293
|
/**
|
|
@@ -317,7 +315,7 @@ export interface NoydbBundleReadResult {
|
|
|
317
315
|
* auto-unlock paths. Without these the reader behaves exactly as before
|
|
318
316
|
* (header parsed; body returned as `dumpJson`).
|
|
319
317
|
*/
|
|
320
|
-
export interface
|
|
318
|
+
export interface ReadPodOptions {
|
|
321
319
|
/**
|
|
322
320
|
* Recipient-side sealing providers used to unseal entries from
|
|
323
321
|
* `sealedSecrets`. The reader picks the one whose `.id`
|
|
@@ -328,7 +326,7 @@ export interface ReadNoydbBundleOptions {
|
|
|
328
326
|
* `autoUnlock.perUser` map remains the SEALED entries unmodified
|
|
329
327
|
* — callers can inspect them or unseal elsewhere.
|
|
330
328
|
*/
|
|
331
|
-
readonly sealingProviders?: readonly
|
|
329
|
+
readonly sealingProviders?: readonly NoydbSealer[];
|
|
332
330
|
/**
|
|
333
331
|
* Opt-in trial mode for unsealing — when an entry's `pid` doesn't
|
|
334
332
|
* match a registered provider, try each provider whose alg
|
|
@@ -373,7 +371,7 @@ export declare function resetBrotliSupportCache(): void;
|
|
|
373
371
|
*
|
|
374
372
|
* Pipeline:
|
|
375
373
|
* 1. Resolve or create the compartment's stable bundle handle
|
|
376
|
-
* via `vault.
|
|
374
|
+
* via `vault.getPodHandle()` — same handle on
|
|
377
375
|
* every export from the same vault instance, so cloud
|
|
378
376
|
* adapters can use it as a primary key.
|
|
379
377
|
* 2. `vault.dump()` → JSON string with encrypted records
|
|
@@ -398,7 +396,7 @@ export declare function resetBrotliSupportCache(): void;
|
|
|
398
396
|
*
|
|
399
397
|
* @internal
|
|
400
398
|
*/
|
|
401
|
-
export declare function
|
|
399
|
+
export declare function assemblePodContainer(opts: {
|
|
402
400
|
handle: string;
|
|
403
401
|
bodyJsonStr: string;
|
|
404
402
|
compression: WritePodOptions['compression'];
|
|
@@ -413,8 +411,6 @@ export declare function assembleBundleContainer(opts: {
|
|
|
413
411
|
signer?: DocSigner;
|
|
414
412
|
}): Promise<Uint8Array>;
|
|
415
413
|
export declare function writePod(vault: Vault, opts?: WritePodOptions): Promise<Uint8Array>;
|
|
416
|
-
/** @deprecated Use `writePod`. */
|
|
417
|
-
export declare const writeNoydbBundle: typeof writePod;
|
|
418
414
|
/**
|
|
419
415
|
* Read just the bundle header — no body decompression, no
|
|
420
416
|
* integrity verification. Intended for cloud-listing UIs that want
|
|
@@ -430,8 +426,6 @@ export declare const writeNoydbBundle: typeof writePod;
|
|
|
430
426
|
* range requests against bundles that may carry icons.
|
|
431
427
|
*/
|
|
432
428
|
export declare function readPodHeader(bytes: Uint8Array): NoydbPodHeader;
|
|
433
|
-
/** @deprecated Use `readPodHeader`. */
|
|
434
|
-
export declare const readNoydbBundleHeader: typeof readPodHeader;
|
|
435
429
|
/**
|
|
436
430
|
* Outcome of {@link verifyPodHeader}.
|
|
437
431
|
*
|
|
@@ -457,7 +451,7 @@ export interface PodVerifyResult {
|
|
|
457
451
|
* (`keyId → publicKeyB64` the caller already trusts), it reports whether the
|
|
458
452
|
* header was signed by a trusted document signer.
|
|
459
453
|
*
|
|
460
|
-
* Pairs with the signing half in `
|
|
454
|
+
* Pairs with the signing half in `assemblePodContainer`/`writePod`: the
|
|
461
455
|
* signed payload is the final wire header with `sig` removed, so verification
|
|
462
456
|
* reconstructs it by stripping EXACTLY the `sig` field — `keyId`, `sigAlg`,
|
|
463
457
|
* and every other header field stay in the verified payload.
|
|
@@ -469,7 +463,7 @@ export interface PodVerifyResult {
|
|
|
469
463
|
* header (which includes the *claimed* `bodySha256`) is signed by a trusted
|
|
470
464
|
* key; it does NOT prove the body matches that hash. To trust the pod's
|
|
471
465
|
* BODY you MUST also confirm the body hashes to `header.bodySha256` — call
|
|
472
|
-
* `readPod`, which throws `
|
|
466
|
+
* `readPod`, which throws `PodIntegrityError` on mismatch. A `verified`
|
|
473
467
|
* header paired with a swapped body is caught only by that integrity check.
|
|
474
468
|
* This function stays body-free by design so a static page can authenticate a
|
|
475
469
|
* header without decompressing the body; composing the two checks is the
|
|
@@ -498,7 +492,7 @@ export declare function readPodCover(bytes: Uint8Array, opts?: {
|
|
|
498
492
|
* the header's `redirect` field or `undefined` if the bundle was written
|
|
499
493
|
* without one.
|
|
500
494
|
*
|
|
501
|
-
* The record is returned UNVERIFIED: `
|
|
495
|
+
* The record is returned UNVERIFIED: `validatePodHeaderFields` only checks
|
|
502
496
|
* its shape at parse time (a parser has no `trustedKeys`). Callers that
|
|
503
497
|
* intend to follow the redirect MUST separately call `verifyRedirect`
|
|
504
498
|
* (`redirect.js`) before trusting `target`.
|
|
@@ -510,7 +504,7 @@ export declare function readPodRedirect(bytes: Uint8Array): Redirect | undefined
|
|
|
510
504
|
* original `vault.dump()` JSON string ready to pass to
|
|
511
505
|
* `vault.load()`.
|
|
512
506
|
*
|
|
513
|
-
* Throws `
|
|
507
|
+
* Throws `PodIntegrityError` if the body's actual SHA-256 does
|
|
514
508
|
* not match the value declared in the header. Distinct from a
|
|
515
509
|
* format error so consumers can pattern-match in catch blocks
|
|
516
510
|
* (corrupted-in-transit vs malformed-by-producer).
|
|
@@ -522,6 +516,4 @@ export declare function readPodRedirect(bytes: Uint8Array): Redirect | undefined
|
|
|
522
516
|
* free of crypto concerns and lets the same code feed format
|
|
523
517
|
* inspectors that never decrypt anything.
|
|
524
518
|
*/
|
|
525
|
-
export declare function readPod(bytes: Uint8Array, opts?:
|
|
526
|
-
/** @deprecated Use `readPod`. */
|
|
527
|
-
export declare const readNoydbBundle: typeof readPod;
|
|
519
|
+
export declare function readPod(bytes: Uint8Array, opts?: ReadPodOptions): Promise<PodReadResult>;
|
package/dist/with-pod/ulid.d.ts
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
*
|
|
40
40
|
* If a future use case needs timestamp-free handles, a v2 of the
|
|
41
41
|
* format could specify "use the random portion only" without a
|
|
42
|
-
* format break — `
|
|
42
|
+
* format break — `validatePodHeaderFields` only checks the regex
|
|
43
43
|
* shape, not the encoded timestamp.
|
|
44
44
|
*/
|
|
45
45
|
/**
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import type { NoydbStore, SlotInfo } from '../../kernel/types.js';
|
|
32
32
|
import { type EnclaveKey } from '../../kernel/enclave/index.js';
|
|
33
|
+
import { type OrphanChunkReport } from './orphan-report.js';
|
|
33
34
|
export interface BlobFieldPolicy<T = unknown> {
|
|
34
35
|
/**
|
|
35
36
|
* Via port brand marker — lets a `BlobFieldPolicy` satisfy the kernel's
|
|
@@ -145,6 +146,18 @@ export interface CompactionResult {
|
|
|
145
146
|
records: number;
|
|
146
147
|
evicted: number;
|
|
147
148
|
}>;
|
|
149
|
+
/**
|
|
150
|
+
* #1133 — chunk rows in `_blob_chunks` with no surviving `_blob_index` entry.
|
|
151
|
+
* Pre-#1127 residue: unreachable by every reader AND by rotation, so for a
|
|
152
|
+
* legacy blob the bytes stay openable under a retired `_blob` DEK.
|
|
153
|
+
*
|
|
154
|
+
* REPORTED, never reclaimed — deciding "orphaned" means trusting the store's
|
|
155
|
+
* `list`, and a store that withholds one index row would have us destroy a
|
|
156
|
+
* LIVE blob's chunks. See `orphan-report.ts` for the full argument. A vault
|
|
157
|
+
* that has run `migrate()` has no legacy chunks to strand, and `chunks: 0`
|
|
158
|
+
* is the expected reading everywhere else.
|
|
159
|
+
*/
|
|
160
|
+
readonly orphanBlobChunks: OrphanChunkReport;
|
|
148
161
|
}
|
|
149
162
|
export interface CompactRunOptions {
|
|
150
163
|
/** Override "now" for deterministic testing. */
|
|
@@ -13,7 +13,7 @@ export declare const BLOB_COLLECTION = "_blob";
|
|
|
13
13
|
/** Stores `BlobObject` metadata envelopes, keyed by eTag. */
|
|
14
14
|
export declare const BLOB_INDEX_COLLECTION = "_blob_index";
|
|
15
15
|
/**
|
|
16
|
-
* Stores encrypted chunk envelopes, keyed by `{eTag}
|
|
16
|
+
* Stores encrypted chunk envelopes, keyed by `{eTag}_{chunkIndex}`.
|
|
17
17
|
* NOT loaded into the in-memory query layer. Fetched on demand by
|
|
18
18
|
* `BlobSet.get()` / `BlobSet.response()`.
|
|
19
19
|
*/
|
|
@@ -39,14 +39,14 @@ export declare const DEFAULT_CHUNK_SIZE: number;
|
|
|
39
39
|
*
|
|
40
40
|
* ```
|
|
41
41
|
* _blob_index/{eTag} BlobObject metadata (vault-shared DEK)
|
|
42
|
-
* _blob_chunks/{eTag}
|
|
42
|
+
* _blob_chunks/{eTag}_{chunkIndex} Encrypted chunk data (vault-shared DEK + AAD)
|
|
43
43
|
* _blob_slots_{collection}/{recordId} Slot map (parent collection DEK)
|
|
44
44
|
* _blob_versions_{collection}/{recordId}/{slot}/{label} Published versions (parent collection DEK)
|
|
45
45
|
* ```
|
|
46
46
|
*
|
|
47
47
|
* ## Deduplication
|
|
48
48
|
*
|
|
49
|
-
* `put()` computes `eTag = HMAC-SHA-256(
|
|
49
|
+
* `put()` computes `eTag = HMAC-SHA-256(addressKey(tier), plaintext)` — keyed so the
|
|
50
50
|
* store cannot predict eTags for known content. If another record already
|
|
51
51
|
* uploaded the same bytes, the chunks are reused and `refCount` is incremented.
|
|
52
52
|
*
|
|
@@ -179,6 +179,24 @@ export declare class BlobSet {
|
|
|
179
179
|
* write throws an AEAD decrypt error rather than silently writing under
|
|
180
180
|
* the wrong key.
|
|
181
181
|
*/
|
|
182
|
+
/**
|
|
183
|
+
* The content-addressing key for `tier` (#1126).
|
|
184
|
+
*
|
|
185
|
+
* Derived from `_blob_addr`, a vault-lifetime keyring slot `rotateKeys`
|
|
186
|
+
* refuses to touch — so a rotation re-keys chunk BODIES while every stored
|
|
187
|
+
* eTag, and therefore every chunk AAD and every `_blob_index` /
|
|
188
|
+
* `_blob_slots_*` / `_blob_versions_*` row, survives it unchanged.
|
|
189
|
+
*
|
|
190
|
+
* Before this the address was keyed by the `_blob` DEK itself, so after any
|
|
191
|
+
* rotation `HMAC(live DEK, plaintext) !== storedETag` permanently, for every
|
|
192
|
+
* blob written earlier: `decryptResponse()` raised `TamperedError` on the
|
|
193
|
+
* presigned-URL path forever, and dedup split.
|
|
194
|
+
*
|
|
195
|
+
* Still derived PER TIER, because the address is meant to be tier-scoped —
|
|
196
|
+
* `rehomeForTier` re-addresses on a tier move for exactly that reason. Only
|
|
197
|
+
* the ROTATION coupling was ever wrong.
|
|
198
|
+
*/
|
|
199
|
+
private addressKey;
|
|
182
200
|
private ownerTier;
|
|
183
201
|
/**
|
|
184
202
|
* The sanctioned cleared-read path to an elevated record's blobs (#749).
|
|
@@ -424,16 +442,70 @@ export declare class BlobSet {
|
|
|
424
442
|
* - not yet stamped → apply via `casUpdateRefCountStamped`, then proceed
|
|
425
443
|
* exactly like the unstamped path below.
|
|
426
444
|
*
|
|
427
|
-
* A crash can also land
|
|
428
|
-
*
|
|
429
|
-
*
|
|
430
|
-
*
|
|
431
|
-
*
|
|
432
|
-
*
|
|
433
|
-
*
|
|
445
|
+
* A crash can also land part-way through the deletion itself. Since #1127
|
|
446
|
+
* that deletion runs CHUNKS FIRST (see `deleteChunksThenIndex`), so what
|
|
447
|
+
* survives is an index row with some chunks already gone — a reachable,
|
|
448
|
+
* re-runnable state rather than chunks nothing can ever address again.
|
|
449
|
+
*
|
|
450
|
+
* An eTag whose index row is ALREADY absent on entry is therefore either
|
|
451
|
+
* pre-#1127 residue or a completed deletion. `loadBlobObject` returns null
|
|
452
|
+
* (indistinguishable from "never existed") and the object's `chunkCount` is
|
|
453
|
+
* gone with it. A stamped caller who knows the true count (the journal
|
|
454
|
+
* marker's captured `holds`, once that plumbing lands) supplies it via
|
|
455
|
+
* `chunkCountHint` so this call can still finish the chunk deletion; without
|
|
456
|
+
* it, an already-index-gone eTag is reported `'shredded'` same as today (best
|
|
434
457
|
* effort — nothing left to key the cleanup off of).
|
|
435
458
|
*/
|
|
436
459
|
private releaseRef;
|
|
460
|
+
/**
|
|
461
|
+
* Delete a blob's chunks, THEN its index row. The order is the whole point
|
|
462
|
+
* (#1127).
|
|
463
|
+
*
|
|
464
|
+
* Both deletions used to run index-first, which meant a crash in between
|
|
465
|
+
* stranded chunks with no index row. Nothing can ever reach those again:
|
|
466
|
+
* `loadBlobObject` returns null, so no reader addresses them — and
|
|
467
|
+
* `rekeyBlobSet` derives its chunk ids from each index entry's `chunkCount`,
|
|
468
|
+
* so a rotation never visits them either. For a LEGACY blob (bytes under the
|
|
469
|
+
* `_blob` DEK itself rather than a per-blob content CEK) the bodies then stay
|
|
470
|
+
* openable under the retired `_blob` DEK — precisely the key a revoked member
|
|
471
|
+
* walked away with. Crash during `forget()`, revoke later, and real blob
|
|
472
|
+
* content sits readable indefinitely, with no error on either side.
|
|
473
|
+
*
|
|
474
|
+
* Reversing it removes the class rather than cleaning up after it: every
|
|
475
|
+
* chunk that still exists has an index row, so every chunk is reachable by
|
|
476
|
+
* `rekeyBlobSet` and gets re-keyed. There is no orphan to sweep because none
|
|
477
|
+
* is produced.
|
|
478
|
+
*
|
|
479
|
+
* The residue this ordering leaves instead is an index row whose chunks are
|
|
480
|
+
* partly gone. That state is better, but it is NOT free — it cost one reader
|
|
481
|
+
* correction (`resolveRehomedVersionETag`, which read an old blob's bytes
|
|
482
|
+
* while resuming a rehome and now checks `refCount <= 0` instead of relying
|
|
483
|
+
* on the row having vanished). An earlier draft of this comment called the
|
|
484
|
+
* new state "strictly better"; the full suite disproved that, and any future
|
|
485
|
+
* path that reads a blob by index needs the same care. What is true of it:
|
|
486
|
+
* - it is REACHABLE, so a re-run of `releaseRef` completes the deletion
|
|
487
|
+
* idempotently (both `store.delete` calls are void on an absent key);
|
|
488
|
+
* - `rekeyBlobSet` already tolerates it — a missing chunk hits its
|
|
489
|
+
* `if (!chunkEnv || !chunkEnv._iv) continue`, so a rotation still
|
|
490
|
+
* succeeds and still re-keys every chunk that remains;
|
|
491
|
+
* - it cannot leak, because the bytes that survive are the ones still
|
|
492
|
+
* covered by rotation.
|
|
493
|
+
*
|
|
494
|
+
* This also makes one ordering rule true across the blob subsystem rather
|
|
495
|
+
* than two opposite ones: `kernel/enclave/record-keys/rekey-blob.ts` already
|
|
496
|
+
* re-encrypts chunks before re-sealing their index entry, and documents that
|
|
497
|
+
* order as its resume property.
|
|
498
|
+
*
|
|
499
|
+
* Deliberately NOT paired with a sweep that deletes pre-existing orphans:
|
|
500
|
+
* such a sweep must decide "orphaned" from `store.list(_blob_index)`, and the
|
|
501
|
+
* store is untrusted. A store that withholds one index row could make a LIVE
|
|
502
|
+
* blob's chunks look orphaned and have us destroy them — turning withholding,
|
|
503
|
+
* which is reversible, into permanent loss. Reporting them is safe; deleting
|
|
504
|
+
* them on the store's word is not. The report half shipped as
|
|
505
|
+
* `reportOrphanBlobChunks` (#1133), surfaced through `vault.compact()`; a
|
|
506
|
+
* reclaim pass remains deliberately unbuilt for the reason above.
|
|
507
|
+
*/
|
|
508
|
+
private deleteChunksThenIndex;
|
|
437
509
|
/**
|
|
438
510
|
* Crypto-shred this record's blob attachments — called by
|
|
439
511
|
* `vault.forget()`.
|
|
@@ -986,7 +1058,7 @@ export declare class BlobSet {
|
|
|
986
1058
|
* attacker-controlled content pulled from the same forged row and would
|
|
987
1059
|
* make the check tautological). After assembling the plaintext, we
|
|
988
1060
|
* recompute the SAME content address every write path mints
|
|
989
|
-
* (`hmacSha256Hex(
|
|
1061
|
+
* (`hmacSha256Hex(addressKey(tier), plaintext)` — `writeBlobContent`'s Step 1,
|
|
990
1062
|
* unconditional on `_cek`) and compare it to that requested eTag. A
|
|
991
1063
|
* forged row can produce valid ciphertext under the flat DEK, but can't
|
|
992
1064
|
* produce plaintext that re-hashes to an address it doesn't control.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orphan blob-chunk REPORT (#1133) — the read-only half of the residue #1127
|
|
3
|
+
* stopped producing.
|
|
4
|
+
*
|
|
5
|
+
* Before #1127, `releaseRef` deleted a blob's index row BEFORE its chunks, so a
|
|
6
|
+
* crash in between stranded chunk bodies nothing can ever reach: `loadBlobObject`
|
|
7
|
+
* returns null so no reader addresses them, and `rekeyBlobSet` derives its chunk
|
|
8
|
+
* ids from each index entry's `chunkCount` so a rotation never visits them. For a
|
|
9
|
+
* LEGACY blob (bytes under the shared `_blob` DEK rather than a per-blob content
|
|
10
|
+
* CEK) those bodies then stay openable under the retired DEK indefinitely.
|
|
11
|
+
*
|
|
12
|
+
* #1127 reversed the order, which removes the class at the source. It does
|
|
13
|
+
* nothing for orphans created before the fix, and this module does not delete
|
|
14
|
+
* them either. It counts them.
|
|
15
|
+
*
|
|
16
|
+
* ## Why this REPORTS and does not RECLAIM
|
|
17
|
+
*
|
|
18
|
+
* Deciding "orphaned" requires `store.list(_blob_index)`, and the store is
|
|
19
|
+
* untrusted — that is the premise of the product, not a caveat on it. A store
|
|
20
|
+
* that withholds a single index row makes a LIVE blob's chunks look orphaned. A
|
|
21
|
+
* reclaim pass acting on that would convert **withholding**, which is reversible
|
|
22
|
+
* the moment the store stops lying, into **permanent destruction** — handing an
|
|
23
|
+
* untrusted store a data-loss primitive it does not currently have, in order to
|
|
24
|
+
* tidy up residue.
|
|
25
|
+
*
|
|
26
|
+
* Reporting inverts the risk to something harmless: a lying store can only
|
|
27
|
+
* inflate this count. Nothing is deleted on its word, so the worst outcome is an
|
|
28
|
+
* operator investigating residue that turns out not to exist.
|
|
29
|
+
*
|
|
30
|
+
* Re-keying is not an alternative either: the chunk AAD is
|
|
31
|
+
* `{eTag}:{chunkIndex}:{chunkCount}`, and `chunkCount` lives only in the index
|
|
32
|
+
* row that is already gone — an orphan's AAD is unreconstructable, so it cannot
|
|
33
|
+
* be decrypted-and-re-encrypted at all.
|
|
34
|
+
*/
|
|
35
|
+
import type { NoydbStore } from '../../kernel/types.js';
|
|
36
|
+
export interface OrphanChunkReport {
|
|
37
|
+
/** Chunk rows whose eTag has no `_blob_index` entry. */
|
|
38
|
+
readonly chunks: number;
|
|
39
|
+
/** Distinct eTags those chunks belong to. */
|
|
40
|
+
readonly eTags: number;
|
|
41
|
+
/**
|
|
42
|
+
* Up to {@link SAMPLE_LIMIT} of those eTags, so an operator can inspect a real
|
|
43
|
+
* one rather than only a count. Deterministic (store list order), not random.
|
|
44
|
+
*/
|
|
45
|
+
readonly sampleETags: readonly string[];
|
|
46
|
+
/**
|
|
47
|
+
* Chunk ids that do not match the `{eTag}_{index}` grammar at all. Counted
|
|
48
|
+
* rather than skipped: an id this module cannot parse is a thing it cannot
|
|
49
|
+
* classify either way, and reporting zero orphans while silently dropping
|
|
50
|
+
* such ids would be the reassuring-but-wrong answer.
|
|
51
|
+
*/
|
|
52
|
+
readonly unparseable: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Count chunk rows with no surviving index row. Read-only: two `list` calls and
|
|
56
|
+
* no `get`, no `delete`, and no decryption — an orphan cannot be opened anyway.
|
|
57
|
+
*
|
|
58
|
+
* A store that cannot list either collection yields an empty report rather than
|
|
59
|
+
* throwing: this is a diagnostic riding along with a maintenance pass, and it
|
|
60
|
+
* must not be able to fail one.
|
|
61
|
+
*/
|
|
62
|
+
export declare function reportOrphanBlobChunks(adapter: NoydbStore, vault: string): Promise<OrphanChunkReport>;
|
|
@@ -71,7 +71,7 @@ export interface DescribedField {
|
|
|
71
71
|
};
|
|
72
72
|
/**
|
|
73
73
|
* Normalized lookup metadata (#650 Task 7 — the first-ever
|
|
74
|
-
* `
|
|
74
|
+
* `NoydbVia.describeFragment` consumer; sourced from the `'lookup'`
|
|
75
75
|
* binding's fragment, NOT from config directly — see `buildDescription`).
|
|
76
76
|
* Present for every `lookup()`/`enumOf()`/`dict()` field, ALONGSIDE the
|
|
77
77
|
* pre-existing `dict` block above (kept byte-stable for the
|
|
@@ -245,7 +245,7 @@ export interface BuildDescriptionInput {
|
|
|
245
245
|
} | undefined;
|
|
246
246
|
/**
|
|
247
247
|
* Per-binding `describeFragment()` output, keyed by binding brand (#650
|
|
248
|
-
* Task 7 — first-ever consumer of `
|
|
248
|
+
* Task 7 — first-ever consumer of `NoydbVia.describeFragment`,
|
|
249
249
|
* `via/index.ts:136`). `Collection.describe()`/`describeAsync()` build this
|
|
250
250
|
* from `this.via?.describeFragments()`. The `'lookup'` brand's fragment
|
|
251
251
|
* feeds the `lookup` block below; `'blob'`'s feeds the `blob` block
|
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
* migrator waits for the active client set (registry heartbeats) to ack
|
|
8
8
|
* the draining generation before transforming. No leader election.
|
|
9
9
|
*
|
|
10
|
-
* The transport is the injected {@link
|
|
11
|
-
* default {@link
|
|
10
|
+
* The transport is the injected {@link NoydbMesh} port: the
|
|
11
|
+
* default {@link StoreMesh} maps it onto today's
|
|
12
12
|
* `_meta/schema-fence` store ops, so behavior is byte-for-byte the same;
|
|
13
13
|
* `by-tabs` / `by-peer` swap in real-time push transports.
|
|
14
14
|
*/
|
|
15
15
|
import { type FenceState } from './fence.js';
|
|
16
16
|
import type { TransformFn } from './types.js';
|
|
17
|
-
import { type
|
|
17
|
+
import { type NoydbMesh } from '../../port/by/index.js';
|
|
18
18
|
/** Runs one collection's transform; supplied by the Vault (binds to a Collection). */
|
|
19
19
|
export type RunTransform = (collection: string, transform: TransformFn) => Promise<void>;
|
|
20
20
|
/** Structural (no static import — kernel-spine port-layering carve-out, same rationale as
|
|
@@ -51,7 +51,7 @@ export declare function schemaBumpAuditHook(getLedger: () => AuditLedgerLike | n
|
|
|
51
51
|
export declare class SchemaFenceController {
|
|
52
52
|
#private;
|
|
53
53
|
constructor(opts: {
|
|
54
|
-
coordination:
|
|
54
|
+
coordination: NoydbMesh;
|
|
55
55
|
vault: string;
|
|
56
56
|
onFlush: () => Promise<void>;
|
|
57
57
|
/** Stable per-instance id; the migrator excludes itself from the barrier. */
|