@cello-protocol/daemon 0.0.167 → 0.0.169

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.
Files changed (80) hide show
  1. package/dist/daemon.d.ts.map +1 -1
  2. package/dist/daemon.js +115 -254
  3. package/dist/daemon.js.map +1 -1
  4. package/dist/document-amendment-store.d.ts +94 -46
  5. package/dist/document-amendment-store.d.ts.map +1 -1
  6. package/dist/document-amendment-store.js +217 -102
  7. package/dist/document-amendment-store.js.map +1 -1
  8. package/dist/document-delivery-transport.d.ts +41 -52
  9. package/dist/document-delivery-transport.d.ts.map +1 -1
  10. package/dist/document-delivery-transport.js +6 -156
  11. package/dist/document-delivery-transport.js.map +1 -1
  12. package/dist/document-frame-router.d.ts +13 -17
  13. package/dist/document-frame-router.d.ts.map +1 -1
  14. package/dist/document-frame-router.js +21 -93
  15. package/dist/document-frame-router.js.map +1 -1
  16. package/dist/document-handlers.d.ts +1 -1
  17. package/dist/document-handlers.d.ts.map +1 -1
  18. package/dist/document-handlers.js +471 -466
  19. package/dist/document-handlers.js.map +1 -1
  20. package/dist/document-handshake.d.ts +4 -1
  21. package/dist/document-handshake.d.ts.map +1 -1
  22. package/dist/document-handshake.js +3 -1
  23. package/dist/document-handshake.js.map +1 -1
  24. package/dist/document-inbound.d.ts +18 -5
  25. package/dist/document-inbound.d.ts.map +1 -1
  26. package/dist/document-inbound.js +94 -110
  27. package/dist/document-inbound.js.map +1 -1
  28. package/dist/document-layer.d.ts +28 -67
  29. package/dist/document-layer.d.ts.map +1 -1
  30. package/dist/document-layer.js +670 -565
  31. package/dist/document-layer.js.map +1 -1
  32. package/dist/document-lifecycle.d.ts +11 -157
  33. package/dist/document-lifecycle.d.ts.map +1 -1
  34. package/dist/document-lifecycle.js +26 -561
  35. package/dist/document-lifecycle.js.map +1 -1
  36. package/dist/document-publish.d.ts +13 -0
  37. package/dist/document-publish.d.ts.map +1 -1
  38. package/dist/document-publish.js +19 -11
  39. package/dist/document-publish.js.map +1 -1
  40. package/dist/document-reconcile-engine.d.ts +66 -0
  41. package/dist/document-reconcile-engine.d.ts.map +1 -0
  42. package/dist/document-reconcile-engine.js +225 -0
  43. package/dist/document-reconcile-engine.js.map +1 -0
  44. package/dist/document-reconcile-scheduler.d.ts +91 -0
  45. package/dist/document-reconcile-scheduler.d.ts.map +1 -0
  46. package/dist/document-reconcile-scheduler.js +153 -0
  47. package/dist/document-reconcile-scheduler.js.map +1 -0
  48. package/dist/document-rejection.d.ts +2 -0
  49. package/dist/document-rejection.d.ts.map +1 -1
  50. package/dist/document-rejection.js +5 -1
  51. package/dist/document-rejection.js.map +1 -1
  52. package/dist/document-store.d.ts +18 -220
  53. package/dist/document-store.d.ts.map +1 -1
  54. package/dist/document-store.js +95 -717
  55. package/dist/document-store.js.map +1 -1
  56. package/dist/initiate-session-handler.d.ts +5 -0
  57. package/dist/initiate-session-handler.d.ts.map +1 -1
  58. package/dist/initiate-session-handler.js +1 -0
  59. package/dist/initiate-session-handler.js.map +1 -1
  60. package/package.json +5 -5
  61. package/dist/delivery-sweep-bound.d.ts +0 -79
  62. package/dist/delivery-sweep-bound.d.ts.map +0 -1
  63. package/dist/delivery-sweep-bound.js +0 -109
  64. package/dist/delivery-sweep-bound.js.map +0 -1
  65. package/dist/document-ack-inbound.d.ts +0 -71
  66. package/dist/document-ack-inbound.d.ts.map +0 -1
  67. package/dist/document-ack-inbound.js +0 -210
  68. package/dist/document-ack-inbound.js.map +0 -1
  69. package/dist/document-control-notifier.d.ts +0 -107
  70. package/dist/document-control-notifier.d.ts.map +0 -1
  71. package/dist/document-control-notifier.js +0 -137
  72. package/dist/document-control-notifier.js.map +0 -1
  73. package/dist/document-delivery.d.ts +0 -229
  74. package/dist/document-delivery.d.ts.map +0 -1
  75. package/dist/document-delivery.js +0 -449
  76. package/dist/document-delivery.js.map +0 -1
  77. package/dist/document-join-store.d.ts +0 -80
  78. package/dist/document-join-store.d.ts.map +0 -1
  79. package/dist/document-join-store.js +0 -197
  80. package/dist/document-join-store.js.map +0 -1
