keri-ts 2.0.1 → 2.2.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 (450) hide show
  1. package/README.md +30 -2
  2. package/esm/keri/npm/src/acdc/authoring.js +195 -0
  3. package/esm/keri/npm/src/acdc/chaining.js +223 -89
  4. package/esm/keri/npm/src/acdc/custody.js +164 -0
  5. package/esm/keri/npm/src/acdc/dhking.js +244 -32
  6. package/esm/keri/npm/src/acdc/observing.js +2 -2
  7. package/esm/keri/npm/src/acdc/regbasing.js +30 -29
  8. package/esm/keri/npm/src/acdc/regengine.js +4 -6
  9. package/esm/keri/npm/src/acdc/registering.js +13 -10
  10. package/esm/keri/npm/src/acdc/registraring.js +4 -9
  11. package/esm/keri/npm/src/acdc/salting.js +143 -26
  12. package/esm/keri/npm/src/acdc/scheming.js +93 -54
  13. package/esm/keri/npm/src/acdc/unblinding.js +120 -99
  14. package/esm/keri/npm/src/app/bootstrap/authenticating.js +4 -6
  15. package/esm/keri/npm/src/app/bootstrap/oobi-resolving.js +41 -0
  16. package/esm/keri/npm/src/app/bootstrap/oobiery.js +5 -7
  17. package/esm/keri/npm/src/app/credentials/credential-revoking.js +1 -0
  18. package/esm/keri/npm/src/app/credentials/credential-workflows.js +2 -0
  19. package/esm/keri/npm/src/app/credentials/registry-settling.js +44 -0
  20. package/esm/keri/npm/src/app/credentials/root-replicating.js +131 -0
  21. package/esm/keri/npm/src/app/credentials/root-replicator.js +198 -0
  22. package/esm/keri/npm/src/app/credentials/tel-completion.js +36 -0
  23. package/esm/keri/npm/src/app/credentials/verifying.js +12 -3
  24. package/esm/keri/npm/src/app/delivery/forwarding.js +64 -9
  25. package/esm/keri/npm/src/app/exchanges/exchanging.js +24 -15
  26. package/esm/keri/npm/src/app/identity/challenging.js +50 -0
  27. package/esm/keri/npm/src/app/identity/configing.js +17 -43
  28. package/esm/keri/npm/src/app/identity/delegating.js +77 -77
  29. package/esm/keri/npm/src/app/identity/delegation-approval.js +333 -0
  30. package/esm/keri/npm/src/app/identity/event-completion.js +154 -0
  31. package/esm/keri/npm/src/app/identity/habbing.js +183 -41
  32. package/esm/keri/npm/src/app/identity/keeping.js +78 -5
  33. package/esm/keri/npm/src/app/identity/lmdb-habery.js +12 -0
  34. package/esm/keri/npm/src/app/ipex/group-ipex.js +327 -0
  35. package/esm/keri/npm/src/app/ipex/group-issuance.js +902 -0
  36. package/esm/keri/npm/src/app/ipex/ipex-admitting.js +120 -0
  37. package/esm/keri/npm/src/app/ipex/ipex-conversation.js +197 -0
  38. package/esm/keri/npm/src/app/ipex/ipex-discloser.js +591 -0
  39. package/esm/keri/npm/src/app/ipex/ipex-granting.js +93 -0
  40. package/esm/keri/npm/src/app/ipex/ipex-graph.js +7 -70
  41. package/esm/keri/npm/src/app/ipex/ipex-grouping.js +42 -16
  42. package/esm/keri/npm/src/app/ipex/ipex-v2.js +21 -5
  43. package/esm/keri/npm/src/app/ipex/ipexing.js +1 -1
  44. package/esm/keri/npm/src/app/ipex/issuance.js +888 -0
  45. package/esm/keri/npm/src/app/ipex/pending-presentations.js +46 -0
  46. package/esm/keri/npm/src/app/ipex/presentation-files.js +200 -0
  47. package/esm/keri/npm/src/app/ipex/presenting.js +401 -0
  48. package/esm/keri/npm/src/app/ipex/receive-issuance.js +86 -0
  49. package/esm/keri/npm/src/app/ipex/unblinding-workflow.js +660 -0
  50. package/esm/keri/npm/src/app/mailbox/ipex-arrival.js +103 -0
  51. package/esm/keri/npm/src/app/mailbox/kel-publisher.js +322 -0
  52. package/esm/keri/npm/src/app/mailbox/kel-publishing.js +65 -0
  53. package/esm/keri/npm/src/app/mailbox/kel-submission.js +24 -0
  54. package/esm/keri/npm/src/app/mailbox/mailbox-admin.js +208 -0
  55. package/esm/keri/npm/src/app/mailbox/mailbox-poller.js +212 -47
  56. package/esm/keri/npm/src/app/mailbox/mailboxing.js +15 -14
  57. package/esm/keri/npm/src/app/multisig/counseling.js +482 -0
  58. package/esm/keri/npm/src/app/multisig/group-members.js +32 -0
  59. package/esm/keri/npm/src/app/multisig/grouping.js +4 -3
  60. package/esm/keri/npm/src/app/multisig/multisig-workflows.js +101 -141
  61. package/esm/keri/npm/src/app/multisig/proposals.js +281 -0
  62. package/esm/keri/npm/src/app/multisig/proposing.js +122 -0
  63. package/esm/keri/npm/src/app/notifications/notifying.js +5 -9
  64. package/esm/keri/npm/src/app/notifications/signaling.js +5 -5
  65. package/esm/keri/npm/src/app/protocol/parsering.js +26 -1
  66. package/esm/keri/npm/src/app/protocol/protocol-processing.js +44 -6
  67. package/esm/keri/npm/src/app/queries/query-workflows.js +98 -0
  68. package/esm/keri/npm/src/app/queries/witness-inquisitor.js +2 -2
  69. package/esm/keri/npm/src/app/runtime/agent-runtime.js +113 -65
  70. package/esm/keri/npm/src/app/runtime/cue-runtime.js +3 -6
  71. package/esm/keri/npm/src/app/runtime/delivery-outbox.js +87 -0
  72. package/esm/keri/npm/src/app/runtime/doing.js +17 -0
  73. package/esm/keri/npm/src/app/runtime/ipex-auxiliaries.js +207 -0
  74. package/esm/keri/npm/src/app/runtime/operation-owners.js +151 -0
  75. package/esm/keri/npm/src/app/runtime/retry-backoff.js +93 -0
  76. package/esm/keri/npm/src/app/runtime/workflow-contract.js +80 -0
  77. package/esm/keri/npm/src/app/transport/byte-source.js +6 -42
  78. package/esm/keri/npm/src/app/transport/cesr-egress.js +77 -13
  79. package/esm/keri/npm/src/app/transport/file-bytes.js +41 -0
  80. package/esm/keri/npm/src/app/transport/http-client.js +25 -6
  81. package/esm/keri/npm/src/app/transport/http-messenger.js +14 -9
  82. package/esm/keri/npm/src/app/transport/message-source.js +1 -1
  83. package/esm/keri/npm/src/app/transport/messengering.js +3 -4
  84. package/esm/keri/npm/src/app/transport/node-http-client.js +21 -0
  85. package/esm/keri/npm/src/app/transport/tcp-dialer.js +14 -0
  86. package/esm/keri/npm/src/app/witness/http-endpoints.js +4 -4
  87. package/esm/keri/npm/src/app/witness/receipt-client.js +2 -2
  88. package/esm/keri/npm/src/cli/common/context.js +2 -2
  89. package/esm/keri/npm/src/cli/common/event-completion.js +49 -0
  90. package/esm/keri/npm/src/cli/common/existing.js +3 -5
  91. package/esm/keri/npm/src/cli/common/runtime-workers.js +23 -0
  92. package/esm/keri/npm/src/cli/credentials/ipex.js +159 -191
  93. package/esm/keri/npm/src/cli/credentials/vc.js +53 -72
  94. package/esm/keri/npm/src/cli/endpoints/did.js +12 -3
  95. package/esm/keri/npm/src/cli/endpoints/oobi-clean.js +4 -3
  96. package/esm/keri/npm/src/cli/endpoints/oobi.js +12 -15
  97. package/esm/keri/npm/src/cli/identity/challenge.js +9 -35
  98. package/esm/keri/npm/src/cli/identity/delegate.js +81 -258
  99. package/esm/keri/npm/src/cli/identity/incept.js +17 -34
  100. package/esm/keri/npm/src/cli/identity/init.js +4 -3
  101. package/esm/keri/npm/src/cli/identity/interact.js +7 -19
  102. package/esm/keri/npm/src/cli/identity/rotate.js +10 -38
  103. package/esm/keri/npm/src/cli/index.js +3 -1
  104. package/esm/keri/npm/src/cli/messaging/exchange.js +2 -2
  105. package/esm/keri/npm/src/cli/messaging/group-join.js +79 -0
  106. package/esm/keri/npm/src/cli/messaging/group-wait.js +88 -0
  107. package/esm/keri/npm/src/cli/messaging/multisig.js +187 -250
  108. package/esm/keri/npm/src/cli/messaging/root-copy-lines.js +31 -0
  109. package/esm/keri/npm/src/cli/tools/annotate.js +2 -1
  110. package/esm/keri/npm/src/cli/tools/benchmark.js +2 -1
  111. package/esm/keri/npm/src/cli/tools/db-dump.js +1 -4
  112. package/esm/keri/npm/src/core/bytes.js +9 -0
  113. package/esm/keri/npm/src/core/kel/delegation-ancestry.js +92 -0
  114. package/esm/keri/npm/src/core/kel/eventing.js +67 -12
  115. package/esm/keri/npm/src/core/kel/kever.js +11 -9
  116. package/esm/keri/npm/src/core/mailbox/kram-policy.js +41 -9
  117. package/esm/keri/npm/src/core/mailbox/kram-pruning.js +15 -22
  118. package/esm/keri/npm/src/core/mailbox/kram-staging.js +2 -2
  119. package/esm/keri/npm/src/core/mailbox/kraming.js +2 -0
  120. package/esm/keri/npm/src/core/records.js +23 -0
  121. package/esm/keri/npm/src/core/routing.js +15 -2
  122. package/esm/keri/npm/src/db/basing.js +183 -205
  123. package/esm/keri/npm/src/db/core/dber.js +1062 -0
  124. package/esm/keri/npm/src/db/core/index.js +4 -2
  125. package/esm/keri/npm/src/db/core/indexeddb-persistence.js +221 -0
  126. package/esm/keri/npm/src/db/core/lmdb-opener.js +30 -0
  127. package/esm/keri/npm/src/db/core/lmdber.js +199 -1067
  128. package/esm/keri/npm/src/db/core/memstore.js +532 -0
  129. package/esm/keri/npm/src/db/core/path-manager.js +109 -223
  130. package/esm/keri/npm/src/db/core/store-owner.js +104 -0
  131. package/esm/keri/npm/src/db/core/webdber.js +252 -0
  132. package/esm/keri/npm/src/db/escrowing.js +2 -2
  133. package/esm/keri/npm/src/db/exchange/exchange-nests.js +3 -2
  134. package/esm/keri/npm/src/db/indexeddb.js +98 -0
  135. package/esm/keri/npm/src/db/keeping.js +38 -123
  136. package/esm/keri/npm/src/db/koming.js +1 -1
  137. package/esm/keri/npm/src/db/lmdb-stores.js +68 -0
  138. package/esm/keri/npm/src/db/lmdb.js +6 -0
  139. package/esm/keri/npm/src/db/mailbox/mailboxing.js +12 -65
  140. package/esm/keri/npm/src/db/noting.js +11 -55
  141. package/esm/keri/npm/src/db/reger.js +43 -105
  142. package/esm/keri/npm/src/db/replay/witness-replay.js +2 -20
  143. package/esm/keri/npm/src/db/store-lock.js +150 -0
  144. package/esm/keri/npm/src/db/subing.js +1 -1
  145. package/esm/keri/npm/src/npm/db-indexeddb.browser.js +2 -0
  146. package/esm/keri/npm/src/npm/db-indexeddb.js +3 -0
  147. package/esm/keri/npm/src/npm/db-lmdb.js +3 -0
  148. package/esm/keri/npm/src/npm/db.browser.js +2 -0
  149. package/esm/keri/npm/src/npm/index.browser.js +9 -0
  150. package/esm/keri/npm/src/npm/runtime-node.js +3 -0
  151. package/esm/keri/npm/src/npm/runtime-web.browser.js +2 -0
  152. package/esm/keri/npm/src/npm/runtime-web.js +3 -0
  153. package/esm/keri/npm/src/npm/runtime.browser.js +2 -0
  154. package/esm/keri/npm/src/runtime/index.js +58 -12
  155. package/esm/keri/npm/src/runtime/node.js +14 -0
  156. package/esm/keri/npm/src/runtime/web/output-barrier.js +47 -0
  157. package/esm/keri/npm/src/runtime/web/persistent-storage.js +37 -0
  158. package/esm/keri/npm/src/runtime/web.js +10 -0
  159. package/esm/keri/npm/src/vdr/eventing.js +1 -1
  160. package/esm/keri/npm/src/vdr/tel-publication.js +19 -3
  161. package/esm/keri/npm/src/version.js +2 -2
  162. package/package.json +24 -4
  163. package/types/acdc/authoring.d.ts +54 -0
  164. package/types/acdc/authoring.d.ts.map +1 -0
  165. package/types/acdc/chaining.d.ts +56 -6
  166. package/types/acdc/chaining.d.ts.map +1 -1
  167. package/types/acdc/custody.d.ts +77 -0
  168. package/types/acdc/custody.d.ts.map +1 -0
  169. package/types/acdc/dhking.d.ts +94 -3
  170. package/types/acdc/dhking.d.ts.map +1 -1
  171. package/types/acdc/regbasing.d.ts +11 -6
  172. package/types/acdc/regbasing.d.ts.map +1 -1
  173. package/types/acdc/regengine.d.ts.map +1 -1
  174. package/types/acdc/registering.d.ts +8 -4
  175. package/types/acdc/registering.d.ts.map +1 -1
  176. package/types/acdc/registraring.d.ts.map +1 -1
  177. package/types/acdc/salting.d.ts +59 -7
  178. package/types/acdc/salting.d.ts.map +1 -1
  179. package/types/acdc/scheming.d.ts +2 -0
  180. package/types/acdc/scheming.d.ts.map +1 -1
  181. package/types/acdc/unblinding.d.ts +58 -19
  182. package/types/acdc/unblinding.d.ts.map +1 -1
  183. package/types/app/bootstrap/authenticating.d.ts +3 -1
  184. package/types/app/bootstrap/authenticating.d.ts.map +1 -1
  185. package/types/app/bootstrap/oobi-resolving.d.ts +92 -0
  186. package/types/app/bootstrap/oobi-resolving.d.ts.map +1 -0
  187. package/types/app/bootstrap/oobiery.d.ts +3 -1
  188. package/types/app/bootstrap/oobiery.d.ts.map +1 -1
  189. package/types/app/credentials/credential-revoking.d.ts +3 -0
  190. package/types/app/credentials/credential-revoking.d.ts.map +1 -1
  191. package/types/app/credentials/credential-workflows.d.ts +5 -0
  192. package/types/app/credentials/credential-workflows.d.ts.map +1 -1
  193. package/types/app/credentials/registry-settling.d.ts +85 -0
  194. package/types/app/credentials/registry-settling.d.ts.map +1 -0
  195. package/types/app/credentials/root-replicating.d.ts +97 -0
  196. package/types/app/credentials/root-replicating.d.ts.map +1 -0
  197. package/types/app/credentials/root-replicator.d.ts +105 -0
  198. package/types/app/credentials/root-replicator.d.ts.map +1 -0
  199. package/types/app/credentials/tel-completion.d.ts +55 -0
  200. package/types/app/credentials/tel-completion.d.ts.map +1 -0
  201. package/types/app/credentials/verifying.d.ts +2 -1
  202. package/types/app/credentials/verifying.d.ts.map +1 -1
  203. package/types/app/delivery/forwarding.d.ts +16 -0
  204. package/types/app/delivery/forwarding.d.ts.map +1 -1
  205. package/types/app/exchanges/exchanging.d.ts +2 -0
  206. package/types/app/exchanges/exchanging.d.ts.map +1 -1
  207. package/types/app/identity/challenging.d.ts +54 -0
  208. package/types/app/identity/challenging.d.ts.map +1 -1
  209. package/types/app/identity/configing.d.ts +7 -5
  210. package/types/app/identity/configing.d.ts.map +1 -1
  211. package/types/app/identity/delegating.d.ts +21 -4
  212. package/types/app/identity/delegating.d.ts.map +1 -1
  213. package/types/app/identity/delegation-approval.d.ts +228 -0
  214. package/types/app/identity/delegation-approval.d.ts.map +1 -0
  215. package/types/app/identity/event-completion.d.ts +151 -0
  216. package/types/app/identity/event-completion.d.ts.map +1 -0
  217. package/types/app/identity/habbing.d.ts +90 -7
  218. package/types/app/identity/habbing.d.ts.map +1 -1
  219. package/types/app/identity/keeping.d.ts +50 -4
  220. package/types/app/identity/keeping.d.ts.map +1 -1
  221. package/types/app/identity/lmdb-habery.d.ts +6 -0
  222. package/types/app/identity/lmdb-habery.d.ts.map +1 -0
  223. package/types/app/ipex/group-ipex.d.ts +247 -0
  224. package/types/app/ipex/group-ipex.d.ts.map +1 -0
  225. package/types/app/ipex/group-issuance.d.ts +281 -0
  226. package/types/app/ipex/group-issuance.d.ts.map +1 -0
  227. package/types/app/ipex/ipex-admitting.d.ts +47 -0
  228. package/types/app/ipex/ipex-admitting.d.ts.map +1 -0
  229. package/types/app/ipex/ipex-conversation.d.ts +195 -0
  230. package/types/app/ipex/ipex-conversation.d.ts.map +1 -0
  231. package/types/app/ipex/ipex-discloser.d.ts +156 -0
  232. package/types/app/ipex/ipex-discloser.d.ts.map +1 -0
  233. package/types/app/ipex/ipex-granting.d.ts +145 -0
  234. package/types/app/ipex/ipex-granting.d.ts.map +1 -0
  235. package/types/app/ipex/ipex-graph.d.ts +4 -4
  236. package/types/app/ipex/ipex-graph.d.ts.map +1 -1
  237. package/types/app/ipex/ipex-grouping.d.ts +18 -0
  238. package/types/app/ipex/ipex-grouping.d.ts.map +1 -1
  239. package/types/app/ipex/ipex-v2.d.ts +11 -2
  240. package/types/app/ipex/ipex-v2.d.ts.map +1 -1
  241. package/types/app/ipex/ipexing.d.ts +3 -0
  242. package/types/app/ipex/ipexing.d.ts.map +1 -1
  243. package/types/app/ipex/issuance.d.ts +443 -0
  244. package/types/app/ipex/issuance.d.ts.map +1 -0
  245. package/types/app/ipex/pending-presentations.d.ts +25 -0
  246. package/types/app/ipex/pending-presentations.d.ts.map +1 -0
  247. package/types/app/ipex/presentation-files.d.ts +47 -0
  248. package/types/app/ipex/presentation-files.d.ts.map +1 -0
  249. package/types/app/ipex/presenting.d.ts +298 -0
  250. package/types/app/ipex/presenting.d.ts.map +1 -0
  251. package/types/app/ipex/receive-issuance.d.ts +99 -0
  252. package/types/app/ipex/receive-issuance.d.ts.map +1 -0
  253. package/types/app/ipex/unblinding-workflow.d.ts +255 -0
  254. package/types/app/ipex/unblinding-workflow.d.ts.map +1 -0
  255. package/types/app/mailbox/ipex-arrival.d.ts +104 -0
  256. package/types/app/mailbox/ipex-arrival.d.ts.map +1 -0
  257. package/types/app/mailbox/kel-publisher.d.ts +141 -0
  258. package/types/app/mailbox/kel-publisher.d.ts.map +1 -0
  259. package/types/app/mailbox/kel-publishing.d.ts +70 -0
  260. package/types/app/mailbox/kel-publishing.d.ts.map +1 -0
  261. package/types/app/mailbox/kel-submission.d.ts +18 -0
  262. package/types/app/mailbox/kel-submission.d.ts.map +1 -0
  263. package/types/app/mailbox/mailbox-admin.d.ts +113 -0
  264. package/types/app/mailbox/mailbox-admin.d.ts.map +1 -0
  265. package/types/app/mailbox/mailbox-poller.d.ts +92 -3
  266. package/types/app/mailbox/mailbox-poller.d.ts.map +1 -1
  267. package/types/app/mailbox/mailboxing.d.ts +4 -1
  268. package/types/app/mailbox/mailboxing.d.ts.map +1 -1
  269. package/types/app/multisig/counseling.d.ts +196 -0
  270. package/types/app/multisig/counseling.d.ts.map +1 -0
  271. package/types/app/multisig/group-members.d.ts +20 -0
  272. package/types/app/multisig/group-members.d.ts.map +1 -1
  273. package/types/app/multisig/grouping.d.ts +39 -20
  274. package/types/app/multisig/grouping.d.ts.map +1 -1
  275. package/types/app/multisig/multisig-workflows.d.ts +93 -23
  276. package/types/app/multisig/multisig-workflows.d.ts.map +1 -1
  277. package/types/app/multisig/proposals.d.ts +129 -0
  278. package/types/app/multisig/proposals.d.ts.map +1 -0
  279. package/types/app/multisig/proposing.d.ts +125 -0
  280. package/types/app/multisig/proposing.d.ts.map +1 -0
  281. package/types/app/notifications/notifying.d.ts +1 -1
  282. package/types/app/notifications/notifying.d.ts.map +1 -1
  283. package/types/app/notifications/signaling.d.ts +3 -1
  284. package/types/app/notifications/signaling.d.ts.map +1 -1
  285. package/types/app/protocol/parsering.d.ts +16 -1
  286. package/types/app/protocol/parsering.d.ts.map +1 -1
  287. package/types/app/protocol/protocol-processing.d.ts +9 -1
  288. package/types/app/protocol/protocol-processing.d.ts.map +1 -1
  289. package/types/app/queries/query-workflows.d.ts +98 -0
  290. package/types/app/queries/query-workflows.d.ts.map +1 -0
  291. package/types/app/runtime/agent-runtime.d.ts +79 -25
  292. package/types/app/runtime/agent-runtime.d.ts.map +1 -1
  293. package/types/app/runtime/cue-runtime.d.ts +2 -1
  294. package/types/app/runtime/cue-runtime.d.ts.map +1 -1
  295. package/types/app/runtime/delivery-outbox.d.ts +68 -0
  296. package/types/app/runtime/delivery-outbox.d.ts.map +1 -0
  297. package/types/app/runtime/doing.d.ts +27 -0
  298. package/types/app/runtime/doing.d.ts.map +1 -0
  299. package/types/app/runtime/ipex-auxiliaries.d.ts +74 -0
  300. package/types/app/runtime/ipex-auxiliaries.d.ts.map +1 -0
  301. package/types/app/runtime/operation-owners.d.ts +137 -0
  302. package/types/app/runtime/operation-owners.d.ts.map +1 -0
  303. package/types/app/runtime/retry-backoff.d.ts +49 -0
  304. package/types/app/runtime/retry-backoff.d.ts.map +1 -0
  305. package/types/app/runtime/workflow-contract.d.ts +79 -0
  306. package/types/app/runtime/workflow-contract.d.ts.map +1 -0
  307. package/types/app/transport/byte-source.d.ts +13 -10
  308. package/types/app/transport/byte-source.d.ts.map +1 -1
  309. package/types/app/transport/cesr-egress.d.ts +21 -7
  310. package/types/app/transport/cesr-egress.d.ts.map +1 -1
  311. package/types/app/transport/file-bytes.d.ts +11 -0
  312. package/types/app/transport/file-bytes.d.ts.map +1 -0
  313. package/types/app/transport/http-client.d.ts +3 -0
  314. package/types/app/transport/http-client.d.ts.map +1 -1
  315. package/types/app/transport/http-messenger.d.ts +15 -10
  316. package/types/app/transport/http-messenger.d.ts.map +1 -1
  317. package/types/app/transport/message-source.d.ts +1 -1
  318. package/types/app/transport/messengering.d.ts +2 -2
  319. package/types/app/transport/messengering.d.ts.map +1 -1
  320. package/types/app/transport/node-http-client.d.ts +10 -0
  321. package/types/app/transport/node-http-client.d.ts.map +1 -0
  322. package/types/app/transport/tcp-dialer.d.ts +21 -0
  323. package/types/app/transport/tcp-dialer.d.ts.map +1 -0
  324. package/types/cli/common/event-completion.d.ts +26 -0
  325. package/types/cli/common/event-completion.d.ts.map +1 -0
  326. package/types/cli/common/existing.d.ts.map +1 -1
  327. package/types/cli/common/runtime-workers.d.ts +23 -0
  328. package/types/cli/common/runtime-workers.d.ts.map +1 -0
  329. package/types/cli/credentials/ipex.d.ts.map +1 -1
  330. package/types/cli/credentials/vc.d.ts +1 -1
  331. package/types/cli/credentials/vc.d.ts.map +1 -1
  332. package/types/cli/endpoints/did.d.ts.map +1 -1
  333. package/types/cli/endpoints/oobi-clean.d.ts.map +1 -1
  334. package/types/cli/endpoints/oobi.d.ts +3 -1
  335. package/types/cli/endpoints/oobi.d.ts.map +1 -1
  336. package/types/cli/identity/challenge.d.ts +1 -1
  337. package/types/cli/identity/challenge.d.ts.map +1 -1
  338. package/types/cli/identity/delegate.d.ts +14 -1
  339. package/types/cli/identity/delegate.d.ts.map +1 -1
  340. package/types/cli/identity/incept.d.ts.map +1 -1
  341. package/types/cli/identity/init.d.ts.map +1 -1
  342. package/types/cli/identity/interact.d.ts.map +1 -1
  343. package/types/cli/identity/rotate.d.ts.map +1 -1
  344. package/types/cli/index.d.ts +4 -2
  345. package/types/cli/index.d.ts.map +1 -1
  346. package/types/cli/messaging/group-join.d.ts +53 -0
  347. package/types/cli/messaging/group-join.d.ts.map +1 -0
  348. package/types/cli/messaging/group-wait.d.ts +34 -0
  349. package/types/cli/messaging/group-wait.d.ts.map +1 -0
  350. package/types/cli/messaging/multisig.d.ts +36 -4
  351. package/types/cli/messaging/multisig.d.ts.map +1 -1
  352. package/types/cli/messaging/root-copy-lines.d.ts +39 -0
  353. package/types/cli/messaging/root-copy-lines.d.ts.map +1 -0
  354. package/types/cli/tools/annotate.d.ts.map +1 -1
  355. package/types/cli/tools/benchmark.d.ts.map +1 -1
  356. package/types/cli/tools/db-dump.d.ts.map +1 -1
  357. package/types/core/bytes.d.ts +2 -0
  358. package/types/core/bytes.d.ts.map +1 -1
  359. package/types/core/cues.d.ts +11 -0
  360. package/types/core/cues.d.ts.map +1 -1
  361. package/types/core/kel/delegation-ancestry.d.ts +41 -0
  362. package/types/core/kel/delegation-ancestry.d.ts.map +1 -0
  363. package/types/core/kel/eventing.d.ts.map +1 -1
  364. package/types/core/kel/kever.d.ts +5 -4
  365. package/types/core/kel/kever.d.ts.map +1 -1
  366. package/types/core/mailbox/kram-policy.d.ts +14 -0
  367. package/types/core/mailbox/kram-policy.d.ts.map +1 -1
  368. package/types/core/mailbox/kram-pruning.d.ts +1 -3
  369. package/types/core/mailbox/kram-pruning.d.ts.map +1 -1
  370. package/types/core/mailbox/kraming.d.ts +1 -1
  371. package/types/core/mailbox/kraming.d.ts.map +1 -1
  372. package/types/core/records.d.ts +61 -0
  373. package/types/core/records.d.ts.map +1 -1
  374. package/types/core/routing.d.ts +6 -0
  375. package/types/core/routing.d.ts.map +1 -1
  376. package/types/db/basing.d.ts +22 -25
  377. package/types/db/basing.d.ts.map +1 -1
  378. package/types/db/core/dber.d.ts +505 -0
  379. package/types/db/core/dber.d.ts.map +1 -0
  380. package/types/db/core/index.d.ts +4 -2
  381. package/types/db/core/index.d.ts.map +1 -1
  382. package/types/db/core/indexeddb-persistence.d.ts +59 -0
  383. package/types/db/core/indexeddb-persistence.d.ts.map +1 -0
  384. package/types/db/core/lmdb-opener.d.ts +17 -0
  385. package/types/db/core/lmdb-opener.d.ts.map +1 -0
  386. package/types/db/core/lmdber.d.ts +60 -383
  387. package/types/db/core/lmdber.d.ts.map +1 -1
  388. package/types/db/core/memstore.d.ts +129 -0
  389. package/types/db/core/memstore.d.ts.map +1 -0
  390. package/types/db/core/path-manager.d.ts +22 -45
  391. package/types/db/core/path-manager.d.ts.map +1 -1
  392. package/types/db/core/store-owner.d.ts +59 -0
  393. package/types/db/core/store-owner.d.ts.map +1 -0
  394. package/types/db/core/webdber.d.ts +127 -0
  395. package/types/db/core/webdber.d.ts.map +1 -0
  396. package/types/db/escrowing.d.ts +3 -3
  397. package/types/db/escrowing.d.ts.map +1 -1
  398. package/types/db/exchange/exchange-nests.d.ts.map +1 -1
  399. package/types/db/indexeddb.d.ts +37 -0
  400. package/types/db/indexeddb.d.ts.map +1 -0
  401. package/types/db/keeping.d.ts +14 -25
  402. package/types/db/keeping.d.ts.map +1 -1
  403. package/types/db/koming.d.ts +7 -8
  404. package/types/db/koming.d.ts.map +1 -1
  405. package/types/db/lmdb-stores.d.ts +45 -0
  406. package/types/db/lmdb-stores.d.ts.map +1 -0
  407. package/types/db/lmdb.d.ts +7 -0
  408. package/types/db/lmdb.d.ts.map +1 -0
  409. package/types/db/mailbox/mailboxing.d.ts +7 -21
  410. package/types/db/mailbox/mailboxing.d.ts.map +1 -1
  411. package/types/db/noting.d.ts +7 -12
  412. package/types/db/noting.d.ts.map +1 -1
  413. package/types/db/reger.d.ts +7 -11
  414. package/types/db/reger.d.ts.map +1 -1
  415. package/types/db/replay/witness-replay.d.ts +0 -2
  416. package/types/db/replay/witness-replay.d.ts.map +1 -1
  417. package/types/db/store-lock.d.ts +72 -0
  418. package/types/db/store-lock.d.ts.map +1 -0
  419. package/types/db/subing.d.ts +24 -25
  420. package/types/db/subing.d.ts.map +1 -1
  421. package/types/npm/db-indexeddb.d.ts +4 -0
  422. package/types/npm/db-indexeddb.d.ts.map +1 -0
  423. package/types/npm/db-lmdb.d.ts +4 -0
  424. package/types/npm/db-lmdb.d.ts.map +1 -0
  425. package/types/npm/runtime-node.d.ts +4 -0
  426. package/types/npm/runtime-node.d.ts.map +1 -0
  427. package/types/npm/runtime-web.d.ts +4 -0
  428. package/types/npm/runtime-web.d.ts.map +1 -0
  429. package/types/runtime/index.d.ts +48 -14
  430. package/types/runtime/index.d.ts.map +1 -1
  431. package/types/runtime/node.d.ts +15 -0
  432. package/types/runtime/node.d.ts.map +1 -0
  433. package/types/runtime/web/output-barrier.d.ts +30 -0
  434. package/types/runtime/web/output-barrier.d.ts.map +1 -0
  435. package/types/runtime/web/persistent-storage.d.ts +36 -0
  436. package/types/runtime/web/persistent-storage.d.ts.map +1 -0
  437. package/types/runtime/web.d.ts +11 -0
  438. package/types/runtime/web.d.ts.map +1 -0
  439. package/types/vdr/tel-publication.d.ts +6 -0
  440. package/types/vdr/tel-publication.d.ts.map +1 -1
  441. package/types/version.d.ts +2 -2
  442. package/esm/keri/npm/src/acdc/relating.js +0 -59
  443. package/esm/keri/npm/src/cli/common/tel-completion.js +0 -24
  444. package/esm/keri/npm/src/db/baser-defaults.js +0 -11
  445. package/types/acdc/relating.d.ts +0 -21
  446. package/types/acdc/relating.d.ts.map +0 -1
  447. package/types/cli/common/tel-completion.d.ts +0 -8
  448. package/types/cli/common/tel-completion.d.ts.map +0 -1
  449. package/types/db/baser-defaults.d.ts +0 -5
  450. package/types/db/baser-defaults.d.ts.map +0 -1
