@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.
- package/dist/content-park.d.ts +1 -1
- package/dist/content-park.d.ts.map +1 -1
- package/dist/content-park.js +64 -12
- package/dist/content-park.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +46 -32
- package/dist/daemon.js.map +1 -1
- package/dist/document-delivery-transport.d.ts +78 -0
- package/dist/document-delivery-transport.d.ts.map +1 -0
- package/dist/document-delivery-transport.js +109 -0
- package/dist/document-delivery-transport.js.map +1 -0
- package/dist/document-delivery.d.ts +130 -0
- package/dist/document-delivery.d.ts.map +1 -0
- package/dist/document-delivery.js +246 -0
- package/dist/document-delivery.js.map +1 -0
- package/dist/document-engine.d.ts +134 -0
- package/dist/document-engine.d.ts.map +1 -0
- package/dist/document-engine.js +281 -0
- package/dist/document-engine.js.map +1 -0
- package/dist/document-gate.d.ts +139 -0
- package/dist/document-gate.d.ts.map +1 -0
- package/dist/document-gate.js +465 -0
- package/dist/document-gate.js.map +1 -0
- package/dist/document-handshake.d.ts +88 -0
- package/dist/document-handshake.d.ts.map +1 -0
- package/dist/document-handshake.js +239 -0
- package/dist/document-handshake.js.map +1 -0
- package/dist/document-lifecycle.d.ts +104 -0
- package/dist/document-lifecycle.d.ts.map +1 -0
- package/dist/document-lifecycle.js +363 -0
- package/dist/document-lifecycle.js.map +1 -0
- package/dist/document-notify.d.ts +130 -0
- package/dist/document-notify.d.ts.map +1 -0
- package/dist/document-notify.js +313 -0
- package/dist/document-notify.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 +72 -0
- package/dist/document-reachability.js.map +1 -0
- package/dist/document-rejection.d.ts +224 -0
- package/dist/document-rejection.d.ts.map +1 -0
- package/dist/document-rejection.js +374 -0
- package/dist/document-rejection.js.map +1 -0
- package/dist/document-store.d.ts +269 -0
- package/dist/document-store.d.ts.map +1 -0
- package/dist/document-store.js +752 -0
- package/dist/document-store.js.map +1 -0
- package/dist/document-write-path.d.ts +84 -0
- package/dist/document-write-path.d.ts.map +1 -0
- package/dist/document-write-path.js +412 -0
- package/dist/document-write-path.js.map +1 -0
- package/dist/line-lcs.d.ts +51 -0
- package/dist/line-lcs.d.ts.map +1 -0
- package/dist/line-lcs.js +71 -0
- package/dist/line-lcs.js.map +1 -0
- package/dist/reconnect-drain.d.ts +15 -0
- package/dist/reconnect-drain.d.ts.map +1 -0
- package/dist/reconnect-drain.js +51 -0
- package/dist/reconnect-drain.js.map +1 -0
- package/dist/session-node-manager.d.ts +39 -0
- package/dist/session-node-manager.d.ts.map +1 -1
- package/dist/session-node-manager.js +152 -12
- package/dist/session-node-manager.js.map +1 -1
- package/dist/session-relay-client.d.ts +2 -0
- package/dist/session-relay-client.d.ts.map +1 -1
- package/dist/session-relay-client.js +16 -1
- package/dist/session-relay-client.js.map +1 -1
- 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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"}
|