@cello-protocol/daemon 0.0.227 → 0.0.229
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 +454 -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,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `DOD-M15-CARRIEDSEAL-1` — THE CLOSE THAT DOES NOT NEED ANYONE ELSE TO BE AWAKE.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `session-seal.ts` rather than written beside it, for the reason that file's own
|
|
5
|
+
* ratchet exists: a seal path that keeps growing in one place is how the second implementation of a
|
|
6
|
+
* seal gets written next to the first. There is exactly one caller.
|
|
7
|
+
*/
|
|
8
|
+
import { decodeStructure1 } from "@cello-protocol/protocol-types";
|
|
9
|
+
import { buildLocalSealTerminus } from "./seal-local-terminus.js";
|
|
10
|
+
import { RELAY_GAVE_NO_ANSWER, relayRefusedUs } from "./seal-relay-silence.js";
|
|
11
|
+
import { SessionSealLeafStore } from "./session-seal-leaf-store.js";
|
|
12
|
+
/**
|
|
13
|
+
* ═══ 070-CARRIEDSEAL — THE CLOSE THAT DOES NOT NEED ANYONE ELSE TO BE AWAKE ═══
|
|
14
|
+
*
|
|
15
|
+
* Returns the escalation values for a seal closed over evidence this side already holds, or
|
|
16
|
+
* `null` when this is not that situation and the caller should fail exactly as it did before.
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ `null` IS THE DEFAULT, AND THAT IS THE SAFETY PROPERTY. Every way out of here that is not a
|
|
19
|
+
* successfully written terminus returns `null`, so the caller's original refusal stands with its
|
|
20
|
+
* original reason. A bug in this method costs the receipt this order was written to save; it
|
|
21
|
+
* cannot turn a relay's ruling into a seal.
|
|
22
|
+
*
|
|
23
|
+
* The first gate is the important one: `RELAY_GAVE_NO_ANSWER` separates a relay that was not there
|
|
24
|
+
* from one that considered the leaf and declined it. Routing around a ruling is the thing a trust
|
|
25
|
+
* layer must never do, and "the submit failed" alone does not tell the two apart.
|
|
26
|
+
*/
|
|
27
|
+
export async function closeOverCarriedEvidence(deps, agentName, sessionId, cause, correlationId,
|
|
28
|
+
/**
|
|
29
|
+
* The relay's standing verdict about THIS AGENT, when there is a relay client to ask. The reason
|
|
30
|
+
* string cannot carry it — see `relayRefusedUs` — so it is passed alongside.
|
|
31
|
+
*/
|
|
32
|
+
standingRefusal) {
|
|
33
|
+
if (!RELAY_GAVE_NO_ANSWER.has(cause))
|
|
34
|
+
return null;
|
|
35
|
+
if (relayRefusedUs(standingRefusal)) {
|
|
36
|
+
/**
|
|
37
|
+
* THE RELAY ANSWERED, AND THE ANSWER WAS NO. Sealing over carried evidence here would be
|
|
38
|
+
* routing around a ruling — the relay authenticated this agent and then refused it, and that
|
|
39
|
+
* refusal is a decision about us rather than an absence of anyone to ask.
|
|
40
|
+
*/
|
|
41
|
+
deps.ctx.logger.warn("session.seal.local_terminus.relay_refused", {
|
|
42
|
+
agentName, sessionId, cause, relayReason: standingRefusal?.reason, correlationId,
|
|
43
|
+
impact: "the relay REFUSED this agent rather than being unreachable, so this side did not sign its own closing leaf. No receipt was produced and the session is untouched — closing around a refusal would put a record on the chain that the witness declined to witness.",
|
|
44
|
+
guidance: "Fix what the relay refused (cello status names it — an expired credential, a rate limit, or a capacity cap), then close again. If the relay is genuinely gone rather than refusing, the close will proceed on its own.",
|
|
45
|
+
});
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const kp = deps.ctx.getKeyProvider(agentName);
|
|
49
|
+
if (!kp) {
|
|
50
|
+
// Not a silent skip: without this agent's key nothing here can be signed, and the operator's
|
|
51
|
+
// action ("start the agent") is different from every other reason a close fails.
|
|
52
|
+
deps.ctx.logger.warn("session.seal.local_terminus.key_unavailable", {
|
|
53
|
+
agentName, sessionId, cause, correlationId,
|
|
54
|
+
impact: "the relay could not be reached and this agent's key is not loaded, so the closing leaf could not be signed here either. No receipt was produced and nothing about the session changed.",
|
|
55
|
+
guidance: "Start the agent (cello_start_agent) and close again.",
|
|
56
|
+
});
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const ownPubkey = new Uint8Array(await kp.getPublicKey());
|
|
60
|
+
const ownPubkeyHex = Buffer.from(ownPubkey).toString("hex");
|
|
61
|
+
const carry = deps.getSealCarry(ownPubkeyHex, sessionId);
|
|
62
|
+
/**
|
|
63
|
+
* The session id comes out of the LEAVES, not out of the caller's argument. The directory checks
|
|
64
|
+
* the terminus against the same session the carried leaves name, so reading it from anywhere
|
|
65
|
+
* else would let the two disagree — and this path exists precisely for the case where no live
|
|
66
|
+
* relay registration is around to be consulted.
|
|
67
|
+
*/
|
|
68
|
+
const first = carry[0] ? decodeStructure1(carry[0].structure1Cbor) : null;
|
|
69
|
+
if (!first?.ok) {
|
|
70
|
+
/**
|
|
71
|
+
* TWO DIFFERENT FACTS, AND THEY SEND THE OPERATOR TO DIFFERENT PLACES. An empty carry means the
|
|
72
|
+
* conversation was never witnessed; an undecodable first leaf means the record IS here and is
|
|
73
|
+
* damaged. Reporting the second as the first sends someone looking for something that is not
|
|
74
|
+
* missing.
|
|
75
|
+
*/
|
|
76
|
+
const empty = carry.length === 0;
|
|
77
|
+
deps.ctx.logger.info("session.seal.local_terminus.no_carry", {
|
|
78
|
+
agentName, sessionId, cause, carryLength: carry.length,
|
|
79
|
+
reason: empty ? "seal_carry_empty" : "seal_carry_unreadable", correlationId,
|
|
80
|
+
impact: empty
|
|
81
|
+
? "no witnessed leaf is held for this session, so there is no record to close over and no receipt to produce."
|
|
82
|
+
: "this session's first recorded leaf is on disk and cannot be decoded, so the record cannot be chained onto. The conversation is NOT missing — cello_transcript still shows it — but no receipt can be produced from this side.",
|
|
83
|
+
});
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* ⚠️ NO GENESIS, NO TERMINUS — and this used to be `?? new Uint8Array(32)`.
|
|
88
|
+
*
|
|
89
|
+
* The genesis is the session's agreed starting point, and it is what BOTH chain links fall back to
|
|
90
|
+
* for a party that has not spoken yet. Substituting thirty-two zero bytes does not fail: the
|
|
91
|
+
* directory's walk skips `prev_own_hash` for a sender's first leaf and never checks
|
|
92
|
+
* `last_seen_hash` at all, so the leaf notarizes and the counterparty — verifying against the real
|
|
93
|
+
* starting point — is the one who finds a link that does not reconcile. A silent substitution
|
|
94
|
+
* whose cost lands on the other party.
|
|
95
|
+
*
|
|
96
|
+
* The send path already refuses for exactly this reason ("no seed means no send… the honest
|
|
97
|
+
* outcome is to refuse rather than sign a chain anchored to nothing"). So does this.
|
|
98
|
+
*/
|
|
99
|
+
const genesis = deps.ctx.leafRecords.sessionGenesisPrevRoot(agentName, sessionId);
|
|
100
|
+
if (!genesis) {
|
|
101
|
+
deps.ctx.logger.warn("session.seal.local_terminus.no_genesis", {
|
|
102
|
+
agentName, sessionId, cause, correlationId,
|
|
103
|
+
impact: "this session has no recorded starting point on this machine, so a closing leaf written here could not link to anything and its place in the conversation could never be proven. Nothing was signed and the session is untouched.",
|
|
104
|
+
guidance: "Close WITH your counterparty instead — a bilateral close does not need this value. cello_transcript still shows the conversation either way.",
|
|
105
|
+
});
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const built = await buildLocalSealTerminus({
|
|
109
|
+
carry,
|
|
110
|
+
ownPubkeyHex,
|
|
111
|
+
ownPubkey,
|
|
112
|
+
sessionIdBytes: first.fields.sessionId,
|
|
113
|
+
genesis,
|
|
114
|
+
finalRootHex: deps.ctx.getSessionTreeRootHex(agentName, sessionId),
|
|
115
|
+
closeTimestamp: Date.now(),
|
|
116
|
+
sign: async (bytes) => new Uint8Array(await kp.sign(bytes)),
|
|
117
|
+
});
|
|
118
|
+
if (!built.ok) {
|
|
119
|
+
/**
|
|
120
|
+
* ⚠️ AN ALREADY-PLACED TERMINUS IS A SUCCESS BEING REPORTED AS A FAILURE — review MEDIUM-3.
|
|
121
|
+
*
|
|
122
|
+
* `seal_carry_own_ctrl_present` means a previous close already wrote our closing leaf. Returning
|
|
123
|
+
* `null` sent the caller to its original refusal, so an operator who closed successfully and then
|
|
124
|
+
* closed again — or whose reconnect retried for them — was told the RELAY was unavailable, for a
|
|
125
|
+
* session whose closing leaf is on their own disk. The terminus builder's own docblock says the
|
|
126
|
+
* caller must reuse the one that is there; nobody did.
|
|
127
|
+
*
|
|
128
|
+
* Reused rather than rebuilt: the leaf on disk is the one whose bytes were signed, and rebuilding
|
|
129
|
+
* would produce a different timestamp and therefore a different record.
|
|
130
|
+
*/
|
|
131
|
+
if (built.reason === "seal_carry_own_ctrl_present") {
|
|
132
|
+
const existing = carry.find((l) => l.leafKind === 0x02 && l.senderPubkeyHex === ownPubkeyHex);
|
|
133
|
+
const priorS1 = existing ? decodeStructure1(existing.structure1Cbor) : null;
|
|
134
|
+
if (existing && priorS1?.ok) {
|
|
135
|
+
const priorRootHex = deps.ctx.getSessionTree(agentName, sessionId)
|
|
136
|
+
.rootWithAppendedHex(Buffer.from(priorS1.fields.contentHash).toString("hex"));
|
|
137
|
+
deps.ctx.logger.info("session.seal.local_terminus.reused", {
|
|
138
|
+
agentName, sessionId, cause, sequenceNumber: existing.sequenceNumber, correlationId,
|
|
139
|
+
impact: "this side had already signed its closing leaf for this session, so the earlier one is carried again rather than a second being written. A second closing leaf would make the session unsealable by any directory, permanently.",
|
|
140
|
+
});
|
|
141
|
+
return { ok: true, sequenceNumber: existing.sequenceNumber, reportedRootHex: priorRootHex };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
deps.ctx.logger.warn("session.seal.local_terminus.refused", {
|
|
145
|
+
agentName, sessionId, cause, reason: built.reason, correlationId,
|
|
146
|
+
impact: "the relay could not be reached and the record this side holds cannot be closed over as it stands, so no receipt was produced.",
|
|
147
|
+
});
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
if (!deps.ctx.sealLeafStore && deps.db) {
|
|
151
|
+
deps.ctx.sealLeafStore = new SessionSealLeafStore(deps.db, deps.ctx.logger);
|
|
152
|
+
}
|
|
153
|
+
const wrote = deps.ctx.sealLeafStore?.store(ownPubkeyHex, sessionId, built.leaf, Date.now()) ?? false;
|
|
154
|
+
if (!wrote) {
|
|
155
|
+
/**
|
|
156
|
+
* The store is INSERT OR IGNORE on the position, so a false means something already occupies
|
|
157
|
+
* it. Refusing is the only safe answer: carrying a leaf that is not the one on disk would
|
|
158
|
+
* present a record this daemon does not actually hold.
|
|
159
|
+
*/
|
|
160
|
+
deps.ctx.logger.warn("session.seal.local_terminus.position_taken", {
|
|
161
|
+
agentName, sessionId, sequenceNumber: built.leaf.sequenceNumber, correlationId,
|
|
162
|
+
impact: "a leaf is already recorded at the position the closing leaf would take, so it was not written and no receipt was produced.",
|
|
163
|
+
});
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
// The reported root is the certified-root domain — content hashes, this leaf appended. The same
|
|
167
|
+
// derivation the relay path uses one method down, so both close paths report the same value for
|
|
168
|
+
// the same leaf set.
|
|
169
|
+
const reportedRootHex = deps.ctx.getSessionTree(agentName, sessionId).rootWithAppendedHex(built.contentHashHex);
|
|
170
|
+
deps.ctx.logger.info("session.seal.local_terminus.placed", {
|
|
171
|
+
agentName, sessionId, cause,
|
|
172
|
+
sequenceNumber: built.leaf.sequenceNumber,
|
|
173
|
+
carryLength: carry.length,
|
|
174
|
+
correlationId,
|
|
175
|
+
impact: "the relay did not answer, so this side signed its own closing leaf over the record it already holds. The seal proceeds on carried evidence and needs no relay.",
|
|
176
|
+
});
|
|
177
|
+
return { ok: true, sequenceNumber: built.leaf.sequenceNumber, reportedRootHex };
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=seal-carried-close.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal-carried-close.js","sourceRoot":"","sources":["../src/seal-carried-close.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOD-TERMINAL-STATE-DIVERGENCE-1 — ask the directory for a seal certificate we were never pushed.
|
|
3
|
+
*
|
|
4
|
+
* `session_sealed` is pushed ONCE, over this agent's authenticated directory signaling stream. If
|
|
5
|
+
* that stream is down at the instant the directory pushes, the frame is gone: the directory's
|
|
6
|
+
* re-delivery queue is per-node while clients roam across nodes, so reconnecting elsewhere drains an
|
|
7
|
+
* empty queue. The session IS notarized and the counterparty holds a receipt; this side holds an
|
|
8
|
+
* `interrupted` row and — before this module — could never produce one.
|
|
9
|
+
*
|
|
10
|
+
* The result was a deadlock of two individually-true answers. `cello_close_session` reported
|
|
11
|
+
* `session_already_sealed`; `cello_sealed_receipt` reported `not_sealed_yet`; each pointed at the
|
|
12
|
+
* other, and the only exit an operator found was a force-abandon that PERMANENTLY forfeited this
|
|
13
|
+
* side's half of a receipt that existed on the counterparty's.
|
|
14
|
+
*
|
|
15
|
+
* THE DIRECTORY IS NOT TRUSTED HERE. A pulled certificate is recorded only if
|
|
16
|
+
* `verifyBilateralSealCertificate` accepts it — the same verifier, over the same TBS, that the push
|
|
17
|
+
* path runs. A directory that altered `legibility` or `leaf_count` changes the hash and the FROST
|
|
18
|
+
* signature fails. That is what makes serving this from ANY node safe, and it is why the pull adds
|
|
19
|
+
* no new trust in the directory even though it adds a new thing to ask it.
|
|
20
|
+
*/
|
|
21
|
+
import { SignalingManager } from "@cello-protocol/transport";
|
|
22
|
+
import type { DaemonRegistrationPersistence } from "./registration-persistence.js";
|
|
23
|
+
import type { SessionNodeManager } from "./session-node-manager.js";
|
|
24
|
+
import type { Logger } from "./types.js";
|
|
25
|
+
export interface SealCertificatePullDeps {
|
|
26
|
+
logger: Logger;
|
|
27
|
+
sessionNodeManager: SessionNodeManager;
|
|
28
|
+
signalingFor: (agentName: string) => SignalingManager | undefined;
|
|
29
|
+
sendOver: (agentName: string, frame: Record<string, unknown>) => Promise<{
|
|
30
|
+
ok: boolean;
|
|
31
|
+
reason?: string;
|
|
32
|
+
}>;
|
|
33
|
+
getPersistence: (agentName: string) => DaemonRegistrationPersistence;
|
|
34
|
+
getAgentPubkeyHex: (agentName: string) => string | undefined;
|
|
35
|
+
}
|
|
36
|
+
export type SealCertificatePullResult =
|
|
37
|
+
/**
|
|
38
|
+
* `verified` is REQUIRED, not optional, and that is the point.
|
|
39
|
+
*
|
|
40
|
+
* `verifyBilateralSealCertificate` returns `{ok:true, verified:false}` when this daemon holds no
|
|
41
|
+
* key for the certificate's signer — a legitimate state, and no longer a rare one: clearing a
|
|
42
|
+
* counterparty's pin (the remedy for the identity-refusal lockout) moves every past session with
|
|
43
|
+
* them from *verified* to *taken on their word*.
|
|
44
|
+
*
|
|
45
|
+
* Until now the pull returned `{ok:true, rootHex}` either way, so `cello_sealed_receipt` handed
|
|
46
|
+
* the agent a response byte-for-byte identical to a verified one. An operator could clear a
|
|
47
|
+
* contact, pull an old receipt, and pass it to a third party as proof. It is not proof, and
|
|
48
|
+
* nothing in the response said so. Making the field non-optional means a new caller cannot
|
|
49
|
+
* construct this result without deciding what to tell them.
|
|
50
|
+
*/
|
|
51
|
+
{
|
|
52
|
+
ok: true;
|
|
53
|
+
rootHex: string;
|
|
54
|
+
verified: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* `reason` is never collapsed. Each of these sends the caller somewhere different, and the whole
|
|
58
|
+
* defect class this unit belongs to is exit-point labels standing in for causes:
|
|
59
|
+
* no_signaling — this daemon has no stream to ask over (not a statement about the seal)
|
|
60
|
+
* send_failed — the request never left
|
|
61
|
+
* timeout — no answer within the bound
|
|
62
|
+
* not_found — the directory has no VERIFIABLE certificate for us on this session
|
|
63
|
+
* verification_failed — a certificate arrived and did NOT verify. Never recorded. This is the
|
|
64
|
+
* one that means something is wrong rather than merely absent.
|
|
65
|
+
*/
|
|
66
|
+
| {
|
|
67
|
+
ok: false;
|
|
68
|
+
reason: "no_signaling" | "send_failed" | "timeout" | "not_found" | "verification_failed";
|
|
69
|
+
detail?: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Pull, verify and record the certificate for one session. Returns the sealed root on success.
|
|
73
|
+
*
|
|
74
|
+
* Idempotent by construction: recording a certificate we already hold is a no-op at the store, and
|
|
75
|
+
* the caller is expected to check for a local certificate first — this is the path for when there
|
|
76
|
+
* is none.
|
|
77
|
+
*/
|
|
78
|
+
export declare function pullSealCertificate(deps: SealCertificatePullDeps, agentName: string, sessionIdHex: string): Promise<SealCertificatePullResult>;
|
|
79
|
+
//# sourceMappingURL=seal-certificate-pull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal-certificate-pull.d.ts","sourceRoot":"","sources":["../src/seal-certificate-pull.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAMzC,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,GAAG,SAAS,CAAC;IAClE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3G,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,6BAA6B,CAAC;IACrE,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,MAAM,yBAAyB;AACnC;;;;;;;;;;;;;GAaG;AACD;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE;AAClD;;;;;;;;;GASG;GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,qBAAqB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAa7H;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,uBAAuB,EAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,yBAAyB,CAAC,CAmLpC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { verifyBilateralSealCertificate } from "./session-ceremony.js";
|
|
2
|
+
import { extractErrorMessage } from "./error-message.js";
|
|
3
|
+
/** Bounded so a close or a receipt read cannot hang on a directory that never answers. */
|
|
4
|
+
const SEAL_CERTIFICATE_PULL_TIMEOUT_MS = 10_000;
|
|
5
|
+
function toU8(v) {
|
|
6
|
+
if (v instanceof Uint8Array)
|
|
7
|
+
return v;
|
|
8
|
+
if (Buffer.isBuffer(v))
|
|
9
|
+
return new Uint8Array(v);
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Pull, verify and record the certificate for one session. Returns the sealed root on success.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent by construction: recording a certificate we already hold is a no-op at the store, and
|
|
16
|
+
* the caller is expected to check for a local certificate first — this is the path for when there
|
|
17
|
+
* is none.
|
|
18
|
+
*/
|
|
19
|
+
export async function pullSealCertificate(deps, agentName, sessionIdHex) {
|
|
20
|
+
const { logger, sessionNodeManager, signalingFor, sendOver, getPersistence, getAgentPubkeyHex } = deps;
|
|
21
|
+
const mgr = signalingFor(agentName);
|
|
22
|
+
if (!mgr) {
|
|
23
|
+
// NOT a statement about the seal. Saying "not found" here would tell an operator their
|
|
24
|
+
// conversation was never sealed because their own daemon had no stream — a false claim of the
|
|
25
|
+
// exact kind this line exists to remove.
|
|
26
|
+
return { ok: false, reason: "no_signaling" };
|
|
27
|
+
}
|
|
28
|
+
const sessionIdBytes = Uint8Array.from(Buffer.from(sessionIdHex, "hex"));
|
|
29
|
+
const answer = await new Promise((resolve) => {
|
|
30
|
+
const timeoutHandle = setTimeout(() => {
|
|
31
|
+
unregister();
|
|
32
|
+
resolve({ type: "timeout" });
|
|
33
|
+
}, SEAL_CERTIFICATE_PULL_TIMEOUT_MS);
|
|
34
|
+
const unregister = mgr.registerInboundHandler((frame) => {
|
|
35
|
+
if (frame.type !== "seal_certificate" && frame.type !== "seal_certificate_error")
|
|
36
|
+
return;
|
|
37
|
+
// Scope to THIS session — a concurrent pull for another session must not resolve this one.
|
|
38
|
+
const sid = toU8(frame["session_id"]);
|
|
39
|
+
if (!sid || Buffer.from(sid).toString("hex") !== sessionIdHex)
|
|
40
|
+
return;
|
|
41
|
+
clearTimeout(timeoutHandle);
|
|
42
|
+
unregister();
|
|
43
|
+
if (frame.type === "seal_certificate") {
|
|
44
|
+
resolve({ type: "seal_certificate", frame: frame });
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
resolve({ type: "seal_certificate_error", reason: typeof frame["reason"] === "string" ? frame["reason"] : "unknown" });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
void sendOver(agentName, { type: "seal_certificate_request", session_id: sessionIdBytes }).then((r) => {
|
|
51
|
+
if (r.ok)
|
|
52
|
+
return;
|
|
53
|
+
clearTimeout(timeoutHandle);
|
|
54
|
+
unregister();
|
|
55
|
+
resolve({ type: "seal_certificate_error", reason: `send_failed:${r.reason ?? "unknown"}` });
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
if (answer.type === "timeout") {
|
|
59
|
+
logger.warn("seal.certificate.pull.timeout", { agentName, sessionId: sessionIdHex });
|
|
60
|
+
return { ok: false, reason: "timeout" };
|
|
61
|
+
}
|
|
62
|
+
if (answer.type === "seal_certificate_error") {
|
|
63
|
+
if (answer.reason.startsWith("send_failed")) {
|
|
64
|
+
logger.warn("seal.certificate.pull.send_failed", { agentName, sessionId: sessionIdHex, reason: answer.reason });
|
|
65
|
+
return { ok: false, reason: "send_failed", detail: answer.reason };
|
|
66
|
+
}
|
|
67
|
+
logger.info("seal.certificate.pull.not_found", { agentName, sessionId: sessionIdHex, reason: answer.reason });
|
|
68
|
+
return { ok: false, reason: "not_found", detail: answer.reason };
|
|
69
|
+
}
|
|
70
|
+
const f = answer.frame;
|
|
71
|
+
const sealedRoot = toU8(f["sealed_root"]);
|
|
72
|
+
const frostSignature = toU8(f["frost_signature"]);
|
|
73
|
+
const signerPubkey = toU8(f["signer_pubkey"]);
|
|
74
|
+
const leafCount = typeof f["leaf_count"] === "number" ? f["leaf_count"] : null;
|
|
75
|
+
const closeTsRaw = f["close_timestamp"];
|
|
76
|
+
const closeTimestamp = typeof closeTsRaw === "number" ? closeTsRaw : typeof closeTsRaw === "bigint" ? Number(closeTsRaw) : null;
|
|
77
|
+
if (!sealedRoot || !frostSignature || !signerPubkey || leafCount === null || closeTimestamp === null) {
|
|
78
|
+
// A certificate missing a TBS field cannot be verified, so it cannot be recorded. Refusing is
|
|
79
|
+
// the only safe answer — recording it unverified is precisely the trust the pull must not add.
|
|
80
|
+
logger.error("seal.certificate.pull.malformed", {
|
|
81
|
+
agentName, sessionId: sessionIdHex,
|
|
82
|
+
reason: "missing_certificate_fields",
|
|
83
|
+
});
|
|
84
|
+
return { ok: false, reason: "verification_failed", detail: "missing_certificate_fields" };
|
|
85
|
+
}
|
|
86
|
+
const agentPubkeyHex = getAgentPubkeyHex(agentName);
|
|
87
|
+
if (!agentPubkeyHex)
|
|
88
|
+
return { ok: false, reason: "verification_failed", detail: "agent_pubkey_unavailable" };
|
|
89
|
+
const record = sessionNodeManager.getSessionRecord(agentName, sessionIdHex);
|
|
90
|
+
const verdict = await verifyBilateralSealCertificate({
|
|
91
|
+
persistence: getPersistence(agentName),
|
|
92
|
+
agentPubkeyHex,
|
|
93
|
+
logger,
|
|
94
|
+
counterpartyPrimaryHex: record?.counterparty_primary_pubkey ?? null,
|
|
95
|
+
}, {
|
|
96
|
+
sessionId: sessionIdBytes,
|
|
97
|
+
sealedRoot,
|
|
98
|
+
leafCount,
|
|
99
|
+
closeTimestamp,
|
|
100
|
+
frostSignature,
|
|
101
|
+
signerPubkey,
|
|
102
|
+
signatureType: "frost",
|
|
103
|
+
legibility: (f["legibility"] ?? null),
|
|
104
|
+
});
|
|
105
|
+
if (!verdict.ok) {
|
|
106
|
+
// Tamper-evidence: do NOT record, do NOT mark the session sealed. Same posture as the push path
|
|
107
|
+
// on a bad signature — a certificate that fails verification is worse than none, because
|
|
108
|
+
// recording it would put a forged root behind the operator's receipt.
|
|
109
|
+
logger.error("seal.certificate.pull.invalid", { agentName, sessionId: sessionIdHex, reason: verdict.reason });
|
|
110
|
+
return { ok: false, reason: "verification_failed", detail: verdict.reason };
|
|
111
|
+
}
|
|
112
|
+
if (!verdict.verified) {
|
|
113
|
+
/**
|
|
114
|
+
* ACCEPTED WITHOUT VERIFICATION — and until now that was SILENT, on a path whose own header
|
|
115
|
+
* claims it *"distinguishes them by VERIFYING a certificate, not by trusting an answer"*
|
|
116
|
+
* (review N3).
|
|
117
|
+
*
|
|
118
|
+
* `verifyBilateralSealCertificate` returns `{ok:true, verified:false}` when it does not hold the
|
|
119
|
+
* signer's key. That is a legitimate state — but it stopped being rare the moment
|
|
120
|
+
* `cello_contact_remove` began NULLing the pin (the fix for the identity-refusal lockout). One
|
|
121
|
+
* operator action silently moved every past session with that counterparty from *verified* to
|
|
122
|
+
* *taken on trust*, and nothing said so.
|
|
123
|
+
*
|
|
124
|
+
* Forgetting a counterparty's identity genuinely DOES cost the ability to verify their old
|
|
125
|
+
* certificates — the key was thrown away on purpose. The defect was never the cost; it was that
|
|
126
|
+
* the cost was invisible while a comment two files away promised the opposite. The certificate
|
|
127
|
+
* is still recorded (it arrived over an authenticated channel), and the operator is now told
|
|
128
|
+
* what they are holding.
|
|
129
|
+
*/
|
|
130
|
+
logger.warn("seal.certificate.pull.unverified", {
|
|
131
|
+
agentName,
|
|
132
|
+
sessionId: sessionIdHex,
|
|
133
|
+
reason: verdict.reason,
|
|
134
|
+
impact: "this certificate was accepted without checking its signature, because this daemon holds no key for its signer — most often because the counterparty's pinned identity was cleared by cello_contact_remove. The sealed root is recorded on the counterparty's word, not on a verified signature",
|
|
135
|
+
guidance: "if you need this receipt to be independently verifiable, ask the counterparty to re-seal, or re-establish a session with them first so their identity is pinned again",
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const rootHex = Buffer.from(sealedRoot).toString("hex");
|
|
139
|
+
const legibility = f["legibility"];
|
|
140
|
+
if (legibility !== undefined && legibility !== null) {
|
|
141
|
+
try {
|
|
142
|
+
sessionNodeManager.recordSealCertificate(agentName, sessionIdHex, rootHex, JSON.stringify(legibility));
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
logger.warn("seal.certificate.persist.failed", {
|
|
146
|
+
sessionId: sessionIdHex,
|
|
147
|
+
reason: extractErrorMessage(error),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
logger.info("seal.certificate.pull.recovered", {
|
|
152
|
+
agentName,
|
|
153
|
+
sessionId: sessionIdHex,
|
|
154
|
+
sealedRoot: rootHex,
|
|
155
|
+
verified: verdict.verified,
|
|
156
|
+
// The impact line said "provable" unconditionally, which is FALSE in exactly the branch above:
|
|
157
|
+
// an unverified certificate is recorded on the counterparty's word and proves nothing to a
|
|
158
|
+
// third party. A claim that is true on the common path and false on the dangerous one is worse
|
|
159
|
+
// than no claim, because it reads as reassurance precisely when reassurance is unwarranted.
|
|
160
|
+
impact: verdict.verified
|
|
161
|
+
? "a seal this side never received the push for is now local, and its signature was checked"
|
|
162
|
+
: "a seal this side never received the push for is now local, but its signature was NOT checked — it is recorded on the counterparty's word",
|
|
163
|
+
});
|
|
164
|
+
// STATUS FIRST AND SYNCHRONOUS, teardown second — the same terminal transition the push path
|
|
165
|
+
// makes, so a pulled seal and a pushed one leave the daemon in identical states.
|
|
166
|
+
//
|
|
167
|
+
// The comment here used to credit `destroySessionNode` with marking the row. It does not when the
|
|
168
|
+
// session has no live node — it returns early at `if (!entry) return` and writes the status below
|
|
169
|
+
// that guard — and THIS path is precisely the no-node case: a daemon pulls a certificate exactly
|
|
170
|
+
// when it was down or disconnected while the seal happened.
|
|
171
|
+
try {
|
|
172
|
+
sessionNodeManager.markSealed(agentName, sessionIdHex);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
logger.error("session.seal.status.write.threw", {
|
|
176
|
+
sessionId: sessionIdHex, agentName,
|
|
177
|
+
error: extractErrorMessage(err),
|
|
178
|
+
impact: verdict.verified
|
|
179
|
+
? "the certificate was pulled and verified, but this row still reads interrupted"
|
|
180
|
+
: "the certificate was pulled (signature NOT checked), but this row still reads interrupted",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
void sessionNodeManager.destroySessionNode(agentName, sessionIdHex, "sealed");
|
|
184
|
+
return { ok: true, rootHex, verified: verdict.verified };
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=seal-certificate-pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal-certificate-pull.js","sourceRoot":"","sources":["../src/seal-certificate-pull.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAIvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,0FAA0F;AAC1F,MAAM,gCAAgC,GAAG,MAAM,CAAC;AA4ChD,SAAS,IAAI,CAAC,CAAU;IACtB,IAAI,CAAC,YAAY,UAAU;QAAE,OAAO,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,UAAU,CAAC,CAAW,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAA6B,EAC7B,SAAiB,EACjB,YAAoB;IAEpB,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC;IAEvG,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,uFAAuF;QACvF,8FAA8F;QAC9F,yCAAyC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;QACtD,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/B,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAErC,MAAM,UAAU,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE;YACtD,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB;gBAAE,OAAO;YACzF,2FAA2F;YAC3F,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY;gBAAE,OAAO;YAEtE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,UAAU,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACtC,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAgC,EAAE,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACzH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,QAAQ,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACpG,IAAI,CAAC,CAAC,EAAE;gBAAE,OAAO;YACjB,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,MAAM,IAAI,SAAS,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QACrF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAChH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9G,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,UAAU,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEhI,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,IAAI,SAAS,KAAK,IAAI,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QACrG,8FAA8F;QAC9F,+FAA+F;QAC/F,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;YAC9C,SAAS,EAAE,SAAS,EAAE,YAAY;YAClC,MAAM,EAAE,4BAA4B;SACrC,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAC5F,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IAE7G,MAAM,MAAM,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAClD;QACE,WAAW,EAAE,cAAc,CAAC,SAAS,CAAC;QACtC,cAAc;QACd,MAAM;QACN,sBAAsB,EAAE,MAAM,EAAE,2BAA2B,IAAI,IAAI;KACpE,EACD;QACE,SAAS,EAAE,cAAc;QACzB,UAAU;QACV,SAAS;QACT,cAAc;QACd,cAAc;QACd,YAAY;QACZ,aAAa,EAAE,OAAO;QACtB,UAAU,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,IAAI,CAAU;KAC/C,CACF,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,gGAAgG;QAChG,yFAAyF;QACzF,sEAAsE;QACtE,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9G,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB;;;;;;;;;;;;;;;;WAgBG;QACH,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;YAC9C,SAAS;YACT,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EACJ,gSAAgS;YAClS,QAAQ,EACN,uKAAuK;SAC1K,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IACnC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,kBAAkB,CAAC,qBAAqB,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACzG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC7C,SAAS,EAAE,YAAY;gBACvB,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;QAC7C,SAAS;QACT,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,+FAA+F;QAC/F,2FAA2F;QAC3F,+FAA+F;QAC/F,4FAA4F;QAC5F,MAAM,EAAE,OAAO,CAAC,QAAQ;YACtB,CAAC,CAAC,0FAA0F;YAC5F,CAAC,CAAC,0IAA0I;KAC/I,CAAC,CAAC;IAEH,6FAA6F;IAC7F,iFAAiF;IACjF,EAAE;IACF,kGAAkG;IAClG,kGAAkG;IAClG,iGAAiG;IACjG,4DAA4D;IAC5D,IAAI,CAAC;QAAC,kBAAkB,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAAC,CAAC;IAC/D,OAAO,GAAY,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;YAC9C,SAAS,EAAE,YAAY,EAAE,SAAS;YAClC,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC;YAC/B,MAAM,EAAE,OAAO,CAAC,QAAQ;gBACtB,CAAC,CAAC,+EAA+E;gBACjF,CAAC,CAAC,0FAA0F;SAC/F,CAAC,CAAC;IACL,CAAC;IACD,KAAK,kBAAkB,CAAC,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAE9E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SealCarryLeaf } from "./session-seal-leaf-store.js";
|
|
2
|
+
/**
|
|
3
|
+
* REBUILD THE CERTIFIED ROOT FROM THIS DAEMON'S OWN LEAVES — `DOD-M15-SEALWIRE-1` bullet 2.
|
|
4
|
+
*
|
|
5
|
+
* The receipt used to prove only that the directory signed SOMETHING: the client took the sealed
|
|
6
|
+
* root off the wire, confirmed the directory's signature over those bytes, stored it, and threw
|
|
7
|
+
* away the root it had computed a step earlier. At co-signing time that means **your key signs a
|
|
8
|
+
* root you never checked.**
|
|
9
|
+
*
|
|
10
|
+
* Bullet 1 moved the certified root into the content-hash domain, which is the domain this daemon
|
|
11
|
+
* can actually rebuild — each carry leaf's `content_hash` is the leaf hash (RFC 6962 §2.1 "hash"
|
|
12
|
+
* leaves are used as-is), and the carry is ordered by the relay's canonical `sequence_number`,
|
|
13
|
+
* which is the order the directory rebuilds in.
|
|
14
|
+
*
|
|
15
|
+
* ─── Why this returns "cannot judge" instead of always answering ───────────────────────────
|
|
16
|
+
*
|
|
17
|
+
* A root comparison that is WRONG makes every session unsealable, and force-abandon — no receipt —
|
|
18
|
+
* becomes the only exit. That failure is worse than the one being guarded, and this file already
|
|
19
|
+
* carries two comments saying so about other gates.
|
|
20
|
+
*
|
|
21
|
+
* The carry is this daemon's view, and it is not guaranteed complete at the instant a certificate
|
|
22
|
+
* arrives: the counterparty's SEAL ctrl leaf is what TRIGGERS the seal, so it may not have been
|
|
23
|
+
* witnessed here yet. So completeness is checked FIRST, against the certificate's own leaf count.
|
|
24
|
+
* A short carry means this daemon cannot judge — which is a different answer from "the roots
|
|
25
|
+
* disagree", and conflating them would turn a local timing gap into an accusation.
|
|
26
|
+
*/
|
|
27
|
+
export declare function verifyCertifiedRoot(getSealCarry: (agentPubkeyHex: string, sessionIdHex: string) => SealCarryLeaf[], agentPubkeyHex: string, sessionIdHex: string, certifiedRoot: Uint8Array, certifiedLeafCount: number): {
|
|
28
|
+
verdict: "match";
|
|
29
|
+
} | {
|
|
30
|
+
verdict: "mismatch";
|
|
31
|
+
ownRootHex: string | null;
|
|
32
|
+
detail: string;
|
|
33
|
+
} | {
|
|
34
|
+
verdict: "cannot_judge";
|
|
35
|
+
reason: string;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=seal-certified-root-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal-certified-root-check.d.ts","sourceRoot":"","sources":["../src/seal-certified-root-check.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,aAAa,EAAE,EAC/E,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,UAAU,EACzB,kBAAkB,EAAE,MAAM,GACzB;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA6FzI"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `DOD-M15-SEALWIRE-1` / `DOD-M15-CARRIEDSEAL-1` — DOES THIS CERTIFICATE DESCRIBE WHAT I HOLD?
|
|
3
|
+
*
|
|
4
|
+
* Moved out of `session-seal.ts` whole, with no change to the verdicts, when 070-CARRIEDSEAL needed
|
|
5
|
+
* room under that file's ratchet. It belongs out here on its own terms: everything else in the seal
|
|
6
|
+
* class drives a ceremony, and this only ever ANSWERS A QUESTION about a leaf set — no transport, no
|
|
7
|
+
* lifecycle, no state of its own.
|
|
8
|
+
*
|
|
9
|
+
* Crypto refs: RFC 6962 §2.1 (Merkle hash trees).
|
|
10
|
+
*/
|
|
11
|
+
import { buildMerkleTree, merkleRoot } from "@cello-protocol/crypto";
|
|
12
|
+
import { LEAF_KIND_CTRL } from "./session-relay-client.js";
|
|
13
|
+
import { carryContentHashInputs } from "./session-node-types.js";
|
|
14
|
+
/**
|
|
15
|
+
* REBUILD THE CERTIFIED ROOT FROM THIS DAEMON'S OWN LEAVES — `DOD-M15-SEALWIRE-1` bullet 2.
|
|
16
|
+
*
|
|
17
|
+
* The receipt used to prove only that the directory signed SOMETHING: the client took the sealed
|
|
18
|
+
* root off the wire, confirmed the directory's signature over those bytes, stored it, and threw
|
|
19
|
+
* away the root it had computed a step earlier. At co-signing time that means **your key signs a
|
|
20
|
+
* root you never checked.**
|
|
21
|
+
*
|
|
22
|
+
* Bullet 1 moved the certified root into the content-hash domain, which is the domain this daemon
|
|
23
|
+
* can actually rebuild — each carry leaf's `content_hash` is the leaf hash (RFC 6962 §2.1 "hash"
|
|
24
|
+
* leaves are used as-is), and the carry is ordered by the relay's canonical `sequence_number`,
|
|
25
|
+
* which is the order the directory rebuilds in.
|
|
26
|
+
*
|
|
27
|
+
* ─── Why this returns "cannot judge" instead of always answering ───────────────────────────
|
|
28
|
+
*
|
|
29
|
+
* A root comparison that is WRONG makes every session unsealable, and force-abandon — no receipt —
|
|
30
|
+
* becomes the only exit. That failure is worse than the one being guarded, and this file already
|
|
31
|
+
* carries two comments saying so about other gates.
|
|
32
|
+
*
|
|
33
|
+
* The carry is this daemon's view, and it is not guaranteed complete at the instant a certificate
|
|
34
|
+
* arrives: the counterparty's SEAL ctrl leaf is what TRIGGERS the seal, so it may not have been
|
|
35
|
+
* witnessed here yet. So completeness is checked FIRST, against the certificate's own leaf count.
|
|
36
|
+
* A short carry means this daemon cannot judge — which is a different answer from "the roots
|
|
37
|
+
* disagree", and conflating them would turn a local timing gap into an accusation.
|
|
38
|
+
*/
|
|
39
|
+
export function verifyCertifiedRoot(getSealCarry, agentPubkeyHex, sessionIdHex, certifiedRoot, certifiedLeafCount) {
|
|
40
|
+
const carry = getSealCarry(agentPubkeyHex, sessionIdHex);
|
|
41
|
+
if (carry.length === 0)
|
|
42
|
+
return { verdict: "cannot_judge", reason: "no_carry" };
|
|
43
|
+
/**
|
|
44
|
+
* COMPLETENESS IS ESTABLISHED FROM THE CARRY'S OWN EVIDENCE, NEVER FROM THE CERTIFICATE.
|
|
45
|
+
*
|
|
46
|
+
* Review F3, and the first cut had this exactly backwards. It gated on
|
|
47
|
+
* `carry.length !== certifiedLeafCount`, where `certifiedLeafCount` is a field the DIRECTORY
|
|
48
|
+
* chooses and signs — so the party being checked controlled whether it was checked. A directory
|
|
49
|
+
* certifying a root over a different conversation had only to state a `leaf_count` that did not
|
|
50
|
+
* match, and the client answered "cannot judge" and accepted. The signature still verified,
|
|
51
|
+
* because the count is signed inside the same TBS.
|
|
52
|
+
*
|
|
53
|
+
* That is the hole §2b names in as many words: *"an attacker who wants to evade a mismatch check
|
|
54
|
+
* simply never supplies a checkable proof. Treating 'we could not tell' as harmless is the
|
|
55
|
+
* hole."* I defended against a false POSITIVE and left the false NEGATIVE one field away.
|
|
56
|
+
*
|
|
57
|
+
* The carry can answer the question by itself. A complete bilateral leaf set is:
|
|
58
|
+
* - sequences contiguous from 1 — no gap where a leaf this daemon never saw would sit; and
|
|
59
|
+
* - exactly two SEAL ctrl leaves, from two DISTINCT senders — which is what a bilateral seal
|
|
60
|
+
* is, and is the condition that says the counterparty's closing leaf has landed here.
|
|
61
|
+
* Both predicates already exist in `seal-escalation.ts`; this reuses their shape rather than
|
|
62
|
+
* inventing a second opinion about the same question.
|
|
63
|
+
*
|
|
64
|
+
* When the carry IS self-evidently complete, a `leaf_count` that disagrees is no longer "I
|
|
65
|
+
* cannot tell" — it is the certificate describing a different leaf set, which is a MISMATCH.
|
|
66
|
+
*/
|
|
67
|
+
const sequences = carry.map((l) => l.sequenceNumber).sort((a, b) => a - b);
|
|
68
|
+
const contiguousFromOne = sequences.every((n, i) => n === i + 1);
|
|
69
|
+
const ctrlSenders = new Set(carry.filter((l) => l.leafKind === LEAF_KIND_CTRL).map((l) => l.senderPubkeyHex));
|
|
70
|
+
const selfEvidentlyComplete = contiguousFromOne && ctrlSenders.size === 2;
|
|
71
|
+
/**
|
|
72
|
+
* 🚨 THE CERTIFICATE MAY COVER EXACTLY WHAT THIS SIDE HOLDS — ASK THAT FIRST.
|
|
73
|
+
*
|
|
74
|
+
* `DOD-M15-UNILATERAL-1`. The completeness predicate below describes a BILATERAL leaf set: two
|
|
75
|
+
* SEAL ctrl leaves, from two distinct senders. **A solo seal can never satisfy it**, because the
|
|
76
|
+
* counterparty is gone and never posts one — that is the entire premise. So on the solo path
|
|
77
|
+
* this returned `cannot_judge` every time, `session-ceremony.ts` refuses to co-sign on anything
|
|
78
|
+
* that is not `match`, and **the sealing party refused to co-sign its own unilateral seal.** The
|
|
79
|
+
* FROST ceremony never reached threshold, the directory never completed, and the close came back
|
|
80
|
+
* `seal_unilateral_timeout` — the label that names our own wait. Measured against the real
|
|
81
|
+
* binaries: `j-unilateral` failed on exactly this, with the directory having already verified the
|
|
82
|
+
* chain and recorded the counterparty ABSENT.
|
|
83
|
+
*
|
|
84
|
+
* Completeness was only ever needed to tell TWO KINDS OF DISAGREEMENT apart — "the roots differ
|
|
85
|
+
* because my carry is behind" (cannot judge) from "the roots differ because the directory
|
|
86
|
+
* certified something else" (mismatch). It answers nothing when the roots AGREE: a certificate
|
|
87
|
+
* whose root and leaf count are exactly what this daemon holds is, by construction, over this
|
|
88
|
+
* daemon's own leaves. Nothing is taken on trust — both values are recomputed here from the
|
|
89
|
+
* carry, and an adversary who could satisfy them would have to have produced this leaf set.
|
|
90
|
+
*
|
|
91
|
+
* Deliberately BOTH values. A count that disagreed while the root matched would be a certificate
|
|
92
|
+
* contradicting itself, and this is not the place to wave that through.
|
|
93
|
+
*/
|
|
94
|
+
const carryInputs = carryContentHashInputs(carry);
|
|
95
|
+
if (carryInputs !== null &&
|
|
96
|
+
carry.length === certifiedLeafCount &&
|
|
97
|
+
Buffer.compare(Buffer.from(merkleRoot(buildMerkleTree(carryInputs))), Buffer.from(certifiedRoot)) === 0) {
|
|
98
|
+
return { verdict: "match" };
|
|
99
|
+
}
|
|
100
|
+
if (!selfEvidentlyComplete) {
|
|
101
|
+
return {
|
|
102
|
+
verdict: "cannot_judge",
|
|
103
|
+
reason: contiguousFromOne
|
|
104
|
+
? `carry_incomplete: ${ctrlSenders.size} of 2 SEAL ctrl leaves witnessed here`
|
|
105
|
+
: `carry_noncontiguous: hold ${carry.length} leaves with a gap in the relay sequence`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (carry.length !== certifiedLeafCount) {
|
|
109
|
+
// The carry proves itself complete and the certificate claims a different size, so the
|
|
110
|
+
// certificate is over a different leaf set. Accusing is correct here.
|
|
111
|
+
return {
|
|
112
|
+
verdict: "mismatch",
|
|
113
|
+
ownRootHex: null, // no root computed — the sets differ in SIZE, which is decisive on its own
|
|
114
|
+
detail: `leaf_count_disagrees: this daemon holds a provably complete ${carry.length}-leaf set, the certificate claims ${certifiedLeafCount}`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (carryInputs === null) {
|
|
118
|
+
// A leaf this daemon cannot decode is a leaf it cannot judge. Never an accusation.
|
|
119
|
+
return { verdict: "cannot_judge", reason: "structure1_content_hash_unreadable" };
|
|
120
|
+
}
|
|
121
|
+
const ownRoot = merkleRoot(buildMerkleTree(carryInputs));
|
|
122
|
+
const ownRootHex = Buffer.from(ownRoot).toString("hex");
|
|
123
|
+
return Buffer.compare(Buffer.from(ownRoot), Buffer.from(certifiedRoot)) === 0
|
|
124
|
+
? { verdict: "match" }
|
|
125
|
+
: { verdict: "mismatch", ownRootHex, detail: "root_disagrees: same leaf count, different leaves or different order" };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=seal-certified-root-check.js.map
|