@noy-db/hub 0.9.0-pre.0 → 0.9.0-pre.1

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 (460) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/api-6EFD43KN.js +18 -0
  3. package/dist/as/index.js +10 -10
  4. package/dist/at/index.js +8 -8
  5. package/dist/attestation/index.js +18 -18
  6. package/dist/{backup-7RKNZMQO.js → backup-RJBFQSHE.js} +92 -31
  7. package/dist/backup-RJBFQSHE.js.map +1 -0
  8. package/dist/blobs/index.js +12 -12
  9. package/dist/broker/index.js +13 -13
  10. package/dist/by/index.js +2 -2
  11. package/dist/capsule/contract.js +6 -6
  12. package/dist/capsule/enclave-aes/crypto.d.ts +18 -0
  13. package/dist/capsule/enclave-aes/index.d.ts +2 -2
  14. package/dist/capsule/enclave-aes/index.js +14 -8
  15. package/dist/capsule/enclave-aes/index.js.map +1 -1
  16. package/dist/capsule/index.d.ts +1 -1
  17. package/dist/{capsule-57BDK7LG.js → capsule-6LJAVQNM.js} +14 -8
  18. package/dist/cargo/index.js +35 -35
  19. package/dist/{chunk-72XBVN4J.js → chunk-25FXU6WS.js} +2 -2
  20. package/dist/chunk-25FXU6WS.js.map +1 -0
  21. package/dist/{chunk-PCYPXLEX.js → chunk-2DOCDOPL.js} +6 -6
  22. package/dist/{chunk-RIZTZJX6.js → chunk-2LBS62AC.js} +2 -2
  23. package/dist/{chunk-EUD3HQM4.js → chunk-2ST3WA3C.js} +4 -4
  24. package/dist/{chunk-APFFJN5T.js → chunk-3G3GOGZZ.js} +31 -34
  25. package/dist/chunk-3G3GOGZZ.js.map +1 -0
  26. package/dist/{chunk-4UIP3QNW.js → chunk-3YBIVLTC.js} +2 -2
  27. package/dist/{chunk-UNSQZSZP.js → chunk-4CHM2TRS.js} +2 -2
  28. package/dist/{chunk-NYJBYVBG.js → chunk-4CUJLEOA.js} +4 -4
  29. package/dist/{chunk-YFFMPZPY.js → chunk-4TG2ITRW.js} +2 -2
  30. package/dist/{chunk-ZHQJAV6D.js → chunk-5HQFROZS.js} +2 -2
  31. package/dist/{chunk-6Y5E4SJU.js → chunk-5ZVE3N5C.js} +5 -5
  32. package/dist/{chunk-EMAWOGVH.js → chunk-654RE5YC.js} +3 -3
  33. package/dist/{chunk-DHU2AQ6T.js → chunk-66GD7XXU.js} +2 -2
  34. package/dist/{chunk-JZ4EDEIP.js → chunk-72FQ46VW.js} +3 -3
  35. package/dist/{chunk-7BMOS4JQ.js → chunk-7JPA3LIH.js} +11 -11
  36. package/dist/{chunk-QGFEBNHO.js → chunk-7K42TSCY.js} +4 -4
  37. package/dist/{chunk-OJU67C23.js → chunk-7Q6IU3R7.js} +4 -4
  38. package/dist/{chunk-JBMMWYOH.js → chunk-7UHLO4ZN.js} +35 -2
  39. package/dist/chunk-7UHLO4ZN.js.map +1 -0
  40. package/dist/{chunk-GRS2HIV6.js → chunk-ADCXTW7L.js} +2 -2
  41. package/dist/{chunk-BJH77UY2.js → chunk-AGGPT4UE.js} +2 -2
  42. package/dist/{chunk-TZYTMZZY.js → chunk-AKIEBFIJ.js} +10 -10
  43. package/dist/{chunk-DL6BZKP3.js → chunk-B3B6HV5S.js} +2 -2
  44. package/dist/{chunk-5XONHAFD.js → chunk-B6EWMGFX.js} +2 -2
  45. package/dist/{chunk-TFWFPZRU.js → chunk-B7Y2BRQA.js} +11 -11
  46. package/dist/{chunk-TFWFPZRU.js.map → chunk-B7Y2BRQA.js.map} +1 -1
  47. package/dist/{chunk-MRJDLXI3.js → chunk-BFJE2GPP.js} +8 -8
  48. package/dist/{chunk-G46JSSVX.js → chunk-BJRKXNFP.js} +7 -7
  49. package/dist/{chunk-RNACRT5H.js → chunk-BPQ5CRJF.js} +2 -2
  50. package/dist/{chunk-BYHCKX73.js → chunk-BVRJYMFZ.js} +3 -3
  51. package/dist/{chunk-GETUTTZU.js → chunk-C4XV3PSJ.js} +4 -4
  52. package/dist/{chunk-XXNWU5QZ.js → chunk-DFC4WTJW.js} +2 -2
  53. package/dist/{chunk-YQFBH5ZJ.js → chunk-DMIEKD24.js} +3 -3
  54. package/dist/{chunk-2ZFD2UJC.js → chunk-DQAXA2GK.js} +9 -9
  55. package/dist/{chunk-ZVSKSUGI.js → chunk-DWCFGF2K.js} +5 -5
  56. package/dist/{chunk-5HNW4ZTA.js → chunk-E2C6FFSI.js} +6 -6
  57. package/dist/{chunk-2A56DSRI.js → chunk-EQ6C2ZPT.js} +17 -51
  58. package/dist/chunk-EQ6C2ZPT.js.map +1 -0
  59. package/dist/{chunk-G66YXUTY.js → chunk-EZOFTI4K.js} +3 -3
  60. package/dist/{chunk-6QLCS7ET.js → chunk-FMINS2B6.js} +2 -2
  61. package/dist/{chunk-6WS35E6X.js → chunk-FPF5HRBE.js} +2 -2
  62. package/dist/{chunk-7CT6SX4M.js → chunk-FZVCZEVI.js} +3 -3
  63. package/dist/{chunk-BUE7R3B5.js → chunk-GIQJGXV7.js} +2 -2
  64. package/dist/{chunk-GOJQ5DZA.js → chunk-GYZICGRU.js} +4 -4
  65. package/dist/chunk-GYZICGRU.js.map +1 -0
  66. package/dist/{chunk-C53ER7AG.js → chunk-H334G6KU.js} +2 -2
  67. package/dist/{chunk-GCUMOKTN.js → chunk-HE7EAHGS.js} +3 -3
  68. package/dist/{chunk-BU2ABHFW.js → chunk-HKB4HZDU.js} +4 -4
  69. package/dist/{chunk-5UUJE4FP.js → chunk-ICF3TIGY.js} +2 -2
  70. package/dist/{chunk-H3YM66EI.js → chunk-IF2M43G4.js} +2 -2
  71. package/dist/{chunk-VSUQI5Q6.js → chunk-IKPQ2GGB.js} +15 -1
  72. package/dist/chunk-IKPQ2GGB.js.map +1 -0
  73. package/dist/{chunk-Z3ZXVB2Y.js → chunk-IKS2CPAG.js} +12 -12
  74. package/dist/chunk-IKS2CPAG.js.map +1 -0
  75. package/dist/{chunk-IVMFIKNA.js → chunk-IMIQAGR7.js} +6 -6
  76. package/dist/{chunk-226V6XXJ.js → chunk-IQAJ4OR6.js} +6 -6
  77. package/dist/{chunk-ZMVSKYTJ.js → chunk-IUD7WU67.js} +10 -10
  78. package/dist/{chunk-OK57EATL.js → chunk-IVLRPRXM.js} +2 -2
  79. package/dist/{chunk-K673OO6B.js → chunk-JAQHWHUN.js} +4 -4
  80. package/dist/{chunk-MQ7YWBQ5.js → chunk-K4JSTGXT.js} +2 -2
  81. package/dist/{chunk-55P6OBB7.js → chunk-KN4LUMH6.js} +2 -2
  82. package/dist/{chunk-NZULV7LK.js → chunk-KZA3DITX.js} +4 -4
  83. package/dist/{chunk-ECGXA4LT.js → chunk-L2VM64HK.js} +2 -2
  84. package/dist/chunk-L4UL4IAR.js +55 -0
  85. package/dist/chunk-L4UL4IAR.js.map +1 -0
  86. package/dist/{chunk-XITHENBI.js → chunk-LUCQY3OM.js} +7 -7
  87. package/dist/{chunk-XITHENBI.js.map → chunk-LUCQY3OM.js.map} +1 -1
  88. package/dist/{chunk-LGGIFKJP.js → chunk-MAQBYBUX.js} +4 -4
  89. package/dist/{chunk-ABU6A4Z5.js → chunk-MBPZMZVB.js} +2 -2
  90. package/dist/{chunk-WFWFXDNS.js → chunk-MCNNZBG7.js} +2 -2
  91. package/dist/{chunk-NIXRB5BP.js → chunk-MLVPMDOZ.js} +2 -2
  92. package/dist/{chunk-BVF3SXD7.js → chunk-MMCN7TLK.js} +5 -5
  93. package/dist/{chunk-FSQNGPHH.js → chunk-MRCR7ZMC.js} +612 -175
  94. package/dist/chunk-MRCR7ZMC.js.map +1 -0
  95. package/dist/{chunk-PTJY5R3O.js → chunk-NCTN2FW4.js} +2 -2
  96. package/dist/{chunk-UOZOWN73.js → chunk-ND6S2DKC.js} +2 -2
  97. package/dist/{chunk-XKBTJGFP.js → chunk-NTVKHQ3L.js} +2 -2
  98. package/dist/{chunk-UHFGK6YA.js → chunk-NXQEOC3X.js} +3 -3
  99. package/dist/{chunk-UAKY6E4N.js → chunk-O2VQ3K36.js} +2 -2
  100. package/dist/{chunk-JSWKVZCR.js → chunk-OGKMRIIJ.js} +2 -2
  101. package/dist/{chunk-L2F3CFCH.js → chunk-ONZ3B5EW.js} +4 -4
  102. package/dist/{chunk-AJFPAHMW.js → chunk-OOPSMQX5.js} +3 -3
  103. package/dist/{chunk-QDHHHI5Q.js → chunk-OYEBSWLE.js} +5 -5
  104. package/dist/{chunk-ZWF3EWZA.js → chunk-P6FATPXQ.js} +2 -2
  105. package/dist/{chunk-QSHATAXJ.js → chunk-PLTIJDQN.js} +2 -2
  106. package/dist/{chunk-V55JASXO.js → chunk-PR7ILCIH.js} +3 -3
  107. package/dist/{chunk-X2RP4TO5.js → chunk-QE3TLZ6Z.js} +7 -7
  108. package/dist/{chunk-QXJXG7DN.js → chunk-QFW4MYGN.js} +5 -5
  109. package/dist/{chunk-2WJKJZSO.js → chunk-QHG7GQKM.js} +2 -2
  110. package/dist/{chunk-FZXRLNJO.js → chunk-QT5ITL25.js} +3 -3
  111. package/dist/{chunk-SNM7LSYG.js → chunk-R2ZULFXU.js} +4 -4
  112. package/dist/{chunk-SPPOUJLN.js → chunk-RRTQAQ3N.js} +2 -2
  113. package/dist/{chunk-JA25QG5M.js → chunk-RUE6TCES.js} +622 -119
  114. package/dist/chunk-RUE6TCES.js.map +1 -0
  115. package/dist/{chunk-L5A3KR7R.js → chunk-SALY3LIJ.js} +3 -3
  116. package/dist/{chunk-SFCD6OU7.js → chunk-SBAR5JQ6.js} +2 -2
  117. package/dist/{chunk-WHOKGHJ3.js → chunk-SCH2F7R2.js} +7 -7
  118. package/dist/{chunk-JPSL5GIZ.js → chunk-SOOAW6HK.js} +3 -3
  119. package/dist/{chunk-TMIJAR2X.js → chunk-T4VTRKCY.js} +3 -3
  120. package/dist/{chunk-5LMCVBMY.js → chunk-T5EXREMW.js} +5 -5
  121. package/dist/{chunk-YKGJ44Z7.js → chunk-TDJVQTXD.js} +3 -3
  122. package/dist/{chunk-PUBI455O.js → chunk-THQ3BHLM.js} +2 -2
  123. package/dist/{chunk-BMHQHH7Q.js → chunk-TLIFNRU5.js} +2 -2
  124. package/dist/{chunk-PGC35KXE.js → chunk-TRHUNPXP.js} +2 -2
  125. package/dist/{chunk-SWXLZ4HX.js → chunk-UL6MTRMJ.js} +8 -8
  126. package/dist/{delegation-ONLM4JFI.js → chunk-UNL6YGL5.js} +59 -16
  127. package/dist/chunk-UNL6YGL5.js.map +1 -0
  128. package/dist/{chunk-J4KAPKBJ.js → chunk-UORWAG7K.js} +2 -2
  129. package/dist/{chunk-45VHWE4C.js → chunk-V7AKGAXY.js} +271 -69
  130. package/dist/chunk-V7AKGAXY.js.map +1 -0
  131. package/dist/{chunk-XXQ5XIYY.js → chunk-VLQ6KT7F.js} +2 -2
  132. package/dist/{chunk-PT2YCQVK.js → chunk-VP37VUKQ.js} +4 -4
  133. package/dist/{chunk-QGSNJD3B.js → chunk-WBUHHMLN.js} +2 -2
  134. package/dist/{chunk-4J3MNVVX.js → chunk-WRLWEYHY.js} +7 -1
  135. package/dist/{chunk-4J3MNVVX.js.map → chunk-WRLWEYHY.js.map} +1 -1
  136. package/dist/{chunk-PFCTSXHU.js → chunk-X6Z2SIRF.js} +2 -2
  137. package/dist/{chunk-XA34THLF.js → chunk-XLKWF3L4.js} +4 -4
  138. package/dist/{chunk-K7RW7FI4.js → chunk-XPNJH7GN.js} +5 -5
  139. package/dist/{chunk-RDOEOPOI.js → chunk-XPW7T2GN.js} +5 -5
  140. package/dist/{chunk-2ELOCEXE.js → chunk-XX4R7TUB.js} +1 -1
  141. package/dist/chunk-XX4R7TUB.js.map +1 -0
  142. package/dist/{chunk-EA4VDI5D.js → chunk-Y55XHMQB.js} +4 -4
  143. package/dist/{chunk-CB4467G3.js → chunk-YH4OUOSI.js} +33 -7
  144. package/dist/chunk-YH4OUOSI.js.map +1 -0
  145. package/dist/{chunk-BNFNQNEP.js → chunk-YJGKOSQD.js} +2 -2
  146. package/dist/{chunk-3V6LZHUO.js → chunk-Z3STG43F.js} +2 -2
  147. package/dist/{chunk-ZBUAX4EF.js → chunk-ZD7WFMV2.js} +2 -2
  148. package/dist/{chunk-OM3SEDI4.js → chunk-ZF6JECDT.js} +4 -4
  149. package/dist/{chunk-3Y5JLSXS.js → chunk-ZF7KNSLU.js} +2 -2
  150. package/dist/{chunk-B65CC6Z6.js → chunk-ZGKODRGB.js} +2 -2
  151. package/dist/{chunk-D4V5JJAK.js → chunk-ZNEKQFGF.js} +4 -4
  152. package/dist/{chunk-D5A3GCZ4.js → chunk-ZUTUNVFD.js} +3 -3
  153. package/dist/{chunk-G5EDYVSE.js → chunk-ZWMOHANW.js} +5 -5
  154. package/dist/{chunk-CAD7N6HQ.js → chunk-ZZZ4VCY2.js} +10 -10
  155. package/dist/chunk-ZZZ4VCY2.js.map +1 -0
  156. package/dist/classified/index.js +5 -5
  157. package/dist/{classified-marker-KHDOYIJB.js → classified-marker-WKP33U2R.js} +3 -3
  158. package/dist/collection-facade-COSGZKLC.js +41 -0
  159. package/dist/{computed-XMFTHAXV.js → computed-WN6V53ZV.js} +3 -3
  160. package/dist/consent/index.js +8 -8
  161. package/dist/cover/index.js +8 -8
  162. package/dist/custody/index.js +12 -12
  163. package/dist/{dead-filter-CXV5NS67.js → dead-filter-43WL3Y5H.js} +10 -10
  164. package/dist/debug/index.js +7 -7
  165. package/dist/delegation-5UWT4JGT.js +26 -0
  166. package/dist/derivations/index.js +22 -22
  167. package/dist/derive-IL5JNLEE.js +20 -0
  168. package/dist/directory/index.js +9 -9
  169. package/dist/{dispatch-2MQFMEGY.js → dispatch-LOQQD5JK.js} +19 -19
  170. package/dist/{dispatch-OFDA4WQV.js → dispatch-SHKTG57L.js} +5 -5
  171. package/dist/executor-6PQ7WAGV.js +35 -0
  172. package/dist/executor-6ZPQA6HS.js +8 -0
  173. package/dist/executor-OXRA64TY.js +8 -0
  174. package/dist/export-accessible-XG3FKJWW.js +22 -0
  175. package/dist/extract-partition-33747NY5.js +35 -0
  176. package/dist/{fanout-sidecar-BO67PCPO.js → fanout-sidecar-NEB6IYV7.js} +8 -8
  177. package/dist/find-VW543G3J.js +10 -0
  178. package/dist/forget/index.js +8 -8
  179. package/dist/guards/index.js +4 -4
  180. package/dist/history/index.js +15 -13
  181. package/dist/history/index.js.map +1 -1
  182. package/dist/i18n/index.js +13 -13
  183. package/dist/index.d.ts +3 -2
  184. package/dist/index.js +111 -107
  185. package/dist/index.js.map +1 -1
  186. package/dist/indexing/index.js +5 -5
  187. package/dist/introspection/index.js +10 -10
  188. package/dist/issue-4ZPSY44M.js +19 -0
  189. package/dist/kernel/collection.d.ts +85 -6
  190. package/dist/kernel/constants.d.ts +7 -0
  191. package/dist/kernel/errors.d.ts +9 -0
  192. package/dist/kernel/merge-authority.d.ts +5 -1
  193. package/dist/kernel/noydb.d.ts +116 -21
  194. package/dist/kernel/rejection-seal.d.ts +13 -0
  195. package/dist/kernel/sync-wiring.d.ts +55 -0
  196. package/dist/kernel/types.d.ts +370 -8
  197. package/dist/kernel/vault.d.ts +39 -5
  198. package/dist/{ledger-MSJGWKGW.js → ledger-MZ25UFT2.js} +10 -10
  199. package/dist/liberate-OJIP2ZFX.js +25 -0
  200. package/dist/{link-set-QXXSPPHL.js → link-set-4FRRAVTH.js} +10 -10
  201. package/dist/{managed-secret-VSK7ANQI.js → managed-secret-SQWO2EUR.js} +9 -9
  202. package/dist/materialized-views/index.js +25 -25
  203. package/dist/{migrate-cek-GEBFYBDC.js → migrate-cek-JWEM4RP6.js} +2 -2
  204. package/dist/money/index.js +5 -5
  205. package/dist/noydb-U62OVKXB.js +100 -0
  206. package/dist/on/index.js +12 -12
  207. package/dist/overlay-views/index.js +4 -4
  208. package/dist/periods/index.js +11 -11
  209. package/dist/pod/index.js +66 -64
  210. package/dist/{pod-handle-YE7CT66T.js → pod-handle-R6Y4MILX.js} +8 -8
  211. package/dist/policy/index.js +9 -9
  212. package/dist/port/with/admission-authority.d.ts +34 -0
  213. package/dist/port/with/broker-strategy.d.ts +10 -0
  214. package/dist/port/with/rejection-courier.d.ts +37 -0
  215. package/dist/port/with/restore-host.d.ts +33 -0
  216. package/dist/port/with/service-bus.d.ts +18 -0
  217. package/dist/port/with/team-strategy.d.ts +2 -2
  218. package/dist/port/with/write-hooks.d.ts +2 -0
  219. package/dist/portability/index.js +8 -8
  220. package/dist/{post-register-QC5TEAW3.js → post-register-GRVQHBOH.js} +6 -6
  221. package/dist/query/all/index.js +15 -15
  222. package/dist/query/index.js +7 -7
  223. package/dist/query/live/index.js +7 -7
  224. package/dist/query/reduce/index.js +10 -10
  225. package/dist/query/relate/index.js +9 -9
  226. package/dist/reduce/index.js +8 -8
  227. package/dist/register-YJ5YLQ36.js +30 -0
  228. package/dist/registry-ICOHBQFD.js +8 -0
  229. package/dist/registry-MJ7MWCSW.js +35 -0
  230. package/dist/registry-MVEKKGWL.js +23 -0
  231. package/dist/registry-XP744FAP.js +8 -0
  232. package/dist/request-withdrawal-LSU4G6W3.js +28 -0
  233. package/dist/restore-to-DVBHAQAA.js +66 -0
  234. package/dist/restore-to-DVBHAQAA.js.map +1 -0
  235. package/dist/{reveal-YQTRNQFH.js → reveal-AIHOIK2N.js} +7 -7
  236. package/dist/revoke-QUT7WWG3.js +24 -0
  237. package/dist/satellites/index.js +1 -1
  238. package/dist/schema-update/index.js +2 -2
  239. package/dist/sealed-record/index.js +11 -11
  240. package/dist/search/index.js +4 -4
  241. package/dist/{seed-JMQTRKRE.js → seed-GFLA4FCK.js} +33 -18
  242. package/dist/seed-GFLA4FCK.js.map +1 -0
  243. package/dist/sequence/index.js +8 -8
  244. package/dist/session/index.js +8 -8
  245. package/dist/shadow/index.js +2 -2
  246. package/dist/signer-NYR4I3FO.js +23 -0
  247. package/dist/snapshots/index.js +9 -9
  248. package/dist/{stale-SKV33PBU.js → stale-PIJPAL5T.js} +9 -9
  249. package/dist/storage-VH6SPXHC.js +21 -0
  250. package/dist/{store-coordination-provider-Z6HKPOGM.js → store-coordination-provider-2KSHCOPU.js} +9 -9
  251. package/dist/sync/index.js +16 -16
  252. package/dist/sync/index.js.map +1 -1
  253. package/dist/team/index.js +15 -15
  254. package/dist/tiers/index.js +10 -10
  255. package/dist/to/index.js +2 -2
  256. package/dist/transactions/index.js +3 -3
  257. package/dist/util/index.js +1 -1
  258. package/dist/vault-head/index.js +7 -7
  259. package/dist/{verify-KWQIWLGH.js → verify-PCFS4PNS.js} +7 -7
  260. package/dist/walk-OZCN6LJS.js +20 -0
  261. package/dist/with-audit/guards/types.d.ts +2 -0
  262. package/dist/with-audit/tiers/index.d.ts +5 -5
  263. package/dist/with-commit/history/history.d.ts +16 -0
  264. package/dist/with-commit/history/restore-to.d.ts +40 -0
  265. package/dist/with-party/broker/seed.d.ts +4 -0
  266. package/dist/with-party/custody/strategy.d.ts +2 -2
  267. package/dist/with-party/team/delegation.d.ts +41 -11
  268. package/dist/with-party/team/index.d.ts +2 -0
  269. package/dist/with-party/team/keyring.d.ts +132 -3
  270. package/dist/with-party/team/noydb-facade.d.ts +14 -2
  271. package/dist/with-party/team/roster-tag.d.ts +1 -1
  272. package/dist/with-pod/backup.d.ts +9 -17
  273. package/dist/with-sync/active.d.ts +28 -1
  274. package/dist/with-sync/engine.d.ts +59 -2
  275. package/dist/with-sync/index.d.ts +1 -0
  276. package/dist/with-sync/reserved-mirror.d.ts +27 -4
  277. package/dist/with-sync/strategy.d.ts +2 -0
  278. package/dist/withdraw-accessible-MTFP7OIB.js +25 -0
  279. package/dist/withdraw-accessible-MTFP7OIB.js.map +1 -0
  280. package/package.json +3 -3
  281. package/dist/api-MSJXVYQG.js +0 -18
  282. package/dist/backup-7RKNZMQO.js.map +0 -1
  283. package/dist/chunk-2A56DSRI.js.map +0 -1
  284. package/dist/chunk-2ELOCEXE.js.map +0 -1
  285. package/dist/chunk-45VHWE4C.js.map +0 -1
  286. package/dist/chunk-72XBVN4J.js.map +0 -1
  287. package/dist/chunk-APFFJN5T.js.map +0 -1
  288. package/dist/chunk-CAD7N6HQ.js.map +0 -1
  289. package/dist/chunk-CB4467G3.js.map +0 -1
  290. package/dist/chunk-FSQNGPHH.js.map +0 -1
  291. package/dist/chunk-GOJQ5DZA.js.map +0 -1
  292. package/dist/chunk-JA25QG5M.js.map +0 -1
  293. package/dist/chunk-JBMMWYOH.js.map +0 -1
  294. package/dist/chunk-VSUQI5Q6.js.map +0 -1
  295. package/dist/chunk-Z3ZXVB2Y.js.map +0 -1
  296. package/dist/collection-facade-LZIF7GWD.js +0 -41
  297. package/dist/delegation-ONLM4JFI.js.map +0 -1
  298. package/dist/derive-3YSIS36W.js +0 -20
  299. package/dist/executor-E6YDJ7YA.js +0 -8
  300. package/dist/executor-NJX3YQQ4.js +0 -35
  301. package/dist/executor-WWM3DD4P.js +0 -8
  302. package/dist/export-accessible-RLHU5G4W.js +0 -22
  303. package/dist/extract-partition-QII2EDCS.js +0 -35
  304. package/dist/find-6M7GYDUZ.js +0 -10
  305. package/dist/issue-LPEEEMPP.js +0 -19
  306. package/dist/liberate-LEKDYKTC.js +0 -25
  307. package/dist/noydb-F2AUF6KL.js +0 -98
  308. package/dist/register-SN72QALV.js +0 -30
  309. package/dist/registry-253FF7C6.js +0 -35
  310. package/dist/registry-3AZWQTDT.js +0 -23
  311. package/dist/registry-7UEBTHWG.js +0 -8
  312. package/dist/registry-IVJ67NFQ.js +0 -8
  313. package/dist/request-withdrawal-UKVJZKX2.js +0 -28
  314. package/dist/revoke-G2KXJQA5.js +0 -24
  315. package/dist/seed-JMQTRKRE.js.map +0 -1
  316. package/dist/signer-IUIYR3CX.js +0 -23
  317. package/dist/storage-NPBYP2SM.js +0 -21
  318. package/dist/walk-F4OLXI5H.js +0 -20
  319. package/dist/withdraw-accessible-ZKPLZ66E.js +0 -25
  320. /package/dist/{api-MSJXVYQG.js.map → api-6EFD43KN.js.map} +0 -0
  321. /package/dist/{capsule-57BDK7LG.js.map → capsule-6LJAVQNM.js.map} +0 -0
  322. /package/dist/{chunk-PCYPXLEX.js.map → chunk-2DOCDOPL.js.map} +0 -0
  323. /package/dist/{chunk-RIZTZJX6.js.map → chunk-2LBS62AC.js.map} +0 -0
  324. /package/dist/{chunk-EUD3HQM4.js.map → chunk-2ST3WA3C.js.map} +0 -0
  325. /package/dist/{chunk-4UIP3QNW.js.map → chunk-3YBIVLTC.js.map} +0 -0
  326. /package/dist/{chunk-UNSQZSZP.js.map → chunk-4CHM2TRS.js.map} +0 -0
  327. /package/dist/{chunk-NYJBYVBG.js.map → chunk-4CUJLEOA.js.map} +0 -0
  328. /package/dist/{chunk-YFFMPZPY.js.map → chunk-4TG2ITRW.js.map} +0 -0
  329. /package/dist/{chunk-ZHQJAV6D.js.map → chunk-5HQFROZS.js.map} +0 -0
  330. /package/dist/{chunk-6Y5E4SJU.js.map → chunk-5ZVE3N5C.js.map} +0 -0
  331. /package/dist/{chunk-EMAWOGVH.js.map → chunk-654RE5YC.js.map} +0 -0
  332. /package/dist/{chunk-DHU2AQ6T.js.map → chunk-66GD7XXU.js.map} +0 -0
  333. /package/dist/{chunk-JZ4EDEIP.js.map → chunk-72FQ46VW.js.map} +0 -0
  334. /package/dist/{chunk-7BMOS4JQ.js.map → chunk-7JPA3LIH.js.map} +0 -0
  335. /package/dist/{chunk-QGFEBNHO.js.map → chunk-7K42TSCY.js.map} +0 -0
  336. /package/dist/{chunk-OJU67C23.js.map → chunk-7Q6IU3R7.js.map} +0 -0
  337. /package/dist/{chunk-GRS2HIV6.js.map → chunk-ADCXTW7L.js.map} +0 -0
  338. /package/dist/{chunk-BJH77UY2.js.map → chunk-AGGPT4UE.js.map} +0 -0
  339. /package/dist/{chunk-TZYTMZZY.js.map → chunk-AKIEBFIJ.js.map} +0 -0
  340. /package/dist/{chunk-DL6BZKP3.js.map → chunk-B3B6HV5S.js.map} +0 -0
  341. /package/dist/{chunk-5XONHAFD.js.map → chunk-B6EWMGFX.js.map} +0 -0
  342. /package/dist/{chunk-MRJDLXI3.js.map → chunk-BFJE2GPP.js.map} +0 -0
  343. /package/dist/{chunk-G46JSSVX.js.map → chunk-BJRKXNFP.js.map} +0 -0
  344. /package/dist/{chunk-RNACRT5H.js.map → chunk-BPQ5CRJF.js.map} +0 -0
  345. /package/dist/{chunk-BYHCKX73.js.map → chunk-BVRJYMFZ.js.map} +0 -0
  346. /package/dist/{chunk-GETUTTZU.js.map → chunk-C4XV3PSJ.js.map} +0 -0
  347. /package/dist/{chunk-XXNWU5QZ.js.map → chunk-DFC4WTJW.js.map} +0 -0
  348. /package/dist/{chunk-YQFBH5ZJ.js.map → chunk-DMIEKD24.js.map} +0 -0
  349. /package/dist/{chunk-2ZFD2UJC.js.map → chunk-DQAXA2GK.js.map} +0 -0
  350. /package/dist/{chunk-ZVSKSUGI.js.map → chunk-DWCFGF2K.js.map} +0 -0
  351. /package/dist/{chunk-5HNW4ZTA.js.map → chunk-E2C6FFSI.js.map} +0 -0
  352. /package/dist/{chunk-G66YXUTY.js.map → chunk-EZOFTI4K.js.map} +0 -0
  353. /package/dist/{chunk-6QLCS7ET.js.map → chunk-FMINS2B6.js.map} +0 -0
  354. /package/dist/{chunk-6WS35E6X.js.map → chunk-FPF5HRBE.js.map} +0 -0
  355. /package/dist/{chunk-7CT6SX4M.js.map → chunk-FZVCZEVI.js.map} +0 -0
  356. /package/dist/{chunk-BUE7R3B5.js.map → chunk-GIQJGXV7.js.map} +0 -0
  357. /package/dist/{chunk-C53ER7AG.js.map → chunk-H334G6KU.js.map} +0 -0
  358. /package/dist/{chunk-GCUMOKTN.js.map → chunk-HE7EAHGS.js.map} +0 -0
  359. /package/dist/{chunk-BU2ABHFW.js.map → chunk-HKB4HZDU.js.map} +0 -0
  360. /package/dist/{chunk-5UUJE4FP.js.map → chunk-ICF3TIGY.js.map} +0 -0
  361. /package/dist/{chunk-H3YM66EI.js.map → chunk-IF2M43G4.js.map} +0 -0
  362. /package/dist/{chunk-IVMFIKNA.js.map → chunk-IMIQAGR7.js.map} +0 -0
  363. /package/dist/{chunk-226V6XXJ.js.map → chunk-IQAJ4OR6.js.map} +0 -0
  364. /package/dist/{chunk-ZMVSKYTJ.js.map → chunk-IUD7WU67.js.map} +0 -0
  365. /package/dist/{chunk-OK57EATL.js.map → chunk-IVLRPRXM.js.map} +0 -0
  366. /package/dist/{chunk-K673OO6B.js.map → chunk-JAQHWHUN.js.map} +0 -0
  367. /package/dist/{chunk-MQ7YWBQ5.js.map → chunk-K4JSTGXT.js.map} +0 -0
  368. /package/dist/{chunk-55P6OBB7.js.map → chunk-KN4LUMH6.js.map} +0 -0
  369. /package/dist/{chunk-NZULV7LK.js.map → chunk-KZA3DITX.js.map} +0 -0
  370. /package/dist/{chunk-ECGXA4LT.js.map → chunk-L2VM64HK.js.map} +0 -0
  371. /package/dist/{chunk-LGGIFKJP.js.map → chunk-MAQBYBUX.js.map} +0 -0
  372. /package/dist/{chunk-ABU6A4Z5.js.map → chunk-MBPZMZVB.js.map} +0 -0
  373. /package/dist/{chunk-WFWFXDNS.js.map → chunk-MCNNZBG7.js.map} +0 -0
  374. /package/dist/{chunk-NIXRB5BP.js.map → chunk-MLVPMDOZ.js.map} +0 -0
  375. /package/dist/{chunk-BVF3SXD7.js.map → chunk-MMCN7TLK.js.map} +0 -0
  376. /package/dist/{chunk-PTJY5R3O.js.map → chunk-NCTN2FW4.js.map} +0 -0
  377. /package/dist/{chunk-UOZOWN73.js.map → chunk-ND6S2DKC.js.map} +0 -0
  378. /package/dist/{chunk-XKBTJGFP.js.map → chunk-NTVKHQ3L.js.map} +0 -0
  379. /package/dist/{chunk-UHFGK6YA.js.map → chunk-NXQEOC3X.js.map} +0 -0
  380. /package/dist/{chunk-UAKY6E4N.js.map → chunk-O2VQ3K36.js.map} +0 -0
  381. /package/dist/{chunk-JSWKVZCR.js.map → chunk-OGKMRIIJ.js.map} +0 -0
  382. /package/dist/{chunk-L2F3CFCH.js.map → chunk-ONZ3B5EW.js.map} +0 -0
  383. /package/dist/{chunk-AJFPAHMW.js.map → chunk-OOPSMQX5.js.map} +0 -0
  384. /package/dist/{chunk-QDHHHI5Q.js.map → chunk-OYEBSWLE.js.map} +0 -0
  385. /package/dist/{chunk-ZWF3EWZA.js.map → chunk-P6FATPXQ.js.map} +0 -0
  386. /package/dist/{chunk-QSHATAXJ.js.map → chunk-PLTIJDQN.js.map} +0 -0
  387. /package/dist/{chunk-V55JASXO.js.map → chunk-PR7ILCIH.js.map} +0 -0
  388. /package/dist/{chunk-X2RP4TO5.js.map → chunk-QE3TLZ6Z.js.map} +0 -0
  389. /package/dist/{chunk-QXJXG7DN.js.map → chunk-QFW4MYGN.js.map} +0 -0
  390. /package/dist/{chunk-2WJKJZSO.js.map → chunk-QHG7GQKM.js.map} +0 -0
  391. /package/dist/{chunk-FZXRLNJO.js.map → chunk-QT5ITL25.js.map} +0 -0
  392. /package/dist/{chunk-SNM7LSYG.js.map → chunk-R2ZULFXU.js.map} +0 -0
  393. /package/dist/{chunk-SPPOUJLN.js.map → chunk-RRTQAQ3N.js.map} +0 -0
  394. /package/dist/{chunk-L5A3KR7R.js.map → chunk-SALY3LIJ.js.map} +0 -0
  395. /package/dist/{chunk-SFCD6OU7.js.map → chunk-SBAR5JQ6.js.map} +0 -0
  396. /package/dist/{chunk-WHOKGHJ3.js.map → chunk-SCH2F7R2.js.map} +0 -0
  397. /package/dist/{chunk-JPSL5GIZ.js.map → chunk-SOOAW6HK.js.map} +0 -0
  398. /package/dist/{chunk-TMIJAR2X.js.map → chunk-T4VTRKCY.js.map} +0 -0
  399. /package/dist/{chunk-5LMCVBMY.js.map → chunk-T5EXREMW.js.map} +0 -0
  400. /package/dist/{chunk-YKGJ44Z7.js.map → chunk-TDJVQTXD.js.map} +0 -0
  401. /package/dist/{chunk-PUBI455O.js.map → chunk-THQ3BHLM.js.map} +0 -0
  402. /package/dist/{chunk-BMHQHH7Q.js.map → chunk-TLIFNRU5.js.map} +0 -0
  403. /package/dist/{chunk-PGC35KXE.js.map → chunk-TRHUNPXP.js.map} +0 -0
  404. /package/dist/{chunk-SWXLZ4HX.js.map → chunk-UL6MTRMJ.js.map} +0 -0
  405. /package/dist/{chunk-J4KAPKBJ.js.map → chunk-UORWAG7K.js.map} +0 -0
  406. /package/dist/{chunk-XXQ5XIYY.js.map → chunk-VLQ6KT7F.js.map} +0 -0
  407. /package/dist/{chunk-PT2YCQVK.js.map → chunk-VP37VUKQ.js.map} +0 -0
  408. /package/dist/{chunk-QGSNJD3B.js.map → chunk-WBUHHMLN.js.map} +0 -0
  409. /package/dist/{chunk-PFCTSXHU.js.map → chunk-X6Z2SIRF.js.map} +0 -0
  410. /package/dist/{chunk-XA34THLF.js.map → chunk-XLKWF3L4.js.map} +0 -0
  411. /package/dist/{chunk-K7RW7FI4.js.map → chunk-XPNJH7GN.js.map} +0 -0
  412. /package/dist/{chunk-RDOEOPOI.js.map → chunk-XPW7T2GN.js.map} +0 -0
  413. /package/dist/{chunk-EA4VDI5D.js.map → chunk-Y55XHMQB.js.map} +0 -0
  414. /package/dist/{chunk-BNFNQNEP.js.map → chunk-YJGKOSQD.js.map} +0 -0
  415. /package/dist/{chunk-3V6LZHUO.js.map → chunk-Z3STG43F.js.map} +0 -0
  416. /package/dist/{chunk-ZBUAX4EF.js.map → chunk-ZD7WFMV2.js.map} +0 -0
  417. /package/dist/{chunk-OM3SEDI4.js.map → chunk-ZF6JECDT.js.map} +0 -0
  418. /package/dist/{chunk-3Y5JLSXS.js.map → chunk-ZF7KNSLU.js.map} +0 -0
  419. /package/dist/{chunk-B65CC6Z6.js.map → chunk-ZGKODRGB.js.map} +0 -0
  420. /package/dist/{chunk-D4V5JJAK.js.map → chunk-ZNEKQFGF.js.map} +0 -0
  421. /package/dist/{chunk-D5A3GCZ4.js.map → chunk-ZUTUNVFD.js.map} +0 -0
  422. /package/dist/{chunk-G5EDYVSE.js.map → chunk-ZWMOHANW.js.map} +0 -0
  423. /package/dist/{classified-marker-KHDOYIJB.js.map → classified-marker-WKP33U2R.js.map} +0 -0
  424. /package/dist/{collection-facade-LZIF7GWD.js.map → collection-facade-COSGZKLC.js.map} +0 -0
  425. /package/dist/{computed-XMFTHAXV.js.map → computed-WN6V53ZV.js.map} +0 -0
  426. /package/dist/{dead-filter-CXV5NS67.js.map → dead-filter-43WL3Y5H.js.map} +0 -0
  427. /package/dist/{derive-3YSIS36W.js.map → delegation-5UWT4JGT.js.map} +0 -0
  428. /package/dist/{executor-E6YDJ7YA.js.map → derive-IL5JNLEE.js.map} +0 -0
  429. /package/dist/{dispatch-2MQFMEGY.js.map → dispatch-LOQQD5JK.js.map} +0 -0
  430. /package/dist/{dispatch-OFDA4WQV.js.map → dispatch-SHKTG57L.js.map} +0 -0
  431. /package/dist/{executor-NJX3YQQ4.js.map → executor-6PQ7WAGV.js.map} +0 -0
  432. /package/dist/{executor-WWM3DD4P.js.map → executor-6ZPQA6HS.js.map} +0 -0
  433. /package/dist/{export-accessible-RLHU5G4W.js.map → executor-OXRA64TY.js.map} +0 -0
  434. /package/dist/{extract-partition-QII2EDCS.js.map → export-accessible-XG3FKJWW.js.map} +0 -0
  435. /package/dist/{find-6M7GYDUZ.js.map → extract-partition-33747NY5.js.map} +0 -0
  436. /package/dist/{fanout-sidecar-BO67PCPO.js.map → fanout-sidecar-NEB6IYV7.js.map} +0 -0
  437. /package/dist/{issue-LPEEEMPP.js.map → find-VW543G3J.js.map} +0 -0
  438. /package/dist/{ledger-MSJGWKGW.js.map → issue-4ZPSY44M.js.map} +0 -0
  439. /package/dist/{liberate-LEKDYKTC.js.map → ledger-MZ25UFT2.js.map} +0 -0
  440. /package/dist/{link-set-QXXSPPHL.js.map → liberate-OJIP2ZFX.js.map} +0 -0
  441. /package/dist/{managed-secret-VSK7ANQI.js.map → link-set-4FRRAVTH.js.map} +0 -0
  442. /package/dist/{noydb-F2AUF6KL.js.map → managed-secret-SQWO2EUR.js.map} +0 -0
  443. /package/dist/{migrate-cek-GEBFYBDC.js.map → migrate-cek-JWEM4RP6.js.map} +0 -0
  444. /package/dist/{register-SN72QALV.js.map → noydb-U62OVKXB.js.map} +0 -0
  445. /package/dist/{pod-handle-YE7CT66T.js.map → pod-handle-R6Y4MILX.js.map} +0 -0
  446. /package/dist/{post-register-QC5TEAW3.js.map → post-register-GRVQHBOH.js.map} +0 -0
  447. /package/dist/{registry-253FF7C6.js.map → register-YJ5YLQ36.js.map} +0 -0
  448. /package/dist/{registry-3AZWQTDT.js.map → registry-ICOHBQFD.js.map} +0 -0
  449. /package/dist/{registry-7UEBTHWG.js.map → registry-MJ7MWCSW.js.map} +0 -0
  450. /package/dist/{registry-IVJ67NFQ.js.map → registry-MVEKKGWL.js.map} +0 -0
  451. /package/dist/{request-withdrawal-UKVJZKX2.js.map → registry-XP744FAP.js.map} +0 -0
  452. /package/dist/{revoke-G2KXJQA5.js.map → request-withdrawal-LSU4G6W3.js.map} +0 -0
  453. /package/dist/{reveal-YQTRNQFH.js.map → reveal-AIHOIK2N.js.map} +0 -0
  454. /package/dist/{signer-IUIYR3CX.js.map → revoke-QUT7WWG3.js.map} +0 -0
  455. /package/dist/{stale-SKV33PBU.js.map → signer-NYR4I3FO.js.map} +0 -0
  456. /package/dist/{storage-NPBYP2SM.js.map → stale-PIJPAL5T.js.map} +0 -0
  457. /package/dist/{walk-F4OLXI5H.js.map → storage-VH6SPXHC.js.map} +0 -0
  458. /package/dist/{store-coordination-provider-Z6HKPOGM.js.map → store-coordination-provider-2KSHCOPU.js.map} +0 -0
  459. /package/dist/{verify-KWQIWLGH.js.map → verify-PCFS4PNS.js.map} +0 -0
  460. /package/dist/{withdraw-accessible-ZKPLZ66E.js.map → walk-OZCN6LJS.js.map} +0 -0
