@opendatalabs/personal-server-ts-core 1.25.1 → 1.27.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 (58) hide show
  1. package/dist/api/index.d.ts.map +1 -1
  2. package/dist/api/index.js +10 -0
  3. package/dist/api/index.js.map +1 -1
  4. package/dist/contracts/data.d.ts +5 -0
  5. package/dist/contracts/data.d.ts.map +1 -1
  6. package/dist/contracts/data.js +3 -1
  7. package/dist/contracts/data.js.map +1 -1
  8. package/dist/derivatives/scheduler.d.ts.map +1 -1
  9. package/dist/derivatives/scheduler.js +18 -1
  10. package/dist/derivatives/scheduler.js.map +1 -1
  11. package/dist/legacy-projection/bindings.d.ts +10 -0
  12. package/dist/legacy-projection/bindings.d.ts.map +1 -0
  13. package/dist/legacy-projection/bindings.js +3945 -0
  14. package/dist/legacy-projection/bindings.js.map +1 -0
  15. package/dist/legacy-projection/github-browser-bindings.d.ts +3 -0
  16. package/dist/legacy-projection/github-browser-bindings.d.ts.map +1 -0
  17. package/dist/legacy-projection/github-browser-bindings.js +128 -0
  18. package/dist/legacy-projection/github-browser-bindings.js.map +1 -0
  19. package/dist/legacy-projection/index.d.ts +33 -0
  20. package/dist/legacy-projection/index.d.ts.map +1 -0
  21. package/dist/legacy-projection/index.js +189 -0
  22. package/dist/legacy-projection/index.js.map +1 -0
  23. package/dist/legacy-projection/meta-040-bindings.d.ts +3 -0
  24. package/dist/legacy-projection/meta-040-bindings.d.ts.map +1 -0
  25. package/dist/legacy-projection/meta-040-bindings.js +112 -0
  26. package/dist/legacy-projection/meta-040-bindings.js.map +1 -0
  27. package/dist/legacy-projection/oura-browser-bindings.d.ts +3 -0
  28. package/dist/legacy-projection/oura-browser-bindings.d.ts.map +1 -0
  29. package/dist/legacy-projection/oura-browser-bindings.js +137 -0
  30. package/dist/legacy-projection/oura-browser-bindings.js.map +1 -0
  31. package/dist/legacy-projection/provenance.d.ts +57 -0
  32. package/dist/legacy-projection/provenance.d.ts.map +1 -0
  33. package/dist/legacy-projection/provenance.js +2 -0
  34. package/dist/legacy-projection/provenance.js.map +1 -0
  35. package/dist/legacy-projection/test-debris.d.ts +2 -0
  36. package/dist/legacy-projection/test-debris.d.ts.map +1 -0
  37. package/dist/legacy-projection/test-debris.js +49 -0
  38. package/dist/legacy-projection/test-debris.js.map +1 -0
  39. package/dist/legacy-projection/types.d.ts +167 -0
  40. package/dist/legacy-projection/types.d.ts.map +1 -0
  41. package/dist/legacy-projection/types.js +2 -0
  42. package/dist/legacy-projection/types.js.map +1 -0
  43. package/dist/ports/index.d.ts +6 -0
  44. package/dist/ports/index.d.ts.map +1 -1
  45. package/dist/ports/index.js.map +1 -1
  46. package/dist/storage/blocks/cursor.d.ts +5 -1
  47. package/dist/storage/blocks/cursor.d.ts.map +1 -1
  48. package/dist/storage/blocks/cursor.js +13 -1
  49. package/dist/storage/blocks/cursor.js.map +1 -1
  50. package/dist/storage/blocks/page.d.ts +18 -0
  51. package/dist/storage/blocks/page.d.ts.map +1 -0
  52. package/dist/storage/blocks/page.js +113 -0
  53. package/dist/storage/blocks/page.js.map +1 -0
  54. package/dist/storage/legacy-projection.d.ts +59 -0
  55. package/dist/storage/legacy-projection.d.ts.map +1 -0
  56. package/dist/storage/legacy-projection.js +371 -0
  57. package/dist/storage/legacy-projection.js.map +1 -0
  58. package/package.json +8 -1
