@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,717 @@
|
|
|
1
|
+
import { LEAF_KIND_CTRL } from "./session-relay-client.js";
|
|
2
|
+
import { decodeStructure1 } from "@cello-protocol/protocol-types";
|
|
3
|
+
import { decodeParkEnvelope, authenticateParkedEntry, decodeParkedDeliveryAck } from "./park-envelope.js";
|
|
4
|
+
import { MAX_REFUSED_PARKED_ENTRIES } from "./session-node-types.js";
|
|
5
|
+
import { ParkEnvelopeError } from "./park-envelope.js";
|
|
6
|
+
import { extractErrorMessage } from "./error-message.js";
|
|
7
|
+
export class ParkRecovery {
|
|
8
|
+
#ctx;
|
|
9
|
+
constructor(ctx, parkedDrainBackstopMs) {
|
|
10
|
+
this.#ctx = ctx;
|
|
11
|
+
this.#parkedDrainBackstopMs = parkedDrainBackstopMs;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Arm the backstop clock from the START of watching, not from the epoch — otherwise the first
|
|
15
|
+
* tick always fires a sweep on top of the install drain that just ran.
|
|
16
|
+
*/
|
|
17
|
+
armBackstopClock(now) {
|
|
18
|
+
this.#parkedDrainLastBackstopAt = now;
|
|
19
|
+
}
|
|
20
|
+
#parkFaultRemaining = 0;
|
|
21
|
+
#parkFaultCause = "standing_receiver_creating";
|
|
22
|
+
#contentParkHook = null;
|
|
23
|
+
/** DOD-PARK-DRAIN-1: the composition root's parked-mailbox drain — see setParkedDrainHook. */
|
|
24
|
+
#parkedDrainHook = null;
|
|
25
|
+
#parkedDrainHookAbsenceLogged = false;
|
|
26
|
+
/**
|
|
27
|
+
* MSG-001-3b (2b): the live content-park deposit. The manager resolves the recipient + relay
|
|
28
|
+
* endpoint from the session entry and calls this when a send is NOT confirmed delivered
|
|
29
|
+
* (direct-fail or TTF expiry). The daemon's hook seals (sealToRecipient) + deposits via
|
|
30
|
+
* ContentParkClient. Best-effort.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* SEC-1 / review M4: parked entries already refused by the authentication gate, keyed
|
|
34
|
+
* `${agent}:${session}:${contentHash}` → the refusal reason. Bounded (see
|
|
35
|
+
* #rememberRefusedParkedEntry) because its keys come from a REMOTE mailbox.
|
|
36
|
+
*/
|
|
37
|
+
#refusedParkedEntries = new Map();
|
|
38
|
+
#parkedDrainLastBackstopAt = 0;
|
|
39
|
+
/** DOD-PARK-DRAIN-1: how often the backstop drain rides the watchdog grid — see #parkedDrainBackstopTick. */
|
|
40
|
+
#parkedDrainBackstopMs;
|
|
41
|
+
/** Arm the park-deposit fault. Returns the count now armed. */
|
|
42
|
+
injectParkFault(count, cause) {
|
|
43
|
+
this.#parkFaultRemaining = Math.max(0, count);
|
|
44
|
+
if (cause)
|
|
45
|
+
this.#parkFaultCause = cause;
|
|
46
|
+
return this.#parkFaultRemaining;
|
|
47
|
+
}
|
|
48
|
+
/** Remaining armed park faults — so a test can assert the fault was actually consumed. */
|
|
49
|
+
getParkFaultRemaining() {
|
|
50
|
+
return this.#parkFaultRemaining;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* MSG-001-3b (2b): inject the live content-park deposit (seal + ContentParkClient.deposit).
|
|
54
|
+
* Injected by the composition root (daemon.ts). When absent, a not-confirmed send still records
|
|
55
|
+
* the durable awaiting entry (crash backstop) but does not deposit live.
|
|
56
|
+
* DOD-LEAVEMSG-1 (cello-unit-reviewer HIGH fix): the hook returns a TYPED result — `{ok:true}` or
|
|
57
|
+
* `{ok:false, reason}` — mirroring RetryQueue's ParkFn contract. It must NEVER resolve `{ok:true}`
|
|
58
|
+
* merely because it didn't throw: the production hook's own failure branches (standing receiver
|
|
59
|
+
* unavailable, relay explicitly rejects the deposit) log-and-return without throwing, and a
|
|
60
|
+
* throw-only contract would silently report those as success — the exact "system lies about its
|
|
61
|
+
* own health" bug the reviewer caught (a park that never happened reported to the operator as
|
|
62
|
+
* "dispatched to relay," with the durable retry_queue backstop skipped because sendContent's own
|
|
63
|
+
* caller only enqueues on an honest {ok:false}).
|
|
64
|
+
*/
|
|
65
|
+
setContentParkHook(fn) {
|
|
66
|
+
this.#contentParkHook = fn;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* DOD-PARK-DRAIN-1: inject the parked-mailbox drain (daemon.ts → contentPark.autoRecoverForAgent).
|
|
70
|
+
*
|
|
71
|
+
* The manager owns the two events that mean "content may be waiting for this agent on a relay":
|
|
72
|
+
* a standing receiver was (re)built, and the slow backstop sweep. It does not own the drain
|
|
73
|
+
* itself — that needs the agent's key provider and the inbound ingest funnel. So it calls out.
|
|
74
|
+
*
|
|
75
|
+
* Injected by the composition root, not passed to the constructor: the manager is built long
|
|
76
|
+
* before the content park exists (content-park.ts documents why that ordering is load-bearing).
|
|
77
|
+
*/
|
|
78
|
+
setParkedDrainHook(fn) {
|
|
79
|
+
this.#parkedDrainHook = fn;
|
|
80
|
+
}
|
|
81
|
+
/** Ask for a drain. Never throws — a broken drain must never cost the caller its receiver. */
|
|
82
|
+
fireParkedDrain(agentName, reason) {
|
|
83
|
+
const hook = this.#parkedDrainHook;
|
|
84
|
+
if (this.#ctx.shuttingDown())
|
|
85
|
+
return;
|
|
86
|
+
if (!hook) {
|
|
87
|
+
// DOD-PARK-DRAIN-1 (review F4): an unwired hook silently reverts this entire unit, and the
|
|
88
|
+
// defect it fixes was itself a trigger that silently was not there. Say so — once, because
|
|
89
|
+
// the fire points are on a timer grid. Not an error: a SessionNodeManager built by a test
|
|
90
|
+
// that does not exercise the drain is legitimate.
|
|
91
|
+
if (!this.#parkedDrainHookAbsenceLogged) {
|
|
92
|
+
this.#parkedDrainHookAbsenceLogged = true;
|
|
93
|
+
this.#ctx.logger.warn("content.recover.drain.hook.absent", { agentName, reason });
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// The success-side trail. Without it, a live run cannot say WHICH trigger delivered the
|
|
98
|
+
// content — which is exactly the claim the outstanding acceptance clause has to evidence.
|
|
99
|
+
this.#ctx.logger.info("content.recover.drain.triggered", { agentName, reason });
|
|
100
|
+
try {
|
|
101
|
+
hook(agentName, reason);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
this.#ctx.logger.warn("content.recover.drain.hook.failed", {
|
|
105
|
+
agentName,
|
|
106
|
+
reason,
|
|
107
|
+
error: extractErrorMessage(err),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* MSG-001-3b (2b): deposit un-confirmed content to the relay store-and-forward backstop — keyed
|
|
113
|
+
* to the recipient, on the SAME relay this session is witnessed by — so an offline recipient
|
|
114
|
+
* recovers it (at the sequence the witness already assigned, R1). Best-effort, never throws.
|
|
115
|
+
* DOD-LEAVEMSG-1: returns whether the deposit actually succeeded (false if no hook/relay is
|
|
116
|
+
* configured, or the hook rejects) so a caller with a live response to shape (sendContent) can
|
|
117
|
+
* distinguish "genuinely parked" from "nothing recoverable" instead of guessing. Callers that
|
|
118
|
+
* fire this from an async backstop with no live caller (the TTF-expiry path) may ignore the
|
|
119
|
+
* result — the deposit itself and its logging are unchanged either way.
|
|
120
|
+
*/
|
|
121
|
+
/**
|
|
122
|
+
* `contentHashAlg` is `string | undefined`, NOT optional — B2b-1 review F4's shape, applied to the
|
|
123
|
+
* last place it was missing.
|
|
124
|
+
*
|
|
125
|
+
* Optional, dropping it at a call site was neither a typecheck error nor a test failure, because
|
|
126
|
+
* absent silently means `sha256` and that is the only value in play today. Measured: the
|
|
127
|
+
* direct-dial-fail route's mutant SURVIVED the whole daemon suite. Requiring the argument — even
|
|
128
|
+
* when its value is `undefined` — forces each of the three callers to state what this message was
|
|
129
|
+
* hashed under, so a new fourth caller cannot omit it by accident.
|
|
130
|
+
*/
|
|
131
|
+
async parkContent(agentName, sessionId, contentHashHex, content, structure1Cbor, structure2Cbor, contentHashAlg, structure1Signature, parkLeafKind) {
|
|
132
|
+
// Fault injection FIRST, so it reproduces the real shape: the refusal happens at the same point
|
|
133
|
+
// the live hook refuses (before any deposit), with the same event and the same `cause`.
|
|
134
|
+
if (this.#parkFaultRemaining > 0) {
|
|
135
|
+
this.#parkFaultRemaining -= 1;
|
|
136
|
+
this.#ctx.logger.warn("content.park.deposit.failed", {
|
|
137
|
+
sessionId,
|
|
138
|
+
contentHash: contentHashHex,
|
|
139
|
+
reason: "standing_receiver_unavailable",
|
|
140
|
+
cause: this.#parkFaultCause,
|
|
141
|
+
injected: true,
|
|
142
|
+
});
|
|
143
|
+
return { outcome: "refused", cause: this.#parkFaultCause };
|
|
144
|
+
}
|
|
145
|
+
const hook = this.#contentParkHook;
|
|
146
|
+
const entry = this.#ctx.activeEntry(this.#ctx.sessionKey(agentName, sessionId));
|
|
147
|
+
// M12-P12 (review F6): "no park target configured" is NOT a refused deposit. Content in a
|
|
148
|
+
// session with no relay was never recoverable through the park, so queuing it for re-park would
|
|
149
|
+
// be a lie that grows the DB forever — every boot and every agent start would retry a row whose
|
|
150
|
+
// only possible outcome is no_persisted_relay_endpoint. Reported as unconfigured, not refused.
|
|
151
|
+
if (!hook || !entry || !entry.relayPeerId || !entry.relayAddrs)
|
|
152
|
+
return { outcome: "unconfigured" };
|
|
153
|
+
try {
|
|
154
|
+
const result = await hook({
|
|
155
|
+
// SEC-1: the hook must sign as the SENDING agent — it needs to know who that is.
|
|
156
|
+
agentName,
|
|
157
|
+
sessionId,
|
|
158
|
+
recipientPubkeyHex: entry.counterpartyPubkey,
|
|
159
|
+
relayPeerId: entry.relayPeerId,
|
|
160
|
+
relayAddrs: entry.relayAddrs,
|
|
161
|
+
contentHashHex,
|
|
162
|
+
content,
|
|
163
|
+
// DOD-MSG-4 (2b): carry the relay's signed ordering record so the parked entry is self-ordering
|
|
164
|
+
// on recover too (sealed INTO the ciphertext envelope — INV-3: the relay still sees only ciphertext).
|
|
165
|
+
structure1Cbor,
|
|
166
|
+
structure2Cbor,
|
|
167
|
+
// 034-CARRYLEAF: the author's signature over `structure1Cbor`, so the RECIPIENT can witness
|
|
168
|
+
// this leaf if its author never does. Without it the mailbox route stays truncatable.
|
|
169
|
+
structure1Signature,
|
|
170
|
+
// 034-CARRYLEAF: the leaf DOMAIN, so a recovered leaf is never witnessed under a guess.
|
|
171
|
+
leafKind: parkLeafKind,
|
|
172
|
+
// B2b: the park route must name the same algorithm the direct frame did, or the recipient
|
|
173
|
+
// verifies the same message two different ways depending on which route it took.
|
|
174
|
+
contentHashAlg,
|
|
175
|
+
});
|
|
176
|
+
// DOD-LEAVEMSG-1 (reviewer HIGH fix): check the TYPED result, not just "didn't throw" — the
|
|
177
|
+
// production hook's own failure branches (standing receiver unavailable, relay explicitly
|
|
178
|
+
// rejects) resolve normally after logging, they never throw. A throw-only check would report
|
|
179
|
+
// those as success.
|
|
180
|
+
if (!result.ok) {
|
|
181
|
+
this.#ctx.logger.warn("content.park.deposit.failed", {
|
|
182
|
+
sessionId,
|
|
183
|
+
contentHash: contentHashHex,
|
|
184
|
+
reason: result.reason,
|
|
185
|
+
cause: result.cause,
|
|
186
|
+
});
|
|
187
|
+
return {
|
|
188
|
+
outcome: "refused",
|
|
189
|
+
cause: result.cause ?? result.reason,
|
|
190
|
+
...(result.retryAfterMs !== undefined ? { retryAfterMs: result.retryAfterMs } : {}),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return { outcome: "parked" };
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
/**
|
|
197
|
+
* THE CODE GOES IN `cause`, THE PARAGRAPH GOES IN THE LOG — B2b-2 constraint 6.
|
|
198
|
+
*
|
|
199
|
+
* `cause` is documented as the machine-readable half and is handed to callers that branch on
|
|
200
|
+
* it. Putting `err.message` there meant a producer-side refusal — this build cannot seal that
|
|
201
|
+
* algorithm — was indistinguishable from a relay outage, so it inherited the relay's guidance:
|
|
202
|
+
* *"queued, and will be re-sent when the relay link is back."* The relay was never asked, and
|
|
203
|
+
* every re-park throws in the same place, so that sends the operator to the wrong subsystem
|
|
204
|
+
* and then tells them to wait for a recovery that cannot happen.
|
|
205
|
+
*
|
|
206
|
+
* `instanceof`, not a string test: an untyped failure keeps the old behaviour exactly, so this
|
|
207
|
+
* narrows what the caller can distinguish without changing anything it could not.
|
|
208
|
+
*/
|
|
209
|
+
const coded = err instanceof ParkEnvelopeError ? err : null;
|
|
210
|
+
this.#ctx.logger.warn("content.park.deposit.failed", {
|
|
211
|
+
sessionId,
|
|
212
|
+
contentHash: contentHashHex,
|
|
213
|
+
...(coded === null ? {} : { reason: coded.reason, detail: coded.detail }),
|
|
214
|
+
error: extractErrorMessage(err),
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
outcome: "refused",
|
|
218
|
+
cause: coded?.reason ?? (extractErrorMessage(err)),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* DOD-M15-DELIVERYACK-1 unit 1 — DEPOSIT OUT-OF-BAND MACHINE TRAFFIC WITH NO LIVE SESSION NODE.
|
|
224
|
+
*
|
|
225
|
+
* `parkContent` resolves the recipient and the relay from the in-memory session entry, which is
|
|
226
|
+
* exactly what does not exist in the case this is for: the counterparty's daemon is down, so there
|
|
227
|
+
* is no live node, and an acknowledgement produced by the mailbox-recovery path had nowhere to go.
|
|
228
|
+
* Measured, not assumed — the live journey showed `content.delivery.ack.skipped
|
|
229
|
+
* / session_node_gone` at precisely this point.
|
|
230
|
+
*
|
|
231
|
+
* So the endpoint is taken from the PERSISTED session row, the same source the crash-backstop
|
|
232
|
+
* flush uses for the same reason. Everything else is `parkContent`'s path unchanged: the payload
|
|
233
|
+
* is sealed to the recipient and the relay holds ciphertext it cannot read.
|
|
234
|
+
*
|
|
235
|
+
* ⚠️ NOT FOR CONTENT. Content parked with no ordering record and no signature over one is a
|
|
236
|
+
* message that is readable and permanently unnotarizable, which is the withholding attack's whole
|
|
237
|
+
* shape — `parkContent`'s own comment says so. Out-of-band traffic takes no leaf and enters no
|
|
238
|
+
* receipt, so it has nothing to be truncated out of.
|
|
239
|
+
*/
|
|
240
|
+
async parkOutOfBand(agentName, sessionId, slotHashHex, payload) {
|
|
241
|
+
const hook = this.#contentParkHook;
|
|
242
|
+
if (!hook)
|
|
243
|
+
return { outcome: "unconfigured" };
|
|
244
|
+
const entry = this.#ctx.activeEntry(this.#ctx.sessionKey(agentName, sessionId));
|
|
245
|
+
const record = this.#ctx.getSessionRecord(agentName, sessionId);
|
|
246
|
+
const recipientPubkeyHex = entry?.counterpartyPubkey ?? record?.counterparty_pubkey;
|
|
247
|
+
const relay = entry?.relayPeerId && entry?.relayAddrs
|
|
248
|
+
? { relayPeerId: entry.relayPeerId, relayAddrs: entry.relayAddrs }
|
|
249
|
+
: this.#ctx.persistedRelayEndpoint(agentName, sessionId);
|
|
250
|
+
/**
|
|
251
|
+
* TWO CAUSES, TWO ANSWERS — review F5. One label for both sent an operator to the relay when the
|
|
252
|
+
* real problem was a session row with no counterparty recorded, which is a local fault and has a
|
|
253
|
+
* completely different remedy.
|
|
254
|
+
*/
|
|
255
|
+
if (!recipientPubkeyHex)
|
|
256
|
+
return { outcome: "refused", cause: "no_counterparty_recorded" };
|
|
257
|
+
if (!relay)
|
|
258
|
+
return { outcome: "unconfigured" };
|
|
259
|
+
try {
|
|
260
|
+
const result = await hook({
|
|
261
|
+
agentName,
|
|
262
|
+
sessionId,
|
|
263
|
+
recipientPubkeyHex,
|
|
264
|
+
relayPeerId: relay.relayPeerId,
|
|
265
|
+
relayAddrs: relay.relayAddrs,
|
|
266
|
+
contentHashHex: slotHashHex,
|
|
267
|
+
content: payload,
|
|
268
|
+
contentHashAlg: undefined,
|
|
269
|
+
});
|
|
270
|
+
if (!result.ok)
|
|
271
|
+
return { outcome: "refused", cause: result.cause ?? result.reason };
|
|
272
|
+
return { outcome: "parked" };
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
return { outcome: "refused", cause: extractErrorMessage(err) };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/** DOD-M12B-INDEX-1 — this agent's own K_local pubkey, for attributing its own held content.
|
|
279
|
+
* Null when it cannot be resolved: an UNATTRIBUTED annex row is true, a falsely attributed one
|
|
280
|
+
* is not, and this is the record that outlives the session. */
|
|
281
|
+
/**
|
|
282
|
+
* Test seam for `#recoverOwnSealCtrlLeaf` (documented on the method itself, below). The
|
|
283
|
+
* distinction it draws — "there is none" versus "I could not tell" — is the whole safety
|
|
284
|
+
* property, and it had no coverage at any level.
|
|
285
|
+
*/
|
|
286
|
+
recoverOwnSealCtrlLeafForTest(agentName, sessionId) {
|
|
287
|
+
return this.recoverOwnSealCtrlLeaf(agentName, sessionId);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* DOD-M12B-INTERRUPTED-ESCALATE-1 — our own SEAL ctrl leaf, if a previous run already posted one.
|
|
291
|
+
*
|
|
292
|
+
* Returns the two values a unilateral escalation runs on, rebuilt from durable state:
|
|
293
|
+
* the ctrl leaf's relay-assigned sequence, and the root the tree WOULD have with that leaf
|
|
294
|
+
* appended. The content hash cannot be recomputed — the seal payload embeds a `close_timestamp`
|
|
295
|
+
* — so it is read out of the signed Structure 1 the store already holds.
|
|
296
|
+
*
|
|
297
|
+
* Null when there is no own ctrl leaf, which is the ordinary first-close case.
|
|
298
|
+
*/
|
|
299
|
+
recoverOwnSealCtrlLeaf(agentName, sessionId) {
|
|
300
|
+
const ownPubkey = this.#ctx.ownPubkeyHex(agentName);
|
|
301
|
+
// "I CANNOT TELL" IS NOT "THERE IS NONE". Returning the absent answer here would let the caller
|
|
302
|
+
// submit a second SEAL ctrl leaf — the exact permanent loss this method exists to prevent — on
|
|
303
|
+
// the strength of a lookup that failed. Every path that could not determine the answer says so.
|
|
304
|
+
if (!ownPubkey) {
|
|
305
|
+
this.#ctx.logger.warn("session.seal.leaf.recover.failed", {
|
|
306
|
+
sessionId, agentName, reason: "own_pubkey_unresolved",
|
|
307
|
+
impact: "cannot tell whether a SEAL ctrl leaf was already posted, so the close refuses rather than risk a second one",
|
|
308
|
+
});
|
|
309
|
+
return "unknown";
|
|
310
|
+
}
|
|
311
|
+
let own;
|
|
312
|
+
try {
|
|
313
|
+
own = this.#ctx.getSealCarry(ownPubkey, sessionId)
|
|
314
|
+
.find((l) => l.leafKind === LEAF_KIND_CTRL && l.senderPubkeyHex === ownPubkey);
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
this.#ctx.logger.warn("session.seal.leaf.recover.failed", {
|
|
318
|
+
sessionId, agentName, reason: "carry_read_failed",
|
|
319
|
+
error: extractErrorMessage(err),
|
|
320
|
+
impact: "cannot tell whether a SEAL ctrl leaf was already posted, so the close refuses rather than risk a second one",
|
|
321
|
+
});
|
|
322
|
+
return "unknown";
|
|
323
|
+
}
|
|
324
|
+
if (!own)
|
|
325
|
+
return "none";
|
|
326
|
+
try {
|
|
327
|
+
// Canonical Structure 1 is [version, content_hash, sender_pubkey, session_id, last_seen_seq,
|
|
328
|
+
// timestamp], plus last_seen_hash at index 6 on a v2 claim (020-ACKHASH). content_hash is
|
|
329
|
+
// index 1 in both.
|
|
330
|
+
const s1 = decodeStructure1(own.structure1Cbor);
|
|
331
|
+
if (!s1.ok) {
|
|
332
|
+
this.#ctx.logger.warn("session.seal.leaf.recover.failed", {
|
|
333
|
+
// NAMED AT ITS CAUSE — review F2. This read `structure1_content_hash_missing`, which was
|
|
334
|
+
// accurate when the only check was `contentHash instanceof Uint8Array`. It now fires for an
|
|
335
|
+
// unknown layout, undecodable CBOR and a malformed field too, and sends an operator to
|
|
336
|
+
// audit a content hash when the layout is what disagreed. `structure1Reason` carries which.
|
|
337
|
+
sessionId, agentName, reason: "structure1_decode_failed", structure1Reason: s1.reason,
|
|
338
|
+
impact: "cannot tell whether a SEAL ctrl leaf was already posted, so the close refuses rather than risk a second one",
|
|
339
|
+
});
|
|
340
|
+
return "unknown";
|
|
341
|
+
}
|
|
342
|
+
const contentHashHex = Buffer.from(s1.fields.contentHash).toString("hex");
|
|
343
|
+
return {
|
|
344
|
+
reportedRootHex: this.#ctx.getSessionTree(agentName, sessionId).rootWithAppendedHex(contentHashHex),
|
|
345
|
+
sequenceNumber: own.sequenceNumber,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
// NOT a decode failure — review F3. `decodeStructure1` never throws, so the only thrower left
|
|
350
|
+
// inside this try is the tree derivation below it. Calling this `structure1_decode_failed`
|
|
351
|
+
// pointed at CBOR for a fault in `rootWithAppendedHex`, and made one reason string mean two
|
|
352
|
+
// unrelated things in the same log event.
|
|
353
|
+
this.#ctx.logger.warn("session.seal.leaf.recover.failed", {
|
|
354
|
+
sessionId, agentName, reason: "seal_root_derivation_threw",
|
|
355
|
+
error: extractErrorMessage(err),
|
|
356
|
+
impact: "cannot tell whether a SEAL ctrl leaf was already posted, so the close refuses rather than risk a second one",
|
|
357
|
+
});
|
|
358
|
+
return "unknown";
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* SEC-1 — THE ONLY WAY PARKED CONTENT ENTERS THE TRANSCRIPT.
|
|
363
|
+
*
|
|
364
|
+
* Authentication and ingest are FUSED here on purpose, and must stay fused. A caller cannot ingest
|
|
365
|
+
* parked content without passing the signature gate, because this is the only entry point. Exposing
|
|
366
|
+
* a separate `decode → ingest` path — with the signature check as its own optional step — is a
|
|
367
|
+
* downgrade attack: an attacker omits the thing that triggers the check, and the check never runs.
|
|
368
|
+
* A gate the caller can skip by leaving a field out is not a gate.
|
|
369
|
+
*
|
|
370
|
+
* FAILS CLOSED. No signature / bad signature / signer is not this session's counterparty / no
|
|
371
|
+
* session at all → REFUSED, nothing is appended, nothing is written, and the caller MUST NOT
|
|
372
|
+
* confirm-delete the entry from the relay (a forgery must not be able to evict itself, and a
|
|
373
|
+
* genuine bug must not silently eat mail).
|
|
374
|
+
*/
|
|
375
|
+
async recoverParkedEntry(agentName, sessionId, recipientPubkey, unsealed, contentHash, correlationId) {
|
|
376
|
+
const contentHashHex = Buffer.from(contentHash).toString("hex");
|
|
377
|
+
// Review M4: a refused entry is deliberately NOT confirm-deleted (a forgery must not be able to
|
|
378
|
+
// evict itself), which means an adversary could otherwise make us unseal + Ed25519-verify the
|
|
379
|
+
// same forged entries on EVERY reconnect, forever — turning the mailbox into an amplification
|
|
380
|
+
// vector against our own recover path. Remember what we already refused and skip the crypto on
|
|
381
|
+
// re-pull. Still never confirmed, so nothing is destroyed. In-memory and BOUNDED: the cost of
|
|
382
|
+
// forgetting across a restart is one more verify, which is exactly the pre-existing behavior.
|
|
383
|
+
const refusalKey = `${this.#ctx.sessionKey(agentName, sessionId)}:${contentHashHex}`;
|
|
384
|
+
const remembered = this.#refusedParkedEntries.get(refusalKey);
|
|
385
|
+
if (remembered) {
|
|
386
|
+
this.#ctx.logger.warn("content.recover.unauthenticated", {
|
|
387
|
+
agentName,
|
|
388
|
+
sessionId,
|
|
389
|
+
contentHash: contentHashHex,
|
|
390
|
+
reason: remembered,
|
|
391
|
+
repeat: true,
|
|
392
|
+
correlationId,
|
|
393
|
+
});
|
|
394
|
+
return { ok: false, reason: remembered };
|
|
395
|
+
}
|
|
396
|
+
const env = decodeParkEnvelope(unsealed);
|
|
397
|
+
const verdict = authenticateParkedEntry({
|
|
398
|
+
env,
|
|
399
|
+
sessionIdHex: sessionId,
|
|
400
|
+
recipientPubkey,
|
|
401
|
+
contentHash,
|
|
402
|
+
counterpartyPubkeyHex: this.#ctx.getSessionRecord(agentName, sessionId)?.counterparty_pubkey,
|
|
403
|
+
});
|
|
404
|
+
if (!verdict.ok) {
|
|
405
|
+
// SEC-1: loud, and specific about WHICH gate refused — a silent drop here would look
|
|
406
|
+
// identical to "no mail", which is how an injection attempt would go unnoticed.
|
|
407
|
+
this.rememberRefusedParkedEntry(refusalKey, verdict.reason);
|
|
408
|
+
this.#ctx.logger.warn("content.recover.unauthenticated", {
|
|
409
|
+
agentName,
|
|
410
|
+
sessionId,
|
|
411
|
+
contentHash: contentHashHex,
|
|
412
|
+
reason: verdict.reason,
|
|
413
|
+
envelopeVersion: env.version,
|
|
414
|
+
correlationId,
|
|
415
|
+
});
|
|
416
|
+
return { ok: false, reason: verdict.reason };
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* DOD-M15-DELIVERYACK-1 unit 1 — IS THIS A MESSAGE, OR AN ACKNOWLEDGEMENT OF ONE?
|
|
420
|
+
*
|
|
421
|
+
* Placed HERE and not one line earlier, deliberately: the envelope gate above has just proved
|
|
422
|
+
* the depositor is this session's counterparty, so nothing a stranger or the relay put in the
|
|
423
|
+
* mailbox reaches this branch. Placed here and not LATER, because the next thing that happens to
|
|
424
|
+
* a recovered entry is ingest — and an acknowledgement ingested as a message would be appended
|
|
425
|
+
* to the transcript, take a leaf, and enter the notarized record, which is the one thing machine
|
|
426
|
+
* traffic must never do.
|
|
427
|
+
*
|
|
428
|
+
* The decision does not touch the relay: the tag lives inside the seal, so the relay can neither
|
|
429
|
+
* read it, strip it to make an acknowledgement be ingested as content, nor add one to make a
|
|
430
|
+
* message disappear into the evidence store.
|
|
431
|
+
*
|
|
432
|
+
* The ACCEPTANCE is not done here. This function's caller holds the database handle, and putting
|
|
433
|
+
* the verify-bind-store here would need this module to reach a store it has no business holding;
|
|
434
|
+
* the caller hands the payload to the one function both routes share.
|
|
435
|
+
*/
|
|
436
|
+
const parkedAck = decodeParkedDeliveryAck(env.content);
|
|
437
|
+
if (parkedAck) {
|
|
438
|
+
this.#ctx.logger.debug("content.recover.delivery_ack", {
|
|
439
|
+
agentName, sessionId, correlationId,
|
|
440
|
+
contentHash: Buffer.from(parkedAck.contentHash).toString("hex"),
|
|
441
|
+
mailboxSlot: contentHashHex,
|
|
442
|
+
});
|
|
443
|
+
return { ok: true, deliveryAck: parkedAck };
|
|
444
|
+
}
|
|
445
|
+
// Authenticated. The ordering record (when present) is still verified independently by
|
|
446
|
+
// #recordFrameOrdering — it answers a different question (WHERE this message sits in the
|
|
447
|
+
// canonical sequence, per the relay) and is still best-effort: a bad record must not block a
|
|
448
|
+
// message whose AUTHORSHIP we have now proven.
|
|
449
|
+
// DOD-FRONTIER-STRAND-1 AC1: keep the VERIFIED position and hand it to ingest, so dedup can
|
|
450
|
+
// tell a redelivery (same position) from a genuinely new identical message (new position).
|
|
451
|
+
let recoveredSeq = null;
|
|
452
|
+
if (env.structure1Cbor && env.structure2Cbor) {
|
|
453
|
+
recoveredSeq = this.#ctx.recordOrderingRecord(agentName, sessionId, env.structure1Cbor, env.structure2Cbor, contentHash, correlationId);
|
|
454
|
+
}
|
|
455
|
+
this.#ctx.logger.info("content.recover.verified", {
|
|
456
|
+
agentName,
|
|
457
|
+
sessionId,
|
|
458
|
+
contentHash: contentHashHex,
|
|
459
|
+
correlationId,
|
|
460
|
+
});
|
|
461
|
+
/**
|
|
462
|
+
* DOD-M15-SEALWIRE-1 part B1 — RECOVERED-FROM-PARK CONTENT CARRIES NO ALGORITHM NAME, and that
|
|
463
|
+
* is correct today rather than an oversight.
|
|
464
|
+
*
|
|
465
|
+
* The park envelope has no field for one, so this passes `undefined`, which resolves to
|
|
466
|
+
* `sha256`. In part B1 that was exactly right and provably so: no sender salted, so every parked
|
|
467
|
+
* entry in existence had been hashed unsalted.
|
|
468
|
+
*
|
|
469
|
+
* ✅ FIXED IN PART B2a, at BOTH sites: here, and the independent verifier in `content-park.ts`.
|
|
470
|
+
* The envelope carries the algorithm from v3 onward, and a v2 envelope's absent field resolves to
|
|
471
|
+
* `sha256` — which is what a peer predating the field actually used.
|
|
472
|
+
*
|
|
473
|
+
* > **⛔ THE LAST SENTENCE HERE READ "Every envelope this build emits is still v2, because
|
|
474
|
+
* > nothing salts yet." THAT IS FALSE NOW.** B2b-2 turned salting on: a session holding an
|
|
475
|
+
* > agreed salt hashes under `hmac-sha256-salt-v1`, so this build DOES emit v3 envelopes.
|
|
476
|
+
* > Rewritten rather than deleted, per `DOD-M15-CLAIM-COMMENTS-1` — the sentence is why the
|
|
477
|
+
* > staleness survived, and an absence would read as deliberate.
|
|
478
|
+
* >
|
|
479
|
+
* > The consequence is not theoretical: a v2 envelope carrying a SALTED hash recomputes unsalted
|
|
480
|
+
* > at the far end and reports `content_hash_mismatch` — a false tamper claim on honest content,
|
|
481
|
+
* > which also blocks auto-co-sign at seal. Measured on 2026-08-24.
|
|
482
|
+
*
|
|
483
|
+
* ─── AND THE REFUSAL DOES NOT HOLD — review F2 ────────────────────────────────────────────
|
|
484
|
+
*
|
|
485
|
+
* A direct-path refusal sends no delivery ACK, so the sender's TTF backstop parks the message
|
|
486
|
+
* and it arrives here seconds later, where `undefined` means `sha256` and it may well succeed.
|
|
487
|
+
* A frame refused BY NAME on one path is then accepted on the other, with nothing tying the two
|
|
488
|
+
* together in the log — an operator sees an ERROR and, ten seconds on, a healthy delivery.
|
|
489
|
+
*
|
|
490
|
+
* That is not repaired by refusing here as well: today's park entry genuinely IS `sha256`, and
|
|
491
|
+
* refusing it would drop good mail. What is wrong is the SILENCE, so the reconciliation is
|
|
492
|
+
* logged instead — the two events become one story, and B2 removes the ambiguity for real by
|
|
493
|
+
* putting the name in the envelope.
|
|
494
|
+
*/
|
|
495
|
+
/**
|
|
496
|
+
* ⚠️ LOGGED AFTER THE INGEST, NOT BEFORE IT — review B2a F1, and the previous version of this
|
|
497
|
+
* block ANNOUNCED A DELIVERY THAT DOES NOT HAPPEN.
|
|
498
|
+
*
|
|
499
|
+
* It fired on a memo hit and said *"the message is being delivered by the other route"*, which
|
|
500
|
+
* was true-by-construction only while the park path passed `undefined` for the algorithm. Part
|
|
501
|
+
* B2a made the park path carry `env.contentHashAlg` — so a peer that names an unreadable
|
|
502
|
+
* algorithm on the direct path AND parks the same content as v3 with the same name is refused
|
|
503
|
+
* AGAIN here, re-arms the memo, is never confirm-deleted, and repeats on every drain. An
|
|
504
|
+
* unbounded stream of warnings asserting a delivery that never occurs, drowning the real
|
|
505
|
+
* reconciliation when the sender eventually re-parks as v2.
|
|
506
|
+
*
|
|
507
|
+
* The claim is only sound once the ingest has actually succeeded, so it is made there.
|
|
508
|
+
*/
|
|
509
|
+
const priorDeclaredAlg = this.#ctx.refusals.priorUnreadableAlg(agentName, sessionId, contentHashHex);
|
|
510
|
+
/**
|
|
511
|
+
* `DOD-M15-AUTHORSHIP-ABSENT-1` review H1 — READ BEFORE THE INGEST, reported after it.
|
|
512
|
+
*
|
|
513
|
+
* Same reasoning as `priorDeclaredAlg` directly above: the memo says what THIS side did to this
|
|
514
|
+
* content on the direct path, and the ingest below is what decides whether the other route
|
|
515
|
+
* succeeded. Reading it after would race the clear.
|
|
516
|
+
*/
|
|
517
|
+
/**
|
|
518
|
+
* ⚠️ **REFUSING AN UNNOTARIZABLE MAILBOX MESSAGE WAS TRIED HERE AND REVERTED — recorded so the
|
|
519
|
+
* next attempt starts from what actually blocks it, not from the compatibility argument that
|
|
520
|
+
* does not.**
|
|
521
|
+
*
|
|
522
|
+
* The mailbox is the remaining route for the withholding attack: a counterparty who parks a
|
|
523
|
+
* message with no ordering record AND no signature over its ordering claim delivers something
|
|
524
|
+
* readable that can never enter a receipt. The obvious fix is to refuse it here.
|
|
525
|
+
*
|
|
526
|
+
* **It cannot ship yet, and the reason is our OWN path, not an older peer's.** `SEC-1` AC5 is
|
|
527
|
+
* explicit: the crash-backstop shape — signed by the sender, no ordering record — is legal and
|
|
528
|
+
* must be accepted. That envelope is produced when content is queued before anything witnessed
|
|
529
|
+
* it, and from the recipient's side it is INDISTINGUISHABLE from an attacker's stripped one. So
|
|
530
|
+
* this refusal rejects our own crash recovery along with the attack.
|
|
531
|
+
*
|
|
532
|
+
* **What closes it:** make the crash backstop sign an ordering claim at enqueue time, the way
|
|
533
|
+
* the live park path now does (`#signOwnContentClaim` already produces exactly this artifact).
|
|
534
|
+
* Then "no ordering record and no signed claim" is a shape only a modified client emits, and
|
|
535
|
+
* refusing it costs nothing real. The retry queue already carries the two columns for it —
|
|
536
|
+
* `structure1_sig` and `leaf_kind` — which were added for this and are populated on the live
|
|
537
|
+
* path today.
|
|
538
|
+
*/
|
|
539
|
+
const refusedForAuthorship = this.#ctx.refusals.wasRefusedOnDirectPath(agentName, sessionId, contentHashHex);
|
|
540
|
+
const result = await this.#ctx.ingestReceivedContent(agentName, sessionId, env.content, contentHash, correlationId, recoveredSeq ?? undefined,
|
|
541
|
+
// The envelope's own claim, verbatim — `undefined` on a v2 envelope, which resolves to
|
|
542
|
+
// `sha256` and is exactly right for a peer that predates the field.
|
|
543
|
+
env.contentHashAlg);
|
|
544
|
+
/**
|
|
545
|
+
* `ok` IS NOT "DELIVERED" — review B2a pass-2 F1, and this is the same class the F1 fix was
|
|
546
|
+
* raised for, one predicate over.
|
|
547
|
+
*
|
|
548
|
+
* `ingestReceivedContent` returns `ok` in three shapes and only one is a delivery:
|
|
549
|
+
* `{ok, held: true}` — buffered behind an ordering gap; not appended, not shown YET.
|
|
550
|
+
* `{ok, screenedOut: true}` — leafed and PERMANENTLY never shown to the agent.
|
|
551
|
+
* Announcing *"the message was delivered by the other route"* for either is a false all-clear on
|
|
552
|
+
* the operator's one line about this message, and the memo is deleted in the same breath, so
|
|
553
|
+
* nothing ever re-raises it.
|
|
554
|
+
*
|
|
555
|
+
* Leaving the memo ARMED on `held` is deliberate: the release path re-enters ingest, which is
|
|
556
|
+
* when delivery actually happens, and the claim becomes true there.
|
|
557
|
+
*
|
|
558
|
+
* ⚠️ THE `screenedOut` CLAUSE IS UNREACHABLE TODAY and is kept anyway — said out loud so nobody
|
|
559
|
+
* reads it as covered. A terminal inbound block needs a detector the shipping security gateway
|
|
560
|
+
* does not wire, so it returns only `allow` and a fail-closed non-terminal `block`. Measured: a
|
|
561
|
+
* mutant dropping just that clause SURVIVES the suite. It stays because the day a detector is
|
|
562
|
+
* wired, this line is the difference between an all-clear and a permanent silent discard — and
|
|
563
|
+
* finding that then costs more than the clause costs now.
|
|
564
|
+
*/
|
|
565
|
+
/**
|
|
566
|
+
* ─── WITNESS A RECOVERED MESSAGE ITS SENDER NEVER WITNESSED — 034-CARRYLEAF review F1 ────────
|
|
567
|
+
*
|
|
568
|
+
* The mailbox route's half of the withholding fix. `recoveredSeq` absent means no relay ordering
|
|
569
|
+
* record came with it, which is the same shape the direct path treats as "their submit never
|
|
570
|
+
* happened" — and it is reached the same two ways: their relay was briefly unreachable, or they
|
|
571
|
+
* are withholding on purpose.
|
|
572
|
+
*
|
|
573
|
+
* ⚠️ THE SIGNATURE COMES FROM THE ENVELOPE, AND ONLY A v4 ENVELOPE HAS ONE. `parkSig`
|
|
574
|
+
* authenticates the DEPOSIT — it signs `(session_id, recipient_pubkey, content_hash)` — and the
|
|
575
|
+
* relay will not accept it, because a counter-submit is admissible only against the author's own
|
|
576
|
+
* signature over their own ordering claim. A v2 or v3 envelope therefore cannot be witnessed on
|
|
577
|
+
* its author's behalf, and is left alone rather than guessed at.
|
|
578
|
+
*
|
|
579
|
+
* **So this route is closed against a peer running a stock client, and open to one that
|
|
580
|
+
* deliberately emits an older envelope.** Requiring v4 is the step that closes it completely,
|
|
581
|
+
* and it waits on nothing in the field emitting v2 or v3 — the same tolerate-then-enforce
|
|
582
|
+
* sequence every bilateral wire change in this milestone follows.
|
|
583
|
+
*/
|
|
584
|
+
if (result.ok && result.held !== true && result.screenedOut !== true &&
|
|
585
|
+
recoveredSeq === null && env.structure1Cbor && env.structure1Signature) {
|
|
586
|
+
const kind = env.leafKind;
|
|
587
|
+
if (typeof kind === "number") {
|
|
588
|
+
this.#ctx.witnessReceivedLeaf(agentName, sessionId, contentHash, env.structure1Cbor, env.structure1Signature, kind, correlationId);
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
if (priorDeclaredAlg !== undefined && result.ok && result.held !== true && result.screenedOut !== true) {
|
|
592
|
+
// Cleared ONLY on a real reconciliation. Clearing on the lookup (as this did) forgets the
|
|
593
|
+
// refusal even when the recovery fails, so the next genuine reconciliation says nothing.
|
|
594
|
+
this.#ctx.refusals.clearUnreadableAlg(agentName, sessionId, contentHashHex);
|
|
595
|
+
this.#ctx.logger.warn("content.recover.alg_refusal_reconciled", {
|
|
596
|
+
agentName, sessionId, correlationId,
|
|
597
|
+
contentHash: contentHashHex,
|
|
598
|
+
priorDeclaredAlg,
|
|
599
|
+
recoveredAlg: env.contentHashAlg ?? "(absent → sha256)",
|
|
600
|
+
impact: "THIS EXACT MESSAGE was refused on the direct path because it named an algorithm this build cannot read, and the same content has now been accepted via the relay park under an algorithm this build CAN read. The refusal did not hold: the message was delivered by the other route.",
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* ⚠️ **THE AUTHORSHIP REFUSAL DOES NOT HOLD EITHER, AND THIS IS WHERE IT SAYS SO** — review H1.
|
|
605
|
+
*
|
|
606
|
+
* `DOD-M15-AUTHORSHIP-ABSENT-1` refuses a direct-path frame with no usable proof of who wrote
|
|
607
|
+
* it. Refusing sends no delivery ACK, so the sender's TTF backstop parks the message and it
|
|
608
|
+
* arrives here — where the ENVELOPE's signature over (session_id, recipient_pubkey,
|
|
609
|
+
* content_hash) is what authenticates it, and `authenticateParkedEntry` above has already
|
|
610
|
+
* accepted it. That is correct and it is deliberately NOT changed here: gating mail retrieval
|
|
611
|
+
* on a per-message record the relay-degraded path is allowed to omit is the false-positive shape
|
|
612
|
+
* this whole unit is careful to avoid, and the order that added the refusal scopes the park
|
|
613
|
+
* envelope out explicitly.
|
|
614
|
+
*
|
|
615
|
+
* What must not stand is the SILENCE. Without this line the operator reads "refused" and then
|
|
616
|
+
* watches the message appear, with nothing connecting the two — the same reconciliation gap the
|
|
617
|
+
* algorithm refusal above already pays for. What they need to know is the part that is really
|
|
618
|
+
* lost: the message arrived, and its INDIVIDUAL author is attested by the mailbox envelope
|
|
619
|
+
* rather than by a signature over that message's own bytes.
|
|
620
|
+
*
|
|
621
|
+
* Same `ok && !held && !screenedOut` predicate as above, and for the same reason: `ok` is not
|
|
622
|
+
* "delivered".
|
|
623
|
+
*/
|
|
624
|
+
if (refusedForAuthorship && result.ok && result.held !== true && result.screenedOut !== true) {
|
|
625
|
+
this.#ctx.refusals.clearRefusedOnDirectPath(agentName, sessionId, contentHashHex);
|
|
626
|
+
/**
|
|
627
|
+
* ⚠️ RENAMED FROM `…authorship_refusal_reconciled` by `029c` review F4, because the memo it
|
|
628
|
+
* reads now covers EVERY direct-path refusal and not only the authorship one. Keeping the old
|
|
629
|
+
* name would have put "no usable proof of who wrote it" on a message that was actually
|
|
630
|
+
* refused for not decrypting — a wrong cause is worse than a general one.
|
|
631
|
+
*
|
|
632
|
+
* The specific reason is already on the operator's notice; what this event adds is that the
|
|
633
|
+
* refusal did not hold.
|
|
634
|
+
*/
|
|
635
|
+
this.#ctx.logger.warn("content.recover.refusal_reconciled", {
|
|
636
|
+
agentName, sessionId, correlationId,
|
|
637
|
+
contentHash: contentHashHex,
|
|
638
|
+
impact: "THIS EXACT MESSAGE was refused on the direct path and the same content has now been accepted from the relay mailbox, where the sealed envelope proves the sender. The refusal did not hold: the message WAS delivered by the other route. What the direct path could not confirm is still unconfirmed — the mailbox proves WHO sent it and nothing about the check that refused it — so the receipt can show this message arrived without showing everything a directly-delivered one would.",
|
|
639
|
+
guidance: "Nothing to do about this message. The fix named on the original refusal still stands: until the cause clears, every message on this session takes the slower route and lands with less attached to it.",
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* DOD-M15-DELIVERYACK-1 unit 1 — SIGN FOR IT, exactly as the direct path does.
|
|
644
|
+
*
|
|
645
|
+
* ⚠️ NOT ON `held` OR `screenedOut`. The acknowledgement says *this machine took delivery of
|
|
646
|
+
* these bytes*, and neither of those is delivery yet: a held frame is buffered behind an
|
|
647
|
+
* ordering gap and is acknowledged when the release path re-enters ingest, and a screened-out
|
|
648
|
+
* one is leafed but never shown. Acknowledging either would tell the sender something that is
|
|
649
|
+
* not true, on the one signal this whole unit exists to make trustworthy.
|
|
650
|
+
*
|
|
651
|
+
* Fire-and-forget: the acknowledgement's own path handles its own failure (it parks), and a
|
|
652
|
+
* message that WAS recovered must never be reported as a failed recovery because signing for it
|
|
653
|
+
* did not work out.
|
|
654
|
+
*/
|
|
655
|
+
if (result.ok && result.held !== true && result.screenedOut !== true) {
|
|
656
|
+
this.#ctx.sendDeliveryAck(agentName, sessionId, contentHash, correlationId);
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Move the acknowledgement a CLOSE will sign, exactly as the live content-frame path does.
|
|
660
|
+
*
|
|
661
|
+
* This was declared on the context and never called, so a message recovered from the mailbox
|
|
662
|
+
* was placed in the tree while the acknowledgement stayed at the last message the relay had
|
|
663
|
+
* delivered directly. The relay refuses a close that acknowledges less than the other side filed
|
|
664
|
+
* (`seal_stale`), and the close's retry waits for an advance nothing on this path makes. Live
|
|
665
|
+
* 2026-09-17, session 4d0aaa41: back from 7 minutes offline, the agent read the message and could
|
|
666
|
+
* not close, twice.
|
|
667
|
+
*
|
|
668
|
+
* Gated on `held` but NOT on `screenedOut`: a screened-out message is still a leaf in the root
|
|
669
|
+
* the close signs, so its position is one this side has to acknowledge. `recoveredSeq` null means
|
|
670
|
+
* no verified ordering record, and there is no position to claim.
|
|
671
|
+
*/
|
|
672
|
+
if (result.ok && result.held !== true && recoveredSeq !== null) {
|
|
673
|
+
this.#ctx.noteAcknowledgeable(agentName, sessionId, recoveredSeq, contentHash);
|
|
674
|
+
}
|
|
675
|
+
return result;
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Review M4: bounded memo of parked entries we have already refused, so a mailbox stuffed with
|
|
679
|
+
* forgeries cannot force an unbounded unseal+verify on every reconnect. FIFO-capped — the cap
|
|
680
|
+
* matters more than the retention: forgetting an entry only costs one extra verification, whereas
|
|
681
|
+
* an unbounded map would be a memory leak fed by a remote party (the exact class the DOD-MSG-4
|
|
682
|
+
* review already caught once in the offered-moniker map).
|
|
683
|
+
*/
|
|
684
|
+
rememberRefusedParkedEntry(key, reason) {
|
|
685
|
+
if (this.#refusedParkedEntries.size >= MAX_REFUSED_PARKED_ENTRIES) {
|
|
686
|
+
const oldest = this.#refusedParkedEntries.keys().next();
|
|
687
|
+
if (!oldest.done)
|
|
688
|
+
this.#refusedParkedEntries.delete(oldest.value);
|
|
689
|
+
}
|
|
690
|
+
this.#refusedParkedEntries.set(key, reason);
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* DOD-PARK-DRAIN-1: the backstop sweep — every agent holding a standing receiver gets a drain
|
|
694
|
+
* every #parkedDrainBackstopMs, whether or not anything happened.
|
|
695
|
+
*
|
|
696
|
+
* The trigger-driven drains (agent start, receiver install, a reservation lost or regained,
|
|
697
|
+
* signaling reconnect) are what actually deliver. 056-SLOTDEAD: "receiver rebuild" was one of
|
|
698
|
+
* them and there is no rebuild any more. This exists because the incident was a MISSING trigger, and a missing
|
|
699
|
+
* trigger is invisible: the daemon looked healthy, the content was intact on the relay, and the
|
|
700
|
+
* only thing that ever moved it was a human restarting the daemon. With the sweep, the worst a
|
|
701
|
+
* future gap in trigger coverage can cost is one interval of latency. Safe by construction —
|
|
702
|
+
* ingest is deduped and the relay is delete-on-confirm, so a redundant drain pulls nothing.
|
|
703
|
+
*/
|
|
704
|
+
parkedDrainBackstopTick(now) {
|
|
705
|
+
if (this.#parkedDrainHook === null)
|
|
706
|
+
return;
|
|
707
|
+
if (now - this.#parkedDrainLastBackstopAt < this.#parkedDrainBackstopMs)
|
|
708
|
+
return;
|
|
709
|
+
this.#parkedDrainLastBackstopAt = now;
|
|
710
|
+
for (const agentName of this.#ctx.agentsWithLiveReceiver()) {
|
|
711
|
+
if (!this.#ctx.agentWantsReceiver(agentName))
|
|
712
|
+
continue; // agent went offline
|
|
713
|
+
this.fireParkedDrain(agentName, "periodic_backstop");
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
//# sourceMappingURL=park-recovery.js.map
|