@noy-db/hub 0.7.1-pre.0 → 0.8.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.
Files changed (812) hide show
  1. package/CHANGELOG.md +147 -14
  2. package/LICENSE +202 -21
  3. package/NOTICE +1 -0
  4. package/README.md +5 -5
  5. package/codemods/0.8.0-pre.json +61 -0
  6. package/dist/api-OS747DS4.js +18 -0
  7. package/dist/as/index.js +11 -12
  8. package/dist/as/index.js.map +1 -1
  9. package/dist/at/index.js +9 -10
  10. package/dist/attestation/index.js +37 -26
  11. package/dist/attestation/index.js.map +1 -1
  12. package/dist/{backup-XKCXVKV3.js → backup-YE2VQ26S.js} +15 -16
  13. package/dist/backup-YE2VQ26S.js.map +1 -0
  14. package/dist/blobs/index.js +13 -14
  15. package/dist/blobs/index.js.map +1 -1
  16. package/dist/broker/index.js +12 -13
  17. package/dist/broker/index.js.map +1 -1
  18. package/dist/by/index.js +2 -2
  19. package/dist/capsule/contract.d.ts +159 -0
  20. package/dist/capsule/contract.js +95 -0
  21. package/dist/capsule/enclave-aes/bound.d.ts +52 -0
  22. package/dist/capsule/enclave-aes/capabilities.d.ts +2 -0
  23. package/dist/capsule/enclave-aes/classify/compare.d.ts +20 -0
  24. package/dist/{kernel/enclave → capsule/enclave-aes}/classify/find.d.ts +1 -1
  25. package/dist/{kernel/enclave → capsule/enclave-aes}/classify/reveal.d.ts +1 -1
  26. package/dist/{kernel/enclave → capsule/enclave-aes}/classify/verify.d.ts +2 -2
  27. package/dist/{kernel/enclave → capsule/enclave-aes}/classify/write.d.ts +1 -1
  28. package/dist/{kernel/enclave → capsule/enclave-aes}/crypto.d.ts +33 -129
  29. package/dist/capsule/enclave-aes/index.d.ts +113 -0
  30. package/dist/capsule/enclave-aes/index.js +335 -0
  31. package/dist/capsule/enclave-aes/index.js.map +1 -0
  32. package/dist/capsule/enclave-aes/primitives.d.ts +29 -0
  33. package/dist/capsule/index.d.ts +27 -0
  34. package/dist/capsule/plumbing/ct-equal.d.ts +11 -0
  35. package/dist/{kernel/enclave/record-keys → capsule/plumbing}/deterministic.d.ts +8 -21
  36. package/dist/capsule/plumbing/digest.d.ts +122 -0
  37. package/dist/{kernel/enclave/record-keys → capsule/plumbing}/envelope-body.d.ts +44 -48
  38. package/dist/capsule/plumbing/index.d.ts +100 -0
  39. package/dist/capsule/plumbing/lifecycle.d.ts +50 -0
  40. package/dist/{kernel/enclave/record-keys → capsule/plumbing}/record-codec.d.ts +80 -20
  41. package/dist/{kernel/enclave → capsule/plumbing}/record-envelope.d.ts +1 -1
  42. package/dist/capsule/plumbing/rekey-blob.d.ts +33 -0
  43. package/dist/capsule/plumbing/rekey.d.ts +44 -0
  44. package/dist/capsule/plumbing/sealed-slot.d.ts +22 -0
  45. package/dist/capsule/plumbing/sealed-slots.d.ts +37 -0
  46. package/dist/capsule/plumbing/sealing.d.ts +29 -0
  47. package/dist/capsule/plumbing/sign.d.ts +9 -0
  48. package/dist/{kernel/enclave/record-keys → capsule/plumbing}/tombstone.d.ts +2 -2
  49. package/dist/capsule-VOLX3QRQ.js +209 -0
  50. package/dist/cargo/index.js +39 -36
  51. package/dist/{chunk-Q2MPFCQ7.js → chunk-23D6M6VM.js} +5 -5
  52. package/dist/chunk-23D6M6VM.js.map +1 -0
  53. package/dist/{chunk-R7BX2NB3.js → chunk-244QBK7Z.js} +4 -4
  54. package/dist/chunk-244QBK7Z.js.map +1 -0
  55. package/dist/chunk-2AFX33YA.js +936 -0
  56. package/dist/chunk-2AFX33YA.js.map +1 -0
  57. package/dist/{chunk-MVMXZYXT.js → chunk-2GHDLTPE.js} +2 -2
  58. package/dist/{chunk-GYGLAVCX.js → chunk-2MG3SW7Q.js} +6 -2
  59. package/dist/chunk-2MG3SW7Q.js.map +1 -0
  60. package/dist/{chunk-XLMEZIAJ.js → chunk-2ODVB6LZ.js} +2 -2
  61. package/dist/{chunk-HJUWN7JN.js → chunk-2PVXF5CS.js} +33 -8
  62. package/dist/chunk-2PVXF5CS.js.map +1 -0
  63. package/dist/{chunk-YJRT5UQM.js → chunk-2RH777HH.js} +21 -20
  64. package/dist/{chunk-YJRT5UQM.js.map → chunk-2RH777HH.js.map} +1 -1
  65. package/dist/{chunk-7O3Y4PPD.js → chunk-37EPTBBR.js} +153 -16
  66. package/dist/chunk-37EPTBBR.js.map +1 -0
  67. package/dist/{chunk-2ENE6445.js → chunk-3A5DUZ56.js} +102 -16
  68. package/dist/chunk-3A5DUZ56.js.map +1 -0
  69. package/dist/chunk-3EWS67C7.js +461 -0
  70. package/dist/chunk-3EWS67C7.js.map +1 -0
  71. package/dist/{chunk-SGZAIJCV.js → chunk-3L2NBKDR.js} +4 -8
  72. package/dist/chunk-3L2NBKDR.js.map +1 -0
  73. package/dist/{chunk-YMUFFJCO.js → chunk-3TDUWVWB.js} +5 -2
  74. package/dist/chunk-3TDUWVWB.js.map +1 -0
  75. package/dist/{chunk-4GVM6QZA.js → chunk-3XJQBBZD.js} +26 -28
  76. package/dist/chunk-3XJQBBZD.js.map +1 -0
  77. package/dist/{chunk-4ZS56W5S.js → chunk-42ALPZ2B.js} +672 -664
  78. package/dist/chunk-42ALPZ2B.js.map +1 -0
  79. package/dist/chunk-4CIQDWRB.js +524 -0
  80. package/dist/chunk-4CIQDWRB.js.map +1 -0
  81. package/dist/{chunk-RMS3NEA3.js → chunk-4JPMZTJY.js} +2 -2
  82. package/dist/{chunk-P3MG6QCN.js → chunk-4T3SE27M.js} +5 -9
  83. package/dist/chunk-4T3SE27M.js.map +1 -0
  84. package/dist/chunk-4V3Q35WG.js +204 -0
  85. package/dist/chunk-4V3Q35WG.js.map +1 -0
  86. package/dist/{chunk-NQKIUNW5.js → chunk-52MGURXO.js} +2 -2
  87. package/dist/{chunk-EQEYOJBM.js → chunk-5A4345TG.js} +4 -4
  88. package/dist/chunk-5A4345TG.js.map +1 -0
  89. package/dist/{chunk-334WSVOW.js → chunk-5FE75J4S.js} +6 -6
  90. package/dist/chunk-5FE75J4S.js.map +1 -0
  91. package/dist/chunk-5KC7QYEC.js +565 -0
  92. package/dist/chunk-5KC7QYEC.js.map +1 -0
  93. package/dist/{chunk-RSGLUIO6.js → chunk-5UMK7GRI.js} +13 -12
  94. package/dist/chunk-5UMK7GRI.js.map +1 -0
  95. package/dist/chunk-5WWDGFOS.js +275 -0
  96. package/dist/chunk-5WWDGFOS.js.map +1 -0
  97. package/dist/{chunk-QPQUVOZ2.js → chunk-6QVKPHBF.js} +3 -5
  98. package/dist/chunk-6QVKPHBF.js.map +1 -0
  99. package/dist/{chunk-ACAQ2DSG.js → chunk-747G6CT3.js} +2 -2
  100. package/dist/chunk-747G6CT3.js.map +1 -0
  101. package/dist/{chunk-QTQUH4DS.js → chunk-7R2Q7CPL.js} +16 -16
  102. package/dist/chunk-7R2Q7CPL.js.map +1 -0
  103. package/dist/{chunk-UGTBXF5U.js → chunk-7XMHMVTS.js} +3 -3
  104. package/dist/{chunk-YJX7EOJD.js → chunk-A4XMIZT3.js} +6 -6
  105. package/dist/{chunk-YJX7EOJD.js.map → chunk-A4XMIZT3.js.map} +1 -1
  106. package/dist/{chunk-A66I4JOA.js → chunk-AEQGFRU4.js} +4 -4
  107. package/dist/chunk-AEQGFRU4.js.map +1 -0
  108. package/dist/chunk-AL6ML4LA.js +1558 -0
  109. package/dist/chunk-AL6ML4LA.js.map +1 -0
  110. package/dist/{chunk-BZ3534YM.js → chunk-AUKKUPVB.js} +2 -2
  111. package/dist/{chunk-CUZLNGD5.js → chunk-B2YY6WDD.js} +1 -1
  112. package/dist/chunk-B2YY6WDD.js.map +1 -0
  113. package/dist/chunk-BKT776R5.js +1 -0
  114. package/dist/chunk-BNWA3WG5.js +22 -0
  115. package/dist/chunk-BNWA3WG5.js.map +1 -0
  116. package/dist/{chunk-VXANTWBJ.js → chunk-BPWYQ25R.js} +92 -6
  117. package/dist/{chunk-VXANTWBJ.js.map → chunk-BPWYQ25R.js.map} +1 -1
  118. package/dist/{chunk-6LKOJBV6.js → chunk-BVCUTXE3.js} +2 -2
  119. package/dist/chunk-CY2CYVWZ.js +41 -0
  120. package/dist/chunk-CY2CYVWZ.js.map +1 -0
  121. package/dist/{chunk-M4YPHYEH.js → chunk-DHHGL42E.js} +70 -25
  122. package/dist/chunk-DHHGL42E.js.map +1 -0
  123. package/dist/{chunk-VTFVLCUH.js → chunk-DIZLQVAA.js} +2 -2
  124. package/dist/{chunk-G73UVHCA.js → chunk-DLD5LGDS.js} +11 -12
  125. package/dist/chunk-DLD5LGDS.js.map +1 -0
  126. package/dist/{chunk-WQBG4SZS.js → chunk-DQESF6RP.js} +60 -49
  127. package/dist/chunk-DQESF6RP.js.map +1 -0
  128. package/dist/{chunk-LWBCUYZW.js → chunk-E2N2T5ZO.js} +2 -2
  129. package/dist/{chunk-3PGS7TYR.js → chunk-EGVJ7TM4.js} +29 -32
  130. package/dist/chunk-EGVJ7TM4.js.map +1 -0
  131. package/dist/{chunk-JVIBCBC7.js → chunk-EJLV62NI.js} +2 -2
  132. package/dist/{chunk-KKEESNPE.js → chunk-EYG2CY2X.js} +126 -19
  133. package/dist/chunk-EYG2CY2X.js.map +1 -0
  134. package/dist/{enclave-55PAM4YO.js → chunk-EZGV6F47.js} +83 -56
  135. package/dist/chunk-EZGV6F47.js.map +1 -0
  136. package/dist/{chunk-CHQCZZWC.js → chunk-EZOAKKTB.js} +36 -27
  137. package/dist/chunk-EZOAKKTB.js.map +1 -0
  138. package/dist/chunk-F6NCB7KT.js +13 -0
  139. package/dist/chunk-F6NCB7KT.js.map +1 -0
  140. package/dist/chunk-FFJFE4T7.js +100 -0
  141. package/dist/chunk-FFJFE4T7.js.map +1 -0
  142. package/dist/{chunk-JMGDHKQF.js → chunk-FLPCETP6.js} +2 -2
  143. package/dist/chunk-FOEDQATO.js +53 -0
  144. package/dist/chunk-FOEDQATO.js.map +1 -0
  145. package/dist/{chunk-DGOZ4UZD.js → chunk-FVH5QYY2.js} +2 -2
  146. package/dist/{chunk-HIWCKBEY.js → chunk-G2MVBDFP.js} +54 -28
  147. package/dist/chunk-G2MVBDFP.js.map +1 -0
  148. package/dist/chunk-GMKGGY7V.js +234 -0
  149. package/dist/chunk-GMKGGY7V.js.map +1 -0
  150. package/dist/{chunk-EIPVYUEP.js → chunk-GQ4MF3CM.js} +3 -3
  151. package/dist/chunk-GQ4MF3CM.js.map +1 -0
  152. package/dist/{chunk-PEOZ34EM.js → chunk-GSAK56VF.js} +1 -1
  153. package/dist/chunk-GSAK56VF.js.map +1 -0
  154. package/dist/{chunk-5VCRVKOZ.js → chunk-GUZET4SG.js} +12 -4
  155. package/dist/chunk-GUZET4SG.js.map +1 -0
  156. package/dist/{chunk-JBDFMYKQ.js → chunk-GZT3NQRA.js} +2 -2
  157. package/dist/{chunk-K23VKTN4.js → chunk-H23XHRTT.js} +19 -34
  158. package/dist/chunk-H23XHRTT.js.map +1 -0
  159. package/dist/{chunk-TFR7DSOV.js → chunk-H427H63K.js} +2 -2
  160. package/dist/{chunk-DFMWUOU5.js → chunk-H7JBY4P7.js} +23 -32
  161. package/dist/chunk-H7JBY4P7.js.map +1 -0
  162. package/dist/{chunk-SKGMN35F.js → chunk-HS554XAF.js} +3 -3
  163. package/dist/chunk-HS554XAF.js.map +1 -0
  164. package/dist/{chunk-HK67PX4J.js → chunk-HW7CMKUG.js} +1 -1
  165. package/dist/chunk-HW7CMKUG.js.map +1 -0
  166. package/dist/{chunk-3BVH633C.js → chunk-IMQKWR46.js} +5 -7
  167. package/dist/chunk-IMQKWR46.js.map +1 -0
  168. package/dist/{chunk-R42NSZI6.js → chunk-IUBMZPHM.js} +7 -7
  169. package/dist/chunk-IUBMZPHM.js.map +1 -0
  170. package/dist/{chunk-CUQPWYRX.js → chunk-IUT3GWP3.js} +75 -386
  171. package/dist/chunk-IUT3GWP3.js.map +1 -0
  172. package/dist/{chunk-RF6D3Y5E.js → chunk-JDEYF3PJ.js} +4 -8
  173. package/dist/{chunk-RF6D3Y5E.js.map → chunk-JDEYF3PJ.js.map} +1 -1
  174. package/dist/{chunk-PPTHY5QO.js → chunk-JIBUPZHA.js} +99 -8
  175. package/dist/chunk-JIBUPZHA.js.map +1 -0
  176. package/dist/{chunk-SMH6SRX7.js → chunk-JOSPH3E5.js} +2 -2
  177. package/dist/chunk-JQYKPKG6.js +193 -0
  178. package/dist/chunk-JQYKPKG6.js.map +1 -0
  179. package/dist/{chunk-7APJ6CO6.js → chunk-JSMTXZR3.js} +45 -13
  180. package/dist/chunk-JSMTXZR3.js.map +1 -0
  181. package/dist/chunk-JWWYRR4Q.js +12 -0
  182. package/dist/chunk-JWWYRR4Q.js.map +1 -0
  183. package/dist/{chunk-BVN6KXL2.js → chunk-KZXDLBY6.js} +14 -9
  184. package/dist/chunk-KZXDLBY6.js.map +1 -0
  185. package/dist/chunk-LGNDFRYC.js +23 -0
  186. package/dist/chunk-LGNDFRYC.js.map +1 -0
  187. package/dist/{chunk-XKWGNJ26.js → chunk-LIOVX5TJ.js} +7 -11
  188. package/dist/chunk-LIOVX5TJ.js.map +1 -0
  189. package/dist/{chunk-AYX7AINO.js → chunk-LNSVGRHO.js} +5 -7
  190. package/dist/chunk-LNSVGRHO.js.map +1 -0
  191. package/dist/chunk-M5B2W6YY.js +293 -0
  192. package/dist/chunk-M5B2W6YY.js.map +1 -0
  193. package/dist/chunk-MBMTND6D.js +456 -0
  194. package/dist/chunk-MBMTND6D.js.map +1 -0
  195. package/dist/{chunk-3BZZJJMQ.js → chunk-MILI22XQ.js} +3 -3
  196. package/dist/{chunk-A2HKRLPV.js → chunk-MXKI4ABF.js} +18 -59
  197. package/dist/chunk-MXKI4ABF.js.map +1 -0
  198. package/dist/{chunk-ZYIYHJ5R.js → chunk-MXOQ5JCG.js} +869 -238
  199. package/dist/chunk-MXOQ5JCG.js.map +1 -0
  200. package/dist/{chunk-V7ZRRCRJ.js → chunk-N7EVQD5S.js} +9 -13
  201. package/dist/chunk-N7EVQD5S.js.map +1 -0
  202. package/dist/chunk-N7UDP5VU.js +757 -0
  203. package/dist/chunk-N7UDP5VU.js.map +1 -0
  204. package/dist/chunk-NBQ3KK6X.js +270 -0
  205. package/dist/chunk-NBQ3KK6X.js.map +1 -0
  206. package/dist/{chunk-ZORTV6NH.js → chunk-NCO25JZO.js} +88 -4
  207. package/dist/chunk-NCO25JZO.js.map +1 -0
  208. package/dist/chunk-NH2UOV3B.js +18 -0
  209. package/dist/chunk-NH2UOV3B.js.map +1 -0
  210. package/dist/chunk-NYMLINRP.js +28 -0
  211. package/dist/chunk-NYMLINRP.js.map +1 -0
  212. package/dist/{chunk-YYP7WSEB.js → chunk-O2IMQSNA.js} +2 -2
  213. package/dist/chunk-O46CHQT7.js +215 -0
  214. package/dist/chunk-O46CHQT7.js.map +1 -0
  215. package/dist/chunk-OIEO4WDL.js +27 -0
  216. package/dist/chunk-OIEO4WDL.js.map +1 -0
  217. package/dist/{chunk-TRGTKX5E.js → chunk-OKSTSITU.js} +27 -4
  218. package/dist/chunk-OKSTSITU.js.map +1 -0
  219. package/dist/chunk-OYW3I5M4.js +31 -0
  220. package/dist/chunk-OYW3I5M4.js.map +1 -0
  221. package/dist/{chunk-Q7HZX3IF.js → chunk-PD64727P.js} +2 -2
  222. package/dist/chunk-PD64727P.js.map +1 -0
  223. package/dist/{chunk-FET5XCAT.js → chunk-PP3K67AJ.js} +34 -6
  224. package/dist/chunk-PP3K67AJ.js.map +1 -0
  225. package/dist/chunk-Q2XRFWOI.js +40 -0
  226. package/dist/chunk-Q2XRFWOI.js.map +1 -0
  227. package/dist/{chunk-QIZPZMUI.js → chunk-Q4UHJ5SN.js} +2 -2
  228. package/dist/{chunk-FAHMLERK.js → chunk-QBLT6POL.js} +2 -2
  229. package/dist/chunk-QMWY2FDS.js +157 -0
  230. package/dist/chunk-QMWY2FDS.js.map +1 -0
  231. package/dist/{chunk-LH5A3ZPG.js → chunk-RB4DOPGZ.js} +150 -22
  232. package/dist/chunk-RB4DOPGZ.js.map +1 -0
  233. package/dist/chunk-RHVMZSUU.js +7 -0
  234. package/dist/chunk-RHVMZSUU.js.map +1 -0
  235. package/dist/{chunk-BUE2D7PX.js → chunk-SMV2HRDU.js} +2 -2
  236. package/dist/chunk-SUZKW6UR.js +25 -0
  237. package/dist/chunk-SUZKW6UR.js.map +1 -0
  238. package/dist/{chunk-7MG7SJT7.js → chunk-SV2PM2OY.js} +1 -1
  239. package/dist/chunk-SV2PM2OY.js.map +1 -0
  240. package/dist/{chunk-UXVWEX5L.js → chunk-SYNY3VB5.js} +6 -2
  241. package/dist/chunk-SYNY3VB5.js.map +1 -0
  242. package/dist/{chunk-4GFX6MPA.js → chunk-TEHHROZL.js} +6 -8
  243. package/dist/chunk-TEHHROZL.js.map +1 -0
  244. package/dist/chunk-TKVUE4JF.js +1289 -0
  245. package/dist/chunk-TKVUE4JF.js.map +1 -0
  246. package/dist/{chunk-SFAWCTEM.js → chunk-TZZBXPZK.js} +2 -2
  247. package/dist/{chunk-F3W6YMDC.js → chunk-U2FZNEWJ.js} +4 -4
  248. package/dist/chunk-U2FZNEWJ.js.map +1 -0
  249. package/dist/{chunk-BLN54W3L.js → chunk-UA372JHH.js} +56 -3
  250. package/dist/chunk-UA372JHH.js.map +1 -0
  251. package/dist/{chunk-6YXCPL4T.js → chunk-UEFOQH74.js} +2 -2
  252. package/dist/chunk-UEFOQH74.js.map +1 -0
  253. package/dist/{chunk-2N5ML6HT.js → chunk-UIYESRD6.js} +9 -11
  254. package/dist/chunk-UIYESRD6.js.map +1 -0
  255. package/dist/{chunk-UHHPLO3I.js → chunk-V3RWOOSO.js} +4 -4
  256. package/dist/{chunk-KTFRCC5C.js → chunk-V7ADQF5O.js} +82 -8
  257. package/dist/chunk-V7ADQF5O.js.map +1 -0
  258. package/dist/{chunk-453F654R.js → chunk-VAORSCSU.js} +3 -3
  259. package/dist/chunk-VAORSCSU.js.map +1 -0
  260. package/dist/{chunk-GPNTB4Y7.js → chunk-VFHCKG5M.js} +6 -10
  261. package/dist/chunk-VFHCKG5M.js.map +1 -0
  262. package/dist/{chunk-2577DKXB.js → chunk-VHBKYN2J.js} +3 -3
  263. package/dist/chunk-VHBKYN2J.js.map +1 -0
  264. package/dist/chunk-VHM7HCKB.js +220 -0
  265. package/dist/chunk-VHM7HCKB.js.map +1 -0
  266. package/dist/{chunk-ZHKOPKE3.js → chunk-VKI2EB3N.js} +3 -3
  267. package/dist/chunk-VKI2EB3N.js.map +1 -0
  268. package/dist/{chunk-UDHWDSRL.js → chunk-VMV5SBE4.js} +16 -17
  269. package/dist/chunk-VMV5SBE4.js.map +1 -0
  270. package/dist/{chunk-SPYWXKJN.js → chunk-VQDZYB2B.js} +3 -3
  271. package/dist/chunk-VQDZYB2B.js.map +1 -0
  272. package/dist/{chunk-Q2PU57HC.js → chunk-VVOLDVIR.js} +2 -2
  273. package/dist/{chunk-3VF3WQ4F.js → chunk-WPOYWFSE.js} +7 -7
  274. package/dist/{chunk-3VF3WQ4F.js.map → chunk-WPOYWFSE.js.map} +1 -1
  275. package/dist/{chunk-OTQZ7ZWU.js → chunk-WXE4W2U6.js} +7 -11
  276. package/dist/chunk-WXE4W2U6.js.map +1 -0
  277. package/dist/chunk-XBKH4FOC.js +195 -0
  278. package/dist/chunk-XBKH4FOC.js.map +1 -0
  279. package/dist/{chunk-TUFM4UZP.js → chunk-XQRFSKYM.js} +2 -2
  280. package/dist/{chunk-3V4KWFX7.js → chunk-XSPFDUDG.js} +58 -53
  281. package/dist/chunk-XSPFDUDG.js.map +1 -0
  282. package/dist/{chunk-GY4WYNNG.js → chunk-Y2RKVFKR.js} +2 -2
  283. package/dist/{chunk-UP4BECPY.js → chunk-Y3LPTBG7.js} +89 -27
  284. package/dist/chunk-Y3LPTBG7.js.map +1 -0
  285. package/dist/{chunk-4OZNXTO4.js → chunk-YRXFFWG4.js} +2 -2
  286. package/dist/classified/index.js +5 -5
  287. package/dist/{classified-marker-BWOFVYAC.js → classified-marker-SIYKUU5L.js} +3 -3
  288. package/dist/classified-marker-SIYKUU5L.js.map +1 -0
  289. package/dist/collection-facade-CS7CA2XO.js +47 -0
  290. package/dist/{computed-VPOKQK4N.js → computed-FAD7SED4.js} +3 -3
  291. package/dist/consent/index.js +10 -11
  292. package/dist/consent/index.js.map +1 -1
  293. package/dist/cover/index.js +10 -11
  294. package/dist/coverage/index.js +306 -0
  295. package/dist/coverage/index.js.map +1 -0
  296. package/dist/custody/index.js +12 -13
  297. package/dist/{dead-filter-PKQDLOT4.js → dead-filter-4F3LWYKH.js} +11 -3
  298. package/dist/dead-filter-4F3LWYKH.js.map +1 -0
  299. package/dist/debug/index.js +11 -2
  300. package/dist/debug/index.js.map +1 -1
  301. package/dist/{delegation-DS5NRILW.js → delegation-NANZDG4N.js} +13 -16
  302. package/dist/delegation-NANZDG4N.js.map +1 -0
  303. package/dist/derivations/index.js +25 -23
  304. package/dist/derive-XLOJVXPU.js +20 -0
  305. package/dist/directory/index.js +10 -11
  306. package/dist/{dispatch-IEPAVQUM.js → dispatch-H4HV32AM.js} +5 -5
  307. package/dist/{dispatch-Q6MWLOJY.js → dispatch-JDZNGEB3.js} +20 -21
  308. package/dist/dispatch-JDZNGEB3.js.map +1 -0
  309. package/dist/executor-FMPVN6DT.js +35 -0
  310. package/dist/executor-LBBBRTN5.js +8 -0
  311. package/dist/executor-OSRZST2U.js +8 -0
  312. package/dist/export-accessible-RAOJAAU5.js +22 -0
  313. package/dist/extract-partition-JD5CUSTG.js +37 -0
  314. package/dist/{fanout-sidecar-S3QL53YX.js → fanout-sidecar-L7NHPIOC.js} +13 -15
  315. package/dist/fanout-sidecar-L7NHPIOC.js.map +1 -0
  316. package/dist/find-JRN4RNQ5.js +10 -0
  317. package/dist/forget/index.js +9 -10
  318. package/dist/forget/index.js.map +1 -1
  319. package/dist/guards/index.js +4 -4
  320. package/dist/history/index.js +13 -14
  321. package/dist/history/index.js.map +1 -1
  322. package/dist/i18n/index.js +14 -15
  323. package/dist/i18n/index.js.map +1 -1
  324. package/dist/index.d.ts +36 -14
  325. package/dist/index.js +970 -163
  326. package/dist/index.js.map +1 -1
  327. package/dist/indexing/index.js +13 -5
  328. package/dist/indexing/index.js.map +1 -1
  329. package/dist/introspection/index.js +11 -12
  330. package/dist/issue-YIVBZUTH.js +19 -0
  331. package/dist/ivf-flat-UZ6DQDLS.js +314 -0
  332. package/dist/ivf-flat-UZ6DQDLS.js.map +1 -0
  333. package/dist/{json-schema-V3M5MUCM.js → json-schema-3SHX72CC.js} +2 -1
  334. package/dist/json-schema-3SHX72CC.js.map +1 -0
  335. package/dist/kernel/attestation-types.d.ts +62 -0
  336. package/dist/kernel/collection-config.d.ts +5 -68
  337. package/dist/kernel/collection.d.ts +30 -9
  338. package/dist/kernel/cutover-transform.d.ts +1 -1
  339. package/dist/kernel/errors.d.ts +257 -38
  340. package/dist/kernel/generation-map.d.ts +48 -0
  341. package/dist/kernel/merge-authority.d.ts +1 -1
  342. package/dist/kernel/noydb.d.ts +6 -1
  343. package/dist/kernel/paths.d.ts +29 -5
  344. package/dist/kernel/prepared-write.d.ts +1 -1
  345. package/dist/kernel/present-cache.d.ts +58 -0
  346. package/dist/kernel/query/all.d.ts +7 -0
  347. package/dist/kernel/query/builder.d.ts +601 -270
  348. package/dist/kernel/query/civil-date.d.ts +64 -0
  349. package/dist/kernel/query/cursor.d.ts +40 -0
  350. package/dist/kernel/query/distinct-key.d.ts +98 -0
  351. package/dist/kernel/query/hydration.d.ts +76 -0
  352. package/dist/kernel/query/index.d.ts +31 -15
  353. package/dist/kernel/query/internal/core.d.ts +30 -0
  354. package/dist/kernel/query/internal/hooks.d.ts +22 -0
  355. package/dist/kernel/query/internal/maintenance.d.ts +43 -0
  356. package/dist/kernel/query/live/incremental.d.ts +314 -0
  357. package/dist/kernel/query/live/index.d.ts +22 -0
  358. package/dist/kernel/query/live/install.d.ts +2 -0
  359. package/dist/kernel/query/{live.d.ts → live/live.d.ts} +39 -9
  360. package/dist/kernel/query/live/methods.d.ts +107 -0
  361. package/dist/kernel/query/predicate.d.ts +119 -1
  362. package/dist/kernel/query/reduce/date-trunc.d.ts +75 -0
  363. package/dist/kernel/query/reduce/index.d.ts +36 -0
  364. package/dist/kernel/query/reduce/install.d.ts +2 -0
  365. package/dist/kernel/query/reduce/methods.d.ts +259 -0
  366. package/dist/kernel/query/reduce/scan-methods.d.ts +121 -0
  367. package/dist/kernel/query/relate/explain.d.ts +199 -0
  368. package/dist/kernel/query/relate/index.d.ts +48 -0
  369. package/dist/kernel/query/relate/install.d.ts +2 -0
  370. package/dist/kernel/query/relate/join-on.d.ts +126 -0
  371. package/dist/kernel/query/relate/join-reduce.d.ts +16 -0
  372. package/dist/kernel/query/relate/join.d.ts +452 -0
  373. package/dist/kernel/query/relate/methods.d.ts +426 -0
  374. package/dist/kernel/query/relate/partition.d.ts +87 -0
  375. package/dist/kernel/query/relate/scan-methods.d.ts +163 -0
  376. package/dist/kernel/query/relate/traverse.d.ts +109 -0
  377. package/dist/kernel/query/scan-builder.d.ts +79 -176
  378. package/dist/kernel/query/sort-key.d.ts +52 -0
  379. package/dist/kernel/secret-mode.d.ts +1 -1
  380. package/dist/kernel/tx-write-gate.d.ts +77 -0
  381. package/dist/kernel/types.d.ts +113 -8
  382. package/dist/kernel/validation.d.ts +27 -10
  383. package/dist/kernel/vault.d.ts +11 -6
  384. package/dist/kernel/via/compose.d.ts +3 -0
  385. package/dist/kernel/via/index.d.ts +56 -0
  386. package/dist/kernel/via/pipeline.d.ts +48 -0
  387. package/dist/kernel/write-queue.d.ts +17 -0
  388. package/dist/{ledger-EDXFFZQL.js → ledger-5ZMGE44K.js} +11 -12
  389. package/dist/liberate-WZSZM2W6.js +24 -0
  390. package/dist/link-set-MFXC24VK.js +29 -0
  391. package/dist/{managed-secret-NCWEMPUQ.js → managed-secret-MFTFT22X.js} +10 -11
  392. package/dist/materialized-views/index.js +30 -24
  393. package/dist/{migrate-cek-5ENH64AA.js → migrate-cek-DZRFFOHW.js} +2 -2
  394. package/dist/money/index.js +5 -5
  395. package/dist/noydb-ITIGNKUF.js +96 -0
  396. package/dist/overlay-views/index.js +4 -4
  397. package/dist/periods/index.js +12 -13
  398. package/dist/pod/index.js +74 -67
  399. package/dist/{pod-handle-ECVCDIXW.js → pod-handle-A3LET7NO.js} +10 -11
  400. package/dist/pod-handle-A3LET7NO.js.map +1 -0
  401. package/dist/policy/index.js +10 -11
  402. package/dist/port/on/index.d.ts +1 -1
  403. package/dist/port/to/index.d.ts +1 -1
  404. package/dist/port/with/blob-strategy.d.ts +10 -1
  405. package/dist/port/with/classified-strategy.d.ts +1 -1
  406. package/dist/port/with/collection-options.d.ts +6 -1
  407. package/dist/port/with/collection-registries.d.ts +1 -1
  408. package/dist/port/with/coverage-strategy.d.ts +83 -0
  409. package/dist/port/with/lookup-strategy.d.ts +2 -2
  410. package/dist/port/with/service-bus.d.ts +46 -0
  411. package/dist/port/with/strategies.d.ts +2 -0
  412. package/dist/portability/index.js +8 -8
  413. package/dist/{post-register-3IPCSG6Q.js → post-register-7ND27CF2.js} +6 -6
  414. package/dist/post-register-7ND27CF2.js.map +1 -0
  415. package/dist/query/all/index.js +31 -0
  416. package/dist/query/index.js +20 -32
  417. package/dist/query/live/index.js +21 -0
  418. package/dist/query/live/index.js.map +1 -0
  419. package/dist/query/reduce/index.js +33 -0
  420. package/dist/query/reduce/index.js.map +1 -0
  421. package/dist/query/relate/index.js +56 -0
  422. package/dist/query/relate/index.js.map +1 -0
  423. package/dist/reduce/index.js +72 -18
  424. package/dist/reduce/index.js.map +1 -1
  425. package/dist/register-DT5HZ2LZ.js +30 -0
  426. package/dist/registry-BHRZGZHF.js +8 -0
  427. package/dist/registry-ET6ZFFWA.js +34 -0
  428. package/dist/registry-HXFGLGTG.js +8 -0
  429. package/dist/registry-THCPDEOD.js +23 -0
  430. package/dist/request-withdrawal-AV2MJJKY.js +30 -0
  431. package/dist/{reveal-QZDHSGD4.js → reveal-B2TLP4JQ.js} +10 -9
  432. package/dist/reveal-B2TLP4JQ.js.map +1 -0
  433. package/dist/revoke-6DWIEOCV.js +24 -0
  434. package/dist/satellites/index.js +1 -1
  435. package/dist/schema-update/index.js +2 -2
  436. package/dist/sealed-record/index.js +16 -18
  437. package/dist/sealed-record/index.js.map +1 -1
  438. package/dist/search/index.js +11 -5
  439. package/dist/{seed-X5CC22CQ.js → seed-XNSE4U3S.js} +15 -18
  440. package/dist/seed-XNSE4U3S.js.map +1 -0
  441. package/dist/sequence/index.js +9 -10
  442. package/dist/session/index.js +9 -10
  443. package/dist/session/index.js.map +1 -1
  444. package/dist/shadow/index.js +2 -2
  445. package/dist/signer-MHGW3OIL.js +23 -0
  446. package/dist/snapshots/index.js +11 -11
  447. package/dist/stale-6GCFMOOR.js +28 -0
  448. package/dist/storage-BYN5LO6Z.js +21 -0
  449. package/dist/storage-BYN5LO6Z.js.map +1 -0
  450. package/dist/store/index.js +1 -1
  451. package/dist/{store-coordination-provider-4WZAIRHC.js → store-coordination-provider-C4BPT5XF.js} +11 -12
  452. package/dist/store-coordination-provider-C4BPT5XF.js.map +1 -0
  453. package/dist/sync/index.js +10 -11
  454. package/dist/sync/index.js.map +1 -1
  455. package/dist/team/index.js +17 -16
  456. package/dist/tiers/index.js +13 -12
  457. package/dist/to/index.js +2 -2
  458. package/dist/transactions/index.js +3 -3
  459. package/dist/util/index.js +1 -1
  460. package/dist/vault-head/index.js +11 -14
  461. package/dist/vault-head/index.js.map +1 -1
  462. package/dist/{verify-6MDTIUEV.js → verify-UKALW7C2.js} +14 -12
  463. package/dist/verify-UKALW7C2.js.map +1 -0
  464. package/dist/via/blob/index.d.ts +1 -0
  465. package/dist/via/classified/binding.d.ts +2 -2
  466. package/dist/via/classified/config-drift.d.ts +2 -2
  467. package/dist/via/classified/errors.d.ts +1 -1
  468. package/dist/via/geo/binding.d.ts +31 -0
  469. package/dist/via/geo/descriptor.d.ts +54 -0
  470. package/dist/via/geo/geohash.d.ts +95 -0
  471. package/dist/via/geo/index.d.ts +13 -0
  472. package/dist/via/geo/where.d.ts +50 -0
  473. package/dist/via/i18n/core.d.ts +1 -1
  474. package/dist/via/lookup/handle.d.ts +4 -4
  475. package/dist/via/lookup/registry.d.ts +1 -1
  476. package/dist/via/lookup/snapshot.d.ts +3 -3
  477. package/dist/walk-4VPK7AS4.js +20 -0
  478. package/dist/walk-4VPK7AS4.js.map +1 -0
  479. package/dist/with-audit/attestation/index.d.ts +2 -1
  480. package/dist/with-audit/attestation/issue.d.ts +2 -2
  481. package/dist/with-audit/attestation/revoke.d.ts +2 -2
  482. package/dist/with-audit/attestation/scheme.d.ts +7 -0
  483. package/dist/with-audit/attestation/signer.d.ts +1 -1
  484. package/dist/with-audit/attestation/strategy.d.ts +2 -2
  485. package/dist/with-audit/attestation/types.d.ts +10 -0
  486. package/dist/with-audit/attestation/vault-facade.d.ts +2 -2
  487. package/dist/with-audit/attestation/verifier.d.ts +6 -0
  488. package/dist/with-audit/consent/consent.d.ts +1 -1
  489. package/dist/with-audit/consent/strategy.d.ts +1 -1
  490. package/dist/with-audit/coverage/accounting.d.ts +112 -0
  491. package/dist/with-audit/coverage/active.d.ts +29 -0
  492. package/dist/with-audit/coverage/index.d.ts +61 -0
  493. package/dist/with-audit/coverage/sketch.d.ts +75 -0
  494. package/dist/with-audit/forget/subject-index.d.ts +1 -1
  495. package/dist/with-audit/periods/periods.d.ts +55 -7
  496. package/dist/with-audit/periods/reserved-collections.d.ts +3 -0
  497. package/dist/with-audit/periods/vault-facade.d.ts +18 -1
  498. package/dist/with-audit/sealed-record/index.d.ts +2 -2
  499. package/dist/with-audit/sealed-record/strategy.d.ts +1 -1
  500. package/dist/with-audit/tiers/index.d.ts +53 -2
  501. package/dist/with-audit/tiers/strategy.d.ts +8 -0
  502. package/dist/with-cargo/adopt-partition.d.ts +1 -1
  503. package/dist/with-cargo/extract-partition.d.ts +1 -1
  504. package/dist/with-cargo/floor.d.ts +3 -3
  505. package/dist/with-commit/history/history.d.ts +2 -2
  506. package/dist/with-commit/history/index.d.ts +1 -1
  507. package/dist/with-commit/history/ledger/store.d.ts +1 -1
  508. package/dist/with-commit/history/strategy.d.ts +1 -1
  509. package/dist/with-commit/history/time-machine.d.ts +1 -1
  510. package/dist/with-commit/numbering/index.d.ts +1 -1
  511. package/dist/with-commit/sequence/index.d.ts +1 -1
  512. package/dist/with-commit/tx/invariants.d.ts +1 -1
  513. package/dist/with-commit/tx/transaction.d.ts +13 -3
  514. package/dist/with-commit/vault-head/head.d.ts +1 -1
  515. package/dist/with-commit/vault-head/index.d.ts +1 -1
  516. package/dist/with-commit/vault-head/strategy.d.ts +1 -1
  517. package/dist/with-commit/vault-head/verify.d.ts +1 -1
  518. package/dist/with-formula/derivations/dispatch.d.ts +1 -1
  519. package/dist/with-formula/derivations/fanout-sidecar.d.ts +1 -1
  520. package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +4 -3
  521. package/dist/with-formula/materialized-views/emit-memo.d.ts +40 -0
  522. package/dist/with-formula/materialized-views/executor.d.ts +8 -0
  523. package/dist/with-formula/materialized-views/index.d.ts +1 -1
  524. package/dist/with-formula/materialized-views/registry.d.ts +15 -0
  525. package/dist/with-formula/materialized-views/types.d.ts +106 -14
  526. package/dist/with-formula/materialized-views/window-stage.d.ts +11 -0
  527. package/dist/with-formula/overlay-views/types.d.ts +1 -1
  528. package/dist/with-formula/overlay-views/virtual-collection.d.ts +13 -4
  529. package/dist/with-lookup/embeddings/chunks.d.ts +79 -0
  530. package/dist/with-lookup/embeddings/descriptor.d.ts +21 -0
  531. package/dist/with-lookup/embeddings/index.d.ts +3 -0
  532. package/dist/with-lookup/embeddings/ivf-flat.d.ts +93 -0
  533. package/dist/with-lookup/embeddings/vector-index.d.ts +73 -0
  534. package/dist/with-lookup/embeddings/vector-set.d.ts +94 -1
  535. package/dist/with-lookup/embeddings/with-vector-index.d.ts +67 -0
  536. package/dist/with-lookup/indexing/collection-facade.d.ts +86 -3
  537. package/dist/with-lookup/indexing/compound-indexes.d.ts +129 -0
  538. package/dist/with-lookup/indexing/eager-indexes.d.ts +170 -1
  539. package/dist/with-lookup/indexing/index-snapshot.d.ts +62 -0
  540. package/dist/with-lookup/indexing/lazy-builder.d.ts +33 -0
  541. package/dist/with-lookup/indexing/persisted-field-indexes.d.ts +104 -0
  542. package/dist/with-lookup/indexing/persisted-indexes.d.ts +12 -0
  543. package/dist/with-lookup/indexing/sorted-indexes.d.ts +117 -0
  544. package/dist/with-lookup/indexing/unique-constraints.d.ts +106 -23
  545. package/dist/with-lookup/reduce/active.d.ts +2 -24
  546. package/dist/with-lookup/reduce/group-core.d.ts +43 -0
  547. package/dist/with-lookup/reduce/groupby.d.ts +195 -36
  548. package/dist/with-lookup/reduce/incremental-group.d.ts +153 -0
  549. package/dist/with-lookup/reduce/index.d.ts +26 -5
  550. package/dist/with-lookup/reduce/reducers.d.ts +255 -1
  551. package/dist/with-lookup/reduce/reduction.d.ts +44 -13
  552. package/dist/with-lookup/reduce/strategy.d.ts +43 -3
  553. package/dist/with-lookup/reduce/window.d.ts +262 -0
  554. package/dist/with-lookup/search/collection-facade.d.ts +45 -9
  555. package/dist/with-lookup/search/index-store.d.ts +5 -3
  556. package/dist/with-lookup/search/index.d.ts +4 -2
  557. package/dist/with-lookup/search/inverted-index.d.ts +38 -2
  558. package/dist/with-lookup/search/persisted-index-store.d.ts +5 -2
  559. package/dist/with-lookup/search/phrase.d.ts +28 -0
  560. package/dist/with-lookup/search/retrieve-types.d.ts +57 -1
  561. package/dist/with-lookup/search/serialize.d.ts +29 -3
  562. package/dist/with-lookup/search/strategy.d.ts +2 -6
  563. package/dist/with-party/broker/index.d.ts +3 -3
  564. package/dist/with-party/directory/cover/index.d.ts +1 -1
  565. package/dist/with-party/directory/cover/storage.d.ts +1 -1
  566. package/dist/with-party/directory/cover/types.d.ts +1 -1
  567. package/dist/with-party/directory/index.d.ts +1 -1
  568. package/dist/with-party/directory/types.d.ts +1 -1
  569. package/dist/with-party/directory/user-envelope/api.d.ts +1 -1
  570. package/dist/with-party/directory/user-envelope/storage.d.ts +1 -1
  571. package/dist/with-party/policy/engine.d.ts +1 -1
  572. package/dist/with-party/policy/index.d.ts +1 -1
  573. package/dist/with-party/policy/presets.d.ts +1 -1
  574. package/dist/with-party/team/authenticators.d.ts +91 -1
  575. package/dist/with-party/team/delegation.d.ts +1 -1
  576. package/dist/with-party/team/echo-secret.d.ts +2 -2
  577. package/dist/with-party/team/index.d.ts +4 -3
  578. package/dist/with-party/team/keyring.d.ts +2 -2
  579. package/dist/with-party/team/magic-link-grant.d.ts +1 -1
  580. package/dist/with-party/team/managed-secret.d.ts +1 -1
  581. package/dist/with-party/team/noydb-facade.d.ts +12 -3
  582. package/dist/with-party/team/recovery.d.ts +1 -1
  583. package/dist/with-party/team/roster-tag.d.ts +1 -1
  584. package/dist/with-party/team/rotate-recover.d.ts +1 -1
  585. package/dist/with-party/team/wrapped-deks.d.ts +1 -1
  586. package/dist/with-pod/format.d.ts +1 -1
  587. package/dist/with-pod/index.d.ts +1 -1
  588. package/dist/with-pod/pod.d.ts +1 -1
  589. package/dist/with-shape/blobs/blob-compaction.d.ts +17 -1
  590. package/dist/with-shape/blobs/blob-intent.d.ts +1 -1
  591. package/dist/with-shape/blobs/blob-set.d.ts +23 -4
  592. package/dist/with-shape/blobs/legacy-sweep.d.ts +35 -0
  593. package/dist/with-shape/introspection/describe.d.ts +7 -1
  594. package/dist/with-shape/introspection/field-meta.d.ts +18 -0
  595. package/dist/with-shape/introspection/types.d.ts +57 -1
  596. package/dist/with-shape/introspection/walk.d.ts +1 -1
  597. package/dist/with-shape/links/lazy-handle.d.ts +1 -1
  598. package/dist/with-shape/links/link-set.d.ts +1 -1
  599. package/dist/with-shape/links/vault-facade.d.ts +1 -1
  600. package/dist/with-shape/manifest/derive.d.ts +1 -1
  601. package/dist/with-shape/manifest/storage.d.ts +1 -1
  602. package/dist/with-shape/persisted-schemas/register.d.ts +1 -1
  603. package/dist/with-shape/persisted-schemas/storage.d.ts +1 -1
  604. package/dist/with-shape/satellites/dead-filter.d.ts +1 -1
  605. package/dist/with-shape/satellites/declare.d.ts +1 -1
  606. package/dist/with-shape/satellites/marker.d.ts +1 -1
  607. package/dist/with-shape/satellites/post-register.d.ts +1 -1
  608. package/dist/with-store/partitioned/index.d.ts +337 -0
  609. package/dist/with-sync/change-broadcast.d.ts +153 -0
  610. package/dist/with-sync/presence.d.ts +5 -10
  611. package/dist/withdraw-accessible-HL7GACUE.js +27 -0
  612. package/dist/withdraw-accessible-HL7GACUE.js.map +1 -0
  613. package/package.json +48 -12
  614. package/dist/api-WYW4YEQG.js +0 -19
  615. package/dist/backup-XKCXVKV3.js.map +0 -1
  616. package/dist/chunk-2577DKXB.js.map +0 -1
  617. package/dist/chunk-2ENE6445.js.map +0 -1
  618. package/dist/chunk-2N5ML6HT.js.map +0 -1
  619. package/dist/chunk-334WSVOW.js.map +0 -1
  620. package/dist/chunk-3BVH633C.js.map +0 -1
  621. package/dist/chunk-3PGS7TYR.js.map +0 -1
  622. package/dist/chunk-3V4KWFX7.js.map +0 -1
  623. package/dist/chunk-453F654R.js.map +0 -1
  624. package/dist/chunk-4GFX6MPA.js.map +0 -1
  625. package/dist/chunk-4GVM6QZA.js.map +0 -1
  626. package/dist/chunk-4ZS56W5S.js.map +0 -1
  627. package/dist/chunk-5VCRVKOZ.js.map +0 -1
  628. package/dist/chunk-6YXCPL4T.js.map +0 -1
  629. package/dist/chunk-7APJ6CO6.js.map +0 -1
  630. package/dist/chunk-7MG2LHO5.js +0 -1616
  631. package/dist/chunk-7MG2LHO5.js.map +0 -1
  632. package/dist/chunk-7MG7SJT7.js.map +0 -1
  633. package/dist/chunk-7O3Y4PPD.js.map +0 -1
  634. package/dist/chunk-A2HKRLPV.js.map +0 -1
  635. package/dist/chunk-A66I4JOA.js.map +0 -1
  636. package/dist/chunk-ACAQ2DSG.js.map +0 -1
  637. package/dist/chunk-ATL3ZVXT.js +0 -151
  638. package/dist/chunk-ATL3ZVXT.js.map +0 -1
  639. package/dist/chunk-AYX7AINO.js.map +0 -1
  640. package/dist/chunk-BLN54W3L.js.map +0 -1
  641. package/dist/chunk-BRLKZUBT.js +0 -95
  642. package/dist/chunk-BRLKZUBT.js.map +0 -1
  643. package/dist/chunk-BTDR2PXY.js +0 -29
  644. package/dist/chunk-BTDR2PXY.js.map +0 -1
  645. package/dist/chunk-BVN6KXL2.js.map +0 -1
  646. package/dist/chunk-CHQCZZWC.js.map +0 -1
  647. package/dist/chunk-CUQPWYRX.js.map +0 -1
  648. package/dist/chunk-CUZLNGD5.js.map +0 -1
  649. package/dist/chunk-DFMWUOU5.js.map +0 -1
  650. package/dist/chunk-EIPVYUEP.js.map +0 -1
  651. package/dist/chunk-EQEYOJBM.js.map +0 -1
  652. package/dist/chunk-F3W6YMDC.js.map +0 -1
  653. package/dist/chunk-FET5XCAT.js.map +0 -1
  654. package/dist/chunk-G73UVHCA.js.map +0 -1
  655. package/dist/chunk-GPNTB4Y7.js.map +0 -1
  656. package/dist/chunk-GYGLAVCX.js.map +0 -1
  657. package/dist/chunk-HIWCKBEY.js.map +0 -1
  658. package/dist/chunk-HJUWN7JN.js.map +0 -1
  659. package/dist/chunk-HK67PX4J.js.map +0 -1
  660. package/dist/chunk-HPVZCW43.js +0 -479
  661. package/dist/chunk-HPVZCW43.js.map +0 -1
  662. package/dist/chunk-I3ISCYT7.js +0 -159
  663. package/dist/chunk-I3ISCYT7.js.map +0 -1
  664. package/dist/chunk-K23VKTN4.js.map +0 -1
  665. package/dist/chunk-KKEESNPE.js.map +0 -1
  666. package/dist/chunk-KTFRCC5C.js.map +0 -1
  667. package/dist/chunk-LH5A3ZPG.js.map +0 -1
  668. package/dist/chunk-LP7BEXCT.js +0 -32
  669. package/dist/chunk-LP7BEXCT.js.map +0 -1
  670. package/dist/chunk-M4YPHYEH.js.map +0 -1
  671. package/dist/chunk-NSITFOCJ.js +0 -99
  672. package/dist/chunk-NSITFOCJ.js.map +0 -1
  673. package/dist/chunk-OTQZ7ZWU.js.map +0 -1
  674. package/dist/chunk-P3MG6QCN.js.map +0 -1
  675. package/dist/chunk-PEOZ34EM.js.map +0 -1
  676. package/dist/chunk-PPTHY5QO.js.map +0 -1
  677. package/dist/chunk-Q2MPFCQ7.js.map +0 -1
  678. package/dist/chunk-Q7HZX3IF.js.map +0 -1
  679. package/dist/chunk-QPQUVOZ2.js.map +0 -1
  680. package/dist/chunk-QTQUH4DS.js.map +0 -1
  681. package/dist/chunk-R42NSZI6.js.map +0 -1
  682. package/dist/chunk-R7BX2NB3.js.map +0 -1
  683. package/dist/chunk-RSGLUIO6.js.map +0 -1
  684. package/dist/chunk-RTBJ5IOO.js +0 -87
  685. package/dist/chunk-RTBJ5IOO.js.map +0 -1
  686. package/dist/chunk-SGZAIJCV.js.map +0 -1
  687. package/dist/chunk-SKGMN35F.js.map +0 -1
  688. package/dist/chunk-SPYWXKJN.js.map +0 -1
  689. package/dist/chunk-SZJ3DLZA.js +0 -66
  690. package/dist/chunk-SZJ3DLZA.js.map +0 -1
  691. package/dist/chunk-TRGTKX5E.js.map +0 -1
  692. package/dist/chunk-UDHWDSRL.js.map +0 -1
  693. package/dist/chunk-UP4BECPY.js.map +0 -1
  694. package/dist/chunk-UXVWEX5L.js.map +0 -1
  695. package/dist/chunk-V7ZRRCRJ.js.map +0 -1
  696. package/dist/chunk-WQBG4SZS.js.map +0 -1
  697. package/dist/chunk-XKWGNJ26.js.map +0 -1
  698. package/dist/chunk-YMUFFJCO.js.map +0 -1
  699. package/dist/chunk-ZHKOPKE3.js.map +0 -1
  700. package/dist/chunk-ZN4FD4PE.js +0 -364
  701. package/dist/chunk-ZN4FD4PE.js.map +0 -1
  702. package/dist/chunk-ZORTV6NH.js.map +0 -1
  703. package/dist/chunk-ZYIYHJ5R.js.map +0 -1
  704. package/dist/classified-marker-BWOFVYAC.js.map +0 -1
  705. package/dist/collection-facade-JSJYIKS4.js +0 -45
  706. package/dist/dead-filter-PKQDLOT4.js.map +0 -1
  707. package/dist/delegation-DS5NRILW.js.map +0 -1
  708. package/dist/derive-E642AOUB.js +0 -21
  709. package/dist/dispatch-Q6MWLOJY.js.map +0 -1
  710. package/dist/executor-5NIMLSKZ.js +0 -8
  711. package/dist/executor-7UQ3BZ4F.js +0 -29
  712. package/dist/executor-AQVXV5GZ.js +0 -8
  713. package/dist/export-accessible-ORMKLA3E.js +0 -22
  714. package/dist/extract-partition-NKYO3WNG.js +0 -37
  715. package/dist/fanout-sidecar-S3QL53YX.js.map +0 -1
  716. package/dist/find-NOGJ25VX.js +0 -10
  717. package/dist/issue-3DTQ7VJJ.js +0 -18
  718. package/dist/json-schema-V3M5MUCM.js.map +0 -1
  719. package/dist/kernel/enclave/classify/compare.d.ts +0 -10
  720. package/dist/kernel/enclave/index.d.ts +0 -87
  721. package/dist/kernel/enclave/record-keys/lifecycle.d.ts +0 -124
  722. package/dist/kernel/enclave/record-keys/rekey-blob.d.ts +0 -88
  723. package/dist/kernel/enclave/record-keys/rekey.d.ts +0 -91
  724. package/dist/kernel/enclave/record-keys/sealed-slot.d.ts +0 -14
  725. package/dist/kernel/enclave/record-keys/sealed-slots.d.ts +0 -123
  726. package/dist/kernel/enclave/record-keys/sealing.d.ts +0 -70
  727. package/dist/kernel/query/join.d.ts +0 -232
  728. package/dist/liberate-V35QUHJP.js +0 -24
  729. package/dist/link-set-2TTM3IZC.js +0 -30
  730. package/dist/noydb-62MX4QUG.js +0 -90
  731. package/dist/pod-handle-ECVCDIXW.js.map +0 -1
  732. package/dist/post-register-3IPCSG6Q.js.map +0 -1
  733. package/dist/register-HHLXEQDN.js +0 -31
  734. package/dist/registry-23WF3TGH.js +0 -8
  735. package/dist/registry-4AYVUNXK.js +0 -8
  736. package/dist/registry-JS3YFQQM.js +0 -18
  737. package/dist/registry-XX2Z7B46.js +0 -32
  738. package/dist/request-withdrawal-CHPATE4G.js +0 -30
  739. package/dist/reveal-QZDHSGD4.js.map +0 -1
  740. package/dist/revoke-7M2VW4ON.js +0 -23
  741. package/dist/seed-X5CC22CQ.js.map +0 -1
  742. package/dist/signer-SJQJVSM6.js +0 -24
  743. package/dist/stale-BZS6H2RY.js +0 -29
  744. package/dist/storage-RW4QBS23.js +0 -22
  745. package/dist/store-coordination-provider-4WZAIRHC.js.map +0 -1
  746. package/dist/verify-6MDTIUEV.js.map +0 -1
  747. package/dist/walk-ZURCH6RZ.js +0 -21
  748. package/dist/withdraw-accessible-PXR4IXDX.js +0 -27
  749. /package/dist/{api-WYW4YEQG.js.map → api-OS747DS4.js.map} +0 -0
  750. /package/dist/{computed-VPOKQK4N.js.map → capsule/contract.js.map} +0 -0
  751. /package/dist/{kernel/enclave → capsule/enclave-aes}/broker/proof.d.ts +0 -0
  752. /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/bidx.d.ts +0 -0
  753. /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/digest.d.ts +0 -0
  754. /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/vdig.d.ts +0 -0
  755. /package/dist/{kernel/enclave/classify → capsule/plumbing}/kofn.d.ts +0 -0
  756. /package/dist/{kernel/enclave/classify → capsule/plumbing}/normalize.d.ts +0 -0
  757. /package/dist/{kernel/enclave → capsule/plumbing}/record-aad.d.ts +0 -0
  758. /package/dist/{collection-facade-JSJYIKS4.js.map → capsule-VOLX3QRQ.js.map} +0 -0
  759. /package/dist/{chunk-MVMXZYXT.js.map → chunk-2GHDLTPE.js.map} +0 -0
  760. /package/dist/{chunk-XLMEZIAJ.js.map → chunk-2ODVB6LZ.js.map} +0 -0
  761. /package/dist/{chunk-RMS3NEA3.js.map → chunk-4JPMZTJY.js.map} +0 -0
  762. /package/dist/{chunk-NQKIUNW5.js.map → chunk-52MGURXO.js.map} +0 -0
  763. /package/dist/{chunk-UGTBXF5U.js.map → chunk-7XMHMVTS.js.map} +0 -0
  764. /package/dist/{chunk-BZ3534YM.js.map → chunk-AUKKUPVB.js.map} +0 -0
  765. /package/dist/{derive-E642AOUB.js.map → chunk-BKT776R5.js.map} +0 -0
  766. /package/dist/{chunk-6LKOJBV6.js.map → chunk-BVCUTXE3.js.map} +0 -0
  767. /package/dist/{chunk-VTFVLCUH.js.map → chunk-DIZLQVAA.js.map} +0 -0
  768. /package/dist/{chunk-LWBCUYZW.js.map → chunk-E2N2T5ZO.js.map} +0 -0
  769. /package/dist/{chunk-JVIBCBC7.js.map → chunk-EJLV62NI.js.map} +0 -0
  770. /package/dist/{chunk-JMGDHKQF.js.map → chunk-FLPCETP6.js.map} +0 -0
  771. /package/dist/{chunk-DGOZ4UZD.js.map → chunk-FVH5QYY2.js.map} +0 -0
  772. /package/dist/{chunk-JBDFMYKQ.js.map → chunk-GZT3NQRA.js.map} +0 -0
  773. /package/dist/{chunk-TFR7DSOV.js.map → chunk-H427H63K.js.map} +0 -0
  774. /package/dist/{chunk-SMH6SRX7.js.map → chunk-JOSPH3E5.js.map} +0 -0
  775. /package/dist/{chunk-3BZZJJMQ.js.map → chunk-MILI22XQ.js.map} +0 -0
  776. /package/dist/{chunk-YYP7WSEB.js.map → chunk-O2IMQSNA.js.map} +0 -0
  777. /package/dist/{chunk-QIZPZMUI.js.map → chunk-Q4UHJ5SN.js.map} +0 -0
  778. /package/dist/{chunk-FAHMLERK.js.map → chunk-QBLT6POL.js.map} +0 -0
  779. /package/dist/{chunk-BUE2D7PX.js.map → chunk-SMV2HRDU.js.map} +0 -0
  780. /package/dist/{chunk-SFAWCTEM.js.map → chunk-TZZBXPZK.js.map} +0 -0
  781. /package/dist/{chunk-UHHPLO3I.js.map → chunk-V3RWOOSO.js.map} +0 -0
  782. /package/dist/{chunk-Q2PU57HC.js.map → chunk-VVOLDVIR.js.map} +0 -0
  783. /package/dist/{chunk-TUFM4UZP.js.map → chunk-XQRFSKYM.js.map} +0 -0
  784. /package/dist/{chunk-GY4WYNNG.js.map → chunk-Y2RKVFKR.js.map} +0 -0
  785. /package/dist/{chunk-4OZNXTO4.js.map → chunk-YRXFFWG4.js.map} +0 -0
  786. /package/dist/{enclave-55PAM4YO.js.map → collection-facade-CS7CA2XO.js.map} +0 -0
  787. /package/dist/{executor-5NIMLSKZ.js.map → computed-FAD7SED4.js.map} +0 -0
  788. /package/dist/{executor-7UQ3BZ4F.js.map → derive-XLOJVXPU.js.map} +0 -0
  789. /package/dist/{dispatch-IEPAVQUM.js.map → dispatch-H4HV32AM.js.map} +0 -0
  790. /package/dist/{executor-AQVXV5GZ.js.map → executor-FMPVN6DT.js.map} +0 -0
  791. /package/dist/{export-accessible-ORMKLA3E.js.map → executor-LBBBRTN5.js.map} +0 -0
  792. /package/dist/{extract-partition-NKYO3WNG.js.map → executor-OSRZST2U.js.map} +0 -0
  793. /package/dist/{find-NOGJ25VX.js.map → export-accessible-RAOJAAU5.js.map} +0 -0
  794. /package/dist/{issue-3DTQ7VJJ.js.map → extract-partition-JD5CUSTG.js.map} +0 -0
  795. /package/dist/{ledger-EDXFFZQL.js.map → find-JRN4RNQ5.js.map} +0 -0
  796. /package/dist/{liberate-V35QUHJP.js.map → issue-YIVBZUTH.js.map} +0 -0
  797. /package/dist/{link-set-2TTM3IZC.js.map → ledger-5ZMGE44K.js.map} +0 -0
  798. /package/dist/{managed-secret-NCWEMPUQ.js.map → liberate-WZSZM2W6.js.map} +0 -0
  799. /package/dist/{noydb-62MX4QUG.js.map → link-set-MFXC24VK.js.map} +0 -0
  800. /package/dist/{register-HHLXEQDN.js.map → managed-secret-MFTFT22X.js.map} +0 -0
  801. /package/dist/{migrate-cek-5ENH64AA.js.map → migrate-cek-DZRFFOHW.js.map} +0 -0
  802. /package/dist/{registry-23WF3TGH.js.map → noydb-ITIGNKUF.js.map} +0 -0
  803. /package/dist/{registry-4AYVUNXK.js.map → query/all/index.js.map} +0 -0
  804. /package/dist/{registry-JS3YFQQM.js.map → register-DT5HZ2LZ.js.map} +0 -0
  805. /package/dist/{registry-XX2Z7B46.js.map → registry-BHRZGZHF.js.map} +0 -0
  806. /package/dist/{request-withdrawal-CHPATE4G.js.map → registry-ET6ZFFWA.js.map} +0 -0
  807. /package/dist/{revoke-7M2VW4ON.js.map → registry-HXFGLGTG.js.map} +0 -0
  808. /package/dist/{signer-SJQJVSM6.js.map → registry-THCPDEOD.js.map} +0 -0
  809. /package/dist/{stale-BZS6H2RY.js.map → request-withdrawal-AV2MJJKY.js.map} +0 -0
  810. /package/dist/{storage-RW4QBS23.js.map → revoke-6DWIEOCV.js.map} +0 -0
  811. /package/dist/{walk-ZURCH6RZ.js.map → signer-MHGW3OIL.js.map} +0 -0
  812. /package/dist/{withdraw-accessible-PXR4IXDX.js.map → stale-6GCFMOOR.js.map} +0 -0