@@ -0,0 +1,371 @@
1
+ /**
2
+ * Serve legacy scope bodies from stored PDPP records.
3
+ *
4
+ * PDPP connectors store one envelope per stream, body `{records: [row, …]}`,
5
+ * under `<source>.<stream>`. Apps that predate PDPP read legacy bodies such
6
+ * as `chatgpt.conversations` = `{conversations, total}`. `withLegacyProjection`
7
+ * wraps the raw storage port: when the latest stored body of a projected
8
+ * scope is `{records}`, reads return the legacy body projected from that
9
+ * stream and its sibling streams. Every other body is served exactly as
10
+ * stored. Writes, listings and the sync-facing methods pass through.
11
+ *
12
+ * Give the wrapped ("served") port to every reader of data: the HTTP data
13
+ * route, MCP, derivatives and the job worker. Give the raw port to sync
14
+ * upload/download, so canonical bytes (and their hashes) never change.
15
+ */
16
+ import { LEGACY_SCOPE_BINDINGS, projectPdppRecordsToLegacyPayload, } from "../legacy-projection/index.js";
17
+ import { buildDataBlocksAsync } from "./blocks/build.js";
18
+ import { readBuiltScopeBlocks } from "./blocks/page.js";
19
+ import { previewEnvelopeValue } from "./preview.js";
20
+ /**
21
+ * Sources whose `{records}` bodies are projected. Other sources either emit
22
+ * legacy wrappers themselves (GitHub, Strava) or have no real-shape parity
23
+ * evidence yet (Oura), so their stored bodies are served as stored.
24
+ */
25
+ const PROJECTED_SOURCES = new Set(["chatgpt", "claude"]);
26
+ /** Keys the server stamps into `data`; they are not part of the body. */
27
+ const SERVER_STAMP_KEYS = new Set([
28
+ "$writtenBy",
29
+ "$lineage",
30
+ ]);
31
+ export function classifyStoredBody(scope, data) {
32
+ if (!isRecordsBody(data))
33
+ return "legacy";
34
+ return isProjectedScope(scope) && !data.records.some(isTaggedRecord)
35
+ ? "pdpp-projected"
36
+ : "pdpp-unprojected";
37
+ }
38
+ const SERVED = Symbol.for("personal-server-ts.legacy-projection.served");
39
+ const textEncoder = new TextEncoder();
40
+ /** How many stored versions' body forms one served port remembers. */
41
+ const FORM_CACHE_SIZE = 64;
42
+ /**
43
+ * Wrap a raw storage port so reads of projected scopes return legacy bodies.
44
+ * Wrapping an already wrapped port returns it unchanged.
45
+ */
46
+ export function withLegacyProjection(raw, options = {}) {
47
+ if (raw[SERVED])
48
+ return raw;
49
+ // One entry, keyed by the versions of every input. It saves re-projecting
50
+ // on repeated reads of the same data; it is not a persistent cache.
51
+ let memo = null;
52
+ // The body form of each stored version read so far, so a version that is
53
+ // not projected (most often a legacy body) is parsed to classify it once,
54
+ // not on every read. Bounded; the oldest entry goes first.
55
+ const forms = new Map();
56
+ const rememberForm = (version, form) => {
57
+ forms.set(version, form);
58
+ if (forms.size > FORM_CACHE_SIZE) {
59
+ forms.delete(forms.keys().next().value);
60
+ }
61
+ };
62
+ /**
63
+ * The projected view of a stored version, or null when it is served as
64
+ * stored. `own` is the stored envelope when it had to be read to decide.
65
+ */
66
+ async function resolve(scope, collectedAt) {
67
+ if (!isProjectedScope(scope))
68
+ return { view: null };
69
+ const binding = LEGACY_SCOPE_BINDINGS.get(scope);
70
+ const source = scope.slice(0, scope.indexOf("."));
71
+ // The latest version joins the latest siblings, whatever order one run
72
+ // wrote its streams in. A historical version joins, of the sibling
73
+ // versions written before the next version of `scope`, the one nearest
74
+ // in time: the one its own run wrote, before or after it.
75
+ const supersededAt = nextVersionTime(raw, scope, collectedAt);
76
+ const inputs = binding.pdppStreams.map((stream) => {
77
+ const storedScope = `${source}.${stream}`;
78
+ const entry = storedScope === scope
79
+ ? raw.findEntry({ scope, at: collectedAt })
80
+ : supersededAt === undefined
81
+ ? raw.findEntry({ scope: storedScope })
82
+ : nearestBefore(raw, storedScope, collectedAt, supersededAt);
83
+ return {
84
+ stream,
85
+ storedScope,
86
+ collectedAt: storedScope === scope ? collectedAt : entry?.collectedAt,
87
+ // The index row id changes when a version is deleted and written
88
+ // again under the same collectedAt, so it identifies the content.
89
+ version: entry ? `${entry.id}@${entry.collectedAt}` : null,
90
+ };
91
+ });
92
+ const ownVersion = inputs.find((input) => input.storedScope === scope)?.version;
93
+ if (ownVersion) {
94
+ const form = forms.get(ownVersion);
95
+ if (form !== undefined && form !== "pdpp-projected") {
96
+ return { view: null };
97
+ }
98
+ }
99
+ const key = JSON.stringify([scope, inputs.map((input) => input.version)]);
100
+ if (memo?.key === key)
101
+ return { view: memo.value };
102
+ const own = await raw.readEnvelope(scope, collectedAt);
103
+ const form = classifyStoredBody(scope, own.data);
104
+ if (ownVersion)
105
+ rememberForm(ownVersion, form);
106
+ let value = null;
107
+ if (form === "pdpp-projected") {
108
+ value = await project(scope, collectedAt, own, inputs);
109
+ if (value)
110
+ value.view = key;
111
+ }
112
+ memo = { key, value };
113
+ return { view: value, own };
114
+ }
115
+ async function projected(scope, collectedAt) {
116
+ return (await resolve(scope, collectedAt)).view;
117
+ }
118
+ async function project(scope, collectedAt, own, inputs) {
119
+ const records = [];
120
+ const fetchedStreams = [];
121
+ // The projection time is the newest input version, so the same stored
122
+ // data always projects to the same bytes.
123
+ let now = collectedAt;
124
+ for (const input of inputs) {
125
+ if (!input.collectedAt)
126
+ continue;
127
+ const envelope = input.storedScope === scope
128
+ ? own
129
+ : await raw.readEnvelope(input.storedScope, input.collectedAt);
130
+ if (classifyStoredBody(input.storedScope, envelope.data) === "legacy") {
131
+ continue;
132
+ }
133
+ const rows = envelope.data
134
+ .records;
135
+ if (rows.some(isTaggedRecord))
136
+ continue;
137
+ fetchedStreams.push(input.stream);
138
+ if (input.collectedAt > now)
139
+ now = input.collectedAt;
140
+ for (const row of rows) {
141
+ records.push({ stream: input.stream, data: row });
142
+ }
143
+ }
144
+ const result = projectPdppRecordsToLegacyPayload(scope, records, {
145
+ fetchedStreams,
146
+ now,
147
+ orderByPrimaryKey: true,
148
+ allowMissingJoinStreams: true,
149
+ });
150
+ if (!result.ok) {
151
+ options.onIssue?.({
152
+ kind: "projection_failed",
153
+ scope,
154
+ collectedAt,
155
+ error: result.error,
156
+ });
157
+ return null;
158
+ }
159
+ if (result.diagnostics?.length) {
160
+ options.onIssue?.({
161
+ kind: "projection_diagnostics",
162
+ scope,
163
+ collectedAt,
164
+ diagnostics: result.diagnostics,
165
+ });
166
+ }
167
+ // Server stamps signed the stored records, not this view, so they are
168
+ // not carried over. `?view=stored` returns them with the stored body.
169
+ const envelope = { ...own, data: result.payload };
170
+ return {
171
+ envelope,
172
+ bytes: textEncoder.encode(JSON.stringify(envelope)),
173
+ };
174
+ }
175
+ async function builtBlocks(scope, view) {
176
+ view.built ??= await buildDataBlocksAsync({
177
+ scope,
178
+ collectedAt: view.envelope.collectedAt,
179
+ ...(typeof view.envelope.schemaId === "string"
180
+ ? { schemaId: view.envelope.schemaId }
181
+ : {}),
182
+ content: view.envelope,
183
+ });
184
+ return view.built;
185
+ }
186
+ const overrides = {
187
+ [SERVED]: true,
188
+ async readEnvelope(scope, collectedAt) {
189
+ const { view, own } = await resolve(scope, collectedAt);
190
+ return view?.envelope ?? own ?? raw.readEnvelope(scope, collectedAt);
191
+ },
192
+ readStoredEnvelope(scope, collectedAt) {
193
+ return raw.readEnvelope(scope, collectedAt);
194
+ },
195
+ };
196
+ if (raw.readEnvelopeBytes) {
197
+ const rawBytes = raw.readEnvelopeBytes.bind(raw);
198
+ overrides.readEnvelopeBytes = async (scope, collectedAt) => (await projected(scope, collectedAt))?.bytes ??
199
+ rawBytes(scope, collectedAt);
200
+ }
201
+ if (raw.readEnvelopeStream) {
202
+ const rawStream = raw.readEnvelopeStream.bind(raw);
203
+ overrides.readEnvelopeStream = async (scope, collectedAt) => {
204
+ const view = await projected(scope, collectedAt);
205
+ if (!view)
206
+ return rawStream(scope, collectedAt);
207
+ const bytes = view.bytes;
208
+ return new ReadableStream({
209
+ start(controller) {
210
+ controller.enqueue(bytes);
211
+ controller.close();
212
+ },
213
+ });
214
+ };
215
+ }
216
+ if (raw.readEnvelopePreview) {
217
+ const rawPreview = raw.readEnvelopePreview.bind(raw);
218
+ overrides.readEnvelopePreview = async (scope, collectedAt, previewOpts) => {
219
+ const view = await projected(scope, collectedAt);
220
+ return view
221
+ ? previewEnvelopeValue(view.envelope, previewOpts.maxBytes)
222
+ : rawPreview(scope, collectedAt, previewOpts);
223
+ };
224
+ }
225
+ if (raw.readScopeBlocks) {
226
+ const rawBlocks = raw.readScopeBlocks.bind(raw);
227
+ overrides.readScopeBlocks = async (scope, collectedAt, blockOpts) => {
228
+ const view = await projected(scope, collectedAt);
229
+ return view
230
+ ? readBuiltScopeBlocks(await builtBlocks(scope, view), {
231
+ ...blockOpts,
232
+ cursorView: view.view,
233
+ })
234
+ : rawBlocks(scope, collectedAt, blockOpts);
235
+ };
236
+ }
237
+ if (raw.readBlockManifest) {
238
+ const rawManifest = raw.readBlockManifest.bind(raw);
239
+ overrides.readBlockManifest = async (scope, collectedAt) => {
240
+ const view = await projected(scope, collectedAt);
241
+ return view
242
+ ? (await builtBlocks(scope, view)).manifest
243
+ : rawManifest(scope, collectedAt);
244
+ };
245
+ }
246
+ // A stored sidecar answers "yes" for either form (a projected view can
247
+ // always be split into blocks), so the stored body is only read when the
248
+ // raw port has no sidecar yet.
249
+ if (raw.hasScopeBlocks) {
250
+ const rawHas = raw.hasScopeBlocks.bind(raw);
251
+ overrides.hasScopeBlocks = async (scope, collectedAt) => (await rawHas(scope, collectedAt)) ||
252
+ (await projected(scope, collectedAt)) !== null;
253
+ }
254
+ if (raw.canReadScopeBlocks) {
255
+ const rawCan = raw.canReadScopeBlocks.bind(raw);
256
+ overrides.canReadScopeBlocks = async (scope, collectedAt) => (await rawCan(scope, collectedAt)) ||
257
+ (await projected(scope, collectedAt)) !== null;
258
+ }
259
+ return new Proxy(raw, {
260
+ get(target, property) {
261
+ if (Object.prototype.hasOwnProperty.call(overrides, property)) {
262
+ return overrides[property];
263
+ }
264
+ const value = Reflect.get(target, property, target);
265
+ return typeof value === "function" ? value.bind(target) : value;
266
+ },
267
+ has(target, property) {
268
+ return (Object.prototype.hasOwnProperty.call(overrides, property) ||
269
+ Reflect.has(target, property));
270
+ },
271
+ });
272
+ }
273
+ /**
274
+ * The projected legacy scopes whose served body is built from `scope`'s
275
+ * stored stream, other than `scope` itself: `chatgpt.messages` →
276
+ * `["chatgpt.conversations"]`. Anything that caches a read of a projected
277
+ * scope must treat a change to these streams as a change to it.
278
+ */
279
+ export function legacyScopesProjectedFrom(scope) {
280
+ const dot = scope.indexOf(".");
281
+ if (dot <= 0)
282
+ return [];
283
+ const source = scope.slice(0, dot);
284
+ const stream = scope.slice(dot + 1);
285
+ return [...LEGACY_SCOPE_BINDINGS.values()]
286
+ .filter((binding) => binding.scope !== scope &&
287
+ binding.scope.startsWith(`${source}.`) &&
288
+ isProjectedScope(binding.scope) &&
289
+ binding.pdppStreams.includes(stream))
290
+ .map((binding) => binding.scope);
291
+ }
292
+ function isProjectedScope(scope) {
293
+ const dot = scope.indexOf(".");
294
+ return (dot > 0 &&
295
+ PROJECTED_SOURCES.has(scope.slice(0, dot)) &&
296
+ LEGACY_SCOPE_BINDINGS.has(scope));
297
+ }
298
+ const VERSION_PAGE_SIZE = 100;
299
+ /** Versions of `scope`, newest first, until `stop` returns true. */
300
+ function walkVersions(raw, scope, stop) {
301
+ for (let offset = 0;; offset += VERSION_PAGE_SIZE) {
302
+ const page = raw.listVersions(scope, { limit: VERSION_PAGE_SIZE, offset });
303
+ const found = page.find(stop);
304
+ if (found || page.length < VERSION_PAGE_SIZE)
305
+ return found;
306
+ }
307
+ }
308
+ /**
309
+ * When the version of `scope` after the one at `collectedAt` was collected,
310
+ * or undefined when that version is the latest (or not indexed).
311
+ */
312
+ function nextVersionTime(raw, scope, collectedAt) {
313
+ const at = Date.parse(collectedAt);
314
+ const latest = raw.findEntry({ scope });
315
+ if (!latest || !(Date.parse(latest.collectedAt) > at))
316
+ return undefined;
317
+ let next = Date.parse(latest.collectedAt);
318
+ walkVersions(raw, scope, (entry) => {
319
+ const time = Date.parse(entry.collectedAt);
320
+ if (time > at)
321
+ next = time;
322
+ return !(time > at);
323
+ });
324
+ return next;
325
+ }
326
+ /**
327
+ * The version of `scope` collected nearest to `collectedAt`, among those
328
+ * collected before `bound` (epoch ms).
329
+ */
330
+ function nearestBefore(raw, scope, collectedAt, bound) {
331
+ const at = Date.parse(collectedAt);
332
+ // Newest first: remember the last version after `at`, stop at the first
333
+ // one at or before it, and take whichever of the two is nearer.
334
+ let after;
335
+ const notAfter = walkVersions(raw, scope, (entry) => {
336
+ const time = Date.parse(entry.collectedAt);
337
+ if (time > at) {
338
+ if (time < bound)
339
+ after = entry;
340
+ return false;
341
+ }
342
+ return true;
343
+ });
344
+ if (!after || !notAfter)
345
+ return after ?? notAfter;
346
+ return Date.parse(after.collectedAt) - at <
347
+ at - Date.parse(notAfter.collectedAt)
348
+ ? after
349
+ : notAfter;
350
+ }
351
+ /** A `{stream, data}` row: a record tagged with its stream, not a stream row. */
352
+ function isTaggedRecord(row) {
353
+ if (row === null || typeof row !== "object" || Array.isArray(row)) {
354
+ return false;
355
+ }
356
+ const { stream, data } = row;
357
+ return (typeof stream === "string" &&
358
+ data !== null &&
359
+ typeof data === "object" &&
360
+ !Array.isArray(data));
361
+ }
362
+ function isRecordsBody(data) {
363
+ if (data === null || typeof data !== "object" || Array.isArray(data)) {
364
+ return false;
365
+ }
366
+ const keys = Object.keys(data).filter((key) => !SERVER_STAMP_KEYS.has(key));
367
+ return (keys.length === 1 &&
368
+ keys[0] === "records" &&
369
+ Array.isArray(data.records));
370
+ }
371
+ //# sourceMappingURL=legacy-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-projection.js","sourceRoot":"","sources":["../../src/storage/legacy-projection.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendatalabs/personal-server-ts-core",
3
- "version": "1.25.1",
3
+ "version": "1.27.0",
4
4
  "description": "Protocol logic for the Vana Personal Server — auth, grants, scopes, storage, keys",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -68,6 +68,10 @@
68
68
  "types": "./dist/storage/preview.d.ts",
69
69
  "import": "./dist/storage/preview.js"
70
70
  },
71
+ "./storage/legacy-projection": {
72
+ "types": "./dist/storage/legacy-projection.d.ts",
73
+ "import": "./dist/storage/legacy-projection.js"
74
+ },
71
75
  "./storage/blocks/build": {
72
76
  "types": "./dist/storage/blocks/build.d.ts",
73
77
  "import": "./dist/storage/blocks/build.js"
@@ -147,5 +151,8 @@
147
151
  "unpdf": "^1.6.2",
148
152
  "viem": "^2.54.2",
149
153
  "zod": "^4.4.3"
154
+ },
155
+ "devDependencies": {
156
+ "ajv": "^8.20.0"
150
157
  }
151
158
  }