@noy-db/hub 0.4.0-pre.1 → 0.4.0-pre.11
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/README.md +3 -4
- package/dist/api-ZDKTWNBB.js +20 -0
- package/dist/attestation/index.js +18 -18
- package/dist/{backup-LU2DTZTI.js → backup-2UX7PRM5.js} +13 -13
- package/dist/blobs/index.js +30 -15
- package/dist/blobs/index.js.map +1 -1
- package/dist/broker/index.js +12 -12
- package/dist/broker/index.js.map +1 -1
- package/dist/cargo/index.js +53 -43
- package/dist/{chunk-YTGDPCPW.js → chunk-2J6UEN2V.js} +42 -18
- package/dist/chunk-2J6UEN2V.js.map +1 -0
- package/dist/{chunk-IY23KFNZ.js → chunk-35NMVJ7I.js} +3 -3
- package/dist/{chunk-S3BFKGET.js → chunk-3HUYRN24.js} +4 -4
- package/dist/chunk-3HUYRN24.js.map +1 -0
- package/dist/{walk-XS3PKM6I.js → chunk-3V3XR4S4.js} +4 -13
- package/dist/{walk-XS3PKM6I.js.map → chunk-3V3XR4S4.js.map} +1 -1
- package/dist/{chunk-RTEK4C4I.js → chunk-4JQK3L4V.js} +2 -2
- package/dist/{chunk-3ELCWU56.js → chunk-4ZKNC6A6.js} +2 -2
- package/dist/{chunk-VQNJ7UZL.js → chunk-55LKVALY.js} +106 -10
- package/dist/chunk-55LKVALY.js.map +1 -0
- package/dist/{chunk-VAIS3SOM.js → chunk-55LX6FSX.js} +2 -2
- package/dist/chunk-5D2ALSM5.js +19 -0
- package/dist/chunk-5D2ALSM5.js.map +1 -0
- package/dist/{chunk-6HPG2YNX.js → chunk-5DRROK5W.js} +2 -2
- package/dist/{chunk-S6Q37VGE.js → chunk-5GQEU4DN.js} +2 -2
- package/dist/chunk-5JOFWL4G.js +25 -0
- package/dist/chunk-5JOFWL4G.js.map +1 -0
- package/dist/{chunk-TOPYT5U5.js → chunk-63FE525P.js} +6 -6
- package/dist/chunk-6LJY7X5A.js +18 -0
- package/dist/chunk-6LJY7X5A.js.map +1 -0
- package/dist/{chunk-JVBO4SZL.js → chunk-6UBZ6I5Z.js} +2 -2
- package/dist/{chunk-BOKIKJJB.js → chunk-6ZNSB3H6.js} +5 -17
- package/dist/chunk-6ZNSB3H6.js.map +1 -0
- package/dist/{chunk-BMQWTQZ4.js → chunk-7YVBQJ7K.js} +13 -355
- package/dist/chunk-7YVBQJ7K.js.map +1 -0
- package/dist/{chunk-UFEVO57O.js → chunk-ABS7FMMD.js} +6 -6
- package/dist/chunk-AFHQATY4.js +47 -0
- package/dist/chunk-AFHQATY4.js.map +1 -0
- package/dist/{chunk-HOONYZY2.js → chunk-AKKRXT23.js} +7 -7
- package/dist/chunk-AKKRXT23.js.map +1 -0
- package/dist/{chunk-DDHM2TLX.js → chunk-AT2JJEKJ.js} +4 -4
- package/dist/chunk-AT2JJEKJ.js.map +1 -0
- package/dist/{chunk-M75ZZHSR.js → chunk-BLBAQRBM.js} +2 -2
- package/dist/{chunk-3SV2EPMN.js → chunk-BLCWSJLN.js} +88 -81
- package/dist/chunk-BLCWSJLN.js.map +1 -0
- package/dist/chunk-CADUYBQD.js +151 -0
- package/dist/chunk-CADUYBQD.js.map +1 -0
- package/dist/{chunk-G6EQYAL6.js → chunk-CI32CAFS.js} +5 -5
- package/dist/{chunk-FH52K7EG.js → chunk-CUZLNGD5.js} +2 -6
- package/dist/{chunk-FH52K7EG.js.map → chunk-CUZLNGD5.js.map} +1 -1
- package/dist/{chunk-2P7EGNKF.js → chunk-CXQW2NWO.js} +145 -3
- package/dist/chunk-CXQW2NWO.js.map +1 -0
- package/dist/{chunk-6B4DYGWO.js → chunk-DABACXEF.js} +3 -3
- package/dist/{chunk-F6T6L2UK.js → chunk-DMH3VZU5.js} +4 -4
- package/dist/chunk-DSDXAKIP.js +50 -0
- package/dist/chunk-DSDXAKIP.js.map +1 -0
- package/dist/{chunk-MQ6WOPSY.js → chunk-DZ2JXHWK.js} +5 -5
- package/dist/chunk-DZFQVICS.js +23 -0
- package/dist/chunk-DZFQVICS.js.map +1 -0
- package/dist/chunk-E23UGFVC.js +63 -0
- package/dist/chunk-E23UGFVC.js.map +1 -0
- package/dist/{chunk-UBNCR3YK.js → chunk-EE7UHLKH.js} +4 -4
- package/dist/chunk-EIPVYUEP.js +654 -0
- package/dist/chunk-EIPVYUEP.js.map +1 -0
- package/dist/{chunk-EGCRBCNA.js → chunk-EKRSCRNM.js} +3 -3
- package/dist/{chunk-YMUGBZN2.js → chunk-FQ5CHJR7.js} +1 -1
- package/dist/chunk-FQ5CHJR7.js.map +1 -0
- package/dist/{chunk-LB6OH6K2.js → chunk-FQZ6XTQ7.js} +17 -20
- package/dist/chunk-FQZ6XTQ7.js.map +1 -0
- package/dist/{chunk-IRQY7IR5.js → chunk-FRMPM7WG.js} +4 -4
- package/dist/{chunk-DVUZMT2W.js → chunk-G2JUIDFA.js} +9 -9
- package/dist/{chunk-DVUZMT2W.js.map → chunk-G2JUIDFA.js.map} +1 -1
- package/dist/{chunk-RND5ZPNP.js → chunk-G6WWZNJP.js} +13 -13
- package/dist/chunk-G6WWZNJP.js.map +1 -0
- package/dist/chunk-GJW4HX2O.js +1 -0
- package/dist/{chunk-T6GU5PPZ.js → chunk-GU3IP74F.js} +6 -6
- package/dist/{chunk-5OI6BR4H.js → chunk-GWWOGNBK.js} +308 -18
- package/dist/chunk-GWWOGNBK.js.map +1 -0
- package/dist/{chunk-UNCOC7QH.js → chunk-H2GPHUZD.js} +12 -13
- package/dist/chunk-H2GPHUZD.js.map +1 -0
- package/dist/{chunk-7CI6CP7Z.js → chunk-HMU5P6RL.js} +5 -5
- package/dist/chunk-HMU5P6RL.js.map +1 -0
- package/dist/{chunk-YJV2UZ7H.js → chunk-I5GEJX3R.js} +5 -5
- package/dist/chunk-I5GEJX3R.js.map +1 -0
- package/dist/{chunk-GWKAVKHI.js → chunk-IG6KUWBX.js} +2 -2
- package/dist/chunk-IG6KUWBX.js.map +1 -0
- package/dist/{chunk-MTQPRQHB.js → chunk-IPUG56GJ.js} +15 -5
- package/dist/{chunk-MTQPRQHB.js.map → chunk-IPUG56GJ.js.map} +1 -1
- package/dist/{chunk-SMIRGMS7.js → chunk-IXNCZTWA.js} +2 -2
- package/dist/{chunk-RM2XV574.js → chunk-IXTSNGYY.js} +3 -3
- package/dist/{chunk-KUPKLSX5.js → chunk-IYZISPGD.js} +7 -5
- package/dist/chunk-IYZISPGD.js.map +1 -0
- package/dist/{chunk-SMGEYW6G.js → chunk-JDOMW53O.js} +26 -16
- package/dist/chunk-JDOMW53O.js.map +1 -0
- package/dist/{chunk-PK6QCH2C.js → chunk-JJZGIE4U.js} +6 -5
- package/dist/{chunk-DRWBEDYO.js → chunk-JYJFGD2H.js} +2 -2
- package/dist/{chunk-TAGR72IR.js → chunk-KRCBZYTZ.js} +26 -177
- package/dist/chunk-KRCBZYTZ.js.map +1 -0
- package/dist/{chunk-HPUWOVR7.js → chunk-L2DGWBCT.js} +14 -14
- package/dist/chunk-L2DGWBCT.js.map +1 -0
- package/dist/{chunk-VEALDPHW.js → chunk-L3YYLT4E.js} +15 -2
- package/dist/chunk-L3YYLT4E.js.map +1 -0
- package/dist/{chunk-A7JJLVGH.js → chunk-LNPUSMZL.js} +29 -31
- package/dist/chunk-LNPUSMZL.js.map +1 -0
- package/dist/{chunk-KUIB4B5Q.js → chunk-LNZKOUJR.js} +2 -2
- package/dist/{chunk-IM3QVF53.js → chunk-MBKVNOJS.js} +6 -6
- package/dist/chunk-MCHBCNCE.js +367 -0
- package/dist/chunk-MCHBCNCE.js.map +1 -0
- package/dist/{chunk-VCBHAE4R.js → chunk-MHMLXJ3I.js} +2 -2
- package/dist/chunk-MHMLXJ3I.js.map +1 -0
- package/dist/{chunk-WNGGJWF7.js → chunk-MSMJJB4J.js} +2 -2
- package/dist/chunk-MSMJJB4J.js.map +1 -0
- package/dist/{chunk-T36RFODW.js → chunk-MXUT7FTE.js} +2 -2
- package/dist/chunk-MXUT7FTE.js.map +1 -0
- package/dist/{chunk-BGK233EA.js → chunk-N4BBNYIB.js} +11 -9
- package/dist/chunk-N4BBNYIB.js.map +1 -0
- package/dist/{chunk-3PF6CRDT.js → chunk-NFIBXF4V.js} +1082 -1583
- package/dist/chunk-NFIBXF4V.js.map +1 -0
- package/dist/{chunk-LOF2W3JU.js → chunk-NFNJLRY7.js} +368 -52
- package/dist/chunk-NFNJLRY7.js.map +1 -0
- package/dist/{chunk-N6WF5PKC.js → chunk-NFZGZ4AK.js} +2 -2
- package/dist/{chunk-JRBNCUNT.js → chunk-NGSJZFGL.js} +21 -4
- package/dist/chunk-NGSJZFGL.js.map +1 -0
- package/dist/chunk-NJ4DYYO5.js +81 -0
- package/dist/chunk-NJ4DYYO5.js.map +1 -0
- package/dist/{chunk-2IALOXZS.js → chunk-NM5UYF6Q.js} +2 -2
- package/dist/chunk-NM5UYF6Q.js.map +1 -0
- package/dist/{chunk-JBBSYJHP.js → chunk-NYEFP7DY.js} +4 -4
- package/dist/chunk-NYEFP7DY.js.map +1 -0
- package/dist/{chunk-CCOP5XDW.js → chunk-NZ24MX4J.js} +8 -46
- package/dist/chunk-NZ24MX4J.js.map +1 -0
- package/dist/{chunk-KWVJAOIN.js → chunk-OLEPKFTW.js} +4 -4
- package/dist/chunk-OLEPKFTW.js.map +1 -0
- package/dist/{chunk-OF75ACKS.js → chunk-PEATRIYJ.js} +9 -9
- package/dist/chunk-PEOZ34EM.js +13 -0
- package/dist/chunk-PEOZ34EM.js.map +1 -0
- package/dist/{chunk-UC2ETWF3.js → chunk-PTHKZWEH.js} +2 -14
- package/dist/{chunk-UC2ETWF3.js.map → chunk-PTHKZWEH.js.map} +1 -1
- package/dist/chunk-PVEWA2DU.js +23 -0
- package/dist/chunk-PVEWA2DU.js.map +1 -0
- package/dist/{chunk-LSASLXGC.js → chunk-QBAC3GXA.js} +1 -1
- package/dist/chunk-QBAC3GXA.js.map +1 -0
- package/dist/{chunk-RDXW3OBQ.js → chunk-QD46HPZG.js} +2 -2
- package/dist/chunk-QD46HPZG.js.map +1 -0
- package/dist/{chunk-N55W7KUL.js → chunk-QDIH2744.js} +2 -2
- package/dist/{chunk-6HY2X62D.js → chunk-QJNCB5SK.js} +2 -2
- package/dist/{chunk-4BRCIYFG.js → chunk-QX76XVQH.js} +6 -6
- package/dist/chunk-QX76XVQH.js.map +1 -0
- package/dist/{chunk-W2OG6JOL.js → chunk-QZWTRENR.js} +24 -7
- package/dist/chunk-QZWTRENR.js.map +1 -0
- package/dist/{chunk-6NQMXTYC.js → chunk-RO5NM6UI.js} +2 -2
- package/dist/chunk-RO5NM6UI.js.map +1 -0
- package/dist/chunk-SGDPRCC4.js +1075 -0
- package/dist/chunk-SGDPRCC4.js.map +1 -0
- package/dist/{chunk-2PCAVW2I.js → chunk-SHEEBRZ4.js} +2 -2
- package/dist/chunk-SMY5X46Z.js +14 -0
- package/dist/chunk-SMY5X46Z.js.map +1 -0
- package/dist/{chunk-ISMV2QVG.js → chunk-TG634KCO.js} +11 -2
- package/dist/chunk-TG634KCO.js.map +1 -0
- package/dist/{chunk-J6Q7UVQE.js → chunk-TUXQSFHZ.js} +4 -16
- package/dist/{chunk-J6Q7UVQE.js.map → chunk-TUXQSFHZ.js.map} +1 -1
- package/dist/{chunk-GULTLPFB.js → chunk-UADPR6F4.js} +3 -3
- package/dist/{chunk-GULTLPFB.js.map → chunk-UADPR6F4.js.map} +1 -1
- package/dist/{chunk-ZEQWCBCM.js → chunk-UDHBXYGG.js} +27 -5
- package/dist/chunk-UDHBXYGG.js.map +1 -0
- package/dist/{chunk-RA5VTXXG.js → chunk-V6UQZA2H.js} +2 -2
- package/dist/chunk-VG2ZSFYD.js +32 -0
- package/dist/chunk-VG2ZSFYD.js.map +1 -0
- package/dist/chunk-VKQCVU2Z.js +21 -0
- package/dist/chunk-VKQCVU2Z.js.map +1 -0
- package/dist/{chunk-QDPZWTN2.js → chunk-W3G5REIU.js} +2 -2
- package/dist/{chunk-WEYZTLXN.js → chunk-W3L64Y3J.js} +2 -2
- package/dist/{chunk-ONTBCHCP.js → chunk-W66AM5IB.js} +2 -2
- package/dist/chunk-W66AM5IB.js.map +1 -0
- package/dist/{chunk-A5BDDEXK.js → chunk-WBKZUO5V.js} +26 -43
- package/dist/chunk-WBKZUO5V.js.map +1 -0
- package/dist/{chunk-CBSY2N76.js → chunk-WLXMTYGO.js} +2 -2
- package/dist/{chunk-3U3FBR7O.js → chunk-X3F5YJG2.js} +2 -2
- package/dist/{chunk-GQNGCEP5.js → chunk-X45JYIAY.js} +3 -3
- package/dist/chunk-X45JYIAY.js.map +1 -0
- package/dist/{chunk-6XE5TMPR.js → chunk-X4MVWPHV.js} +3 -3
- package/dist/chunk-X4MVWPHV.js.map +1 -0
- package/dist/chunk-XZHEOSQ2.js +16 -0
- package/dist/chunk-XZHEOSQ2.js.map +1 -0
- package/dist/chunk-Y2NBBT6K.js +18 -0
- package/dist/chunk-Y2NBBT6K.js.map +1 -0
- package/dist/{chunk-DDATL6PU.js → chunk-Y2NJBNX3.js} +8 -8
- package/dist/{chunk-DDATL6PU.js.map → chunk-Y2NJBNX3.js.map} +1 -1
- package/dist/chunk-YMUFFJCO.js +23 -0
- package/dist/chunk-YMUFFJCO.js.map +1 -0
- package/dist/{chunk-O7WJ47EF.js → chunk-YWWQM7KP.js} +5 -14
- package/dist/chunk-YWWQM7KP.js.map +1 -0
- package/dist/{chunk-7O3AYBC7.js → chunk-YZJSJOUI.js} +235 -65
- package/dist/chunk-YZJSJOUI.js.map +1 -0
- package/dist/{chunk-5WZXVULX.js → chunk-ZTLOXFPB.js} +2 -2
- package/dist/chunk-ZTLOXFPB.js.map +1 -0
- package/dist/classified/index.js +5 -5
- package/dist/{classified-marker-WQVIJAW2.js → classified-marker-7PKJBFCG.js} +3 -3
- package/dist/collection-facade-6I5K5IOD.js +45 -0
- package/dist/{computed-DSMPXG2Y.js → computed-AB45PS4V.js} +3 -3
- package/dist/consent/index.js +13 -9
- package/dist/consent/index.js.map +1 -1
- package/dist/cover/index.js +37 -0
- package/dist/crdt/index.js +4 -0
- package/dist/crdt/index.js.map +1 -1
- package/dist/custody/index.js +26 -0
- package/dist/{dead-filter-2A7IAJ3D.js → dead-filter-FL3WIUZS.js} +2 -2
- package/dist/{chunk-GYYCX5K6.js → delegation-QXZ4MPPH.js} +12 -6
- package/dist/{chunk-GYYCX5K6.js.map → delegation-QXZ4MPPH.js.map} +1 -1
- package/dist/derivations/index.js +12 -12
- package/dist/derive-VGS7FKE3.js +22 -0
- package/dist/directory/index.js +46 -0
- package/dist/dispatch-EGGC7UD7.js +72 -0
- package/dist/dispatch-EGGC7UD7.js.map +1 -0
- package/dist/dispatch-GDSTUTVP.js +194 -0
- package/dist/dispatch-GDSTUTVP.js.map +1 -0
- package/dist/{enclave-7MW6ZGXW.js → enclave-SPEEDYZ4.js} +11 -11
- package/dist/executor-IEBLTBCW.js +9 -0
- package/dist/executor-OTF556PL.js +28 -0
- package/dist/executor-RM7XWQDU.js +9 -0
- package/dist/export-accessible-P42BQ4PB.js +23 -0
- package/dist/extract-partition-TCYXRWBN.js +38 -0
- package/dist/{fanout-sidecar-WDYQ77VB.js → fanout-sidecar-SSMRSC2L.js} +9 -9
- package/dist/find-OZMTRIK3.js +11 -0
- package/dist/forget/index.js +11 -11
- package/dist/forget/index.js.map +1 -1
- package/dist/guards/index.js +6 -6
- package/dist/history/index.js +16 -12
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.js +16 -14
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.d.ts +42 -42
- package/dist/index.js +330 -2106
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.js +4 -2
- package/dist/indexing/index.js.map +1 -1
- package/dist/introspection/index.js +28 -0
- package/dist/issue-FCKN5O6C.js +19 -0
- package/dist/kernel/best-effort-revert.d.ts +9 -1
- package/dist/kernel/collection-config.d.ts +12 -70
- package/dist/kernel/collection.d.ts +11 -23
- package/dist/kernel/enclave/crypto.d.ts +8 -8
- package/dist/kernel/enclave/index.d.ts +3 -3
- package/dist/kernel/errors.d.ts +41 -22
- package/dist/kernel/lazy.d.ts +30 -0
- package/dist/kernel/noydb.d.ts +81 -124
- package/dist/kernel/query/builder.d.ts +10 -10
- package/dist/kernel/query/index.d.ts +0 -6
- package/dist/kernel/query/scan-builder.d.ts +4 -4
- package/dist/kernel/sync-policy.d.ts +76 -4
- package/dist/kernel/types.d.ts +146 -86
- package/dist/kernel/validation.d.ts +33 -33
- package/dist/kernel/vault.d.ts +41 -229
- package/dist/kernel/via/dispatch.d.ts +7 -0
- package/dist/{ledger-33BC4TR7.js → ledger-6XBEVWYP.js} +11 -11
- package/dist/liberate-CYUOS4NC.js +24 -0
- package/dist/{link-set-QK22TDEX.js → link-set-NK6L2A5S.js} +11 -11
- package/dist/materialized-views/index.js +22 -19
- package/dist/money/index.js +31 -0
- package/dist/noydb-FZZIMLCI.js +81 -0
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.js +15 -13
- package/dist/pod/index.js +26 -12
- package/dist/{policy-NAHB2TUT.js → policy/index.js} +6 -6
- package/dist/port/with/archive-strategy.d.ts +31 -0
- package/dist/port/with/blob-strategy.d.ts +15 -5
- package/dist/port/with/collection-options.d.ts +171 -0
- package/dist/port/with/collection-registries.d.ts +62 -0
- package/dist/port/with/strategies.d.ts +134 -0
- package/dist/port/with/team-strategy.d.ts +3 -2
- package/dist/portability/index.js +8 -8
- package/dist/{post-register-JVTMJ6OW.js → post-register-VFIYISUK.js} +6 -6
- package/dist/query/index.js +6 -46
- package/dist/{aggregate → reduce}/index.js +24 -17
- package/dist/reduce/index.js.map +1 -0
- package/dist/register-UKU2J6MN.js +25 -0
- package/dist/registry-2VCWVHZS.js +19 -0
- package/dist/registry-7Y5WF7GS.js +9 -0
- package/dist/{registry-VW6P6A3J.js → registry-BWD2ED52.js} +2 -2
- package/dist/registry-DTWRJLSF.js +18 -0
- package/dist/request-withdrawal-JYDZ5XY2.js +31 -0
- package/dist/{reveal-LGBOM2BO.js → reveal-CL2BCW6A.js} +6 -6
- package/dist/revoke-2TSAD2T4.js +24 -0
- package/dist/satellites/index.js +1 -1
- package/dist/schema-update/index.js +26 -0
- package/dist/sealed-record/index.js +12 -12
- package/dist/search/index.js +36 -0
- package/dist/{seed-PWK45HDF.js → seed-NUVJEL7T.js} +12 -12
- package/dist/seed-NUVJEL7T.js.map +1 -0
- package/dist/sequence/index.js +30 -0
- package/dist/session/index.js +13 -9
- package/dist/session/index.js.map +1 -1
- package/dist/shadow/index.js +6 -2
- package/dist/shadow/index.js.map +1 -1
- package/dist/signer-K7Z2EOMG.js +25 -0
- package/dist/snapshots/index.js +14 -10
- package/dist/snapshots/index.js.map +1 -1
- package/dist/{stale-FJED42DM.js → stale-A4J26OIC.js} +11 -10
- package/dist/storage-YVHZUISN.js +23 -0
- package/dist/store/index.js +22 -0
- package/dist/{store-coordination-provider-APODTV4W.js → store-coordination-provider-EWRZL7XF.js} +3 -3
- package/dist/sync/index.js +15 -12
- package/dist/sync/index.js.map +1 -1
- package/dist/team/index.js +33 -48
- package/dist/tiers/index.js +10 -10
- package/dist/to/index.js +1 -1
- package/dist/{tx → transactions}/index.js +7 -3
- package/dist/transactions/index.js.map +1 -0
- package/dist/util/index.js +1 -1
- package/dist/{verify-26Y5GNMK.js → verify-7XWHJWUN.js} +5 -5
- package/dist/via/blob/active.d.ts +23 -7
- package/dist/via/blob/binding.d.ts +1 -1
- package/dist/via/blob/index.d.ts +7 -1
- package/dist/via/i18n/core.d.ts +1 -1
- package/dist/via/i18n/index.d.ts +2 -0
- package/dist/via/money/money-reducer.d.ts +2 -2
- package/dist/walk-P5D6CF4V.js +21 -0
- package/dist/with-audit/consent/index.d.ts +2 -0
- package/dist/with-audit/forget/active.d.ts +3 -3
- package/dist/with-audit/forget/index.d.ts +6 -5
- package/dist/with-audit/forget/strategy.d.ts +3 -3
- package/dist/with-audit/guards/executor.d.ts +4 -4
- package/dist/with-audit/guards/immutable-guard.d.ts +3 -3
- package/dist/with-audit/guards/index.d.ts +1 -1
- package/dist/with-audit/guards/registry.d.ts +3 -3
- package/dist/with-audit/guards/transition-guard.d.ts +3 -3
- package/dist/with-audit/guards/types.d.ts +10 -10
- package/dist/with-audit/guards/with-guard.d.ts +2 -2
- package/dist/with-audit/periods/index.d.ts +2 -0
- package/dist/with-audit/periods/vault-facade.d.ts +6 -0
- package/dist/with-audit/portability/export-accessible.d.ts +4 -4
- package/dist/with-audit/portability/request-withdrawal.d.ts +3 -3
- package/dist/with-audit/portability/withdraw-accessible.d.ts +2 -2
- package/dist/with-audit/sealed-record/strategy.d.ts +1 -1
- package/dist/with-audit/tiers/index.d.ts +1 -0
- package/dist/with-cargo/adopt-partition.d.ts +7 -7
- package/dist/{legacy/kernel.d.ts → with-cargo/floor.d.ts} +4 -4
- package/dist/with-cargo/index.d.ts +9 -2
- package/dist/with-commit/crdt/index.d.ts +2 -0
- package/dist/with-commit/history/index.d.ts +2 -0
- package/dist/with-commit/history/time-machine.d.ts +2 -2
- package/dist/with-commit/numbering/descriptor.d.ts +16 -6
- package/dist/with-commit/tx/active.d.ts +5 -5
- package/dist/with-commit/tx/index.d.ts +2 -2
- package/dist/with-commit/tx/invariants.d.ts +1 -1
- package/dist/with-commit/tx/strategy.d.ts +3 -3
- package/dist/with-fork/shadow/index.d.ts +2 -0
- package/dist/with-fork/snapshots/active.d.ts +2 -2
- package/dist/with-fork/snapshots/index.d.ts +3 -1
- package/dist/with-fork/snapshots/noydb-facade.d.ts +3 -3
- package/dist/with-fork/snapshots/strategy.d.ts +2 -2
- package/dist/with-formula/derivations/dispatch.d.ts +98 -0
- package/dist/with-formula/derivations/executor.d.ts +2 -2
- package/dist/with-formula/derivations/index.d.ts +4 -1
- package/dist/with-formula/derivations/registry.d.ts +3 -3
- package/dist/with-formula/derivations/stale.d.ts +2 -2
- package/dist/with-formula/derivations/types.d.ts +3 -3
- package/dist/with-formula/derivations/with-derivation.d.ts +2 -2
- package/dist/with-formula/derivations/with-rollup.d.ts +15 -8
- package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +3 -3
- package/dist/with-formula/materialized-views/dispatch.d.ts +75 -0
- package/dist/with-formula/materialized-views/index.d.ts +2 -1
- package/dist/with-formula/materialized-views/registry.d.ts +4 -4
- package/dist/with-formula/materialized-views/types.d.ts +11 -11
- package/dist/with-formula/materialized-views/with-materialized-view.d.ts +2 -2
- package/dist/with-formula/overlay-views/index.d.ts +1 -1
- package/dist/with-formula/overlay-views/registry.d.ts +4 -4
- package/dist/with-formula/overlay-views/types.d.ts +3 -3
- package/dist/with-formula/overlay-views/virtual-collection.d.ts +2 -2
- package/dist/with-formula/overlay-views/with-overlayed-view.d.ts +2 -2
- package/dist/with-lookup/indexing/active.d.ts +5 -5
- package/dist/with-lookup/indexing/index.d.ts +3 -1
- package/dist/with-lookup/indexing/strategy.d.ts +3 -3
- package/dist/with-lookup/{aggregate → reduce}/active.d.ts +8 -8
- package/dist/with-lookup/{aggregate → reduce}/groupby.d.ts +21 -21
- package/dist/with-lookup/reduce/index.d.ts +34 -0
- package/dist/with-lookup/{aggregate → reduce}/reducers.d.ts +11 -12
- package/dist/with-lookup/{aggregate/aggregation.d.ts → reduce/reduction.d.ts} +21 -21
- package/dist/with-lookup/{aggregate → reduce}/strategy.d.ts +15 -15
- package/dist/with-lookup/search/build-docs.d.ts +7 -2
- package/dist/with-lookup/search/index.d.ts +1 -1
- package/dist/with-party/broker/index.d.ts +1 -0
- package/dist/with-party/broker/seed.d.ts +1 -1
- package/dist/with-party/custody/liberate.d.ts +3 -3
- package/dist/with-party/directory/cover/index.d.ts +1 -5
- package/dist/with-party/directory/cover/schema.d.ts +0 -6
- package/dist/with-party/directory/cover/storage.d.ts +0 -8
- package/dist/with-party/directory/cover/types.d.ts +0 -21
- package/dist/with-party/directory/index.d.ts +2 -0
- package/dist/with-party/session/dev-unlock.d.ts +2 -2
- package/dist/with-party/session/index.d.ts +2 -0
- package/dist/with-party/session/session.d.ts +2 -2
- package/dist/with-party/team/deed.d.ts +8 -8
- package/dist/with-party/team/index.d.ts +4 -7
- package/dist/with-party/team/keyring.d.ts +83 -35
- package/dist/with-party/team/{managed-passphrase.d.ts → managed-secret.d.ts} +27 -27
- package/dist/with-party/team/noydb-facade.d.ts +43 -42
- package/dist/with-party/team/peer-recover.d.ts +13 -13
- package/dist/with-party/team/recovery.d.ts +5 -5
- package/dist/with-party/team/rotate-recover.d.ts +30 -30
- package/dist/with-pod/bundle.d.ts +30 -32
- package/dist/with-pod/format.d.ts +2 -2
- package/dist/with-pod/index.d.ts +2 -1
- package/dist/with-shape/blobs/blob-compaction.d.ts +43 -3
- package/dist/with-shape/blobs/blob-pinning.d.ts +112 -0
- package/dist/with-shape/blobs/blob-set.d.ts +86 -2
- package/dist/with-shape/introspection/index.d.ts +6 -0
- package/dist/with-shape/schema-update/index.d.ts +1 -0
- package/dist/with-store/index.d.ts +3 -2
- package/dist/with-store/route-store.d.ts +1 -1
- package/dist/{with-party/team/sync-active.d.ts → with-sync/active.d.ts} +1 -1
- package/dist/{with-party/team/sync-credentials.d.ts → with-sync/credentials.d.ts} +3 -3
- package/dist/{with-party/team/sync.d.ts → with-sync/engine.d.ts} +5 -5
- package/dist/{with-party/sync → with-sync}/index.d.ts +4 -2
- package/dist/{with-party/team/sync-period-scope.d.ts → with-sync/period-scope.d.ts} +2 -2
- package/dist/{with-party/team → with-sync}/presence.d.ts +2 -2
- package/dist/{with-party/team/sync-strategy.d.ts → with-sync/strategy.d.ts} +6 -6
- package/dist/{with-party/team/sync-transaction.d.ts → with-sync/transaction.d.ts} +3 -3
- package/dist/withdraw-accessible-A2PWF5MZ.js +28 -0
- package/package.json +45 -36
- package/dist/aggregate/index.js.map +0 -1
- package/dist/api-IQFZJSQO.js +0 -20
- package/dist/as/index.js +0 -30
- package/dist/at/index.js +0 -1
- package/dist/bundle/index.js +0 -105
- package/dist/by/index.js +0 -11
- package/dist/chunk-2IALOXZS.js.map +0 -1
- package/dist/chunk-2MUZ3LY6.js +0 -205
- package/dist/chunk-2MUZ3LY6.js.map +0 -1
- package/dist/chunk-2P7EGNKF.js.map +0 -1
- package/dist/chunk-3PF6CRDT.js.map +0 -1
- package/dist/chunk-3SV2EPMN.js.map +0 -1
- package/dist/chunk-4BRCIYFG.js.map +0 -1
- package/dist/chunk-5OI6BR4H.js.map +0 -1
- package/dist/chunk-5WZXVULX.js.map +0 -1
- package/dist/chunk-6NQMXTYC.js.map +0 -1
- package/dist/chunk-6XE5TMPR.js.map +0 -1
- package/dist/chunk-7CI6CP7Z.js.map +0 -1
- package/dist/chunk-7O3AYBC7.js.map +0 -1
- package/dist/chunk-A5BDDEXK.js.map +0 -1
- package/dist/chunk-A7JJLVGH.js.map +0 -1
- package/dist/chunk-BGK233EA.js.map +0 -1
- package/dist/chunk-BMQWTQZ4.js.map +0 -1
- package/dist/chunk-BOKIKJJB.js.map +0 -1
- package/dist/chunk-CCOP5XDW.js.map +0 -1
- package/dist/chunk-CHFZDSE4.js +0 -1
- package/dist/chunk-DDHM2TLX.js.map +0 -1
- package/dist/chunk-GQNGCEP5.js.map +0 -1
- package/dist/chunk-GVZQ4NAM.js +0 -14
- package/dist/chunk-GVZQ4NAM.js.map +0 -1
- package/dist/chunk-GWKAVKHI.js.map +0 -1
- package/dist/chunk-HOONYZY2.js.map +0 -1
- package/dist/chunk-HPUWOVR7.js.map +0 -1
- package/dist/chunk-ISMV2QVG.js.map +0 -1
- package/dist/chunk-JBBSYJHP.js.map +0 -1
- package/dist/chunk-JRBNCUNT.js.map +0 -1
- package/dist/chunk-JZWWLLVY.js +0 -99
- package/dist/chunk-JZWWLLVY.js.map +0 -1
- package/dist/chunk-KUPKLSX5.js.map +0 -1
- package/dist/chunk-KWVJAOIN.js.map +0 -1
- package/dist/chunk-LB6OH6K2.js.map +0 -1
- package/dist/chunk-LB7FD65R.js +0 -163
- package/dist/chunk-LB7FD65R.js.map +0 -1
- package/dist/chunk-LOF2W3JU.js.map +0 -1
- package/dist/chunk-LSASLXGC.js.map +0 -1
- package/dist/chunk-O7WJ47EF.js.map +0 -1
- package/dist/chunk-ONTBCHCP.js.map +0 -1
- package/dist/chunk-PT37L5DV.js +0 -255
- package/dist/chunk-PT37L5DV.js.map +0 -1
- package/dist/chunk-RDXW3OBQ.js.map +0 -1
- package/dist/chunk-RND5ZPNP.js.map +0 -1
- package/dist/chunk-S3BFKGET.js.map +0 -1
- package/dist/chunk-SMGEYW6G.js.map +0 -1
- package/dist/chunk-T36RFODW.js.map +0 -1
- package/dist/chunk-TAGR72IR.js.map +0 -1
- package/dist/chunk-UNCOC7QH.js.map +0 -1
- package/dist/chunk-VCBHAE4R.js.map +0 -1
- package/dist/chunk-VEALDPHW.js.map +0 -1
- package/dist/chunk-VQNJ7UZL.js.map +0 -1
- package/dist/chunk-W2OG6JOL.js.map +0 -1
- package/dist/chunk-WNGGJWF7.js.map +0 -1
- package/dist/chunk-YJV2UZ7H.js.map +0 -1
- package/dist/chunk-YMUGBZN2.js.map +0 -1
- package/dist/chunk-YTGDPCPW.js.map +0 -1
- package/dist/chunk-ZEQWCBCM.js.map +0 -1
- package/dist/collection-facade-MJXSC3Q6.js +0 -44
- package/dist/cover-B5SJDHR3.js +0 -52
- package/dist/delegation-A5A75KQO.js +0 -25
- package/dist/derive-HJSMH7RA.js +0 -21
- package/dist/executor-AXE4XMLT.js +0 -26
- package/dist/executor-KGNLJD6M.js +0 -9
- package/dist/executor-XGIS6CR7.js +0 -9
- package/dist/export-accessible-VVBJM3MM.js +0 -23
- package/dist/extract-partition-LGGBTQET.js +0 -38
- package/dist/find-YS6XWB46.js +0 -11
- package/dist/in/index.js +0 -1
- package/dist/issue-LSR5PS6H.js +0 -19
- package/dist/legacy/bundle.d.ts +0 -30
- package/dist/liberate-GBSAYLPJ.js +0 -24
- package/dist/noydb-MTUBMWFE.js +0 -70
- package/dist/on/index.js +0 -17
- package/dist/port/as/index.d.ts +0 -26
- package/dist/port/at/index.d.ts +0 -18
- package/dist/port/in/index.d.ts +0 -21
- package/dist/port/on/index.d.ts +0 -27
- package/dist/port/ui/index.d.ts +0 -21
- package/dist/port/with/index.d.ts +0 -18
- package/dist/register-X462DNDM.js +0 -23
- package/dist/registry-3XMCT7MQ.js +0 -18
- package/dist/registry-KHD2I3M2.js +0 -19
- package/dist/registry-NPOWJHC4.js +0 -9
- package/dist/request-withdrawal-U7K3JTMY.js +0 -31
- package/dist/revoke-OCWDSWRQ.js +0 -24
- package/dist/seed-PWK45HDF.js.map +0 -1
- package/dist/signer-3YFBLZRN.js +0 -25
- package/dist/storage-W3GURVFU.js +0 -23
- package/dist/tx/index.js.map +0 -1
- package/dist/ui/index.js +0 -1
- package/dist/with/index.js +0 -31
- package/dist/with-lookup/aggregate/index.d.ts +0 -23
- package/dist/withdraw-accessible-Y3B2535F.js +0 -28
- /package/dist/{api-IQFZJSQO.js.map → api-ZDKTWNBB.js.map} +0 -0
- /package/dist/{backup-LU2DTZTI.js.map → backup-2UX7PRM5.js.map} +0 -0
- /package/dist/{chunk-IY23KFNZ.js.map → chunk-35NMVJ7I.js.map} +0 -0
- /package/dist/{chunk-RTEK4C4I.js.map → chunk-4JQK3L4V.js.map} +0 -0
- /package/dist/{chunk-3ELCWU56.js.map → chunk-4ZKNC6A6.js.map} +0 -0
- /package/dist/{chunk-VAIS3SOM.js.map → chunk-55LX6FSX.js.map} +0 -0
- /package/dist/{chunk-6HPG2YNX.js.map → chunk-5DRROK5W.js.map} +0 -0
- /package/dist/{chunk-S6Q37VGE.js.map → chunk-5GQEU4DN.js.map} +0 -0
- /package/dist/{chunk-TOPYT5U5.js.map → chunk-63FE525P.js.map} +0 -0
- /package/dist/{chunk-JVBO4SZL.js.map → chunk-6UBZ6I5Z.js.map} +0 -0
- /package/dist/{chunk-UFEVO57O.js.map → chunk-ABS7FMMD.js.map} +0 -0
- /package/dist/{chunk-M75ZZHSR.js.map → chunk-BLBAQRBM.js.map} +0 -0
- /package/dist/{chunk-G6EQYAL6.js.map → chunk-CI32CAFS.js.map} +0 -0
- /package/dist/{chunk-6B4DYGWO.js.map → chunk-DABACXEF.js.map} +0 -0
- /package/dist/{chunk-F6T6L2UK.js.map → chunk-DMH3VZU5.js.map} +0 -0
- /package/dist/{chunk-MQ6WOPSY.js.map → chunk-DZ2JXHWK.js.map} +0 -0
- /package/dist/{chunk-UBNCR3YK.js.map → chunk-EE7UHLKH.js.map} +0 -0
- /package/dist/{chunk-EGCRBCNA.js.map → chunk-EKRSCRNM.js.map} +0 -0
- /package/dist/{chunk-IRQY7IR5.js.map → chunk-FRMPM7WG.js.map} +0 -0
- /package/dist/{as/index.js.map → chunk-GJW4HX2O.js.map} +0 -0
- /package/dist/{chunk-T6GU5PPZ.js.map → chunk-GU3IP74F.js.map} +0 -0
- /package/dist/{chunk-SMIRGMS7.js.map → chunk-IXNCZTWA.js.map} +0 -0
- /package/dist/{chunk-RM2XV574.js.map → chunk-IXTSNGYY.js.map} +0 -0
- /package/dist/{chunk-PK6QCH2C.js.map → chunk-JJZGIE4U.js.map} +0 -0
- /package/dist/{chunk-DRWBEDYO.js.map → chunk-JYJFGD2H.js.map} +0 -0
- /package/dist/{chunk-KUIB4B5Q.js.map → chunk-LNZKOUJR.js.map} +0 -0
- /package/dist/{chunk-IM3QVF53.js.map → chunk-MBKVNOJS.js.map} +0 -0
- /package/dist/{chunk-N6WF5PKC.js.map → chunk-NFZGZ4AK.js.map} +0 -0
- /package/dist/{chunk-OF75ACKS.js.map → chunk-PEATRIYJ.js.map} +0 -0
- /package/dist/{chunk-N55W7KUL.js.map → chunk-QDIH2744.js.map} +0 -0
- /package/dist/{chunk-6HY2X62D.js.map → chunk-QJNCB5SK.js.map} +0 -0
- /package/dist/{chunk-2PCAVW2I.js.map → chunk-SHEEBRZ4.js.map} +0 -0
- /package/dist/{chunk-RA5VTXXG.js.map → chunk-V6UQZA2H.js.map} +0 -0
- /package/dist/{chunk-QDPZWTN2.js.map → chunk-W3G5REIU.js.map} +0 -0
- /package/dist/{chunk-WEYZTLXN.js.map → chunk-W3L64Y3J.js.map} +0 -0
- /package/dist/{chunk-CBSY2N76.js.map → chunk-WLXMTYGO.js.map} +0 -0
- /package/dist/{chunk-3U3FBR7O.js.map → chunk-X3F5YJG2.js.map} +0 -0
- /package/dist/{classified-marker-WQVIJAW2.js.map → classified-marker-7PKJBFCG.js.map} +0 -0
- /package/dist/{at/index.js.map → collection-facade-6I5K5IOD.js.map} +0 -0
- /package/dist/{bundle/index.js.map → computed-AB45PS4V.js.map} +0 -0
- /package/dist/{by → cover}/index.js.map +0 -0
- /package/dist/{in → custody}/index.js.map +0 -0
- /package/dist/{dead-filter-2A7IAJ3D.js.map → dead-filter-FL3WIUZS.js.map} +0 -0
- /package/dist/{chunk-CHFZDSE4.js.map → derive-VGS7FKE3.js.map} +0 -0
- /package/dist/{on → directory}/index.js.map +0 -0
- /package/dist/{collection-facade-MJXSC3Q6.js.map → enclave-SPEEDYZ4.js.map} +0 -0
- /package/dist/{computed-DSMPXG2Y.js.map → executor-IEBLTBCW.js.map} +0 -0
- /package/dist/{cover-B5SJDHR3.js.map → executor-OTF556PL.js.map} +0 -0
- /package/dist/{delegation-A5A75KQO.js.map → executor-RM7XWQDU.js.map} +0 -0
- /package/dist/{derive-HJSMH7RA.js.map → export-accessible-P42BQ4PB.js.map} +0 -0
- /package/dist/{enclave-7MW6ZGXW.js.map → extract-partition-TCYXRWBN.js.map} +0 -0
- /package/dist/{fanout-sidecar-WDYQ77VB.js.map → fanout-sidecar-SSMRSC2L.js.map} +0 -0
- /package/dist/{executor-AXE4XMLT.js.map → find-OZMTRIK3.js.map} +0 -0
- /package/dist/{ui → introspection}/index.js.map +0 -0
- /package/dist/{executor-KGNLJD6M.js.map → issue-FCKN5O6C.js.map} +0 -0
- /package/dist/{executor-XGIS6CR7.js.map → ledger-6XBEVWYP.js.map} +0 -0
- /package/dist/{export-accessible-VVBJM3MM.js.map → liberate-CYUOS4NC.js.map} +0 -0
- /package/dist/{extract-partition-LGGBTQET.js.map → link-set-NK6L2A5S.js.map} +0 -0
- /package/dist/{with → money}/index.js.map +0 -0
- /package/dist/{find-YS6XWB46.js.map → noydb-FZZIMLCI.js.map} +0 -0
- /package/dist/{issue-LSR5PS6H.js.map → policy/index.js.map} +0 -0
- /package/dist/{post-register-JVTMJ6OW.js.map → post-register-VFIYISUK.js.map} +0 -0
- /package/dist/{ledger-33BC4TR7.js.map → register-UKU2J6MN.js.map} +0 -0
- /package/dist/{liberate-GBSAYLPJ.js.map → registry-2VCWVHZS.js.map} +0 -0
- /package/dist/{link-set-QK22TDEX.js.map → registry-7Y5WF7GS.js.map} +0 -0
- /package/dist/{noydb-MTUBMWFE.js.map → registry-BWD2ED52.js.map} +0 -0
- /package/dist/{policy-NAHB2TUT.js.map → registry-DTWRJLSF.js.map} +0 -0
- /package/dist/{register-X462DNDM.js.map → request-withdrawal-JYDZ5XY2.js.map} +0 -0
- /package/dist/{reveal-LGBOM2BO.js.map → reveal-CL2BCW6A.js.map} +0 -0
- /package/dist/{registry-3XMCT7MQ.js.map → revoke-2TSAD2T4.js.map} +0 -0
- /package/dist/{registry-KHD2I3M2.js.map → schema-update/index.js.map} +0 -0
- /package/dist/{registry-NPOWJHC4.js.map → search/index.js.map} +0 -0
- /package/dist/{registry-VW6P6A3J.js.map → sequence/index.js.map} +0 -0
- /package/dist/{request-withdrawal-U7K3JTMY.js.map → signer-K7Z2EOMG.js.map} +0 -0
- /package/dist/{revoke-OCWDSWRQ.js.map → stale-A4J26OIC.js.map} +0 -0
- /package/dist/{signer-3YFBLZRN.js.map → storage-YVHZUISN.js.map} +0 -0
- /package/dist/{stale-FJED42DM.js.map → store/index.js.map} +0 -0
- /package/dist/{store-coordination-provider-APODTV4W.js.map → store-coordination-provider-EWRZL7XF.js.map} +0 -0
- /package/dist/{verify-26Y5GNMK.js.map → verify-7XWHJWUN.js.map} +0 -0
- /package/dist/{storage-W3GURVFU.js.map → walk-P5D6CF4V.js.map} +0 -0
- /package/dist/with-lookup/{aggregate → reduce}/canonical-key.d.ts +0 -0
- /package/dist/{with-party → with-sync}/tab-coordination.d.ts +0 -0
- /package/dist/{with-party → with-sync}/tab-write-relay.d.ts +0 -0
- /package/dist/{withdraw-accessible-Y3B2535F.js.map → withdraw-accessible-A2PWF5MZ.js.map} +0 -0
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
* **Why split read/load?** `readPod` returns the
|
|
27
27
|
* *unwrapped JSON string*, not a Vault object. The caller
|
|
28
28
|
* is responsible for piping that JSON into
|
|
29
|
-
* `vault.load(json,
|
|
30
|
-
* keeps the bundle module free of any crypto/
|
|
29
|
+
* `vault.load(json, secret)`. Splitting the layers
|
|
30
|
+
* keeps the bundle module free of any crypto/secret
|
|
31
31
|
* concerns — it's purely a format layer. The same `readPod`
|
|
32
32
|
* call can also feed verification tools, format inspectors, or
|
|
33
33
|
* archive utilities that don't care about decryption.
|
|
@@ -36,18 +36,18 @@ import { type NoydbPodHeader } from './format.js';
|
|
|
36
36
|
import type { Vault } from '../kernel/vault.js';
|
|
37
37
|
import type { BundleRecipient } from '../with-party/team/keyring.js';
|
|
38
38
|
import type { Cover } from '../with-party/directory/cover/types.js';
|
|
39
|
-
import type { SealingKeyProvider, RecipientSealer, RecipientHint } from '../with-party/team/managed-
|
|
39
|
+
import type { SealingKeyProvider, RecipientSealer, RecipientHint } from '../with-party/team/managed-secret.js';
|
|
40
40
|
/**
|
|
41
41
|
* The credential kinds that can be bundled for auto-unlock.
|
|
42
42
|
* WebAuthn is intentionally excluded — it is hardware-bound and
|
|
43
43
|
* cannot be embedded as a portable credential.
|
|
44
44
|
*/
|
|
45
|
-
export type AutoCredentialKind = '
|
|
45
|
+
export type AutoCredentialKind = 'secret' | 'password' | 'pin';
|
|
46
46
|
/**
|
|
47
47
|
* A typed credential for auto-unlock. Carries the credential `kind`
|
|
48
48
|
* alongside the plaintext `value`, so consumers can dispatch the
|
|
49
49
|
* correct login/prefill path rather than treating all credentials
|
|
50
|
-
* as
|
|
50
|
+
* as secrets.
|
|
51
51
|
*
|
|
52
52
|
* `bundle.ts` is a pure format layer — it carries the credential
|
|
53
53
|
* without interpreting it. The consumer is responsible for
|
|
@@ -112,17 +112,17 @@ export interface WritePodOptions {
|
|
|
112
112
|
/**
|
|
113
113
|
* Single-recipient re-keying shorthand. When set, the
|
|
114
114
|
* bundle's keyring is replaced with one freshly-derived entry sealed
|
|
115
|
-
* with this
|
|
115
|
+
* with this secret. The recipient inherits the source keyring's
|
|
116
116
|
* userId, role, and permissions. Mutually exclusive with `recipients`.
|
|
117
117
|
*/
|
|
118
|
-
readonly
|
|
118
|
+
readonly exportSecret?: string;
|
|
119
119
|
/**
|
|
120
120
|
* Multi-recipient re-keying. Replaces the bundle's keyring
|
|
121
121
|
* map with one slot per recipient, each sealed with its own
|
|
122
|
-
*
|
|
122
|
+
* secret. DEKs are unwrapped from the source keyring once and
|
|
123
123
|
* re-wrapped per recipient — record ciphertext is unchanged.
|
|
124
124
|
*
|
|
125
|
-
* Mutually exclusive with `
|
|
125
|
+
* Mutually exclusive with `exportSecret`. When neither is set,
|
|
126
126
|
* the bundle inherits the source keyring as-is (today's behaviour,
|
|
127
127
|
* suited to personal backup-and-restore).
|
|
128
128
|
*/
|
|
@@ -130,8 +130,8 @@ export interface WritePodOptions {
|
|
|
130
130
|
/**
|
|
131
131
|
* Auto-unlock — unsealed per-user credentials.
|
|
132
132
|
*
|
|
133
|
-
* Generalises `
|
|
134
|
-
* kind (`
|
|
133
|
+
* Generalises `autoSecrets` to support any bundleable credential
|
|
134
|
+
* kind (`secret` | `password` | `pin`).
|
|
135
135
|
*
|
|
136
136
|
* Public-by-design: anyone holding the bundle bytes can read these
|
|
137
137
|
* plaintext credentials. Use for demo data, sample vaults,
|
|
@@ -141,8 +141,8 @@ export interface WritePodOptions {
|
|
|
141
141
|
* bare `{ perUser }` without it is rejected at write time — the
|
|
142
142
|
* safety net against a careless call against a production vault.
|
|
143
143
|
*
|
|
144
|
-
* Mutually exclusive with `sealedCredentials`, `
|
|
145
|
-
* and `
|
|
144
|
+
* Mutually exclusive with `sealedCredentials`, `autoSecrets`,
|
|
145
|
+
* and `sealedSecrets`.
|
|
146
146
|
*/
|
|
147
147
|
readonly autoCredentials?: {
|
|
148
148
|
readonly policy: 'public-by-design';
|
|
@@ -152,8 +152,8 @@ export interface WritePodOptions {
|
|
|
152
152
|
* Auto-unlock — per-user credentials sealed under a
|
|
153
153
|
* {@link SealingKeyProvider}.
|
|
154
154
|
*
|
|
155
|
-
* Generalises `
|
|
156
|
-
* credential kind (`
|
|
155
|
+
* Generalises `sealedSecrets` to support any bundleable
|
|
156
|
+
* credential kind (`secret` | `password` | `pin`).
|
|
157
157
|
*
|
|
158
158
|
* The hub seals each user's plaintext credential under `provider`
|
|
159
159
|
* and embeds the resulting sealed envelopes in the bundle. The
|
|
@@ -170,8 +170,8 @@ export interface WritePodOptions {
|
|
|
170
170
|
* The bundle can only be unsealed by the holder of the matching
|
|
171
171
|
* private key.
|
|
172
172
|
*
|
|
173
|
-
* Mutually exclusive with `autoCredentials`, `
|
|
174
|
-
* and `
|
|
173
|
+
* Mutually exclusive with `autoCredentials`, `autoSecrets`,
|
|
174
|
+
* and `sealedSecrets`.
|
|
175
175
|
*/
|
|
176
176
|
readonly sealedCredentials?: {
|
|
177
177
|
readonly mode: 'self-target';
|
|
@@ -188,7 +188,7 @@ export interface WritePodOptions {
|
|
|
188
188
|
/**
|
|
189
189
|
* @deprecated Use `autoCredentials` instead.
|
|
190
190
|
*
|
|
191
|
-
* Auto-unlock — unsealed per-user
|
|
191
|
+
* Auto-unlock — unsealed per-user secrets.
|
|
192
192
|
*
|
|
193
193
|
* Public-by-design: anyone holding the bundle bytes can read these
|
|
194
194
|
* plaintext credentials. Use for demo data, sample vaults,
|
|
@@ -199,33 +199,33 @@ export interface WritePodOptions {
|
|
|
199
199
|
* safety net against a careless call against a production vault.
|
|
200
200
|
*
|
|
201
201
|
* Mutually exclusive with `autoCredentials`, `sealedCredentials`,
|
|
202
|
-
* and `
|
|
202
|
+
* and `sealedSecrets`.
|
|
203
203
|
*/
|
|
204
|
-
readonly
|
|
204
|
+
readonly autoSecrets?: {
|
|
205
205
|
readonly policy: 'public-by-design';
|
|
206
206
|
readonly perUser: Record<string, string>;
|
|
207
207
|
};
|
|
208
208
|
/**
|
|
209
209
|
* @deprecated Use `sealedCredentials` instead.
|
|
210
210
|
*
|
|
211
|
-
* Auto-unlock — per-user
|
|
211
|
+
* Auto-unlock — per-user secrets sealed under a
|
|
212
212
|
* {@link SealingKeyProvider} (self-target only).
|
|
213
213
|
*
|
|
214
|
-
* The hub seals each user's plaintext
|
|
214
|
+
* The hub seals each user's plaintext secret under `provider`
|
|
215
215
|
* and embeds the resulting sealed envelopes in the bundle. The
|
|
216
216
|
* recipient must hold a provider with a matching `pid` (i.e.,
|
|
217
217
|
* `provider.id`) to auto-unseal on import.
|
|
218
218
|
*
|
|
219
|
-
* `mode: 'self-target'` is the only mode for `
|
|
219
|
+
* `mode: 'self-target'` is the only mode for `sealedSecrets` — sender
|
|
220
220
|
* and recipient share the same provider identity (same iCloud Keychain
|
|
221
221
|
* entry, same MDM-provisioned bundle id, same KMS account, etc.).
|
|
222
222
|
* For recipient-target sealing via the `RecipientSealer` interface,
|
|
223
223
|
* use `sealedCredentials` with `mode: 'recipient-target'` (§11.4).
|
|
224
224
|
*
|
|
225
225
|
* Mutually exclusive with `autoCredentials`, `sealedCredentials`,
|
|
226
|
-
* and `
|
|
226
|
+
* and `autoSecrets`.
|
|
227
227
|
*/
|
|
228
|
-
readonly
|
|
228
|
+
readonly sealedSecrets?: {
|
|
229
229
|
readonly mode: 'self-target';
|
|
230
230
|
readonly provider: SealingKeyProvider;
|
|
231
231
|
readonly perUser: Record<string, string>;
|
|
@@ -235,7 +235,7 @@ export interface WritePodOptions {
|
|
|
235
235
|
export type WriteNoydbBundleOptions = WritePodOptions;
|
|
236
236
|
/**
|
|
237
237
|
* Result returned by `readPod`. The caller is expected to
|
|
238
|
-
* pass `dumpJson` into `vault.load(json,
|
|
238
|
+
* pass `dumpJson` into `vault.load(json, secret)` to
|
|
239
239
|
* actually restore a vault. Splitting the layers keeps the
|
|
240
240
|
* bundle module free of crypto concerns — see file-level docs.
|
|
241
241
|
*/
|
|
@@ -251,7 +251,7 @@ export interface NoydbBundleReadResult {
|
|
|
251
251
|
*
|
|
252
252
|
* Consumers dispatch on `cred.kind` to choose the correct login /
|
|
253
253
|
* prefill path. Pre-0.2 bundles (bare string entries) are coerced
|
|
254
|
-
* to `{ kind: '
|
|
254
|
+
* to `{ kind: 'secret', value }` on read for back-compat.
|
|
255
255
|
*
|
|
256
256
|
* For `kind: 'sealed'` bundles read without `sealingProviders`, the
|
|
257
257
|
* `value` field is the raw base64 sealed bytes — opaque to the
|
|
@@ -270,7 +270,7 @@ export interface NoydbBundleReadResult {
|
|
|
270
270
|
export interface ReadNoydbBundleOptions {
|
|
271
271
|
/**
|
|
272
272
|
* Recipient-side sealing providers used to unseal entries from
|
|
273
|
-
* `
|
|
273
|
+
* `sealedSecrets`. The reader picks the one whose `.id`
|
|
274
274
|
* matches each entry's `pid`. Multiple providers may be supplied
|
|
275
275
|
* (different users may seal under different identities).
|
|
276
276
|
*
|
|
@@ -391,8 +391,6 @@ export declare const readNoydbBundleHeader: typeof readPodHeader;
|
|
|
391
391
|
export declare function readPodCover(bytes: Uint8Array, opts?: {
|
|
392
392
|
readonly locale?: string;
|
|
393
393
|
}): Cover | undefined;
|
|
394
|
-
/** @deprecated Use `readPodCover` (#799 rename). */
|
|
395
|
-
export declare const readNoydbBundlePublicEnvelope: typeof readPodCover;
|
|
396
394
|
/**
|
|
397
395
|
* Read a full `.noydb` bundle: validate magic + header, verify
|
|
398
396
|
* integrity hash over the body bytes, decompress, and return the
|
|
@@ -404,9 +402,9 @@ export declare const readNoydbBundlePublicEnvelope: typeof readPodCover;
|
|
|
404
402
|
* format error so consumers can pattern-match in catch blocks
|
|
405
403
|
* (corrupted-in-transit vs malformed-by-producer).
|
|
406
404
|
*
|
|
407
|
-
* Note: this function does NOT take a
|
|
405
|
+
* Note: this function does NOT take a secret. The dump JSON
|
|
408
406
|
* inside the body still contains encrypted records — restoring
|
|
409
|
-
* the vault requires `vault.load(dumpJson,
|
|
407
|
+
* the vault requires `vault.load(dumpJson, secret)`
|
|
410
408
|
* after this call. Splitting the layers keeps the bundle module
|
|
411
409
|
* free of crypto concerns and lets the same code feed format
|
|
412
410
|
* inspectors that never decrypt anything.
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* The dump JSON inside the body still contains the original
|
|
35
35
|
* metadata, but that's only readable by someone who already has the
|
|
36
36
|
* file bytes — the same person who could read the encrypted records
|
|
37
|
-
* with the right
|
|
37
|
+
* with the right secret.
|
|
38
38
|
*
|
|
39
39
|
* **Why minimum disclosure** in the header? Because consumers will
|
|
40
40
|
* inevitably store these in services where the filename, file size,
|
|
@@ -128,7 +128,7 @@ export interface NoydbPodHeader {
|
|
|
128
128
|
/**
|
|
129
129
|
* Auto-unlock material indicator. When present, the bundle
|
|
130
130
|
* body wraps the dump JSON in a structure carrying per-user
|
|
131
|
-
*
|
|
131
|
+
* secrets — either plaintext (`'unsealed'`, public-by-design)
|
|
132
132
|
* or sealed under a `SealingKeyProvider` (`'sealed'`, requires
|
|
133
133
|
* matching provider on the recipient side).
|
|
134
134
|
*
|
package/dist/with-pod/index.d.ts
CHANGED
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
export { writePod, readPod, readPodHeader, readPodCover, writeNoydbBundle, readNoydbBundle, readNoydbBundleHeader, resetBrotliSupportCache, } from './bundle.js';
|
|
15
15
|
export type { Cover } from '../with-party/directory/cover/types.js';
|
|
16
16
|
export type { WritePodOptions, WriteNoydbBundleOptions, ReadNoydbBundleOptions, NoydbBundleReadResult, } from './bundle.js';
|
|
17
|
-
export { NOYDB_BUNDLE_MAGIC, NOYDB_BUNDLE_PREFIX_BYTES, NOYDB_BUNDLE_FORMAT_VERSION, FLAG_COMPRESSED, FLAG_HAS_INTEGRITY_HASH, COMPRESSION_NONE, COMPRESSION_GZIP, COMPRESSION_BROTLI, validateBundleHeader, encodeBundleHeader, } from './format.js';
|
|
17
|
+
export { NOYDB_BUNDLE_MAGIC, NOYDB_BUNDLE_PREFIX_BYTES, NOYDB_BUNDLE_FORMAT_VERSION, FLAG_COMPRESSED, FLAG_HAS_INTEGRITY_HASH, COMPRESSION_NONE, COMPRESSION_GZIP, COMPRESSION_BROTLI, validateBundleHeader, encodeBundleHeader, hasNoydbBundleMagic, } from './format.js';
|
|
18
18
|
export type { CompressionAlgo, NoydbPodHeader, NoydbBundleHeader, } from './format.js';
|
|
19
19
|
export { generateULID, isULID } from './ulid.js';
|
|
20
20
|
export { wrapPodStore, createPodStore, wrapBundleStore, createBundleStore } from './pod-store.js';
|
|
21
21
|
export type { WrappedPodNoydbStore, WrapPodStoreOptions, WrappedBundleNoydbStore, WrapBundleStoreOptions, } from './pod-store.js';
|
|
22
|
+
export { BundleIntegrityError, BundleSealMismatchError, PodVersionConflictError, BundleVersionConflictError, BackupLedgerError, BackupCorruptedError, } from '../kernel/errors.js';
|
|
@@ -105,24 +105,41 @@ export interface BlobEvictionEntry {
|
|
|
105
105
|
readonly recordId: string;
|
|
106
106
|
readonly slotName: string;
|
|
107
107
|
readonly blobHash: string;
|
|
108
|
-
|
|
108
|
+
/** `'budget'` — evicted by the #808 cache-budget LRU pass, not a policy. */
|
|
109
|
+
readonly reason: 'ttl' | 'predicate' | 'both' | 'budget';
|
|
109
110
|
readonly evictedAt: string;
|
|
110
111
|
readonly actor: string;
|
|
111
112
|
}
|
|
112
113
|
export interface CompactionResult {
|
|
113
|
-
/** Number of blob slots evicted across all collections. */
|
|
114
|
+
/** Number of blob slots evicted by the policy pass across all collections. */
|
|
114
115
|
readonly evicted: number;
|
|
115
116
|
/** Number of records touched (iterated + policy checked). */
|
|
116
117
|
readonly records: number;
|
|
117
118
|
/** Number of collections with `blobFields` configured. */
|
|
118
119
|
readonly collections: number;
|
|
119
|
-
/**
|
|
120
|
+
/**
|
|
121
|
+
* Number of audit entries written — one per policy eviction plus one per
|
|
122
|
+
* budget SLOT eviction (dropping a device-local cache copy writes none).
|
|
123
|
+
*/
|
|
120
124
|
readonly auditEntries: number;
|
|
121
125
|
/**
|
|
122
126
|
* Number of slots that would have evicted (TTL/predicate triggered)
|
|
123
127
|
* but were retained by a `legalHold` or `retainUntil` floor.
|
|
124
128
|
*/
|
|
125
129
|
readonly held: number;
|
|
130
|
+
/**
|
|
131
|
+
* #808: number of slots whose due policy eviction was skipped because they
|
|
132
|
+
* are pinned for offline on THIS device (pin state is device-local).
|
|
133
|
+
*/
|
|
134
|
+
readonly pinned: number;
|
|
135
|
+
/**
|
|
136
|
+
* #808: number of evictions performed by the `cacheBudget` LRU pass —
|
|
137
|
+
* internal slots evicted through the standard eviction writer plus
|
|
138
|
+
* device-local external cache copies dropped. 0 when no budget was given.
|
|
139
|
+
*/
|
|
140
|
+
readonly budgetEvicted: number;
|
|
141
|
+
/** #808: plaintext bytes freed by the `cacheBudget` LRU pass. */
|
|
142
|
+
readonly budgetBytesFreed: number;
|
|
126
143
|
/** Per-collection breakdown for diagnostics. */
|
|
127
144
|
readonly byCollection: Record<string, {
|
|
128
145
|
records: number;
|
|
@@ -143,6 +160,22 @@ export interface CompactRunOptions {
|
|
|
143
160
|
* what would happen.
|
|
144
161
|
*/
|
|
145
162
|
readonly dryRun?: boolean;
|
|
163
|
+
/**
|
|
164
|
+
* #808 mobile cache budget: cap the locally-cached UNPINNED blob bytes.
|
|
165
|
+
* After the policy pass, a dedicated LRU pass walks every collection's
|
|
166
|
+
* slots (pinned slots and `legalHold`/`retainUntil`-held slots are exempt
|
|
167
|
+
* and uncounted) and evicts oldest-access-first — internal slots through
|
|
168
|
+
* the standard eviction writer (`deleteSlot` + a `'budget'` audit entry),
|
|
169
|
+
* external slots by dropping their device-local encrypted cache copy only
|
|
170
|
+
* (the object-store copy is authoritative and untouched) — until the
|
|
171
|
+
* remaining unpinned bytes fit `maxBytes`. Internal slots count their
|
|
172
|
+
* uncompressed `size`; external slots count `cachedBytes` (0 = nothing
|
|
173
|
+
* local, nothing to evict). LRU order comes from the device-local
|
|
174
|
+
* `lastAccessAt` stamp, falling back to `uploadedAt`.
|
|
175
|
+
*/
|
|
176
|
+
readonly cacheBudget?: {
|
|
177
|
+
readonly maxBytes: number;
|
|
178
|
+
};
|
|
146
179
|
}
|
|
147
180
|
export interface CompactionContext {
|
|
148
181
|
readonly adapter: NoydbStore;
|
|
@@ -166,5 +199,12 @@ export interface CompactionContext {
|
|
|
166
199
|
readonly listSlots: (collection: string, id: string) => Promise<SlotInfo[]>;
|
|
167
200
|
/** Delete a slot and decrement its blob's refCount. */
|
|
168
201
|
readonly deleteSlot: (collection: string, id: string, slotName: string) => Promise<void>;
|
|
202
|
+
/**
|
|
203
|
+
* #808: drop a slot's DEVICE-LOCAL cached copy (the encrypted external
|
|
204
|
+
* side-cache) without touching the slot or the object store. Returns the
|
|
205
|
+
* plaintext bytes freed. Optional — absent (or a 0 return) means external
|
|
206
|
+
* cache entries simply cannot be budget-evicted through this context.
|
|
207
|
+
*/
|
|
208
|
+
readonly dropLocalCache?: (collection: string, id: string, slotName: string) => Promise<number>;
|
|
169
209
|
}
|
|
170
210
|
export declare function runCompaction(ctx: CompactionContext, options?: CompactRunOptions): Promise<CompactionResult>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #808 — device-local blob pin registry + external side-cache + KPI counters.
|
|
3
|
+
*
|
|
4
|
+
* Pinning marks a blob slot "keep this available offline" **for this device
|
|
5
|
+
* only**. Pin state is intentionally NEVER written to the vault's
|
|
6
|
+
* `NoydbStore` — the vault store is the synced/shared substrate, and each
|
|
7
|
+
* device pins for itself. Instead, `withBlobs()` owns one {@link BlobPinCache}
|
|
8
|
+
* per strategy instance and threads it into every `BlobSet` it opens; the
|
|
9
|
+
* registry rows live in a pluggable {@link BlobPinStore}.
|
|
10
|
+
*
|
|
11
|
+
* The default backend is in-memory ({@link memoryBlobPinStore}) — the hub has
|
|
12
|
+
* NO device-persistence idiom of its own (it never touches IndexedDB or any
|
|
13
|
+
* Node fs API; persistence backends are the `to-*` package family), so a
|
|
14
|
+
* durable registry is supplied by the consumer:
|
|
15
|
+
* `withBlobs({ pinStore: myIdbBackedStore })`. The interface is four async
|
|
16
|
+
* methods, deliberately trivial to implement over IndexedDB / SQLite / a file.
|
|
17
|
+
*
|
|
18
|
+
* ## What a registry row holds
|
|
19
|
+
*
|
|
20
|
+
* One row per `{vault, collection, record, slot}` ({@link blobPinKey}):
|
|
21
|
+
* - the pin flag + timestamps (LRU input for the cache-budget pass), and
|
|
22
|
+
* - for `external: true` slots, the **local encrypted copy** of the object's
|
|
23
|
+
* bytes ({@link BlobPinEntry.cipher}). The object-store copy of an external
|
|
24
|
+
* blob lives OUTSIDE the zero-knowledge envelope by design; the local copy
|
|
25
|
+
* does NOT — it is AES-256-GCM-encrypted under the vault's `_blob` DEK
|
|
26
|
+
* through the same enclave path that encrypts blob chunks
|
|
27
|
+
* (`encryptBytesWithAAD`, AAD-bound to the row's pin key), so a stolen
|
|
28
|
+
* device store leaks nothing the vault store wouldn't.
|
|
29
|
+
*
|
|
30
|
+
* Internal (chunked) blobs never store bytes here — their ciphertext already
|
|
31
|
+
* lives in `_blob_chunks`; the registry only carries their pin flag and
|
|
32
|
+
* access times.
|
|
33
|
+
*
|
|
34
|
+
* @module
|
|
35
|
+
*/
|
|
36
|
+
/** One device-local registry row — see the module doc for the field posture. */
|
|
37
|
+
export interface BlobPinEntry {
|
|
38
|
+
/** Slot is pinned for offline on THIS device. */
|
|
39
|
+
readonly pinned: boolean;
|
|
40
|
+
/** ISO timestamp of the pin (absent when not pinned). */
|
|
41
|
+
readonly pinnedAt?: string;
|
|
42
|
+
/** ISO timestamp of the last local read — LRU input for the budget pass. */
|
|
43
|
+
readonly lastAccessAt?: string;
|
|
44
|
+
/** Plaintext byte length of the cached external copy (external slots only). */
|
|
45
|
+
readonly cachedBytes?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Encrypted local copy of an external slot's bytes: base64 IV + base64
|
|
48
|
+
* AES-256-GCM ciphertext under the vault's `_blob` DEK, AAD-bound to the
|
|
49
|
+
* row's {@link blobPinKey}. On an UNENCRYPTED vault (`encrypt: false`) the
|
|
50
|
+
* fallback mirrors the envelope convention: `iv === ''`, `data` = base64
|
|
51
|
+
* plaintext.
|
|
52
|
+
*/
|
|
53
|
+
readonly cipher?: {
|
|
54
|
+
readonly iv: string;
|
|
55
|
+
readonly data: string;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Pluggable device-local backend for the pin registry (#808). Implementations
|
|
60
|
+
* MUST be device-local (never synced) — an IndexedDB- or file-backed store is
|
|
61
|
+
* the expected production shape; {@link memoryBlobPinStore} is the default.
|
|
62
|
+
*/
|
|
63
|
+
export interface BlobPinStore {
|
|
64
|
+
get(key: string): Promise<BlobPinEntry | null>;
|
|
65
|
+
set(key: string, entry: BlobPinEntry): Promise<void>;
|
|
66
|
+
delete(key: string): Promise<void>;
|
|
67
|
+
/** All rows whose key starts with `prefix` (`''` = every row). */
|
|
68
|
+
entries(prefix: string): Promise<Array<{
|
|
69
|
+
key: string;
|
|
70
|
+
entry: BlobPinEntry;
|
|
71
|
+
}>>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* In-memory {@link BlobPinStore} — the default. Pin state then lasts for the
|
|
75
|
+
* strategy instance's lifetime (one app session); pass a durable store to
|
|
76
|
+
* `withBlobs({ pinStore })` to keep pins across restarts.
|
|
77
|
+
*/
|
|
78
|
+
export declare function memoryBlobPinStore(): BlobPinStore;
|
|
79
|
+
/**
|
|
80
|
+
* Device-local blob-cache KPI counters (#808) — read via
|
|
81
|
+
* `withBlobs().cacheStats()`. "Local" reads (internal chunks, cached external
|
|
82
|
+
* copies) count as hits; network fetches from the object store count as
|
|
83
|
+
* misses and add to `bytesDownloaded` (the 4G-budget number).
|
|
84
|
+
*/
|
|
85
|
+
export interface BlobCacheStats {
|
|
86
|
+
readonly hits: number;
|
|
87
|
+
readonly misses: number;
|
|
88
|
+
readonly bytesDownloaded: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The per-strategy bundle `withBlobs()` threads into every `BlobSet`: the
|
|
92
|
+
* registry backend plus the shared mutable KPI counters.
|
|
93
|
+
*
|
|
94
|
+
* @internal
|
|
95
|
+
*/
|
|
96
|
+
export interface BlobPinCache {
|
|
97
|
+
readonly store: BlobPinStore;
|
|
98
|
+
readonly stats: {
|
|
99
|
+
hits: number;
|
|
100
|
+
misses: number;
|
|
101
|
+
bytesDownloaded: number;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** @internal */
|
|
105
|
+
export declare function createBlobPinCache(store?: BlobPinStore): BlobPinCache;
|
|
106
|
+
/**
|
|
107
|
+
* Registry key for one slot's row: `{vault}::{collection}::{record}::{slot}`
|
|
108
|
+
* (the blobs' established `::` separator — record ids and slot names are
|
|
109
|
+
* already `::`-refused at the write surface, see `assertKeyPartSafe`).
|
|
110
|
+
* Omitting `slotName` yields the record's row PREFIX (for per-record scans).
|
|
111
|
+
*/
|
|
112
|
+
export declare function blobPinKey(vault: string, collection: string, recordId: string, slotName?: string): string;
|
|
@@ -2,6 +2,7 @@ import type { NoydbStore, BlobObject, SlotInfo, VersionRecord, BlobPutOptions, B
|
|
|
2
2
|
import type { ObjectProjection } from './object-projection.js';
|
|
3
3
|
import type { BlobFieldsConfig } from './blob-compaction.js';
|
|
4
4
|
import { type EnclaveKey } from '../../kernel/enclave/index.js';
|
|
5
|
+
import { type BlobPinCache } from './blob-pinning.js';
|
|
5
6
|
import type { UnlockedKeyring } from '../../with-party/team/keyring.js';
|
|
6
7
|
/**
|
|
7
8
|
* DEK slot name for vault-shared blob data. Calling `getDEK('_blob')`
|
|
@@ -69,6 +70,12 @@ export declare class BlobSet {
|
|
|
69
70
|
private readonly objectStore;
|
|
70
71
|
private readonly blobFields;
|
|
71
72
|
private readonly keyring;
|
|
73
|
+
/**
|
|
74
|
+
* Device-local pin registry + external side-cache + KPI counters (#808).
|
|
75
|
+
* Injected by `withBlobs()` (one shared instance per strategy — per
|
|
76
|
+
* "device"); absent on a direct construction that never threads one.
|
|
77
|
+
*/
|
|
78
|
+
private readonly pinCache;
|
|
72
79
|
/**
|
|
73
80
|
* Set only on the cleared clone `atTier()` returns (#749) — never by
|
|
74
81
|
* `openSlot`/`Collection.blob()`. Its presence is what makes a `BlobSet`
|
|
@@ -91,6 +98,7 @@ export declare class BlobSet {
|
|
|
91
98
|
blobFields?: BlobFieldsConfig;
|
|
92
99
|
keyring?: UnlockedKeyring;
|
|
93
100
|
clearedTier?: number;
|
|
101
|
+
pinCache?: BlobPinCache;
|
|
94
102
|
});
|
|
95
103
|
/**
|
|
96
104
|
* #724 I1 completion: a legacy (non-`perRecordKeys`) blob has no per-blob
|
|
@@ -101,7 +109,7 @@ export declare class BlobSet {
|
|
|
101
109
|
* DECLARED; a collection with an undeclared field (or no `blobFields` at
|
|
102
110
|
* all) constructs fine and reaches this write path unguarded. Refuse the
|
|
103
111
|
* write itself instead of broadening the construction mandate, which
|
|
104
|
-
* would over-refuse blobless tiered collections (`
|
|
112
|
+
* would over-refuse blobless tiered collections (`blobsStrategy` is
|
|
105
113
|
* vault-wide, not per-collection). Called from every content-write entry
|
|
106
114
|
* (`put()`, `publish()`) — never from a read path, so a pre-existing
|
|
107
115
|
* legacy blob stays readable (back-compat).
|
|
@@ -1136,7 +1144,11 @@ export declare class BlobSet {
|
|
|
1136
1144
|
/**
|
|
1137
1145
|
* Fetch all bytes for the named slot.
|
|
1138
1146
|
* Returns `null` if the slot does not exist.
|
|
1139
|
-
* Throws `
|
|
1147
|
+
* Throws `BlobOfflineError` if the content is not available locally (#808):
|
|
1148
|
+
* an internal blob whose chunk envelopes are absent from the local store, or
|
|
1149
|
+
* an external slot with no local cached copy while the object store is
|
|
1150
|
+
* unreachable. External reads populate the device-local encrypted
|
|
1151
|
+
* side-cache, so a repeat read is served locally (see `pin()`).
|
|
1140
1152
|
*/
|
|
1141
1153
|
get(slotName: string): Promise<Uint8Array | null>;
|
|
1142
1154
|
/**
|
|
@@ -1182,6 +1194,12 @@ export declare class BlobSet {
|
|
|
1182
1194
|
/**
|
|
1183
1195
|
* List all slot entries for this record.
|
|
1184
1196
|
* Returns metadata only — no chunk data is loaded.
|
|
1197
|
+
*
|
|
1198
|
+
* #808: when a pin registry is present (`withBlobs()`), each entry is
|
|
1199
|
+
* annotated with this DEVICE's view — `pinned` / `lastAccessAt` /
|
|
1200
|
+
* `cachedBytes` (see their `SlotInfo` doc comments). The annotations come
|
|
1201
|
+
* from the device-local registry, never the vault store, and are what
|
|
1202
|
+
* `vault.compact()`'s pin exemption + cache-budget LRU pass key off.
|
|
1185
1203
|
*/
|
|
1186
1204
|
list(): Promise<SlotInfo[]>;
|
|
1187
1205
|
/**
|
|
@@ -1189,6 +1207,72 @@ export declare class BlobSet {
|
|
|
1189
1207
|
* Decrements refCount on the blob. Chunks are GC'd by `vault.blobGC()`.
|
|
1190
1208
|
*/
|
|
1191
1209
|
delete(slotName: string): Promise<void>;
|
|
1210
|
+
/**
|
|
1211
|
+
* Pin the named slot for offline availability ON THIS DEVICE.
|
|
1212
|
+
*
|
|
1213
|
+
* - Downloads eagerly (call while online): an internal blob's chunks are
|
|
1214
|
+
* fetched once to prove they are locally readable; an `external` slot's
|
|
1215
|
+
* bytes are fetched from the object store and kept in the device-local
|
|
1216
|
+
* side-cache, **encrypted** under the vault's `_blob` DEK via the same
|
|
1217
|
+
* enclave path as chunk encryption (the object-store copy sits outside
|
|
1218
|
+
* the ZK envelope by design; the local copy does not).
|
|
1219
|
+
* - A pinned slot is EXEMPT from `vault.compact()` eviction — both the
|
|
1220
|
+
* `blobFields` policy pass and the `cacheBudget` LRU pass.
|
|
1221
|
+
* - Pin state is device-local (never synced): it lives in the `withBlobs()`
|
|
1222
|
+
* pin registry, not in the vault store. Each device pins for itself.
|
|
1223
|
+
*
|
|
1224
|
+
* Throws `NotFoundError` for a missing slot and `BlobOfflineError` when the
|
|
1225
|
+
* eager download cannot complete (offline).
|
|
1226
|
+
*/
|
|
1227
|
+
pin(slotName: string): Promise<void>;
|
|
1228
|
+
/**
|
|
1229
|
+
* Unpin the named slot on this device — it returns to the normal lifecycle:
|
|
1230
|
+
* `blobFields` policy eviction applies again, and any local cached copy
|
|
1231
|
+
* (external slots) stays but becomes budget-managed (`cacheBudget` LRU).
|
|
1232
|
+
* A no-op when the slot is not pinned here.
|
|
1233
|
+
*/
|
|
1234
|
+
unpin(slotName: string): Promise<void>;
|
|
1235
|
+
/** Whether the named slot is pinned for offline ON THIS DEVICE (#808). */
|
|
1236
|
+
isPinned(slotName: string): Promise<boolean>;
|
|
1237
|
+
/**
|
|
1238
|
+
* Drop this slot's device-local cached copy (the encrypted external
|
|
1239
|
+
* side-cache) WITHOUT touching the slot, the vault store, or the object
|
|
1240
|
+
* store. Returns the plaintext bytes freed (0 when nothing was cached, the
|
|
1241
|
+
* slot is pinned — pinned copies are exempt — or no registry is present).
|
|
1242
|
+
* The cache-budget pass inside `vault.compact()` is the expected caller;
|
|
1243
|
+
* the LRU access row itself is kept.
|
|
1244
|
+
*/
|
|
1245
|
+
dropLocalCache(slotName: string): Promise<number>;
|
|
1246
|
+
/** This slot's registry key — see {@link blobPinKey}. */
|
|
1247
|
+
private pinKeyFor;
|
|
1248
|
+
/** AAD binding for a cached external copy: the row's own registry key. */
|
|
1249
|
+
private pinCopyAAD;
|
|
1250
|
+
private requirePinCache;
|
|
1251
|
+
/** KPI hit + LRU access stamp for a successful LOCAL read. No-op without a registry. */
|
|
1252
|
+
private recordLocalHit;
|
|
1253
|
+
/**
|
|
1254
|
+
* Read an `external` slot (#808 taxonomy): local encrypted side-cache first
|
|
1255
|
+
* (hit); else the object store (miss + `bytesDownloaded`), auto-caching the
|
|
1256
|
+
* fetched bytes so the NEXT read — and any later offline read — is local.
|
|
1257
|
+
* A network failure with no local copy is the typed `BlobOfflineError`;
|
|
1258
|
+
* a genuinely absent object (fetch succeeded, nothing there) stays `null`.
|
|
1259
|
+
*/
|
|
1260
|
+
private readExternal;
|
|
1261
|
+
/**
|
|
1262
|
+
* Decrypt a cached external copy. `null` (treated as a cache miss → network
|
|
1263
|
+
* refresh) when the vault keys can no longer open it — e.g. the copy was
|
|
1264
|
+
* cached before the owning record moved tiers, so it is sealed under a DEK
|
|
1265
|
+
* this handle no longer resolves. Genuine non-crypto failures propagate.
|
|
1266
|
+
*/
|
|
1267
|
+
private decryptCachedCopy;
|
|
1268
|
+
/**
|
|
1269
|
+
* Write an external slot's bytes into the device-local side-cache —
|
|
1270
|
+
* ENCRYPTED under the vault's `_blob` DEK (owner tier) via the enclave's
|
|
1271
|
+
* AAD-bound path, mirroring chunk encryption; base64 plaintext with
|
|
1272
|
+
* `iv: ''` only on an unencrypted vault (the envelope convention). A
|
|
1273
|
+
* pre-existing pin flag survives the rewrite.
|
|
1274
|
+
*/
|
|
1275
|
+
private cacheExternalCopy;
|
|
1192
1276
|
/**
|
|
1193
1277
|
* Return a native `Response` whose body streams the decrypted,
|
|
1194
1278
|
* decompressed blob bytes with full HTTP metadata headers.
|
|
@@ -9,4 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export type { VaultSchemaSnapshot, DumpSchemaOptions, CollectionDescriptor, CollectionConfig, CollectionStats, FieldDescriptor, FieldSource, MaterializedViewDescriptor, OverlayViewDescriptor, DerivationDescriptor, InternalCollectionStats, } from './types.js';
|
|
11
11
|
export { dumpVaultSchema } from './walk.js';
|
|
12
|
+
export type { VaultIntrospectState } from './walk.js';
|
|
12
13
|
export { jsonSchemaToFields } from './fields.js';
|
|
14
|
+
export type { SchemaIntrospection } from './types.js';
|
|
15
|
+
export type { FieldMeta, SemanticType } from './field-meta.js';
|
|
16
|
+
export type { CollectionDescription, DescribedField, DescribeOptions } from './describe.js';
|
|
17
|
+
export { applyListProjection } from './projection.js';
|
|
18
|
+
export type { ListProjectionOptions } from './projection.js';
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Store routing (multiplex by collection/size/age) and composable store
|
|
5
5
|
* middleware (retry, logging, metrics, circuit-breaker, cache, health-check).
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* Published as `@noy-db/hub/store` (#843 C3a). Also re-exported from the root
|
|
7
|
+
* barrel, matching how the Via features are dual-homed — the subpath exists so
|
|
8
|
+
* the surface is navigable and tree-shakeable, not to force a migration.
|
|
8
9
|
*
|
|
9
10
|
* Named re-exports (not `export *`) so tsup keeps the barrel populated
|
|
10
11
|
* even with `sideEffects: false`.
|
|
@@ -204,7 +204,7 @@ export interface RoutedNoydbStore extends NoydbStore {
|
|
|
204
204
|
* - `hydrate: ['invoices', 'clients']` — copies only named collections.
|
|
205
205
|
*
|
|
206
206
|
* Use cases:
|
|
207
|
-
* - Shared device: `await store.override('default',
|
|
207
|
+
* - Shared device: `await store.override('default', toMemory(), { hydrate: true })`
|
|
208
208
|
* - Restricted network: `store.override('blobs', localFile(...))`
|
|
209
209
|
*/
|
|
210
210
|
override(route: OverrideTarget, store: NoydbStore, opts?: OverrideOptions): void | Promise<void>;
|
|
@@ -36,15 +36,15 @@
|
|
|
36
36
|
* Operators, viewers, and clients cannot call this API. The check is made
|
|
37
37
|
* against the caller's keyring role at call time.
|
|
38
38
|
*/
|
|
39
|
-
import type { NoydbStore } from '
|
|
40
|
-
import type { UnlockedKeyring } from '
|
|
39
|
+
import type { NoydbStore } from '../kernel/types.js';
|
|
40
|
+
import type { UnlockedKeyring } from '../with-party/team/keyring.js';
|
|
41
41
|
/**
|
|
42
42
|
* The reserved collection name. Never collides with user collections.
|
|
43
43
|
* Canonical definition lives in `reserved-secret-collections.ts` (shared with
|
|
44
44
|
* the `vault.collection()` guard and grant DEK-propagation); re-exported here
|
|
45
45
|
* for existing consumers.
|
|
46
46
|
*/
|
|
47
|
-
export { SYNC_CREDENTIALS_COLLECTION } from '
|
|
47
|
+
export { SYNC_CREDENTIALS_COLLECTION } from '../with-party/team/reserved-secret-collections.js';
|
|
48
48
|
/**
|
|
49
49
|
* An OAuth/auth token stored in `_sync_credentials`.
|
|
50
50
|
*
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { NoydbStore, DirtyEntry, ConflictStrategy, CollectionConflictResolver, PushOptions, PullOptions, PushResult, PullResult, SyncStatus, SyncTargetRole } from '
|
|
2
|
-
import { type PeriodPullSource } from './
|
|
3
|
-
import type { NoydbEventEmitter } from '
|
|
4
|
-
import type { SyncPolicy } from '
|
|
5
|
-
import { SyncScheduler } from '
|
|
1
|
+
import type { NoydbStore, DirtyEntry, ConflictStrategy, CollectionConflictResolver, PushOptions, PullOptions, PushResult, PullResult, SyncStatus, SyncTargetRole } from '../kernel/types.js';
|
|
2
|
+
import { type PeriodPullSource } from './period-scope.js';
|
|
3
|
+
import type { NoydbEventEmitter } from '../kernel/events.js';
|
|
4
|
+
import type { SyncPolicy } from '../kernel/sync-policy.js';
|
|
5
|
+
import { SyncScheduler } from '../kernel/sync-policy.js';
|
|
6
6
|
/** #650 Task 4 (#647) — the declared reserved-lookup (`_dict_*`/`_lookup_*`) collection-name
|
|
7
7
|
* registry a `SyncEngine` enumerates on pull. Explicit, not a blanket underscore-glob — other
|
|
8
8
|
* `_`-prefixed namespaces keep their `loadAll`-skip semantics untouched. */
|
|
@@ -27,5 +27,7 @@
|
|
|
27
27
|
* via `@noy-db/hub/team` for advanced consumers that construct them
|
|
28
28
|
* directly. This subpath is the clean LTS factory entry point.
|
|
29
29
|
*/
|
|
30
|
-
export { withSync } from '
|
|
31
|
-
export type { SyncStrategy } from '
|
|
30
|
+
export { withSync } from './active.js';
|
|
31
|
+
export type { SyncStrategy } from './strategy.js';
|
|
32
|
+
/** The un-opted-in stub for this service — exported so callers can compare against it (#844). */
|
|
33
|
+
export { NO_SYNC } from './strategy.js';
|