@noy-db/hub 0.6.0-pre.9 → 0.7.0-pre.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/CHANGELOG.md +7127 -0
  2. package/README.md +1 -1
  3. package/codemods/0.4.0-pre.json +24 -0
  4. package/codemods/0.6.0-pre.json +229 -0
  5. package/codemods/0.7.0-pre.json +258 -0
  6. package/dist/api-EQYRTZO2.js +20 -0
  7. package/dist/as/index.js +146 -0
  8. package/dist/as/index.js.map +1 -0
  9. package/dist/at/index.js +23 -0
  10. package/dist/attestation/index.js +19 -19
  11. package/dist/{backup-KULFZ2T4.js → backup-Z7ZBTAQ6.js} +36 -18
  12. package/dist/backup-Z7ZBTAQ6.js.map +1 -0
  13. package/dist/blobs/index.js +22 -20
  14. package/dist/blobs/index.js.map +1 -1
  15. package/dist/broker/index.js +12 -12
  16. package/dist/by/index.js +11 -0
  17. package/dist/cargo/index.js +40 -36
  18. package/dist/{chunk-YAWK6AWF.js → chunk-225O5CXQ.js} +2 -2
  19. package/dist/{chunk-MSWYQLMQ.js → chunk-2GXEQUEX.js} +2 -2
  20. package/dist/chunk-2GXEQUEX.js.map +1 -0
  21. package/dist/{chunk-3URQC7EH.js → chunk-2LPVI4PX.js} +355 -132
  22. package/dist/chunk-2LPVI4PX.js.map +1 -0
  23. package/dist/{chunk-JJNOLSG5.js → chunk-3L2MVE36.js} +15 -16
  24. package/dist/chunk-3L2MVE36.js.map +1 -0
  25. package/dist/{chunk-OF3L2SD6.js → chunk-3QARDAYW.js} +2 -2
  26. package/dist/{chunk-WLZ47GSL.js → chunk-467SKJ65.js} +12 -10
  27. package/dist/{chunk-WLZ47GSL.js.map → chunk-467SKJ65.js.map} +1 -1
  28. package/dist/{chunk-W3TVWF6N.js → chunk-4A4TYISP.js} +2 -2
  29. package/dist/{chunk-ZJADGNYF.js → chunk-4AOERLTV.js} +1 -1
  30. package/dist/chunk-4AOERLTV.js.map +1 -0
  31. package/dist/{chunk-CCZJJ4I2.js → chunk-4G25SDQL.js} +6 -6
  32. package/dist/{chunk-4I72F5DF.js → chunk-4LPF226H.js} +11 -14
  33. package/dist/chunk-4LPF226H.js.map +1 -0
  34. package/dist/{chunk-7F4DBNSP.js → chunk-4ZPE6SKS.js} +135 -18
  35. package/dist/chunk-4ZPE6SKS.js.map +1 -0
  36. package/dist/{chunk-7TSYBD3E.js → chunk-5263OEM3.js} +2 -2
  37. package/dist/{chunk-WFUIE565.js → chunk-57JTHWLQ.js} +17 -14
  38. package/dist/chunk-57JTHWLQ.js.map +1 -0
  39. package/dist/{chunk-FNSMZQS4.js → chunk-5ACAVJUI.js} +2 -2
  40. package/dist/{chunk-PDLLCOGD.js → chunk-5AFMP532.js} +20 -17
  41. package/dist/chunk-5AFMP532.js.map +1 -0
  42. package/dist/{chunk-JRKZTEZZ.js → chunk-5W7YXFV5.js} +444 -73
  43. package/dist/chunk-5W7YXFV5.js.map +1 -0
  44. package/dist/chunk-6EW2UCVF.js +190 -0
  45. package/dist/chunk-6EW2UCVF.js.map +1 -0
  46. package/dist/{chunk-4VUPLMZ6.js → chunk-6FOGTKBY.js} +68 -73
  47. package/dist/chunk-6FOGTKBY.js.map +1 -0
  48. package/dist/{chunk-VMCCGUQB.js → chunk-7LYUJNU3.js} +2 -2
  49. package/dist/{chunk-52JPHN5N.js → chunk-A2YW5EMU.js} +27 -149
  50. package/dist/chunk-A2YW5EMU.js.map +1 -0
  51. package/dist/{chunk-WLYIROCJ.js → chunk-AB5P32RE.js} +2 -2
  52. package/dist/{chunk-PL2GHSCM.js → chunk-ALB64CZM.js} +157 -90
  53. package/dist/chunk-ALB64CZM.js.map +1 -0
  54. package/dist/{chunk-SUFG5E73.js → chunk-ALUNQEBY.js} +2 -2
  55. package/dist/{chunk-CADUYBQD.js → chunk-ATL3ZVXT.js} +2 -2
  56. package/dist/{chunk-BWVKEOPE.js → chunk-ATV637J7.js} +7 -11
  57. package/dist/chunk-ATV637J7.js.map +1 -0
  58. package/dist/{chunk-DG27IUVI.js → chunk-CBRS2NEK.js} +2 -11
  59. package/dist/chunk-CBRS2NEK.js.map +1 -0
  60. package/dist/{chunk-7MNBICB5.js → chunk-CN6B5PEN.js} +16 -14
  61. package/dist/chunk-CN6B5PEN.js.map +1 -0
  62. package/dist/{chunk-6FJWSWFT.js → chunk-DBNYPLWY.js} +3 -3
  63. package/dist/{chunk-5JY5TSVY.js → chunk-DFAUMLD7.js} +25 -31
  64. package/dist/chunk-DFAUMLD7.js.map +1 -0
  65. package/dist/{chunk-FFDNKRCY.js → chunk-DKWPJOYH.js} +2 -2
  66. package/dist/chunk-DKWPJOYH.js.map +1 -0
  67. package/dist/{chunk-VJFMXYKP.js → chunk-E6YA6UAP.js} +2 -2
  68. package/dist/{chunk-WASHZV34.js → chunk-F23WQK3G.js} +65 -27
  69. package/dist/chunk-F23WQK3G.js.map +1 -0
  70. package/dist/{chunk-JIUVJ4M7.js → chunk-F7ZFRPGQ.js} +3 -3
  71. package/dist/{chunk-HXGUIPQB.js → chunk-FOG7YEJP.js} +3 -3
  72. package/dist/{chunk-QULVCV3M.js → chunk-GK4DRVUD.js} +6 -6
  73. package/dist/chunk-GK4DRVUD.js.map +1 -0
  74. package/dist/{chunk-BRVW2GS5.js → chunk-H36KSN6X.js} +87 -34
  75. package/dist/chunk-H36KSN6X.js.map +1 -0
  76. package/dist/{chunk-O2ERS4UJ.js → chunk-H4M7ADXY.js} +81 -52
  77. package/dist/chunk-H4M7ADXY.js.map +1 -0
  78. package/dist/{chunk-FZ6NYJ7L.js → chunk-H7HP56F6.js} +11 -8
  79. package/dist/chunk-H7HP56F6.js.map +1 -0
  80. package/dist/chunk-HK67PX4J.js +27 -0
  81. package/dist/chunk-HK67PX4J.js.map +1 -0
  82. package/dist/{chunk-X56RTUK3.js → chunk-HM4JSXX2.js} +3 -3
  83. package/dist/{chunk-AHLJSVRL.js → chunk-HTGRQZFB.js} +5 -7
  84. package/dist/chunk-HTGRQZFB.js.map +1 -0
  85. package/dist/{chunk-GQ3BX5EA.js → chunk-I3ISCYT7.js} +2 -2
  86. package/dist/{chunk-Q6TEJXBX.js → chunk-IESNYJXZ.js} +31 -49
  87. package/dist/chunk-IESNYJXZ.js.map +1 -0
  88. package/dist/{chunk-FUHKW252.js → chunk-J4MN6XIU.js} +2 -2
  89. package/dist/{chunk-ADW22QSB.js → chunk-J4UJ5FRV.js} +4 -4
  90. package/dist/{chunk-HNGSV2YC.js → chunk-JBIV4FLR.js} +67 -10
  91. package/dist/chunk-JBIV4FLR.js.map +1 -0
  92. package/dist/{chunk-HVQGCKY4.js → chunk-JVLSU7S2.js} +2 -2
  93. package/dist/{chunk-AR2JDFAE.js → chunk-KDJGJR7F.js} +2 -2
  94. package/dist/{chunk-NPP5R7FF.js → chunk-KN4W2OQ4.js} +22 -18
  95. package/dist/chunk-KN4W2OQ4.js.map +1 -0
  96. package/dist/{chunk-G6S5VVHP.js → chunk-L6GTLZRK.js} +10 -10
  97. package/dist/chunk-L6GTLZRK.js.map +1 -0
  98. package/dist/{chunk-2BMRJ6LQ.js → chunk-LF6DMX4C.js} +8 -11
  99. package/dist/{chunk-2BMRJ6LQ.js.map → chunk-LF6DMX4C.js.map} +1 -1
  100. package/dist/chunk-LFUID7OW.js +163 -0
  101. package/dist/chunk-LFUID7OW.js.map +1 -0
  102. package/dist/{chunk-747LRSOO.js → chunk-LKFKXS5K.js} +2 -2
  103. package/dist/{chunk-U5O6GIWZ.js → chunk-LR4Z47QD.js} +3 -3
  104. package/dist/{chunk-VZ3XFUQ7.js → chunk-MTBXJAS4.js} +16 -22
  105. package/dist/chunk-MTBXJAS4.js.map +1 -0
  106. package/dist/chunk-N4CNVSUF.js +66 -0
  107. package/dist/chunk-N4CNVSUF.js.map +1 -0
  108. package/dist/{chunk-RTAMLDWP.js → chunk-NLKLXXTO.js} +2 -2
  109. package/dist/{chunk-IGJCYUT5.js → chunk-NSITFOCJ.js} +1 -1
  110. package/dist/chunk-NSITFOCJ.js.map +1 -0
  111. package/dist/{chunk-FDX7OWWI.js → chunk-OPXR4PB2.js} +2 -2
  112. package/dist/{chunk-4GZ6XOVW.js → chunk-OWLVBOWO.js} +44 -42
  113. package/dist/chunk-OWLVBOWO.js.map +1 -0
  114. package/dist/{chunk-Z45YRGFO.js → chunk-P6ASQOZR.js} +2 -2
  115. package/dist/{chunk-5O5HRRTV.js → chunk-PCQDY6QN.js} +7 -7
  116. package/dist/{chunk-5O5HRRTV.js.map → chunk-PCQDY6QN.js.map} +1 -1
  117. package/dist/{chunk-BEFVYAR5.js → chunk-PGFKIOR3.js} +4 -4
  118. package/dist/chunk-PGFKIOR3.js.map +1 -0
  119. package/dist/{chunk-3FSX6LDG.js → chunk-POS53FG6.js} +18 -3
  120. package/dist/{chunk-3FSX6LDG.js.map → chunk-POS53FG6.js.map} +1 -1
  121. package/dist/{chunk-3IXIU6FP.js → chunk-PQ6Z2TAP.js} +7 -10
  122. package/dist/chunk-PQ6Z2TAP.js.map +1 -0
  123. package/dist/{chunk-CEJWMBXO.js → chunk-PUJTKLPL.js} +6 -2
  124. package/dist/chunk-PUJTKLPL.js.map +1 -0
  125. package/dist/{chunk-GAG7QOVO.js → chunk-QGJ4XIA7.js} +53 -18
  126. package/dist/chunk-QGJ4XIA7.js.map +1 -0
  127. package/dist/{chunk-2DHSSLOD.js → chunk-QHJKK77B.js} +13 -15
  128. package/dist/chunk-QHJKK77B.js.map +1 -0
  129. package/dist/{chunk-2Z3NCLNX.js → chunk-QI5NWLVW.js} +7 -7
  130. package/dist/{chunk-6SAFL5YE.js → chunk-RC4BROYR.js} +3 -3
  131. package/dist/{chunk-NJDQ4YSV.js → chunk-RDHUZ674.js} +4 -4
  132. package/dist/{chunk-YPYHVOXP.js → chunk-RK7N4OQ5.js} +2 -2
  133. package/dist/chunk-RK7N4OQ5.js.map +1 -0
  134. package/dist/{chunk-3737A6EA.js → chunk-S2VG3ABP.js} +127 -31
  135. package/dist/chunk-S2VG3ABP.js.map +1 -0
  136. package/dist/{chunk-3JVXVJ7L.js → chunk-S35S77YU.js} +10 -10
  137. package/dist/{chunk-KUDZVJKQ.js → chunk-SHILAQH5.js} +2 -2
  138. package/dist/{chunk-4UVDI4XE.js → chunk-T3PHCEN4.js} +4 -4
  139. package/dist/{chunk-55LKVALY.js → chunk-T7IR4N2S.js} +1 -3
  140. package/dist/chunk-T7IR4N2S.js.map +1 -0
  141. package/dist/{chunk-RXYYFSBB.js → chunk-TOV6VMHF.js} +6 -6
  142. package/dist/chunk-TOV6VMHF.js.map +1 -0
  143. package/dist/{chunk-W77KZHCW.js → chunk-TVIFAHZR.js} +16 -17
  144. package/dist/chunk-TVIFAHZR.js.map +1 -0
  145. package/dist/chunk-UBSFPGVJ.js +1 -0
  146. package/dist/{chunk-FAXZQ5UF.js → chunk-UCUALOSM.js} +2 -2
  147. package/dist/{chunk-4HDYQL3J.js → chunk-VAG47QHV.js} +2 -2
  148. package/dist/{chunk-35EBKWQU.js → chunk-VFIWDPXZ.js} +4 -4
  149. package/dist/{chunk-5ZKS6ZE2.js → chunk-VTG7327U.js} +4 -4
  150. package/dist/chunk-VTG7327U.js.map +1 -0
  151. package/dist/{chunk-VCETL77O.js → chunk-W5LHQXZU.js} +36 -7
  152. package/dist/chunk-W5LHQXZU.js.map +1 -0
  153. package/dist/{chunk-6NVPFKN3.js → chunk-WK5FSW7T.js} +92 -35
  154. package/dist/chunk-WK5FSW7T.js.map +1 -0
  155. package/dist/{chunk-HNHCQ556.js → chunk-WLLUM35R.js} +2 -2
  156. package/dist/{chunk-YJ6IONGA.js → chunk-X62MEF2O.js} +13 -5
  157. package/dist/chunk-X62MEF2O.js.map +1 -0
  158. package/dist/{chunk-7G6VDWXB.js → chunk-X67FCULK.js} +5 -5
  159. package/dist/chunk-X67FCULK.js.map +1 -0
  160. package/dist/{chunk-UHXCLPGC.js → chunk-XDVVBETV.js} +2 -2
  161. package/dist/chunk-XDVVBETV.js.map +1 -0
  162. package/dist/chunk-XJ3FEKEY.js +15 -0
  163. package/dist/chunk-XJ3FEKEY.js.map +1 -0
  164. package/dist/{chunk-E6427JU2.js → chunk-XSN63FUS.js} +19 -3
  165. package/dist/chunk-XSN63FUS.js.map +1 -0
  166. package/dist/{chunk-JRCYZEHU.js → chunk-XVU7J43V.js} +2 -2
  167. package/dist/{chunk-2GAJGUNM.js → chunk-Y3YLJORD.js} +408 -260
  168. package/dist/chunk-Y3YLJORD.js.map +1 -0
  169. package/dist/{chunk-6BU3L4UE.js → chunk-Y6GZ2P4M.js} +7 -10
  170. package/dist/chunk-Y6GZ2P4M.js.map +1 -0
  171. package/dist/{chunk-DMQCLZ4Z.js → chunk-YCSM3GZU.js} +2 -2
  172. package/dist/{chunk-RV3ARMPN.js → chunk-YKPGQJFU.js} +30 -180
  173. package/dist/chunk-YKPGQJFU.js.map +1 -0
  174. package/dist/{chunk-FMQJZH4R.js → chunk-YMLQBZFJ.js} +6 -6
  175. package/dist/{chunk-6HFM7EIT.js → chunk-YPSOHDNC.js} +2 -2
  176. package/dist/{chunk-CDB2HVQW.js → chunk-YXA2TCTZ.js} +14 -15
  177. package/dist/chunk-YXA2TCTZ.js.map +1 -0
  178. package/dist/{chunk-N35NC4JH.js → chunk-Z2PWOSCJ.js} +2 -2
  179. package/dist/{chunk-XWX7GL56.js → chunk-Z2WK53N6.js} +47 -23
  180. package/dist/chunk-Z2WK53N6.js.map +1 -0
  181. package/dist/{chunk-HPLWFNG4.js → chunk-Z7ZXZL6Y.js} +2 -2
  182. package/dist/{chunk-PNKHAKQ7.js → chunk-ZO252Q5S.js} +17 -10
  183. package/dist/chunk-ZO252Q5S.js.map +1 -0
  184. package/dist/classified/index.js +5 -5
  185. package/dist/{classified-marker-2KJAXRRO.js → classified-marker-BSQHU4JT.js} +3 -3
  186. package/dist/collection-facade-LG3NYZVB.js +45 -0
  187. package/dist/{computed-6G5M3UPH.js → computed-ASBNTLOK.js} +3 -3
  188. package/dist/consent/index.js +10 -10
  189. package/dist/cover/index.js +10 -3
  190. package/dist/custody/index.js +12 -11
  191. package/dist/{dead-filter-DCB62VWW.js → dead-filter-QKU56XTQ.js} +2 -2
  192. package/dist/debug/index.js +1 -1
  193. package/dist/{delegation-MO7YZYJS.js → delegation-XWRPYODW.js} +24 -23
  194. package/dist/delegation-XWRPYODW.js.map +1 -0
  195. package/dist/derivations/index.js +12 -12
  196. package/dist/derive-CXHCY46K.js +22 -0
  197. package/dist/directory/index.js +10 -10
  198. package/dist/{dispatch-MJ6SHB3Y.js → dispatch-4AP4PUZU.js} +18 -18
  199. package/dist/{dispatch-FZEAWKVM.js → dispatch-VR4LRXZ7.js} +9 -6
  200. package/dist/dispatch-VR4LRXZ7.js.map +1 -0
  201. package/dist/{enclave-JU4YIEPB.js → enclave-NYPT7WA7.js} +31 -9
  202. package/dist/executor-3KFRQETS.js +29 -0
  203. package/dist/executor-AFHQYRAU.js +9 -0
  204. package/dist/executor-YYDW6XQI.js +9 -0
  205. package/dist/export-accessible-BX2ILB4C.js +23 -0
  206. package/dist/extract-partition-UPOVITFI.js +38 -0
  207. package/dist/{fanout-sidecar-NNAJQXMX.js → fanout-sidecar-IWP3R4RC.js} +18 -27
  208. package/dist/fanout-sidecar-IWP3R4RC.js.map +1 -0
  209. package/dist/{fence-watcher-DHQ775JB.js → fence-watcher-ZVSMLKQD.js} +1 -1
  210. package/dist/fence-watcher-ZVSMLKQD.js.map +1 -0
  211. package/dist/find-SZBL2HPB.js +11 -0
  212. package/dist/forget/index.js +9 -9
  213. package/dist/guards/index.js +4 -4
  214. package/dist/history/index.js +23 -20
  215. package/dist/history/index.js.map +1 -1
  216. package/dist/i18n/index.js +14 -14
  217. package/dist/index.d.ts +35 -18
  218. package/dist/index.js +199 -204
  219. package/dist/index.js.map +1 -1
  220. package/dist/indexing/index.js +4 -4
  221. package/dist/introspection/index.js +12 -11
  222. package/dist/issue-G53NB6EW.js +19 -0
  223. package/dist/kernel/collection-config.d.ts +9 -9
  224. package/dist/kernel/collection.d.ts +9 -3
  225. package/dist/kernel/constants.d.ts +36 -0
  226. package/dist/kernel/enclave/crypto.d.ts +52 -4
  227. package/dist/kernel/enclave/index.d.ts +10 -3
  228. package/dist/kernel/enclave/record-aad.d.ts +131 -0
  229. package/dist/kernel/enclave/record-envelope.d.ts +76 -0
  230. package/dist/kernel/enclave/record-keys/envelope-body.d.ts +34 -2
  231. package/dist/kernel/enclave/record-keys/lifecycle.d.ts +22 -5
  232. package/dist/kernel/enclave/record-keys/record-codec.d.ts +47 -14
  233. package/dist/kernel/enclave/record-keys/rekey-blob.d.ts +88 -0
  234. package/dist/kernel/enclave/record-keys/rekey.d.ts +91 -0
  235. package/dist/kernel/enclave/record-keys/tombstone.d.ts +3 -2
  236. package/dist/kernel/errors.d.ts +134 -14
  237. package/dist/kernel/merge-authority.d.ts +25 -0
  238. package/dist/kernel/noydb.d.ts +33 -10
  239. package/dist/kernel/query/builder.d.ts +51 -4
  240. package/dist/kernel/query/join.d.ts +27 -0
  241. package/dist/kernel/query/live.d.ts +31 -9
  242. package/dist/kernel/query/predicate.d.ts +9 -0
  243. package/dist/kernel/refs.d.ts +3 -1
  244. package/dist/kernel/secret-mode.d.ts +1 -1
  245. package/dist/kernel/sync-policy.d.ts +0 -2
  246. package/dist/kernel/tier-visibility.d.ts +34 -0
  247. package/dist/kernel/types.d.ts +145 -28
  248. package/dist/kernel/vault.d.ts +16 -7
  249. package/dist/kernel/via/compose.d.ts +3 -3
  250. package/dist/kernel/via/index.d.ts +15 -6
  251. package/dist/kernel/via/pipeline.d.ts +6 -6
  252. package/dist/kernel/via/reconcile.d.ts +14 -2
  253. package/dist/kernel/via/taint-binding.d.ts +3 -3
  254. package/dist/{ledger-AETNF4OM.js → ledger-T5K4P2D7.js} +11 -11
  255. package/dist/liberate-VEOZRESE.js +25 -0
  256. package/dist/{link-set-E5HNY67I.js → link-set-76JZ6YB4.js} +11 -11
  257. package/dist/{managed-secret-CWQ6PND5.js → managed-secret-6YC32VXG.js} +13 -5
  258. package/dist/materialized-views/index.js +27 -27
  259. package/dist/migrate-cek-LBRKYUZZ.js +19 -0
  260. package/dist/migrate-cek-LBRKYUZZ.js.map +1 -0
  261. package/dist/money/index.js +5 -5
  262. package/dist/noydb-EDJA4JNJ.js +86 -0
  263. package/dist/on/index.js +1 -0
  264. package/dist/overlay-views/index.js +4 -4
  265. package/dist/periods/index.js +12 -12
  266. package/dist/pod/index.js +79 -88
  267. package/dist/pod-handle-P6DPBM5U.js +41 -0
  268. package/dist/pod-handle-P6DPBM5U.js.map +1 -0
  269. package/dist/policy/index.js +11 -4
  270. package/dist/port/as/active.d.ts +10 -0
  271. package/dist/port/as/index.d.ts +32 -0
  272. package/dist/port/as/types.d.ts +113 -0
  273. package/dist/port/at/index.d.ts +37 -0
  274. package/dist/port/by/default-provider.d.ts +3 -3
  275. package/dist/port/by/index.d.ts +32 -10
  276. package/dist/port/by/types.d.ts +29 -11
  277. package/dist/port/on/index.d.ts +50 -0
  278. package/dist/port/to/index.d.ts +4 -4
  279. package/dist/port/to/locator.d.ts +54 -8
  280. package/dist/port/with/computed-strategy.d.ts +1 -1
  281. package/dist/port/with/device-seal-strategy.d.ts +2 -2
  282. package/dist/port/with/formats-strategy.d.ts +76 -0
  283. package/dist/port/with/i18n-strategy.d.ts +4 -1
  284. package/dist/port/with/lookup-strategy.d.ts +4 -1
  285. package/dist/port/with/merge-authority.d.ts +52 -0
  286. package/dist/port/with/service-bus.d.ts +0 -4
  287. package/dist/port/with/strategies.d.ts +13 -5
  288. package/dist/port/with/team-strategy.d.ts +5 -1
  289. package/dist/portability/index.js +8 -8
  290. package/dist/{post-register-2XSSMGEQ.js → post-register-53O7AJRZ.js} +6 -6
  291. package/dist/query/index.js +6 -6
  292. package/dist/reduce/index.js +6 -6
  293. package/dist/register-6TCBR6XD.js +32 -0
  294. package/dist/registry-DH2L4O2V.js +18 -0
  295. package/dist/registry-IWFMXCHX.js +9 -0
  296. package/dist/registry-Q3FG3OAX.js +9 -0
  297. package/dist/registry-YC3IFG3A.js +19 -0
  298. package/dist/request-withdrawal-NM5VYR6F.js +31 -0
  299. package/dist/{reveal-BW36KCOQ.js → reveal-XBIMHAXR.js} +6 -6
  300. package/dist/revoke-MJNYWO72.js +24 -0
  301. package/dist/satellites/index.js +1 -1
  302. package/dist/schema-update/index.js +2 -2
  303. package/dist/sealed-record/index.js +20 -13
  304. package/dist/sealed-record/index.js.map +1 -1
  305. package/dist/search/index.js +4 -4
  306. package/dist/{seed-GDV5PT4R.js → seed-NSNIGYXE.js} +20 -22
  307. package/dist/seed-NSNIGYXE.js.map +1 -0
  308. package/dist/sequence/index.js +9 -9
  309. package/dist/session/index.js +10 -10
  310. package/dist/shadow/index.js +2 -2
  311. package/dist/share-link/index.js +1 -1
  312. package/dist/signer-6XVS2AU3.js +25 -0
  313. package/dist/snapshots/index.js +10 -10
  314. package/dist/snapshots/index.js.map +1 -1
  315. package/dist/{stale-ARHFVL5U.js → stale-MCS46TFO.js} +10 -10
  316. package/dist/storage-ZXUT476I.js +23 -0
  317. package/dist/storage-ZXUT476I.js.map +1 -0
  318. package/dist/{store-coordination-provider-GFCUOBR6.js → store-coordination-provider-6FM26VQM.js} +22 -15
  319. package/dist/store-coordination-provider-6FM26VQM.js.map +1 -0
  320. package/dist/sync/index.js +11 -11
  321. package/dist/team/index.js +17 -16
  322. package/dist/tiers/index.js +11 -10
  323. package/dist/to/index.js +17 -9
  324. package/dist/to/index.js.map +1 -1
  325. package/dist/transactions/index.js +4 -4
  326. package/dist/{ulid-PTAIMDG4.js → ulid-VQW6ERQN.js} +2 -2
  327. package/dist/ulid-VQW6ERQN.js.map +1 -0
  328. package/dist/util/index.js +1 -1
  329. package/dist/vault-diff-FE5J35NJ.js +9 -0
  330. package/dist/vault-diff-FE5J35NJ.js.map +1 -0
  331. package/dist/vault-head/index.js +115 -0
  332. package/dist/vault-head/index.js.map +1 -0
  333. package/dist/{verify-RO5RTZOJ.js → verify-WYOFLSNA.js} +5 -5
  334. package/dist/via/blob/binding.d.ts +6 -6
  335. package/dist/via/blob/index.d.ts +3 -0
  336. package/dist/via/classified/binding.d.ts +9 -9
  337. package/dist/via/computed/binding.d.ts +2 -2
  338. package/dist/via/i18n/binding.d.ts +4 -4
  339. package/dist/via/lookup/binding.d.ts +5 -5
  340. package/dist/via/lookup/handle.d.ts +4 -1
  341. package/dist/via/lookup/index.d.ts +1 -1
  342. package/dist/via/lookup/snapshot.d.ts +1 -1
  343. package/dist/via/money/binding.d.ts +3 -3
  344. package/dist/via/money/normalize.d.ts +1 -1
  345. package/dist/via/money/where.d.ts +3 -3
  346. package/dist/walk-JNEOYCAU.js +21 -0
  347. package/dist/walk-JNEOYCAU.js.map +1 -0
  348. package/dist/with-audit/periods/periods.d.ts +1 -1
  349. package/dist/with-audit/periods/strategy.d.ts +1 -1
  350. package/dist/with-audit/sealed-record/index.d.ts +13 -0
  351. package/dist/with-audit/tiers/index.d.ts +17 -2
  352. package/dist/with-cargo/adopt-partition.d.ts +7 -7
  353. package/dist/with-cargo/extract-partition.d.ts +1 -1
  354. package/dist/with-cargo/floor.d.ts +1 -1
  355. package/dist/with-cargo/index.d.ts +2 -2
  356. package/dist/with-commit/history/history.d.ts +26 -0
  357. package/dist/with-commit/history/index.d.ts +2 -1
  358. package/dist/with-commit/history/ledger/store.d.ts +7 -1
  359. package/dist/with-commit/history/strategy.d.ts +11 -1
  360. package/dist/with-commit/numbering/index.d.ts +0 -5
  361. package/dist/with-commit/vault-head/active.d.ts +2 -0
  362. package/dist/with-commit/vault-head/head.d.ts +28 -0
  363. package/dist/with-commit/vault-head/index.d.ts +10 -0
  364. package/dist/with-commit/vault-head/strategy.d.ts +127 -0
  365. package/dist/with-commit/vault-head/verify.d.ts +90 -0
  366. package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +4 -0
  367. package/dist/with-formula/materialized-views/projection-legs.d.ts +59 -0
  368. package/dist/with-formula/materialized-views/registry.d.ts +50 -0
  369. package/dist/with-formula/materialized-views/types.d.ts +68 -10
  370. package/dist/with-party/directory/cover/storage.d.ts +0 -8
  371. package/dist/with-party/directory/storage.d.ts +0 -11
  372. package/dist/with-party/directory/visibility.d.ts +0 -21
  373. package/dist/with-party/policy/storage.d.ts +0 -10
  374. package/dist/with-party/team/deed.d.ts +4 -4
  375. package/dist/with-party/team/device-seal.d.ts +5 -5
  376. package/dist/with-party/team/echo-ceremony.d.ts +2 -2
  377. package/dist/with-party/team/echo-secret.d.ts +4 -4
  378. package/dist/with-party/team/index.d.ts +3 -3
  379. package/dist/with-party/team/keyring.d.ts +141 -4
  380. package/dist/with-party/team/managed-secret.d.ts +21 -11
  381. package/dist/with-party/team/noydb-facade.d.ts +7 -3
  382. package/dist/with-party/team/{shamir-recovery-provider.d.ts → noydb-shamir.d.ts} +1 -1
  383. package/dist/with-party/team/recovery.d.ts +3 -3
  384. package/dist/with-party/team/roster-tag.d.ts +101 -0
  385. package/dist/with-party/team/rotate-recover.d.ts +5 -5
  386. package/dist/with-party/team/tiers.d.ts +2 -1
  387. package/dist/with-pod/format.d.ts +11 -13
  388. package/dist/with-pod/index.d.ts +10 -10
  389. package/dist/with-pod/open.d.ts +2 -2
  390. package/dist/with-pod/pod-handle.d.ts +19 -0
  391. package/dist/with-pod/pod-store.d.ts +0 -8
  392. package/dist/with-pod/{bundle.d.ts → pod.d.ts} +17 -25
  393. package/dist/with-pod/ulid.d.ts +1 -1
  394. package/dist/with-shape/blobs/blob-compaction.d.ts +13 -0
  395. package/dist/with-shape/blobs/blob-set.d.ts +83 -11
  396. package/dist/with-shape/blobs/orphan-report.d.ts +62 -0
  397. package/dist/with-shape/introspection/describe.d.ts +2 -2
  398. package/dist/with-shape/schema-update/fence-controller.d.ts +4 -4
  399. package/dist/with-shape/schema-update/fence-watcher.d.ts +4 -4
  400. package/dist/with-shape/schema-update/store-coordination-provider.d.ts +7 -6
  401. package/dist/with-sync/engine.d.ts +54 -5
  402. package/dist/with-sync/strategy.d.ts +3 -0
  403. package/dist/withdraw-accessible-ILTSXTIE.js +28 -0
  404. package/dist/withdraw-accessible-ILTSXTIE.js.map +1 -0
  405. package/package.json +29 -5
  406. package/dist/api-RXUMEKT3.js +0 -20
  407. package/dist/backup-KULFZ2T4.js.map +0 -1
  408. package/dist/bundle-handle-GFNHT52M.js +0 -36
  409. package/dist/bundle-handle-GFNHT52M.js.map +0 -1
  410. package/dist/chunk-2DHSSLOD.js.map +0 -1
  411. package/dist/chunk-2GAJGUNM.js.map +0 -1
  412. package/dist/chunk-3737A6EA.js.map +0 -1
  413. package/dist/chunk-3IXIU6FP.js.map +0 -1
  414. package/dist/chunk-3URQC7EH.js.map +0 -1
  415. package/dist/chunk-4GZ6XOVW.js.map +0 -1
  416. package/dist/chunk-4I72F5DF.js.map +0 -1
  417. package/dist/chunk-4VUPLMZ6.js.map +0 -1
  418. package/dist/chunk-52JPHN5N.js.map +0 -1
  419. package/dist/chunk-55LKVALY.js.map +0 -1
  420. package/dist/chunk-5JY5TSVY.js.map +0 -1
  421. package/dist/chunk-5ZKS6ZE2.js.map +0 -1
  422. package/dist/chunk-6BU3L4UE.js.map +0 -1
  423. package/dist/chunk-6NVPFKN3.js.map +0 -1
  424. package/dist/chunk-7F4DBNSP.js.map +0 -1
  425. package/dist/chunk-7G6VDWXB.js.map +0 -1
  426. package/dist/chunk-7H73RIE3.js +0 -45
  427. package/dist/chunk-7H73RIE3.js.map +0 -1
  428. package/dist/chunk-7MNBICB5.js.map +0 -1
  429. package/dist/chunk-AFHQATY4.js +0 -47
  430. package/dist/chunk-AFHQATY4.js.map +0 -1
  431. package/dist/chunk-AHLJSVRL.js.map +0 -1
  432. package/dist/chunk-BEFVYAR5.js.map +0 -1
  433. package/dist/chunk-BRVW2GS5.js.map +0 -1
  434. package/dist/chunk-BWVKEOPE.js.map +0 -1
  435. package/dist/chunk-CDB2HVQW.js.map +0 -1
  436. package/dist/chunk-CEJWMBXO.js.map +0 -1
  437. package/dist/chunk-DG27IUVI.js.map +0 -1
  438. package/dist/chunk-E6427JU2.js.map +0 -1
  439. package/dist/chunk-FFDNKRCY.js.map +0 -1
  440. package/dist/chunk-FZ6NYJ7L.js.map +0 -1
  441. package/dist/chunk-G6S5VVHP.js.map +0 -1
  442. package/dist/chunk-GAG7QOVO.js.map +0 -1
  443. package/dist/chunk-HNGSV2YC.js.map +0 -1
  444. package/dist/chunk-IGJCYUT5.js.map +0 -1
  445. package/dist/chunk-JJNOLSG5.js.map +0 -1
  446. package/dist/chunk-JRKZTEZZ.js.map +0 -1
  447. package/dist/chunk-MSWYQLMQ.js.map +0 -1
  448. package/dist/chunk-NPP5R7FF.js.map +0 -1
  449. package/dist/chunk-O2ERS4UJ.js.map +0 -1
  450. package/dist/chunk-PDLLCOGD.js.map +0 -1
  451. package/dist/chunk-PL2GHSCM.js.map +0 -1
  452. package/dist/chunk-PNKHAKQ7.js.map +0 -1
  453. package/dist/chunk-Q6TEJXBX.js.map +0 -1
  454. package/dist/chunk-QULVCV3M.js.map +0 -1
  455. package/dist/chunk-RV3ARMPN.js.map +0 -1
  456. package/dist/chunk-RXYYFSBB.js.map +0 -1
  457. package/dist/chunk-UHXCLPGC.js.map +0 -1
  458. package/dist/chunk-VCETL77O.js.map +0 -1
  459. package/dist/chunk-VZ3XFUQ7.js.map +0 -1
  460. package/dist/chunk-W77KZHCW.js.map +0 -1
  461. package/dist/chunk-WASHZV34.js.map +0 -1
  462. package/dist/chunk-WFUIE565.js.map +0 -1
  463. package/dist/chunk-XWX7GL56.js.map +0 -1
  464. package/dist/chunk-YJ6IONGA.js.map +0 -1
  465. package/dist/chunk-YPYHVOXP.js.map +0 -1
  466. package/dist/chunk-ZJADGNYF.js.map +0 -1
  467. package/dist/collection-facade-QEJIM6BC.js +0 -45
  468. package/dist/delegation-MO7YZYJS.js.map +0 -1
  469. package/dist/derive-IUA6JFLB.js +0 -22
  470. package/dist/dispatch-FZEAWKVM.js.map +0 -1
  471. package/dist/executor-CYJQLKKI.js +0 -9
  472. package/dist/executor-S4QIKEHW.js +0 -9
  473. package/dist/executor-YIQB2S6N.js +0 -29
  474. package/dist/export-accessible-4S36PQNR.js +0 -23
  475. package/dist/extract-partition-IO7FDZ2P.js +0 -38
  476. package/dist/fanout-sidecar-NNAJQXMX.js.map +0 -1
  477. package/dist/fence-watcher-DHQ775JB.js.map +0 -1
  478. package/dist/find-RBBYKXI7.js +0 -11
  479. package/dist/issue-RIVHSY2S.js +0 -19
  480. package/dist/liberate-GFN4C7RR.js +0 -24
  481. package/dist/noydb-ASEXNJS6.js +0 -83
  482. package/dist/register-4EFJCVYD.js +0 -32
  483. package/dist/registry-4SDHHOJ7.js +0 -18
  484. package/dist/registry-CZVINVQH.js +0 -9
  485. package/dist/registry-IKUR2MXD.js +0 -9
  486. package/dist/registry-OYTFGWVK.js +0 -19
  487. package/dist/request-withdrawal-KGXGDPVQ.js +0 -31
  488. package/dist/revoke-JFN773KF.js +0 -24
  489. package/dist/seed-GDV5PT4R.js.map +0 -1
  490. package/dist/signer-TA55QB6R.js +0 -25
  491. package/dist/storage-V7MTFAQJ.js +0 -23
  492. package/dist/store-coordination-provider-GFCUOBR6.js.map +0 -1
  493. package/dist/walk-3ZECBFDA.js +0 -21
  494. package/dist/with-pod/bundle-handle.d.ts +0 -9
  495. package/dist/withdraw-accessible-7PG4DYQK.js +0 -28
  496. /package/dist/{api-RXUMEKT3.js.map → api-EQYRTZO2.js.map} +0 -0
  497. /package/dist/{collection-facade-QEJIM6BC.js.map → at/index.js.map} +0 -0
  498. /package/dist/{computed-6G5M3UPH.js.map → by/index.js.map} +0 -0
  499. /package/dist/{chunk-YAWK6AWF.js.map → chunk-225O5CXQ.js.map} +0 -0
  500. /package/dist/{chunk-OF3L2SD6.js.map → chunk-3QARDAYW.js.map} +0 -0
  501. /package/dist/{chunk-W3TVWF6N.js.map → chunk-4A4TYISP.js.map} +0 -0
  502. /package/dist/{chunk-CCZJJ4I2.js.map → chunk-4G25SDQL.js.map} +0 -0
  503. /package/dist/{chunk-7TSYBD3E.js.map → chunk-5263OEM3.js.map} +0 -0
  504. /package/dist/{chunk-FNSMZQS4.js.map → chunk-5ACAVJUI.js.map} +0 -0
  505. /package/dist/{chunk-VMCCGUQB.js.map → chunk-7LYUJNU3.js.map} +0 -0
  506. /package/dist/{chunk-WLYIROCJ.js.map → chunk-AB5P32RE.js.map} +0 -0
  507. /package/dist/{chunk-SUFG5E73.js.map → chunk-ALUNQEBY.js.map} +0 -0
  508. /package/dist/{chunk-CADUYBQD.js.map → chunk-ATL3ZVXT.js.map} +0 -0
  509. /package/dist/{chunk-6FJWSWFT.js.map → chunk-DBNYPLWY.js.map} +0 -0
  510. /package/dist/{chunk-VJFMXYKP.js.map → chunk-E6YA6UAP.js.map} +0 -0
  511. /package/dist/{chunk-JIUVJ4M7.js.map → chunk-F7ZFRPGQ.js.map} +0 -0
  512. /package/dist/{chunk-HXGUIPQB.js.map → chunk-FOG7YEJP.js.map} +0 -0
  513. /package/dist/{chunk-X56RTUK3.js.map → chunk-HM4JSXX2.js.map} +0 -0
  514. /package/dist/{chunk-GQ3BX5EA.js.map → chunk-I3ISCYT7.js.map} +0 -0
  515. /package/dist/{chunk-FUHKW252.js.map → chunk-J4MN6XIU.js.map} +0 -0
  516. /package/dist/{chunk-ADW22QSB.js.map → chunk-J4UJ5FRV.js.map} +0 -0
  517. /package/dist/{chunk-HVQGCKY4.js.map → chunk-JVLSU7S2.js.map} +0 -0
  518. /package/dist/{chunk-AR2JDFAE.js.map → chunk-KDJGJR7F.js.map} +0 -0
  519. /package/dist/{chunk-747LRSOO.js.map → chunk-LKFKXS5K.js.map} +0 -0
  520. /package/dist/{chunk-U5O6GIWZ.js.map → chunk-LR4Z47QD.js.map} +0 -0
  521. /package/dist/{chunk-RTAMLDWP.js.map → chunk-NLKLXXTO.js.map} +0 -0
  522. /package/dist/{chunk-FDX7OWWI.js.map → chunk-OPXR4PB2.js.map} +0 -0
  523. /package/dist/{chunk-Z45YRGFO.js.map → chunk-P6ASQOZR.js.map} +0 -0
  524. /package/dist/{chunk-2Z3NCLNX.js.map → chunk-QI5NWLVW.js.map} +0 -0
  525. /package/dist/{chunk-6SAFL5YE.js.map → chunk-RC4BROYR.js.map} +0 -0
  526. /package/dist/{chunk-NJDQ4YSV.js.map → chunk-RDHUZ674.js.map} +0 -0
  527. /package/dist/{chunk-3JVXVJ7L.js.map → chunk-S35S77YU.js.map} +0 -0
  528. /package/dist/{chunk-KUDZVJKQ.js.map → chunk-SHILAQH5.js.map} +0 -0
  529. /package/dist/{chunk-4UVDI4XE.js.map → chunk-T3PHCEN4.js.map} +0 -0
  530. /package/dist/{derive-IUA6JFLB.js.map → chunk-UBSFPGVJ.js.map} +0 -0
  531. /package/dist/{chunk-FAXZQ5UF.js.map → chunk-UCUALOSM.js.map} +0 -0
  532. /package/dist/{chunk-4HDYQL3J.js.map → chunk-VAG47QHV.js.map} +0 -0
  533. /package/dist/{chunk-35EBKWQU.js.map → chunk-VFIWDPXZ.js.map} +0 -0
  534. /package/dist/{chunk-HNHCQ556.js.map → chunk-WLLUM35R.js.map} +0 -0
  535. /package/dist/{chunk-JRCYZEHU.js.map → chunk-XVU7J43V.js.map} +0 -0
  536. /package/dist/{chunk-DMQCLZ4Z.js.map → chunk-YCSM3GZU.js.map} +0 -0
  537. /package/dist/{chunk-FMQJZH4R.js.map → chunk-YMLQBZFJ.js.map} +0 -0
  538. /package/dist/{chunk-6HFM7EIT.js.map → chunk-YPSOHDNC.js.map} +0 -0
  539. /package/dist/{chunk-N35NC4JH.js.map → chunk-Z2PWOSCJ.js.map} +0 -0
  540. /package/dist/{chunk-HPLWFNG4.js.map → chunk-Z7ZXZL6Y.js.map} +0 -0
  541. /package/dist/{classified-marker-2KJAXRRO.js.map → classified-marker-BSQHU4JT.js.map} +0 -0
  542. /package/dist/{enclave-JU4YIEPB.js.map → collection-facade-LG3NYZVB.js.map} +0 -0
  543. /package/dist/{executor-CYJQLKKI.js.map → computed-ASBNTLOK.js.map} +0 -0
  544. /package/dist/{dead-filter-DCB62VWW.js.map → dead-filter-QKU56XTQ.js.map} +0 -0
  545. /package/dist/{executor-S4QIKEHW.js.map → derive-CXHCY46K.js.map} +0 -0
  546. /package/dist/{dispatch-MJ6SHB3Y.js.map → dispatch-4AP4PUZU.js.map} +0 -0
  547. /package/dist/{executor-YIQB2S6N.js.map → enclave-NYPT7WA7.js.map} +0 -0
  548. /package/dist/{export-accessible-4S36PQNR.js.map → executor-3KFRQETS.js.map} +0 -0
  549. /package/dist/{extract-partition-IO7FDZ2P.js.map → executor-AFHQYRAU.js.map} +0 -0
  550. /package/dist/{find-RBBYKXI7.js.map → executor-YYDW6XQI.js.map} +0 -0
  551. /package/dist/{issue-RIVHSY2S.js.map → export-accessible-BX2ILB4C.js.map} +0 -0
  552. /package/dist/{ledger-AETNF4OM.js.map → extract-partition-UPOVITFI.js.map} +0 -0
  553. /package/dist/{liberate-GFN4C7RR.js.map → find-SZBL2HPB.js.map} +0 -0
  554. /package/dist/{link-set-E5HNY67I.js.map → issue-G53NB6EW.js.map} +0 -0
  555. /package/dist/{managed-secret-CWQ6PND5.js.map → ledger-T5K4P2D7.js.map} +0 -0
  556. /package/dist/{noydb-ASEXNJS6.js.map → liberate-VEOZRESE.js.map} +0 -0
  557. /package/dist/{register-4EFJCVYD.js.map → link-set-76JZ6YB4.js.map} +0 -0
  558. /package/dist/{registry-4SDHHOJ7.js.map → managed-secret-6YC32VXG.js.map} +0 -0
  559. /package/dist/{registry-CZVINVQH.js.map → noydb-EDJA4JNJ.js.map} +0 -0
  560. /package/dist/{registry-IKUR2MXD.js.map → on/index.js.map} +0 -0
  561. /package/dist/{post-register-2XSSMGEQ.js.map → post-register-53O7AJRZ.js.map} +0 -0
  562. /package/dist/{registry-OYTFGWVK.js.map → register-6TCBR6XD.js.map} +0 -0
  563. /package/dist/{request-withdrawal-KGXGDPVQ.js.map → registry-DH2L4O2V.js.map} +0 -0
  564. /package/dist/{revoke-JFN773KF.js.map → registry-IWFMXCHX.js.map} +0 -0
  565. /package/dist/{signer-TA55QB6R.js.map → registry-Q3FG3OAX.js.map} +0 -0
  566. /package/dist/{stale-ARHFVL5U.js.map → registry-YC3IFG3A.js.map} +0 -0
  567. /package/dist/{storage-V7MTFAQJ.js.map → request-withdrawal-NM5VYR6F.js.map} +0 -0
  568. /package/dist/{reveal-BW36KCOQ.js.map → reveal-XBIMHAXR.js.map} +0 -0
  569. /package/dist/{ulid-PTAIMDG4.js.map → revoke-MJNYWO72.js.map} +0 -0
  570. /package/dist/{walk-3ZECBFDA.js.map → signer-6XVS2AU3.js.map} +0 -0
  571. /package/dist/{withdraw-accessible-7PG4DYQK.js.map → stale-MCS46TFO.js.map} +0 -0
  572. /package/dist/{verify-RO5RTZOJ.js.map → verify-WYOFLSNA.js.map} +0 -0
