@amalgm/live 0.2.52 → 0.2.54

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 (47) hide show
  1. package/PURPOSE.md +24 -8
  2. package/dist/entities/cloud.d.ts +31 -6
  3. package/dist/entities/cloud.d.ts.map +1 -1
  4. package/dist/entities/cloud.js +210 -47
  5. package/dist/entities/cloud.js.map +1 -1
  6. package/dist/entities/graph-head.d.ts +109 -0
  7. package/dist/entities/graph-head.d.ts.map +1 -0
  8. package/dist/entities/graph-head.js +267 -0
  9. package/dist/entities/graph-head.js.map +1 -0
  10. package/dist/entities/index.d.ts +3 -1
  11. package/dist/entities/index.d.ts.map +1 -1
  12. package/dist/entities/index.js +3 -1
  13. package/dist/entities/index.js.map +1 -1
  14. package/dist/entities/rules.js +2 -2
  15. package/dist/entities/rules.js.map +1 -1
  16. package/dist/entities/types.d.ts +3 -0
  17. package/dist/entities/types.d.ts.map +1 -1
  18. package/dist/entities/types.js +3 -0
  19. package/dist/entities/types.js.map +1 -1
  20. package/dist/files/commands.d.ts.map +1 -1
  21. package/dist/files/commands.js +2 -13
  22. package/dist/files/commands.js.map +1 -1
  23. package/dist/registration/user-ground.d.ts +5 -1
  24. package/dist/registration/user-ground.d.ts.map +1 -1
  25. package/dist/registration/user-ground.js +9 -14
  26. package/dist/registration/user-ground.js.map +1 -1
  27. package/dist/transfer/upload.d.ts +7 -0
  28. package/dist/transfer/upload.d.ts.map +1 -1
  29. package/dist/transfer/upload.js +11 -4
  30. package/dist/transfer/upload.js.map +1 -1
  31. package/dist-cjs/entities/cloud.js +212 -49
  32. package/dist-cjs/entities/cloud.js.map +1 -1
  33. package/dist-cjs/entities/graph-head.js +280 -0
  34. package/dist-cjs/entities/graph-head.js.map +1 -0
  35. package/dist-cjs/entities/index.js +3 -1
  36. package/dist-cjs/entities/index.js.map +1 -1
  37. package/dist-cjs/entities/rules.js +1 -1
  38. package/dist-cjs/entities/rules.js.map +1 -1
  39. package/dist-cjs/entities/types.js +4 -1
  40. package/dist-cjs/entities/types.js.map +1 -1
  41. package/dist-cjs/files/commands.js +1 -12
  42. package/dist-cjs/files/commands.js.map +1 -1
  43. package/dist-cjs/registration/user-ground.js +8 -13
  44. package/dist-cjs/registration/user-ground.js.map +1 -1
  45. package/dist-cjs/transfer/upload.js +13 -4
  46. package/dist-cjs/transfer/upload.js.map +1 -1
  47. package/package.json +1 -1
package/PURPOSE.md CHANGED
@@ -181,14 +181,19 @@ its cutover.
181
181
  stronger current-content witness exists. Repository packing remains
182
182
  transfer preparation and may run beside structural registration, but
183
183
  neither act may weaken the other's result.
184
- 30. **Proof travels forward; bytes do not travel backward.** Capture derives
185
- and stores a block manifest while it already owns an artifact's bytes.
186
- Every ordinary text or binary file enters through the same bounded block
187
- stream; no file type or file size permits a complete-file allocation.
188
- Cold upload reads those sealed bytes once to send them, and cold download
189
- writes received bytes once before their registered adapter consumes them.
190
- Reopening a complete artifact to recreate or repeat an earlier integrity
191
- proof is redundant work, not additional correctness.
184
+ 30. **Proof travels forward; disposable bytes need not.** Registration reads
185
+ every ordinary text or binary file through one bounded stream to classify
186
+ it, derive its content head, and retain any block-manifest evidence needed
187
+ by the later Upload stage. A graph-only Register capture does not copy
188
+ those same bytes into the machine cache merely to preserve them for
189
+ Upload. Upload receives one seekable source selected by the host — an
190
+ already-sealed cache object when one exists, otherwise the registered
191
+ ground itself and verifies every byte it sends against the captured
192
+ content head. A typed source mismatch returns control to Register so it
193
+ can recapture current ground; stale bytes can never be sealed or
194
+ published. Download still writes received bytes once before their
195
+ registered adapter consumes them. No file type or size permits a
196
+ complete-file allocation in the bounded transfer path.
192
197
  31. **A content block is not a round trip.** Text and binary retain independent
