@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
@@ -1,14 +1,28 @@
1
- import {
2
- VDIG_ITERATIONS,
3
- normalizeForVerify,
4
- pbkdf2VerifyDigest
5
- } from "./chunk-LP7BEXCT.js";
6
1
  import {
7
2
  bufferToBase64
8
- } from "./chunk-HPVZCW43.js";
3
+ } from "./chunk-QMWY2FDS.js";
9
4
 
10
- // src/kernel/enclave/classify/bidx.ts
5
+ // src/capsule/enclave-aes/classify/digest.ts
11
6
  var subtle = globalThis.crypto.subtle;
7
+ var VDIG_ITERATIONS = 6e5;
8
+ async function pbkdf2VerifyDigest(value, salt, iterations) {
9
+ const keyMaterial = await subtle.importKey(
10
+ "raw",
11
+ new TextEncoder().encode(value),
12
+ "PBKDF2",
13
+ false,
14
+ ["deriveBits"]
15
+ );
16
+ const bits = await subtle.deriveBits(
17
+ { name: "PBKDF2", salt, iterations, hash: "SHA-256" },
18
+ keyMaterial,
19
+ 256
20
+ );
21
+ return new Uint8Array(bits);
22
+ }
23
+
24
+ // src/capsule/enclave-aes/classify/bidx.ts
25
+ var subtle2 = globalThis.crypto.subtle;
12
26
  var CLASSIFY_INDEX_KEY_DOMAIN = "noydb-classify-index-v1";
13
27
  var CLASSIFY_INDEX_SALT_DOMAIN = "noydb-classify-index-salt-v1";
14
28
  var COST_BYTE_V1 = 1;
@@ -18,19 +32,19 @@ function iterationsForCostByte(b) {
18
32
  return null;
19
33
  }