@@ -4,7 +4,7 @@
4
4
  * A **Deed** is a vault owned by a *latent* principal who never
5
5
  * authenticates. The owner credential (the random secret that
6
6
  * derives `KEK_owner`) is minted machine-side and sealed under a
7
- * **non-firm** {@link SealingKeyProvider} — that sealing boundary is
7
+ * **non-firm** {@link NoydbSealer} — that sealing boundary is
8
8
  * the cryptographic *inalienability anchor*: whoever holds the
9
9
  * provider (the client / their KMS) is the only party that can ever
10
10
  * re-derive `KEK_owner`. A firm-side custodian operates the vault
@@ -30,7 +30,7 @@
30
30
  */
31
31
  import type { NoydbStore } from '../../kernel/types.js';
32
32
  import type { UnlockedKeyring } from './keyring.js';
33
- import type { SealingKeyProvider } from './managed-secret.js';
33
+ import type { NoydbSealer } from './managed-secret.js';
34
34
  /** Reserved id for the Deed marker under `_meta`. */
35
35
  export declare const DEED_RECORD_ID: "deed";
36
36
  /**
@@ -43,7 +43,7 @@ export interface DeedMarker {
43
43
  /** The latent owner principal — the user id of the `_keyring/<id>` owner file. */
44
44
  readonly ownerUserId: string;
