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