20
34
  async function deriveClassifyIndexKey(dek, collection, field) {
21
- const rawDek = await subtle.exportKey("raw", dek);
22
- const hkdfKey = await subtle.importKey("raw", rawDek, "HKDF", false, ["deriveBits"]);
35
+ const rawDek = await subtle2.exportKey("raw", dek);
36
+ const hkdfKey = await subtle2.importKey("raw", rawDek, "HKDF", false, ["deriveBits"]);
23
37
  const salt = new TextEncoder().encode(CLASSIFY_INDEX_KEY_DOMAIN);
24
38
  const info = new TextEncoder().encode(JSON.stringify([CLASSIFY_INDEX_KEY_DOMAIN, collection, field]));
25
- const bits = await subtle.deriveBits({ name: "HKDF", hash: "SHA-256", salt, info }, hkdfKey, 256);
26
- return subtle.importKey("raw", bits, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
39
+ const bits = await subtle2.deriveBits({ name: "HKDF", hash: "SHA-256", salt, info }, hkdfKey, 256);
40
+ return subtle2.importKey("raw", bits, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
27
41
  }
28
42
  async function deriveClassifyIndexSalt(dek, collection, field) {
29
- const rawDek = await subtle.exportKey("raw", dek);
30
- const hkdfKey = await subtle.importKey("raw", rawDek, "HKDF", false, ["deriveBits"]);
43
+ const rawDek = await subtle2.exportKey("raw", dek);
44
+ const hkdfKey = await subtle2.importKey("raw", rawDek, "HKDF", false, ["deriveBits"]);
31
45
  const salt = new TextEncoder().encode(CLASSIFY_INDEX_SALT_DOMAIN);
32
46
  const info = new TextEncoder().encode(JSON.stringify([CLASSIFY_INDEX_SALT_DOMAIN, collection, field]));
33
- const bits = await subtle.deriveBits({ name: "HKDF", hash: "SHA-256", salt, info }, hkdfKey, 256);
47
+ const bits = await subtle2.deriveBits({ name: "HKDF", hash: "SHA-256", salt, info }, hkdfKey, 256);
34
48
  return new Uint8Array(bits);
35
49
  }
36
50
  async function mintAt(normalized, dek, collection, field, costByte) {
@@ -41,7 +55,7 @@ async function mintAt(normalized, dek, collection, field, costByte) {
41
55
  const saltCf = await deriveClassifyIndexSalt(dek, collection, field);
42
56
  const inner = await pbkdf2VerifyDigest(normalized, saltCf, iterations);
43
57
  const kIdx = await deriveClassifyIndexKey(dek, collection, field);
44
- const mac = await subtle.sign("HMAC", kIdx, inner);
58
+ const mac = await subtle2.sign("HMAC", kIdx, inner);
45
59
  const tag = new Uint8Array(1 + 32);
46
60
  tag[0] = costByte;
47
61
  tag.set(new Uint8Array(mac), 1);
@@ -51,19 +65,14 @@ async function mintBidxTag(normalized, dek, collection, field) {
51
65
  return mintAt(normalized, dek, collection, field, CURRENT_COST_BYTE);
52
66
  }
53
67
 
54
- // src/kernel/enclave/classify/find.ts
55
- async function computeBidxTarget(candidate, normalize, dek, collection, field, costByte) {
56
- const resolvedCostByte = costByte ?? CURRENT_COST_BYTE;
57
- const iters = iterationsForCostByte(resolvedCostByte);
58
- if (iters === null) return null;
59
- const normalized = normalizeForVerify(normalize, candidate);
60
- return mintAt(normalized, dek, collection, field, resolvedCostByte);
61
- }
62
-
63
68
  export {
69
+ VDIG_ITERATIONS,
70
+ pbkdf2VerifyDigest,
71
+ CURRENT_COST_BYTE,
72
+ iterationsForCostByte,
64
73
  deriveClassifyIndexKey,
65
74
  deriveClassifyIndexSalt,
66
- mintBidxTag,
67
- computeBidxTarget
75
+ mintAt,
76
+ mintBidxTag
68
77
  };
69
- //# sourceMappingURL=chunk-CHQCZZWC.js.map
78
+ //# sourceMappingURL=chunk-EZOAKKTB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/capsule/enclave-aes/classify/digest.ts","../src/capsule/enclave-aes/classify/bidx.ts"],"sourcesContent":["/**\n * Verify-digest primitive for classified `digest-only` fields (stage 2).\n * PBKDF2-SHA256 → fixed 32-byte digest. The digest NEVER leaves the enclave\n * in recoverable form — it is sealed into the `_vdig` envelope slot (vdig.ts)\n * or compared in-enclave (verify.ts). @module\n */\nconst subtle = globalThis.crypto.subtle\n\n/** Family KDF constant — matches crypto.ts PBKDF2_ITERATIONS (600K). */\nexport const VDIG_ITERATIONS = 600_000\n\n/**\n * Digest a (pre-normalized) candidate/value to exactly 32 bytes.\n * PBKDF2-SHA256 with a per-record per-write random salt (§2): verify\n * digests are non-equatable by construction.\n */\nexport async function pbkdf2VerifyDigest(\n value: string,\n salt: Uint8Array,\n iterations: number,\n): Promise<Uint8Array> {\n const keyMaterial = await subtle.importKey(\n 'raw',\n new TextEncoder().encode(value),\n 'PBKDF2',\n false,\n ['deriveBits'],\n )\n const bits = await subtle.deriveBits(\n { name: 'PBKDF2', salt: salt as BufferSource, iterations, hash: 'SHA-256' },\n keyMaterial,\n 256,\n )\n return new Uint8Array(bits)\n}\n","/**\n * Blind-index slow-tag primitive for classified `equatable` fields (stage 2).\n *\n * `mintBidxTag` mints a deterministic, key-and-cost-gated tag —\n * `COST_BYTE ‖ HMAC-SHA256(K_idx, PBKDF2-SHA256(normalized, salt_cf))` — that\n * lets `find.ts` do blind equality lookup over an otherwise-opaque field\n * without ever storing the plaintext or a fast dictionary-crackable digest.\n *\n * Rationale (M-2/I3, spec §4/Crypto #1):\n * - The outer HMAC is **keyed** by `K_idx`, a DEK-derived key never seen by\n * the store. A key-less adversary (store access only) cannot mint a\n * candidate tag to test against the index at all — the HMAC blocks the\n * classic \"key-less dictionary attack\" a plain digest would invite.\n * - The inner `pbkdf2VerifyDigest` (stage-2, `digest.ts`) reuses the\n * existing 600K-iteration cost floor, so even a **DEK holder** who can\n * compute `K_idx` still pays the PBKDF2 cost per guess — minting is not\n * free just because you crossed the door.\n * - Neither control is the real security boundary: the DOOR (who is ever\n * handed the DEK to begin with) is. These two costs only shape the\n * economics for whoever is already inside; they do not substitute for\n * access control.\n *\n * `K_idx` and `salt_cf` are separate HKDF derivations off the same DEK\n * (L-1, #554 precedent: dedicated keys from day one, no shared/legacy form) —\n * sign-key hygiene, not `HMAC(K_idx, const)`. Both derivations are\n * domain-separated per `(collection, field)` so a tag cannot be replayed\n * across fields or collections (join-attack separation).\n *\n * `CURRENT_COST_BYTE` is a 1-byte discriminator prefixed onto every tag so a\n * future iteration-tier bump can mint new tags while old ones still parse:\n * an unknown discriminator is a cheap, immediate non-match instead of a\n * PBKDF2 run at the wrong iteration count.\n *\n * @module\n */\nimport type { EnclaveKey } from '../crypto.js'\nimport { bufferToBase64 } from '../../plumbing/digest.js'\nimport { pbkdf2VerifyDigest, VDIG_ITERATIONS } from './digest.js'\n\nconst subtle = globalThis.crypto.subtle\n\n/** HKDF salt domain for the `K_idx` (blind-index HMAC key) derivation. */\nexport const CLASSIFY_INDEX_KEY_DOMAIN = 'noydb-classify-index-v1'\n\n/** HKDF salt domain for the `salt_cf` (per collection/field PBKDF2 salt) derivation. */\nexport const CLASSIFY_INDEX_SALT_DOMAIN = 'noydb-classify-index-salt-v1'\n\n/** Cost-byte discriminator: version 1, iteration-tier 600K. */\nexport const COST_BYTE_V1 = 0x01\n/** The cost byte new tags are minted at. */\nexport const CURRENT_COST_BYTE = COST_BYTE_V1\n\n/**\n * Map a tag's cost-byte discriminator to its PBKDF2 iteration count.\n * An unrecognized discriminator returns `null` — a mismatched/legacy byte\n * is a cheap non-match, never a PBKDF2 run at the wrong tier.\n */\nexport function iterationsForCostByte(b: number): number | null {\n if (b === COST_BYTE_V1) return VDIG_ITERATIONS\n return null\n}\n\n/**\n * Derive the collection+field's dedicated blind-index HMAC key `K_idx` from\n * the DEK via HKDF-SHA256. Non-extractable, `sign`-only — it never leaves\n * this module in usable form.\n */\nexport async function deriveClassifyIndexKey(\n dek: EnclaveKey,\n collection: string,\n field: string,\n): Promise<EnclaveKey> {\n const rawDek = await subtle.exportKey('raw', dek)\n const hkdfKey = await subtle.importKey('raw', rawDek, 'HKDF', false, ['deriveBits'])\n const salt = new TextEncoder().encode(CLASSIFY_INDEX_KEY_DOMAIN)\n const info = new TextEncoder().encode(JSON.stringify([CLASSIFY_INDEX_KEY_DOMAIN, collection, field]))\n const bits = await subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt, info }, hkdfKey, 256)\n return subtle.importKey('raw', bits, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])\n}\n\n/**\n * Derive the collection+field's dedicated PBKDF2 salt `salt_cf` from the DEK\n * via a SEPARATE HKDF-deriveBits (distinct from {@link deriveClassifyIndexKey}\n * — sign-key hygiene, not `HMAC(K_idx, const)`). 32 raw bytes.\n */\nexport async function deriveClassifyIndexSalt(\n dek: EnclaveKey,\n collection: string,\n field: string,\n): Promise<Uint8Array> {\n const rawDek = await subtle.exportKey('raw', dek)\n const hkdfKey = await subtle.importKey('raw', rawDek, 'HKDF', false, ['deriveBits'])\n const salt = new TextEncoder().encode(CLASSIFY_INDEX_SALT_DOMAIN)\n const info = new TextEncoder().encode(JSON.stringify([CLASSIFY_INDEX_SALT_DOMAIN, collection, field]))\n const bits = await subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt, info }, hkdfKey, 256)\n return new Uint8Array(bits)\n}\n\n/**\n * Mint a blind-index tag at a given cost byte:\n * `tag = base64(COST_BYTE ‖ HMAC(K_idx, PBKDF2(normalized, salt_cf, iterations-for(COST_BYTE))))`.\n * Factored out of {@link mintBidxTag} so `find.ts`'s `computeBidxTarget` can\n * reuse the same crypto at a caller-chosen cost byte (e.g. to evaluate a\n * legacy tier) without duplicating the derivation/digest/MAC pipeline.\n */\nexport async function mintAt(\n normalized: string,\n dek: EnclaveKey,\n collection: string,\n field: string,\n costByte: number,\n): Promise<string> {\n const iterations = iterationsForCostByte(costByte)\n if (iterations == null) {\n throw new Error(`bidx: unknown cost byte 0x${costByte.toString(16)}`)\n }\n const saltCf = await deriveClassifyIndexSalt(dek, collection, field)\n const inner = await pbkdf2VerifyDigest(normalized, saltCf, iterations)\n const kIdx = await deriveClassifyIndexKey(dek, collection, field)\n const mac = await subtle.sign('HMAC', kIdx, inner as BufferSource)\n const tag = new Uint8Array(1 + 32)\n tag[0] = costByte\n tag.set(new Uint8Array(mac), 1)\n return bufferToBase64(tag)\n}\n\n/**\n * Mint a blind-index tag for an already-normalized value at\n * {@link CURRENT_COST_BYTE}. The caller normalizes once via\n * `normalizeForVerify` (the shared pipeline with `mintVdigSlot`) —\n * `mintBidxTag` never re-normalizes.\n */\nexport async function mintBidxTag(\n normalized: string,\n dek: EnclaveKey,\n collection: string,\n field: string,\n): Promise<string> {\n return mintAt(normalized, dek, collection, field, CURRENT_COST_BYTE)\n}\n"],"mappings":";;;;;AAMA,IAAM,SAAS,WAAW,OAAO;AAG1B,IAAM,kBAAkB;AAO/B,eAAsB,mBACpB,OACA,MACA,YACqB;AACrB,QAAM,cAAc,MAAM,OAAO;AAAA,IAC/B;AAAA,IACA,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AACA,QAAM,OAAO,MAAM,OAAO;AAAA,IACxB,EAAE,MAAM,UAAU,MAA4B,YAAY,MAAM,UAAU;AAAA,IAC1E;AAAA,IACA;AAAA,EACF;AACA,SAAO,IAAI,WAAW,IAAI;AAC5B;;;ACKA,IAAMA,UAAS,WAAW,OAAO;AAG1B,IAAM,4BAA4B;AAGlC,IAAM,6BAA6B;AAGnC,IAAM,eAAe;AAErB,IAAM,oBAAoB;AAO1B,SAAS,sBAAsB,GAA0B;AAC9D,MAAI,MAAM,aAAc,QAAO;AAC/B,SAAO;AACT;AAOA,eAAsB,uBACpB,KACA,YACA,OACqB;AACrB,QAAM,SAAS,MAAMA,QAAO,UAAU,OAAO,GAAG;AAChD,QAAM,UAAU,MAAMA,QAAO,UAAU,OAAO,QAAQ,QAAQ,OAAO,CAAC,YAAY,CAAC;AACnF,QAAM,OAAO,IAAI,YAAY,EAAE,OAAO,yBAAyB;AAC/D,QAAM,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,CAAC,2BAA2B,YAAY,KAAK,CAAC,CAAC;AACpG,QAAM,OAAO,MAAMA,QAAO,WAAW,EAAE,MAAM,QAAQ,MAAM,WAAW,MAAM,KAAK,GAAG,SAAS,GAAG;AAChG,SAAOA,QAAO,UAAU,OAAO,MAAM,EAAE,MAAM,QAAQ,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;AACzF;AAOA,eAAsB,wBACpB,KACA,YACA,OACqB;AACrB,QAAM,SAAS,MAAMA,QAAO,UAAU,OAAO,GAAG;AAChD,QAAM,UAAU,MAAMA,QAAO,UAAU,OAAO,QAAQ,QAAQ,OAAO,CAAC,YAAY,CAAC;AACnF,QAAM,OAAO,IAAI,YAAY,EAAE,OAAO,0BAA0B;AAChE,QAAM,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,CAAC,4BAA4B,YAAY,KAAK,CAAC,CAAC;AACrG,QAAM,OAAO,MAAMA,QAAO,WAAW,EAAE,MAAM,QAAQ,MAAM,WAAW,MAAM,KAAK,GAAG,SAAS,GAAG;AAChG,SAAO,IAAI,WAAW,IAAI;AAC5B;AASA,eAAsB,OACpB,YACA,KACA,YACA,OACA,UACiB;AACjB,QAAM,aAAa,sBAAsB,QAAQ;AACjD,MAAI,cAAc,MAAM;AACtB,UAAM,IAAI,MAAM,6BAA6B,SAAS,SAAS,EAAE,CAAC,EAAE;AAAA,EACtE;AACA,QAAM,SAAS,MAAM,wBAAwB,KAAK,YAAY,KAAK;AACnE,QAAM,QAAQ,MAAM,mBAAmB,YAAY,QAAQ,UAAU;AACrE,QAAM,OAAO,MAAM,uBAAuB,KAAK,YAAY,KAAK;AAChE,QAAM,MAAM,MAAMA,QAAO,KAAK,QAAQ,MAAM,KAAqB;AACjE,QAAM,MAAM,IAAI,WAAW,IAAI,EAAE;AACjC,MAAI,CAAC,IAAI;AACT,MAAI,IAAI,IAAI,WAAW,GAAG,GAAG,CAAC;AAC9B,SAAO,eAAe,GAAG;AAC3B;AAQA,eAAsB,YACpB,YACA,KACA,YACA,OACiB;AACjB,SAAO,OAAO,YAAY,KAAK,YAAY,OAAO,iBAAiB;AACrE;","names":["subtle"]}
@@ -0,0 +1,13 @@
1
+ // src/kernel/query/internal/core.ts
2
+ function installMethods(target, mixin) {
3
+ for (const name of Object.getOwnPropertyNames(mixin.prototype)) {
4
+ if (name === "constructor") continue;
5
+ const desc = Object.getOwnPropertyDescriptor(mixin.prototype, name);
6
+ if (desc) Object.defineProperty(target, name, desc);
7
+ }
8
+ }
9
+
10
+ export {
11
+ installMethods
12
+ };
13
+ //# sourceMappingURL=chunk-F6NCB7KT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/kernel/query/internal/core.ts"],"sourcesContent":["/**\n * #1458 — how an extension group's methods reach `Query.prototype`.\n *\n * Each group defines its half of the builder as a MIXIN CLASS whose method\n * bodies moved out of `builder.ts` unchanged — `this.plan`, `this.source`,\n * `this.joinContext` and the rest still resolve, because TypeScript's\n * `private` is a compile-time construct and a method installed on the\n * prototype reads them like any other property. The mixin declares those\n * fields with `declare`, which emits nothing.\n *\n * ⭐ **Why a mixin CLASS rather than a file of `Query.prototype.x = function`\n * assignments.** The bodies are the point: several are 100+ lines carrying\n * prose that explains a decision, and a mechanical rewrite into assignment\n * form would have touched every one of them. As class methods they moved\n * byte-for-byte, so the diff shows a relocation rather than a rewrite — and an\n * overload set (`join`, `joinOn`, `aggregate`, `groupBy` all have them)\n * survives, which an assignment form cannot express.\n */\n\n/**\n * Copy a mixin's prototype methods onto a target prototype, replacing the Find\n * stubs.\n *\n * `getOwnPropertyNames` rather than `Object.assign`: class methods are\n * non-enumerable prototype properties, so `assign` copies nothing at all —\n * silently, leaving every stub in place. Descriptors are copied whole so a\n * getter stays a getter.\n */\nexport function installMethods(target: object, mixin: { prototype: object }): void {\n for (const name of Object.getOwnPropertyNames(mixin.prototype)) {\n if (name === 'constructor') continue\n const desc = Object.getOwnPropertyDescriptor(mixin.prototype, name)\n if (desc) Object.defineProperty(target, name, desc)\n }\n}\n"],"mappings":";AA4BO,SAAS,eAAe,QAAgB,OAAoC;AACjF,aAAW,QAAQ,OAAO,oBAAoB,MAAM,SAAS,GAAG;AAC9D,QAAI,SAAS,cAAe;AAC5B,UAAM,OAAO,OAAO,yBAAyB,MAAM,WAAW,IAAI;AAClE,QAAI,KAAM,QAAO,eAAe,QAAQ,MAAM,IAAI;AAAA,EACpD;AACF;","names":[]}
@@ -0,0 +1,100 @@
1
+ import {
2
+ LiveMaintainer,
3
+ canMaintainIncrementally
4
+ } from "./chunk-VHM7HCKB.js";
5
+ import {
6
+ projectDateTruncKeys
7
+ } from "./chunk-XBKH4FOC.js";
8
+ import {
9
+ buildOrderKeyPlan,
10
+ compareOrderKeys,
11
+ filterRecords,
12
+ fnViewDecoder,
13
+ orderKeyOf
14
+ } from "./chunk-AL6ML4LA.js";
15
+
16
+ // src/kernel/query/internal/maintenance.ts
17
+ var MaintenanceMethods = class {
18
+ /**
19
+ * Build the #1341 delta maintainer for this plan, or `undefined` when the
20
+ * plan shape or the source cannot support one (the query then re-runs in
21
+ * full, exactly as it did before #1341).
22
+ *
23
+ * Everything the maintainer needs is taken from THIS query so the two paths
24
+ * cannot diverge: `matches` is the same `filterRecords` call the eager
25
+ * pipeline makes, `compare` is the same comparator `sortRecords` sorts with,
26
+ * and `decode` is the same Via result decode `toArray()` applies after
27
+ * slicing.
28
+ */
29
+ incrementalMaintainer(mode) {
30
+ const source = this.source;
31
+ const snapshotEntries = source.snapshotEntries?.bind(source);
32
+ const lookupById = source.lookupById?.bind(source);
33
+ if (!snapshotEntries || !lookupById) return void 0;
34
+ const orderBy = mode === "rows" ? this.plan.orderBy : [];
35
+ const limit = mode === "rows" ? this.plan.limit : void 0;
36
+ const indexes = source.getIndexes?.();
37
+ const probe = indexes ? { covers: (f) => indexes.has(f), sorted: (f) => indexes.hasSorted(f) } : null;
38
+ if (!canMaintainIncrementally({ ...this.plan, orderBy, limit }, probe)) return void 0;
39
+ const clauses = this.plan.clauses;
40
+ const decodeForFns = fnViewDecoder(source);
41
+ const via = source.via;
42
+ const keyPlan = orderBy.length > 0 ? buildOrderKeyPlan(orderBy, via) : void 0;
43
+ return new LiveMaintainer({
44
+ snapshotEntries,
45
+ lookupById,
46
+ matches: (record) => filterRecords([record], clauses, decodeForFns).length === 1,
47
+ ...keyPlan ? {
48
+ order: {
49
+ keyOf: (record) => orderKeyOf(keyPlan, record),
50
+ compare: (a, b) => compareOrderKeys(keyPlan, a, b)
51
+ }
52
+ } : {},
53
+ offset: mode === "rows" ? this.plan.offset : 0,
54
+ limit,
55
+ ...mode === "rows" && via?.hasResultDecode ? { decode: (rows) => this.decodeVia(rows) } : {}
56
+ });
57
+ }
58
+ /**
59
+ * Build the #1341 grouped-maintenance seam for this plan, or `undefined`
60
+ * when the plan shape or the source cannot support one (a grouped live
61
+ * reduction then re-runs in full, exactly as it did before).
62
+ *
63
+ * Same whitelist and the same three inputs `incrementalMaintainer('records')`
64
+ * uses, for the same reason: `.groupBy()`'s record pipeline IS
65
+ * `.aggregate()`'s — `candidateRecords` + `filterRecords`, with no sort, no
66
+ * window and no Via result decode — so `orderBy`/`limit` are stripped before
67
+ * the whitelist is asked. `matches` is the same `filterRecords` call the
68
+ * eager pipeline makes, which is what stops the two paths from drifting.
69
+ *
70
+ * The one addition is `project`: `.groupBy(dateTrunc(...))` (#1350) stamps a
71
+ * derived key onto each row AFTER filtering and before bucketing, and the
72
+ * maintainer has to stamp it too or it would bucket on a field that is not
73
+ * there. It is a pure per-record map, which is the only kind of projection
74
+ * this hook may carry.
75
+ */
76
+ groupMaintenance(derived) {
77
+ const source = this.source;
78
+ const snapshotEntries = source.snapshotEntries?.bind(source);
79
+ const lookupById = source.lookupById?.bind(source);
80
+ if (!snapshotEntries || !lookupById) return void 0;
81
+ const indexes = source.getIndexes?.();
82
+ const probe = indexes ? { covers: (f) => indexes.has(f), sorted: (f) => indexes.hasSorted(f) } : null;
83
+ if (!canMaintainIncrementally({ ...this.plan, orderBy: [], limit: void 0 }, probe)) {
84
+ return void 0;
85
+ }
86
+ const clauses = this.plan.clauses;
87
+ const decodeForFns = fnViewDecoder(source);
88
+ return {
89
+ snapshotEntries,
90
+ lookupById,
91
+ matches: (record) => filterRecords([record], clauses, decodeForFns).length === 1,
92
+ ...derived.length > 0 ? { project: (record) => projectDateTruncKeys([record], derived)[0] } : {}
93
+ };
94
+ }
95
+ };
96
+
97
+ export {
98
+ MaintenanceMethods
99
+ };
100
+ //# sourceMappingURL=chunk-FFJFE4T7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/kernel/query/internal/maintenance.ts"],"sourcesContent":["/**\n * #1458 — the incremental-maintenance methods, shared by Live and Reduce.\n *\n * `incrementalMaintainer` and `groupMaintenance` are Live's machinery, but\n * they are not Live's alone: a live REDUCTION (`aggregate()` /\n * `groupBy()` handed to `withReduce`) maintains its state through exactly the\n * same maintainer, and always has — `Query.aggregate()` called\n * `this.incrementalMaintainer('records')` while both lived in `builder.ts`.\n *\n * ⭐ **So this is a genuine Reduce → Live edge, and it is recorded here rather\n * than hidden.** Both groups' `install()` copy this mixin, so importing\n * `@noy-db/hub/query/reduce` alone still gets a correctly-maintained live\n * reduction — at the cost of `live/incremental.ts` in that bundle. The\n * alternative (a hook that degrades to a full re-run when Live is absent)\n * would make the SAME call site behave differently depending on an unrelated\n * import, which is worse than the bytes.\n */\nimport type { DateTruncKey } from '../reduce/date-trunc.js'\nimport { projectDateTruncKeys } from '../reduce/date-trunc.js'\nimport type { GroupMaintenanceSource } from '../live/incremental.js'\nimport { LiveMaintainer, canMaintainIncrementally } from '../live/incremental.js'\nimport type { DeclaredPredicate, InternalSource, QueryPlan } from '../builder.js'\n// @internal Find helpers — the maintainer re-runs the same predicate and sort\n// the executor does, so it must use the same functions rather than a second\n// implementation that can drift from them.\nimport { buildOrderKeyPlan, compareOrderKeys, filterRecords, fnViewDecoder, orderKeyOf } from '../builder.js'\nimport type { JoinContext } from '../relate/join.js'\nimport type { ReduceStrategy } from '../../../with-lookup/reduce/strategy.js'\n\n/** @internal — copied onto `Query.prototype` by both Live and Reduce. */\nexport class MaintenanceMethods {\n declare protected readonly source: InternalSource\n declare protected readonly plan: QueryPlan\n declare protected readonly joinContext: JoinContext | undefined\n declare protected readonly reduceStrategy: ReduceStrategy\n declare protected readonly predicates: ReadonlyMap<string, DeclaredPredicate> | undefined\n declare protected decodeVia: (records: readonly unknown[], locale?: string) => unknown[]\n\n /**\n * Build the #1341 delta maintainer for this plan, or `undefined` when the\n * plan shape or the source cannot support one (the query then re-runs in\n * full, exactly as it did before #1341).\n *\n * Everything the maintainer needs is taken from THIS query so the two paths\n * cannot diverge: `matches` is the same `filterRecords` call the eager\n * pipeline makes, `compare` is the same comparator `sortRecords` sorts with,\n * and `decode` is the same Via result decode `toArray()` applies after\n * slicing.\n */\n private incrementalMaintainer(mode: 'rows' | 'records'): LiveMaintainer | undefined {\n const source = this.source\n const snapshotEntries = source.snapshotEntries?.bind(source)\n const lookupById = source.lookupById?.bind(source)\n if (!snapshotEntries || !lookupById) return undefined\n // `.aggregate()` reduces the whole match set in candidate order — it never\n // sorts, offsets, limits or decodes — so its maintainer is the same engine\n // with the ordering/windowing half switched off.\n const orderBy = mode === 'rows' ? this.plan.orderBy : []\n const limit = mode === 'rows' ? this.plan.limit : undefined\n const indexes = source.getIndexes?.()\n const probe = indexes\n ? { covers: (f: string) => indexes.has(f), sorted: (f: string) => indexes.hasSorted(f) }\n : null\n if (!canMaintainIncrementally({ ...this.plan, orderBy, limit }, probe)) return undefined\n\n const clauses = this.plan.clauses\n const decodeForFns = fnViewDecoder(source)\n const via = source.via\n // The ordering comes from the SAME key plan `sortRecords` builds and the\n // keyset cursor compares against (#1346) — one definition of \"what order\n // is this query in\", so the maintained order cannot drift from a re-run's.\n // `by: 'label'` is refused above, so no label maps are needed here.\n const keyPlan = orderBy.length > 0 ? buildOrderKeyPlan(orderBy, via) : undefined\n return new LiveMaintainer({\n snapshotEntries,\n lookupById,\n matches: record => filterRecords([record], clauses, decodeForFns).length === 1,\n ...(keyPlan\n ? {\n order: {\n keyOf: (record: unknown) => orderKeyOf(keyPlan, record),\n compare: (a: readonly unknown[], b: readonly unknown[]) => compareOrderKeys(keyPlan, a, b),\n },\n }\n : {}),\n offset: mode === 'rows' ? this.plan.offset : 0,\n limit,\n ...(mode === 'rows' && via?.hasResultDecode\n ? { decode: (rows: readonly unknown[]) => this.decodeVia(rows) }\n : {}),\n })\n }\n\n /**\n * Build the #1341 grouped-maintenance seam for this plan, or `undefined`\n * when the plan shape or the source cannot support one (a grouped live\n * reduction then re-runs in full, exactly as it did before).\n *\n * Same whitelist and the same three inputs `incrementalMaintainer('records')`\n * uses, for the same reason: `.groupBy()`'s record pipeline IS\n * `.aggregate()`'s — `candidateRecords` + `filterRecords`, with no sort, no\n * window and no Via result decode — so `orderBy`/`limit` are stripped before\n * the whitelist is asked. `matches` is the same `filterRecords` call the\n * eager pipeline makes, which is what stops the two paths from drifting.\n *\n * The one addition is `project`: `.groupBy(dateTrunc(...))` (#1350) stamps a\n * derived key onto each row AFTER filtering and before bucketing, and the\n * maintainer has to stamp it too or it would bucket on a field that is not\n * there. It is a pure per-record map, which is the only kind of projection\n * this hook may carry.\n */\n private groupMaintenance(derived: readonly DateTruncKey[]): GroupMaintenanceSource | undefined {\n const source = this.source\n const snapshotEntries = source.snapshotEntries?.bind(source)\n const lookupById = source.lookupById?.bind(source)\n if (!snapshotEntries || !lookupById) return undefined\n const indexes = source.getIndexes?.()\n const probe = indexes\n ? { covers: (f: string) => indexes.has(f), sorted: (f: string) => indexes.hasSorted(f) }\n : null\n if (!canMaintainIncrementally({ ...this.plan, orderBy: [], limit: undefined }, probe)) {\n return undefined\n }\n const clauses = this.plan.clauses\n const decodeForFns = fnViewDecoder(source)\n return {\n snapshotEntries,\n lookupById,\n matches: (record: unknown) => filterRecords([record], clauses, decodeForFns).length === 1,\n ...(derived.length > 0\n ? { project: (record: unknown) => projectDateTruncKeys([record], derived)[0] }\n : {}),\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA8BO,IAAM,qBAAN,MAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBtB,sBAAsB,MAAsD;AAClF,UAAM,SAAS,KAAK;AACpB,UAAM,kBAAkB,OAAO,iBAAiB,KAAK,MAAM;AAC3D,UAAM,aAAa,OAAO,YAAY,KAAK,MAAM;AACjD,QAAI,CAAC,mBAAmB,CAAC,WAAY,QAAO;AAI5C,UAAM,UAAU,SAAS,SAAS,KAAK,KAAK,UAAU,CAAC;AACvD,UAAM,QAAQ,SAAS,SAAS,KAAK,KAAK,QAAQ;AAClD,UAAM,UAAU,OAAO,aAAa;AACpC,UAAM,QAAQ,UACV,EAAE,QAAQ,CAAC,MAAc,QAAQ,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAc,QAAQ,UAAU,CAAC,EAAE,IACrF;AACJ,QAAI,CAAC,yBAAyB,EAAE,GAAG,KAAK,MAAM,SAAS,MAAM,GAAG,KAAK,EAAG,QAAO;AAE/E,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,eAAe,cAAc,MAAM;AACzC,UAAM,MAAM,OAAO;AAKnB,UAAM,UAAU,QAAQ,SAAS,IAAI,kBAAkB,SAAS,GAAG,IAAI;AACvE,WAAO,IAAI,eAAe;AAAA,MACxB;AAAA,MACA;AAAA,MACA,SAAS,YAAU,cAAc,CAAC,MAAM,GAAG,SAAS,YAAY,EAAE,WAAW;AAAA,MAC7E,GAAI,UACA;AAAA,QACE,OAAO;AAAA,UACL,OAAO,CAAC,WAAoB,WAAW,SAAS,MAAM;AAAA,UACtD,SAAS,CAAC,GAAuB,MAA0B,iBAAiB,SAAS,GAAG,CAAC;AAAA,QAC3F;AAAA,MACF,IACA,CAAC;AAAA,MACL,QAAQ,SAAS,SAAS,KAAK,KAAK,SAAS;AAAA,MAC7C;AAAA,MACA,GAAI,SAAS,UAAU,KAAK,kBACxB,EAAE,QAAQ,CAAC,SAA6B,KAAK,UAAU,IAAI,EAAE,IAC7D,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBQ,iBAAiB,SAAsE;AAC7F,UAAM,SAAS,KAAK;AACpB,UAAM,kBAAkB,OAAO,iBAAiB,KAAK,MAAM;AAC3D,UAAM,aAAa,OAAO,YAAY,KAAK,MAAM;AACjD,QAAI,CAAC,mBAAmB,CAAC,WAAY,QAAO;AAC5C,UAAM,UAAU,OAAO,aAAa;AACpC,UAAM,QAAQ,UACV,EAAE,QAAQ,CAAC,MAAc,QAAQ,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAc,QAAQ,UAAU,CAAC,EAAE,IACrF;AACJ,QAAI,CAAC,yBAAyB,EAAE,GAAG,KAAK,MAAM,SAAS,CAAC,GAAG,OAAO,OAAU,GAAG,KAAK,GAAG;AACrF,aAAO;AAAA,IACT;AACA,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,eAAe,cAAc,MAAM;AACzC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,CAAC,WAAoB,cAAc,CAAC,MAAM,GAAG,SAAS,YAAY,EAAE,WAAW;AAAA,MACxF,GAAI,QAAQ,SAAS,IACjB,EAAE,SAAS,CAAC,WAAoB,qBAAqB,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,IAC3E,CAAC;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TierWriteRefusedError
3
- } from "./chunk-7O3Y4PPD.js";
3
+ } from "./chunk-37EPTBBR.js";
4
4
 
5
5
  // src/kernel/tier-visibility.ts
6
6
  async function peekLiveTier(adapter, vault, name, id) {
@@ -49,4 +49,4 @@ export {
49
49
  dekKey,
50
50
  parseDekKey
51
51
  };
52
- //# sourceMappingURL=chunk-JMGDHKQF.js.map
52
+ //# sourceMappingURL=chunk-FLPCETP6.js.map
@@ -0,0 +1,53 @@
1
+ import {
2
+ CollectionNotHydratedError
3
+ } from "./chunk-37EPTBBR.js";
4
+
5
+ // src/kernel/query/hydration.ts
6
+ var INSPECT = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
7
+ function pendingResult(gate, terminal, compute) {
8
+ let settled;
9
+ const settle = () => settled ??= gate.hydrate().then(() => compute());
10
+ const refuse = () => {
11
+ throw new CollectionNotHydratedError(gate.collection, terminal, gate.label);
12
+ };
13
+ const proxy = new Proxy(
14
+ // #1462 — the target is `[]`, NOT `{}`, and it is load-bearing: `IsArray`
15
+ // unwraps a proxy to its target, so this is what makes
16
+ // `Array.isArray(rows)` answer `true` and send the idiomatic guard into
17
+ // the throwing path below instead of into a silent `[]`. Every trap still
18
+ // fires — the target is never read, only classified.
19
+ [],
20
+ {
21
+ get(_target, prop) {
22
+ if (prop === "then") {
23
+ return (onOk, onErr) => settle().then(onOk, onErr);
24
+ }
25
+ if (prop === "catch") {
26
+ return (onErr) => settle().catch(onErr);
27
+ }
28
+ if (prop === "finally") {
29
+ return (fn) => settle().finally(fn);
30
+ }
31
+ if (prop === Symbol.toStringTag) return "NoydbPendingResult";
32
+ if (prop === INSPECT) {
33
+ return () => `[noydb: ${terminal}() on unhydrated collection "${gate.label}" \u2014 await it, or await list()/get() first]`;
34
+ }
35
+ return refuse();
36
+ },
37
+ has: refuse,
38
+ ownKeys: refuse,
39
+ set: refuse,
40
+ getOwnPropertyDescriptor: refuse
41
+ }
42
+ );
43
+ return proxy;
44
+ }
45
+ function gateTerminal(gate, terminal, compute) {
46
+ if (gate === void 0 || gate.isHydrated()) return compute();
47
+ return pendingResult(gate, terminal, compute);
48
+ }
49
+
50
+ export {
51
+ gateTerminal
52
+ };
53
+ //# sourceMappingURL=chunk-FOEDQATO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/kernel/query/hydration.ts"],"sourcesContent":["import { CollectionNotHydratedError } from '../errors.js'\n\n/**\n * #1414 — the cold-collection gate.\n *\n * An eager collection that has never been read asynchronously holds an EMPTY\n * cache. Before this module every synchronous query terminal answered out of\n * that cache, so a cold collection reported `[]` / `0` / `false` with total\n * confidence, forever, until some `list()`/`get()` hydrated it. Guards inherit\n * the same source through `ReadOnlyVaultFacade`, and both failure directions\n * were measured on shipped stable: a valid write refused because the guard's\n * lookup came back empty, and — worse — a write that a warm instance REFUSES\n * committing on a cold one, because the guard's `await …toArray()` saw nothing.\n *\n * **Empty and unable-to-answer are different facts.** Same posture as #1402\n * (\"an index that cannot answer must say so, not return nothing\") and #1410.\n *\n * The fix has to serve two callers at once, and that is what shapes this\n * module:\n *\n * - the AWAITED caller (`await q.toArray()`, and therefore every guard, since\n * `GuardSpec.check` is async) must transparently hydrate and get the rows.\n * This is the half that closes the bypass.\n * - the SYNCHRONOUS caller must be told, loudly, that the answer it is about\n * to trust is not an answer.\n *\n * A terminal cannot both throw and be awaitable, so a cold terminal returns a\n * **pending result**: a thenable that hydrates and re-runs the terminal when\n * awaited, and throws {@link CollectionNotHydratedError} on every use that\n * READS it — indexing, `.length`, iteration, spread, `.map()`, `JSON.stringify`,\n * `String()`, `in`, `Object.keys`, arithmetic, any property read.\n *\n * ⛔ **THE EXACT BOUNDARY, enumerated — because \"any other use\" is what this\n * doc used to say, and it was not true (#1462).** Two operations answer\n * without reaching a proxy trap, and NEITHER CAN BE MADE TO THROW:\n *\n * | use | result | why it cannot throw |\n * |---|---|---|\n * | `typeof rows` | `'object'` | answered from the value's type, no trap |\n * | `if (rows)` / `Boolean(rows)` — truthiness | `true` | `ToBoolean` never calls a trap |\n *\n * Do not try to close either with a `valueOf` returning `false` — that would\n * resurrect the confident-wrong-answer this whole module exists to abolish, in\n * the one shape nobody would ever check.\n *\n * ⭐ **`Array.isArray` used to be a third row, and it was the dangerous one.**\n * `toArray()` is declared `T[]`, so `Array.isArray(rows) ? rows : []` is the\n * ORDINARY defensive shape for the declared type — and it returned `[]` on a\n * cold collection, restoring the silent empty read this module abolishes,\n * behind code that looks like it handles the edge case. It is closed: the\n * proxy's target is `[]`, and `IsArray` unwraps a proxy to its target, so the\n * check answers `true` and the guard falls through to the throwing path. That\n * cost one character of target and no change to the design — the report that\n * found it assumed it needed a real array exotic object.\n *\n * ⚠️ **So the rule for anyone extending this: a use that reaches a trap must\n * throw, and a use that cannot reach one must be IN THE TABLE ABOVE.** The\n * table is pinned by `__tests__/1462-pending-result-surface.test.ts`, which\n * also asserts this comment no longer claims a total guarantee — a probe\n * written against \"any other use\" passes vacuously, because the phrase names\n * no specific use for anything to contradict.\n */\nexport interface HydrationGate {\n /** `<vault>/<collection>` — names the collection in the error. */\n readonly label: string\n /** Collection name alone, for the error's structured field. */\n readonly collection: string\n /** False only while the eager cache has never been bulk-loaded. */\n isHydrated(): boolean\n /** Bulk-load the collection. Idempotent. */\n hydrate(): Promise<void>\n}\n\nconst INSPECT = Symbol.for('nodejs.util.inspect.custom')\n\n/**\n * Wrap a terminal's result for an unhydrated collection. `compute` is re-run\n * AFTER hydration — it must be the terminal itself, not a captured value, or\n * the awaited caller would receive the cold answer it came here to avoid.\n */\nfunction pendingResult<V>(gate: HydrationGate, terminal: string, compute: () => V): V {\n let settled: Promise<V> | undefined\n const settle = (): Promise<V> => (settled ??= gate.hydrate().then(() => compute()))\n const refuse = (): never => {\n throw new CollectionNotHydratedError(gate.collection, terminal, gate.label)\n }\n const proxy = new Proxy(\n // #1462 — the target is `[]`, NOT `{}`, and it is load-bearing: `IsArray`\n // unwraps a proxy to its target, so this is what makes\n // `Array.isArray(rows)` answer `true` and send the idiomatic guard into\n // the throwing path below instead of into a silent `[]`. Every trap still\n // fires — the target is never read, only classified.\n [],\n {\n get(_target, prop) {\n if (prop === 'then') {\n return (onOk?: (v: V) => unknown, onErr?: (e: unknown) => unknown): Promise<unknown> =>\n settle().then(onOk, onErr)\n }\n if (prop === 'catch') {\n return (onErr?: (e: unknown) => unknown): Promise<unknown> => settle().catch(onErr)\n }\n if (prop === 'finally') {\n return (fn?: () => void): Promise<V> => settle().finally(fn)\n }\n if (prop === Symbol.toStringTag) return 'NoydbPendingResult'\n if (prop === INSPECT) {\n return () => `[noydb: ${terminal}() on unhydrated collection \"${gate.label}\" — await it, or await list()/get() first]`\n }\n return refuse()\n },\n has: refuse,\n ownKeys: refuse,\n set: refuse,\n getOwnPropertyDescriptor: refuse,\n },\n )\n return proxy as V\n}\n\n/**\n * Terminal wrapper. Returns `compute()` unchanged whenever the source is\n * hydrated (or carries no gate at all — a plain-object source, a join source,\n * a lazy collection), so the hot path is one property read and a boolean.\n */\nexport function gateTerminal<V>(\n gate: HydrationGate | undefined,\n terminal: string,\n compute: () => V,\n): V {\n if (gate === undefined || gate.isHydrated()) return compute()\n return pendingResult(gate, terminal, compute)\n}\n"],"mappings":";;;;;AAyEA,IAAM,UAAU,uBAAO,IAAI,4BAA4B;AAOvD,SAAS,cAAiB,MAAqB,UAAkB,SAAqB;AACpF,MAAI;AACJ,QAAM,SAAS,MAAmB,YAAY,KAAK,QAAQ,EAAE,KAAK,MAAM,QAAQ,CAAC;AACjF,QAAM,SAAS,MAAa;AAC1B,UAAM,IAAI,2BAA2B,KAAK,YAAY,UAAU,KAAK,KAAK;AAAA,EAC5E;AACA,QAAM,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMhB,CAAC;AAAA,IACD;AAAA,MACE,IAAI,SAAS,MAAM;AACjB,YAAI,SAAS,QAAQ;AACnB,iBAAO,CAAC,MAA0B,UAChC,OAAO,EAAE,KAAK,MAAM,KAAK;AAAA,QAC7B;AACA,YAAI,SAAS,SAAS;AACpB,iBAAO,CAAC,UAAsD,OAAO,EAAE,MAAM,KAAK;AAAA,QACpF;AACA,YAAI,SAAS,WAAW;AACtB,iBAAO,CAAC,OAAgC,OAAO,EAAE,QAAQ,EAAE;AAAA,QAC7D;AACA,YAAI,SAAS,OAAO,YAAa,QAAO;AACxC,YAAI,SAAS,SAAS;AACpB,iBAAO,MAAM,WAAW,QAAQ,gCAAgC,KAAK,KAAK;AAAA,QAC5E;AACA,eAAO,OAAO;AAAA,MAChB;AAAA,MACA,KAAK;AAAA,MACL,SAAS;AAAA,MACT,KAAK;AAAA,MACL,0BAA0B;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,aACd,MACA,UACA,SACG;AACH,MAAI,SAAS,UAAa,KAAK,WAAW,EAAG,QAAO,QAAQ;AAC5D,SAAO,cAAc,MAAM,UAAU,OAAO;AAC9C;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  DuplicateBehaviorNameError
3
- } from "./chunk-7O3Y4PPD.js";
3
+ } from "./chunk-37EPTBBR.js";
4
4
 
5
5
  // src/with-audit/guards/registry.ts
6
6
  var GuardRegistry = class {
@@ -141,4 +141,4 @@ var GuardRegistry = class {
141
141
  export {
142
142
  GuardRegistry
143
143
  };
144
- //# sourceMappingURL=chunk-DGOZ4UZD.js.map
144
+ //# sourceMappingURL=chunk-FVH5QYY2.js.map
@@ -1,33 +1,30 @@
1
1
  import {
2
2
  assertTierAccess
3
- } from "./chunk-UGTBXF5U.js";
3
+ } from "./chunk-7XMHMVTS.js";
4
4
  import {
5
5
  dekKey,
6
6
  liveRecordIsElevated,
7
7
  liveRecordTier
8
- } from "./chunk-JMGDHKQF.js";
9
- import {
10
- buildRecordAad,
11
- openEnvelopeJson,
12
- writeEnvelopeBody
13
- } from "./chunk-4ZS56W5S.js";
14
- import {
15
- buildRecordEnvelope,
16
- buildSealedRecordEnvelope
17
- } from "./chunk-SZJ3DLZA.js";
8
+ } from "./chunk-FLPCETP6.js";
18
9
  import {
19
10
  base64ToBuffer,
20
11
  bufferToBase64,
12
+ buildRecordAad,
13
+ buildRecordEnvelope,
14
+ buildSealedRecordEnvelope,
21
15
  decryptBytesWithAAD,
22
16
  deriveBlobAddressKey,
23
17
  encrypt,
24
18
  encryptBytesWithAAD,
25
19
  generateDEK,
26
20
  hmacSha256Hex,
21
+ openEnvelopeJson,
22
+ sealedBodyArgs,
27
23
  sha256Hex,
28
24
  unwrapCek,
29
- wrapCek
30
- } from "./chunk-HPVZCW43.js";
25
+ wrapCek,
26
+ writeEnvelopeBody
27
+ } from "./chunk-EZGV6F47.js";
31
28
  import {
32
29
  BLOB_ADDRESS_KEY_ID,
33
30
  BlobIntentPendingError,
@@ -39,7 +36,7 @@ import {
39
36
  UnsupportedTierCompositionError,
40
37
  ValidationError,
41
38
  isConflictError
42
- } from "./chunk-7O3Y4PPD.js";
39
+ } from "./chunk-37EPTBBR.js";
43
40
 
