@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,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CO-SIGN A ROOT FROM THE DIRECTORY'S EVIDENCE WHEN THIS SIDE'S OWN CARRY IS SHORT — and only when the
|
|
3
|
+
* evidence proves itself.
|
|
4
|
+
*
|
|
5
|
+
* ─── The failure this exists for ───────────────────────────────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* Live 2026-09-16, session `9bcfc168…`. A daemon restarted mid-conversation. Its session identity
|
|
8
|
+
* was gone, so for the rest of the session the relay refused its connection `not_a_participant` — it
|
|
9
|
+
* could still SEND its seal leaf, but it could never RECEIVE the counterparty's. Asked to co-sign, it
|
|
10
|
+
* held 1 of 2 SEAL leaves, `verifyCertifiedRoot` answered `cannot_judge`, and it correctly refused.
|
|
11
|
+
* No co-signature, so no certificate was ever stored — on any directory node — and nobody was told.
|
|
12
|
+
*
|
|
13
|
+
* The leaf it was missing was sitting in the request it was refusing. `seal_verified` carries
|
|
14
|
+
* `frontier_leaves`: the whole ordered leaf set the directory rebuilt the root from, each with its
|
|
15
|
+
* sender's signature. So this side does not need the stream it lost. It needs to check that evidence.
|
|
16
|
+
*
|
|
17
|
+
* ─── What must hold before signing, and why each one ──────────────────────────────────────────
|
|
18
|
+
*
|
|
19
|
+
* The directory is NOT trusted for any of this. Signing puts this agent's key on a durable,
|
|
20
|
+
* non-repudiable claim, so every condition is checked here against something the directory cannot
|
|
21
|
+
* forge:
|
|
22
|
+
*
|
|
23
|
+
* 1. EVERY LEAF THIS SIDE ALREADY HOLDS APPEARS IN THE EVIDENCE, AT THE SAME POSITION, WITH THE SAME
|
|
24
|
+
* CONTENT HASH. The evidence may FILL gaps; it may never override a leaf this side witnessed. A
|
|
25
|
+
* contradiction here is an accusation, not a gap — `mismatch`.
|
|
26
|
+
* 2. EVERY EVIDENCE LEAF IS SIGNED BY A PARTICIPANT OF THIS SESSION, FOR THIS SESSION. The
|
|
27
|
+
* participants come from THIS side's own session record, never from the frame — the frame is the
|
|
28
|
+
* thing being checked. The signature is verified over the exact Structure 1 bytes, the signer is
|
|
29
|
+
* the key named inside them, and the session id inside them is this one.
|
|
30
|
+
* 3. THE EVIDENCE HASHES TO THE CERTIFIED ROOT, AND ITS SIZE IS THE CERTIFIED COUNT. Both are
|
|
31
|
+
* recomputed here.
|
|
32
|
+
*
|
|
33
|
+
* With all three, the root this side signs is over a leaf set that agrees with everything it saw,
|
|
34
|
+
* whose remaining leaves the participants themselves signed, and which the certificate describes.
|
|
35
|
+
*
|
|
36
|
+
* 4. EACH SENDER'S LEAVES FORM AN UNBROKEN CHAIN FROM THE SESSION ANCHOR, IN EVIDENCE ORDER. Every
|
|
37
|
+
* Structure 1 names its sender's previous leaf, and the relay refused any link that was not the
|
|
38
|
+
* immediate predecessor. Walking those links is what fixes the position of a leaf this side
|
|
39
|
+
* never saw — without it, a gap could be filled with a replay of a genuinely signed earlier
|
|
40
|
+
* leaf. No two leaves may be byte-identical.
|
|
41
|
+
*
|
|
42
|
+
* ─── What this deliberately does NOT establish ─────────────────────────────────────────────────
|
|
43
|
+
*
|
|
44
|
+
* How the two senders' chains INTERLEAVE in positions this side never held. Each sender's own order
|
|
45
|
+
* is pinned; the relative order of one sender's unseen leaf against the other's rests on the
|
|
46
|
+
* directory's rebuild. `lastSeenHash` could narrow that and is not used here yet.
|
|
47
|
+
*
|
|
48
|
+
* Crypto refs: RFC 8032 (Ed25519 signature verification), RFC 6962 §2.1 (Merkle hash trees).
|
|
49
|
+
*/
|
|
50
|
+
import { buildMerkleTree, merkleRoot, verify } from "@cello-protocol/crypto";
|
|
51
|
+
import { decodeStructure1 } from "@cello-protocol/protocol-types";
|
|
52
|
+
/** Read one `frontier_leaves` entry off the wire, or null if it is not the three byte fields it must be. */
|
|
53
|
+
export function parseEvidenceLeaf(raw) {
|
|
54
|
+
if (typeof raw !== "object" || raw === null)
|
|
55
|
+
return null;
|
|
56
|
+
const o = raw;
|
|
57
|
+
// Arrays accepted as well as Uint8Array for the same reason the ceremony's own frontier parser
|
|
58
|
+
// accepts ArrayLike: the frame reaches here re-encoded across the daemon's IPC as well as off CBOR.
|
|
59
|
+
const bytes = (v) => v instanceof Uint8Array ? v : Array.isArray(v) ? Uint8Array.from(v) : null;
|
|
60
|
+
const s1 = bytes(o["structure1_cbor"]);
|
|
61
|
+
const pk = bytes(o["sender_pubkey"]);
|
|
62
|
+
const sig = bytes(o["sender_signature"]);
|
|
63
|
+
return s1 && pk && sig ? { structure1_cbor: s1, sender_pubkey: pk, sender_signature: sig } : null;
|
|
64
|
+
}
|
|
65
|
+
export function verifyCertifiedRootFromEvidence(args) {
|
|
66
|
+
const { ownCarry, evidence, sessionIdHex, participantsHex, certifiedRoot, certifiedLeafCount, genesis } = args;
|
|
67
|
+
if (participantsHex.length !== 2)
|
|
68
|
+
return { verdict: "cannot_judge", reason: "participants_unknown" };
|
|
69
|
+
// Without the anchor the chains cannot be walked, and an unwalked gap is exactly what a replay needs.
|
|
70
|
+
if (!genesis)
|
|
71
|
+
return { verdict: "cannot_judge", reason: "genesis_unknown" };
|
|
72
|
+
if (evidence.length === 0)
|
|
73
|
+
return { verdict: "cannot_judge", reason: "no_evidence" };
|
|
74
|
+
if (evidence.length !== certifiedLeafCount) {
|
|
75
|
+
return { verdict: "mismatch", detail: `evidence_size_disagrees: ${evidence.length} leaves, certificate claims ${certifiedLeafCount}` };
|
|
76
|
+
}
|
|
77
|
+
const participants = new Set(participantsHex.map((p) => p.toLowerCase()));
|
|
78
|
+
const hashes = [];
|
|
79
|
+
/**
|
|
80
|
+
* ⚠️ EACH LEAF CHECKED ALONE PROVES NOTHING ABOUT WHERE IT SITS — review, HIGH.
|
|
81
|
+
*
|
|
82
|
+
* A signed Structure 1 is valid wherever it is placed, and the root is built from content hashes
|
|
83
|
+
* only. So the first version accepted a set in which positions this side never saw held COPIES of
|
|
84
|
+
* a participant's earlier, genuinely signed leaves: a counterparty's "I withdraw the offer" and
|
|
85
|
+
* their closing leaf replaced by replays of their greeting. Every per-leaf check passed, the count
|
|
86
|
+
* and root agreed, and this agent's key went on a conversation that did not happen. What bounded it
|
|
87
|
+
* was the honest co-signing directories — i.e. nothing, against the colluding threshold this check
|
|
88
|
+
* exists to stand against.
|
|
89
|
+
*
|
|
90
|
+
* The leaves already say how they link. `prevOwnHash` names the SAME sender's previous leaf, and
|
|
91
|
+
* the relay refused every submission whose link was not the immediate predecessor — SEAL leaves
|
|
92
|
+
* included. So walking each sender's leaves in evidence order must reproduce that chain exactly,
|
|
93
|
+
* starting from the session anchor. A replay breaks it, a reordering breaks it, and a message
|
|
94
|
+
* dropped from the middle of a run breaks it. Byte-identical leaves are refused outright too.
|
|
95
|
+
*/
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
const lastBySender = new Map();
|
|
98
|
+
for (let i = 0; i < evidence.length; i++) {
|
|
99
|
+
const leaf = parseEvidenceLeaf(evidence[i]);
|
|
100
|
+
if (!leaf)
|
|
101
|
+
return { verdict: "cannot_judge", reason: `evidence_leaf_malformed: position ${i + 1}` };
|
|
102
|
+
const senderHex = Buffer.from(leaf.sender_pubkey).toString("hex");
|
|
103
|
+
// 2. A participant of THIS session — named by our own record, not by the frame.
|
|
104
|
+
if (!participants.has(senderHex)) {
|
|
105
|
+
return { verdict: "mismatch", detail: `evidence_sender_not_a_participant: position ${i + 1}` };
|
|
106
|
+
}
|
|
107
|
+
if (!verify(leaf.sender_pubkey, leaf.structure1_cbor, leaf.sender_signature)) {
|
|
108
|
+
return { verdict: "mismatch", detail: `evidence_signature_invalid: position ${i + 1}` };
|
|
109
|
+
}
|
|
110
|
+
const s1 = decodeStructure1(leaf.structure1_cbor);
|
|
111
|
+
if (!s1.ok)
|
|
112
|
+
return { verdict: "cannot_judge", reason: `evidence_structure1_undecodable: position ${i + 1}` };
|
|
113
|
+
// The key that signed must be the key the claim names, and the claim must be for THIS session. A
|
|
114
|
+
// valid signature over a claim for another conversation authorises nothing here.
|
|
115
|
+
if (Buffer.from(s1.fields.senderPubkey).toString("hex") !== senderHex) {
|
|
116
|
+
return { verdict: "mismatch", detail: `evidence_signer_is_not_the_named_sender: position ${i + 1}` };
|
|
117
|
+
}
|
|
118
|
+
if (Buffer.from(s1.fields.sessionId).toString("hex") !== sessionIdHex.toLowerCase()) {
|
|
119
|
+
return { verdict: "mismatch", detail: `evidence_leaf_is_for_another_session: position ${i + 1}` };
|
|
120
|
+
}
|
|
121
|
+
const bytesHex = Buffer.from(leaf.structure1_cbor).toString("hex");
|
|
122
|
+
if (seen.has(bytesHex))
|
|
123
|
+
return { verdict: "mismatch", detail: `evidence_leaf_repeated: position ${i + 1}` };
|
|
124
|
+
seen.add(bytesHex);
|
|
125
|
+
const expectedPrev = lastBySender.get(senderHex) ?? genesis;
|
|
126
|
+
if (Buffer.compare(Buffer.from(s1.fields.prevOwnHash), Buffer.from(expectedPrev)) !== 0) {
|
|
127
|
+
return { verdict: "mismatch", detail: `evidence_self_chain_broken: position ${i + 1}` };
|
|
128
|
+
}
|
|
129
|
+
lastBySender.set(senderHex, s1.fields.contentHash);
|
|
130
|
+
hashes.push(s1.fields.contentHash);
|
|
131
|
+
}
|
|
132
|
+
// 1. The evidence may fill gaps; it may never override what this side witnessed.
|
|
133
|
+
let held = 0;
|
|
134
|
+
for (const own of ownCarry) {
|
|
135
|
+
const s1 = decodeStructure1(own.structure1Cbor);
|
|
136
|
+
if (!s1.ok)
|
|
137
|
+
return { verdict: "cannot_judge", reason: `own_leaf_undecodable: sequence ${own.sequenceNumber}` };
|
|
138
|
+
const at = hashes[own.sequenceNumber - 1];
|
|
139
|
+
if (at === undefined || Buffer.compare(Buffer.from(at), Buffer.from(s1.fields.contentHash)) !== 0) {
|
|
140
|
+
return { verdict: "mismatch", detail: `evidence_contradicts_own_leaf: sequence ${own.sequenceNumber}` };
|
|
141
|
+
}
|
|
142
|
+
held += 1;
|
|
143
|
+
}
|
|
144
|
+
// 3. The certificate describes exactly this set.
|
|
145
|
+
const root = merkleRoot(buildMerkleTree(hashes.map((data) => ({ kind: "hash", data }))));
|
|
146
|
+
if (Buffer.compare(Buffer.from(root), Buffer.from(certifiedRoot)) !== 0) {
|
|
147
|
+
return { verdict: "mismatch", detail: "evidence_root_disagrees: the evidence does not hash to the certified root" };
|
|
148
|
+
}
|
|
149
|
+
return { verdict: "match", filled: evidence.length - held };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* The daemon's entry point: consult the evidence for a seal this side's own carry could not judge,
|
|
153
|
+
* reading the participants from THIS side's session row.
|
|
154
|
+
*
|
|
155
|
+
* Lives here rather than in `session-seal.ts` so the whole decision — where the participants come
|
|
156
|
+
* from, what is logged, what each verdict becomes — sits beside the rules it applies.
|
|
157
|
+
*/
|
|
158
|
+
export function judgeFromEvidence(deps, a) {
|
|
159
|
+
const record = sessionFromRecord(deps.db, a.agentPubkeyHex, a.sessionIdHex);
|
|
160
|
+
const checked = verifyCertifiedRootFromEvidence({
|
|
161
|
+
ownCarry: deps.ownCarry, evidence: a.evidence, sessionIdHex: a.sessionIdHex,
|
|
162
|
+
participantsHex: record?.participantsHex ?? [],
|
|
163
|
+
genesis: record?.genesis,
|
|
164
|
+
certifiedRoot: a.certifiedRoot, certifiedLeafCount: a.certifiedLeafCount,
|
|
165
|
+
});
|
|
166
|
+
if (checked.verdict === "match") {
|
|
167
|
+
deps.logger.info("session.seal.carry.completed_from_evidence", {
|
|
168
|
+
sessionId: a.sessionIdHex, filled: checked.filled, ownVerdict: a.ownReason,
|
|
169
|
+
impact: "this side was missing leaves it never received; the co-sign request's own signed evidence filled them, agreed with every leaf this side held, and hashed to the certified root",
|
|
170
|
+
});
|
|
171
|
+
return { verdict: "match" };
|
|
172
|
+
}
|
|
173
|
+
return checked.verdict === "mismatch"
|
|
174
|
+
? { verdict: "mismatch", ownRootHex: null, detail: checked.detail }
|
|
175
|
+
: { verdict: "cannot_judge", reason: `${a.ownReason}; evidence: ${checked.reason}` };
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Both participants and the session's chain anchor, from THIS side's own record — never from a frame,
|
|
179
|
+
* because the frame is what is being checked. `null` when the record is missing, which refuses.
|
|
180
|
+
*
|
|
181
|
+
* ⚠️ BY `agent_id`, WITH NO AGENT NAME ANYWHERE. The first version selected `agent_name` to key the
|
|
182
|
+
* anchor lookup, which is the mutable-label join `DOD-AGENT-ID-JOINKEY-1` exists to stop — a retired
|
|
183
|
+
* name reused by another keypair would hand this check the wrong session's anchor. The row already
|
|
184
|
+
* holds the anchor: `genesis_prev_root` is written from the same live value the leaves were chained
|
|
185
|
+
* from, and it is the copy a restarted daemon reads anyway.
|
|
186
|
+
*/
|
|
187
|
+
function sessionFromRecord(db, agentPubkeyHex, sessionIdHex) {
|
|
188
|
+
if (!db)
|
|
189
|
+
return null;
|
|
190
|
+
const row = db
|
|
191
|
+
.prepare("SELECT s.counterparty_pubkey AS cp, s.genesis_prev_root AS g FROM sessions s JOIN agents a ON a.agent_id = s.agent_id WHERE a.k_local_pubkey = ? AND s.session_id = ?")
|
|
192
|
+
.get(agentPubkeyHex, sessionIdHex);
|
|
193
|
+
if (!row)
|
|
194
|
+
return null;
|
|
195
|
+
const g = row.g instanceof Uint8Array ? row.g : Buffer.isBuffer(row.g) ? new Uint8Array(row.g) : null;
|
|
196
|
+
// A stored value of the wrong width is not an anchor; refusing beats walking a chain from garbage.
|
|
197
|
+
return { participantsHex: [agentPubkeyHex.toLowerCase(), row.cp.toLowerCase()], genesis: g && g.length === 32 ? g : undefined };
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=seal-evidence-root-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal-evidence-root-check.js","sourceRoot":"","sources":["../src/seal-evidence-root-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOD-M15-SEAL-FAILED-TERMINAL-1 — a seal that FAILED is discoverable, not just a slow one.
|
|
3
|
+
*
|
|
4
|
+
* ─── The gap this closes ───────────────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* `DOD-M15-CLOSEWAIT-1` made the close answer at commitment and notarize in the background. Review
|
|
7
|
+
* HIGH-1 pointed out the half that left open: a background ceremony that **throws** leaves the
|
|
8
|
+
* session `active`, with a durable commitment, no receipt, and nothing retrying until a daemon
|
|
9
|
+
* restart — while the agent is holding an `ok: true` and has no reason to suspect anything.
|
|
10
|
+
*
|
|
11
|
+
* `seal_in_progress` (added in that unit) distinguishes RUNNING from NO-CEREMONY. It cannot
|
|
12
|
+
* distinguish either from DEAD. The only account of a dead one was a line in `daemon.log`, which is
|
|
13
|
+
* not a surface an agent can read.
|
|
14
|
+
*
|
|
15
|
+
* ─── Why in memory and NOT a column on the session row ─────────────────────────────────────────
|
|
16
|
+
*
|
|
17
|
+
* The review said "persist … so it survives the read", and a database column is the reflex. It is
|
|
18
|
+
* the wrong storage here, for a reason that is about correctness rather than cost:
|
|
19
|
+
*
|
|
20
|
+
* **A restart makes "failed" the wrong answer.** The boot sweep flips `active → interrupted,
|
|
21
|
+
* interrupted_by='local'`, and `RestartSealResolver` then picks the session up and retries the seal.
|
|
22
|
+
* So a persisted failure would outlive its own truth: the operator would read `seal_failed` about a
|
|
23
|
+
* ceremony that is, at that moment, being retried. A marker whose lifetime is the process is exactly
|
|
24
|
+
* right, because the condition it describes has the same lifetime.
|
|
25
|
+
*
|
|
26
|
+
* It also avoids a client-side schema migration, which this milestone treats as expensive on its own
|
|
27
|
+
* terms — unrecoverable on an operator's machine if it goes wrong, and owed its own reviewed unit.
|
|
28
|
+
* That is a real saving, but it is the second reason, not the first.
|
|
29
|
+
*
|
|
30
|
+
* ─── The two populations the restart does NOT retry (review MEDIUM-6) ──────────────────────────
|
|
31
|
+
*
|
|
32
|
+
* The argument above holds for an ordinary conversation, and that was verified rather than assumed.
|
|
33
|
+
* `listRestartOrphanedSessions` excludes two shapes, and this docstring used to imply neither
|
|
34
|
+
* existed:
|
|
35
|
+
*
|
|
36
|
+
* `message_count > 0` — a closed session that carried no messages is never retried. Harmless: no
|
|
37
|
+
* receipt was obtainable over nothing.
|
|
38
|
+
*
|
|
39
|
+
* `restart_seal_gave_up_at IS NULL` — a session the resolver already exhausted. This one WAS a
|
|
40
|
+
* real hole: nothing ever cleared that column, so a gave-up session that was later revived, used,
|
|
41
|
+
* and closed could lose its in-memory marker at restart, be excluded from recovery forever, and
|
|
42
|
+
* then be force-abandoned by the revival sweep (which explicitly includes `IS NOT NULL`) — a
|
|
43
|
+
* receipt permanently forfeited with no surface ever saying so. `reviveSessionNode` now clears it:
|
|
44
|
+
* a session something is talking to again is not the "hopeless session" the column was written for.
|
|
45
|
+
*/
|
|
46
|
+
export interface SealFailure {
|
|
47
|
+
/** The upstream error, carried through rather than replaced with a label. */
|
|
48
|
+
reason: string;
|
|
49
|
+
/** ISO timestamp of the failure. */
|
|
50
|
+
at: string;
|
|
51
|
+
/**
|
|
52
|
+
* HOW the ceremony died, and this distinction is the whole of review HIGH-1.
|
|
53
|
+
*
|
|
54
|
+
* The first cut recorded only on the detached tail's `.catch` — and `escalateToUnilateralSeal`
|
|
55
|
+
* contains **zero `throw`s**. All nine of its failure paths RESOLVE with `{ ok: false, reason }`:
|
|
56
|
+
* `seal_unilateral_timeout`, `seal_carry_empty`, `seal_counterparty_pending`,
|
|
57
|
+
* `seal_agent_key_unavailable`, and the rest. So every ordinary dead ceremony landed on the branch
|
|
58
|
+
* that recorded nothing, and the receipt surface answered `not_sealed_yet` exactly as before — the
|
|
59
|
+
* unit closed roughly a tenth of the gap it was written for, and its own test had to INJECT a
|
|
60
|
+
* throwing key provider to reach the path it covered.
|
|
61
|
+
*
|
|
62
|
+
* `unresolved` — the ceremony ran to completion and produced no receipt. The common case.
|
|
63
|
+
* `threw` — an exception escaped it. Rare, and usually a local fault (a locked key vault,
|
|
64
|
+
* a DB error) rather than anything about the conversation.
|
|
65
|
+
*
|
|
66
|
+
* They get different guidance, because they have different fixes.
|
|
67
|
+
*/
|
|
68
|
+
kind: "unresolved" | "threw" | "refused";
|
|
69
|
+
/**
|
|
70
|
+
* DOD-M15-SEALREFUSED-STUCK-1 — this reason came from the DIRECTORY and OUTRANKS a later symptom.
|
|
71
|
+
*
|
|
72
|
+
* ⚠️ IT DOES NOT MEAN THE CEREMONY IS OVER, and an earlier draft of this said it did. A refused
|
|
73
|
+
* BILATERAL seal falls through to a SOLO seal — `close-session-handler.ts` logs
|
|
74
|
+
* `session.seal.refused.escalating` and calls `escalateToUnilateralSeal`, which can still produce
|
|
75
|
+
* a receipt. Treating the refusal as the end made `cello_sealed_receipt` tell the operator no
|
|
76
|
+
* receipt would ever exist, while the ceremony that could produce one was still running, and
|
|
77
|
+
* invited `{ force: true }` on that basis — permanently forfeiting it. This flag governs which
|
|
78
|
+
* REASON is reported, and nothing else.
|
|
79
|
+
*/
|
|
80
|
+
fromDirectory?: true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The last background seal failure per (agent, session), for the life of the process.
|
|
84
|
+
*
|
|
85
|
+
* Deliberately tiny and deliberately not exported as a singleton: the daemon owns one instance and
|
|
86
|
+
* hands it to the writer (the close handler's detached tail) and the reader (`cello_sealed_receipt`),
|
|
87
|
+
* so the two cannot drift onto different copies.
|
|
88
|
+
*/
|
|
89
|
+
export declare class SealFailureStore {
|
|
90
|
+
#private;
|
|
91
|
+
/**
|
|
92
|
+
* Record a background ceremony that ended without a receipt — resolved, thrown, or REFUSED.
|
|
93
|
+
*
|
|
94
|
+
* ⚠️ **A TERMINAL VERDICT IS NEVER OVERWRITTEN BY A LATER SYMPTOM** — `DOD-M15-SEALREFUSED-STUCK-1`.
|
|
95
|
+
*
|
|
96
|
+
* This was a plain `set`, so the last writer won. Measured on session `dab46e16` (2026-09-08):
|
|
97
|
+
* the directory refused at 09:17:13.834 with `seal_parties_disagree` — the two transcripts do
|
|
98
|
+
* not match — and at 09:28:52.077 the background escalation, which had never learned of the
|
|
99
|
+
* refusal, timed out and overwrote it with `seal_unilateral_timeout`. Both operators were then
|
|
100
|
+
* told their COUNTERPARTY had not closed, about a seal the directory had decided against eleven
|
|
101
|
+
* minutes earlier. That sends them to ask the one party who did nothing wrong.
|
|
102
|
+
*/
|
|
103
|
+
record(agentName: string, sessionId: string, reason: string, at: string, kind: SealFailure["kind"]): void;
|
|
104
|
+
/** Did this session's recorded reason come from the directory? Read by tests and diagnostics. */
|
|
105
|
+
isFromDirectory(agentName: string, sessionId: string): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Forget any failure for this session.
|
|
108
|
+
*
|
|
109
|
+
* Called when a ceremony STARTS as well as when one succeeds. Starting matters: a re-close is the
|
|
110
|
+
* documented remedy for a failed seal, and if the marker survived the retry the agent would be
|
|
111
|
+
* told the seal is dead while it is running — the same "stale reading presented as current" defect
|
|
112
|
+
* `DOD-M15-STALEROSTER-1` exists to stop, in a different subsystem.
|
|
113
|
+
*/
|
|
114
|
+
clear(agentName: string, sessionId: string): void;
|
|
115
|
+
get(agentName: string, sessionId: string): SealFailure | undefined;
|
|
116
|
+
get size(): number;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The agent-facing answer for a session whose background seal died.
|
|
120
|
+
*
|
|
121
|
+
* ORDERING MATTERS AND IS THE CALLER'S JOB: a RUNNING ceremony outranks a recorded failure, because
|
|
122
|
+
* a re-close after a failure starts a new ceremony and the old marker must not shadow it. The read
|
|
123
|
+
* handler checks `isSealing` first.
|
|
124
|
+
*/
|
|
125
|
+
/**
|
|
126
|
+
* Has the counterparty closed? True when this side holds a SEAL (control, kind 2) leaf authored by
|
|
127
|
+
* someone other than itself — the relay delivered their close, so they did everything a close needs.
|
|
128
|
+
*/
|
|
129
|
+
export declare function counterpartyHasClosed(carry: ReadonlyArray<{
|
|
130
|
+
senderPubkeyHex: string;
|
|
131
|
+
leafKind: number;
|
|
132
|
+
}>, ownPubkeyHex: string): boolean;
|
|
133
|
+
export declare function describeSealFailed(opts: {
|
|
134
|
+
sessionId: string;
|
|
135
|
+
failure: SealFailure;
|
|
136
|
+
/** From `counterpartyHasClosed` — decides between "wait for them" and "they already closed". */
|
|
137
|
+
counterpartyClosed?: boolean;
|
|
138
|
+
}): Record<string, unknown>;
|
|
139
|
+
//# sourceMappingURL=seal-failure-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal-failure-store.d.ts","sourceRoot":"","sources":["../src/seal-failure-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;;;;;;;;;;;OAgBG;IACH,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;IACzC;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,IAAI,CAAC;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;;IAW3B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAMzG,iGAAiG;IACjG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAI9D;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIjD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIlE,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;;;;;GAMG;AACH;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,CAAC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EACnE,YAAY,EAAE,MAAM,GACnB,OAAO,CAGT;AAkBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,gGAAgG;IAChG,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4E1B"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOD-M15-SEAL-FAILED-TERMINAL-1 — a seal that FAILED is discoverable, not just a slow one.
|
|
3
|
+
*
|
|
4
|
+
* ─── The gap this closes ───────────────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* `DOD-M15-CLOSEWAIT-1` made the close answer at commitment and notarize in the background. Review
|
|
7
|
+
* HIGH-1 pointed out the half that left open: a background ceremony that **throws** leaves the
|
|
8
|
+
* session `active`, with a durable commitment, no receipt, and nothing retrying until a daemon
|
|
9
|
+
* restart — while the agent is holding an `ok: true` and has no reason to suspect anything.
|
|
10
|
+
*
|
|
11
|
+
* `seal_in_progress` (added in that unit) distinguishes RUNNING from NO-CEREMONY. It cannot
|
|
12
|
+
* distinguish either from DEAD. The only account of a dead one was a line in `daemon.log`, which is
|
|
13
|
+
* not a surface an agent can read.
|
|
14
|
+
*
|
|
15
|
+
* ─── Why in memory and NOT a column on the session row ─────────────────────────────────────────
|
|
16
|
+
*
|
|
17
|
+
* The review said "persist … so it survives the read", and a database column is the reflex. It is
|
|
18
|
+
* the wrong storage here, for a reason that is about correctness rather than cost:
|
|
19
|
+
*
|
|
20
|
+
* **A restart makes "failed" the wrong answer.** The boot sweep flips `active → interrupted,
|
|
21
|
+
* interrupted_by='local'`, and `RestartSealResolver` then picks the session up and retries the seal.
|
|
22
|
+
* So a persisted failure would outlive its own truth: the operator would read `seal_failed` about a
|
|
23
|
+
* ceremony that is, at that moment, being retried. A marker whose lifetime is the process is exactly
|
|
24
|
+
* right, because the condition it describes has the same lifetime.
|
|
25
|
+
*
|
|
26
|
+
* It also avoids a client-side schema migration, which this milestone treats as expensive on its own
|
|
27
|
+
* terms — unrecoverable on an operator's machine if it goes wrong, and owed its own reviewed unit.
|
|
28
|
+
* That is a real saving, but it is the second reason, not the first.
|
|
29
|
+
*
|
|
30
|
+
* ─── The two populations the restart does NOT retry (review MEDIUM-6) ──────────────────────────
|
|
31
|
+
*
|
|
32
|
+
* The argument above holds for an ordinary conversation, and that was verified rather than assumed.
|
|
33
|
+
* `listRestartOrphanedSessions` excludes two shapes, and this docstring used to imply neither
|
|
34
|
+
* existed:
|
|
35
|
+
*
|
|
36
|
+
* `message_count > 0` — a closed session that carried no messages is never retried. Harmless: no
|
|
37
|
+
* receipt was obtainable over nothing.
|
|
38
|
+
*
|
|
39
|
+
* `restart_seal_gave_up_at IS NULL` — a session the resolver already exhausted. This one WAS a
|
|
40
|
+
* real hole: nothing ever cleared that column, so a gave-up session that was later revived, used,
|
|
41
|
+
* and closed could lose its in-memory marker at restart, be excluded from recovery forever, and
|
|
42
|
+
* then be force-abandoned by the revival sweep (which explicitly includes `IS NOT NULL`) — a
|
|
43
|
+
* receipt permanently forfeited with no surface ever saying so. `reviveSessionNode` now clears it:
|
|
44
|
+
* a session something is talking to again is not the "hopeless session" the column was written for.
|
|
45
|
+
*/
|
|
46
|
+
/**
|
|
47
|
+
* The last background seal failure per (agent, session), for the life of the process.
|
|
48
|
+
*
|
|
49
|
+
* Deliberately tiny and deliberately not exported as a singleton: the daemon owns one instance and
|
|
50
|
+
* hands it to the writer (the close handler's detached tail) and the reader (`cello_sealed_receipt`),
|
|
51
|
+
* so the two cannot drift onto different copies.
|
|
52
|
+
*/
|
|
53
|
+
export class SealFailureStore {
|
|
54
|
+
#failures = new Map();
|
|
55
|
+
#key(agentName, sessionId) {
|
|
56
|
+
// EXPLICIT ESCAPE, not a literal control character. It was a raw U+001F byte, which is
|
|
57
|
+
// invisible in a diff, in a grep, and in most editors — I "proved" a key collision against a
|
|
58
|
+
// hand-written copy of this function and only the real one disagreed. A separator nobody can
|
|
59
|
+
// see is a separator someone will delete.
|
|
60
|
+
return `${agentName}\x1f${sessionId}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Record a background ceremony that ended without a receipt — resolved, thrown, or REFUSED.
|
|
64
|
+
*
|
|
65
|
+
* ⚠️ **A TERMINAL VERDICT IS NEVER OVERWRITTEN BY A LATER SYMPTOM** — `DOD-M15-SEALREFUSED-STUCK-1`.
|
|
66
|
+
*
|
|
67
|
+
* This was a plain `set`, so the last writer won. Measured on session `dab46e16` (2026-09-08):
|
|
68
|
+
* the directory refused at 09:17:13.834 with `seal_parties_disagree` — the two transcripts do
|
|
69
|
+
* not match — and at 09:28:52.077 the background escalation, which had never learned of the
|
|
70
|
+
* refusal, timed out and overwrote it with `seal_unilateral_timeout`. Both operators were then
|
|
71
|
+
* told their COUNTERPARTY had not closed, about a seal the directory had decided against eleven
|
|
72
|
+
* minutes earlier. That sends them to ask the one party who did nothing wrong.
|
|
73
|
+
*/
|
|
74
|
+
record(agentName, sessionId, reason, at, kind) {
|
|
75
|
+
const key = this.#key(agentName, sessionId);
|
|
76
|
+
if (this.#failures.get(key)?.fromDirectory)
|
|
77
|
+
return;
|
|
78
|
+
this.#failures.set(key, { reason, at, kind, ...(kind === "refused" ? { fromDirectory: true } : {}) });
|
|
79
|
+
}
|
|
80
|
+
/** Did this session's recorded reason come from the directory? Read by tests and diagnostics. */
|
|
81
|
+
isFromDirectory(agentName, sessionId) {
|
|
82
|
+
return this.#failures.get(this.#key(agentName, sessionId))?.fromDirectory === true;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Forget any failure for this session.
|
|
86
|
+
*
|
|
87
|
+
* Called when a ceremony STARTS as well as when one succeeds. Starting matters: a re-close is the
|
|
88
|
+
* documented remedy for a failed seal, and if the marker survived the retry the agent would be
|
|
89
|
+
* told the seal is dead while it is running — the same "stale reading presented as current" defect
|
|
90
|
+
* `DOD-M15-STALEROSTER-1` exists to stop, in a different subsystem.
|
|
91
|
+
*/
|
|
92
|
+
clear(agentName, sessionId) {
|
|
93
|
+
this.#failures.delete(this.#key(agentName, sessionId));
|
|
94
|
+
}
|
|
95
|
+
get(agentName, sessionId) {
|
|
96
|
+
return this.#failures.get(this.#key(agentName, sessionId));
|
|
97
|
+
}
|
|
98
|
+
get size() {
|
|
99
|
+
return this.#failures.size;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The agent-facing answer for a session whose background seal died.
|
|
104
|
+
*
|
|
105
|
+
* ORDERING MATTERS AND IS THE CALLER'S JOB: a RUNNING ceremony outranks a recorded failure, because
|
|
106
|
+
* a re-close after a failure starts a new ceremony and the old marker must not shadow it. The read
|
|
107
|
+
* handler checks `isSealing` first.
|
|
108
|
+
*/
|
|
109
|
+
/**
|
|
110
|
+
* Has the counterparty closed? True when this side holds a SEAL (control, kind 2) leaf authored by
|
|
111
|
+
* someone other than itself — the relay delivered their close, so they did everything a close needs.
|
|
112
|
+
*/
|
|
113
|
+
export function counterpartyHasClosed(carry, ownPubkeyHex) {
|
|
114
|
+
const own = ownPubkeyHex.toLowerCase();
|
|
115
|
+
return carry.some((l) => l.leafKind === 2 && l.senderPubkeyHex.toLowerCase() !== own);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Agreed with Andre 2026-09-17 (option D), verbatim. For a failed seal where BOTH sides closed.
|
|
119
|
+
*
|
|
120
|
+
* Live, session d8b15d09: both sides closed, the signer lost the directories, and both were told
|
|
121
|
+
* "the other side has not closed yet" and to wait or retry. They had closed, and a retry with both
|
|
122
|
+
* online failed identically. Everything a seal needs — both closes, the signed messages, the relay's
|
|
123
|
+
* acknowledgements — stays on the operator's machine, and the per-party seal redesign seals from
|
|
124
|
+
* exactly that record; that commitment is what makes "a future update will seal it" true. Keep them
|
|
125
|
+
* in step: if that redesign is dropped, this sentence must change with it.
|
|
126
|
+
*/
|
|
127
|
+
const BOTH_CLOSED_GUIDANCE = "Both sides closed, but this seal couldn't be completed right now. The failure is on CELLO's " +
|
|
128
|
+
"side, not yours. Your conversation and both closes are safely recorded on your machine, and " +
|
|
129
|
+
"a future update will seal it from that record. Leave the session as it is. Do not use " +
|
|
130
|
+
"force: true, which would discard that record.";
|
|
131
|
+
export function describeSealFailed(opts) {
|
|
132
|
+
const threw = opts.failure.kind === "threw";
|
|
133
|
+
if (opts.counterpartyClosed === true && !threw && opts.failure.kind !== "refused") {
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
reason: "seal_failed",
|
|
137
|
+
seal_status: "unresolved",
|
|
138
|
+
session_id: opts.sessionId,
|
|
139
|
+
seal_failure_reason: opts.failure.reason,
|
|
140
|
+
seal_failed_at: opts.failure.at,
|
|
141
|
+
both_closed: true,
|
|
142
|
+
guidance: BOTH_CLOSED_GUIDANCE,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* DOD-M15-SEALREFUSED-STUCK-1 — a REFUSAL is neither of the other two, and the difference decides
|
|
147
|
+
* what the operator does next. `unresolved` invites them to wait for a counterparty who has not
|
|
148
|
+
* closed; a refusal means the directory examined the seal and declined it, so waiting achieves
|
|
149
|
+
* nothing and the counterparty is not the thing to chase.
|
|
150
|
+
*/
|
|
151
|
+
if (opts.failure.kind === "refused") {
|
|
152
|
+
return {
|
|
153
|
+
ok: false,
|
|
154
|
+
reason: "seal_failed",
|
|
155
|
+
seal_status: "refused",
|
|
156
|
+
session_id: opts.sessionId,
|
|
157
|
+
seal_failure_reason: opts.failure.reason,
|
|
158
|
+
seal_failed_at: opts.failure.at,
|
|
159
|
+
guidance: `The DIRECTORY REFUSED to certify the BILATERAL seal at ${opts.failure.at}: ` +
|
|
160
|
+
`${opts.failure.reason}. That is a verdict about the two-party seal and it will not change ` +
|
|
161
|
+
"— but it is NOT the end of the ceremony: the close falls through to a SOLO seal over this " +
|
|
162
|
+
"side's own chain, which can still produce a receipt. Your transcript is UNTOUCHED and " +
|
|
163
|
+
"nothing was signed with your key. The usual cause is that the two sides' records of the " +
|
|
164
|
+
"conversation differ, so compare the transcripts (cello_transcript) rather than chasing " +
|
|
165
|
+
"the network or the counterparty's availability — they are not the problem here. " +
|
|
166
|
+
"⚠️ Do NOT use { force: true }: a solo seal may still be running or retriable, and forcing " +
|
|
167
|
+
"PERMANENTLY forfeits the receipt it would produce.",
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
ok: false,
|
|
172
|
+
reason: "seal_failed",
|
|
173
|
+
// Two different facts, two different words. "failed" is an exception; "unresolved" is a ceremony
|
|
174
|
+
// that ran and produced nothing, which is the ordinary shape and often means the counterparty
|
|
175
|
+
// simply has not closed yet.
|
|
176
|
+
seal_status: threw ? "failed" : "unresolved",
|
|
177
|
+
session_id: opts.sessionId,
|
|
178
|
+
// The upstream cause, preserved. "The seal failed" tells an operator nothing about whether their
|
|
179
|
+
// directory is unreachable, their agent is not started, or the carry was unusable.
|
|
180
|
+
seal_failure_reason: opts.failure.reason,
|
|
181
|
+
seal_failed_at: opts.failure.at,
|
|
182
|
+
guidance: threw
|
|
183
|
+
? `The background seal ceremony for this session hit an ERROR at ${opts.failure.at}: ` +
|
|
184
|
+
`${opts.failure.reason}. This is not "still running" — nothing is retrying it. An exception ` +
|
|
185
|
+
"here is usually a LOCAL fault (a key that could not be loaded, a database error) rather " +
|
|
186
|
+
"than anything about the conversation, so check the daemon log around that timestamp. Your " +
|
|
187
|
+
"SEAL commitment is still durable and the conversation is intact: the receipt is unproduced, " +
|
|
188
|
+
"not lost. Call cello_close_session again once the local cause is addressed. Do NOT use " +
|
|
189
|
+
"{ force: true } — that abandons the session and PERMANENTLY forfeits the receipt, the one " +
|
|
190
|
+
"outcome that cannot be undone."
|
|
191
|
+
: `The background seal ceremony for this session finished at ${opts.failure.at} WITHOUT ` +
|
|
192
|
+
`producing a receipt: ${opts.failure.reason}. This is not "still running" — nothing is ` +
|
|
193
|
+
"retrying it right now. Read the reason before acting: seal_counterparty_pending and " +
|
|
194
|
+
"seal_unilateral_timeout mean the other side has not closed yet, and the fix is to wait for " +
|
|
195
|
+
"them (or retry later, once the directory's delivery-grace window has elapsed and a " +
|
|
196
|
+
"unilateral seal becomes available). seal_counterparty_present means the opposite — they " +
|
|
197
|
+
"are ONLINE, so close together and the seal completes bilaterally. " +
|
|
198
|
+
"seal_high_stakes_evidence_required means this conversation was opened high-stakes and no " +
|
|
199
|
+
"relay ever saw the counterparty leave, so waiting helps only if they connect and then go. " +
|
|
200
|
+
"Reasons naming this daemon — an agent that is not " +
|
|
201
|
+
"started, a directory it cannot reach — are fixed locally; check cello_status. Your SEAL " +
|
|
202
|
+
"commitment is durable and the conversation is intact, so the receipt is unproduced rather " +
|
|
203
|
+
"than lost. Retry with cello_close_session. Do NOT use { force: true }: that abandons the " +
|
|
204
|
+
"session and PERMANENTLY forfeits the receipt.",
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=seal-failure-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal-failure-store.js","sourceRoot":"","sources":["../src/seal-failure-store.ts"],"names":[],"mappings":"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"}
|