@@ -1,197 +0,0 @@
1
- /**
2
- * DOD-MP-JOIN-1 (daemon half) — the join-offer store: pending consent, both roles, settle-once.
3
- *
4
- * One table for both sides of a join (the `document_proposals` precedent): the INVITEE holds the
5
- * offer they received — as RECEIVED BYTES, validated before recording — and the INVITER holds the
6
- * offer they authored plus the invitee's signed answer when it arrives. Keyed on
7
- * `(owner, amendment_hash)`: the admitting amendment is the fact being consented to, and a
8
- * re-invitation after a refusal is a new amendment with a new hash — a new row, never a
9
- * reopened one.
10
- *
11
- * A refused-at-arrival offer (bad chain, wrong invitee, version mismatch) is RECORDED refused
12
- * with its reason rather than dropped — a dropped offer is indistinguishable from an inviter who
13
- * never sent one.
14
- */
15
- import { decodeDocumentJoinOffer, decodeDocumentJoinAnswer, buildDocumentJoinAnswerTbs, } from "@cello-protocol/protocol-types";
16
- const CREATE_SQL = `
17
- CREATE TABLE IF NOT EXISTS document_join_offers (
18
- owner_agent_id TEXT NOT NULL,
19
- document_id TEXT NOT NULL,
20
- amendment_hash TEXT NOT NULL,
21
- role TEXT NOT NULL,
22
- inviter_agent_id TEXT NOT NULL,
23
- invitee_agent_id TEXT NOT NULL,
24
- received_bytes BLOB NOT NULL,
25
- state TEXT NOT NULL,
26
- reason TEXT,
27
- answer_bytes BLOB,
28
- created_at INTEGER NOT NULL,
29
- decided_at INTEGER,
30
- PRIMARY KEY (owner_agent_id, amendment_hash)
31
- );
32
- `;
33
- export class DocumentJoinStore {
34
- #db;
35
- #logger;
36
- constructor(db, logger) {
37
- this.#db = db;
38
- this.#logger = logger;
39
- this.#db.exec(CREATE_SQL);
40
- }
41
- /**
42
- * Record an ARRIVING offer under the invitee's key — already validated by the caller; a
43
- * validation refusal is recorded as `refused` with its reason, never dropped. First arrival's
44
- * bytes are the permanent record; a redelivery changes nothing.
45
- */
46
- recordIncoming(ownerAgentId, wire, amendmentHash, verdict, nowMs) {
47
- const offer = decodeDocumentJoinOffer(wire);
48
- this.#db
49
- .prepare(`INSERT INTO document_join_offers
50
- (owner_agent_id, document_id, amendment_hash, role, inviter_agent_id, invitee_agent_id,
51
- received_bytes, state, reason, created_at, decided_at)
52
- VALUES (?, ?, ?, 'invitee', ?, ?, ?, ?, ?, ?, ?)
53
- ON CONFLICT (owner_agent_id, amendment_hash) DO NOTHING`)
54
- .run(ownerAgentId, offer.document_id, amendmentHash, offer.inviter_agent_id, offer.invitee_agent_id, Buffer.from(wire), verdict.state, verdict.state === "refused" ? verdict.reason : null, nowMs, verdict.state === "refused" ? nowMs : null);
55
- // Read back — on a redelivery the INSERT did nothing and the operator's earlier decision
56
- // stands; reporting our intended state would announce a decided offer as pending.
57
- const stored = this.get(ownerAgentId, amendmentHash);
58
- const state = stored?.state ?? verdict.state;
59
- const reason = stored?.reason ?? (verdict.state === "refused" ? verdict.reason : undefined);
60
- this.#logger.info("document.join.offer_recorded", {
61
- documentId: offer.document_id,
62
- amendmentHash,
63
- state,
64
- });
65
- return { state, ...(reason ? { reason } : {}) };
66
- }
67
- /** Record an offer WE authored, pending the invitee's answer. */
68
- recordOutgoing(ownerAgentId, wire, amendmentHash, nowMs) {
69
- const offer = decodeDocumentJoinOffer(wire);
70
- this.#db
71
- .prepare(`INSERT INTO document_join_offers
72
- (owner_agent_id, document_id, amendment_hash, role, inviter_agent_id, invitee_agent_id,
73
- received_bytes, state, reason, created_at, decided_at)
74
- VALUES (?, ?, ?, 'inviter', ?, ?, ?, 'pending', NULL, ?, NULL)
75
- ON CONFLICT (owner_agent_id, amendment_hash) DO NOTHING`)
76
- .run(ownerAgentId, offer.document_id, amendmentHash, offer.inviter_agent_id, offer.invitee_agent_id, Buffer.from(wire), nowMs);
77
- }
78
- /**
79
- * The INVITEE's local decision. Settle-once: only a pending row decides, and the caller learns
80
- * whether THIS call decided it — an already-decided offer is a fact to report, not an error.
81
- */
82
- decide(ownerAgentId, amendmentHash, accepted, reason, nowMs) {
83
- const r = this.#db
84
- .prepare(`UPDATE document_join_offers
85
- SET state = ?, reason = ?, decided_at = ?
86
- WHERE owner_agent_id = ? AND amendment_hash = ? AND role = 'invitee' AND state = 'pending'`)
87
- .run(accepted ? "accepted" : "refused", reason, nowMs, ownerAgentId, amendmentHash);
88
- const stored = this.get(ownerAgentId, amendmentHash);
89
- return { decided: (r.changes ?? 0) > 0, state: stored?.state ?? "pending" };
90
- }
91
- /**
92
- * Record the invitee's signed ANSWER on the inviter's side. The caller verifies the signature
93
- * against the invitee named in the STORED offer first. Settle-once: a contradicting second
94
- * answer is refused with both records retained (the stored answer stands).
95
- */
96
- recordAnswer(ownerAgentId, wire, verify, nowMs) {
97
- const answer = decodeDocumentJoinAnswer(wire);
98
- const stored = this.get(ownerAgentId, answer.amendment_hash);
99
- if (!stored || stored.role !== "inviter") {
100
- return {
101
- ok: false,
102
- reason: `join_answer_unknown_offer: no offer of ours is settled by amendment ` +
103
- `${answer.amendment_hash.slice(0, 16)}…`,
104
- };
105
- }
106
- if (answer.invitee_agent_id !== stored.inviteeAgentId) {
107
- return {
108
- ok: false,
109
- reason: `join_answer_wrong_invitee: the answer names ${answer.invitee_agent_id} and the ` +
110
- `offer invited ${stored.inviteeAgentId}`,
111
- };
112
- }
113
- if (!verify(stored.inviteeAgentId, buildDocumentJoinAnswerTbs(answer), answer.signature)) {
114
- return {
115
- ok: false,
116
- reason: `join_answer_signature_invalid: the answer does not verify against the invitee ` +
117
- `${stored.inviteeAgentId}`,
118
- };
119
- }
120
- if (stored.state !== "pending") {
121
- const contradicts = (stored.state === "accepted") !== answer.accepted;
122
- if (contradicts) {
123
- this.#logger.error("document.join.answer_contradiction", {
124
- documentId: stored.documentId,
125
- amendmentHash: answer.amendment_hash,
126
- stored: stored.state,
127
- arriving: answer.accepted ? "accepted" : "refused",
128
- });
129
- return {
130
- ok: false,
131
- reason: "join_answer_contradiction: this offer was already settled with the opposite answer — " +
132
- "settle once; both signed answers are retained in the log",
133
- };
134
- }
135
- return { ok: true, answer, settled: false };
136
- }
137
- this.#db
138
- .prepare(`UPDATE document_join_offers
139
- SET state = ?, reason = ?, answer_bytes = ?, decided_at = ?
140
- WHERE owner_agent_id = ? AND amendment_hash = ? AND state = 'pending'`)
141
- .run(answer.accepted ? "accepted" : "refused", answer.refusal_reason, Buffer.from(wire), nowMs, ownerAgentId, answer.amendment_hash);
142
- this.#logger.info("document.join.answer_recorded", {
143
- documentId: stored.documentId,
144
- amendmentHash: answer.amendment_hash,
145
- accepted: answer.accepted,
146
- });
147
- return { ok: true, answer, settled: true };
148
- }
149
- get(ownerAgentId, amendmentHash) {
150
- const r = this.#db
151
- .prepare(`SELECT * FROM document_join_offers WHERE owner_agent_id = ? AND amendment_hash = ?`)
152
- .get(ownerAgentId, amendmentHash);
153
- return r ? rowToRecord(r) : null;
154
- }
155
- /** Auto-refused arrivals — surfaced so the refusal sentence reaches an operator. */
156
- refusedFor(ownerAgentId) {
157
- const rows = this.#db
158
- .prepare(`SELECT * FROM document_join_offers
159
- WHERE owner_agent_id = ? AND role = 'invitee' AND state = 'refused'
160
- ORDER BY created_at ASC`)
161
- .all(ownerAgentId);
162
- return rows.map(rowToRecord);
163
- }
164
- /** Offers THIS owner authored — the inviter's view of who has answered what. */
165
- outgoingFor(ownerAgentId) {
166
- const rows = this.#db
167
- .prepare(`SELECT * FROM document_join_offers
168
- WHERE owner_agent_id = ? AND role = 'inviter'
169
- ORDER BY created_at ASC`)
170
- .all(ownerAgentId);
171
- return rows.map(rowToRecord);
172
- }
173
- /** Offers awaiting THIS owner's consent — the inbox surface. */
174
- pendingFor(ownerAgentId) {
175
- const rows = this.#db
176
- .prepare(`SELECT * FROM document_join_offers
177
- WHERE owner_agent_id = ? AND role = 'invitee' AND state = 'pending'
178
- ORDER BY created_at ASC`)
179
- .all(ownerAgentId);
180
- return rows.map(rowToRecord);
181
- }
182
- }
183
- function rowToRecord(r) {
184
- return {
185
- documentId: r["document_id"],
186
- amendmentHash: r["amendment_hash"],
187
- role: r["role"],
188
- inviterAgentId: r["inviter_agent_id"],
189
- inviteeAgentId: r["invitee_agent_id"],
190
- offer: decodeDocumentJoinOffer(new Uint8Array(r["received_bytes"])),
191
- state: r["state"],
192
- reason: r["reason"] ?? null,
193
- createdAtMs: r["created_at"],
194
- decidedAtMs: r["decided_at"] ?? null,
195
- };
196
- }
197
- //# sourceMappingURL=document-join-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-join-store.js","sourceRoot":"","sources":["../src/document-join-store.ts"],"names":[],"mappings":"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"}