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,20 +2,25 @@ import * as dntShim from "../../_dnt.shims.js";
2
2
  import { concatBytes, Counter, parse, SerderKERI } from "cesr-ts";
3
3
  import { action, spawn } from "effection";
4
4
  import { Organizer } from "../../app/identity/organizing.js";
5
- import { credentialSaidFromGrant, ipexCredentialAdmit, ipexCredentialGrant, processCredentialPresentationArtifacts, storedGrantArtifacts, validateAdmitGrant, } from "../../app/ipex/ipex-credentialing.js";
5
+ import { approveGroupIpex, waitForGroupIpex } from "../../app/ipex/group-ipex.js";
6
+ import { requireIpexPrior, sendIpexAgree, sendIpexApply, sendIpexOffer, sendIpexSpurn, waitForIpexExchange, } from "../../app/ipex/ipex-conversation.js";
7
+ import { ipexCredentialAdmit, ipexCredentialGrant, } from "../../app/ipex/ipex-credentialing.js";
8
+ import { requireAdmittableGrant, sendIpexAdmit, sendIpexGrant, settleGrantCredential, } from "../../app/ipex/ipex-granting.js";
6
9
  import { approveMultisigIpex, approveStoredMultisigIpexWrappers, findPendingMultisigIpex, groupIpexPartial, publishInitialGroupIpex, requireStoredExchange, sendCompletedGroupIpex, sendCredentialStream, storedExchangeMessage, storedMultisigIpexBody, } from "../../app/ipex/ipex-grouping.js";
7
- import { IPEX_ADMIT_ROUTE, IPEX_AGREE_ROUTE, IPEX_APPLY_ROUTE, IPEX_GRANT_ROUTE, IPEX_OFFER_ROUTE, IPEX_SPURN_ROUTE, validateIpexReply, } from "../../app/ipex/ipexing.js";
10
+ import { IPEX_ADMIT_ROUTE, IPEX_AGREE_ROUTE, IPEX_APPLY_ROUTE, IPEX_GRANT_ROUTE, IPEX_OFFER_ROUTE, IPEX_SPURN_ROUTE, } from "../../app/ipex/ipexing.js";
11
+ import { ipexBaseline, MailboxIntakeTally, settleStoredGrants, waitForIpexArrival, } from "../../app/mailbox/ipex-arrival.js";
8
12
  import { isLocalGroupHab, localGroupMember } from "../../app/multisig/group-members.js";
9
13
  import { MULTISIG_EXN_ROUTE } from "../../app/multisig/grouping.js";
10
14
  import { abortable } from "../../app/runtime/abortable.js";
11
15
  import { runAgentRuntime, settleMailboxPollBatch } from "../../app/runtime/agent-runtime.js";
12
- import { chunkBytes, collectBytes, fileBytes } from "../../app/transport/byte-source.js";
16
+ import { chunkBytes, collectBytes } from "../../app/transport/byte-source.js";
17
+ import { fileBytes } from "../../app/transport/file-bytes.js";
13
18
  import { parseGvrsn } from "../../core/attachment-countering.js";
14
19
  import { ValidationError } from "../../core/errors.js";
15
20
  import { exchange } from "../../core/exchange/protocol-exchanging.js";
16
- import { CREDENTIAL_MAILBOX_TOPIC } from "../../core/mailbox/mailbox-topics.js";
17
21
  import { withAgentRuntime } from "../common/context.js";
18
22
  import { parseBooleanOption, parseNumberOption, parseStringOption } from "../common/parsing.js";
