@cello-protocol/daemon 0.0.227 → 0.0.228
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/dist/agent-admin-handlers.d.ts +56 -0
- package/dist/agent-admin-handlers.d.ts.map +1 -0
- package/dist/agent-admin-handlers.js +73 -0
- package/dist/agent-admin-handlers.js.map +1 -0
- package/dist/agent-handlers.d.ts +72 -0
- package/dist/agent-handlers.d.ts.map +1 -0
- package/dist/agent-handlers.js +604 -0
- package/dist/agent-handlers.js.map +1 -0
- package/dist/agent-id-migration.d.ts +70 -0
- package/dist/agent-id-migration.d.ts.map +1 -0
- package/dist/agent-id-migration.js +468 -0
- package/dist/agent-id-migration.js.map +1 -0
- package/dist/agent-loader.d.ts +37 -0
- package/dist/agent-loader.d.ts.map +1 -0
- package/dist/agent-loader.js +37 -0
- package/dist/agent-loader.js.map +1 -0
- package/dist/agent-selection-root.d.ts +29 -0
- package/dist/agent-selection-root.d.ts.map +1 -0
- package/dist/agent-selection-root.js +126 -0
- package/dist/agent-selection-root.js.map +1 -0
- package/dist/agent-selection.d.ts +73 -0
- package/dist/agent-selection.d.ts.map +1 -0
- package/dist/agent-selection.js +80 -0
- package/dist/agent-selection.js.map +1 -0
- package/dist/agent-settings-keys.d.ts +52 -0
- package/dist/agent-settings-keys.d.ts.map +1 -0
- package/dist/agent-settings-keys.js +114 -0
- package/dist/agent-settings-keys.js.map +1 -0
- package/dist/agent-state.d.ts +67 -0
- package/dist/agent-state.d.ts.map +1 -0
- package/dist/agent-state.js +66 -0
- package/dist/agent-state.js.map +1 -0
- package/dist/assignment-verify.d.ts +90 -0
- package/dist/assignment-verify.d.ts.map +1 -0
- package/dist/assignment-verify.js +301 -0
- package/dist/assignment-verify.js.map +1 -0
- package/dist/attendance-wiring.d.ts +23 -0
- package/dist/attendance-wiring.d.ts.map +1 -0
- package/dist/attendance-wiring.js +248 -0
- package/dist/attendance-wiring.js.map +1 -0
- package/dist/attestation-body.d.ts +47 -0
- package/dist/attestation-body.d.ts.map +1 -0
- package/dist/attestation-body.js +71 -0
- package/dist/attestation-body.js.map +1 -0
- package/dist/authorship-verification.d.ts +91 -0
- package/dist/authorship-verification.d.ts.map +1 -0
- package/dist/authorship-verification.js +532 -0
- package/dist/authorship-verification.js.map +1 -0
- package/dist/away-detection.d.ts +139 -0
- package/dist/away-detection.d.ts.map +1 -0
- package/dist/away-detection.js +186 -0
- package/dist/away-detection.js.map +1 -0
- package/dist/away-inbox-oneshot.d.ts +40 -0
- package/dist/away-inbox-oneshot.d.ts.map +1 -0
- package/dist/away-inbox-oneshot.js +311 -0
- package/dist/away-inbox-oneshot.js.map +1 -0
- package/dist/backup-restore-handlers.d.ts +10 -0
- package/dist/backup-restore-handlers.d.ts.map +1 -0
- package/dist/backup-restore-handlers.js +82 -0
- package/dist/backup-restore-handlers.js.map +1 -0
- package/dist/backup-restore.d.ts +102 -0
- package/dist/backup-restore.d.ts.map +1 -0
- package/dist/backup-restore.js +341 -0
- package/dist/backup-restore.js.map +1 -0
- package/dist/bin/cello-daemon.d.ts +13 -0
- package/dist/bin/cello-daemon.d.ts.map +1 -0
- package/dist/bin/cello-daemon.js.map +1 -0
- package/dist/boot-agents.d.ts +64 -0
- package/dist/boot-agents.d.ts.map +1 -0
- package/dist/boot-agents.js +241 -0
- package/dist/boot-agents.js.map +1 -0
- package/dist/boot-connection-state.d.ts +38 -0
- package/dist/boot-connection-state.d.ts.map +1 -0
- package/dist/boot-connection-state.js +95 -0
- package/dist/boot-connection-state.js.map +1 -0
- package/dist/boot-core.d.ts +36 -0
- package/dist/boot-core.d.ts.map +1 -0
- package/dist/boot-core.js +293 -0
- package/dist/boot-core.js.map +1 -0
- package/dist/boot-parked-content.d.ts +34 -0
- package/dist/boot-parked-content.d.ts.map +1 -0
- package/dist/boot-parked-content.js +528 -0
- package/dist/boot-parked-content.js.map +1 -0
- package/dist/boot-sweeps.d.ts +22 -0
- package/dist/boot-sweeps.d.ts.map +1 -0
- package/dist/boot-sweeps.js +51 -0
- package/dist/boot-sweeps.js.map +1 -0
- package/dist/bundled-consortium-manifest.d.ts +47 -0
- package/dist/bundled-consortium-manifest.d.ts.map +1 -0
- package/dist/bundled-consortium-manifest.js +116 -0
- package/dist/bundled-consortium-manifest.js.map +1 -0
- package/dist/cbor-blob-migration.d.ts +8 -0
- package/dist/cbor-blob-migration.d.ts.map +1 -0
- package/dist/cbor-blob-migration.js +116 -0
- package/dist/cbor-blob-migration.js.map +1 -0
- package/dist/challenge-verifier.d.ts +12 -0
- package/dist/challenge-verifier.d.ts.map +1 -0
- package/dist/challenge-verifier.js +11 -0
- package/dist/challenge-verifier.js.map +1 -0
- package/dist/channel-log-store.d.ts +80 -0
- package/dist/channel-log-store.d.ts.map +1 -0
- package/dist/channel-log-store.js +290 -0
- package/dist/channel-log-store.js.map +1 -0
- package/dist/close-commitment.d.ts +67 -0
- package/dist/close-commitment.d.ts.map +1 -0
- package/dist/close-commitment.js +78 -0
- package/dist/close-commitment.js.map +1 -0
- package/dist/close-session-handler.d.ts +94 -0
- package/dist/close-session-handler.d.ts.map +1 -0
- package/dist/close-session-handler.js +1418 -0
- package/dist/close-session-handler.js.map +1 -0
- package/dist/co-attendance.d.ts +29 -0
- package/dist/co-attendance.d.ts.map +1 -0
- package/dist/co-attendance.js +32 -0
- package/dist/co-attendance.js.map +1 -0
- package/dist/column-birth.d.ts +40 -0
- package/dist/column-birth.d.ts.map +1 -0
- package/dist/column-birth.js +61 -0
- package/dist/column-birth.js.map +1 -0
- package/dist/connect-or-start.d.ts +25 -0
- package/dist/connect-or-start.d.ts.map +1 -0
- package/dist/connect-or-start.js +175 -0
- package/dist/connect-or-start.js.map +1 -0
- package/dist/connection-agents.d.ts +16 -0
- package/dist/connection-agents.d.ts.map +1 -0
- package/dist/connection-agents.js +68 -0
- package/dist/connection-agents.js.map +1 -0
- package/dist/consent-migration.d.ts +49 -0
- package/dist/consent-migration.d.ts.map +1 -0
- package/dist/consent-migration.js +128 -0
- package/dist/consent-migration.js.map +1 -0
- package/dist/consortium-bootstrap.d.ts +138 -0
- package/dist/consortium-bootstrap.d.ts.map +1 -0
- package/dist/consortium-bootstrap.js +339 -0
- package/dist/consortium-bootstrap.js.map +1 -0
- package/dist/consortium-fingerprint.d.ts +115 -0
- package/dist/consortium-fingerprint.d.ts.map +1 -0
- package/dist/consortium-fingerprint.js +175 -0
- package/dist/consortium-fingerprint.js.map +1 -0
- package/dist/contact-handlers.d.ts +59 -0
- package/dist/contact-handlers.d.ts.map +1 -0
- package/dist/contact-handlers.js +343 -0
- package/dist/contact-handlers.js.map +1 -0
- package/dist/contact-pubkey-case.d.ts +65 -0
- package/dist/contact-pubkey-case.d.ts.map +1 -0
- package/dist/contact-pubkey-case.js +136 -0
- package/dist/contact-pubkey-case.js.map +1 -0
- package/dist/contacts-tier-migration.d.ts +90 -0
- package/dist/contacts-tier-migration.d.ts.map +1 -0
- package/dist/contacts-tier-migration.js +150 -0
- package/dist/contacts-tier-migration.js.map +1 -0
- package/dist/content-encryption-status.d.ts +111 -0
- package/dist/content-encryption-status.d.ts.map +1 -0
- package/dist/content-encryption-status.js +158 -0
- package/dist/content-encryption-status.js.map +1 -0
- package/dist/content-park-client.d.ts +90 -0
- package/dist/content-park-client.d.ts.map +1 -0
- package/dist/content-park-client.js +362 -0
- package/dist/content-park-client.js.map +1 -0
- package/dist/content-park.d.ts +52 -0
- package/dist/content-park.d.ts.map +1 -0
- package/dist/content-park.js +1309 -0
- package/dist/content-park.js.map +1 -0
- package/dist/cross-node-negotiation.d.ts +44 -0
- package/dist/cross-node-negotiation.d.ts.map +1 -0
- package/dist/cross-node-negotiation.js +34 -0
- package/dist/cross-node-negotiation.js.map +1 -0
- package/dist/daemon-handle.d.ts +57 -0
- package/dist/daemon-handle.d.ts.map +1 -0
- package/dist/daemon-handle.js +2 -0
- package/dist/daemon-handle.js.map +1 -0
- package/dist/daemon-status-report.d.ts +50 -0
- package/dist/daemon-status-report.d.ts.map +1 -0
- package/dist/daemon-status-report.js +81 -0
- package/dist/daemon-status-report.js.map +1 -0
- package/dist/daemon.d.ts +45 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +1177 -0
- package/dist/daemon.js.map +1 -0
- package/dist/db-identity-store.d.ts +159 -0
- package/dist/db-identity-store.d.ts.map +1 -0
- package/dist/db-identity-store.js +502 -0
- package/dist/db-identity-store.js.map +1 -0
- package/dist/delivery-open-registry.d.ts +92 -0
- package/dist/delivery-open-registry.d.ts.map +1 -0
- package/dist/delivery-open-registry.js +121 -0
- package/dist/delivery-open-registry.js.map +1 -0
- package/dist/delivery-session-suspects.d.ts +56 -0
- package/dist/delivery-session-suspects.d.ts.map +1 -0
- package/dist/delivery-session-suspects.js +94 -0
- package/dist/delivery-session-suspects.js.map +1 -0
- package/dist/directory-auth-posture.d.ts +87 -0
- package/dist/directory-auth-posture.d.ts.map +1 -0
- package/dist/directory-auth-posture.js +134 -0
- package/dist/directory-auth-posture.js.map +1 -0
- package/dist/directory-bootstrap.d.ts +310 -0
- package/dist/directory-bootstrap.d.ts.map +1 -0
- package/dist/directory-bootstrap.js +557 -0
- package/dist/directory-bootstrap.js.map +1 -0
- package/dist/directory-connect.d.ts +27 -0
- package/dist/directory-connect.d.ts.map +1 -0
- package/dist/directory-connect.js +106 -0
- package/dist/directory-connect.js.map +1 -0
- package/dist/disconnect-cleanup.d.ts +51 -0
- package/dist/disconnect-cleanup.d.ts.map +1 -0
- package/dist/disconnect-cleanup.js +72 -0
- package/dist/disconnect-cleanup.js.map +1 -0
- package/dist/document-amendment-store.d.ts +120 -0
- package/dist/document-amendment-store.d.ts.map +1 -0
- package/dist/document-amendment-store.js +266 -0
- package/dist/document-amendment-store.js.map +1 -0
- package/dist/document-delivery-transport.d.ts +168 -0
- package/dist/document-delivery-transport.d.ts.map +1 -0
- package/dist/document-delivery-transport.js +206 -0
- package/dist/document-delivery-transport.js.map +1 -0
- package/dist/document-engine.d.ts +134 -0
- package/dist/document-engine.d.ts.map +1 -0
- package/dist/document-engine.js +282 -0
- package/dist/document-engine.js.map +1 -0
- package/dist/document-flag.d.ts +58 -0
- package/dist/document-flag.d.ts.map +1 -0
- package/dist/document-flag.js +70 -0
- package/dist/document-flag.js.map +1 -0
- package/dist/document-frame-router.d.ts +245 -0
- package/dist/document-frame-router.d.ts.map +1 -0
- package/dist/document-frame-router.js +397 -0
- package/dist/document-frame-router.js.map +1 -0
- package/dist/document-gate-wiring.d.ts +61 -0
- package/dist/document-gate-wiring.d.ts.map +1 -0
- package/dist/document-gate-wiring.js +125 -0
- package/dist/document-gate-wiring.js.map +1 -0
- package/dist/document-gate.d.ts +149 -0
- package/dist/document-gate.d.ts.map +1 -0
- package/dist/document-gate.js +509 -0
- package/dist/document-gate.js.map +1 -0
- package/dist/document-handlers.d.ts +47 -0
- package/dist/document-handlers.d.ts.map +1 -0
- package/dist/document-handlers.js +2203 -0
- package/dist/document-handlers.js.map +1 -0
- package/dist/document-handshake.d.ts +176 -0
- package/dist/document-handshake.d.ts.map +1 -0
- package/dist/document-handshake.js +452 -0
- package/dist/document-handshake.js.map +1 -0
- package/dist/document-inbound.d.ts +162 -0
- package/dist/document-inbound.d.ts.map +1 -0
- package/dist/document-inbound.js +530 -0
- package/dist/document-inbound.js.map +1 -0
- package/dist/document-json.d.ts +120 -0
- package/dist/document-json.d.ts.map +1 -0
- package/dist/document-json.js +191 -0
- package/dist/document-json.js.map +1 -0
- package/dist/document-layer.d.ts +215 -0
- package/dist/document-layer.d.ts.map +1 -0
- package/dist/document-layer.js +1025 -0
- package/dist/document-layer.js.map +1 -0
- package/dist/document-lifecycle.d.ts +52 -0
- package/dist/document-lifecycle.d.ts.map +1 -0
- package/dist/document-lifecycle.js +134 -0
- package/dist/document-lifecycle.js.map +1 -0
- package/dist/document-live-docs.d.ts +58 -0
- package/dist/document-live-docs.d.ts.map +1 -0
- package/dist/document-live-docs.js +126 -0
- package/dist/document-live-docs.js.map +1 -0
- package/dist/document-notify.d.ts +228 -0
- package/dist/document-notify.d.ts.map +1 -0
- package/dist/document-notify.js +580 -0
- package/dist/document-notify.js.map +1 -0
- package/dist/document-profile.d.ts +61 -0
- package/dist/document-profile.d.ts.map +1 -0
- package/dist/document-profile.js +112 -0
- package/dist/document-profile.js.map +1 -0
- package/dist/document-publish.d.ts +87 -0
- package/dist/document-publish.d.ts.map +1 -0
- package/dist/document-publish.js +173 -0
- package/dist/document-publish.js.map +1 -0
- package/dist/document-reachability.d.ts +42 -0
- package/dist/document-reachability.d.ts.map +1 -0
- package/dist/document-reachability.js +80 -0
- package/dist/document-reachability.js.map +1 -0
- package/dist/document-reconcile-engine.d.ts +66 -0
- package/dist/document-reconcile-engine.d.ts.map +1 -0
- package/dist/document-reconcile-engine.js +225 -0
- package/dist/document-reconcile-engine.js.map +1 -0
- package/dist/document-reconcile-scheduler.d.ts +163 -0
- package/dist/document-reconcile-scheduler.d.ts.map +1 -0
- package/dist/document-reconcile-scheduler.js +303 -0
- package/dist/document-reconcile-scheduler.js.map +1 -0
- package/dist/document-rejection.d.ts +251 -0
- package/dist/document-rejection.d.ts.map +1 -0
- package/dist/document-rejection.js +435 -0
- package/dist/document-rejection.js.map +1 -0
- package/dist/document-screen.d.ts +114 -0
- package/dist/document-screen.d.ts.map +1 -0
- package/dist/document-screen.js +223 -0
- package/dist/document-screen.js.map +1 -0
- package/dist/document-store.d.ts +372 -0
- package/dist/document-store.d.ts.map +1 -0
- package/dist/document-store.js +931 -0
- package/dist/document-store.js.map +1 -0
- package/dist/document-surface.d.ts +32 -0
- package/dist/document-surface.d.ts.map +1 -0
- package/dist/document-surface.js +151 -0
- package/dist/document-surface.js.map +1 -0
- package/dist/document-types.d.ts +94 -0
- package/dist/document-types.d.ts.map +1 -0
- package/dist/document-types.js +90 -0
- package/dist/document-types.js.map +1 -0
- package/dist/document-watch.d.ts +69 -0
- package/dist/document-watch.d.ts.map +1 -0
- package/dist/document-watch.js +108 -0
- package/dist/document-watch.js.map +1 -0
- package/dist/document-wiring.d.ts +53 -0
- package/dist/document-wiring.d.ts.map +1 -0
- package/dist/document-wiring.js +323 -0
- package/dist/document-wiring.js.map +1 -0
- package/dist/document-write-guard.d.ts +66 -0
- package/dist/document-write-guard.d.ts.map +1 -0
- package/dist/document-write-guard.js +98 -0
- package/dist/document-write-guard.js.map +1 -0
- package/dist/document-write-path.d.ts +94 -0
- package/dist/document-write-path.d.ts.map +1 -0
- package/dist/document-write-path.js +530 -0
- package/dist/document-write-path.js.map +1 -0
- package/dist/error-message.d.ts +7 -0
- package/dist/error-message.d.ts.map +1 -0
- package/dist/error-message.js +19 -0
- package/dist/error-message.js.map +1 -0
- package/dist/file-manifest-provider.d.ts +37 -0
- package/dist/file-manifest-provider.d.ts.map +1 -0
- package/dist/file-manifest-provider.js +105 -0
- package/dist/file-manifest-provider.js.map +1 -0
- package/dist/frame-values.d.ts +3 -0
- package/dist/frame-values.d.ts.map +1 -0
- package/dist/frame-values.js +84 -0
- package/dist/frame-values.js.map +1 -0
- package/dist/frontier-mismatch.d.ts +73 -0
- package/dist/frontier-mismatch.d.ts.map +1 -0
- package/dist/frontier-mismatch.js +89 -0
- package/dist/frontier-mismatch.js.map +1 -0
- package/dist/gateway-config-handlers.d.ts +26 -0
- package/dist/gateway-config-handlers.d.ts.map +1 -0
- package/dist/gateway-config-handlers.js +429 -0
- package/dist/gateway-config-handlers.js.map +1 -0
- package/dist/held-content.d.ts +145 -0
- package/dist/held-content.d.ts.map +1 -0
- package/dist/held-content.js +389 -0
- package/dist/held-content.js.map +1 -0
- package/dist/http-manifest-poll.d.ts +67 -0
- package/dist/http-manifest-poll.d.ts.map +1 -0
- package/dist/http-manifest-poll.js +150 -0
- package/dist/http-manifest-poll.js.map +1 -0
- package/dist/identity-migration.d.ts +40 -0
- package/dist/identity-migration.d.ts.map +1 -0
- package/dist/identity-migration.js +461 -0
- package/dist/identity-migration.js.map +1 -0
- package/dist/inbound-refusals.d.ts +283 -0
- package/dist/inbound-refusals.d.ts.map +1 -0
- package/dist/inbound-refusals.js +919 -0
- package/dist/inbound-refusals.js.map +1 -0
- package/dist/inbound-seal-request.d.ts +32 -0
- package/dist/inbound-seal-request.d.ts.map +1 -0
- package/dist/inbound-seal-request.js +228 -0
- package/dist/inbound-seal-request.js.map +1 -0
- package/dist/inbound-sessions.d.ts +291 -0
- package/dist/inbound-sessions.d.ts.map +1 -0
- package/dist/inbound-sessions.js +1609 -0
- package/dist/inbound-sessions.js.map +1 -0
- package/dist/inclusion-proof-handlers.d.ts +43 -0
- package/dist/inclusion-proof-handlers.d.ts.map +1 -0
- package/dist/inclusion-proof-handlers.js +565 -0
- package/dist/inclusion-proof-handlers.js.map +1 -0
- package/dist/inclusion-proof.d.ts +151 -0
- package/dist/inclusion-proof.d.ts.map +1 -0
- package/dist/inclusion-proof.js +228 -0
- package/dist/inclusion-proof.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/initiate-session-handler.d.ts +55 -0
- package/dist/initiate-session-handler.d.ts.map +1 -0
- package/dist/initiate-session-handler.js +310 -0
- package/dist/initiate-session-handler.js.map +1 -0
- package/dist/ipc-client.d.ts +31 -0
- package/dist/ipc-client.d.ts.map +1 -0
- package/dist/ipc-client.js +113 -0
- package/dist/ipc-client.js.map +1 -0
- package/dist/ipc-server.d.ts +63 -0
- package/dist/ipc-server.d.ts.map +1 -0
- package/dist/ipc-server.js +429 -0
- package/dist/ipc-server.js.map +1 -0
- package/dist/ipc-surface.d.ts +44 -0
- package/dist/ipc-surface.d.ts.map +1 -0
- package/dist/ipc-surface.js +107 -0
- package/dist/ipc-surface.js.map +1 -0
- package/dist/line-lcs.d.ts +51 -0
- package/dist/line-lcs.d.ts.map +1 -0
- package/dist/line-lcs.js +71 -0
- package/dist/line-lcs.js.map +1 -0
- package/dist/lock-file.d.ts +39 -0
- package/dist/lock-file.d.ts.map +1 -0
- package/dist/lock-file.js +120 -0
- package/dist/lock-file.js.map +1 -0
- package/dist/log-collapse.d.ts +66 -0
- package/dist/log-collapse.d.ts.map +1 -0
- package/dist/log-collapse.js +244 -0
- package/dist/log-collapse.js.map +1 -0
- package/dist/log-rotate.d.ts +67 -0
- package/dist/log-rotate.d.ts.map +1 -0
- package/dist/log-rotate.js +134 -0
- package/dist/log-rotate.js.map +1 -0
- package/dist/manifest-deps.d.ts +25 -0
- package/dist/manifest-deps.d.ts.map +1 -0
- package/dist/manifest-deps.js +151 -0
- package/dist/manifest-deps.js.map +1 -0
- package/dist/manifest-poll-scheduler.d.ts +31 -0
- package/dist/manifest-poll-scheduler.d.ts.map +1 -0
- package/dist/manifest-poll-scheduler.js +59 -0
- package/dist/manifest-poll-scheduler.js.map +1 -0
- package/dist/manifest-validity.d.ts +153 -0
- package/dist/manifest-validity.d.ts.map +1 -0
- package/dist/manifest-validity.js +268 -0
- package/dist/manifest-validity.js.map +1 -0
- package/dist/manifest-version-store-db.d.ts +24 -0
- package/dist/manifest-version-store-db.d.ts.map +1 -0
- package/dist/manifest-version-store-db.js +58 -0
- package/dist/manifest-version-store-db.js.map +1 -0
- package/dist/manifest-version-store.d.ts +16 -0
- package/dist/manifest-version-store.d.ts.map +1 -0
- package/dist/manifest-version-store.js +15 -0
- package/dist/manifest-version-store.js.map +1 -0
- package/dist/network-directory-node.d.ts +136 -0
- package/dist/network-directory-node.d.ts.map +1 -0
- package/dist/network-directory-node.js +810 -0
- package/dist/network-directory-node.js.map +1 -0
- package/dist/nonce-dedup.d.ts +68 -0
- package/dist/nonce-dedup.d.ts.map +1 -0
- package/dist/nonce-dedup.js +205 -0
- package/dist/nonce-dedup.js.map +1 -0
- package/dist/notification-dispatcher.d.ts +92 -0
- package/dist/notification-dispatcher.d.ts.map +1 -0
- package/dist/notification-dispatcher.js +210 -0
- package/dist/notification-dispatcher.js.map +1 -0
- package/dist/notification-handlers.d.ts +53 -0
- package/dist/notification-handlers.d.ts.map +1 -0
- package/dist/notification-handlers.js +461 -0
- package/dist/notification-handlers.js.map +1 -0
- package/dist/onboarding-guidance.d.ts +79 -0
- package/dist/onboarding-guidance.d.ts.map +1 -0
- package/dist/onboarding-guidance.js +95 -0
- package/dist/onboarding-guidance.js.map +1 -0
- package/dist/operator-guidance.d.ts +25 -0
- package/dist/operator-guidance.d.ts.map +1 -0
- package/dist/operator-guidance.js +50 -0
- package/dist/operator-guidance.js.map +1 -0
- package/dist/orphan-triage.d.ts +130 -0
- package/dist/orphan-triage.d.ts.map +1 -0
- package/dist/orphan-triage.js +207 -0
- package/dist/orphan-triage.js.map +1 -0
- package/dist/outbound-sessions.d.ts +126 -0
- package/dist/outbound-sessions.d.ts.map +1 -0
- package/dist/outbound-sessions.js +1052 -0
- package/dist/outbound-sessions.js.map +1 -0
- package/dist/park-envelope.d.ts +329 -0
- package/dist/park-envelope.d.ts.map +1 -0
- package/dist/park-envelope.js +509 -0
- package/dist/park-envelope.js.map +1 -0
- package/dist/park-recovery.d.ts +273 -0
- package/dist/park-recovery.d.ts.map +1 -0
- package/dist/park-recovery.js +717 -0
- package/dist/park-recovery.js.map +1 -0
- package/dist/park-refusals.d.ts +147 -0
- package/dist/park-refusals.d.ts.map +1 -0
- package/dist/park-refusals.js +331 -0
- package/dist/park-refusals.js.map +1 -0
- package/dist/quarantine-framing.d.ts +92 -0
- package/dist/quarantine-framing.d.ts.map +1 -0
- package/dist/quarantine-framing.js +111 -0
- package/dist/quarantine-framing.js.map +1 -0
- package/dist/reconnect-drain.d.ts +22 -0
- package/dist/reconnect-drain.d.ts.map +1 -0
- package/dist/reconnect-drain.js +65 -0
- package/dist/reconnect-drain.js.map +1 -0
- package/dist/recovered-position.d.ts +14 -0
- package/dist/recovered-position.d.ts.map +1 -0
- package/dist/recovered-position.js +59 -0
- package/dist/recovered-position.js.map +1 -0
- package/dist/refusal-notices.d.ts +196 -0
- package/dist/refusal-notices.d.ts.map +1 -0
- package/dist/refusal-notices.js +516 -0
- package/dist/refusal-notices.js.map +1 -0
- package/dist/refusal-reasons.d.ts +245 -0
- package/dist/refusal-reasons.d.ts.map +1 -0
- package/dist/refusal-reasons.js +363 -0
- package/dist/refusal-reasons.js.map +1 -0
- package/dist/register-handler.d.ts +36 -0
- package/dist/register-handler.d.ts.map +1 -0
- package/dist/register-handler.js +285 -0
- package/dist/register-handler.js.map +1 -0
- package/dist/registration-context.d.ts +72 -0
- package/dist/registration-context.d.ts.map +1 -0
- package/dist/registration-context.js +126 -0
- package/dist/registration-context.js.map +1 -0
- package/dist/registration-manager.d.ts +94 -0
- package/dist/registration-manager.d.ts.map +1 -0
- package/dist/registration-manager.js +585 -0
- package/dist/registration-manager.js.map +1 -0
- package/dist/registration-persistence.d.ts +183 -0
- package/dist/registration-persistence.d.ts.map +1 -0
- package/dist/registration-persistence.js +263 -0
- package/dist/registration-persistence.js.map +1 -0
- package/dist/registry-poll.d.ts +52 -0
- package/dist/registry-poll.d.ts.map +1 -0
- package/dist/registry-poll.js +140 -0
- package/dist/registry-poll.js.map +1 -0
- package/dist/registry-version-store-db.d.ts +22 -0
- package/dist/registry-version-store-db.d.ts.map +1 -0
- package/dist/registry-version-store-db.js +50 -0
- package/dist/registry-version-store-db.js.map +1 -0
- package/dist/relay-endpoints.d.ts +18 -0
- package/dist/relay-endpoints.d.ts.map +1 -0
- package/dist/relay-endpoints.js +9 -0
- package/dist/relay-endpoints.js.map +1 -0
- package/dist/relay-only.d.ts +140 -0
- package/dist/relay-only.d.ts.map +1 -0
- package/dist/relay-only.js +193 -0
- package/dist/relay-only.js.map +1 -0
- package/dist/relay-receipt-store.d.ts +155 -0
- package/dist/relay-receipt-store.d.ts.map +1 -0
- package/dist/relay-receipt-store.js +284 -0
- package/dist/relay-receipt-store.js.map +1 -0
- package/dist/relay-reconnect.d.ts +32 -0
- package/dist/relay-reconnect.d.ts.map +1 -0
- package/dist/relay-reconnect.js +29 -0
- package/dist/relay-reconnect.js.map +1 -0
- package/dist/reply-lag.d.ts +11 -0
- package/dist/reply-lag.d.ts.map +1 -0
- package/dist/reply-lag.js +46 -0
- package/dist/reply-lag.js.map +1 -0
- package/dist/resolve-named-agent.d.ts +49 -0
- package/dist/resolve-named-agent.d.ts.map +1 -0
- package/dist/resolve-named-agent.js +77 -0
- package/dist/resolve-named-agent.js.map +1 -0
- package/dist/restart-seal-resolver.d.ts +110 -0
- package/dist/restart-seal-resolver.d.ts.map +1 -0
- package/dist/restart-seal-resolver.js +353 -0
- package/dist/restart-seal-resolver.js.map +1 -0
- package/dist/resume-last-seen.d.ts +15 -0
- package/dist/resume-last-seen.d.ts.map +1 -0
- package/dist/resume-last-seen.js +44 -0
- package/dist/resume-last-seen.js.map +1 -0
- package/dist/retry-queue.d.ts +203 -0
- package/dist/retry-queue.d.ts.map +1 -0
- package/dist/retry-queue.js +701 -0
- package/dist/retry-queue.js.map +1 -0
- package/dist/roster-freshness.d.ts +160 -0
- package/dist/roster-freshness.d.ts.map +1 -0
- package/dist/roster-freshness.js +250 -0
- package/dist/roster-freshness.js.map +1 -0
- package/dist/screening-status.d.ts +15 -0
- package/dist/screening-status.d.ts.map +1 -0
- package/dist/screening-status.js +65 -0
- package/dist/screening-status.js.map +1 -0
- package/dist/seal-carried-close.d.ts +37 -0
- package/dist/seal-carried-close.d.ts.map +1 -0
- package/dist/seal-carried-close.js +179 -0
- package/dist/seal-carried-close.js.map +1 -0
- package/dist/seal-certificate-pull.d.ts +79 -0
- package/dist/seal-certificate-pull.d.ts.map +1 -0
- package/dist/seal-certificate-pull.js +186 -0
- package/dist/seal-certificate-pull.js.map +1 -0
- package/dist/seal-certified-root-check.d.ts +37 -0
- package/dist/seal-certified-root-check.d.ts.map +1 -0
- package/dist/seal-certified-root-check.js +127 -0
- package/dist/seal-certified-root-check.js.map +1 -0
- package/dist/seal-coordinator.d.ts +118 -0
- package/dist/seal-coordinator.d.ts.map +1 -0
- package/dist/seal-coordinator.js +927 -0
- package/dist/seal-coordinator.js.map +1 -0
- package/dist/seal-escalation.d.ts +80 -0
- package/dist/seal-escalation.d.ts.map +1 -0
- package/dist/seal-escalation.js +283 -0
- package/dist/seal-escalation.js.map +1 -0
- package/dist/seal-evidence-root-check.d.ts +70 -0
- package/dist/seal-evidence-root-check.d.ts.map +1 -0
- package/dist/seal-evidence-root-check.js +199 -0
- package/dist/seal-evidence-root-check.js.map +1 -0
- package/dist/seal-failure-store.d.ts +139 -0
- package/dist/seal-failure-store.d.ts.map +1 -0
- package/dist/seal-failure-store.js +207 -0
- package/dist/seal-failure-store.js.map +1 -0
- package/dist/seal-flows.d.ts +107 -0
- package/dist/seal-flows.d.ts.map +1 -0
- package/dist/seal-flows.js +638 -0
- package/dist/seal-flows.js.map +1 -0
- package/dist/seal-frontier-verify.d.ts +103 -0
- package/dist/seal-frontier-verify.d.ts.map +1 -0
- package/dist/seal-frontier-verify.js +143 -0
- package/dist/seal-frontier-verify.js.map +1 -0
- package/dist/seal-leaf.d.ts +58 -0
- package/dist/seal-leaf.d.ts.map +1 -0
- package/dist/seal-leaf.js +112 -0
- package/dist/seal-leaf.js.map +1 -0
- package/dist/seal-legibility-tbs.d.ts +25 -0
- package/dist/seal-legibility-tbs.d.ts.map +1 -0
- package/dist/seal-legibility-tbs.js +77 -0
- package/dist/seal-legibility-tbs.js.map +1 -0
- package/dist/seal-local-terminus.d.ts +41 -0
- package/dist/seal-local-terminus.d.ts.map +1 -0
- package/dist/seal-local-terminus.js +170 -0
- package/dist/seal-local-terminus.js.map +1 -0
- package/dist/seal-receipt-upgrade.d.ts +30 -0
- package/dist/seal-receipt-upgrade.d.ts.map +1 -0
- package/dist/seal-receipt-upgrade.js +49 -0
- package/dist/seal-receipt-upgrade.js.map +1 -0
- package/dist/seal-relay-silence.d.ts +51 -0
- package/dist/seal-relay-silence.d.ts.map +1 -0
- package/dist/seal-relay-silence.js +76 -0
- package/dist/seal-relay-silence.js.map +1 -0
- package/dist/seal-settle.d.ts +38 -0
- package/dist/seal-settle.d.ts.map +1 -0
- package/dist/seal-settle.js +33 -0
- package/dist/seal-settle.js.map +1 -0
- package/dist/seal-upgrade.d.ts +107 -0
- package/dist/seal-upgrade.d.ts.map +1 -0
- package/dist/seal-upgrade.js +200 -0
- package/dist/seal-upgrade.js.map +1 -0
- package/dist/sealed-conversation.d.ts +36 -0
- package/dist/sealed-conversation.d.ts.map +1 -0
- package/dist/sealed-conversation.js +171 -0
- package/dist/sealed-conversation.js.map +1 -0
- package/dist/sealed-leaf-set.d.ts +92 -0
- package/dist/sealed-leaf-set.d.ts.map +1 -0
- package/dist/sealed-leaf-set.js +122 -0
- package/dist/sealed-leaf-set.js.map +1 -0
- package/dist/send-claims.d.ts +56 -0
- package/dist/send-claims.d.ts.map +1 -0
- package/dist/send-claims.js +50 -0
- package/dist/send-claims.js.map +1 -0
- package/dist/session-assignment-parser.d.ts +104 -0
- package/dist/session-assignment-parser.d.ts.map +1 -0
- package/dist/session-assignment-parser.js +345 -0
- package/dist/session-assignment-parser.js.map +1 -0
- package/dist/session-category.d.ts +19 -0
- package/dist/session-category.d.ts.map +1 -0
- package/dist/session-category.js +14 -0
- package/dist/session-category.js.map +1 -0
- package/dist/session-ceremony.d.ts +297 -0
- package/dist/session-ceremony.d.ts.map +1 -0
- package/dist/session-ceremony.js +964 -0
- package/dist/session-ceremony.js.map +1 -0
- package/dist/session-closed.d.ts +79 -0
- package/dist/session-closed.d.ts.map +1 -0
- package/dist/session-closed.js +189 -0
- package/dist/session-closed.js.map +1 -0
- package/dist/session-connection-gater.d.ts +148 -0
- package/dist/session-connection-gater.d.ts.map +1 -0
- package/dist/session-connection-gater.js +332 -0
- package/dist/session-connection-gater.js.map +1 -0
- package/dist/session-content-context.d.ts +162 -0
- package/dist/session-content-context.d.ts.map +1 -0
- package/dist/session-content-context.js +2 -0
- package/dist/session-content-context.js.map +1 -0
- package/dist/session-content-handlers.d.ts +82 -0
- package/dist/session-content-handlers.d.ts.map +1 -0
- package/dist/session-content-handlers.js +1382 -0
- package/dist/session-content-handlers.js.map +1 -0
- package/dist/session-content-ingest.d.ts +206 -0
- package/dist/session-content-ingest.d.ts.map +1 -0
- package/dist/session-content-ingest.js +2167 -0
- package/dist/session-content-ingest.js.map +1 -0
- package/dist/session-content-send.d.ts +191 -0
- package/dist/session-content-send.d.ts.map +1 -0
- package/dist/session-content-send.js +1360 -0
- package/dist/session-content-send.js.map +1 -0
- package/dist/session-delivery-acks.d.ts +169 -0
- package/dist/session-delivery-acks.d.ts.map +1 -0
- package/dist/session-delivery-acks.js +569 -0
- package/dist/session-delivery-acks.js.map +1 -0
- package/dist/session-ephemerals.d.ts +279 -0
- package/dist/session-ephemerals.d.ts.map +1 -0
- package/dist/session-ephemerals.js +591 -0
- package/dist/session-ephemerals.js.map +1 -0
- package/dist/session-leaf-records.d.ts +159 -0
- package/dist/session-leaf-records.d.ts.map +1 -0
- package/dist/session-leaf-records.js +408 -0
- package/dist/session-leaf-records.js.map +1 -0
- package/dist/session-lifecycle.d.ts +303 -0
- package/dist/session-lifecycle.d.ts.map +1 -0
- package/dist/session-lifecycle.js +1679 -0
- package/dist/session-lifecycle.js.map +1 -0
- package/dist/session-liveness.d.ts +135 -0
- package/dist/session-liveness.d.ts.map +1 -0
- package/dist/session-liveness.js +347 -0
- package/dist/session-liveness.js.map +1 -0
- package/dist/session-name.d.ts +35 -0
- package/dist/session-name.d.ts.map +1 -0
- package/dist/session-name.js +60 -0
- package/dist/session-name.js.map +1 -0
- package/dist/session-node-factory.d.ts +18 -0
- package/dist/session-node-factory.d.ts.map +1 -0
- package/dist/session-node-factory.js +182 -0
- package/dist/session-node-factory.js.map +1 -0
- package/dist/session-node-manager.d.ts +877 -0
- package/dist/session-node-manager.d.ts.map +1 -0
- package/dist/session-node-manager.js +2998 -0
- package/dist/session-node-manager.js.map +1 -0
- package/dist/session-node-types.d.ts +1057 -0
- package/dist/session-node-types.d.ts.map +1 -0
- package/dist/session-node-types.js +657 -0
- package/dist/session-node-types.js.map +1 -0
- package/dist/session-notify.d.ts +46 -0
- package/dist/session-notify.d.ts.map +1 -0
- package/dist/session-notify.js +116 -0
- package/dist/session-notify.js.map +1 -0
- package/dist/session-own-chain-store.d.ts +65 -0
- package/dist/session-own-chain-store.d.ts.map +1 -0
- package/dist/session-own-chain-store.js +75 -0
- package/dist/session-own-chain-store.js.map +1 -0
- package/dist/session-queries.d.ts +476 -0
- package/dist/session-queries.d.ts.map +1 -0
- package/dist/session-queries.js +1007 -0
- package/dist/session-queries.js.map +1 -0
- package/dist/session-read-handlers.d.ts +87 -0
- package/dist/session-read-handlers.d.ts.map +1 -0
- package/dist/session-read-handlers.js +689 -0
- package/dist/session-read-handlers.js.map +1 -0
- package/dist/session-records.d.ts +341 -0
- package/dist/session-records.d.ts.map +1 -0
- package/dist/session-records.js +858 -0
- package/dist/session-records.js.map +1 -0
- package/dist/session-relay-client.d.ts +659 -0
- package/dist/session-relay-client.d.ts.map +1 -0
- package/dist/session-relay-client.js +2876 -0
- package/dist/session-relay-client.js.map +1 -0
- package/dist/session-relay.d.ts +397 -0
- package/dist/session-relay.d.ts.map +1 -0
- package/dist/session-relay.js +1636 -0
- package/dist/session-relay.js.map +1 -0
- package/dist/session-salt-agreement.d.ts +331 -0
- package/dist/session-salt-agreement.d.ts.map +1 -0
- package/dist/session-salt-agreement.js +472 -0
- package/dist/session-salt-agreement.js.map +1 -0
- package/dist/session-salts.d.ts +432 -0
- package/dist/session-salts.d.ts.map +1 -0
- package/dist/session-salts.js +1540 -0
- package/dist/session-salts.js.map +1 -0
- package/dist/session-schema.d.ts +30 -0
- package/dist/session-schema.d.ts.map +1 -0
- package/dist/session-schema.js +877 -0
- package/dist/session-schema.js.map +1 -0
- package/dist/session-seal-leaf-store.d.ts +70 -0
- package/dist/session-seal-leaf-store.d.ts.map +1 -0
- package/dist/session-seal-leaf-store.js +105 -0
- package/dist/session-seal-leaf-store.js.map +1 -0
- package/dist/session-seal.d.ts +334 -0
- package/dist/session-seal.d.ts.map +1 -0
- package/dist/session-seal.js +1017 -0
- package/dist/session-seal.js.map +1 -0
- package/dist/session-terminal-refusal.d.ts +65 -0
- package/dist/session-terminal-refusal.d.ts.map +1 -0
- package/dist/session-terminal-refusal.js +87 -0
- package/dist/session-terminal-refusal.js.map +1 -0
- package/dist/session-tree.d.ts +110 -0
- package/dist/session-tree.d.ts.map +1 -0
- package/dist/session-tree.js +144 -0
- package/dist/session-tree.js.map +1 -0
- package/dist/session-views.d.ts +47 -0
- package/dist/session-views.d.ts.map +1 -0
- package/dist/session-views.js +278 -0
- package/dist/session-views.js.map +1 -0
- package/dist/signal-handlers.d.ts +63 -0
- package/dist/signal-handlers.d.ts.map +1 -0
- package/dist/signal-handlers.js +980 -0
- package/dist/signal-handlers.js.map +1 -0
- package/dist/signal-requirement-policy.d.ts +51 -0
- package/dist/signal-requirement-policy.d.ts.map +1 -0
- package/dist/signal-requirement-policy.js +89 -0
- package/dist/signal-requirement-policy.js.map +1 -0
- package/dist/signal-revocability.d.ts +49 -0
- package/dist/signal-revocability.d.ts.map +1 -0
- package/dist/signal-revocability.js +93 -0
- package/dist/signal-revocability.js.map +1 -0
- package/dist/signal-submission.d.ts +181 -0
- package/dist/signal-submission.d.ts.map +1 -0
- package/dist/signal-submission.js +368 -0
- package/dist/signal-submission.js.map +1 -0
- package/dist/signaling-connect.d.ts +118 -0
- package/dist/signaling-connect.d.ts.map +1 -0
- package/dist/signaling-connect.js +538 -0
- package/dist/signaling-connect.js.map +1 -0
- package/dist/signaling-wiring.d.ts +105 -0
- package/dist/signaling-wiring.d.ts.map +1 -0
- package/dist/signaling-wiring.js +393 -0
- package/dist/signaling-wiring.js.map +1 -0
- package/dist/singleton-lock.d.ts +85 -0
- package/dist/singleton-lock.d.ts.map +1 -0
- package/dist/singleton-lock.js +219 -0
- package/dist/singleton-lock.js.map +1 -0
- package/dist/sqlcipher-db.d.ts +139 -0
- package/dist/sqlcipher-db.d.ts.map +1 -0
- package/dist/sqlcipher-db.js +357 -0
- package/dist/sqlcipher-db.js.map +1 -0
- package/dist/standing-receivers.d.ts +319 -0
- package/dist/standing-receivers.d.ts.map +1 -0
- package/dist/standing-receivers.js +1295 -0
- package/dist/standing-receivers.js.map +1 -0
- package/dist/start-agent.d.ts +64 -0
- package/dist/start-agent.d.ts.map +1 -0
- package/dist/start-agent.js +136 -0
- package/dist/start-agent.js.map +1 -0
- package/dist/status-handler.d.ts +54 -0
- package/dist/status-handler.d.ts.map +1 -0
- package/dist/status-handler.js +61 -0
- package/dist/status-handler.js.map +1 -0
- package/dist/submission-retry.d.ts +208 -0
- package/dist/submission-retry.d.ts.map +1 -0
- package/dist/submission-retry.js +506 -0
- package/dist/submission-retry.js.map +1 -0
- package/dist/telegram-bot-client.d.ts +34 -0
- package/dist/telegram-bot-client.d.ts.map +1 -0
- package/dist/telegram-bot-client.js +36 -0
- package/dist/telegram-bot-client.js.map +1 -0
- package/dist/telegram-doorbell.d.ts +38 -0
- package/dist/telegram-doorbell.d.ts.map +1 -0
- package/dist/telegram-doorbell.js +140 -0
- package/dist/telegram-doorbell.js.map +1 -0
- package/dist/test-handlers.d.ts +62 -0
- package/dist/test-handlers.d.ts.map +1 -0
- package/dist/test-handlers.js +240 -0
- package/dist/test-handlers.js.map +1 -0
- package/dist/testing.d.ts +10 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +10 -0
- package/dist/testing.js.map +1 -0
- package/dist/transport-composition.d.ts +31 -0
- package/dist/transport-composition.d.ts.map +1 -0
- package/dist/transport-composition.js +55 -0
- package/dist/transport-composition.js.map +1 -0
- package/dist/transport-selector.d.ts +202 -0
- package/dist/transport-selector.d.ts.map +1 -0
- package/dist/transport-selector.js +196 -0
- package/dist/transport-selector.js.map +1 -0
- package/dist/trust-signal-pickup-listener.d.ts +43 -0
- package/dist/trust-signal-pickup-listener.d.ts.map +1 -0
- package/dist/trust-signal-pickup-listener.js +48 -0
- package/dist/trust-signal-pickup-listener.js.map +1 -0
- package/dist/trust-signal-store.d.ts +406 -0
- package/dist/trust-signal-store.d.ts.map +1 -0
- package/dist/trust-signal-store.js +939 -0
- package/dist/trust-signal-store.js.map +1 -0
- package/dist/trust-signal-sweep-tick.d.ts +60 -0
- package/dist/trust-signal-sweep-tick.d.ts.map +1 -0
- package/dist/trust-signal-sweep-tick.js +101 -0
- package/dist/trust-signal-sweep-tick.js.map +1 -0
- package/dist/trust-signal-sweep.d.ts +94 -0
- package/dist/trust-signal-sweep.d.ts.map +1 -0
- package/dist/trust-signal-sweep.js +147 -0
- package/dist/trust-signal-sweep.js.map +1 -0
- package/dist/type-registry.d.ts +42 -0
- package/dist/type-registry.d.ts.map +1 -0
- package/dist/type-registry.js +37 -0
- package/dist/type-registry.js.map +1 -0
- package/dist/types.d.ts +746 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +20 -0
- package/dist/types.js.map +1 -0
- package/dist/unresolved-nodes-report.d.ts +14 -0
- package/dist/unresolved-nodes-report.d.ts.map +1 -0
- package/dist/unresolved-nodes-report.js +96 -0
- package/dist/unresolved-nodes-report.js.map +1 -0
- package/dist/vocabulary.d.ts +150 -0
- package/dist/vocabulary.d.ts.map +1 -0
- package/dist/vocabulary.js +386 -0
- package/dist/vocabulary.js.map +1 -0
- package/dist/who-label.d.ts +28 -0
- package/dist/who-label.d.ts.map +1 -0
- package/dist/who-label.js +31 -0
- package/dist/who-label.js.map +1 -0
- package/dist/who-resolver.d.ts +15 -0
- package/dist/who-resolver.d.ts.map +1 -0
- package/dist/who-resolver.js +47 -0
- package/dist/who-resolver.js.map +1 -0
- package/dist/wire-content-hash.d.ts +93 -0
- package/dist/wire-content-hash.d.ts.map +1 -0
- package/dist/wire-content-hash.js +116 -0
- package/dist/wire-content-hash.js.map +1 -0
- package/dist/withheld-content.d.ts +13 -0
- package/dist/withheld-content.d.ts.map +1 -0
- package/dist/withheld-content.js +46 -0
- package/dist/withheld-content.js.map +1 -0
- package/dist/witness-alerts.d.ts +40 -0
- package/dist/witness-alerts.d.ts.map +1 -0
- package/dist/witness-alerts.js +102 -0
- package/dist/witness-alerts.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M10B / DOD-END-ACCEPT-1 — the `consent_state` column on `wallet_trust_signals` (`M10B-D14r2`).
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS IS ITS OWN FILE AND NOT A LINE IN `ensureTrustSignalSchema`. That function runs on EVERY
|
|
5
|
+
* `startDaemon` and ends in a bare `catch {}` ("Column already exists — safe to ignore"). A consent
|
|
6
|
+
* migration written as a sibling `ALTER`/`UPDATE` in there would have its failures swallowed AND its
|
|
7
|
+
* backfill run unconditionally — so an operator who REFUSES an endorsement would have it flipped
|
|
8
|
+
* back to `accepted` on the next restart, silently, and it would become presentable again. The
|
|
9
|
+
* client DB has no migration versioning to catch that.
|
|
10
|
+
*
|
|
11
|
+
* So this follows the pattern the repo already proved for exactly this hazard
|
|
12
|
+
* (`contacts-tier-migration.ts`):
|
|
13
|
+
* - a `PRAGMA table_info` COLUMN-BIRTH gate, so the one-time step is tied to the column being
|
|
14
|
+
* created rather than to a NULL that could reappear later;
|
|
15
|
+
* - NO column DEFAULT, so the backfill has a real discriminator — with a DEFAULT every existing
|
|
16
|
+
* row gets a value the instant the column exists and the backfill matches nothing;
|
|
17
|
+
* - the ALTER and the backfill in ONE transaction, so a crash between them cannot leave the
|
|
18
|
+
* column present and the rows un-backfilled, which would skip the one-time step FOREVER;
|
|
19
|
+
* - a RETHROW, because a migration that fails silently is a schema nobody can trust.
|
|
20
|
+
*
|
|
21
|
+
* DIRECTION OF THE BACKFILL — ENFORCED BY THE SQL, NOT BY AN ARGUMENT ABOUT THE PAST.
|
|
22
|
+
* Portal-issued rows become `accepted`: they were minted about the operator, for the operator, at
|
|
23
|
+
* their own action, so there was never a third party whose decision was pending, and making them
|
|
24
|
+
* `pending` would silently render every phone/email signal already in every wallet unpresentable —
|
|
25
|
+
* a data-loss-shaped bug that raises no error. Agent-issued rows become `pending`, because somebody
|
|
26
|
+
* else authored them.
|
|
27
|
+
*
|
|
28
|
+
* An earlier version backfilled everything to `accepted` on the reasoning that nothing agent-issued
|
|
29
|
+
* could exist yet. That was true only by RELEASE TIMING — the daemon has accepted
|
|
30
|
+
* `issuer_kind: agent` since M10 — so a dev or staging wallet that picked one up during M10B
|
|
31
|
+
* integration testing would have had it backfilled to presentable at boot, which is exactly the
|
|
32
|
+
* D-23 violation this file exists to prevent. Two WHERE clauses make it a property of the code.
|
|
33
|
+
*
|
|
34
|
+
* NEW rows are handled at the write path on the same axis: `putWalletSignal` inserts `pending` for
|
|
35
|
+
* `issuer_kind: agent` and `accepted` otherwise.
|
|
36
|
+
*/
|
|
37
|
+
import { extractErrorMessage } from "./error-message.js";
|
|
38
|
+
/** Present-tense truth for the reader: this is what gates presentation. */
|
|
39
|
+
export const CONSENT_ACCEPTED = "accepted";
|
|
40
|
+
export function migrateWalletAddConsentState(db, logger) {
|
|
41
|
+
const columns = new Set(db.prepare("PRAGMA table_info(wallet_trust_signals)").all().map((c) => c.name));
|
|
42
|
+
// BIRTH GATE. Idempotent, and deliberately NOT "backfill wherever the value is NULL": a NULL that
|
|
43
|
+
// appears later is not a legacy row, and promoting it would be the clobber this file prevents.
|
|
44
|
+
//
|
|
45
|
+
// IT GATES ON BOTH COLUMNS, and gating on only `consent_state` was a real bug that shipped: every
|
|
46
|
+
// database that ran the previous release already had `consent_state`, so this returned here and
|
|
47
|
+
// `consent_notified_at` was NEVER ADDED on upgrade. Fresh installs got it, upgrades did not —
|
|
48
|
+
// exactly the fresh-vs-migrated divergence the suite has a test for, on a column that test did not
|
|
49
|
+
// cover. It stayed green because the partial-migration test asserted only NEGATIVES, which are
|
|
50
|
+
// satisfied by returning before any of the code under test runs.
|
|
51
|
+
if (columns.has("consent_state") && columns.has("consent_notified_at"))
|
|
52
|
+
return;
|
|
53
|
+
// BEGIN IMMEDIATE, not DEFERRED: a deferred transaction takes no write lock, so two daemons on one
|
|
54
|
+
// DB — a named real condition in this project — can both pass the gate above and the loser dies at
|
|
55
|
+
// boot on `duplicate column name`. It does not clobber, but it is a baffling crash. The lock also
|
|
56
|
+
// makes the re-read below meaningful.
|
|
57
|
+
db.exec("BEGIN IMMEDIATE");
|
|
58
|
+
try {
|
|
59
|
+
// Re-read the gate under the lock: the PRAGMA above is a check-then-act outside any transaction.
|
|
60
|
+
const underLock = new Set(db.prepare("PRAGMA table_info(wallet_trust_signals)").all().map((c) => c.name));
|
|
61
|
+
// EACH COLUMN IS GATED INDEPENDENTLY. An earlier version added both under one gate keyed on
|
|
62
|
+
// `consent_state`, so a database holding one but not the other hit `duplicate column name`, the
|
|
63
|
+
// migration rethrew, and the daemon refused to start — a self-inflicted boot failure on a
|
|
64
|
+
// recoverable state. Caught by the legacy-backfill test, which constructs exactly that shape.
|
|
65
|
+
const needsConsent = !underLock.has("consent_state");
|
|
66
|
+
const needsNotified = !underLock.has("consent_notified_at");
|
|
67
|
+
if (!needsConsent && !needsNotified) {
|
|
68
|
+
db.exec("COMMIT");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// No DEFAULT — see the header. The rows are given their value by the explicit backfill below.
|
|
72
|
+
if (needsConsent)
|
|
73
|
+
db.exec("ALTER TABLE wallet_trust_signals ADD COLUMN consent_state TEXT");
|
|
74
|
+
// DOD-END-PENDING-1 / M10B-D5 — the NOTIFICATION's lifetime, which is NOT the item's. The item
|
|
75
|
+
// persists until accepted or refused; the notification is raised once and stops once seen. One
|
|
76
|
+
// flag cannot carry both: a single seen-bit would either dismiss the pending decision (losing it)
|
|
77
|
+
// or re-fire on every agent selection (nagging). Two facts, two columns.
|
|
78
|
+
if (needsNotified)
|
|
79
|
+
db.exec("ALTER TABLE wallet_trust_signals ADD COLUMN consent_notified_at INTEGER");
|
|
80
|
+
if (!needsConsent) {
|
|
81
|
+
// The backfill belongs to consent_state's BIRTH. If only the notification column was missing,
|
|
82
|
+
// the rows already carry their consent and must not be re-judged — that is the clobber this
|
|
83
|
+
// file exists to prevent, and it would arrive by the back door of a partially-migrated schema.
|
|
84
|
+
db.exec("COMMIT");
|
|
85
|
+
logger.info("signal.consent.migrated", { backfilled: 0, added: "consent_notified_at" });
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// THE DIRECTION IS ENFORCED, NOT ARGUED (review F5). The header's reasoning — "everything
|
|
89
|
+
// predating this column is portal-issued" — is true TODAY only by release timing: the daemon has
|
|
90
|
+
// accepted `issuer_kind: agent` since M10, and a dev or staging wallet that picked one up during
|
|
91
|
+
// M10B integration testing would be backfilled straight to `accepted` and presentable, which is
|
|
92
|
+
// the D-23 violation this unit exists to prevent, silently, at boot. Two WHERE clauses make the
|
|
93
|
+
// claim a property of the code instead of a property of the calendar.
|
|
94
|
+
const acceptedRes = db
|
|
95
|
+
.prepare(`UPDATE wallet_trust_signals SET consent_state = '${CONSENT_ACCEPTED}' WHERE issuer_kind <> 'agent'`)
|
|
96
|
+
.run();
|
|
97
|
+
const pendingRes = db
|
|
98
|
+
.prepare("UPDATE wallet_trust_signals SET consent_state = 'pending' WHERE issuer_kind = 'agent'")
|
|
99
|
+
.run();
|
|
100
|
+
const res = { changes: Number(acceptedRes.changes) + Number(pendingRes.changes) };
|
|
101
|
+
db.exec("COMMIT");
|
|
102
|
+
logger.info("signal.consent.migrated", {
|
|
103
|
+
backfilled: res.changes,
|
|
104
|
+
accepted: Number(acceptedRes.changes),
|
|
105
|
+
pending: Number(pendingRes.changes),
|
|
106
|
+
reason: "portal-issued rows were minted for the operator at their own action; agent-issued rows need consent",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
// A FAILING ROLLBACK MUST NOT MASK THE REAL ERROR (review F6, and the pattern this file claims to
|
|
111
|
+
// follow guards it — `contacts-tier-migration.ts` — I copied the shape minus its most important
|
|
112
|
+
// two lines). SQLite auto-aborts the transaction on SQLITE_FULL/SQLITE_IOERR, so a bare ROLLBACK
|
|
113
|
+
// then throws "cannot rollback - no transaction is active" — BEFORE the log and BEFORE the
|
|
114
|
+
// rethrow. The operator gets a transaction-layer message for a full disk, and
|
|
115
|
+
// `signal.consent.migration_failed` never fires at all.
|
|
116
|
+
try {
|
|
117
|
+
db.exec("ROLLBACK");
|
|
118
|
+
}
|
|
119
|
+
catch { /* the failing statement may already have aborted the txn */ }
|
|
120
|
+
// RETHROW. A swallowed failure here leaves the daemon running against a schema it believes has
|
|
121
|
+
// consent and does not — which presents unconsented endorsements while every test passes.
|
|
122
|
+
logger.error("signal.consent.migration_failed", {
|
|
123
|
+
reason: extractErrorMessage(err),
|
|
124
|
+
});
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=consent-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-migration.js","sourceRoot":"","sources":["../src/consent-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The startup consortium gate, and the routing it feeds.
|
|
3
|
+
*
|
|
4
|
+
* Two functions, and the split between them is the point:
|
|
5
|
+
*
|
|
6
|
+
* 1. verifyStartupManifest — loads and verifies the consortium manifest, checks its validity
|
|
7
|
+
* window and anti-rollback, and resolves the verified node set to live directory endpoints.
|
|
8
|
+
* It REPORTS what it found. It does NOT decide what to do about a failure.
|
|
9
|
+
*
|
|
10
|
+
* 2. createConsortiumRouting — builds the roster-aware failover resolver and starts the HTTP
|
|
11
|
+
* manifest poll.
|
|
12
|
+
*
|
|
13
|
+
* They are separate because startDaemon must be able to REFUSE TO START between them (ADV-002:
|
|
14
|
+
* a configured manifestProvider that fails verification is fatal). That refusal has to close the
|
|
15
|
+
* DB and release the singleton lock — both owned by startDaemon, neither this module's business —
|
|
16
|
+
* and it must happen BEFORE the manifest poll starts, or a refused startup leaks a live timer.
|
|
17
|
+
* Fusing these into one call would either drag the lock in here or leak that timer.
|
|
18
|
+
*/
|
|
19
|
+
import type { Logger } from "./types.js";
|
|
20
|
+
import type { ConsortiumManifest } from "@cello-protocol/protocol-types";
|
|
21
|
+
import type { IManifestProvider, IManifestVersionStore, IManifestPollScheduler } from "@cello-protocol/transport";
|
|
22
|
+
import type { DirectoryEndpoint } from "./signaling-connect.js";
|
|
23
|
+
import { type NodeResolveFailure, type ConsortiumEndpoint } from "./directory-bootstrap.js";
|
|
24
|
+
export interface ManifestGateDeps {
|
|
25
|
+
manifestProvider?: IManifestProvider;
|
|
26
|
+
manifestRootKeys?: readonly string[];
|
|
27
|
+
manifestThreshold?: number;
|
|
28
|
+
manifestVersionStore: IManifestVersionStore;
|
|
29
|
+
logger: Logger;
|
|
30
|
+
/** Injectable fetch, threaded to the /bootstrap probes. Defaults to global fetch. */
|
|
31
|
+
fetchFn?: typeof fetch;
|
|
32
|
+
}
|
|
33
|
+
export interface ManifestGateResult {
|
|
34
|
+
/** True only when a manifest was loaded, verified, in-window, and not a rollback. */
|
|
35
|
+
manifestVerified: boolean;
|
|
36
|
+
/** The verified manifest's version — 0 on the no-manifest back-compat path. */
|
|
37
|
+
verifiedManifestVersion: number;
|
|
38
|
+
/**
|
|
39
|
+
* The verified node set resolved to REACHABLE directory endpoints. May be shorter than the
|
|
40
|
+
* manifest's node list (a down node is skipped, not fatal — a T-of-N ceremony needs only T),
|
|
41
|
+
* and is empty on the back-compat path or when nothing resolved.
|
|
42
|
+
*/
|
|
43
|
+
consortiumEndpoints: ConsortiumEndpoint[];
|
|
44
|
+
/**
|
|
45
|
+
* The VERIFIED manifest itself, or null on every path that did not verify one.
|
|
46
|
+
*
|
|
47
|
+
* Returned because a sealed submission needs the manifest's `intake_key` at request time, long
|
|
48
|
+
* after startup (M10B / DOD-END-SURFACE-1, the refusal-message carrier). Set ONLY alongside
|
|
49
|
+
* `manifestVerified = true`, so an unverified manifest can never reach a consumer: a sealing key
|
|
50
|
+
* read off an unverified manifest is a key an attacker chose, which would seal the operator's
|
|
51
|
+
* words to the attacker instead of the portal.
|
|
52
|
+
*/
|
|
53
|
+
verifiedManifest: ConsortiumManifest | null;
|
|
54
|
+
/**
|
|
55
|
+
* WHICH nodes did not resolve, and why — the operator-facing counterpart to the count above.
|
|
56
|
+
*
|
|
57
|
+
* This sweep runs at boot, and for the failure it exists to describe that is the only sweep that
|
|
58
|
+
* has run when the operator first looks. It used to log `directory.consortium.partial` with a
|
|
59
|
+
* count and discard the detail, so `cello status` could say nothing at all while every session
|
|
60
|
+
* failed. That is the 2026-07-31 incident: `dns_error` in the log 26 times per node from startup,
|
|
61
|
+
* the operator shown `counterparty_offline` → `directory_below_threshold` → `ceremony_exhausted`,
|
|
62
|
+
* and an hour spent concluding the protocol was broken.
|
|
63
|
+
*
|
|
64
|
+
* Empty on every path that resolved nothing to complain about — including the back-compat path,
|
|
65
|
+
* where an empty list means "no sweep ran", not "all healthy". The status surface says which
|
|
66
|
+
* nodes failed rather than asserting all-good, for exactly that reason.
|
|
67
|
+
*/
|
|
68
|
+
unresolvedNodes: NodeResolveFailure[];
|
|
69
|
+
/**
|
|
70
|
+
* When the sweep above ran (ISO), or null if none did.
|
|
71
|
+
*
|
|
72
|
+
* A reading with no timestamp asserts the PRESENT. On 2026-08-09 all three endpoints failed with
|
|
73
|
+
* ENETUNREACH — a real network blip on the operator's machine, gone within a minute — and the
|
|
74
|
+
* status block went on reporting "this daemon cannot resolve these directory endpoints" as a
|
|
75
|
+
* current fact long after it had recovered. True when taken, false when read.
|
|
76
|
+
*/
|
|
77
|
+
unresolvedSweptAt: string | null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Load + verify the manifest, then resolve its node set to live endpoints.
|
|
81
|
+
*
|
|
82
|
+
* Every failure is REPORTED (manifestVerified: false) and logged, never thrown — the caller owns
|
|
83
|
+
* the refuse-to-start decision, because only it can release what a refusal must release.
|
|
84
|
+
*/
|
|
85
|
+
export declare function verifyStartupManifest(deps: ManifestGateDeps): Promise<ManifestGateResult>;
|
|
86
|
+
export interface ConsortiumRoutingDeps {
|
|
87
|
+
manifestProvider?: IManifestProvider;
|
|
88
|
+
manifestRootKeys?: readonly string[];
|
|
89
|
+
manifestThreshold?: number;
|
|
90
|
+
manifestVersionStore: IManifestVersionStore;
|
|
91
|
+
manifestPollScheduler?: IManifestPollScheduler;
|
|
92
|
+
directoryHttpUrl?: string;
|
|
93
|
+
directoryEndpointResolver?: () => Promise<DirectoryEndpoint | null>;
|
|
94
|
+
logger: Logger;
|
|
95
|
+
fetchFn?: typeof fetch;
|
|
96
|
+
/**
|
|
97
|
+
* What the startup sweep already found unresolvable, so the operator surface is populated from
|
|
98
|
+
* boot rather than from whenever the first ceremony happens to run. See the seeding note inside.
|
|
99
|
+
*/
|
|
100
|
+
initialUnresolvedNodes?: readonly NodeResolveFailure[];
|
|
101
|
+
/** When that startup sweep ran, so the surface can say how old the reading is. */
|
|
102
|
+
initialUnresolvedSweptAt?: string | null;
|
|
103
|
+
}
|
|
104
|
+
export interface ConsortiumRouting {
|
|
105
|
+
/**
|
|
106
|
+
* The roster for a session/seal FROST ceremony, re-resolved at ceremony time from the CURRENT
|
|
107
|
+
* verified manifest. NULL (not []) when no manifest is configured — the difference is
|
|
108
|
+
* load-bearing: null means "single-node ceremony, M6/M7 back-compat"; [] means "a consortium
|
|
109
|
+
* whose nodes are all unreachable", which the ceremony layer must refuse.
|
|
110
|
+
*/
|
|
111
|
+
resolveConsortiumRoster: () => Promise<ConsortiumEndpoint[] | null>;
|
|
112
|
+
/**
|
|
113
|
+
* Roster-aware failover over the injected primary resolver (FINDING-4, the bootstrap SPOF).
|
|
114
|
+
* ONE instance, so signaling and ceremonies share sticky state and fail over TOGETHER — they
|
|
115
|
+
* must not end up talking to two different directory nodes. Undefined on the in-process test
|
|
116
|
+
* path, where there is no primary resolver to wrap.
|
|
117
|
+
*/
|
|
118
|
+
failoverEndpointResolver: (() => Promise<DirectoryEndpoint | null>) | undefined;
|
|
119
|
+
/**
|
|
120
|
+
* Which consortium nodes this daemon currently cannot resolve, and why.
|
|
121
|
+
*
|
|
122
|
+
* Exists so `cello status` can answer "can I actually reach the directory?" rather than only
|
|
123
|
+
* "is my signaling socket up?". Those differ: libp2p signaling dials multiaddrs from the bundled
|
|
124
|
+
* manifest and stays connected, so every agent reports online while anything needing the HTTP
|
|
125
|
+
* endpoint — the roster, and therefore every threshold ceremony — fails.
|
|
126
|
+
*/
|
|
127
|
+
getUnresolvedNodes: () => NodeResolveFailure[];
|
|
128
|
+
/** When the reading getUnresolvedNodes returns was taken (ISO), or null if no sweep has run. */
|
|
129
|
+
getUnresolvedSweptAt: () => string | null;
|
|
130
|
+
/** Nodes the VERIFIED manifest declares — the denominator a threshold is computed from. */
|
|
131
|
+
getDeclaredNodeCount: () => number | null;
|
|
132
|
+
/** Null-safe accessor for the ceremony/handler getDirectoryEndpoint sites. */
|
|
133
|
+
getFailoverEndpoint: () => Promise<DirectoryEndpoint | null>;
|
|
134
|
+
/** Stops the daemon-level HTTP manifest poll. Undefined when no poll was started. */
|
|
135
|
+
stopHttpManifestPoll: (() => void) | undefined;
|
|
136
|
+
}
|
|
137
|
+
export declare function createConsortiumRouting(deps: ConsortiumRoutingDeps): ConsortiumRouting;
|
|
138
|
+
//# sourceMappingURL=consortium-bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consortium-bootstrap.d.ts","sourceRoot":"","sources":["../src/consortium-bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { startHttpManifestPoll } from "./http-manifest-poll.js";
|
|
3
|
+
import { classifyManifestValidity } from "./manifest-validity.js";
|
|
4
|
+
import { resolveDirectoryUrl, manifestNodesToEndpoints, FAST_PROBE, createRosterAwareEndpointResolver, } from "./directory-bootstrap.js";
|
|
5
|
+
import { extractErrorMessage } from "./error-message.js";
|
|
6
|
+
/**
|
|
7
|
+
* Load + verify the manifest, then resolve its node set to live endpoints.
|
|
8
|
+
*
|
|
9
|
+
* Every failure is REPORTED (manifestVerified: false) and logged, never thrown — the caller owns
|
|
10
|
+
* the refuse-to-start decision, because only it can release what a refusal must release.
|
|
11
|
+
*/
|
|
12
|
+
export async function verifyStartupManifest(deps) {
|
|
13
|
+
const { manifestProvider, manifestRootKeys, manifestThreshold, manifestVersionStore, logger, fetchFn } = deps;
|
|
14
|
+
let manifestVerified = false;
|
|
15
|
+
let verifiedManifestVersion = 0;
|
|
16
|
+
let consortiumEndpoints = [];
|
|
17
|
+
let verifiedManifest = null;
|
|
18
|
+
const unresolvedNodes = [];
|
|
19
|
+
let unresolvedSweptAt = null;
|
|
20
|
+
if (!manifestProvider || !manifestRootKeys || manifestThreshold === undefined) {
|
|
21
|
+
return { manifestVerified, verifiedManifestVersion, consortiumEndpoints, verifiedManifest, unresolvedNodes, unresolvedSweptAt };
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const manifest = await manifestProvider.loadAndVerify(manifestRootKeys, manifestThreshold);
|
|
25
|
+
/**
|
|
26
|
+
* DOD-M15-EXPIRY-CONSUMER-POLICY-1 — THIS GATE HAD THE NaN HOLE ITS OWN CLASSIFIER WAS WRITTEN
|
|
27
|
+
* TO CLOSE, and the whole line's premise rested on it.
|
|
28
|
+
*
|
|
29
|
+
* It was `new Date(manifest.expires)` compared with `<=`. `new Date("nonsense")` is Invalid
|
|
30
|
+
* Date, and **every comparison against NaN is false** — so a manifest with an unparseable
|
|
31
|
+
* `expires` passed BOTH checks, set `manifestVerified = true`, and started the daemon on an
|
|
32
|
+
* artefact nobody can date. `manifest-validity.ts` says exactly this about exactly this code —
|
|
33
|
+
* *"the startup check's own shape waves a garbage timestamp through as though it were
|
|
34
|
+
* in-window"* — and fixed it for the RUNTIME classifier while leaving the startup gate as it
|
|
35
|
+
* found it. `signal-submission.ts` and `preauth-capability.ts` both get it right; this was the
|
|
36
|
+
* odd one out.
|
|
37
|
+
*
|
|
38
|
+
* **It also falsified the argument the rest of this line rests on.** Everything else here reasons
|
|
39
|
+
* that a lapsed manifest exists only inside a LONG-RUNNING daemon, so refusing would strand a
|
|
40
|
+
* live operator. For the unparseable case that was untrue: such a daemon starts FRESH into the
|
|
41
|
+
* lapsed-equivalent state and stays there permanently — while both new events tell the operator
|
|
42
|
+
* *"do not restart, it will not come back."* It comes back cleanly, forever, on the same broken
|
|
43
|
+
* file. Wrong advice, in the one case where refusing costs nothing.
|
|
44
|
+
*
|
|
45
|
+
* Now one policy object for the startup gate and the runtime surface, which is what this DoD
|
|
46
|
+
* line is about. Refuses anything that is not affirmatively in-window.
|
|
47
|
+
*/
|
|
48
|
+
const validity = classifyManifestValidity(manifest, Date.now());
|
|
49
|
+
if (validity.state === "unreadable_window" || (validity.state === "expired" && !Number.isFinite(Date.parse(manifest.expires)))) {
|
|
50
|
+
logger.error("directory.auth.manifest.unreadable.window", {
|
|
51
|
+
manifestVersion: manifest.version,
|
|
52
|
+
notBefore: manifest.not_before,
|
|
53
|
+
expires: manifest.expires,
|
|
54
|
+
detail: "a validity-window field does not parse — the artefact is malformed, not merely stale. " +
|
|
55
|
+
"A hand-edited file or a broken generator is the usual cause. Refusing rather than treating " +
|
|
56
|
+
"an undateable manifest as in-window.",
|
|
57
|
+
});
|
|
58
|
+
return { manifestVerified, verifiedManifestVersion, consortiumEndpoints, verifiedManifest, unresolvedNodes, unresolvedSweptAt };
|
|
59
|
+
}
|
|
60
|
+
const now = new Date();
|
|
61
|
+
const notBefore = new Date(manifest.not_before);
|
|
62
|
+
const expiresAt = new Date(manifest.expires);
|
|
63
|
+
if (validity.state === "not_yet_valid" || now < notBefore) {
|
|
64
|
+
logger.error("directory.auth.manifest.not.yet.valid", {
|
|
65
|
+
manifestVersion: manifest.version,
|
|
66
|
+
notBefore: manifest.not_before,
|
|
67
|
+
});
|
|
68
|
+
return { manifestVerified, verifiedManifestVersion, consortiumEndpoints, verifiedManifest, unresolvedNodes, unresolvedSweptAt };
|
|
69
|
+
}
|
|
70
|
+
if (validity.state === "expired" || expiresAt <= now) {
|
|
71
|
+
logger.error("directory.auth.manifest.expired", {
|
|
72
|
+
manifestVersion: manifest.version,
|
|
73
|
+
expiresAt: manifest.expires,
|
|
74
|
+
});
|
|
75
|
+
return { manifestVerified, verifiedManifestVersion, consortiumEndpoints, verifiedManifest, unresolvedNodes, unresolvedSweptAt };
|
|
76
|
+
}
|
|
77
|
+
// Anti-rollback. Equal versions are fine (a restart on an unchanged manifest); only a STRICTLY
|
|
78
|
+
// older version is a rollback attempt.
|
|
79
|
+
const lastSeen = await manifestVersionStore.getLastSeenVersion();
|
|
80
|
+
if (lastSeen !== null && manifest.version < lastSeen) {
|
|
81
|
+
logger.error("directory.auth.manifest.version.rollback", {
|
|
82
|
+
manifestVersion: manifest.version,
|
|
83
|
+
lastSeenVersion: lastSeen,
|
|
84
|
+
});
|
|
85
|
+
return { manifestVerified, verifiedManifestVersion, consortiumEndpoints, verifiedManifest, unresolvedNodes, unresolvedSweptAt };
|
|
86
|
+
}
|
|
87
|
+
await manifestVersionStore.persistVersion(manifest.version);
|
|
88
|
+
manifestVerified = true;
|
|
89
|
+
verifiedManifestVersion = manifest.version;
|
|
90
|
+
// Retained ONLY here — on the one path where the signatures, the window, and the anti-rollback
|
|
91
|
+
// check have all passed.
|
|
92
|
+
verifiedManifest = manifest;
|
|
93
|
+
logger.info("directory.auth.manifest.verified", {
|
|
94
|
+
manifestVersion: manifest.version,
|
|
95
|
+
signerCount: manifest.signatures.length,
|
|
96
|
+
});
|
|
97
|
+
// DOD-MANIFEST-1: resolve the FULL verified node set — this is the roster a T-of-N ceremony
|
|
98
|
+
// fans out to. Availability-aware: a down node is skipped and the rest still resolve. The
|
|
99
|
+
// threshold gate lives in the ceremony layer (DOD-DKG-1); it NEVER falls back to the single
|
|
100
|
+
// hardcoded endpoint for a missing node, which would mask a down/forged node as healthy.
|
|
101
|
+
consortiumEndpoints = await manifestNodesToEndpoints(manifest.nodes, {
|
|
102
|
+
logger,
|
|
103
|
+
fetchFn,
|
|
104
|
+
// The detail this sweep used to throw away. See ManifestGateResult.unresolvedNodes.
|
|
105
|
+
onNodeUnresolved: (f) => unresolvedNodes.push(f),
|
|
106
|
+
});
|
|
107
|
+
unresolvedSweptAt = new Date().toISOString();
|
|
108
|
+
const declaredNodes = manifest.nodes.length;
|
|
109
|
+
const resolvedNodes = consortiumEndpoints.length;
|
|
110
|
+
// Carry the nodeId↔peerId pairing (not just peerIds) so a consumer can verify each manifest
|
|
111
|
+
// identity is bound to the right live directory, not merely that the set has the right size.
|
|
112
|
+
const consortiumLog = {
|
|
113
|
+
manifestVersion: manifest.version,
|
|
114
|
+
declaredNodes,
|
|
115
|
+
resolvedNodes,
|
|
116
|
+
nodes: consortiumEndpoints.map((e) => ({ nodeId: e.nodeId, peerId: e.peerId })),
|
|
117
|
+
};
|
|
118
|
+
// Degraded ≠ healthy: a shrunken or empty roster must be loud, never buried at info.
|
|
119
|
+
if (resolvedNodes === 0) {
|
|
120
|
+
logger.error("directory.consortium.none", consortiumLog);
|
|
121
|
+
}
|
|
122
|
+
else if (resolvedNodes < declaredNodes) {
|
|
123
|
+
logger.warn("directory.consortium.partial", consortiumLog);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
logger.info("directory.consortium.resolved", consortiumLog);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
logger.error("directory.auth.manifest.load.failed", {
|
|
131
|
+
error: extractErrorMessage(err),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return { manifestVerified, verifiedManifestVersion, consortiumEndpoints, verifiedManifest, unresolvedNodes, unresolvedSweptAt };
|
|
135
|
+
}
|
|
136
|
+
export function createConsortiumRouting(deps) {
|
|
137
|
+
const { manifestProvider, manifestRootKeys, manifestThreshold, manifestVersionStore, manifestPollScheduler, directoryHttpUrl, directoryEndpointResolver, logger, fetchFn, } = deps;
|
|
138
|
+
// LAST failure per node, not a running count — the operator needs the current state, and a node
|
|
139
|
+
// that has started resolving again must drop out rather than linger as a stale complaint. Cleared
|
|
140
|
+
// per sweep: every resolve attempt rebuilds this from what actually failed that time.
|
|
141
|
+
//
|
|
142
|
+
// SEEDED from the startup sweep, because otherwise this is empty until some ceremony happens to
|
|
143
|
+
// resolve a roster — and the operator's first `cello status` after boot lands squarely in that
|
|
144
|
+
// window. That silence is the whole reason item 6 exists. The seed is a starting value, not a
|
|
145
|
+
// floor: the first real sweep replaces it, so a node that has recovered stops being reported.
|
|
146
|
+
let unresolvedNodes = [...(deps.initialUnresolvedNodes ?? [])];
|
|
147
|
+
let unresolvedSweptAt = deps.initialUnresolvedSweptAt ?? null;
|
|
148
|
+
const getUnresolvedNodes = () => [...unresolvedNodes];
|
|
149
|
+
const getUnresolvedSweptAt = () => unresolvedSweptAt;
|
|
150
|
+
/**
|
|
151
|
+
* When the reading currently held was STARTED (epoch ms), so a slow sweep cannot overwrite a
|
|
152
|
+
* newer one — `DOD-M15-STALEROSTER-1` review F6.
|
|
153
|
+
*/
|
|
154
|
+
let unresolvedStartedAtMs = deps.initialUnresolvedSweptAt ? Date.parse(deps.initialUnresolvedSweptAt) : 0;
|
|
155
|
+
const resolveConsortiumRoster = async (budget) => {
|
|
156
|
+
const m = manifestProvider?.getCurrentManifest();
|
|
157
|
+
if (!m) {
|
|
158
|
+
// DOD-M15-STALEROSTER-1 review F13: this returns before the write and used to return before
|
|
159
|
+
// any log too, so "there is no manifest to probe" was indistinguishable from a clean sweep —
|
|
160
|
+
// the background sweep would tick forever, succeed every time, and never move the reading.
|
|
161
|
+
logger.warn("directory.roster.sweep.no_manifest", {
|
|
162
|
+
impact: "no roster measurement was taken — there is no verified manifest to enumerate nodes from, " +
|
|
163
|
+
"so cello_status keeps whatever reading it already had.",
|
|
164
|
+
});
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* STAMP THE START, NOT THE FINISH — review F6.
|
|
169
|
+
*
|
|
170
|
+
* `unresolvedSweptAt = new Date()` after the await recorded when the sweep COMPLETED, and there
|
|
171
|
+
* is no mutual exclusion between the ten callers. The background sweep uses the patient probe
|
|
172
|
+
* (up to ~16 s) while the failover resolver uses FAST_PROBE (2 s), so the two overlap routinely:
|
|
173
|
+
* a slow-but-healthy node is marked unresolved by the fast sweep, the patient sweep finishes
|
|
174
|
+
* later and resolves it — or the reverse — and whichever lands last is stamped "measured now, 0
|
|
175
|
+
* seconds old". The operator gets a confidently fresh reading assembled from a race.
|
|
176
|
+
*
|
|
177
|
+
* Recording the start time and discarding a completion that began before the reading currently
|
|
178
|
+
* held makes last-writer-wins into newest-measurement-wins.
|
|
179
|
+
*/
|
|
180
|
+
const startedAtMs = Date.now();
|
|
181
|
+
const failures = [];
|
|
182
|
+
const endpoints = await manifestNodesToEndpoints(m.nodes, {
|
|
183
|
+
logger,
|
|
184
|
+
fetchFn,
|
|
185
|
+
onNodeUnresolved: (f) => failures.push(f),
|
|
186
|
+
...(budget ? { probeBudget: budget } : {}),
|
|
187
|
+
});
|
|
188
|
+
if (startedAtMs >= unresolvedStartedAtMs) {
|
|
189
|
+
unresolvedNodes = failures;
|
|
190
|
+
unresolvedSweptAt = new Date(startedAtMs).toISOString();
|
|
191
|
+
unresolvedStartedAtMs = startedAtMs;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Not an error — a slower sweep that began earlier finished later. Its endpoints are still
|
|
195
|
+
// returned to ITS caller; only the shared reading is left alone.
|
|
196
|
+
logger.info("directory.roster.sweep.superseded", {
|
|
197
|
+
startedAt: new Date(startedAtMs).toISOString(),
|
|
198
|
+
heldReadingStartedAt: new Date(unresolvedStartedAtMs).toISOString(),
|
|
199
|
+
impact: "this sweep's result was discarded for the status reading because a newer measurement is already held.",
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return endpoints;
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* How many nodes the VERIFIED MANIFEST declares — no probe, no derivation.
|
|
206
|
+
*
|
|
207
|
+
* DOD-M15-ERRSTRING-1 (review MEDIUM-2). The roster-shortfall note first computed
|
|
208
|
+
* `declared = reachable + unresolved`, which silently undercounts: `manifestNodesToEndpoints`
|
|
209
|
+
* also drops nodes for an invalid endpoint and for a peer-id mismatch, and neither calls
|
|
210
|
+
* `onNodeUnresolved`. With 5 declared, 2 peer-id mismatches and 1 probe failure, that arithmetic
|
|
211
|
+
* yields a threshold of 2 and the note reports ceremonies CAN complete — when the real threshold
|
|
212
|
+
* is 3 and they cannot. The line whose job is to name a shortfall would have denied it.
|
|
213
|
+
*
|
|
214
|
+
* Worse, when every drop is a silent one the note is empty — mute on exactly the security-relevant
|
|
215
|
+
* case, since a peer-id mismatch is a node you most want named.
|
|
216
|
+
*/
|
|
217
|
+
const getDeclaredNodeCount = () => manifestProvider?.getCurrentManifest()?.nodes.length ?? null;
|
|
218
|
+
// DECLARED membership, straight off the verified manifest — no probe. Lets the resolver reject a
|
|
219
|
+
// primary that resolves but belongs to a different consortium (the compiled-in default URL after
|
|
220
|
+
// a consortium move) without mistaking a momentarily-down member for a non-member.
|
|
221
|
+
/**
|
|
222
|
+
* DOD-M15-EXPIRY-CONSUMER-POLICY-1 — THE FOURTH CONSUMER, missed by the line's own enumeration and
|
|
223
|
+
* found by its review. The line named three; this is where the residual risk actually lives.
|
|
224
|
+
*
|
|
225
|
+
* This is the consortium MEMBERSHIP set: it lets the resolver reject a directory endpoint that
|
|
226
|
+
* resolves but belongs to a different consortium. Read from a lapsed manifest, a node REMOVED
|
|
227
|
+
* since the lapse is still a member here — so it can still be accepted as the endpoint this daemon
|
|
228
|
+
* talks to, which is the seat that coordinates a ceremony and declares the participant count.
|
|
229
|
+
*
|
|
230
|
+
* **Same verdict as the other two permitting consumers, for the same reason.** Refusing means the
|
|
231
|
+
* resolver can accept no endpoint at all, which takes a running daemon offline for a manifest that
|
|
232
|
+
* was valid when it started — the identical bricking cost, and this one is reached inside the 10 s
|
|
233
|
+
* signaling wait, so it fails fast and silently.
|
|
234
|
+
*
|
|
235
|
+
* **Reported once per manifest version.** This runs per resolution attempt, not per challenge, so
|
|
236
|
+
* a version key is the right granularity — unlike the challenge verifier, where a per-node key was
|
|
237
|
+
* needed because `nodeId` is in the payload.
|
|
238
|
+
*/
|
|
239
|
+
let lapsedMembershipReportedFor = null;
|
|
240
|
+
const getManifestPeerIds = () => {
|
|
241
|
+
const m = manifestProvider?.getCurrentManifest();
|
|
242
|
+
if (!m)
|
|
243
|
+
return null;
|
|
244
|
+
const ids = m.nodes.map((n) => n.peerId).filter((p) => typeof p === "string" && p.length > 0);
|
|
245
|
+
/**
|
|
246
|
+
* ⚠️ REPORT ONLY IF A MEMBERSHIP SET IS ACTUALLY PRODUCED — pass 2, and this is the over-claim
|
|
247
|
+
* class that the register-handler rewording had just fixed, reintroduced by me in the consumer
|
|
248
|
+
* that review asked for.
|
|
249
|
+
*
|
|
250
|
+
* The first version reported BEFORE this filter. `ids.length === 0` returns `null`, and the
|
|
251
|
+
* caller treats `null` as **skip the membership check entirely** — so the event announced that
|
|
252
|
+
* "the set deciding which endpoints this daemon will accept came from a lapsed manifest" when no
|
|
253
|
+
* set was produced and nothing was decided. Not an edge case: `peerId` is OPTIONAL, and
|
|
254
|
+
* manifests written before the field existed carry none — for those the claim is ALWAYS false,
|
|
255
|
+
* and the once-per-version budget is spent saying it.
|
|
256
|
+
*
|
|
257
|
+
* `members` is the FILTERED count for the same reason: the member set is what survives the
|
|
258
|
+
* filter, not how many nodes the manifest lists.
|
|
259
|
+
*/
|
|
260
|
+
const validity = classifyManifestValidity(m, Date.now());
|
|
261
|
+
if (ids.length > 0 && validity.state !== "valid" && validity.state !== "expiring_soon" && lapsedMembershipReportedFor !== m.version) {
|
|
262
|
+
lapsedMembershipReportedFor = m.version;
|
|
263
|
+
logger.warn("directory.membership.manifest.lapsed", {
|
|
264
|
+
manifestVersion: m.version,
|
|
265
|
+
state: validity.state,
|
|
266
|
+
members: ids.length,
|
|
267
|
+
impact: "the set deciding WHICH directory endpoints this daemon will accept came from a manifest " +
|
|
268
|
+
"outside its validity window. A node removed from the consortium since then is still a " +
|
|
269
|
+
"member by this reckoning, so it can still be accepted as the directory this daemon talks " +
|
|
270
|
+
"to — the seat that coordinates a ceremony and declares the participant count.",
|
|
271
|
+
guidance: "Endpoint selection was NOT blocked — refusing here accepts no directory at all and takes " +
|
|
272
|
+
"a running daemon offline. cello_status reports the window and where the manifest came from.",
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
return ids.length > 0 ? new Set(ids) : null;
|
|
276
|
+
};
|
|
277
|
+
const failoverEndpointResolver = directoryEndpointResolver
|
|
278
|
+
? createRosterAwareEndpointResolver({
|
|
279
|
+
primaryResolver: directoryEndpointResolver,
|
|
280
|
+
// FAST_PROBE (review HIGH-1): this resolver runs inside the 10 s signaling wait, and the
|
|
281
|
+
// roster sweep is its slowest leg — Promise.all waits for the slowest node, so one
|
|
282
|
+
// unreachable node cost 16 s here while the failover path had already spent 8 s on the
|
|
283
|
+
// primary. Persistence belongs to startup and the background poll, where nothing waits.
|
|
284
|
+
getConsortiumRoster: () => resolveConsortiumRoster(FAST_PROBE),
|
|
285
|
+
getManifestPeerIds,
|
|
286
|
+
logger,
|
|
287
|
+
})
|
|
288
|
+
: undefined;
|
|
289
|
+
const getFailoverEndpoint = async () => failoverEndpointResolver ? await failoverEndpointResolver() : null;
|
|
290
|
+
// CELLO-M7-CONN-001 (DOD-CONN-3): the daemon-level manifest poll — it adopts a newer manifest
|
|
291
|
+
// independent of any agent identity, and so runs even with ZERO agents (the keystone it replaced
|
|
292
|
+
// could not). Off on the M6 back-compat path (no scheduler), and off without real root keys: a
|
|
293
|
+
// poll that verifies against an empty key set verifies against nothing.
|
|
294
|
+
let stopHttpManifestPoll;
|
|
295
|
+
/**
|
|
296
|
+
* DOD-M15-DIRAUTH-1 (Andre's quick win #3) — **AN EMPTY KEY SET MUST NOT DISABLE THE POLL IN
|
|
297
|
+
* SILENCE.**
|
|
298
|
+
*
|
|
299
|
+
* The condition below is correct and stays correct: a poll that verifies against no keys verifies
|
|
300
|
+
* against nothing, so it must not run. What was wrong is what happened when that triggered —
|
|
301
|
+
* nothing at all. The daemon started, looked healthy, and simply never adopted a new manifest
|
|
302
|
+
* again, which is the failure mode you discover months later when a rotated directory key is not
|
|
303
|
+
* picked up.
|
|
304
|
+
*
|
|
305
|
+
* ⚠️ THE DISTINCTION THAT MAKES THIS SAFE, and the reason it is not a blanket throw: **"no
|
|
306
|
+
* scheduler" is a legitimate configuration** — the M6 back-compat path deliberately runs without
|
|
307
|
+
* one, and failing startup there would brick a supported setup. **"Scheduler and provider are
|
|
308
|
+
* wired, but the keys are empty" is a MISCONFIGURATION** — someone intended verification and
|
|
309
|
+
* supplied nothing to verify with. Only the second refuses.
|
|
310
|
+
*/
|
|
311
|
+
if (manifestPollScheduler && manifestProvider) {
|
|
312
|
+
const keyCount = manifestRootKeys?.length ?? 0;
|
|
313
|
+
if (keyCount === 0 || !manifestThreshold || manifestThreshold < 1) {
|
|
314
|
+
const detail = `rootKeys=${String(keyCount)} threshold=${String(manifestThreshold ?? 0)}`;
|
|
315
|
+
logger.error("directory.manifest.poll.misconfigured", {
|
|
316
|
+
rootKeyCount: keyCount,
|
|
317
|
+
threshold: manifestThreshold ?? 0,
|
|
318
|
+
impact: "the manifest poll is wired but has no key set to verify against, so it would adopt " +
|
|
319
|
+
"manifests unverified or never adopt one at all — refusing at startup instead of running " +
|
|
320
|
+
"with directory-key rotation silently dead",
|
|
321
|
+
});
|
|
322
|
+
throw new Error(`directory_manifest_poll_misconfigured: ${detail}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (manifestPollScheduler && manifestProvider && manifestRootKeys && manifestRootKeys.length > 0 && manifestThreshold && manifestThreshold >= 1) {
|
|
326
|
+
stopHttpManifestPoll = startHttpManifestPoll({
|
|
327
|
+
scheduler: manifestPollScheduler,
|
|
328
|
+
directoryUrl: directoryHttpUrl ?? resolveDirectoryUrl(process.env),
|
|
329
|
+
manifestProvider,
|
|
330
|
+
manifestVersionStore,
|
|
331
|
+
rootKeys: manifestRootKeys,
|
|
332
|
+
threshold: manifestThreshold,
|
|
333
|
+
logger,
|
|
334
|
+
mintCorrelationId: () => randomUUID(),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return { resolveConsortiumRoster, failoverEndpointResolver, getFailoverEndpoint, getUnresolvedNodes, getUnresolvedSweptAt, getDeclaredNodeCount, stopHttpManifestPoll };
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=consortium-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consortium-bootstrap.js","sourceRoot":"","sources":["../src/consortium-bootstrap.ts"],"names":[],"mappings":"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"}
|