@interop/wallet-core 0.62.0 → 0.66.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 (321) hide show
  1. package/README.md +41 -16
  2. package/dist/clientAnnex/credentialAnchoredGenesis.d.ts +46 -26
  3. package/dist/clientAnnex/credentialAnchoredGenesis.d.ts.map +1 -1
  4. package/dist/clientAnnex/credentialAnchoredGenesis.js +91 -39
  5. package/dist/clientAnnex/credentialAnchoredGenesis.js.map +1 -1
  6. package/dist/clientAnnex/establish.d.ts +119 -35
  7. package/dist/clientAnnex/establish.d.ts.map +1 -1
  8. package/dist/clientAnnex/establish.js +227 -160
  9. package/dist/clientAnnex/establish.js.map +1 -1
  10. package/dist/clientAnnex/forget.d.ts +18 -8
  11. package/dist/clientAnnex/forget.d.ts.map +1 -1
  12. package/dist/clientAnnex/forget.js +37 -64
  13. package/dist/clientAnnex/forget.js.map +1 -1
  14. package/dist/clientAnnex/forgetLast.d.ts +85 -38
  15. package/dist/clientAnnex/forgetLast.d.ts.map +1 -1
  16. package/dist/clientAnnex/forgetLast.js +155 -98
  17. package/dist/clientAnnex/forgetLast.js.map +1 -1
  18. package/dist/clientAnnex/gc.d.ts +3 -2
  19. package/dist/clientAnnex/gc.d.ts.map +1 -1
  20. package/dist/clientAnnex/gc.js +16 -7
  21. package/dist/clientAnnex/gc.js.map +1 -1
  22. package/dist/clientAnnex/heal.d.ts +65 -14
  23. package/dist/clientAnnex/heal.d.ts.map +1 -1
  24. package/dist/clientAnnex/heal.js +397 -298
  25. package/dist/clientAnnex/heal.js.map +1 -1
  26. package/dist/clientAnnex/index.d.ts +23 -7
  27. package/dist/clientAnnex/index.d.ts.map +1 -1
  28. package/dist/clientAnnex/index.js +26 -7
  29. package/dist/clientAnnex/index.js.map +1 -1
  30. package/dist/clientAnnex/ladder.d.ts +58 -0
  31. package/dist/clientAnnex/ladder.d.ts.map +1 -1
  32. package/dist/clientAnnex/ladder.js +249 -41
  33. package/dist/clientAnnex/ladder.js.map +1 -1
  34. package/dist/clientAnnex/ladderAnchored.d.ts +148 -22
  35. package/dist/clientAnnex/ladderAnchored.d.ts.map +1 -1
  36. package/dist/clientAnnex/ladderAnchored.js +391 -346
  37. package/dist/clientAnnex/ladderAnchored.js.map +1 -1
  38. package/dist/clientAnnex/log.d.ts +237 -53
  39. package/dist/clientAnnex/log.d.ts.map +1 -1
  40. package/dist/clientAnnex/log.js +533 -198
  41. package/dist/clientAnnex/log.js.map +1 -1
  42. package/dist/clientAnnex/mend.d.ts +12 -6
  43. package/dist/clientAnnex/mend.d.ts.map +1 -1
  44. package/dist/clientAnnex/mend.js +44 -72
  45. package/dist/clientAnnex/mend.js.map +1 -1
  46. package/dist/clientAnnex/recoveryLadderAnchored.d.ts +6 -4
  47. package/dist/clientAnnex/recoveryLadderAnchored.d.ts.map +1 -1
  48. package/dist/clientAnnex/recoveryLadderAnchored.js +56 -35
  49. package/dist/clientAnnex/recoveryLadderAnchored.js.map +1 -1
  50. package/dist/clientAnnex/spaceCapability.d.ts +123 -0
  51. package/dist/clientAnnex/spaceCapability.d.ts.map +1 -0
  52. package/dist/clientAnnex/spaceCapability.js +152 -0
  53. package/dist/clientAnnex/spaceCapability.js.map +1 -0
  54. package/dist/clientAnnex/stages.d.ts +63 -0
  55. package/dist/clientAnnex/stages.d.ts.map +1 -0
  56. package/dist/clientAnnex/stages.js +64 -0
  57. package/dist/clientAnnex/stages.js.map +1 -0
  58. package/dist/clientAnnex/zcap.d.ts +1 -1
  59. package/dist/clientAnnex/zcap.d.ts.map +1 -1
  60. package/dist/clientAnnex/zcap.js +42 -35
  61. package/dist/clientAnnex/zcap.js.map +1 -1
  62. package/dist/clients/policy.d.ts +15 -1
  63. package/dist/clients/policy.d.ts.map +1 -1
  64. package/dist/clients/policy.js +12 -6
  65. package/dist/clients/policy.js.map +1 -1
  66. package/dist/clients/revocation.d.ts +18 -10
  67. package/dist/clients/revocation.d.ts.map +1 -1
  68. package/dist/clients/revocation.js +13 -5
  69. package/dist/clients/revocation.js.map +1 -1
  70. package/dist/clients/rosterPolicy.d.ts +10 -2
  71. package/dist/clients/rosterPolicy.d.ts.map +1 -1
  72. package/dist/clients/rosterPolicy.js +41 -24
  73. package/dist/clients/rosterPolicy.js.map +1 -1
  74. package/dist/descriptors/acquire.d.ts.map +1 -1
  75. package/dist/descriptors/acquire.js +6 -23
  76. package/dist/descriptors/acquire.js.map +1 -1
  77. package/dist/descriptors/cipher.d.ts.map +1 -1
  78. package/dist/descriptors/cipher.js +5 -0
  79. package/dist/descriptors/cipher.js.map +1 -1
  80. package/dist/descriptors/errors.d.ts +43 -0
  81. package/dist/descriptors/errors.d.ts.map +1 -0
  82. package/dist/descriptors/errors.js +45 -0
  83. package/dist/descriptors/errors.js.map +1 -0
  84. package/dist/descriptors/index.d.ts +5 -0
  85. package/dist/descriptors/index.d.ts.map +1 -1
  86. package/dist/descriptors/index.js +5 -0
  87. package/dist/descriptors/index.js.map +1 -1
  88. package/dist/enrollment/enrollment.d.ts +37 -10
  89. package/dist/enrollment/enrollment.d.ts.map +1 -1
  90. package/dist/enrollment/enrollment.js +52 -15
  91. package/dist/enrollment/enrollment.js.map +1 -1
  92. package/dist/genesis/accountGenesis.d.ts +42 -11
  93. package/dist/genesis/accountGenesis.d.ts.map +1 -1
  94. package/dist/genesis/accountGenesis.js +80 -22
  95. package/dist/genesis/accountGenesis.js.map +1 -1
  96. package/dist/genesis/index.d.ts +3 -1
  97. package/dist/genesis/index.d.ts.map +1 -1
  98. package/dist/genesis/index.js +3 -1
  99. package/dist/genesis/index.js.map +1 -1
  100. package/dist/identity/agents.d.ts +17 -1
  101. package/dist/identity/agents.d.ts.map +1 -1
  102. package/dist/identity/agents.js +23 -7
  103. package/dist/identity/agents.js.map +1 -1
  104. package/dist/identity/index.d.ts +3 -1
  105. package/dist/identity/index.d.ts.map +1 -1
  106. package/dist/identity/index.js +3 -1
  107. package/dist/identity/index.js.map +1 -1
  108. package/dist/index.d.ts +6 -3
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +6 -3
  111. package/dist/index.js.map +1 -1
  112. package/dist/keyring/index.d.ts +2 -1
  113. package/dist/keyring/index.d.ts.map +1 -1
  114. package/dist/keyring/index.js +2 -1
  115. package/dist/keyring/index.js.map +1 -1
  116. package/dist/keyring/record.d.ts.map +1 -1
  117. package/dist/keyring/record.js +3 -6
  118. package/dist/keyring/record.js.map +1 -1
  119. package/dist/keyring/unlockSpace.d.ts +14 -5
  120. package/dist/keyring/unlockSpace.d.ts.map +1 -1
  121. package/dist/keyring/unlockSpace.js +31 -36
  122. package/dist/keyring/unlockSpace.js.map +1 -1
  123. package/dist/keys/index.d.ts +22 -8
  124. package/dist/keys/index.d.ts.map +1 -1
  125. package/dist/keys/index.js +20 -6
  126. package/dist/keys/index.js.map +1 -1
  127. package/dist/keys/rosterLogStore.d.ts +15 -12
  128. package/dist/keys/rosterLogStore.d.ts.map +1 -1
  129. package/dist/keys/rosterLogStore.js +21 -16
  130. package/dist/keys/rosterLogStore.js.map +1 -1
  131. package/dist/keys/rosterStore.d.ts +3 -6
  132. package/dist/keys/rosterStore.d.ts.map +1 -1
  133. package/dist/keys/rosterStore.js +10 -9
  134. package/dist/keys/rosterStore.js.map +1 -1
  135. package/dist/keys/spaceEpochs.d.ts.map +1 -1
  136. package/dist/keys/spaceEpochs.js +2 -3
  137. package/dist/keys/spaceEpochs.js.map +1 -1
  138. package/dist/keys/userKeyCascade.d.ts +8 -5
  139. package/dist/keys/userKeyCascade.d.ts.map +1 -1
  140. package/dist/keys/userKeyCascade.js +7 -6
  141. package/dist/keys/userKeyCascade.js.map +1 -1
  142. package/dist/keys/userKeyRoster.d.ts +95 -8
  143. package/dist/keys/userKeyRoster.d.ts.map +1 -1
  144. package/dist/keys/userKeyRoster.js +278 -35
  145. package/dist/keys/userKeyRoster.js.map +1 -1
  146. package/dist/keys/userKeyRosterCascade.d.ts +117 -16
  147. package/dist/keys/userKeyRosterCascade.d.ts.map +1 -1
  148. package/dist/keys/userKeyRosterCascade.js +184 -43
  149. package/dist/keys/userKeyRosterCascade.js.map +1 -1
  150. package/dist/keys/wasLabelsStore.d.ts +9 -2
  151. package/dist/keys/wasLabelsStore.d.ts.map +1 -1
  152. package/dist/keys/wasLabelsStore.js +14 -6
  153. package/dist/keys/wasLabelsStore.js.map +1 -1
  154. package/dist/log.d.ts +7 -2
  155. package/dist/log.d.ts.map +1 -1
  156. package/dist/log.js +6 -1
  157. package/dist/log.js.map +1 -1
  158. package/dist/recovery/index.d.ts +13 -9
  159. package/dist/recovery/index.d.ts.map +1 -1
  160. package/dist/recovery/index.js +12 -8
  161. package/dist/recovery/index.js.map +1 -1
  162. package/dist/recovery/recoveryCode.d.ts +27 -7
  163. package/dist/recovery/recoveryCode.d.ts.map +1 -1
  164. package/dist/recovery/recoveryCode.js +18 -6
  165. package/dist/recovery/recoveryCode.js.map +1 -1
  166. package/dist/recovery/recoveryDelegation.d.ts +23 -0
  167. package/dist/recovery/recoveryDelegation.d.ts.map +1 -1
  168. package/dist/recovery/recoveryDelegation.js +66 -46
  169. package/dist/recovery/recoveryDelegation.js.map +1 -1
  170. package/dist/recovery/recoveryWebvh.d.ts +75 -63
  171. package/dist/recovery/recoveryWebvh.d.ts.map +1 -1
  172. package/dist/recovery/recoveryWebvh.js +127 -116
  173. package/dist/recovery/recoveryWebvh.js.map +1 -1
  174. package/dist/request/appKey.d.ts +35 -1
  175. package/dist/request/appKey.d.ts.map +1 -1
  176. package/dist/request/appKey.js +29 -10
  177. package/dist/request/appKey.js.map +1 -1
  178. package/dist/request/classify.d.ts +32 -8
  179. package/dist/request/classify.d.ts.map +1 -1
  180. package/dist/request/classify.js +39 -14
  181. package/dist/request/classify.js.map +1 -1
  182. package/dist/request/ephemeralExchange.d.ts +1 -6
  183. package/dist/request/ephemeralExchange.d.ts.map +1 -1
  184. package/dist/request/ephemeralExchange.js.map +1 -1
  185. package/dist/request/onboarding.d.ts.map +1 -1
  186. package/dist/request/onboarding.js +2 -2
  187. package/dist/request/onboarding.js.map +1 -1
  188. package/dist/request/parse.d.ts.map +1 -1
  189. package/dist/request/parse.js +2 -3
  190. package/dist/request/parse.js.map +1 -1
  191. package/dist/resourceLog/controller.d.ts +34 -12
  192. package/dist/resourceLog/controller.d.ts.map +1 -1
  193. package/dist/resourceLog/controller.js +79 -86
  194. package/dist/resourceLog/controller.js.map +1 -1
  195. package/dist/resourceLog/document.d.ts +182 -0
  196. package/dist/resourceLog/document.d.ts.map +1 -0
  197. package/dist/resourceLog/document.js +159 -0
  198. package/dist/resourceLog/document.js.map +1 -0
  199. package/dist/resourceLog/errors.d.ts +47 -8
  200. package/dist/resourceLog/errors.d.ts.map +1 -1
  201. package/dist/resourceLog/errors.js +54 -8
  202. package/dist/resourceLog/errors.js.map +1 -1
  203. package/dist/resourceLog/index.d.ts +7 -3
  204. package/dist/resourceLog/index.d.ts.map +1 -1
  205. package/dist/resourceLog/index.js +7 -3
  206. package/dist/resourceLog/index.js.map +1 -1
  207. package/dist/resourceLog/ladderRungs.d.ts +35 -0
  208. package/dist/resourceLog/ladderRungs.d.ts.map +1 -0
  209. package/dist/resourceLog/ladderRungs.js +352 -0
  210. package/dist/resourceLog/ladderRungs.js.map +1 -0
  211. package/dist/resourceLog/license.d.ts +42 -17
  212. package/dist/resourceLog/license.d.ts.map +1 -1
  213. package/dist/resourceLog/license.js +38 -24
  214. package/dist/resourceLog/license.js.map +1 -1
  215. package/dist/space/activity.d.ts +15 -15
  216. package/dist/space/activity.d.ts.map +1 -1
  217. package/dist/space/activity.js +15 -15
  218. package/dist/space/activity.js.map +1 -1
  219. package/dist/space/collections.d.ts +11 -0
  220. package/dist/space/collections.d.ts.map +1 -1
  221. package/dist/space/collections.js +13 -0
  222. package/dist/space/collections.js.map +1 -1
  223. package/dist/space/deleteSpace.d.ts +28 -0
  224. package/dist/space/deleteSpace.d.ts.map +1 -0
  225. package/dist/space/deleteSpace.js +44 -0
  226. package/dist/space/deleteSpace.js.map +1 -0
  227. package/dist/space/errors.d.ts.map +1 -1
  228. package/dist/space/errors.js +0 -1
  229. package/dist/space/errors.js.map +1 -1
  230. package/dist/space/index.d.ts +6 -0
  231. package/dist/space/index.d.ts.map +1 -1
  232. package/dist/space/index.js +6 -0
  233. package/dist/space/index.js.map +1 -1
  234. package/dist/space/plaintextCollection.d.ts +43 -0
  235. package/dist/space/plaintextCollection.d.ts.map +1 -0
  236. package/dist/space/plaintextCollection.js +17 -0
  237. package/dist/space/plaintextCollection.js.map +1 -0
  238. package/dist/stages.d.ts +23 -0
  239. package/dist/stages.d.ts.map +1 -0
  240. package/dist/stages.js +23 -0
  241. package/dist/stages.js.map +1 -0
  242. package/dist/sync/index.d.ts +7 -0
  243. package/dist/sync/index.d.ts.map +1 -1
  244. package/dist/sync/index.js +7 -0
  245. package/dist/sync/index.js.map +1 -1
  246. package/dist/sync/push.js +4 -4
  247. package/dist/sync/push.js.map +1 -1
  248. package/dist/sync/remint.js +2 -2
  249. package/dist/sync/remint.js.map +1 -1
  250. package/dist/sync/types.d.ts +41 -1
  251. package/dist/sync/types.d.ts.map +1 -1
  252. package/dist/sync/types.js +47 -1
  253. package/dist/sync/types.js.map +1 -1
  254. package/dist/unlock/index.d.ts +5 -1
  255. package/dist/unlock/index.d.ts.map +1 -1
  256. package/dist/unlock/index.js +5 -1
  257. package/dist/unlock/index.js.map +1 -1
  258. package/dist/unlock/retire.d.ts +35 -7
  259. package/dist/unlock/retire.d.ts.map +1 -1
  260. package/dist/unlock/retire.js +52 -14
  261. package/dist/unlock/retire.js.map +1 -1
  262. package/dist/unlock/standingClient.d.ts.map +1 -1
  263. package/dist/unlock/standingClient.js +5 -1
  264. package/dist/unlock/standingClient.js.map +1 -1
  265. package/dist/unlock/standingWebvh.d.ts +217 -35
  266. package/dist/unlock/standingWebvh.d.ts.map +1 -1
  267. package/dist/unlock/standingWebvh.js +469 -210
  268. package/dist/unlock/standingWebvh.js.map +1 -1
  269. package/dist/webvh/accountEntry.d.ts +146 -0
  270. package/dist/webvh/accountEntry.d.ts.map +1 -0
  271. package/dist/webvh/accountEntry.js +239 -0
  272. package/dist/webvh/accountEntry.js.map +1 -0
  273. package/dist/webvh/didWeb.d.ts +12 -7
  274. package/dist/webvh/didWeb.d.ts.map +1 -1
  275. package/dist/webvh/didWeb.js +2 -2
  276. package/dist/webvh/didWeb.js.map +1 -1
  277. package/dist/webvh/didWebProjection.d.ts +164 -0
  278. package/dist/webvh/didWebProjection.d.ts.map +1 -0
  279. package/dist/webvh/didWebProjection.js +230 -0
  280. package/dist/webvh/didWebProjection.js.map +1 -0
  281. package/dist/webvh/didWebvh.d.ts +275 -136
  282. package/dist/webvh/didWebvh.d.ts.map +1 -1
  283. package/dist/webvh/didWebvh.js +307 -340
  284. package/dist/webvh/didWebvh.js.map +1 -1
  285. package/dist/webvh/enrollClient.d.ts +65 -0
  286. package/dist/webvh/enrollClient.d.ts.map +1 -0
  287. package/dist/webvh/enrollClient.js +172 -0
  288. package/dist/webvh/enrollClient.js.map +1 -0
  289. package/dist/webvh/index.d.ts +37 -12
  290. package/dist/webvh/index.d.ts.map +1 -1
  291. package/dist/webvh/index.js +33 -10
  292. package/dist/webvh/index.js.map +1 -1
  293. package/dist/webvh/listClients.d.ts +1 -35
  294. package/dist/webvh/listClients.d.ts.map +1 -1
  295. package/dist/webvh/listClients.js +2 -30
  296. package/dist/webvh/listClients.js.map +1 -1
  297. package/dist/webvh/revokeClient.d.ts +41 -11
  298. package/dist/webvh/revokeClient.d.ts.map +1 -1
  299. package/dist/webvh/revokeClient.js +99 -48
  300. package/dist/webvh/revokeClient.js.map +1 -1
  301. package/dist/webvh/standingZcap.d.ts +61 -14
  302. package/dist/webvh/standingZcap.d.ts.map +1 -1
  303. package/dist/webvh/standingZcap.js +91 -0
  304. package/dist/webvh/standingZcap.js.map +1 -1
  305. package/dist/webvh/verifyLog.d.ts +59 -5
  306. package/dist/webvh/verifyLog.d.ts.map +1 -1
  307. package/dist/webvh/verifyLog.js +76 -11
  308. package/dist/webvh/verifyLog.js.map +1 -1
  309. package/dist/webvh/wasIdStore.d.ts +8 -8
  310. package/dist/webvh/wasIdStore.d.ts.map +1 -1
  311. package/dist/webvh/wasIdStore.js +39 -14
  312. package/dist/webvh/wasIdStore.js.map +1 -1
  313. package/dist/webvh/zcap.d.ts +14 -1
  314. package/dist/webvh/zcap.d.ts.map +1 -1
  315. package/dist/webvh/zcap.js +3 -27
  316. package/dist/webvh/zcap.js.map +1 -1
  317. package/package.json +2 -2
  318. package/dist/webvh/keyAgreement.d.ts +0 -97
  319. package/dist/webvh/keyAgreement.d.ts.map +0 -1
  320. package/dist/webvh/keyAgreement.js +0 -71
  321. package/dist/webvh/keyAgreement.js.map +0 -1
