@opendatalabs/personal-server-ts-server 1.34.1 → 1.35.0

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 (180) hide show
  1. package/dist/api-auth.d.ts +1 -0
  2. package/dist/api-auth.d.ts.map +1 -1
  3. package/dist/api-auth.js.map +1 -1
  4. package/dist/api.d.ts +3 -0
  5. package/dist/api.d.ts.map +1 -1
  6. package/dist/api.js +3 -0
  7. package/dist/api.js.map +1 -1
  8. package/dist/app.d.ts +14 -2
  9. package/dist/app.d.ts.map +1 -1
  10. package/dist/app.js +64 -8
  11. package/dist/app.js.map +1 -1
  12. package/dist/bootstrap.d.ts +19 -0
  13. package/dist/bootstrap.d.ts.map +1 -1
  14. package/dist/bootstrap.js +87 -4
  15. package/dist/bootstrap.js.map +1 -1
  16. package/dist/client.d.ts +1 -1
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +7 -0
  19. package/dist/client.js.map +1 -1
  20. package/dist/enclave-main.d.ts.map +1 -1
  21. package/dist/enclave-main.js +0 -2
  22. package/dist/enclave-main.js.map +1 -1
  23. package/dist/mcp/durable-state.d.ts +2 -1
  24. package/dist/mcp/durable-state.d.ts.map +1 -1
  25. package/dist/mcp/durable-state.js +35 -1
  26. package/dist/mcp/durable-state.js.map +1 -1
  27. package/dist/pdpp/bootstrap.d.ts.map +1 -1
  28. package/dist/pdpp/bootstrap.js +1 -0
  29. package/dist/pdpp/bootstrap.js.map +1 -1
  30. package/dist/pdpp/records-bootstrap.d.ts +47 -1
  31. package/dist/pdpp/records-bootstrap.d.ts.map +1 -1
  32. package/dist/pdpp/records-bootstrap.js +78 -2
  33. package/dist/pdpp/records-bootstrap.js.map +1 -1
  34. package/dist/pdpp/replica-authorization.d.ts +35 -0
  35. package/dist/pdpp/replica-authorization.d.ts.map +1 -0
  36. package/dist/pdpp/replica-authorization.js +234 -0
  37. package/dist/pdpp/replica-authorization.js.map +1 -0
  38. package/dist/pending-blob-deletions.d.ts +1 -0
  39. package/dist/pending-blob-deletions.d.ts.map +1 -1
  40. package/dist/pending-blob-deletions.js +8 -4
  41. package/dist/pending-blob-deletions.js.map +1 -1
  42. package/dist/routes/mcp.d.ts +18 -2
  43. package/dist/routes/mcp.d.ts.map +1 -1
  44. package/dist/routes/mcp.js +111 -11
  45. package/dist/routes/mcp.js.map +1 -1
  46. package/dist/routes/oura.d.ts +6 -0
  47. package/dist/routes/oura.d.ts.map +1 -0
  48. package/dist/routes/oura.js +272 -0
  49. package/dist/routes/oura.js.map +1 -0
  50. package/dist/routes/pdpp-auth-query-keys.d.ts +7 -0
  51. package/dist/routes/pdpp-auth-query-keys.d.ts.map +1 -0
  52. package/dist/routes/pdpp-auth-query-keys.js +25 -0
  53. package/dist/routes/pdpp-auth-query-keys.js.map +1 -0
  54. package/dist/routes/pdpp-auth.d.ts +3 -1
  55. package/dist/routes/pdpp-auth.d.ts.map +1 -1
  56. package/dist/routes/pdpp-auth.js +126 -45
  57. package/dist/routes/pdpp-auth.js.map +1 -1
  58. package/dist/routes/pdpp-blobs.d.ts +13 -1
  59. package/dist/routes/pdpp-blobs.d.ts.map +1 -1
  60. package/dist/routes/pdpp-blobs.js +100 -65
  61. package/dist/routes/pdpp-blobs.js.map +1 -1
  62. package/dist/routes/pdpp-connections.d.ts.map +1 -1
  63. package/dist/routes/pdpp-connections.js +24 -1
  64. package/dist/routes/pdpp-connections.js.map +1 -1
  65. package/dist/routes/pdpp-instance-bindings.d.ts +3 -0
  66. package/dist/routes/pdpp-instance-bindings.d.ts.map +1 -1
  67. package/dist/routes/pdpp-instance-bindings.js +63 -0
  68. package/dist/routes/pdpp-instance-bindings.js.map +1 -1
  69. package/dist/routes/pdpp-record-query.d.ts +19 -0
  70. package/dist/routes/pdpp-record-query.d.ts.map +1 -0
  71. package/dist/routes/pdpp-record-query.js +51 -0
  72. package/dist/routes/pdpp-record-query.js.map +1 -0
  73. package/dist/routes/pdpp-records.d.ts +12 -1
  74. package/dist/routes/pdpp-records.d.ts.map +1 -1
  75. package/dist/routes/pdpp-records.js +120 -233
  76. package/dist/routes/pdpp-records.js.map +1 -1
  77. package/dist/routes/pdpp-replica-quarantine-fixture.d.ts +65 -0
  78. package/dist/routes/pdpp-replica-quarantine-fixture.d.ts.map +1 -0
  79. package/dist/routes/pdpp-replica-quarantine-fixture.js +389 -0
  80. package/dist/routes/pdpp-replica-quarantine-fixture.js.map +1 -0
  81. package/dist/storage/claude-method-transition.d.ts +12 -0
  82. package/dist/storage/claude-method-transition.d.ts.map +1 -0
  83. package/dist/storage/claude-method-transition.js +139 -0
  84. package/dist/storage/claude-method-transition.js.map +1 -0
  85. package/dist/storage/import-operations.d.ts +16 -0
  86. package/dist/storage/import-operations.d.ts.map +1 -1
  87. package/dist/storage/import-operations.js +54 -1
  88. package/dist/storage/import-operations.js.map +1 -1
  89. package/dist/storage/index-schema.d.ts +1 -1
  90. package/dist/storage/index-schema.d.ts.map +1 -1
  91. package/dist/storage/index-schema.js +22 -5
  92. package/dist/storage/index-schema.js.map +1 -1
  93. package/dist/storage/legacy-scope-authority.d.ts.map +1 -1
  94. package/dist/storage/legacy-scope-authority.js +83 -11
  95. package/dist/storage/legacy-scope-authority.js.map +1 -1
  96. package/dist/storage/node-data-storage.d.ts.map +1 -1
  97. package/dist/storage/node-data-storage.js +58 -2
  98. package/dist/storage/node-data-storage.js.map +1 -1
  99. package/dist/storage/pdpp-binary-chunks.d.ts +120 -0
  100. package/dist/storage/pdpp-binary-chunks.d.ts.map +1 -0
  101. package/dist/storage/pdpp-binary-chunks.js +480 -0
  102. package/dist/storage/pdpp-binary-chunks.js.map +1 -0
  103. package/dist/storage/pdpp-records-sqlite-store.d.ts +96 -15
  104. package/dist/storage/pdpp-records-sqlite-store.d.ts.map +1 -1
  105. package/dist/storage/pdpp-records-sqlite-store.js +616 -211
  106. package/dist/storage/pdpp-records-sqlite-store.js.map +1 -1
  107. package/dist/storage/pdpp-replica-canonical-port.d.ts +202 -0
  108. package/dist/storage/pdpp-replica-canonical-port.d.ts.map +1 -0
  109. package/dist/storage/pdpp-replica-canonical-port.js +451 -0
  110. package/dist/storage/pdpp-replica-canonical-port.js.map +1 -0
  111. package/dist/storage/pdpp-replica-coordinator-state.d.ts +16 -0
  112. package/dist/storage/pdpp-replica-coordinator-state.d.ts.map +1 -0
  113. package/dist/storage/pdpp-replica-coordinator-state.js +25 -0
  114. package/dist/storage/pdpp-replica-coordinator-state.js.map +1 -0
  115. package/dist/storage/pdpp-replica-copies.d.ts +81 -0
  116. package/dist/storage/pdpp-replica-copies.d.ts.map +1 -0
  117. package/dist/storage/pdpp-replica-copies.js +59 -0
  118. package/dist/storage/pdpp-replica-copies.js.map +1 -0
  119. package/dist/storage/pdpp-replica-reconciler.d.ts +96 -0
  120. package/dist/storage/pdpp-replica-reconciler.d.ts.map +1 -0
  121. package/dist/storage/pdpp-replica-reconciler.js +710 -0
  122. package/dist/storage/pdpp-replica-reconciler.js.map +1 -0
  123. package/dist/storage/pdpp-replica-sql.d.ts +13 -0
  124. package/dist/storage/pdpp-replica-sql.d.ts.map +1 -0
  125. package/dist/storage/pdpp-replica-sql.js +43 -0
  126. package/dist/storage/pdpp-replica-sql.js.map +1 -0
  127. package/dist/storage/pdpp-replica-staging.d.ts +36 -0
  128. package/dist/storage/pdpp-replica-staging.d.ts.map +1 -0
  129. package/dist/storage/pdpp-replica-staging.js +202 -0
  130. package/dist/storage/pdpp-replica-staging.js.map +1 -0
  131. package/dist/storage/pdpp-replica-visibility-view.d.ts +64 -0
  132. package/dist/storage/pdpp-replica-visibility-view.d.ts.map +1 -0
  133. package/dist/storage/pdpp-replica-visibility-view.js +1397 -0
  134. package/dist/storage/pdpp-replica-visibility-view.js.map +1 -0
  135. package/dist/storage/pdpp-replica-writer-identity.d.ts +64 -0
  136. package/dist/storage/pdpp-replica-writer-identity.d.ts.map +1 -0
  137. package/dist/storage/pdpp-replica-writer-identity.js +81 -0
  138. package/dist/storage/pdpp-replica-writer-identity.js.map +1 -0
  139. package/dist/storage/pdpp-replication-door.d.ts +60 -0
  140. package/dist/storage/pdpp-replication-door.d.ts.map +1 -0
  141. package/dist/storage/pdpp-replication-door.js +203 -0
  142. package/dist/storage/pdpp-replication-door.js.map +1 -0
  143. package/dist/storage/pdpp-replication-host.d.ts +67 -0
  144. package/dist/storage/pdpp-replication-host.d.ts.map +1 -0
  145. package/dist/storage/pdpp-replication-host.js +159 -0
  146. package/dist/storage/pdpp-replication-host.js.map +1 -0
  147. package/dist/storage/pdpp-replication-memory.fixture.d.ts +2 -0
  148. package/dist/storage/pdpp-replication-memory.fixture.d.ts.map +1 -0
  149. package/dist/storage/pdpp-replication-memory.fixture.js +267 -0
  150. package/dist/storage/pdpp-replication-memory.fixture.js.map +1 -0
  151. package/dist/storage/pdpp-replication-preparation.d.ts +3 -0
  152. package/dist/storage/pdpp-replication-preparation.d.ts.map +1 -0
  153. package/dist/storage/pdpp-replication-preparation.js +3 -0
  154. package/dist/storage/pdpp-replication-preparation.js.map +1 -0
  155. package/dist/storage/pdpp-replication-promotion-memory.fixture.d.ts +2 -0
  156. package/dist/storage/pdpp-replication-promotion-memory.fixture.d.ts.map +1 -0
  157. package/dist/storage/pdpp-replication-promotion-memory.fixture.js +65 -0
  158. package/dist/storage/pdpp-replication-promotion-memory.fixture.js.map +1 -0
  159. package/dist/storage/pdpp-replication-receiver.d.ts +230 -0
  160. package/dist/storage/pdpp-replication-receiver.d.ts.map +1 -0
  161. package/dist/storage/pdpp-replication-receiver.js +950 -0
  162. package/dist/storage/pdpp-replication-receiver.js.map +1 -0
  163. package/dist/storage/pdpp-replication-sqlite.d.ts +95 -0
  164. package/dist/storage/pdpp-replication-sqlite.d.ts.map +1 -0
  165. package/dist/storage/pdpp-replication-sqlite.js +615 -0
  166. package/dist/storage/pdpp-replication-sqlite.js.map +1 -0
  167. package/dist/storage/pdpp-replication-transport.d.ts +39 -0
  168. package/dist/storage/pdpp-replication-transport.d.ts.map +1 -0
  169. package/dist/storage/pdpp-replication-transport.js +196 -0
  170. package/dist/storage/pdpp-replication-transport.js.map +1 -0
  171. package/dist/storage/schema-versions.d.ts +5 -0
  172. package/dist/storage/schema-versions.d.ts.map +1 -0
  173. package/dist/storage/schema-versions.js +26 -0
  174. package/dist/storage/schema-versions.js.map +1 -0
  175. package/dist/storage/strava-method-transition.d.ts +18 -0
  176. package/dist/storage/strava-method-transition.d.ts.map +1 -0
  177. package/dist/storage/strava-method-transition.js +209 -0
  178. package/dist/storage/strava-method-transition.js.map +1 -0
  179. package/dist/ui/ps-lite-debug.js +137018 -106931
  180. package/package.json +3 -3