@@ -2,33 +2,35 @@ import { Organizer } from "../identity/organizing.js";
2
2
  /**
3
3
  * Multisig proposal and approval workflows.
4
4
  *
5
- * CLI orchestration owns timed waits, worker lifetimes, prompts and output.
6
5
  * This module publishes proposals and approves stored KEL/RPY/VDR proposals
7
- * without starting or driving background workers.
6
+ * without starting or driving background workers. `approveGroupProposal` is the
7
+ * only caller that approves; it never asks, because calling it is the consent.
8
8
  */
9
- import { attachmentPayload, collectPayload, concatBytes, Counter, Diger, Ilks, NumberPrimitive, NumDex, parseBytes, Prefixer, SerderACDC, SerderKERI, TraitDex, Vrsn_2_0, } from "cesr-ts";
9
+ import { attachmentPayload, collectPayload, concatBytes, Counter, Diger, Ilks, NumberPrimitive, NumDex, parseBytes, Prefixer, SerderACDC, SerderKERI, TraitDex, Verfer, Vrsn_2_0, } from "cesr-ts";
10
10
  import { verifyRegistryAnchor, vetBlind, } from "../../acdc/regeventing.js";
11
11
  import { publicOpeningAttachment } from "../../acdc/registering.js";
12
12
  import { ValidationError } from "../../core/errors.js";