23
+ import { withRuntimeWorkers } from "../common/runtime-workers.js";
19
24
  /**
20
25
  * Implement `tufa ipex apply` by sending a schema/attribute request EXN.
21
26
  *
@@ -30,13 +35,22 @@ export function* ipexApplyCommand(args) {
30
35
  return yield* withIpexRuntime(ipexArgs, function* ({ hby, runtime }) {
31
36
  const hab = requireHab(hby, ipexArgs.alias);
32
37
  const recipient = new Organizer(hby.db, hby.signator).resolveRecipient(requireString(ipexArgs.recipient, "Recipient"));
33
- const prepared = exchange(IPEX_APPLY_ROUTE, {
34
- m: ipexArgs.message ?? "",
35
- s: schema,
36
- a: attrs,
37
- i: recipient,
38
- }, { sender: hab.pre, recipient });
39
- return yield* sendConversation(hby, runtime, hab, recipient, prepared, timeout);
38
+ if (isLocalGroupHab(hby, hab)) {
39
+ // TODO(group proposal API): replace with the multisig proposal API from app/multisig/counseling.ts.
40
+ const prepared = exchange(IPEX_APPLY_ROUTE, {
41
+ m: ipexArgs.message ?? "",
42
+ s: schema,
43
+ a: attrs,
44
+ i: recipient,
45
+ }, { sender: hab.pre, recipient });
46
+ return yield* sendGroupConversation(hby, runtime, hab, recipient, prepared, timeout);
47
+ }
48
+ return yield* withRuntimeWorkers(runtime, { hab }, () => sendIpexApply(ipexSendDeps(hby, runtime), hab, {
49
+ recipient,
50
+ schema: schema,
51
+ attrs,
52
+ message: ipexArgs.message,
53
+ }));
40
54
  });
41
55
  }
42
56
  /**
@@ -53,15 +67,21 @@ export function* ipexOfferCommand(args) {
53
67
  return yield* withIpexRuntime(ipexArgs, function* ({ hby, runtime }) {
54
68
  const hab = requireHab(hby, ipexArgs.alias);
55
69
  const recipient = new Organizer(hby.db, hby.signator).resolveRecipient(requireString(ipexArgs.recipient, "Recipient"));
70
+ // A bad prior is reported before an unreadable ACDC file.
56
71
  if (apply)
57
- requireConversationPrior(hby, hab, recipient, apply, "offer");
58
- const prepared = exchange(IPEX_OFFER_ROUTE, { m: ipexArgs.message ?? "" }, {
59
- sender: hab.pre,
60
- recipient,
61
- dig: apply,
62
- embeds: { acdc: dntShim.Deno.readFileSync(acdcFile) },
63
- });
64
- return yield* sendConversation(hby, runtime, hab, recipient, prepared, timeout);
72
+ requireIpexPrior(hby, hab.pre, recipient, apply, "offer");
73
+ const acdc = dntShim.Deno.readFileSync(acdcFile);
74
+ if (isLocalGroupHab(hby, hab)) {
75
+ // TODO(group proposal API): replace with the multisig proposal API from app/multisig/counseling.ts.
76
+ const prepared = exchange(IPEX_OFFER_ROUTE, { m: ipexArgs.message ?? "" }, {
77
+ sender: hab.pre,
78
+ recipient,
79
+ dig: apply,
80
+ embeds: { acdc },
81
+ });
82
+ return yield* sendGroupConversation(hby, runtime, hab, recipient, prepared, timeout);
83
+ }
84
+ return yield* withRuntimeWorkers(runtime, { hab }, () => sendIpexOffer(ipexSendDeps(hby, runtime), hab, { recipient, acdc, apply, message: ipexArgs.message }));
65
85
  });
66
86
  }
67
87
  /** Implement `tufa ipex agree` as a response to an accepted offer EXN. */
