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
@@ -0,0 +1,98 @@
1
+ import { call, race, sleep, spawn } from "effection";
2
+ import { ValidationError } from "../../core/errors.js";
3
+ import { isLocalGroupHab } from "../multisig/group-members.js";
4
+ import { AnchorQuerier, KeyStateNoticer } from "./querying.js";
5
+ /** One elapsed deadline covers query sending and independently received evidence. */
6
+ export const QUERY_TIMEOUT_MS = 10_000;
7
+ /** Reject group habs: a query must be signed by one member, not by a group needing more signatures. */
8
+ export function requireQueryRequester(hby, hab) {
9
+ if (isLocalGroupHab(hby, hab)) {
10
+ throw new ValidationError("Query --alias must select a member requester, not a group requiring additional signatures.");
11
+ }
12
+ }
13
+ /** Durable anchor status (`scope: "durable"`): the accepted KEL of `prefix` already holds the exact seal. */
14
+ export function anchorQueryStatus(deps, prefix, anchor) {
15
+ return deps.hby.db.fetchLastSealingEventByEventSeal(prefix, anchor)
16
+ ? { state: "completed", scope: "durable" }
17
+ : { state: "active", phase: "awaitingEvidence", scope: "durable" };
18
+ }
19
+ /** Start a key-state query in the caller's scope. */
20
+ export function* beginKeyStateQuery(deps, target) {
21
+ requireQueryRequester(deps.hby, target.hab);
22
+ const workflow = new KeyStateNoticer(deps.hby.db, deps.querying, target.prefix, deps.cues, {
23
+ signer: target.hab.pre,
24
+ });
25
+ return yield* startQuery(deps, target.prefix, workflow);
26
+ }
27
+ /** Start an anchor query in the caller's scope. */
28
+ export function* beginAnchorQuery(deps, target) {
29
+ requireQueryRequester(deps.hby, target.hab);
30
+ const workflow = new AnchorQuerier(deps.hby.db, deps.querying, target.prefix, target.anchor, {
31
+ signer: target.hab.pre,
32
+ });
33
+ return yield* startQuery(deps, target.prefix, workflow);
34
+ }
35
+ /**
36
+ * Query current key state for `prefix` and wait for accepted evidence.
37
+ *
38
+ * @returns `settled` (status `completed`), or `timed-out`; a timeout is not permission to treat
39
+ * stale local state as success. Workflow failures propagate.
40
+ */
41
+ export function* queryKeyState(deps, target, options = {}) {
42
+ return yield* beginThenWait(beginKeyStateQuery(deps, target), options);
43
+ }
44
+ /** Query for an accepted KEL event holding the exact seal `target.anchor`; see {@link queryKeyState}. */
45
+ export function* queryAnchor(deps, target, options = {}) {
46
+ return yield* beginThenWait(beginAnchorQuery(deps, target), options);
47
+ }
48
+ /** Spawn the workflow in the caller's scope. */
49
+ function* startQuery(deps, prefix, workflow) {
50
+ let completed = false;
51
+ const status = () => completed
52
+ ? { state: "completed", scope: "process" }
53
+ : { state: "active", phase: "awaitingEvidence", scope: "process" };
54
+ const observing = yield* spawn(function* () {
55
+ yield* workflow.queryDo();
56
+ completed = true;
57
+ });
58
+ deps.changes?.push({ kind: "query", id: prefix });
59
+ return {
60
+ prefix,
61
+ status,
62
+ *wait(options = {}) {
63
+ const outcome = yield* waitForQuery(observing, status, options.timeoutMs ?? QUERY_TIMEOUT_MS);
64
+ if (outcome.outcome === "settled")
65
+ deps.changes?.push({ kind: "query", id: prefix });
66
+ return outcome;
67
+ },
68
+ halt: () => observing.halt(),
69
+ };
70
+ }
71
+ /**
72
+ * Observe completion within the window without transferring task ownership.
73
+ * The race cancels only its observation when the timer wins; the run's `halt`
74
+ * joins the original task.
75
+ */
76
+ function* waitForQuery(observing, status, timeoutMs) {
77
+ const done = yield* race([
78
+ call(function* () {
79
+ yield* observing;
80
+ return true;
81
+ }),
82
+ call(function* () {
83
+ yield* sleep(timeoutMs);
84
+ return false;
85
+ }),
86
+ ]);
87
+ return done ? { outcome: "settled", status: status() } : { outcome: "timed-out", status: status(), timeoutMs };
88
+ }
89
+ /** begin + wait, halting the run on every exit path. */
90
+ function* beginThenWait(begin, options) {
91
+ const run = yield* begin;
92
+ try {
93
+ return yield* run.wait(options);
94
+ }
95
+ finally {
96
+ yield* run.halt();
97
+ }
98
+ }
@@ -19,7 +19,7 @@ import { introduce } from "../delivery/introducing.js";
19
19
  import { runtimeTurn } from "../runtime/runtime-turn.js";