@@ -0,0 +1,306 @@
1
+ import {
2
+ NO_COVERAGE
3
+ } from "../chunk-RHVMZSUU.js";
4
+
5
+ // src/with-audit/coverage/sketch.ts
6
+ function fnv1a(s, seed = 2166136261) {
7
+ let h = seed >>> 0;
8
+ for (let i = 0; i < s.length; i++) {
9
+ h ^= s.charCodeAt(i);
10
+ h = Math.imul(h, 16777619) >>> 0;
11
+ }
12
+ h ^= h >>> 16;
13
+ h = Math.imul(h, 2246822507) >>> 0;
14
+ h ^= h >>> 13;
15
+ h = Math.imul(h, 3266489909) >>> 0;
16
+ h ^= h >>> 16;
17
+ return h >>> 0;
18
+ }
19
+ var HyperLogLog = class _HyperLogLog {
20
+ precision;
21
+ registers;
22
+ constructor(precision = 14) {
23
+ if (!Number.isInteger(precision) || precision < 4 || precision > 16) {
24
+ throw new RangeError(`HyperLogLog precision must be an integer in [4,16], got ${precision}`);
25
+ }
26
+ this.precision = precision;
27
+ this.registers = new Uint8Array(1 << precision);
28
+ }
29
+ add(id) {
30
+ const h = fnv1a(id);
31
+ const idx = h >>> 32 - this.precision;
32
+ const rest = h << this.precision >>> 0;
33
+ const rank = rest === 0 ? 32 - this.precision + 1 : Math.clz32(rest) + 1;
34
+ if (rank > this.registers[idx]) this.registers[idx] = rank;
35
+ }
36
+ /** Estimated distinct count. */
37
+ count() {
38
+ const m = this.registers.length;
39
+ let zeros = 0;
40
+ let sum = 0;
41
+ for (let i = 0; i < m; i++) {
42
+ const r = this.registers[i];
43
+ if (r === 0) zeros++;
44
+ sum += 2 ** -r;
45
+ }
46
+ const alpha = m === 16 ? 0.673 : m === 32 ? 0.697 : m === 64 ? 0.709 : 0.7213 / (1 + 1.079 / m);
47
+ const raw = alpha * m * m / sum;
48
+ if (raw <= 2.5 * m && zeros > 0) return Math.round(m * Math.log(m / zeros));
49
+ return Math.round(raw);
50
+ }
51
+ /** Serializable state — registers only. No id, no id-derived key. */
52
+ toJSON() {
53
+ let bin = "";
54
+ for (const b of this.registers) bin += String.fromCharCode(b);
55
+ return { p: this.precision, r: btoa(bin) };
56
+ }
57
+ static fromJSON(state) {
58
+ const hll = new _HyperLogLog(state.p);
59
+ const bin = atob(state.r);
60
+ for (let i = 0; i < hll.registers.length && i < bin.length; i++) {
61
+ hll.registers[i] = bin.charCodeAt(i);
62
+ }
63
+ return hll;
64
+ }
65
+ };
66
+ var BloomFilter = class {
67
+ bits;
68
+ hashes;
69
+ words;
70
+ constructor(bits = 1 << 14, hashes = 7) {
71
+ if (!Number.isInteger(bits) || bits < 64) throw new RangeError(`Bloom bits must be >= 64, got ${bits}`);
72
+ if (!Number.isInteger(hashes) || hashes < 1 || hashes > 16) {
73
+ throw new RangeError(`Bloom hashes must be in [1,16], got ${hashes}`);
74
+ }
75
+ this.bits = bits;
76
+ this.hashes = hashes;
77
+ this.words = new Uint32Array(Math.ceil(bits / 32));
78
+ }
79
+ /** Set the id's bits; returns true when the id was NOT already present. */
80
+ addIfAbsent(id) {
81
+ const h1 = fnv1a(id);
82
+ const h2 = fnv1a(id, 2654435761) | 1;
83
+ let novel = false;
84
+ for (let i = 0; i < this.hashes; i++) {
85
+ const bit = h1 + Math.imul(i, h2) >>> 0;
86
+ const pos = bit % this.bits;
87
+ const w = pos >>> 5;
88
+ const mask = 1 << (pos & 31);
89
+ if ((this.words[w] & mask) === 0) {
90
+ this.words[w] = this.words[w] | mask;
91
+ novel = true;
92
+ }
93
+ }
94
+ return novel;
95
+ }
96
+ clear() {
97
+ this.words.fill(0);
98
+ }
99
+ };
100
+
101
+ // src/with-audit/coverage/accounting.ts
102
+ var DEFAULT_ALERT_AT = [0.6, 0.9];
103
+ var HOUR_MS = 36e5;
104
+ var Account = class {
105
+ constructor(principal, vault, collection, opts) {
106
+ this.principal = principal;
107
+ this.vault = vault;
108
+ this.collection = collection;
109
+ this.hll = new HyperLogLog(opts.precision);
110
+ this.bloom = new BloomFilter(opts.bloomBits, opts.bloomHashes);
111
+ this.windowStart = opts.now;
112
+ }
113
+ principal;
114
+ vault;
115
+ collection;
116
+ hll;
117
+ bloom;
118
+ served = 0;
119
+ servedInWindow = 0;
120
+ novelInWindow = 0;
121
+ windowStart;
122
+ /** Running mean of previous windows' served counts, for burstiness. */
123
+ servedMean = 0;
124
+ windowsClosed = 0;
125
+ fired = /* @__PURE__ */ new Set();
126
+ };
127
+ var CoverageRegistry = class {
128
+ #accounts = /* @__PURE__ */ new Map();
129
+ #precision;
130
+ #bloomBits;
131
+ #bloomHashes;
132
+ #windowMs;
133
+ #collections;
134
+ #now;
135
+ #warnedEager = /* @__PURE__ */ new Set();
136
+ constructor(opts = {}) {
137
+ this.#precision = opts.precision ?? 14;
138
+ this.#bloomBits = opts.bloomBits ?? 1 << 14;
139
+ this.#bloomHashes = opts.bloomHashes ?? 7;
140
+ this.#windowMs = opts.windowMs ?? HOUR_MS;
141
+ this.#collections = opts.collections ?? {};
142
+ this.#now = opts.now ?? (() => Date.now());
143
+ if (this.#windowMs <= 0) throw new RangeError(`windowMs must be > 0, got ${this.#windowMs}`);
144
+ }
145
+ observer(vault, collection, principal, fieldMeta, emitter, eager) {
146
+ let accounted;
147
+ return (id) => {
148
+ accounted ??= this.#resolveAccounted(collection, fieldMeta(), eager);
149
+ if (!accounted) return;
150
+ this.#record(principal, vault, collection, id, emitter);
151
+ };
152
+ }
153
+ /**
154
+ * ⛔⛔ THE MEASUREMENT THAT DECIDES WHETHER THIS SENSOR SAYS ANYTHING TRUE.
155
+ *
156
+ * The design's unit is "the record decrypt". In hub that is only the same
157
+ * thing as "the record was read" for a LAZY collection (`prefetch: false`),
158
+ * where reads go per-id against the store. An EAGER collection — the default
159
+ * — decrypts its entire corpus once, at hydration, into the working set:
160
+ * measured on a 30-record collection, one `get()` after reopening the vault
161
+ * took the sensor from 0 to `coverage: 1`. Every principal who so much as
162
+ * opens the vault would trip every threshold.
163
+ *
164
+ * A sensor that reports total coverage for everyone is worse than no sensor:
165
+ * it is exactly the "invites reliance" failure this feature is supposed to
166
+ * be honest about. So an eager bulk-declared collection is NOT accounted,
167
+ * and the refusal is LOUD — silence here would look identical to "nobody has
168
+ * read anything", which is the most dangerous possible false negative.
169
+ *
170
+ * The codec cannot tell hydration from a read (it sees neither caller nor
171
+ * intent), so this cannot be fixed inside the sensor. Declaring the
172
+ * collection lazy is the fix, and the warning says so.
173
+ */
174
+ #resolveAccounted(collection, fieldMeta, eager) {
175
+ const declared = this.#collections[collection] !== void 0 || declaresBulk(fieldMeta);
176
+ if (!declared) return false;
177
+ if (!eager) return true;
178
+ if (!this.#warnedEager.has(collection)) {
179
+ this.#warnedEager.add(collection);
180
+ console.warn(
181
+ `[noy-db] withCoverage(): collection "${collection}" is bulk-declared but EAGER, so it is NOT accounted. An eager collection decrypts its whole corpus at hydration, which would read as 100% coverage for every principal that opens the vault. Declare it \`prefetch: false\` (with a \`cache\` budget) to make its reads countable. Coverage is telemetry either way \u2014 the remediation for bulk exposure is key custody (tiers, per-collection DEKs).`
182
+ );
183
+ }
184
+ return false;
185
+ }
186
+ #account(principal, vault, collection, now) {
187
+ const k = JSON.stringify([principal, vault, collection]);
188
+ let acc = this.#accounts.get(k);
189
+ if (acc === void 0) {
190
+ acc = new Account(principal, vault, collection, {
191
+ precision: this.#precision,
192
+ bloomBits: this.#bloomBits,
193
+ bloomHashes: this.#bloomHashes,
194
+ now
195
+ });
196
+ this.#accounts.set(k, acc);
197
+ }
198
+ return acc;
199
+ }
200
+ #record(principal, vault, collection, id, emitter) {
201
+ const now = this.#now();
202
+ const acc = this.#account(principal, vault, collection, now);
203
+ if (now - acc.windowStart >= this.#windowMs) {
204
+ acc.servedMean = acc.windowsClosed === 0 ? acc.servedInWindow : (acc.servedMean * acc.windowsClosed + acc.servedInWindow) / (acc.windowsClosed + 1);
205
+ acc.windowsClosed++;
206
+ acc.bloom.clear();
207
+ acc.servedInWindow = 0;
208
+ acc.novelInWindow = 0;
209
+ acc.windowStart = now;
210
+ }
211
+ acc.hll.add(id);
212
+ if (acc.bloom.addIfAbsent(id)) acc.novelInWindow++;
213
+ acc.served++;
214
+ acc.servedInWindow++;
215
+ const policy = this.#collections[collection];
216
+ const corpusSize = policy?.corpusSize;
217
+ if (corpusSize === void 0 || corpusSize <= 0) return;
218
+ const coverage = Math.min(1, acc.hll.count() / corpusSize);
219
+ for (const t of policy?.alertAt ?? DEFAULT_ALERT_AT) {
220
+ if (coverage < t || acc.fired.has(t)) continue;
221
+ acc.fired.add(t);
222
+ const event = {
223
+ principal,
224
+ vault,
225
+ collection,
226
+ novel: acc.novelInWindow,
227
+ served: acc.served,
228
+ coverage,
229
+ window: new Date(acc.windowStart).toISOString(),
230
+ source: "hub/coverage"
231
+ };
232
+ emitter.emit("coverage:threshold", event);
233
+ }
234
+ }
235
+ /** Current accounting, for an operator surface. Estimates, never exact. */
236
+ stats() {
237
+ const out = [];
238
+ for (const acc of this.#accounts.values()) {
239
+ const corpusSize = this.#collections[acc.collection]?.corpusSize;
240
+ const distinct = acc.hll.count();
241
+ out.push({
242
+ principal: acc.principal,
243
+ vault: acc.vault,
244
+ collection: acc.collection,
245
+ distinct,
246
+ served: acc.served,
247
+ novelInWindow: acc.novelInWindow,
248
+ servedInWindow: acc.servedInWindow,
249
+ burstiness: acc.servedMean > 0 ? acc.servedInWindow / acc.servedMean : 1,
250
+ ...corpusSize !== void 0 && corpusSize > 0 ? { coverage: Math.min(1, distinct / corpusSize) } : {},
251
+ window: new Date(acc.windowStart).toISOString()
252
+ });
253
+ }
254
+ return out;
255
+ }
256
+ /**
257
+ * Serializable state, for a deployment that wants coverage to survive a
258
+ * restart — the horizon must exceed tenure, and a process does not.
259
+ * ⛔ Sketches only. Never a record id: see {@link CoverageSnapshot}.
260
+ */
261
+ snapshot() {
262
+ const entries = [];
263
+ for (const acc of this.#accounts.values()) {
264
+ entries.push({
265
+ principal: acc.principal,
266
+ vault: acc.vault,
267
+ collection: acc.collection,
268
+ hll: acc.hll.toJSON(),
269
+ served: acc.served,
270
+ windowStart: acc.windowStart
271
+ });
272
+ }
273
+ return { _noydb_coverage: 1, entries };
274
+ }
275
+ /**
276
+ * Restore a snapshot. The novelty filter is deliberately NOT restored:
277
+ * novelty is a within-window notion and the window did not survive.
278
+ * Distinct-ever did, which is the quantity that must not reset.
279
+ */
280
+ restore(snapshot) {
281
+ for (const e of snapshot.entries) {
282
+ const acc = this.#account(e.principal, e.vault, e.collection, e.windowStart);
283
+ acc.hll = HyperLogLog.fromJSON(e.hll);
284
+ acc.served = e.served;
285
+ acc.windowStart = e.windowStart;
286
+ }
287
+ }
288
+ };
289
+ function declaresBulk(fieldMeta) {
290
+ if (fieldMeta === void 0) return false;
291
+ for (const meta of Object.values(fieldMeta)) if (meta?.bulk === "sensitive") return true;
292
+ return false;
293
+ }
294
+
295
+ // src/with-audit/coverage/active.ts
296
+ function withCoverage(opts = {}) {
297
+ return new CoverageRegistry(opts);
298
+ }
299
+ export {
300
+ BloomFilter,
301
+ CoverageRegistry,
302
+ HyperLogLog,
303
+ NO_COVERAGE,
304
+ withCoverage
305
+ };
306
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/with-audit/coverage/sketch.ts","../../src/with-audit/coverage/accounting.ts","../../src/with-audit/coverage/active.ts"],"sourcesContent":["/**\n * Bounded-size sketches for the coverage sensor (#1363).\n *\n * ⚠️ THE WHOLE POINT OF A SKETCH HERE IS WHAT IT CANNOT DO. Coverage state\n * answers *\"how much of this corpus has this principal seen\"*, and the exact\n * answer — the id set — is a SECOND COPY OF THE SENSITIVE SET. A sensor built\n * to notice bulk extraction would then be the best single artefact to extract.\n * So no structure in this module retains a record id, and none can be\n * enumerated back into one: HyperLogLog keeps per-register leading-zero ranks,\n * Bloom keeps bits. Both are lossy on purpose, and the accuracy that costs is\n * the price of the property (`no-record-ids.test.ts` pins it).\n *\n * @module\n */\n\n/** 32-bit FNV-1a. Not cryptographic — a sketch only needs good dispersion. */\nfunction fnv1a(s: string, seed = 0x811c9dc5): number {\n let h = seed >>> 0\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i)\n h = Math.imul(h, 0x01000193) >>> 0\n }\n // Final avalanche (murmur3 fmix32) — FNV alone disperses low bits poorly,\n // and HLL reads the TOP bits for the register index.\n h ^= h >>> 16\n h = Math.imul(h, 0x85ebca6b) >>> 0\n h ^= h >>> 13\n h = Math.imul(h, 0xc2b2ae35) >>> 0\n h ^= h >>> 16\n return h >>> 0\n}\n\n// ─── HyperLogLog — distinct ids ever decrypted ────────────────────────────\n\n/**\n * HyperLogLog over `2^precision` one-byte registers.\n *\n * ⭐ SIZING IS THE OPEN QUESTION THIS FEATURE SHIPS WITH, not a settled\n * default. At the scale the design anticipates (~1k records, ~30 principals)\n * the estimator runs entirely in its LINEAR-COUNTING range, where accuracy is\n * a function of load factor rather than of HLL's asymptotic 1.04/√m. So the\n * default is chosen by MEASUREMENT, not theory — `__tests__/coverage/sketch.test.ts`\n * pins the error band this implementation actually produces:\n *\n * | distinct ids | p=10 (1 KiB) | p=12 (4 KiB) | **p=14 (16 KiB, default)** |\n * |---:|---:|---:|---:|\n * | 100 | 3.00% | 1.00% | **0.00%** |\n * | 1 000 | 2.90% | 0.50% | **0.40%** |\n * | 10 000 | 2.34% | 5.62% | **0.96%** |\n * | 50 000 | 2.31% | 1.70% | **1.52%** |\n *\n * (p=12's 5.62% at 10 000 is the linear-counting/raw-estimator crossover, and\n * is exactly why the default is not chosen from the memory column.)\n * 16 KiB is per `(principal, vault, collection)` — a ~30-principal deployment\n * with a handful of bulk-declared collections stays in the low megabytes.\n * `precision` is configurable for a deployment whose corpus is a different\n * order of magnitude.\n *\n * ⛔ An exact per-collection bitmap would be smaller AND exact at that scale.\n * It is not shipped because it leaks ids: bit *i* set means \"record *i* was\n * read\", which is the second copy this module exists to avoid. Revisit only\n * against a real dataset, and only with that trade stated.\n */\nexport class HyperLogLog {\n readonly precision: number\n private readonly registers: Uint8Array\n\n constructor(precision = 14) {\n if (!Number.isInteger(precision) || precision < 4 || precision > 16) {\n throw new RangeError(`HyperLogLog precision must be an integer in [4,16], got ${precision}`)\n }\n this.precision = precision\n this.registers = new Uint8Array(1 << precision)\n }\n\n add(id: string): void {\n const h = fnv1a(id)\n const idx = h >>> (32 - this.precision)\n // Rank = 1 + leading zeros of the remaining bits (bounded by the width).\n const rest = (h << this.precision) >>> 0\n const rank = rest === 0 ? 32 - this.precision + 1 : Math.clz32(rest) + 1\n if (rank > this.registers[idx]!) this.registers[idx] = rank\n }\n\n /** Estimated distinct count. */\n count(): number {\n const m = this.registers.length\n let zeros = 0\n let sum = 0\n for (let i = 0; i < m; i++) {\n const r = this.registers[i]!\n if (r === 0) zeros++\n sum += 2 ** -r\n }\n const alpha = m === 16 ? 0.673 : m === 32 ? 0.697 : m === 64 ? 0.709 : 0.7213 / (1 + 1.079 / m)\n const raw = (alpha * m * m) / sum\n // Small-range correction: linear counting, which is where a ~1k corpus\n // lives. This is the branch the pilot's scale actually exercises.\n if (raw <= 2.5 * m && zeros > 0) return Math.round(m * Math.log(m / zeros))\n return Math.round(raw)\n }\n\n /** Serializable state — registers only. No id, no id-derived key. */\n toJSON(): { readonly p: number; readonly r: string } {\n let bin = ''\n for (const b of this.registers) bin += String.fromCharCode(b)\n return { p: this.precision, r: btoa(bin) }\n }\n\n static fromJSON(state: { readonly p: number; readonly r: string }): HyperLogLog {\n const hll = new HyperLogLog(state.p)\n const bin = atob(state.r)\n for (let i = 0; i < hll.registers.length && i < bin.length; i++) {\n hll.registers[i] = bin.charCodeAt(i)\n }\n return hll\n }\n}\n\n// ─── Bloom — novelty within one window ────────────────────────────────────\n\n/**\n * Bloom filter for *novelty per window* — \"have I seen this id in this\n * window?\". False positives under-report novelty (a novel read is scored as a\n * repeat), which is the safe direction for a sensor that must not cry wolf;\n * false negatives are impossible.\n */\nexport class BloomFilter {\n readonly bits: number\n readonly hashes: number\n private readonly words: Uint32Array\n\n constructor(bits = 1 << 14, hashes = 7) {\n if (!Number.isInteger(bits) || bits < 64) throw new RangeError(`Bloom bits must be >= 64, got ${bits}`)\n if (!Number.isInteger(hashes) || hashes < 1 || hashes > 16) {\n throw new RangeError(`Bloom hashes must be in [1,16], got ${hashes}`)\n }\n this.bits = bits\n this.hashes = hashes\n this.words = new Uint32Array(Math.ceil(bits / 32))\n }\n\n /** Set the id's bits; returns true when the id was NOT already present. */\n addIfAbsent(id: string): boolean {\n const h1 = fnv1a(id)\n const h2 = fnv1a(id, 0x9e3779b1) | 1\n let novel = false\n for (let i = 0; i < this.hashes; i++) {\n const bit = (h1 + Math.imul(i, h2)) >>> 0\n const pos = bit % this.bits\n const w = pos >>> 5\n const mask = 1 << (pos & 31)\n if ((this.words[w]! & mask) === 0) {\n this.words[w] = this.words[w]! | mask\n novel = true\n }\n }\n return novel\n }\n\n clear(): void {\n this.words.fill(0)\n }\n}\n","/**\n * Coverage accounting (#1363) — per `(principal, vault, collection)`.\n *\n * ⛔⛔ **TELEMETRY, NOT A CONTROL.** Against an insider holding the device and\n * local keys this prevents nothing; it makes bulk extraction visible early,\n * attributable and loud. Key custody (tiers, per-collection DEKs) is the\n * remediation. Nothing in this module refuses a read, and nothing in it may\n * ever grow the ability to (#1251 §3: a refusal is a threshold the reader can\n * binary-search; a signal is not).\n *\n * What is accounted, and why each one:\n *\n * - **distinct ids ever decrypted** (HyperLogLog) — coverage is the protected\n * quantity, not rate: patience lowers an extractor's rate and never their\n * coverage. Monotonic, and the horizon is the life of the state, never a\n * 30-day window that resets faster than the attack completes.\n * - **novelty per window** (Bloom, cleared per window) — the discriminator\n * that is orthogonal to speed. A legitimate operator re-reads a working\n * subset (high volume, low novelty); an extractor reads new records.\n * - **served** — decrypts, all time and per window.\n * - **burstiness** — this window's served count over the running mean of the\n * previous windows'. 1 while there is no history to compare against.\n *\n * @module\n */\n\nimport { BloomFilter, HyperLogLog } from './sketch.js'\nimport type {\n CoverageEmitter,\n CoverageEvent,\n CoverageFieldMeta,\n CoverageObserver,\n CoverageStrategy,\n} from '../../port/with/coverage-strategy.js'\n\n/** Per-collection policy. Absent `corpusSize` ⇒ no coverage estimate, so no alert. */\nexport interface CoverageCollectionPolicy {\n /**\n * How many records the corpus holds. Coverage is `distinct / corpusSize`.\n * Deliberately DECLARED rather than counted: counting means a store read on\n * a sensor that must not touch the store, and a corpus size that moves with\n * every write makes an alert threshold un-reproducible.\n */\n readonly corpusSize?: number\n /** Coverage fractions to alert at. Default `[0.6, 0.9]`. Each fires at most once. */\n readonly alertAt?: readonly number[]\n}\n\nexport interface WithCoverageOptions {\n /**\n * HyperLogLog precision — the register file is `2^precision` bytes per\n * `(principal, vault, collection)`. Default 14 (16 KiB), chosen by\n * measurement; the table is in `sketch.ts`.\n */\n readonly precision?: number\n /** Bloom width in bits, per key, per window. Default 16 384 (2 KiB). */\n readonly bloomBits?: number\n /** Bloom hash count. Default 7. */\n readonly bloomHashes?: number\n /** Novelty window length. Default one hour. NOT the coverage horizon — that never resets. */\n readonly windowMs?: number\n /** Per-collection corpus size and alert thresholds. */\n readonly collections?: Readonly<Record<string, CoverageCollectionPolicy>>\n /** Clock seam, for tests. */\n readonly now?: () => number\n}\n\nexport interface CoverageStats {\n readonly principal: string\n readonly vault: string\n readonly collection: string\n /** HLL estimate of distinct ids ever decrypted. */\n readonly distinct: number\n readonly served: number\n readonly novelInWindow: number\n readonly servedInWindow: number\n readonly burstiness: number\n /** Absent when the collection declares no `corpusSize`. */\n readonly coverage?: number\n readonly window: string\n}\n\n/**\n * Serializable coverage state.\n *\n * ⛔ SKETCHES ONLY — the invariant this module exists to hold. A structure\n * that could name the records a principal has read would be a second copy of\n * the sensitive set: the sensor built to notice bulk extraction would become\n * the single best artefact to extract. Pinned by\n * `__tests__/coverage/no-record-ids.test.ts`.\n */\nexport interface CoverageSnapshot {\n readonly _noydb_coverage: 1\n readonly entries: ReadonlyArray<{\n readonly principal: string\n readonly vault: string\n readonly collection: string\n readonly hll: { readonly p: number; readonly r: string }\n readonly served: number\n readonly windowStart: number\n }>\n}\n\nconst DEFAULT_ALERT_AT = [0.6, 0.9] as const\nconst HOUR_MS = 3_600_000\n\nclass Account {\n hll: HyperLogLog\n readonly bloom: BloomFilter\n served = 0\n servedInWindow = 0\n novelInWindow = 0\n windowStart: number\n /** Running mean of previous windows' served counts, for burstiness. */\n servedMean = 0\n windowsClosed = 0\n readonly fired = new Set<number>()\n\n constructor(\n readonly principal: string,\n readonly vault: string,\n readonly collection: string,\n opts: { precision: number; bloomBits: number; bloomHashes: number; now: number },\n ) {\n this.hll = new HyperLogLog(opts.precision)\n this.bloom = new BloomFilter(opts.bloomBits, opts.bloomHashes)\n this.windowStart = opts.now\n }\n}\n\nexport class CoverageRegistry implements CoverageStrategy {\n readonly #accounts = new Map<string, Account>()\n readonly #precision: number\n readonly #bloomBits: number\n readonly #bloomHashes: number\n readonly #windowMs: number\n readonly #collections: Readonly<Record<string, CoverageCollectionPolicy>>\n readonly #now: () => number\n readonly #warnedEager = new Set<string>()\n\n constructor(opts: WithCoverageOptions = {}) {\n this.#precision = opts.precision ?? 14\n this.#bloomBits = opts.bloomBits ?? 1 << 14\n this.#bloomHashes = opts.bloomHashes ?? 7\n this.#windowMs = opts.windowMs ?? HOUR_MS\n this.#collections = opts.collections ?? {}\n this.#now = opts.now ?? (() => Date.now())\n if (this.#windowMs <= 0) throw new RangeError(`windowMs must be > 0, got ${this.#windowMs}`)\n }\n\n observer(\n vault: string,\n collection: string,\n principal: string,\n fieldMeta: () => CoverageFieldMeta | undefined,\n emitter: CoverageEmitter,\n eager: boolean,\n ): CoverageObserver | undefined {\n // Whether this collection is accounted resolves on the FIRST decrypt, not\n // here: `fieldMeta` can be attached to a Collection after construction\n // (`_applyFieldMeta`, first-wins) and this runs from the constructor. So\n // an opted-in deployment pays one boolean test per decrypt on the\n // collections it does not account for; an un-opted-in one pays nothing at\n // all, because NO_COVERAGE returns no observer.\n let accounted: boolean | undefined\n return (id: string): void => {\n accounted ??= this.#resolveAccounted(collection, fieldMeta(), eager)\n if (!accounted) return\n this.#record(principal, vault, collection, id, emitter)\n }\n }\n\n /**\n * ⛔⛔ THE MEASUREMENT THAT DECIDES WHETHER THIS SENSOR SAYS ANYTHING TRUE.\n *\n * The design's unit is \"the record decrypt\". In hub that is only the same\n * thing as \"the record was read\" for a LAZY collection (`prefetch: false`),\n * where reads go per-id against the store. An EAGER collection — the default\n * — decrypts its entire corpus once, at hydration, into the working set:\n * measured on a 30-record collection, one `get()` after reopening the vault\n * took the sensor from 0 to `coverage: 1`. Every principal who so much as\n * opens the vault would trip every threshold.\n *\n * A sensor that reports total coverage for everyone is worse than no sensor:\n * it is exactly the \"invites reliance\" failure this feature is supposed to\n * be honest about. So an eager bulk-declared collection is NOT accounted,\n * and the refusal is LOUD — silence here would look identical to \"nobody has\n * read anything\", which is the most dangerous possible false negative.\n *\n * The codec cannot tell hydration from a read (it sees neither caller nor\n * intent), so this cannot be fixed inside the sensor. Declaring the\n * collection lazy is the fix, and the warning says so.\n */\n #resolveAccounted(collection: string, fieldMeta: CoverageFieldMeta | undefined, eager: boolean): boolean {\n const declared = this.#collections[collection] !== undefined || declaresBulk(fieldMeta)\n if (!declared) return false\n if (!eager) return true\n if (!this.#warnedEager.has(collection)) {\n this.#warnedEager.add(collection)\n console.warn(\n `[noy-db] withCoverage(): collection \"${collection}\" is bulk-declared but EAGER, so it is NOT ` +\n `accounted. An eager collection decrypts its whole corpus at hydration, which would read as ` +\n `100% coverage for every principal that opens the vault. Declare it \\`prefetch: false\\` ` +\n `(with a \\`cache\\` budget) to make its reads countable. Coverage is telemetry either way — ` +\n `the remediation for bulk exposure is key custody (tiers, per-collection DEKs).`,\n )\n }\n return false\n }\n\n #account(principal: string, vault: string, collection: string, now: number): Account {\n const k = JSON.stringify([principal, vault, collection])\n let acc = this.#accounts.get(k)\n if (acc === undefined) {\n acc = new Account(principal, vault, collection, {\n precision: this.#precision,\n bloomBits: this.#bloomBits,\n bloomHashes: this.#bloomHashes,\n now,\n })\n this.#accounts.set(k, acc)\n }\n return acc\n }\n\n #record(principal: string, vault: string, collection: string, id: string, emitter: CoverageEmitter): void {\n const now = this.#now()\n const acc = this.#account(principal, vault, collection, now)\n\n if (now - acc.windowStart >= this.#windowMs) {\n // Close the window: fold its served count into the running mean, clear\n // the novelty filter. ⛔ The HLL is NOT cleared — the coverage horizon\n // must exceed tenure, and a horizon that resets is the low-and-slow hole\n // the whole reframe (#1251 §3) exists to close.\n acc.servedMean = acc.windowsClosed === 0\n ? acc.servedInWindow\n : (acc.servedMean * acc.windowsClosed + acc.servedInWindow) / (acc.windowsClosed + 1)\n acc.windowsClosed++\n acc.bloom.clear()\n acc.servedInWindow = 0\n acc.novelInWindow = 0\n acc.windowStart = now\n }\n\n // Unconditionally, before the novelty test: a Bloom false positive must not\n // leak into the distinct count, which is what an alert is computed from.\n acc.hll.add(id)\n if (acc.bloom.addIfAbsent(id)) acc.novelInWindow++\n acc.served++\n acc.servedInWindow++\n\n const policy = this.#collections[collection]\n const corpusSize = policy?.corpusSize\n if (corpusSize === undefined || corpusSize <= 0) return\n const coverage = Math.min(1, acc.hll.count() / corpusSize)\n for (const t of policy?.alertAt ?? DEFAULT_ALERT_AT) {\n if (coverage < t || acc.fired.has(t)) continue\n acc.fired.add(t)\n const event: CoverageEvent = {\n principal,\n vault,\n collection,\n novel: acc.novelInWindow,\n served: acc.served,\n coverage,\n window: new Date(acc.windowStart).toISOString(),\n source: 'hub/coverage',\n }\n emitter.emit('coverage:threshold', event)\n }\n }\n\n /** Current accounting, for an operator surface. Estimates, never exact. */\n stats(): readonly CoverageStats[] {\n const out: CoverageStats[] = []\n for (const acc of this.#accounts.values()) {\n const corpusSize = this.#collections[acc.collection]?.corpusSize\n const distinct = acc.hll.count()\n out.push({\n principal: acc.principal,\n vault: acc.vault,\n collection: acc.collection,\n distinct,\n served: acc.served,\n novelInWindow: acc.novelInWindow,\n servedInWindow: acc.servedInWindow,\n burstiness: acc.servedMean > 0 ? acc.servedInWindow / acc.servedMean : 1,\n ...(corpusSize !== undefined && corpusSize > 0\n ? { coverage: Math.min(1, distinct / corpusSize) }\n : {}),\n window: new Date(acc.windowStart).toISOString(),\n })\n }\n return out\n }\n\n /**\n * Serializable state, for a deployment that wants coverage to survive a\n * restart — the horizon must exceed tenure, and a process does not.\n * ⛔ Sketches only. Never a record id: see {@link CoverageSnapshot}.\n */\n snapshot(): CoverageSnapshot {\n const entries: Array<CoverageSnapshot['entries'][number]> = []\n for (const acc of this.#accounts.values()) {\n entries.push({\n principal: acc.principal,\n vault: acc.vault,\n collection: acc.collection,\n hll: acc.hll.toJSON(),\n served: acc.served,\n windowStart: acc.windowStart,\n })\n }\n return { _noydb_coverage: 1, entries }\n }\n\n /**\n * Restore a snapshot. The novelty filter is deliberately NOT restored:\n * novelty is a within-window notion and the window did not survive.\n * Distinct-ever did, which is the quantity that must not reset.\n */\n restore(snapshot: CoverageSnapshot): void {\n for (const e of snapshot.entries) {\n const acc = this.#account(e.principal, e.vault, e.collection, e.windowStart)\n acc.hll = HyperLogLog.fromJSON(e.hll)\n acc.served = e.served\n acc.windowStart = e.windowStart\n }\n }\n}\n\nfunction declaresBulk(fieldMeta: CoverageFieldMeta | undefined): boolean {\n if (fieldMeta === undefined) return false\n for (const meta of Object.values(fieldMeta)) if (meta?.bulk === 'sensitive') return true\n return false\n}\n","/**\n * `withCoverage()` — the opt-in read-coverage sensor (#1363).\n *\n * ⛔⛔ **Against an insider holding the device and local keys, this prevents\n * nothing. It makes bulk extraction visible early, attributable and loud. It\n * is telemetry.** The real remediation is key custody — tiers and\n * per-collection DEKs — and this factory is not a substitute for one. Read the\n * sentence again before wiring it into anything that describes itself as a\n * control.\n *\n * @module\n */\n\nimport { CoverageRegistry } from './accounting.js'\nimport type { WithCoverageOptions } from './accounting.js'\n\n/**\n * Enable coverage accounting for every collection that declares a\n * `bulk: 'sensitive'` field (or that is named in `opts.collections`).\n *\n * ```ts\n * const coverage = withCoverage({ collections: { clients: { corpusSize: 1200, alertAt: [0.6, 0.9] } } })\n * const db = await createNoydb({ user: 'alice', secret, coverageStrategy: coverage })\n * db.on('coverage:threshold', (e) => notifyOwner(e)) // a SIGNAL, never a refusal\n * ```\n *\n * The returned registry is the strategy AND the read surface: `stats()` for a\n * live view, `snapshot()`/`restore()` to carry the coverage horizon across a\n * restart. Nothing it returns can name a record that was read.\n */\nexport function withCoverage(opts: WithCoverageOptions = {}): CoverageRegistry {\n return new CoverageRegistry(opts)\n}\n"],"mappings":"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","names":[]}
@@ -2,21 +2,20 @@ import {
2
2
  CustodyApi,
3
3
  NO_CUSTODY,
4
4
  withCustody
5
- } from "../chunk-UHHPLO3I.js";
6
- import "../chunk-3V4KWFX7.js";
7
- import "../chunk-XKWGNJ26.js";
8
- import "../chunk-JMGDHKQF.js";
9
- import "../chunk-4ZS56W5S.js";
10
- import "../chunk-SZJ3DLZA.js";
11
- import "../chunk-BRLKZUBT.js";
12
- import "../chunk-BTDR2PXY.js";
13
- import "../chunk-CHQCZZWC.js";
14
- import "../chunk-LP7BEXCT.js";
15
- import "../chunk-HPVZCW43.js";
16
- import "../chunk-7MG7SJT7.js";
5
+ } from "../chunk-V3RWOOSO.js";
6
+ import "../chunk-XSPFDUDG.js";
7
+ import "../chunk-LIOVX5TJ.js";
8
+ import "../chunk-FLPCETP6.js";
9
+ import "../chunk-EZGV6F47.js";
10
+ import "../chunk-OIEO4WDL.js";
11
+ import "../chunk-Q2XRFWOI.js";
12
+ import "../chunk-NH2UOV3B.js";
13
+ import "../chunk-42ALPZ2B.js";
14
+ import "../chunk-QMWY2FDS.js";
15
+ import "../chunk-SV2PM2OY.js";
17
16
  import {
18
17
  CustodyNotEnabledError
19
- } from "../chunk-7O3Y4PPD.js";
18
+ } from "../chunk-37EPTBBR.js";
20
19
  export {
21
20
  CustodyApi,
22
21
  CustodyNotEnabledError,
@@ -1,10 +1,18 @@
1
1
  import {
2
2
  liveBaseIdSet
3
- } from "./chunk-GYGLAVCX.js";
3
+ } from "./chunk-2MG3SW7Q.js";
4
+ import "./chunk-EZGV6F47.js";
5
+ import "./chunk-OIEO4WDL.js";
6
+ import "./chunk-Q2XRFWOI.js";
7
+ import "./chunk-NH2UOV3B.js";
8
+ import "./chunk-42ALPZ2B.js";
9
+ import "./chunk-QMWY2FDS.js";
10
+ import "./chunk-SV2PM2OY.js";
11
+ import "./chunk-37EPTBBR.js";
4
12
 