@@ -0,0 +1,615 @@
1
+ import { BINARY_CHUNKS_MIGRATION, binaryLength, readBinaryChunks, verifyBinary, copyBinary, deleteBinary, } from "./pdpp-binary-chunks.js";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { canonicalJson, declarationBindingSchema, replicaOperationSchema, } from "@opendatalabs/personal-server-ts-core/replication/envelope";
4
+ import { planReplicaRebinding } from "@opendatalabs/personal-server-ts-core/replication/rebinding";
5
+ import { replicaSchemaDigest, } from "@opendatalabs/personal-server-ts-core/replication/host-config";
6
+ import { computeRecordKeyFromData, } from "@opendatalabs/personal-server-ts-core/storage/pdpp-records";
7
+ import { liveSnapshotDigest } from "./pdpp-stream-completion.js";
8
+ /** Inert until beginBaseline commits; only `createNodeReplication` begins it. */
9
+ export const REPLICATION_MIGRATION = BINARY_CHUNKS_MIGRATION +
10
+ `
11
+ CREATE TABLE IF NOT EXISTS pdpp_replica_settings (id INTEGER PRIMARY KEY CHECK(id = 1), config_json TEXT NOT NULL, watermark INTEGER NOT NULL, checkpoint INTEGER NOT NULL DEFAULT 0);
12
+ CREATE TABLE IF NOT EXISTS pdpp_replica_clock (id INTEGER PRIMARY KEY CHECK(id = 1), counter INTEGER NOT NULL);
13
+ INSERT OR IGNORE INTO pdpp_replica_clock VALUES (1, 0);
14
+ CREATE TABLE IF NOT EXISTS pdpp_replica_operations (sequence INTEGER PRIMARY KEY, operation_json TEXT NOT NULL, digest TEXT NOT NULL);
15
+ CREATE TABLE IF NOT EXISTS pdpp_replica_baseline (sequence INTEGER PRIMARY KEY REFERENCES pdpp_replica_operations(sequence));
16
+ CREATE TABLE IF NOT EXISTS pdpp_replica_blob_bytes (blob_id TEXT PRIMARY KEY, bytes BLOB NOT NULL);
17
+ CREATE TRIGGER IF NOT EXISTS pdpp_replica_no_update BEFORE UPDATE ON pdpp_replica_operations BEGIN SELECT RAISE(ABORT, 'replica journal is append-only'); END;
18
+ CREATE TRIGGER IF NOT EXISTS pdpp_replica_no_delete BEFORE DELETE ON pdpp_replica_operations BEGIN SELECT RAISE(ABORT, 'replica journal is append-only'); END;
19
+ CREATE TRIGGER IF NOT EXISTS pdpp_replica_no_replace BEFORE INSERT ON pdpp_replica_operations WHEN EXISTS (SELECT 1 FROM pdpp_replica_operations WHERE sequence = NEW.sequence) BEGIN SELECT RAISE(ABORT, 'replica journal is append-only'); END;
20
+ `;
21
+ /**
22
+ * Its own migration: a database already past REPLICATION_MIGRATION must still
23
+ * get the index that captureBlob's existence lookup relies on.
24
+ */
25
+ export const REPLICA_BLOB_CLAIM_INDEX_MIGRATION = `
26
+ CREATE INDEX IF NOT EXISTS pdpp_replica_blob_claim_idx ON pdpp_replica_operations (json_extract(operation_json, '$.connectionId'), json_extract(operation_json, '$.generation'), json_extract(operation_json, '$.blob.blobId')) WHERE json_extract(operation_json, '$.kind') = 'blob-claim';
27
+ `;
28
+ /**
29
+ * Binding generations (host contract §4.5). Generation 1 is the first
30
+ * baseline's binding set; each rebinding adds the next. The history keeps
31
+ * every binding any generation retained, with the stream schema its
32
+ * operations validate against: SQL NULL when unknown (a database baselined
33
+ * before this table existed, until a host supplies it), the JSON text `null`
34
+ * when the stream declares none.
35
+ */
36
+ export const REPLICA_BINDING_HISTORY_MIGRATION = `
37
+ CREATE TABLE IF NOT EXISTS pdpp_replica_binding_generations (generation INTEGER PRIMARY KEY CHECK (generation > 0), config_json TEXT NOT NULL);
38
+ CREATE TABLE IF NOT EXISTS pdpp_replica_declaration_history (source_id TEXT NOT NULL, binding_json TEXT NOT NULL, schema_json TEXT, first_generation INTEGER NOT NULL, PRIMARY KEY (source_id, binding_json));
39
+ INSERT OR IGNORE INTO pdpp_replica_binding_generations SELECT 1, config_json FROM pdpp_replica_settings WHERE id = 1;
40
+ INSERT OR IGNORE INTO pdpp_replica_declaration_history SELECT json_extract(d.value, '$.sourceId'), json_extract(d.value, '$.binding'), NULL, 1 FROM pdpp_replica_settings s, json_each(s.config_json, '$.declarations') d WHERE s.id = 1;
41
+ `;
42
+ export function replicaOperationDigest(operation) {
43
+ return `sha256:${createHash("sha256").update(canonicalJson(operation)).digest("hex")}`;
44
+ }
45
+ /** Records and completions a rebaseline re-issues in their retained order. */
46
+ function reissueKey(op) {
47
+ if (op.kind === "upsert" || op.kind === "delete")
48
+ return canonicalJson([
49
+ "record",
50
+ op.connectionId,
51
+ op.generation,
52
+ op.declaration.stream,
53
+ op.recordKey,
54
+ ]);
55
+ if (op.kind === "stream-complete")
56
+ return canonicalJson([
57
+ "complete",
58
+ op.connectionId,
59
+ op.generation,
60
+ op.declaration.stream,
61
+ ]);
62
+ return undefined;
63
+ }
64
+ /** What a record or completion operation leaves in the canonical state. */
65
+ function effect(op) {
66
+ if (op.kind === "upsert")
67
+ return `upsert:${createHash("sha256").update(canonicalJson(op.data)).digest("hex")}`;
68
+ if (op.kind === "stream-complete")
69
+ return `complete:${op.snapshotSha256}`;
70
+ return op.kind;
71
+ }
72
+ /** Owns original revisions, pinned values/bytes and exporter progress on the canonical DB. */
73
+ export function createReplicationJournal(db,
74
+ /** Read per operation, inside its canonical transaction. */
75
+ writerId,
76
+ /** Called after each own operation is appended, inside its transaction. */
77
+ appended) {
78
+ const settings = () => db.prepare("SELECT * FROM pdpp_replica_settings WHERE id = 1").get();
79
+ const config = () => {
80
+ const row = settings();
81
+ return row ? JSON.parse(row.config_json) : undefined;
82
+ };
83
+ function base(instance, generation) {
84
+ const cfg = config();
85
+ if (!cfg)
86
+ throw new Error("replication baseline required");
87
+ const binding = db
88
+ .prepare("SELECT * FROM pdpp_instance_binding WHERE instance = ?")
89
+ .get(instance);
90
+ if (!binding?.source_id || !binding.method)
91
+ throw new Error(`unbound replication connection: ${instance}`);
92
+ return {
93
+ owner: cfg.owner,
94
+ sourceId: binding.source_id,
95
+ connectionId: instance,
96
+ methodId: binding.method,
97
+ generation: generation ?? binding.generation,
98
+ };
99
+ }
100
+ /**
101
+ * The binding a capture writes under: the current one for the stream. A
102
+ * rebaseline also captures streams a rebinding retired, whose rows and
103
+ * tombstones a new writer must still carry: their latest retained binding.
104
+ * The re-issued operation then keeps the binding of the operation whose
105
+ * effect it copies (`reissued`).
106
+ */
107
+ function declaration(instance, stream) {
108
+ const identity = base(instance);
109
+ const matches = (e) => e.sourceId === identity.sourceId && e.binding.stream === stream;
110
+ const found = config().declarations.find(matches) ??
111
+ (reissue ? declarationHistory().filter(matches).at(-1) : undefined);
112
+ if (!found)
113
+ throw new Error(`missing retained declaration: ${stream}`);
114
+ return found.binding;
115
+ }
116
+ /**
117
+ * While a rebaseline runs: the operation that explains each record and
118
+ * completion (`reissueKey`), the one the merge chose.
119
+ */
120
+ let reissue;
121
+ /**
122
+ * A re-issued operation takes the order of the operation that explains its
123
+ * state, when it has the same effect: the counter, and that operation (or
124
+ * its own origin) as origin. It also keeps that operation's declaration, so
125
+ * after a rebinding it validates exactly where the original did. With
126
+ * none, the state is a new write and takes a new counter; a rebaseline
127
+ * skips a tombstone with none (`captureRecord`).
128
+ */
129
+ function reissued(value) {
130
+ const key = reissueKey(value);
131
+ const found = key === undefined ? undefined : reissue?.get(key);
132
+ if (!found || effect(found) !== effect(value))
133
+ return undefined;
134
+ const { counter, writerId, operationId, origin } = found.revision;
135
+ return {
136
+ revision: { counter, origin: origin ?? { writerId, operationId } },
137
+ declaration: found.declaration,
138
+ };
139
+ }
140
+ function append(value) {
141
+ if (!db.inTransaction)
142
+ throw new Error("replication capture requires canonical transaction");
143
+ const prior = db
144
+ .prepare("SELECT counter FROM pdpp_replica_clock WHERE id = 1")
145
+ .get();
146
+ if (!Number.isSafeInteger(prior.counter + 1))
147
+ throw new Error("replication counter exhausted");
148
+ const counter = prior.counter + 1;
149
+ const copy = reissued(value);
150
+ const operation = replicaOperationSchema.parse({
151
+ ...value,
152
+ ...(copy && { declaration: copy.declaration }),
153
+ revision: {
154
+ counter,
155
+ writerId: writerId(),
156
+ operationId: randomUUID(),
157
+ ...copy?.revision,
158
+ },
159
+ });
160
+ db.prepare("UPDATE pdpp_replica_clock SET counter = ? WHERE id = 1").run(counter);
161
+ db.prepare("INSERT INTO pdpp_replica_operations VALUES (?, ?, ?)").run(counter, canonicalJson(operation), replicaOperationDigest(operation));
162
+ appended?.();
163
+ return operation;
164
+ }
165
+ function blobDescriptor(blobId) {
166
+ const meta = db
167
+ .prepare("SELECT * FROM pdpp_blobs WHERE blob_id = ?")
168
+ .get(blobId);
169
+ if (!meta)
170
+ throw new Error("missing replication blob metadata");
171
+ return {
172
+ blobId,
173
+ sha256: `sha256:${meta.sha256}`,
174
+ mimeType: meta.mime_type,
175
+ sizeBytes: meta.size_bytes,
176
+ };
177
+ }
178
+ const chunkedCanonical = (blobId) => db
179
+ .prepare("SELECT 1 FROM pdpp_binary_manifests WHERE namespace='canonical' AND blob_id=?")
180
+ .get(blobId) !== undefined;
181
+ /** Where a pin's bytes are: its own copy, or the canonical chunks it references. */
182
+ function pinnedNamespace(blobId) {
183
+ return binaryLength(db, "pinned", blobId) === undefined &&
184
+ db
185
+ .prepare("SELECT 1 FROM pdpp_replica_blob_pins WHERE blob_id=?")
186
+ .get(blobId) !== undefined &&
187
+ chunkedCanonical(blobId)
188
+ ? "canonical"
189
+ : "pinned";
190
+ }
191
+ function captureBlob(instance, blobId) {
192
+ if (!settings())
193
+ return;
194
+ const identity = base(instance);
195
+ const claimed = db
196
+ .prepare("SELECT generation FROM pdpp_blob_claims WHERE instance = ? AND blob_id = ?")
197
+ .get(instance, blobId);
198
+ if (claimed?.generation !== identity.generation)
199
+ throw new Error("missing current blob claim");
200
+ const blob = blobDescriptor(blobId);
201
+ if (!verifyBinary(db, "canonical", blobId, blob.sha256, blob.sizeBytes))
202
+ throw new Error("unverified replication blob bytes");
203
+ // A large canonical blob is chunks only; the pin references them, and
204
+ // they become the pinned copy if canonical storage drops the blob
205
+ // (`pinReferenceKeepsBytes`). A pinned copy of such a blob, left when
206
+ // canonical storage dropped it before, becomes a reference again. Main's
207
+ // whole row has no such hook, so a small blob keeps its own pinned copy.
208
+ if (chunkedCanonical(blobId)) {
209
+ db.prepare("INSERT OR IGNORE INTO pdpp_replica_blob_pins VALUES (?)").run(blobId);
210
+ deleteBinary(db, "pinned", blobId);
211
+ }
212
+ else if (binaryLength(db, "pinned", blobId) === undefined)
213
+ copyBinary(db, "canonical", blobId, "pinned");
214
+ else if (!verifyBinary(db, "pinned", blobId, blob.sha256, blob.sizeBytes))
215
+ throw new Error("corrupt pinned replica bytes");
216
+ // Indexed by pdpp_replica_blob_claim_idx; the predicate must match it.
217
+ const previous = db
218
+ .prepare("SELECT 1 FROM pdpp_replica_operations WHERE json_extract(operation_json, '$.kind') = 'blob-claim' AND json_extract(operation_json, '$.connectionId') = ? AND json_extract(operation_json, '$.generation') = ? AND json_extract(operation_json, '$.blob.blobId') = ? AND json_extract(operation_json, '$.revision.writerId') = ? LIMIT 1")
219
+ .get(instance, identity.generation, blobId, writerId());
220
+ if (!previous)
221
+ append({ ...identity, kind: "blob-claim", blob });
222
+ }
223
+ function captureRecord(instance, stream, recordKey, semantics, primaryKey,
224
+ /** The declaration the canonical write was validated against, when known. */
225
+ validatedAgainst) {
226
+ if (!settings())
227
+ return;
228
+ const identity = {
229
+ ...base(instance),
230
+ declaration: declaration(instance, stream),
231
+ recordKey,
232
+ };
233
+ // The exported operation asserts the retained declaration. A write
234
+ // validated against any other one must not be labelled with it (#427 A).
235
+ if (validatedAgainst !== undefined &&
236
+ canonicalJson(validatedAgainst) !== canonicalJson(identity.declaration))
237
+ throw new Error("replication declaration mismatch");
238
+ if ((semantics !== undefined &&
239
+ semantics !== identity.declaration.semantics) ||
240
+ (primaryKey !== undefined &&
241
+ canonicalJson(primaryKey) !==
242
+ canonicalJson(identity.declaration.primaryKey)))
243
+ throw new Error("replication declaration mismatch");
244
+ const row = db
245
+ .prepare("SELECT * FROM pdpp_records WHERE instance = ? AND stream = ? AND record_key = ?")
246
+ .get(instance, stream, recordKey);
247
+ if (row.deleted) {
248
+ const tombstone = {
249
+ ...identity,
250
+ kind: "delete",
251
+ emittedAt: row.emitted_at,
252
+ deletedAt: row.deleted_at,
253
+ };
254
+ // A rebaseline copies a tombstone only from the delete the merge chose.
255
+ // Any other tombstone hides a row locally (a withdrawal, a key
256
+ // quarantine, a declaration wait, a reset): no one deleted it, and
257
+ // publishing it would delete the row on every peer.
258
+ if (reissue && !reissued(tombstone))
259
+ return;
260
+ if (identity.declaration.semantics === "append_only")
261
+ throw new Error("append-only replication tombstone");
262
+ append(tombstone);
263
+ }
264
+ else {
265
+ const data = JSON.parse(row.data);
266
+ if (computeRecordKeyFromData(data, identity.declaration.primaryKey) !==
267
+ recordKey)
268
+ throw new Error("replication record key mismatch");
269
+ const blobId = row.blob_id;
270
+ if (blobId)
271
+ captureBlob(instance, blobId);
272
+ append({
273
+ ...identity,
274
+ kind: "upsert",
275
+ emittedAt: row.emitted_at,
276
+ data,
277
+ blobs: blobId ? [blobDescriptor(blobId)] : [],
278
+ });
279
+ }
280
+ }
281
+ function captureLifecycle(instance, kind, generation) {
282
+ if (!settings())
283
+ return;
284
+ const identity = base(instance, generation);
285
+ if (kind === "connection-register")
286
+ append({ ...identity, kind, generation: 1 });
287
+ else if (kind === "connection-reset")
288
+ append({
289
+ ...identity,
290
+ kind,
291
+ previousGeneration: identity.generation - 1,
292
+ });
293
+ else
294
+ append({ ...identity, kind });
295
+ }
296
+ function allOperations() {
297
+ return db
298
+ .prepare("SELECT operation_json FROM pdpp_replica_operations ORDER BY sequence")
299
+ .all().map((row) => JSON.parse(row.operation_json));
300
+ }
301
+ function captureCompletion(instance, stream) {
302
+ if (!settings())
303
+ return;
304
+ const binding = base(instance);
305
+ const retained = declaration(instance, stream);
306
+ const row = db
307
+ .prepare("SELECT * FROM pdpp_stream_completion WHERE instance = ? AND stream = ?")
308
+ .get(instance, stream);
309
+ if (!row)
310
+ return;
311
+ if ((row.snapshot_sha256 === null && row.collection_time_basis !== null) ||
312
+ (row.snapshot_sha256 !== null &&
313
+ row.collection_time_basis !== "host_run_finished"))
314
+ throw new Error("invalid completion proof provenance");
315
+ const proof = row.snapshot_sha256 === null
316
+ ? {
317
+ kind: "producer-asserted",
318
+ snapshotSha256: null,
319
+ collectionTimeBasis: null,
320
+ }
321
+ : {
322
+ kind: "native",
323
+ snapshotSha256: `sha256:${row.snapshot_sha256}`,
324
+ collectionTimeBasis: "host_run_finished",
325
+ };
326
+ const rows = db
327
+ .prepare("SELECT record_key AS recordKey, data AS dataJson FROM pdpp_records WHERE instance = ? AND stream = ? AND deleted = 0")
328
+ .all(instance, stream);
329
+ if (rows.length !== row.live_count)
330
+ throw new Error("stale replication completion");
331
+ const digest = liveSnapshotDigest({
332
+ sourceId: binding.sourceId,
333
+ instance,
334
+ method: binding.methodId,
335
+ generation: binding.generation,
336
+ stream,
337
+ }, retained.primaryKey, rows);
338
+ if (row.snapshot_sha256 !== null && digest !== row.snapshot_sha256)
339
+ throw new Error("stale replication completion digest");
340
+ // Only this writer's operations: a peer that missed an older writer's
341
+ // batches still gets every dependency, from the rebaseline.
342
+ const current = writerId();
343
+ const dependencies = allOperations()
344
+ .filter((op) => op.revision.writerId === current &&
345
+ op.connectionId === instance &&
346
+ op.kind !== "stream-complete" &&
347
+ (op.kind.startsWith("connection-") ||
348
+ (op.generation === binding.generation &&
349
+ (!("declaration" in op) || op.declaration.stream === stream))))
350
+ .map((op) => ({
351
+ writerId: op.revision.writerId,
352
+ operationId: op.revision.operationId,
353
+ digest: replicaOperationDigest(op),
354
+ }));
355
+ append({
356
+ ...binding,
357
+ kind: "stream-complete",
358
+ declaration: retained,
359
+ sourceCollectedAt: row.source_collected_at,
360
+ liveCount: row.live_count,
361
+ snapshotSha256: `sha256:${digest}`,
362
+ proof,
363
+ dependencies,
364
+ });
365
+ }
366
+ function captureInvalidation(instance, stream) {
367
+ if (!settings())
368
+ return;
369
+ append({
370
+ ...base(instance),
371
+ kind: "stream-invalidate",
372
+ declaration: declaration(instance, stream),
373
+ });
374
+ }
375
+ /** Lifecycle, blob claims, every record and tombstone, then completions. */
376
+ function captureCurrentState() {
377
+ const bindings = db
378
+ .prepare("SELECT * FROM pdpp_instance_binding ORDER BY instance")
379
+ .all();
380
+ for (const binding of bindings) {
381
+ if (!binding.source_id || !binding.method) {
382
+ throw new Error("unbound baseline connection");
383
+ }
384
+ captureLifecycle(binding.instance, "connection-register", 1);
385
+ for (let generation = 2; generation <= binding.generation; generation++)
386
+ captureLifecycle(binding.instance, "connection-reset", generation);
387
+ if (binding.deleted_at !== null)
388
+ captureLifecycle(binding.instance, "connection-delete");
389
+ }
390
+ for (const row of db
391
+ .prepare("SELECT * FROM pdpp_blob_claims ORDER BY instance, blob_id")
392
+ .all())
393
+ captureBlob(row.instance, row.blob_id);
394
+ for (const row of db
395
+ .prepare("SELECT instance, stream, record_key FROM pdpp_records ORDER BY instance, stream, record_key")
396
+ .all())
397
+ captureRecord(row.instance, row.stream, row.record_key);
398
+ for (const row of db
399
+ .prepare("SELECT instance, stream FROM pdpp_stream_completion ORDER BY instance, stream")
400
+ .all())
401
+ captureCompletion(row.instance, row.stream);
402
+ }
403
+ function declarationHistory() {
404
+ return db
405
+ .prepare("SELECT source_id, binding_json, schema_json FROM pdpp_replica_declaration_history ORDER BY first_generation, source_id, binding_json")
406
+ .all().map((row) => ({
407
+ sourceId: row.source_id,
408
+ binding: JSON.parse(row.binding_json),
409
+ ...(row.schema_json === null
410
+ ? {}
411
+ : { schema: JSON.parse(row.schema_json) }),
412
+ }));
413
+ }
414
+ function bindingGeneration() {
415
+ return db
416
+ .prepare("SELECT coalesce(max(generation), 0) AS generation FROM pdpp_replica_binding_generations")
417
+ .get().generation;
418
+ }
419
+ /**
420
+ * Add `entries` to the history at `generation`, and record a schema the
421
+ * history did not know. A schema must match its binding's digest.
422
+ */
423
+ function retainDeclarations(entries, generation) {
424
+ const insert = db.prepare("INSERT INTO pdpp_replica_declaration_history VALUES (?, ?, ?, ?) ON CONFLICT (source_id, binding_json) DO UPDATE SET schema_json = coalesce(schema_json, excluded.schema_json)");
425
+ for (const entry of entries)
426
+ insert.run(entry.sourceId, canonicalJson(entry.binding), entry.schema === undefined ? null : canonicalJson(entry.schema), generation);
427
+ }
428
+ function beginBaseline(input) {
429
+ // Validate before persisting; canonical order makes identical retries stable.
430
+ const normalized = {
431
+ owner: input.owner,
432
+ declarations: input.declarations.map((e) => ({
433
+ sourceId: e.sourceId,
434
+ binding: declarationBindingSchema.parse(e.binding),
435
+ })),
436
+ };
437
+ if (!normalized.owner || normalized.declarations.some((e) => !e.sourceId))
438
+ throw new Error("invalid replication configuration");
439
+ const keys = normalized.declarations.map((e) => canonicalJson([e.sourceId, e.binding.stream]));
440
+ if (new Set(keys).size !== keys.length)
441
+ throw new Error("duplicate retained declaration");
442
+ for (const e of input.declarations)
443
+ if (e.schema !== undefined &&
444
+ replicaSchemaDigest(e.schema) !== e.binding.schemaDigest)
445
+ throw new Error(`retained declaration schema does not match its digest: ${e.sourceId} stream ${e.binding.stream}`);
446
+ return db
447
+ .transaction(() => {
448
+ // Method transitions are not journaled, so a replica could not follow them.
449
+ // Check before the idempotent return: a transition made while the flag
450
+ // was off must also block re-enabling an already-baselined database.
451
+ const transitioned = db
452
+ .prepare("SELECT instance FROM pdpp_claude_transition UNION ALL SELECT instance FROM pdpp_strava_transition LIMIT 1")
453
+ .get();
454
+ if (transitioned)
455
+ throw new Error(`replication cannot be enabled: connection ${transitioned.instance} has a Strava or Claude method transition`);
456
+ const prior = settings();
457
+ if (prior) {
458
+ const current = JSON.parse(prior.config_json);
459
+ if (current.owner !== normalized.owner)
460
+ throw new Error("replication owner is immutable");
461
+ const plan = planReplicaRebinding(current.declarations, declarationHistory(), normalized.declarations);
462
+ if (plan.tag === "refused")
463
+ throw new Error(plan.reason);
464
+ let generation = bindingGeneration();
465
+ if (plan.tag === "rebind") {
466
+ // Nothing is journaled: every operation names its own binding,
467
+ // and the older ones stay trusted (rebinding.ts).
468
+ generation += 1;
469
+ db.prepare("UPDATE pdpp_replica_settings SET config_json = ? WHERE id = 1").run(canonicalJson(normalized));
470
+ db.prepare("INSERT INTO pdpp_replica_binding_generations VALUES (?, ?)").run(generation, canonicalJson(normalized));
471
+ }
472
+ retainDeclarations(input.declarations, generation);
473
+ return { watermark: prior.watermark };
474
+ }
475
+ db.prepare("INSERT INTO pdpp_replica_settings (id, config_json, watermark) VALUES (1, ?, 0)").run(canonicalJson(normalized));
476
+ db.prepare("INSERT INTO pdpp_replica_binding_generations VALUES (1, ?)").run(canonicalJson(normalized));
477
+ retainDeclarations(input.declarations, 1);
478
+ // A legacy orphan is a migration error, never an omitted row.
479
+ const orphan = db
480
+ .prepare("SELECT 1 FROM pdpp_records r LEFT JOIN pdpp_instance_binding b ON r.instance = b.instance WHERE b.source_id IS NULL OR b.method IS NULL LIMIT 1")
481
+ .get();
482
+ if (orphan)
483
+ throw new Error("unbound baseline records");
484
+ captureCurrentState();
485
+ const { counter } = db
486
+ .prepare("SELECT counter FROM pdpp_replica_clock")
487
+ .get();
488
+ db.prepare("INSERT INTO pdpp_replica_baseline SELECT sequence FROM pdpp_replica_operations").run();
489
+ db.prepare("UPDATE pdpp_replica_settings SET watermark = ? WHERE id = 1").run(counter);
490
+ return { watermark: counter };
491
+ })
492
+ .immediate();
493
+ }
494
+ /**
495
+ * The current state, re-captured under the current writer as a new
496
+ * baseline. A new writer identity calls it before it publishes: a peer that
497
+ * missed the old writer's batches, unpublished or refused, still converges.
498
+ * Records and completions keep the order of the retained operation whose
499
+ * effect they copy (`reissued`), so against every other writer the copy
500
+ * wins and loses exactly where that operation does: it never overrides a
501
+ * newer write, and never loses a tie the original won. A peer's operation
502
+ * is re-issued the same way: the new writer signs it, its origin keeps the
503
+ * peer's order. Lifecycle and blob-claim operations take new counters.
504
+ *
505
+ * Only the operation the merge chose explains a state (`explaining`). A
506
+ * higher operation with the same effect may be one the merge rejected or
507
+ * keeps pending; copying its order or binding would publish a baseline
508
+ * that a peer with this device's trust refuses. A tombstone no delete
509
+ * explains only hides a row here, so it is not re-issued.
510
+ */
511
+ function rebaseline(explaining) {
512
+ if (!settings())
513
+ return undefined;
514
+ const { counter: after } = db
515
+ .prepare("SELECT counter FROM pdpp_replica_clock")
516
+ .get();
517
+ reissue = new Map();
518
+ for (const op of explaining) {
519
+ const key = reissueKey(op);
520
+ if (key !== undefined && "declaration" in op)
521
+ reissue.set(key, op);
522
+ }
523
+ try {
524
+ captureCurrentState();
525
+ }
526
+ finally {
527
+ reissue = undefined;
528
+ }
529
+ const { counter } = db
530
+ .prepare("SELECT counter FROM pdpp_replica_clock")
531
+ .get();
532
+ db.prepare("INSERT INTO pdpp_replica_baseline SELECT sequence FROM pdpp_replica_operations WHERE sequence > ?").run(after);
533
+ db.prepare("UPDATE pdpp_replica_settings SET watermark = ?, checkpoint = ? WHERE id = 1").run(counter, after);
534
+ return { after };
535
+ }
536
+ function page(options, baseline) {
537
+ const state = settings();
538
+ if (!state)
539
+ throw new Error("replication baseline required");
540
+ const after = options.afterSequence ?? (baseline ? state.checkpoint : state.watermark);
541
+ if (!Number.isSafeInteger(after) ||
542
+ after < 0 ||
543
+ !Number.isInteger(options.limit) ||
544
+ options.limit < 1 ||
545
+ options.limit > 1000)
546
+ throw new RangeError("invalid replication page");
547
+ if (!baseline && after < state.watermark)
548
+ throw new RangeError("tail starts below baseline watermark");
549
+ const rows = db
550
+ .prepare(`SELECT sequence, operation_json FROM pdpp_replica_operations WHERE sequence > ? AND ${baseline ? "sequence IN (SELECT sequence FROM pdpp_replica_baseline)" : "sequence > " + state.watermark} ORDER BY sequence LIMIT ?`)
551
+ .all(after, options.limit + 1);
552
+ const selected = rows.slice(0, options.limit);
553
+ return {
554
+ operations: selected.map((row) => JSON.parse(row.operation_json)),
555
+ nextAfterSequence: selected.at(-1)?.sequence ?? after,
556
+ hasMore: rows.length > options.limit,
557
+ };
558
+ }
559
+ const exporter = {
560
+ beginBaseline,
561
+ declarationHistory,
562
+ bindingGeneration,
563
+ rebaseline: (explaining) => db.transaction(() => rebaseline(explaining)).immediate(),
564
+ readBaselinePage: (options) => page(options, true),
565
+ readTailPage: (options) => page(options, false),
566
+ getBaselineCheckpoint: () => {
567
+ const row = settings();
568
+ if (!row)
569
+ throw new Error("replication baseline required");
570
+ return row.checkpoint;
571
+ },
572
+ acknowledgeBaselinePage(expected, next) {
573
+ db.transaction(() => {
574
+ const row = settings();
575
+ if (!row ||
576
+ !Number.isSafeInteger(expected) ||
577
+ !Number.isSafeInteger(next) ||
578
+ expected < 0 ||
579
+ next < expected ||
580
+ next > row.watermark)
581
+ throw new RangeError("invalid baseline checkpoint");
582
+ if (row.checkpoint === next)
583
+ return;
584
+ if (row.checkpoint !== expected)
585
+ throw new Error("baseline checkpoint conflict");
586
+ db.prepare("UPDATE pdpp_replica_settings SET checkpoint = ? WHERE id = 1").run(next);
587
+ }).immediate();
588
+ },
589
+ readPinnedBlobChunks(blobId) {
590
+ return readBinaryChunks(db, pinnedNamespace(blobId), blobId);
591
+ },
592
+ readPinnedBlobBytes(blobId) {
593
+ const namespace = pinnedNamespace(blobId);
594
+ const size = binaryLength(db, namespace, blobId);
595
+ if (size === undefined)
596
+ return undefined;
597
+ const bytes = new Uint8Array(size);
598
+ let offset = 0;
599
+ for (const chunk of readBinaryChunks(db, namespace, blobId)) {
600
+ bytes.set(chunk, offset);
601
+ offset += chunk.length;
602
+ }
603
+ return bytes;
604
+ },
605
+ };
606
+ return {
607
+ exporter,
608
+ captureRecord,
609
+ captureLifecycle,
610
+ captureBlob,
611
+ captureCompletion,
612
+ captureInvalidation,
613
+ };
614
+ }
615
+ //# sourceMappingURL=pdpp-replication-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdpp-replication-sqlite.js","sourceRoot":"","sources":["../../src/storage/pdpp-replication-sqlite.ts"],"names":[],"mappings":"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"}