@noy-db/hub 0.3.0-pre.8 → 0.3.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/dist/aggregate/index.js +9 -8
- package/dist/aggregate/index.js.map +1 -1
- package/dist/api-ZGS6LCOF.js +20 -0
- package/dist/as/index.js +11 -11
- package/dist/attestation/index.js +18 -18
- package/dist/backup-BJ57IKAO.js +242 -0
- package/dist/backup-BJ57IKAO.js.map +1 -0
- package/dist/blobs/index.js +13 -11
- package/dist/blobs/index.js.map +1 -1
- package/dist/broker/index.js +92 -0
- package/dist/broker/index.js.map +1 -0
- package/dist/bundle/index.js +25 -22
- package/dist/bundle/index.js.map +1 -1
- package/dist/by/index.js +2 -2
- package/dist/cargo/index.js +31 -31
- package/dist/chunk-2NVOWNI3.js +167 -0
- package/dist/chunk-2NVOWNI3.js.map +1 -0
- package/dist/chunk-3B5VVCNY.js +71 -0
- package/dist/chunk-3LQ2YKO4.js +230 -0
- package/dist/chunk-3QCRBHCY.js +54 -0
- package/dist/chunk-454JXE57.js +1697 -0
- package/dist/chunk-454JXE57.js.map +1 -0
- package/dist/chunk-4CTHCN4J.js +480 -0
- package/dist/chunk-4CTHCN4J.js.map +1 -0
- package/dist/chunk-4GPE63GU.js +111 -0
- package/dist/chunk-4GPE63GU.js.map +1 -0
- package/dist/chunk-4JBYV75E.js +150 -0
- package/dist/chunk-4NXKCLLQ.js +97 -0
- package/dist/chunk-4VNQOLML.js +29 -0
- package/dist/chunk-4VNQOLML.js.map +1 -0
- package/dist/chunk-5M5DVGV7.js +69 -0
- package/dist/chunk-5O3XF4DV.js +150 -0
- package/dist/chunk-5O3XF4DV.js.map +1 -0
- package/dist/chunk-5YOLBEQ6.js +30 -0
- package/dist/chunk-6CRIV7DE.js +129 -0
- package/dist/chunk-6JTIAGHD.js +621 -0
- package/dist/chunk-6JTIAGHD.js.map +1 -0
- package/dist/chunk-6QTNZJBS.js +255 -0
- package/dist/chunk-6T2SCQRU.js +86 -0
- package/dist/chunk-7DSTRQIJ.js +45 -0
- package/dist/chunk-AUSTCW2X.js +589 -0
- package/dist/chunk-B3HJYUOF.js +209 -0
- package/dist/chunk-BDVFPG6Y.js +164 -0
- package/dist/chunk-BIOUI4HL.js +1554 -0
- package/dist/chunk-BIOUI4HL.js.map +1 -0
- package/dist/chunk-CAF6WOK7.js +36 -0
- package/dist/chunk-CDUQTA3Z.js +381 -0
- package/dist/chunk-CDUQTA3Z.js.map +1 -0
- package/dist/chunk-CIE2BASH.js +404 -0
- package/dist/chunk-CRI4OUV4.js +42 -0
- package/dist/chunk-DLG74CNB.js +91 -0
- package/dist/chunk-E5ZQT5KX.js +30 -0
- package/dist/chunk-E5ZQT5KX.js.map +1 -0
- package/dist/chunk-EQO2UVP4.js +247 -0
- package/dist/chunk-EQO2UVP4.js.map +1 -0
- package/dist/chunk-ERJ7FU55.js +367 -0
- package/dist/chunk-EVVGJDRQ.js +205 -0
- package/dist/chunk-EVX47VBM.js +74 -0
- package/dist/chunk-EVX47VBM.js.map +1 -0
- package/dist/chunk-EXK7QRWF.js +59 -0
- package/dist/chunk-EYZ6IQ6X.js +202 -0
- package/dist/chunk-F64IRYG3.js +45 -0
- package/dist/chunk-FHS2HQSH.js +823 -0
- package/dist/chunk-FM3G3NOY.js +206 -0
- package/dist/chunk-FM3G3NOY.js.map +1 -0
- package/dist/chunk-FUG4SFN3.js +36 -0
- package/dist/chunk-FUG4SFN3.js.map +1 -0
- package/dist/chunk-GKEWXIV5.js +80 -0
- package/dist/chunk-GTGPO5KW.js +59 -0
- package/dist/chunk-HB3RFQSC.js +95 -0
- package/dist/chunk-HDMEGAQE.js +957 -0
- package/dist/chunk-HDMEGAQE.js.map +1 -0
- package/dist/chunk-HDQIIUPH.js +135 -0
- package/dist/chunk-HDQIIUPH.js.map +1 -0
- package/dist/chunk-HTJQYHZP.js +344 -0
- package/dist/chunk-HTJQYHZP.js.map +1 -0
- package/dist/chunk-I6GALP6E.js +99 -0
- package/dist/chunk-IGJCYUT5.js +99 -0
- package/dist/chunk-IGJCYUT5.js.map +1 -0
- package/dist/chunk-IL6POWCW.js +130 -0
- package/dist/chunk-IU6SNYX6.js +117 -0
- package/dist/chunk-J2ZX2XUV.js +778 -0
- package/dist/chunk-JIF24JPM.js +495 -0
- package/dist/chunk-JIF24JPM.js.map +1 -0
- package/dist/chunk-JK733I5V.js +23 -0
- package/dist/chunk-JK733I5V.js.map +1 -0
- package/dist/chunk-JKJOGPZN.js +29 -0
- package/dist/chunk-JNAI2HN2.js +32 -0
- package/dist/chunk-JNAI2HN2.js.map +1 -0
- package/dist/chunk-JZUV47FZ.js +41 -0
- package/dist/chunk-K5IMOGHB.js +30 -0
- package/dist/chunk-KPZS5QAQ.js +151 -0
- package/dist/chunk-KPZS5QAQ.js.map +1 -0
- package/dist/chunk-KSKBRKGJ.js +291 -0
- package/dist/chunk-KSKBRKGJ.js.map +1 -0
- package/dist/chunk-LASZKVMO.js +382 -0
- package/dist/chunk-LXEXBTKL.js +515 -0
- package/dist/chunk-LXEXBTKL.js.map +1 -0
- package/dist/chunk-M4CV6BRT.js +524 -0
- package/dist/chunk-M4CV6BRT.js.map +1 -0
- package/dist/chunk-MEFJPTZ4.js +371 -0
- package/dist/chunk-MEFJPTZ4.js.map +1 -0
- package/dist/chunk-MV43JSJF.js +265 -0
- package/dist/chunk-MV43JSJF.js.map +1 -0
- package/dist/chunk-NJ4EOKMB.js +392 -0
- package/dist/chunk-NJ4EOKMB.js.map +1 -0
- package/dist/chunk-NR5LT5RY.js +135 -0
- package/dist/chunk-NWSGI5C7.js +261 -0
- package/dist/chunk-NWSGI5C7.js.map +1 -0
- package/dist/chunk-OSDB5WW3.js +739 -0
- package/dist/chunk-OSDB5WW3.js.map +1 -0
- package/dist/chunk-PN2XMATY.js +37 -0
- package/dist/chunk-PN2XMATY.js.map +1 -0
- package/dist/chunk-Q5VNKNE5.js +70 -0
- package/dist/chunk-QLWMEXCT.js +21 -0
- package/dist/chunk-QRB7NAOJ.js +123 -0
- package/dist/chunk-R4ROFEYC.js +74 -0
- package/dist/chunk-RCVJZMFE.js +164 -0
- package/dist/chunk-RCVJZMFE.js.map +1 -0
- package/dist/chunk-RIX4V2TB.js +367 -0
- package/dist/chunk-RYCTDFUX.js +40 -0
- package/dist/chunk-RZ5SVOYR.js +155 -0
- package/dist/chunk-SLFHQTTW.js +99 -0
- package/dist/chunk-SNZ6URZZ.js +2782 -0
- package/dist/chunk-SNZ6URZZ.js.map +1 -0
- package/dist/chunk-T2FFWNPK.js +75 -0
- package/dist/chunk-T2FFWNPK.js.map +1 -0
- package/dist/chunk-UNFPPVNI.js +23 -0
- package/dist/chunk-VFUPHI2Z.js +333 -0
- package/dist/chunk-VFUPHI2Z.js.map +1 -0
- package/dist/chunk-VLFCJYTL.js +235 -0
- package/dist/chunk-VN3DBQAU.js +124 -0
- package/dist/chunk-VYYM3MEN.js +98 -0
- package/dist/chunk-VYYM3MEN.js.map +1 -0
- package/dist/chunk-VZRODIM3.js +49 -0
- package/dist/chunk-W22IKJE2.js +94 -0
- package/dist/chunk-X3YYQWOQ.js +155 -0
- package/dist/chunk-X7QBD67R.js +14405 -0
- package/dist/chunk-X7QBD67R.js.map +1 -0
- package/dist/chunk-XDYREZWE.js +1128 -0
- package/dist/chunk-XDYREZWE.js.map +1 -0
- package/dist/chunk-XWZVFISC.js +720 -0
- package/dist/chunk-XWZVFISC.js.map +1 -0
- package/dist/chunk-YFXZEAYK.js +85 -0
- package/dist/chunk-ZAJAVEXY.js +50 -0
- package/dist/chunk-ZICD77GM.js +34 -0
- package/dist/chunk-ZJ2AK4V7.js +38 -0
- package/dist/chunk-ZJ2AK4V7.js.map +1 -0
- package/dist/chunk-ZUODRVHY.js +14 -0
- package/dist/classified/index.js +5 -3
- package/dist/classified-marker-CZKA6ITE.js +28 -0
- package/dist/classified-marker-CZKA6ITE.js.map +1 -0
- package/dist/collection-facade-TLWIPI76.js +44 -0
- package/dist/computed-ZIQTYTDI.js +11 -0
- package/dist/consent/index.js +9 -9
- package/dist/crdt/index.js +1 -1
- package/dist/dead-filter-ESOBZZP5.js +28 -0
- package/dist/delegation-W7ZV2322.js +25 -0
- package/dist/derivations/index.js +12 -11
- package/dist/derive-H2BJTLUI.js +21 -0
- package/dist/enclave-AP3I5W7O.js +141 -0
- package/dist/executor-KGWTNEQD.js +9 -0
- package/dist/executor-OVEXR6RT.js +9 -0
- package/dist/executor-UNEH5ZYH.js +25 -0
- package/dist/export-accessible-PCMXSUZS.js +23 -0
- package/dist/extract-partition-SWHFSYJO.js +38 -0
- package/dist/fanout-sidecar-A765THMX.js +74 -0
- package/dist/find-N6345CNT.js +11 -0
- package/dist/forget/index.js +10 -10
- package/dist/forget/index.js.map +1 -1
- package/dist/guards/index.js +6 -6
- package/dist/history/index.js +14 -11
- package/dist/history/index.js.map +1 -1
- package/dist/i18n/index.js +50 -37
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.d.ts +307 -1459
- package/dist/index.js +595 -198
- package/dist/index.js.map +1 -1
- package/dist/indexing/index.js +7 -7
- package/dist/indexing/index.js.map +1 -1
- package/dist/issue-5OKB6I2R.js +19 -0
- package/dist/kernel/best-effort-revert.d.ts +52 -0
- package/dist/kernel/cache/index.d.ts +10 -0
- package/dist/kernel/cache/lru.d.ts +97 -0
- package/dist/kernel/cache/policy.d.ts +32 -0
- package/dist/kernel/collection-config.d.ts +809 -0
- package/dist/kernel/collection.d.ts +1522 -0
- package/dist/kernel/constants.d.ts +18 -0
- package/dist/kernel/debug.d.ts +25 -0
- package/dist/kernel/enclave/broker/proof.d.ts +154 -0
- package/dist/kernel/enclave/classify/bidx.d.ts +77 -0
- package/dist/kernel/enclave/classify/compare.d.ts +10 -0
- package/dist/kernel/enclave/classify/digest.d.ts +8 -0
- package/dist/kernel/enclave/classify/find.d.ts +36 -0
- package/dist/kernel/enclave/classify/kofn.d.ts +7 -0
- package/dist/kernel/enclave/classify/normalize.d.ts +7 -0
- package/dist/kernel/enclave/classify/reveal.d.ts +10 -0
- package/dist/kernel/enclave/classify/vdig.d.ts +39 -0
- package/dist/kernel/enclave/classify/verify.d.ts +36 -0
- package/dist/kernel/enclave/classify/write.d.ts +8 -0
- package/dist/kernel/enclave/crypto.d.ts +263 -0
- package/dist/kernel/enclave/index.d.ts +79 -0
- package/dist/kernel/enclave/record-keys/deterministic.d.ts +55 -0
- package/dist/kernel/enclave/record-keys/envelope-body.d.ts +79 -0
- package/dist/kernel/enclave/record-keys/lifecycle.d.ts +107 -0
- package/dist/kernel/enclave/record-keys/record-codec.d.ts +328 -0
- package/dist/kernel/enclave/record-keys/sealed-slot.d.ts +14 -0
- package/dist/kernel/enclave/record-keys/sealed-slots.d.ts +123 -0
- package/dist/kernel/enclave/record-keys/sealing.d.ts +70 -0
- package/dist/kernel/enclave/record-keys/tombstone.d.ts +57 -0
- package/dist/kernel/env-check.d.ts +1 -0
- package/dist/kernel/errors.d.ts +1922 -0
- package/dist/kernel/events.d.ts +11 -0
- package/dist/kernel/lazy-count.d.ts +13 -0
- package/dist/kernel/memory-store.d.ts +17 -0
- package/dist/kernel/mutation.d.ts +14 -0
- package/dist/kernel/noydb.d.ts +826 -0
- package/dist/kernel/paths.d.ts +25 -0
- package/dist/kernel/query/builder.d.ts +520 -0
- package/dist/kernel/query/index.d.ts +31 -0
- package/dist/kernel/query/join.d.ts +205 -0
- package/dist/kernel/query/live.d.ts +111 -0
- package/dist/kernel/query/predicate.d.ts +139 -0
- package/dist/kernel/query/scan-builder.d.ts +334 -0
- package/dist/kernel/refs.d.ts +205 -0
- package/dist/kernel/schema.d.ts +134 -0
- package/dist/kernel/sync-policy.d.ts +188 -0
- package/dist/kernel/tier-visibility.d.ts +54 -0
- package/dist/kernel/types.d.ts +3239 -0
- package/dist/kernel/util/discriminant.d.ts +58 -0
- package/dist/kernel/util/index.d.ts +14 -0
- package/dist/kernel/util/sanitize-filename.d.ts +75 -0
- package/dist/kernel/validation.d.ts +130 -0
- package/dist/kernel/vault.d.ts +1740 -0
- package/dist/kernel/via/compose.d.ts +144 -0
- package/dist/kernel/via/dispatch.d.ts +195 -0
- package/dist/kernel/via/graph-wiring.d.ts +145 -0
- package/dist/kernel/via/graph.d.ts +166 -0
- package/dist/kernel/via/index.d.ts +200 -0
- package/dist/kernel/via/pipeline.d.ts +266 -0
- package/dist/kernel/via/reconcile.d.ts +153 -0
- package/dist/kernel/via/taint-binding.d.ts +66 -0
- package/dist/kernel/write-queue.d.ts +46 -0
- package/dist/ledger-GFBKVPV4.js +42 -0
- package/dist/legacy/bundle.d.ts +30 -0
- package/dist/legacy/kernel.d.ts +33 -0
- package/dist/liberate-3VDOT4KO.js +24 -0
- package/dist/link-set-Z7Q2ASFX.js +31 -0
- package/dist/materialized-views/index.js +19 -15
- package/dist/noydb-ZCJOYBDI.js +68 -0
- package/dist/on/index.js +9 -9
- package/dist/overlay-views/index.js +4 -4
- package/dist/periods/index.js +12 -12
- package/dist/pod/index.js +11 -11
- package/dist/policy-Z3RUAIY2.js +41 -0
- package/dist/port/as/index.d.ts +26 -0
- package/dist/port/at/index.d.ts +18 -0
- package/dist/port/by/default-provider.d.ts +9 -0
- package/dist/port/by/index.d.ts +17 -0
- package/dist/port/by/types.d.ts +86 -0
- package/dist/port/in/index.d.ts +21 -0
- package/dist/port/on/index.d.ts +27 -0
- package/dist/port/to/index.d.ts +19 -0
- package/dist/port/ui/index.d.ts +21 -0
- package/dist/port/with/blob-strategy.d.ts +98 -0
- package/dist/port/with/broker-strategy.d.ts +84 -0
- package/dist/port/with/capabilities.d.ts +31 -0
- package/dist/port/with/classified-marker.d.ts +9 -0
- package/dist/port/with/classified-strategy.d.ts +62 -0
- package/dist/port/with/computed-strategy.d.ts +19 -0
- package/dist/port/with/i18n-strategy.d.ts +175 -0
- package/dist/port/with/index.d.ts +18 -0
- package/dist/port/with/lazy-strategy.d.ts +48 -0
- package/dist/port/with/lookup-strategy.d.ts +129 -0
- package/dist/port/with/service-bus.d.ts +156 -0
- package/dist/port/with/team-strategy.d.ts +36 -0
- package/dist/port/with/write-hooks.d.ts +34 -0
- package/dist/portability/index.js +8 -8
- package/dist/post-register-JTH76BLY.js +60 -0
- package/dist/post-register-JTH76BLY.js.map +1 -0
- package/dist/public-envelope-B4KNWVUA.js +32 -0
- package/dist/purge-scope-FGNNLWHD.js +24 -0
- package/dist/purge-scope-FGNNLWHD.js.map +1 -0
- package/dist/query/index.js +9 -6
- package/dist/read-only-facade-CHCKSEPD.js +8 -0
- package/dist/register-VAHONCID.js +23 -0
- package/dist/registry-7MLVD3VO.js +19 -0
- package/dist/registry-EPKPD5SM.js +18 -0
- package/dist/registry-P5T7PS2U.js +9 -0
- package/dist/request-withdrawal-TI3A5WPS.js +31 -0
- package/dist/reveal-DIBHLUZX.js +38 -0
- package/dist/reveal-DIBHLUZX.js.map +1 -0
- package/dist/revoke-FDRD6GRW.js +24 -0
- package/dist/satellites/index.js +1 -1
- package/dist/sealed-record/index.js +12 -12
- package/dist/seed-Q6M2IZFL.js +231 -0
- package/dist/seed-Q6M2IZFL.js.map +1 -0
- package/dist/session/index.js +9 -9
- package/dist/shadow/index.js +2 -2
- package/dist/signer-MUWEIUI6.js +25 -0
- package/dist/snapshots/index.js +10 -10
- package/dist/stale-OSQ7J3AA.js +29 -0
- package/dist/storage-MVFCGEQE.js +23 -0
- package/dist/store-coordination-provider-64OEZFGS.js +142 -0
- package/dist/sync/index.js +9 -9
- package/dist/team/index.js +15 -15
- package/dist/tiers/index.js +14 -10
- package/dist/to/index.js +1 -2
- package/dist/tx/index.js +3 -3
- package/dist/util/index.js +1 -1
- package/dist/verify-ZASTRNPR.js +140 -0
- package/dist/verify-ZASTRNPR.js.map +1 -0
- package/dist/via/blob/active.d.ts +34 -0
- package/dist/via/blob/binding.d.ts +86 -0
- package/dist/via/blob/index.d.ts +34 -0
- package/dist/via/classified/active.d.ts +3 -0
- package/dist/via/classified/binding.d.ts +83 -0
- package/dist/via/classified/config-drift.d.ts +34 -0
- package/dist/via/classified/descriptor.d.ts +66 -0
- package/dist/via/classified/errors.d.ts +19 -0
- package/dist/via/classified/guards.d.ts +23 -0
- package/dist/via/classified/index.d.ts +11 -0
- package/dist/via/classified/presets.d.ts +65 -0
- package/dist/via/classified/resolve.d.ts +9 -0
- package/dist/via/classified/strategy.d.ts +11 -0
- package/dist/via/classified/validators.d.ts +3 -0
- package/dist/via/classified/write.d.ts +4 -0
- package/dist/via/computed/binding.d.ts +34 -0
- package/dist/via/computed/descriptor.d.ts +35 -0
- package/dist/via/i18n/active.d.ts +28 -0
- package/dist/via/i18n/binding.d.ts +36 -0
- package/dist/via/i18n/core.d.ts +267 -0
- package/dist/via/i18n/densify.d.ts +24 -0
- package/dist/via/i18n/dictionary.d.ts +200 -0
- package/dist/via/i18n/index.d.ts +21 -0
- package/dist/via/i18n/policy.d.ts +44 -0
- package/dist/via/i18n/script.d.ts +26 -0
- package/dist/via/i18n/strategy.d.ts +13 -0
- package/dist/via/lookup/active.d.ts +19 -0
- package/dist/via/lookup/binding.d.ts +99 -0
- package/dist/via/lookup/descriptor.d.ts +123 -0
- package/dist/via/lookup/handle.d.ts +220 -0
- package/dist/via/lookup/index.d.ts +17 -0
- package/dist/via/lookup/registry.d.ts +228 -0
- package/dist/via/lookup/snapshot.d.ts +67 -0
- package/dist/via/money/arith.d.ts +68 -0
- package/dist/via/money/binding.d.ts +21 -0
- package/dist/via/money/branded.d.ts +61 -0
- package/dist/via/money/descriptor.d.ts +73 -0
- package/dist/via/money/fixed-point.d.ts +51 -0
- package/dist/via/money/index.d.ts +15 -0
- package/dist/via/money/iso4217.d.ts +6 -0
- package/dist/via/money/money-reducer.d.ts +33 -0
- package/dist/via/money/normalize.d.ts +105 -0
- package/dist/via/money/paths.d.ts +61 -0
- package/dist/via/money/where.d.ts +127 -0
- package/dist/walk-SVNDIZ62.js +241 -0
- package/dist/with/index.js +11 -11
- package/dist/with-audit/attestation/active.d.ts +10 -0
- package/dist/with-audit/attestation/index.d.ts +16 -0
- package/dist/with-audit/attestation/issue.d.ts +29 -0
- package/dist/with-audit/attestation/revoke.d.ts +15 -0
- package/dist/with-audit/attestation/signer.d.ts +33 -0
- package/dist/with-audit/attestation/strategy.d.ts +44 -0
- package/dist/with-audit/attestation/vault-facade.d.ts +62 -0
- package/dist/with-audit/consent/active.d.ts +14 -0
- package/dist/with-audit/consent/consent.d.ts +114 -0
- package/dist/with-audit/consent/index.d.ts +14 -0
- package/dist/with-audit/consent/strategy.d.ts +36 -0
- package/dist/with-audit/forget/active.d.ts +31 -0
- package/dist/with-audit/forget/index.d.ts +28 -0
- package/dist/with-audit/forget/purge-scope.d.ts +54 -0
- package/dist/with-audit/forget/strategy.d.ts +199 -0
- package/dist/with-audit/forget/subject-index.d.ts +83 -0
- package/dist/with-audit/guards/executor.d.ts +26 -0
- package/dist/with-audit/guards/immutable-guard.d.ts +63 -0
- package/dist/with-audit/guards/index.d.ts +10 -0
- package/dist/with-audit/guards/read-only-facade.d.ts +31 -0
- package/dist/with-audit/guards/registry.d.ts +83 -0
- package/dist/with-audit/guards/transition-guard.d.ts +82 -0
- package/dist/with-audit/guards/types.d.ts +134 -0
- package/dist/with-audit/guards/with-guard.d.ts +15 -0
- package/dist/with-audit/periods/active.d.ts +11 -0
- package/dist/with-audit/periods/index.d.ts +18 -0
- package/dist/with-audit/periods/periods.d.ts +417 -0
- package/dist/with-audit/periods/strategy.d.ts +32 -0
- package/dist/with-audit/periods/vault-facade.d.ts +95 -0
- package/dist/with-audit/portability/active.d.ts +11 -0
- package/dist/with-audit/portability/export-accessible.d.ts +46 -0
- package/dist/with-audit/portability/index.d.ts +18 -0
- package/dist/with-audit/portability/request-withdrawal.d.ts +85 -0
- package/dist/with-audit/portability/strategy.d.ts +31 -0
- package/dist/with-audit/portability/withdraw-accessible.d.ts +82 -0
- package/dist/with-audit/sealed-record/active.d.ts +9 -0
- package/dist/with-audit/sealed-record/index.d.ts +55 -0
- package/dist/with-audit/sealed-record/strategy.d.ts +34 -0
- package/dist/with-audit/sealed-record/types.d.ts +27 -0
- package/dist/with-audit/tiers/active.d.ts +9 -0
- package/dist/with-audit/tiers/index.d.ts +394 -0
- package/dist/with-audit/tiers/strategy.d.ts +36 -0
- package/dist/with-cargo/active.d.ts +11 -0
- package/dist/with-cargo/adopt-partition.d.ts +81 -0
- package/dist/with-cargo/decrypt-partition.d.ts +19 -0
- package/dist/with-cargo/describe-extraction.d.ts +41 -0
- package/dist/with-cargo/extract-partition.d.ts +155 -0
- package/dist/with-cargo/index.d.ts +33 -0
- package/dist/with-cargo/strategy.d.ts +30 -0
- package/dist/with-cargo/vault-diff.d.ts +144 -0
- package/dist/with-cargo/walk-closure.d.ts +67 -0
- package/dist/with-commit/crdt/active.d.ts +25 -0
- package/dist/with-commit/crdt/crdt.d.ts +42 -0
- package/dist/with-commit/crdt/index.d.ts +16 -0
- package/dist/with-commit/crdt/strategy.d.ts +25 -0
- package/dist/with-commit/history/active.d.ts +40 -0
- package/dist/with-commit/history/diff.d.ts +23 -0
- package/dist/with-commit/history/history.d.ts +73 -0
- package/dist/with-commit/history/index.d.ts +30 -0
- package/dist/with-commit/history/ledger/constants.d.ts +37 -0
- package/dist/with-commit/history/ledger/entry.d.ts +195 -0
- package/dist/with-commit/history/ledger/hash.d.ts +30 -0
- package/dist/with-commit/history/ledger/index.d.ts +19 -0
- package/dist/with-commit/history/ledger/patch.d.ts +99 -0
- package/dist/with-commit/history/ledger/store.d.ts +356 -0
- package/dist/with-commit/history/strategy.d.ts +136 -0
- package/dist/with-commit/history/time-machine.d.ts +202 -0
- package/dist/with-commit/numbering/descriptor.d.ts +27 -0
- package/dist/with-commit/numbering/index.d.ts +69 -0
- package/dist/with-commit/sequence/active.d.ts +10 -0
- package/dist/with-commit/sequence/index.d.ts +150 -0
- package/dist/with-commit/sequence/strategy.d.ts +26 -0
- package/dist/with-commit/tx/active.d.ts +27 -0
- package/dist/with-commit/tx/dry-run.d.ts +29 -0
- package/dist/with-commit/tx/elevated-handle.d.ts +59 -0
- package/dist/with-commit/tx/index.d.ts +13 -0
- package/dist/with-commit/tx/invariants.d.ts +68 -0
- package/dist/with-commit/tx/strategy.d.ts +23 -0
- package/dist/with-commit/tx/transaction.d.ts +212 -0
- package/dist/with-fork/archive/engine.d.ts +71 -0
- package/dist/with-fork/archive/index.d.ts +23 -0
- package/dist/with-fork/shadow/active.d.ts +6 -0
- package/dist/with-fork/shadow/index.d.ts +14 -0
- package/dist/with-fork/shadow/strategy.d.ts +28 -0
- package/dist/with-fork/shadow/vault-frame.d.ts +93 -0
- package/dist/with-fork/snapshots/active.d.ts +20 -0
- package/dist/with-fork/snapshots/engine.d.ts +36 -0
- package/dist/with-fork/snapshots/index.d.ts +5 -0
- package/dist/with-fork/snapshots/noydb-facade.d.ts +64 -0
- package/dist/with-fork/snapshots/policy.d.ts +23 -0
- package/dist/with-fork/snapshots/scheduler.d.ts +34 -0
- package/dist/with-fork/snapshots/strategy.d.ts +48 -0
- package/dist/with-formula/computed/index.d.ts +48 -0
- package/dist/with-formula/computed/lazy.d.ts +13 -0
- package/dist/with-formula/derivations/executor.d.ts +61 -0
- package/dist/with-formula/derivations/fanout-sidecar.d.ts +75 -0
- package/dist/with-formula/derivations/index.d.ts +6 -0
- package/dist/with-formula/derivations/registry.d.ts +67 -0
- package/dist/with-formula/derivations/stale.d.ts +39 -0
- package/dist/with-formula/derivations/strategy-hash.d.ts +1 -0
- package/dist/with-formula/derivations/types.d.ts +248 -0
- package/dist/with-formula/derivations/with-derivation.d.ts +10 -0
- package/dist/with-formula/derivations/with-rollup.d.ts +34 -0
- package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +58 -0
- package/dist/with-formula/materialized-views/executor.d.ts +80 -0
- package/dist/with-formula/materialized-views/index.d.ts +11 -0
- package/dist/with-formula/materialized-views/query-hash.d.ts +23 -0
- package/dist/with-formula/materialized-views/registry.d.ts +99 -0
- package/dist/with-formula/materialized-views/stale.d.ts +113 -0
- package/dist/with-formula/materialized-views/types.d.ts +318 -0
- package/dist/with-formula/materialized-views/with-materialized-view.d.ts +24 -0
- package/dist/with-formula/overlay-views/index.d.ts +5 -0
- package/dist/with-formula/overlay-views/registry.d.ts +42 -0
- package/dist/with-formula/overlay-views/types.d.ts +97 -0
- package/dist/with-formula/overlay-views/virtual-collection.d.ts +90 -0
- package/dist/with-formula/overlay-views/with-overlayed-view.d.ts +9 -0
- package/dist/with-lookup/aggregate/active.d.ts +33 -0
- package/dist/with-lookup/aggregate/aggregation.d.ts +166 -0
- package/dist/with-lookup/aggregate/canonical-key.d.ts +16 -0
- package/dist/with-lookup/aggregate/groupby.d.ts +280 -0
- package/dist/with-lookup/aggregate/index.d.ts +23 -0
- package/dist/with-lookup/aggregate/reducers.d.ts +257 -0
- package/dist/with-lookup/aggregate/strategy.d.ts +59 -0
- package/dist/with-lookup/embeddings/cosine.d.ts +2 -0
- package/dist/with-lookup/embeddings/descriptor.d.ts +8 -0
- package/dist/with-lookup/embeddings/index.d.ts +4 -0
- package/dist/with-lookup/embeddings/vec-id.d.ts +47 -0
- package/dist/with-lookup/embeddings/vector-set.d.ts +19 -0
- package/dist/with-lookup/indexing/active.d.ts +30 -0
- package/dist/with-lookup/indexing/collection-facade.d.ts +157 -0
- package/dist/with-lookup/indexing/eager-indexes.d.ts +122 -0
- package/dist/with-lookup/indexing/index.d.ts +27 -0
- package/dist/with-lookup/indexing/lazy-builder.d.ts +102 -0
- package/dist/with-lookup/indexing/persisted-indexes.d.ts +229 -0
- package/dist/with-lookup/indexing/strategy.d.ts +56 -0
- package/dist/with-lookup/indexing/unique-constraints.d.ts +74 -0
- package/dist/with-lookup/search/active.d.ts +10 -0
- package/dist/with-lookup/search/build-docs.d.ts +15 -0
- package/dist/with-lookup/search/collection-facade.d.ts +163 -0
- package/dist/with-lookup/search/fuse.d.ts +22 -0
- package/dist/with-lookup/search/index-store.d.ts +19 -0
- package/dist/with-lookup/search/index.d.ts +19 -0
- package/dist/with-lookup/search/inverted-index.d.ts +47 -0
- package/dist/with-lookup/search/persisted-index-store.d.ts +121 -0
- package/dist/with-lookup/search/retrieve-types.d.ts +29 -0
- package/dist/with-lookup/search/scan.d.ts +28 -0
- package/dist/with-lookup/search/segment.d.ts +15 -0
- package/dist/with-lookup/search/serialize.d.ts +4 -0
- package/dist/with-lookup/search/snippet.d.ts +5 -0
- package/dist/with-lookup/search/strategy.d.ts +41 -0
- package/dist/with-lookup/search/tokenize.d.ts +12 -0
- package/dist/with-party/auth-introspection/index.d.ts +44 -0
- package/dist/with-party/broker/active.d.ts +23 -0
- package/dist/with-party/broker/index.d.ts +28 -0
- package/dist/with-party/broker/seed.d.ts +77 -0
- package/dist/with-party/custody/active.d.ts +10 -0
- package/dist/with-party/custody/index.d.ts +69 -0
- package/dist/with-party/custody/liberate.d.ts +64 -0
- package/dist/with-party/custody/strategy.d.ts +48 -0
- package/dist/with-party/directory/index.d.ts +11 -0
- package/dist/with-party/directory/public-envelope/index.d.ts +12 -0
- package/dist/with-party/directory/public-envelope/schema.d.ts +24 -0
- package/dist/with-party/directory/public-envelope/storage.d.ts +59 -0
- package/dist/with-party/directory/public-envelope/types.d.ts +80 -0
- package/dist/with-party/directory/storage.d.ts +33 -0
- package/dist/with-party/directory/types.d.ts +43 -0
- package/dist/with-party/directory/user-envelope/api.d.ts +201 -0
- package/dist/with-party/directory/user-envelope/index.d.ts +12 -0
- package/dist/with-party/directory/user-envelope/storage.d.ts +54 -0
- package/dist/with-party/directory/visibility.d.ts +47 -0
- package/dist/with-party/policy/engine.d.ts +60 -0
- package/dist/with-party/policy/index.d.ts +15 -0
- package/dist/with-party/policy/noydb-facade.d.ts +39 -0
- package/dist/with-party/policy/presets.d.ts +38 -0
- package/dist/with-party/policy/storage.d.ts +31 -0
- package/dist/with-party/session/active.d.ts +34 -0
- package/dist/with-party/session/dev-unlock.d.ts +128 -0
- package/dist/with-party/session/index.d.ts +23 -0
- package/dist/with-party/session/session-policy.d.ts +92 -0
- package/dist/with-party/session/session.d.ts +131 -0
- package/dist/with-party/session/strategy.d.ts +42 -0
- package/dist/with-party/session/unlock-state.d.ts +47 -0
- package/dist/with-party/sync/index.d.ts +31 -0
- package/dist/with-party/tab-coordination.d.ts +73 -0
- package/dist/with-party/tab-write-relay.d.ts +39 -0
- package/dist/with-party/team/active.d.ts +13 -0
- package/dist/with-party/team/authenticators.d.ts +95 -0
- package/dist/with-party/team/deed.d.ts +97 -0
- package/dist/with-party/team/delegation.d.ts +88 -0
- package/dist/with-party/team/index.d.ts +38 -0
- package/dist/with-party/team/keyring.d.ts +318 -0
- package/dist/with-party/team/magic-link-grant.d.ts +152 -0
- package/dist/with-party/team/managed-passphrase.d.ts +280 -0
- package/dist/with-party/team/noydb-facade.d.ts +484 -0
- package/dist/with-party/team/peer-recover.d.ts +81 -0
- package/dist/with-party/team/presence.d.ts +81 -0
- package/dist/with-party/team/recovery.d.ts +191 -0
- package/dist/with-party/team/reserved-secret-collections.d.ts +41 -0
- package/dist/with-party/team/rotate-recover.d.ts +275 -0
- package/dist/with-party/team/shamir-recovery-provider.d.ts +15 -0
- package/dist/with-party/team/strategy.d.ts +9 -0
- package/dist/with-party/team/sync-active.d.ts +33 -0
- package/dist/with-party/team/sync-credentials.d.ts +113 -0
- package/dist/with-party/team/sync-strategy.d.ts +67 -0
- package/dist/with-party/team/sync-transaction.d.ts +39 -0
- package/dist/with-party/team/sync.d.ts +174 -0
- package/dist/with-party/team/tiers.d.ts +39 -0
- package/dist/with-party/team/wrapped-deks.d.ts +86 -0
- package/dist/with-pod/backup.d.ts +74 -0
- package/dist/with-pod/bundle.d.ts +414 -0
- package/dist/with-pod/format.d.ts +203 -0
- package/dist/with-pod/index.d.ts +20 -0
- package/dist/with-pod/pod-store.d.ts +54 -0
- package/dist/with-pod/ulid.d.ts +64 -0
- package/dist/with-shape/blobs/blob-compaction.d.ts +170 -0
- package/dist/with-shape/blobs/blob-intent.d.ts +153 -0
- package/dist/with-shape/blobs/blob-set.d.ts +1286 -0
- package/dist/with-shape/blobs/export-blobs.d.ts +110 -0
- package/dist/with-shape/blobs/import-external.d.ts +50 -0
- package/dist/with-shape/blobs/mime-magic.d.ts +48 -0
- package/dist/with-shape/blobs/object-projection.d.ts +70 -0
- package/dist/with-shape/introspection/describe.d.ts +237 -0
- package/dist/with-shape/introspection/field-meta.d.ts +61 -0
- package/dist/with-shape/introspection/fields.d.ts +14 -0
- package/dist/with-shape/introspection/index.d.ts +12 -0
- package/dist/with-shape/introspection/json-schema.d.ts +13 -0
- package/dist/with-shape/introspection/meta.d.ts +22 -0
- package/dist/with-shape/introspection/projection.d.ts +13 -0
- package/dist/with-shape/introspection/types.d.ts +154 -0
- package/dist/with-shape/introspection/walk.d.ts +50 -0
- package/dist/with-shape/links/lazy-handle.d.ts +36 -0
- package/dist/with-shape/links/link-set.d.ts +67 -0
- package/dist/with-shape/links/names.d.ts +65 -0
- package/dist/with-shape/links/vault-facade.d.ts +211 -0
- package/dist/with-shape/persisted-schemas/canonicalize.d.ts +11 -0
- package/dist/with-shape/persisted-schemas/derive.d.ts +29 -0
- package/dist/with-shape/persisted-schemas/index.d.ts +21 -0
- package/dist/with-shape/persisted-schemas/register.d.ts +66 -0
- package/dist/with-shape/persisted-schemas/storage.d.ts +61 -0
- package/dist/with-shape/persisted-schemas/types.d.ts +54 -0
- package/dist/with-shape/satellites/dead-filter.d.ts +21 -0
- package/dist/with-shape/satellites/declare.d.ts +60 -0
- package/dist/with-shape/satellites/existence.d.ts +5 -0
- package/dist/with-shape/satellites/fanout.d.ts +38 -0
- package/dist/with-shape/satellites/forget.d.ts +47 -0
- package/dist/with-shape/satellites/index.d.ts +3 -0
- package/dist/with-shape/satellites/joined.d.ts +19 -0
- package/dist/with-shape/satellites/marker.d.ts +10 -0
- package/dist/with-shape/satellites/migrate-cek.d.ts +26 -0
- package/dist/with-shape/satellites/post-register.d.ts +6 -0
- package/dist/with-shape/satellites/proxy.d.ts +37 -0
- package/dist/with-shape/satellites/raw-target.d.ts +14 -0
- package/dist/with-shape/satellites/registry.d.ts +19 -0
- package/dist/with-shape/satellites/types.d.ts +37 -0
- package/dist/with-shape/satellites/validate.d.ts +17 -0
- package/dist/with-shape/schema-update/client-registry.d.ts +35 -0
- package/dist/with-shape/schema-update/cutover.d.ts +5 -0
- package/dist/with-shape/schema-update/delta.d.ts +2 -0
- package/dist/with-shape/schema-update/dispatch.d.ts +3 -0
- package/dist/with-shape/schema-update/fence-controller.d.ts +62 -0
- package/dist/with-shape/schema-update/fence-watcher.d.ts +37 -0
- package/dist/with-shape/schema-update/fence.d.ts +15 -0
- package/dist/with-shape/schema-update/gate.d.ts +16 -0
- package/dist/with-shape/schema-update/index.d.ts +6 -0
- package/dist/with-shape/schema-update/store-coordination-provider.d.ts +29 -0
- package/dist/with-shape/schema-update/strategies.d.ts +12 -0
- package/dist/with-shape/schema-update/types.d.ts +53 -0
- package/dist/with-store/index.d.ts +15 -0
- package/dist/with-store/lazy/active.d.ts +12 -0
- package/dist/with-store/lazy/index.d.ts +14 -0
- package/dist/with-store/lazy/strategy.d.ts +9 -0
- package/dist/with-store/route-store.d.ts +259 -0
- package/dist/with-store/store-middleware.d.ts +189 -0
- package/dist/withdraw-accessible-WZIEVWSR.js +28 -0
- package/package.json +47 -55
- package/dist/adapter/index.d.ts +0 -5
- package/dist/adapter/index.js +0 -15
- package/dist/aggregate/index.d.ts +0 -42
- package/dist/api-JDWL67WL.js +0 -20
- package/dist/as/index.d.ts +0 -7
- package/dist/at/index.d.ts +0 -5
- package/dist/attestation/index.d.ts +0 -20
- package/dist/backup-WRGNTGJF.js +0 -225
- package/dist/backup-WRGNTGJF.js.map +0 -1
- package/dist/blobs/index.d.ts +0 -44
- package/dist/bundle/index.d.ts +0 -122
- package/dist/bundle-DzWtVw7w.d.ts +0 -548
- package/dist/by/index.d.ts +0 -1
- package/dist/cargo/index.d.ts +0 -9
- package/dist/chunk-25G7PUTA.js +0 -235
- package/dist/chunk-26FSVNBL.js +0 -34
- package/dist/chunk-2PJB6H3H.js +0 -167
- package/dist/chunk-2PJB6H3H.js.map +0 -1
- package/dist/chunk-37JZR7CY.js +0 -91
- package/dist/chunk-3KBK5LU4.js +0 -117
- package/dist/chunk-3YKBGS3I.js +0 -686
- package/dist/chunk-3YKBGS3I.js.map +0 -1
- package/dist/chunk-44DV37ZV.js +0 -75
- package/dist/chunk-44DV37ZV.js.map +0 -1
- package/dist/chunk-47C4CI7R.js +0 -108
- package/dist/chunk-47C4CI7R.js.map +0 -1
- package/dist/chunk-4VDFUBTS.js +0 -275
- package/dist/chunk-4VDFUBTS.js.map +0 -1
- package/dist/chunk-55LSDABW.js +0 -94
- package/dist/chunk-56JB2BGI.js +0 -13003
- package/dist/chunk-56JB2BGI.js.map +0 -1
- package/dist/chunk-5GQE5IDB.js +0 -513
- package/dist/chunk-5GQE5IDB.js.map +0 -1
- package/dist/chunk-5HRJQSKN.js +0 -202
- package/dist/chunk-5HZULLHE.js +0 -404
- package/dist/chunk-5JQMX2EH.js +0 -50
- package/dist/chunk-5UOPIPZC.js +0 -95
- package/dist/chunk-5YBUFCFF.js +0 -135
- package/dist/chunk-62APEMF3.js +0 -280
- package/dist/chunk-62APEMF3.js.map +0 -1
- package/dist/chunk-6P5AJ2ZS.js +0 -120
- package/dist/chunk-6P5AJ2ZS.js.map +0 -1
- package/dist/chunk-6PALJTC2.js +0 -430
- package/dist/chunk-6PALJTC2.js.map +0 -1
- package/dist/chunk-6S7T6WC4.js +0 -111
- package/dist/chunk-6S7T6WC4.js.map +0 -1
- package/dist/chunk-6Z435B6N.js +0 -1656
- package/dist/chunk-6Z435B6N.js.map +0 -1
- package/dist/chunk-723XB5NX.js +0 -86
- package/dist/chunk-7CZ6YXMO.js +0 -124
- package/dist/chunk-7KTL4RHZ.js +0 -120
- package/dist/chunk-7KTL4RHZ.js.map +0 -1
- package/dist/chunk-7TAV3BFQ.js +0 -766
- package/dist/chunk-7TAV3BFQ.js.map +0 -1
- package/dist/chunk-BASCPHNM.js +0 -380
- package/dist/chunk-BASCPHNM.js.map +0 -1
- package/dist/chunk-BGIZAFY7.js +0 -1
- package/dist/chunk-BJ2XF2RC.js +0 -823
- package/dist/chunk-BM6E4MUT.js +0 -881
- package/dist/chunk-BM6E4MUT.js.map +0 -1
- package/dist/chunk-BTFTHF6Q.js +0 -42
- package/dist/chunk-C4NOLA5X.js +0 -132
- package/dist/chunk-C4NOLA5X.js.map +0 -1
- package/dist/chunk-CHK5VVMI.js +0 -155
- package/dist/chunk-DCVVCJVB.js +0 -45
- package/dist/chunk-EU7HDMT3.js +0 -54
- package/dist/chunk-F3EKFGUS.js +0 -99
- package/dist/chunk-FCOZ7DEC.js +0 -355
- package/dist/chunk-FCOZ7DEC.js.map +0 -1
- package/dist/chunk-FWART3VA.js +0 -205
- package/dist/chunk-FZK3JJJK.js +0 -150
- package/dist/chunk-GDOOG5YQ.js +0 -382
- package/dist/chunk-GLVXQU3E.js +0 -155
- package/dist/chunk-HU55NPHZ.js +0 -80
- package/dist/chunk-I6JJ6VJS.js +0 -97
- package/dist/chunk-I6URUNTD.js +0 -59
- package/dist/chunk-IARAK3PK.js +0 -14
- package/dist/chunk-II6DLDZM.js +0 -30
- package/dist/chunk-J5YUA6JB.js +0 -23
- package/dist/chunk-J7OH6R4K.js +0 -49
- package/dist/chunk-K2WCO3NX.js +0 -1
- package/dist/chunk-L6Q5NA22.js +0 -40
- package/dist/chunk-LFGJG4XZ.js +0 -30
- package/dist/chunk-M3OYTM5Z.js +0 -85
- package/dist/chunk-MOQ5M46U.js +0 -209
- package/dist/chunk-NTPWQH4S.js +0 -589
- package/dist/chunk-OJ64XMPJ.js +0 -1434
- package/dist/chunk-OJ64XMPJ.js.map +0 -1
- package/dist/chunk-OWGAXPRE.js +0 -129
- package/dist/chunk-P2PEPSPK.js +0 -230
- package/dist/chunk-P6TZ3IVN.js +0 -453
- package/dist/chunk-P6TZ3IVN.js.map +0 -1
- package/dist/chunk-PAJCRV7O.js +0 -123
- package/dist/chunk-PMMV5SQC.js +0 -416
- package/dist/chunk-PMMV5SQC.js.map +0 -1
- package/dist/chunk-PPPZIBKY.js +0 -261
- package/dist/chunk-PPPZIBKY.js.map +0 -1
- package/dist/chunk-PVC2FBCQ.js +0 -45
- package/dist/chunk-PYIUDUGS.js +0 -36
- package/dist/chunk-QABECTNN.js +0 -255
- package/dist/chunk-QYMMMKOO.js +0 -164
- package/dist/chunk-R4IVPJHN.js +0 -130
- package/dist/chunk-REWTMYSF.js +0 -32
- package/dist/chunk-REWTMYSF.js.map +0 -1
- package/dist/chunk-RNYDHIQL.js +0 -367
- package/dist/chunk-RUIMKQTA.js +0 -23
- package/dist/chunk-RUIMKQTA.js.map +0 -1
- package/dist/chunk-TCGVRKOS.js +0 -367
- package/dist/chunk-TIAYXOEI.js +0 -99
- package/dist/chunk-TQ3REHVF.js +0 -95
- package/dist/chunk-TQ3REHVF.js.map +0 -1
- package/dist/chunk-TUL5YQWF.js +0 -777
- package/dist/chunk-U7LV2DUN.js +0 -74
- package/dist/chunk-UB3XHGFG.js +0 -181
- package/dist/chunk-UB3XHGFG.js.map +0 -1
- package/dist/chunk-UMH35AQV.js +0 -70
- package/dist/chunk-UWZ7O4NR.js +0 -29
- package/dist/chunk-V76PHWLE.js +0 -41
- package/dist/chunk-VFQOE76I.js +0 -69
- package/dist/chunk-VIWOGJ2O.js +0 -71
- package/dist/chunk-VK6OC22R.js +0 -37
- package/dist/chunk-VK6OC22R.js.map +0 -1
- package/dist/chunk-VVLOWY74.js +0 -150
- package/dist/chunk-VVLOWY74.js.map +0 -1
- package/dist/chunk-W3JABOVB.js +0 -53
- package/dist/chunk-W3JABOVB.js.map +0 -1
- package/dist/chunk-WPNP3NF5.js +0 -1221
- package/dist/chunk-WPNP3NF5.js.map +0 -1
- package/dist/chunk-X5QZAJDB.js +0 -59
- package/dist/chunk-X6VNIRHS.js +0 -239
- package/dist/chunk-X6VNIRHS.js.map +0 -1
- package/dist/chunk-XBPUVQDO.js +0 -664
- package/dist/chunk-XBPUVQDO.js.map +0 -1
- package/dist/chunk-XW5LZYV4.js +0 -21
- package/dist/chunk-YTCCC6NG.js +0 -320
- package/dist/chunk-YTCCC6NG.js.map +0 -1
- package/dist/classified/index.d.ts +0 -17
- package/dist/collection-facade-EJVIN2BY.js +0 -39
- package/dist/computed-6FOFXQPE.js +0 -11
- package/dist/config-drift-RFEVGBKR.js +0 -24
- package/dist/config-drift-RFEVGBKR.js.map +0 -1
- package/dist/consent/index.d.ts +0 -23
- package/dist/crdt/index.d.ts +0 -34
- package/dist/dead-filter-RHMNYOXP.js +0 -28
- package/dist/decrypt-partition-IHtxEnTi.d.ts +0 -21
- package/dist/delegation-IHXOASHV.js +0 -25
- package/dist/derivations/index.d.ts +0 -70
- package/dist/derive-CD3ZVIXK.js +0 -21
- package/dist/describe/index.d.ts +0 -1
- package/dist/describe/index.js +0 -1
- package/dist/describe-C6iHNlqJ.d.ts +0 -162
- package/dist/dev-unlock-wgQ7Ci5I.d.ts +0 -263
- package/dist/discriminant-BN9REW3o.d.ts +0 -60
- package/dist/enclave-KGEUW2GL.js +0 -123
- package/dist/executor-EUPYHCLU.js +0 -9
- package/dist/executor-KZ4B3PRT.js +0 -9
- package/dist/executor-MHUM2VZK.js +0 -21
- package/dist/export-accessible-Z3NSZZHN.js +0 -23
- package/dist/extract-partition-VSKT35JG.js +0 -36
- package/dist/fanout-sidecar-NBDKKCHT.js +0 -74
- package/dist/find-OH4BEULF.js +0 -11
- package/dist/forget/index.d.ts +0 -36
- package/dist/guards/index.d.ts +0 -35
- package/dist/hash-CwHnoKyW.d.ts +0 -72
- package/dist/history/index.d.ts +0 -61
- package/dist/i18n/index.d.ts +0 -37
- package/dist/in/index.d.ts +0 -5
- package/dist/index-B9QdHytu.d.ts +0 -123
- package/dist/index-CTvUp94-.d.ts +0 -123
- package/dist/index-Dn5GzPg_.d.ts +0 -22138
- package/dist/indexing/index.d.ts +0 -39
- package/dist/issue-AEOL6RXA.js +0 -19
- package/dist/kernel/index.d.ts +0 -32
- package/dist/kernel/index.js +0 -59
- package/dist/lazy/index.d.ts +0 -21
- package/dist/ledger-3LR3YO2W.js +0 -42
- package/dist/liberate-XSEPRWEA.js +0 -24
- package/dist/link-set-NSUIX6BR.js +0 -31
- package/dist/materialized-views/index.d.ts +0 -173
- package/dist/mime-magic-CYbFNQ4h.d.ts +0 -103
- package/dist/noydb-POVTIVQ6.js +0 -62
- package/dist/on/index.d.ts +0 -5
- package/dist/overlay-views/index.d.ts +0 -98
- package/dist/periods/index.d.ts +0 -20
- package/dist/pod/index.d.ts +0 -63
- package/dist/policy-Y7HL2KGA.js +0 -41
- package/dist/portability/index.d.ts +0 -20
- package/dist/post-register-KOFRTCDD.js +0 -55
- package/dist/post-register-KOFRTCDD.js.map +0 -1
- package/dist/public-envelope-NC7SPNMV.js +0 -32
- package/dist/query/index.d.ts +0 -5
- package/dist/read-only-facade-5ADRJVTM.js +0 -8
- package/dist/register-3D6R2MKN.js +0 -23
- package/dist/registry-AI4E46PD.js +0 -19
- package/dist/registry-HSNQ4NBP.js +0 -9
- package/dist/registry-WIX6QCV5.js +0 -17
- package/dist/request-withdrawal-GU4XS2R5.js +0 -31
- package/dist/reveal-5Y777N5Q.js +0 -38
- package/dist/reveal-5Y777N5Q.js.map +0 -1
- package/dist/revoke-ZFETCLYV.js +0 -24
- package/dist/revoke-ZFETCLYV.js.map +0 -1
- package/dist/satellites/index.d.ts +0 -5
- package/dist/sealed-record/index.d.ts +0 -69
- package/dist/session/index.d.ts +0 -44
- package/dist/shadow/index.d.ts +0 -15
- package/dist/signer-GAIMQQ2J.js +0 -25
- package/dist/signer-GAIMQQ2J.js.map +0 -1
- package/dist/snapshots/index.d.ts +0 -26
- package/dist/stale-77LP2EEF.js +0 -14
- package/dist/stale-77LP2EEF.js.map +0 -1
- package/dist/storage-KEXIXLGM.js +0 -23
- package/dist/storage-KEXIXLGM.js.map +0 -1
- package/dist/store-coordination-provider-NJDDZ264.js +0 -142
- package/dist/subject-index-O75wKshW.d.ts +0 -362
- package/dist/sync/index.d.ts +0 -41
- package/dist/team/index.d.ts +0 -155
- package/dist/tiers/index.d.ts +0 -5
- package/dist/to/index.d.ts +0 -5
- package/dist/transition-guard-D5RLJv8S.d.ts +0 -165
- package/dist/tx/index.d.ts +0 -35
- package/dist/ui/index.d.ts +0 -1
- package/dist/ulid-DRH25k3y.d.ts +0 -66
- package/dist/util/index.d.ts +0 -79
- package/dist/validators-C3lrVF-c.d.ts +0 -101
- package/dist/vault-diff-_LSIcOMv.d.ts +0 -147
- package/dist/verify-CAYGXYNO.js +0 -139
- package/dist/verify-CAYGXYNO.js.map +0 -1
- package/dist/walk-SMAE4IEI.js +0 -241
- package/dist/with/index.d.ts +0 -38
- package/dist/with-materialized-view-Xv1-9Bh0.d.ts +0 -27
- package/dist/with-overlayed-view-CuWhq_-C.d.ts +0 -12
- package/dist/with-rollup-K_iwal4b.d.ts +0 -47
- package/dist/withdraw-accessible-Q7BULAN5.js +0 -28
- package/dist/withdraw-accessible-Q7BULAN5.js.map +0 -1
- /package/dist/{adapter/index.js.map → api-ZGS6LCOF.js.map} +0 -0
- /package/dist/{chunk-VIWOGJ2O.js.map → chunk-3B5VVCNY.js.map} +0 -0
- /package/dist/{chunk-P2PEPSPK.js.map → chunk-3LQ2YKO4.js.map} +0 -0
- /package/dist/{chunk-EU7HDMT3.js.map → chunk-3QCRBHCY.js.map} +0 -0
- /package/dist/{chunk-FZK3JJJK.js.map → chunk-4JBYV75E.js.map} +0 -0
- /package/dist/{chunk-I6JJ6VJS.js.map → chunk-4NXKCLLQ.js.map} +0 -0
- /package/dist/{chunk-VFQOE76I.js.map → chunk-5M5DVGV7.js.map} +0 -0
- /package/dist/{chunk-LFGJG4XZ.js.map → chunk-5YOLBEQ6.js.map} +0 -0
- /package/dist/{chunk-OWGAXPRE.js.map → chunk-6CRIV7DE.js.map} +0 -0
- /package/dist/{chunk-QABECTNN.js.map → chunk-6QTNZJBS.js.map} +0 -0
- /package/dist/{chunk-723XB5NX.js.map → chunk-6T2SCQRU.js.map} +0 -0
- /package/dist/{chunk-PVC2FBCQ.js.map → chunk-7DSTRQIJ.js.map} +0 -0
- /package/dist/{chunk-NTPWQH4S.js.map → chunk-AUSTCW2X.js.map} +0 -0
- /package/dist/{chunk-MOQ5M46U.js.map → chunk-B3HJYUOF.js.map} +0 -0
- /package/dist/{chunk-QYMMMKOO.js.map → chunk-BDVFPG6Y.js.map} +0 -0
- /package/dist/{chunk-PYIUDUGS.js.map → chunk-CAF6WOK7.js.map} +0 -0
- /package/dist/{chunk-5HZULLHE.js.map → chunk-CIE2BASH.js.map} +0 -0
- /package/dist/{chunk-BTFTHF6Q.js.map → chunk-CRI4OUV4.js.map} +0 -0
- /package/dist/{chunk-37JZR7CY.js.map → chunk-DLG74CNB.js.map} +0 -0
- /package/dist/{chunk-TCGVRKOS.js.map → chunk-ERJ7FU55.js.map} +0 -0
- /package/dist/{chunk-FWART3VA.js.map → chunk-EVVGJDRQ.js.map} +0 -0
- /package/dist/{chunk-X5QZAJDB.js.map → chunk-EXK7QRWF.js.map} +0 -0
- /package/dist/{chunk-5HRJQSKN.js.map → chunk-EYZ6IQ6X.js.map} +0 -0
- /package/dist/{chunk-DCVVCJVB.js.map → chunk-F64IRYG3.js.map} +0 -0
- /package/dist/{chunk-BJ2XF2RC.js.map → chunk-FHS2HQSH.js.map} +0 -0
- /package/dist/{chunk-HU55NPHZ.js.map → chunk-GKEWXIV5.js.map} +0 -0
- /package/dist/{chunk-I6URUNTD.js.map → chunk-GTGPO5KW.js.map} +0 -0
- /package/dist/{chunk-5UOPIPZC.js.map → chunk-HB3RFQSC.js.map} +0 -0
- /package/dist/{chunk-F3EKFGUS.js.map → chunk-I6GALP6E.js.map} +0 -0
- /package/dist/{chunk-R4IVPJHN.js.map → chunk-IL6POWCW.js.map} +0 -0
- /package/dist/{chunk-3KBK5LU4.js.map → chunk-IU6SNYX6.js.map} +0 -0
- /package/dist/{chunk-TUL5YQWF.js.map → chunk-J2ZX2XUV.js.map} +0 -0
- /package/dist/{chunk-UWZ7O4NR.js.map → chunk-JKJOGPZN.js.map} +0 -0
- /package/dist/{chunk-V76PHWLE.js.map → chunk-JZUV47FZ.js.map} +0 -0
- /package/dist/{chunk-II6DLDZM.js.map → chunk-K5IMOGHB.js.map} +0 -0
- /package/dist/{chunk-GDOOG5YQ.js.map → chunk-LASZKVMO.js.map} +0 -0
- /package/dist/{chunk-5YBUFCFF.js.map → chunk-NR5LT5RY.js.map} +0 -0
- /package/dist/{chunk-UMH35AQV.js.map → chunk-Q5VNKNE5.js.map} +0 -0
- /package/dist/{chunk-XW5LZYV4.js.map → chunk-QLWMEXCT.js.map} +0 -0
- /package/dist/{chunk-PAJCRV7O.js.map → chunk-QRB7NAOJ.js.map} +0 -0
- /package/dist/{chunk-U7LV2DUN.js.map → chunk-R4ROFEYC.js.map} +0 -0
- /package/dist/{chunk-RNYDHIQL.js.map → chunk-RIX4V2TB.js.map} +0 -0
- /package/dist/{chunk-L6Q5NA22.js.map → chunk-RYCTDFUX.js.map} +0 -0
- /package/dist/{chunk-CHK5VVMI.js.map → chunk-RZ5SVOYR.js.map} +0 -0
- /package/dist/{chunk-TIAYXOEI.js.map → chunk-SLFHQTTW.js.map} +0 -0
- /package/dist/{chunk-J5YUA6JB.js.map → chunk-UNFPPVNI.js.map} +0 -0
- /package/dist/{chunk-25G7PUTA.js.map → chunk-VLFCJYTL.js.map} +0 -0
- /package/dist/{chunk-7CZ6YXMO.js.map → chunk-VN3DBQAU.js.map} +0 -0
- /package/dist/{chunk-J7OH6R4K.js.map → chunk-VZRODIM3.js.map} +0 -0
- /package/dist/{chunk-55LSDABW.js.map → chunk-W22IKJE2.js.map} +0 -0
- /package/dist/{chunk-GLVXQU3E.js.map → chunk-X3YYQWOQ.js.map} +0 -0
- /package/dist/{chunk-M3OYTM5Z.js.map → chunk-YFXZEAYK.js.map} +0 -0
- /package/dist/{chunk-5JQMX2EH.js.map → chunk-ZAJAVEXY.js.map} +0 -0
- /package/dist/{chunk-26FSVNBL.js.map → chunk-ZICD77GM.js.map} +0 -0
- /package/dist/{chunk-IARAK3PK.js.map → chunk-ZUODRVHY.js.map} +0 -0
- /package/dist/{api-JDWL67WL.js.map → collection-facade-TLWIPI76.js.map} +0 -0
- /package/dist/{chunk-BGIZAFY7.js.map → computed-ZIQTYTDI.js.map} +0 -0
- /package/dist/{dead-filter-RHMNYOXP.js.map → dead-filter-ESOBZZP5.js.map} +0 -0
- /package/dist/{chunk-K2WCO3NX.js.map → delegation-W7ZV2322.js.map} +0 -0
- /package/dist/{collection-facade-EJVIN2BY.js.map → derive-H2BJTLUI.js.map} +0 -0
- /package/dist/{computed-6FOFXQPE.js.map → enclave-AP3I5W7O.js.map} +0 -0
- /package/dist/{delegation-IHXOASHV.js.map → executor-KGWTNEQD.js.map} +0 -0
- /package/dist/{derive-CD3ZVIXK.js.map → executor-OVEXR6RT.js.map} +0 -0
- /package/dist/{describe/index.js.map → executor-UNEH5ZYH.js.map} +0 -0
- /package/dist/{enclave-KGEUW2GL.js.map → export-accessible-PCMXSUZS.js.map} +0 -0
- /package/dist/{executor-EUPYHCLU.js.map → extract-partition-SWHFSYJO.js.map} +0 -0
- /package/dist/{fanout-sidecar-NBDKKCHT.js.map → fanout-sidecar-A765THMX.js.map} +0 -0
- /package/dist/{executor-KZ4B3PRT.js.map → find-N6345CNT.js.map} +0 -0
- /package/dist/{executor-MHUM2VZK.js.map → issue-5OKB6I2R.js.map} +0 -0
- /package/dist/{export-accessible-Z3NSZZHN.js.map → ledger-GFBKVPV4.js.map} +0 -0
- /package/dist/{extract-partition-VSKT35JG.js.map → liberate-3VDOT4KO.js.map} +0 -0
- /package/dist/{find-OH4BEULF.js.map → link-set-Z7Q2ASFX.js.map} +0 -0
- /package/dist/{issue-AEOL6RXA.js.map → noydb-ZCJOYBDI.js.map} +0 -0
- /package/dist/{kernel/index.js.map → policy-Z3RUAIY2.js.map} +0 -0
- /package/dist/{ledger-3LR3YO2W.js.map → public-envelope-B4KNWVUA.js.map} +0 -0
- /package/dist/{liberate-XSEPRWEA.js.map → read-only-facade-CHCKSEPD.js.map} +0 -0
- /package/dist/{link-set-NSUIX6BR.js.map → register-VAHONCID.js.map} +0 -0
- /package/dist/{noydb-POVTIVQ6.js.map → registry-7MLVD3VO.js.map} +0 -0
- /package/dist/{policy-Y7HL2KGA.js.map → registry-EPKPD5SM.js.map} +0 -0
- /package/dist/{public-envelope-NC7SPNMV.js.map → registry-P5T7PS2U.js.map} +0 -0
- /package/dist/{read-only-facade-5ADRJVTM.js.map → request-withdrawal-TI3A5WPS.js.map} +0 -0
- /package/dist/{register-3D6R2MKN.js.map → revoke-FDRD6GRW.js.map} +0 -0
- /package/dist/{registry-AI4E46PD.js.map → signer-MUWEIUI6.js.map} +0 -0
- /package/dist/{registry-HSNQ4NBP.js.map → stale-OSQ7J3AA.js.map} +0 -0
- /package/dist/{registry-WIX6QCV5.js.map → storage-MVFCGEQE.js.map} +0 -0
- /package/dist/{store-coordination-provider-NJDDZ264.js.map → store-coordination-provider-64OEZFGS.js.map} +0 -0
- /package/dist/{walk-SMAE4IEI.js.map → walk-SVNDIZ62.js.map} +0 -0
- /package/dist/{request-withdrawal-GU4XS2R5.js.map → withdraw-accessible-WZIEVWSR.js.map} +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `withForgetCascade` — the active factory for GDPR right-to-erasure via
|
|
3
|
+
* per-record CEK crypto-shred. Mirrors the canonical
|
|
4
|
+
* `strategy.ts` (type + `NO_FORGET` sentinel) / `active.ts` (factory) split
|
|
5
|
+
* used by the other services.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { SubjectDeclaration, ForgetStrategy } from './strategy.js';
|
|
10
|
+
/**
|
|
11
|
+
* Declare GDPR crypto-shred for one or more collections.
|
|
12
|
+
*
|
|
13
|
+
* Each declared collection is forced to `perRecordKeys: true` (a shred can
|
|
14
|
+
* only guarantee erasure of a record whose body is keyed off a per-record
|
|
15
|
+
* CEK). On write, Noydb extracts `record[subjectField]` and maintains an
|
|
16
|
+
* encrypted `_subject_index` mapping `subject → [{collection, id}]`, so
|
|
17
|
+
* `vault.forget(subjectId)` can find every record for a subject and rewrite
|
|
18
|
+
* each to a tombstone (body + history permanently undecryptable) while the
|
|
19
|
+
* collection DEK and every other record stay intact.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* createNoydb({
|
|
24
|
+
* secret, user,
|
|
25
|
+
* forgetStrategy: withForgetCascade({ subjects: { invoices: 'buyerId' } }),
|
|
26
|
+
* })
|
|
27
|
+
* const result = await vault.forget('buyer-123')
|
|
28
|
+
* // → { subject, recordsShredded, historyVersionsShredded, collections, … }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function withForgetCascade(opts: SubjectDeclaration): ForgetStrategy;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@noy-db/hub/forget` — GDPR right-to-erasure via per-record CEK crypto-shred.
|
|
3
|
+
* Import `withForgetCascade` and pass it to `createNoydb`:
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { createNoydb } from '@noy-db/hub'
|
|
7
|
+
* import { withForgetCascade } from '@noy-db/hub/forget'
|
|
8
|
+
*
|
|
9
|
+
* const db = createNoydb({
|
|
10
|
+
* secret, user,
|
|
11
|
+
* historyStrategy: withHistory(), // ledger for the erasure proof
|
|
12
|
+
* forgetStrategy: withForgetCascade({ subjects: { invoices: 'buyerId' } }),
|
|
13
|
+
* })
|
|
14
|
+
* const result = await db.vault('main').forget('buyer-123')
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* The erasure flow (`vault.forget`), the subject-index maintenance hooks, and
|
|
18
|
+
* the tombstone rewrite live in core (`vault.ts` / `collection.ts`) because
|
|
19
|
+
* they touch the write path directly; this subpath only exposes the
|
|
20
|
+
* declaration factory + result types.
|
|
21
|
+
*
|
|
22
|
+
* @module
|
|
23
|
+
*/
|
|
24
|
+
export { withForgetCascade } from './active.js';
|
|
25
|
+
export { NO_FORGET } from './strategy.js';
|
|
26
|
+
export type { SubjectDeclaration, ForgetStrategy, ForgetResult, ScopedPurgeResidueNotice, } from './strategy.js';
|
|
27
|
+
export type { SubjectRef } from './subject-index.js';
|
|
28
|
+
export { SUBJECT_INDEX_COLLECTION } from './subject-index.js';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #633 — scoped-purge partitioning for the opt-in `scopedPurge` forget-strategy
|
|
3
|
+
* knob (`strategy.ts`'s `SubjectDeclaration.scopedPurge`). Pure helpers only —
|
|
4
|
+
* no store I/O, no `Vault`/`Collection` imports — kept out of `kernel/vault.ts`
|
|
5
|
+
* (exact zero-slack `kernel-surface` ceiling) and free of any circular-import
|
|
6
|
+
* risk with the kernel spine.
|
|
7
|
+
*
|
|
8
|
+
* The two `forget()` purge sites (`_sealed_cek` listing, blob shred) stay
|
|
9
|
+
* UNCONDITIONAL by default (byte-identical to pre-#633 behavior); when
|
|
10
|
+
* `scopedPurge` is `true`, each site calls into this module to decide what to
|
|
11
|
+
* purge vs. what to leave in place + report as residue, keyed off a
|
|
12
|
+
* per-collection declaration signal the caller (vault.ts) resolves itself:
|
|
13
|
+
* - sealed-CEK arm: `coll._via?.hasAtRestHooks === true` — the classified
|
|
14
|
+
* via binding's at-rest hooks (the "richer" declaration; a bare
|
|
15
|
+
* `sensitive` collection with NO classified binder does not count — it can
|
|
16
|
+
* still call `sealRecordToHost()` ad hoc, which is exactly the
|
|
17
|
+
* under-approximation #633 calls out).
|
|
18
|
+
* - blob arm: `this.blobFieldsRegistry.has(ref.collection)` — a collection
|
|
19
|
+
* can call `.blob(id)` regardless of this declaration (same
|
|
20
|
+
* under-approximation), which is why the default stays unconditional.
|
|
21
|
+
*
|
|
22
|
+
* @module
|
|
23
|
+
*/
|
|
24
|
+
import type { ScopedPurgeResidueReason } from './strategy.js';
|
|
25
|
+
/**
|
|
26
|
+
* Partitions an already-fetched vault-wide `_sealed_cek` key listing into
|
|
27
|
+
* keys to purge vs. a skipped count, for ONE ref's `<collection>/<id>/`
|
|
28
|
+
* prefix. No new store call — `keys` is the SAME listing the unconditional
|
|
29
|
+
* path already fetched. Default parity: when `scopedPurge` is false, or
|
|
30
|
+
* `declared` is true, every matching key is returned for purge and
|
|
31
|
+
* `skippedCount` is 0 — byte-identical to the unconditional behavior.
|
|
32
|
+
*/
|
|
33
|
+
export declare function partitionSealedCekKeys(keys: readonly string[], prefix: string, scopedPurge: boolean, declared: boolean): {
|
|
34
|
+
readonly toPurge: readonly string[];
|
|
35
|
+
readonly skippedCount: number;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* True when the blob arm should skip `ref.collection` entirely — no
|
|
39
|
+
* `.blob(id).shredAllForRecord()` call AND no `_blob_slots_<collection>`
|
|
40
|
+
* residue-detection `list()` call either (the perf win: scoped mode never
|
|
41
|
+
* pays for a per-collection scan on a collection that never declared
|
|
42
|
+
* `blobFields`).
|
|
43
|
+
*/
|
|
44
|
+
export declare function shouldSkipBlobScan(scopedPurge: boolean, declared: boolean): boolean;
|
|
45
|
+
/** Adds `count` (if positive) to `collection`'s running total in `map` — the
|
|
46
|
+
* per-collection residue accumulator both purge sites share. */
|
|
47
|
+
export declare function bumpResidueCount(map: Map<string, number>, collection: string, count: number): void;
|
|
48
|
+
/** Flattens an accumulated per-collection count map into `ForgetResult.scopedPurgeResidue` notices
|
|
49
|
+
* tagged with `reason`. Empty map → empty array (the unconditional-default case). */
|
|
50
|
+
export declare function residueNoticesFromMap(map: ReadonlyMap<string, number>, reason: ScopedPurgeResidueReason): {
|
|
51
|
+
readonly reason: ScopedPurgeResidueReason;
|
|
52
|
+
readonly collection: string;
|
|
53
|
+
readonly count: number;
|
|
54
|
+
}[];
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `withForgetCascade` — declaration surface for GDPR right-to-erasure via
|
|
3
|
+
* per-record CEK crypto-shred.
|
|
4
|
+
*
|
|
5
|
+
* This file holds only the *declaration* shape and the disabled sentinel.
|
|
6
|
+
* The actual erasure machinery lives in:
|
|
7
|
+
* - `subject-index.ts` — the encrypted `_subject_index` reserved collection
|
|
8
|
+
* - `vault.ts` `forget()` — the per-record tombstone + ledger flow
|
|
9
|
+
* - `collection.ts` `_writeTombstone` — the envelope rewrite
|
|
10
|
+
*
|
|
11
|
+
* A `ForgetStrategy` declares which collections carry erasable subject data
|
|
12
|
+
* and the (dotted-path) field on each record that names the data subject.
|
|
13
|
+
* Declaring a collection here ALSO forces `perRecordKeys: true` for it (a
|
|
14
|
+
* shred can only erase a record whose body is keyed off a per-record CEK),
|
|
15
|
+
* so adopters opt into the CEK foundation transitively.
|
|
16
|
+
*
|
|
17
|
+
* @module
|
|
18
|
+
*/
|
|
19
|
+
import type { LedgerEntry } from '../../with-commit/history/ledger/entry.js';
|
|
20
|
+
/**
|
|
21
|
+
* User-supplied declaration passed to {@link withForgetCascade}. Maps a
|
|
22
|
+
* collection name to the record field (dotted path supported, e.g.
|
|
23
|
+
* `'billing.buyerId'`) that identifies the data subject for erasure.
|
|
24
|
+
*
|
|
25
|
+
* ```ts
|
|
26
|
+
* withForgetCascade({ subjects: { invoices: 'buyerId', contacts: 'id' } })
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export interface SubjectDeclaration {
|
|
30
|
+
readonly subjects: Record<string, string>;
|
|
31
|
+
/**
|
|
32
|
+
* #633 — opt-in: gate the vault-level `_sealed_cek` and blob purges on
|
|
33
|
+
* per-collection via declarations instead of running them unconditionally
|
|
34
|
+
* for every forgotten ref. Default `false`/absent = today's unconditional
|
|
35
|
+
* behavior (byte-identical). See `purge-scope.ts` for the partition logic
|
|
36
|
+
* and the `scopedPurgeResidue` skip-reporting this enables.
|
|
37
|
+
*
|
|
38
|
+
* **Footgun:** a bare `sensitive: [...]` collection — no `classifiedFields`
|
|
39
|
+
* (no classified via binder compiled in) — counts as UNDECLARED for the
|
|
40
|
+
* sealed-CEK arm. Under `scopedPurge: true`, its `_sealed_cek` host-delivery
|
|
41
|
+
* envelopes are SKIPPED, not purged (reported via `scopedPurgeResidue`,
|
|
42
|
+
* reason `'skipped-undeclared-sealed-cek'`) even if that collection called
|
|
43
|
+
* `sealRecordToHost()` — the sealed CEK stays recoverable by that granted
|
|
44
|
+
* host until purged. Add a `classifiedFields` binding to close the gap, or
|
|
45
|
+
* leave `scopedPurge` off/false for the unconditional (always-purged) default.
|
|
46
|
+
* The declaration signal is session-local: a declared collection never opened
|
|
47
|
+
* (with its config) before `forget()` in this session counts as UNDECLARED —
|
|
48
|
+
* open it first, or its entries are skipped-and-reported.
|
|
49
|
+
*/
|
|
50
|
+
readonly scopedPurge?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Resolved forget strategy threaded through Noydb → every Vault. Carries
|
|
54
|
+
* the same `subjects` map the user declared. `NO_FORGET` (empty map) is the
|
|
55
|
+
* off-by-default sentinel; `vault.forget()` throws
|
|
56
|
+
* `ForgetStrategyNotConfiguredError` when the map is empty.
|
|
57
|
+
*/
|
|
58
|
+
export interface ForgetStrategy {
|
|
59
|
+
/** Collection → subject-field (dotted path). Empty under `NO_FORGET`. */
|
|
60
|
+
readonly subjects: Readonly<Record<string, string>>;
|
|
61
|
+
/** #633 — see {@link SubjectDeclaration.scopedPurge}. */
|
|
62
|
+
readonly scopedPurge?: boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Disabled sentinel — no collections declare a subject field. `vault.forget()`
|
|
66
|
+
* refuses with `ForgetStrategyNotConfiguredError`; no write hooks register; no
|
|
67
|
+
* collection is forced into `perRecordKeys`. Non-adopters pay nothing.
|
|
68
|
+
*/
|
|
69
|
+
export declare const NO_FORGET: ForgetStrategy;
|
|
70
|
+
/**
|
|
71
|
+
* The outcome of a `vault.forget(subjectId)` call.
|
|
72
|
+
*
|
|
73
|
+
* `unmigratedRecords` lists `collection:id` pairs that were tombstoned but
|
|
74
|
+
* whose body had NOT been migrated to a per-record CEK at shred time (legacy
|
|
75
|
+
* body still under the shared collection DEK). Those records are tombstoned
|
|
76
|
+
* (live envelope + history stripped) but their pre-shred ciphertext, if it
|
|
77
|
+
* leaked into a backup before migration, remains decryptable under the
|
|
78
|
+
* collection DEK — so erasure-completeness is NOT guaranteed for them. Run
|
|
79
|
+
* the per-record-CEK migration pass, then re-forget, to close the gap.
|
|
80
|
+
*
|
|
81
|
+
* Blob attachments: a shredded record's **erasable** blobs (on a
|
|
82
|
+
* `perRecordKeys` collection) are crypto-shredded inline — `blobsShredded`
|
|
83
|
+
* counts those taken to refCount 0 (BlobObject deleted → chunks permanently
|
|
84
|
+
* undecryptable), `blobsRetainedShared` counts those still referenced by
|
|
85
|
+
* another record (shared content legitimately persists for its other owner).
|
|
86
|
+
* `blobResidueCollections` now lists only collections with blobs that could
|
|
87
|
+
* NOT be crypto-shredded: **legacy** blobs (no per-blob `_cek`, chunks under
|
|
88
|
+
* the shared `_blob` DEK — migrate them), or a session without the blob
|
|
89
|
+
* service loaded. An all-erasable subject yields an empty residue list.
|
|
90
|
+
*/
|
|
91
|
+
export interface ForgetResult {
|
|
92
|
+
/** The subject id passed to `forget()`. Echoed for caller convenience. */
|
|
93
|
+
readonly subject: string;
|
|
94
|
+
/** Count of live records rewritten to a tombstone. */
|
|
95
|
+
readonly recordsShredded: number;
|
|
96
|
+
/** Count of `_history` envelopes tombstoned across all shredded records. */
|
|
97
|
+
readonly historyVersionsShredded: number;
|
|
98
|
+
/** Distinct collections that had at least one record shredded. */
|
|
99
|
+
readonly collections: readonly string[];
|
|
100
|
+
/** `collection:id` pairs shredded while still un-migrated (see type docs). */
|
|
101
|
+
readonly unmigratedRecords: readonly string[];
|
|
102
|
+
/** Count of erasable blobs crypto-shredded (refCount → 0, BlobObject deleted). */
|
|
103
|
+
readonly blobsShredded: number;
|
|
104
|
+
/** Count of erasable blobs retained because still referenced elsewhere (shared). */
|
|
105
|
+
readonly blobsRetainedShared: number;
|
|
106
|
+
/** Collections with blobs that could NOT be crypto-shredded — legacy (no `_cek`) or blobs disabled (see type docs). */
|
|
107
|
+
readonly blobResidueCollections: readonly string[];
|
|
108
|
+
/**
|
|
109
|
+
* Count of persisted `_idx/<field>/<recordId>` index side-cars hard-deleted
|
|
110
|
+
* across the shredded records. These live under the retained
|
|
111
|
+
* collection DEK, so crypto-shred alone would leave the indexed field VALUES
|
|
112
|
+
* readable — `forget()` must delete them.
|
|
113
|
+
*/
|
|
114
|
+
readonly indexPostingsPurged: number;
|
|
115
|
+
/**
|
|
116
|
+
* `collection:id:field` entries whose persisted `_idx` side-car could NOT be
|
|
117
|
+
* deleted — index residue that still leaks the indexed value under the
|
|
118
|
+
* retained collection DEK. Non-empty means erasure is INCOMPLETE: retry, or
|
|
119
|
+
* purge the side-car out of band.
|
|
120
|
+
*/
|
|
121
|
+
readonly indexResidue: readonly string[];
|
|
122
|
+
/**
|
|
123
|
+
* Count of `_sealed[field]` slots dropped from the live store across the
|
|
124
|
+
* shredded records. For slots written under `sensitive` +
|
|
125
|
+
* `perRecordKeys` (the current path), the key derives off the per-record CEK,
|
|
126
|
+
* so tombstoning the record — which drops `_cek` and `_sealed` — also
|
|
127
|
+
* crypto-shreds the value. A legacy slot (written before per-record CEKs) keys
|
|
128
|
+
* off the collection DEK instead, so dropping it removes it from the live store but a
|
|
129
|
+
* pre-forget backup remains recoverable by a DEK holder (same caveat `_data`
|
|
130
|
+
* carries); migrate by re-`put`ting before forgetting for full crypto-shred.
|
|
131
|
+
*/
|
|
132
|
+
readonly sealedFieldsShredded: number;
|
|
133
|
+
/** Count of `_sealed_cek` host-delivery envelopes deleted (#H-1). A record sealed to an
|
|
134
|
+
* at-* host via sealRecordToHost persists its raw CEK there; forget() must destroy them. */
|
|
135
|
+
readonly sealedCekEnvelopesPurged: number;
|
|
136
|
+
/** `collection:id` whose `_sealed_cek` purge failed (residue — the host-recoverable CEK may survive). */
|
|
137
|
+
readonly sealedCekResidue: readonly string[];
|
|
138
|
+
/** `collection:id:field` sealed slots that were DEK-derived (legacy, written before per-record CEKs) and thus NOT crypto-shredded
|
|
139
|
+
* by dropping `_cek` — the collection DEK is retained, so synced/backup copies stay decryptable (#M-1). */
|
|
140
|
+
readonly sealedResidue: readonly string[];
|
|
141
|
+
/** Count of `_ledger_deltas` rows hard-deleted across the shredded records (#734) — the
|
|
142
|
+
* erasure twin of #729's elevate-side purge. Entry metadata (that the record was mutated,
|
|
143
|
+
* at which version/timestamp/actor) is retained; only the plaintext delta content is removed. */
|
|
144
|
+
readonly ledgerDeltasPurged: number;
|
|
145
|
+
/** `collection:id` refs whose `_ledger_deltas` purge failed — plaintext delta residue still
|
|
146
|
+
* readable under the retained ledger DEK. Non-empty means erasure is INCOMPLETE. */
|
|
147
|
+
readonly ledgerDeltaResidue: readonly string[];
|
|
148
|
+
/** The single `op:'forget'` ledger entry appended for this erasure. */
|
|
149
|
+
readonly ledgerEntry: LedgerEntry;
|
|
150
|
+
/** #622 — record-grain derived artifacts (MV rows, per-record derived copies) erased
|
|
151
|
+
* because their source subject was forgotten. Overlay outputs are intentionally out of
|
|
152
|
+
* scope here — an overlay is always sourced from an MV, never directly from a subject
|
|
153
|
+
* collection, so the personal-data-bearing MV rows it reads are already erased above. */
|
|
154
|
+
readonly derivedRecordsErased: number;
|
|
155
|
+
/** #622 — aggregate-grain targets (rollups) recomputed without the forgotten contribution. */
|
|
156
|
+
readonly derivedAggregatesRecomputed: number;
|
|
157
|
+
/** #622 — `collection:id` derived writes SKIPPED because the target period is frozen
|
|
158
|
+
* (recompute deferred; the aggregate retains the forgotten contribution — audited). */
|
|
159
|
+
readonly derivedResidueFrozen: readonly string[];
|
|
160
|
+
/** #650 Task 5 (#648) — referencing records tombstoned via a `'ref'` edge's `cascade` policy. */
|
|
161
|
+
readonly lookupReferencesCascaded: number;
|
|
162
|
+
/** #650 Task 5 (#648) — referencing fields cleared via a `'ref'` edge's `nullify` policy. */
|
|
163
|
+
readonly lookupReferencesNullified: number;
|
|
164
|
+
/** #650 Task 5 review (Important fix) — `'ref'` edges whose compare-key could NOT be resolved,
|
|
165
|
+
* even from the LIVE pre-shred backing row — cascade/nullify propagation was SKIPPED for these.
|
|
166
|
+
* Always empty in the ordinary case; non-empty means the skip is reported, never silent. */
|
|
167
|
+
readonly lookupReferencesResidue: readonly string[];
|
|
168
|
+
/** #633 — scoped-purge skip notices (opt-in `scopedPurge`, see {@link SubjectDeclaration}).
|
|
169
|
+
* Always empty under the unconditional default. Non-empty means a `_sealed_cek` entry or a
|
|
170
|
+
* blob scan was skipped for an undeclared collection — reported, never a silent skip. */
|
|
171
|
+
readonly scopedPurgeResidue: readonly ScopedPurgeResidueNotice[];
|
|
172
|
+
/** #776/#782/#785 — `collection:id` MV-output rows that survived erasure invalidation (eager
|
|
173
|
+
* tombstone leg AND lazy/manual `invalidateMVAtRest`) despite belonging to the forgotten
|
|
174
|
+
* subject, because the `_materializedFrom` ownership stamp could NOT be decoded (undecodable
|
|
175
|
+
* under the collection's default DEK — e.g. elevated above tier 0 on a tiered output
|
|
176
|
+
* collection; ownership unconfirmed — could be a plain user record on a same-collection
|
|
177
|
+
* partition MV). Never erased, but surfaced here rather than silently skipped (the #724
|
|
178
|
+
* posture). Non-empty means the row may still hold the forgotten/pre-elevation contribution,
|
|
179
|
+
* decryptable by tier-holders. */
|
|
180
|
+
readonly derivedResidueUndecodable: readonly string[];
|
|
181
|
+
/** #782/#785 — `collection:id` MV-output rows that DID decode and stamp-match via
|
|
182
|
+
* `_materializedFrom`, but whose erasure was declined by the #718 tier-elevation gate
|
|
183
|
+
* (`_internalDelete` returned false). Ownership CONFIRMED here — a real silent survival,
|
|
184
|
+
* not a stamp-mismatch skip — surfaced rather than dropped. Non-empty means a live,
|
|
185
|
+
* tier-holder-decryptable copy of the forgotten contribution was deliberately retained. */
|
|
186
|
+
readonly derivedResidueDeclined: readonly string[];
|
|
187
|
+
}
|
|
188
|
+
/** #633 — the two `scopedPurgeResidue` skip reasons. Single source of truth: `purge-scope.ts`
|
|
189
|
+
* (the port-internal partition helpers) imports this rather than redeclaring it. */
|
|
190
|
+
export type ScopedPurgeResidueReason = 'skipped-undeclared-sealed-cek' | 'skipped-undeclared-blob-scan';
|
|
191
|
+
/** #633 — one `ForgetResult.scopedPurgeResidue` entry: an undeclared collection's sealed-CEK
|
|
192
|
+
* entries left unpurged, or its blob scan skipped entirely, under `scopedPurge`. `count` is the
|
|
193
|
+
* number of `_sealed_cek` entries left in place (sealed-cek reason) or the number of refs whose
|
|
194
|
+
* blob scan was skipped (blob-scan reason) — aggregated per collection across the whole call. */
|
|
195
|
+
export interface ScopedPurgeResidueNotice {
|
|
196
|
+
readonly reason: ScopedPurgeResidueReason;
|
|
197
|
+
readonly collection: string;
|
|
198
|
+
readonly count: number;
|
|
199
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The encrypted subject index.
|
|
3
|
+
*
|
|
4
|
+
* GDPR crypto-shred needs to answer "which records belong to data subject
|
|
5
|
+
* X?" portably (the index must travel with the vault/bundle) WITHOUT leaking
|
|
6
|
+
* subject-equivalence to the store. The rejected alternative — an unencrypted
|
|
7
|
+
* subject tag in envelope metadata — would let anyone with store access see
|
|
8
|
+
* which records share a subject. Instead we keep a reserved `_subject_index`
|
|
9
|
+
* collection, encrypted under its OWN DEK (`getDEK('_subject_index')`):
|
|
10
|
+
*
|
|
11
|
+
* - record id = `HMAC-SHA256(indexDEK, subjectId)` (M-2). A bare
|
|
12
|
+
* `sha256Hex(subjectId)` would be offline-computable: an attacker with
|
|
13
|
+
* store access and a candidate list (emails / customer ids are low-entropy)
|
|
14
|
+
* could dictionary the hash to confirm "subject X is present here." Keying
|
|
15
|
+
* the id with the vault-only index DEK removes that capability — without the
|
|
16
|
+
* DEK the id cannot be derived. (Legacy entries written before M-2 used the
|
|
17
|
+
* bare sha256 id; the read/remove paths dual-look-up both forms.)
|
|
18
|
+
* - record body = AES-GCM(JSON `{ r: [{ collection, id }], p }`) under the
|
|
19
|
+
* index DEK, where `p` pads the plaintext to a bucketed length so the
|
|
20
|
+
* ciphertext `_data` length does not leak the approximate record count.
|
|
21
|
+
* Legacy bodies were a bare `[{ collection, id }]` array; reads accept both.
|
|
22
|
+
*
|
|
23
|
+
* ## Concurrency (RISK #3 — known v1 limitation)
|
|
24
|
+
*
|
|
25
|
+
* `addSubjectRef` / `removeSubjectRef` are read-modify-write with no CAS. The
|
|
26
|
+
* design assumes a SINGLE WRITER (the noy-db single-process write model). Two
|
|
27
|
+
* concurrent writers racing on the SAME subject can lose an entry (last-write
|
|
28
|
+
* wins on the ref list). This is documented, not fixed in v1:
|
|
29
|
+
* `rebuildSubjectIndex` performs a full scan to recover a correct index from
|
|
30
|
+
* the canonical records, so a lost ref is recoverable. A CAS-backed index is
|
|
31
|
+
* deferred to a later slice.
|
|
32
|
+
*
|
|
33
|
+
* @module
|
|
34
|
+
*/
|
|
35
|
+
import { type EnclaveKey } from '../../kernel/enclave/index.js';
|
|
36
|
+
import type { NoydbStore, EncryptedEnvelope } from '../../kernel/types.js';
|
|
37
|
+
/** Reserved collection holding the encrypted subject → records index. */
|
|
38
|
+
export declare const SUBJECT_INDEX_COLLECTION = "_subject_index";
|
|
39
|
+
/** A single record reference held in a subject's index entry. */
|
|
40
|
+
export interface SubjectRef {
|
|
41
|
+
readonly collection: string;
|
|
42
|
+
readonly id: string;
|
|
43
|
+
}
|
|
44
|
+
type GetDEK = (collectionName: string) => Promise<EnclaveKey>;
|
|
45
|
+
/**
|
|
46
|
+
* Add a `{ collection, id }` ref to a subject's index entry (idempotent —
|
|
47
|
+
* a duplicate ref is not appended). Read-modify-write; see the concurrency
|
|
48
|
+
* note in the module docstring.
|
|
49
|
+
*/
|
|
50
|
+
export declare function addSubjectRef(adapter: NoydbStore, vault: string, getDEK: GetDEK, encrypted: boolean, subjectId: string, ref: SubjectRef): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Remove a `{ collection, id }` ref from a subject's index entry. When the
|
|
53
|
+
* last ref is removed the (now empty) entry is deleted so the store holds no
|
|
54
|
+
* residual key for an erased subject.
|
|
55
|
+
*/
|
|
56
|
+
export declare function removeSubjectRef(adapter: NoydbStore, vault: string, getDEK: GetDEK, encrypted: boolean, subjectId: string, ref: SubjectRef): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Look up every record ref for a subject. Returns `[]` when none exist. Unions
|
|
59
|
+
* the keyed (M-2) and legacy sha256 entries (dual-lookup), deduplicated, so a
|
|
60
|
+
* subject indexed before M-2 is still fully found.
|
|
61
|
+
*/
|
|
62
|
+
export declare function lookupSubject(adapter: NoydbStore, vault: string, getDEK: GetDEK, encrypted: boolean, subjectId: string): Promise<SubjectRef[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Rebuild the entire subject index from the canonical records (the recovery
|
|
65
|
+
* path for the documented read-modify-write race). Scans each declared
|
|
66
|
+
* collection, reads `record[subjectField]` (dotted path), and rewrites the
|
|
67
|
+
* index from scratch. Tombstoned (already-shredded) records contribute no
|
|
68
|
+
* ref — their body is gone, so they cannot be re-indexed.
|
|
69
|
+
*
|
|
70
|
+
* `decodeRecord` decrypts an envelope to a plain object (or returns null for
|
|
71
|
+
* a tombstone / unreadable record); supplied by the caller so this module
|
|
72
|
+
* stays free of Collection internals.
|
|
73
|
+
*/
|
|
74
|
+
export declare function rebuildSubjectIndex(adapter: NoydbStore, vault: string, getDEK: GetDEK, encrypted: boolean, subjects: Readonly<Record<string, string>>, decodeRecord: (collection: string, id: string, env: EncryptedEnvelope) => Promise<Record<string, unknown> | null>): Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* Coerce a read subject-field value to a stable string id. Primitives use
|
|
77
|
+
* their natural string form; objects/arrays are JSON-stringified so structural
|
|
78
|
+
* subjects still get a deterministic key (avoids the `[object Object]` trap).
|
|
79
|
+
*/
|
|
80
|
+
export declare function coerceSubjectId(value: unknown): string;
|
|
81
|
+
/** Read a (possibly dotted) field path from a plain record. */
|
|
82
|
+
export declare function readDottedPath(record: Record<string, unknown>, field: string): unknown;
|
|
83
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { GuardStrategy, GuardContext, GuardChange } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pure functions that execute the work declared by a `GuardStrategy`.
|
|
4
|
+
* Stateless — `GuardRegistry` decides when to call these.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export declare const GuardExecutor: {
|
|
9
|
+
/**
|
|
10
|
+
* Compare existing vs incoming for each `frozenFields.fields` entry
|
|
11
|
+
* when `frozenFields.when(existing)` is true. Throws
|
|
12
|
+
* `FieldFrozenError` listing every changed frozen field.
|
|
13
|
+
*
|
|
14
|
+
* @param skipFields — field names that are schema-owned computed fields.
|
|
15
|
+
* These are excluded from the comparison because `incoming` carries the
|
|
16
|
+
* raw user input (computed fields not yet evaluated), so comparing
|
|
17
|
+
* `existing[field]` vs `incoming[field]` would always look like a
|
|
18
|
+
* change even when the computed result is unchanged.
|
|
19
|
+
*/
|
|
20
|
+
checkFrozenFields<T extends Record<string, unknown>>(guard: GuardStrategy<T>, id: string, existing: T | null, incoming: T, skipFields?: ReadonlySet<string>): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Run a single guard's invariant over its slice of the change-set.
|
|
23
|
+
* Any throw is converted to `InvariantError` unless it already is one.
|
|
24
|
+
*/
|
|
25
|
+
runInvariant<T extends Record<string, unknown>>(guard: GuardStrategy<T>, changes: ReadonlyArray<GuardChange<T>>, ctx: GuardContext<T>): Promise<void>;
|
|
26
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `immutableGuard` — declarative WORM / append-only sugar over the guard
|
|
3
|
+
* service.
|
|
4
|
+
*
|
|
5
|
+
* Issued fiscal documents (invoices, DDTs) must be immutable after issue.
|
|
6
|
+
* That is expressible today with a hand-rolled `withGuard` (block on
|
|
7
|
+
* `check`/`onDelete`, allow an admin `amendment`), but the boilerplate is
|
|
8
|
+
* repetitive and easy to get subtly wrong. `immutableGuard` generates
|
|
9
|
+
* exactly that guard from a declarative config, reusing the guard
|
|
10
|
+
* machinery wholesale — `check`/`onDelete` rejection, the ledgered
|
|
11
|
+
* `amendment` override, and composition with `periods`/`history`.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* createNoydb({ guardStrategies: [
|
|
15
|
+
* immutableGuard({
|
|
16
|
+
* collection: 'invoices',
|
|
17
|
+
* after: (r) => r.status === 'issued', // immutable once issued
|
|
18
|
+
* }),
|
|
19
|
+
* ] })
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* A record is mutable until `after(record)` holds; from then on, updates
|
|
23
|
+
* and deletes throw `RecordLockedError` unless performed inside an
|
|
24
|
+
* `amendment` transaction by an authorized role (the override is
|
|
25
|
+
* ledgered by the guard amendment mechanism). `appendOnly: true` is
|
|
26
|
+
* shorthand for `after: () => true` — immutable from creation.
|
|
27
|
+
*/
|
|
28
|
+
import type { GuardStrategyHandle, GuardContext, GuardChange } from './types.js';
|
|
29
|
+
export interface ImmutableGuardConfig<T extends Record<string, unknown>> {
|
|
30
|
+
/** The collection to make WORM. */
|
|
31
|
+
collection: string;
|
|
32
|
+
/**
|
|
33
|
+
* A record becomes immutable once this predicate holds. Evaluated on
|
|
34
|
+
* the *existing* (already-persisted) record, so the write that first
|
|
35
|
+
* makes it true is still allowed; subsequent writes are blocked.
|
|
36
|
+
* Mutually exclusive with `appendOnly`.
|
|
37
|
+
*/
|
|
38
|
+
after?: (record: T) => boolean;
|
|
39
|
+
/** Shorthand for `after: () => true` — immutable from creation. */
|
|
40
|
+
appendOnly?: boolean;
|
|
41
|
+
/** Roles permitted to override via an amendment transaction. Default `['admin', 'owner']`. */
|
|
42
|
+
amendmentRoles?: ReadonlyArray<'admin' | 'owner'>;
|
|
43
|
+
/**
|
|
44
|
+
* Optional set-level invariant run over the amendment change-set after
|
|
45
|
+
* the writes execute. Signature matches `GuardStrategy.amendment.invariant`
|
|
46
|
+
* exactly: it receives every {before, after} pair touching this
|
|
47
|
+
* collection in the amendment plus the guard context; throwing reverts
|
|
48
|
+
* the whole amendment and surfaces as `InvariantError`.
|
|
49
|
+
*
|
|
50
|
+
* Use this to keep a constraint inviolable EVEN under amendment — e.g.
|
|
51
|
+
* forbid deleting an issued document by re-throwing on any
|
|
52
|
+
* `before !== null && after === null` change, or assert a cross-record
|
|
53
|
+
* sum is preserved. When omitted the amendment is unconditionally
|
|
54
|
+
* allowed (the amendment itself is the sanctioned, ledgered override) —
|
|
55
|
+
* this is the backward-compatible default.
|
|
56
|
+
*/
|
|
57
|
+
amendmentInvariant?: (changes: ReadonlyArray<GuardChange<T>>, ctx: GuardContext<T>) => Promise<void> | void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Build an immutability guard. Pass the returned handle to
|
|
61
|
+
* `createNoydb({ guardStrategies: [...] })`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function immutableGuard<T extends Record<string, unknown>>(config: ImmutableGuardConfig<T>): GuardStrategyHandle<T>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { withGuard } from './with-guard.js';
|
|
2
|
+
export { immutableGuard } from './immutable-guard.js';
|
|
3
|
+
export type { ImmutableGuardConfig } from './immutable-guard.js';
|
|
4
|
+
export { transitionGuard } from './transition-guard.js';
|
|
5
|
+
export type { TransitionGuardConfig } from './transition-guard.js';
|
|
6
|
+
export { GuardRegistry } from './registry.js';
|
|
7
|
+
export { GuardExecutor } from './executor.js';
|
|
8
|
+
export { ReadOnlyVaultFacade } from './read-only-facade.js';
|
|
9
|
+
export type { GuardStrategy, GuardStrategyHandle, GuardContext, GuardChange, } from './types.js';
|
|
10
|
+
export { RecordLockedError, FieldFrozenError, IllegalTransitionError, InvariantError, AmendmentForbiddenError, } from '../../kernel/errors.js';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Vault } from '../../kernel/vault.js';
|
|
2
|
+
import type { Query } from '../../kernel/query/builder.js';
|
|
3
|
+
import type { Layer } from '../../via/i18n/policy.js';
|
|
4
|
+
import type { ReadOnlyVaultFacade as ReadOnlyVaultFacadeContract } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Minimal read-only wrapper over a `Vault`. Used as `ctx.vault` inside
|
|
7
|
+
* guard / derivation callbacks so they can fetch related records without
|
|
8
|
+
* acquiring any write capability.
|
|
9
|
+
*
|
|
10
|
+
* The `layer` tags every `get`/`list` read with the resolution layer it
|
|
11
|
+
* belongs to. A guard-seeded facade reads at `'guard'`, a
|
|
12
|
+
* derivation-seeded one at `'derivation'`, so i18nText / dictKey fields
|
|
13
|
+
* resolve under that layer's `onMissing` policy instead of the `'read'`
|
|
14
|
+
* policy — e.g. a guard read can `substitute` a missing locale (lenient
|
|
15
|
+
* default) while the same field `throw`s on an ordinary app read.
|
|
16
|
+
*
|
|
17
|
+
* `query()` is left untagged: the query/aggregate pipeline reads raw
|
|
18
|
+
* `{locale}` maps (no resolution call site), so a layer tag there would be
|
|
19
|
+
* inert. Routing `mv`/`join` resolution through the pipeline is tracked
|
|
20
|
+
* separately.
|
|
21
|
+
*/
|
|
22
|
+
export declare class ReadOnlyVaultFacade implements ReadOnlyVaultFacadeContract {
|
|
23
|
+
private readonly _vault;
|
|
24
|
+
private readonly _layer;
|
|
25
|
+
constructor(vault: Vault, layer?: Layer);
|
|
26
|
+
collection<T = unknown>(name: string): {
|
|
27
|
+
get(id: string): Promise<T | null>;
|
|
28
|
+
list(): Promise<T[]>;
|
|
29
|
+
query(): Query<T>;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { GuardStrategy, GuardContext, GuardChange } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Per-record metadata attached to every entry in an amendment's
|
|
4
|
+
* change-set. Carried in a parallel map alongside `_amendmentChanges`
|
|
5
|
+
* so the public {@link GuardChange} shape (`{ before, after }`) stays
|
|
6
|
+
* clean for invariant authors — the audit ledger reads this side
|
|
7
|
+
* structure to produce the `{ collection, id, vBefore, vAfter }`
|
|
8
|
+
* tuples for the amendment entry.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export interface AmendmentChangeMeta {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly vBefore: number;
|
|
15
|
+
readonly vAfter: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Vault-internal singleton that holds the guard graph and dispatches
|
|
19
|
+
* per-collection guard execution. Owned by `Vault`; not exported.
|
|
20
|
+
*
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
type AnyGuard = GuardStrategy<Record<string, unknown>>;
|
|
24
|
+
type AnyChange = GuardChange<Record<string, unknown>>;
|
|
25
|
+
export declare class GuardRegistry {
|
|
26
|
+
private readonly _byCollection;
|
|
27
|
+
private _amendmentChanges;
|
|
28
|
+
private _amendmentMeta;
|
|
29
|
+
/** Register a guard. Multiple guards per collection are allowed. */
|
|
30
|
+
register<T extends Record<string, unknown>>(spec: GuardStrategy<T>): void;
|
|
31
|
+
/** All guards registered against `collection` in registration order. */
|
|
32
|
+
guardsFor(collection: string): ReadonlyArray<AnyGuard>;
|
|
33
|
+
/** Per-collection guard counts, for introspection. */
|
|
34
|
+
summary(): {
|
|
35
|
+
collection: string;
|
|
36
|
+
count: number;
|
|
37
|
+
}[];
|
|
38
|
+
/**
|
|
39
|
+
* Run every guard's `check` for this collection. First throw wins —
|
|
40
|
+
* remaining guards are not invoked. Guards without a `check` skip.
|
|
41
|
+
*/
|
|
42
|
+
runChecks<T>(collection: string, incoming: T, ctx: GuardContext<T>): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Run every guard's `onDelete` for this collection. First throw wins —
|
|
45
|
+
* remaining guards are not invoked. Guards without an `onDelete` skip.
|
|
46
|
+
* Mirrors {@link runChecks} but for the delete path.
|
|
47
|
+
*/
|
|
48
|
+
runOnDelete<T>(collection: string, existing: T, ctx: GuardContext<T>): Promise<void>;
|
|
49
|
+
/** True if any guard for `collection` declares an `amendment` block. */
|
|
50
|
+
hasAmendment(collection: string): boolean;
|
|
51
|
+
/** Open a new amendment change-collection window. */
|
|
52
|
+
beginAmendment(): void;
|
|
53
|
+
/** True iff we're currently inside an amendment transaction. */
|
|
54
|
+
isAmendmentActive(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Record a {before, after} pair for the active amendment. `vBefore`
|
|
57
|
+
* and `vAfter` are stored in a parallel meta structure so the public
|
|
58
|
+
* {@link GuardChange} shape handed to invariant callbacks stays
|
|
59
|
+
* `{ before, after }` only — the audit ledger reads version metadata
|
|
60
|
+
* via {@link consumeMeta}.
|
|
61
|
+
*/
|
|
62
|
+
collectChange<T>(collection: string, id: string, before: T | null, after: T, vBefore?: number, vAfter?: number): void;
|
|
63
|
+
/**
|
|
64
|
+
* Drain the change-set and close the amendment window. The caller
|
|
65
|
+
* (transaction commit) feeds these to each affected guard's invariant.
|
|
66
|
+
*/
|
|
67
|
+
consumeChanges(): ReadonlyMap<string, ReadonlyArray<AnyChange>>;
|
|
68
|
+
/**
|
|
69
|
+
* Drain the parallel id/version metadata captured during the
|
|
70
|
+
* amendment. Returned as a flat list with `collection` denormalised
|
|
71
|
+
* so the audit ledger can emit one `{ collection, id, vBefore,
|
|
72
|
+
* vAfter }` tuple per record. Must be called AFTER
|
|
73
|
+
* {@link consumeChanges} (or independently) — calling it closes the
|
|
74
|
+
* meta window in the same way.
|
|
75
|
+
*/
|
|
76
|
+
consumeMeta(): ReadonlyArray<{
|
|
77
|
+
collection: string;
|
|
78
|
+
id: string;
|
|
79
|
+
vBefore: number;
|
|
80
|
+
vAfter: number;
|
|
81
|
+
}>;
|
|
82
|
+
}
|
|
83
|
+
export {};
|