@cello-protocol/daemon 0.0.120 → 0.0.122

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 (68) hide show
  1. package/dist/content-park.d.ts +1 -1
  2. package/dist/content-park.d.ts.map +1 -1
  3. package/dist/content-park.js +64 -12
  4. package/dist/content-park.js.map +1 -1
  5. package/dist/daemon.d.ts.map +1 -1
  6. package/dist/daemon.js +46 -32
  7. package/dist/daemon.js.map +1 -1
  8. package/dist/document-delivery-transport.d.ts +78 -0
  9. package/dist/document-delivery-transport.d.ts.map +1 -0
  10. package/dist/document-delivery-transport.js +109 -0
  11. package/dist/document-delivery-transport.js.map +1 -0
  12. package/dist/document-delivery.d.ts +130 -0
  13. package/dist/document-delivery.d.ts.map +1 -0
  14. package/dist/document-delivery.js +246 -0
  15. package/dist/document-delivery.js.map +1 -0
  16. package/dist/document-engine.d.ts +134 -0
  17. package/dist/document-engine.d.ts.map +1 -0
  18. package/dist/document-engine.js +281 -0
  19. package/dist/document-engine.js.map +1 -0
  20. package/dist/document-gate.d.ts +139 -0
  21. package/dist/document-gate.d.ts.map +1 -0
  22. package/dist/document-gate.js +465 -0
  23. package/dist/document-gate.js.map +1 -0
  24. package/dist/document-handshake.d.ts +88 -0
  25. package/dist/document-handshake.d.ts.map +1 -0
  26. package/dist/document-handshake.js +239 -0
  27. package/dist/document-handshake.js.map +1 -0
  28. package/dist/document-lifecycle.d.ts +104 -0
  29. package/dist/document-lifecycle.d.ts.map +1 -0
  30. package/dist/document-lifecycle.js +363 -0
  31. package/dist/document-lifecycle.js.map +1 -0
  32. package/dist/document-notify.d.ts +130 -0
  33. package/dist/document-notify.d.ts.map +1 -0
  34. package/dist/document-notify.js +313 -0
  35. package/dist/document-notify.js.map +1 -0
  36. package/dist/document-reachability.d.ts +42 -0
  37. package/dist/document-reachability.d.ts.map +1 -0
  38. package/dist/document-reachability.js +72 -0
  39. package/dist/document-reachability.js.map +1 -0
  40. package/dist/document-rejection.d.ts +224 -0
  41. package/dist/document-rejection.d.ts.map +1 -0
  42. package/dist/document-rejection.js +374 -0
  43. package/dist/document-rejection.js.map +1 -0
  44. package/dist/document-store.d.ts +269 -0
  45. package/dist/document-store.d.ts.map +1 -0
  46. package/dist/document-store.js +752 -0
  47. package/dist/document-store.js.map +1 -0
  48. package/dist/document-write-path.d.ts +84 -0
  49. package/dist/document-write-path.d.ts.map +1 -0
  50. package/dist/document-write-path.js +412 -0
  51. package/dist/document-write-path.js.map +1 -0
  52. package/dist/line-lcs.d.ts +51 -0
  53. package/dist/line-lcs.d.ts.map +1 -0
  54. package/dist/line-lcs.js +71 -0
  55. package/dist/line-lcs.js.map +1 -0
  56. package/dist/reconnect-drain.d.ts +15 -0
  57. package/dist/reconnect-drain.d.ts.map +1 -0
  58. package/dist/reconnect-drain.js +51 -0
  59. package/dist/reconnect-drain.js.map +1 -0
  60. package/dist/session-node-manager.d.ts +39 -0
  61. package/dist/session-node-manager.d.ts.map +1 -1
  62. package/dist/session-node-manager.js +152 -12
  63. package/dist/session-node-manager.js.map +1 -1
  64. package/dist/session-relay-client.d.ts +2 -0
  65. package/dist/session-relay-client.d.ts.map +1 -1
  66. package/dist/session-relay-client.js +16 -1
  67. package/dist/session-relay-client.js.map +1 -1
  68. package/package.json +6 -5