@@ -79,13 +99,17 @@ export function* ipexSpurnCommand(args) {
79
99
  return yield* withIpexRuntime(ipexArgs, function* ({ hby, runtime }) {
80
100
  const hab = requireHab(hby, ipexArgs.alias);
81
101
  const dest = new Organizer(hby.db, hby.signator).resolveRecipient(requireString(ipexArgs.recipient, "Recipient"));
82
- requireConversationPrior(hby, hab, dest, prior, "spurn");
83
- const prepared = exchange(IPEX_SPURN_ROUTE, { m: ipexArgs.message ?? "" }, {
84
- sender: hab.pre,
85
- recipient: dest,
86
- dig: prior,
87
- });
88
- return yield* sendConversation(hby, runtime, hab, dest, prepared, timeout);
102
+ if (isLocalGroupHab(hby, hab)) {
103
+ requireIpexPrior(hby, hab.pre, dest, prior, "spurn");
104
+ // TODO(group proposal API): replace with the multisig proposal API from app/multisig/counseling.ts.
105
+ const prepared = exchange(IPEX_SPURN_ROUTE, { m: ipexArgs.message ?? "" }, {
106
+ sender: hab.pre,
107
+ recipient: dest,
108
+ dig: prior,
109
+ });
110
+ return yield* sendGroupConversation(hby, runtime, hab, dest, prepared, timeout);
111
+ }
112
+ return yield* withRuntimeWorkers(runtime, { hab }, () => sendIpexSpurn(ipexSendDeps(hby, runtime), hab, { recipient: dest, prior, message: ipexArgs.message }));
89
113
  });
90
114
  }
