@cello-protocol/client 0.0.3 → 0.0.4

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.
@@ -0,0 +1,402 @@
1
+ /**
2
+ * CELLO-PERSIST-024 — Client State Persistence Layer
3
+ *
4
+ * Provides structured DB operations for persisting and loading client state
5
+ * using the V2 SQLCipher schema. All methods operate on the structured tables
6
+ * (not the deprecated client_store KV table).
7
+ *
8
+ * Security invariants:
9
+ * SI-001: signing_share MUST NOT appear in any log event or error message.
10
+ * SI-002: secret_key_blob MUST NOT appear in any log event or error message.
11
+ * SI-003: db_key is never stored — derived at runtime from K_local via HKDF.
12
+ * SI-004: relay_ack_receipts is append-only (INSERT OR IGNORE).
13
+ */
14
+ /**
15
+ * Client state persistence layer.
16
+ *
17
+ * Provides type-safe methods for persisting and loading all durable state
18
+ * from the V2 structured SQLCipher schema.
19
+ */
20
+ export class ClientStatePersistence {
21
+ #store;
22
+ #agentPubkey;
23
+ #keyFilePath;
24
+ #logger;
25
+ constructor(opts) {
26
+ this.#store = opts.store;
27
+ this.#agentPubkey = opts.agentPubkey;
28
+ this.#keyFilePath = opts.keyFilePath;
29
+ this.#logger = opts.logger;
30
+ }
31
+ // ─── Agent registration ─────────────────────────────────────────────────────
32
+ /** Upsert the agent row (called on every startup). */
33
+ async upsertAgent() {
34
+ await this.#store.run(`INSERT INTO agents (pubkey, key_file_path, last_seen_at)
35
+ VALUES (?, ?, datetime('now'))
36
+ ON CONFLICT(pubkey) DO UPDATE SET last_seen_at = datetime('now')`, [this.#agentPubkey, this.#keyFilePath]);
37
+ }
38
+ // ─── FROST key shares ───────────────────────────────────────────────────────
39
+ /** Persist a FROST key share after DKG completes. */
40
+ async persistFrostKeyShare(opts) {
41
+ // Deactivate any existing active share
42
+ await this.#store.run(`UPDATE frost_key_shares SET is_active = 0 WHERE agent_pubkey = ? AND is_active = 1`, [this.#agentPubkey]);
43
+ // Insert the new active share
44
+ await this.#store.run(`INSERT OR REPLACE INTO frost_key_shares
45
+ (agent_pubkey, epoch_id, primary_pubkey, identifier, signing_share, threshold, participants,
46
+ commitments_cbor, verifying_shares_cbor, dkg_method, is_active, created_at)
47
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, datetime('now'))`, [
48
+ this.#agentPubkey, opts.epochId, opts.primaryPubkey, opts.identifier,
49
+ Buffer.from(opts.signingShare), opts.threshold, opts.participants,
50
+ Buffer.from(opts.commitmentsCbor), Buffer.from(opts.verifyingSharesCbor),
51
+ opts.dkgMethod,
52
+ ]);
53
+ // SI-001: signing_share MUST NOT appear in log
54
+ this.#logger.info("client.frost.share.persisted", {
55
+ agentPubkey: this.#agentPubkey,
56
+ epochId: opts.epochId,
57
+ threshold: opts.threshold,
58
+ participants: opts.participants,
59
+ dkgMethod: opts.dkgMethod,
60
+ });
61
+ }
62
+ /** Load the active FROST key share for this agent. */
63
+ async loadActiveFrostKeyShare() {
64
+ return this.#store.getRow(`SELECT * FROM frost_key_shares WHERE agent_pubkey = ? AND is_active = 1`, [this.#agentPubkey]);
65
+ }
66
+ // ─── ML-DSA keypairs ────────────────────────────────────────────────────────
67
+ /** Persist an ML-DSA keypair after registration. */
68
+ async persistMlDsaKeypair(opts) {
69
+ await this.#store.run(`INSERT OR REPLACE INTO ml_dsa_keypairs (agent_pubkey, ml_dsa_pubkey, secret_key_blob, created_at)
70
+ VALUES (?, ?, ?, datetime('now'))`, [this.#agentPubkey, opts.mlDsaPubkey, Buffer.from(opts.secretKeyBlob)]);
71
+ // SI-002: secret_key_blob MUST NOT appear in log
72
+ this.#logger.info("client.mldsa.keypair.persisted", {
73
+ agentPubkey: this.#agentPubkey,
74
+ mlDsaPubkey: opts.mlDsaPubkey,
75
+ });
76
+ }
77
+ /** Load the ML-DSA keypair for this agent. */
78
+ async loadMlDsaKeypair() {
79
+ return this.#store.getRow(`SELECT * FROM ml_dsa_keypairs WHERE agent_pubkey = ?`, [this.#agentPubkey]);
80
+ }
81
+ // ─── Registration state ─────────────────────────────────────────────────────
82
+ /** Persist registration state after successful register(). */
83
+ async persistRegistrationState(opts) {
84
+ await this.#store.run(`INSERT OR REPLACE INTO registration_state
85
+ (agent_pubkey, agent_id, primary_pubkey, ml_dsa_pubkey, registered_at, status, created_at)
86
+ VALUES (?, ?, ?, ?, ?, 'active', datetime('now'))`, [this.#agentPubkey, opts.agentId, opts.primaryPubkey, opts.mlDsaPubkey, opts.registeredAt]);
87
+ this.#logger.info("client.registration.persisted", {
88
+ agentPubkey: this.#agentPubkey,
89
+ agentId: opts.agentId,
90
+ primaryPubkey: opts.primaryPubkey,
91
+ });
92
+ }
93
+ /** Load registration state for this agent. */
94
+ async loadRegistrationState() {
95
+ return this.#store.getRow(`SELECT * FROM registration_state WHERE agent_pubkey = ?`, [this.#agentPubkey]);
96
+ }
97
+ // ─── Connections ────────────────────────────────────────────────────────────
98
+ /** Persist a connection record. */
99
+ async persistConnection(opts) {
100
+ await this.#store.run(`INSERT OR REPLACE INTO connections
101
+ (connection_id, agent_pubkey, counterparty_pubkey, counterparty_primary_pubkey,
102
+ counterparty_ml_dsa_pubkey, established_at, status, profile_unchecked, created_at)
103
+ VALUES (?, ?, ?, ?, ?, ?, 'active', ?, datetime('now'))`, [
104
+ opts.connectionId, this.#agentPubkey, opts.counterpartyPubkey,
105
+ opts.counterpartyPrimaryPubkey ?? '', opts.counterpartyMlDsaPubkey ?? '',
106
+ opts.establishedAt, opts.profileUnchecked ? 1 : 0,
107
+ ]);
108
+ this.#logger.info("client.connection.persisted", {
109
+ agentPubkey: this.#agentPubkey,
110
+ connectionId: opts.connectionId,
111
+ counterpartyPubkey: opts.counterpartyPubkey,
112
+ });
113
+ }
114
+ /** Load all connections for this agent. */
115
+ async loadConnections() {
116
+ return this.#store.allRows(`SELECT * FROM connections WHERE agent_pubkey = ?`, [this.#agentPubkey]);
117
+ }
118
+ // ─── Connection policy ──────────────────────────────────────────────────────
119
+ /** Persist connection policy (upsert mode + requirements in a single transaction). */
120
+ async persistConnectionPolicy(policy) {
121
+ await this.#store.run("SAVEPOINT sp_connection_policy");
122
+ try {
123
+ await this.#store.run(`INSERT OR REPLACE INTO connection_policy (agent_pubkey, mode, review_mode, updated_at)
124
+ VALUES (?, ?, ?, datetime('now'))`, [this.#agentPubkey, policy.mode, policy.review_mode]);
125
+ // Delete existing requirements
126
+ await this.#store.run(`DELETE FROM connection_policy_requirements WHERE agent_pubkey = ?`, [this.#agentPubkey]);
127
+ // Insert new requirements in position order
128
+ for (let i = 0; i < policy.requirements.length; i++) {
129
+ const req = policy.requirements[i];
130
+ await this.#store.run(`INSERT INTO connection_policy_requirements (agent_pubkey, position, signal_type, condition_json)
131
+ VALUES (?, ?, ?, ?)`, [this.#agentPubkey, i, req.signal_type, JSON.stringify(req.condition)]);
132
+ }
133
+ await this.#store.run("RELEASE sp_connection_policy");
134
+ }
135
+ catch (err) {
136
+ await this.#store.run("ROLLBACK TO SAVEPOINT sp_connection_policy").catch(() => { });
137
+ throw err;
138
+ }
139
+ this.#logger.info("client.policy.persisted", {
140
+ agentPubkey: this.#agentPubkey,
141
+ mode: policy.mode,
142
+ reviewMode: policy.review_mode,
143
+ requirementCount: policy.requirements.length,
144
+ });
145
+ }
146
+ /** Load connection policy for this agent. */
147
+ async loadConnectionPolicy() {
148
+ const policyRow = await this.#store.getRow(`SELECT * FROM connection_policy WHERE agent_pubkey = ?`, [this.#agentPubkey]);
149
+ if (!policyRow)
150
+ return undefined;
151
+ const reqRows = await this.#store.allRows(`SELECT * FROM connection_policy_requirements WHERE agent_pubkey = ? ORDER BY position ASC`, [this.#agentPubkey]);
152
+ const requirements = reqRows.map((r) => ({
153
+ signal_type: r.signal_type,
154
+ condition: JSON.parse(r.condition_json),
155
+ }));
156
+ return {
157
+ mode: policyRow.mode,
158
+ review_mode: policyRow.review_mode,
159
+ requirements,
160
+ };
161
+ }
162
+ // ─── Sessions ───────────────────────────────────────────────────────────────
163
+ /** Persist a session record. */
164
+ async persistSession(sessionIdHex, record) {
165
+ await this.#store.run(`INSERT OR REPLACE INTO sessions
166
+ (session_id, agent_pubkey, counterparty_pubkey, counterparty_peer_id,
167
+ counterparty_multiaddrs, relay_peer_id, relay_multiaddrs, directory_peer_id,
168
+ directory_multiaddrs, directory_pubkey, genesis_prev_root,
169
+ last_seen_seq, last_sent_seq, next_expected_seq, status, desynchronized,
170
+ leaf_count, sealed_root, seal_type, close_timestamp, frost_signature,
171
+ signer_pubkey, directory_signature, updated_at)
172
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))`, [
173
+ sessionIdHex, this.#agentPubkey,
174
+ Buffer.from(record.counterparty_pubkey),
175
+ record.counterparty_peer_id,
176
+ JSON.stringify(record.counterparty_multiaddrs),
177
+ record.relay_endpoint.peer_id,
178
+ JSON.stringify(record.relay_endpoint.multiaddrs),
179
+ record.directory_endpoint.peer_id,
180
+ JSON.stringify(record.directory_endpoint.multiaddrs),
181
+ Buffer.from(record.directory_pubkey),
182
+ Buffer.from(record.genesis_prev_root),
183
+ record.last_seen_seq, record.last_sent_seq, record.next_expected_seq,
184
+ record.status, record.desynchronized ? 1 : 0,
185
+ record.local_tree_leaves.length,
186
+ record.sealed_root ? Buffer.from(record.sealed_root) : null,
187
+ record.seal_type ?? null,
188
+ record.close_timestamp ?? null,
189
+ record.frost_signature ? Buffer.from(record.frost_signature) : null,
190
+ record.signer_pubkey ? Buffer.from(record.signer_pubkey) : null,
191
+ record.directory_signature ? Buffer.from(record.directory_signature) : null,
192
+ ]);
193
+ this.#logger.info("client.session.persisted", {
194
+ agentPubkey: this.#agentPubkey,
195
+ sessionId: sessionIdHex,
196
+ counterpartyPubkey: Buffer.from(record.counterparty_pubkey).toString("hex"),
197
+ status: record.status,
198
+ correlationId: sessionIdHex,
199
+ });
200
+ }
201
+ /** Load all sessions for this agent. */
202
+ async loadSessions() {
203
+ return this.#store.allRows(`SELECT * FROM sessions WHERE agent_pubkey = ?`, [this.#agentPubkey]);
204
+ }
205
+ // ─── Session tree leaves ────────────────────────────────────────────────────
206
+ /** Persist a single session tree leaf. */
207
+ async persistSessionTreeLeaf(opts) {
208
+ const result = await this.#store.run(`INSERT OR IGNORE INTO session_tree_leaves
209
+ (session_id, agent_pubkey, leaf_index, leaf_kind, s2_cbor, sequence_number, accepted_at)
210
+ VALUES (?, ?, ?, ?, ?, ?, datetime('now'))`, [
211
+ opts.sessionIdHex, this.#agentPubkey, opts.leafIndex,
212
+ opts.leafKind, Buffer.from(opts.s2Cbor), opts.sequenceNumber,
213
+ ]);
214
+ // MED-3: INSERT OR IGNORE silently drops duplicates. Warn so duplicates are observable.
215
+ if (result.changes === 0) {
216
+ this.#logger.warn("client.leaf.duplicate", {
217
+ agentPubkey: this.#agentPubkey,
218
+ sessionId: opts.sessionIdHex,
219
+ leafIndex: opts.leafIndex,
220
+ });
221
+ }
222
+ else {
223
+ this.#logger.debug("client.leaf.persisted", {
224
+ agentPubkey: this.#agentPubkey,
225
+ sessionId: opts.sessionIdHex,
226
+ leafIndex: opts.leafIndex,
227
+ leafKind: opts.leafKind,
228
+ sequenceNumber: opts.sequenceNumber,
229
+ correlationId: opts.sessionIdHex,
230
+ });
231
+ }
232
+ }
233
+ /** Load all leaves for a session in order. */
234
+ async loadSessionTreeLeaves(sessionIdHex) {
235
+ return this.#store.allRows(`SELECT * FROM session_tree_leaves WHERE session_id = ? AND agent_pubkey = ? ORDER BY leaf_index ASC`, [sessionIdHex, this.#agentPubkey]);
236
+ }
237
+ // ─── Peers ──────────────────────────────────────────────────────────────────
238
+ /** Persist a peer record. */
239
+ async persistPeer(opts) {
240
+ await this.#store.run(`INSERT OR REPLACE INTO peers (agent_pubkey, peer_pubkey_hex, peer_id, multiaddrs, updated_at)
241
+ VALUES (?, ?, ?, ?, datetime('now'))`, [this.#agentPubkey, opts.peerPubkeyHex, opts.peerId, JSON.stringify(opts.multiaddrs)]);
242
+ this.#logger.info("client.peer.persisted", {
243
+ agentPubkey: this.#agentPubkey,
244
+ peerPubkeyHex: opts.peerPubkeyHex,
245
+ peerId: opts.peerId,
246
+ });
247
+ }
248
+ /** Load all peers for this agent. */
249
+ async loadPeers() {
250
+ return this.#store.allRows(`SELECT * FROM peers WHERE agent_pubkey = ?`, [this.#agentPubkey]);
251
+ }
252
+ // ─── Pending hashes ─────────────────────────────────────────────────────────
253
+ /** Persist a pending hash entry. */
254
+ async persistPendingHash(opts) {
255
+ await this.#store.run(`INSERT OR IGNORE INTO pending_hashes (agent_pubkey, session_id, hash_hex, enqueued_at)
256
+ VALUES (?, ?, ?, ?)`, [this.#agentPubkey, opts.sessionId, opts.hashHex, opts.enqueuedAt]);
257
+ }
258
+ /** Remove a pending hash after ACK is stored. */
259
+ async removePendingHash(sessionId, hashHex) {
260
+ await this.#store.run(`DELETE FROM pending_hashes WHERE agent_pubkey = ? AND session_id = ? AND hash_hex = ?`, [this.#agentPubkey, sessionId, hashHex]);
261
+ }
262
+ /** Load all pending hashes for this agent. */
263
+ async loadPendingHashes() {
264
+ return this.#store.allRows(`SELECT * FROM pending_hashes WHERE agent_pubkey = ? ORDER BY id ASC`, [this.#agentPubkey]);
265
+ }
266
+ // ─── Relay ACK receipts (SI-004: INSERT OR IGNORE, append-only) ────────────
267
+ /** Persist a relay ACK receipt. SI-004: INSERT OR IGNORE — first ACK wins. */
268
+ async persistRelayAckReceipt(opts) {
269
+ const result = await this.#store.run(`INSERT OR IGNORE INTO relay_ack_receipts
270
+ (hash_hex, agent_pubkey, session_id, relay_id, relay_pubkey_hex,
271
+ sequence_number, relay_timestamp, signature_hex, acked_at)
272
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))`, [
273
+ opts.hashHex, this.#agentPubkey, opts.sessionId, opts.relayId,
274
+ opts.relayPubkeyHex, opts.sequenceNumber, opts.relayTimestamp, opts.signatureHex,
275
+ ]);
276
+ const isDuplicate = result.changes === 0;
277
+ if (isDuplicate) {
278
+ this.#logger.warn("client.relay.ack.duplicate", {
279
+ agentPubkey: this.#agentPubkey,
280
+ hashHex: opts.hashHex,
281
+ sessionId: opts.sessionId,
282
+ });
283
+ }
284
+ return { isDuplicate };
285
+ }
286
+ // ─── Known relays ───────────────────────────────────────────────────────────
287
+ /** Cache a relay pubkey. */
288
+ async persistKnownRelay(relayId, relayPubkeyHex, source) {
289
+ await this.#store.run(`INSERT OR REPLACE INTO known_relays (relay_id, relay_pubkey_hex, source, last_seen_at)
290
+ VALUES (?, ?, ?, datetime('now'))`, [relayId, relayPubkeyHex, source]);
291
+ this.#logger.debug("client.relay.pubkey.cached", {
292
+ agentPubkey: this.#agentPubkey,
293
+ relayId,
294
+ });
295
+ }
296
+ /** Look up a cached relay pubkey. */
297
+ async lookupKnownRelay(relayId) {
298
+ const row = await this.#store.getRow(`SELECT relay_pubkey_hex FROM known_relays WHERE relay_id = ?`, [relayId]);
299
+ return row?.relay_pubkey_hex;
300
+ }
301
+ // ─── Pending connection requests ────────────────────────────────────────────
302
+ /** Persist a pending inbound connection request. */
303
+ async persistPendingConnectionRequest(opts) {
304
+ await this.#store.run(`INSERT OR REPLACE INTO pending_connection_requests
305
+ (request_id, agent_pubkey, from_pubkey, package_cbor, round)
306
+ VALUES (?, ?, ?, ?, ?)`, [opts.requestId, this.#agentPubkey, opts.fromPubkey, Buffer.from(opts.packageCbor), opts.round]);
307
+ }
308
+ /** Remove from pending and insert into decided (atomic — wrapped in a transaction). */
309
+ async decidePendingConnectionRequest(requestId, decision) {
310
+ // CRIT-2: Both operations must be atomic. A crash between DELETE and INSERT would leave
311
+ // the request invisible on restart (not in pending, not in decided), enabling double-decision
312
+ // on relay replay.
313
+ await this.#store.run("SAVEPOINT sp_decide_request");
314
+ try {
315
+ await this.#store.run(`DELETE FROM pending_connection_requests WHERE request_id = ? AND agent_pubkey = ?`, [requestId, this.#agentPubkey]);
316
+ await this.#store.run(`INSERT OR IGNORE INTO decided_connection_requests (request_id, agent_pubkey, decision)
317
+ VALUES (?, ?, ?)`, [requestId, this.#agentPubkey, decision]);
318
+ await this.#store.run("RELEASE sp_decide_request");
319
+ }
320
+ catch (err) {
321
+ await this.#store.run("ROLLBACK TO SAVEPOINT sp_decide_request").catch(() => { });
322
+ throw err;
323
+ }
324
+ }
325
+ /** Load pending connection requests. */
326
+ async loadPendingConnectionRequests() {
327
+ return this.#store.allRows(`SELECT * FROM pending_connection_requests WHERE agent_pubkey = ?`, [this.#agentPubkey]);
328
+ }
329
+ /** Load decided connection request IDs. */
330
+ async loadDecidedConnectionRequests() {
331
+ return this.#store.allRows(`SELECT * FROM decided_connection_requests WHERE agent_pubkey = ?`, [this.#agentPubkey]);
332
+ }
333
+ // ─── Endorsements & Attestations ────────────────────────────────────────────
334
+ /** Load non-expired endorsements. */
335
+ async loadEndorsements(nowMs) {
336
+ return this.#store.allRows(`SELECT * FROM endorsements WHERE agent_pubkey = ? AND expires_at > ?`, [this.#agentPubkey, nowMs]);
337
+ }
338
+ /** Load non-expired attestations. */
339
+ async loadAttestations(nowMs) {
340
+ return this.#store.allRows(`SELECT * FROM attestations WHERE agent_pubkey = ? AND expires_at > ?`, [this.#agentPubkey, nowMs]);
341
+ }
342
+ // ─── Backup metadata ────────────────────────────────────────────────────────
343
+ /** Persist backup metadata. */
344
+ async persistBackupMetadata(opts) {
345
+ await this.#store.run(`INSERT OR REPLACE INTO backup_metadata (agent_pubkey, completed_at, destination_url, checksum, updated_at)
346
+ VALUES (?, ?, ?, ?, datetime('now'))`, [this.#agentPubkey, opts.completedAt, opts.destinationUrl, opts.checksum]);
347
+ }
348
+ /** Load backup metadata. */
349
+ async loadBackupMetadata() {
350
+ return this.#store.getRow(`SELECT destination_url, checksum, completed_at FROM backup_metadata WHERE agent_pubkey = ?`, [this.#agentPubkey]);
351
+ }
352
+ // ─── Startup state loading ──────────────────────────────────────────────────
353
+ /**
354
+ * Load all durable state from DB and emit the batch summary event.
355
+ * Returns counts and booleans for client.startup.state.loaded.
356
+ */
357
+ async loadStartupState() {
358
+ const frostShare = await this.loadActiveFrostKeyShare();
359
+ const mlDsaKeypair = await this.loadMlDsaKeypair();
360
+ const registrationState = await this.loadRegistrationState();
361
+ const connectionPolicy = await this.loadConnectionPolicy();
362
+ const connections = await this.loadConnections();
363
+ const sessions = await this.loadSessions();
364
+ const peers = await this.loadPeers();
365
+ const pendingHashes = await this.loadPendingHashes();
366
+ const decidedRequests = await this.loadDecidedConnectionRequests();
367
+ const pendingConnectionRequests = await this.loadPendingConnectionRequests();
368
+ const endorsements = await this.loadEndorsements(Date.now());
369
+ const attestations = await this.loadAttestations(Date.now());
370
+ // Count total leaves
371
+ let leafCount = 0;
372
+ for (const s of sessions) {
373
+ leafCount += s.leaf_count;
374
+ }
375
+ // NOTE: client.startup.state.loaded is NOT emitted here.
376
+ // It is emitted by CelloClientImpl.loadPersistedState() after all in-memory structures
377
+ // have been populated — AC-013 requires the event to fire only after that point.
378
+ return {
379
+ hasFrostShare: frostShare !== undefined,
380
+ hasMlDsaKeypair: mlDsaKeypair !== undefined,
381
+ hasRegistration: registrationState !== undefined,
382
+ hasPolicy: connectionPolicy !== undefined,
383
+ connectionCount: connections.length,
384
+ sessionCount: sessions.length,
385
+ leafCount,
386
+ pendingHashCount: pendingHashes.length,
387
+ frostShare,
388
+ mlDsaKeypair,
389
+ registrationState,
390
+ connectionPolicy,
391
+ connections,
392
+ sessions,
393
+ peers,
394
+ pendingHashes,
395
+ decidedRequests,
396
+ pendingConnectionRequests,
397
+ endorsements,
398
+ attestations,
399
+ };
400
+ }
401
+ }
402
+ //# sourceMappingURL=client-state-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-state-persistence.js","sourceRoot":"","sources":["../src/client-state-persistence.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -112,6 +112,7 @@ import type { CelloNode } from "@cello-protocol/transport";
112
112
  import type { Stream } from "@libp2p/interface";
113
113
  import type { CelloClient, SendResult, SessionRecord } from "./types.js";
114
114
  import type { Logger } from "@cello-protocol/interfaces";
115
+ import type { ClientStatePersistence } from "./client-state-persistence.js";
115
116
  export declare function createClient(node: CelloNode, keyProvider: KeyProvider, opts?: {
116
117
  onMessageQueued?: (senderPubkeyHex: string) => void;
117
118
  contentGraceMs?: number;
@@ -144,6 +145,8 @@ export declare function createClient(node: CelloNode, keyProvider: KeyProvider,
144
145
  crossCheckDirectoryOnInbound?: boolean;
145
146
  /** PERSIST-014: injected logger for observability events. */
146
147
  logger?: Logger;
148
+ /** PERSIST-024: optional persistence layer for structured SQLCipher state. */
149
+ persistence?: ClientStatePersistence;
147
150
  }): CelloClient & {
148
151
  sendRaw(peerPubkeyHex: string, bytes: Uint8Array): Promise<SendResult>;
149
152
  openRawStream(peerPubkeyHex: string): Promise<Stream>;
@@ -245,5 +248,13 @@ export declare function createClient(node: CelloNode, keyProvider: KeyProvider,
245
248
  _pendingConnectionRequestResolverCount: number;
246
249
  /** TEST-ONLY: evaluate call counter (only incremented when trackEvaluateCount=true). */
247
250
  _evaluateCallCount: number;
251
+ /** PERSIST-024: load all durable state from the SQLCipher DB and populate in-memory state. */
252
+ loadPersistedState(): Promise<void>;
253
+ /** PERSIST-024: return hashes pending relay resubmission after loadPersistedState(). */
254
+ getLoadedPendingHashes(): Array<{
255
+ sessionId: string;
256
+ hashHex: string;
257
+ enqueuedAt: number;
258
+ }>;
248
259
  };
249
260
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}