45
45
  /**
46
- * The `SealingKeyProvider.id` the owner credential is sealed under.
46
+ * The `NoydbSealer.id` the owner credential is sealed under.
47
47
  * The inalienability anchor: only the holder of this (non-firm)
48
48
  * provider can re-derive `KEK_owner`. Audit metadata — never secret.
49
49
  */
@@ -74,7 +74,7 @@ export interface DeedMarker {
74
74
  * There is deliberately no firm-controlled fallback: the marker's
75
75
  * `sealedUnder` is the single cryptographic anchor of ownership.
76
76
  */
77
- export declare function createDeedOwner(store: NoydbStore, vault: string, ownerUserId: string, sealing: SealingKeyProvider): Promise<UnlockedKeyring>;
77
+ export declare function createDeedOwner(store: NoydbStore, vault: string, ownerUserId: string, sealing: NoydbSealer): Promise<UnlockedKeyring>;
78
78
  /**
79
79
  * Read the {@link DeedMarker} from `_meta/deed`, or `null` if the vault
80
80
  * has no Deed marker (i.e. it is not a Deed vault). Plaintext read — no
@@ -1,20 +1,20 @@
1
- import type { DeviceSealProvider } from '../../port/with/device-seal-strategy.js';
1
+ import type { NoydbDeviceSeal } from '../../port/with/device-seal-strategy.js';
2
2
  /**
3
3
  * Device-local sealer for the echo reveal-blob (spec decision 5).
4
- * DISTINCT from `SealingKeyProvider` (managed-secret mode, which seals
4
+ * DISTINCT from `NoydbSealer` (managed-secret mode, which seals
5
5
  * the WHOLE secret): this seals only the echo part, and only so an
6
6
  * enrolled device can display it during the unlock ceremony. The
7
7
  * sealed bytes may sit in the (untrusted) keyring file — attacker-B
8
8
  * resistance comes from `unseal` requiring this device's key store.
9
9
  *
10
10
  * The interface itself is declared on the `/with` port
11
- * ({@link DeviceSealProvider} from `port/with/device-seal-strategy.js`)
11
+ * ({@link NoydbDeviceSeal} from `port/with/device-seal-strategy.js`)
12
12
  * so the kernel spine can reference it without a static spine→service
13
13
  * import; re-exported here as the canonical consumer-facing home.
14
14
  */
15
- export type { DeviceSealProvider };
15
+ export type { NoydbDeviceSeal };
16
16
  /** In-memory test provider — AES-GCM under a per-instance random key. */
17
- export declare class MemoryDeviceSealProvider implements DeviceSealProvider {
17
+ export declare class MemoryDeviceSeal implements NoydbDeviceSeal {
18
18
  readonly id: string;
19
19
  private readonly keyPromise;
20
20
  constructor(opts: {
@@ -15,13 +15,13 @@
15
15
  * @module
16
16
  */
17
17
  import type { NoydbStore } from '../../kernel/types.js';
18
- import type { DeviceSealProvider } from './device-seal.js';
18
+ import type { NoydbDeviceSeal } from './device-seal.js';
19
19
  import { type UnlockedKeyring } from './keyring.js';
20
20
  /** Options for {@link beginEchoUnlock}. */
21
21
  export interface BeginEchoUnlockOptions {
22
22
  readonly userId: string;
23
23
  readonly prompt: string;
24
- readonly deviceSeal?: DeviceSealProvider;
24
+ readonly deviceSeal?: NoydbDeviceSeal;
25
25
  }
26
26
  /**
27
27
  * A prompt-verified, in-progress echo unlock. Stateless w.r.t. attempts —
@@ -11,7 +11,7 @@
11
11
  * - Building the reveal blob per the hybrid reveal policy (spec decision
12
12
  * 4): `portable` (AES-GCM under the prompt, own salt), `sealed`
13
13
  * (opaque to hub, unsealed only by the enrolling device's
14
- * {@link DeviceSealProvider}), or `none`.
14
+ * {@link NoydbDeviceSeal}), or `none`.
15
15
  * - Resolving the echo for display (`resolveEchoReveal`, `null` ⇒
16
16
  * degraded typed-echo path) and verifying a typed echo
17
17
  * (`verifyTypedEcho`) for that degraded path.
@@ -30,14 +30,14 @@
30
30
  */
31
31
  import { type EchoSecretParts } from '../../kernel/enclave/index.js';
32
32
  import type { KeyringEchoBlock } from '../../kernel/types.js';
33
- import type { DeviceSealProvider } from './device-seal.js';
33
+ import type { NoydbDeviceSeal } from './device-seal.js';
34
34
  /** Same iteration floor as the KEK (spec resolved question 1). */
35
35
  export declare const ECHO_KDF_ITERATIONS = 600000;
36
36
  export type EchoRevealChoice = {
37
37
  readonly kind: 'portable';
38
38
  } | {
39
39
  readonly kind: 'sealed';
40
- readonly deviceSeal: DeviceSealProvider;
40
+ readonly deviceSeal: NoydbDeviceSeal;
41
41
  } | {
42
42
  readonly kind: 'none';
43
43
  };
@@ -52,5 +52,5 @@ export declare function verifyPrompt(block: KeyringEchoBlock, prompt: string): P
52
52
  * @throws WrongPromptError when the prompt cannot open the portable reveal
53
53
  * (callers should verifyPrompt first for a boolean check).
54
54
  */
55
- export declare function resolveEchoReveal(block: KeyringEchoBlock, prompt: string, deviceSeal?: DeviceSealProvider): Promise<string | null>;
55
+ export declare function resolveEchoReveal(block: KeyringEchoBlock, prompt: string, deviceSeal?: NoydbDeviceSeal): Promise<string | null>;
56
56
  export declare function verifyTypedEcho(block: KeyringEchoBlock, echo: string): Promise<boolean>;
@@ -17,7 +17,7 @@ export { NO_TEAM, type TeamStrategy } from './strategy.js';
17
17
  export { TeamNotEnabledError } from '../../kernel/errors.js';
18
18
  export type { UnlockedKeyring } from './keyring.js';
19
19
  export { loadKeyring, createOwnerKeyring, grant, revoke, changeSecret, listUsers, listUsersWithEnvelopes, ensureCollectionDEK, persistKeyring, updateKeyringIdentity, buildRecipientKeyringFile, } from './keyring.js';
20
- export type { BundleRecipient, ListUsersOptions } from './keyring.js';
20
+ export type { PodRecipient, ListUsersOptions } from './keyring.js';
21
21
  export type { LoadKeyringOptions, CreateOwnerKeyringOptions, RotateKeysOptions, ChangeSecretOptions, } from './keyring.js';
22
22
  export { enrollAuthenticator, removeAuthenticator, updateAuthenticator, findAuthenticator, } from './authenticators.js';
23
23
  export type { EnrollAuthenticatorOptions, EnrollAuthenticatorWrappingKEKOptions, EnrollAuthenticatorWrappingDEKsOptions, UpdateAuthenticatorOptions, } from './authenticators.js';
@@ -36,8 +36,8 @@ export { buildEchoBlock, verifyPrompt, resolveEchoReveal, verifyTypedEcho, } fro
36
36
  export type { EchoRevealChoice } from './echo-secret.js';
37
37
  export { beginEchoUnlock } from './echo-ceremony.js';
38
38
  export type { BeginEchoUnlockOptions, EchoCeremony } from './echo-ceremony.js';
39
- export { MemoryDeviceSealProvider } from './device-seal.js';
40
- export type { DeviceSealProvider } from './device-seal.js';
39
+ export { MemoryDeviceSeal } from './device-seal.js';
40
+ export type { NoydbDeviceSeal } from './device-seal.js';
41
41
  export type { EchoSecretParts } from '../../kernel/enclave/index.js';
42
42
  export type { KeyringEchoBlock, NoydbStore } from '../../kernel/types.js';
43
43
  export { describeAuthConfig, diagramAuthConfig, describeUserAuth, describeAllUsersAuth, } from '../auth-introspection/index.js';
@@ -1,7 +1,8 @@
1
1
  import type { NoydbStore, KeyringFile, KeyringAuthenticator, Role, Permissions, GrantOptions, RevokeOptions, UpdateUserOptions, UserInfo, EncryptedEnvelope, ExportCapability, ExportFormat, ImportCapability, VaultPolicyOnDisk, UserEnvelope } from '../../kernel/types.js';
2
2
  import { type EnclaveKey, type EchoSecretParts } from '../../kernel/enclave/index.js';
3
+ import type { KeyringTamperedReason } from '../../kernel/errors.js';
3
4
  import { type SecretPolicy, type EchoSecretPolicy } from '../../kernel/validation.js';
4
- import type { DeviceSealProvider } from './device-seal.js';
5
+ import type { NoydbDeviceSeal } from './device-seal.js';
5
6
  /** In-memory representation of an unlocked keyring. */
6
7
  export interface UnlockedKeyring {
7
8
  readonly userId: string;
@@ -9,6 +10,11 @@ export interface UnlockedKeyring {
9
10
  readonly role: Role;
10
11
  readonly permissions: Permissions;
11
12
  readonly deks: Map<string, EnclaveKey>;
13
+ /**
14
+ * Unwrapped counterpart of {@link KeyringFile.pending_deks} — an
15
+ * uncommitted rotation (#1074). Empty in the normal state.
16
+ */
17
+ readonly pendingDeks?: Map<string, EnclaveKey> | undefined;
12
18
  /**
13
19
  * The KEK, when this keyring was unlocked via tier 1 (secret) or
14
20
  * a wrap-KEK tier-2 method (WebAuthn / OIDC). `null` when the
@@ -72,6 +78,23 @@ export interface UnlockedKeyring {
72
78
  }
73
79
  /** Mint a fresh wrapped-canary string. Deterministic for a given KEK. */
74
80
  export declare function mintKeyringCanary(kek: EnclaveKey): Promise<string>;
81
+ /**
82
+ * The vault roster key held by this keyring, or `null` when the keyring
83
+ * carries none.
84
+ *
85
+ * Null is expected on the resume-style paths (`kek: null` sessions, tier-3
86
+ * PIN resume, plaintext mode) — none of which may write a keyring file.
87
+ * Every stamping site null-guards this exactly as it guards `kek`: minting a
88
+ * file without a verifiable `roster_tag` would be worse than refusing, since
89
+ * it is indistinguishable on the next load from a store having stripped it.
90
+ */
91
+ export declare function rosterKeyOf(keyring: UnlockedKeyring): EnclaveKey | null;
92
+ /**
93
+ * Shared wording for the stamping-site guards — mirrors the `kek` guard's shape.
94
+ * Exported so every roster-stamping site in the hub raises ONE error with one
95
+ * wording, rather than each hand-copying it (`peer-recover`, `liberate`).
96
+ */
97
+ export declare function requireRosterKey(keyring: UnlockedKeyring, fn: string): EnclaveKey;
75
98
  /** Options for {@link loadKeyring} (#846b). */
76
99
  export interface LoadKeyringOptions {
77
100
  /** The user whose keyring to unlock. */
@@ -142,7 +165,7 @@ export interface CreateOwnerKeyringOptions extends SecretPolicy {
142
165
  * ⇒ `reveal: 'sealed'` (attacker-B resistance); absent ⇒ `reveal:
143
166
  * 'portable'` (spec resolved question 4). Ignored for a string secret.
144
167
  */
145
- readonly deviceSeal?: DeviceSealProvider;
168
+ readonly deviceSeal?: NoydbDeviceSeal;
146
169
  /** Echo enrollment only: optional display hint for the masked echo. */
147
170
  readonly echoMaskHint?: string;
148
171
  /**
@@ -168,6 +191,100 @@ export declare function createOwnerKeyring(store: NoydbStore, vault: string, opt
168
191
  export declare function grant(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: GrantOptions): Promise<void>;
169
192
  /** Revoke a user's access. Optionally rotate keys for affected collections. */
170
193
  export declare function revoke(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: RevokeOptions): Promise<void>;
194
+ /** What {@link verifyRoster} found. */
195
+ export interface RosterVerifyResult {
196
+ /**
197
+ * How many `_keyring` files were examined.
198
+ *
199
+ * Reported first, and deliberately: "nothing unverified" is equally true of a
200
+ * sweep that examined nothing, and a roster check that silently covered zero
201
+ * members would look identical to a healthy vault. Same lesson as the vault
202
+ * head's `no-expectations` verdict (#1101).
203
+ */
204
+ readonly checked: number;
205
+ /** The files that failed authentication, and why. */
206
+ readonly unverified: ReadonlyArray<{
207
+ readonly userId: string;
208
+ readonly reason: KeyringTamperedReason;
209
+ }>;
210
+ }
211
+ export declare function verifyRoster(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring): Promise<RosterVerifyResult>;
212
+ /** What {@link quarantineKeyring} did. */
213
+ export interface QuarantineResult {
214
+ readonly userId: string;
215
+ /** Why the file could not be authenticated — the justification for removing it. */
216
+ readonly reason: KeyringTamperedReason;
217
+ /** Collections re-keyed as part of the removal. */
218
+ readonly rotated: readonly string[];
219
+ /**
220
+ * (member, collection) pairs whose access the rotation dropped — the OTHER
221
+ * members, who must be re-granted.
222
+ *
223
+ * Passed through from `rotateKeys` rather than discarded, because a
224
+ * quarantine rotates broadly (see the scope note on the function) and so
225
+ * de-provisions more people than the one being removed. An operator who is
226
+ * not told this discovers it as unrelated `NoAccessError`s later.
227
+ */
228
+ readonly needsRegrant: RotateResult['needsRegrant'];
229
+ /**
230
+ * OTHER members whose own files also failed authentication, found while
231
+ * rotating. One forged file is rarely the only one, and the operator is
232
+ * already holding the tool for them.
233
+ */
234
+ readonly alsoUnverified: RotateResult['unverified'];
235
+ }
236
+ /**
237
+ * Remove a `_keyring` file that cannot be authenticated, and re-key behind it
238
+ * (#1121).
239
+ *
240
+ * ## Why this is not a flag on `revoke`
241
+ *
242
+ * `revoke` reads the target's own `role` to decide whether the caller may
243
+ * revoke them, so it cannot act on a file it will not trust — which left a
244
+ * forged file removable only by editing the store by hand. Relaxing `revoke`
245
+ * conditionally would grow the safe path a parameter that turns it into the
246
+ * dangerous one; ADR 0003's standing rule is that if the implementation needs
247
+ * to weaken a guard, the design is wrong. This is a separate operation with its
248
+ * own contract, so `revoke`'s invariant stays absolute and the dangerous act is
249
+ * named at the call site rather than hidden in an option bag.
250
+ *
251
+ * ## The two properties that keep it from being a backdoor
252
+ *
253
+ * 1. **It refuses a file that verifies.** Otherwise it would delete any keyring
254
+ * while ignoring `canRevoke` — including an owner's, which `revoke` protects
255
+ * unconditionally.
256
+ * 2. **Because of (1) it can safely ignore the claimed `role` — and it must.**
257
+ * `canRevoke` refuses any target whose role reads `owner`, so a store that
258
+ * forged `"role":"owner"` onto its victim would otherwise make them
259
+ * permanently unremovable. Consulting the forged field is exactly the
260
+ * mistake this operation exists to avoid.
261
+ *
262
+ * Owner-only: the narrowest role that can always act, and quarantine
263
+ * deliberately consumes NO field of the file it is removing.
264
+ *
265
+ * ## Why it rotates, and why the scope comes from the CALLER
266
+ *
267
+ * Deleting the file is not a revocation — the store may decline the delete, and
268
+ * the member may already hold unwrapped DEKs. So this rotates, exactly as
269
+ * `revoke` does. The scope is every collection the CALLER holds, not the
270
+ * target's DEK map: that map is unauthenticated (#1115), so deriving the scope
271
+ * from it would let the store choose which collections survive a quarantine.
272
+ *
273
+ * ⚠️ **That is the security-correct scope, and it is NOT free.** An earlier
274
+ * draft of this comment called over-rotating "the safe direction"; a review
275
+ * probe disproved it. Rotation re-keys `store.list(vault, <name>)` plus the
276
+ * derived refs `rotateKeys` knows about, so a DEK slot whose ciphertext lives
277
+ * under a *different* collection name — `_blob`, whose data sits in
278
+ * `_blob_index`/`_blob_chunks`, and the `collection#tier` slots — is re-keyed
279
+ * without its data being re-encrypted, and that data then fails to open. That
280
+ * gap belongs to `rotateKeys` (it is reachable through an ordinary `revoke` of
281
+ * a whole-vault grantee, with no quarantine involved) and is filed as #1122,
282
+ * but a quarantine takes the maximal scope *unconditionally*, so it meets the
283
+ * gap every time rather than occasionally. Until that is fixed, treat a
284
+ * quarantine as an emergency operation with a real blast radius, and read
285
+ * `needsRegrant` afterwards.
286
+ */
287
+ export declare function quarantineKeyring(store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, userId: string): Promise<QuarantineResult>;
171
288
  /**
172
289
  * Mutate `role`, `displayName`, and/or `permissions` on an existing
173
290
  * keyring. Pure plaintext-header rewrite — no DEK rewrap, no KEK
@@ -217,6 +334,26 @@ export interface RotateResult {
217
334
  readonly userId: string;
218
335
  readonly collection: string;
219
336
  }>;
337
+ /**
338
+ * Members skipped because their `_keyring` file failed roster verification
339
+ * (#1114).
340
+ *
341
+ * Rotation hands a member re-wrapped DEKs, so skipping one gives them
342
+ * **less**, never more: the file is left untouched and its wrappings for the
343
+ * rotated collections go stale. That is the same fail-closed end state as
344
+ * `needsRegrant`, but it needs a different remedy and so gets a different
345
+ * field — a `needsRegrant` entry is fixed by `grant()`, whereas one of these
346
+ * is a file that no longer authenticates and cannot be repaired by granting
347
+ * over it.
348
+ *
349
+ * Before this existed, one such file threw and took `revoke` and
350
+ * `rotateKeys` down vault-wide — the two operations most needed when a
351
+ * roster is suspect.
352
+ */
353
+ readonly unverified: ReadonlyArray<{
354
+ readonly userId: string;
355
+ readonly reason: KeyringTamperedReason;
356
+ }>;
220
357
  }
221
358
  /** Options for {@link rotateKeys} (#846b — was a bare `string[]`). */
222
359
  export interface RotateKeysOptions {
@@ -261,7 +398,7 @@ export interface EchoRecipientSecret extends EchoSecretParts {
261
398
  *
262
399
  * @public
263
400
  */
264
- export interface BundleRecipient {
401
+ export interface PodRecipient {
265
402
  /** User id stamped onto the keyring file in the bundle. */
266
403
  readonly id: string;
267
404
  /** Optional display name. Defaults to `id`. */
@@ -312,7 +449,7 @@ export interface BundleRecipient {
312
449
  *
313
450
  * @internal
314
451
  */
315
- export declare function buildRecipientKeyringFile(callerKeyring: UnlockedKeyring, recipient: BundleRecipient): Promise<KeyringFile>;
452
+ export declare function buildRecipientKeyringFile(callerKeyring: UnlockedKeyring, recipient: PodRecipient): Promise<KeyringFile>;
316
453
  /** List all users with access to a vault. */
317
454
  export declare function listUsers(store: NoydbStore, vault: string): Promise<UserInfo[]>;
318
455
  /**
@@ -3,16 +3,16 @@
3
3
  *
4
4
  * A vault mode where the secret is machine-generated and never
5
5
  * exposed to the user, sealed under a developer-provided
6
- * {@link SealingKeyProvider} (macOS Keychain, Windows Credential
6
+ * {@link NoydbSealer} (macOS Keychain, Windows Credential
7
7
  * Manager, libsecret, AWS KMS, …). The user has no secret to give
8
8
  * up to coercion — they can't reveal what they don't know.
9
9
  *
10
10
  * ## Components in this file
11
11
  *
12
- * - {@link SealingKeyProvider} — the interface concrete providers
12
+ * - {@link NoydbSealer} — the interface concrete providers
13
13
  * implement. Provider implementations live OUTSIDE hub (per-
14
14
  * platform packages).
15
- * - {@link MemorySealingKeyProvider} — in-memory test provider; uses
15
+ * - {@link MemorySealer} — in-memory test provider; uses
16
16
  * a deterministic per-instance "key" so two providers with
17
17
  * different ids cannot unseal each other's outputs.
18
18
  * - {@link RecipientHint} — public material a sender uses to seal
@@ -22,10 +22,10 @@
22
22
  * - {@link RecipientSealer} — interface for asymmetric/granted
23
23
  * providers that support recipient-target sealing (RSA-OAEP,
24
24
  * cloud-KMS asymmetric, etc.); distinct from self-only
25
- * {@link SealingKeyProvider} (macOS Keychain, WebAuthn-PRF).
25
+ * {@link NoydbSealer} (macOS Keychain, WebAuthn-PRF).
26
26
  * - {@link MemoryRecipientSealer} — in-process reference
27
27
  * implementation of both `RecipientSealer` and
28
- * `SealingKeyProvider` using real WebCrypto RSA-OAEP + AES-GCM;
28
+ * `NoydbSealer` using real WebCrypto RSA-OAEP + AES-GCM;
29
29
  * safe for tests and same-process sender/recipient scenarios.
30
30
  * - {@link loadSealedSecret} / {@link saveSealedSecret} —
31
31
  * plaintext envelope storage at `_meta/sealed-secret`.
@@ -66,7 +66,7 @@ import type { NoydbStore, RecipientSealer } from '../../kernel/types.js';
66
66
  * | Linux | `@noy-db/seal-libsecret` | libsecret / secret-service |
67
67
  * | Cloud / server | `@noy-db/seal-aws-kms` | AWS KMS Decrypt |
68
68
  */
69
- export interface SealingKeyProvider {
69
+ export interface NoydbSealer {
70
70
  /**
71
71
  * Non-sensitive identifier disclosed in the persisted envelope.
72
72
  * Surfaced to consumers via `loadSealedSecret().providerId` so
@@ -97,13 +97,23 @@ export interface SealingKeyProvider {
97
97
  *
98
98
  * Replace with a real platform provider in production.
99
99
  */
100
- export declare class MemorySealingKeyProvider implements SealingKeyProvider {
100
+ export declare class MemorySealer implements NoydbSealer {
101
101
  readonly id: string;
102
102
  private readonly fingerprint;
103
103
  private readonly keyBytes;
104
104
  constructor(opts: {
105
105
  id: string;
106
106
  });
107
+ /**
108
+ * Deterministic 4-byte integrity tag over the ciphertext, keyed by the
109
+ * same derived bytes. NOT a MAC and not forgery-resistant — a real
110
+ * provider authenticates with its backend. It exists because the contract
111
+ * says `unseal` MUST throw on tamper, and a double that silently returns
112
+ * corrupted bytes is not modelling the contract it stands in for. Without
113
+ * it, every managed-mode test ran against a provider that could not fail
114
+ * the way a real one must (found by @noy-db/test-sealer-conformance).
115
+ */
116
+ private tag;
107
117
  seal(secret: Uint8Array): Promise<Uint8Array>;
108
118
  unseal(sealed: Uint8Array): Promise<Uint8Array>;
109
119
  }
@@ -168,7 +178,7 @@ export declare function parseRsaOaepTlv(bytes: Uint8Array): {
168
178
  */
169
179
  export declare function aesGcmOpen(cekBytes: Uint8Array, iv: Uint8Array, ct: Uint8Array): Promise<Uint8Array>;
170
180
  /**
171
- * Reference implementation of `RecipientSealer` + `SealingKeyProvider`.
181
+ * Reference implementation of `RecipientSealer` + `NoydbSealer`.
172
182
  * Uses WebCrypto RSA-OAEP-SHA256 (2048-bit) to wrap a fresh 32-byte
173
183
  * AES-GCM CEK, AES-GCM-encrypts plaintext under it, and packs the
174
184
  * result into a self-describing TLV:
@@ -190,7 +200,7 @@ export declare function aesGcmOpen(cekBytes: Uint8Array, iv: Uint8Array, ct: Uin
190
200
  * keychain; use it for tests and for shipping bundles where the
191
201
  * recipient instance lives in the same process as the sender (rare).
192
202
  */
193
- export declare class MemoryRecipientSealer implements SealingKeyProvider, RecipientSealer {
203
+ export declare class MemoryRecipientSealer implements NoydbSealer, RecipientSealer {
194
204
  readonly id: string;
195
205
  private readonly keypair;
196
206
  constructor(opts: {
@@ -213,7 +223,7 @@ export interface SealedSecret {
213
223
  /**
214
224
  * Wire-format envelope persisted at `_meta/sealed-secret` for
215
225
  * managed-mode vaults. The provider produces raw sealed bytes via
216
- * {@link SealingKeyProvider.seal}; this wrapper carries the dispatch
226
+ * {@link NoydbSealer.seal}; this wrapper carries the dispatch
217
227
  * metadata hub needs to pick the right provider on the unseal path.
218
228
  *
219
229
  * Stability boundary: once shipped, the wire format only grows by
@@ -277,4 +287,4 @@ export declare function loadSealedSecret(store: NoydbStore, vault: string): Prom
277
287
  *
278
288
  * @internal — called from `createNoydb` / `getKeyringInternal`.
279
289
  */
280
- export declare function resolveManagedSecret(store: NoydbStore, vault: string, provider: SealingKeyProvider): Promise<string>;
290
+ export declare function resolveManagedSecret(store: NoydbStore, vault: string, provider: NoydbSealer): Promise<string>;
@@ -19,7 +19,7 @@
19
19
  * Internal service — reached through `noydb.team.rotateSecret(...)` etc.
20
20
  */
21
21
  import type { NoydbOptions, NoydbStore, KeyringAuthenticator } from '../../kernel/types.js';
22
- import type { RotateResult, RotateKeysOptions } from './keyring.js';
22
+ import type { RotateResult, RotateKeysOptions, RosterVerifyResult, QuarantineResult } from './keyring.js';
23
23
  import { type RotateSecretInput, type RecoverSecretInput, type RecoverSecretResult, type RotateRecoveryOptions, type RotateRecoveryResult, type EnrollRecoveryResult, type RecoveryEnrollmentInput, type RecoveryProof } from './rotate-recover.js';
24
24
  import { type RecoverUserOptions } from './peer-recover.js';
25
25
  import { type PaperRecoveryEntry, type ShamirRecoveryEntry } from './recovery.js';
@@ -74,6 +74,10 @@ export declare class TeamFacade {
74
74
  runRevoke(engine: (adapter: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, options: RevokeOptions) => Promise<void>, vault: string, options: RevokeOptions, factors?: FactorProofBundle): Promise<void>;
75
75
  /** Gate + run a `rotateKeys` engine. See `Noydb.rotate` for the public contract. */
76
76
  runRotate(engine: (store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, opts: RotateKeysOptions) => Promise<RotateResult>, vault: string, collections: string[]): Promise<RotateResult>;
77
+ /** Gate + run the `verifyRoster` engine (#1121). See `Noydb.verifyRoster`. */
78
+ runVerifyRoster(engine: (store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring) => Promise<RosterVerifyResult>, vault: string): Promise<RosterVerifyResult>;
79
+ /** Gate + run the `quarantineKeyring` engine (#1121). See `Noydb.quarantineKeyring`. */
80
+ runQuarantine(engine: (store: NoydbStore, vault: string, callerKeyring: UnlockedKeyring, userId: string) => Promise<QuarantineResult>, vault: string, userId: string, factors?: FactorProofBundle): Promise<QuarantineResult>;
77
81
  /**
78
82
  * Add a tier-2 authenticator slot to the calling user's keyring.
79
83
  * Each slot independently wraps the SAME KEK under a method-specific
@@ -299,7 +303,7 @@ export declare class TeamFacade {
299
303
  * const db = await createNoydb({
300
304
  * store, user: 'alice',
301
305
  * secretMode: 'managed',
302
- * sealingKey: macosKeychainSealingProvider({ ... }),
306
+ * sealingKey: atMacosKeychain({ ... }),
303
307
  * })
304
308
  *
305
309
  * const { vault, recoveryEnrollments } = await db.team.openVaultAndEnrollRecovery('acme', {
@@ -325,7 +329,7 @@ export declare class TeamFacade {
325
329
  *
326
330
  * Replaces the sealed secret of a managed-mode vault with a
327
331
  * fresh 256-bit random, sealed under the configured
328
- * `SealingKeyProvider`. The user never sees the new secret.
332
+ * `NoydbSealer`. The user never sees the new secret.
329
333
  *
330
334
  * Internally:
331
335
  * 1. Verify the recovery proof (Shamir today) and unwrap the
@@ -4,7 +4,7 @@
4
4
  * sees `RawShare` or the share codecs. Implemented by
5
5
  * `shamirRecoveryProvider()` from `@noy-db/on-shamir`.
6
6
  */
7
- export interface ShamirRecoveryProvider {
7
+ export interface NoydbShamir {
8
8
  /** Split `secret` into `n` base32 share strings; any `k` recombine it. */
9
9
  splitToShares(secret: Uint8Array, k: number, n: number): string[];
10
10
  /**
@@ -25,7 +25,7 @@
25
25
  import type { NoydbStore } from '../../kernel/types.js';
26
26
  import type { EnclaveKey } from '../../kernel/enclave/index.js';
27
27
  import { type WrappedDeksBlob } from './wrapped-deks.js';
28
- import type { ShamirRecoveryProvider } from './shamir-recovery-provider.js';
28
+ import type { NoydbShamir } from './noydb-shamir.js';
29
29
  /**
30
30
  * One paper recovery code as persisted in `_meta/recovery-paper`.
31
31
  *
@@ -146,7 +146,7 @@ export declare function saveShamirRecoveryEntries(store: NoydbStore, vault: stri
146
146
  * @param n - Total shares (k <= n <= 255).
147
147
  * @param label - Optional caller label.
148
148
  */
149
- export declare function mintShamirRecoveryEntry(provider: ShamirRecoveryProvider, deks: Map<string, EnclaveKey>, entryId: string, k: number, n: number, label?: string): Promise<{
149
+ export declare function mintShamirRecoveryEntry(provider: NoydbShamir, deks: Map<string, EnclaveKey>, entryId: string, k: number, n: number, label?: string): Promise<{
150
150
  entry: ShamirRecoveryEntry;
151
151
  shareStrings: string[];
152
152
  }>;
@@ -161,7 +161,7 @@ export declare function mintShamirRecoveryEntry(provider: ShamirRecoveryProvider
161
161
  * because they came from a different enrollment or were tampered
162
162
  * with. Callers iterating multiple entries should catch.
163
163
  */
164
- export declare function unwrapDeksFromShamirEntry(provider: ShamirRecoveryProvider, entry: ShamirRecoveryEntry, shareStrings: readonly string[]): Promise<Map<string, EnclaveKey>>;
164
+ export declare function unwrapDeksFromShamirEntry(provider: NoydbShamir, entry: ShamirRecoveryEntry, shareStrings: readonly string[]): Promise<Map<string, EnclaveKey>>;
165
165
  /**
166
166
  * Generate one paper-recovery entry from an unlocked DEK set.
167
167
  *
@@ -0,0 +1,101 @@
1
+ /**
2
+ * #1096 — the authenticated half of a `_keyring` file's AUTHORITY.
3
+ *
4
+ * A `_keyring` file is stored plaintext (`_iv: ''`) so admins can edit a
5
+ * member's authority without holding that member's credential. That means
6
+ * `role`/`permissions` were authenticated by NOTHING — a hostile store could
7
+ * promote a viewer to admin by editing one word (proven in
8
+ * `__tests__/keyring-replay-escalation.test.ts`).
9
+ *
10
+ * The fix is a vault-wide ROSTER KEY, carried as a reserved DEK-map entry
11
+ * (`deks['_roster']`, see `ROSTER_KEY_ID`) so it reaches every member through
12
+ * the channels a DEK already travels — grant's `_`-prefix propagation,
13
+ * `persistKeyring`, the wrapped-DEKs recovery blob, `peer-recover`, pod
14
+ * recipient slots — and a `roster_tag`: AES-GCM of the canonical authority
15
+ * fields under that key. Every roster EDITOR holds the key (constraint:
16
+ * admins edit authority they don't hold the target's credential for) — which
17
+ * is what sets the bound below.
18
+ *
19
+ * `user_id` is inside the canonical string so a genuine tag cannot be
20
+ * transplanted onto another member's file.
21
+ *
22
+ * ## What "authority half" does NOT cover
23
+ *
24
+ * The canonical string is exactly {@link RosterAuthorityFields} — the fields a
25
+ * privilege decision reads. Other plaintext fields are deliberately excluded
26
+ * and REMAIN FORGEABLE by the store: `display_name` (cosmetic), `policy`
27
+ * (round-tripped, never enforced at v1.0), `echo` and `authenticators` (each
28
+ * authenticated by its own wrapped key material — a forged one fails to
29
+ * unlock rather than granting anything), plus `created_at` / `salt` /
30
+ * `_noydb_keyring`. Adding a field to the tag means adding it to
31
+ * `rosterCanonical`; nothing else here is a claim about it.
32
+ *
33
+ * ## The bound
34
+ *
35
+ * This stops the STORE, which holds no keys. It deliberately does NOT stop a
36
+ * malicious MEMBER: every roster editor must hold the roster key, so anyone
37
+ * who legitimately holds it can forge any authority field for any member.
38
+ * That bound must be stated in `SECURITY.md` (tracked as part of the #1096
39
+ * PR) — it is not written there yet.
40
+ */
41
+ import type { KeyringFile } from '../../kernel/types.js';
42
+ import type { EnclaveKey } from '../../kernel/enclave/index.js';
43
+ export interface RosterTag {
44
+ readonly iv: string;
45
+ readonly data: string;
46
+ }
47
+ export type RosterAuthorityFields = Pick<KeyringFile, 'user_id' | 'role' | 'permissions' | 'granted_by' | 'expires_at' | 'export_capability' | 'import_capability' | 'deks' | 'pending_deks'>;
48
+ export declare function rosterCanonical(file: RosterAuthorityFields): string;
49
+ export declare function mintRosterTag(file: RosterAuthorityFields, rosterKey: EnclaveKey): Promise<RosterTag>;
50
+ /**
51
+ * false on decrypt failure OR canonical mismatch — never throws.
52
+ *
53
+ * `null` is accepted alongside `undefined` because the tag arrives from
54
+ * JSON a store controls: `"roster_tag": null` is a shape the type system
55
+ * says is impossible and the wire permits.
56
+ */
57
+ export declare function verifyRosterTag(file: RosterAuthorityFields, tag: RosterTag | undefined | null, rosterKey: EnclaveKey): Promise<boolean>;
58
+ /**
59
+ * #1096 — THE CHOKEPOINT. Verify a keyring file's plaintext AUTHORITY half
60
+ * against the roster key carried in its own, already-unwrapped, DEK set.
61
+ * Throws {@link KeyringTamperedError}; returns silently when the roster is
62
+ * authentic.
63
+ *
64
+ * **Every path that builds an `UnlockedKeyring` from a `KeyringFile` must call
65
+ * this — not just `loadKeyring`.** A tier-2 unlock that reconstructs
66
+ * `role`/`permissions` from the plaintext header without it accepts exactly
67
+ * the forgery tier-1 refuses, and the vault is only as strong as its weakest
68
+ * unlock path. That is not hypothetical: the wrap-DEKs password path shipped
69
+ * in this state until it was caught in review.
70
+ *
71
+ * Deliberately says nothing about the canary. The canary proves the KEK, and
72
+ * tier-2 paths have no KEK to prove — the roster key they hold comes from the
73
+ * slot's own wrapped-DEK blob, which is authenticated by its own AES-GCM tag.
74
+ * Callers that DO hold a KEK check the canary separately, before this.
75
+ *
76
+ * @param deks the caller's UNWRAPPED DEK set — a roster key here is proof of
77
+ * possession, so this must never be handed a map built from unverified input.
78
+ */
79
+ export declare function assertRosterAuthenticated(file: KeyringFile, deks: ReadonlyMap<string, EnclaveKey>, userId: string): Promise<void>;
80
+ /**
81
+ * #1096 — VERIFY BEFORE YOU TRUST, and especially before you RESTAMP.
82
+ *
83
+ * The sibling of {@link assertRosterAuthenticated} for the other half of the
84
+ * problem. That one guards paths that *unlock* a keyring; this one guards paths
85
+ * that **read another member's file** — because the roster key is vault-wide, a
86
+ * caller holding it can verify any member's tag, not just their own.
87
+ *
88
+ * Every read-modify-write on a member's roster must call this **before** the
89
+ * modify. A flow that reads a forged file, edits one field and restamps does
90
+ * not merely tolerate the forgery — it **launders** it, converting a file
91
+ * `loadKeyring` refuses into one it accepts, under a genuine tag. `revoke`
92
+ * calls into such a flow unconditionally, so without this a single forged
93
+ * member plus any later revocation anywhere in the vault is a complete bypass.
94
+ *
95
+ * Fail-closed, deliberately: a forged member's file aborts the operation rather
96
+ * than being skipped. Skipping would complete the revoke while leaving the
97
+ * forgery in place, and an untrusted store can already refuse writes — so the
98
+ * availability it costs was never guaranteed, while the integrity it buys is
99
+ * the point of the mechanism.
100
+ */
101
+ export declare function assertRosterTagValid(file: KeyringFile, rosterKey: EnclaveKey, userId: string): Promise<void>;
@@ -19,10 +19,10 @@
19
19
  import type { NoydbStore } from '../../kernel/types.js';
20
20
  import { type EnclaveKey, type EchoSecretParts } from '../../kernel/enclave/index.js';
21
21
  import { type PaperRecoveryEntry } from './recovery.js';
22
- import type { ShamirRecoveryProvider } from './shamir-recovery-provider.js';
22
+ import type { NoydbShamir } from './noydb-shamir.js';
23
23
  import { type SecretPolicy, type EchoSecretPolicy } from '../../kernel/validation.js';
24
24
  import type { UnlockedKeyring } from './keyring.js';
25
- import type { DeviceSealProvider } from './device-seal.js';
25
+ import type { NoydbDeviceSeal } from './device-seal.js';
26
26
  import type { KeyringAuthenticator } from '../../kernel/types.js';
27
27
  import type { EnrollAuthenticatorOptions } from './authenticators.js';
28
28
  /**
@@ -38,7 +38,7 @@ interface RotateEchoOptions {
38
38
  * absent ⇒ `reveal: 'portable'`. Mirrors
39
39
  * {@link CreateOwnerKeyringOptions.deviceSeal}.
40
40
  */
41
- readonly deviceSeal?: DeviceSealProvider;
41
+ readonly deviceSeal?: NoydbDeviceSeal;
42
42
  /** Optional display hint for the masked echo. */
43
43
  readonly maskHint?: string;
44
44
  }
@@ -189,7 +189,7 @@ export type RecoveryProof = {
189
189
  /** Optional disambiguator when multiple Shamir entries are enrolled.
190
190
  * When omitted, hub tries each entry until one combines. */
191
191
  readonly entryId?: string;
192
- /** K or more opaque share strings, as returned by `ShamirRecoveryProvider.splitToShares`. */
192
+ /** K or more opaque share strings, as returned by `NoydbShamir.splitToShares`. */
193
193
  readonly shares: ReadonlyArray<string>;
194
194
  };
195
195
  };
@@ -365,5 +365,5 @@ export type RecoveryEnrollmentInput = {
365
365
  * On success, the used recovery entry is burned (deleted from the
366
366
  * stored set).
367
367
  */
368
- export declare function recoverSecret(provider: ShamirRecoveryProvider | undefined, store: NoydbStore, vault: string, userId: string, input: RecoverSecretInput): Promise<UnlockedKeyring>;
368
+ export declare function recoverSecret(provider: NoydbShamir | undefined, store: NoydbStore, vault: string, userId: string, input: RecoverSecretInput): Promise<UnlockedKeyring>;
369
369
  export {};