91
115
  /**
@@ -112,9 +136,29 @@ export function* ipexGrantCommand(args) {
112
136
  else {
113
137
  recipient = new Organizer(hby.db, hby.signator).resolveRecipient(selectedRecipient);
114
138
  }
139
+ if (!isLocalGroupHab(hby, hab)) {
140
+ return yield* withRuntimeWorkers(runtime, { hab }, function* () {
141
+ const sent = yield* sendIpexGrant({ ...ipexSendDeps(hby, runtime), reger }, hab, {
142
+ recipient,
143
+ credential: ipexArgs.said,
144
+ message: ipexArgs.message,
145
+ agree: ipexArgs.agree,
146
+ gvrsn: ipexArgs.gvrsn,
147
+ deliver: !ipexArgs.out,
148
+ });
149
+ if (ipexArgs.out)
150
+ dntShim.Deno.writeFileSync(ipexArgs.out, concatBytes(...sent.support, sent.wire));
151
+ return {
152
+ grant: sent.grant,
153
+ credential: ipexArgs.said,
154
+ support: sent.support.length,
155
+ deliveries: sent.deliveries,
156
+ };
157
+ });
158
+ }
159
+ // TODO(group proposal API): replace the group branch with the multisig proposal API from app/multisig/counseling.ts.
115
160
  if (ipexArgs.agree)
116
161
  requireConversationPrior(hby, hab, recipient, ipexArgs.agree, "grant");
117
- const group = isLocalGroupHab(hby, hab);
118
162
  const grant = ipexCredentialGrant({
119
163
  hby,
120
164
  hab,
@@ -126,26 +170,14 @@ export function* ipexGrantCommand(args) {
126
170
  agree: ipexArgs.agree ? hby.db.exns.get([ipexArgs.agree]) : null,
127
171
  gvrsn: ipexArgs.gvrsn,
128
172
  },
129
- sign: !group,
173
+ sign: false,
130
174
  });
131
175
  const genus = grant.grant.gvrsn ?? ipexArgs.gvrsn ?? grant.grant.pvrsn;
132
- const wire = group ? groupIpexPartial(hby, hab, grant.grant, grant.attachments, genus) : grant.wire;
133
- const signer = group ? localGroupMember(hby, hab.pre) : hab;
134
- const host = yield* spawn(() => runAgentRuntime(runtime, { hab: signer, pollMailbox: group }));
135
- try {
176
+ const wire = groupIpexPartial(hby, hab, grant.grant, grant.attachments, genus);
177
+ const signer = localGroupMember(hby, hab.pre);
178
+ return yield* withRuntimeWorkers(runtime, { hab: signer, pollMailbox: true }, function* () {
136
179
  yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(genus), wire), { local: true });
137
180
  yield* runtime.protocol.processEscrowsOnce();
138
- if (!group) {
139
- if (!runtime.exc.complete(grant.grant.said))
140
- throw new ValidationError("Local IPEX grant was not accepted.");
141
- const deliveries = [];
142
- if (!ipexArgs.out) {
143
- deliveries.push(...yield* sendCredentialStream(runtime.postman, hab, recipient, [...grant.support, wire]));
144
- }
145
- if (ipexArgs.out)
146
- dntShim.Deno.writeFileSync(ipexArgs.out, concatBytes(...grant.support, wire));
147
- return { grant: grant.grant, credential: ipexArgs.said, support: grant.support.length, deliveries };
148
- }
149
181
  const publication = yield* publishInitialGroupIpex(hby, runtime.protocol, runtime.postman, hab, wire, genus);
150
182
  const complete = yield* waitForGroupIpexApproval(hby, runtime.protocol, grant.grant.said, ipexArgs.approvalTimeoutSeconds, reger);
151
183
  const deliveries = [...publication.deliveries];
@@ -173,10 +205,7 @@ export function* ipexGrantCommand(args) {
173
205
  deliveries,
174
206
  group: { ...publication, complete: true, lead },
175
207
  };
176
- }
177
- finally {
178
- yield* host.halt();
179
- }
208
+ });
180
209
  });
181
210
  }
182
211
  /**
@@ -201,18 +230,26 @@ export function* ipexAdmitCommand(args) {
201
230
  const selected = yield* loadGrant(hby, ipexArgs);
202
231
  const group = isLocalGroupHab(hby, hab);
203
232
  const signer = group ? localGroupMember(hby, hab.pre) : hab;
204
- const host = yield* spawn(() => runAgentRuntime(runtime, { hab: signer, pollMailbox: group }));
205
- try {
233
+ return yield* withRuntimeWorkers(runtime, { hab: signer, pollMailbox: group }, function* () {
206
234
  if (selected.wire)
207
235
  yield* runtime.reactor.processBytes(selected.wire);
208
- const grant = requireStoredExchange(hby, selected.grant.said);
209
- const recipient = grantSender(grant);
210
- requireConversationPrior(hby, hab, recipient, grant.said, "admit");
211
- const credential = validateAdmitGrant(grant, hab.pre, reger, false);
236
+ const { grant, recipient, credential } = requireAdmittableGrant({ hby, reger }, hab, selected.grant.said);
212
237
  if (!ipexArgs.noWait
213
- && !(yield* settleGrantCredential(hby, runtime.protocol, reger, grant, hab.pre, ipexArgs.gvrsn, ipexArgs.timeout))) {
238
+ && !(yield* settleAndWaitForCredential(hby, runtime.protocol, reger, grant, hab.pre, ipexArgs.gvrsn, ipexArgs.timeout))) {
214
239
  return { admit: null, grant, credential, saved: false, deliveries: [] };
215
240
  }
241
+ if (!group) {
242
+ const sent = yield* sendIpexAdmit({ ...ipexSendDeps(hby, runtime), reger }, hab, grant.said, {
243
+ message: ipexArgs.message,
244
+ gvrsn: ipexArgs.gvrsn,
245
+ requireSaved: !ipexArgs.noWait,
246
+ deliver: !ipexArgs.out,
247
+ });
248
+ if (ipexArgs.out)
249
+ dntShim.Deno.writeFileSync(ipexArgs.out, sent.wire);
250
+ return { admit: sent.admit, grant, credential, saved: sent.saved, deliveries: sent.deliveries };
251
+ }
252
+ // TODO(group proposal API): replace the group branch with the multisig proposal API from app/multisig/counseling.ts.
216
253
  const saved = !!reger.saved.get([credential]);
217
254
  const prepared = ipexCredentialAdmit({
218
255
  hab,
@@ -220,23 +257,13 @@ export function* ipexAdmitCommand(args) {
220
257
  grant,
221
258
  message: ipexArgs.message ?? "",
222
259
  options: { requireSaved: !ipexArgs.noWait, gvrsn: ipexArgs.gvrsn },
223
- sign: !group,
260
+ sign: false,
224
261
  });
225
262
  const genus = prepared.admit.gvrsn ?? ipexArgs.gvrsn ?? prepared.admit.pvrsn;
226
- const wire = group ? groupIpexPartial(hby, hab, prepared.admit, prepared.attachments, genus) : prepared.wire;
263
+ const wire = groupIpexPartial(hby, hab, prepared.admit, prepared.attachments, genus);
227
264
  yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(genus), wire), { local: true });
228
265
  yield* runtime.protocol.processEscrowsOnce();
229
266
  const deliveries = [];
230
- if (!group) {
231
- if (!runtime.exc.complete(prepared.admit.said)) {
232
- throw new ValidationError("Local IPEX admit was not accepted.");
233
- }
234
- if (ipexArgs.out)
235
- dntShim.Deno.writeFileSync(ipexArgs.out, wire);
236
- else
237
- deliveries.push(...yield* sendCredentialStream(runtime.postman, signer, recipient, [wire]));
238
- return { admit: prepared.admit, grant, credential, saved, deliveries };
239
- }
240
267
  const publication = yield* publishInitialGroupIpex(hby, runtime.protocol, runtime.postman, hab, wire, genus);
241
268
  deliveries.push(...publication.deliveries);
242
269
  const complete = yield* waitForGroupIpexApproval(hby, runtime.protocol, prepared.admit.said, ipexArgs.approvalTimeoutSeconds, reger);
@@ -250,10 +277,7 @@ export function* ipexAdmitCommand(args) {
250
277
  }
251
278
  }
252
279
  return { admit: prepared.admit, grant, credential, saved, deliveries, group: { ...publication, complete, lead } };
253
- }
254
- finally {
255
- yield* host.halt();
256
- }
280
+ });
257
281
  });
258
282
  }
259
283
  /** Implement `tufa ipex list` by printing locally accepted IPEX EXNs. */