@@ -656,7 +656,33 @@ export interface NoydbStore {
656
656
  capabilities?: StoreCapabilities;
657
657
  /** Get a single record. Returns null if not found. */
658
658
  get(vault: string, collection: string, id: string): Promise<EncryptedEnvelope | null>;
659
- /** Put a record. Throws ConflictError if expectedVersion doesn't match. */
659
+ /**
660
+ * Put a record. Throws ConflictError if `expectedVersion` doesn't match.
661
+ *
662
+ * ⚠️ **In this tree the comparison happens only when the record EXISTS**
663
+ * (`memory-store.ts`, `to-file`, `to-browser-idb` all read-then-compare),
664
+ * so against a missing id the `expectedVersion` is not a failed comparison
665
+ * — it is no comparison at all, and the write lands.
666
+ *
667
+ * That makes `expectedVersion: 0` an exact "must not exist": hub never stores
668
+ * a version below 1, so the first create is let through and every later one
669
+ * mismatches.
670
+ *
671
+ * ⭐ **Every record store in the family already agrees**, censused by reading
672
+ * source on 2026-09-24 — the twelve read-then-compare adapters, plus
673
+ * `to-aws-dynamo`, whose native condition is explicitly
674
+ * `#v = :expected OR attribute_not_exists(pk)`, plus `to-aws-s3`, which
675
+ * special-cases `expectedVersion === 0` BY NAME into a real precondition and
676
+ * throws `ConflictError('Concurrent create: …')`. `to-cloudflare-r2` and
677
+ * `to-supabase` inherit it by delegation.
678
+ *
679
+ * ⛔ **It is still not a contract, and that is the open question.**
680
+ * `@noy-db/ports/to` asserts none of it — its three CAS cases all operate on
681
+ * a record that already exists — so this convergence is held by nothing, and
682
+ * a third-party adapter owes it nothing. Tracked as core#134. hub's keyring
683
+ * create path passes no `expectedVersion` at all, and moving it is gated on
684
+ * that assertion landing, not on the adapters.
685
+ */
660
686
  put(vault: string, collection: string, id: string, envelope: EncryptedEnvelope, expectedVersion?: number): Promise<void>;
661
687
  /** Delete a record. */
662
688
  delete(vault: string, collection: string, id: string): Promise<void>;
@@ -1159,6 +1185,125 @@ export interface KeyringFile {
1159
1185
  * using standard/managed mode, or written before this extension.
1160
1186
  */
1161
1187
  readonly echo?: KeyringEchoBlock;
1188
+ /**
1189
+ * core#96 — the member's INBOX KEY PAIR, minted by the grantor at grant /
1190
+ * recovery time. `pub` is the SPKI public half, plaintext and bound into the
1191
+ * roster tag (a store must not be able to swap it for its own); `priv` is the
1192
+ * PKCS#8 private half sealed under the AES key in `deks[INBOX_KEY_ID]`, which
1193
+ * only this member's KEK unwraps. It lets an owner/admin hand this member a
1194
+ * DEK LATER, without the member's secret — see `inbox`.
1195
+ *
1196
+ * Absent on every keyring written before this existed: such a member can be
1197
+ * re-granted (re-keyed) but not amended in place (`MemberInboxMissingError`).
1198
+ */
1199
+ readonly inbox_key?: {
1200
+ readonly pub: string;
1201
+ readonly priv: {
1202
+ readonly iv: string;
1203
+ readonly data: string;
1204
+ };
1205
+ };
1206
+ /**
1207
+ * core#96 — DEKs delivered to this member by `updateUser` and not yet
1208
+ * drained: a random CEK RSA-OAEP-wrapped to `inbox_key.pub` (`cek`), and the
1209
+ * exported DEK set AES-GCM-sealed under that CEK (`iv`/`data`). `slots` names
1210
+ * the collections inside, plaintext, and is bound into the roster tag so the
1211
+ * rotation scope of a later `revoke` cannot be hidden from it.
1212
+ *
1213
+ * Drained by the member's next tier-1 unlock (`loadKeyring`): the DEKs move
1214
+ * into `deks` under the member's own KEK and the field is dropped. A member
1215
+ * who unlocks only through a tier-2 slot sees them at their next tier-1
1216
+ * open. A revoked admin who cached nothing but the file cannot open a box —
1217
+ * the private half never left this member's keyring.
1218
+ */
1219
+ readonly inbox?: ReadonlyArray<KeyringInboxBox>;
1220
+ }
1221
+ /**
1222
+ * core#96 / core#100 — one sealed delivery to a member: `slots` names the
1223
+ * collections inside (plaintext, tag-bound as the union over all boxes), `cek`
1224
+ * is a random key RSA-OAEP-wrapped to the member's inbox public half, and the
1225
+ * exported DEK set is AES-GCM under it. Deliveries APPEND a box (`updateUser`,
1226
+ * a rotation, a revoke); a caller can never open an earlier box (only the
1227
+ * member's private half can), so nothing is re-sealed or merged. The drain
1228
+ * opens the boxes in order — a later box wins a slot, so a rotation's new key
1229
+ * overrides an earlier pending one.
1230
+ */
1231
+ export interface KeyringInboxBox {
1232
+ readonly slots: readonly string[];
1233
+ readonly cek: string;
1234
+ readonly iv: string;
1235
+ readonly data: string;
1236
+ }
1237
+ /** core#76 — scope and mode for `vault.restoreTo(T)`. */
1238
+ export interface RestoreToOptions {
1239
+ /**
1240
+ * Restrict the restore to these collections. Omitted, every collection that
1241
+ * is live now OR appears in history is considered — the union matters,
1242
+ * because a collection dropped since T is absent from the live store and a
1243
+ * restore that skipped it would decline to bring back exactly what was lost.
1244
+ */
1245
+ readonly collections?: readonly string[];
1246
+ /**
1247
+ * Compute the diff and write NOTHING. The result names every id that would
1248
+ * be written or deleted, per collection, so an admin sees the blast radius
1249
+ * before committing to it.
1250
+ */
1251
+ readonly dryRun?: boolean;
1252
+ }
1253
+ /** core#76 — what `restoreTo(T)` did, or (with `dryRun`) would do. */
1254
+ export interface RestoreToResult {
1255
+ /** The target instant, as given. */
1256
+ readonly restoredTo: string;
1257
+ /** True when nothing was written. */
1258
+ readonly dryRun: boolean;
1259
+ /** Records put back to their state at T. */
1260
+ readonly written: number;
1261
+ /** Records that exist now and did not exist at T. */
1262
+ readonly deleted: number;
1263
+ /** Records already identical to their state at T. */
1264
+ readonly unchanged: number;
1265
+ /** Per collection, only where something happened. */
1266
+ readonly collections: Readonly<Record<string, {
1267
+ written: string[];
1268
+ deleted: string[];
1269
+ unchanged: number;
1270
+ }>>;
1271
+ }
1272
+ /** core#77 — how `vault.load()` reconciles a pod against the current store. */
1273
+ export interface LoadPodOptions {
1274
+ /**
1275
+ * `'replace'` (default) is the historical behaviour: `saveAll` the data
1276
+ * collections and rewrite the internal ones. Whole-vault replace,
1277
+ * destructive on SQL adapters, and every envelope is written whether or not
1278
+ * the store already holds it byte-identical.
1279
+ *
1280
+ * `'incremental'` writes only what DIFFERS — envelopes whose `(id, _v)` the
1281
+ * store does not already have — and deletes ids the pod does not carry. ⭐
1282
+ * The END STATE IS THE SAME; only the cost differs. In particular a restore
1283
+ * still rewinds (core#111): ids absent from the pod are deleted, never left
1284
+ * behind, so this is not a merge.
1285
+ *
1286
+ * ⛔ Valid only when the pod and the store are the same vault. A pod from
1287
+ * another vault is refused, because "write only the differences" between
1288
+ * unrelated vaults is not a restore, it is a silent union.
1289
+ */
1290
+ readonly mode?: 'replace' | 'incremental';
1291
+ }
1292
+ /** core#77 — what an incremental load did, per collection and in total. */
1293
+ export interface LoadPodResult {
1294
+ readonly mode: 'replace' | 'incremental';
1295
+ /** Envelopes written because the store lacked them at that version. */
1296
+ readonly written: number;
1297
+ /** Envelopes already present byte-for-version — the saving. */
1298
+ readonly skipped: number;
1299
+ /** Ids the store held and the pod does not carry. */
1300
+ readonly deleted: number;
1301
+ /** Per collection, only where something happened. */
1302
+ readonly collections: Readonly<Record<string, {
1303
+ written: number;
1304
+ skipped: number;
1305
+ deleted: number;
1306
+ }>>;
1162
1307
  }
1163
1308
  export interface VaultBackup {
1164
1309
  readonly _noydb_backup: typeof NOYDB_BACKUP_VERSION;
@@ -1322,7 +1467,13 @@ export interface DirtyEntry {
1322
1467
  readonly vault: string;
1323
1468
  readonly collection: string;
1324
1469
  readonly id: string;
1325
- readonly action: 'put' | 'delete';
1470
+ /**
1471
+ * `rekey` (core#100): a DEK rotation re-encrypted this record IN PLACE — same
1472
+ * `_v`, new bytes. Pushed with a CAS at the CURRENT version (a `put` expects
1473
+ * `version - 1`), so a target still at that version takes the new ciphertext
1474
+ * and one that moved on reports a conflict as usual.
1475
+ */
1476
+ readonly action: 'put' | 'delete' | 'rekey';
1326
1477
  readonly version: number;
1327
1478
  readonly timestamp: string;
1328
1479
  }
@@ -1331,6 +1482,32 @@ export interface SyncMetadata {
1331
1482
  readonly last_push: string | null;
1332
1483
  readonly last_pull: string | null;
1333
1484
  readonly dirty: DirtyEntry[];
1485
+ /** core#72 — the target's restore epoch this device last adopted (`_sync/epoch` on the target). Absent before any restore. */
1486
+ readonly epoch?: number;
1487
+ }
1488
+ /**
1489
+ * core#72 — the record a restorer writes on the target at `_sync/epoch`:
1490
+ * "the vault was REPLACED; merge nothing across this line, resync." Peers read
1491
+ * it at the start of every pull; a newer epoch than the one they adopted parks
1492
+ * their pre-epoch local edits and adopts the target wholesale.
1493
+ */
1494
+ export interface SyncEpochRecord {
1495
+ readonly epoch: number;
1496
+ readonly at: string;
1497
+ readonly by: string;
1498
+ readonly replaced: number;
1499
+ readonly tombstoned: number;
1500
+ }
1501
+ /** core#72 — what `db.replaceRemote(vault)` did. */
1502
+ export interface ReplaceRemoteResult {
1503
+ /** The epoch now on the target. */
1504
+ readonly epoch: number;
1505
+ /** Local records written to the target unconditionally (re-versioned above the target's copy where needed). */
1506
+ readonly replaced: number;
1507
+ /** Ids the target held that the local vault does not: delete markers written, so every peer removes them. */
1508
+ readonly tombstoned: number;
1509
+ /** Reserved-collection records mirrored (keyrings, users, broker seeds). */
1510
+ readonly reserved: number;
1334
1511
  }
1335
1512
  export interface Conflict {
1336
1513
  readonly vault: string;
@@ -1348,6 +1525,66 @@ export interface Conflict {
1348
1525
  */
1349
1526
  readonly resolve?: (winner: EncryptedEnvelope | null) => void;
1350
1527
  }
1528
+ /** core#74 — one record a pull applied. */
1529
+ export interface SyncApplied {
1530
+ readonly collection: string;
1531
+ readonly id: string;
1532
+ readonly action: 'put' | 'delete';
1533
+ /** The local copy this replaced, when there was one at a lower version: its version and its author (`_by`). */
1534
+ readonly replaced?: {
1535
+ readonly version: number;
1536
+ readonly by?: string;
1537
+ };
1538
+ }
1539
+ /** core#74 — one record a pull refused at admission. Emitted as `sync:rejected` and listed by `db.rejected(vault)`. */
1540
+ export interface SyncRejection {
1541
+ readonly vault: string;
1542
+ readonly collection: string;
1543
+ readonly id: string;
1544
+ /** The gate's or hook's message. */
1545
+ readonly reason: string;
1546
+ /** The refused envelope's version. */
1547
+ readonly version: number;
1548
+ /** The refused envelope's author, when it carries one. */
1549
+ readonly by?: string;
1550
+ /** ISO time of the refusal — when it was JUDGED, on the judging device. */
1551
+ readonly at: string;
1552
+ /**
1553
+ * core#107 (pilot-1, witnessed) — ISO time the refused RECORD was written,
1554
+ * from its envelope. Present when the envelope carries one.
1555
+ *
1556
+ * ⭐ Why both: an arbiter judges at PULL time, not at write time, so a
1557
+ * record legitimately written and pushed while a period was open can be
1558
+ * refused later when it re-closes. Under report-only that is harmless, but
1559
+ * a notice saying only `at` reads as "your push was wrong". With `recordAt`
1560
+ * a UI can say what actually happened — written then, refused now.
1561
+ */
1562
+ readonly recordAt?: string;
1563
+ /**
1564
+ * core#108 — which judgement refused it. Set on every path since core#107;
1565
+ * ⚠️ absent only on a rejection parked by an older hub. `'sync-apply'` is a
1566
+ * record that ARRIVED here and was turned away. `'push-recheck'`
1567
+ * is this device's OWN record, refused on the way out: it is still in the
1568
+ * local store and still dirty, so it pushes by itself as soon as it passes
1569
+ * again. ⛔ `readmit()` is a sync-apply affordance — for a push-recheck
1570
+ * parking there is nothing to re-apply, the record never left.
1571
+ *
1572
+ * core#107 — `'arbiter'` is a refusal made on ANOTHER device (the vault's
1573
+ * configured arbiter) and replicated here, which is how the writer finds
1574
+ * out at all. It is REPORT ONLY: the local record is untouched, never
1575
+ * deleted or hidden, and `readmit()` is meaningless for it too — this
1576
+ * device never refused anything.
1577
+ */
1578
+ readonly origin?: 'sync-apply' | 'push-recheck' | 'arbiter';
1579
+ }
1580
+ /** core#74 — what `db.rejected(vault)` returns: the parked envelopes and their two fates. */
1581
+ export interface SyncRejectedApi {
1582
+ list(): Promise<readonly SyncRejection[]>;
1583
+ /** Apply the parked envelope after all — bypassing the gate that refused it — and drop the parking record. */
1584
+ readmit(collection: string, id: string): Promise<void>;
1585
+ /** Drop the parking record; the local copy stays as it was. */
1586
+ discard(collection: string, id: string): Promise<void>;
1587
+ }
1351
1588
  /**
1352
1589
  * #590: sync suppressed a live envelope because a crypto-shred tombstone is
1353
1590
  * terminal for its record id. Reported on push/pull results (`erasures`) and
@@ -1415,11 +1652,55 @@ export type CollectionConflictResolver = (id: string, local: EncryptedEnvelope,
1415
1652
  export interface PushOptions {
1416
1653
  /** Only push records belonging to these collections. Omit to push all dirty. */
1417
1654
  collections?: string[];
1655
+ /**
1656
+ * core#92 — "everything local is authoritative, send it": mark EVERY record
1657
+ * in the local store dirty before pushing, so records that reached the store
1658
+ * with no target present (written before `attachSyncTarget()`, or loaded
1659
+ * from a pod — core#71's shape) are pushed. CAS still applies per record:
1660
+ * a remote that already advanced a record resolves through the ordinary
1661
+ * conflict path. Default `false`.
1662
+ */
1663
+ full?: boolean;
1664
+ /**
1665
+ * core#93 — bounded parallelism over the dirty entries: this many in-flight
1666
+ * puts at once. Each record keeps its own CAS and conflict path; only the
1667
+ * interleaving changes. Default `1` (serial, byte-for-byte the previous
1668
+ * behaviour). A cloud store with ~45 ms per put goes from N×45 ms to
1669
+ * roughly N×45/concurrency ms.
1670
+ *
1671
+ * ⚠️ **There is a ceiling, and it is the STORE's partition, not this pool.**
1672
+ * Measured on `to-aws-dynamo` (noy-db/to#10, 300 records against a latency
1673
+ * fake): 1-wide 14.1 s, 8-wide 1.79 s, 32-wide 0.48 s — linear, because
1674
+ * nothing in the adapter serializes. That is not permission to go there
1675
+ * against a real table. The single-table layout puts every record of a vault
1676
+ * under ONE partition key — the vault name IS the whole partition key, which
1677
+ * is the same decision that makes `loadAll()` a single Query — and a
1678
+ * DynamoDB partition tops out at ~1000 write units per second, with an
1679
+ * envelope over 1 KB costing more than one unit. 8-wide at ~45 ms is ~178
1680
+ * writes/sec, comfortably under; raising the knob far past that meets
1681
+ * per-partition throttling, not a connection-pool limit, so a bigger pool is
1682
+ * not the fix. `8` is the number pilot-1 runs and the one to start from.
1683
+ */
1684
+ concurrency?: number;
1418
1685
  }
1419
1686
  /** Options for targeted pull operations. */
1420
1687
  export interface PullOptions {
1421
1688
  /** Only pull these collections. Omit to pull all. */
1422
1689
  collections?: string[];
1690
+ /**
1691
+ * core#81 — walk the remote page by page instead of `loadAll()`: memory is
1692
+ * bounded by one page, and the total is known BEFORE the first record is
1693
+ * applied (one `list()` per collection), so `sync:progress` is real from
1694
+ * the start. Uses the store's `listPage` when it offers one, else
1695
+ * `list` + `get` in batches.
1696
+ *
1697
+ * ⚠️ Scope, stated: the store contract cannot enumerate collections, so a
1698
+ * paged pull walks the collections THIS keyring names (its DEK map) plus
1699
+ * any `collections` filter — the ones the caller can open. A full pull
1700
+ * also carries ciphertext for collections the caller holds no key for;
1701
+ * paged mode cannot. Default `false`.
1702
+ */
1703
+ paged?: boolean;
1423
1704
  /**
1424
1705
  * Only pull records with `_ts` strictly after this ISO timestamp.
1425
1706
  * Stores that implement `listSince` use it directly; others fall back
@@ -1451,6 +1732,29 @@ export interface PushResult {
1451
1732
  readonly errors: Error[];
1452
1733
  /** #590: tombstone enforcements applied during this run (never resolver-visible). */
1453
1734
  readonly erasures?: ErasureEnforcement[];
1735
+ /**
1736
+ * core#96 — reserved-collection records mirrored by this run (`_keyring`,
1737
+ * `_users`, `_broker*`, …): they travel outside the dirty log, so `pushed`
1738
+ * / `pulled` never count them. Present when non-zero, so "did my new key
1739
+ * get out" is observable. A local `_keyring` the target already supersedes
1740
+ * is reported in `conflicts` (collection `_keyring`), never silently dropped.
1741
+ */
1742
+ readonly reserved?: number;
1743
+ /**
1744
+ * core#108 — this device's own dirty records, refused by its OWN gates when
1745
+ * re-judged against current local state just before the push. They were
1746
+ * WITHHELD: nothing left for them, the local copy is untouched, and they
1747
+ * stay dirty so a later push carries them once the rule passes. Present
1748
+ * when non-zero.
1749
+ *
1750
+ * ⛔ NOT AN ERROR, and a sync indicator must not render it as one (pilot-1,
1751
+ * on the shipped behaviour). `pushed: 0` with `rejected` present means
1752
+ * "N records waiting on a rule", not "N records failed": nothing was lost,
1753
+ * nothing needs resubmitting, and the next push carries them by itself once
1754
+ * the rule passes. The failure fates are `errors` and `conflicts`; this is
1755
+ * a third thing and reads as a queue, not a fault.
1756
+ */
1757
+ readonly rejected?: SyncRejection[];
1454
1758
  }
1455
1759
  /**
1456
1760
  * core#81 — a progress sample during a pull or push. Emitted as
@@ -1487,6 +1791,38 @@ export interface PullResult {
1487
1791
  readonly errors: Error[];
1488
1792
  /** #590: tombstone enforcements applied during this run (never resolver-visible). */
1489
1793
  readonly erasures?: ErasureEnforcement[];
1794
+ /** core#96 — reserved-collection records mirrored (copied + deleted) by this run; see `PushResult.reserved`. */
1795
+ readonly reserved?: number;
1796
+ /**
1797
+ * core#74 — every record this pull APPLIED, in order, with what it replaced
1798
+ * when the local copy was superseded. This is the per-record visibility a
1799
+ * count cannot give: an app can list what arrived, and a writer whose record
1800
+ * was overwritten by a newer version from another device sees `replaced`
1801
+ * — the "you lost" the conflict path never told it (same-id concurrent edits
1802
+ * resolve to the LAST pusher, reported to that pusher only). Present when
1803
+ * non-empty.
1804
+ */
1805
+ readonly applied?: readonly SyncApplied[];
1806
+ /**
1807
+ * core#74 — records this pull REFUSED at admission: a `beforePut` gate or a
1808
+ * `db.onBeforeWrite` hook on this device threw for the incoming record (a
1809
+ * write into a period closed here, say). Each is parked under
1810
+ * `_sync_rejected` with the envelope intact; the local copy is untouched.
1811
+ * `db.rejected(vault)` lists, readmits or discards them. Present when
1812
+ * non-empty.
1813
+ */
1814
+ readonly rejected?: readonly SyncRejection[];
1815
+ /** core#72 — the target's restore epoch, when the target carries one. */
1816
+ readonly epoch?: number;
1817
+ /**
1818
+ * core#72 — this pull crossed a restore epoch: the target was REPLACED since
1819
+ * this device last synced (`db.replaceRemote` on another device). Every
1820
+ * local edit not yet pushed was parked under `_sync_rejected` (reason
1821
+ * `restore-epoch`, listed by `db.rejected(vault)`), the dirty log was
1822
+ * dropped, and the target's state was adopted wholesale — records the
1823
+ * restore removed arrive as delete markers.
1824
+ */
1825
+ readonly resynced?: true;
1490
1826
  /**
1491
1827
  * #807: present on period-scoped pulls only — per-phase KPI counters
1492
1828
  * (`summaries` = the `_periods` navigation index + companions; `records`
@@ -1524,6 +1860,8 @@ export interface SyncStatus {
1524
1860
  readonly lastPush: string | null;
1525
1861
  /** As {@link SyncStatus.lastPush}, for pulls: last pull that had no errors. */
1526
1862
  readonly lastPull: string | null;
1863
+ /** core#72 — the target's restore epoch this device has adopted, when any. */
1864
+ readonly epoch?: number;
1527
1865
  /** core#81 — the running sync's latest progress sample, or absent when idle. */
1528
1866
  readonly inFlight?: SyncProgress;
1529
1867
  /**
@@ -1615,6 +1953,8 @@ export interface SyncTargetStatus {
1615
1953
  readonly lastPush: string | null;
1616
1954
  /** Last pull that completed with no errors, or `null`. */
1617
1955
  readonly lastPull: string | null;
1956
+ /** core#72 — the target's restore epoch this device has adopted, when any. */
1957
+ readonly epoch?: number;
1618
1958
  /**
1619
1959
  * Nothing queued for this target — `dirty === 0`.
1620
1960
  *
@@ -1673,6 +2013,19 @@ export interface NoydbEventMap {
1673
2013
  'sync:progress': SyncProgress;
1674
2014
  'sync:erasure': ErasureEnforcement;
1675
2015
  'sync:conflict': Conflict;
2016
+ /** core#74 — a pulled record refused by this device's admission gate; parked under `_sync_rejected`. */
2017
+ 'sync:rejected': SyncRejection;
2018
+ /** core#72 — this device replaced a target: the epoch it wrote and the counts. */
2019
+ 'sync:replace': ReplaceRemoteResult & {
2020
+ readonly vault: string;
2021
+ };
2022
+ /** core#72 — a pull crossed a restore epoch on the target; the local dirty log was parked and the target adopted. */
2023
+ 'sync:epoch': {
2024
+ readonly vault: string;
2025
+ readonly from: number | null;
2026
+ readonly to: number;
2027
+ readonly parked: number;
2028
+ };
1676
2029
  'write:conflict': WriteConflict;
1677
2030
  'sync:online': void;
1678
2031
  'sync:offline': void;
@@ -1857,15 +2210,24 @@ export interface GrantOptions {
1857
2210
  readonly initialProfile?: unknown;
1858
2211
  }
1859
2212
  /**
1860
- * Caller payload for `db.updateUser`. Mutate one or more
1861
- * identity fields on an existing keyring without rotating any keys.
2213
+ * Caller payload for `db.updateUser`: change what an EXISTING member may
2214
+ * do, without holding their secret.
1862
2215
  *
1863
2216
  * `role`, `displayName`, and `permissions` live in the plaintext header
1864
2217
  * of `_keyring/<userId>` (the sync engine reads them without keys).
1865
- * Mutating them is a JSON header swap — no DEK rewrap, no KEK
1866
- * required, no authenticator slots touched. Tier-2 slots and recovery
1867
- * enrollments survive unchanged. Last-write-wins through the existing
1868
- * keyring put (same concurrency story as `db.grant` / `db.revoke`).
2218
+ * The member's KEK, salt, authenticator slots and recovery enrollments
2219
+ * are untouched. Last-write-wins through the existing keyring put (same
2220
+ * concurrency story as `db.grant` / `db.revoke`).
2221
+ *
2222
+ * core#96 — a change that WIDENS access (a new collection, a wrap-all
2223
+ * role) delivers the DEKs the member lacks through their keyring inbox
2224
+ * (`KeyringFile.inbox`): sealed to the member's inbox key pair, drained at
2225
+ * their next tier-1 unlock. A change that NARROWS access drops the DEKs
2226
+ * and rotates those collections, exactly as a narrowing `grant` does
2227
+ * (#1097). Before this existed, `updateUser` could name a collection the
2228
+ * member had no key for — a permanently blind slot — and `grant` was the
2229
+ * only widening path, which re-keys the member and needs their CURRENT
2230
+ * secret. Use `grant` to create or re-key; use this to change access.
1869
2231
  *
1870
2232
  * Top-level fields are partial-merge: absent fields are not modified.
1871
2233
  * `null` on `displayName` clears the field (stored as the empty string;
@@ -1,7 +1,7 @@
1
1
  import type { OpenCollectionOptions } from '../port/with/collection-options.js';
2
2
  import type { StrategyBag } from '../port/with/strategies.js';
3
3
  import type { NoydbFormat, ImportPlan, FormatExportOptions, FormatImportOptions } from '../port/with/formats-strategy.js';
4
- import type { NoydbStore, EncryptedEnvelope, HistoryConfig, ExportStreamOptions, ExportChunk, CollectionConflictResolver, CrossTierAccessEvent, Role, VaultUserApi, CollectionShape, SensitiveOf, IndexedOf, MoneyOf } from './types.js';
4
+ import type { NoydbStore, EncryptedEnvelope, SyncRejection, LoadPodOptions, LoadPodResult, RestoreToOptions, RestoreToResult, HistoryConfig, ExportStreamOptions, ExportChunk, CollectionConflictResolver, CrossTierAccessEvent, Role, VaultUserApi, CollectionShape, SensitiveOf, IndexedOf, MoneyOf } from './types.js';
5
5
  import type { Noydb } from './noydb.js';
6
6
  import type { IssueDelegationOptions, DelegationToken } from '../with-party/team/delegation.js';
7
7
  import { Collection } from './collection.js';
@@ -69,7 +69,7 @@ export declare class Vault {
69
69
  private keyring;
70
70
  private readonly encrypted;
71
71
  private readonly emitter;
72
- private readonly onDirty;
72
+ private onDirty;
73
73
  private readonly onRegisterConflictResolver;
74
74
  private readonly syncAdapter;
75
75
  private readonly getPurgeableTargets;
@@ -140,6 +140,7 @@ export declare class Vault {
140
140
  * `load()` after the on-disk keyring file has been replaced. Provided by Noydb at openVault()
141
141
  * time; `undefined` in tests that construct Vault directly (load() then skips the refresh). */
142
142
  private readonly reloadKeyring;
143
+ private readonly onRestore;
143
144
  private readonly collectionCache;
144
145
  private satelliteRegistry;
145
146
  /** Vault-level schema cutover fence/controller. */
@@ -239,7 +240,7 @@ export declare class Vault {
239
240
  /** — currently-active elevation, or null. One per vault. */
240
241
  private activeElevation;
241
242
  /**
242
- * Optional translator callback threaded from `Noydb.invokeTranslator`.
243
+ * Optional translator callback threaded from `Noydb._invokeTranslator`.
243
244
  * Present only when `plaintextTranslator` was configured on `createNoydb()`.
244
245
  */
245
246
  private readonly translateText;
@@ -253,6 +254,8 @@ export declare class Vault {
253
254
  onDirty?: OnDirtyCallback | undefined;
254
255
  historyConfig?: HistoryConfig | undefined;
255
256
  reloadKeyring?: (() => Promise<UnlockedKeyring>) | undefined;
257
+ /** core#71 — reset the vault's sync engines after a restore (`load()`). */
258
+ onRestore?: (() => Promise<void>) | undefined;
256
259
  /** Vault-default locale. */
257
260
  locale?: string | undefined;
258
261
  /** Translator callback from Noydb. */
@@ -373,6 +376,17 @@ export declare class Vault {
373
376
  * its already-warmed `LookupHandle._syncCache` (membership/altIndex/snapshot reads never see a
374
377
  * stale verdict for a pulled vocabulary edit) and collect the touch into any open graph batch
375
378
  * (the sync-apply wave-reachability seam Task 5's ref edges will use). No-op if never warmed. */
379
+ /** core#74 — admission of a sync-applied record: the collection's own gates and hooks judge it. Reserved names are never gated. @internal */
380
+ _admitRemote(collection: string, id: string, envelope: EncryptedEnvelope, origin?: 'sync-apply' | 'push-recheck'): Promise<{
381
+ admitted: true;
382
+ } | {
383
+ admitted: false;
384
+ reason: string;
385
+ }>;
386
+ /** @internal core#107 — seal a refusal under the refused record's own collection DEK. `null`: no DEK here. */
387
+ _sealRejection(collection: string, id: string, rejection: SyncRejection, version: number): Promise<EncryptedEnvelope | null>;
388
+ /** @internal core#107 — open a replicated refusal. `null` when this device holds no DEK for it. */
389
+ _openRejection(collection: string, id: string, envelope: EncryptedEnvelope): Promise<SyncRejection | null>;
376
390
  _invalidateSyncApplied(collection: string, id: string, action: 'put' | 'delete'): Promise<void>;
377
391
  /** @internal #650 Task 4 (#647) — declared reserved-lookup collection names, for `SyncEngine.pull()`'s explicit prefix registry. */
378
392
  _reservedLookupCollectionNames(): readonly string[];
@@ -1152,7 +1166,7 @@ export declare class Vault {
1152
1166
  * collection.
1153
1167
  */
1154
1168
  delegate(opts: IssueDelegationOptions): Promise<DelegationToken>;
1155
- /** Merge live delegations into the keyring — core#56's read half. Explicit, not automatic; cross-user delegation does not work yet. Both reasons: `with-party/team/delegation.ts`. */
1169
+ /** Merge live delegations addressed to this user into the keyring — core#56's read half, cross-user since core#65. Explicit, never automatic: `with-party/team/delegation.ts` says why. */
1156
1170
  refreshDelegations(now?: Date): Promise<DelegationToken[]>;
1157
1171
  /**
1158
1172
  * revoke an issued delegation by id. Safe to call even
@@ -1391,6 +1405,8 @@ export declare class Vault {
1391
1405
  * collection-cache clear, ledger-store reset) that `load()` performs on this
1392
1406
  * Vault's private state.
1393
1407
  */
1408
+ /** core#90 — the first `attachSyncTarget()` on a vault opened without one: from here every write is dirty-tracked. Cached collection handles are rebuilt (as after `load()`); re-acquire handles obtained before the attach. */
1409
+ _enableSync(onDirty: OnDirtyCallback): void;
1394
1410
  /** core#82 — sync pulled a newer copy of THIS user's keyring file: reload it in place, rebuild the DEK resolver, drop cached collections. */
1395
1411
  _reloadKeyringAfterSync(): Promise<void>;
1396
1412
  private backupContext;
@@ -1416,7 +1432,25 @@ export declare class Vault {
1416
1432
  * with a console warning and skip the integrity check entirely
1417
1433
  * — there's no chain to verify against.
1418
1434
  */
1419
- load(backupJson: string): Promise<void>;
1435
+ /**
1436
+ * core#76 — restore this vault to its state at `timestamp`, as FORWARD
1437
+ * WRITES. Every record whose state at T differs from its state now is put
1438
+ * back at T's value; every record that exists now and did not exist at T is
1439
+ * deleted.
1440
+ *
1441
+ * ⭐ The writes go through `Collection.put`/`.delete`, so guards, periods,
1442
+ * history and the ledger all see them. The restore is therefore an audited,
1443
+ * reversible event that replicates through ordinary sync — no pod, and none
1444
+ * of the state-replacement machinery core#71/#72 exists to make safe.
1445
+ *
1446
+ * `{ dryRun: true }` returns the same report having written nothing.
1447
+ *
1448
+ * ⚠️ Bounded by history retention, and ⛔ blobs are not restored — see the
1449
+ * module header on `with-commit/history/restore-to.ts`, which states both
1450
+ * limits and why the blob one is not reported rather than reported empty.
1451
+ */
1452
+ restoreTo(timestamp: string | Date, options?: RestoreToOptions): Promise<RestoreToResult>;
1453
+ load(backupJson: string, options?: LoadPodOptions): Promise<LoadPodResult>;
1420
1454
  /**
1421
1455
  * End-to-end backup integrity check. Runs both:
1422
1456
  *
@@ -3,7 +3,7 @@ import {
3
3
  LedgerStore,
4
4
  applyPatch,
5
5
  computePatch
6
- } from "./chunk-L2F3CFCH.js";
6
+ } from "./chunk-ONZ3B5EW.js";
7
7
  import {
8
8
  LEDGER_COLLECTION,
9
9
  LEDGER_DELTAS_COLLECTION
@@ -15,15 +15,15 @@ import {
15
15
  paddedIndex,
16
16
  parseIndex,
17
17
  sha256Hex
18
- } from "./chunk-2WJKJZSO.js";
19
- import "./chunk-4J3MNVVX.js";
20
- import "./chunk-ZBUAX4EF.js";
21
- import "./chunk-SPPOUJLN.js";
18
+ } from "./chunk-QHG7GQKM.js";
19
+ import "./chunk-WRLWEYHY.js";
20
+ import "./chunk-ZD7WFMV2.js";
21
+ import "./chunk-RRTQAQ3N.js";
22
22
  import "./chunk-NH2UOV3B.js";
23
- import "./chunk-OM3SEDI4.js";
24
- import "./chunk-PUBI455O.js";
25
- import "./chunk-2ELOCEXE.js";
26
- import "./chunk-VSUQI5Q6.js";
23
+ import "./chunk-ZF6JECDT.js";
24
+ import "./chunk-THQ3BHLM.js";
25
+ import "./chunk-XX4R7TUB.js";
26
+ import "./chunk-IKPQ2GGB.js";
27
27
  export {
28
28
  LEDGER_COLLECTION,
29
29
  LEDGER_DELTAS_COLLECTION,
@@ -37,4 +37,4 @@ export {
37
37
  parseIndex,
38
38
  sha256Hex
39
39
  };
40
- //# sourceMappingURL=ledger-MSJGWKGW.js.map
40
+ //# sourceMappingURL=ledger-MZ25UFT2.js.map
@@ -0,0 +1,25 @@
1
+ import {
2
+ liberateVault
3
+ } from "./chunk-LUCQY3OM.js";
4
+ import "./chunk-R2ZULFXU.js";
5
+ import "./chunk-KN4LUMH6.js";
6
+ import "./chunk-NTVKHQ3L.js";
7
+ import "./chunk-XPW7T2GN.js";
8
+ import "./chunk-DMIEKD24.js";
9
+ import "./chunk-GMKGGY7V.js";
10
+ import "./chunk-V7AKGAXY.js";
11
+ import "./chunk-QT5ITL25.js";
12
+ import "./chunk-NXQEOC3X.js";
13
+ import "./chunk-2LBS62AC.js";
14
+ import "./chunk-WRLWEYHY.js";
15
+ import "./chunk-ZD7WFMV2.js";
16
+ import "./chunk-RRTQAQ3N.js";
17
+ import "./chunk-NH2UOV3B.js";
18
+ import "./chunk-ZF6JECDT.js";
19
+ import "./chunk-THQ3BHLM.js";
20
+ import "./chunk-XX4R7TUB.js";
21
+ import "./chunk-IKPQ2GGB.js";
22
+ export {
23
+ liberateVault
24
+ };
25
+ //# sourceMappingURL=liberate-OJIP2ZFX.js.map