193
198
  content-addressed block identities. Cold upload may move complete small
194
199
  artifacts in bounded cargo waves, while cold upload and download move
@@ -267,6 +272,17 @@ its cutover.
267
272
  while its work remains private (`declared` or `prepared`); once revealed,
268
273
  the exact visible target must Verify before Apply advances.
269
274
 
275
+ 42. **The registry graph is immutable pages, and its head is the snapshot.**
276
+ A page is one root's UUID-sorted records serialized canonically under a
277
+ fixed byte budget, identified by the hash of its own bytes, and stored as
278
+ ordinary immutable content. The head names each root's ordered pages and
279
+ nothing else; its checksum proves the head bytes, never a reassembled
280
+ record list. A publication rebuilds only roots it walked and carries every
281
+ other root's committed page list forward byte-identically. The authority
282
+ verifies every replaced root from its pages and requires unchanged roots
283
+ to match the committed head exactly. A first head over a records-shaped
284
+ base pages every root because that base carries no page identities.
285
+
270
286
  ## Five surfaces, one behavior
271
287
 
272
288
  ```
@@ -1,12 +1,19 @@
1
1
  /**
2
2
  * The entity-cloud boundary's pure half (engine
3
3
  * registration/entity-cloud.js): the snapshot codec, record assertions,
4
- * equality, the private resource id, and the repo travel law — only
5
- * logical graph facts, never a path, inode, watcher, or database row.
4
+ * equality, the private resource id, containment selection, and the repo
5
+ * travel law — only logical graph facts, never a path, inode, watcher, or
6
+ * database row.
6
7
  *
7
8
  * Wire parity is the contract here: `stableJson`, record key order, and
8
9
  * snapshot sorting reproduce the engine's bytes exactly, so a snapshot
9
10
  * packed on either side hashes and compares identically.
11
+ *
12
+ * Every ancestor question in this module is answered once per graph, not
13
+ * once per record. A workspace of ~19,000 entities 32 levels deep re-walks
14
+ * the same spine for every record it holds, and that is the difference
15
+ * between a linear pass and a quadratic one. `indexRepositoryTerritory`
16
+ * (src/detection/territory.ts) memoizes the same shape for the same reason.
10
17
  */
11
18
  import { type EntityStatus, type EntityType, type Sha256Hex } from './types.js';
12
19
  /** `@1` could project arbitrary pre-cloud registrations. `@2` omitted the
@@ -51,10 +58,16 @@ export declare function privateEntityResourceId(userId: string, sha256Hex: Sha25
51
58
  /** The one JSON spelling every snapshot comparison and checksum uses. */
52
59
  export declare const stableJson: (value: unknown) => string;
53
60
  export declare const sameRecord: (left: unknown, right: unknown) => boolean;
54
- /** Two record lists describe the same graph (normalized, sorted, compared whole). */
55
- export declare const sameRecords: (left: readonly unknown[], right: readonly unknown[]) => boolean;
56
- /** Every record in `records` appears byte-identically in `expected`. */
57
- export declare function recordsAreSubset(records: readonly unknown[], expected: readonly unknown[]): boolean;
61
+ /** Two record lists describe the same graph (normalized, sorted, compared
62
+ * field by field).
63
+ *
64
+ * Comparing the canonical bytes would answer the same question, but it would
65
+ * spell out both whole graphs to answer one boolean — megabytes of JSON per
66
+ * call at register scale. `assertRecord` guarantees the equivalence: every
67
+ * normalized record carries exactly these eight keys in this order, and every
68
+ * value is `string | null`, never `undefined`. JSON's spelling of a string is
69
+ * injective, so field-wise equality and byte equality decide identically. */
70
+ export declare function sameRecords(left: readonly unknown[], right: readonly unknown[]): boolean;
58
71
  /**
59
72
  * Validate one snapshot record and normalize it (UUIDs lowercased,
60
73
  * transportVersion defaulted to null). Refusals: an invalid shape; a
@@ -102,6 +115,18 @@ export declare function travelingRecords(records: readonly unknown[], sha256Hex:
102
115
  /** Normalize records into the one canonical snapshot: asserted, sorted by
103
116
  * uuid, duplicates refused. */
104
117
  export declare function snapshotFromRecords(records: readonly unknown[]): CloudSnapshot;
118
+ /** One complete subtree of an already-normalized record list: `rootUuid` and
119
+ * everything that descends from it, in the order it arrived.
120
+ *
121
+ * Containment is reachability down child edges, so it is answered by one
122
+ * walk over one child index — not by sweeping the whole graph until a fixed
123
+ * point stops moving. Records sorted by UUID arrive in no useful tree order,
124
+ * so a sweep adds roughly one level per pass and pays the graph's full depth
125
+ * in whole-list scans. Reachability is the whole law, exactly as a sweep
126
+ * decided it: a record in a cycle the root cannot reach stays out, and a
127
+ * record whose named parent is the root itself stays in even when no record
128
+ * for that root is present. */
129
+ export declare function containedRecords(records: readonly CloudEntityRecord[], rootUuid: string): readonly CloudEntityRecord[];
105
130
  /** Build the complete, self-contained root replacement carried by cold
106
131
  * Register. Every declared root must be present, every record must descend
107
132
  * from one of those roots inside this same operation, and active slots must
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/entities/cloud.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/entities/cloud.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,21 @@
1
1
  /**
2
2
  * The entity-cloud boundary's pure half (engine
3
3
  * registration/entity-cloud.js): the snapshot codec, record assertions,
4
- * equality, the private resource id, and the repo travel law — only
5
- * logical graph facts, never a path, inode, watcher, or database row.
4
+ * equality, the private resource id, containment selection, and the repo
5
+ * travel law — only logical graph facts, never a path, inode, watcher, or
6
+ * database row.
6
7
  *
7
8
  * Wire parity is the contract here: `stableJson`, record key order, and
8
9
  * snapshot sorting reproduce the engine's bytes exactly, so a snapshot
9
10
  * packed on either side hashes and compares identically.
11
+ *
12
+ * Every ancestor question in this module is answered once per graph, not
13
+ * once per record. A workspace of ~19,000 entities 32 levels deep re-walks
14
+ * the same spine for every record it holds, and that is the difference
15
+ * between a linear pass and a quadratic one. `indexRepositoryTerritory`
16
+ * (src/detection/territory.ts) memoizes the same shape for the same reason.
10
17
  */
11
- import { CONTAINERS, DERIVED_PAYLOAD, ROOT_TYPES, TYPES, UUID_PATTERN, } from './types.js';
18
+ import { CONTAINERS, DERIVED_PAYLOAD, ROOT_TYPES, STATUSES, TYPES, UUID_PATTERN, } from './types.js';
12
19
  import { bytesToBase64Url, hexToBytes, utf8Decode } from './bytes.js';
13
20
  import { canonicalVersion, membershipHash } from './rules.js';
14
21
  /** `@1` could project arbitrary pre-cloud registrations. `@2` omitted the
@@ -31,13 +38,32 @@ export function privateEntityResourceId(userId, sha256Hex) {
31
38
  /** The one JSON spelling every snapshot comparison and checksum uses. */
32
39
  export const stableJson = (value) => JSON.stringify(value);
33
40
  export const sameRecord = (left, right) => stableJson(left) === stableJson(right);
34
- /** Two record lists describe the same graph (normalized, sorted, compared whole). */
35
- export const sameRecords = (left, right) => sameRecord(snapshotFromRecords(left), snapshotFromRecords(right));
36
- /** Every record in `records` appears byte-identically in `expected`. */
37
- export function recordsAreSubset(records, expected) {
38
- const expectedByUuid = new Map(snapshotFromRecords(expected).records.map((record) => [record.uuid, record]));
39
- return snapshotFromRecords(records).records
40
- .every((record) => sameRecord(record, expectedByUuid.get(record.uuid)));
41
+ /** The eight canonical record fields, in the order `assertRecord` emits them. */
42
+ const RECORD_FIELDS = [
43
+ 'uuid', 'type', 'parentUUID', 'name', 'status', 'version', 'payloadVersion', 'transportVersion',
44
+ ];
45
+ /** Two record lists describe the same graph (normalized, sorted, compared
46
+ * field by field).
47
+ *
48
+ * Comparing the canonical bytes would answer the same question, but it would
49
+ * spell out both whole graphs to answer one boolean — megabytes of JSON per
50
+ * call at register scale. `assertRecord` guarantees the equivalence: every
51
+ * normalized record carries exactly these eight keys in this order, and every
52
+ * value is `string | null`, never `undefined`. JSON's spelling of a string is
53
+ * injective, so field-wise equality and byte equality decide identically. */
54
+ export function sameRecords(left, right) {
55
+ const ours = snapshotFromRecords(left).records;
56
+ const theirs = snapshotFromRecords(right).records;
57
+ if (ours.length !== theirs.length)
58
+ return false;
59
+ for (let index = 0; index < ours.length; index += 1) {
60
+ const mine = ours[index];
61
+ const yours = theirs[index];
62
+ for (const field of RECORD_FIELDS)
63
+ if (mine[field] !== yours[field])
64
+ return false;
65
+ }
66
+ return true;
41
67
  }
42
68
  /**
43
69
  * Validate one snapshot record and normalize it (UUIDs lowercased,
@@ -52,7 +78,7 @@ export function assertRecord(value) {
52
78
  || typeof record.type !== 'string' || !TYPES.has(record.type)
53
79
  || (record.parentUUID !== null && (typeof record.parentUUID !== 'string' || !UUID_PATTERN.test(record.parentUUID)))
54
80
  || typeof record.name !== 'string' || !record.name || record.name.includes('/') || record.name.includes('\0')
55
- || !['active', 'trashed', 'deleted'].includes(record.status)
81
+ || !STATUSES.has(record.status)
56
82
  || typeof record.version !== 'string' || !/^[0-9a-f]{64}$/.test(record.version)
57
83
  || (record.payloadVersion !== null && typeof record.payloadVersion !== 'string')
58
84
  || (record.transportVersion !== undefined && record.transportVersion !== null
@@ -80,6 +106,66 @@ export function assertRecord(value) {
80
106
  transportVersion,
81
107
  };
82
108
  }
109
+ /** A chain that never terminates, so no node on it can name a repository. */
110
+ const CYCLIC_CHAIN = Symbol('cyclic parent chain');
111
+ /**
112
+ * The repo travel law resolved once per graph. Asking it record by record
113
+ * re-walks the same spine for every entity the spine holds, which is
114
+ * quadratic in a deep workspace; the answer only ever depends on where the
115
+ * walk starts, so one memo serves every asker.
116
+ *
117
+ * The memo holds the nearest repository's UUID rather than a boolean because
118
+ * the naive walk's refusal is asker-dependent: it seeds its `seen` set with
119
+ * the asking record's own UUID, so a repository that is its own nearest
120
+ * repository is convicted of a cycle before its type can answer `true`. That
121
+ * is the single case where a chain-only answer would differ, and comparing
122
+ * the resolved UUID against the asker restores it exactly.
123
+ */
124
+ function createRepositoryEnclosure(lookup) {
125
+ const nearest = new Map();
126
+ const resolve = (start) => {
127
+ const walked = [];
128
+ const walking = new Set();
129
+ let cursor = start;
130
+ let answer = null;
131
+ for (;;) {
132
+ if (cursor === null || cursor === undefined)
133
+ break;
134
+ const memoized = nearest.get(cursor);
135
+ if (memoized !== undefined) {
136
+ answer = memoized;
137
+ break;
138
+ }
139
+ if (walking.has(cursor)) {
140
+ answer = CYCLIC_CHAIN;
141
+ break;
142
+ }
143
+ walking.add(cursor);
144
+ walked.push(cursor);
145
+ const node = lookup(cursor);
146
+ if (!node)
147
+ break;
148
+ if (node.type === 'repo.git') {
149
+ answer = cursor;
150
+ break;
151
+ }
152
+ cursor = node.parentUUID;
153
+ }
154
+ for (const uuid of walked)
155
+ nearest.set(uuid, answer);
156
+ return answer;
157
+ };
158
+ return (record) => {
159
+ const { parentUUID } = record;
160
+ if (parentUUID === null || parentUUID === undefined)
161
+ return false;
162
+ const repository = resolve(parentUUID);
163
+ if (repository === CYCLIC_CHAIN || repository === record.uuid) {
164
+ throw new Error(`cloud entity ${record.uuid} has a cyclic parent chain`);
165
+ }
166
+ return repository !== null;
167
+ };
168
+ }
83
169
  /**
84
170
  * The repo travel law: a record with a `repo.git` PROPER ancestor never
85
171
  * travels to the cloud on its own. The repository is the sync boundary —
@@ -92,20 +178,7 @@ export function assertRecord(value) {
92
178
  * silently unsynced entity.
93
179
  */
94
180
  export function enclosedByRepositoryAncestor(record, lookup) {
95
- const seen = new Set([record.uuid]);
96
- let parentUUID = record.parentUUID;
97
- while (parentUUID !== null && parentUUID !== undefined) {
98
- if (seen.has(parentUUID))
99
- throw new Error(`cloud entity ${record.uuid} has a cyclic parent chain`);
100
- seen.add(parentUUID);
101
- const parent = lookup(parentUUID);
102
- if (!parent)
103
- return false;
104
- if (parent.type === 'repo.git')
105
- return true;
106
- parentUUID = parent.parentUUID;
107
- }
108
- return false;
181
+ return createRepositoryEnclosure(lookup)(record);
109
182
  }
110
183
  /** Project a complete local entity graph onto the cloud registry. Ordinary
111
184
  * repository children keep their local SQLite identities inside the nearest
@@ -125,10 +198,16 @@ export function enclosedByRepositoryAncestor(record, lookup) {
125
198
  export function travelingRecords(records, sha256Hex) {
126
199
  const snapshot = snapshotFromRecords(records);
127
200
  const byUuid = new Map(snapshot.records.map((record) => [record.uuid, record]));
128
- const traveling = new Set(snapshot.records
129
- .filter((record) => !enclosedByRepositoryAncestor(record, (uuid) => byUuid.get(uuid)))
130
- .map((record) => record.uuid));
131
- for (const repository of snapshot.records.filter((record) => record.type === 'repo.git')) {
201
+ const encloses = createRepositoryEnclosure((uuid) => byUuid.get(uuid));
202
+ const repositories = [];
203
+ const traveling = new Set();
204
+ for (const record of snapshot.records) {
205
+ if (record.type === 'repo.git')
206
+ repositories.push(record);
207
+ if (!encloses(record))
208
+ traveling.add(record.uuid);
209
+ }
210
+ for (const repository of repositories) {
132
211
  let cursor = repository;
133
212
  while (cursor) {
134
213
  traveling.add(cursor.uuid);
@@ -137,13 +216,20 @@ export function travelingRecords(records, sha256Hex) {
137
216
  cursor = byUuid.get(cursor.parentUUID);
138
217
  }
139
218
  }
140
- const narrowed = new Set(snapshot.records
141
- .filter((record) => !traveling.has(record.uuid) && record.status === 'active'
142
- && record.parentUUID !== null && traveling.has(record.parentUUID))
143
- .map((record) => record.parentUUID));
144
- const projected = snapshot.records.filter((record) => traveling.has(record.uuid));
219
+ // The containers that lost active children, the records that survive, and
220
+ // each survivor's active membership all read the same list — so they read
221
+ // it once.
222
+ const narrowed = new Set();
223
+ const projected = [];
145
224
  const activeChildren = new Map();
146
- for (const record of projected) {
225
+ for (const record of snapshot.records) {
226
+ if (!traveling.has(record.uuid)) {
227
+ if (record.status === 'active' && record.parentUUID !== null && traveling.has(record.parentUUID)) {
228
+ narrowed.add(record.parentUUID);
229
+ }
230
+ continue;
231
+ }
232
+ projected.push(record);
147
233
  if (record.status !== 'active' || record.parentUUID === null)
148
234
  continue;
149
235
  const siblings = activeChildren.get(record.parentUUID);
@@ -170,8 +256,11 @@ export function travelingRecords(records, sha256Hex) {
170
256
  export function snapshotFromRecords(records) {
171
257
  const normalized = records.map(assertRecord)
172
258
  .sort((left, right) => (left.uuid < right.uuid ? -1 : left.uuid > right.uuid ? 1 : 0));
173
- if (new Set(normalized.map((record) => record.uuid)).size !== normalized.length) {
174
- throw new Error('cloud entity snapshot has duplicate UUIDs');
259
+ // Sorted, so duplicates are adjacent: no second array and no set to build.
260
+ for (let index = 1; index < normalized.length; index += 1) {
261
+ if (normalized[index].uuid === normalized[index - 1].uuid) {
262
+ throw new Error('cloud entity snapshot has duplicate UUIDs');
263
+ }
175
264
  }
176
265
  return {
177
266
  schemaVersion: ENTITY_CLOUD_SCHEMA_VERSION,
@@ -179,6 +268,83 @@ export function snapshotFromRecords(records) {
179
268
  records: normalized,
180
269
  };
181
270
  }
271
+ /** One complete subtree of an already-normalized record list: `rootUuid` and
272
+ * everything that descends from it, in the order it arrived.
273
+ *
274
+ * Containment is reachability down child edges, so it is answered by one
275
+ * walk over one child index — not by sweeping the whole graph until a fixed
276
+ * point stops moving. Records sorted by UUID arrive in no useful tree order,
277
+ * so a sweep adds roughly one level per pass and pays the graph's full depth
278
+ * in whole-list scans. Reachability is the whole law, exactly as a sweep
279
+ * decided it: a record in a cycle the root cannot reach stays out, and a
280
+ * record whose named parent is the root itself stays in even when no record
281
+ * for that root is present. */
282
+ export function containedRecords(records, rootUuid) {
283
+ const children = new Map();
284
+ for (const record of records) {
285
+ if (record.parentUUID === null)
286
+ continue;
287
+ const siblings = children.get(record.parentUUID);
288
+ if (siblings)
289
+ siblings.push(record);
290
+ else
291
+ children.set(record.parentUUID, [record]);
292
+ }
293
+ const included = new Set([rootUuid]);
294
+ const frontier = [rootUuid];
295
+ while (frontier.length > 0) {
296
+ for (const child of children.get(frontier.pop()) ?? []) {
297
+ if (included.has(child.uuid))
298
+ continue;
299
+ included.add(child.uuid);
300
+ frontier.push(child.uuid);
301
+ }
302
+ }
303
+ return records.filter((record) => included.has(record.uuid));
304
+ }
305
+ /** The two ways a record's climb to a root can fail. */
306
+ const PARENT_CYCLE = Symbol('parent cycle');
307
+ const INCOMPLETE_ANCESTRY = Symbol('incomplete ancestry');
308
+ /** Answer "which root is above this record" once per node instead of once
309
+ * per record. Unlike the enclosure walk this one starts its cycle set empty,
310
+ * so the answer is already a pure function of where the climb begins: every
311
+ * node the climb crosses shares the answer it lands on, faults included —
312
+ * a node leading into a cycle can only ever lead into that cycle. */
313
+ function createRootResolver(byUuid) {
314
+ const ancestry = new Map();
315
+ return (record) => {
316
+ const walked = [];
317
+ const walking = new Set();
318
+ let cursor = record;
319
+ let answer;
320
+ for (;;) {
321
+ const memoized = ancestry.get(cursor.uuid);
322
+ if (memoized !== undefined) {
323
+ answer = memoized;
324
+ break;
325
+ }
326
+ if (cursor.parentUUID === null) {
327
+ answer = cursor.uuid;
328
+ break;
329
+ }
330
+ if (walking.has(cursor.uuid)) {
331
+ answer = PARENT_CYCLE;
332
+ break;
333
+ }
334
+ walking.add(cursor.uuid);
335
+ walked.push(cursor.uuid);
336
+ const parent = byUuid.get(cursor.parentUUID);
337
+ if (!parent) {
338
+ answer = INCOMPLETE_ANCESTRY;
339
+ break;
340
+ }
341
+ cursor = parent;
342
+ }
343
+ for (const uuid of walked)
344
+ ancestry.set(uuid, answer);
345
+ return answer;
346
+ };
347
+ }
182
348
  /** Build the complete, self-contained root replacement carried by cold
183
349
  * Register. Every declared root must be present, every record must descend
184
350
  * from one of those roots inside this same operation, and active slots must
@@ -206,6 +372,7 @@ export function rootReplacementFromRecords(rootIds, records) {
206
372
  || actual.some((rootId, index) => rootId !== normalizedRoots[index])) {
207
373
  throw new Error('cloud root replacement records do not exactly match its roots');
208
374
  }
375
+ const ancestryOf = createRootResolver(byUuid);
209
376
  const activeSlots = new Set();
210
377
  for (const record of snapshot.records) {
211
378
  if (record.parentUUID !== null) {
@@ -220,17 +387,13 @@ export function rootReplacementFromRecords(rootIds, records) {
220
387
  activeSlots.add(slot);
221
388
  }
222
389
  }
223
- const seen = new Set();
224
- let cursor = record;
225
- while (cursor.parentUUID !== null) {
226
- if (seen.has(cursor.uuid))
227
- throw new Error('cloud root replacement has a parent cycle');
228
- seen.add(cursor.uuid);
229
- cursor = byUuid.get(cursor.parentUUID);
230
- if (!cursor)
231
- throw new Error(`cloud root replacement entity ${record.uuid} has incomplete ancestry`);
390
+ const ancestry = ancestryOf(record);
391
+ if (ancestry === PARENT_CYCLE)
392
+ throw new Error('cloud root replacement has a parent cycle');
393
+ if (ancestry === INCOMPLETE_ANCESTRY) {
394
+ throw new Error(`cloud root replacement entity ${record.uuid} has incomplete ancestry`);
232
395
  }
233
- if (!declared.has(cursor.uuid)) {
396
+ if (!declared.has(ancestry)) {
234
397
  throw new Error(`cloud root replacement entity ${record.uuid} is outside its declared roots`);
235
398
  }
236
399
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/entities/cloud.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/entities/cloud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Immutable graph pages and the committed graph head.
3
+ *
4
+ * The registry resource is only ever written by Register, and Register
5
+ * always replaces whole roots. So the immutable unit of graph publication
6
+ * is the root subtree: each root's canonical records split into
7
+ * content-addressed pages, and the whole graph named by one small head —
8
+ * sorted roots, each listing its ordered pages. Publishing a workspace
9
+ * uploads that workspace's pages and commits a head that names every other
10
+ * root's pages unchanged; nothing about an untouched root is rebuilt,
11
+ * serialized, journaled, or transmitted.
12
+ *
13
+ * Laws:
14
+ * - Page bytes are the canonical JSON array of a contiguous uuid-sorted
15
+ * slice of one root's records; the page's identity is the SHA-256 of
16
+ * those exact bytes.
17
+ * - Pagination is canonical: the same records always split into the same
18
+ * pages (`pagesForRoot`), so two machines paging one root agree
19
+ * byte-for-byte and an unchanged root is provable by page-list identity.
20
+ * - The head is total: it names every root of the graph. Its checksum,
21
+ * `sha256(stableJson(head))`, is the graph's snapshot checksum.
22
+ * - Assembly re-proves everything it accepts: page hashes, root-subtree
23
+ * laws (via `rootReplacementFromRecords`), and canonical pagination.
24
+ */
25
+ import { type Sha256Hex } from './types.js';
26
+ import { type CloudEntityRecord } from './cloud.js';
27
+ /** Byte budget one page targets. A single record larger than the budget
28
+ * still travels as its own page: the budget bounds waste, never validity. */
29
+ export declare const GRAPH_PAGE_BYTES: number;
30
+ export declare const GRAPH_HEAD_KIND = "amalgm-entity-registry-head";
31
+ export declare const GRAPH_HEAD_OPERATION_KIND = "entity.graph.head";
32
+ /** One immutable page: identity, size, and how many records it carries. */
33
+ export interface GraphPageRef {
34
+ readonly sha256: string;
35
+ readonly bytes: number;
36
+ readonly records: number;
37
+ }
38
+ /** One root of the committed graph and its ordered pages. */
39
+ export interface GraphHeadRoot {
40
+ readonly rootId: string;
41
+ readonly pages: readonly GraphPageRef[];
42
+ }
43
+ /** The committed graph head: the total graph as sorted roots over
44
+ * immutable pages. This exact value, canonically serialized, is the
45
+ * authority's stored snapshot and the input to the graph checksum. */
46
+ export interface CloudGraphHead {
47
+ readonly schemaVersion: number;
48
+ readonly kind: typeof GRAPH_HEAD_KIND;
49
+ readonly roots: readonly GraphHeadRoot[];
50
+ }
51
+ /** One atomic head commit: the complete new head plus the roots whose
52
+ * pages the publisher rebuilt. Every root outside `replacedRootIds` must
53
+ * carry page lists identical to the authority's current head — the
54
+ * structural proof the publisher folded on the base it claims. A replaced
55
+ * root absent from the head is a root deletion. */
56
+ export interface CloudGraphHeadReplacement {
57
+ readonly kind: typeof GRAPH_HEAD_OPERATION_KIND;
58
+ readonly head: CloudGraphHead;
59
+ readonly replacedRootIds: readonly string[];
60
+ }
61
+ /** A page with its proof and its parsed records. */
62
+ export interface GraphPage {
63
+ readonly ref: GraphPageRef;
64
+ readonly bytes: Uint8Array;
65
+ readonly records: readonly CloudEntityRecord[];
66
+ }
67
+ /** Split one complete root subtree into its canonical pages. The records
68
+ * must be exactly the subtree — the same law `entity.roots.replace`
69
+ * enforced — so every page set that exists is lawful by construction. */
70
+ export declare function pagesForRoot(rootId: string, records: readonly unknown[], sha256Hex: Sha256Hex): readonly GraphPage[];
71
+ /** Group a record list by the root each record descends from, every group
72
+ * uuid-sorted. A record no root reaches down child edges — an orphan or a
73
+ * cycle — refuses the graph rather than silently dropping out of it. */
74
+ export declare function recordsByRoot(records: readonly unknown[]): ReadonlyMap<string, readonly CloudEntityRecord[]>;
75
+ /** Build the canonical head from per-root page lists: roots validated,
76
+ * sorted, duplicates refused; every root carries at least one page
77
+ * because every root holds at least its own record. */
78
+ export declare function graphHeadFromRootPages(roots: readonly {
79
+ readonly rootId: string;
80
+ readonly pages: readonly GraphPageRef[];
81
+ }[]): CloudGraphHead;
82
+ /** The graph's snapshot checksum: the SHA-256 of the head's canonical
83
+ * serialization. Unchanged roots contribute only their page identities,
84
+ * so the checksum never requires materializing their records. */
85
+ export declare function graphHeadChecksum(head: CloudGraphHead, sha256Hex: Sha256Hex): string;
86
+ /** Parse head bytes (or their UTF-8 text) back into the canonical form. */
87
+ export declare function parseGraphHead(bytes: Uint8Array | string): CloudGraphHead;
88
+ /** Two page lists name the same immutable pages in the same order. */
89
+ export declare function sameRootPages(left: readonly GraphPageRef[], right: readonly GraphPageRef[]): boolean;
90
+ /** Re-prove one root from its page bytes: every page's hash, size, and
91
+ * count; the complete subtree laws; and canonical pagination, so a lawful
92
+ * but differently-split page set is refused rather than cached as a
93
+ * second spelling of the same root. Returns the root's uuid-sorted
94
+ * records. */
95
+ export declare function assembleRootRecords(rootId: string, refs: readonly GraphPageRef[], pages: readonly Uint8Array[], sha256Hex: Sha256Hex): readonly CloudEntityRecord[];
96
+ /** Build the atomic head-commit operation. */
97
+ export declare function graphHeadReplacement(head: CloudGraphHead, replacedRootIds: readonly string[]): CloudGraphHeadReplacement;
98
+ /** Page every root of a complete record list — the transition from a
99
+ * records-shape snapshot to its head, and the shape of a first
100
+ * publication that must name the whole account. */
101
+ export declare function graphHeadFromSnapshotRecords(records: readonly unknown[], sha256Hex: Sha256Hex): {
102
+ readonly head: CloudGraphHead;
103
+ readonly pages: readonly GraphPage[];
104
+ };
105
+ /** Materialize the complete graph a head names, reading each page's bytes
106
+ * through `readPage`. Every root is re-proved on the way in; the result is
107
+ * the canonical whole-graph record list. */
108
+ export declare function recordsFromHead(head: CloudGraphHead, readPage: (ref: GraphPageRef) => Uint8Array, sha256Hex: Sha256Hex): readonly CloudEntityRecord[];
109
+ //# sourceMappingURL=graph-head.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-head.d.ts","sourceRoot":"","sources":["../../src/entities/graph-head.ts"],"names":[],"mappings":"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"}