@@ -280,55 +304,30 @@ export function* ipexPollCommand(args) {
280
304
  const timeoutMs = nonNegativeNumber(args.timeout, 40, "poll timeout seconds") * 1000;
281
305
  return yield* withIpexRuntime(ipexArgs, function* ({ hby, runtime, reger }) {
282
306
  const hab = ipexArgs.alias ? requireHab(hby, ipexArgs.alias) : undefined;
283
- const beforeExns = new Set([...hby.db.exns.getTopItemIter()]
284
- .map(([, exn]) => exn.said)
285
- .filter((said) => typeof said === "string"));
286
- const beforeSaved = savedCredentials(reger);
287
- let batchesSeen = 0;
288
- let messagesSeen = 0;
307
+ const arrivals = { hby, reger };
308
+ const baseline = ipexBaseline(arrivals);
309
+ const tally = new MailboxIntakeTally();
289
310
  const signer = hab && isLocalGroupHab(hby, hab) ? localGroupMember(hby, hab.pre) : hab;
290
- const deadline = Date.now() + timeoutMs;
291
- let receiving = 0;
292
- const host = yield* spawn(() => runAgentRuntime(runtime, { hab: signer, pollMailbox: false }));
293
- try {
311
+ // The CLI has no running runtime: it runs the workers and a mailbox poller around the library wait.
312
+ const result = yield* withRuntimeWorkers(runtime, { hab: signer, pollMailbox: false }, function* () {
294
313
  const mailbox = yield* spawn(function* () {
295
- yield* runtime.mailboxPoller.pollDo(function* (batch) {
296
- receiving++;
297
- try {
298
- yield* settleMailboxPollBatch(runtime, batch);
299
- batchesSeen++;
300
- messagesSeen += batch.messages.length;
301
- }
302
- finally {
303
- receiving--;
304
- }
305
- });
314
+ yield* runtime.mailboxPoller.pollDo((batch) => tally.track(batch, () => settleMailboxPollBatch(runtime, batch)));
306
315
  });
307
316
  try {
308
- while (true) {
309
- yield* processStoredCredentialGrants(hby, runtime, reger, ipexArgs.gvrsn);
310
- // State may become visible before the rest of a delivered batch settles.
311
- if (receiving === 0
312
- && (newIpexMessages(hby, beforeExns).length > 0 || newSavedCredentials(reger, beforeSaved).length > 0)) {
313
- break;
314
- }
315
- if (Date.now() >= deadline)
316
- break;
317
- yield* sleep(Math.min(250, deadline - Date.now()));
318
- }
317
+ return yield* waitForIpexArrival({
318
+ ...arrivals,
319
+ settle: () => settleStoredGrants({ ...arrivals, hby, protocol: runtime.protocol }, ipexArgs.gvrsn),
320
+ }, baseline, { timeoutMs, tally });
319
321
  }
320
322
  finally {
321
323
  yield* mailbox.halt();
322
324
  }
323
- }
324
- finally {
325
- yield* host.halt();
326
- }
325
+ });
327
326
  return {
328
- batches: batchesSeen,
329
- messages: messagesSeen,
330
- ipex: newIpexMessages(hby, beforeExns),
331
- saved: newSavedCredentials(reger, beforeSaved),
327
+ batches: tally.batches,
328
+ messages: tally.messages,
329
+ ipex: result.status.ipex,
330
+ saved: result.status.saved,
332
331
  };
333
332
  });
334
333
  }
