keri-ts 0.11.0 → 2.0.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.
- package/README.md +32 -2
- package/esm/keri/npm/src/_dnt.polyfills.js +36 -0
- package/esm/keri/npm/src/acdc/chaining.js +213 -0
- package/esm/keri/npm/src/acdc/dhking.js +716 -0
- package/esm/keri/npm/src/acdc/messaging.js +2 -0
- package/esm/keri/npm/src/acdc/observing.js +47 -40
- package/esm/keri/npm/src/acdc/regbasing.js +22 -22
- package/esm/keri/npm/src/acdc/regengine.js +88 -119
- package/esm/keri/npm/src/acdc/regeventing.js +163 -44
- package/esm/keri/npm/src/acdc/registering.js +99 -23
- package/esm/keri/npm/src/acdc/registraring.js +82 -46
- package/esm/keri/npm/src/acdc/relating.js +59 -0
- package/esm/keri/npm/src/acdc/salting.js +720 -0
- package/esm/keri/npm/src/acdc/scheming.js +103 -105
- package/esm/keri/npm/src/acdc/unblinding.js +1042 -0
- package/esm/keri/npm/src/app/{authenticating.js → bootstrap/authenticating.js} +40 -39
- package/esm/keri/npm/src/app/bootstrap/bootstrapping.js +109 -0
- package/esm/keri/npm/src/app/bootstrap/oobi-replies.js +113 -0
- package/esm/keri/npm/src/app/{oobiery.js → bootstrap/oobiery.js} +211 -267
- package/esm/keri/npm/src/app/credentials/credential-importing.js +201 -0
- package/esm/keri/npm/src/app/credentials/credential-proposals.js +120 -0
- package/esm/keri/npm/src/app/credentials/credential-revoking.js +165 -0
- package/esm/keri/npm/src/app/credentials/credential-workflows.js +365 -0
- package/esm/keri/npm/src/app/credentials/tel-publishing.js +27 -0
- package/esm/keri/npm/src/app/{verifying.js → credentials/verifying.js} +50 -45
- package/esm/keri/npm/src/app/delivery/forwarding.js +600 -0
- package/esm/keri/npm/src/app/delivery/introducing.js +68 -0
- package/esm/keri/npm/src/app/delivery/reply-streams.js +230 -0
- package/esm/keri/npm/src/app/delivery/respondant.js +159 -0
- package/esm/keri/npm/src/app/delivery/stored-replies.js +53 -0
- package/esm/keri/npm/src/app/exchanges/essr.js +111 -0
- package/esm/keri/npm/src/app/exchanges/exchange-messaging.js +66 -0
- package/esm/keri/npm/src/app/exchanges/exchanging.js +1354 -0
- package/esm/keri/npm/src/app/{challenging.js → identity/challenging.js} +13 -8
- package/esm/keri/npm/src/app/{configing.js → identity/configing.js} +4 -4
- package/esm/keri/npm/src/app/{delegating.js → identity/delegating.js} +118 -40
- package/esm/keri/npm/src/app/{endpoint-roleing.js → identity/endpoint-roleing.js} +43 -39
- package/esm/keri/npm/src/app/{habbing.js → identity/habbing.js} +258 -226
- package/esm/keri/npm/src/app/{keeping.js → identity/keeping.js} +60 -56
- package/esm/keri/npm/src/app/{organizing.js → identity/organizing.js} +47 -21
- package/esm/keri/npm/src/app/{ipex-building.js → ipex/ipex-building.js} +53 -55
- package/esm/keri/npm/src/app/ipex/ipex-credentialing.js +359 -0
- package/esm/keri/npm/src/app/{ipex-graph.js → ipex/ipex-graph.js} +70 -124
- package/esm/keri/npm/src/app/ipex/ipex-grouping.js +664 -0
- package/esm/keri/npm/src/app/ipex/ipex-node-authentication.js +185 -0
- package/esm/keri/npm/src/app/ipex/ipex-v2.js +692 -0
- package/esm/keri/npm/src/app/{ipexing.js → ipex/ipexing.js} +59 -10
- package/esm/keri/npm/src/app/mailbox/forward-handler.js +228 -0
- package/esm/keri/npm/src/app/{mailbox-director.js → mailbox/mailbox-director.js} +146 -139
- package/esm/keri/npm/src/app/mailbox/mailbox-poller.js +305 -0
- package/esm/keri/npm/src/app/mailbox/mailbox-sse.js +254 -0
- package/esm/keri/npm/src/app/{mailboxing.js → mailbox/mailboxing.js} +117 -70
- package/esm/keri/npm/src/app/mailbox/topic-routing.js +54 -0
- package/esm/keri/npm/src/app/multisig/group-members.js +173 -0
- package/esm/keri/npm/src/app/multisig/grouping.js +932 -0
- package/esm/keri/npm/src/app/multisig/multisig-messaging.js +164 -0
- package/esm/keri/npm/src/app/multisig/multisig-workflows.js +821 -0
- package/esm/keri/npm/src/app/{notifying.js → notifications/notifying.js} +23 -50
- package/esm/keri/npm/src/app/notifications/signaling.js +177 -0
- package/esm/keri/npm/src/app/{parsering.js → protocol/parsering.js} +123 -53
- package/esm/keri/npm/src/app/protocol/protocol-processing.js +245 -0
- package/esm/keri/npm/src/app/protocol/reactor.js +55 -0
- package/esm/keri/npm/src/app/queries/query-replies.js +151 -0
- package/esm/keri/npm/src/app/queries/querying.js +306 -0
- package/esm/keri/npm/src/app/queries/witness-inquisitor.js +415 -0
- package/esm/keri/npm/src/app/runtime/abortable.js +103 -0
- package/esm/keri/npm/src/app/runtime/agent-runtime.js +633 -0
- package/esm/keri/npm/src/app/runtime/cue-runtime.js +61 -0
- package/esm/keri/npm/src/app/runtime/runtime-clock.js +6 -0
- package/esm/keri/npm/src/app/{byte-source.js → transport/byte-source.js} +43 -21
- package/esm/keri/npm/src/app/transport/cesr-egress.js +317 -0
- package/esm/keri/npm/src/app/{cesr-http.js → transport/cesr-http.js} +28 -78
- package/esm/keri/npm/src/app/transport/http-client.js +172 -0
- package/esm/keri/npm/src/app/transport/http-messenger.js +52 -0
- package/esm/keri/npm/src/app/transport/http-stream-messenger.js +60 -0
- package/esm/keri/npm/src/app/transport/httping.js +57 -0
- package/esm/keri/npm/src/app/transport/message-source.js +77 -0
- package/esm/keri/npm/src/app/transport/messengering.js +68 -0
- package/esm/keri/npm/src/app/{socket-source.js → transport/socket-source.js} +41 -5
- package/esm/keri/npm/src/app/transport/tcp-egress.js +377 -0
- package/esm/keri/npm/src/app/transport/tcp-messenger.js +162 -0
- package/esm/keri/npm/src/app/transport/tcp-stream-messenger.js +40 -0
- package/esm/keri/npm/src/app/transport/transport-error.js +14 -0
- package/esm/keri/npm/src/app/witness/http-endpoints.js +185 -0
- package/esm/keri/npm/src/app/witness/ingress.js +148 -0
- package/esm/keri/npm/src/app/witness/receipt-client.js +248 -0
- package/esm/keri/npm/src/app/witness/receipt-messages.js +29 -0
- package/esm/keri/npm/src/app/witness/receipting.js +323 -0
- package/esm/keri/npm/src/app/witness/registration.js +50 -0
- package/esm/keri/npm/src/cli/common/bootstrap.js +12 -0
- package/esm/keri/npm/src/{app/cli → cli}/common/context.js +47 -9
- package/esm/keri/npm/src/{app/cli → cli}/common/existing.js +9 -29
- package/esm/keri/npm/src/cli/common/parsing.js +279 -0
- package/esm/keri/npm/src/cli/common/passcode.js +66 -0
- package/esm/keri/npm/src/cli/common/tel-completion.js +24 -0
- package/esm/keri/npm/src/{app/cli → cli}/common/witness-auth.js +2 -2
- package/esm/keri/npm/src/cli/credentials/ipex.js +702 -0
- package/esm/keri/npm/src/cli/credentials/vc.js +399 -0
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/did.js +71 -53
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/ends.js +34 -31
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/loc.js +22 -20
- package/esm/keri/npm/src/cli/endpoints/oobi-clean.js +134 -0
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/oobi.js +37 -36
- package/esm/keri/npm/src/{app/cli → cli/identity}/aid.js +8 -7
- package/esm/keri/npm/src/cli/identity/challenge.js +181 -0
- package/esm/keri/npm/src/{app/cli → cli/identity}/delegate.js +88 -73
- package/esm/keri/npm/src/{app/cli → cli/identity}/export.js +9 -8
- package/esm/keri/npm/src/cli/identity/incept.js +181 -0
- package/esm/keri/npm/src/cli/identity/init.js +153 -0
- package/esm/keri/npm/src/cli/identity/interact.js +84 -0
- package/esm/keri/npm/src/{app/cli → cli/identity}/list.js +7 -6
- package/esm/keri/npm/src/cli/identity/rotate.js +172 -0
- package/esm/keri/npm/src/cli/index.js +38 -0
- package/esm/keri/npm/src/{app/cli → cli/messaging}/exchange.js +24 -24
- package/esm/keri/npm/src/cli/messaging/multisig.js +569 -0
- package/esm/keri/npm/src/{app/cli → cli/messaging}/notifications.js +26 -22
- package/esm/keri/npm/src/{app/cli → cli}/output.js +1 -1
- package/esm/keri/npm/src/cli/tools/annotate.js +25 -0
- package/esm/keri/npm/src/{app/cli → cli/tools}/benchmark.js +18 -9
- package/esm/keri/npm/src/{app/cli → cli/tools}/db-dump.js +14 -27
- package/esm/keri/npm/src/{app/cli → cli/tools}/saidify.js +3 -2
- package/esm/keri/npm/src/{app/cli → cli/tools}/sign.js +16 -10
- package/esm/keri/npm/src/{app/cli → cli/tools}/verify.js +10 -10
- package/esm/keri/npm/src/core/attachment-countering.js +31 -1
- package/esm/keri/npm/src/core/deck.js +5 -44
- package/esm/keri/npm/src/core/dispatch.js +10 -2
- package/esm/keri/npm/src/core/errors.js +5 -10
- package/esm/keri/npm/src/core/{exchange-proofing.js → exchange/exchange-proofing.js} +32 -2
- package/esm/keri/npm/src/core/{protocol-exchanging.js → exchange/protocol-exchanging.js} +47 -4
- package/esm/keri/npm/src/core/genus-framing.js +44 -0
- package/esm/keri/npm/src/core/{eventing.js → kel/eventing.js} +209 -390
- package/esm/keri/npm/src/core/kel/kever-decisions.js +70 -0
- package/esm/keri/npm/src/core/{kever.js → kel/kever.js} +84 -167
- package/esm/keri/npm/src/core/logger.js +3 -3
- package/esm/keri/npm/src/core/{kram-policy.js → mailbox/kram-policy.js} +14 -4
- package/esm/keri/npm/src/core/{kram-pruning.js → mailbox/kram-pruning.js} +5 -15
- package/esm/keri/npm/src/core/{kram-signatures.js → mailbox/kram-signatures.js} +1 -1
- package/esm/keri/npm/src/core/mailbox/kram-staging.js +149 -0
- package/esm/keri/npm/src/core/{kram-time.js → mailbox/kram-time.js} +9 -15
- package/esm/keri/npm/src/core/mailbox/kraming.js +78 -0
- package/esm/keri/npm/src/core/protocol-eventing.js +6 -1
- package/esm/keri/npm/src/core/protocol-serialization.js +9 -34
- package/esm/keri/npm/src/core/protocol-vdr-eventing.js +10 -11
- package/esm/keri/npm/src/core/records.js +0 -19
- package/esm/keri/npm/src/core/routing.js +187 -199
- package/esm/keri/npm/src/db/baser-defaults.js +11 -0
- package/esm/keri/npm/src/db/basing.js +224 -401
- package/esm/keri/npm/src/db/core/keys.js +2 -2
- package/esm/keri/npm/src/db/core/lmdber.js +123 -149
- package/esm/keri/npm/src/db/core/path-manager.js +2 -4
- package/esm/keri/npm/src/db/escrowing.js +82 -200
- package/esm/keri/npm/src/db/exchange/exchange-nests.js +54 -0
- package/esm/keri/npm/src/db/exchange/exchange-records.js +7 -0
- package/esm/keri/npm/src/db/index.js +5 -6
- package/esm/keri/npm/src/db/keeping.js +123 -6
- package/esm/keri/npm/src/db/{kram-factors.js → mailbox/kram-factors.js} +17 -50
- package/esm/keri/npm/src/db/{mailboxing.js → mailbox/mailboxing.js} +5 -8
- package/esm/keri/npm/src/db/reger.js +48 -69
- package/esm/keri/npm/src/db/{kel-replay.js → replay/kel-replay.js} +12 -24
- package/esm/keri/npm/src/db/{tel-replay.js → replay/tel-replay.js} +38 -36
- package/esm/keri/npm/src/db/{witness-replay.js → replay/witness-replay.js} +8 -14
- package/esm/keri/npm/src/db/subing.js +2 -11
- package/esm/keri/npm/src/did/keri/resolving.js +4 -18
- package/esm/keri/npm/src/did/webs/artifacts.js +21 -24
- package/esm/keri/npm/src/did/webs/designated-aliases.js +18 -48
- package/esm/keri/npm/src/did/webs/documenting.js +8 -8
- package/esm/keri/npm/src/did/webs/resolving.js +73 -74
- package/esm/keri/npm/src/library/index.js +1 -1
- package/esm/keri/npm/src/npm/cli.js +1 -1
- package/esm/keri/npm/src/npm/index.js +1 -1
- package/esm/keri/npm/src/runtime/index.js +105 -74
- package/esm/keri/npm/src/vdr/backer-state.js +55 -0
- package/esm/keri/npm/src/vdr/credential-tsn-record.js +59 -0
- package/esm/keri/npm/src/vdr/credentialing.js +84 -109
- package/esm/keri/npm/src/vdr/eventing.js +633 -251
- package/esm/keri/npm/src/vdr/registry-tsn-record.js +55 -0
- package/esm/keri/npm/src/vdr/revoking.js +90 -0
- package/esm/keri/npm/src/vdr/tel-anchor.js +29 -0
- package/esm/keri/npm/src/vdr/tel-publication.js +178 -0
- package/esm/keri/npm/src/vdr/tsn-query.js +15 -10
- package/esm/keri/npm/src/{app/version.js → version.js} +2 -2
- package/package.json +7 -21
- package/types/_dnt.polyfills.d.ts +55 -0
- package/types/_dnt.polyfills.d.ts.map +1 -1
- package/types/acdc/chaining.d.ts +35 -0
- package/types/acdc/chaining.d.ts.map +1 -0
- package/types/acdc/dhking.d.ts +136 -0
- package/types/acdc/dhking.d.ts.map +1 -0
- package/types/acdc/messaging.d.ts.map +1 -1
- package/types/acdc/observing.d.ts +19 -15
- package/types/acdc/observing.d.ts.map +1 -1
- package/types/acdc/regbasing.d.ts +8 -9
- package/types/acdc/regbasing.d.ts.map +1 -1
- package/types/acdc/regengine.d.ts +14 -28
- package/types/acdc/regengine.d.ts.map +1 -1
- package/types/acdc/regeventing.d.ts +24 -7
- package/types/acdc/regeventing.d.ts.map +1 -1
- package/types/acdc/registering.d.ts +27 -11
- package/types/acdc/registering.d.ts.map +1 -1
- package/types/acdc/registraring.d.ts +22 -22
- package/types/acdc/registraring.d.ts.map +1 -1
- package/types/acdc/relating.d.ts +21 -0
- package/types/acdc/relating.d.ts.map +1 -0
- package/types/acdc/salting.d.ts +241 -0
- package/types/acdc/salting.d.ts.map +1 -0
- package/types/acdc/scheming.d.ts +3 -2
- package/types/acdc/scheming.d.ts.map +1 -1
- package/types/acdc/unblinding.d.ts +150 -0
- package/types/acdc/unblinding.d.ts.map +1 -0
- package/types/app/bootstrap/authenticating.d.ts +54 -0
- package/types/app/bootstrap/authenticating.d.ts.map +1 -0
- package/types/app/bootstrap/bootstrapping.d.ts +45 -0
- package/types/app/bootstrap/bootstrapping.d.ts.map +1 -0
- package/types/app/bootstrap/oobi-replies.d.ts +8 -0
- package/types/app/bootstrap/oobi-replies.d.ts.map +1 -0
- package/types/app/{oobiery.d.ts → bootstrap/oobiery.d.ts} +98 -27
- package/types/app/bootstrap/oobiery.d.ts.map +1 -0
- package/types/app/credentials/credential-importing.d.ts +29 -0
- package/types/app/credentials/credential-importing.d.ts.map +1 -0
- package/types/app/credentials/credential-proposals.d.ts +27 -0
- package/types/app/credentials/credential-proposals.d.ts.map +1 -0
- package/types/app/credentials/credential-revoking.d.ts +44 -0
- package/types/app/credentials/credential-revoking.d.ts.map +1 -0
- package/types/app/credentials/credential-workflows.d.ts +149 -0
- package/types/app/credentials/credential-workflows.d.ts.map +1 -0
- package/types/app/{schema-resolving.d.ts → credentials/schema-resolving.d.ts} +2 -2
- package/types/app/credentials/schema-resolving.d.ts.map +1 -0
- package/types/app/credentials/tel-publishing.d.ts +16 -0
- package/types/app/credentials/tel-publishing.d.ts.map +1 -0
- package/types/app/{verifying.d.ts → credentials/verifying.d.ts} +20 -9
- package/types/app/credentials/verifying.d.ts.map +1 -0
- package/types/app/delivery/forwarding.d.ts +227 -0
- package/types/app/delivery/forwarding.d.ts.map +1 -0
- package/types/app/delivery/introducing.d.ts +21 -0
- package/types/app/delivery/introducing.d.ts.map +1 -0
- package/types/app/delivery/reply-streams.d.ts +49 -0
- package/types/app/delivery/reply-streams.d.ts.map +1 -0
- package/types/app/delivery/respondant.d.ts +52 -0
- package/types/app/delivery/respondant.d.ts.map +1 -0
- package/types/app/delivery/stored-replies.d.ts +11 -0
- package/types/app/delivery/stored-replies.d.ts.map +1 -0
- package/types/app/exchanges/essr.d.ts +53 -0
- package/types/app/exchanges/essr.d.ts.map +1 -0
- package/types/app/exchanges/exchange-messaging.d.ts +73 -0
- package/types/app/exchanges/exchange-messaging.d.ts.map +1 -0
- package/types/app/exchanges/exchanging.d.ts +379 -0
- package/types/app/exchanges/exchanging.d.ts.map +1 -0
- package/types/app/{challenging.d.ts → identity/challenging.d.ts} +9 -3
- package/types/app/identity/challenging.d.ts.map +1 -0
- package/types/app/{configing.d.ts → identity/configing.d.ts} +1 -1
- package/types/app/identity/configing.d.ts.map +1 -0
- package/types/app/{delegating.d.ts → identity/delegating.d.ts} +59 -17
- package/types/app/identity/delegating.d.ts.map +1 -0
- package/types/app/identity/endpoint-roleing.d.ts +54 -0
- package/types/app/identity/endpoint-roleing.d.ts.map +1 -0
- package/types/app/{habbing.d.ts → identity/habbing.d.ts} +86 -54
- package/types/app/identity/habbing.d.ts.map +1 -0
- package/types/app/{keeping.d.ts → identity/keeping.d.ts} +19 -5
- package/types/app/identity/keeping.d.ts.map +1 -0
- package/types/app/{organizing.d.ts → identity/organizing.d.ts} +19 -4
- package/types/app/identity/organizing.d.ts.map +1 -0
- package/types/app/{ipex-building.d.ts → ipex/ipex-building.d.ts} +5 -5
- package/types/app/ipex/ipex-building.d.ts.map +1 -0
- package/types/app/{ipex-credentialing.d.ts → ipex/ipex-credentialing.d.ts} +42 -10
- package/types/app/ipex/ipex-credentialing.d.ts.map +1 -0
- package/types/app/ipex/ipex-graph.d.ts +28 -0
- package/types/app/ipex/ipex-graph.d.ts.map +1 -0
- package/types/app/ipex/ipex-grouping.d.ts +112 -0
- package/types/app/ipex/ipex-grouping.d.ts.map +1 -0
- package/types/app/ipex/ipex-node-authentication.d.ts +32 -0
- package/types/app/ipex/ipex-node-authentication.d.ts.map +1 -0
- package/types/app/ipex/ipex-v2.d.ts +71 -0
- package/types/app/ipex/ipex-v2.d.ts.map +1 -0
- package/types/app/{ipexing.d.ts → ipex/ipexing.d.ts} +21 -8
- package/types/app/ipex/ipexing.d.ts.map +1 -0
- package/types/app/mailbox/forward-handler.d.ts +68 -0
- package/types/app/mailbox/forward-handler.d.ts.map +1 -0
- package/types/app/mailbox/mailbox-director.d.ts +252 -0
- package/types/app/mailbox/mailbox-director.d.ts.map +1 -0
- package/types/app/mailbox/mailbox-poller.d.ts +149 -0
- package/types/app/mailbox/mailbox-poller.d.ts.map +1 -0
- package/types/app/mailbox/mailbox-sse.d.ts +63 -0
- package/types/app/mailbox/mailbox-sse.d.ts.map +1 -0
- package/types/app/{mailboxing.d.ts → mailbox/mailboxing.d.ts} +92 -43
- package/types/app/mailbox/mailboxing.d.ts.map +1 -0
- package/types/app/mailbox/topic-routing.d.ts +18 -0
- package/types/app/mailbox/topic-routing.d.ts.map +1 -0
- package/types/app/multisig/group-members.d.ts +60 -0
- package/types/app/multisig/group-members.d.ts.map +1 -0
- package/types/app/multisig/grouping.d.ts +317 -0
- package/types/app/multisig/grouping.d.ts.map +1 -0
- package/types/app/multisig/multisig-messaging.d.ts +97 -0
- package/types/app/multisig/multisig-messaging.d.ts.map +1 -0
- package/types/app/multisig/multisig-workflows.d.ts +85 -0
- package/types/app/multisig/multisig-workflows.d.ts.map +1 -0
- package/types/app/{notifying.d.ts → notifications/notifying.d.ts} +5 -6
- package/types/app/notifications/notifying.d.ts.map +1 -0
- package/types/app/notifications/signaling.d.ts +68 -0
- package/types/app/notifications/signaling.d.ts.map +1 -0
- package/types/app/protocol/parsering.d.ts +128 -0
- package/types/app/protocol/parsering.d.ts.map +1 -0
- package/types/app/{protocol-host-policy.d.ts → protocol/protocol-host-policy.d.ts} +1 -10
- package/types/app/protocol/protocol-host-policy.d.ts.map +1 -0
- package/types/app/protocol/protocol-processing.d.ts +140 -0
- package/types/app/protocol/protocol-processing.d.ts.map +1 -0
- package/types/app/protocol/reactor.d.ts +43 -0
- package/types/app/protocol/reactor.d.ts.map +1 -0
- package/types/app/queries/query-replies.d.ts +78 -0
- package/types/app/queries/query-replies.d.ts.map +1 -0
- package/types/app/queries/querying.d.ts +155 -0
- package/types/app/queries/querying.d.ts.map +1 -0
- package/types/app/queries/witness-inquisitor.d.ts +150 -0
- package/types/app/queries/witness-inquisitor.d.ts.map +1 -0
- package/types/app/runtime/abortable.d.ts +39 -0
- package/types/app/runtime/abortable.d.ts.map +1 -0
- package/types/app/runtime/agent-runtime.d.ts +348 -0
- package/types/app/runtime/agent-runtime.d.ts.map +1 -0
- package/types/app/runtime/cue-runtime.d.ts +33 -0
- package/types/app/runtime/cue-runtime.d.ts.map +1 -0
- package/types/app/runtime/runtime-clock.d.ts +28 -0
- package/types/app/runtime/runtime-clock.d.ts.map +1 -0
- package/types/app/runtime/runtime-turn.d.ts.map +1 -0
- package/types/app/transport/byte-source.d.ts +41 -0
- package/types/app/transport/byte-source.d.ts.map +1 -0
- package/types/app/transport/cesr-egress.d.ts +117 -0
- package/types/app/transport/cesr-egress.d.ts.map +1 -0
- package/types/app/{cesr-http.d.ts → transport/cesr-http.d.ts} +9 -33
- package/types/app/transport/cesr-http.d.ts.map +1 -0
- package/types/app/transport/http-client.d.ts +99 -0
- package/types/app/transport/http-client.d.ts.map +1 -0
- package/types/app/transport/http-messenger.d.ts +37 -0
- package/types/app/transport/http-messenger.d.ts.map +1 -0
- package/types/app/transport/http-stream-messenger.d.ts +30 -0
- package/types/app/transport/http-stream-messenger.d.ts.map +1 -0
- package/types/app/transport/httping.d.ts +19 -0
- package/types/app/transport/httping.d.ts.map +1 -0
- package/types/app/transport/message-source.d.ts +22 -0
- package/types/app/transport/message-source.d.ts.map +1 -0
- package/types/app/transport/messengering.d.ts +41 -0
- package/types/app/transport/messengering.d.ts.map +1 -0
- package/types/app/{socket-source.d.ts → transport/socket-source.d.ts} +10 -3
- package/types/app/transport/socket-source.d.ts.map +1 -0
- package/types/app/transport/tcp-egress.d.ts +118 -0
- package/types/app/transport/tcp-egress.d.ts.map +1 -0
- package/types/app/transport/tcp-messenger.d.ts +69 -0
- package/types/app/transport/tcp-messenger.d.ts.map +1 -0
- package/types/app/transport/tcp-stream-messenger.d.ts +25 -0
- package/types/app/transport/tcp-stream-messenger.d.ts.map +1 -0
- package/types/app/transport/transport-error.d.ts +12 -0
- package/types/app/transport/transport-error.d.ts.map +1 -0
- package/types/app/witness/http-endpoints.d.ts +77 -0
- package/types/app/witness/http-endpoints.d.ts.map +1 -0
- package/types/app/witness/ingress.d.ts +65 -0
- package/types/app/witness/ingress.d.ts.map +1 -0
- package/types/app/witness/receipt-client.d.ts +82 -0
- package/types/app/witness/receipt-client.d.ts.map +1 -0
- package/types/app/witness/receipt-messages.d.ts +21 -0
- package/types/app/witness/receipt-messages.d.ts.map +1 -0
- package/types/app/witness/receipting.d.ts +117 -0
- package/types/app/witness/receipting.d.ts.map +1 -0
- package/types/app/witness/registration.d.ts +27 -0
- package/types/app/witness/registration.d.ts.map +1 -0
- package/types/cli/common/bootstrap.d.ts +5 -0
- package/types/cli/common/bootstrap.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/context.d.ts +10 -9
- package/types/cli/common/context.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/existing.d.ts +2 -8
- package/types/cli/common/existing.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/parsing.d.ts +26 -15
- package/types/cli/common/parsing.d.ts.map +1 -0
- package/types/cli/common/passcode.d.ts +9 -0
- package/types/cli/common/passcode.d.ts.map +1 -0
- package/types/cli/common/rendering.d.ts.map +1 -0
- package/types/cli/common/tel-completion.d.ts +8 -0
- package/types/cli/common/tel-completion.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/witness-auth.d.ts +1 -1
- package/types/cli/common/witness-auth.d.ts.map +1 -0
- package/types/cli/credentials/ipex.d.ts +110 -0
- package/types/cli/credentials/ipex.d.ts.map +1 -0
- package/types/cli/credentials/vc.d.ts +42 -0
- package/types/cli/credentials/vc.d.ts.map +1 -0
- package/types/{app/cli → cli/endpoints}/did.d.ts +5 -1
- package/types/cli/endpoints/did.d.ts.map +1 -0
- package/types/{app/cli → cli/endpoints}/ends.d.ts +9 -1
- package/types/cli/endpoints/ends.d.ts.map +1 -0
- package/types/cli/endpoints/loc.d.ts.map +1 -0
- package/types/cli/endpoints/oobi-clean.d.ts +8 -0
- package/types/cli/endpoints/oobi-clean.d.ts.map +1 -0
- package/types/{app/cli → cli/endpoints}/oobi.d.ts +3 -1
- package/types/cli/endpoints/oobi.d.ts.map +1 -0
- package/types/cli/identity/aid.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/challenge.d.ts +5 -1
- package/types/cli/identity/challenge.d.ts.map +1 -0
- package/types/cli/identity/delegate.d.ts +4 -0
- package/types/cli/identity/delegate.d.ts.map +1 -0
- package/types/cli/identity/export.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/incept.d.ts +2 -0
- package/types/cli/identity/incept.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/init.d.ts +2 -0
- package/types/cli/identity/init.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/interact.d.ts +2 -0
- package/types/cli/identity/interact.d.ts.map +1 -0
- package/types/cli/identity/list.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/rotate.d.ts +9 -2
- package/types/cli/identity/rotate.d.ts.map +1 -0
- package/types/cli/index.d.ts +39 -0
- package/types/cli/index.d.ts.map +1 -0
- package/types/{app/cli → cli/messaging}/exchange.d.ts +3 -1
- package/types/cli/messaging/exchange.d.ts.map +1 -0
- package/types/cli/messaging/multisig.d.ts +29 -0
- package/types/cli/messaging/multisig.d.ts.map +1 -0
- package/types/cli/messaging/notifications.d.ts.map +1 -0
- package/types/cli/output.d.ts.map +1 -0
- package/types/cli/tools/annotate-color.d.ts.map +1 -0
- package/types/cli/tools/annotate.d.ts.map +1 -0
- package/types/cli/tools/benchmark.d.ts.map +1 -0
- package/types/{app/cli → cli/tools}/db-dump.d.ts +0 -2
- package/types/cli/tools/db-dump.d.ts.map +1 -0
- package/types/cli/tools/saidify.d.ts.map +1 -0
- package/types/{app/cli → cli/tools}/sign.d.ts +2 -0
- package/types/cli/tools/sign.d.ts.map +1 -0
- package/types/cli/tools/verify.d.ts.map +1 -0
- package/types/core/attachment-countering.d.ts +10 -1
- package/types/core/attachment-countering.d.ts.map +1 -1
- package/types/core/cues.d.ts +146 -57
- package/types/core/cues.d.ts.map +1 -1
- package/types/core/deck.d.ts +2 -12
- package/types/core/deck.d.ts.map +1 -1
- package/types/core/dispatch.d.ts +7 -3
- package/types/core/dispatch.d.ts.map +1 -1
- package/types/core/errors.d.ts +4 -4
- package/types/core/errors.d.ts.map +1 -1
- package/types/core/{exchange-proofing.d.ts → exchange/exchange-proofing.d.ts} +9 -2
- package/types/core/exchange/exchange-proofing.d.ts.map +1 -0
- package/types/core/{protocol-exchanging.d.ts → exchange/protocol-exchanging.d.ts} +18 -2
- package/types/core/exchange/protocol-exchanging.d.ts.map +1 -0
- package/types/core/genus-framing.d.ts +12 -0
- package/types/core/genus-framing.d.ts.map +1 -0
- package/types/core/{eventing.d.ts → kel/eventing.d.ts} +37 -48
- package/types/core/kel/eventing.d.ts.map +1 -0
- package/types/core/{kever-decisions.d.ts → kel/kever-decisions.d.ts} +36 -22
- package/types/core/kel/kever-decisions.d.ts.map +1 -0
- package/types/core/{kever.d.ts → kel/kever.d.ts} +13 -47
- package/types/core/kel/kever.d.ts.map +1 -0
- package/types/core/kel/witnesses.d.ts.map +1 -0
- package/types/core/logger.d.ts +1 -1
- package/types/core/logger.d.ts.map +1 -1
- package/types/core/{kram-auth.d.ts → mailbox/kram-auth.d.ts} +2 -2
- package/types/core/mailbox/kram-auth.d.ts.map +1 -0
- package/types/core/{kram-policy.d.ts → mailbox/kram-policy.d.ts} +2 -2
- package/types/core/mailbox/kram-policy.d.ts.map +1 -0
- package/types/core/{kram-pruning.d.ts → mailbox/kram-pruning.d.ts} +3 -3
- package/types/core/{kram-pruning.d.ts.map → mailbox/kram-pruning.d.ts.map} +1 -1
- package/types/core/{kram-signatures.d.ts → mailbox/kram-signatures.d.ts} +3 -3
- package/types/core/mailbox/kram-signatures.d.ts.map +1 -0
- package/types/core/mailbox/kram-staging.d.ts +30 -0
- package/types/core/mailbox/kram-staging.d.ts.map +1 -0
- package/types/core/{kram-time.d.ts → mailbox/kram-time.d.ts} +5 -11
- package/types/core/mailbox/kram-time.d.ts.map +1 -0
- package/types/core/mailbox/kraming.d.ts +42 -0
- package/types/core/mailbox/kraming.d.ts.map +1 -0
- package/types/core/mailbox/mailbox-topics.d.ts.map +1 -0
- package/types/core/protocol-eventing.d.ts +5 -0
- package/types/core/protocol-eventing.d.ts.map +1 -1
- package/types/core/protocol-serialization.d.ts +1 -1
- package/types/core/protocol-serialization.d.ts.map +1 -1
- package/types/core/protocol-vdr-eventing.d.ts +7 -5
- package/types/core/protocol-vdr-eventing.d.ts.map +1 -1
- package/types/core/records.d.ts +15 -50
- package/types/core/records.d.ts.map +1 -1
- package/types/core/routing.d.ts +76 -46
- package/types/core/routing.d.ts.map +1 -1
- package/types/db/baser-defaults.d.ts +5 -0
- package/types/db/baser-defaults.d.ts.map +1 -0
- package/types/db/basing.d.ts +70 -75
- package/types/db/basing.d.ts.map +1 -1
- package/types/db/core/keys.d.ts.map +1 -1
- package/types/db/core/lmdber.d.ts +21 -23
- package/types/db/core/lmdber.d.ts.map +1 -1
- package/types/db/core/path-manager.d.ts.map +1 -1
- package/types/db/escrowing.d.ts +12 -49
- package/types/db/escrowing.d.ts.map +1 -1
- package/types/db/exchange/exchange-nests.d.ts +12 -0
- package/types/db/exchange/exchange-nests.d.ts.map +1 -0
- package/types/db/exchange/exchange-records.d.ts +38 -0
- package/types/db/exchange/exchange-records.d.ts.map +1 -0
- package/types/db/index.d.ts +5 -6
- package/types/db/index.d.ts.map +1 -1
- package/types/db/keeping.d.ts +19 -1
- package/types/db/keeping.d.ts.map +1 -1
- package/types/db/koming.d.ts +1 -1
- package/types/db/koming.d.ts.map +1 -1
- package/types/db/{kram-factors.d.ts → mailbox/kram-factors.d.ts} +3 -5
- package/types/db/mailbox/kram-factors.d.ts.map +1 -0
- package/types/db/{mailboxing.d.ts → mailbox/mailboxing.d.ts} +3 -4
- package/types/db/mailbox/mailboxing.d.ts.map +1 -0
- package/types/db/reger.d.ts +10 -12
- package/types/db/reger.d.ts.map +1 -1
- package/types/db/{kel-replay.d.ts → replay/kel-replay.d.ts} +2 -6
- package/types/db/replay/kel-replay.d.ts.map +1 -0
- package/types/db/{tel-replay.d.ts → replay/tel-replay.d.ts} +13 -8
- package/types/db/replay/tel-replay.d.ts.map +1 -0
- package/types/db/{witness-replay.d.ts → replay/witness-replay.d.ts} +2 -3
- package/types/db/replay/witness-replay.d.ts.map +1 -0
- package/types/db/subing.d.ts +1 -5
- package/types/db/subing.d.ts.map +1 -1
- package/types/did/keri/resolving.d.ts +5 -10
- package/types/did/keri/resolving.d.ts.map +1 -1
- package/types/did/webs/artifacts.d.ts +5 -5
- package/types/did/webs/artifacts.d.ts.map +1 -1
- package/types/did/webs/designated-aliases.d.ts +6 -5
- package/types/did/webs/designated-aliases.d.ts.map +1 -1
- package/types/did/webs/documenting.d.ts +6 -5
- package/types/did/webs/documenting.d.ts.map +1 -1
- package/types/did/webs/resolving.d.ts +13 -3
- package/types/did/webs/resolving.d.ts.map +1 -1
- package/types/library/index.d.ts +1 -1
- package/types/library/index.d.ts.map +1 -1
- package/types/npm/cli.d.ts +1 -1
- package/types/npm/cli.d.ts.map +1 -1
- package/types/npm/index.d.ts +1 -1
- package/types/npm/index.d.ts.map +1 -1
- package/types/runtime/index.d.ts +109 -76
- package/types/runtime/index.d.ts.map +1 -1
- package/types/vdr/backer-state.d.ts +22 -0
- package/types/vdr/backer-state.d.ts.map +1 -0
- package/types/vdr/credential-tsn-record.d.ts +13 -0
- package/types/vdr/credential-tsn-record.d.ts.map +1 -0
- package/types/vdr/credentialing.d.ts +16 -27
- package/types/vdr/credentialing.d.ts.map +1 -1
- package/types/vdr/eventing.d.ts +66 -23
- package/types/vdr/eventing.d.ts.map +1 -1
- package/types/vdr/registry-tsn-record.d.ts +6 -0
- package/types/vdr/registry-tsn-record.d.ts.map +1 -0
- package/types/vdr/revoking.d.ts +18 -0
- package/types/vdr/revoking.d.ts.map +1 -0
- package/types/vdr/tel-anchor.d.ts +10 -0
- package/types/vdr/tel-anchor.d.ts.map +1 -0
- package/types/vdr/tel-publication.d.ts +49 -0
- package/types/vdr/tel-publication.d.ts.map +1 -0
- package/types/vdr/tsn-query.d.ts +9 -4
- package/types/vdr/tsn-query.d.ts.map +1 -1
- package/types/{app/version.d.ts → version.d.ts} +2 -2
- package/types/version.d.ts.map +1 -0
- package/esm/keri/npm/src/app/abortable.js +0 -27
- package/esm/keri/npm/src/app/agent-runtime.js +0 -638
- package/esm/keri/npm/src/app/cesr-egress.js +0 -308
- package/esm/keri/npm/src/app/cesr-output.js +0 -12
- package/esm/keri/npm/src/app/cli/annotate.js +0 -24
- package/esm/keri/npm/src/app/cli/challenge.js +0 -168
- package/esm/keri/npm/src/app/cli/common/displaying.js +0 -43
- package/esm/keri/npm/src/app/cli/common/parsing.js +0 -215
- package/esm/keri/npm/src/app/cli/incept.js +0 -187
- package/esm/keri/npm/src/app/cli/index.js +0 -36
- package/esm/keri/npm/src/app/cli/init.js +0 -155
- package/esm/keri/npm/src/app/cli/interact.js +0 -72
- package/esm/keri/npm/src/app/cli/ipex.js +0 -453
- package/esm/keri/npm/src/app/cli/multisig.js +0 -474
- package/esm/keri/npm/src/app/cli/query.js +0 -143
- package/esm/keri/npm/src/app/cli/rotate.js +0 -171
- package/esm/keri/npm/src/app/cli/vc.js +0 -284
- package/esm/keri/npm/src/app/cli/verifier.js +0 -96
- package/esm/keri/npm/src/app/credential-workflows.js +0 -431
- package/esm/keri/npm/src/app/cue-delivery.js +0 -171
- package/esm/keri/npm/src/app/cue-preparation.js +0 -124
- package/esm/keri/npm/src/app/cue-route.js +0 -64
- package/esm/keri/npm/src/app/cue-runtime.js +0 -104
- package/esm/keri/npm/src/app/direct-reply-delivery.js +0 -282
- package/esm/keri/npm/src/app/essr.js +0 -235
- package/esm/keri/npm/src/app/exchanging.js +0 -1219
- package/esm/keri/npm/src/app/forwarding.js +0 -1346
- package/esm/keri/npm/src/app/group-members.js +0 -37
- package/esm/keri/npm/src/app/grouping.js +0 -534
- package/esm/keri/npm/src/app/httping.js +0 -130
- package/esm/keri/npm/src/app/ipex-credentialing.js +0 -245
- package/esm/keri/npm/src/app/ipex-grouping.js +0 -317
- package/esm/keri/npm/src/app/ipex-v2.js +0 -542
- package/esm/keri/npm/src/app/mailbox-sse.js +0 -257
- package/esm/keri/npm/src/app/multisig-workflows.js +0 -537
- package/esm/keri/npm/src/app/oobi-replies.js +0 -194
- package/esm/keri/npm/src/app/query-replies.js +0 -181
- package/esm/keri/npm/src/app/querying.js +0 -1040
- package/esm/keri/npm/src/app/reactor.js +0 -517
- package/esm/keri/npm/src/app/reply-streams.js +0 -304
- package/esm/keri/npm/src/app/respondant.js +0 -173
- package/esm/keri/npm/src/app/runtime-deliveries.js +0 -510
- package/esm/keri/npm/src/app/runtime-services.js +0 -25
- package/esm/keri/npm/src/app/signaling.js +0 -388
- package/esm/keri/npm/src/app/stored-replies.js +0 -85
- package/esm/keri/npm/src/app/tcp-egress.js +0 -334
- package/esm/keri/npm/src/app/verifier-agent.js +0 -461
- package/esm/keri/npm/src/app/witnessing.js +0 -956
- package/esm/keri/npm/src/core/cue-admission.js +0 -419
- package/esm/keri/npm/src/core/index.js +0 -23
- package/esm/keri/npm/src/core/kever-decisions.js +0 -63
- package/esm/keri/npm/src/core/kram-handoff.js +0 -148
- package/esm/keri/npm/src/core/kram-staging.js +0 -211
- package/esm/keri/npm/src/core/kraming.js +0 -99
- package/esm/keri/npm/src/db/exchange-nests.js +0 -175
- package/esm/keri/npm/src/db/exchange-records.js +0 -7
- package/esm/keri/npm/src/db/kram-snapshots.js +0 -216
- package/esm/keri/npm/src/db/mailbox-inbox.js +0 -206
- package/esm/keri/npm/src/db/outboxing.js +0 -371
- package/esm/keri/npm/src/db/payload-archive.js +0 -402
- package/esm/keri/npm/src/db/payload-store.js +0 -416
- package/esm/keri/npm/src/db/payload-view.js +0 -23
- package/esm/keri/npm/src/db/verifier-cueing.js +0 -132
- package/esm/keri/npm/src/vdr/credential-tsn.js +0 -218
- package/esm/keri/npm/src/vdr/registry-tsn.js +0 -218
- package/types/app/abortable.d.ts +0 -11
- package/types/app/abortable.d.ts.map +0 -1
- package/types/app/agent-runtime.d.ts +0 -284
- package/types/app/agent-runtime.d.ts.map +0 -1
- package/types/app/authenticating.d.ts +0 -36
- package/types/app/authenticating.d.ts.map +0 -1
- package/types/app/byte-source.d.ts +0 -16
- package/types/app/byte-source.d.ts.map +0 -1
- package/types/app/cesr-egress.d.ts +0 -48
- package/types/app/cesr-egress.d.ts.map +0 -1
- package/types/app/cesr-http.d.ts.map +0 -1
- package/types/app/cesr-output.d.ts +0 -5
- package/types/app/cesr-output.d.ts.map +0 -1
- package/types/app/challenging.d.ts.map +0 -1
- package/types/app/cli/aid.d.ts.map +0 -1
- package/types/app/cli/annotate-color.d.ts.map +0 -1
- package/types/app/cli/annotate.d.ts.map +0 -1
- package/types/app/cli/benchmark.d.ts.map +0 -1
- package/types/app/cli/challenge.d.ts.map +0 -1
- package/types/app/cli/common/context.d.ts.map +0 -1
- package/types/app/cli/common/displaying.d.ts +0 -12
- package/types/app/cli/common/displaying.d.ts.map +0 -1
- package/types/app/cli/common/existing.d.ts.map +0 -1
- package/types/app/cli/common/parsing.d.ts.map +0 -1
- package/types/app/cli/common/rendering.d.ts.map +0 -1
- package/types/app/cli/common/witness-auth.d.ts.map +0 -1
- package/types/app/cli/db-dump.d.ts.map +0 -1
- package/types/app/cli/delegate.d.ts +0 -26
- package/types/app/cli/delegate.d.ts.map +0 -1
- package/types/app/cli/did.d.ts.map +0 -1
- package/types/app/cli/ends.d.ts.map +0 -1
- package/types/app/cli/exchange.d.ts.map +0 -1
- package/types/app/cli/export.d.ts.map +0 -1
- package/types/app/cli/incept.d.ts.map +0 -1
- package/types/app/cli/index.d.ts +0 -37
- package/types/app/cli/index.d.ts.map +0 -1
- package/types/app/cli/init.d.ts.map +0 -1
- package/types/app/cli/interact.d.ts.map +0 -1
- package/types/app/cli/ipex.d.ts +0 -20
- package/types/app/cli/ipex.d.ts.map +0 -1
- package/types/app/cli/list.d.ts.map +0 -1
- package/types/app/cli/loc.d.ts.map +0 -1
- package/types/app/cli/multisig.d.ts +0 -12
- package/types/app/cli/multisig.d.ts.map +0 -1
- package/types/app/cli/notifications.d.ts.map +0 -1
- package/types/app/cli/oobi.d.ts.map +0 -1
- package/types/app/cli/output.d.ts.map +0 -1
- package/types/app/cli/query.d.ts +0 -12
- package/types/app/cli/query.d.ts.map +0 -1
- package/types/app/cli/rotate.d.ts.map +0 -1
- package/types/app/cli/saidify.d.ts.map +0 -1
- package/types/app/cli/sign.d.ts.map +0 -1
- package/types/app/cli/vc.d.ts +0 -20
- package/types/app/cli/vc.d.ts.map +0 -1
- package/types/app/cli/verifier.d.ts +0 -3
- package/types/app/cli/verifier.d.ts.map +0 -1
- package/types/app/cli/verify.d.ts.map +0 -1
- package/types/app/configing.d.ts.map +0 -1
- package/types/app/credential-workflows.d.ts +0 -118
- package/types/app/credential-workflows.d.ts.map +0 -1
- package/types/app/cue-delivery.d.ts +0 -30
- package/types/app/cue-delivery.d.ts.map +0 -1
- package/types/app/cue-preparation.d.ts +0 -25
- package/types/app/cue-preparation.d.ts.map +0 -1
- package/types/app/cue-route.d.ts +0 -19
- package/types/app/cue-route.d.ts.map +0 -1
- package/types/app/cue-runtime.d.ts +0 -46
- package/types/app/cue-runtime.d.ts.map +0 -1
- package/types/app/delegating.d.ts.map +0 -1
- package/types/app/direct-reply-delivery.d.ts +0 -38
- package/types/app/direct-reply-delivery.d.ts.map +0 -1
- package/types/app/endpoint-roleing.d.ts +0 -41
- package/types/app/endpoint-roleing.d.ts.map +0 -1
- package/types/app/essr.d.ts +0 -72
- package/types/app/essr.d.ts.map +0 -1
- package/types/app/exchanging.d.ts +0 -245
- package/types/app/exchanging.d.ts.map +0 -1
- package/types/app/forwarding.d.ts +0 -411
- package/types/app/forwarding.d.ts.map +0 -1
- package/types/app/group-members.d.ts +0 -12
- package/types/app/group-members.d.ts.map +0 -1
- package/types/app/grouping.d.ts +0 -150
- package/types/app/grouping.d.ts.map +0 -1
- package/types/app/habbing.d.ts.map +0 -1
- package/types/app/httping.d.ts +0 -42
- package/types/app/httping.d.ts.map +0 -1
- package/types/app/ipex-building.d.ts.map +0 -1
- package/types/app/ipex-credentialing.d.ts.map +0 -1
- package/types/app/ipex-graph.d.ts +0 -30
- package/types/app/ipex-graph.d.ts.map +0 -1
- package/types/app/ipex-grouping.d.ts +0 -51
- package/types/app/ipex-grouping.d.ts.map +0 -1
- package/types/app/ipex-v2.d.ts +0 -51
- package/types/app/ipex-v2.d.ts.map +0 -1
- package/types/app/ipexing.d.ts.map +0 -1
- package/types/app/keeping.d.ts.map +0 -1
- package/types/app/mailbox-director.d.ts +0 -159
- package/types/app/mailbox-director.d.ts.map +0 -1
- package/types/app/mailbox-sse.d.ts +0 -38
- package/types/app/mailbox-sse.d.ts.map +0 -1
- package/types/app/mailboxing.d.ts.map +0 -1
- package/types/app/multisig-workflows.d.ts +0 -59
- package/types/app/multisig-workflows.d.ts.map +0 -1
- package/types/app/notifying.d.ts.map +0 -1
- package/types/app/oobi-replies.d.ts +0 -18
- package/types/app/oobi-replies.d.ts.map +0 -1
- package/types/app/oobiery.d.ts.map +0 -1
- package/types/app/organizing.d.ts.map +0 -1
- package/types/app/parsering.d.ts +0 -106
- package/types/app/parsering.d.ts.map +0 -1
- package/types/app/protocol-host-policy.d.ts.map +0 -1
- package/types/app/query-replies.d.ts +0 -45
- package/types/app/query-replies.d.ts.map +0 -1
- package/types/app/querying.d.ts +0 -294
- package/types/app/querying.d.ts.map +0 -1
- package/types/app/reactor.d.ts +0 -171
- package/types/app/reactor.d.ts.map +0 -1
- package/types/app/reply-streams.d.ts +0 -51
- package/types/app/reply-streams.d.ts.map +0 -1
- package/types/app/respondant.d.ts +0 -48
- package/types/app/respondant.d.ts.map +0 -1
- package/types/app/runtime-deliveries.d.ts +0 -67
- package/types/app/runtime-deliveries.d.ts.map +0 -1
- package/types/app/runtime-services.d.ts +0 -29
- package/types/app/runtime-services.d.ts.map +0 -1
- package/types/app/runtime-turn.d.ts.map +0 -1
- package/types/app/schema-resolving.d.ts.map +0 -1
- package/types/app/signaling.d.ts +0 -96
- package/types/app/signaling.d.ts.map +0 -1
- package/types/app/socket-source.d.ts.map +0 -1
- package/types/app/stored-replies.d.ts +0 -18
- package/types/app/stored-replies.d.ts.map +0 -1
- package/types/app/tcp-egress.d.ts +0 -87
- package/types/app/tcp-egress.d.ts.map +0 -1
- package/types/app/verifier-agent.d.ts +0 -91
- package/types/app/verifier-agent.d.ts.map +0 -1
- package/types/app/verifying.d.ts.map +0 -1
- package/types/app/version.d.ts.map +0 -1
- package/types/app/witnessing.d.ts +0 -227
- package/types/app/witnessing.d.ts.map +0 -1
- package/types/core/cue-admission.d.ts +0 -74
- package/types/core/cue-admission.d.ts.map +0 -1
- package/types/core/eventing.d.ts.map +0 -1
- package/types/core/exchange-proofing.d.ts.map +0 -1
- package/types/core/index.d.ts +0 -24
- package/types/core/index.d.ts.map +0 -1
- package/types/core/kever-decisions.d.ts.map +0 -1
- package/types/core/kever.d.ts.map +0 -1
- package/types/core/kram-auth.d.ts.map +0 -1
- package/types/core/kram-handoff.d.ts +0 -45
- package/types/core/kram-handoff.d.ts.map +0 -1
- package/types/core/kram-policy.d.ts.map +0 -1
- package/types/core/kram-signatures.d.ts.map +0 -1
- package/types/core/kram-staging.d.ts +0 -36
- package/types/core/kram-staging.d.ts.map +0 -1
- package/types/core/kram-time.d.ts.map +0 -1
- package/types/core/kraming.d.ts +0 -46
- package/types/core/kraming.d.ts.map +0 -1
- package/types/core/mailbox-topics.d.ts.map +0 -1
- package/types/core/protocol-exchanging.d.ts.map +0 -1
- package/types/core/witnesses.d.ts.map +0 -1
- package/types/db/exchange-nests.d.ts +0 -39
- package/types/db/exchange-nests.d.ts.map +0 -1
- package/types/db/exchange-records.d.ts +0 -35
- package/types/db/exchange-records.d.ts.map +0 -1
- package/types/db/kel-replay.d.ts.map +0 -1
- package/types/db/kram-factors.d.ts.map +0 -1
- package/types/db/kram-snapshots.d.ts +0 -23
- package/types/db/kram-snapshots.d.ts.map +0 -1
- package/types/db/mailbox-inbox.d.ts +0 -72
- package/types/db/mailbox-inbox.d.ts.map +0 -1
- package/types/db/mailboxing.d.ts.map +0 -1
- package/types/db/outboxing.d.ts +0 -182
- package/types/db/outboxing.d.ts.map +0 -1
- package/types/db/payload-archive.d.ts +0 -70
- package/types/db/payload-archive.d.ts.map +0 -1
- package/types/db/payload-store.d.ts +0 -40
- package/types/db/payload-store.d.ts.map +0 -1
- package/types/db/payload-view.d.ts +0 -4
- package/types/db/payload-view.d.ts.map +0 -1
- package/types/db/tel-replay.d.ts.map +0 -1
- package/types/db/verifier-cueing.d.ts +0 -46
- package/types/db/verifier-cueing.d.ts.map +0 -1
- package/types/db/witness-replay.d.ts.map +0 -1
- package/types/vdr/credential-tsn.d.ts +0 -18
- package/types/vdr/credential-tsn.d.ts.map +0 -1
- package/types/vdr/registry-tsn.d.ts +0 -23
- package/types/vdr/registry-tsn.d.ts.map +0 -1
- /package/esm/keri/npm/src/app/{schema-resolving.js → credentials/schema-resolving.js} +0 -0
- /package/esm/keri/npm/src/app/{protocol-host-policy.js → protocol/protocol-host-policy.js} +0 -0
- /package/esm/keri/npm/src/app/{runtime-turn.js → runtime/runtime-turn.js} +0 -0
- /package/esm/keri/npm/src/{app/cli → cli}/common/rendering.js +0 -0
- /package/esm/keri/npm/src/{app/cli → cli/tools}/annotate-color.js +0 -0
- /package/esm/keri/npm/src/core/{witnesses.js → kel/witnesses.js} +0 -0
- /package/esm/keri/npm/src/core/{kram-auth.js → mailbox/kram-auth.js} +0 -0
- /package/esm/keri/npm/src/core/{mailbox-topics.js → mailbox/mailbox-topics.js} +0 -0
- /package/types/app/{runtime-turn.d.ts → runtime/runtime-turn.d.ts} +0 -0
- /package/types/{app/cli → cli}/common/rendering.d.ts +0 -0
- /package/types/{app/cli → cli/endpoints}/loc.d.ts +0 -0
- /package/types/{app/cli → cli/identity}/aid.d.ts +0 -0
- /package/types/{app/cli → cli/identity}/export.d.ts +0 -0
- /package/types/{app/cli → cli/identity}/list.d.ts +0 -0
- /package/types/{app/cli → cli/messaging}/notifications.d.ts +0 -0
- /package/types/{app/cli → cli}/output.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/annotate-color.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/annotate.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/benchmark.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/saidify.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/verify.d.ts +0 -0
- /package/types/core/{witnesses.d.ts → kel/witnesses.d.ts} +0 -0
- /package/types/core/{mailbox-topics.d.ts → mailbox/mailbox-topics.d.ts} +0 -0
|
@@ -0,0 +1,932 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KERIpy-shaped multisig exchange coordination.
|
|
3
|
+
*
|
|
4
|
+
* This module owns the `/multisig/*` EXN family used to coordinate group
|
|
5
|
+
* registry, credential, reply, and wrapped business EXN proposals. It does not
|
|
6
|
+
* own group key-event counseling; local group habitat state still lives under
|
|
7
|
+
* `Habery.makeGroupHab(...)`, `Baser.habs`, and the keeper member stores.
|
|
8
|
+
*/
|
|
9
|
+
import { collectPayload, concatBytes, Counter, nestedPayload, parse, parseBytes, parsePather, Prefixer, Saider, Serder, SerderACDC, SerderKERI, Vrsn_1_0, Vrsn_2_0, } from "cesr-ts";
|
|
10
|
+
import { call, ensure } from "effection";
|
|
11
|
+
import { validateRip, validateUpdate } from "../../acdc/regeventing.js";
|
|
12
|
+
import { ValidationError } from "../../core/errors.js";
|
|
13
|
+
import { exchange, isIpexVerb, isV2RegistryRoute, multisigChildField, nestedIpexRoute, nestedMultisigIlks, } from "../../core/exchange/protocol-exchanging.js";
|
|
14
|
+
import { Kevery } from "../../core/kel/eventing.js";
|
|
15
|
+
import { BasicReplyRouteHandler, Revery, Router } from "../../core/routing.js";
|
|
16
|
+
import { Exchanger } from "../exchanges/exchanging.js";
|
|
17
|
+
import { IpexV2Handler } from "../ipex/ipex-v2.js";
|
|
18
|
+
import { dispatchEnvelope, envelopeFromFrame } from "../protocol/parsering.js";
|
|
19
|
+
import { abortable, rethrowCleanupFailure } from "../runtime/abortable.js";
|
|
20
|
+
import { groupSigningMembers, localIpexContribution } from "./group-members.js";
|
|
21
|
+
import { multisigEmbeddedSection, multisigPayloadSaid } from "./multisig-messaging.js";
|
|
22
|
+
/** KERIpy multisig route constants. */
|
|
23
|
+
export const MULTISIG_ICP_ROUTE = "/multisig/icp";
|
|
24
|
+
export const MULTISIG_ROT_ROUTE = "/multisig/rot";
|
|
25
|
+
export const MULTISIG_IXN_ROUTE = "/multisig/ixn";
|
|
26
|
+
export const MULTISIG_RIP_ROUTE = "/multisig/rip";
|
|
27
|
+
export const MULTISIG_BUP_ROUTE = "/multisig/bup";
|
|
28
|
+
export const MULTISIG_VCP_ROUTE = "/multisig/vcp";
|
|
29
|
+
export const MULTISIG_ISS_ROUTE = "/multisig/iss";
|
|
30
|
+
export const MULTISIG_REV_ROUTE = "/multisig/rev";
|
|
31
|
+
export const MULTISIG_EXN_ROUTE = "/multisig/exn";
|
|
32
|
+
export const MULTISIG_RPY_ROUTE = "/multisig/rpy";
|
|
33
|
+
/** Local v2 coordination profile routes, as in KERIpy core; not upstream KERI or #1740 routes. */
|
|
34
|
+
export const MULTISIG_QRY_ROUTE = "/multisig/qry";
|
|
35
|
+
export const MULTISIG_IPEX_PROOF_ROUTE = "/multisig/ipex-proof";
|
|
36
|
+
/** Ordered route list used for handler registration. */
|
|
37
|
+
export const MULTISIG_ROUTES = [
|
|
38
|
+
MULTISIG_RIP_ROUTE,
|
|
39
|
+
MULTISIG_BUP_ROUTE,
|
|
40
|
+
MULTISIG_ICP_ROUTE,
|
|
41
|
+
MULTISIG_ROT_ROUTE,
|
|
42
|
+
MULTISIG_IXN_ROUTE,
|
|
43
|
+
MULTISIG_VCP_ROUTE,
|
|
44
|
+
MULTISIG_ISS_ROUTE,
|
|
45
|
+
MULTISIG_REV_ROUTE,
|
|
46
|
+
MULTISIG_EXN_ROUTE,
|
|
47
|
+
MULTISIG_RPY_ROUTE,
|
|
48
|
+
MULTISIG_QRY_ROUTE,
|
|
49
|
+
MULTISIG_IPEX_PROOF_ROUTE,
|
|
50
|
+
];
|
|
51
|
+
/** Children whose verification needs caller-owned processors; the Multiplexor indexes and notifies only. */
|
|
52
|
+
const UNREPLAYED_ROUTES = [MULTISIG_QRY_ROUTE, MULTISIG_IPEX_PROOF_ROUTE];
|
|
53
|
+
/** Build an unsigned legacy VDR wrapper with its required named children. */
|
|
54
|
+
export function prepareMultisigVdrExn(sender, proposal, options = {}) {
|
|
55
|
+
return exchange(proposal.route, proposal.attrs, { ...options, sender, embeds: proposal.embeds });
|
|
56
|
+
}
|
|
57
|
+
/** Validate public TEL linkage before proposing or signing an anchor; no state is inferred from b. */
|
|
58
|
+
export function registryProposalEvent(tel, gid, store) {
|
|
59
|
+
const checked = tel.ilk === "rip" ? validateRip(tel, gid) : validateUpdate(tel, tel.regid ?? "");
|
|
60
|
+
if (checked.kind !== "valid" || tel.pvrsn.major !== 2 || tel.pvrsn.minor !== 0) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
if (tel.ilk === "rip") {
|
|
64
|
+
return checked.event;
|
|
65
|
+
}
|
|
66
|
+
const rip = store?.seqEvent(checked.event.regid, 0);
|
|
67
|
+
const inception = rip && validateRip(rip, gid);
|
|
68
|
+
const head = store?.headEvent(checked.event.regid);
|
|
69
|
+
if (!rip || !head || !inception || inception.kind !== "valid" || rip.pvrsn.major !== 2 || rip.pvrsn.minor !== 0) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const headSn = BigInt(`0x${head.sad.n}`);
|
|
73
|
+
const sn = checked.event.sn;
|
|
74
|
+
if (sn > headSn + 1n || sn > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const accepted = store.seqEvent(rip.said, Number(sn));
|
|
78
|
+
if (accepted) {
|
|
79
|
+
return sameBytes(accepted.raw, tel.raw) ? checked.event : null;
|
|
80
|
+
}
|
|
81
|
+
return sn === headSn + 1n && checked.event.prior === head.said ? checked.event : null;
|
|
82
|
+
}
|
|
83
|
+
/** Exact authenticated consent may share an anchor index with unrelated v2 TEL proposals. */
|
|
84
|
+
export function sameRegistryProposal(left, right) {
|
|
85
|
+
const a = left.sad?.a;
|
|
86
|
+
const b = right.sad?.a;
|
|
87
|
+
return isV2RegistryRoute(left.route ?? "") && left.route === right.route && isRecord(a) && isRecord(b)
|
|
88
|
+
&& ["gid", "tel", "anc"].every(field => a[field] === b[field]);
|
|
89
|
+
}
|
|
90
|
+
/** Validate both child commitments and every supplied source coordinate without writing evidence. */
|
|
91
|
+
export function acdcV2RegistryProposal(wrapper, nests, store) {
|
|
92
|
+
const payload = wrapper.sad?.a;
|
|
93
|
+
const route = wrapper.route ?? "";
|
|
94
|
+
if (!isV2RegistryRoute(route) || !isRecord(payload) || typeof payload.gid !== "string" || nests.length !== 2
|
|
95
|
+
|| wrapper.pvrsn.major !== 2 || wrapper.pvrsn.minor !== 0) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const [tel, anchor] = nests.map(child => child.body);
|
|
99
|
+
if (!(tel instanceof SerderACDC) || !(anchor instanceof SerderKERI) || route !== `/multisig/${tel.ilk}`
|
|
100
|
+
|| nests.some(child => child.nests?.length) || tel.said !== payload.tel || anchor.said !== payload.anc
|
|
101
|
+
|| anchor.pvrsn.major !== 2 || anchor.pvrsn.minor !== 0 || !anchor.verify()
|
|
102
|
+
|| anchor.pre !== payload.gid || !["ixn", "rot", "drt"].includes(anchor.ilk ?? "")) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const event = registryProposalEvent(tel, payload.gid, store);
|
|
106
|
+
if (!event || !anchor.seals.some(seal => isRecord(seal) && seal.i === event.regid
|
|
107
|
+
&& seal.s === tel.sad.n && seal.d === tel.said)) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const evidence = envelopeFromFrame(nests[0]);
|
|
111
|
+
if (evidence.sscs.some(seal => seal.s.num !== BigInt(anchor.sn) || seal.d.qb64 !== anchor.said)
|
|
112
|
+
|| evidence.ssts.some(seal => seal.i.qb64 !== payload.gid
|
|
113
|
+
|| seal.s.num !== BigInt(anchor.sn) || seal.d.qb64 !== anchor.said)) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return { tel, anchor };
|
|
117
|
+
}
|
|
118
|
+
/** Compare retained event bytes without normalizing their signed representation. */
|
|
119
|
+
function sameBytes(left, right) {
|
|
120
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
121
|
+
}
|
|
122
|
+
/** Commit one exact ACDC v2 registry/anchor pair using the ordinary nested-wire serializer. */
|
|
123
|
+
export function* prepareAcdcV2RegistryExn(sender, tel, anchor, store, options = {}) {
|
|
124
|
+
const children = [tel, anchor].map(wire => parseBytes(concatBytes(Counter.makeGVC(Vrsn_2_0), wire)));
|
|
125
|
+
if (children.some(frames => frames.length !== 1)) {
|
|
126
|
+
throw new Error("ACDC v2 registry proposal requires one TEL and one KEL event.");
|
|
127
|
+
}
|
|
128
|
+
const nests = children.map(frames => frames[0]);
|
|
129
|
+
if (!(nests[1].body instanceof SerderKERI))
|
|
130
|
+
throw new Error("ACDC v2 registry anchor must be KERI.");
|
|
131
|
+
const wrapper = exchange(`/multisig/${nests[0].body.ilk}`, {
|
|
132
|
+
gid: nests[1].body.pre,
|
|
133
|
+
tel: nests[0].body.said,
|
|
134
|
+
anc: nests[1].body.said,
|
|
135
|
+
}, {
|
|
136
|
+
...options,
|
|
137
|
+
sender,
|
|
138
|
+
version: Vrsn_2_0,
|
|
139
|
+
})[0];
|
|
140
|
+
if (!acdcV2RegistryProposal(wrapper, nests, store))
|
|
141
|
+
throw new Error("Invalid ACDC v2 registry proposal.");
|
|
142
|
+
const parts = yield* abortable(signal => Promise.all(nests.map(child => collectPayload(nestedPayload(child, Vrsn_2_0), signal))));
|
|
143
|
+
return [wrapper, concatBytes(...parts)];
|
|
144
|
+
}
|
|
145
|
+
/** Coordinate one proposed group inception event. */
|
|
146
|
+
export function* multisigInceptExn(member, smids, rmids, icp, delegator, options = {}) {
|
|
147
|
+
return yield* prepareMultisigEventExn(member.pre, {
|
|
148
|
+
route: MULTISIG_ICP_ROUTE,
|
|
149
|
+
attrs: {
|
|
150
|
+
smids: [...smids],
|
|
151
|
+
rmids: [...(rmids ?? smids)],
|
|
152
|
+
...(delegator ? { delegator } : {}),
|
|
153
|
+
},
|
|
154
|
+
}, rawMessage(icp), options);
|
|
155
|
+
}
|
|
156
|
+
/** Coordinate one proposed group rotation event. */
|
|
157
|
+
export function* multisigRotateExn(group, member, smids, rmids, rot, options = {}) {
|
|
158
|
+
return yield* prepareMultisigEventExn(member.pre, {
|
|
159
|
+
route: MULTISIG_ROT_ROUTE,
|
|
160
|
+
attrs: {
|
|
161
|
+
gid: groupPrefix(group),
|
|
162
|
+
smids: [...smids],
|
|
163
|
+
rmids: [...rmids],
|
|
164
|
+
},
|
|
165
|
+
}, rawMessage(rot), options);
|
|
166
|
+
}
|
|
167
|
+
/** Coordinate one proposed group interaction event. */
|
|
168
|
+
export function* multisigInteractExn(group, member, aids, ixn, options = {}) {
|
|
169
|
+
return yield* prepareMultisigEventExn(member.pre, {
|
|
170
|
+
route: MULTISIG_IXN_ROUTE,
|
|
171
|
+
attrs: {
|
|
172
|
+
gid: groupPrefix(group),
|
|
173
|
+
smids: [...aids],
|
|
174
|
+
},
|
|
175
|
+
}, rawMessage(ixn), options);
|
|
176
|
+
}
|
|
177
|
+
/** Coordinate one proposed multisig credential-registry inception. */
|
|
178
|
+
export function multisigRegistryInceptExn(group, member, usage, vcp, anc, options = {}) {
|
|
179
|
+
return prepareMultisigVdrExn(member.pre, {
|
|
180
|
+
route: MULTISIG_VCP_ROUTE,
|
|
181
|
+
attrs: { gid: groupPrefix(group), usage },
|
|
182
|
+
embeds: { vcp: rawMessage(vcp), anc: rawMessage(anc) },
|
|
183
|
+
}, exchangeOptions(member, options));
|
|
184
|
+
}
|
|
185
|
+
/** Coordinate one proposed multisig credential issuance. */
|
|
186
|
+
export function multisigIssueExn(group, member, acdc, iss, anc, options = {}) {
|
|
187
|
+
return prepareMultisigVdrExn(member.pre, {
|
|
188
|
+
route: MULTISIG_ISS_ROUTE,
|
|
189
|
+
attrs: { gid: groupPrefix(group) },
|
|
190
|
+
embeds: { acdc: rawMessage(acdc), iss: rawMessage(iss), anc: rawMessage(anc) },
|
|
191
|
+
}, exchangeOptions(member, options));
|
|
192
|
+
}
|
|
193
|
+
/** Coordinate one proposed multisig credential revocation. */
|
|
194
|
+
export function multisigRevokeExn(group, member, said, rev, anc, options = {}) {
|
|
195
|
+
return prepareMultisigVdrExn(member.pre, {
|
|
196
|
+
route: MULTISIG_REV_ROUTE,
|
|
197
|
+
attrs: { gid: groupPrefix(group), said },
|
|
198
|
+
embeds: { rev: rawMessage(rev), anc: rawMessage(anc) },
|
|
199
|
+
}, exchangeOptions(member, options));
|
|
200
|
+
}
|
|
201
|
+
/** Coordinate one proposed multisig reply event. */
|
|
202
|
+
export function* multisigRpyExn(group, member, rpy, options = {}) {
|
|
203
|
+
return yield* prepareMultisigEventExn(member.pre, {
|
|
204
|
+
route: MULTISIG_RPY_ROUTE,
|
|
205
|
+
attrs: {
|
|
206
|
+
gid: groupPrefix(group),
|
|
207
|
+
},
|
|
208
|
+
}, rawMessage(rpy), options);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Propose one exact signed v2 query authored by the group to its members.
|
|
212
|
+
*
|
|
213
|
+
* KERIpy `multisigQueryExn`: local v2 coordination profile route `/multisig/qry`
|
|
214
|
+
* whose `a` is `{gid, qry}` and whose single nested substream is the query stream.
|
|
215
|
+
*/
|
|
216
|
+
export function* multisigQueryExn(group, member, qry, options = {}) {
|
|
217
|
+
return yield* prepareMultisigEventExn(member.pre, { route: MULTISIG_QRY_ROUTE, attrs: { gid: groupPrefix(group) } }, rawMessage(qry), { ...options, pvrsn: Vrsn_2_0 });
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Share one exact v2 IPEX Grant stream, with its proofs, with group members.
|
|
221
|
+
*
|
|
222
|
+
* KERIpy `multisigIpexProofExn`: local v2 coordination profile route
|
|
223
|
+
* `/multisig/ipex-proof` whose `a` is `{gid, grant}` and whose single nested
|
|
224
|
+
* substream is the complete Grant stream, authored by or addressed to the group.
|
|
225
|
+
*/
|
|
226
|
+
export function* multisigIpexProofExn(group, member, grant, options = {}) {
|
|
227
|
+
return yield* prepareMultisigEventExn(member.pre, { route: MULTISIG_IPEX_PROOF_ROUTE, attrs: { gid: groupPrefix(group) } }, rawMessage(grant), { ...options, pvrsn: Vrsn_2_0 });
|
|
228
|
+
}
|
|
229
|
+
/** Wrap one business EXN, such as `/ipex/grant`, for group approval. */
|
|
230
|
+
export function multisigExn(group, member, exn, options = {}) {
|
|
231
|
+
return exchange(MULTISIG_EXN_ROUTE, {
|
|
232
|
+
gid: groupPrefix(group),
|
|
233
|
+
}, {
|
|
234
|
+
...exchangeOptions(member, options),
|
|
235
|
+
embeds: { exn: rawMessage(exn) },
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Construct only the v2 parent body from an already parsed KERI child.
|
|
240
|
+
* This synchronous boundary checks the route/ilk and commits the child's SAID;
|
|
241
|
+
* it neither authenticates child proofs nor reads, adopts, or disposes any payload.
|
|
242
|
+
* Callers with a CesrFrame borrow its wire through nestedPayload(frame, Vrsn_2_0).
|
|
243
|
+
*/
|
|
244
|
+
export function multisigExnBody(sender, proposal, child, options = {}) {
|
|
245
|
+
const { route, attrs } = proposal;
|
|
246
|
+
const pvrsn = options.pvrsn ?? options.version ?? Vrsn_2_0;
|
|
247
|
+
if (pvrsn.major !== 2)
|
|
248
|
+
throw new Error("Nested multisig bodies require protocol v2.");
|
|
249
|
+
if (!child.said || !nestedMultisigIlks(route)?.includes(child.ilk ?? "")) {
|
|
250
|
+
throw new Error("Multisig proposal requires a supported route and child kind.");
|
|
251
|
+
}
|
|
252
|
+
if (route === MULTISIG_EXN_ROUTE && !v2IpexChild(child, attrs.gid)) {
|
|
253
|
+
throw new Error("Multisig IPEX requires a v2 child authored by the selected group.");
|
|
254
|
+
}
|
|
255
|
+
const coordination = v2CoordinationChild(route, child, "gid" in attrs ? attrs.gid : undefined);
|
|
256
|
+
if (coordination)
|
|
257
|
+
throw new Error(coordination);
|
|
258
|
+
const field = multisigChildField(route);
|
|
259
|
+
const payload = route === MULTISIG_ICP_ROUTE
|
|
260
|
+
? { gid: requireString(child.pre, "group inception prefix"), ...attrs, [field]: child.said }
|
|
261
|
+
: { ...attrs, [field]: child.said };
|
|
262
|
+
return exchange(route, payload, { ...options, sender, pvrsn })[0];
|
|
263
|
+
}
|
|
264
|
+
/** V2 IPEX proposals carry one exact group-authored child on a supported conversation route. */
|
|
265
|
+
function v2IpexChild(child, group) {
|
|
266
|
+
return child.pvrsn.major === 2 && child.pvrsn.minor === 0 && child.pre === group
|
|
267
|
+
&& ["xip", "exn"].includes(child.ilk ?? "") && child.route?.startsWith("/ipex/") === true
|
|
268
|
+
&& isIpexVerb(child.route.slice(6));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* KERIpy core checks for the two local coordination routes: a group-authored v2
|
|
272
|
+
* query, or a v2 Grant authored by or addressed to the group. Returns a reason.
|
|
273
|
+
*/
|
|
274
|
+
function v2CoordinationChild(route, child, group) {
|
|
275
|
+
const v2 = child.pvrsn.major === 2 && child.pvrsn.minor === 0;
|
|
276
|
+
if (route === MULTISIG_QRY_ROUTE && (!v2 || child.ilk !== "qry" || child.pre !== group)) {
|
|
277
|
+
return "Multisig query requires a v2 query authored by the selected group.";
|
|
278
|
+
}
|
|
279
|
+
if (route === MULTISIG_IPEX_PROOF_ROUTE
|
|
280
|
+
&& (!v2 || child.route !== "/ipex/grant" || (child.pre !== group && child.sad?.ri !== group))) {
|
|
281
|
+
return "Multisig IPEX proof requires a v2 Grant for the selected group.";
|
|
282
|
+
}
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
/** Signed replay hint for a legacy child whose attachments use a different genus. */
|
|
286
|
+
export function multisigChildGenusAttrs(child, genus) {
|
|
287
|
+
return !child.gvrsn && (genus.major !== child.pvrsn.major || genus.minor !== child.pvrsn.minor)
|
|
288
|
+
? { cgvrsn: [genus.major, genus.minor] }
|
|
289
|
+
: {};
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Prepare finite child input, construct the parent and serialize its nested evidence.
|
|
293
|
+
* KEL (icp/rot/ixn) and reply proposals default to KERIpy's form for both v1 and v2
|
|
294
|
+
* groups: a v1 wrapper with a named `e` embed and pathed child attachments in the
|
|
295
|
+
* child's own genus. The group's version is the child KEL/reply version; the wrapper
|
|
296
|
+
* is only the coordination envelope. Other routes default to v2 nested wrappers, and
|
|
297
|
+
* an explicit `version`/`pvrsn` selects either form. The v1 pathed path retains
|
|
298
|
+
* its established encoding; v2 delegates parsing to parseBytes
|
|
299
|
+
* once and borrows the resulting child only until nestedPayload has been fully consumed.
|
|
300
|
+
* Parsed child evidence consists of ordinary values; serialization observes cancellation.
|
|
301
|
+
* Sending v2 requires enclosing these bytes and the parent's signatures together.
|
|
302
|
+
*/
|
|
303
|
+
export function* prepareMultisigEventExn(sender, proposal, wire, options = {}) {
|
|
304
|
+
// Keep the route selection stable through parser suspension; attribute values remain immutable borrows.
|
|
305
|
+
const captured = { ...proposal };
|
|
306
|
+
const { route, attrs } = captured;
|
|
307
|
+
// KERIpy `kli multisig incept|interact|rotate` and `ends add` send these routes as v1
|
|
308
|
+
// `e`-embed wrappers whatever the group KEL version, and `kli multisig join` reads only `e`.
|
|
309
|
+
const keripyEmbedRoute = KERIPY_EMBED_PROPOSAL_ROUTES.includes(route);
|
|
310
|
+
const version = options.pvrsn ?? options.version ?? (keripyEmbedRoute ? Vrsn_1_0 : Vrsn_2_0);
|
|
311
|
+
const field = route.slice(route.lastIndexOf("/") + 1);
|
|
312
|
+
if (version.major === 1) {
|
|
313
|
+
const child = new SerderKERI({ raw: wire });
|
|
314
|
+
const genus = options.childGvrsn ?? child.gvrsn ?? child.pvrsn;
|
|
315
|
+
// KERIpy replays a legacy embed using this signed hint when body and attachment versions differ.
|
|
316
|
+
const hint = multisigChildGenusAttrs(child, genus);
|
|
317
|
+
const payload = route === MULTISIG_ICP_ROUTE
|
|
318
|
+
? { gid: requireString(child.pre, "group inception prefix"), ...attrs, ...hint }
|
|
319
|
+
: { ...attrs, ...hint };
|
|
320
|
+
return exchange(route, payload, { ...options, sender, embeds: { [field]: wire } });
|
|
321
|
+
}
|
|
322
|
+
return yield* abortable(async (signal) => {
|
|
323
|
+
// Let the parser infer body genus; only an explicit counter override adds a selector.
|
|
324
|
+
const selector = options.childGvrsn ? Counter.makeGVC(options.childGvrsn) : new Uint8Array();
|
|
325
|
+
const input = selector.length ? concatBytes(selector, wire) : wire;
|
|
326
|
+
const frames = parseBytes(input);
|
|
327
|
+
const child = frames[0];
|
|
328
|
+
if (frames.length !== 1 || !(child.body instanceof SerderKERI)
|
|
329
|
+
|| (child.nests?.length && !nestedChildAllowed(route, child.body))) {
|
|
330
|
+
throw new Error("Multisig proposal requires one supported direct child.");
|
|
331
|
+
}
|
|
332
|
+
const serder = multisigExnBody(sender, captured, child.body, options);
|
|
333
|
+
return [serder, await collectPayload(nestedPayload(child, Vrsn_2_0), signal)];
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
/** Coordination and IPEX children may carry their own nests; KEL and reply children may not. */
|
|
337
|
+
function nestedChildAllowed(route, child) {
|
|
338
|
+
return UNREPLAYED_ROUTES.includes(route) || (route === MULTISIG_EXN_ROUTE && nestedIpexRoute(child.route ?? ""));
|
|
339
|
+
}
|
|
340
|
+
/** Proposal routes KERIpy authors as v1 `e`-embed wrappers for both v1 and v2 groups. */
|
|
341
|
+
const KERIPY_EMBED_PROPOSAL_ROUTES = [
|
|
342
|
+
MULTISIG_ICP_ROUTE,
|
|
343
|
+
MULTISIG_ROT_ROUTE,
|
|
344
|
+
MULTISIG_IXN_ROUTE,
|
|
345
|
+
MULTISIG_RPY_ROUTE,
|
|
346
|
+
];
|
|
347
|
+
/** Route handler that forwards accepted multisig EXNs to the `Multiplexor`. */
|
|
348
|
+
export class MultisigNotificationHandler {
|
|
349
|
+
/** Bind one registered route to its shared approval coordinator. */
|
|
350
|
+
constructor(resource, mux) {
|
|
351
|
+
Object.defineProperty(this, "resource", {
|
|
352
|
+
enumerable: true,
|
|
353
|
+
configurable: true,
|
|
354
|
+
writable: true,
|
|
355
|
+
value: void 0
|
|
356
|
+
});
|
|
357
|
+
Object.defineProperty(this, "mux", {
|
|
358
|
+
enumerable: true,
|
|
359
|
+
configurable: true,
|
|
360
|
+
writable: true,
|
|
361
|
+
value: void 0
|
|
362
|
+
});
|
|
363
|
+
this.resource = resource;
|
|
364
|
+
this.mux = mux;
|
|
365
|
+
}
|
|
366
|
+
/** Only supported nested multisig routes have child consumers. */
|
|
367
|
+
get acceptsNests() {
|
|
368
|
+
return nestedMultisigIlks(this.resource) !== null;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Authenticate the signed child relationship before exchange evidence is published.
|
|
372
|
+
* A child handler registered with `Multiplexor.addChildHandler` for this route and
|
|
373
|
+
* the nested child's route owns verification instead.
|
|
374
|
+
*/
|
|
375
|
+
verify(args) {
|
|
376
|
+
const delegate = this.mux.childHandlerFor(args.serder, args.nests);
|
|
377
|
+
if (delegate)
|
|
378
|
+
return delegate.verify ? delegate.verify(args) : false;
|
|
379
|
+
return args.serder.route === this.resource && this.mux.verify(args.serder, args.nests);
|
|
380
|
+
}
|
|
381
|
+
/** Borrow persisted children until approval replay and coordination indexing finish. */
|
|
382
|
+
*handle(args) {
|
|
383
|
+
const delegate = this.mux.childHandlerFor(args.serder, args.nests);
|
|
384
|
+
if (delegate) {
|
|
385
|
+
const handled = delegate.handle(args);
|
|
386
|
+
if (handled)
|
|
387
|
+
yield* handled;
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
yield* this.mux.add(args.serder, args.nests);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/** Register the KERIpy multisig route family with one exchanger. */
|
|
394
|
+
export function loadMultisigHandlers(hby, exchanger, options = {}) {
|
|
395
|
+
const mux = options.mux
|
|
396
|
+
?? new Multiplexor(hby, {
|
|
397
|
+
notifier: options.notifier ?? null,
|
|
398
|
+
exchanger,
|
|
399
|
+
registry: options.registry ?? undefined,
|
|
400
|
+
messageKevery: options.messageKevery,
|
|
401
|
+
});
|
|
402
|
+
for (const route of MULTISIG_ROUTES) {
|
|
403
|
+
exchanger.addHandler(new MultisigNotificationHandler(route, mux));
|
|
404
|
+
}
|
|
405
|
+
return mux;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* KERIpy `Multiplexor` analogue.
|
|
409
|
+
*
|
|
410
|
+
* The `meids.` and `maids.` indexes group proposals by embedded payload SAID so
|
|
411
|
+
* later approval/completion logic can find all submitters for the same payload.
|
|
412
|
+
*/
|
|
413
|
+
export class Multiplexor {
|
|
414
|
+
/** Reuse durable group membership and separate child processors without sharing parent proof state. */
|
|
415
|
+
constructor(hby, { notifier, exchanger, registry, messageKevery } = {}) {
|
|
416
|
+
Object.defineProperty(this, "hby", {
|
|
417
|
+
enumerable: true,
|
|
418
|
+
configurable: true,
|
|
419
|
+
writable: true,
|
|
420
|
+
value: void 0
|
|
421
|
+
});
|
|
422
|
+
Object.defineProperty(this, "notifier", {
|
|
423
|
+
enumerable: true,
|
|
424
|
+
configurable: true,
|
|
425
|
+
writable: true,
|
|
426
|
+
value: void 0
|
|
427
|
+
});
|
|
428
|
+
/** Approval replay owns separate processors, as in frozen KERIpy Multiplexor. */
|
|
429
|
+
Object.defineProperty(this, "kvy", {
|
|
430
|
+
enumerable: true,
|
|
431
|
+
configurable: true,
|
|
432
|
+
writable: true,
|
|
433
|
+
value: void 0
|
|
434
|
+
});
|
|
435
|
+
Object.defineProperty(this, "rvy", {
|
|
436
|
+
enumerable: true,
|
|
437
|
+
configurable: true,
|
|
438
|
+
writable: true,
|
|
439
|
+
value: void 0
|
|
440
|
+
});
|
|
441
|
+
Object.defineProperty(this, "replay", {
|
|
442
|
+
enumerable: true,
|
|
443
|
+
configurable: true,
|
|
444
|
+
writable: true,
|
|
445
|
+
value: void 0
|
|
446
|
+
});
|
|
447
|
+
Object.defineProperty(this, "exchanger", {
|
|
448
|
+
enumerable: true,
|
|
449
|
+
configurable: true,
|
|
450
|
+
writable: true,
|
|
451
|
+
value: void 0
|
|
452
|
+
});
|
|
453
|
+
Object.defineProperty(this, "registry", {
|
|
454
|
+
enumerable: true,
|
|
455
|
+
configurable: true,
|
|
456
|
+
writable: true,
|
|
457
|
+
value: void 0
|
|
458
|
+
});
|
|
459
|
+
Object.defineProperty(this, "messageKevery", {
|
|
460
|
+
enumerable: true,
|
|
461
|
+
configurable: true,
|
|
462
|
+
writable: true,
|
|
463
|
+
value: void 0
|
|
464
|
+
});
|
|
465
|
+
/** Owners sharing one registered wrapper route, keyed by wrapper and nested child route. */
|
|
466
|
+
Object.defineProperty(this, "childHandlers", {
|
|
467
|
+
enumerable: true,
|
|
468
|
+
configurable: true,
|
|
469
|
+
writable: true,
|
|
470
|
+
value: new Map()
|
|
471
|
+
});
|
|
472
|
+
this.hby = hby;
|
|
473
|
+
this.notifier = notifier ?? null;
|
|
474
|
+
this.exchanger = exchanger;
|
|
475
|
+
this.registry = registry;
|
|
476
|
+
const router = new Router();
|
|
477
|
+
this.rvy = new Revery(hby.db, { rtr: router });
|
|
478
|
+
new BasicReplyRouteHandler(this.rvy).registerReplyRoutes(router);
|
|
479
|
+
this.kvy = new Kevery(hby.db, { lax: false, local: false, rvy: this.rvy });
|
|
480
|
+
this.messageKevery = messageKevery ?? this.kvy;
|
|
481
|
+
if (this.messageKevery.db !== hby.db) {
|
|
482
|
+
throw new TypeError("Multisig message intake must share the group evidence store.");
|
|
483
|
+
}
|
|
484
|
+
this.kvy.registerReplyRoutes(router);
|
|
485
|
+
this.replay = new Exchanger(hby);
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Delegate one wrapper route's v2 children with route `child` to `handler`.
|
|
489
|
+
*
|
|
490
|
+
* KERIpy `Multiplexor.addChildHandler`: several owners share one registered
|
|
491
|
+
* `/multisig/*` Exchanger route without replacing `Exchanger.routes` entries.
|
|
492
|
+
* The delegate's `verify` and `handle` own all validation, indexing and
|
|
493
|
+
* notification for those children; the Multiplexor performs none of them.
|
|
494
|
+
* Registering a key twice is refused.
|
|
495
|
+
*/
|
|
496
|
+
addChildHandler(route, child, handler) {
|
|
497
|
+
const key = childHandlerKey(route, child);
|
|
498
|
+
if (this.childHandlers.has(key)) {
|
|
499
|
+
throw new ValidationError(`child handler for ${route} ${child} already registered`);
|
|
500
|
+
}
|
|
501
|
+
this.childHandlers.set(key, handler);
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Release a finite owner's delegation. A TypeScript runtime can outlive one
|
|
505
|
+
* command phase, unlike KERIpy's per-process CLI owners; the shared route stays.
|
|
506
|
+
*/
|
|
507
|
+
removeChildHandler(route, child, handler) {
|
|
508
|
+
const key = childHandlerKey(route, child);
|
|
509
|
+
if (this.childHandlers.get(key) === handler)
|
|
510
|
+
this.childHandlers.delete(key);
|
|
511
|
+
}
|
|
512
|
+
/** Return the delegate for this v2 wrapper's single child route, if any. */
|
|
513
|
+
childHandlerFor(serder, nests = []) {
|
|
514
|
+
if (!this.childHandlers.size || serder.pvrsn.major !== 2 || nests.length !== 1)
|
|
515
|
+
return null;
|
|
516
|
+
const child = nests[0].body;
|
|
517
|
+
const route = child instanceof SerderKERI ? child.route : undefined;
|
|
518
|
+
return route ? this.childHandlers.get(childHandlerKey(serder.route ?? "", route)) ?? null : null;
|
|
519
|
+
}
|
|
520
|
+
/** V2 child replay borrows the caller's configured IPEX, registry, reply and KRAM owners. */
|
|
521
|
+
v2IpexOwners(child) {
|
|
522
|
+
const kvy = this.messageKevery, rvy = kvy.rvy, exc = this.exchanger;
|
|
523
|
+
const handler = exc?.handlerFor(child);
|
|
524
|
+
return !!this.registry && this.registry.db === this.hby.db && exc?.hby === this.hby
|
|
525
|
+
&& rvy?.db === this.hby.db && kvy.kramer?.db === this.hby.db
|
|
526
|
+
&& exc.cues === kvy.cues && rvy.cues === kvy.cues
|
|
527
|
+
&& handler instanceof IpexV2Handler && handler.hby === this.hby
|
|
528
|
+
&& handler.registry === this.registry.store;
|
|
529
|
+
}
|
|
530
|
+
/** Index an authenticated proposal; child acceptance still requires local approval and its own proofs. */
|
|
531
|
+
*add(serder, nests = []) {
|
|
532
|
+
const inspection = this.inspect(serder, nests);
|
|
533
|
+
if (!inspection.ok) {
|
|
534
|
+
return {
|
|
535
|
+
kind: "reject",
|
|
536
|
+
said: inspection.said,
|
|
537
|
+
reason: inspection.reason,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
const { said, embeddedSaid, route, sender } = inspection;
|
|
541
|
+
const v2Ipex = serder.pvrsn.major === 2 && route === MULTISIG_EXN_ROUTE;
|
|
542
|
+
if (v2Ipex) {
|
|
543
|
+
if (!this.exchanger?.verifyAccepted(said, route)) {
|
|
544
|
+
return { kind: "reject", said, reason: "V2 IPEX approval requires an authenticated wrapper." };
|
|
545
|
+
}
|
|
546
|
+
// The authenticated local wrapper carries this member's actual verified child contribution.
|
|
547
|
+
if (this.isLocalHab(sender))
|
|
548
|
+
yield* this.processApproved(nests);
|
|
549
|
+
}
|
|
550
|
+
const { existing, submitters } = this.hby.db.env.transactionSync(() => {
|
|
551
|
+
const indexed = this.hby.db.meids.get([embeddedSaid]);
|
|
552
|
+
const existing = isV2RegistryRoute(route) || v2Ipex
|
|
553
|
+
? indexed.filter(diger => {
|
|
554
|
+
const retained = this.hby.db.exns.get([diger.qb64]);
|
|
555
|
+
return retained && (v2Ipex
|
|
556
|
+
? retained.pvrsn.major === 2 && retained.route === route
|
|
557
|
+
&& isRecord(retained.sad?.a) && isRecord(serder.sad?.a)
|
|
558
|
+
&& retained.sad.a.gid === serder.sad.a.gid && retained.sad.a.exn === embeddedSaid
|
|
559
|
+
: sameRegistryProposal(retained, serder))
|
|
560
|
+
&& this.exchanger?.verifyAccepted(diger.qb64, route);
|
|
561
|
+
})
|
|
562
|
+
: indexed;
|
|
563
|
+
const submitters = isV2RegistryRoute(route) || v2Ipex
|
|
564
|
+
? existing.map(diger => new Prefixer({ qb64: this.hby.db.exns.get([diger.qb64]).pre }))
|
|
565
|
+
: this.hby.db.maids.get([embeddedSaid]);
|
|
566
|
+
// Approval is the authenticated wrapper, not completion of its asynchronous child replay.
|
|
567
|
+
this.hby.db.meids.add([embeddedSaid], new Saider({ qb64: said }));
|
|
568
|
+
this.hby.db.maids.add([embeddedSaid], new Prefixer({ qb64: sender }));
|
|
569
|
+
return { existing, submitters };
|
|
570
|
+
});
|
|
571
|
+
const firstSubmission = existing.length === 0;
|
|
572
|
+
const unreplayed = UNREPLAYED_ROUTES.includes(route);
|
|
573
|
+
if (!this.isLocalHab(sender)) {
|
|
574
|
+
if (!unreplayed && submitters.some((submitter) => this.isLocalHab(submitter.qb64))) {
|
|
575
|
+
// The parent is durable, but approval never lends its signatures to the child.
|
|
576
|
+
if (serder.pvrsn.major === 1)
|
|
577
|
+
yield* this.processLegacyApproved(serder);
|
|
578
|
+
else
|
|
579
|
+
yield* this.processApproved(nests);
|
|
580
|
+
}
|
|
581
|
+
else if (serder.pvrsn.major === 2 || firstSubmission) {
|
|
582
|
+
// Legacy approval polling consumes its first notice; repeated v1 notices would re-propose it.
|
|
583
|
+
this.notifier?.add(firstSubmission ? { r: route, d: said } : { r: route, d: said, e: embeddedSaid });
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
else if (!unreplayed && submitters.some((submitter) => !this.isLocalHab(submitter.qb64))) {
|
|
587
|
+
// Remote evidence can precede approval. Replay one durable wrapper at a time after reopen.
|
|
588
|
+
for (const prior of existing)
|
|
589
|
+
yield* call(() => this.replayApproved(prior.qb64));
|
|
590
|
+
}
|
|
591
|
+
const duplicate = existing.some((saider) => saider.qb64 === said);
|
|
592
|
+
return {
|
|
593
|
+
kind: duplicate ? "duplicate" : "accept",
|
|
594
|
+
said,
|
|
595
|
+
embeddedSaid,
|
|
596
|
+
route,
|
|
597
|
+
sender,
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
/** Return true when this wrapper can be accepted for local group work. */
|
|
601
|
+
verify(serder, nests = []) {
|
|
602
|
+
return this.inspect(serder, nests).ok;
|
|
603
|
+
}
|
|
604
|
+
/** Process only the approved direct child; arbitrary descendants remain guarded. */
|
|
605
|
+
*processApproved(nests) {
|
|
606
|
+
for (const child of nests) {
|
|
607
|
+
const v2Ipex = child.body instanceof SerderKERI && child.body.pvrsn.major === 2
|
|
608
|
+
&& child.body.route?.startsWith("/ipex/");
|
|
609
|
+
if (v2Ipex && !this.v2IpexOwners(child.body)) {
|
|
610
|
+
throw new Error("V2 IPEX replay owners are unavailable.");
|
|
611
|
+
}
|
|
612
|
+
yield* dispatchEnvelope(envelopeFromFrame(child, true), v2Ipex ? this.messageKevery.rvy : this.rvy, v2Ipex ? this.messageKevery : this.kvy, this.exchanger, undefined, undefined, undefined, this.messageKevery, this.registry);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
/** Replay v1 children with their own stored proofs and signed attachment genus, as KERIpy does. */
|
|
616
|
+
*processLegacyApproved(wrapper) {
|
|
617
|
+
const embeds = multisigEmbeddedSection(wrapper.ked);
|
|
618
|
+
for (const label of Object.keys(embeds ?? {})) {
|
|
619
|
+
const sad = embeds?.[label];
|
|
620
|
+
if (!isRecord(sad)) {
|
|
621
|
+
continue;
|
|
622
|
+
}
|
|
623
|
+
const event = new Serder({ sad });
|
|
624
|
+
const { attachment, genus } = multisigChildEvidence(this.hby, wrapper, label, event);
|
|
625
|
+
for (const frame of parseBytes(concatBytes(Counter.makeGVC(genus), event.raw, attachment))) {
|
|
626
|
+
yield* dispatchEnvelope(envelopeFromFrame(frame, true), this.rvy, this.kvy, this.exchanger, undefined, undefined, undefined, this.messageKevery, this.registry);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
/** Reopen stored evidence and revalidate it before approved protocol processing. */
|
|
631
|
+
replayApproved(said) {
|
|
632
|
+
// deno-lint-ignore no-this-alias -- Generator callbacks have no lexical this.
|
|
633
|
+
const self = this;
|
|
634
|
+
return call(function* () {
|
|
635
|
+
const controller = new AbortController();
|
|
636
|
+
const signal = controller.signal;
|
|
637
|
+
try {
|
|
638
|
+
signal.throwIfAborted();
|
|
639
|
+
const frames = parse(self.replay.replay(said, signal));
|
|
640
|
+
let pending;
|
|
641
|
+
// The earlier resource joins the read after processing children stop.
|
|
642
|
+
yield* ensure(function* () {
|
|
643
|
+
try {
|
|
644
|
+
if (pending) {
|
|
645
|
+
try {
|
|
646
|
+
yield* call(() => pending);
|
|
647
|
+
}
|
|
648
|
+
catch (error) {
|
|
649
|
+
rethrowCleanupFailure(error, signal);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
finally {
|
|
654
|
+
yield* call(() => frames.return());
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
while (true) {
|
|
658
|
+
signal.throwIfAborted();
|
|
659
|
+
pending = frames.next();
|
|
660
|
+
let result;
|
|
661
|
+
try {
|
|
662
|
+
result = yield* call(() => pending);
|
|
663
|
+
}
|
|
664
|
+
catch (error) {
|
|
665
|
+
pending = undefined;
|
|
666
|
+
throw error;
|
|
667
|
+
}
|
|
668
|
+
pending = undefined;
|
|
669
|
+
signal.throwIfAborted();
|
|
670
|
+
if (result.done)
|
|
671
|
+
break;
|
|
672
|
+
const frame = result.value;
|
|
673
|
+
const serder = frame.body;
|
|
674
|
+
if (!self.verify(serder, frame.nests))
|
|
675
|
+
throw new Error("Stored multisig proposal failed revalidation.");
|
|
676
|
+
if (serder.pvrsn.major === 1)
|
|
677
|
+
yield* self.processLegacyApproved(serder);
|
|
678
|
+
else
|
|
679
|
+
yield* self.processApproved(frame.nests ?? []);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
finally {
|
|
683
|
+
controller.abort();
|
|
684
|
+
}
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
/** Check route, child body commitment, and membership without mutating durable state. */
|
|
688
|
+
inspect(serder, nests) {
|
|
689
|
+
const said = serder.said ?? "<unknown>";
|
|
690
|
+
const ked = serder.ked;
|
|
691
|
+
if (!ked) {
|
|
692
|
+
return { ok: false, said, reason: "Missing decoded exchange body." };
|
|
693
|
+
}
|
|
694
|
+
const sender = serder.pre ?? "";
|
|
695
|
+
const route = serder.route ?? "";
|
|
696
|
+
let embeddedSaid;
|
|
697
|
+
if (serder.pvrsn.major === 1) {
|
|
698
|
+
const commitment = multisigPayloadSaid(serder);
|
|
699
|
+
if (!commitment || nests.length) {
|
|
700
|
+
return { ok: false, said, reason: "Missing multisig embedded SAID or unexpected v1 nesting." };
|
|
701
|
+
}
|
|
702
|
+
if (childGenusHint(ked.a) === null) {
|
|
703
|
+
return { ok: false, said, reason: "Invalid multisig child attachment genus." };
|
|
704
|
+
}
|
|
705
|
+
embeddedSaid = commitment;
|
|
706
|
+
}
|
|
707
|
+
else if (isV2RegistryRoute(route)) {
|
|
708
|
+
const children = acdcV2RegistryProposal(serder, nests, this.registry?.store ?? null);
|
|
709
|
+
if (!children)
|
|
710
|
+
return { ok: false, said, reason: "Invalid ACDC v2 registry/anchor proposal." };
|
|
711
|
+
if (!groupSigningMembers(this.hby, children.anchor.pre).includes(sender)) {
|
|
712
|
+
return { ok: false, said, reason: "Registry proposal sender is not a current group signing member." };
|
|
713
|
+
}
|
|
714
|
+
embeddedSaid = children.anchor.said;
|
|
715
|
+
}
|
|
716
|
+
else {
|
|
717
|
+
const allowed = nestedMultisigIlks(route);
|
|
718
|
+
if (!allowed || nests.length !== 1) {
|
|
719
|
+
return { ok: false, said, reason: "Unsupported nested multisig route or child count." };
|
|
720
|
+
}
|
|
721
|
+
const child = nests[0];
|
|
722
|
+
const signed = multisigPayloadSaid(serder);
|
|
723
|
+
if (typeof signed !== "string" || !child.body.said || !allowed.includes(child.body.ilk ?? "")
|
|
724
|
+
|| !(child.body instanceof SerderKERI)
|
|
725
|
+
|| (route !== MULTISIG_EXN_ROUTE && !UNREPLAYED_ROUTES.includes(route) && child.nests?.length)) {
|
|
726
|
+
return { ok: false, said, reason: "Invalid multisig child kind, descendants, or signed SAID." };
|
|
727
|
+
}
|
|
728
|
+
try {
|
|
729
|
+
if (!child.body.verify() || !child.body.compare(signed)) {
|
|
730
|
+
return { ok: false, said, reason: "Invalid multisig child digest." };
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
catch {
|
|
734
|
+
return { ok: false, said, reason: "Invalid multisig child commitment." };
|
|
735
|
+
}
|
|
736
|
+
if (route === MULTISIG_EXN_ROUTE) {
|
|
737
|
+
const attrs = serder.sad?.a;
|
|
738
|
+
if (serder.ilk !== "exn" || serder.pvrsn.minor !== 0
|
|
739
|
+
|| !isRecord(attrs) || Object.keys(attrs).sort().join(",") !== "exn,gid"
|
|
740
|
+
|| (child.nests?.length && !nestedIpexRoute(child.body.route ?? ""))
|
|
741
|
+
|| !v2IpexChild(child.body, attrs.gid) || !this.v2IpexOwners(child.body)
|
|
742
|
+
|| !groupSigningMembers(this.hby, child.body.pre).includes(sender)) {
|
|
743
|
+
return { ok: false, said, reason: "Invalid v2 IPEX group, member, route or replay owners." };
|
|
744
|
+
}
|
|
745
|
+
if (this.isLocalHab(sender)
|
|
746
|
+
&& !localIpexContribution(this.hby.db, sender, child.body, envelopeFromFrame(child).tsgs)) {
|
|
747
|
+
return { ok: false, said, reason: "Local IPEX approval has no verified member contribution." };
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
if (UNREPLAYED_ROUTES.includes(route)) {
|
|
751
|
+
const attrs = isRecord(serder.sad?.a) ? serder.sad.a : {};
|
|
752
|
+
const coordination = v2CoordinationChild(route, child.body, attrs.gid);
|
|
753
|
+
if (coordination)
|
|
754
|
+
return { ok: false, said, reason: coordination };
|
|
755
|
+
if (typeof attrs.gid !== "string" || !this.isLocalHab(attrs.gid)
|
|
756
|
+
|| !groupSigningMembers(this.hby, attrs.gid).includes(sender)) {
|
|
757
|
+
return { ok: false, said, reason: "Proposal sender is not a group signing member." };
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
embeddedSaid = signed;
|
|
761
|
+
}
|
|
762
|
+
const request = multisigMembership(route, ked.a);
|
|
763
|
+
const membership = request.kind === "reject" ? request.reason : this.verifyMembership(request);
|
|
764
|
+
if (membership) {
|
|
765
|
+
return { ok: false, said, reason: membership };
|
|
766
|
+
}
|
|
767
|
+
return {
|
|
768
|
+
ok: true,
|
|
769
|
+
said,
|
|
770
|
+
embeddedSaid,
|
|
771
|
+
route,
|
|
772
|
+
sender,
|
|
773
|
+
};
|
|
774
|
+
}
|
|
775
|
+
/** Return all stored wrapper EXNs for one embedded payload SAID. */
|
|
776
|
+
get(embeddedSaid) {
|
|
777
|
+
const exns = [];
|
|
778
|
+
for (const saider of this.hby.db.meids.get([embeddedSaid])) {
|
|
779
|
+
const exn = this.hby.db.exns.get([saider.qb64]);
|
|
780
|
+
if (!exn?.ked) {
|
|
781
|
+
continue;
|
|
782
|
+
}
|
|
783
|
+
exns.push({
|
|
784
|
+
exn: exn.ked,
|
|
785
|
+
paths: pathedAttachmentsByLabel(this.hby, saider.qb64),
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
return exns;
|
|
789
|
+
}
|
|
790
|
+
/** Apply local habitat membership to an already decoded request. */
|
|
791
|
+
verifyMembership(request) {
|
|
792
|
+
if (request.kind === "participate") {
|
|
793
|
+
return this.isLocalHab(request.group)
|
|
794
|
+
? null
|
|
795
|
+
: `Invalid request to participate in group; not a local member of gid=${request.group}.`;
|
|
796
|
+
}
|
|
797
|
+
if (request.kind === "rotate" && this.isLocalHab(request.group)) {
|
|
798
|
+
return null;
|
|
799
|
+
}
|
|
800
|
+
return request.members.some((member) => this.isLocalHab(member))
|
|
801
|
+
? null
|
|
802
|
+
: `Invalid request to join group; no local member in mids=${request.members.join(",")}.`;
|
|
803
|
+
}
|
|
804
|
+
isLocalHab(pre) {
|
|
805
|
+
return pre.length > 0 && this.hby.habs.has(pre);
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
/** Extract the embedded business EXN SAD from a `/multisig/exn` wrapper. */
|
|
809
|
+
export function embeddedBusinessExnSAD(serder) {
|
|
810
|
+
const embed = serder.ked ? multisigEmbeddedSection(serder.ked) : null;
|
|
811
|
+
const exn = embed && isRecord(embed["exn"]) ? embed["exn"] : null;
|
|
812
|
+
return exn ? { ...exn } : null;
|
|
813
|
+
}
|
|
814
|
+
/** Read one stored v1 child at the wire boundary, without authenticating its independent proof. */
|
|
815
|
+
export function multisigChild(hby, wrapper, label) {
|
|
816
|
+
const sad = multisigEmbeddedSection(wrapper.ked ?? {})?.[label];
|
|
817
|
+
if (!isRecord(sad)) {
|
|
818
|
+
return null;
|
|
819
|
+
}
|
|
820
|
+
const event = new SerderKERI({ sad });
|
|
821
|
+
return { event, ...multisigChildEvidence(hby, wrapper, label, event) };
|
|
822
|
+
}
|
|
823
|
+
/** Resolve the stored proof and signed genus independently of the child protocol. */
|
|
824
|
+
export function multisigChildEvidence(hby, wrapper, label, child) {
|
|
825
|
+
const attachment = multisigPathedAttachment(hby, wrapper.said, label);
|
|
826
|
+
const hint = attachment.length ? childGenusHint(wrapper.ked?.a) : undefined;
|
|
827
|
+
return { attachment, genus: child.gvrsn ?? hint ?? child.pvrsn };
|
|
828
|
+
}
|
|
829
|
+
/** Extract raw attachment bytes for one label from a stored multisig wrapper. */
|
|
830
|
+
export function multisigPathedAttachment(hby, wrapperSaid, label) {
|
|
831
|
+
const path = `/e/${label}`;
|
|
832
|
+
for (const text of hby.db.epath.get([wrapperSaid])) {
|
|
833
|
+
const atc = pathedAttachmentForPath(textEncoder.encode(text), path);
|
|
834
|
+
if (atc) {
|
|
835
|
+
return atc;
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
return new Uint8Array();
|
|
839
|
+
}
|
|
840
|
+
function pathedAttachmentsByLabel(hby, wrapperSaid) {
|
|
841
|
+
const paths = {};
|
|
842
|
+
for (const text of hby.db.epath.get([wrapperSaid])) {
|
|
843
|
+
const raw = textEncoder.encode(text);
|
|
844
|
+
const counter = new Counter({ qb64b: raw });
|
|
845
|
+
const pather = parsePather(raw.slice(counter.fullSize), "txt");
|
|
846
|
+
const label = pather.path.split("/").at(-1);
|
|
847
|
+
if (label) {
|
|
848
|
+
paths[label] = textDecoder.decode(raw.slice(counter.fullSize + pather.fullSize));
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
return paths;
|
|
852
|
+
}
|
|
853
|
+
function pathedAttachmentForPath(raw, path) {
|
|
854
|
+
if (raw.length === 0) {
|
|
855
|
+
return null;
|
|
856
|
+
}
|
|
857
|
+
const counter = new Counter({ qb64b: raw });
|
|
858
|
+
const offset = counter.fullSize;
|
|
859
|
+
const pather = parsePather(raw.slice(offset), "txt");
|
|
860
|
+
if (pather.path !== path) {
|
|
861
|
+
return null;
|
|
862
|
+
}
|
|
863
|
+
return raw.slice(offset + pather.fullSize);
|
|
864
|
+
}
|
|
865
|
+
function exchangeOptions(member, options) {
|
|
866
|
+
return {
|
|
867
|
+
sender: member.pre,
|
|
868
|
+
stamp: options.stamp,
|
|
869
|
+
date: options.date,
|
|
870
|
+
version: options.version,
|
|
871
|
+
pvrsn: options.pvrsn,
|
|
872
|
+
gvrsn: options.gvrsn,
|
|
873
|
+
kind: options.kind,
|
|
874
|
+
};
|
|
875
|
+
}
|
|
876
|
+
/** Decode the signed legacy child-genus hint before it can select attachment parsing. */
|
|
877
|
+
function childGenusHint(attrs) {
|
|
878
|
+
if (!isRecord(attrs) || attrs.cgvrsn === undefined)
|
|
879
|
+
return undefined;
|
|
880
|
+
const hint = attrs.cgvrsn;
|
|
881
|
+
if (!Array.isArray(hint) || hint.length !== 2
|
|
882
|
+
|| (hint[0] !== 1 && hint[0] !== 2)
|
|
883
|
+
|| typeof hint[1] !== "number" || !Number.isInteger(hint[1]) || hint[1] < 0 || hint[1] > 4095) {
|
|
884
|
+
return null;
|
|
885
|
+
}
|
|
886
|
+
return { major: hint[0], minor: hint[1] };
|
|
887
|
+
}
|
|
888
|
+
function payloadSection(ked) {
|
|
889
|
+
return isRecord(ked.a) ? ked.a : {};
|
|
890
|
+
}
|
|
891
|
+
/** Decode only membership fields; handler registration owns supported route selection. */
|
|
892
|
+
function multisigMembership(route, value) {
|
|
893
|
+
const attrs = isRecord(value) ? value : {};
|
|
894
|
+
if (route === MULTISIG_ICP_ROUTE) {
|
|
895
|
+
return { kind: "join", members: memberPrefixes(attrs.smids, attrs.rmids) };
|
|
896
|
+
}
|
|
897
|
+
// KERIpy also applies group membership to the whole /multisig/* family.
|
|
898
|
+
if (!route.startsWith("/multisig/")) {
|
|
899
|
+
return { kind: "reject", reason: `Invalid route ${route} for multisig exchange.` };
|
|
900
|
+
}
|
|
901
|
+
if (typeof attrs.gid !== "string" || !attrs.gid) {
|
|
902
|
+
return { kind: "reject", reason: "Missing multisig group identifier." };
|
|
903
|
+
}
|
|
904
|
+
return route === MULTISIG_ROT_ROUTE
|
|
905
|
+
? { kind: "rotate", group: attrs.gid, members: memberPrefixes(attrs.smids, attrs.rmids) }
|
|
906
|
+
: { kind: "participate", group: attrs.gid };
|
|
907
|
+
}
|
|
908
|
+
/** Preserve the existing optional-list and non-string filtering at the wire boundary. */
|
|
909
|
+
function memberPrefixes(smids, rmids) {
|
|
910
|
+
const strings = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
911
|
+
return [...strings(smids), ...strings(rmids)];
|
|
912
|
+
}
|
|
913
|
+
function childHandlerKey(route, child) {
|
|
914
|
+
return `${route}\u0000${child}`;
|
|
915
|
+
}
|
|
916
|
+
function groupPrefix(group) {
|
|
917
|
+
return typeof group === "string" ? group : group.pre;
|
|
918
|
+
}
|
|
919
|
+
function requireString(value, label) {
|
|
920
|
+
if (!value) {
|
|
921
|
+
throw new Error(`Missing ${label}.`);
|
|
922
|
+
}
|
|
923
|
+
return value;
|
|
924
|
+
}
|
|
925
|
+
function rawMessage(message) {
|
|
926
|
+
return message instanceof Uint8Array ? message : message.raw;
|
|
927
|
+
}
|
|
928
|
+
function isRecord(value) {
|
|
929
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
930
|
+
}
|
|
931
|
+
const textEncoder = new TextEncoder();
|
|
932
|
+
const textDecoder = new TextDecoder();
|