package/README.md CHANGED
@@ -75,18 +75,26 @@ The subpaths:
75
75
  store they write through, and ZCap signing under the did:webvh
76
76
  verification-method id.
77
77
 
78
- - **`@interop/wallet-core/resourceLog`** -- the client side of the Resource Log
79
- Profile (the hash-linked log format governing key resources co-managed between
80
- a wallet's clients and the storage server): full chain verification against an
81
- adversarial host (parse shape, SCID and entry-hash recomputation, entry
82
- proofs, the external-authorization rule against the independently verified
83
- did:webvh controller document, terminal handover entries), the chain-head pin
84
- with its continuity rules, the entry builders, the read/append/create path
85
- (compare-and-swap with rebase-and-retry, read-back confirmation), and the
86
- sealing sweep -- the idempotent backstop append that re-anchors a log's head
87
- past the controller's latest membership change. Transport lives in
88
- [`@interop/was-client`](https://npm.im/@interop/was-client)'s `/log` subpath;
89
- the hashing and proof kernel in
78
+ - **`@interop/wallet-core/resourceLog`** -- the wallet-domain half of the
79
+ Resource Log Profile, the hash-linked log format governing key resources
80
+ co-managed between a wallet's clients and the storage server. Three pieces.
81
+ The did:webvh controller adapter, which answers which keys could have signed a
82
+ given entry at a given document version, and supplies the admission hook every
83
+ verifier consults. The ceremony-tail license that hook carries, which bounds
84
+ what a standing credential's ladder key may append -- above all refusing a
85
+ silent rekey against an unchanged document. And `isResourceLogRefusal`, the
86
+ shared reading of the refusal taxonomy: which refusals a reader must not paper
87
+ over with a cached copy, and which one it may (a chain-head rollback,
88
+ reconcilable divergence). The adapter and the license read the account
89
+ document through one import-free leaf beside them: relation resolution,
90
+ ladder-VM recognition, and the credential class. They therefore answer exactly
91
+ as the client listing does. That leaf's public home is the `webvh` subpath.
92
+ The generic half lives in
93
+ [`@interop/vh-resource-log`](https://npm.im/@interop/vh-resource-log) -- chain
94
+ verification against an adversarial host, the chain-head pin, the entry
95
+ builders, the read/append/create path, and the sealing sweep. Transport is in
96
+ [`@interop/was-client`](https://npm.im/@interop/was-client)'s `/log` subpath,
97
+ and the hashing and proof kernel in
90
98
  [`@interop/did-method-webvh`](https://npm.im/@interop/did-method-webvh).
91
99
 
92
100
  - **`@interop/wallet-core/keys`** -- the user key and its wrap-set roster,
@@ -158,6 +166,18 @@ The subpaths:
158
166
  delegation builder and the revocation cascade's bridge re-mint core; the
159
167
  record codec is the `unlock` subpath's, re-exported here).
160
168
 
169
+ - **`@interop/wallet-core/clientAnnex`** -- the client annex, the sibling
170
+ did:webvh log holding per-visit transient client keys in garbage-collected
171
+ generations, published in the account's auxiliary annex Space. This is the
172
+ authoring and maintenance surface of everything anchored on an unlock
173
+ credential's update-key ladder: the ladder itself (rung and VM derivation, the
174
+ shared attribution walks), the annex log and its GC, ZCap signing under a
175
+ ladder VM, the ladder-anchored account-log ceremonies (genesis,
176
+ self-enrollment, forget, and the last-client transition to a client-less
177
+ account), the credential-anchored account genesis with its mend and its
178
+ per-visit readiness ensure, and the transient-recovery continuation. It sits
179
+ on top of the other subpaths and none of them import from it.
180
+
161
181
  ## Install
162
182
 
163
183
  - Node.js 24+ is recommended.
@@ -188,10 +208,15 @@ import {
188
208
  ```
189
209
 
190
210
  The `sync` and `space` subpaths are re-exported from the package root as well.
191
- Every other subpath (`identity`, `request`, `webvh`, `keys`, `clients`,
192
- `descriptors`, `keyring`, `enrollment`, `recovery`) is import-directly-only, so
193
- consumers of the root never pull the signing / KMS / document-loader dependency
194
- graph.
211
+ Every other subpath (`identity`, `request`, `webvh`, `resourceLog`, `keys`,
212
+ `clients`, `descriptors`, `keyring`, `enrollment`, `genesis`, `unlock`,
213
+ `recovery`, `clientAnnex`) is import-directly-only, so consumers of the root
214
+ never pull the signing / KMS / document-loader dependency graph.
215
+
216
+ Two further exports are leaves of that same isolation, carved out to stay
217
+ dependency-light: `keys/clientKeyRecord` is the client-key record codec alone,
218
+ so a wallet's storage tests load without the crypto graph, and
219
+ `request/matching` is the QueryByExample matchers alone.
195
220
 
196
221
  ## Contribute
197
222
 
@@ -12,13 +12,13 @@
12
12
  * resolution of the orphan-Space tear): re-derivable from the unlock
13
13
  * record's ladder seed, so a tab death here strands nothing a later
14
14
  * login cannot finish or unwind.
15
- * 2. The optional KMS key map (`provideDidWebKeys`), acquired only once the
16
- * Space exists -- the enrolled-client ceremony's stage, verbatim: a
17
- * KMS-keeping wallet creates the keystore under the ladder VM's bare
18
- * did:key and writes keys.json and did.json into the Space here.
19
- * Best-effort: a throw is collected and the genesis proceeds
20
- * keystore-less; a later login's heal supplies the missing convenience
21
- * key.
15
+ * 2. The optional KMS authentication binding (`provideKmsAuthentication`),
16
+ * started BEFORE stage 1 is awaited and joined before stage 3 -- the
17
+ * keystore and the key mint need no Space, so only the thunk's own
18
+ * `keys.json` write waits on the `spaceReady` promise this ceremony hands
19
+ * it. Best-effort: a throw is collected and the genesis proceeds
20
+ * keystore-less, publishing a document with no `authentication` relation,
21
+ * which no later entry adds the key to.
22
22
  * 3. The ladder-anchored did:webvh genesis
23
23
  * (`ensureLadderAnchoredDidWebvh`): the entry signed by ladder rung 0,
24
24
  * `updateKeys` = [rung 0], `nextKeyHashes` = [hash(rung 0), hash(rung 1)],
@@ -55,7 +55,8 @@
55
55
  import { type RecipientPublicKey } from '@interop/was-client/edv';
56
56
  import type { WasClient } from '@interop/was-client';
57
57
  import type { EncryptionDescriptorStore } from '@interop/was-client/edv';
58
- import type { DidWebKeyMapV2, WebvhIdStore } from '../webvh/didWebvh.js';
58
+ import type { DIDLog } from '@interop/did-method-webvh';
59
+ import type { KmsAuthenticationBinding, PublishedWebvhLog, WebvhIdStore } from '../webvh/didWebvh.js';
59
60
  import type { UnlockKeyAgreementPublication } from '../unlock/standingWebvh.js';
60
61
  import { type UserKey } from '../keys/index.js';
61
62
  import type { ResourceLogPinStore } from '@interop/vh-resource-log';
@@ -97,17 +98,26 @@ export declare function mintCredentialAnchoredAccountKeySet(): Promise<{
97
98
  * roster and recipient zero of every encrypted collection
98
99
  * @param options.idStore {WebvhIdStore} the account's `id` collection
99
100
  * store, signing as the same bootstrap did:key
100
- * @param options.rosterStoreFor {Function} `({ did }) =>
101
+ * @param options.rosterStoreFor {Function} `({ did, log }) =>
101
102
  * EncryptionDescriptorStore` -- the user-key roster's store once the DID is
102
- * known, with a LADDER-signed `ResourceLogSigner` (the first-entry shape)
103
- * @param [options.provideDidWebKeys] {Function} `() =>
104
- * Promise<DidWebKeyMapV2 | undefined>` -- the KMS key-map acquisition (a
105
- * wallet that keeps a KMS runs its did:web provisioning here, after the
106
- * Space exists, under the ladder VM's bare did:key); absent or resolving
107
- * `undefined`, the genesis is ladder-and-credential-only and no `keys.json`
108
- * is ever written. A throw is collected, not fatal: the genesis proceeds
109
- * keystore-less and a later login heals the document with the convenience
110
- * key
103
+ * known, with a LADDER-signed `ResourceLogSigner` (the first-entry shape).
104
+ * `log` is the account log the did:webvh stage just adopted or published,
105
+ * so a store resolving its controller view can read it out of this run's
106
+ * own head instead of fetching `did.jsonl` again
107
+ * @param [options.provideKmsAuthentication] {Function} `({ spaceReady }) =>
108
+ * Promise<KmsAuthenticationBinding | undefined>` -- the KMS authentication
109
+ * binding's acquisition (a wallet that keeps a KMS mints the key under the
110
+ * ladder VM's bare did:key and writes `keys.json` here); absent or
111
+ * resolving `undefined`, the genesis is ladder-and-credential-only and no
112
+ * `keys.json` is ever written. It is STARTED before the Space is awaited
113
+ * and joined before the genesis entry, so its `spaceReady` argument is what
114
+ * its own `keys.json` write waits on. A throw is collected, not fatal: the
115
+ * genesis proceeds keystore-less, and the document it publishes never gains
116
+ * the key. The thunk's own obligation, since this ceremony takes
117
+ * `authentication.vmId` VERBATIM into the world-readable genesis entry: a
118
+ * served `keys.json` may be adopted only after the multibase in its `vmId`
119
+ * is checked against the session's own keystore listing; on a mismatch, or
120
+ * when the keystore cannot be listed, the thunk mints instead of adopting
111
121
  * @param [options.expectedDid] {string} the account DID, when the caller
112
122
  * holds a pointer that already names one (a heal re-run); a fresh signup
113
123
  * and a fresh-terminal heal legitimately hold none
@@ -119,13 +129,17 @@ export declare function mintCredentialAnchoredAccountKeySet(): Promise<{
119
129
  * account pointer must durably name the DID first (freewallet's record
120
130
  * re-bind) passes `false` and promotes after that write
121
131
  * @param [options.onStage] {StageNotifier} observational: called as each
122
- * stage finishes, with `space-provisioning`, `webvh-genesis`,
123
- * `roster-genesis`, `collection-epochs`, and (only when this ceremony
124
- * promotes) `controller-promotion`. Stage 2's own boundary is the
125
- * caller's `provideDidWebKeys` thunk, which is where a caller marks it
126
- * @returns {Promise<AccountGenesisResult>}
132
+ * stage finishes, with the names in `CREDENTIAL_ANCHORED_GENESIS_STAGES`
133
+ * (`clientAnnex/stages.ts`) and, only when this ceremony promotes,
134
+ * `CONTROLLER_PROMOTION_STAGE`. `kms-authentication` fires at the JOIN
135
+ * rather than inside the thunk: stage 2 overlaps stage 1, so a thunk that
136
+ * finishes first would otherwise mark out of order
137
+ * @returns {Promise<AccountGenesisResult>} with `published` and
138
+ * `logMinted` always set: the account log's verified head the did:webvh
139
+ * stage adopted or minted, and which of the two it was -- the head is only
140
+ * safely reusable downstream when this run minted it
127
141
  */
128
- export declare function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl, spaceId, ladderSeed, keyAgreement, standingRecipient, userKey, idStore, rosterStoreFor, provideDidWebKeys, expectedDid, accountLogPinStore, onDidPublished, promoteController, onStage }: {
142
+ export declare function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl, spaceId, ladderSeed, keyAgreement, standingRecipient, userKey, idStore, rosterStoreFor, provideKmsAuthentication, expectedDid, accountLogPinStore, onDidPublished, promoteController, onStage }: {
129
143
  was: WasClient;
130
144
  wasServerUrl: string;
131
145
  spaceId: string;
@@ -136,8 +150,11 @@ export declare function ensureCredentialAnchoredAccountGenesis({ was, wasServerU
136
150
  idStore: WebvhIdStore;
137
151
  rosterStoreFor: (options: {
138
152
  did: string;
153
+ log: DIDLog;
139
154
  }) => EncryptionDescriptorStore;
140
- provideDidWebKeys?: () => Promise<DidWebKeyMapV2 | undefined>;
155
+ provideKmsAuthentication?: (options: {
156
+ spaceReady: Promise<unknown>;
157
+ }) => Promise<KmsAuthenticationBinding | undefined>;
141
158
  expectedDid?: string;
142
159
  accountLogPinStore?: ResourceLogPinStore;
143
160
  onDidPublished?: (published: {
@@ -145,5 +162,8 @@ export declare function ensureCredentialAnchoredAccountGenesis({ was, wasServerU
145
162
  }) => Promise<void>;
146
163
  promoteController?: boolean;
147
164
  onStage?: StageNotifier;
148
- }): Promise<AccountGenesisResult>;
165
+ }): Promise<AccountGenesisResult & {
166
+ published: PublishedWebvhLog;
167
+ logMinted: boolean;
168
+ }>;
149
169
  //# sourceMappingURL=credentialAnchoredGenesis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentialAnchoredGenesis.d.ts","sourceRoot":"","sources":["../../src/clientAnnex/credentialAnchoredGenesis.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAwB,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAIxE,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAGL,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AAE7D;;;;;;;;GAQG;AACH,wBAAsB,mCAAmC,IAAI,OAAO,CAAC;IACnE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAC3B,CAAC,CAED;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAsB,sCAAsC,CAAC,EAC3D,GAAG,EACH,YAAY,EACZ,OAAO,EACP,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,iBAAwB,EACxB,OAAO,EACR,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,6BAA6B,CAAA;IAC3C,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,YAAY,CAAA;IACrB,cAAc,EAAE,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,yBAAyB,CAAA;IACvE,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAA;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,mBAAmB,CAAA;IACxC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiHhC"}
1
+ {"version":3,"file":"credentialAnchoredGenesis.d.ts","sourceRoot":"","sources":["../../src/clientAnnex/credentialAnchoredGenesis.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAwB,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAIxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,YAAY,EACb,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAGL,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AAM7D;;;;;;;;GAQG;AACH,wBAAsB,mCAAmC,IAAI,OAAO,CAAC;IACnE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAC3B,CAAC,CAED;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,wBAAsB,sCAAsC,CAAC,EAC3D,GAAG,EACH,YAAY,EACZ,OAAO,EACP,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,iBAAwB,EACxB,OAAO,EACR,EAAE;IACD,GAAG,EAAE,SAAS,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,6BAA6B,CAAA;IAC3C,iBAAiB,EAAE,kBAAkB,CAAA;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,YAAY,CAAA;IACrB,cAAc,EAAE,CAAC,OAAO,EAAE;QACxB,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;KACZ,KAAK,yBAAyB,CAAA;IAC/B,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE;QACnC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAC7B,KAAK,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAA;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,mBAAmB,CAAA;IACxC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,GAAG,OAAO,CACT,oBAAoB,GAAG;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAC5E,CAwJA"}
@@ -12,13 +12,13 @@
12
12
  * resolution of the orphan-Space tear): re-derivable from the unlock
13
13
  * record's ladder seed, so a tab death here strands nothing a later
14
14
  * login cannot finish or unwind.
15
- * 2. The optional KMS key map (`provideDidWebKeys`), acquired only once the
16
- * Space exists -- the enrolled-client ceremony's stage, verbatim: a
17
- * KMS-keeping wallet creates the keystore under the ladder VM's bare
18
- * did:key and writes keys.json and did.json into the Space here.
19
- * Best-effort: a throw is collected and the genesis proceeds
20
- * keystore-less; a later login's heal supplies the missing convenience
21
- * key.
15
+ * 2. The optional KMS authentication binding (`provideKmsAuthentication`),
16
+ * started BEFORE stage 1 is awaited and joined before stage 3 -- the
17
+ * keystore and the key mint need no Space, so only the thunk's own
18
+ * `keys.json` write waits on the `spaceReady` promise this ceremony hands
19
+ * it. Best-effort: a throw is collected and the genesis proceeds
20
+ * keystore-less, publishing a document with no `authentication` relation,
21
+ * which no later entry adds the key to.
22
22
  * 3. The ladder-anchored did:webvh genesis
23
23
  * (`ensureLadderAnchoredDidWebvh`): the entry signed by ladder rung 0,
24
24
  * `updateKeys` = [rung 0], `nextKeyHashes` = [hash(rung 0), hash(rung 1)],
@@ -59,6 +59,7 @@ import { ensureLadderAnchoredDidWebvh } from './ladderAnchored.js';
59
59
  import { ensureWalletSpaceEpochs, mintUserKey } from '../keys/index.js';
60
60
  import { AccountGenesisSpaceError, ensurePromotedSpaceController, mintSpaceId } from '../genesis/accountGenesis.js';
61
61
  import { stageNotifier } from '../log.js';
62
+ import { CONTROLLER_PROMOTION_STAGE } from './stages.js';
62
63
  /**
63
64
  * The key set a credential-anchored signup mints locally before anything
64
65
  * touches the network: the data Space id and the account's user key -- nothing else.
@@ -94,17 +95,26 @@ export async function mintCredentialAnchoredAccountKeySet() {
94
95
  * roster and recipient zero of every encrypted collection
95
96
  * @param options.idStore {WebvhIdStore} the account's `id` collection
96
97
  * store, signing as the same bootstrap did:key
97
- * @param options.rosterStoreFor {Function} `({ did }) =>
98
+ * @param options.rosterStoreFor {Function} `({ did, log }) =>
98
99
  * EncryptionDescriptorStore` -- the user-key roster's store once the DID is
99
- * known, with a LADDER-signed `ResourceLogSigner` (the first-entry shape)
100
- * @param [options.provideDidWebKeys] {Function} `() =>
101
- * Promise<DidWebKeyMapV2 | undefined>` -- the KMS key-map acquisition (a
102
- * wallet that keeps a KMS runs its did:web provisioning here, after the
103
- * Space exists, under the ladder VM's bare did:key); absent or resolving
104
- * `undefined`, the genesis is ladder-and-credential-only and no `keys.json`
105
- * is ever written. A throw is collected, not fatal: the genesis proceeds
106
- * keystore-less and a later login heals the document with the convenience
107
- * key
100
+ * known, with a LADDER-signed `ResourceLogSigner` (the first-entry shape).
101
+ * `log` is the account log the did:webvh stage just adopted or published,
102
+ * so a store resolving its controller view can read it out of this run's
103
+ * own head instead of fetching `did.jsonl` again
104
+ * @param [options.provideKmsAuthentication] {Function} `({ spaceReady }) =>
105
+ * Promise<KmsAuthenticationBinding | undefined>` -- the KMS authentication
106
+ * binding's acquisition (a wallet that keeps a KMS mints the key under the
107
+ * ladder VM's bare did:key and writes `keys.json` here); absent or
108
+ * resolving `undefined`, the genesis is ladder-and-credential-only and no
109
+ * `keys.json` is ever written. It is STARTED before the Space is awaited
110
+ * and joined before the genesis entry, so its `spaceReady` argument is what
111
+ * its own `keys.json` write waits on. A throw is collected, not fatal: the
112
+ * genesis proceeds keystore-less, and the document it publishes never gains
113
+ * the key. The thunk's own obligation, since this ceremony takes
114
+ * `authentication.vmId` VERBATIM into the world-readable genesis entry: a
115
+ * served `keys.json` may be adopted only after the multibase in its `vmId`
116
+ * is checked against the session's own keystore listing; on a mismatch, or
117
+ * when the keystore cannot be listed, the thunk mints instead of adopting
108
118
  * @param [options.expectedDid] {string} the account DID, when the caller
109
119
  * holds a pointer that already names one (a heal re-run); a fresh signup
110
120
  * and a fresh-terminal heal legitimately hold none
@@ -116,49 +126,89 @@ export async function mintCredentialAnchoredAccountKeySet() {
116
126
  * account pointer must durably name the DID first (freewallet's record
117
127
  * re-bind) passes `false` and promotes after that write
118
128
  * @param [options.onStage] {StageNotifier} observational: called as each
119
- * stage finishes, with `space-provisioning`, `webvh-genesis`,
120
- * `roster-genesis`, `collection-epochs`, and (only when this ceremony
121
- * promotes) `controller-promotion`. Stage 2's own boundary is the
122
- * caller's `provideDidWebKeys` thunk, which is where a caller marks it
123
- * @returns {Promise<AccountGenesisResult>}
129
+ * stage finishes, with the names in `CREDENTIAL_ANCHORED_GENESIS_STAGES`
130
+ * (`clientAnnex/stages.ts`) and, only when this ceremony promotes,
131
+ * `CONTROLLER_PROMOTION_STAGE`. `kms-authentication` fires at the JOIN
132
+ * rather than inside the thunk: stage 2 overlaps stage 1, so a thunk that
133
+ * finishes first would otherwise mark out of order
134
+ * @returns {Promise<AccountGenesisResult>} with `published` and
135
+ * `logMinted` always set: the account log's verified head the did:webvh
136
+ * stage adopted or minted, and which of the two it was -- the head is only
137
+ * safely reusable downstream when this run minted it
124
138
  */
125
- export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl, spaceId, ladderSeed, keyAgreement, standingRecipient, userKey, idStore, rosterStoreFor, provideDidWebKeys, expectedDid, accountLogPinStore, onDidPublished, promoteController = true, onStage }) {
139
+ export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl, spaceId, ladderSeed, keyAgreement, standingRecipient, userKey, idStore, rosterStoreFor, provideKmsAuthentication, expectedDid, accountLogPinStore, onDidPublished, promoteController = true, onStage }) {
126
140
  const failed = [];
127
141
  const stage = stageNotifier(onStage);
128
142
  const bootstrap = await ladderVmAgent({ ladderSeed });
129
143
  // 1. The Space and its collection roster, create-if-absent under the
130
- // ladder VM's bare did:key. The typed refusal, exactly as on the
131
- // enrolled-client flow: nothing downstream can proceed without a Space.
144
+ // ladder VM's bare did:key. Started here and awaited below, so stage 2 --
145
+ // which needs no Space until its own write -- runs alongside it. The typed
146
+ // refusal, exactly as on the enrolled-client flow: nothing downstream can
147
+ // proceed without a Space.
148
+ const spaceReady = provisionWalletSpace({
149
+ was,
150
+ spaceId,
151
+ controllerDid: bootstrap.id
152
+ });
153
+ // 2. The optional KMS authentication binding, started before the Space is
154
+ // awaited: the keystore and the key mint touch no Space, and the thunk
155
+ // orders its own `keys.json` write behind `spaceReady`. A throw degrades to
156
+ // the ladder-and-credential-only genesis rather than aborting: every later
157
+ // ceremony anchors in the ladder, and the document simply publishes no
158
+ // `authentication` relation.
159
+ // Started inside the same guard the join uses, so a thunk that throws
160
+ // synchronously is collected like one that rejects.
161
+ let kmsRun;
162
+ // The flag rather than the value decides whether the stage is reported, so
163
+ // a thunk rejecting with `undefined` is still a collected failure.
164
+ let kmsFailed = false;
165
+ let kmsFailure;
132
166
  try {
133
- await provisionWalletSpace({ was, spaceId, controllerDid: bootstrap.id });
167
+ kmsRun = provideKmsAuthentication?.({ spaceReady });
168
+ }
169
+ catch (err) {
170
+ kmsFailed = true;
171
+ kmsFailure = err;
172
+ }
173
+ // A Space that never came up returns below while the thunk is still in
174
+ // flight, so its rejection is claimed here rather than surfacing as an
175
+ // unhandled one.
176
+ kmsRun?.catch(() => { });
177
+ try {
178
+ await spaceReady;
134
179
  }
135
180
  catch (err) {
136
181
  throw new AccountGenesisSpaceError({ spaceId, cause: err });
137
182
  }
138
183
  stage('space-provisioning');
139
- // 2. The optional KMS key map, acquired only once the Space exists (a
140
- // KMS-keeping wallet creates the keystore under the ladder VM's bare
141
- // did:key and writes keys.json and did.json into the Space here). A throw
142
- // degrades to the ladder-and-credential-only genesis rather than aborting:
143
- // every later ceremony anchors in the ladder, and a later login heals the
144
- // document with the convenience key.
145
- let didWebKeys;
146
- if (provideDidWebKeys) {
184
+ // The join: the genesis entry carries the KMS binding, so it waits on the
185
+ // whole stage even though the Space no longer does.
186
+ let kmsAuthentication;
187
+ if (kmsRun) {
147
188
  try {
148
- didWebKeys = await provideDidWebKeys();
189
+ kmsAuthentication = await kmsRun;
149
190
  }
150
191
  catch (err) {
151
- failed.push({ stage: 'didWebKeys', error: err });
192
+ kmsFailed = true;
193
+ kmsFailure = err;
152
194
  }
153
195
  }
196
+ if (kmsFailed) {
197
+ failed.push({ stage: 'kmsAuthentication', error: kmsFailure });
198
+ }
199
+ stage('kms-authentication');
200
+ const didWebKeys = kmsAuthentication?.keys;
154
201
  // 3. The ladder-anchored did:webvh genesis -- probe, adopt
155
202
  // (ladder-attributed), or create-and-publish. Fatal on failure, like the
156
203
  // enrolled-client stage.
157
- const { did } = await ensureLadderAnchoredDidWebvh({
204
+ const { did, published, logMinted } = await ensureLadderAnchoredDidWebvh({
158
205
  idStore,
159
206
  wasServerUrl,
160
207
  spaceId,
161
208
  ...(didWebKeys ? { didWebKeys } : {}),
209
+ ...(kmsAuthentication?.etag !== undefined && {
210
+ keysJsonEtag: kmsAuthentication.etag
211
+ }),
162
212
  ladderSeed,
163
213
  keyAgreement,
164
214
  ...(expectedDid !== undefined ? { expectedDid } : {}),
@@ -171,7 +221,7 @@ export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl
171
221
  // genesis append is the ceremony-tail license's first-entry shape.
172
222
  let rosterDescriptor;
173
223
  try {
174
- const store = rosterStoreFor({ did });
224
+ const store = rosterStoreFor({ did, log: published.log });
175
225
  const current = await store.read();
176
226
  rosterDescriptor =
177
227
  current !== null
@@ -224,10 +274,12 @@ export async function ensureCredentialAnchoredAccountGenesis({ was, wasServerUrl
224
274
  catch (err) {
225
275
  failed.push({ stage: 'promotion', error: err });
226
276
  }
227
- stage('controller-promotion');
277
+ stage(CONTROLLER_PROMOTION_STAGE);
228
278
  }
229
279
  return {
230
280
  did,
281
+ published,
282
+ logMinted,
231
283
  ...(rosterDescriptor ? { rosterDescriptor } : {}),
232
284
  ...(epochs ? { epochs } : {}),
233
285
  ...(epochsSkipped ? { epochsSkipped } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"credentialAnchoredGenesis.js","sourceRoot":"","sources":["../../src/clientAnnex/credentialAnchoredGenesis.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentialAnchoredGenesis.js","sourceRoot":"","sources":["../../src/clientAnnex/credentialAnchoredGenesis.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,OAAO,EACL,cAAc,EAEf,MAAM,yBAAyB,CAAA;AAIhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAOzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,EACL,uBAAuB,EACvB,WAAW,EAGZ,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,WAAW,EAEZ,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,aAAa,EAAsB,MAAM,WAAW,CAAA;AAC7D,OAAO,EACL,0BAA0B,EAE3B,MAAM,aAAa,CAAA;AAEpB;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mCAAmC;IAIvD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,WAAW,EAAE,EAAE,CAAA;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,MAAM,CAAC,KAAK,UAAU,sCAAsC,CAAC,EAC3D,GAAG,EACH,YAAY,EACZ,OAAO,EACP,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,iBAAiB,GAAG,IAAI,EACxB,OAAO,EAsBR;IAGC,MAAM,MAAM,GAAmC,EAAE,CAAA;IACjD,MAAM,KAAK,GAAG,aAAa,CAAiC,OAAO,CAAC,CAAA;IACpE,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;IAErD,qEAAqE;IACrE,0EAA0E;IAC1E,2EAA2E;IAC3E,0EAA0E;IAC1E,2BAA2B;IAC3B,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACtC,GAAG;QACH,OAAO;QACP,aAAa,EAAE,SAAS,CAAC,EAAE;KAC5B,CAAC,CAAA;IAEF,0EAA0E;IAC1E,uEAAuE;IACvE,4EAA4E;IAC5E,2EAA2E;IAC3E,uEAAuE;IACvE,6BAA6B;IAC7B,sEAAsE;IACtE,oDAAoD;IACpD,IAAI,MAAiE,CAAA;IACrE,2EAA2E;IAC3E,mEAAmE;IACnE,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,IAAI,UAAmB,CAAA;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,wBAAwB,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,GAAG,IAAI,CAAA;QAChB,UAAU,GAAG,GAAG,CAAA;IAClB,CAAC;IACD,uEAAuE;IACvE,uEAAuE;IACvE,iBAAiB;IACjB,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAEvB,IAAI,CAAC;QACH,MAAM,UAAU,CAAA;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,wBAAwB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IACD,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAE3B,0EAA0E;IAC1E,oDAAoD;IACpD,IAAI,iBAAuD,CAAA;IAC3D,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,iBAAiB,GAAG,MAAM,MAAM,CAAA;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,IAAI,CAAA;YAChB,UAAU,GAAG,GAAG,CAAA;QAClB,CAAC;IACH,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;IAChE,CAAC;IACD,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAC3B,MAAM,UAAU,GAAG,iBAAiB,EAAE,IAAI,CAAA;IAE1C,2DAA2D;IAC3D,yEAAyE;IACzE,yBAAyB;IACzB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,4BAA4B,CAAC;QACvE,OAAO;QACP,YAAY;QACZ,OAAO;QACP,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,iBAAiB,EAAE,IAAI,KAAK,SAAS,IAAI;YAC3C,YAAY,EAAE,iBAAiB,CAAC,IAAI;SACrC,CAAC;QACF,UAAU;QACV,YAAY;QACZ,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC,CAAA;IACF,MAAM,cAAc,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IAC/B,KAAK,CAAC,eAAe,CAAC,CAAA;IAEtB,wEAAwE;IACxE,qEAAqE;IACrE,mEAAmE;IACnE,IAAI,gBAAkD,CAAA;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;QAClC,gBAAgB;YACd,OAAO,KAAK,IAAI;gBACd,CAAC,CAAC,OAAO,CAAC,UAAU;gBACpB,CAAC,CAAC,MAAM,cAAc,CAAC;oBACnB,KAAK;oBACL,UAAU,EAAE,CAAC,iBAAiB,CAAC;oBAC/B,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;iBACvD,CAAC,CAAA;IACV,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC9C,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAEvB,yEAAyE;IACzE,yEAAyE;IACzE,2EAA2E;IAC3E,qEAAqE;IACrE,IAAI,MAA2C,CAAA;IAC/C,IAAI,aAAoD,CAAA;IACxD,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAI,gBAAgB,CAAC,YAAY,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,uBAAuB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;YACnE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa;gBACX,gBAAgB,CAAC,YAAY,KAAK,SAAS;oBACzC,CAAC,CAAC,EAAE,aAAa,EAAE,gBAAgB,CAAC,YAAY,EAAE;oBAClD,CAAC,CAAC,EAAE,CAAA;QACV,CAAC;IACH,CAAC;IACD,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAE1B,sEAAsE;IACtE,oDAAoD;IACpD,IAAI,SAA4C,CAAA;IAChD,IAAI,iBAAiB,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,6BAA6B,CAAC;gBAC9C,GAAG;gBACH,WAAW,EAAE,GAAG;gBAChB,OAAO;gBACP,GAAG;aACJ,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QACjD,CAAC;QACD,KAAK,CAAC,0BAA0B,CAAC,CAAA;IACnC,CAAC;IAED,OAAO;QACL,GAAG;QACH,SAAS;QACT,SAAS;QACT,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM;KACP,CAAA;AACH,CAAC"}