13
- import { isV2RegistryRoute } from "../../core/exchange/protocol-exchanging.js";
14
13
  import { Kever } from "../../core/kel/kever.js";
15
14
  import { messagize } from "../../core/protocol-serialization.js";
16
15
  import { RegistryRecord } from "../../core/records.js";
16
+ import { dgKey } from "../../db/core/keys.js";
17
17
  import { loadNests } from "../../db/exchange/exchange-nests.js";
18
18
  import { Credentialer, Registry, serializeCredential } from "../../vdr/credentialing.js";
19
19
  import { envelopeFromFrame } from "../protocol/parsering.js";
20
20
  import { groupCredentialAnchorReady, validateCredentialIssueProposal, validateCredentialRevocationProposal, validateCredentialSource, validateRegistryName, validateRegistryProposal, } from "../credentials/credential-proposals.js";
21
+ import { telEventStatus } from "../credentials/tel-completion.js";
21
22
  import { endpointRoleAccepted, groupEndorseReply, groupEventKeys, groupSigningMembers, localGroupMember, signLocalGroupEvent, } from "../identity/endpoint-roleing.js";
22
23
  import { Reactor } from "../protocol/reactor.js";
23
24
  import { abortable } from "../runtime/abortable.js";
24
25
  import { collectBytes } from "../transport/byte-source.js";
