@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,452 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOD-DOC-HANDSHAKE-1 — the document handshake, daemon side (§16.3).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the attestation-consent pattern operators already understand: a proposal arrives, sits
|
|
5
|
+
* as a pending item, and is accepted or refused once. On accept both sides mint the document from
|
|
6
|
+
* the agreed starting content.
|
|
7
|
+
*
|
|
8
|
+
* ── WHY ACCEPTANCE IS COMPARE-AND-SET ─────────────────────────────────────────────────────────
|
|
9
|
+
*
|
|
10
|
+
* `UPDATE … WHERE consent_state = 'pending'`, and the row count is the answer. Read-then-write
|
|
11
|
+
* would let two concurrent accepts — an agent and a CLI, or two windows on one machine, both real
|
|
12
|
+
* on a multi-attended daemon — each see `pending`, each create the document, and each report
|
|
13
|
+
* success. Worse in the other direction: a REFUSED proposal re-read as pending would be accepted
|
|
14
|
+
* after the operator declined it, which is the one outcome consent exists to make impossible.
|
|
15
|
+
*
|
|
16
|
+
* The same reasoning applies to refuse. Both transitions are terminal and both are guarded.
|
|
17
|
+
*
|
|
18
|
+
* ── WHY THE SEAM IS CHECKED AGAIN HERE ────────────────────────────────────────────────────────
|
|
19
|
+
*
|
|
20
|
+
* `seamViolation` already ran when the proposal was recorded. It runs again at accept because the
|
|
21
|
+
* proposer and the accepter run DIFFERENT BUILDS: a peer one version ahead can propose a value
|
|
22
|
+
* this build cannot honour, and if only the proposer validated, whichever side is newer would
|
|
23
|
+
* silently decide the terms for both. Re-checking at the transition is also what makes an upgrade
|
|
24
|
+
* safe — a proposal recorded under an older build cannot be accepted under rules it predates.
|
|
25
|
+
*/
|
|
26
|
+
import { buildDocumentProposalTbs, decodeDocumentProposal, documentFeatureIncompatibility, documentIdFromProposal, encodeDocumentProposal, seamViolation, } from "@cello-protocol/protocol-types";
|
|
27
|
+
import { addColumnIfMissing } from "./column-birth.js";
|
|
28
|
+
/**
|
|
29
|
+
* NOTE FOR THE NEXT COLUMN. `CREATE TABLE IF NOT EXISTS` is correct only while no daemon has ever
|
|
30
|
+
* created this table — true today, since it is new in an unreleased milestone. The moment any dev
|
|
31
|
+
* or staging DB holds it, adding a column here returns silently and that column never appears on
|
|
32
|
+
* an upgraded database while fresh installs get it. That divergence has already shipped once in
|
|
33
|
+
* this repo (see `consent-migration.ts`). Any future column needs a `PRAGMA table_info` birth-gated
|
|
34
|
+
* ALTER under `BEGIN IMMEDIATE`, following that file.
|
|
35
|
+
*/
|
|
36
|
+
const CREATE_PROPOSALS_SQL = `
|
|
37
|
+
CREATE TABLE IF NOT EXISTS document_proposals (
|
|
38
|
+
owner_agent_id TEXT NOT NULL,
|
|
39
|
+
document_id TEXT NOT NULL,
|
|
40
|
+
proposer_agent_id TEXT NOT NULL,
|
|
41
|
+
peer_agent_id TEXT NOT NULL,
|
|
42
|
+
-- The proposal envelope as it arrived. Kept whole rather than exploded into columns, because
|
|
43
|
+
-- document_id is the hash of exactly these bytes: reconstructing them from columns would make
|
|
44
|
+
-- the identity depend on this schema's round-trip fidelity forever.
|
|
45
|
+
envelope BLOB NOT NULL,
|
|
46
|
+
consent_state TEXT NOT NULL CHECK (consent_state IN ('pending', 'accepted', 'refused')),
|
|
47
|
+
-- Why it was refused, when it was. An operator who declined a proposal weeks ago, or whose
|
|
48
|
+
-- daemon declined it on a seam violation, has no other record of which it was.
|
|
49
|
+
refusal_reason TEXT,
|
|
50
|
+
created_at INTEGER NOT NULL,
|
|
51
|
+
decided_at INTEGER,
|
|
52
|
+
PRIMARY KEY (owner_agent_id, document_id),
|
|
53
|
+
CHECK (consent_state <> 'refused' OR refusal_reason IS NOT NULL)
|
|
54
|
+
);
|
|
55
|
+
`;
|
|
56
|
+
/**
|
|
57
|
+
* COLUMN BIRTH for the peer's answer to a proposal WE authored (the `document_proposal_ack` frame).
|
|
58
|
+
*
|
|
59
|
+
* Separate from the CREATE because a daemon that already holds proposals must gain the columns
|
|
60
|
+
* without losing them. `ALTER TABLE ... ADD COLUMN` throws on a re-run, which is why each is
|
|
61
|
+
* wrapped rather than guarded by a version number nobody maintains.
|
|
62
|
+
*
|
|
63
|
+
* Distinct from `consent_state`, which is OUR decision about THEIR proposal. Overloading one column
|
|
64
|
+
* for both directions is how "we accepted" and "they accepted" become indistinguishable — and the
|
|
65
|
+
* operator surface exists precisely to tell those apart.
|
|
66
|
+
*/
|
|
67
|
+
const PEER_DECISION_COLUMNS = [
|
|
68
|
+
{ column: "peer_accepted", sql: "ALTER TABLE document_proposals ADD COLUMN peer_accepted INTEGER" },
|
|
69
|
+
{ column: "peer_reason", sql: "ALTER TABLE document_proposals ADD COLUMN peer_reason TEXT" },
|
|
70
|
+
{ column: "peer_decided_at", sql: "ALTER TABLE document_proposals ADD COLUMN peer_decided_at INTEGER" },
|
|
71
|
+
// DID OUR OFFER ACTUALLY LEAVE? Nothing durable recorded it, so `peerAccepted: null` meant both
|
|
72
|
+
// "they have not decided" and "they were never asked" — and the shipped skill told the operator
|
|
73
|
+
// to WAIT, which is wrong for the second. The only place the send outcome ever appeared was the
|
|
74
|
+
// transient response to the propose call itself.
|
|
75
|
+
{ column: "proposal_sent_at", sql: "ALTER TABLE document_proposals ADD COLUMN proposal_sent_at INTEGER" },
|
|
76
|
+
];
|
|
77
|
+
export class DocumentHandshake {
|
|
78
|
+
#db;
|
|
79
|
+
#logger;
|
|
80
|
+
#verify;
|
|
81
|
+
constructor(db, logger, verify) {
|
|
82
|
+
this.#db = db;
|
|
83
|
+
this.#logger = logger;
|
|
84
|
+
this.#verify = verify;
|
|
85
|
+
this.#db.exec(CREATE_PROPOSALS_SQL);
|
|
86
|
+
for (const { column, sql } of PEER_DECISION_COLUMNS) {
|
|
87
|
+
addColumnIfMissing(this.#db, this.#logger, { table: "document_proposals", column, sql });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Record an arriving proposal as PENDING, or refuse it outright.
|
|
92
|
+
*
|
|
93
|
+
* A seam violation or a version mismatch is recorded as `refused` with its reason rather than
|
|
94
|
+
* dropped, so the operator can see that a peer tried and why it could not proceed. A dropped
|
|
95
|
+
* proposal is indistinguishable from a peer that never sent one.
|
|
96
|
+
*/
|
|
97
|
+
recordProposal(ownerAgentId, wire, nowMs) {
|
|
98
|
+
const envelope = decodeDocumentProposal(wire);
|
|
99
|
+
const documentId = documentIdFromProposal(envelope);
|
|
100
|
+
// AUTHENTICITY FIRST, and it is fatal rather than a recorded refusal. The operator's consent
|
|
101
|
+
// decision rests entirely on the proposal having come from the agent it names, and an
|
|
102
|
+
// unverified proposal must not reach the inbox at all — `ON CONFLICT DO NOTHING` means the
|
|
103
|
+
// FIRST arrival's bytes are the permanent record for a document_id, so anyone who observed the
|
|
104
|
+
// honest proposal (and therefore knows the nonce) could race a byte-variant carrying junk,
|
|
105
|
+
// win the primary key, and permanently poison the id while the honest proposal is silently
|
|
106
|
+
// discarded. The proposer would have to re-propose under a new nonce with no signal why.
|
|
107
|
+
if (!this.#verify(envelope.proposer_agent_id, buildDocumentProposalTbs(envelope), envelope.signature)) {
|
|
108
|
+
this.#logger.error("document.proposal.signature_invalid", {
|
|
109
|
+
documentId,
|
|
110
|
+
proposerAgentId: envelope.proposer_agent_id,
|
|
111
|
+
});
|
|
112
|
+
throw new Error(`document_proposal_signature_invalid: the proposal claims to come from ` +
|
|
113
|
+
`${envelope.proposer_agent_id} but its signature does not verify against that agent`);
|
|
114
|
+
}
|
|
115
|
+
// ADDRESSED TO US. `ownerAgentId` comes from the caller and `peer_agent_id` comes from the
|
|
116
|
+
// wire, and on a multi-agent daemon — which is why owner_agent_id is in the key at all — an
|
|
117
|
+
// unchecked pair lets a proposal addressed to agent Z be recorded under agent Y and accepted
|
|
118
|
+
// BY agent Y. Consent would then be taken from a party the proposal never named, while the
|
|
119
|
+
// document_id (which does commit to peer_agent_id) says otherwise, with no error anywhere.
|
|
120
|
+
if (envelope.peer_agent_id !== ownerAgentId) {
|
|
121
|
+
this.#logger.warn("document.proposal.wrong_peer", {
|
|
122
|
+
documentId,
|
|
123
|
+
addressedTo: envelope.peer_agent_id,
|
|
124
|
+
recordedFor: ownerAgentId,
|
|
125
|
+
});
|
|
126
|
+
throw new Error(`document_proposal_wrong_peer: this proposal is addressed to ${envelope.peer_agent_id}, ` +
|
|
127
|
+
`not to ${ownerAgentId} — consent belongs to the agent the proposer named`);
|
|
128
|
+
}
|
|
129
|
+
// The HUMAN answer, not a machine label. The clause exists because the alternative to a
|
|
130
|
+
// sentence is a proposal that is never answered, which surfaces as a hang and gets diagnosed
|
|
131
|
+
// as a network fault — and because "upgrade" is useless without saying WHOSE client.
|
|
132
|
+
const incompatible = documentFeatureIncompatibility(envelope.feature_version);
|
|
133
|
+
const reason = incompatible ?? seamViolation(envelope.properties);
|
|
134
|
+
this.#db
|
|
135
|
+
.prepare(`INSERT INTO document_proposals
|
|
136
|
+
(owner_agent_id, document_id, proposer_agent_id, peer_agent_id, envelope,
|
|
137
|
+
consent_state, refusal_reason, created_at, decided_at)
|
|
138
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
139
|
+
ON CONFLICT (owner_agent_id, document_id) DO NOTHING`)
|
|
140
|
+
.run(ownerAgentId, documentId, envelope.proposer_agent_id, envelope.peer_agent_id, Buffer.from(encodeDocumentProposal(envelope)), reason ? "refused" : "pending", reason, nowMs, reason ? nowMs : null);
|
|
141
|
+
// READ BACK THE ROW, do not report what we intended. On a redelivery the INSERT does nothing —
|
|
142
|
+
// correct — and returning the state we would have written announces a decision the operator
|
|
143
|
+
// already made as still awaiting one, and logs an arrival that did not happen.
|
|
144
|
+
const stored = this.get(ownerAgentId, documentId);
|
|
145
|
+
const state = stored?.consentState ?? (reason ? "refused" : "pending");
|
|
146
|
+
const storedReason = stored?.refusalReason ?? reason ?? undefined;
|
|
147
|
+
if (state === "refused") {
|
|
148
|
+
this.#logger.warn("document.proposal.refused", {
|
|
149
|
+
documentId,
|
|
150
|
+
reason: storedReason,
|
|
151
|
+
autoRefused: true,
|
|
152
|
+
});
|
|
153
|
+
return { documentId, state, reason: storedReason };
|
|
154
|
+
}
|
|
155
|
+
if (state === "pending") {
|
|
156
|
+
// `document.proposal.received` per the DoD taxonomy — this fires when a proposal ARRIVES.
|
|
157
|
+
this.#logger.info("document.proposal.received", {
|
|
158
|
+
documentId,
|
|
159
|
+
proposerAgentId: envelope.proposer_agent_id,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
return { documentId, state, ...(storedReason ? { reason: storedReason } : {}) };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Record a proposal WE authored, so it can be re-sent without minting a new one.
|
|
166
|
+
*
|
|
167
|
+
* The proposer had no record of the envelope it sent. That is fine until the send fails — an
|
|
168
|
+
* offline peer is the ordinary case — and then the document exists locally with no way to reach
|
|
169
|
+
* the counterparty: re-proposing mints a fresh nonce, hence a fresh `document_id`, hence a second
|
|
170
|
+
* document, leaving the first as an orphan the operator cannot explain or clear.
|
|
171
|
+
*
|
|
172
|
+
* Stored `accepted`, because we consented by authoring it — so it never appears in our own inbox
|
|
173
|
+
* (`pending` filters on state), which would be an offer to ourselves.
|
|
174
|
+
*
|
|
175
|
+
* Deliberately NOT routed through `recordProposal`: that path's checks are for a proposal
|
|
176
|
+
* ARRIVING — verify the signature against the named proposer, and refuse one not addressed to us.
|
|
177
|
+
* Ours is addressed to the peer by definition, so reusing that path would require weakening the
|
|
178
|
+
* check that stops a proposal being recorded under an agent it never named.
|
|
179
|
+
*/
|
|
180
|
+
/**
|
|
181
|
+
* M14B / DOD-MP-JOIN-1 — record the genesis of a document this agent JOINED.
|
|
182
|
+
*
|
|
183
|
+
* The joiner is neither the proposer nor the named peer, so both existing paths refuse this
|
|
184
|
+
* envelope by design (`recordProposal` demands we are the addressee; `recordOutgoing` claims
|
|
185
|
+
* authorship). Stored `accepted` because the joiner's consent is their signed join answer —
|
|
186
|
+
* and stored at all because `LiveDocuments` reads `starting_content` from this table: without
|
|
187
|
+
* the row, a joined document rebuilds from an empty epoch zero and silently diverges from
|
|
188
|
+
* every other holder.
|
|
189
|
+
*
|
|
190
|
+
* The caller passes the RECEIVED genesis bytes; they are stored verbatim, not re-encoded.
|
|
191
|
+
*/
|
|
192
|
+
recordJoined(ownerAgentId, receivedGenesis, nowMs) {
|
|
193
|
+
const envelope = decodeDocumentProposal(receivedGenesis);
|
|
194
|
+
const documentId = documentIdFromProposal(envelope);
|
|
195
|
+
this.#db
|
|
196
|
+
.prepare(`INSERT INTO document_proposals
|
|
197
|
+
(owner_agent_id, document_id, proposer_agent_id, peer_agent_id, envelope,
|
|
198
|
+
consent_state, refusal_reason, created_at, decided_at)
|
|
199
|
+
VALUES (?, ?, ?, ?, ?, 'accepted', NULL, ?, ?)
|
|
200
|
+
ON CONFLICT (owner_agent_id, document_id) DO NOTHING`)
|
|
201
|
+
.run(ownerAgentId, documentId, envelope.proposer_agent_id, envelope.peer_agent_id, Buffer.from(receivedGenesis), nowMs, nowMs);
|
|
202
|
+
return documentId;
|
|
203
|
+
}
|
|
204
|
+
recordOutgoing(ownerAgentId, envelope, nowMs) {
|
|
205
|
+
const documentId = documentIdFromProposal(envelope);
|
|
206
|
+
this.#db
|
|
207
|
+
.prepare(`INSERT INTO document_proposals
|
|
208
|
+
(owner_agent_id, document_id, proposer_agent_id, peer_agent_id, envelope,
|
|
209
|
+
consent_state, refusal_reason, created_at, decided_at)
|
|
210
|
+
VALUES (?, ?, ?, ?, ?, 'accepted', NULL, ?, ?)
|
|
211
|
+
ON CONFLICT (owner_agent_id, document_id) DO NOTHING`)
|
|
212
|
+
.run(ownerAgentId, documentId, envelope.proposer_agent_id, envelope.peer_agent_id, Buffer.from(encodeDocumentProposal(envelope)), nowMs, nowMs);
|
|
213
|
+
return documentId;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Record the PEER's answer to a proposal we authored.
|
|
217
|
+
*
|
|
218
|
+
* The caller verifies the signature first — this only stores. Kept as its own method rather than
|
|
219
|
+
* folded into `accept`/`refuse` because those are OUR decision about THEIR proposal, and this is
|
|
220
|
+
* the mirror: their decision about ours. Collapsing them would put a peer-controlled reason
|
|
221
|
+
* through a path whose refusal text is written by the local operator.
|
|
222
|
+
*
|
|
223
|
+
* SETTLE ONCE. A second, contradicting answer is refused rather than applied: a peer that
|
|
224
|
+
* accepted must not be able to later claim it refused, or the proposer tears down a document the
|
|
225
|
+
* peer is still editing.
|
|
226
|
+
*/
|
|
227
|
+
recordPeerDecision(ownerAgentId, documentId,
|
|
228
|
+
/**
|
|
229
|
+
* WHO IS ANSWERING. Required, and checked against the proposal's own peer.
|
|
230
|
+
*
|
|
231
|
+
* The caller verifies the ack's signature against the agent the frame NAMES, which proves the
|
|
232
|
+
* frame is authentic and says nothing about whether that agent was ever entitled to answer. Any
|
|
233
|
+
* third party with a session to us could sign a well-formed ack for a document we proposed to
|
|
234
|
+
* someone else, and it landed as that someone's decision — reported to the operator as "they
|
|
235
|
+
* said no" for a peer who never saw it. Worse, settle-once is by VALUE, so the real peer's
|
|
236
|
+
* later genuine answer contradicts and is discarded: the poisoned state is permanent.
|
|
237
|
+
*
|
|
238
|
+
* Verified is not authorized. The old control path had
|
|
239
|
+
* carried this check from the start; the ack path was written without it.
|
|
240
|
+
*/
|
|
241
|
+
ackerAgentId, decision) {
|
|
242
|
+
const record = this.get(ownerAgentId, documentId);
|
|
243
|
+
if (!record) {
|
|
244
|
+
return {
|
|
245
|
+
ok: false,
|
|
246
|
+
reason: "document_proposal_unknown",
|
|
247
|
+
detail: `no proposal ${documentId.slice(0, 16)}… authored by this agent`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
if (ackerAgentId !== record.peerAgentId) {
|
|
251
|
+
this.#logger.warn("document.proposal.ack_not_peer", {
|
|
252
|
+
documentId,
|
|
253
|
+
claimedBy: ackerAgentId,
|
|
254
|
+
peerAgentId: record.peerAgentId,
|
|
255
|
+
});
|
|
256
|
+
return {
|
|
257
|
+
ok: false,
|
|
258
|
+
reason: "document_proposal_ack_not_peer",
|
|
259
|
+
detail: `${ackerAgentId} is not the party this proposal was addressed to (${record.peerAgentId}), ` +
|
|
260
|
+
`so their answer is not the decision it asks for`,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
if (record.proposerAgentId !== ownerAgentId) {
|
|
264
|
+
// Their answer to their OWN proposal is not a thing. Recording it would overwrite this
|
|
265
|
+
// operator's consent decision with the counterparty's assertion about it.
|
|
266
|
+
return {
|
|
267
|
+
ok: false,
|
|
268
|
+
reason: "document_proposal_not_ours",
|
|
269
|
+
detail: `proposal ${documentId.slice(0, 16)}… was authored by the peer, not by this agent`,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
const already = this.#peerDecision(ownerAgentId, documentId);
|
|
273
|
+
if (already !== null) {
|
|
274
|
+
if (already === decision.accepted)
|
|
275
|
+
return { ok: true };
|
|
276
|
+
return {
|
|
277
|
+
ok: false,
|
|
278
|
+
reason: "document_proposal_ack_contradicts",
|
|
279
|
+
detail: `the peer already answered this proposal with ${already ? "accepted" : "refused"} and now ` +
|
|
280
|
+
`says ${decision.accepted ? "accepted" : "refused"} — a decision is made once, and both ` +
|
|
281
|
+
`signatures are retained`,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
this.#db
|
|
285
|
+
.prepare(`UPDATE document_proposals SET peer_accepted = ?, peer_reason = ?, peer_decided_at = ?
|
|
286
|
+
WHERE owner_agent_id = ? AND document_id = ?`)
|
|
287
|
+
.run(decision.accepted ? 1 : 0, decision.reason ?? null, decision.decidedAtMs, ownerAgentId, documentId);
|
|
288
|
+
this.#logger.info("document.proposal.answered", {
|
|
289
|
+
documentId,
|
|
290
|
+
accepted: decision.accepted,
|
|
291
|
+
reason: decision.reason,
|
|
292
|
+
});
|
|
293
|
+
return { ok: true };
|
|
294
|
+
}
|
|
295
|
+
/** The peer's answer to a proposal we authored: true accepted, false refused, null unanswered. */
|
|
296
|
+
peerDecision(ownerAgentId, documentId) {
|
|
297
|
+
return this.#peerDecision(ownerAgentId, documentId);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* The peer's answer AND the words they sent with it.
|
|
301
|
+
*
|
|
302
|
+
* The reason was stored and never read by anything — write-only, which defeats the entire
|
|
303
|
+
* justification for putting it on the wire and making it mandatory there: "a refusal the proposer
|
|
304
|
+
* cannot see a reason for leaves them unable to propose anything better". Enforced at the
|
|
305
|
+
* signature, discarded at the last hop.
|
|
306
|
+
*/
|
|
307
|
+
peerAnswer(ownerAgentId, documentId) {
|
|
308
|
+
const row = this.#db
|
|
309
|
+
.prepare("SELECT peer_accepted, peer_reason FROM document_proposals WHERE owner_agent_id = ? AND document_id = ?")
|
|
310
|
+
.get(ownerAgentId, documentId);
|
|
311
|
+
if (!row || row.peer_accepted === null)
|
|
312
|
+
return { accepted: null, reason: null };
|
|
313
|
+
return { accepted: row.peer_accepted === 1, reason: row.peer_reason ?? null };
|
|
314
|
+
}
|
|
315
|
+
#peerDecision(ownerAgentId, documentId) {
|
|
316
|
+
const row = this.#db
|
|
317
|
+
.prepare("SELECT peer_accepted FROM document_proposals WHERE owner_agent_id = ? AND document_id = ?")
|
|
318
|
+
.get(ownerAgentId, documentId);
|
|
319
|
+
return row?.peer_accepted === null || row?.peer_accepted === undefined ? null : row.peer_accepted === 1;
|
|
320
|
+
}
|
|
321
|
+
/** Proposals still awaiting a decision — the operator's inbox for documents. */
|
|
322
|
+
pending(ownerAgentId) {
|
|
323
|
+
return this.#rows(ownerAgentId, "WHERE owner_agent_id = ? AND consent_state = 'pending'", []);
|
|
324
|
+
}
|
|
325
|
+
get(ownerAgentId, documentId) {
|
|
326
|
+
const rows = this.#rows(ownerAgentId, "WHERE owner_agent_id = ? AND document_id = ?", [documentId]);
|
|
327
|
+
return rows[0] ?? null;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Accept a pending proposal. Compare-and-set: the transition happens iff the row was still
|
|
331
|
+
* pending, and the affected-row count is what says so.
|
|
332
|
+
*/
|
|
333
|
+
accept(ownerAgentId, documentId, nowMs) {
|
|
334
|
+
const record = this.get(ownerAgentId, documentId);
|
|
335
|
+
if (!record) {
|
|
336
|
+
return {
|
|
337
|
+
ok: false,
|
|
338
|
+
reason: "document_proposal_unknown",
|
|
339
|
+
detail: `no proposal ${documentId.slice(0, 16)}… for this agent`,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
// Re-checked at the transition, not merely at arrival — the proposer runs a different build.
|
|
343
|
+
const violation = seamViolation(record.envelope.properties);
|
|
344
|
+
if (violation) {
|
|
345
|
+
// TRANSITION, do not just refuse the call. Leaving the row pending gives the operator an
|
|
346
|
+
// inbox entry they can never clear, carrying no reason — while the arrival path records one
|
|
347
|
+
// for the identical condition. Two behaviours for one fact, and the one that persists is the
|
|
348
|
+
// one with no explanation attached.
|
|
349
|
+
if (record.consentState === "pending") {
|
|
350
|
+
this.#db
|
|
351
|
+
.prepare(`UPDATE document_proposals SET consent_state = 'refused', refusal_reason = ?,
|
|
352
|
+
decided_at = ?
|
|
353
|
+
WHERE owner_agent_id = ? AND document_id = ? AND consent_state = 'pending'`)
|
|
354
|
+
.run(violation, nowMs, ownerAgentId, documentId);
|
|
355
|
+
this.#logger.warn("document.proposal.refused", {
|
|
356
|
+
documentId,
|
|
357
|
+
reason: violation,
|
|
358
|
+
autoRefused: true,
|
|
359
|
+
at: "accept",
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
return { ok: false, reason: "document_seam_violation", detail: violation };
|
|
363
|
+
}
|
|
364
|
+
const info = this.#db
|
|
365
|
+
.prepare(`UPDATE document_proposals SET consent_state = 'accepted', decided_at = ?
|
|
366
|
+
WHERE owner_agent_id = ? AND document_id = ? AND consent_state = 'pending'`)
|
|
367
|
+
.run(nowMs, ownerAgentId, documentId);
|
|
368
|
+
if (Number(info.changes) === 0) {
|
|
369
|
+
// The row exists but was not pending. Naming the state it IS in is the whole value of the
|
|
370
|
+
// message: "already accepted" and "you refused this" are different facts to an operator, and
|
|
371
|
+
// a generic failure would read as a bug in the handshake.
|
|
372
|
+
const now = this.get(ownerAgentId, documentId);
|
|
373
|
+
return {
|
|
374
|
+
ok: false,
|
|
375
|
+
reason: "document_proposal_not_pending",
|
|
376
|
+
detail: `proposal ${documentId.slice(0, 16)}… is ${now?.consentState ?? "gone"}` +
|
|
377
|
+
(now?.refusalReason ? ` (${now.refusalReason})` : "") +
|
|
378
|
+
" — a consent decision is made once",
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
this.#logger.info("document.proposal.accepted", { documentId });
|
|
382
|
+
return { ok: true, documentId, envelope: record.envelope };
|
|
383
|
+
}
|
|
384
|
+
/** Refuse a pending proposal. Same compare-and-set guard; a reason is mandatory. */
|
|
385
|
+
refuse(ownerAgentId, documentId, reason, nowMs) {
|
|
386
|
+
if (reason.trim().length === 0) {
|
|
387
|
+
// The column's CHECK enforces this too. Refused here so the caller gets a usable error
|
|
388
|
+
// rather than a constraint violation naming a column.
|
|
389
|
+
throw new Error("document_refusal_reason_required: a refusal must say why");
|
|
390
|
+
}
|
|
391
|
+
const info = this.#db
|
|
392
|
+
.prepare(`UPDATE document_proposals SET consent_state = 'refused', refusal_reason = ?, decided_at = ?
|
|
393
|
+
WHERE owner_agent_id = ? AND document_id = ? AND consent_state = 'pending'`)
|
|
394
|
+
.run(reason, nowMs, ownerAgentId, documentId);
|
|
395
|
+
if (Number(info.changes) === 0) {
|
|
396
|
+
const now = this.get(ownerAgentId, documentId);
|
|
397
|
+
// A PROPOSAL THAT DOES NOT EXIST IS NOT ONE THAT WAS ALREADY DECIDED. `accept` checks for the
|
|
398
|
+
// row first and answers `document_proposal_unknown`; this went straight to the UPDATE, found
|
|
399
|
+
// zero changes, and reported a typo'd id as "is unknown — a consent decision is made once".
|
|
400
|
+
// That asserts a decision was recorded, about a proposal nobody ever made, and sends the
|
|
401
|
+
// operator looking for who made it.
|
|
402
|
+
if (!now) {
|
|
403
|
+
return {
|
|
404
|
+
ok: false,
|
|
405
|
+
reason: "document_proposal_unknown",
|
|
406
|
+
detail: `no proposal ${documentId.slice(0, 16)}… for this agent — check the id against ` +
|
|
407
|
+
`cello_doc_inbox`,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
return {
|
|
411
|
+
ok: false,
|
|
412
|
+
reason: "document_proposal_not_pending",
|
|
413
|
+
detail: `proposal ${documentId.slice(0, 16)}… is ${now.consentState} — a consent decision is made once`,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
this.#logger.info("document.proposal.refused", { documentId, reason, autoRefused: false });
|
|
417
|
+
return { ok: true };
|
|
418
|
+
}
|
|
419
|
+
/** Record that OUR proposal for this document actually left the machine. */
|
|
420
|
+
markProposalSent(ownerAgentId, documentId, nowMs) {
|
|
421
|
+
this.#db
|
|
422
|
+
.prepare(`UPDATE document_proposals SET proposal_sent_at = ?
|
|
423
|
+
WHERE owner_agent_id = ? AND document_id = ? AND proposal_sent_at IS NULL`)
|
|
424
|
+
.run(nowMs, ownerAgentId, documentId);
|
|
425
|
+
}
|
|
426
|
+
/** Has our proposal for this document left? False also covers "we never authored one". */
|
|
427
|
+
proposalSent(ownerAgentId, documentId) {
|
|
428
|
+
const row = this.#db
|
|
429
|
+
.prepare(`SELECT proposal_sent_at FROM document_proposals
|
|
430
|
+
WHERE owner_agent_id = ? AND document_id = ? AND proposal_sent_at IS NOT NULL LIMIT 1`)
|
|
431
|
+
.get(ownerAgentId, documentId);
|
|
432
|
+
return row !== undefined;
|
|
433
|
+
}
|
|
434
|
+
#rows(ownerAgentId, where, extra) {
|
|
435
|
+
const rows = this.#db
|
|
436
|
+
.prepare(`SELECT * FROM document_proposals ${where} ORDER BY created_at ASC, rowid ASC`)
|
|
437
|
+
.all(ownerAgentId, ...extra);
|
|
438
|
+
return rows.map((r) => ({
|
|
439
|
+
documentId: r["document_id"],
|
|
440
|
+
proposerAgentId: r["proposer_agent_id"],
|
|
441
|
+
peerAgentId: r["peer_agent_id"],
|
|
442
|
+
envelope: decodeDocumentProposal(new Uint8Array(r["envelope"])),
|
|
443
|
+
consentState: r["consent_state"],
|
|
444
|
+
refusalReason: r["refusal_reason"] ?? undefined,
|
|
445
|
+
peerAccepted: r["peer_accepted"] == null ? null : r["peer_accepted"] === 1,
|
|
446
|
+
peerReason: r["peer_reason"] ?? undefined,
|
|
447
|
+
createdAtMs: r["created_at"],
|
|
448
|
+
decidedAtMs: r["decided_at"] ?? undefined,
|
|
449
|
+
}));
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=document-handshake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-handshake.js","sourceRoot":"","sources":["../src/document-handshake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOD-DOC-INBOUND-1 — the receiving half (§3.2, §14, §16.4).
|
|
3
|
+
*
|
|
4
|
+
* Every P2 unit built a piece of this. ENVELOPE-1 decodes and checks the chain link, GATE-1
|
|
5
|
+
* decides, REJECT-1 records a refusal and quarantines the bytes, ENGINE-1 applies. Nothing owned
|
|
6
|
+
* assembling them, and assembling them is not clerical work — **the order is the security
|
|
7
|
+
* property**. A check performed after admission is a check that did not protect anything.
|
|
8
|
+
*
|
|
9
|
+
* The order, and what each step is protecting:
|
|
10
|
+
*
|
|
11
|
+
* 1. DECODE — refuse malformed input before any of it is interpreted.
|
|
12
|
+
* 2. VERIFY the signature — FIRST, because everything after it is either a judgement about a
|
|
13
|
+
* party or an ANSWER to one. It needs nothing but the envelope: the agent
|
|
14
|
+
* id is the Ed25519 public key (M14-D5). It ran at step 4 until a live
|
|
15
|
+
* defect forced it earlier — see `terminal` on InboundResult. An
|
|
16
|
+
* unverified envelope is also not REJECTED: a rejection is a protocol act
|
|
17
|
+
* that presumes an authenticated counterparty, and writing a 0x05 leaf
|
|
18
|
+
* naming an unauthenticated sender puts their claim in our permanent log.
|
|
19
|
+
* 3. KNOW the document — an envelope for a document we do not hold has no context to judge it in.
|
|
20
|
+
* TERMINAL: we will never hold it, so the sender is told and stops.
|
|
21
|
+
* 4. SENDER is the peer — a document is a pairwise agreement; a third party's envelope does not
|
|
22
|
+
* belong here at all, and is not a rejection case (there is no
|
|
23
|
+
* collaboration to supersede). Refused SILENTLY — see `terminal`.
|
|
24
|
+
* 5. CHAIN link — a redelivery is benign and must still ACK (delivery retries by design, and
|
|
25
|
+
* a redelivery that goes unacked never lets the sender settle it); a gap
|
|
26
|
+
* or a fork refuses.
|
|
27
|
+
* 6. GATE — the §3.2 validation, against a TRIAL copy so a refusal cannot have landed.
|
|
28
|
+
* 7. ADMIT or REJECT — and either way, ANSWER. A rejection is an ack for delivery purposes: the
|
|
29
|
+
* peer has decided, so the sender must stop retrying and supersede.
|
|
30
|
+
*/
|
|
31
|
+
import * as Y from "yjs";
|
|
32
|
+
import type { DocumentStore } from "./document-store.js";
|
|
33
|
+
import type { DocumentEngine } from "./document-engine.js";
|
|
34
|
+
import type { DocumentGate } from "./document-gate.js";
|
|
35
|
+
import type { DocumentRejections } from "./document-rejection.js";
|
|
36
|
+
import type { Logger } from "./types.js";
|
|
37
|
+
export type InboundResult = {
|
|
38
|
+
ok: true;
|
|
39
|
+
admitted: true;
|
|
40
|
+
envelopeHash: string;
|
|
41
|
+
duplicate: boolean;
|
|
42
|
+
} | {
|
|
43
|
+
ok: true;
|
|
44
|
+
admitted: false;
|
|
45
|
+
envelopeHash: string;
|
|
46
|
+
rejectionReason: string;
|
|
47
|
+
duplicate: false;
|
|
48
|
+
/** The signed `document_rejection` to put on the wire. Absent when this refusal is a repeat. */
|
|
49
|
+
rejectionWire?: Uint8Array;
|
|
50
|
+
} | {
|
|
51
|
+
ok: false;
|
|
52
|
+
reason: string;
|
|
53
|
+
detail: string;
|
|
54
|
+
terminal?: undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A TERMINAL refusal — redelivering this envelope can never change the answer, and the sender was
|
|
58
|
+
* AUTHENTICATED, so their delivery is settled with a rejection ack rather than left outstanding.
|
|
59
|
+
* The plain refusal above means "stay silent and let them retry".
|
|
60
|
+
*
|
|
61
|
+
* Both conditions are load-bearing. Without terminal, a peer who refused the proposal is
|
|
62
|
+
* redelivered to indefinitely (found live: 74 sends). Without authentication, the ack answers
|
|
63
|
+
* whoever reached the channel rather than a known party.
|
|
64
|
+
*
|
|
65
|
+
* `terminal` AND `envelopeHash` are ONE variant, not two optional fields, because the router can
|
|
66
|
+
* only act when it has both — and with them independent, setting `terminal` while forgetting the
|
|
67
|
+
* hash produced no ack, no log line, and silently reinstated the defect this unit closed. A type
|
|
68
|
+
* that can express the broken state eventually will.
|
|
69
|
+
*/
|
|
70
|
+
| {
|
|
71
|
+
ok: false;
|
|
72
|
+
reason: string;
|
|
73
|
+
detail: string;
|
|
74
|
+
terminal: true;
|
|
75
|
+
envelopeHash: string;
|
|
76
|
+
};
|
|
77
|
+
export interface DocumentInboundDeps {
|
|
78
|
+
store: DocumentStore;
|
|
79
|
+
/**
|
|
80
|
+
* DOD-DOC-SCREEN-CONTENT-1 — screen the PROJECTED TEXT, at the shadow.
|
|
81
|
+
*
|
|
82
|
+
* The gate already applies the update to an inert shadow copy and computes the readable
|
|
83
|
+
* before/after text. Until this seam existed, the only rule reading that text was a character
|
|
84
|
+
* denylist, while the layer that judges MEANING sat at the wire — where a document frame is a
|
|
85
|
+
* signed binary envelope and the text screener was decoding it as UTF-8 and judging mojibake.
|
|
86
|
+
*
|
|
87
|
+
* Optional because it is Layer 2 and Layer 2 degrades by design (no model → no verdict → admit).
|
|
88
|
+
* It returns BLOCK or nothing: a `redact` verdict cannot be honoured on a CRDT replica, so a
|
|
89
|
+
* rewrite-worthy finding either refuses or is carried as evidence — there is no third outcome,
|
|
90
|
+
* which is the contract this whole path is built on.
|
|
91
|
+
*/
|
|
92
|
+
screenProjected?: (text: string, ctx: {
|
|
93
|
+
ownerAgentId: string;
|
|
94
|
+
documentId: string;
|
|
95
|
+
senderAgentId: string;
|
|
96
|
+
correlationId?: string;
|
|
97
|
+
}) => Promise<{
|
|
98
|
+
block: boolean;
|
|
99
|
+
reason?: string;
|
|
100
|
+
}>;
|
|
101
|
+
engine: DocumentEngine;
|
|
102
|
+
gate: DocumentGate;
|
|
103
|
+
rejections: DocumentRejections;
|
|
104
|
+
logger: Logger;
|
|
105
|
+
/**
|
|
106
|
+
* Verify the envelope signature against `sender_agent_id`. INJECTED and REQUIRED — this module
|
|
107
|
+
* cannot resolve an agent id to a public key, and a default would be a default answer to "is this
|
|
108
|
+
* authentic", which is the one question that must never have one.
|
|
109
|
+
*/
|
|
110
|
+
verifySignature(senderAgentId: string, tbs: Uint8Array, signature: Uint8Array): boolean;
|
|
111
|
+
/** The live document to apply admitted updates to. */
|
|
112
|
+
liveDocFor(ownerAgentId: string, documentId: string): Y.Doc;
|
|
113
|
+
/** SYNC-D8 — the ONE fold-derived standing (R17 + removed/unknown); the walk is deleted. */
|
|
114
|
+
standingOf(ownerAgentId: string, documentId: string, agentId: string): "participant" | "invited" | "removed" | "stranger" | "unknown";
|
|
115
|
+
/**
|
|
116
|
+
* DOD-MP-INBOUND-N-1 — the CURRENT derived holders, or null when the chain does not derive.
|
|
117
|
+
* When it derives, membership is the WHOLE sender gate — the genesis-peer column is a
|
|
118
|
+
* bilateral-legacy fallback, never a permanent credential (the same rule the ack gate
|
|
119
|
+
* learned in FANOUT-1's review).
|
|
120
|
+
*/
|
|
121
|
+
currentHolders(ownerAgentId: string, documentId: string): string[] | null;
|
|
122
|
+
/**
|
|
123
|
+
* SYNC-G1 — the derived state AT the envelope's signed governance frontier (R20's input).
|
|
124
|
+
* `missing` names ancestors not yet held: the caller answers NON-terminally and the exchange
|
|
125
|
+
* delivers governance first.
|
|
126
|
+
*/
|
|
127
|
+
deriveAtFrontier(ownerAgentId: string, documentId: string, frontier: readonly string[]): {
|
|
128
|
+
ok: true;
|
|
129
|
+
participants: ReadonlySet<string>;
|
|
130
|
+
invited: ReadonlySet<string>;
|
|
131
|
+
/** R30: content whose named world is already ENDED is refused everywhere. */
|
|
132
|
+
ended: "closed" | "killed" | null;
|
|
133
|
+
} | {
|
|
134
|
+
ok: false;
|
|
135
|
+
reason: string;
|
|
136
|
+
missing?: string[];
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Sign as the OWNING agent, over the rejection's canonical preimage (DOD-DOC-REJECT-2).
|
|
140
|
+
*
|
|
141
|
+
* Takes the agent so it cannot sign with the wrong key. ASYNC, and that is what makes `receive`
|
|
142
|
+
* async: signing goes through a key provider, and REJECT-1 requires a real signature rather than
|
|
143
|
+
* a placeholder.
|
|
144
|
+
*/
|
|
145
|
+
sign(ownerAgentId: string, tbs: Uint8Array): Promise<Uint8Array>;
|
|
146
|
+
}
|
|
147
|
+
export declare class DocumentInbound {
|
|
148
|
+
#private;
|
|
149
|
+
constructor(deps: DocumentInboundDeps);
|
|
150
|
+
/**
|
|
151
|
+
* ASYNC because a gate refusal must SIGN a `0x05` leaf, and signing goes through an async key
|
|
152
|
+
* provider. REJECT-1 refuses to fabricate a signature — an all-zero placeholder in an immutable
|
|
153
|
+
* log is indistinguishable from a real one that fails to verify — so the async is real, not
|
|
154
|
+
* incidental.
|
|
155
|
+
*
|
|
156
|
+
* The session content path still decides the LEAF KIND synchronously; `DocumentFrameRouter`
|
|
157
|
+
* splits the two, and serializes the handling per owner so an envelope's predecessor is always
|
|
158
|
+
* stored before its successor is checked.
|
|
159
|
+
*/
|
|
160
|
+
receive(ownerAgentId: string, wire: Uint8Array, nowMs: number, correlationId?: string): Promise<InboundResult>;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=document-inbound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-inbound.d.ts","sourceRoot":"","sources":["../src/document-inbound.ts"],"names":[],"mappings":"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"}
|