@cello-protocol/daemon 0.0.161 → 0.0.163
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/daemon.js +15 -5
- package/dist/daemon.js.map +1 -1
- package/dist/document-ack-inbound.d.ts +8 -1
- package/dist/document-ack-inbound.d.ts.map +1 -1
- package/dist/document-ack-inbound.js +31 -8
- package/dist/document-ack-inbound.js.map +1 -1
- package/dist/document-amendment-store.d.ts +72 -0
- package/dist/document-amendment-store.d.ts.map +1 -0
- package/dist/document-amendment-store.js +151 -0
- package/dist/document-amendment-store.js.map +1 -0
- package/dist/document-control-notifier.d.ts +29 -0
- package/dist/document-control-notifier.d.ts.map +1 -1
- package/dist/document-control-notifier.js +62 -6
- package/dist/document-control-notifier.js.map +1 -1
- package/dist/document-delivery-transport.d.ts +2 -1
- package/dist/document-delivery-transport.d.ts.map +1 -1
- package/dist/document-delivery-transport.js +1 -1
- package/dist/document-delivery-transport.js.map +1 -1
- package/dist/document-delivery.d.ts +6 -1
- package/dist/document-delivery.d.ts.map +1 -1
- package/dist/document-delivery.js +167 -201
- package/dist/document-delivery.js.map +1 -1
- package/dist/document-frame-router.d.ts +15 -1
- package/dist/document-frame-router.d.ts.map +1 -1
- package/dist/document-frame-router.js +22 -1
- package/dist/document-frame-router.js.map +1 -1
- package/dist/document-gate.js +1 -1
- package/dist/document-gate.js.map +1 -1
- package/dist/document-handlers.d.ts.map +1 -1
- package/dist/document-handlers.js +649 -5
- package/dist/document-handlers.js.map +1 -1
- package/dist/document-handshake.d.ts +13 -0
- package/dist/document-handshake.d.ts.map +1 -1
- package/dist/document-handshake.js +24 -0
- package/dist/document-handshake.js.map +1 -1
- package/dist/document-inbound.d.ts +12 -0
- package/dist/document-inbound.d.ts.map +1 -1
- package/dist/document-inbound.js +141 -10
- package/dist/document-inbound.js.map +1 -1
- package/dist/document-join-store.d.ts +80 -0
- package/dist/document-join-store.d.ts.map +1 -0
- package/dist/document-join-store.js +197 -0
- package/dist/document-join-store.js.map +1 -0
- package/dist/document-layer.d.ts +52 -2
- package/dist/document-layer.d.ts.map +1 -1
- package/dist/document-layer.js +457 -12
- package/dist/document-layer.js.map +1 -1
- package/dist/document-lifecycle.d.ts +32 -1
- package/dist/document-lifecycle.d.ts.map +1 -1
- package/dist/document-lifecycle.js +88 -20
- package/dist/document-lifecycle.js.map +1 -1
- package/dist/document-publish.d.ts +7 -0
- package/dist/document-publish.d.ts.map +1 -1
- package/dist/document-publish.js +20 -4
- package/dist/document-publish.js.map +1 -1
- package/dist/document-rejection.js +1 -1
- package/dist/document-rejection.js.map +1 -1
- package/dist/document-store.d.ts +97 -4
- package/dist/document-store.d.ts.map +1 -1
- package/dist/document-store.js +335 -21
- package/dist/document-store.js.map +1 -1
- package/dist/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary.js +2 -0
- package/dist/vocabulary.js.map +1 -1
- package/package.json +5 -5
|
@@ -55,8 +55,15 @@ export class DocumentAckInbound {
|
|
|
55
55
|
detail: `no document ${ack.document_id.slice(0, 16)}… for this agent`,
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
|
-
// 3. The acker must be
|
|
59
|
-
|
|
58
|
+
// 3. The acker must be a party. When the chain DERIVES, derived membership is the WHOLE
|
|
59
|
+
// gate — a removed genesis peer's ack refuses like any outsider's (review H2). Only when the
|
|
60
|
+
// chain cannot answer (bilateral legacy, no genesis record) does the genesis-peer column
|
|
61
|
+
// stand in.
|
|
62
|
+
const holders = this.#d.currentHolders(ownerAgentId, ack.document_id);
|
|
63
|
+
const isParty = holders === null
|
|
64
|
+
? ack.acker_agent_id === doc.peerAgentId
|
|
65
|
+
: holders.includes(ack.acker_agent_id);
|
|
66
|
+
if (!isParty) {
|
|
60
67
|
this.#d.logger.warn("document.ack.not_peer", {
|
|
61
68
|
documentId: ack.document_id,
|
|
62
69
|
ackerAgentId: ack.acker_agent_id,
|
|
@@ -109,13 +116,21 @@ export class DocumentAckInbound {
|
|
|
109
116
|
// envelope. Applying the later one would let a peer that admitted an envelope later claim it
|
|
110
117
|
// refused it — and the sender would roll back work the peer already holds. A second,
|
|
111
118
|
// CONTRADICTING ack is an error; a second identical one is an ordinary redelivery.
|
|
112
|
-
|
|
119
|
+
// SETTLE-ONCE, PER ACKER (review M4). The envelope-level column stays null until ALL
|
|
120
|
+
// holders answer, so an envelope-scoped check let a holder that ADMITTED later send a
|
|
121
|
+
// REJECTION mid-fan-out — processed, rounds advanced, work rolled back that they already
|
|
122
|
+
// hold. The acker's own per-holder row is the record; the envelope-level check remains only
|
|
123
|
+
// for the zero-row bilateral legacy.
|
|
124
|
+
const holderPrior = this.#d.store.holderSettlement(ownerAgentId, ack.envelope_hash, ack.acker_agent_id);
|
|
125
|
+
const alreadyAcked = holderPrior !== null || row.ackedAtMs != null;
|
|
113
126
|
if (alreadyAcked) {
|
|
114
127
|
// ENVELOPE-scoped. The document-scoped reader answers a different question, and using it
|
|
115
128
|
// here would make a rejection of any OTHER envelope in this document read as a rejection of
|
|
116
129
|
// this one — so an honest redelivered admission would be refused as a contradiction the
|
|
117
130
|
// moment anything else in the document had ever been refused.
|
|
118
|
-
const previouslyRejected =
|
|
131
|
+
const previouslyRejected = holderPrior !== null
|
|
132
|
+
? !holderPrior.admitted
|
|
133
|
+
: this.#d.store.rejectionReceivedFor(ownerAgentId, ack.document_id, ack.envelope_hash);
|
|
119
134
|
const contradicts = ack.admitted === previouslyRejected;
|
|
120
135
|
if (contradicts) {
|
|
121
136
|
this.#d.logger.error("document.ack.contradiction", {
|
|
@@ -136,12 +151,20 @@ export class DocumentAckInbound {
|
|
|
136
151
|
// An identical redelivery. Nothing to do, and nothing to complain about.
|
|
137
152
|
return { ok: true, admitted: ack.admitted, envelopeHash: ack.envelope_hash };
|
|
138
153
|
}
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
|
|
154
|
+
// FANOUT-1: the ACKING HOLDER settles THEIR row; the envelope-level record follows the ONE
|
|
155
|
+
// deterministic terminal rule (`reconcileEnvelopeSettlement` — review M3), identical from
|
|
156
|
+
// every reconciliation site. Bilateral legacy (zero rows) stays byte-identical: the
|
|
157
|
+
// reconcile no-ops and markAcked below still runs through it.
|
|
158
|
+
this.#d.store.ackHolderDelivery(ownerAgentId, ack.document_id, ack.envelope_hash, ack.acker_agent_id, nowMs);
|
|
159
|
+
const before = row.ackedAtMs != null;
|
|
160
|
+
this.#d.store.reconcileEnvelopeSettlement(ownerAgentId, ack.document_id, ack.envelope_hash, nowMs);
|
|
161
|
+
const legacy = this.#d.store.holderSettlement(ownerAgentId, ack.envelope_hash, ack.acker_agent_id) === null;
|
|
162
|
+
const first = legacy
|
|
163
|
+
? this.#d.store.markAcked(ownerAgentId, ack.document_id, ack.envelope_hash, nowMs)
|
|
164
|
+
: !before;
|
|
142
165
|
// ANNOUNCE THE SETTLE, before the admitted/rejected split — both outcomes end the delivery, and
|
|
143
166
|
// a waiter that only heard about admissions would keep a session open through every rejection.
|
|
144
|
-
this.#d.onSettled?.(ownerAgentId, ack.envelope_hash, ack.admitted);
|
|
167
|
+
this.#d.onSettled?.(ownerAgentId, ack.envelope_hash, ack.acker_agent_id, ack.admitted);
|
|
145
168
|
if (!ack.admitted) {
|
|
146
169
|
// Durable on the publishing side. A log line would not survive the restart after which the
|
|
147
170
|
// operator asks why their work never landed — and this is also what bounds the retry on the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-ack-inbound.js","sourceRoot":"","sources":["../src/document-ack-inbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"document-ack-inbound.js","sourceRoot":"","sources":["../src/document-ack-inbound.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOD-MP-AMEND-1 (daemon half) — the append-only amendment store.
|
|
3
|
+
*
|
|
4
|
+
* One row per epoch per document, holding the amendment AS RECEIVED — the wire bytes, never a
|
|
5
|
+
* re-encode. The bytes are the truth: `chain` decodes them on read, so what replay consumes is
|
|
6
|
+
* exactly what was signed, and a codec asymmetry can never silently rewrite an agreed record
|
|
7
|
+
* (the class of defect TRACE-1 found in the proposal codec).
|
|
8
|
+
*
|
|
9
|
+
* The store owns persistence and chain SHAPE:
|
|
10
|
+
* - **Contiguity** — epoch N appends only onto N-1 rows. An out-of-order arrival is refused by
|
|
11
|
+
* name, not buffered; amendment-lag buffering is DOD-MP-INBOUND-N-1's design, and until it
|
|
12
|
+
* lands the honest behaviour is a loud refusal the sender retries.
|
|
13
|
+
* - **Fork refusal** — a different amendment at an occupied epoch is `document_amendment_conflict`,
|
|
14
|
+
* first record kept. Two rivals for one epoch is a governance fork; absorbing either silently
|
|
15
|
+
* would have two holders replay different arrangements with no error anywhere.
|
|
16
|
+
* - **Idempotent redelivery** — the same bytes again is `recorded: false`, not an error and not a
|
|
17
|
+
* second row.
|
|
18
|
+
*
|
|
19
|
+
* What the store does NOT judge: signatures, policy, subject semantics. `deriveArrangement`
|
|
20
|
+
* (protocol-types) rules on those at every consumption, and the inbound path rules BEFORE
|
|
21
|
+
* appending. A row in this table is a claim to be replayed, not an admitted fact.
|
|
22
|
+
*/
|
|
23
|
+
import { type DocumentAmendmentEnvelope } from "@cello-protocol/protocol-types";
|
|
24
|
+
import type { DaemonDatabase } from "./sqlcipher-db.js";
|
|
25
|
+
import type { Logger } from "./types.js";
|
|
26
|
+
/**
|
|
27
|
+
* Shared with `DocumentStore`, which also execs this (the :353 shared-definition precedent there):
|
|
28
|
+
* every epoch producer already holds a DocumentStore, and `currentDocumentEpoch` reads this table
|
|
29
|
+
* through it — so the table must exist whichever module constructs first. Keep the two consumers
|
|
30
|
+
* on THIS one string.
|
|
31
|
+
*/
|
|
32
|
+
export declare const DOCUMENT_AMENDMENTS_CREATE_SQL = "\n CREATE TABLE IF NOT EXISTS document_amendments (\n owner_agent_id TEXT NOT NULL,\n document_id TEXT NOT NULL,\n epoch_id INTEGER NOT NULL,\n amendment_hash TEXT NOT NULL,\n received_bytes BLOB NOT NULL,\n recorded_at INTEGER NOT NULL,\n PRIMARY KEY (owner_agent_id, document_id, epoch_id)\n );\n";
|
|
33
|
+
export interface MembershipVerdict {
|
|
34
|
+
state: "holder" | "removed" | "untouched";
|
|
35
|
+
epochId: number | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The last membership event naming this agent in an ordered chain — ONE implementation, because
|
|
39
|
+
* two walks (the inbound refusal's and the publish gate's) disagreeing about whether someone was
|
|
40
|
+
* removed is two daemons disagreeing about the arrangement.
|
|
41
|
+
*/
|
|
42
|
+
export declare function walkMembership(chain: readonly DocumentAmendmentEnvelope[], agentId: string): MembershipVerdict;
|
|
43
|
+
export interface AmendmentAppendResult {
|
|
44
|
+
/** False on an idempotent redelivery — the row already existed with the same hash. */
|
|
45
|
+
recorded: boolean;
|
|
46
|
+
epochId: number;
|
|
47
|
+
/** Hex of the amendment's TBS hash. */
|
|
48
|
+
amendmentHash: string;
|
|
49
|
+
}
|
|
50
|
+
export declare class DocumentAmendmentStore {
|
|
51
|
+
#private;
|
|
52
|
+
constructor(db: DaemonDatabase, logger: Logger);
|
|
53
|
+
/**
|
|
54
|
+
* Append one amendment from its wire bytes. Decodes first — malformed bytes refuse with the
|
|
55
|
+
* decoder's named reason and nothing is stored.
|
|
56
|
+
*/
|
|
57
|
+
append(ownerAgentId: string, documentId: string, receivedBytes: Uint8Array, nowMs: number): AmendmentAppendResult;
|
|
58
|
+
/** The ordered chain, decoded from the stored received bytes. */
|
|
59
|
+
chain(ownerAgentId: string, documentId: string): DocumentAmendmentEnvelope[];
|
|
60
|
+
/**
|
|
61
|
+
* DOD-MP-REMOVE-1 — this agent's LAST membership event in the recorded chain.
|
|
62
|
+
* "holder" = admitted (or never touched by any membership amendment — genesis membership is
|
|
63
|
+
* the CALLER's fact, not this table's); "removed" = the last event naming them was
|
|
64
|
+
* remove_holder, with the epoch it happened at, so a refusal can name the removal rather than
|
|
65
|
+
* a generic condition. Reads the recorded chain only — validity was ruled before append
|
|
66
|
+
* (the standing invariant).
|
|
67
|
+
*/
|
|
68
|
+
membershipOf(ownerAgentId: string, documentId: string, agentId: string): MembershipVerdict;
|
|
69
|
+
/** The highest recorded epoch, or 0 — genesis — when no amendment exists. */
|
|
70
|
+
currentEpoch(ownerAgentId: string, documentId: string): number;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=document-amendment-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-amendment-store.d.ts","sourceRoot":"","sources":["../src/document-amendment-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,oWAU1C,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAC1C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,yBAAyB,EAAE,EAC3C,OAAO,EAAE,MAAM,GACd,iBAAiB,CAcnB;AAED,MAAM,WAAW,qBAAqB;IACpC,sFAAsF;IACtF,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,sBAAsB;;gBAIrB,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM;IAM9C;;;OAGG;IACH,MAAM,CACJ,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,UAAU,EACzB,KAAK,EAAE,MAAM,GACZ,qBAAqB;IAmExB,iEAAiE;IACjE,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,yBAAyB,EAAE;IAW5E;;;;;;;OAOG;IACH,YAAY,CACV,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,iBAAiB;IAIpB,6EAA6E;IAC7E,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;CAS/D"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOD-MP-AMEND-1 (daemon half) — the append-only amendment store.
|
|
3
|
+
*
|
|
4
|
+
* One row per epoch per document, holding the amendment AS RECEIVED — the wire bytes, never a
|
|
5
|
+
* re-encode. The bytes are the truth: `chain` decodes them on read, so what replay consumes is
|
|
6
|
+
* exactly what was signed, and a codec asymmetry can never silently rewrite an agreed record
|
|
7
|
+
* (the class of defect TRACE-1 found in the proposal codec).
|
|
8
|
+
*
|
|
9
|
+
* The store owns persistence and chain SHAPE:
|
|
10
|
+
* - **Contiguity** — epoch N appends only onto N-1 rows. An out-of-order arrival is refused by
|
|
11
|
+
* name, not buffered; amendment-lag buffering is DOD-MP-INBOUND-N-1's design, and until it
|
|
12
|
+
* lands the honest behaviour is a loud refusal the sender retries.
|
|
13
|
+
* - **Fork refusal** — a different amendment at an occupied epoch is `document_amendment_conflict`,
|
|
14
|
+
* first record kept. Two rivals for one epoch is a governance fork; absorbing either silently
|
|
15
|
+
* would have two holders replay different arrangements with no error anywhere.
|
|
16
|
+
* - **Idempotent redelivery** — the same bytes again is `recorded: false`, not an error and not a
|
|
17
|
+
* second row.
|
|
18
|
+
*
|
|
19
|
+
* What the store does NOT judge: signatures, policy, subject semantics. `deriveArrangement`
|
|
20
|
+
* (protocol-types) rules on those at every consumption, and the inbound path rules BEFORE
|
|
21
|
+
* appending. A row in this table is a claim to be replayed, not an admitted fact.
|
|
22
|
+
*/
|
|
23
|
+
import { decodeDocumentAmendment, documentAmendmentHash, } from "@cello-protocol/protocol-types";
|
|
24
|
+
/**
|
|
25
|
+
* Shared with `DocumentStore`, which also execs this (the :353 shared-definition precedent there):
|
|
26
|
+
* every epoch producer already holds a DocumentStore, and `currentDocumentEpoch` reads this table
|
|
27
|
+
* through it — so the table must exist whichever module constructs first. Keep the two consumers
|
|
28
|
+
* on THIS one string.
|
|
29
|
+
*/
|
|
30
|
+
export const DOCUMENT_AMENDMENTS_CREATE_SQL = `
|
|
31
|
+
CREATE TABLE IF NOT EXISTS document_amendments (
|
|
32
|
+
owner_agent_id TEXT NOT NULL,
|
|
33
|
+
document_id TEXT NOT NULL,
|
|
34
|
+
epoch_id INTEGER NOT NULL,
|
|
35
|
+
amendment_hash TEXT NOT NULL,
|
|
36
|
+
received_bytes BLOB NOT NULL,
|
|
37
|
+
recorded_at INTEGER NOT NULL,
|
|
38
|
+
PRIMARY KEY (owner_agent_id, document_id, epoch_id)
|
|
39
|
+
);
|
|
40
|
+
`;
|
|
41
|
+
/**
|
|
42
|
+
* The last membership event naming this agent in an ordered chain — ONE implementation, because
|
|
43
|
+
* two walks (the inbound refusal's and the publish gate's) disagreeing about whether someone was
|
|
44
|
+
* removed is two daemons disagreeing about the arrangement.
|
|
45
|
+
*/
|
|
46
|
+
export function walkMembership(chain, agentId) {
|
|
47
|
+
let state = "untouched";
|
|
48
|
+
let epochId = null;
|
|
49
|
+
for (const env of chain) {
|
|
50
|
+
if (env.body.subject_agent_id !== agentId)
|
|
51
|
+
continue;
|
|
52
|
+
if (env.body.kind === "add_holder") {
|
|
53
|
+
state = "holder";
|
|
54
|
+
epochId = env.body.epoch_id;
|
|
55
|
+
}
|
|
56
|
+
else if (env.body.kind === "remove_holder") {
|
|
57
|
+
state = "removed";
|
|
58
|
+
epochId = env.body.epoch_id;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { state, epochId };
|
|
62
|
+
}
|
|
63
|
+
export class DocumentAmendmentStore {
|
|
64
|
+
#db;
|
|
65
|
+
#logger;
|
|
66
|
+
constructor(db, logger) {
|
|
67
|
+
this.#db = db;
|
|
68
|
+
this.#logger = logger;
|
|
69
|
+
this.#db.exec(DOCUMENT_AMENDMENTS_CREATE_SQL);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Append one amendment from its wire bytes. Decodes first — malformed bytes refuse with the
|
|
73
|
+
* decoder's named reason and nothing is stored.
|
|
74
|
+
*/
|
|
75
|
+
append(ownerAgentId, documentId, receivedBytes, nowMs) {
|
|
76
|
+
const env = decodeDocumentAmendment(receivedBytes);
|
|
77
|
+
if (env.body.document_id !== documentId) {
|
|
78
|
+
throw new Error(`document_amendment_wrong_document: the bytes name ${env.body.document_id}, appending ` +
|
|
79
|
+
`under ${documentId}`);
|
|
80
|
+
}
|
|
81
|
+
const epochId = env.body.epoch_id;
|
|
82
|
+
const hash = Buffer.from(documentAmendmentHash(env.body)).toString("hex");
|
|
83
|
+
const existing = this.#db
|
|
84
|
+
.prepare(`SELECT amendment_hash FROM document_amendments
|
|
85
|
+
WHERE owner_agent_id = ? AND document_id = ? AND epoch_id = ?`)
|
|
86
|
+
.get(ownerAgentId, documentId, epochId);
|
|
87
|
+
if (existing) {
|
|
88
|
+
if (existing.amendment_hash === hash) {
|
|
89
|
+
return { recorded: false, epochId, amendmentHash: hash };
|
|
90
|
+
}
|
|
91
|
+
this.#logger.error("document.amendment.conflict", {
|
|
92
|
+
documentId,
|
|
93
|
+
epochId,
|
|
94
|
+
storedHash: existing.amendment_hash,
|
|
95
|
+
rivalHash: hash,
|
|
96
|
+
});
|
|
97
|
+
throw new Error(`document_amendment_conflict: epoch ${epochId} of ${documentId} already holds ` +
|
|
98
|
+
`${existing.amendment_hash} and a rival amendment ${hash} arrived — a governance fork, ` +
|
|
99
|
+
`refused with the first record kept`);
|
|
100
|
+
}
|
|
101
|
+
const prior = this.currentEpoch(ownerAgentId, documentId);
|
|
102
|
+
if (epochId !== prior + 1) {
|
|
103
|
+
throw new Error(`document_amendment_chain_gap: epoch ${epochId} cannot append onto epoch ${prior} — ` +
|
|
104
|
+
`amendments land contiguously, and an out-of-order arrival is retried by its sender, ` +
|
|
105
|
+
`never buffered silently`);
|
|
106
|
+
}
|
|
107
|
+
this.#db
|
|
108
|
+
.prepare(`INSERT INTO document_amendments
|
|
109
|
+
(owner_agent_id, document_id, epoch_id, amendment_hash, received_bytes, recorded_at)
|
|
110
|
+
VALUES (?, ?, ?, ?, ?, ?)`)
|
|
111
|
+
.run(ownerAgentId, documentId, epochId, hash,
|
|
112
|
+
// Copied — the caller may reuse or zero its buffer after we return.
|
|
113
|
+
Buffer.from(receivedBytes), nowMs);
|
|
114
|
+
this.#logger.info("document.amendment.recorded", {
|
|
115
|
+
documentId,
|
|
116
|
+
epochId,
|
|
117
|
+
amendmentHash: hash,
|
|
118
|
+
kind: env.body.kind,
|
|
119
|
+
});
|
|
120
|
+
return { recorded: true, epochId, amendmentHash: hash };
|
|
121
|
+
}
|
|
122
|
+
/** The ordered chain, decoded from the stored received bytes. */
|
|
123
|
+
chain(ownerAgentId, documentId) {
|
|
124
|
+
const rows = this.#db
|
|
125
|
+
.prepare(`SELECT received_bytes FROM document_amendments
|
|
126
|
+
WHERE owner_agent_id = ? AND document_id = ?
|
|
127
|
+
ORDER BY epoch_id ASC`)
|
|
128
|
+
.all(ownerAgentId, documentId);
|
|
129
|
+
return rows.map((r) => decodeDocumentAmendment(new Uint8Array(r.received_bytes)));
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* DOD-MP-REMOVE-1 — this agent's LAST membership event in the recorded chain.
|
|
133
|
+
* "holder" = admitted (or never touched by any membership amendment — genesis membership is
|
|
134
|
+
* the CALLER's fact, not this table's); "removed" = the last event naming them was
|
|
135
|
+
* remove_holder, with the epoch it happened at, so a refusal can name the removal rather than
|
|
136
|
+
* a generic condition. Reads the recorded chain only — validity was ruled before append
|
|
137
|
+
* (the standing invariant).
|
|
138
|
+
*/
|
|
139
|
+
membershipOf(ownerAgentId, documentId, agentId) {
|
|
140
|
+
return walkMembership(this.chain(ownerAgentId, documentId), agentId);
|
|
141
|
+
}
|
|
142
|
+
/** The highest recorded epoch, or 0 — genesis — when no amendment exists. */
|
|
143
|
+
currentEpoch(ownerAgentId, documentId) {
|
|
144
|
+
const r = this.#db
|
|
145
|
+
.prepare(`SELECT MAX(epoch_id) AS max_epoch FROM document_amendments
|
|
146
|
+
WHERE owner_agent_id = ? AND document_id = ?`)
|
|
147
|
+
.get(ownerAgentId, documentId);
|
|
148
|
+
return r?.max_epoch ?? 0;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=document-amendment-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-amendment-store.js","sourceRoot":"","sources":["../src/document-amendment-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,22 @@
|
|
|
26
26
|
* none. So the owner is resolved here, by asking each agent this daemon holds whether the document
|
|
27
27
|
* is theirs. A document id is a hash committing to both parties and a nonce, so at most one agent
|
|
28
28
|
* can answer.
|
|
29
|
+
*
|
|
30
|
+
* ── DOD-MP-CONTROL-N-1 — WHY THE TARGET IS DERIVED, NOT `peerAgentId` ─────────────────────────
|
|
31
|
+
*
|
|
32
|
+
* This addressed `doc.peerAgentId` and returned after one send. That column is the GENESIS
|
|
33
|
+
* counterparty, frozen at creation, and multiplayer made it wrong in two ways at once: with three
|
|
34
|
+
* holders only one was told, and after a removal the genesis counterparty can BE the removed
|
|
35
|
+
* holder — so the frame went to the one party it must not reach while the remaining co-author was
|
|
36
|
+
* never told, under a reported `peerNotified: true`. Found by the M14B live fleet smoke.
|
|
37
|
+
*
|
|
38
|
+
* The target is now the DERIVED participant set, the same source FANOUT-1 established for update
|
|
39
|
+
* envelopes; control frames were simply never migrated to it. Deriving needs the genesis proposal,
|
|
40
|
+
* the amendment chain and signature verification — all of which live above this module, so it
|
|
41
|
+
* arrives as an injected `holders()` rather than by widening this unit into the replay engine.
|
|
42
|
+
*
|
|
43
|
+
* A derivation failure REFUSES. It must never fall back to `peerAgentId`: that is the old bug, and
|
|
44
|
+
* it aims the frame at exactly the wrong party in the case that motivated the change.
|
|
29
45
|
*/
|
|
30
46
|
import { type DocumentControlVerb } from "@cello-protocol/protocol-types";
|
|
31
47
|
import type { DocumentStore } from "./document-store.js";
|
|
@@ -36,6 +52,18 @@ export interface DocumentControlNotifierDeps {
|
|
|
36
52
|
agentName: string;
|
|
37
53
|
ownerAgentId: string;
|
|
38
54
|
}>;
|
|
55
|
+
/**
|
|
56
|
+
* The CURRENT holders of this document OTHER than the owner, derived from the genesis proposal
|
|
57
|
+
* plus the amendment chain — the same set that governs update delivery. A failure to derive is
|
|
58
|
+
* returned, not swallowed: this unit refuses rather than guessing a recipient.
|
|
59
|
+
*/
|
|
60
|
+
holders(ownerAgentId: string, documentId: string): {
|
|
61
|
+
ok: true;
|
|
62
|
+
holders: readonly string[];
|
|
63
|
+
} | {
|
|
64
|
+
ok: false;
|
|
65
|
+
reason: string;
|
|
66
|
+
};
|
|
39
67
|
/** Sign as the named agent. A miss must REFUSE, not substitute another agent's key. */
|
|
40
68
|
sign(agentName: string, tbs: Uint8Array): Promise<Uint8Array>;
|
|
41
69
|
send(agentName: string, input: {
|
|
@@ -62,6 +90,7 @@ export interface DocumentControlNotifierDeps {
|
|
|
62
90
|
}
|
|
63
91
|
export type NotifyPeer = (documentId: string, verb: DocumentControlVerb) => Promise<{
|
|
64
92
|
ok: true;
|
|
93
|
+
holdersNotified: Record<string, boolean>;
|
|
65
94
|
} | {
|
|
66
95
|
ok: false;
|
|
67
96
|
reason: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-control-notifier.d.ts","sourceRoot":"","sources":["../src/document-control-notifier.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"document-control-notifier.d.ts","sourceRoot":"","sources":["../src/document-control-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,aAAa,CAAC;IACrB,oGAAoG;IACpG,MAAM,IAAI,aAAa,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE;;;;OAIG;IACH,OAAO,CACL,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,uFAAuF;IACvF,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9D,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAC3F,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,GAAG,IAAI,MAAM,CAAC;IACd;;;;;OAKG;IACH,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;CACtE;AAED,MAAM,MAAM,UAAU,GAAG,CACvB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,mBAAmB,KACtB,OAAO,CACR;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACtD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CACjD,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,UAAU,CAqF3F"}
|
|
@@ -26,6 +26,22 @@
|
|
|
26
26
|
* none. So the owner is resolved here, by asking each agent this daemon holds whether the document
|
|
27
27
|
* is theirs. A document id is a hash committing to both parties and a nonce, so at most one agent
|
|
28
28
|
* can answer.
|
|
29
|
+
*
|
|
30
|
+
* ── DOD-MP-CONTROL-N-1 — WHY THE TARGET IS DERIVED, NOT `peerAgentId` ─────────────────────────
|
|
31
|
+
*
|
|
32
|
+
* This addressed `doc.peerAgentId` and returned after one send. That column is the GENESIS
|
|
33
|
+
* counterparty, frozen at creation, and multiplayer made it wrong in two ways at once: with three
|
|
34
|
+
* holders only one was told, and after a removal the genesis counterparty can BE the removed
|
|
35
|
+
* holder — so the frame went to the one party it must not reach while the remaining co-author was
|
|
36
|
+
* never told, under a reported `peerNotified: true`. Found by the M14B live fleet smoke.
|
|
37
|
+
*
|
|
38
|
+
* The target is now the DERIVED participant set, the same source FANOUT-1 established for update
|
|
39
|
+
* envelopes; control frames were simply never migrated to it. Deriving needs the genesis proposal,
|
|
40
|
+
* the amendment chain and signature verification — all of which live above this module, so it
|
|
41
|
+
* arrives as an injected `holders()` rather than by widening this unit into the replay engine.
|
|
42
|
+
*
|
|
43
|
+
* A derivation failure REFUSES. It must never fall back to `peerAgentId`: that is the old bug, and
|
|
44
|
+
* it aims the frame at exactly the wrong party in the case that motivated the change.
|
|
29
45
|
*/
|
|
30
46
|
import { randomUUID } from "node:crypto";
|
|
31
47
|
import { encodeDocumentControl, buildDocumentControlTbs, DOCUMENT_CONTROL_VERSION, } from "@cello-protocol/protocol-types";
|
|
@@ -35,6 +51,18 @@ export function createDocumentControlNotifier(deps) {
|
|
|
35
51
|
const doc = deps.store.getDocument(ownerAgentId, documentId);
|
|
36
52
|
if (!doc)
|
|
37
53
|
continue;
|
|
54
|
+
const targets = deps.holders(ownerAgentId, documentId);
|
|
55
|
+
if (!targets.ok) {
|
|
56
|
+
deps.logger?.warn("document.control.holders_underivable", {
|
|
57
|
+
documentId, verb, agentName, reason: targets.reason,
|
|
58
|
+
});
|
|
59
|
+
return { ok: false, reason: targets.reason };
|
|
60
|
+
}
|
|
61
|
+
if (targets.holders.length === 0) {
|
|
62
|
+
// Distinct from a failed send, and reported rather than returned as a vacuous success: an
|
|
63
|
+
// empty map behind `ok: true` reads as "everyone was told" to a caller that checks only ok.
|
|
64
|
+
return { ok: false, reason: "document_no_holders" };
|
|
65
|
+
}
|
|
38
66
|
const control = {
|
|
39
67
|
type: "document_control",
|
|
40
68
|
control_version: DOCUMENT_CONTROL_VERSION,
|
|
@@ -63,12 +91,40 @@ export function createDocumentControlNotifier(deps) {
|
|
|
63
91
|
return { ok: false, reason: "document_control_unsigned", detail };
|
|
64
92
|
}
|
|
65
93
|
control.signature = signature;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
94
|
+
// Signed ONCE. The TBS commits to the document, the sender and the verb — never to a
|
|
95
|
+
// recipient — so every holder receives byte-identical evidence and cannot be handed a
|
|
96
|
+
// frame that differs from their co-holders'.
|
|
97
|
+
const bytes = encodeDocumentControl(control);
|
|
98
|
+
const holdersNotified = {};
|
|
99
|
+
for (const holder of targets.holders) {
|
|
100
|
+
// Sequential and independent: one unreachable holder must neither block nor abort the
|
|
101
|
+
// others (availability is a first-class protocol concern), and a throw from the transport
|
|
102
|
+
// is that holder's failure alone, not the fan-out's.
|
|
103
|
+
try {
|
|
104
|
+
const sent = await deps.send(agentName, {
|
|
105
|
+
peerAgentId: holder,
|
|
106
|
+
documentId,
|
|
107
|
+
bytes,
|
|
108
|
+
correlationId: randomUUID(),
|
|
109
|
+
});
|
|
110
|
+
holdersNotified[holder] = sent.ok;
|
|
111
|
+
if (!sent.ok) {
|
|
112
|
+
deps.logger?.warn("document.control.holder_not_notified", {
|
|
113
|
+
documentId, verb, holderAgentId: holder, reason: sent.reason,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
holdersNotified[holder] = false;
|
|
119
|
+
deps.logger?.warn("document.control.holder_not_notified", {
|
|
120
|
+
documentId, verb, holderAgentId: holder,
|
|
121
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// `ok` means SIGNED AND ATTEMPTED TO EVERY CURRENT HOLDER. Who actually took it is the map's
|
|
126
|
+
// job — collapsing that into one boolean is how a partial fan-out reads as a clean one.
|
|
127
|
+
return { ok: true, holdersNotified };
|
|
72
128
|
}
|
|
73
129
|
// No agent on this daemon holds it. Named as such rather than reported as a transport failure:
|
|
74
130
|
// the two want different things from whoever reads the log.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-control-notifier.js","sourceRoot":"","sources":["../src/document-control-notifier.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"document-control-notifier.js","sourceRoot":"","sources":["../src/document-control-notifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,7 +102,8 @@ export interface DocumentTransportDeps {
|
|
|
102
102
|
* relay, a busy peer. The rule is simply that we do not tear down the channel an answer is due
|
|
103
103
|
* on until it has arrived or we have given up on it.
|
|
104
104
|
*/
|
|
105
|
-
|
|
105
|
+
/** Waits for THE DIALED HOLDER'S answer — any other holder's ack must not resolve it (H1). */
|
|
106
|
+
awaitAck(envelopeHash: string, expectedAckerAgentId: string, timeoutMs: number): Promise<{
|
|
106
107
|
admitted: boolean;
|
|
107
108
|
} | null>;
|
|
108
109
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-delivery-transport.d.ts","sourceRoot":"","sources":["../src/document-delivery-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAA6B,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACvG,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,4FAA4F;IAC5F,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClF;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,wDAAwD;IACxD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrE,4EAA4E;IAC5E,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,wCAAwC;IACxC,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,UAAU,EACvB,aAAa,EAAE,MAAM;IACrB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CACN;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,GAC7B;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,IAAI,CAAA;KAAE,GAC5C;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAC/C,CAAC;IACF,0EAA0E;IAC1E,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IACvF;;;;;;;;;;;;OAYG;IACH,QAAQ,
|
|
1
|
+
{"version":3,"file":"document-delivery-transport.d.ts","sourceRoot":"","sources":["../src/document-delivery-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAA6B,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACvG,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,4FAA4F;IAC5F,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClF;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,wDAAwD;IACxD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrE,4EAA4E;IAC5E,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,wCAAwC;IACxC,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,UAAU,EACvB,aAAa,EAAE,MAAM;IACrB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CACN;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,GAC7B;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,IAAI,CAAA;KAAE,GAC5C;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAC/C,CAAC;IACF,0EAA0E;IAC1E,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IACvF;;;;;;;;;;;;OAYG;IACH,8FAA8F;IAC9F,QAAQ,CACN,YAAY,EAAE,MAAM,EACpB,oBAAoB,EAAE,MAAM,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACzC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,IAAgB,CAAC;AAEhD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,qBAAqB,GAC1B,yBAAyB,CAmN3B;AAED,OAAO,EAAE,yBAAyB,EAAE,CAAC"}
|
|
@@ -217,7 +217,7 @@ export function createDocumentDeliveryTransport(deps) {
|
|
|
217
217
|
reason: err instanceof Error ? err.message : String(err),
|
|
218
218
|
});
|
|
219
219
|
});
|
|
220
|
-
settlement = await deps.awaitAck(envelope.envelopeHash, graceMs);
|
|
220
|
+
settlement = await deps.awaitAck(envelope.envelopeHash, input.peerAgentId, graceMs);
|
|
221
221
|
if (!settlement) {
|
|
222
222
|
// NOT a failure of the send — the content left and the peer may still answer later. Said
|
|
223
223
|
// out loud because a seal that discards a held ack is otherwise invisible, and this is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-delivery-transport.js","sourceRoot":"","sources":["../src/document-delivery-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAElG,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"document-delivery-transport.js","sourceRoot":"","sources":["../src/document-delivery-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -209,7 +209,12 @@ export declare class DocumentDelivery {
|
|
|
209
209
|
* unreachable peer must not stop delivery to every other peer, which is precisely the "works
|
|
210
210
|
* only when all nodes are healthy" shape the project forbids.
|
|
211
211
|
*/
|
|
212
|
-
|
|
212
|
+
/**
|
|
213
|
+
* One pass over what is due, PER (document, holder). Returns counts rather than throwing on a
|
|
214
|
+
* per-target failure: one unreachable HOLDER must not stop delivery to any other — the same
|
|
215
|
+
* "works only when all nodes are healthy" shape the project forbids, now per holder.
|
|
216
|
+
*/
|
|
217
|
+
tick(ownerAgentId: string, holdersFor: (documentId: string) => string[] | null, nowMs: number, opts?: {
|
|
213
218
|
sessionHints?: ReadonlyMap<string, string>;
|
|
214
219
|
correlationId?: string;
|
|
215
220
|
/** Our own wire sender id. Defaults to the owner key for callers whose ids coincide. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-delivery.d.ts","sourceRoot":"","sources":["../src/document-delivery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"document-delivery.d.ts","sourceRoot":"","sources":["../src/document-delivery.ts"],"names":[],"mappings":"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"}
|