25
26
  import { findLocalGroupMember as findLocalMember, groupMemberHasKey, uniqueMembers } from "./group-members.js";
26
27
  import { acdcV2RegistryProposal, MULTISIG_ICP_ROUTE, MULTISIG_ISS_ROUTE, MULTISIG_IXN_ROUTE, MULTISIG_REV_ROUTE, MULTISIG_ROT_ROUTE, MULTISIG_RPY_ROUTE, MULTISIG_VCP_ROUTE, multisigChild, multisigChildEvidence, multisigChildGenusAttrs, prepareAcdcV2RegistryExn, prepareMultisigEventExn, prepareMultisigVdrExn, registryProposalEvent, } from "./grouping.js";
27
- import { admitAndSendGroupMessage, groupSendResult, multisigPayloadSaid, prepareGroupMessage, remoteGroupMembers, signGroupMessage, storedGroupMessage, } from "./multisig-messaging.js";
28
+ import { admitAndSendGroupMessage, groupSendResult, prepareGroupMessage, remoteGroupMembers, signGroupMessage, storedGroupMessage, } from "./multisig-messaging.js";
28
29
  /** Approve one exact ACDC v2 TEL/anchor through existing member signing and ordinary processors.
29
30
  * A returned wrapper records consent, not quorum/witness/TEL completion; retry the accepted-state owners.
31
+ * `resume` reuses this member's recorded anchor signatures after a crash instead of signing again.
30
32
  */
