@cello-protocol/daemon 0.0.131 → 0.0.133
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/content-park.d.ts.map +1 -1
- package/dist/content-park.js +29 -11
- package/dist/content-park.js.map +1 -1
- package/dist/daemon.d.ts +11 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +398 -18
- package/dist/daemon.js.map +1 -1
- package/dist/document-ack-inbound.d.ts +57 -0
- package/dist/document-ack-inbound.d.ts.map +1 -0
- package/dist/document-ack-inbound.js +174 -0
- package/dist/document-ack-inbound.js.map +1 -0
- package/dist/document-control-notifier.d.ts +61 -0
- package/dist/document-control-notifier.d.ts.map +1 -0
- package/dist/document-control-notifier.js +70 -0
- package/dist/document-control-notifier.js.map +1 -0
- package/dist/document-delivery-transport.d.ts +94 -0
- package/dist/document-delivery-transport.d.ts.map +1 -0
- package/dist/document-delivery-transport.js +179 -0
- package/dist/document-delivery-transport.js.map +1 -0
- package/dist/document-delivery.d.ts +181 -0
- package/dist/document-delivery.d.ts.map +1 -0
- package/dist/document-delivery.js +289 -0
- package/dist/document-delivery.js.map +1 -0
- package/dist/document-frame-router.d.ts +210 -0
- package/dist/document-frame-router.d.ts.map +1 -0
- package/dist/document-frame-router.js +396 -0
- package/dist/document-frame-router.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 +657 -0
- package/dist/document-handlers.js.map +1 -0
- package/dist/document-handshake.d.ts +156 -0
- package/dist/document-handshake.d.ts.map +1 -0
- package/dist/document-handshake.js +398 -0
- package/dist/document-handshake.js.map +1 -0
- package/dist/document-inbound.d.ts +91 -0
- package/dist/document-inbound.d.ts.map +1 -0
- package/dist/document-inbound.js +290 -0
- package/dist/document-inbound.js.map +1 -0
- package/dist/document-layer.d.ts +137 -0
- package/dist/document-layer.d.ts.map +1 -0
- package/dist/document-layer.js +255 -0
- package/dist/document-layer.js.map +1 -0
- package/dist/document-lifecycle.d.ts +125 -0
- package/dist/document-lifecycle.d.ts.map +1 -0
- package/dist/document-lifecycle.js +433 -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 +173 -0
- package/dist/document-notify.d.ts.map +1 -0
- package/dist/document-notify.js +438 -0
- package/dist/document-notify.js.map +1 -0
- package/dist/document-publish.d.ts +67 -0
- package/dist/document-publish.d.ts.map +1 -0
- package/dist/document-publish.js +149 -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-rejection.d.ts +240 -0
- package/dist/document-rejection.d.ts.map +1 -0
- package/dist/document-rejection.js +407 -0
- package/dist/document-rejection.js.map +1 -0
- package/dist/document-store.d.ts +154 -8
- package/dist/document-store.d.ts.map +1 -1
- package/dist/document-store.js +462 -4
- package/dist/document-store.js.map +1 -1
- package/dist/document-write-path.d.ts.map +1 -1
- package/dist/document-write-path.js +10 -43
- package/dist/document-write-path.js.map +1 -1
- package/dist/inbound-sessions.d.ts +25 -0
- package/dist/inbound-sessions.d.ts.map +1 -1
- package/dist/inbound-sessions.js +60 -0
- package/dist/inbound-sessions.js.map +1 -1
- package/dist/initiate-session-handler.d.ts +24 -1
- package/dist/initiate-session-handler.d.ts.map +1 -1
- package/dist/initiate-session-handler.js +35 -9
- package/dist/initiate-session-handler.js.map +1 -1
- package/dist/ipc-server.d.ts +11 -1
- package/dist/ipc-server.d.ts.map +1 -1
- package/dist/ipc-server.js +7 -1
- package/dist/ipc-server.js.map +1 -1
- 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/notification-handlers.d.ts +2 -1
- package/dist/notification-handlers.d.ts.map +1 -1
- package/dist/notification-handlers.js +11 -2
- package/dist/notification-handlers.js.map +1 -1
- package/dist/outbound-sessions.d.ts +2 -0
- package/dist/outbound-sessions.d.ts.map +1 -1
- package/dist/outbound-sessions.js +23 -2
- package/dist/outbound-sessions.js.map +1 -1
- package/dist/session-content-handlers.d.ts.map +1 -1
- package/dist/session-content-handlers.js +3 -2
- package/dist/session-content-handlers.js.map +1 -1
- package/dist/session-node-manager.d.ts +15 -0
- package/dist/session-node-manager.d.ts.map +1 -1
- package/dist/session-node-manager.js +188 -9
- package/dist/session-node-manager.js.map +1 -1
- package/dist/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary.js +16 -0
- package/dist/vocabulary.js.map +1 -1
- package/dist/wire-content-hash.d.ts +27 -0
- package/dist/wire-content-hash.d.ts.map +1 -0
- package/dist/wire-content-hash.js +37 -0
- package/dist/wire-content-hash.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-handlers.js","sourceRoot":"","sources":["../src/document-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
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 { type DocumentConsentState, type DocumentProposalEnvelope } from "@cello-protocol/protocol-types";
|
|
27
|
+
import type { DaemonDatabase } from "./sqlcipher-db.js";
|
|
28
|
+
import type { Logger } from "./types.js";
|
|
29
|
+
/**
|
|
30
|
+
* Verify a proposal's signature against the agent that claims to have made it.
|
|
31
|
+
*
|
|
32
|
+
* INJECTED and REQUIRED — this class cannot resolve `proposer_agent_id` to a public key, and a
|
|
33
|
+
* default implementation would be a default answer to "is this authentic". The composition root
|
|
34
|
+
* wires the real one.
|
|
35
|
+
*/
|
|
36
|
+
export type ProposalSignatureVerifier = (proposerAgentId: string, tbs: Uint8Array, signature: Uint8Array) => boolean;
|
|
37
|
+
export interface DocumentProposalRecord {
|
|
38
|
+
documentId: string;
|
|
39
|
+
proposerAgentId: string;
|
|
40
|
+
peerAgentId: string;
|
|
41
|
+
envelope: DocumentProposalEnvelope;
|
|
42
|
+
consentState: DocumentConsentState;
|
|
43
|
+
refusalReason?: string;
|
|
44
|
+
createdAtMs: number;
|
|
45
|
+
decidedAtMs?: number;
|
|
46
|
+
}
|
|
47
|
+
export type AcceptOutcome = {
|
|
48
|
+
ok: true;
|
|
49
|
+
documentId: string;
|
|
50
|
+
envelope: DocumentProposalEnvelope;
|
|
51
|
+
} | {
|
|
52
|
+
ok: false;
|
|
53
|
+
reason: string;
|
|
54
|
+
detail: string;
|
|
55
|
+
};
|
|
56
|
+
export declare class DocumentHandshake {
|
|
57
|
+
#private;
|
|
58
|
+
constructor(db: DaemonDatabase, logger: Logger, verify: ProposalSignatureVerifier);
|
|
59
|
+
/**
|
|
60
|
+
* Record an arriving proposal as PENDING, or refuse it outright.
|
|
61
|
+
*
|
|
62
|
+
* A seam violation or a version mismatch is recorded as `refused` with its reason rather than
|
|
63
|
+
* dropped, so the operator can see that a peer tried and why it could not proceed. A dropped
|
|
64
|
+
* proposal is indistinguishable from a peer that never sent one.
|
|
65
|
+
*/
|
|
66
|
+
recordProposal(ownerAgentId: string, wire: Uint8Array, nowMs: number): {
|
|
67
|
+
documentId: string;
|
|
68
|
+
state: DocumentConsentState;
|
|
69
|
+
reason?: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Record a proposal WE authored, so it can be re-sent without minting a new one.
|
|
73
|
+
*
|
|
74
|
+
* The proposer had no record of the envelope it sent. That is fine until the send fails — an
|
|
75
|
+
* offline peer is the ordinary case — and then the document exists locally with no way to reach
|
|
76
|
+
* the counterparty: re-proposing mints a fresh nonce, hence a fresh `document_id`, hence a second
|
|
77
|
+
* document, leaving the first as an orphan the operator cannot explain or clear.
|
|
78
|
+
*
|
|
79
|
+
* Stored `accepted`, because we consented by authoring it — so it never appears in our own inbox
|
|
80
|
+
* (`pending` filters on state), which would be an offer to ourselves.
|
|
81
|
+
*
|
|
82
|
+
* Deliberately NOT routed through `recordProposal`: that path's checks are for a proposal
|
|
83
|
+
* ARRIVING — verify the signature against the named proposer, and refuse one not addressed to us.
|
|
84
|
+
* Ours is addressed to the peer by definition, so reusing that path would require weakening the
|
|
85
|
+
* check that stops a proposal being recorded under an agent it never named.
|
|
86
|
+
*/
|
|
87
|
+
recordOutgoing(ownerAgentId: string, envelope: DocumentProposalEnvelope, nowMs: number): string;
|
|
88
|
+
/**
|
|
89
|
+
* Record the PEER's answer to a proposal we authored.
|
|
90
|
+
*
|
|
91
|
+
* The caller verifies the signature first — this only stores. Kept as its own method rather than
|
|
92
|
+
* folded into `accept`/`refuse` because those are OUR decision about THEIR proposal, and this is
|
|
93
|
+
* the mirror: their decision about ours. Collapsing them would put a peer-controlled reason
|
|
94
|
+
* through a path whose refusal text is written by the local operator.
|
|
95
|
+
*
|
|
96
|
+
* SETTLE ONCE. A second, contradicting answer is refused rather than applied: a peer that
|
|
97
|
+
* accepted must not be able to later claim it refused, or the proposer tears down a document the
|
|
98
|
+
* peer is still editing.
|
|
99
|
+
*/
|
|
100
|
+
recordPeerDecision(ownerAgentId: string, documentId: string,
|
|
101
|
+
/**
|
|
102
|
+
* WHO IS ANSWERING. Required, and checked against the proposal's own peer.
|
|
103
|
+
*
|
|
104
|
+
* The caller verifies the ack's signature against the agent the frame NAMES, which proves the
|
|
105
|
+
* frame is authentic and says nothing about whether that agent was ever entitled to answer. Any
|
|
106
|
+
* third party with a session to us could sign a well-formed ack for a document we proposed to
|
|
107
|
+
* someone else, and it landed as that someone's decision — reported to the operator as "they
|
|
108
|
+
* said no" for a peer who never saw it. Worse, settle-once is by VALUE, so the real peer's
|
|
109
|
+
* later genuine answer contradicts and is discarded: the poisoned state is permanent.
|
|
110
|
+
*
|
|
111
|
+
* Verified is not authorized. The control path (`recordPeerClose`, `recordPeerKill`) has
|
|
112
|
+
* carried this check from the start; the ack path was written without it.
|
|
113
|
+
*/
|
|
114
|
+
ackerAgentId: string, decision: {
|
|
115
|
+
accepted: boolean;
|
|
116
|
+
reason?: string;
|
|
117
|
+
decidedAtMs: number;
|
|
118
|
+
}): {
|
|
119
|
+
ok: true;
|
|
120
|
+
} | {
|
|
121
|
+
ok: false;
|
|
122
|
+
reason: string;
|
|
123
|
+
detail: string;
|
|
124
|
+
};
|
|
125
|
+
/** The peer's answer to a proposal we authored: true accepted, false refused, null unanswered. */
|
|
126
|
+
peerDecision(ownerAgentId: string, documentId: string): boolean | null;
|
|
127
|
+
/**
|
|
128
|
+
* The peer's answer AND the words they sent with it.
|
|
129
|
+
*
|
|
130
|
+
* The reason was stored and never read by anything — write-only, which defeats the entire
|
|
131
|
+
* justification for putting it on the wire and making it mandatory there: "a refusal the proposer
|
|
132
|
+
* cannot see a reason for leaves them unable to propose anything better". Enforced at the
|
|
133
|
+
* signature, discarded at the last hop.
|
|
134
|
+
*/
|
|
135
|
+
peerAnswer(ownerAgentId: string, documentId: string): {
|
|
136
|
+
accepted: boolean | null;
|
|
137
|
+
reason: string | null;
|
|
138
|
+
};
|
|
139
|
+
/** Proposals still awaiting a decision — the operator's inbox for documents. */
|
|
140
|
+
pending(ownerAgentId: string): DocumentProposalRecord[];
|
|
141
|
+
get(ownerAgentId: string, documentId: string): DocumentProposalRecord | null;
|
|
142
|
+
/**
|
|
143
|
+
* Accept a pending proposal. Compare-and-set: the transition happens iff the row was still
|
|
144
|
+
* pending, and the affected-row count is what says so.
|
|
145
|
+
*/
|
|
146
|
+
accept(ownerAgentId: string, documentId: string, nowMs: number): AcceptOutcome;
|
|
147
|
+
/** Refuse a pending proposal. Same compare-and-set guard; a reason is mandatory. */
|
|
148
|
+
refuse(ownerAgentId: string, documentId: string, reason: string, nowMs: number): {
|
|
149
|
+
ok: true;
|
|
150
|
+
} | {
|
|
151
|
+
ok: false;
|
|
152
|
+
reason: string;
|
|
153
|
+
detail: string;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=document-handshake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-handshake.d.ts","sourceRoot":"","sources":["../src/document-handshake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,398 @@
|
|
|
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
|
+
/**
|
|
28
|
+
* NOTE FOR THE NEXT COLUMN. `CREATE TABLE IF NOT EXISTS` is correct only while no daemon has ever
|
|
29
|
+
* created this table — true today, since it is new in an unreleased milestone. The moment any dev
|
|
30
|
+
* or staging DB holds it, adding a column here returns silently and that column never appears on
|
|
31
|
+
* an upgraded database while fresh installs get it. That divergence has already shipped once in
|
|
32
|
+
* this repo (see `consent-migration.ts`). Any future column needs a `PRAGMA table_info` birth-gated
|
|
33
|
+
* ALTER under `BEGIN IMMEDIATE`, following that file.
|
|
34
|
+
*/
|
|
35
|
+
const CREATE_PROPOSALS_SQL = `
|
|
36
|
+
CREATE TABLE IF NOT EXISTS document_proposals (
|
|
37
|
+
owner_agent_id TEXT NOT NULL,
|
|
38
|
+
document_id TEXT NOT NULL,
|
|
39
|
+
proposer_agent_id TEXT NOT NULL,
|
|
40
|
+
peer_agent_id TEXT NOT NULL,
|
|
41
|
+
-- The proposal envelope as it arrived. Kept whole rather than exploded into columns, because
|
|
42
|
+
-- document_id is the hash of exactly these bytes: reconstructing them from columns would make
|
|
43
|
+
-- the identity depend on this schema's round-trip fidelity forever.
|
|
44
|
+
envelope BLOB NOT NULL,
|
|
45
|
+
consent_state TEXT NOT NULL CHECK (consent_state IN ('pending', 'accepted', 'refused')),
|
|
46
|
+
-- Why it was refused, when it was. An operator who declined a proposal weeks ago, or whose
|
|
47
|
+
-- daemon declined it on a seam violation, has no other record of which it was.
|
|
48
|
+
refusal_reason TEXT,
|
|
49
|
+
created_at INTEGER NOT NULL,
|
|
50
|
+
decided_at INTEGER,
|
|
51
|
+
PRIMARY KEY (owner_agent_id, document_id),
|
|
52
|
+
CHECK (consent_state <> 'refused' OR refusal_reason IS NOT NULL)
|
|
53
|
+
);
|
|
54
|
+
`;
|
|
55
|
+
/**
|
|
56
|
+
* COLUMN BIRTH for the peer's answer to a proposal WE authored (the `document_proposal_ack` frame).
|
|
57
|
+
*
|
|
58
|
+
* Separate from the CREATE because a daemon that already holds proposals must gain the columns
|
|
59
|
+
* without losing them. `ALTER TABLE ... ADD COLUMN` throws on a re-run, which is why each is
|
|
60
|
+
* wrapped rather than guarded by a version number nobody maintains.
|
|
61
|
+
*
|
|
62
|
+
* Distinct from `consent_state`, which is OUR decision about THEIR proposal. Overloading one column
|
|
63
|
+
* for both directions is how "we accepted" and "they accepted" become indistinguishable — and the
|
|
64
|
+
* operator surface exists precisely to tell those apart.
|
|
65
|
+
*/
|
|
66
|
+
const PEER_DECISION_COLUMNS = [
|
|
67
|
+
"ALTER TABLE document_proposals ADD COLUMN peer_accepted INTEGER",
|
|
68
|
+
"ALTER TABLE document_proposals ADD COLUMN peer_reason TEXT",
|
|
69
|
+
"ALTER TABLE document_proposals ADD COLUMN peer_decided_at INTEGER",
|
|
70
|
+
];
|
|
71
|
+
export class DocumentHandshake {
|
|
72
|
+
#db;
|
|
73
|
+
#logger;
|
|
74
|
+
#verify;
|
|
75
|
+
constructor(db, logger, verify) {
|
|
76
|
+
this.#db = db;
|
|
77
|
+
this.#logger = logger;
|
|
78
|
+
this.#verify = verify;
|
|
79
|
+
this.#db.exec(CREATE_PROPOSALS_SQL);
|
|
80
|
+
for (const sql of PEER_DECISION_COLUMNS) {
|
|
81
|
+
try {
|
|
82
|
+
this.#db.exec(sql);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Already present. The only other way this throws is a corrupt schema, which the very next
|
|
86
|
+
// query surfaces with its own message — swallowing that one is not worth a version table
|
|
87
|
+
// whose whole job would be to answer a question `ALTER` already answers.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Record an arriving proposal as PENDING, or refuse it outright.
|
|
93
|
+
*
|
|
94
|
+
* A seam violation or a version mismatch is recorded as `refused` with its reason rather than
|
|
95
|
+
* dropped, so the operator can see that a peer tried and why it could not proceed. A dropped
|
|
96
|
+
* proposal is indistinguishable from a peer that never sent one.
|
|
97
|
+
*/
|
|
98
|
+
recordProposal(ownerAgentId, wire, nowMs) {
|
|
99
|
+
const envelope = decodeDocumentProposal(wire);
|
|
100
|
+
const documentId = documentIdFromProposal(envelope);
|
|
101
|
+
// AUTHENTICITY FIRST, and it is fatal rather than a recorded refusal. The operator's consent
|
|
102
|
+
// decision rests entirely on the proposal having come from the agent it names, and an
|
|
103
|
+
// unverified proposal must not reach the inbox at all — `ON CONFLICT DO NOTHING` means the
|
|
104
|
+
// FIRST arrival's bytes are the permanent record for a document_id, so anyone who observed the
|
|
105
|
+
// honest proposal (and therefore knows the nonce) could race a byte-variant carrying junk,
|
|
106
|
+
// win the primary key, and permanently poison the id while the honest proposal is silently
|
|
107
|
+
// discarded. The proposer would have to re-propose under a new nonce with no signal why.
|
|
108
|
+
if (!this.#verify(envelope.proposer_agent_id, buildDocumentProposalTbs(envelope), envelope.signature)) {
|
|
109
|
+
this.#logger.error("document.proposal.signature_invalid", {
|
|
110
|
+
documentId,
|
|
111
|
+
proposerAgentId: envelope.proposer_agent_id,
|
|
112
|
+
});
|
|
113
|
+
throw new Error(`document_proposal_signature_invalid: the proposal claims to come from ` +
|
|
114
|
+
`${envelope.proposer_agent_id} but its signature does not verify against that agent`);
|
|
115
|
+
}
|
|
116
|
+
// ADDRESSED TO US. `ownerAgentId` comes from the caller and `peer_agent_id` comes from the
|
|
117
|
+
// wire, and on a multi-agent daemon — which is why owner_agent_id is in the key at all — an
|
|
118
|
+
// unchecked pair lets a proposal addressed to agent Z be recorded under agent Y and accepted
|
|
119
|
+
// BY agent Y. Consent would then be taken from a party the proposal never named, while the
|
|
120
|
+
// document_id (which does commit to peer_agent_id) says otherwise, with no error anywhere.
|
|
121
|
+
if (envelope.peer_agent_id !== ownerAgentId) {
|
|
122
|
+
this.#logger.warn("document.proposal.wrong_peer", {
|
|
123
|
+
documentId,
|
|
124
|
+
addressedTo: envelope.peer_agent_id,
|
|
125
|
+
recordedFor: ownerAgentId,
|
|
126
|
+
});
|
|
127
|
+
throw new Error(`document_proposal_wrong_peer: this proposal is addressed to ${envelope.peer_agent_id}, ` +
|
|
128
|
+
`not to ${ownerAgentId} — consent belongs to the agent the proposer named`);
|
|
129
|
+
}
|
|
130
|
+
// The HUMAN answer, not a machine label. The clause exists because the alternative to a
|
|
131
|
+
// sentence is a proposal that is never answered, which surfaces as a hang and gets diagnosed
|
|
132
|
+
// as a network fault — and because "upgrade" is useless without saying WHOSE client.
|
|
133
|
+
const incompatible = documentFeatureIncompatibility(envelope.feature_version);
|
|
134
|
+
const reason = incompatible ?? seamViolation(envelope.properties);
|
|
135
|
+
this.#db
|
|
136
|
+
.prepare(`INSERT INTO document_proposals
|
|
137
|
+
(owner_agent_id, document_id, proposer_agent_id, peer_agent_id, envelope,
|
|
138
|
+
consent_state, refusal_reason, created_at, decided_at)
|
|
139
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
140
|
+
ON CONFLICT (owner_agent_id, document_id) DO NOTHING`)
|
|
141
|
+
.run(ownerAgentId, documentId, envelope.proposer_agent_id, envelope.peer_agent_id, Buffer.from(encodeDocumentProposal(envelope)), reason ? "refused" : "pending", reason, nowMs, reason ? nowMs : null);
|
|
142
|
+
// READ BACK THE ROW, do not report what we intended. On a redelivery the INSERT does nothing —
|
|
143
|
+
// correct — and returning the state we would have written announces a decision the operator
|
|
144
|
+
// already made as still awaiting one, and logs an arrival that did not happen.
|
|
145
|
+
const stored = this.get(ownerAgentId, documentId);
|
|
146
|
+
const state = stored?.consentState ?? (reason ? "refused" : "pending");
|
|
147
|
+
const storedReason = stored?.refusalReason ?? reason ?? undefined;
|
|
148
|
+
if (state === "refused") {
|
|
149
|
+
this.#logger.warn("document.proposal.refused", {
|
|
150
|
+
documentId,
|
|
151
|
+
reason: storedReason,
|
|
152
|
+
autoRefused: true,
|
|
153
|
+
});
|
|
154
|
+
return { documentId, state, reason: storedReason };
|
|
155
|
+
}
|
|
156
|
+
if (state === "pending") {
|
|
157
|
+
this.#logger.info("document.proposal.pending", {
|
|
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
|
+
recordOutgoing(ownerAgentId, envelope, nowMs) {
|
|
181
|
+
const documentId = documentIdFromProposal(envelope);
|
|
182
|
+
this.#db
|
|
183
|
+
.prepare(`INSERT INTO document_proposals
|
|
184
|
+
(owner_agent_id, document_id, proposer_agent_id, peer_agent_id, envelope,
|
|
185
|
+
consent_state, refusal_reason, created_at, decided_at)
|
|
186
|
+
VALUES (?, ?, ?, ?, ?, 'accepted', NULL, ?, ?)
|
|
187
|
+
ON CONFLICT (owner_agent_id, document_id) DO NOTHING`)
|
|
188
|
+
.run(ownerAgentId, documentId, envelope.proposer_agent_id, envelope.peer_agent_id, Buffer.from(encodeDocumentProposal(envelope)), nowMs, nowMs);
|
|
189
|
+
return documentId;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Record the PEER's answer to a proposal we authored.
|
|
193
|
+
*
|
|
194
|
+
* The caller verifies the signature first — this only stores. Kept as its own method rather than
|
|
195
|
+
* folded into `accept`/`refuse` because those are OUR decision about THEIR proposal, and this is
|
|
196
|
+
* the mirror: their decision about ours. Collapsing them would put a peer-controlled reason
|
|
197
|
+
* through a path whose refusal text is written by the local operator.
|
|
198
|
+
*
|
|
199
|
+
* SETTLE ONCE. A second, contradicting answer is refused rather than applied: a peer that
|
|
200
|
+
* accepted must not be able to later claim it refused, or the proposer tears down a document the
|
|
201
|
+
* peer is still editing.
|
|
202
|
+
*/
|
|
203
|
+
recordPeerDecision(ownerAgentId, documentId,
|
|
204
|
+
/**
|
|
205
|
+
* WHO IS ANSWERING. Required, and checked against the proposal's own peer.
|
|
206
|
+
*
|
|
207
|
+
* The caller verifies the ack's signature against the agent the frame NAMES, which proves the
|
|
208
|
+
* frame is authentic and says nothing about whether that agent was ever entitled to answer. Any
|
|
209
|
+
* third party with a session to us could sign a well-formed ack for a document we proposed to
|
|
210
|
+
* someone else, and it landed as that someone's decision — reported to the operator as "they
|
|
211
|
+
* said no" for a peer who never saw it. Worse, settle-once is by VALUE, so the real peer's
|
|
212
|
+
* later genuine answer contradicts and is discarded: the poisoned state is permanent.
|
|
213
|
+
*
|
|
214
|
+
* Verified is not authorized. The control path (`recordPeerClose`, `recordPeerKill`) has
|
|
215
|
+
* carried this check from the start; the ack path was written without it.
|
|
216
|
+
*/
|
|
217
|
+
ackerAgentId, decision) {
|
|
218
|
+
const record = this.get(ownerAgentId, documentId);
|
|
219
|
+
if (!record) {
|
|
220
|
+
return {
|
|
221
|
+
ok: false,
|
|
222
|
+
reason: "document_proposal_unknown",
|
|
223
|
+
detail: `no proposal ${documentId.slice(0, 16)}… authored by this agent`,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
if (ackerAgentId !== record.peerAgentId) {
|
|
227
|
+
this.#logger.warn("document.proposal.ack_not_peer", {
|
|
228
|
+
documentId,
|
|
229
|
+
claimedBy: ackerAgentId,
|
|
230
|
+
peerAgentId: record.peerAgentId,
|
|
231
|
+
});
|
|
232
|
+
return {
|
|
233
|
+
ok: false,
|
|
234
|
+
reason: "document_proposal_ack_not_peer",
|
|
235
|
+
detail: `${ackerAgentId} is not the party this proposal was addressed to (${record.peerAgentId}), ` +
|
|
236
|
+
`so their answer is not the decision it asks for`,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (record.proposerAgentId !== ownerAgentId) {
|
|
240
|
+
// Their answer to their OWN proposal is not a thing. Recording it would overwrite this
|
|
241
|
+
// operator's consent decision with the counterparty's assertion about it.
|
|
242
|
+
return {
|
|
243
|
+
ok: false,
|
|
244
|
+
reason: "document_proposal_not_ours",
|
|
245
|
+
detail: `proposal ${documentId.slice(0, 16)}… was authored by the peer, not by this agent`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
const already = this.#peerDecision(ownerAgentId, documentId);
|
|
249
|
+
if (already !== null) {
|
|
250
|
+
if (already === decision.accepted)
|
|
251
|
+
return { ok: true };
|
|
252
|
+
return {
|
|
253
|
+
ok: false,
|
|
254
|
+
reason: "document_proposal_ack_contradicts",
|
|
255
|
+
detail: `the peer already answered this proposal with ${already ? "accepted" : "refused"} and now ` +
|
|
256
|
+
`says ${decision.accepted ? "accepted" : "refused"} — a decision is made once, and both ` +
|
|
257
|
+
`signatures are retained`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
this.#db
|
|
261
|
+
.prepare(`UPDATE document_proposals SET peer_accepted = ?, peer_reason = ?, peer_decided_at = ?
|
|
262
|
+
WHERE owner_agent_id = ? AND document_id = ?`)
|
|
263
|
+
.run(decision.accepted ? 1 : 0, decision.reason ?? null, decision.decidedAtMs, ownerAgentId, documentId);
|
|
264
|
+
this.#logger.info("document.proposal.answered", {
|
|
265
|
+
documentId,
|
|
266
|
+
accepted: decision.accepted,
|
|
267
|
+
reason: decision.reason,
|
|
268
|
+
});
|
|
269
|
+
return { ok: true };
|
|
270
|
+
}
|
|
271
|
+
/** The peer's answer to a proposal we authored: true accepted, false refused, null unanswered. */
|
|
272
|
+
peerDecision(ownerAgentId, documentId) {
|
|
273
|
+
return this.#peerDecision(ownerAgentId, documentId);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* The peer's answer AND the words they sent with it.
|
|
277
|
+
*
|
|
278
|
+
* The reason was stored and never read by anything — write-only, which defeats the entire
|
|
279
|
+
* justification for putting it on the wire and making it mandatory there: "a refusal the proposer
|
|
280
|
+
* cannot see a reason for leaves them unable to propose anything better". Enforced at the
|
|
281
|
+
* signature, discarded at the last hop.
|
|
282
|
+
*/
|
|
283
|
+
peerAnswer(ownerAgentId, documentId) {
|
|
284
|
+
const row = this.#db
|
|
285
|
+
.prepare("SELECT peer_accepted, peer_reason FROM document_proposals WHERE owner_agent_id = ? AND document_id = ?")
|
|
286
|
+
.get(ownerAgentId, documentId);
|
|
287
|
+
if (!row || row.peer_accepted === null)
|
|
288
|
+
return { accepted: null, reason: null };
|
|
289
|
+
return { accepted: row.peer_accepted === 1, reason: row.peer_reason ?? null };
|
|
290
|
+
}
|
|
291
|
+
#peerDecision(ownerAgentId, documentId) {
|
|
292
|
+
const row = this.#db
|
|
293
|
+
.prepare("SELECT peer_accepted FROM document_proposals WHERE owner_agent_id = ? AND document_id = ?")
|
|
294
|
+
.get(ownerAgentId, documentId);
|
|
295
|
+
return row?.peer_accepted === null || row?.peer_accepted === undefined ? null : row.peer_accepted === 1;
|
|
296
|
+
}
|
|
297
|
+
/** Proposals still awaiting a decision — the operator's inbox for documents. */
|
|
298
|
+
pending(ownerAgentId) {
|
|
299
|
+
return this.#rows(ownerAgentId, "WHERE owner_agent_id = ? AND consent_state = 'pending'", []);
|
|
300
|
+
}
|
|
301
|
+
get(ownerAgentId, documentId) {
|
|
302
|
+
const rows = this.#rows(ownerAgentId, "WHERE owner_agent_id = ? AND document_id = ?", [documentId]);
|
|
303
|
+
return rows[0] ?? null;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Accept a pending proposal. Compare-and-set: the transition happens iff the row was still
|
|
307
|
+
* pending, and the affected-row count is what says so.
|
|
308
|
+
*/
|
|
309
|
+
accept(ownerAgentId, documentId, nowMs) {
|
|
310
|
+
const record = this.get(ownerAgentId, documentId);
|
|
311
|
+
if (!record) {
|
|
312
|
+
return {
|
|
313
|
+
ok: false,
|
|
314
|
+
reason: "document_proposal_unknown",
|
|
315
|
+
detail: `no proposal ${documentId.slice(0, 16)}… for this agent`,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
// Re-checked at the transition, not merely at arrival — the proposer runs a different build.
|
|
319
|
+
const violation = seamViolation(record.envelope.properties);
|
|
320
|
+
if (violation) {
|
|
321
|
+
// TRANSITION, do not just refuse the call. Leaving the row pending gives the operator an
|
|
322
|
+
// inbox entry they can never clear, carrying no reason — while the arrival path records one
|
|
323
|
+
// for the identical condition. Two behaviours for one fact, and the one that persists is the
|
|
324
|
+
// one with no explanation attached.
|
|
325
|
+
if (record.consentState === "pending") {
|
|
326
|
+
this.#db
|
|
327
|
+
.prepare(`UPDATE document_proposals SET consent_state = 'refused', refusal_reason = ?,
|
|
328
|
+
decided_at = ?
|
|
329
|
+
WHERE owner_agent_id = ? AND document_id = ? AND consent_state = 'pending'`)
|
|
330
|
+
.run(violation, nowMs, ownerAgentId, documentId);
|
|
331
|
+
this.#logger.warn("document.proposal.refused", {
|
|
332
|
+
documentId,
|
|
333
|
+
reason: violation,
|
|
334
|
+
autoRefused: true,
|
|
335
|
+
at: "accept",
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
return { ok: false, reason: "document_seam_violation", detail: violation };
|
|
339
|
+
}
|
|
340
|
+
const info = this.#db
|
|
341
|
+
.prepare(`UPDATE document_proposals SET consent_state = 'accepted', decided_at = ?
|
|
342
|
+
WHERE owner_agent_id = ? AND document_id = ? AND consent_state = 'pending'`)
|
|
343
|
+
.run(nowMs, ownerAgentId, documentId);
|
|
344
|
+
if (Number(info.changes) === 0) {
|
|
345
|
+
// The row exists but was not pending. Naming the state it IS in is the whole value of the
|
|
346
|
+
// message: "already accepted" and "you refused this" are different facts to an operator, and
|
|
347
|
+
// a generic failure would read as a bug in the handshake.
|
|
348
|
+
const now = this.get(ownerAgentId, documentId);
|
|
349
|
+
return {
|
|
350
|
+
ok: false,
|
|
351
|
+
reason: "document_proposal_not_pending",
|
|
352
|
+
detail: `proposal ${documentId.slice(0, 16)}… is ${now?.consentState ?? "gone"}` +
|
|
353
|
+
(now?.refusalReason ? ` (${now.refusalReason})` : "") +
|
|
354
|
+
" — a consent decision is made once",
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
this.#logger.info("document.proposal.accepted", { documentId });
|
|
358
|
+
return { ok: true, documentId, envelope: record.envelope };
|
|
359
|
+
}
|
|
360
|
+
/** Refuse a pending proposal. Same compare-and-set guard; a reason is mandatory. */
|
|
361
|
+
refuse(ownerAgentId, documentId, reason, nowMs) {
|
|
362
|
+
if (reason.trim().length === 0) {
|
|
363
|
+
// The column's CHECK enforces this too. Refused here so the caller gets a usable error
|
|
364
|
+
// rather than a constraint violation naming a column.
|
|
365
|
+
throw new Error("document_refusal_reason_required: a refusal must say why");
|
|
366
|
+
}
|
|
367
|
+
const info = this.#db
|
|
368
|
+
.prepare(`UPDATE document_proposals SET consent_state = 'refused', refusal_reason = ?, decided_at = ?
|
|
369
|
+
WHERE owner_agent_id = ? AND document_id = ? AND consent_state = 'pending'`)
|
|
370
|
+
.run(reason, nowMs, ownerAgentId, documentId);
|
|
371
|
+
if (Number(info.changes) === 0) {
|
|
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 ?? "unknown"} — a consent decision is made once`,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
this.#logger.info("document.proposal.refused", { documentId, reason, autoRefused: false });
|
|
380
|
+
return { ok: true };
|
|
381
|
+
}
|
|
382
|
+
#rows(ownerAgentId, where, extra) {
|
|
383
|
+
const rows = this.#db
|
|
384
|
+
.prepare(`SELECT * FROM document_proposals ${where} ORDER BY created_at ASC, rowid ASC`)
|
|
385
|
+
.all(ownerAgentId, ...extra);
|
|
386
|
+
return rows.map((r) => ({
|
|
387
|
+
documentId: r["document_id"],
|
|
388
|
+
proposerAgentId: r["proposer_agent_id"],
|
|
389
|
+
peerAgentId: r["peer_agent_id"],
|
|
390
|
+
envelope: decodeDocumentProposal(new Uint8Array(r["envelope"])),
|
|
391
|
+
consentState: r["consent_state"],
|
|
392
|
+
refusalReason: r["refusal_reason"] ?? undefined,
|
|
393
|
+
createdAtMs: r["created_at"],
|
|
394
|
+
decidedAtMs: r["decided_at"] ?? undefined,
|
|
395
|
+
}));
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# 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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"}
|