@@ -375,6 +374,28 @@ export function* joinIpexProposal(hby, runtime, reger, ipexArgs) {
375
374
  if (!ipexArgs.auto) {
376
375
  return { exn, group: { embedded, accepted: null, approved: null, lead: null, messages: [], deliveries: [] } };
377
376
  }
377
+ if (embedded.pvrsn.major === 2) {
378
+ // ACDC v2: the runtime's group IPEX owner approves, publishes, collects and lets the lead deliver.
379
+ const ops = runtime.operations?.groupIpex;
380
+ if (!ops)
381
+ throw new ValidationError("ACDC v2 group IPEX requires the runtime's operation owners.");
382
+ const said = embedded.said;
383
+ if (!ops.live.has(said))
384
+ yield* approveGroupIpex(ops, said);
385
+ yield* withRuntimeWorkers(runtime, { hab: localGroupMember(hby, group), pollMailbox: true }, () => waitForGroupIpex(ops, said, { timeoutMs: ipexArgs.approvalTimeoutSeconds * 1000 }));
386
+ const outcome = ops.outcomes.get(said);
387
+ return {
388
+ exn,
389
+ group: {
390
+ embedded,
391
+ accepted: runtime.exc.complete(said),
392
+ approved: true,
393
+ lead: runtime.exc.lead(hby.habs.get(group), said),
394
+ messages: outcome?.messages ?? [],
395
+ deliveries: [...(outcome?.deliveries ?? []), ...(outcome?.sent ?? [])],
396
+ },
397
+ };
398
+ }
378
399
  const host = yield* spawn(() => runAgentRuntime(runtime, { hab: localGroupMember(hby, group) }));
379
400
  let credentialSaved;
380
401
  try {
@@ -383,7 +404,7 @@ export function* joinIpexProposal(hby, runtime, reger, ipexArgs) {
383
404
  throw new ValidationError("VDR runtime did not open Reger.");
384
405
  const prior = embedded.ked?.p;
385
406
  const grant = typeof prior === "string" && prior.length > 0 ? hby.db.exns.get([prior]) : null;
386
- credentialSaved = !!grant && (yield* settleGrantCredential(hby, runtime.protocol, reger, grant, group, ipexArgs.gvrsn, ipexArgs.approvalTimeoutSeconds));
407
+ credentialSaved = !!grant && (yield* settleAndWaitForCredential(hby, runtime.protocol, reger, grant, group, ipexArgs.gvrsn, ipexArgs.approvalTimeoutSeconds));
387
408
  if (!credentialSaved) {
388
409
  return {
389
410
  exn,
@@ -440,54 +461,37 @@ function* sendPriorResponse(args, route, priorLabel) {
440
461
  return yield* withIpexRuntime(ipexArgs, function* ({ hby, runtime }) {
441
462
  const hab = requireHab(hby, ipexArgs.alias);
442
463
  const recipient = new Organizer(hby.db, hby.signator).resolveRecipient(requireString(ipexArgs.recipient, "Recipient"));
443
- requireConversationPrior(hby, hab, recipient, prior, "agree");
444
- const prepared = exchange(route, { m: ipexArgs.message ?? "" }, { sender: hab.pre, recipient, dig: prior });
445
- return yield* sendConversation(hby, runtime, hab, recipient, prepared, timeout);
464
+ if (isLocalGroupHab(hby, hab)) {
465
+ requireIpexPrior(hby, hab.pre, recipient, prior, "agree");
466
+ // TODO(group proposal API): replace with the multisig proposal API from app/multisig/counseling.ts.
467
+ const prepared = exchange(route, { m: ipexArgs.message ?? "" }, { sender: hab.pre, recipient, dig: prior });
468
+ return yield* sendGroupConversation(hby, runtime, hab, recipient, prepared, timeout);
469
+ }
470
+ return yield* withRuntimeWorkers(runtime, { hab }, () => sendIpexAgree(ipexSendDeps(hby, runtime), hab, { recipient, offer: prior, message: ipexArgs.message }));
446
471
  });
447
472
  }
448
473
  /** Validate an accepted predecessor and its known parties before any local signing. */
449
474
  function requireConversationPrior(hby, hab, recipient, said, verb) {
450
- const prior = hby.db.exns.get([said]);
451
- if (!prior)
452
- throw new ValidationError("Prior IPEX exchange is not accepted.");
453
- validateIpexReply(prior, verb, hab.pre, recipient);
454
- if (hby.db.erpy.get([said])) {
455
- throw new ValidationError("Prior IPEX exchange already has an accepted response; resume the existing exchange.");
456
- }
475
+ requireIpexPrior(hby, hab.pre, recipient, said, verb);
476
+ }
477
+ /** Collaborators for the library send operations, adapted once from the command runtime. */
478
+ function ipexSendDeps(hby, runtime) {
479
+ return { hby, reactor: runtime.reactor, protocol: runtime.protocol, postman: runtime.postman };
457
480
  }
458
481
  /**
459
- * Run one command host through local intake, member approval and concrete delivery.
460
- * Local conversation state survives transport failure. Group publication and business
461
- * acceptance are separate facts; only an accepted child's elected member sends it
462
- * externally. The caller's resource scope closes stores after this host joins.
482
+ * Run one group command host through local intake, member approval and concrete delivery.
483
+ * Group publication and business acceptance are separate facts; only an accepted
484
+ * child's elected member sends it externally. The caller's resource scope closes
485
+ * stores after this host joins. Single-signature sends use `sendIpex*`.
463
486
  */
464
- function* sendConversation(hby, runtime, hab, recipient, [exn, attachments], timeout) {
465
- const group = isLocalGroupHab(hby, hab);
487
+ function* sendGroupConversation(hby, runtime, hab, recipient, [exn, attachments], timeout) {
466
488
  const genus = exn.gvrsn ?? exn.pvrsn;
467
- const wire = group
468
- ? groupIpexPartial(hby, hab, exn, attachments, genus)
469
- : concatBytes(hab.endorse(exn, { pipelined: false, gvrsn: genus }), attachments);
470
- const signer = group ? localGroupMember(hby, hab.pre) : hab;
471
- const host = yield* spawn(() => runAgentRuntime(runtime, { hab: signer, pollMailbox: group }));
489
+ const wire = groupIpexPartial(hby, hab, exn, attachments, genus);
490
+ const signer = localGroupMember(hby, hab.pre);
491
+ const host = yield* spawn(() => runAgentRuntime(runtime, { hab: signer, pollMailbox: true }));
472
492
  try {
473
493
  yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(genus), wire), { local: true });
474
494
  yield* runtime.protocol.processEscrowsOnce();
475
- if (!group) {
476
- if (!runtime.exc.complete(exn.said))
477
- throw new ValidationError("Local IPEX exchange was not accepted.");
478
- let deliveries;
479
- if (exn.route === IPEX_SPURN_ROUTE) {
480
- deliveries = yield* sendCredentialStream(runtime.postman, hab, recipient, [wire]);
481
- }
482
- else {
483
- const evt = runtime.postman.send({ src: hab.pre, dest: recipient, topic: CREDENTIAL_MAILBOX_TOPIC, msg: wire }, { notify: true });
484
- const outcome = yield* runtime.postman.wait(evt);
485
- if (outcome.kin === "failed")
486
- throw outcome.error;
487
- deliveries = outcome.deliveries;
488
- }
489
- return { exn, deliveries };
490
- }
491
495
  const publication = yield* publishInitialGroupIpex(hby, runtime.protocol, runtime.postman, hab, wire, genus);
492
496
  const complete = yield* waitForGroupIpexApproval(hby, runtime.protocol, exn.said, timeout, null);
493
497
  const lead = complete ? runtime.exc.lead(hab, exn.said) : null;
@@ -553,37 +557,6 @@ function requireNonEmpty(value, label) {
553
557
  throw new ValidationError(`${label} is required and cannot be empty.`);
554
558
  }
555
559
  }
556
- function newIpexMessages(hby, before) {
557
- const messages = [];
558
- for (const [, exn] of hby.db.exns.getTopItemIter()) {
559
- const said = exn.said;
560
- const route = exn.route ?? "";
561
- if (!said || before.has(said) || !route.startsWith("/ipex/")) {
562
- continue;
563
- }
564
- messages.push(exn);
565
- }
566
- return messages;
567
- }
568
- function savedCredentials(reger) {
569
- return new Set([...reger.saved.getTopItemIter()].map(([keys]) => keys[0]).filter((key) => !!key));
570
- }
571
- function newSavedCredentials(reger, before) {
572
- return [...savedCredentials(reger)].filter((said) => !before.has(said));
573
- }
574
- /** Settle accepted grant artifacts before the poll command reports newly saved credentials. */
575
- function* processStoredCredentialGrants(hby, runtime, reger, gvrsn) {
576
- for (const [, grant] of hby.db.exns.getTopItemIter()) {
577
- if (grant.route !== IPEX_GRANT_ROUTE) {
578
- continue;
579
- }
580
- const credentialSaid = credentialSaidFromGrant(grant);
581
- if (!credentialSaid || reger.saved.get([credentialSaid])) {
582
- continue;
583
- }
584
- yield* processCredentialPresentationArtifacts(runtime.protocol, storedGrantArtifacts(hby, grant, gvrsn));
585
- }
586
- }
587
560
  function parseJsonArg(value) {
588
561
  if (!value) {
589
562
  return undefined;
@@ -642,18 +615,13 @@ function grantSender(grant) {
642
615
  * escrow progress. The caller runs the host and selects the elapsed wait; no
643
616
  * admit signature is produced here. Missing evidence remains pending on expiry.
644
617
  */
645
- function* settleGrantCredential(hby, protocol, reger, grant, recipient, genus, timeout) {
646
- const said = validateAdmitGrant(grant, recipient, reger, false);
647
- if (reger.saved.get([said]))
648
- return true;
649
- const deadline = Date.now() + timeout * 1000;
650
- yield* processCredentialPresentationArtifacts(protocol, storedGrantArtifacts(hby, grant, genus));
651
- while (!reger.saved.get([said])) {
652
- if (Date.now() >= deadline)
653
- return false;
654
- yield* sleep(Math.min(250, deadline - Date.now()));
655
- }
656
- return true;
618
+ function* settleAndWaitForCredential(hby, protocol, reger, grant, recipient, genus, timeout) {
619
+ yield* settleGrantCredential({ hby, reger, protocol }, recipient, grant.said, { gvrsn: genus });
620
+ const waited = yield* waitForIpexExchange({ hby, reger }, grant.said, {
621
+ timeoutMs: timeout * 1000,
622
+ until: "credential-saved",
623
+ });
624
+ return waited.outcome === "settled";
657
625
  }
658
626
  /**
659
627
  * Observe one child's approvals under an elapsed deadline. The command's existing