5
13
  // src/with-shape/satellites/dead-filter.ts
6
14
  async function liveBaseIdSetsForBundle(store, vaultName, collectionNames, getDEK) {
7
- const { loadPersistedSchema } = await import("./storage-RW4QBS23.js");
15
+ const { loadPersistedSchema } = await import("./storage-BYN5LO6Z.js");
8
16
  const out = /* @__PURE__ */ new Map();
9
17
  for (const name of collectionNames) {
10
18
  if (name.startsWith("_")) continue;
@@ -24,4 +32,4 @@ async function liveBaseIdSetsForBundle(store, vaultName, collectionNames, getDEK
24
32
  export {
25
33
  liveBaseIdSetsForBundle
26
34
  };
27
- //# sourceMappingURL=dead-filter-PKQDLOT4.js.map
35
+ //# sourceMappingURL=dead-filter-4F3LWYKH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/with-shape/satellites/dead-filter.ts"],"sourcesContent":["import type { NoydbStore } from '../../kernel/types.js'\nimport type { EnclaveKey } from '../../capsule/index.js'\nimport { liveBaseIdSet } from './existence.js'\n\n/**\n * Build a live-base id set for every satellite collection detectable from\n * its persisted `_schemas/<name>` pairing marker (#591 Task 10).\n *\n * The bundle-export path (`with-pod/bundle.ts`) has no reachable\n * `SatelliteRegistry` — that registry is private to `Vault` and adding an\n * accessor would grow a kernel file past its line-ceiling ratchet. The\n * marker persisted by `ensureSatelliteMarker` (`_schemas/<satellite>`,\n * decrypted with the satellite collection's own DEK — see\n * `with-shape/persisted-schemas/storage.ts`) is the fallback pairing-info\n * source that's always reachable from just a raw store + a per-collection\n * DEK accessor, so export uses that instead of the in-memory registry.\n *\n * Returns a `Map` from satellite collection name to its base's live id set\n * (existence.ts rule 1: absent or tombstoned base ⇒ not live). Only\n * satellite collections are present as keys — callers should treat a\n * missing key as \"not a satellite, don't filter.\"\n */\nexport async function liveBaseIdSetsForBundle(\n store: NoydbStore,\n vaultName: string,\n collectionNames: readonly string[],\n getDEK: (collectionName: string) => Promise<EnclaveKey>,\n): Promise<Map<string, Set<string>>> {\n const { loadPersistedSchema } = await import('../persisted-schemas/storage.js')\n const out = new Map<string, Set<string>>()\n for (const name of collectionNames) {\n if (name.startsWith('_')) continue\n // SILENT-DEGRADE surface (deliberate asymmetry): on ANY marker-read\n // failure the collection is treated as non-satellite and exported\n // UNFILTERED. That covers, precisely:\n // (a) `getDEK(name)` throwing for any reason (caught below);\n // (b) the persisted `_schemas/<name>` record failing to decrypt or\n // parse — corruption, wrong DEK, transient store error —\n // `loadPersistedSchema` catches internally and returns\n // `undefined` (storage.ts), which reads here as \"no marker\";\n // (c) the marker not yet persisted — `declareSatellite`'s\n // `postRegister` is fire-and-forget, so an export racing a\n // fresh declaration can miss it.\n // Leak-on-error is chosen over exclude-on-error because this is a\n // BACKUP path: exporting stale dead-satellite ciphertext is\n // recoverable; silently dropping live records from a backup is the\n // strictly worse failure. Pinned by the \"leak-on-error posture\" tests\n // in satellites-bundle-filter.test.ts.\n let dek: EnclaveKey\n try {\n dek = await getDEK(name)\n } catch {\n continue // (a) no DEK reachable — can't read the marker, export unfiltered\n }\n const persisted = await loadPersistedSchema(store, vaultName, name, dek)\n const marker = persisted?.satellite\n if (!marker) continue // (b)/(c) — undecryptable/absent/markerless schema record, export unfiltered\n out.set(name, await liveBaseIdSet(store, vaultName, marker.base))\n }\n return out\n}\n"],"mappings":";;;;;;;;;;;;;AAsBA,eAAsB,wBACpB,OACA,WACA,iBACA,QACmC;AACnC,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,uBAAiC;AAC9E,QAAM,MAAM,oBAAI,IAAyB;AACzC,aAAW,QAAQ,iBAAiB;AAClC,QAAI,KAAK,WAAW,GAAG,EAAG;AAiB1B,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,OAAO,IAAI;AAAA,IACzB,QAAQ;AACN;AAAA,IACF;AACA,UAAM,YAAY,MAAM,oBAAoB,OAAO,WAAW,MAAM,GAAG;AACvE,UAAM,SAAS,WAAW;AAC1B,QAAI,CAAC,OAAQ;AACb,QAAI,IAAI,MAAM,MAAM,cAAc,OAAO,WAAW,OAAO,IAAI,CAAC;AAAA,EAClE;AACA,SAAO;AACT;","names":[]}
@@ -1,11 +1,20 @@
1
+ import {
2
+ hasSealedBody
3
+ } from "../chunk-EZGV6F47.js";
4
+ import "../chunk-OIEO4WDL.js";
5
+ import "../chunk-Q2XRFWOI.js";
6
+ import "../chunk-NH2UOV3B.js";
7
+ import "../chunk-42ALPZ2B.js";
8
+ import "../chunk-QMWY2FDS.js";
9
+ import "../chunk-SV2PM2OY.js";
1
10
  import {
2
11
  DebugPlaintextError,
3
12
  DebugReservedFieldError
4
- } from "../chunk-7O3Y4PPD.js";
13
+ } from "../chunk-37EPTBBR.js";
5
14
 
6
15
  // src/kernel/debug.ts
7
16
  function readPlaintextRecord(envelope) {
8
- if (envelope._iv !== "") {
17
+ if (hasSealedBody(envelope)) {
9
18
  throw new Error(
10
19
  "readPlaintextRecord: envelope is encrypted (non-empty _iv) \u2014 decrypt via the vault, not this helper"
11
20
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kernel/debug.ts"],"sourcesContent":["/**\n * Helpers for reading records out of a *plaintext* store (`encrypt: false`)\n * with native tooling — the programmatic core of a `noydb cat`-style unwrap.\n * See the plaintext/debug-store-mode design.\n */\nimport type { EncryptedEnvelope } from './types.js'\n\n/**\n * The option's two failure modes, re-exported here so a consumer can `catch`\n * them by identity (#914). Both are thrown from the kernel — `createNoydb`\n * raises `DebugPlaintextError` when `debugPlaintext` is combined with\n * encryption, and the record codec raises `DebugReservedFieldError` for a\n * field colliding with the `_`-prefixed metadata. This entry is the only one\n * that publishes them.\n */\nexport { DebugPlaintextError, DebugReservedFieldError } from './errors.js'\n\n/** Re-exported so `readPlaintextRecord`'s parameter is nameable from this entry. */\nexport type { EncryptedEnvelope } from './types.js'\n\n/**\n * Extract the record from a plaintext stored envelope, handling both layouts:\n *\n * - **classic plaintext** (`encrypt: false`): the record is JSON in `_data`.\n * - **debugPlaintext**: the record's fields are inlined beside the\n * `_`-prefixed metadata (marked by `_debug`).\n *\n * Returns `null` for an empty/absent body. Throws if handed an **encrypted**\n * envelope (non-empty `_iv`) — there is no key here; decrypt through the vault\n * instead. Intended for record envelopes, not blob chunks.\n *\n * @example\n * ```ts\n * // node script over a to-file store, no vault needed:\n * const env = JSON.parse(readFileSync('data/acme/invoices/inv-1.json', 'utf8'))\n * console.log(readPlaintextRecord(env)) // → { id: 'inv-1', total: '120.00', … }\n * ```\n */\nexport function readPlaintextRecord<T = Record<string, unknown>>(\n envelope: EncryptedEnvelope,\n): T | null {\n if (envelope._iv !== '') {\n throw new Error(\n 'readPlaintextRecord: envelope is encrypted (non-empty _iv) — decrypt via the vault, not this helper',\n )\n }\n if (envelope._debug !== undefined) {\n const record: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(envelope)) {\n if (!key.startsWith('_')) record[key] = value\n }\n return record as T\n }\n if (!envelope._data) return null\n return JSON.parse(envelope._data) as T\n}\n"],"mappings":";;;;;;AAsCO,SAAS,oBACd,UACU;AACV,MAAI,SAAS,QAAQ,IAAI;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,WAAW,QAAW;AACjC,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,UAAI,CAAC,IAAI,WAAW,GAAG,EAAG,QAAO,GAAG,IAAI;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,MAAO,QAAO;AAC5B,SAAO,KAAK,MAAM,SAAS,KAAK;AAClC;","names":[]}
1
+ {"version":3,"sources":["../../src/kernel/debug.ts"],"sourcesContent":["/**\n * Helpers for reading records out of a *plaintext* store (`encrypt: false`)\n * with native tooling — the programmatic core of a `noydb cat`-style unwrap.\n * See the plaintext/debug-store-mode design.\n */\nimport type { EncryptedEnvelope } from './types.js'\nimport { hasSealedBody } from '../capsule/index.js'\n\n/**\n * The option's two failure modes, re-exported here so a consumer can `catch`\n * them by identity (#914). Both are thrown from the kernel — `createNoydb`\n * raises `DebugPlaintextError` when `debugPlaintext` is combined with\n * encryption, and the record codec raises `DebugReservedFieldError` for a\n * field colliding with the `_`-prefixed metadata. This entry is the only one\n * that publishes them.\n */\nexport { DebugPlaintextError, DebugReservedFieldError } from './errors.js'\n\n/** Re-exported so `readPlaintextRecord`'s parameter is nameable from this entry. */\nexport type { EncryptedEnvelope } from './types.js'\n\n/**\n * Extract the record from a plaintext stored envelope, handling both layouts:\n *\n * - **classic plaintext** (`encrypt: false`): the record is JSON in `_data`.\n * - **debugPlaintext**: the record's fields are inlined beside the\n * `_`-prefixed metadata (marked by `_debug`).\n *\n * Returns `null` for an empty/absent body. Throws if handed an **encrypted**\n * envelope (non-empty `_iv`) — there is no key here; decrypt through the vault\n * instead. Intended for record envelopes, not blob chunks.\n *\n * @example\n * ```ts\n * // node script over a to-file store, no vault needed:\n * const env = JSON.parse(readFileSync('data/acme/invoices/inv-1.json', 'utf8'))\n * console.log(readPlaintextRecord(env)) // → { id: 'inv-1', total: '120.00', … }\n * ```\n */\nexport function readPlaintextRecord<T = Record<string, unknown>>(\n envelope: EncryptedEnvelope,\n): T | null {\n // #15: `hasSealedBody` rather than `_iv !== ''` — see that helper's note.\n if (hasSealedBody(envelope)) {\n throw new Error(\n 'readPlaintextRecord: envelope is encrypted (non-empty _iv) — decrypt via the vault, not this helper',\n )\n }\n if (envelope._debug !== undefined) {\n const record: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(envelope)) {\n if (!key.startsWith('_')) record[key] = value\n }\n return record as T\n }\n if (!envelope._data) return null\n return JSON.parse(envelope._data) as T\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuCO,SAAS,oBACd,UACU;AAEV,MAAI,cAAc,QAAQ,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,WAAW,QAAW;AACjC,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,UAAI,CAAC,IAAI,WAAW,GAAG,EAAG,QAAO,GAAG,IAAI;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,MAAO,QAAO;AAC5B,SAAO,KAAK,MAAM,SAAS,KAAK;AAClC;","names":[]}
@@ -1,30 +1,27 @@
1
- import "./chunk-UGTBXF5U.js";
1
+ import "./chunk-7XMHMVTS.js";
2
2
  import {
3
3
  generateULID
4
4
  } from "./chunk-4AOERLTV.js";
5
5
  import {
6
6
  dekKey
7
- } from "./chunk-JMGDHKQF.js";
7
+ } from "./chunk-FLPCETP6.js";
8
8
  import {
9
9
  buildRecordAad,
10
- openEnvelopeJson
11
- } from "./chunk-4ZS56W5S.js";
12
- import {
13
- buildRecordEnvelope
14
- } from "./chunk-SZJ3DLZA.js";
15
- import "./chunk-BRLKZUBT.js";
16
- import "./chunk-BTDR2PXY.js";
17
- import "./chunk-CHQCZZWC.js";
18
- import "./chunk-LP7BEXCT.js";
19
- import {
10
+ buildRecordEnvelope,
20
11
  encrypt,
12
+ openEnvelopeJson,
21
13
  unwrapKey,
22
14
  wrapKey
23
- } from "./chunk-HPVZCW43.js";
24
- import "./chunk-7MG7SJT7.js";
15
+ } from "./chunk-EZGV6F47.js";
16
+ import "./chunk-OIEO4WDL.js";
17
+ import "./chunk-Q2XRFWOI.js";
18
+ import "./chunk-NH2UOV3B.js";
19
+ import "./chunk-42ALPZ2B.js";
20
+ import "./chunk-QMWY2FDS.js";
21
+ import "./chunk-SV2PM2OY.js";
25
22
  import {
26
23
  DelegationTargetMissingError
27
- } from "./chunk-7O3Y4PPD.js";
24
+ } from "./chunk-37EPTBBR.js";
28
25
 
29
26
  // src/with-party/team/delegation.ts
30
27
  var DELEGATIONS_COLLECTION = "_delegations";
@@ -102,4 +99,4 @@ export {
102
99
  loadActiveDelegations,
103
100
  revokeDelegation
104
101
  };
105
- //# sourceMappingURL=delegation-DS5NRILW.js.map
102
+ //# sourceMappingURL=delegation-NANZDG4N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/with-party/team/delegation.ts"],"sourcesContent":["/**\n * Time-boxed cross-tier delegation tokens.\n *\n * A higher-tier user can issue a delegation that grants another user\n * temporary access to records at a specified tier. The delegation is\n * persisted as an encrypted envelope in the reserved `_delegations`\n * collection. The target user's runtime scans this collection on every\n * open and, while `until` is still in the future, merges the\n * unwrapped tier DEKs into their in-memory DEK map.\n *\n * ## Token shape\n *\n * ```\n * {\n * id, // ULID, also the _delegations record id\n * toUser, // grantee user id\n * fromUser, // grantor user id (owner/admin/higher-tier principal)\n * tier, // tier being delegated\n * collection, // collection name OR null for \"every collection\"\n * record, // optional specific record id\n * until, // ISO timestamp — token expires at this instant\n * wrappedDek, // base64 AES-KW-wrapped tier DEK, wrapped under target KEK\n * createdAt, // ISO timestamp\n * }\n * ```\n *\n * The ciphertext is stored as a normal noy-db envelope — the\n * `_delegations` collection has its own DEK shared across all vault\n * users, so an operator can enumerate active delegations for audit\n * without being able to *use* them (the `wrappedDek` inside is still\n * keyed to the target user's KEK).\n *\n * ## Revocation\n *\n * Delete the `_delegations/<id>` envelope. The target user's runtime\n * reloads the delegation list at each open and at periodic intervals\n * (tracked by the caller — this module is pure logic).\n *\n * @module\n */\n\nimport type { NoydbStore } from '../../kernel/types.js'\nimport type { UnlockedKeyring } from './keyring.js'\nimport { buildRecordAad, buildRecordEnvelope, encrypt, openEnvelopeJson, wrapKey, unwrapKey, type EnclaveKey } from '../../capsule/index.js'\nimport { dekKey } from './tiers.js'\nimport { DelegationTargetMissingError } from '../../kernel/errors.js'\nimport { generateULID } from '../../with-pod/ulid.js'\n\nexport const DELEGATIONS_COLLECTION = '_delegations'\n\n/**\n * Durable payload of a delegation token. Encrypted under the vault's\n * `_delegations` DEK; the `wrappedDek` inside is additionally wrapped\n * under the target user's KEK.\n */\nexport interface DelegationToken {\n readonly id: string\n readonly toUser: string\n readonly fromUser: string\n readonly tier: number\n /** Collection name or `null` for all collections. */\n readonly collection: string | null\n /** Optional specific record id scope. */\n readonly record?: string\n readonly until: string\n readonly wrappedDek: string\n readonly createdAt: string\n}\n\nexport interface IssueDelegationOptions {\n readonly toUser: string\n readonly tier: number\n readonly collection?: string\n readonly record?: string\n readonly until: Date | string\n}\n\n/**\n * Build and persist a delegation token. The caller must hold a tier-N\n * DEK and must have already located the target user's keyring file\n * (so the `wrappedDek` can be re-wrapped against their KEK).\n */\nexport async function issueDelegation(\n store: NoydbStore,\n vault: string,\n grantor: UnlockedKeyring,\n targetKek: EnclaveKey | null,\n delegationsDek: EnclaveKey,\n opts: IssueDelegationOptions,\n): Promise<DelegationToken> {\n if (!targetKek) {\n throw new DelegationTargetMissingError(opts.toUser)\n }\n const tier = opts.tier\n const collectionName = opts.collection ?? null\n const dekLookupCollection = collectionName ?? ''\n // Tier DEK to delegate — fetched from the grantor's own keyring.\n const sourceDek = collectionName\n ? grantor.deks.get(dekKey(collectionName, tier))\n : undefined\n if (!sourceDek) {\n throw new DelegationTargetMissingError(\n `grantor cannot find tier ${tier} DEK for ${dekLookupCollection || '(any)'}`,\n )\n }\n const wrappedDek = await wrapKey(sourceDek, targetKek)\n\n const until = typeof opts.until === 'string' ? opts.until : opts.until.toISOString()\n const token: DelegationToken = {\n id: generateULID(),\n toUser: opts.toUser,\n fromUser: grantor.userId,\n tier,\n collection: collectionName,\n ...(opts.record && { record: opts.record }),\n until,\n wrappedDek,\n createdAt: new Date().toISOString(),\n }\n\n const plaintext = JSON.stringify(token)\n const identity = { collection: DELEGATIONS_COLLECTION, id: token.id, by: grantor.userId, version: 1 }\n const { iv, data } = await encrypt(plaintext, delegationsDek, buildRecordAad(identity))\n const envelope = buildRecordEnvelope(\n identity,\n { ts: token.createdAt, iv, data},\n )\n await store.put(vault, DELEGATIONS_COLLECTION, token.id, envelope)\n return token\n}\n\n/**\n * Enumerate every live (non-expired) delegation addressed to `toUser`\n * and merge the unwrapped tier DEKs into their keyring. Returns the\n * list of merged delegations so the caller can register per-access\n * audit context.\n */\nexport async function loadActiveDelegations(\n store: NoydbStore,\n vault: string,\n user: UnlockedKeyring,\n delegationsDek: EnclaveKey,\n now: Date = new Date(),\n): Promise<DelegationToken[]> {\n const ids = await store.list(vault, DELEGATIONS_COLLECTION)\n const merged: DelegationToken[] = []\n const nowIso = now.toISOString()\n for (const id of ids) {\n const env = await store.get(vault, DELEGATIONS_COLLECTION, id)\n if (!env) continue\n let token: DelegationToken\n try {\n const plaintext = await openEnvelopeJson({ collection: DELEGATIONS_COLLECTION, id }, env, delegationsDek)\n token = JSON.parse(plaintext) as DelegationToken\n } catch {\n continue\n }\n if (token.toUser !== user.userId) continue\n if (token.until <= nowIso) continue\n\n // A user without a KEK in memory (tier-3 PIN resume, wrap-DEKs\n // tier-2 unlock, session restore) cannot unwrap delegation tokens\n // — those were wrapped under the user's KEK at issue time. Skip\n // this token; the consumer reaches it again at tier-1 unlock.\n if (!user.kek) continue\n let dek: EnclaveKey\n try {\n dek = await unwrapKey(token.wrappedDek, user.kek)\n } catch {\n continue\n }\n const k = token.collection\n ? dekKey(token.collection, token.tier)\n : `__any#${token.tier}`\n user.deks.set(k, dek)\n merged.push(token)\n }\n return merged\n}\n\n/**\n * Revoke a delegation by id — the caller resolves the envelope and\n * issues a `delete`. Provided as a stable helper so the naming is\n * symmetric to `issueDelegation`.\n */\nexport async function revokeDelegation(\n store: NoydbStore,\n vault: string,\n id: string,\n): Promise<void> {\n await store.delete(vault, DELEGATIONS_COLLECTION, id)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAgDO,IAAM,yBAAyB;AAkCtC,eAAsB,gBACpB,OACA,OACA,SACA,WACA,gBACA,MAC0B;AAC1B,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,6BAA6B,KAAK,MAAM;AAAA,EACpD;AACA,QAAM,OAAO,KAAK;AAClB,QAAM,iBAAiB,KAAK,cAAc;AAC1C,QAAM,sBAAsB,kBAAkB;AAE9C,QAAM,YAAY,iBACd,QAAQ,KAAK,IAAI,OAAO,gBAAgB,IAAI,CAAC,IAC7C;AACJ,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR,4BAA4B,IAAI,YAAY,uBAAuB,OAAO;AAAA,IAC5E;AAAA,EACF;AACA,QAAM,aAAa,MAAM,QAAQ,WAAW,SAAS;AAErD,QAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK,MAAM,YAAY;AACnF,QAAM,QAAyB;AAAA,IAC7B,IAAI,aAAa;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,YAAY;AAAA,IACZ,GAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,OAAO;AAAA,IACzC;AAAA,IACA;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,QAAM,YAAY,KAAK,UAAU,KAAK;AACtC,QAAM,WAAW,EAAE,YAAY,wBAAwB,IAAI,MAAM,IAAI,IAAI,QAAQ,QAAQ,SAAS,EAAE;AACpG,QAAM,EAAE,IAAI,KAAK,IAAI,MAAM,QAAQ,WAAW,gBAAgB,eAAe,QAAQ,CAAC;AACtF,QAAM,WAAW;AAAA,IACf;AAAA,IACA,EAAE,IAAI,MAAM,WAAW,IAAI,KAAI;AAAA,EACjC;AACA,QAAM,MAAM,IAAI,OAAO,wBAAwB,MAAM,IAAI,QAAQ;AACjE,SAAO;AACT;AAQA,eAAsB,sBACpB,OACA,OACA,MACA,gBACA,MAAY,oBAAI,KAAK,GACO;AAC5B,QAAM,MAAM,MAAM,MAAM,KAAK,OAAO,sBAAsB;AAC1D,QAAM,SAA4B,CAAC;AACnC,QAAM,SAAS,IAAI,YAAY;AAC/B,aAAW,MAAM,KAAK;AACpB,UAAM,MAAM,MAAM,MAAM,IAAI,OAAO,wBAAwB,EAAE;AAC7D,QAAI,CAAC,IAAK;AACV,QAAI;AACJ,QAAI;AACF,YAAM,YAAY,MAAM,iBAAiB,EAAE,YAAY,wBAAwB,GAAG,GAAG,KAAK,cAAc;AACxG,cAAQ,KAAK,MAAM,SAAS;AAAA,IAC9B,QAAQ;AACN;AAAA,IACF;AACA,QAAI,MAAM,WAAW,KAAK,OAAQ;AAClC,QAAI,MAAM,SAAS,OAAQ;AAM3B,QAAI,CAAC,KAAK,IAAK;AACf,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,UAAU,MAAM,YAAY,KAAK,GAAG;AAAA,IAClD,QAAQ;AACN;AAAA,IACF;AACA,UAAM,IAAI,MAAM,aACZ,OAAO,MAAM,YAAY,MAAM,IAAI,IACnC,SAAS,MAAM,IAAI;AACvB,SAAK,KAAK,IAAI,GAAG,GAAG;AACpB,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO;AACT;AAOA,eAAsB,iBACpB,OACA,OACA,IACe;AACf,QAAM,MAAM,OAAO,OAAO,wBAAwB,EAAE;AACtD;","names":[]}
@@ -1,44 +1,46 @@
1
1
  import {
2
2
  DerivationRegistry
3
- } from "../chunk-F3W6YMDC.js";
3
+ } from "../chunk-U2FZNEWJ.js";
4
4
  import "../chunk-FFWI7UH7.js";
5
5
  import {
6
6
  DerivationExecutor
7
- } from "../chunk-TFR7DSOV.js";
7
+ } from "../chunk-H427H63K.js";
8
8
  import {
9
9
  withDerivation,
10
10
  withRollup
11
- } from "../chunk-BUE2D7PX.js";
12
- import "../chunk-CUQPWYRX.js";
11
+ } from "../chunk-SMV2HRDU.js";
12
+ import "../chunk-IUT3GWP3.js";
13
13
  import "../chunk-TFMM5DBB.js";