@@ -0,0 +1,269 @@
1
+ /**
2
+ * DOD-DOC-STORE-1 — the daemon's three document tables (§16.7-12).
3
+ *
4
+ * TWO LAYERS, NOT ONE (§14). Storing only a merged Yjs binary would discard the signed envelope
5
+ * chain that makes a seal verifiable, so both are kept:
6
+ *
7
+ * `document_envelopes` — the IMMUTABLE log: signatures, provenance, the per-document chain.
8
+ * This is the truth.
9
+ * `document_snapshots` — a MATERIALIZATION for fast start. Disposable by construction:
10
+ * delete it and it rebuilds from the log, byte-identical.
11
+ *
12
+ * The distinction is load-bearing rather than stylistic. Live Yjs state deliberately does NOT
13
+ * survive a daemon restart — CELLO's invariant is daemon-up-is-CELLO-on — and that is only safe
14
+ * because the log makes rebuilding a lookup rather than an archaeology exercise.
15
+ *
16
+ * THIS MODULE PERSISTS; IT DOES NOT APPLY. Replay is INJECTED (`rebuildSnapshot`), so the store
17
+ * owns *what to replay and in what order* while the engine (DOD-DOC-ENGINE-1) owns *how to
18
+ * apply*. That keeps `yjs` out of this file's imports entirely and keeps the P0/P1 boundary
19
+ * honest — a store that quietly grew a Y.Doc would be the engine wearing a store's name.
20
+ *
21
+ * WHAT IS NEVER STORED HERE: a Yjs clientID. §14's one-line rule is "let Yjs mint its own per
22
+ * live Y.Doc; never derive it from agent identity, never persist and restore one." DOD-DOC-FUZZ-1
23
+ * measured the cost of getting this wrong — two live docs sharing a clientID means the colliding
24
+ * writer silently wins, the honest client's update is accepted-and-dropped, and the result is a
25
+ * splice of two authors with an EMPTY pending set and no error on any path. So the snapshot
26
+ * stores a binary and a state vector, and nothing that could be restored into a live document as
27
+ * an identity.
28
+ *
29
+ * KEYED ON STABLE IDS ONLY. `agent_id` and `document_id`, never `agent_name` — it is a mutable
30
+ * display label and reusable after retirement. The M7 session tables join on `agent_name`; that
31
+ * is a known defect (`DOD-AGENT-ID-JOINKEY-1`), not a precedent to copy.
32
+ */
33
+ import type { DaemonDatabase } from "./sqlcipher-db.js";
34
+ import type { Logger } from "./types.js";
35
+ /** Lifecycle states a document can hold (§3.5). `stalled` is DOD-DOC-REJECT-1's terminal state. */
36
+ export type DocumentStatus = "active" | "closed" | "killed" | "stalled";
37
+ /**
38
+ * What an envelope IS, as opposed to what it says. A withdrawal or a rejection is a NEW ROW that
39
+ * references an earlier envelope — never an edit to it. The log is append-only, so the only way
40
+ * to say "that one no longer counts" is to add a record saying so.
41
+ */
42
+ export type DocumentEnvelopeKind = "update" | "withdrawal" | "rejection";
43
+ export interface DocumentProperties {
44
+ /** V1 accepts only `authenticated` — the Tier-2 seam (§16.1). */
45
+ assurance_tier?: string;
46
+ /** V1 accepts only `false` — the Tier-2 seam (§16.1). */
47
+ schema_enforcement?: boolean;
48
+ append_only?: boolean;
49
+ [key: string]: unknown;
50
+ }
51
+ export interface DocumentRow {
52
+ documentId: string;
53
+ ownerAgentId: string;
54
+ peerAgentId: string;
55
+ documentType: string;
56
+ properties: DocumentProperties;
57
+ status: DocumentStatus;
58
+ createdAtMs: number;
59
+ }
60
+ export interface DocumentEnvelopeRow {
61
+ /** Content hash of the envelope — the stable identity, and the log's primary key. */
62
+ envelopeHash: string;
63
+ documentId: string;
64
+ /** WHO authored it. The chain is per-sender, so this is what partitions it. */
65
+ senderAgentId: string;
66
+ /** The sender's previous envelope for this document, or null at genesis (§9.1). */
67
+ docPrevHash: string | null;
68
+ /** Constant 0 in V1 and NEVER omitted — after a compaction an update that does not state its
69
+ * epoch cannot be verified unambiguously (§14, §16.1 seam). */
70
+ epochId: number;
71
+ signature: Uint8Array;
72
+ /** The sender's Yjs state vector at publish time (§7). */
73
+ stateVector: Uint8Array;
74
+ /** NULLABLE — a purged envelope keeps its hash and signature, proving it existed (§16.7-12). */
75
+ payload: Uint8Array | null;
76
+ kind: DocumentEnvelopeKind;
77
+ /** For a withdrawal or rejection: the envelope it concerns. */
78
+ referencesEnvelopeHash?: string | null;
79
+ createdAtMs: number;
80
+ /** Position in this document's log. Assigned on append; absent until then. */
81
+ logIndex?: number;
82
+ /** DELIVERY bookkeeping, read back from the log. Absent on a row being appended. */
83
+ deliveredAtMs?: number | null;
84
+ ackedAtMs?: number | null;
85
+ attempts?: number;
86
+ nextAttemptAtMs?: number | null;
87
+ }
88
+ export interface QuarantineRow {
89
+ documentId: string;
90
+ /** The 0x05 leaf this row belongs to — the PK. One leaf, one row; see the table comment. */
91
+ rejectionEnvelopeHash: string;
92
+ rejectedEnvelopeHash: string;
93
+ /** The refused envelope's own author and chain link, so the chain verifier can bridge it. */
94
+ rejectedSenderAgentId: string;
95
+ rejectedDocPrevHash: string | null;
96
+ payload: Uint8Array;
97
+ reason: string;
98
+ detail?: string;
99
+ /** Which pluggable rule refused, when one did — the gate produces this and it must not be lost. */
100
+ rule?: string;
101
+ limitName?: string;
102
+ limitValue?: number;
103
+ limitActual?: number;
104
+ createdAtMs: number;
105
+ }
106
+ export interface DocumentSnapshot {
107
+ binary: Uint8Array;
108
+ stateVector: Uint8Array;
109
+ /**
110
+ * The `log_index` of the last envelope this snapshot reflects. §14 is explicit about why it is
111
+ * stored rather than derived: with it, "where does the snapshot sit relative to the log" is a
112
+ * lookup; without it, every rebuild works it out from scratch.
113
+ *
114
+ * **-1 means nothing has been applied.** The resume point is ALWAYS `lastAppliedIndex + 1`,
115
+ * so an empty log yields 0 and `getEnvelopesSince(0)` reads the whole log — the sentinel and
116
+ * the convention are chosen to agree.
117
+ */
118
+ lastAppliedIndex: number;
119
+ }
120
+ /** Thrown when a read path refuses to materialize over a chain that does not verify. */
121
+ export declare class DocumentChainError extends Error {
122
+ readonly reason: "document_chain_broken" | "document_chain_forked";
123
+ readonly detail: string;
124
+ constructor(reason: "document_chain_broken" | "document_chain_forked", detail: string);
125
+ }
126
+ export type ChainVerdict = {
127
+ ok: true;
128
+ } | {
129
+ ok: false;
130
+ reason: "document_chain_broken" | "document_chain_forked";
131
+ detail: string;
132
+ };
133
+ /**
134
+ * Injected by the engine: fold an ordered envelope list into a materialized state.
135
+ *
136
+ * Takes ROWS, not bare payloads. The engine has to distinguish an update from a withdrawal or a
137
+ * rejection to fold correctly — a withdrawn envelope's payload must not be applied — and it
138
+ * cannot do that from `Uint8Array[]`. The store supplies the WHOLE log in order — withdrawal and
139
+ * rejection records included, payload-free though they are; deciding what counts is the engine's
140
+ * call, not the store's.
141
+ */
142
+ export type ReplayFn = (envelopes: DocumentEnvelopeRow[]) => {
143
+ binary: Uint8Array;
144
+ stateVector: Uint8Array;
145
+ };
146
+ export declare class DocumentStore {
147
+ #private;
148
+ /**
149
+ * The underlying handle, for modules that own their OWN tables alongside this one
150
+ * (DocumentLifecycle). Deliberately not a licence to query this store's tables from outside —
151
+ * every one of them has a method here, and a second query path is a second set of rules about
152
+ * scoping that nobody remembers to keep in step.
153
+ */
154
+ get rawDb(): DaemonDatabase;
155
+ constructor(db: DaemonDatabase, logger: Logger);
156
+ createDocument(row: DocumentRow): void;
157
+ getDocument(ownerAgentId: string, documentId: string): DocumentRow | null;
158
+ listDocuments(ownerAgentId: string): DocumentRow[];
159
+ setDocumentStatus(ownerAgentId: string, documentId: string, status: DocumentStatus): void;
160
+ /**
161
+ * Append an envelope at the next log position.
162
+ *
163
+ * IMMUTABLE AT A HASH: the conflict clause is scoped to the envelope hash ALONE, so a
164
+ * re-delivery — or a peer replaying the same hash with different bytes — cannot overwrite what
165
+ * was recorded. Returns whether a new row was written, so the caller can tell a genuine append
166
+ * from a duplicate rather than inferring it.
167
+ *
168
+ * Scoped deliberately, not written as a bare `OR IGNORE`: that form suppresses CHECK, UNIQUE
169
+ * and NOT NULL as well, which on an append-only log means a malformed `kind` or a colliding
170
+ * `log_index` would be DROPPED and reported to the caller as an already-seen duplicate. Every
171
+ * constraint except the hash conflict must throw, or `false` means three different things the
172
+ * caller cannot tell apart.
173
+ */
174
+ appendEnvelope(ownerAgentId: string, envelope: DocumentEnvelopeRow): boolean;
175
+ /**
176
+ * Envelopes at or after `fromIndex`, in log order. This is what makes `lastAppliedIndex` the
177
+ * lookup §14 asks for: resume an incremental rebuild at `lastAppliedIndex + 1` without reading
178
+ * the whole log.
179
+ */
180
+ getEnvelopesSince(ownerAgentId: string, documentId: string, fromIndex: number): DocumentEnvelopeRow[];
181
+ getEnvelopeLog(ownerAgentId: string, documentId: string): DocumentEnvelopeRow[];
182
+ /**
183
+ * Verify each sender's `doc_prev_hash` chain independently.
184
+ *
185
+ * The log interleaves both parties' envelopes, so there is no single total order to check —
186
+ * §16.7-5 defines replay set-based per epoch for exactly this reason. What must hold is that
187
+ * every sender's own links form one unbroken chain from a single genesis.
188
+ *
189
+ * A break REFUSES and names the sender and the missing predecessor. Skipping the leaf and
190
+ * carrying on would leave a document that reads as complete while missing operations, which is
191
+ * the silent-divergence failure the chain exists to prevent.
192
+ *
193
+ * LINKAGE ONLY — the name says so deliberately. This verifies no signature and does not check
194
+ * that `envelope_hash` hashes the content; neither is possible here (no key, no encoder). A
195
+ * caller must not read `ok: true` as authenticity — that belongs to the engine.
196
+ */
197
+ verifyChainLinkage(ownerAgentId: string, documentId: string): ChainVerdict;
198
+ /**
199
+ * Hold a refused update's bytes. Idempotent per REJECTION (per 0x05 leaf), not per refused
200
+ * envelope — one envelope may be refused across several retry rounds and each round's reason,
201
+ * rule and limit are distinct facts an operator needs.
202
+ *
203
+ * Returns whether a row was written, so a caller never has to infer it. The previous signature
204
+ * returned void and the conflict clause silently dropped every round after the first.
205
+ */
206
+ holdQuarantined(ownerAgentId: string, row: QuarantineRow): boolean;
207
+ listQuarantined(ownerAgentId: string, documentId: string): QuarantineRow[];
208
+ /**
209
+ * Release every entry for a refused envelope once its superseding update has been admitted.
210
+ * Returns whether anything was released. Keyed by the REFUSED envelope rather than the rejection
211
+ * leaf, because admitting the supersession resolves all of that envelope's rounds at once.
212
+ */
213
+ releaseQuarantined(ownerAgentId: string, documentId: string, rejectedEnvelopeHash: string): boolean;
214
+ /** The rejecting agent's most recent envelope for this document, for chain linkage. */
215
+ lastEnvelopeHashBySender(ownerAgentId: string, documentId: string, senderAgentId: string): string | null;
216
+ /**
217
+ * Envelopes this agent authored that the peer has not acknowledged, and whose next attempt is
218
+ * due. DERIVED — there is no queue. Survives a restart because the log does.
219
+ *
220
+ * Scoped to `senderAgentId = ownerAgentId`: an envelope we RECEIVED is not ours to deliver, and
221
+ * without the scope a receiver would helpfully re-send the sender's own updates back at it.
222
+ */
223
+ pendingDeliveries(ownerAgentId: string, nowMs: number, limit?: number): DocumentEnvelopeRow[];
224
+ /** Mark an attempt: bumps the counter and schedules the next one. Returns the new count. */
225
+ recordDeliveryAttempt(ownerAgentId: string, documentId: string, envelopeHash: string, nextAttemptAtMs: number): number;
226
+ /** Record that the envelope left. Not an ack — the peer has not answered yet. */
227
+ markDelivered(ownerAgentId: string, documentId: string, envelopeHash: string, nowMs: number): boolean;
228
+ /** Record that the peer acknowledged. Idempotent — a redelivered ack must not move the clock. */
229
+ markAcked(ownerAgentId: string, documentId: string, envelopeHash: string, nowMs: number): boolean;
230
+ /** Record a rejection the PEER sent us. Returns whether a row was written (idempotent by leaf). */
231
+ recordRejectionReceived(ownerAgentId: string, row: {
232
+ documentId: string;
233
+ rejectionEnvelopeHash: string;
234
+ rejectedEnvelopeHash: string;
235
+ fromAgentId: string;
236
+ reason: string;
237
+ detail?: string;
238
+ createdAtMs: number;
239
+ }): boolean;
240
+ /** How many rejections this document has RECEIVED — the publishing side's retry round. */
241
+ countRejectionsReceived(ownerAgentId: string, documentId: string): number;
242
+ /** The most recently received rejection, for the reason an operator is shown on a stall. */
243
+ latestRejectionReceived(ownerAgentId: string, documentId: string): {
244
+ reason: string;
245
+ detail?: string;
246
+ fromAgentId: string;
247
+ } | null;
248
+ /**
249
+ * How many rejection records this document carries, PER REJECTING AGENT — the retry round.
250
+ *
251
+ * Scoped by author, because a mutual exchange puts both directions' 0x05 leaves in one document
252
+ * log. Counting across senders conflated them, so two peers each rejecting once read as round 2
253
+ * and the document stalled at half the intended rounds.
254
+ */
255
+ countRejections(ownerAgentId: string, documentId: string, rejectingAgentId: string): number;
256
+ getSnapshot(ownerAgentId: string, documentId: string): DocumentSnapshot | null;
257
+ /** REPLACES — a snapshot is a cache of the log, not a second log. */
258
+ putSnapshot(ownerAgentId: string, documentId: string, snapshot: DocumentSnapshot): void;
259
+ deleteSnapshot(ownerAgentId: string, documentId: string): void;
260
+ /**
261
+ * Rebuild a snapshot from the envelope log alone, using the caller's replay function.
262
+ *
263
+ * Payload-stripped envelopes (purged, or withdrawal/rejection records that carry none)
264
+ * contribute nothing to replay but STILL COUNT toward `lastAppliedIndex` — otherwise the next
265
+ * incremental rebuild would start behind them and replay them forever.
266
+ */
267
+ rebuildSnapshot(ownerAgentId: string, documentId: string, replay: ReplayFn): DocumentSnapshot;
268
+ }
269
+ //# sourceMappingURL=document-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-store.d.ts","sourceRoot":"","sources":["../src/document-store.ts"],"names":[],"mappings":"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"}