20
20
  import { CesrHttpRefusal } from "../transport/cesr-egress.js";
21
21
  import { HTTPMessenger } from "../transport/http-messenger.js";
22
- import { TCPMessenger } from "../transport/tcp-messenger.js";
22
+ import { requireTcpDialer } from "../transport/tcp-dialer.js";
23
23
  import { TransportError } from "../transport/transport-error.js";
24
24
  /** First eligible role used by KERIpy WitnessInquisitor before random endpoint selection. */
25
25
  const QUERY_ROLE_PRIORITY = [Roles.controller, Roles.agent, Roles.witness];
@@ -309,7 +309,7 @@ export class WitnessInquisitor {
309
309
  // Only this attempt owns signed bytes; failed attempts are never automatically resubmitted.
310
310
  const http = this.http, clock = this.clock;
311
311
  if (new URL(delivery.url).protocol === "tcp:") {
312
- yield* new TCPMessenger(delivery.url, clock, this.protocol).send(delivery.body, {
312
+ yield* requireTcpDialer(http).messenger(delivery.url, clock, this.protocol).send(delivery.body, {
313
313
  signal: controller.signal,
314
314
  replies: true,
315
315
  local: true,
@@ -1,19 +1,19 @@
1
1
  import { WireParseError } from "cesr-ts";
2
2
  import { call, resource, spawn, suspend } from "effection";
3
- import { Dhke } from "../../acdc/dhking.js";
4
3
  import { RegistryObserver } from "../../acdc/observing.js";
5
4
  import { createRegery as createAcdcRegery } from "../../acdc/registraring.js";
6
5
  import { RegistryRoot } from "../../acdc/salting.js";
7
- import { Unblind } from "../../acdc/unblinding.js";
8
6
  import { Deck } from "../../core/deck.js";
9
- import { DatabaseNotOpenError, ValidationError } from "../../core/errors.js";
7
+ import { DatabaseNotOpenError } from "../../core/errors.js";
10
8
  import { Kevery } from "../../core/kel/eventing.js";
11
9
  import { Kramer } from "../../core/mailbox/kraming.js";
12
10
  import { CREDENTIAL_MAILBOX_TOPIC, DELEGATE_MAILBOX_TOPIC, RECEIPT_MAILBOX_TOPIC, REPLAY_MAILBOX_TOPIC, REPLY_MAILBOX_TOPIC, } from "../../core/mailbox/mailbox-topics.js";
11
+ import { Roles } from "../../core/roles.js";
13
12
  import { Revery } from "../../core/routing.js";
13
+ import { openOwner } from "../../db/core/store-owner.js";
14
14
  import { Mailboxer } from "../../db/mailbox/mailboxing.js";
15
15
  import { Noter } from "../../db/noting.js";
16
- import { createReger } from "../../db/reger.js";
16
+ import { Reger } from "../../db/reger.js";
17
17
  import { Regery as VdrRegery } from "../../vdr/credentialing.js";
18
18
  import { Tevery } from "../../vdr/eventing.js";
19
19
  import { Authenticator } from "../bootstrap/authenticating.js";
@@ -27,10 +27,12 @@ import { loadChallengeHandlers } from "../identity/challenging.js";
27
27
  import { Anchorer, loadDelegationHandlers } from "../identity/delegating.js";
28
28
  import { loadIpexHandlers } from "../ipex/ipexing.js";
29
29
  import { ForwardHandler } from "../mailbox/forward-handler.js";
30
+ import { KEL_PUBLISHER_PACING, KelPublisher, kelPublisherDo } from "../mailbox/kel-publisher.js";
30
31
  import { MailboxDirector } from "../mailbox/mailbox-director.js";
31
- import { MailboxPoller } from "../mailbox/mailbox-poller.js";
32
+ import { MAILBOX_POLLER_PACING, MailboxPoller, } from "../mailbox/mailbox-poller.js";
32
33
  import { mailboxerOptionsForHabery } from "../mailbox/mailboxing.js";
33
34
  import { mailboxTopicForRoute } from "../mailbox/topic-routing.js";
35
+ import { Counselor } from "../multisig/counseling.js";
34
36
  import { loadMultisigHandlers } from "../multisig/grouping.js";
35
37
  import { noterOptionsForHabery, Notifier } from "../notifications/notifying.js";
36
38
  import { Signaler } from "../notifications/signaling.js";
@@ -40,7 +42,11 @@ import { QueryReplies } from "../queries/query-replies.js";
40
42
  import { WitnessInquisitor } from "../queries/witness-inquisitor.js";
41
43
  import { Receiptor } from "../witness/receipting.js";
42
44
  import { cueDo } from "./cue-runtime.js";
43
- import { runtimeTurn } from "./runtime-turn.js";
45
+ import { doEvery, PROTOCOL_PACING } from "./doing.js";
46
+ import { IpexAuxiliaries } from "./ipex-auxiliaries.js";
47
+ import { composeOwners, operationOwnersDo, OWNER_PACING, } from "./operation-owners.js";
48
+ import { signalerChangeSink } from "./workflow-contract.js";
49
+ import { observeUntil } from "./workflow-contract.js";
44
50
  /**
45
51
  * Create the shared runtime composition root used by CLI commands and
46
52
  * `tufa agent`.
@@ -58,15 +64,6 @@ import { runtimeTurn } from "./runtime-turn.js";
58
64
  * @throws Dependency mismatch/acquisition errors propagate after owned resource cleanup.
59
65
  */
60
66
  export function* createAgentRuntime(hby, http, clock, options = {}) {
61
- const selected = options.ipexAuxiliary;
62
- if (selected) {
63
- if (options.kram?.enabled !== true) {
64
- throw new ValidationError("IPEX auxiliary runtime requires explicitly enabled KRAM");
65
- }
66
- if (!selected.hab.pre || hby.habs.get(selected.hab.pre) !== selected.hab) {
67
- throw new ValidationError("IPEX auxiliary runtime requires its actual local habitat");
68
- }
69
- }
70
67
  const injectedSignaler = options.signaler ?? options.notifier?.signaler;
71
68
  if ((options.notifier && options.notifier.signator !== hby.signator)
72
69
  || (options.noter && options.notifier && options.noter !== options.notifier.noter)
@@ -101,8 +98,6 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
101
98
  const acdc = options.acdc ?? (!hby.readonly ? (yield* openAcdcRegeryForHabery(hby)) : null);
102
99
  const ownsAcdcRegery = options.acdc === undefined && acdc !== null;
103
100
  const acdcRegery = acdc;
104
- if (selected && !acdc)
105
- throw new ValidationError("IPEX auxiliary runtime requires a v2 registry");
106
101
  // Acquire after stores, before processors/consumers: reverse teardown joins consumers, clears cues, closes stores.
107
102
  const cues = yield* resource(function* (provide) {
108
103
  const owned = new Deck();
@@ -134,25 +129,21 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
134
129
  const kvy = new Kevery(hby.db, { cues: protocolCues, rvy: revery, messagePolicy: options.messagePolicy, kramer });
135
130
  const exc = new Exchanger(hby, { cues: protocolCues, now });
136
131
  const registry = acdc ? new RegistryObserver(hby.db, acdc.store) : null;
137
- const ipexAuxiliary = selected && registry
132
+ // Every runtime with a v2 registry store owns the per-identifier DH and Unblind owners: one dispatch path.
133
+ const ipex = registry
138
134
  ? yield* resource(function* (provide) {
139
- const auxiliary = selected.kind === "dhke"
140
- ? { kind: "dhke", owner: new Dhke({ hab: selected.hab, exc, registryStore: registry.store, rvy: revery, now }) }
141
- : {
142
- kind: "unblind",
143
- owner: new Unblind({ hab: selected.hab, exc, registry, states: selected.states, rvy: revery, now }),
144
- };
135
+ const owners = new IpexAuxiliaries(exc, registry, revery, now, options.kram?.enabled === true);
145
136
  try {
146
- revery.rtr.addRoute(auxiliary.kind === "dhke" ? Dhke.Route : Unblind.Route, auxiliary.owner);
147
- yield* provide(auxiliary);
137
+ owners.registerReplyRoutes(revery.rtr);
138
+ yield* provide(owners);
148
139
  }
149
140
  finally {
150
- auxiliary.owner.close();
141
+ owners.close();
151
142
  }
152
143
  })
153
144
  : null;
154
145
  const replies = new QueryReplies(cues);
155
- const protocol = new ProtocolProcessor(kvy, revery, exc, vdr?.tvy ?? null, vdr?.vry ?? null, registry, protocolCues, cues, replies, ipexAuxiliary?.owner);
146
+ const protocol = new ProtocolProcessor(kvy, revery, exc, vdr?.tvy ?? null, vdr?.vry ?? null, registry, protocolCues, cues, replies, ipex ?? undefined);
156
147
  const reactor = new Reactor(protocol);
157
148
  loadChallengeHandlers(hby.db, exc);
158
149
  loadDelegationHandlers(hby, exc, notifier);
@@ -161,9 +152,12 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
161
152
  loadIpexHandlers(hby, exc, {
162
153
  notifier,
163
154
  registry: acdc?.store ?? null,
155
+ grantWalk: options.grantWalk,
164
156
  });
165
157
  // Construction adopts stored copies an earlier handler-less Exchanger left unescrowed.
166
- const registryRoot = options.registryRoots !== "refuse" && acdc ? new RegistryRoot(hby, acdc, notifier) : null;
158
+ const registryRoot = options.registryRoots !== "refuse" && acdc
159
+ ? new RegistryRoot(hby, acdc, notifier, options.operationStores?.changes ?? (signaler ? signalerChangeSink(signaler) : undefined))
160
+ : null;
167
161
  if (registryRoot)
168
162
  exc.addHandler(registryRoot);
169
163
  const mailboxDirector = yield* resource(function* (provide) {
@@ -202,7 +196,25 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
202
196
  // Copies ride the credential topic; the refuser adds no mailbox topic of its own.
203
197
  if (options.registryRoots === "refuse")
204
198
  exc.addHandler(new RouteRefuser(RegistryRoot.Route));
205
- const mailboxPoller = new MailboxPoller(hby, mailboxDirector, http, clock, {});
199
+ const kelPublisher = new KelPublisher({
200
+ hby,
201
+ http,
202
+ clock,
203
+ changes: signaler ? signalerChangeSink(signaler) : undefined,
204
+ retry: options.kelPublishRetry,
205
+ });
206
+ const mailboxPoller = new MailboxPoller(hby, mailboxDirector, http, clock, {
207
+ onPolled: (pre, mailbox) => kelPublisher.prompt(pre, mailbox),
208
+ onUnauthorized: (pre, mailbox) => kelPublisher.repair(pre, mailbox),
209
+ timeouts: options.mailboxPolling,
210
+ });
211
+ // A mailbox role accepted from a reply (a group member's approved add, an OOBI) is acted on at the next tock.
212
+ revery.onEndRole = (cid, role) => {
213
+ if (role !== Roles.mailbox)
214
+ return;
215
+ kelPublisher.prompt(cid);
216
+ mailboxPoller.prompt(cid);
217
+ };
206
218
  for (const topic of [
207
219
  DELEGATE_MAILBOX_TOPIC,
208
220
  CREDENTIAL_MAILBOX_TOPIC,
@@ -222,6 +234,36 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
222
234
  }
223
235
  });
224
236
  const delegating = new Anchorer(hby, postman, querying, protocol, http, clock);
237
+ // Group receipting reaches TCP-only witnesses as `WitnessReceiptor` does, as KERIpy's Counselor does.
238
+ const groupReceiptor = new Receiptor(hby, protocol, http, clock);
239
+ const counselor = new Counselor(hby, {
240
+ receipt: (pre, options) => groupReceiptor.receipt(pre, { ...options, allowTcp: true }),
241
+ get: (pre, options) => groupReceiptor.get(pre, options),
242
+ }, clock, signaler ? signalerChangeSink(signaler) : undefined, { anchorer: delegating, querying }, {
243
+ rotated: (cue) => {
244
+ kelPublisher.rotated.push(cue);
245
+ owned?.rootReplicator?.prompt(cue.pre);
246
+ },
247
+ }, options.counselorReceiptRetry);
248
+ const owned = acdc && ipex
249
+ ? composeOwners({
250
+ hby,
251
+ acdc,
252
+ exc,
253
+ protocol,
254
+ reactor,
255
+ postman,
256
+ receiptor: new Receiptor(hby, protocol, http, clock),
257
+ ipex,
258
+ clock,
259
+ registryRoot,
260
+ mux,
261
+ counselor,
262
+ retry: options.operationRetry,
263
+ queryResendMs: options.issuanceQueryResendMs,
264
+ changes: signaler ? signalerChangeSink(signaler) : undefined,
265
+ }, options.operationStores)
266
+ : null;
225
267
  const oobiery = new Oobiery(hby, protocol, revery, http, cues);
226
268
  oobiery.registerReplyRoutes(revery.rtr);
227
269
  const authenticator = new Authenticator(hby, http);
@@ -237,7 +279,9 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
237
279
  replies,
238
280
  exc,
239
281
  mux,
240
- ipexAuxiliary,
282
+ ipex,
283
+ operations: owned?.operations ?? null,
284
+ rootReplicator: owned?.rootReplicator ?? null,
241
285
  oobiery,
242
286
  authenticator,
243
287
  mailboxDirector,
@@ -245,6 +289,12 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
245
289
  mailboxPoller,
246
290
  postman,
247
291
  delegating,
292
+ counselor,
293
+ kelPublisher,
294
+ ownerPacing: options.ownerPacing ?? OWNER_PACING,
295
+ publisherPacing: options.publisherPacing ?? KEL_PUBLISHER_PACING,
296
+ protocolPacing: options.protocolPacing ?? PROTOCOL_PACING,
297
+ pollerPacing: options.pollerPacing ?? MAILBOX_POLLER_PACING,
248
298
  querying,
249
299
  replyStreams,
250
300
  vdr,
@@ -262,7 +312,7 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
262
312
  const failures = [];
263
313
  const cleanup = [
264
314
  function* () {
265
- ipexAuxiliary?.owner.close();
315
+ ipex?.close();
266
316
  },
267
317
  function* () {
268
318
  yield* querying.close();
@@ -324,7 +374,7 @@ export function* createAgentRuntime(hby, http, clock, options = {}) {
324
374
  function* openRuntimeNoter(hby) {
325
375
  return yield* resource(function* (provide) {
326
376
  const options = noterOptionsForHabery(hby);
327
- const store = new Noter(options);
377
+ const store = new Noter(hby.opener.create(Noter.Family, options));
328
378
  try {
329
379
  if (!(yield* store.reopen(options)))
330
380
  throw new DatabaseNotOpenError("Failed to open runtime Noter");
@@ -344,7 +394,7 @@ function* openRuntimeNoter(hby) {
344
394
  function* openRuntimeMailboxer(hby) {
345
395
  return yield* resource(function* (provide) {
346
396
  const options = mailboxerOptionsForHabery(hby);
347
- const store = new Mailboxer(options);
397
+ const store = new Mailboxer(hby.opener.create(Mailboxer.Family, options));
348
398
  try {
349
399
  if (!(yield* store.reopen(options)))
350
400
  throw new DatabaseNotOpenError("Failed to open runtime Mailboxer");
@@ -380,13 +430,8 @@ function* openAcdcRegeryForHabery(hby) {
380
430
  */
381
431
  function* openRegerForHabery(hby) {
382
432
  return yield* resource(function* (provide) {
383
- const store = yield* call(() => createReger({
384
- name: hby.name,
385
- base: hby.base,
386
- temp: hby.temp,
387
- headDirPath: hby.headDirPath,
388
- compat: hby.compat,
389
- }));
433
+ const identity = { name: hby.name, base: hby.base, temp: hby.temp };
434
+ const store = yield* openOwner(new Reger(hby.opener.create(Reger.Family, identity)), "Reger", identity);
390
435
  try {
391
436
  yield* provide(store);
392
437
  }
@@ -488,6 +533,7 @@ export function runtimePendingState(runtime) {
488
533
  delegationPending: runtime.hby.db.dpwe.cnt() > 0
489
534
  || runtime.hby.db.dune.cnt() > 0
490
535
  || runtime.hby.db.dpub.cnt() > 0,
536
+ groupPending: runtime.hby.db.gpse.cnt() > 0 || runtime.hby.db.gdee.cnt() > 0 || runtime.hby.db.gpwe.cnt() > 0,
491
537
  queriesPending: runtime.querying.hasPendingWork(),
492
538
  deliveriesPending: runtime.querying.hasPendingDelivery || runtime.postman.hasPending,
493
539
  };
@@ -509,6 +555,9 @@ export function runtimeHasPendingWork(runtime) {
509
555
  }
510
556
  /**
511
557
  * Return true once OOBI acceptance and its ingress/query dependencies settle.
558
+ * This is a whole-runtime drain predicate: any unrelated pending cue, query,
559
+ * delegation or OOBI keeps it false. A command or request that asked for one
560
+ * OOBI must wait with `waitForOobi` (`app/bootstrap/oobi-resolving.ts`) instead.
512
561
  * Background receipt delivery is not remote acknowledgement of OOBI acceptance;
513
562
  * static OOBI servers may refuse unsolicited posts. Runtime close still joins I/O.
514
563
  *
@@ -539,14 +588,10 @@ export function* runAgentRuntimeUntil(runtime, done, options) {
539
588
  if (done())
540
589
  return;
541
590
  const { timeoutMs, ...workerOptions } = options;
542
- const deadline = Date.now() + timeoutMs;
543
591
  const worker = yield* spawn(() => runAgentRuntime(runtime, workerOptions));
544
592
  try {
545
- while (!done()) {
546
- if (Date.now() >= deadline)
547
- throw new Error(`Runtime did not converge within ${timeoutMs}ms.`);
548
- yield* runtimeTurn();
549
- }
593
+ if (!(yield* observeUntil(done, { timeoutMs })))
594
+ throw new Error(`Runtime did not converge within ${timeoutMs}ms.`);
550
595
  }
551
596
  finally {
552
597
  yield* worker.halt();
@@ -575,52 +620,55 @@ export { runtimeTurn } from "./runtime-turn.js";
575
620
  */
576
621
  export function* runAgentRuntime(runtime, options = {}) {
577
622
  runtime.querying.configure({ hab: options.hab });
623
+ const pacing = runtime.protocolPacing;
578
624
  const telReceiptor = runtime.vdr ? new Receiptor(runtime.hby, runtime.protocol, runtime.http, runtime.clock) : null;
579
625
  const tasks = [
580
626
  yield* spawn(() => runtime.querying.deliverDo()),
581
627
  yield* spawn(() => runtime.postman.deliverDo()),
582
628
  ...(runtime.vdr && telReceiptor
583
629
  ? [
584
- yield* spawn(function* () {
585
- while (true) {
586
- yield* publishPendingTel(runtime.hby, runtime.vdr.publication, telReceiptor, runtime.http, runtime.clock);
587
- yield* runtimeTurn();
588
- }
589
- }),
630
+ yield* spawn(() => doEvery(runtime.clock, pacing.tockMs, () => publishPendingTel(runtime.hby, runtime.vdr.publication, telReceiptor, runtime.http, runtime.clock))),
590
631
  ]
591
632
  : []),
592
633
  yield* spawn(function* () {
593
- yield* cueDo(runtime, options);
634
+ yield* cueDo(runtime, options, pacing);
594
635
  }),
595
636
  yield* spawn(function* () {
596
- yield* runtime.protocol.escrowDo();
637
+ yield* runtime.protocol.escrowDo(runtime.clock);
597
638
  }),
598
639
  yield* spawn(function* () {
599
- yield* runtime.oobiery.oobiDo();
640
+ yield* runtime.oobiery.oobiDo(runtime.clock, pacing);
600
641
  }),
601
642
  yield* spawn(function* () {
602
- yield* runtime.authenticator.authDo();
643
+ yield* runtime.authenticator.authDo(runtime.clock, pacing);
603
644
  }),
604
645
  ...(runtime.signaler
605
646
  ? [
606
647
  yield* spawn(function* () {
607
- yield* runtime.signaler.signalDo();
648
+ yield* runtime.signaler.signalDo(runtime.clock, pacing);
608
649
  }),
609
650
  ]
610
651
  : []),
611
652
  ...(options.pollMailbox ?? true
612
653
  ? [
613
654
  yield* spawn(function* () {
614
- yield* runtime.mailboxPoller.pollDo((batch) => settleMailboxPollBatch(runtime, batch));
655
+ yield* runtime.mailboxPoller.pollDo((batch) => settleMailboxPollBatch(runtime, batch), runtime.pollerPacing);
615
656
  }),
616
657
  ]
617
658
  : []),
618
- yield* spawn(function* () {
619
- while (true) {
620
- yield* runtime.delegating.processAllOnce();
621
- yield* runtimeTurn();
622
- }
623
- }),
659
+ yield* spawn(() => doEvery(runtime.clock, pacing.tockMs, () => runtime.delegating.processAllOnce())),
660
+ yield* spawn(() => doEvery(runtime.clock, pacing.tockMs, () => runtime.counselor.processOnce())),
661
+ yield* spawn(() => kelPublisherDo(runtime.kelPublisher, runtime.clock, runtime.publisherPacing)),
662
+ ...(runtime.operations && runtime.ipex
663
+ ? [
664
+ yield* spawn(() => operationOwnersDo({
665
+ operations: runtime.operations,
666
+ rootReplicator: runtime.rootReplicator,
667
+ ipex: runtime.ipex,
668
+ clock: runtime.clock,
669
+ }, runtime.ownerPacing)),
670
+ ]
671
+ : []),
624
672
  ];
625
673
  try {
626
674
  return yield* suspend();
@@ -1,4 +1,4 @@
1
- import { runtimeTurn } from "./runtime-turn.js";
1
+ import { doEvery, PROTOCOL_PACING } from "./doing.js";
2
2
  /**
3
3
  * Use an explicitly selected or sole local habitat; never guess among hosted identities.
4
4
  *
@@ -53,9 +53,6 @@ export function* processCuesOnce(runtime, { hab, queryCues } = {}) {
53
53
  * @param runtime Borrowed composed runtime containing the actual cue consumers.
54
54
  * @param options Explicit signer and optional command-owned query cue destination.
55
55
  */
56
- export function* cueDo(runtime, options = {}) {
57
- while (true) {
58
- yield* processCuesOnce(runtime, options);
59
- yield* runtimeTurn();
60
- }
56
+ export function* cueDo(runtime, options = {}, pacing = PROTOCOL_PACING) {
57
+ return yield* doEvery(runtime.clock, pacing.tockMs, () => processCuesOnce(runtime, options));
61
58
  }
@@ -0,0 +1,87 @@
1
+ import { DEFAULT_RETRY_POLICY, RetryBackoff } from "./retry-backoff.js";
2
+ /** Flatten an error and its `cause` chain to one line of text, so a reader sees the transport's own reason. */
3
+ export function describeFailure(error) {
4
+ const parts = [];
5
+ for (let e = error, depth = 0; e !== undefined && e !== null && depth < 8; depth++) {
6
+ parts.push(e instanceof Error ? (e.message || e.name) : String(e));
7
+ e = e instanceof Error ? e.cause : undefined;
8
+ }
9
+ return parts.join(" <- ");
10
+ }
11
+ /** The queue and its retry state for one live operation. */
12
+ export class DeliveryOutbox {
13
+ constructor(policy = DEFAULT_RETRY_POLICY) {
14
+ Object.defineProperty(this, "queue", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: []
19
+ });
20
+ Object.defineProperty(this, "backoff", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: void 0
25
+ });
26
+ /** Destinations the transport reported for everything delivered so far. */
27
+ Object.defineProperty(this, "delivered", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: []
32
+ });
33
+ this.backoff = new RetryBackoff(policy);
34
+ }
35
+ /** Messages still waiting. */
36
+ get length() {
37
+ return this.queue.length;
38
+ }
39
+ /** Consecutive delivery failures of the head message. */
40
+ get attempts() {
41
+ return this.backoff.attempts;
42
+ }
43
+ /** The latest delivery error, or null. */
44
+ get lastError() {
45
+ return this.backoff.last;
46
+ }
47
+ /** The retry state of the head message, or null while nothing is failing. */
48
+ get failure() {
49
+ return this.backoff.attempts === 0
50
+ ? null
51
+ : {
52
+ attempts: this.backoff.attempts,
53
+ reason: describeFailure(this.backoff.last),
54
+ retryAt: new Date(this.backoff.next).toISOString(),
55
+ };
56
+ }
57
+ /** Queue a message behind the others. */
58
+ enqueue(message) {
59
+ this.queue.push(message);
60
+ }
61
+ /**
62
+ * Deliver the queued messages in order. A failure keeps the message and schedules a retry; it throws only when
63
+ * `boundMs` is given and failures have lasted that long.
64
+ *
65
+ * @returns True when the queue is empty, false while a message waits for its retry.
66
+ */
67
+ *drain(transport, clock, boundMs) {
68
+ while (this.queue.length) {
69
+ const now = clock.now();
70
+ if (!this.backoff.due(now))
71
+ return false;
72
+ try {
73
+ const { src, dest, msg, topic } = this.queue[0];
74
+ this.delivered.push(...yield* transport.deliver({ src, dest, msg: typeof msg === "function" ? msg() : msg, topic }));
75
+ this.queue.shift();
76
+ this.backoff.succeeded();
77
+ }
78
+ catch (error) {
79
+ this.backoff.failed(now, error);
80
+ if (boundMs !== undefined && this.backoff.exhausted(now, boundMs))
81
+ throw error;
82
+ return false;
83
+ }
84
+ }
85
+ return true;
86
+ }
87
+ }
@@ -0,0 +1,17 @@
1
+ import { waitOnClock } from "./workflow-contract.js";
2
+ /** Milliseconds between passes of the protocol-facing background loops: KERIpy's Doist cycle, as the escrow loop uses. */
3
+ export const PROTOCOL_TOCK_MS = 31.25;
4
+ /** Tocks between full sweeps of a loop that has one: 1920 tocks of 31.25 ms is a minute. */
5
+ export const PROTOCOL_SWEEP_TOCKS = 1920;
6
+ /** The production pacing of the protocol-facing background loops. */
7
+ export const PROTOCOL_PACING = Object.freeze({
8
+ tockMs: PROTOCOL_TOCK_MS,
9
+ sweepTocks: PROTOCOL_SWEEP_TOCKS,
10
+ });
11
+ /** Run `pass` forever: pass 0, wait `tockMs` on `clock`, pass 1, and so on. A thrown error ends the doer. */
12
+ export function* doEvery(clock, tockMs, pass) {
13
+ for (let tock = 0;; tock++) {
14
+ yield* pass(tock);
15
+ yield* waitOnClock(clock, tockMs);
16
+ }
17
+ }