@noy-db/hub 0.1.0-pre.14 → 0.1.0-pre.16

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 (232) hide show
  1. package/dist/aggregate/index.cjs +91 -36
  2. package/dist/aggregate/index.cjs.map +1 -1
  3. package/dist/aggregate/index.d.cts +2 -2
  4. package/dist/aggregate/index.d.ts +2 -2
  5. package/dist/aggregate/index.js +15 -8
  6. package/dist/aggregate/index.js.map +1 -1
  7. package/dist/blobs/index.cjs.map +1 -1
  8. package/dist/blobs/index.d.cts +5 -4
  9. package/dist/blobs/index.d.ts +5 -4
  10. package/dist/blobs/index.js +4 -4
  11. package/dist/bundle/index.cjs +214 -7
  12. package/dist/bundle/index.cjs.map +1 -1
  13. package/dist/bundle/index.d.cts +5 -4
  14. package/dist/bundle/index.d.ts +5 -4
  15. package/dist/bundle/index.js +6 -4
  16. package/dist/{chunk-CX2S2IBB.js → chunk-23TTQXVO.js} +53 -79
  17. package/dist/chunk-23TTQXVO.js.map +1 -0
  18. package/dist/{chunk-WLZWITX3.js → chunk-2AXFIYHT.js} +1 -1
  19. package/dist/chunk-2AXFIYHT.js.map +1 -0
  20. package/dist/{chunk-SBOSKCXD.js → chunk-2R6G2WST.js} +209 -13
  21. package/dist/chunk-2R6G2WST.js.map +1 -0
  22. package/dist/{chunk-HENWE2QQ.js → chunk-34YSDCDP.js} +2 -2
  23. package/dist/{chunk-3J5PYYUL.js → chunk-5DWL3JBF.js} +2 -2
  24. package/dist/{chunk-562AT3V6.js → chunk-5NGHX6ME.js} +5 -5
  25. package/dist/chunk-5ZGZ6HIZ.js +100 -0
  26. package/dist/chunk-5ZGZ6HIZ.js.map +1 -0
  27. package/dist/{chunk-ZJICDHNH.js → chunk-6HPZY4ON.js} +5 -4
  28. package/dist/chunk-6HPZY4ON.js.map +1 -0
  29. package/dist/{chunk-LTKFPLTW.js → chunk-A3K2ECAM.js} +192 -11
  30. package/dist/chunk-A3K2ECAM.js.map +1 -0
  31. package/dist/{chunk-W7M3E5M5.js → chunk-ADQ5MQ54.js} +48 -1
  32. package/dist/{chunk-W7M3E5M5.js.map → chunk-ADQ5MQ54.js.map} +1 -1
  33. package/dist/{chunk-Q3OWJPJI.js → chunk-DPMFBCV6.js} +32 -19
  34. package/dist/chunk-DPMFBCV6.js.map +1 -0
  35. package/dist/{chunk-AD4FMCXZ.js → chunk-DYBQG5PQ.js} +2 -2
  36. package/dist/{chunk-PNTWORBA.js → chunk-DYECX3IX.js} +2 -2
  37. package/dist/chunk-EGQYGYIU.js +51 -0
  38. package/dist/chunk-EGQYGYIU.js.map +1 -0
  39. package/dist/{chunk-RGHN6WV7.js → chunk-FCXOFQAJ.js} +2 -2
  40. package/dist/{chunk-PMMNH7VZ.js → chunk-H7XROQJM.js} +1 -1
  41. package/dist/chunk-H7XROQJM.js.map +1 -0
  42. package/dist/chunk-HB3Z2GCR.js +124 -0
  43. package/dist/chunk-HB3Z2GCR.js.map +1 -0
  44. package/dist/{chunk-CRNMA2FB.js → chunk-I6MX32UC.js} +4 -4
  45. package/dist/{chunk-PHSGPPV7.js → chunk-KESP7GOK.js} +3 -3
  46. package/dist/{chunk-FB34MDSJ.js → chunk-KJJKHKFP.js} +4 -4
  47. package/dist/{chunk-J3E2UMET.js → chunk-MIQHZESA.js} +3 -3
  48. package/dist/{chunk-TNYWH7Z2.js → chunk-MKSA2V7A.js} +2 -2
  49. package/dist/{chunk-E4ZSYZSN.js → chunk-NVBUGT76.js} +4 -4
  50. package/dist/{chunk-XFVOTOYQ.js → chunk-O4RHR7FV.js} +6 -6
  51. package/dist/{chunk-EEEFQTYN.js → chunk-OMLIZL2P.js} +2 -2
  52. package/dist/{chunk-GVPFL6XF.js → chunk-P7EQ2S5O.js} +2 -2
  53. package/dist/{chunk-E3VAKWJ7.js → chunk-QQUUAXDY.js} +7 -6
  54. package/dist/chunk-QQUUAXDY.js.map +1 -0
  55. package/dist/chunk-RD5LYKD6.js +82 -0
  56. package/dist/chunk-RD5LYKD6.js.map +1 -0
  57. package/dist/{chunk-7QGJ7RTL.js → chunk-RRMDLTIL.js} +4 -4
  58. package/dist/{chunk-432R4RDC.js → chunk-SIZWEV2Y.js} +35 -5
  59. package/dist/chunk-SIZWEV2Y.js.map +1 -0
  60. package/dist/{chunk-U7YDBNFC.js → chunk-UZXLQCHP.js} +2 -2
  61. package/dist/{chunk-PPJA7KL6.js → chunk-V6SGP2KX.js} +3 -3
  62. package/dist/{chunk-7AQKLLI5.js → chunk-WCA2NROQ.js} +2 -2
  63. package/dist/{chunk-ERV4AXVO.js → chunk-XGSOTWYX.js} +90 -131
  64. package/dist/chunk-XGSOTWYX.js.map +1 -0
  65. package/dist/{chunk-5Y4AKEZ6.js → chunk-Z72JH4KG.js} +2 -2
  66. package/dist/{chunk-IXFP66OV.js → chunk-ZNOEIM6Y.js} +2 -2
  67. package/dist/consent/index.cjs.map +1 -1
  68. package/dist/consent/index.d.cts +5 -4
  69. package/dist/consent/index.d.ts +5 -4
  70. package/dist/consent/index.js +3 -3
  71. package/dist/{crypto-VTEMMJK6.js → crypto-A7FRXYHC.js} +3 -3
  72. package/dist/{delegation-HYQULPZR.js → delegation-YBA4X4JN.js} +5 -5
  73. package/dist/derivations/index.cjs +97 -1
  74. package/dist/derivations/index.cjs.map +1 -1
  75. package/dist/derivations/index.d.cts +37 -10
  76. package/dist/derivations/index.d.ts +37 -10
  77. package/dist/derivations/index.js +6 -4
  78. package/dist/{dev-unlock-CpJ9rHW2.d.ts → dev-unlock-C8u6MRfS.d.ts} +1 -1
  79. package/dist/{dev-unlock-DEUUpWoR.d.cts → dev-unlock-gBjwzB6A.d.cts} +1 -1
  80. package/dist/executor-7E3VFGW7.js +11 -0
  81. package/dist/executor-CEWX2FQI.js +8 -0
  82. package/dist/executor-X4SQ3ZLC.js +8 -0
  83. package/dist/fanout-sidecar-ACJNXFU6.js +51 -0
  84. package/dist/fanout-sidecar-ACJNXFU6.js.map +1 -0
  85. package/dist/guards/index.cjs.map +1 -1
  86. package/dist/guards/index.d.cts +6 -5
  87. package/dist/guards/index.d.ts +6 -5
  88. package/dist/guards/index.js +6 -6
  89. package/dist/{hash-_9VyW44M.d.cts → hash-BXy5DuTD.d.cts} +1 -1
  90. package/dist/{hash-CJ9LfuY5.d.ts → hash-C6KOPK9Q.d.ts} +1 -1
  91. package/dist/history/index.cjs +2 -1
  92. package/dist/history/index.cjs.map +1 -1
  93. package/dist/history/index.d.cts +6 -5
  94. package/dist/history/index.d.ts +6 -5
  95. package/dist/history/index.js +6 -6
  96. package/dist/i18n/index.cjs.map +1 -1
  97. package/dist/i18n/index.d.cts +5 -4
  98. package/dist/i18n/index.d.ts +5 -4
  99. package/dist/i18n/index.js +6 -6
  100. package/dist/{index-s31g3m-D.d.cts → index-BA7A-MJs.d.cts} +96 -4
  101. package/dist/{index-BWAXR9tV.d.ts → index-CLK67MZE.d.ts} +96 -4
  102. package/dist/{index-7nd15fgy.d.ts → index-CNwA-B6-.d.ts} +70 -2
  103. package/dist/{index-CFJKJXWa.d.cts → index-CmVgTkqk.d.cts} +70 -2
  104. package/dist/index.cjs +2400 -571
  105. package/dist/index.cjs.map +1 -1
  106. package/dist/index.d.cts +128 -18
  107. package/dist/index.d.ts +128 -18
  108. package/dist/index.js +1217 -107
  109. package/dist/index.js.map +1 -1
  110. package/dist/indexing/index.cjs.map +1 -1
  111. package/dist/indexing/index.js +2 -2
  112. package/dist/{ledger-LHLIVPJ3.js → ledger-GHIZQLKR.js} +6 -6
  113. package/dist/materialized-views/index.cjs +255 -21
  114. package/dist/materialized-views/index.cjs.map +1 -1
  115. package/dist/materialized-views/index.d.cts +7 -6
  116. package/dist/materialized-views/index.d.ts +7 -6
  117. package/dist/materialized-views/index.js +9 -5
  118. package/dist/overlay-views/index.cjs.map +1 -1
  119. package/dist/overlay-views/index.d.cts +6 -5
  120. package/dist/overlay-views/index.d.ts +6 -5
  121. package/dist/overlay-views/index.js +3 -3
  122. package/dist/periods/index.cjs +2 -1
  123. package/dist/periods/index.cjs.map +1 -1
  124. package/dist/periods/index.d.cts +5 -4
  125. package/dist/periods/index.d.ts +5 -4
  126. package/dist/periods/index.js +6 -6
  127. package/dist/{public-envelope-66ZBXVXK.js → public-envelope-CRJAVW3E.js} +4 -4
  128. package/dist/query/index.cjs +139 -113
  129. package/dist/query/index.cjs.map +1 -1
  130. package/dist/query/index.d.cts +2 -2
  131. package/dist/query/index.d.ts +2 -2
  132. package/dist/query/index.js +13 -9
  133. package/dist/{registry-JYALMHGM.js → registry-3L3N3PTG.js} +3 -3
  134. package/dist/registry-O47PUPSY.js +8 -0
  135. package/dist/registry-WLLMODKN.js +8 -0
  136. package/dist/session/index.cjs.map +1 -1
  137. package/dist/session/index.d.cts +6 -5
  138. package/dist/session/index.d.ts +6 -5
  139. package/dist/session/index.js +3 -3
  140. package/dist/shadow/index.cjs.map +1 -1
  141. package/dist/shadow/index.d.cts +5 -4
  142. package/dist/shadow/index.d.ts +5 -4
  143. package/dist/shadow/index.js +2 -2
  144. package/dist/{stale-EET5YFYL.js → stale-HSC5YO2O.js} +2 -2
  145. package/dist/store/index.cjs.map +1 -1
  146. package/dist/store/index.d.cts +5 -4
  147. package/dist/store/index.d.ts +5 -4
  148. package/dist/store/index.js +2 -2
  149. package/dist/{strategy-D-SrOLCl.d.cts → strategy-DSTrsZ8t.d.cts} +72 -19
  150. package/dist/{strategy-D-SrOLCl.d.ts → strategy-DSTrsZ8t.d.ts} +72 -19
  151. package/dist/sync/index.cjs.map +1 -1
  152. package/dist/sync/index.d.cts +4 -3
  153. package/dist/sync/index.d.ts +4 -3
  154. package/dist/sync/index.js +4 -4
  155. package/dist/team/index.cjs +136 -6
  156. package/dist/team/index.cjs.map +1 -1
  157. package/dist/team/index.d.cts +5 -4
  158. package/dist/team/index.d.ts +5 -4
  159. package/dist/team/index.js +7 -7
  160. package/dist/tx/index.cjs +2 -1
  161. package/dist/tx/index.cjs.map +1 -1
  162. package/dist/tx/index.d.cts +5 -4
  163. package/dist/tx/index.d.ts +5 -4
  164. package/dist/tx/index.js +2 -2
  165. package/dist/{types-2JGVRzO2.d.cts → types-DDy02bWN.d.cts} +1159 -257
  166. package/dist/{types-DIOLYPUq.d.ts → types-DImsOlJe.d.ts} +1159 -257
  167. package/dist/util/index.cjs.map +1 -1
  168. package/dist/util/index.js +1 -1
  169. package/dist/{with-derivation-ClhfQvRa.d.ts → with-derivation-3AdLeSw8.d.ts} +1 -1
  170. package/dist/{with-derivation-3JX8SMxY.d.cts → with-derivation-CkCHx_J8.d.cts} +1 -1
  171. package/dist/{with-guard-Br3YPxRW.d.ts → with-guard-Br9zLEdi.d.ts} +1 -1
  172. package/dist/{with-guard-fJVfWBLs.d.cts → with-guard-DtKsFExw.d.cts} +1 -1
  173. package/dist/with-materialized-view-CMhEX4FK.d.cts +27 -0
  174. package/dist/with-materialized-view-Zal2bE1T.d.ts +27 -0
  175. package/dist/{with-overlayed-view-BLUKxdiJ.d.cts → with-overlayed-view-CA6zHrBt.d.cts} +1 -1
  176. package/dist/{with-overlayed-view-CtvJxhU3.d.ts → with-overlayed-view-R4BNG9OB.d.ts} +1 -1
  177. package/package.json +14 -2
  178. package/dist/chunk-432R4RDC.js.map +0 -1
  179. package/dist/chunk-CX2S2IBB.js.map +0 -1
  180. package/dist/chunk-E3VAKWJ7.js.map +0 -1
  181. package/dist/chunk-ERV4AXVO.js.map +0 -1
  182. package/dist/chunk-GV47JHIF.js +0 -29
  183. package/dist/chunk-GV47JHIF.js.map +0 -1
  184. package/dist/chunk-LTKFPLTW.js.map +0 -1
  185. package/dist/chunk-PMMNH7VZ.js.map +0 -1
  186. package/dist/chunk-Q2L5ZYX7.js +0 -66
  187. package/dist/chunk-Q2L5ZYX7.js.map +0 -1
  188. package/dist/chunk-Q3OWJPJI.js.map +0 -1
  189. package/dist/chunk-SBK6CETA.js +0 -30
  190. package/dist/chunk-SBK6CETA.js.map +0 -1
  191. package/dist/chunk-SBOSKCXD.js.map +0 -1
  192. package/dist/chunk-WLZWITX3.js.map +0 -1
  193. package/dist/chunk-ZJICDHNH.js.map +0 -1
  194. package/dist/executor-3H3NSIVZ.js +0 -8
  195. package/dist/executor-7ZOXGY7P.js +0 -8
  196. package/dist/executor-A5LTUAG2.js +0 -9
  197. package/dist/registry-J2UI37XJ.js +0 -8
  198. package/dist/registry-UMAL72WL.js +0 -8
  199. package/dist/with-materialized-view-CHho83hN.d.cts +0 -15
  200. package/dist/with-materialized-view-CgPphnza.d.ts +0 -15
  201. /package/dist/{chunk-HENWE2QQ.js.map → chunk-34YSDCDP.js.map} +0 -0
  202. /package/dist/{chunk-3J5PYYUL.js.map → chunk-5DWL3JBF.js.map} +0 -0
  203. /package/dist/{chunk-562AT3V6.js.map → chunk-5NGHX6ME.js.map} +0 -0
  204. /package/dist/{chunk-AD4FMCXZ.js.map → chunk-DYBQG5PQ.js.map} +0 -0
  205. /package/dist/{chunk-PNTWORBA.js.map → chunk-DYECX3IX.js.map} +0 -0
  206. /package/dist/{chunk-RGHN6WV7.js.map → chunk-FCXOFQAJ.js.map} +0 -0
  207. /package/dist/{chunk-CRNMA2FB.js.map → chunk-I6MX32UC.js.map} +0 -0
  208. /package/dist/{chunk-PHSGPPV7.js.map → chunk-KESP7GOK.js.map} +0 -0
  209. /package/dist/{chunk-FB34MDSJ.js.map → chunk-KJJKHKFP.js.map} +0 -0
  210. /package/dist/{chunk-J3E2UMET.js.map → chunk-MIQHZESA.js.map} +0 -0
  211. /package/dist/{chunk-TNYWH7Z2.js.map → chunk-MKSA2V7A.js.map} +0 -0
  212. /package/dist/{chunk-E4ZSYZSN.js.map → chunk-NVBUGT76.js.map} +0 -0
  213. /package/dist/{chunk-XFVOTOYQ.js.map → chunk-O4RHR7FV.js.map} +0 -0
  214. /package/dist/{chunk-EEEFQTYN.js.map → chunk-OMLIZL2P.js.map} +0 -0
  215. /package/dist/{chunk-GVPFL6XF.js.map → chunk-P7EQ2S5O.js.map} +0 -0
  216. /package/dist/{chunk-7QGJ7RTL.js.map → chunk-RRMDLTIL.js.map} +0 -0
  217. /package/dist/{chunk-U7YDBNFC.js.map → chunk-UZXLQCHP.js.map} +0 -0
  218. /package/dist/{chunk-PPJA7KL6.js.map → chunk-V6SGP2KX.js.map} +0 -0
  219. /package/dist/{chunk-7AQKLLI5.js.map → chunk-WCA2NROQ.js.map} +0 -0
  220. /package/dist/{chunk-5Y4AKEZ6.js.map → chunk-Z72JH4KG.js.map} +0 -0
  221. /package/dist/{chunk-IXFP66OV.js.map → chunk-ZNOEIM6Y.js.map} +0 -0
  222. /package/dist/{crypto-VTEMMJK6.js.map → crypto-A7FRXYHC.js.map} +0 -0
  223. /package/dist/{delegation-HYQULPZR.js.map → delegation-YBA4X4JN.js.map} +0 -0
  224. /package/dist/{executor-3H3NSIVZ.js.map → executor-7E3VFGW7.js.map} +0 -0
  225. /package/dist/{executor-7ZOXGY7P.js.map → executor-CEWX2FQI.js.map} +0 -0
  226. /package/dist/{executor-A5LTUAG2.js.map → executor-X4SQ3ZLC.js.map} +0 -0
  227. /package/dist/{ledger-LHLIVPJ3.js.map → ledger-GHIZQLKR.js.map} +0 -0
  228. /package/dist/{public-envelope-66ZBXVXK.js.map → public-envelope-CRJAVW3E.js.map} +0 -0
  229. /package/dist/{registry-J2UI37XJ.js.map → registry-3L3N3PTG.js.map} +0 -0
  230. /package/dist/{registry-JYALMHGM.js.map → registry-O47PUPSY.js.map} +0 -0
  231. /package/dist/{registry-UMAL72WL.js.map → registry-WLLMODKN.js.map} +0 -0
  232. /package/dist/{stale-EET5YFYL.js.map → stale-HSC5YO2O.js.map} +0 -0