44
41
  // src/with-shape/blobs/blob-pinning.ts
45
42
  function memoryBlobPinStore() {
@@ -452,6 +449,8 @@ var BlobSet = class _BlobSet {
452
449
  * a cleared view: see `ownerRecordElevated()`/`ownerTier()`.
453
450
  */
454
451
  clearedTier;
452
+ /** #1452 — see `BlobsStrategyOpenArgs.assertOwnerWritable`. */
453
+ assertOwnerWritable;
455
454
  constructor(opts) {
456
455
  this.store = opts.store;
457
456
  this.vault = opts.vault;
@@ -469,6 +468,7 @@ var BlobSet = class _BlobSet {
469
468
  this.keyring = opts.keyring;
470
469
  this.clearedTier = opts.clearedTier;
471
470
  this.pinCache = opts.pinCache;
471
+ this.assertOwnerWritable = opts.assertOwnerWritable;
472
472
  }
473
473
  /**
474
474
  * #724 I1 completion: a legacy (non-`perRecordKeys`) blob has no per-blob
@@ -671,7 +671,7 @@ var BlobSet = class _BlobSet {
671
671
  if (!envelope) return { slots: {}, version: 0 };
672
672
  if (!this.encrypted) {
673
673
  return {
674
- slots: JSON.parse(envelope._data),
674
+ slots: JSON.parse(envelope._data ?? ""),
675
675
  version: envelope._v
676
676
  };
677
677
  }
@@ -696,7 +696,7 @@ var BlobSet = class _BlobSet {
696
696
  const envelope = await this.store.get(this.vault, this.slotsCollection, this.recordId);
697
697
  if (!envelope) return { slots: {}, version: 0, atTier: fromTier };
698
698
  if (!this.encrypted) {
699
- return { slots: JSON.parse(envelope._data), version: envelope._v, atTier: fromTier };
699
+ return { slots: JSON.parse(envelope._data ?? ""), version: envelope._v, atTier: fromTier };
700
700
  }
701
701
  const fromDek = await this.getDEK(dekKey(this.collection, fromTier));
702
702
  try {
@@ -850,7 +850,7 @@ var BlobSet = class _BlobSet {
850
850
  const envelope = await this.store.get(this.vault, BLOB_INDEX_COLLECTION, eTag);
851
851
  if (!envelope) return null;
852
852
  if (!this.encrypted) {
853
- return { blob: JSON.parse(envelope._data), version: envelope._v, atTier: 0 };
853
+ return { blob: JSON.parse(envelope._data ?? ""), version: envelope._v, atTier: 0 };
854
854
  }
855
855
  const t = tier ?? await this.ownerTier();
856
856
  const fallbackTier = alsoTryTier ?? (t > 0 ? 0 : void 0);
@@ -1109,7 +1109,7 @@ var BlobSet = class _BlobSet {
1109
1109
  * covered by rotation.
1110
1110
  *
1111
1111
  * This also makes one ordering rule true across the blob subsystem rather
1112
- * than two opposite ones: `kernel/enclave/record-keys/rekey-blob.ts` already
1112
+ * than two opposite ones: `capsule/plumbing/rekey-blob.ts` already
1113
1113
  * re-encrypts chunks before re-sealing their index entry, and documents that
1114
1114
  * order as its resume property.
1115
1115
  *
@@ -1515,7 +1515,7 @@ var BlobSet = class _BlobSet {
1515
1515
  const envelope = await this.store.get(this.vault, this.versionsCollection, key);
1516
1516
  if (!envelope) continue;
1517
1517
  try {
1518
- const record = this.encrypted ? JSON.parse(await openEnvelopeJson({ collection: this.versionsCollection, id: key }, envelope, dek)) : JSON.parse(envelope._data);
1518
+ const record = this.encrypted ? JSON.parse(await openEnvelopeJson({ collection: this.versionsCollection, id: key }, envelope, dek)) : JSON.parse(envelope._data ?? "");
1519
1519
  holds.set(record.eTag, (holds.get(record.eTag) ?? 0) + 1);
1520
1520
  readable.push(key);
1521
1521
  } catch {
@@ -1795,7 +1795,7 @@ var BlobSet = class _BlobSet {
1795
1795
  async loadVersionRecordAtKeyTolerant(key, fromTier, toTier) {
1796
1796
  const envelope = await this.store.get(this.vault, this.versionsCollection, key);
1797
1797
  if (!envelope) return null;
1798
- if (!this.encrypted) return { record: JSON.parse(envelope._data), atTier: fromTier };
1798
+ if (!this.encrypted) return { record: JSON.parse(envelope._data ?? ""), atTier: fromTier };
1799
1799
  const fromDek = await this.getDEK(dekKey(this.collection, fromTier));
1800
1800
  try {
1801
1801
  const json2 = await openEnvelopeJson({ collection: this.versionsCollection, id: key }, envelope, fromDek);
@@ -1986,9 +1986,9 @@ var BlobSet = class _BlobSet {
1986
1986
  if (!envelope) return null;
1987
1987
  if (dek) {
1988
1988
  const aad = chunkAAD(eTag, index, chunkCount);
1989
- return await decryptBytesWithAAD(envelope._iv, envelope._data, dek, aad);
1989
+ return await decryptBytesWithAAD(...sealedBodyArgs(envelope, "blobSet"), dek, aad);
1990
1990
  }
1991
- return base64ToBuffer(envelope._data);
1991
+ return base64ToBuffer(envelope._data ?? "");
1992
1992
  }
1993
1993
  // ─── Version record I/O ───────────────────────────────────────────
1994
1994
  /** #752: '::' is the version-key separator (`versionKey`) — a recordId/slotName/label
@@ -2024,7 +2024,7 @@ var BlobSet = class _BlobSet {
2024
2024
  const envelope = await this.store.get(this.vault, this.versionsCollection, key);
2025
2025
  if (!envelope) return null;
2026
2026
  if (!this.encrypted) {
2027
- return JSON.parse(envelope._data);
2027
+ return JSON.parse(envelope._data ?? "");
2028
2028
  }
2029
2029
  const dek = await this.getDEK(dekKey(this.collection, tier ?? await this.ownerTier()));
2030
2030
  const json = await openEnvelopeJson({ collection: this.versionsCollection, id: key }, envelope, dek);
@@ -2155,6 +2155,7 @@ var BlobSet = class _BlobSet {
2155
2155
  async put(slotName, data, opts) {
2156
2156
  this.assertKeyPartSafe(this.recordId, "record id");
2157
2157
  this.assertKeyPartSafe(slotName, "slot name");
2158
+ await this.assertOwnerWritable?.();
2158
2159
  await this.resolvePendingIntent();
2159
2160
  if (this.objectStore && this.blobFields?.[slotName]?.external) {
2160
2161
  const policy = this.blobFields[slotName];
@@ -2503,6 +2504,7 @@ var BlobSet = class _BlobSet {
2503
2504
  * bucket. Writes the external slot record (the catalog entry).
2504
2505
  */
2505
2506
  async adoptExternal(slotName, ref) {
2507
+ await this.assertOwnerWritable?.();
2506
2508
  this.assertKeyPartSafe(this.recordId, "record id");
2507
2509
  this.assertKeyPartSafe(slotName, "slot name");
2508
2510
  this.assertExternalDeclared(slotName);
@@ -2591,10 +2593,32 @@ var BlobSet = class _BlobSet {
2591
2593
  });
2592
2594
  }
2593
2595
  /**
2594
- * Delete the named slot from this record.
2595
- * Decrements refCount on the blob. Chunks are GC'd by `vault.blobGC()`.
2596
+ * Delete the named slot from this record and decrement the blob's refCount.
2597
+ * At refCount 0 an erasable blob (`perRecordKeys`) is crypto-shredded on the
2598
+ * spot; a legacy blob keeps its chunks until
2599
+ * `vault.compact({ reclaimLegacyBlobs: true })` reclaims them (#1453), or
2600
+ * `blob(id).migrate()` makes it erasable first.
2601
+ *
2602
+ * Gated on the owning record (#1452): refused where an update of the record
2603
+ * would be refused.
2596
2604
  */
2597
2605
  async delete(slotName) {
2606
+ await this.assertOwnerWritable?.();
2607
+ return this.releaseSlot(slotName);
2608
+ }
2609
+ /**
2610
+ * #1451 — release EVERY slot this record holds. Called by
2611
+ * `Collection.delete()` after the record is gone, so "the record is deleted"
2612
+ * and "its attachments are released" are one operation. Ungated: the record
2613
+ * delete itself already passed the gate bus. Ref-counted like any release —
2614
+ * content another record still holds survives.
2615
+ */
2616
+ async releaseAll() {
2617
+ const { slots } = await this.loadSlots();
2618
+ for (const name of Object.keys(slots)) await this.releaseSlot(name);
2619
+ }
2620
+ /** The body of {@link delete}, minus the owner gate. */
2621
+ async releaseSlot(slotName) {
2598
2622
  await this.resolvePendingIntent();
2599
2623
  let eTagToRelease;
2600
2624
  let externalKeyToDelete;
@@ -2901,6 +2925,7 @@ var BlobSet = class _BlobSet {
2901
2925
  * `rehomeForTier`) — no separate tier-scoping needed for the content side.
2902
2926
  */
2903
2927
  async publish(slotName, label) {
2928
+ await this.assertOwnerWritable?.();
2904
2929
  this.assertKeyPartSafe(this.recordId, "record id");
2905
2930
  this.assertKeyPartSafe(slotName, "slot name");
2906
2931
  this.assertKeyPartSafe(label, "version label");
@@ -2951,7 +2976,7 @@ var BlobSet = class _BlobSet {
2951
2976
  const envelope = await this.store.get(this.vault, this.versionsCollection, key);
2952
2977
  if (!envelope) continue;
2953
2978
  if (!this.encrypted) {
2954
- versions.push(JSON.parse(envelope._data));
2979
+ versions.push(JSON.parse(envelope._data ?? ""));
2955
2980
  } else {
2956
2981
  const dek = await this.getDEK(this.collection);
2957
2982
  const json = await openEnvelopeJson({ collection: this.versionsCollection, id: key }, envelope, dek);
@@ -2964,6 +2989,7 @@ var BlobSet = class _BlobSet {
2964
2989
  * Delete a published version. Decrements refCount on its blob.
2965
2990
  */
2966
2991
  async deleteVersion(slotName, label) {
2992
+ await this.assertOwnerWritable?.();
2967
2993
  await this.resolvePendingIntent();
2968
2994
  const record = await this.loadVersionRecord(slotName, label);
2969
2995
  if (!record) return;
@@ -3061,7 +3087,7 @@ var BlobSet = class _BlobSet {
3061
3087
  return this.buildResponse(slot, result.blob, { inline: true });
3062
3088
  }
3063
3089
  const aad = chunkAAD(slot.eTag, 0, result.blob.chunkCount);
3064
- const decrypted = await decryptBytesWithAAD(envelope._iv, envelope._data, chunkKey, aad);
3090
+ const decrypted = await decryptBytesWithAAD(...sealedBodyArgs(envelope, "blobSet"), chunkKey, aad);
3065
3091
  const plaintext = result.blob.compression === "gzip" ? await decompressBytes(decrypted) : decrypted;
3066
3092
  const recomputed = await hmacSha256Hex(await this.addressKey(await this.ownerTier()), plaintext);
3067
3093
  if (recomputed !== slot.eTag) {
@@ -3137,4 +3163,4 @@ export {
3137
3163
  DEFAULT_CHUNK_SIZE,
3138
3164
  BlobSet
3139
3165
  };
3140
- //# sourceMappingURL=chunk-HIWCKBEY.js.map
3166
+ //# sourceMappingURL=chunk-G2MVBDFP.js.map