@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,701 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CELLO Daemon — RetryQueue
|
|
3
|
+
*
|
|
4
|
+
* Per-session FIFO queue of messages awaiting delivery. When a send over a
|
|
5
|
+
* session node stream fails, the message envelope is added to the queue. When
|
|
6
|
+
* the peer reconnects, the daemon drains the queue in FIFO order.
|
|
7
|
+
*
|
|
8
|
+
* Persistence: SQLCipher table `retry_queue`.
|
|
9
|
+
* Cap: 1,000 messages per session. On overflow the OLDEST is evicted.
|
|
10
|
+
*
|
|
11
|
+
* FIFO invariant: a drain HALTS on the first failure. M3 must never arrive before M2.
|
|
12
|
+
*/
|
|
13
|
+
import { extractErrorMessage } from "./error-message.js";
|
|
14
|
+
/** Per-session cap. On overflow the OLDEST entry is evicted. */
|
|
15
|
+
export const RETRY_QUEUE_CAP = 1000;
|
|
16
|
+
/**
|
|
17
|
+
* Park failures from which the entry can NEVER recover, so keeping it only re-attempts it at every
|
|
18
|
+
* boot forever. An ALLOWLIST, and deliberately a short one: everything not named here is kept,
|
|
19
|
+
* because the cost of keeping a deliverable row is one WARN per boot while the cost of dropping one
|
|
20
|
+
* is a message the sender believes was delivered.
|
|
21
|
+
*
|
|
22
|
+
* `owning_agent_not_found` qualifies on evidence, not judgement: it means `agentNameForId` found no
|
|
23
|
+
* `agents` row for the entry's agent_id, and `remove-agent` is permanent and frees the name. The
|
|
24
|
+
* owner cannot come back, so no future boot can park this.
|
|
25
|
+
*
|
|
26
|
+
* The other four are all recoverable on a later boot and MUST NOT be added:
|
|
27
|
+
* no_persisted_relay_endpoint — the endpoint is learned when the session next reconnects
|
|
28
|
+
* no_counterparty — the sessions row can still gain one
|
|
29
|
+
* standing_receiver_unavailable— the receiver is rebuilt on the next agent start
|
|
30
|
+
* signing_key_unavailable — the key provider may simply not be loaded yet
|
|
31
|
+
*/
|
|
32
|
+
const PERMANENT_PARK_FAILURES = new Set(["owning_agent_not_found"]);
|
|
33
|
+
export class RetryQueue {
|
|
34
|
+
#db;
|
|
35
|
+
#logger;
|
|
36
|
+
/** Per-session FIFO arrays of DIRECT-resend entries, ordered by position ascending. */
|
|
37
|
+
#queues = new Map();
|
|
38
|
+
/** Per-session position counter for monotonic increment. */
|
|
39
|
+
#positionCounters = new Map();
|
|
40
|
+
/** Per-(agent,session) FIFO arrays of awaiting-ACK content (park target). */
|
|
41
|
+
#awaiting = new Map();
|
|
42
|
+
constructor(db, logger) {
|
|
43
|
+
this.#db = db;
|
|
44
|
+
this.#logger = logger;
|
|
45
|
+
// Create table + index if not exists (inline migration — not Flyway).
|
|
46
|
+
// ORDERING CONSTRAINT: migrateSessionTablesToAgentId (run by SessionNodeManager.initialize) MUST
|
|
47
|
+
// execute BEFORE this constructor, so the table here either does not exist (fresh DB, created
|
|
48
|
+
// below) or already carries agent_id. Do not reorder.
|
|
49
|
+
this.#db.exec(`
|
|
50
|
+
CREATE TABLE IF NOT EXISTS retry_queue (
|
|
51
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
+
session_id TEXT NOT NULL,
|
|
53
|
+
agent_id TEXT,
|
|
54
|
+
nonce_hex TEXT NOT NULL,
|
|
55
|
+
content_blob BLOB NOT NULL,
|
|
56
|
+
queued_at INTEGER NOT NULL,
|
|
57
|
+
attempts INTEGER NOT NULL DEFAULT 1,
|
|
58
|
+
position INTEGER NOT NULL,
|
|
59
|
+
awaiting_ack INTEGER NOT NULL DEFAULT 0,
|
|
60
|
+
content_hash_hex TEXT,
|
|
61
|
+
structure1_cbor BLOB,
|
|
62
|
+
structure2_cbor BLOB,
|
|
63
|
+
-- 034-CARRYLEAF: the AUTHOR's signature over structure1_cbor, and the leaf DOMAIN. Without
|
|
64
|
+
-- both, a message re-parked after a restart cannot be witnessed by its recipient, and the
|
|
65
|
+
-- withholding attack stays open on exactly the path a crash creates.
|
|
66
|
+
structure1_sig BLOB,
|
|
67
|
+
leaf_kind INTEGER,
|
|
68
|
+
content_hash_alg TEXT
|
|
69
|
+
)
|
|
70
|
+
`);
|
|
71
|
+
// Idempotent add for databases created before M12-P12. SQLite has no ADD COLUMN IF NOT EXISTS,
|
|
72
|
+
// so the duplicate-column error is the expected no-op on an already-migrated DB; any OTHER
|
|
73
|
+
// error is a real failure and must not be swallowed.
|
|
74
|
+
/**
|
|
75
|
+
* 🚨 A COLUMN ADDED HERE NEEDS A SECOND ENTRY, in `agent-id-migration.ts`'s `retry_queue`
|
|
76
|
+
* `createSql`. That rebuild copies the INTERSECTION of the old and new column lists, so a column
|
|
77
|
+
* this loop adds and that DDL omits is DROPPED on the one boot where a legacy database migrates
|
|
78
|
+
* — and then re-added EMPTY by this very loop, which is what makes it silent.
|
|
79
|
+
*
|
|
80
|
+
* It has happened: `structure1_cbor` and `structure2_cbor` were missing from that DDL from the
|
|
81
|
+
* day they were added until `DOD-M15-SEALWIRE-1` part B2b found it.
|
|
82
|
+
*/
|
|
83
|
+
for (const col of [
|
|
84
|
+
{ name: "structure1_cbor", type: "BLOB" },
|
|
85
|
+
{ name: "structure2_cbor", type: "BLOB" },
|
|
86
|
+
{ name: "structure1_sig", type: "BLOB" },
|
|
87
|
+
{ name: "leaf_kind", type: "INTEGER" },
|
|
88
|
+
// DOD-M15-SEALWIRE-1 part B2b: which content-hash algorithm this queued message was hashed
|
|
89
|
+
// under. The crash-backstop park producer has no other source for it — the frame is gone by
|
|
90
|
+
// the time it runs — and re-parking under the wrong one gets the message refused.
|
|
91
|
+
{ name: "content_hash_alg", type: "TEXT" },
|
|
92
|
+
]) {
|
|
93
|
+
try {
|
|
94
|
+
this.#db.exec(`ALTER TABLE retry_queue ADD COLUMN ${col.name} ${col.type}`);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
const msg = extractErrorMessage(err);
|
|
98
|
+
if (!/duplicate column name/i.test(msg))
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
this.#db.exec(`
|
|
103
|
+
CREATE INDEX IF NOT EXISTS retry_queue_by_session_position
|
|
104
|
+
ON retry_queue(session_id, position ASC)
|
|
105
|
+
`);
|
|
106
|
+
// Uniqueness MUST include the agent. For an awaiting row nonce_hex IS the content hash, so
|
|
107
|
+
// without the agent in the key two local agents parking identical content in one session collide.
|
|
108
|
+
//
|
|
109
|
+
// It is expressed over COALESCE(agent_id, '') rather than as a bare UNIQUE(agent_id, ...) because
|
|
110
|
+
// SQLite treats NULLs as DISTINCT in a UNIQUE constraint, which would silently REMOVE the
|
|
111
|
+
// (session_id, nonce_hex) dedup that agent-less direct-retry rows (agent_id NULL) rely on.
|
|
112
|
+
// COALESCE folds every agent-less row into one bucket while giving each agent its own.
|
|
113
|
+
this.#db.exec(`
|
|
114
|
+
CREATE UNIQUE INDEX IF NOT EXISTS retry_queue_agent_session_nonce
|
|
115
|
+
ON retry_queue(COALESCE(agent_id, ''), session_id, nonce_hex)
|
|
116
|
+
`);
|
|
117
|
+
}
|
|
118
|
+
/** Composite key for the awaiting-ACK map — (agentId, sessionId). */
|
|
119
|
+
#ak(agentId, sessionId) {
|
|
120
|
+
return `${agentId}\x1f${sessionId}`;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Load all retry queue entries from SQLCipher into memory.
|
|
124
|
+
* Must complete BEFORE the IPC socket opens.
|
|
125
|
+
*/
|
|
126
|
+
loadFromDb() {
|
|
127
|
+
const rows = this.#db
|
|
128
|
+
.prepare("SELECT session_id, agent_id, nonce_hex, content_blob, queued_at, attempts, position, awaiting_ack, content_hash_hex, structure1_cbor, structure2_cbor, structure1_sig, leaf_kind, content_hash_alg FROM retry_queue ORDER BY session_id, position ASC")
|
|
129
|
+
.all();
|
|
130
|
+
this.#queues.clear();
|
|
131
|
+
this.#positionCounters.clear();
|
|
132
|
+
this.#awaiting.clear();
|
|
133
|
+
for (const row of rows) {
|
|
134
|
+
if (row.awaiting_ack === 1) {
|
|
135
|
+
// Un-acked content to re-park at startup, keyed by the OWNING agent. An awaiting row ALWAYS
|
|
136
|
+
// carries an agent_id (enqueueAwaitingContent requires one); an agent-less row here is a
|
|
137
|
+
// corrupt row, not a single-agent default, so it is reported and skipped rather than silently
|
|
138
|
+
// re-parked under an empty-string agent — which would merge two agents' content into one queue.
|
|
139
|
+
if (row.agent_id === null) {
|
|
140
|
+
this.#logger.error("message.retry.awaiting.orphaned", {
|
|
141
|
+
sessionId: row.session_id,
|
|
142
|
+
nonce: row.content_hash_hex ?? row.nonce_hex,
|
|
143
|
+
impact: "awaiting-ACK row has no owning agent_id; not re-parked",
|
|
144
|
+
});
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const entry = {
|
|
148
|
+
agentId: row.agent_id,
|
|
149
|
+
sessionId: row.session_id,
|
|
150
|
+
contentHashHex: row.content_hash_hex ?? row.nonce_hex,
|
|
151
|
+
contentBlob: this.#openBlob(Uint8Array.from(row.content_blob)),
|
|
152
|
+
// M12-P12 (F2): the ordering record is NOT sealed — it is the relay's own signed record,
|
|
153
|
+
// already public to the relay, and it must be readable to re-seal the park envelope.
|
|
154
|
+
contentHashAlg: row.content_hash_alg ?? undefined,
|
|
155
|
+
structure1Cbor: row.structure1_cbor ? Uint8Array.from(row.structure1_cbor) : undefined,
|
|
156
|
+
structure2Cbor: row.structure2_cbor ? Uint8Array.from(row.structure2_cbor) : undefined,
|
|
157
|
+
structure1Signature: row.structure1_sig ? Uint8Array.from(row.structure1_sig) : undefined,
|
|
158
|
+
leafKind: row.leaf_kind ?? undefined,
|
|
159
|
+
queuedAt: row.queued_at,
|
|
160
|
+
position: row.position,
|
|
161
|
+
};
|
|
162
|
+
const ak = this.#ak(row.agent_id, entry.sessionId);
|
|
163
|
+
// The awaiting position counter MUST be keyed by (agentId, sessionId) — the same key
|
|
164
|
+
// enqueueAwaitingContent uses. Bumping it under the bare session_id here restarts every
|
|
165
|
+
// awaiting position at 1 after a reload, colliding with the rows just loaded.
|
|
166
|
+
const awaitingMax = this.#positionCounters.get(ak) ?? 0;
|
|
167
|
+
if (row.position > awaitingMax)
|
|
168
|
+
this.#positionCounters.set(ak, row.position);
|
|
169
|
+
let q = this.#awaiting.get(ak);
|
|
170
|
+
if (!q) {
|
|
171
|
+
q = [];
|
|
172
|
+
this.#awaiting.set(ak, q);
|
|
173
|
+
}
|
|
174
|
+
q.push(entry);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
// Direct-retry entries are session-scoped (no owning agent), so their counter is too.
|
|
178
|
+
const currentMax = this.#positionCounters.get(row.session_id) ?? 0;
|
|
179
|
+
if (row.position > currentMax)
|
|
180
|
+
this.#positionCounters.set(row.session_id, row.position);
|
|
181
|
+
const entry = {
|
|
182
|
+
sessionId: row.session_id,
|
|
183
|
+
nonceHex: row.nonce_hex,
|
|
184
|
+
contentBlob: this.#openBlob(Uint8Array.from(row.content_blob)),
|
|
185
|
+
queuedAt: row.queued_at,
|
|
186
|
+
attempts: row.attempts,
|
|
187
|
+
position: row.position,
|
|
188
|
+
};
|
|
189
|
+
let sessionQueue = this.#queues.get(entry.sessionId);
|
|
190
|
+
if (!sessionQueue) {
|
|
191
|
+
sessionQueue = [];
|
|
192
|
+
this.#queues.set(entry.sessionId, sessionQueue);
|
|
193
|
+
}
|
|
194
|
+
sessionQueue.push(entry);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Enqueue a failed message for later retry.
|
|
199
|
+
* Evicts the oldest entry if cap is reached.
|
|
200
|
+
*/
|
|
201
|
+
/**
|
|
202
|
+
* The content blob is stored as plaintext bytes — the whole DB is SQLCipher-encrypted at rest, so
|
|
203
|
+
* there is no per-column cipher. These pass-throughs keep the call sites stable.
|
|
204
|
+
*/
|
|
205
|
+
#sealBlob(b) {
|
|
206
|
+
return b;
|
|
207
|
+
}
|
|
208
|
+
#openBlob(b) {
|
|
209
|
+
return b;
|
|
210
|
+
}
|
|
211
|
+
enqueue(sessionId, nonce, contentBlob) {
|
|
212
|
+
const nonceHex = Buffer.from(nonce).toString("hex");
|
|
213
|
+
let sessionQueue = this.#queues.get(sessionId);
|
|
214
|
+
if (!sessionQueue) {
|
|
215
|
+
sessionQueue = [];
|
|
216
|
+
this.#queues.set(sessionId, sessionQueue);
|
|
217
|
+
}
|
|
218
|
+
// Cap enforcement: evict oldest if at limit
|
|
219
|
+
if (sessionQueue.length >= RETRY_QUEUE_CAP) {
|
|
220
|
+
const oldest = sessionQueue[0];
|
|
221
|
+
// Delete from DB
|
|
222
|
+
try {
|
|
223
|
+
this.#db
|
|
224
|
+
.prepare("DELETE FROM retry_queue WHERE session_id = ? AND position = ?")
|
|
225
|
+
.run(sessionId, oldest.position);
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
229
|
+
sessionId,
|
|
230
|
+
nonce: oldest.nonceHex,
|
|
231
|
+
error: extractErrorMessage(err),
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// Log eviction BEFORE the new entry is logged.
|
|
235
|
+
this.#logger.warn("message.retry.evicted", {
|
|
236
|
+
sessionId,
|
|
237
|
+
nonce: oldest.nonceHex,
|
|
238
|
+
queueDepth: RETRY_QUEUE_CAP,
|
|
239
|
+
});
|
|
240
|
+
// Remove from in-memory
|
|
241
|
+
sessionQueue.shift();
|
|
242
|
+
}
|
|
243
|
+
// Compute next position
|
|
244
|
+
const currentMax = this.#positionCounters.get(sessionId) ?? 0;
|
|
245
|
+
const nextPosition = currentMax + 1;
|
|
246
|
+
this.#positionCounters.set(sessionId, nextPosition);
|
|
247
|
+
const queuedAt = Date.now();
|
|
248
|
+
const entry = {
|
|
249
|
+
sessionId,
|
|
250
|
+
nonceHex,
|
|
251
|
+
contentBlob,
|
|
252
|
+
queuedAt,
|
|
253
|
+
attempts: 1,
|
|
254
|
+
position: nextPosition,
|
|
255
|
+
};
|
|
256
|
+
// Persist to SQLCipher
|
|
257
|
+
try {
|
|
258
|
+
this.#db
|
|
259
|
+
.prepare(`INSERT INTO retry_queue (session_id, nonce_hex, content_blob, queued_at, attempts, position)
|
|
260
|
+
VALUES (?, ?, ?, ?, ?, ?)`)
|
|
261
|
+
.run(sessionId, nonceHex, Buffer.from(this.#sealBlob(contentBlob)), queuedAt, 1, nextPosition);
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
265
|
+
sessionId,
|
|
266
|
+
nonce: nonceHex,
|
|
267
|
+
error: extractErrorMessage(err),
|
|
268
|
+
});
|
|
269
|
+
// Message stays in memory only — it is not durable across a restart.
|
|
270
|
+
}
|
|
271
|
+
sessionQueue.push(entry);
|
|
272
|
+
this.#logger.info("message.retry.queued", {
|
|
273
|
+
sessionId,
|
|
274
|
+
nonce: nonceHex,
|
|
275
|
+
queueDepth: sessionQueue.length,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Drain the session's retry queue in FIFO order.
|
|
280
|
+
* Halts immediately on first failure (FIFO invariant: no out-of-order delivery).
|
|
281
|
+
* Returns the number of successfully delivered messages.
|
|
282
|
+
*/
|
|
283
|
+
async drainSession(sessionId, sendFn) {
|
|
284
|
+
const sessionQueue = this.#queues.get(sessionId);
|
|
285
|
+
if (!sessionQueue || sessionQueue.length === 0) {
|
|
286
|
+
return 0;
|
|
287
|
+
}
|
|
288
|
+
let delivered = 0;
|
|
289
|
+
// Drain in FIFO order (array is already sorted by position ascending)
|
|
290
|
+
while (sessionQueue.length > 0) {
|
|
291
|
+
const entry = sessionQueue[0];
|
|
292
|
+
const result = await sendFn(entry.contentBlob);
|
|
293
|
+
if (!result.delivered) {
|
|
294
|
+
// Increment attempts on failure so attemptsTotal reflects actual tries
|
|
295
|
+
entry.attempts++;
|
|
296
|
+
try {
|
|
297
|
+
this.#db
|
|
298
|
+
.prepare("UPDATE retry_queue SET attempts = ? WHERE session_id = ? AND nonce_hex = ?")
|
|
299
|
+
.run(entry.attempts, sessionId, entry.nonceHex);
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
303
|
+
sessionId,
|
|
304
|
+
nonce: entry.nonceHex,
|
|
305
|
+
error: extractErrorMessage(err),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
// Halt immediately — FIFO invariant: no out-of-order delivery.
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
// Success: delete from DB
|
|
312
|
+
try {
|
|
313
|
+
this.#db
|
|
314
|
+
.prepare("DELETE FROM retry_queue WHERE session_id = ? AND nonce_hex = ?")
|
|
315
|
+
.run(sessionId, entry.nonceHex);
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
319
|
+
sessionId,
|
|
320
|
+
nonce: entry.nonceHex,
|
|
321
|
+
error: extractErrorMessage(err),
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
// Remove from memory
|
|
325
|
+
sessionQueue.shift();
|
|
326
|
+
// Increment attempts for logging
|
|
327
|
+
const attemptsTotal = entry.attempts + 1;
|
|
328
|
+
this.#logger.info("message.retry.delivered", {
|
|
329
|
+
sessionId,
|
|
330
|
+
nonce: entry.nonceHex,
|
|
331
|
+
attemptsTotal,
|
|
332
|
+
});
|
|
333
|
+
delivered++;
|
|
334
|
+
}
|
|
335
|
+
// Clean up empty queue entry
|
|
336
|
+
if (sessionQueue.length === 0) {
|
|
337
|
+
this.#queues.delete(sessionId);
|
|
338
|
+
}
|
|
339
|
+
return delivered;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Remove the DIRECT-resend entries (awaiting_ack = 0) of a session that can never drain again.
|
|
343
|
+
*
|
|
344
|
+
* Removal is authorised by ONE thing: the session reached a status from which no resend can
|
|
345
|
+
* succeed. Never by age — "old" is not "undeliverable", and an age sweep discards live content
|
|
346
|
+
* on a slow link (the DOD-SESSION-REAP-1 rule).
|
|
347
|
+
*
|
|
348
|
+
* Awaiting-ACK rows are deliberately left alone. They drain through `drainAwaitingToPark`, which
|
|
349
|
+
* the startup flush really calls, so they are not stranded; their terminal disposition is a
|
|
350
|
+
* separate concern. Deleting them here would discard content that path still owes delivery on.
|
|
351
|
+
*
|
|
352
|
+
* @returns how many entries were removed — 0 is the normal case and is silent.
|
|
353
|
+
*/
|
|
354
|
+
reapTerminalSession(sessionId, terminalStatus) {
|
|
355
|
+
// The in-memory queue is NOT the authority, and must not be the source for either half of this.
|
|
356
|
+
// A row written by an earlier daemon exists only in the DB until loadFromDb runs — the live
|
|
357
|
+
// strand was exactly that shape — so the rows to announce are read from the DB, and the same
|
|
358
|
+
// set is then deleted. Announcing from memory while deleting from disk would silently discard
|
|
359
|
+
// any row the map does not happen to hold, which is the precise failure AC3 names as the worse
|
|
360
|
+
// one.
|
|
361
|
+
let doomed;
|
|
362
|
+
try {
|
|
363
|
+
doomed = this.#db
|
|
364
|
+
.prepare("SELECT nonce_hex FROM retry_queue WHERE session_id = ? AND awaiting_ack = 0")
|
|
365
|
+
.all(sessionId);
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
369
|
+
sessionId,
|
|
370
|
+
operation: "terminal_reap_select",
|
|
371
|
+
error: extractErrorMessage(err),
|
|
372
|
+
impact: "could not read the rows to reap; nothing was deleted and retryQueueDepth stays pinned",
|
|
373
|
+
});
|
|
374
|
+
return 0;
|
|
375
|
+
}
|
|
376
|
+
if (doomed.length === 0) {
|
|
377
|
+
// Still drop any memory-only residue so depth cannot disagree with the DB, then stay silent:
|
|
378
|
+
// the overwhelming majority of terminal sessions have nothing queued, and an event on every
|
|
379
|
+
// one of them buries the occurrence that means content was actually lost.
|
|
380
|
+
this.#queues.delete(sessionId);
|
|
381
|
+
this.#positionCounters.delete(sessionId);
|
|
382
|
+
return 0;
|
|
383
|
+
}
|
|
384
|
+
let removed;
|
|
385
|
+
try {
|
|
386
|
+
const result = this.#db
|
|
387
|
+
.prepare("DELETE FROM retry_queue WHERE session_id = ? AND awaiting_ack = 0")
|
|
388
|
+
.run(sessionId);
|
|
389
|
+
// Both drivers in use (node:sqlite in tests, SQLCipher in production) report `changes`. Its
|
|
390
|
+
// absence is a driver contract violation, not a case to paper over with a memory count — the
|
|
391
|
+
// whole point of this method is that memory is not authoritative.
|
|
392
|
+
if (result?.changes === undefined) {
|
|
393
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
394
|
+
sessionId,
|
|
395
|
+
operation: "terminal_reap_delete",
|
|
396
|
+
error: "driver returned no `changes` from DELETE",
|
|
397
|
+
impact: "rows may or may not have been removed; the reported count cannot be trusted",
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
removed = Number(result?.changes ?? doomed.length);
|
|
401
|
+
}
|
|
402
|
+
catch (err) {
|
|
403
|
+
// A failed DELETE must not leave memory claiming the rows are gone — the next loadFromDb
|
|
404
|
+
// would resurrect them and the depth would silently disagree with the DB.
|
|
405
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
406
|
+
sessionId,
|
|
407
|
+
operation: "terminal_reap_delete",
|
|
408
|
+
error: extractErrorMessage(err),
|
|
409
|
+
impact: "terminal-session reap did not remove the rows; retryQueueDepth stays pinned",
|
|
410
|
+
});
|
|
411
|
+
return 0;
|
|
412
|
+
}
|
|
413
|
+
// Each dropped entry is content the sender believes it sent. Say so per entry, with the nonce,
|
|
414
|
+
// so the loss is nameable rather than a bare count.
|
|
415
|
+
for (const row of doomed) {
|
|
416
|
+
this.#logger.warn("session.retryqueue.content.dropped", {
|
|
417
|
+
sessionId,
|
|
418
|
+
nonce: row.nonce_hex,
|
|
419
|
+
reason: terminalStatus,
|
|
420
|
+
impact: "queued content was never delivered and is now discarded — the session can no longer drain",
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
this.#queues.delete(sessionId);
|
|
424
|
+
this.#positionCounters.delete(sessionId);
|
|
425
|
+
this.#logger.info("session.retryqueue.reaped", {
|
|
426
|
+
sessionId,
|
|
427
|
+
entryCount: removed,
|
|
428
|
+
reason: terminalStatus,
|
|
429
|
+
});
|
|
430
|
+
return removed;
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* DOD-RETRYQ-STRAND-1: reconcile at startup. The terminal-transition hook only covers sessions
|
|
434
|
+
* that go terminal while THIS daemon is running. A session that was already sealed/abandoned
|
|
435
|
+
* before boot never transitions again — `cello_close_session` returns `already_abandoned`
|
|
436
|
+
* without reaching `abandonSession` — so its rows would strand forever with no path that could
|
|
437
|
+
* ever clear them. That is the shape of the row found on the live daemon.
|
|
438
|
+
*
|
|
439
|
+
* Still evidence-gated: the session's terminal status is the evidence, read from the DB. Nothing
|
|
440
|
+
* here consults age.
|
|
441
|
+
*
|
|
442
|
+
* @returns total entries reaped across all already-terminal sessions.
|
|
443
|
+
*/
|
|
444
|
+
reapAlreadyTerminalSessions() {
|
|
445
|
+
let rows;
|
|
446
|
+
try {
|
|
447
|
+
rows = this.#db
|
|
448
|
+
.prepare(`SELECT DISTINCT rq.session_id AS session_id, s.status AS status
|
|
449
|
+
FROM retry_queue rq
|
|
450
|
+
JOIN sessions s ON s.session_id = rq.session_id
|
|
451
|
+
WHERE rq.awaiting_ack = 0
|
|
452
|
+
AND s.status IN ('sealed', 'abandoned')`)
|
|
453
|
+
.all();
|
|
454
|
+
}
|
|
455
|
+
catch (err) {
|
|
456
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
457
|
+
operation: "startup_terminal_reconcile",
|
|
458
|
+
error: extractErrorMessage(err),
|
|
459
|
+
impact: "already-terminal sessions were not reconciled; retryQueueDepth may stay pinned",
|
|
460
|
+
});
|
|
461
|
+
return 0;
|
|
462
|
+
}
|
|
463
|
+
let total = 0;
|
|
464
|
+
for (const row of rows) {
|
|
465
|
+
total += this.reapTerminalSession(row.session_id, row.status === "sealed" ? "sealed" : "abandoned");
|
|
466
|
+
}
|
|
467
|
+
if (total > 0) {
|
|
468
|
+
this.#logger.info("session.retryqueue.startup.reconciled", {
|
|
469
|
+
sessionCount: rows.length,
|
|
470
|
+
entryCount: total,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
return total;
|
|
474
|
+
}
|
|
475
|
+
/** Total retry queue depth across all sessions. */
|
|
476
|
+
getTotalDepth() {
|
|
477
|
+
let total = 0;
|
|
478
|
+
for (const queue of this.#queues.values()) {
|
|
479
|
+
total += queue.length;
|
|
480
|
+
}
|
|
481
|
+
return total;
|
|
482
|
+
}
|
|
483
|
+
/** Retry queue depth for a specific session. */
|
|
484
|
+
getSessionDepth(sessionId) {
|
|
485
|
+
return this.#queues.get(sessionId)?.length ?? 0;
|
|
486
|
+
}
|
|
487
|
+
/** Get all entries for a session (FIFO ordered, defensive copy). Used by drain_session IPC. */
|
|
488
|
+
getSessionEntries(sessionId) {
|
|
489
|
+
const queue = this.#queues.get(sessionId);
|
|
490
|
+
return queue ? [...queue] : [];
|
|
491
|
+
}
|
|
492
|
+
// ─── Awaiting-ACK content (park target) ──
|
|
493
|
+
/**
|
|
494
|
+
* Record un-acked content awaiting a `persisted` delivery ACK. Persisted to the SAME
|
|
495
|
+
* retry_queue table (awaiting_ack = 1) so a crash before the relay park confirms is
|
|
496
|
+
* recoverable at startup. Idempotent on (agentId, sessionId, contentHash).
|
|
497
|
+
*/
|
|
498
|
+
/**
|
|
499
|
+
* Returns TRUE only when this copy is actually queued. M12-P13 (review HIGH-1): the dedupe branch
|
|
500
|
+
* below DROPS the content, and the caller now commits a hash-chain leaf on the strength of this
|
|
501
|
+
* answer — so "I dropped it" must be reportable, not merely logged. A void return made the drop
|
|
502
|
+
* indistinguishable from a successful enqueue at the call site, which is how a leaf could be
|
|
503
|
+
* committed for content that no longer existed anywhere.
|
|
504
|
+
*/
|
|
505
|
+
/**
|
|
506
|
+
* `contentHashAlg` — `DOD-M15-SEALWIRE-1` part B2b. WHICH algorithm `contentHash` was produced
|
|
507
|
+
* under, carried because the crash-backstop park producer has NO OTHER SOURCE for it: it runs at
|
|
508
|
+
* the next boot, long after the frame is gone, and re-parking under the wrong algorithm gets the
|
|
509
|
+
* message refused by the recipient and re-pulled forever.
|
|
510
|
+
*
|
|
511
|
+
* Optional and stored as NULL when absent, never defaulted to the literal `"sha256"` — absent is
|
|
512
|
+
* what `resolveContentHashAlg` reads as "predates the field", and that distinction is the one B1
|
|
513
|
+
* and B2a each had to restore after it was collapsed.
|
|
514
|
+
*/
|
|
515
|
+
enqueueAwaitingContent(agentId, sessionId, contentHash, contentBlob, structure1Cbor, structure2Cbor, contentHashAlg, structure1Signature, leafKind) {
|
|
516
|
+
if (!agentId)
|
|
517
|
+
throw new Error("enqueueAwaitingContent: an owning agentId is required");
|
|
518
|
+
const contentHashHex = Buffer.from(contentHash).toString("hex");
|
|
519
|
+
const ak = this.#ak(agentId, sessionId);
|
|
520
|
+
let q = this.#awaiting.get(ak);
|
|
521
|
+
if (!q) {
|
|
522
|
+
q = [];
|
|
523
|
+
this.#awaiting.set(ak, q);
|
|
524
|
+
}
|
|
525
|
+
if (q.some((e) => e.contentHashHex === contentHashHex)) {
|
|
526
|
+
// M12-P12 (review F7): the key is SHA-256(0x00 ‖ content) — content-derived, with no sequence
|
|
527
|
+
// and no nonce. Two identical messages in one session ("ok" at seq 3 and seq 7) collide, and
|
|
528
|
+
// the second is DROPPED here. Silently, until now: the drop looked like a successful enqueue
|
|
529
|
+
// and reproduced the very symptom this class of fix exists to remove. Logged so it is at
|
|
530
|
+
// least visible; keying on (sessionId, canonicalSeq, contentHash) is the real fix.
|
|
531
|
+
this.#logger.warn("message.retry.enqueue.deduped", {
|
|
532
|
+
agentId, sessionId, contentHash: contentHashHex,
|
|
533
|
+
impact: "identical content already queued for this session — this copy is NOT separately queued",
|
|
534
|
+
});
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
const currentMax = this.#positionCounters.get(ak) ?? 0;
|
|
538
|
+
const position = currentMax + 1;
|
|
539
|
+
const queuedAt = Date.now();
|
|
540
|
+
// FAILS LOUD: a failed persist of awaiting content is DATA LOSS and MUST throw. Do not "recover"
|
|
541
|
+
// by pushing to memory anyway — the content would vanish at the next restart while the caller was
|
|
542
|
+
// told it was parked. Nothing is added to memory, the position counter is not advanced, and the
|
|
543
|
+
// caller learns its content is not durable. Reaching this branch means a real DB failure (disk
|
|
544
|
+
// full, corruption, SQLITE_LOCKED); the agent-scoped unique index rules out a benign collision.
|
|
545
|
+
try {
|
|
546
|
+
this.#db
|
|
547
|
+
.prepare(`INSERT INTO retry_queue (session_id, agent_id, nonce_hex, content_blob, queued_at, attempts, position, awaiting_ack, content_hash_hex, structure1_cbor, structure2_cbor, structure1_sig, leaf_kind, content_hash_alg)
|
|
548
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?)`)
|
|
549
|
+
.run(sessionId, agentId, contentHashHex, Buffer.from(this.#sealBlob(contentBlob)), queuedAt, 1, position, contentHashHex, structure1Cbor ? Buffer.from(structure1Cbor) : null, structure2Cbor ? Buffer.from(structure2Cbor) : null, structure1Signature ? Buffer.from(structure1Signature) : null, leafKind ?? null, contentHashAlg ?? null);
|
|
550
|
+
}
|
|
551
|
+
catch (err) {
|
|
552
|
+
const reason = extractErrorMessage(err);
|
|
553
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
554
|
+
agentId,
|
|
555
|
+
sessionId,
|
|
556
|
+
nonce: contentHashHex,
|
|
557
|
+
error: reason,
|
|
558
|
+
impact: "awaiting-ACK content NOT durable — it will be lost if the daemon restarts",
|
|
559
|
+
});
|
|
560
|
+
throw new Error(`awaiting_content_persist_failed: ${reason}`);
|
|
561
|
+
}
|
|
562
|
+
this.#positionCounters.set(ak, position);
|
|
563
|
+
q.push({ agentId, sessionId, contentHashHex, contentBlob, structure1Cbor, structure2Cbor, contentHashAlg, queuedAt, position });
|
|
564
|
+
return true;
|
|
565
|
+
}
|
|
566
|
+
/** Remove an awaiting-ACK entry once its `persisted` ACK arrives. */
|
|
567
|
+
markContentAcked(agentId, sessionId, contentHash) {
|
|
568
|
+
const contentHashHex = Buffer.from(contentHash).toString("hex");
|
|
569
|
+
const ak = this.#ak(agentId, sessionId);
|
|
570
|
+
const q = this.#awaiting.get(ak);
|
|
571
|
+
if (q) {
|
|
572
|
+
const idx = q.findIndex((e) => e.contentHashHex === contentHashHex);
|
|
573
|
+
if (idx !== -1)
|
|
574
|
+
q.splice(idx, 1);
|
|
575
|
+
if (q.length === 0)
|
|
576
|
+
this.#awaiting.delete(ak);
|
|
577
|
+
}
|
|
578
|
+
try {
|
|
579
|
+
this.#db
|
|
580
|
+
.prepare("DELETE FROM retry_queue WHERE agent_id = ? AND session_id = ? AND content_hash_hex = ? AND awaiting_ack = 1")
|
|
581
|
+
.run(agentId, sessionId, contentHashHex);
|
|
582
|
+
}
|
|
583
|
+
catch (err) {
|
|
584
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
585
|
+
sessionId, nonce: contentHashHex, error: extractErrorMessage(err),
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
/** Awaiting-ACK depth for a session (un-acked content count). */
|
|
590
|
+
getAwaitingDepth(agentId, sessionId) {
|
|
591
|
+
return this.#awaiting.get(this.#ak(agentId, sessionId))?.length ?? 0;
|
|
592
|
+
}
|
|
593
|
+
/** All (agent, session) pairs that currently hold awaiting-ACK content (for the startup flush). */
|
|
594
|
+
getAwaitingSessions() {
|
|
595
|
+
const out = [];
|
|
596
|
+
for (const q of this.#awaiting.values()) {
|
|
597
|
+
if (q.length > 0)
|
|
598
|
+
out.push({ agentId: q[0].agentId, sessionId: q[0].sessionId });
|
|
599
|
+
}
|
|
600
|
+
return out;
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* Drain a session's awaiting-ACK content to the relay park target. Each item is
|
|
604
|
+
* independent — unlike the direct FIFO resend, a park failure does NOT halt the rest;
|
|
605
|
+
* the failed item stays queued for the next reconnect / startup flush. Returns the
|
|
606
|
+
* number of entries successfully parked.
|
|
607
|
+
*/
|
|
608
|
+
async drainAwaitingToPark(agentId, sessionId, parkFn,
|
|
609
|
+
/**
|
|
610
|
+
* DOD-M15-RELAYABUSE-1 review HIGH-2: called ONCE per pass with the largest retry delay any
|
|
611
|
+
* refusal in that pass reported, or never if none did.
|
|
612
|
+
*
|
|
613
|
+
* ⚠️ Per PASS, not per item, and that is the whole point. A backlog larger than one rate-limit
|
|
614
|
+
* window produces a refusal per remaining item, each carrying its own delay; scheduling on each
|
|
615
|
+
* would be one timer per message — the flood the limiter exists to prevent, generated by the
|
|
616
|
+
* code that respects it. The largest delay is the one that is actually true for the window.
|
|
617
|
+
*/
|
|
618
|
+
onRetryAfter) {
|
|
619
|
+
const ak = this.#ak(agentId, sessionId);
|
|
620
|
+
const q = this.#awaiting.get(ak);
|
|
621
|
+
if (!q || q.length === 0)
|
|
622
|
+
return 0;
|
|
623
|
+
let parked = 0;
|
|
624
|
+
let maxRetryAfterMs = 0;
|
|
625
|
+
for (const entry of [...q]) {
|
|
626
|
+
let result;
|
|
627
|
+
try {
|
|
628
|
+
result = await parkFn(entry);
|
|
629
|
+
}
|
|
630
|
+
catch (err) {
|
|
631
|
+
result = { parked: false, error: extractErrorMessage(err) };
|
|
632
|
+
}
|
|
633
|
+
if (!result.parked) {
|
|
634
|
+
if (result.retryAfterMs !== undefined && result.retryAfterMs > 0) {
|
|
635
|
+
maxRetryAfterMs = Math.max(maxRetryAfterMs, result.retryAfterMs);
|
|
636
|
+
}
|
|
637
|
+
// `result.error` MUST be logged. Every failure branch of the park target
|
|
638
|
+
// (owning_agent_not_found, no_persisted_relay_endpoint, no_counterparty,
|
|
639
|
+
// standing_receiver_unavailable, signing_key_unavailable) is otherwise invisible — the only
|
|
640
|
+
// trace would be `parkedCount: 0`, a number with no reason. The entry is still KEPT for the
|
|
641
|
+
// next flush.
|
|
642
|
+
if (PERMANENT_PARK_FAILURES.has(result.error)) {
|
|
643
|
+
// Nothing a later boot can change, so keeping it just re-attempts it forever. ERROR, not
|
|
644
|
+
// WARN: this is the terminal loss of content the sender believes it delivered, and it is
|
|
645
|
+
// the one occurrence in this path that an operator must actually see.
|
|
646
|
+
this.#logger.error("content.park.abandoned", {
|
|
647
|
+
agentId,
|
|
648
|
+
sessionId,
|
|
649
|
+
contentHash: entry.contentHashHex,
|
|
650
|
+
error: result.error,
|
|
651
|
+
impact: "the owning agent no longer exists, so this content can never be parked or delivered; it is discarded rather than retried at every boot",
|
|
652
|
+
});
|
|
653
|
+
const gone = q.indexOf(entry);
|
|
654
|
+
if (gone !== -1)
|
|
655
|
+
q.splice(gone, 1);
|
|
656
|
+
try {
|
|
657
|
+
this.#db
|
|
658
|
+
.prepare("DELETE FROM retry_queue WHERE agent_id = ? AND session_id = ? AND content_hash_hex = ? AND awaiting_ack = 1")
|
|
659
|
+
.run(agentId, sessionId, entry.contentHashHex);
|
|
660
|
+
}
|
|
661
|
+
catch (err) {
|
|
662
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
663
|
+
agentId, sessionId, nonce: entry.contentHashHex, operation: "park_abandon_delete",
|
|
664
|
+
error: extractErrorMessage(err),
|
|
665
|
+
impact: "the unparkable row was not removed and will be re-attempted at every boot",
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
continue;
|
|
669
|
+
}
|
|
670
|
+
this.#logger.warn("content.park.failed", {
|
|
671
|
+
agentId,
|
|
672
|
+
sessionId,
|
|
673
|
+
contentHash: entry.contentHashHex,
|
|
674
|
+
error: result.error,
|
|
675
|
+
});
|
|
676
|
+
continue; // keep for next reconnect / startup flush
|
|
677
|
+
}
|
|
678
|
+
const idx = q.indexOf(entry);
|
|
679
|
+
if (idx !== -1)
|
|
680
|
+
q.splice(idx, 1);
|
|
681
|
+
try {
|
|
682
|
+
this.#db
|
|
683
|
+
.prepare("DELETE FROM retry_queue WHERE agent_id = ? AND session_id = ? AND content_hash_hex = ? AND awaiting_ack = 1")
|
|
684
|
+
.run(agentId, sessionId, entry.contentHashHex);
|
|
685
|
+
}
|
|
686
|
+
catch (err) {
|
|
687
|
+
this.#logger.error("message.retry.persist.failed", {
|
|
688
|
+
sessionId, nonce: entry.contentHashHex, error: extractErrorMessage(err),
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
parked += 1;
|
|
692
|
+
}
|
|
693
|
+
if (q.length === 0)
|
|
694
|
+
this.#awaiting.delete(ak);
|
|
695
|
+
// ONCE per pass — see the parameter's note on why this is not per item.
|
|
696
|
+
if (maxRetryAfterMs > 0)
|
|
697
|
+
onRetryAfter?.(maxRetryAfterMs);
|
|
698
|
+
return parked;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
//# sourceMappingURL=retry-queue.js.map
|