31
- export function* approveAcdcV2Registry(hby, protocol, group, event, { anchor, opening } = {}) {
33
+ export function* approveAcdcV2Registry(hby, protocol, group, event, { anchor, opening, resume } = {}) {
32
34
  const registry = protocol.registry, member = localGroupMember(hby, group.pre);
33
35
  if (!registry || group.db !== hby.db || registry.db !== hby.db) {
34
36
  throw new ValidationError("ACDC v2 group registry owner is unavailable.");
@@ -105,7 +107,10 @@ export function* approveAcdcV2Registry(hby, protocol, group, event, { anchor, op
105
107
  throw new ValidationError("Registry anchor does not extend the current group event.");
106
108
  }
107
109
  const keys = groupEventKeys(hby, group.pre, anchor);
108
- const sigers = signLocalGroupEvent(hby, anchor, groupSigningMembers(hby, group.pre), keys);
110
+ const members = groupSigningMembers(hby, group.pre);
111
+ // A resuming caller reuses the signatures the first attempt recorded in `sigs.` instead of signing the anchor again.
112
+ const sigers = (resume ? recordedLocalSignatures(hby, anchor, group.pre, members) : null)
113
+ ?? signLocalGroupEvent(hby, anchor, members, keys);
109
114
  const own = messagize(anchor, { sigers, gvrsn: Vrsn_2_0 });
110
115
  const tel = concatBytes(event.raw, Counter.enclose({
111
116
  code: "AttachmentGroup",
@@ -152,9 +157,10 @@ export function* publishAcdcV2Registry(hby, postman, group, approval) {
152
157
  * @param proposal Route-correlated group proposal with its named business fields.
153
158
  * @param embeddedMessage Signed child wire to include under the route-derived label.
154
159
  * @param childGvrsn Optional explicit attachment genus for the child.
160
+ * @param wrapperVersion Optional wrapper protocol version; an approval mirrors its proposal's.
155
161
  * @returns Stable proposal/wrapper identities and completed deliveries, independent of group acceptance.
156
162
  */
157
- export function* publishProposal(hby, protocol, postman, member, recipients, proposal, embeddedMessage, childGvrsn) {
163
+ export function* publishProposal(hby, protocol, postman, member, recipients, proposal, embeddedMessage, childGvrsn, wrapperVersion) {
158
164
  const input = new Reactor(protocol);
159
165
  const outcomes = [];
160
166
  for (const recipient of remoteGroupMembers(hby, member, recipients)) {
@@ -162,6 +168,7 @@ export function* publishProposal(hby, protocol, postman, member, recipients, pro
162
168
  const prepared = yield* prepareMultisigEventExn(member.pre, proposal, embeddedMessage, {
163
169
  recipient: destination,
164
170
  childGvrsn,
171
+ ...(wrapperVersion ? { pvrsn: wrapperVersion } : {}),
165
172
  });
166
173
  const signed = yield* prepareGroupMessage(protocol.exc, member, destination, prepared);
167
174
  outcomes.push(yield* admitAndSendGroupMessage(input, postman, signed));
@@ -220,109 +227,34 @@ export function routeForKelEvent(serder) {
220
227
  }
221
228
  }
222
229
  /**
223
- * Select accepted coordination evidence before any approval effects.
224
- * An explicit SAID names the outer EXN and survives notification consumption.
225
- * Notices discover candidates; their attributes do not authorize a route or group.
226
- * An explicit accepted wrapper missing its handler index is replayed by the caller.
230
+ * Approve and publish this member's contribution to one `rip` or `bup` proposal.
231
+ * Null when the proposal is not a well-formed one for a joined group; it then stays inert.
227
232
  */
228
- function* pendingMultisigProposals(hby, runtime, notices, options) {
229
- const candidates = options.said ? [options.said] : notices.map(note => note.attrs.d);
230
- const group = options.group && (hby.habByName(options.group)?.pre ?? options.group);
231
- const selected = [];
232
- for (const said of new Set(candidates)) {
233
- if (typeof said !== "string")
234
- continue;
235
- const exn = hby.db.exns.get([said]);
236
- if (!exn?.ked)
237
- continue;
238
- const route = exn.route ?? "";
239
- if (!isKelRoute(route) && !isVdrRoute(route) && route !== MULTISIG_RPY_ROUTE && !isV2RegistryRoute(route)) {
240
- continue;
241
- }
242
- const payloadSaid = multisigPayloadSaid(exn);
243
- if (!payloadSaid)
244
- continue;
245
- const indexed = hby.db.meids.get([payloadSaid]).some(index => index.qb64 === said);
246
- if (!indexed && !options.said)
247
- continue;
248
- const proposalGroup = isKelRoute(route)
249
- ? kelApproval(exn, route, yield* kelChild(hby, runtime, exn, route))?.group
250
- : stringField(payloadSection(exn.ked), "gid");
251
- if (!proposalGroup)
252
- continue;
253
- if (group && group !== proposalGroup) {
254
- if (options.said) {
255
- throw new ValidationError(`Multisig exchange ${said} belongs to group ${proposalGroup}, not ${group}.`);
256
- }
257
- continue;
258
- }
259
- selected.push({ exn, route, indexed });
260
- }
261
- return selected;
262
- }
263
- /** Approve matching stored evidence; host progress and deadlines belong to the caller. */
264
- export function* approvePendingMultisigProposal(hby, runtime, options) {
265
- const notifier = runtime.notifier;
266
- if (!notifier && !options.said) {
267
- throw new ValidationError("Multisig join requires notification storage or an explicit exchange SAID.");
268
- }
269
- const notices = (notifier?.list(0, 100) ?? []);
270
- for (const { exn, route, indexed } of yield* pendingMultisigProposals(hby, runtime, notices, options)) {
271
- if (!indexed) {
272
- // Acceptance commits before the asynchronous handler. Resume that ordinary
273
- // authenticated intake after interruption; never synthesize approval indexes.
274
- const message = yield* abortable(signal => collectBytes(runtime.exc.replay(exn.said, signal)));
275
- yield* runtime.reactor.processBytes(message, { local: true });
276
- const payloadSaid = multisigPayloadSaid(exn);
277
- if (!hby.db.meids.get([payloadSaid]).some(index => index.qb64 === exn.said))
278
- continue;
279
- }
280
- const rgy = isVdrRoute(route) ? runtime.vdr : null;
281
- let result;
282
- if (isKelRoute(route)) {
283
- result = yield* approveKelProposal(hby, runtime, exn, route, options);
284
- }
285
- else if (isVdrRoute(route)) {
286
- result = yield* approveVdrProposal(hby, rgy, runtime, exn, route, options);
287
- }
288
- else if (isV2RegistryRoute(route)) {
289
- const nests = loadNests(hby.db, exn.said);
290
- const proposal = acdcV2RegistryProposal(exn, nests, runtime.acdc?.store ?? null);
291
- const group = proposal?.anchor.pre ? hby.habs.get(proposal.anchor.pre) : null;
292
- if (!proposal || !group)
293
- continue;
294
- const head = group.kever?.serder.said;
295
- if (!head)
296
- throw new ValidationError("Registry approval requires an accepted local group.");
297
- if (!options.callbacks.approveProposal({ route, group: group.pre, embedded: proposal.tel.said }))
298
- continue;
299
- if (group.kever?.serder.said !== head || !acdcV2RegistryProposal(exn, nests, runtime.acdc?.store ?? null)) {
300
- throw new ValidationError("Group or registry changed while approval was pending.");
301
- }
302
- const envelope = envelopeFromFrame(nests[0]), opening = [...envelope.bsqs, ...envelope.bsss];
303
- if (opening.length > 1)
304
- throw new ValidationError("Registry proposal carries multiple openings.");
305
- const approval = yield* approveAcdcV2Registry(hby, runtime.protocol, group, proposal.tel, {
306
- anchor: proposal.anchor,
307
- opening: opening[0],
308
- });
309
- const published = yield* publishAcdcV2Registry(hby, runtime.postman, group, approval);
310
- const regid = proposal.tel.ilk === "rip" ? proposal.tel.said : proposal.tel.regid;
311
- const accepted = runtime.acdc.store.seqEvent(regid, Number(BigInt(`0x${proposal.tel.sad.n}`)))?.said === proposal.tel.said;
312
- result = { route, said: exn.said, embedded: proposal.tel.said, group: group.pre, accepted, ...published };
313
- }
314
- else {
315
- result = yield* approveRpyProposal(hby, runtime, exn, route, options);
316
- }
317
- if (result) {
318
- for (const note of notices) {
319
- if (note.attrs.d === exn.said)
320
- notifier?.remove(note.rid);
321
- }
322
- return result;
323
- }
324
- }
325
- return null;
233
+ export function* approveRegistryV2Proposal(hby, runtime, exn, route, options) {
234
+ const nests = loadNests(hby.db, exn.said);
235
+ const proposal = acdcV2RegistryProposal(exn, nests, runtime.registryStore);
236
+ const group = proposal?.anchor.pre ? hby.habs.get(proposal.anchor.pre) : null;
237
+ if (!proposal || !group)
238
+ return null;
239
+ const head = group.kever?.serder.said;
240
+ if (!head)
241
+ throw new ValidationError("Registry approval requires an accepted local group.");
242
+ if (group.kever?.serder.said !== head || !acdcV2RegistryProposal(exn, nests, runtime.registryStore)) {
243
+ throw new ValidationError("Group or registry changed while approval was pending.");
244
+ }
245
+ const envelope = envelopeFromFrame(nests[0]), opening = [...envelope.bsqs, ...envelope.bsss];
246
+ if (opening.length > 1)
247
+ throw new ValidationError("Registry proposal carries multiple openings.");
248
+ const approval = yield* approveAcdcV2Registry(hby, runtime.protocol, group, proposal.tel, {
249
+ anchor: proposal.anchor,
250
+ opening: opening[0],
251
+ resume: options.resume,
252
+ });
253
+ const published = yield* publishAcdcV2Registry(hby, runtime.postman, group, approval);
254
+ const regid = proposal.tel.ilk === "rip" ? proposal.tel.said : proposal.tel.regid;
255
+ const accepted = runtime.registryStore?.seqEvent(regid, Number(BigInt(`0x${proposal.tel.sad.n}`)))?.said
256
+ === proposal.tel.said;
257
+ return { route, said: exn.said, embedded: proposal.tel.said, group: group.pre, accepted, ...published };
326
258
  }
327
259
  /**
328
260
  * Approve and publish a local contribution to one endpoint-role reply proposal.
@@ -333,10 +265,10 @@ export function* approvePendingMultisigProposal(hby, runtime, options) {
333
265
  * @param runtime Borrowed composed runtime; caller owns its worker and store lifetime.
334
266
  * @param exn Stored multisig exchange wrapper.
335
267
  * @param route Selected multisig route identifying the proposal kind.
336
- * @param options Human approval/alias callbacks and workflow choices; refusal leaves the proposal inert.
268
+ * @param options Alias and name choices plus `resume`; a proposal that is not well formed is left inert.
337
269
  * @returns Approval result with protocol acceptance and deliveries, or null for declined/incomplete input.
338
270
  */
339
- function* approveRpyProposal(hby, runtime, exn, route, options) {
271
+ export function* approveRpyProposal(hby, runtime, exn, route, options) {
340
272
  const wrapperSaid = exn.said;
341
273
  if (!wrapperSaid) {
342
274
  return null;
@@ -354,9 +286,6 @@ function* approveRpyProposal(hby, runtime, exn, route, options) {
354
286
  const { event: rpySerder, attachment, genus } = child;
355
287
  const embeddedSaid = rpySerder.said ?? "";
356
288
  const prior = storedGroupMessage(hby.db, member.pre, exn);
357
- if (!prior && !options.callbacks.approveProposal({ route, group: groupPre, embedded: embeddedSaid || "<unknown>" })) {
358
- return null;
359
- }
360
289
  yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(genus), rpySerder.raw, attachment), { local: true });
361
290
  let localRpy;
362
291
  if (prior) {
@@ -384,10 +313,10 @@ function* approveRpyProposal(hby, runtime, exn, route, options) {
384
313
  * @param runtime Borrowed composed runtime; caller owns its worker and store lifetime.
385
314
  * @param exn Stored multisig exchange wrapper.
386
315
  * @param route Selected multisig route identifying the proposal kind.
387
- * @param options Human approval/alias callbacks and workflow choices; refusal leaves the proposal inert.
316
+ * @param options Alias and name choices plus `resume`; a proposal that is not well formed is left inert.
388
317
  * @returns Approval result with protocol acceptance and deliveries, or null for declined/incomplete input.
389
318
  */
390
- function* approveKelProposal(hby, runtime, exn, route, options) {
319
+ export function* approveKelProposal(hby, runtime, exn, route, options) {
391
320
  const wrapperSaid = exn.said;
392
321
  if (!wrapperSaid) {
393
322
  return null;
@@ -427,24 +356,36 @@ function* approveKelProposal(hby, runtime, exn, route, options) {
427
356
  if (eventAccepted(hby, serder) && !smids.some(mid => hby.habs.has(mid))) {
428
357
  return null;
429
358
  }
430
- if (!options.callbacks.approveProposal({ route, group: groupPre, embedded: embeddedSaid ?? "<unknown>" })) {
431
- return null;
359
+ // Signing writes the member's signatures to `sigs.` when the event is first
360
+ // processed, before any wrapper exists. A resuming caller (explicit consent
361
+ // already given) finds them and reuses them: no second signature and no
362
+ // second join.
363
+ const signed = options.resume ? recordedLocalSignatures(hby, serder, groupPre, smids) : null;
364
+ if (signed) {
365
+ localMessage = messagize(serder, { sigers: signed, pipelined: false, gvrsn: approval.genus });
432
366
  }
433
- if (proposal.route === MULTISIG_ICP_ROUTE || (proposal.route === MULTISIG_ROT_ROUTE && !hby.habs.has(groupPre))) {
434
- const rmids = proposal.attrs.rmids;
435
- const alias = options.callbacks.chooseGroupAlias(groupPre);
436
- hby.joinGroupHab(groupPre, alias, member, smids, rmids.length > 0 ? rmids : smids);
367
+ else {
368
+ if (proposal.route === MULTISIG_ICP_ROUTE || (proposal.route === MULTISIG_ROT_ROUTE && !hby.habs.has(groupPre))) {
369
+ const rmids = proposal.attrs.rmids;
370
+ const alias = options.groupAlias;
371
+ if (!alias)
372
+ throw new ValidationError(`A group alias is required to join ${groupPre}.`);
373
+ hby.joinGroupHab(groupPre, alias, member, smids, rmids.length > 0 ? rmids : smids);
374
+ }
375
+ const keys = groupEventKeys(hby, groupPre, serder);
376
+ const sigers = signLocalGroupEvent(hby, serder, smids, keys);
377
+ localMessage = messagize(serder, { sigers, pipelined: false, gvrsn: approval.genus });
437
378
  }
438
- const keys = groupEventKeys(hby, groupPre, serder);
439
- const sigers = signLocalGroupEvent(hby, serder, smids, keys);
440
- localMessage = messagize(serder, { sigers, pipelined: false, gvrsn: approval.genus });
441
379
  }
442
380
  // Each contribution may already own a counted attachment enclosure. Admit
443
381
  // complete messages separately and let the ordinary KEL owner union proofs.
444
382
  yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(approval.genus), localMessage), { local: true });
445
383
  yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(approval.genus), serder.raw, approval.attachment), { local: true });
446
384
  yield* runtime.protocol.processEscrowsOnce();
447
- const publication = yield* publishProposal(hby, runtime.protocol, runtime.postman, member, members, proposal, localMessage, approval.genus);
385
+ const publication = yield* publishProposal(hby, runtime.protocol, runtime.postman, member, members, proposal, localMessage, approval.genus,
386
+ // KERIpy indexes contributions by wrapper form (v1 `e` SAID, v2 child SAID), so an
387
+ // approval must reuse its proposal's wrapper version for the proposer to merge it.
388
+ exn.pvrsn);
448
389
  const accepted = eventAccepted(hby, serder);
449
390
  if (proposal.route !== MULTISIG_IXN_ROUTE) {
450
391
  commitAcceptedGroupMembers(hby, serder, smids, proposal.attrs.rmids);
@@ -461,10 +402,10 @@ function* approveKelProposal(hby, runtime, exn, route, options) {
461
402
  * @param runtime Borrowed composed runtime; caller owns its worker and store lifetime.
462
403
  * @param exn Stored multisig exchange wrapper.
463
404
  * @param route Selected multisig route identifying the proposal kind.
464
- * @param options Human approval/alias callbacks and workflow choices; refusal leaves the proposal inert.
405
+ * @param options Alias and name choices plus `resume`; a proposal that is not well formed is left inert.
465
406
  * @returns Approval result with protocol acceptance and deliveries, or null for declined/incomplete input.
466
407
  */
467
- function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
408
+ export function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
468
409
  const wrapperSaid = exn.said;
469
410
  if (!wrapperSaid) {
470
411
  return null;
@@ -522,15 +463,14 @@ function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
522
463
  const prior = storedGroupMessage(hby.db, member.pre, exn);
523
464
  if (!prior && !groupCredentialAnchorReady(hby, groupPre, anchorSerder))
524
465
  return null;
525
- if (!prior && !options.callbacks.approveProposal({ route, group: groupPre, embedded: embeddedSaid || "<unknown>" })) {
526
- return null;
527
- }
528
- // Declined or malformed proposals remain inert; require VDR before signing or intake.
466
+ // Malformed proposals remain inert; require VDR before signing or intake.
529
467
  if (!rgy)
530
468
  throw new ValidationError("Legacy credential registry is unavailable in this runtime.");
531
469
  let registryName;
532
470
  if (proposal.route === MULTISIG_VCP_ROUTE && !prior) {
533
- registryName = options.callbacks.chooseRegistryName(embeddedSerder.pre);
471
+ registryName = options.registryName;
472
+ if (!registryName)
473
+ throw new ValidationError(`A registry name is required for ${embeddedSerder.pre}.`);
534
474
  validateRegistryName(rgy.reger, registryName, embeddedSerder.pre);
535
475
  }
536
476
  const smids = groupSigningMembers(hby, groupPre);
@@ -540,7 +480,8 @@ function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
540
480
  }
541
481
  else {
542
482
  const keys = groupEventKeys(hby, groupPre, anchorSerder);
543
- const sigers = signLocalGroupEvent(hby, anchorSerder, smids, keys);
483
+ const sigers = (options.resume ? recordedLocalSignatures(hby, anchorSerder, groupPre, smids) : null)
484
+ ?? signLocalGroupEvent(hby, anchorSerder, smids, keys);
544
485
  localAnchor = messagize(anchorSerder, { sigers, pipelined: false, gvrsn: genus });
545
486
  }
546
487
  yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(genus), localAnchor), { local: true });
@@ -595,13 +536,32 @@ function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
595
536
  tel: {
596
537
  pre: embeddedSerder.pre,
597
538
  sn: embeddedSerder.sn,
598
- publicationComplete: rgy.publication.complete(embeddedSerder.pre, embeddedSerder.sn),
539
+ publicationComplete: telEventStatus({ publication: rgy.publication }, embeddedSerder.pre, embeddedSerder.sn).state === "complete",
599
540
  },
600
541
  ...published,
601
542
  };
602
543
  }
544
+ /**
545
+ * This process's verified signatures for a group event, one per local signing
546
+ * member, read from `sigs.`; null unless every local member's key index has one.
547
+ * Remote members' signatures in the same row never count.
548
+ */
549
+ function recordedLocalSignatures(hby, serder, groupPre, smids) {
550
+ if (!hby.habs.has(groupPre) || !serder.pre || !serder.said)
551
+ return null;
552
+ const local = smids.flatMap((mid, index) => hby.habs.has(mid) ? [index] : []);
553
+ const stored = hby.db.sigs.get(dgKey(serder.pre, serder.said));
554
+ if (local.length === 0 || stored.length === 0)
555
+ return null;
556
+ const verfers = groupEventKeys(hby, groupPre, serder).map(qb64 => new Verfer({ qb64 }));
557
+ const { sigers } = Kever.verifyIndexedSignatures(serder.raw, stored, verfers);
558
+ const own = sigers.filter(siger => local.includes(siger.index));
559
+ return local.every(index => own.some(siger => siger.index === index))
560
+ ? own.sort((left, right) => left.index - right.index)
561
+ : null;
562
+ }
603
563
  /** Preserve the recorded signing/rotation participant order during approval and resume. */
604
- function kelApprovalMembers({ proposal }) {
564
+ export function kelApprovalMembers({ proposal }) {
605
565
  if (proposal.route === MULTISIG_IXN_ROUTE)
606
566
  return [...proposal.attrs.smids];
607
567
  return uniqueMembers([...proposal.attrs.smids, ...proposal.attrs.rmids]);
@@ -657,7 +617,7 @@ function kelProposalLabel(route) {
657
617
  }
658
618
  }
659
619
  /** Decode the fields used by approval, preserving existing missing-embed and member-list behavior. */
660
- function kelApproval(exn, route, child) {
620
+ export function kelApproval(exn, route, child) {
661
621
  if (!child)
662
622
  return null;
663
623
  const { event } = child;
@@ -786,7 +746,7 @@ function rpyAttrs(serder) {
786
746
  }
787
747
  return { cid: attrs.cid, role: attrs.role, eid: attrs.eid };
788
748
  }
789
- function payloadSection(ked) {
749
+ export function payloadSection(ked) {
790
750
  return isRecord(ked.a) ? ked.a : {};
791
751
  }
792
752
  function embeddedSection(ked) {
@@ -807,10 +767,10 @@ function stringField(record, field) {
807
767
  function isRecord(value) {
808
768
  return typeof value === "object" && value !== null && !Array.isArray(value);
809
769
  }
810
- function isKelRoute(route) {
770
+ export function isKelRoute(route) {
811
771
  return route === MULTISIG_ICP_ROUTE || route === MULTISIG_ROT_ROUTE || route === MULTISIG_IXN_ROUTE;
812
772
  }
813
- function isVdrRoute(route) {
773
+ export function isVdrRoute(route) {
814
774
  return route === MULTISIG_VCP_ROUTE || route === MULTISIG_ISS_ROUTE || route === MULTISIG_REV_ROUTE;
815
775
  }
816
776
  function requireText(value, label) {