14
- import "../chunk-RTBJ5IOO.js";
15
- import "../chunk-5VCRVKOZ.js";
14
+ import "../chunk-M5B2W6YY.js";
15
+ import "../chunk-GUZET4SG.js";
16
16
  import "../chunk-VYYM3MEN.js";
17
- import "../chunk-ACAQ2DSG.js";
17
+ import "../chunk-747G6CT3.js";
18
18
  import "../chunk-Y2NBBT6K.js";
19
- import "../chunk-SGZAIJCV.js";
20
- import "../chunk-R7BX2NB3.js";
19
+ import "../chunk-3L2NBKDR.js";
20
+ import "../chunk-244QBK7Z.js";
21
+ import "../chunk-NYMLINRP.js";
21
22
  import "../chunk-V4PXLYWM.js";
22
- import "../chunk-MVMXZYXT.js";
23
- import "../chunk-Q2MPFCQ7.js";
24
- import "../chunk-TRGTKX5E.js";
25
- import "../chunk-UXVWEX5L.js";
26
- import "../chunk-QPQUVOZ2.js";
27
- import "../chunk-4ZS56W5S.js";
28
- import "../chunk-SZJ3DLZA.js";
29
- import "../chunk-BRLKZUBT.js";
30
- import "../chunk-BTDR2PXY.js";
31
- import "../chunk-CHQCZZWC.js";
32
- import "../chunk-LP7BEXCT.js";
33
- import "../chunk-HPVZCW43.js";
34
- import "../chunk-7MG7SJT7.js";
23
+ import "../chunk-3EWS67C7.js";
24
+ import "../chunk-XBKH4FOC.js";
25
+ import "../chunk-2GHDLTPE.js";
26
+ import "../chunk-23D6M6VM.js";
27
+ import "../chunk-OKSTSITU.js";
28
+ import "../chunk-SYNY3VB5.js";
29
+ import "../chunk-6QVKPHBF.js";
30
+ import "../chunk-EZGV6F47.js";
31
+ import "../chunk-OIEO4WDL.js";
32
+ import "../chunk-Q2XRFWOI.js";
33
+ import "../chunk-NH2UOV3B.js";
34
+ import "../chunk-42ALPZ2B.js";
35
+ import "../chunk-QMWY2FDS.js";
36
+ import "../chunk-SV2PM2OY.js";
35
37
  import {
36
38
  DerivationCapExceededError,
37
39
  DerivationCycleError,
38
40
  DerivationDepthError,
39
41
  DerivationOutputShapeError,
40
42
  DerivationOutputUnknownError
41
- } from "../chunk-7O3Y4PPD.js";
43
+ } from "../chunk-37EPTBBR.js";
42
44
  export {
43
45
  DerivationCapExceededError,
44
46
  DerivationCycleError,
@@ -0,0 +1,20 @@
1
+ import {
2
+ derivePersistedSchema,
3
+ isZod4Schema,
4
+ isZodSchema
5
+ } from "./chunk-747G6CT3.js";
6
+ import "./chunk-Y2NBBT6K.js";
7
+ import "./chunk-EZGV6F47.js";
8
+ import "./chunk-OIEO4WDL.js";
9
+ import "./chunk-Q2XRFWOI.js";
10
+ import "./chunk-NH2UOV3B.js";
11
+ import "./chunk-42ALPZ2B.js";
12
+ import "./chunk-QMWY2FDS.js";
13
+ import "./chunk-SV2PM2OY.js";
14
+ import "./chunk-37EPTBBR.js";
15
+ export {
16
+ derivePersistedSchema,
17
+ isZod4Schema,
18
+ isZodSchema
19
+ };
20
+ //# sourceMappingURL=derive-XLOJVXPU.js.map