@@ -1,9 +1,10 @@
1
- import { aI as SyncStrategy } from '../types-2JGVRzO2.cjs';
1
+ import { aK as SyncStrategy } from '../types-DDy02bWN.cjs';
2
2
  import '../lazy-builder-C-rPfWG0.cjs';
3
3
  import '../predicate-Dnu81tsS.cjs';
4
- import '../strategy-D-SrOLCl.cjs';
4
+ import '../strategy-DSTrsZ8t.cjs';
5
5
  import '../strategy-BSxFXGzb.cjs';
6
- import '../index-CFJKJXWa.cjs';
6
+ import '../index-CmVgTkqk.cjs';
7
+ import '@noy-db/on-shamir';
7
8
 
8
9
  /**
9
10
  * Active sync strategy — `withSync()` returns the real implementation
@@ -1,9 +1,10 @@
1
- import { aI as SyncStrategy } from '../types-DIOLYPUq.js';
1
+ import { aK as SyncStrategy } from '../types-DImsOlJe.js';
2
2
  import '../lazy-builder-Rpd-V3jP.js';
3
3
  import '../predicate-Dnu81tsS.js';
4
- import '../strategy-D-SrOLCl.js';
4
+ import '../strategy-DSTrsZ8t.js';
5
5
  import '../strategy-BSxFXGzb.js';
6
- import '../index-7nd15fgy.js';
6
+ import '../index-CNwA-B6-.js';
7
+ import '@noy-db/on-shamir';
7
8
 
8
9
  /**
9
10
  * Active sync strategy — `withSync()` returns the real implementation
@@ -2,11 +2,11 @@ import {
2
2
  PresenceHandle,
3
3
  SyncEngine,
4
4
  SyncTransaction
5
- } from "../chunk-E4ZSYZSN.js";
5
+ } from "../chunk-NVBUGT76.js";
6
6
  import "../chunk-2QR2PQTT.js";
7
- import "../chunk-PMMNH7VZ.js";
8
- import "../chunk-7AQKLLI5.js";
9
- import "../chunk-W7M3E5M5.js";
7
+ import "../chunk-H7XROQJM.js";
8
+ import "../chunk-WCA2NROQ.js";
9
+ import "../chunk-ADQ5MQ54.js";
10
10
 
11
11
  // src/team/sync-active.ts
12
12
  function withSync() {
@@ -1279,6 +1279,8 @@ function base64ToBytes(b64) {
1279
1279
  }
1280
1280
 
1281
1281
  // src/team/recovery.ts
1282
+ var import_on_shamir = require("@noy-db/on-shamir");
1283
+ var import_on_shamir2 = require("@noy-db/on-shamir");
1282
1284
  var PAPER_DOC_ID = "recovery-paper";
1283
1285
  async function loadPaperRecoveryEntries(store, vault) {
1284
1286
  const env = await store.get(vault, "_meta", PAPER_DOC_ID);
@@ -1311,6 +1313,37 @@ async function burnPaperRecoveryEntry(store, vault, codeId) {
1311
1313
  const remaining = entries.filter((e) => e.codeId !== codeId);
1312
1314
  await savePaperRecoveryEntries(store, vault, remaining);
1313
1315
  }
1316
+ var SHAMIR_DOC_ID = "recovery-shamir";
1317
+ async function loadShamirRecoveryEntries(store, vault) {
1318
+ const env = await store.get(vault, "_meta", SHAMIR_DOC_ID);
1319
+ if (!env) return [];
1320
+ try {
1321
+ const doc = JSON.parse(env._data);
1322
+ if (doc.profile !== "shamir" || !Array.isArray(doc.entries)) return [];
1323
+ return doc.entries;
1324
+ } catch {
1325
+ return [];
1326
+ }
1327
+ }
1328
+ async function unwrapDeksFromShamirEntry(entry, shares) {
1329
+ if (shares.length < entry.k) {
1330
+ throw new Error(
1331
+ `Insufficient shares: this Shamir entry needs ${entry.k} of ${entry.n}, but ${shares.length} were provided.`
1332
+ );
1333
+ }
1334
+ const secret = (0, import_on_shamir.combineSecret)(shares);
1335
+ try {
1336
+ const credential = bytesToBase642(secret);
1337
+ return await unwrapDeksFromBlob(entry, credential);
1338
+ } finally {
1339
+ secret.fill(0);
1340
+ }
1341
+ }
1342
+ function bytesToBase642(b) {
1343
+ let s = "";
1344
+ for (const x of b) s += String.fromCharCode(x);
1345
+ return btoa(s);
1346
+ }
1314
1347
  async function mintPaperRecoveryEntry(deks, code, codeId) {
1315
1348
  const blob = await mintWrappedDeksBlob(deks, code);
1316
1349
  return {
@@ -1324,6 +1357,7 @@ async function unwrapDeksFromPaperEntry(entry, code) {
1324
1357
  }
1325
1358
 
1326
1359
  // src/team/rotate-recover.ts
1360
+ var import_on_shamir3 = require("@noy-db/on-shamir");
1327
1361
  async function rotatePassphrase(store, vault, userId, input) {
1328
1362
  if (!input.allowWeakPassphrase) {
1329
1363
  assertStrongPassphrase(input.newPassphrase, input.passphrasePolicy);
@@ -1421,13 +1455,16 @@ async function recoverPassphrase(store, vault, userId, input) {
1421
1455
  assertStrongPassphrase(input.newPassphrase, input.passphrasePolicy);
1422
1456
  }
1423
1457
  const profile = input.recoveryProof.profile;
1424
- if (profile !== "paper") {
1425
- throw new RecoveryProfileNotImplementedError(
1426
- profile,
1427
- "https://github.com/vLannaAi/noy-db/issues/10"
1428
- );
1458
+ if (profile === "paper") {
1459
+ return recoverViaPaperCode(store, vault, userId, input);
1429
1460
  }
1430
- return recoverViaPaperCode(store, vault, userId, input);
1461
+ if (profile === "shamir") {
1462
+ return recoverViaShamir(store, vault, userId, input);
1463
+ }
1464
+ throw new RecoveryProfileNotImplementedError(
1465
+ profile,
1466
+ "https://github.com/vLannaAi/noy-db/issues/196"
1467
+ );
1431
1468
  }
1432
1469
  async function recoverViaPaperCode(store, vault, userId, input) {
1433
1470
  if (input.recoveryProof.profile !== "paper") throw new Error("unreachable");
@@ -1493,6 +1530,99 @@ async function recoverViaPaperCode(store, vault, userId, input) {
1493
1530
  function normalizePaperCode(input) {
1494
1531
  return input.toUpperCase().replace(/[\s\-_]/g, "");
1495
1532
  }
1533
+ async function recoverViaShamir(store, vault, userId, input) {
1534
+ if (input.recoveryProof.profile !== "shamir") throw new Error("unreachable");
1535
+ const { entryId: requestedEntryId, shares: shareStrings } = input.recoveryProof.payload;
1536
+ if (shareStrings.length === 0) {
1537
+ throw new ValidationError(
1538
+ "Shamir recovery requires at least one share; received an empty array."
1539
+ );
1540
+ }
1541
+ const env = await store.get(vault, "_keyring", userId);
1542
+ if (!env) {
1543
+ throw new NoAccessError(`No keyring found for user "${userId}" in vault "${vault}".`);
1544
+ }
1545
+ const file = JSON.parse(env._data);
1546
+ let decodedShares;
1547
+ try {
1548
+ decodedShares = shareStrings.map((s) => (0, import_on_shamir3.decodeShareBase32)(s));
1549
+ } catch (err) {
1550
+ throw new ValidationError(
1551
+ "One or more Shamir shares could not be decoded. They may be malformed, truncated, or from an incompatible version. Original error: " + (err instanceof Error ? err.message : String(err))
1552
+ );
1553
+ }
1554
+ const allEntries = await loadShamirRecoveryEntries(store, vault);
1555
+ if (allEntries.length === 0) {
1556
+ throw new NoAccessError(
1557
+ `No Shamir-recovery entries enrolled for vault "${vault}". Enroll via \`db.enrollRecovery({ profile: "shamir", k, n })\` before relying on recovery.`
1558
+ );
1559
+ }
1560
+ let candidates;
1561
+ if (requestedEntryId !== void 0) {
1562
+ candidates = allEntries.filter((e) => e.entryId === requestedEntryId);
1563
+ if (candidates.length === 0) {
1564
+ throw new NoAccessError(
1565
+ `No Shamir-recovery entry with entryId="${requestedEntryId}" found in vault "${vault}". Available entries: ` + allEntries.map((e) => `"${e.entryId}"`).join(", ")
1566
+ );
1567
+ }
1568
+ } else {
1569
+ candidates = allEntries;
1570
+ }
1571
+ let recoveredDeks;
1572
+ for (const entry of candidates) {
1573
+ const xCoordSet = new Set(entry.xCoords);
1574
+ const matchingShares = decodedShares.filter((s) => xCoordSet.has(s.x));
1575
+ if (matchingShares.length < entry.k) {
1576
+ continue;
1577
+ }
1578
+ try {
1579
+ const deks = await unwrapDeksFromShamirEntry(entry, matchingShares);
1580
+ recoveredDeks = deks;
1581
+ break;
1582
+ } catch {
1583
+ }
1584
+ }
1585
+ if (!recoveredDeks) {
1586
+ const minK = Math.min(...candidates.map((e) => e.k));
1587
+ if (decodedShares.length < minK) {
1588
+ throw new InvalidKeyError(
1589
+ `Insufficient Shamir shares to combine: the smallest enrolled threshold is ${minK}, but only ${decodedShares.length} share${decodedShares.length === 1 ? " was" : "s were"} provided.`
1590
+ );
1591
+ }
1592
+ throw new InvalidKeyError(
1593
+ "Shamir shares do not match any enrolled entry. Possible causes: shares were tampered with, came from a different enrollment, or the entry was rotated after these shares were distributed."
1594
+ );
1595
+ }
1596
+ const newSalt = generateSalt();
1597
+ const newKek = await deriveKey(input.newPassphrase, newSalt);
1598
+ const wrappedDeks = {};
1599
+ for (const [coll, dek] of recoveredDeks) {
1600
+ wrappedDeks[coll] = await wrapKey(dek, newKek);
1601
+ }
1602
+ const canary = await mintKeyringCanary(newKek);
1603
+ const next = {
1604
+ ...file,
1605
+ _noydb_keyring: NOYDB_KEYRING_VERSION,
1606
+ deks: wrappedDeks,
1607
+ salt: bufferToBase64(newSalt),
1608
+ authenticators: [],
1609
+ // tier-2 slots wrap old KEK, drop them on recovery
1610
+ canary
1611
+ };
1612
+ await writeKeyringFile2(store, vault, userId, next);
1613
+ return {
1614
+ userId: file.user_id,
1615
+ displayName: file.display_name,
1616
+ role: file.role,
1617
+ permissions: file.permissions,
1618
+ deks: recoveredDeks,
1619
+ kek: newKek,
1620
+ salt: newSalt,
1621
+ authenticators: [],
1622
+ ...file.export_capability !== void 0 && { exportCapability: file.export_capability },
1623
+ ...file.import_capability !== void 0 && { importCapability: file.import_capability }
1624
+ };
1625
+ }
1496
1626
  async function writeKeyringFile2(store, vault, userId, file) {
1497
1627
  const envelope = {
1498
1628
  _noydb: 1,