@amalgm/live 0.2.26 → 0.2.28

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 (197) hide show
  1. package/PURPOSE.md +52 -29
  2. package/README.md +1 -2
  3. package/dist/contracts/index.d.ts +0 -1
  4. package/dist/contracts/index.d.ts.map +1 -1
  5. package/dist/contracts/index.js +0 -1
  6. package/dist/contracts/index.js.map +1 -1
  7. package/dist/detection/record-proposal.d.ts +3 -2
  8. package/dist/detection/record-proposal.d.ts.map +1 -1
  9. package/dist/detection/record-proposal.js +9 -7
  10. package/dist/detection/record-proposal.js.map +1 -1
  11. package/dist/index.d.ts +3 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/machines/index.d.ts +0 -2
  16. package/dist/machines/index.d.ts.map +1 -1
  17. package/dist/machines/index.js +0 -2
  18. package/dist/machines/index.js.map +1 -1
  19. package/dist/records/authority.d.ts +23 -0
  20. package/dist/records/authority.d.ts.map +1 -0
  21. package/dist/records/authority.js +28 -0
  22. package/dist/records/authority.js.map +1 -0
  23. package/dist/records/codec.d.ts +6 -0
  24. package/dist/records/codec.d.ts.map +1 -0
  25. package/dist/records/codec.js +42 -0
  26. package/dist/records/codec.js.map +1 -0
  27. package/dist/records/contracts.d.ts +46 -0
  28. package/dist/records/contracts.d.ts.map +1 -0
  29. package/dist/records/contracts.js +114 -0
  30. package/dist/records/contracts.js.map +1 -0
  31. package/dist/records/inbox.d.ts +18 -0
  32. package/dist/records/inbox.d.ts.map +1 -0
  33. package/dist/records/inbox.js +34 -0
  34. package/dist/records/inbox.js.map +1 -0
  35. package/dist/records/index.d.ts +7 -0
  36. package/dist/records/index.d.ts.map +1 -0
  37. package/dist/records/index.js +7 -0
  38. package/dist/records/index.js.map +1 -0
  39. package/dist/records/outbox.d.ts +20 -0
  40. package/dist/records/outbox.d.ts.map +1 -0
  41. package/dist/records/outbox.js +44 -0
  42. package/dist/records/outbox.js.map +1 -0
  43. package/dist/registration/user-ground.d.ts +5 -2
  44. package/dist/registration/user-ground.d.ts.map +1 -1
  45. package/dist/registration/user-ground.js +14 -3
  46. package/dist/registration/user-ground.js.map +1 -1
  47. package/dist/watching/suspicion.d.ts.map +1 -1
  48. package/dist/watching/suspicion.js +29 -1
  49. package/dist/watching/suspicion.js.map +1 -1
  50. package/dist-cjs/contracts/binding.js +26 -0
  51. package/dist-cjs/contracts/binding.js.map +1 -0
  52. package/dist-cjs/contracts/content.js +99 -0
  53. package/dist-cjs/contracts/content.js.map +1 -0
  54. package/dist-cjs/contracts/docs.js +56 -0
  55. package/dist-cjs/contracts/docs.js.map +1 -0
  56. package/dist-cjs/contracts/events.js +44 -0
  57. package/dist-cjs/contracts/events.js.map +1 -0
  58. package/dist-cjs/contracts/frames/gateway.js +39 -0
  59. package/dist-cjs/contracts/frames/gateway.js.map +1 -0
  60. package/dist-cjs/contracts/frames/stream.js +20 -0
  61. package/dist-cjs/contracts/frames/stream.js.map +1 -0
  62. package/dist-cjs/contracts/frames/tunnel.js +60 -0
  63. package/dist-cjs/contracts/frames/tunnel.js.map +1 -0
  64. package/dist-cjs/contracts/index.js +34 -0
  65. package/dist-cjs/contracts/index.js.map +1 -0
  66. package/dist-cjs/contracts/presence.js +38 -0
  67. package/dist-cjs/contracts/presence.js.map +1 -0
  68. package/dist-cjs/contracts/resources.js +114 -0
  69. package/dist-cjs/contracts/resources.js.map +1 -0
  70. package/dist-cjs/contracts/snapshot.js +31 -0
  71. package/dist-cjs/contracts/snapshot.js.map +1 -0
  72. package/dist-cjs/contracts/validate.js +34 -0
  73. package/dist-cjs/contracts/validate.js.map +1 -0
  74. package/dist-cjs/detection/adapter-contract.js +168 -0
  75. package/dist-cjs/detection/adapter-contract.js.map +1 -0
  76. package/dist-cjs/detection/batch.js +71 -0
  77. package/dist-cjs/detection/batch.js.map +1 -0
  78. package/dist-cjs/detection/classify.js +48 -0
  79. package/dist-cjs/detection/classify.js.map +1 -0
  80. package/dist-cjs/detection/content.js +122 -0
  81. package/dist-cjs/detection/content.js.map +1 -0
  82. package/dist-cjs/detection/continuity.js +88 -0
  83. package/dist-cjs/detection/continuity.js.map +1 -0
  84. package/dist-cjs/detection/diff.js +193 -0
  85. package/dist-cjs/detection/diff.js.map +1 -0
  86. package/dist-cjs/detection/echo.js +25 -0
  87. package/dist-cjs/detection/echo.js.map +1 -0
  88. package/dist-cjs/detection/enrollment.js +189 -0
  89. package/dist-cjs/detection/enrollment.js.map +1 -0
  90. package/dist-cjs/detection/index.js +57 -0
  91. package/dist-cjs/detection/index.js.map +1 -0
  92. package/dist-cjs/detection/record-proposal.js +170 -0
  93. package/dist-cjs/detection/record-proposal.js.map +1 -0
  94. package/dist-cjs/detection/refusal.js +44 -0
  95. package/dist-cjs/detection/refusal.js.map +1 -0
  96. package/dist-cjs/detection/repository.js +67 -0
  97. package/dist-cjs/detection/repository.js.map +1 -0
  98. package/dist-cjs/detection/territory.js +82 -0
  99. package/dist-cjs/detection/territory.js.map +1 -0
  100. package/dist-cjs/detection/watch-boundary.js +51 -0
  101. package/dist-cjs/detection/watch-boundary.js.map +1 -0
  102. package/dist-cjs/entities/bytes.js +92 -0
  103. package/dist-cjs/entities/bytes.js.map +1 -0
  104. package/dist-cjs/entities/cloud.js +171 -0
  105. package/dist-cjs/entities/cloud.js.map +1 -0
  106. package/dist-cjs/entities/index.js +39 -0
  107. package/dist-cjs/entities/index.js.map +1 -0
  108. package/dist-cjs/entities/moves.js +85 -0
  109. package/dist-cjs/entities/moves.js.map +1 -0
  110. package/dist-cjs/entities/repo-states.js +256 -0
  111. package/dist-cjs/entities/repo-states.js.map +1 -0
  112. package/dist-cjs/entities/rules.js +216 -0
  113. package/dist-cjs/entities/rules.js.map +1 -0
  114. package/dist-cjs/entities/types.js +44 -0
  115. package/dist-cjs/entities/types.js.map +1 -0
  116. package/dist-cjs/files/commands.js +120 -0
  117. package/dist-cjs/files/commands.js.map +1 -0
  118. package/dist-cjs/files/index.js +19 -0
  119. package/dist-cjs/files/index.js.map +1 -0
  120. package/dist-cjs/index.js +39 -0
  121. package/dist-cjs/index.js.map +1 -0
  122. package/dist-cjs/machines/arbitration.js +41 -0
  123. package/dist-cjs/machines/arbitration.js.map +1 -0
  124. package/dist-cjs/machines/backoff.js +38 -0
  125. package/dist-cjs/machines/backoff.js.map +1 -0
  126. package/dist-cjs/machines/bootstrap.js +110 -0
  127. package/dist-cjs/machines/bootstrap.js.map +1 -0
  128. package/dist-cjs/machines/chunks.js +72 -0
  129. package/dist-cjs/machines/chunks.js.map +1 -0
  130. package/dist-cjs/machines/index.js +28 -0
  131. package/dist-cjs/machines/index.js.map +1 -0
  132. package/dist-cjs/machines/presence.js +53 -0
  133. package/dist-cjs/machines/presence.js.map +1 -0
  134. package/dist-cjs/merge/index.js +25 -0
  135. package/dist-cjs/merge/index.js.map +1 -0
  136. package/dist-cjs/merge/merge3.js +191 -0
  137. package/dist-cjs/merge/merge3.js.map +1 -0
  138. package/dist-cjs/package.json +1 -0
  139. package/dist-cjs/records/authority.js +31 -0
  140. package/dist-cjs/records/authority.js.map +1 -0
  141. package/dist-cjs/records/codec.js +48 -0
  142. package/dist-cjs/records/codec.js.map +1 -0
  143. package/dist-cjs/records/contracts.js +121 -0
  144. package/dist-cjs/records/contracts.js.map +1 -0
  145. package/dist-cjs/records/inbox.js +37 -0
  146. package/dist-cjs/records/inbox.js.map +1 -0
  147. package/dist-cjs/records/index.js +23 -0
  148. package/dist-cjs/records/index.js.map +1 -0
  149. package/dist-cjs/records/outbox.js +48 -0
  150. package/dist-cjs/records/outbox.js.map +1 -0
  151. package/dist-cjs/registration/index.js +19 -0
  152. package/dist-cjs/registration/index.js.map +1 -0
  153. package/dist-cjs/registration/user-ground.js +183 -0
  154. package/dist-cjs/registration/user-ground.js.map +1 -0
  155. package/dist-cjs/transfer/artifacts.js +75 -0
  156. package/dist-cjs/transfer/artifacts.js.map +1 -0
  157. package/dist-cjs/transfer/batches.js +44 -0
  158. package/dist-cjs/transfer/batches.js.map +1 -0
  159. package/dist-cjs/transfer/download.js +88 -0
  160. package/dist-cjs/transfer/download.js.map +1 -0
  161. package/dist-cjs/transfer/index.js +21 -0
  162. package/dist-cjs/transfer/index.js.map +1 -0
  163. package/dist-cjs/transfer/parallel.js +35 -0
  164. package/dist-cjs/transfer/parallel.js.map +1 -0
  165. package/dist-cjs/transfer/upload.js +161 -0
  166. package/dist-cjs/transfer/upload.js.map +1 -0
  167. package/dist-cjs/watching/coverage.js +54 -0
  168. package/dist-cjs/watching/coverage.js.map +1 -0
  169. package/dist-cjs/watching/index.js +24 -0
  170. package/dist-cjs/watching/index.js.map +1 -0
  171. package/dist-cjs/watching/suspicion.js +105 -0
  172. package/dist-cjs/watching/suspicion.js.map +1 -0
  173. package/dist-cjs/workspace/api.js +66 -0
  174. package/dist-cjs/workspace/api.js.map +1 -0
  175. package/dist-cjs/workspace/identity.js +32 -0
  176. package/dist-cjs/workspace/identity.js.map +1 -0
  177. package/dist-cjs/workspace/index.js +14 -0
  178. package/dist-cjs/workspace/index.js.map +1 -0
  179. package/dist-cjs/workspace/memory-store.js +21 -0
  180. package/dist-cjs/workspace/memory-store.js.map +1 -0
  181. package/dist-cjs/workspace/registry.js +98 -0
  182. package/dist-cjs/workspace/registry.js.map +1 -0
  183. package/dist-cjs/workspace/types.js +3 -0
  184. package/dist-cjs/workspace/types.js.map +1 -0
  185. package/package.json +30 -8
  186. package/dist/contracts/mutation.d.ts +0 -51
  187. package/dist/contracts/mutation.d.ts.map +0 -1
  188. package/dist/contracts/mutation.js +0 -55
  189. package/dist/contracts/mutation.js.map +0 -1
  190. package/dist/machines/journal.d.ts +0 -63
  191. package/dist/machines/journal.d.ts.map +0 -1
  192. package/dist/machines/journal.js +0 -71
  193. package/dist/machines/journal.js.map +0 -1
  194. package/dist/machines/ordering.d.ts +0 -53
  195. package/dist/machines/ordering.d.ts.map +0 -1
  196. package/dist/machines/ordering.js +0 -87
  197. package/dist/machines/ordering.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-proposal.js","sourceRoot":"","sources":["../../src/detection/record-proposal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * A REFUSAL: the boundary understood the request and declined it.
4
+ * Ratified by entity-implementation.md ("A refusal is named where it is
5
+ * raised").
6
+ *
7
+ * Two things can go wrong when a caller asks for something, and they
8
+ * mean opposite things:
9
+ *
10
+ * a refusal the request named ground amalgm will not take — excluded
11
+ * by enrollment policy, already owned by another tree, not
12
+ * there at all. Nothing is broken. The message IS the
13
+ * reason and is meant to be shown to whoever asked.
14
+ * a fault the boundary could not do its job — a torn identity
15
+ * store, an unusable database, a bug. The request was
16
+ * fine; the installation is not.
17
+ *
18
+ * A refusal is NAMED WHERE IT IS RAISED, by the code that decided to
19
+ * refuse. It is never guessed later from an error's wording: matching
20
+ * on message text would quietly reclassify every fault as the caller's
21
+ * mistake the moment a message changed, and "your path is bad" is the
22
+ * worst possible thing to say on the day the identity store tears.
23
+ *
24
+ * Callers that must answer differently — an HTTP status, an exit code —
25
+ * ask `isRefusal`. Everything else stays an ordinary Error and travels
26
+ * to whatever handles faults. The mark is a registry symbol
27
+ * (`Symbol.for`), so a refusal raised by one copy of this module is
28
+ * recognized by every other.
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.refusal = refusal;
32
+ exports.isRefusal = isRefusal;
33
+ const REFUSAL = Symbol.for('amalgm.registration.refusal');
34
+ /** Decline a request, with the reason the caller should be shown. */
35
+ function refusal(message) {
36
+ const error = new Error(message);
37
+ error[REFUSAL] = true;
38
+ return error;
39
+ }
40
+ /** True only for an error this boundary deliberately raised as a refusal. */
41
+ function isRefusal(error) {
42
+ return Boolean(error && error[REFUSAL]);
43
+ }
44
+ //# sourceMappingURL=refusal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refusal.js","sourceRoot":"","sources":["../../src/detection/refusal.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;AAKH,0BAIC;AAGD,8BAEC;AAZD,MAAM,OAAO,GAAkB,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAEzE,qEAAqE;AACrE,SAAgB,OAAO,CAAC,OAAe;IACrC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAgC,CAAC;IAChE,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6EAA6E;AAC7E,SAAgB,SAAS,CAAC,KAAc;IACtC,OAAO,OAAO,CAAC,KAAK,IAAK,KAAiC,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /** Repository detection through the existing Card + Checkpoint transport. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.captureRepositoryChange = captureRepositoryChange;
5
+ const repo_states_js_1 = require("../entities/repo-states.js");
6
+ const upload_js_1 = require("../transfer/upload.js");
7
+ const verifyState = (state, sha256Hex) => {
8
+ const cardId = (0, repo_states_js_1.deriveCardId)(state.card, sha256Hex);
9
+ const checkpointId = (0, repo_states_js_1.deriveCheckpointId)(state.checkpoint, sha256Hex);
10
+ const stateId = (0, repo_states_js_1.deriveStateId)(cardId, checkpointId, sha256Hex);
11
+ if (state.cardId !== cardId || state.checkpointId !== checkpointId || state.stateId !== stateId) {
12
+ throw new Error('repository capture IDs do not describe its Card and Checkpoint');
13
+ }
14
+ if (state.pack !== null && sha256Hex(state.pack.bytes) !== state.pack.sha256) {
15
+ throw new Error('repository Git pack does not match its declared hash');
16
+ }
17
+ };
18
+ /**
19
+ * Verify a fresh full Card + Checkpoint observation and seal one incremental
20
+ * repository transport. Git discovery and pack construction are host effects;
21
+ * this function owns the portable IDs, identity-map delta, binary transport,
22
+ * and exact cargo head.
23
+ */
24
+ function captureRepositoryChange(input, sha256Hex) {
25
+ verifyState(input.state, sha256Hex);
26
+ if (input.previous
27
+ && new Set(input.previous.identity.map((entry) => entry.path)).size !== input.previous.identity.length) {
28
+ throw new Error('previous repository identity map has duplicate paths');
29
+ }
30
+ const identity = (0, repo_states_js_1.planRepositoryIdentity)(input.identity, input.previous?.identity ?? null, sha256Hex);
31
+ const currentIdentityHash = (0, repo_states_js_1.repositoryIdentityHash)(input.identity, sha256Hex);
32
+ if (input.previous?.stateId === input.state.stateId
33
+ && (0, repo_states_js_1.repositoryIdentityHash)(input.previous.identity, sha256Hex) === currentIdentityHash) {
34
+ return null;
35
+ }
36
+ const bytes = (0, repo_states_js_1.encodeRepositoryTransport)(input.state, {
37
+ parentTransportVersion: input.previous?.transportVersion ?? null,
38
+ identityHash: identity.identityHash,
39
+ identityDelta: identity.identityDelta,
40
+ });
41
+ const transportVersion = sha256Hex(bytes);
42
+ const artifact = Object.freeze({
43
+ entityId: input.entityId,
44
+ entityType: 'repo.git',
45
+ kind: 'git',
46
+ contentHash: transportVersion,
47
+ });
48
+ const cargo = Object.freeze({
49
+ artifact,
50
+ bytes,
51
+ manifest: (0, upload_js_1.deriveUploadManifest)(artifact, bytes, sha256Hex),
52
+ });
53
+ return Object.freeze({
54
+ replay: Object.freeze({
55
+ kind: 'repo.git',
56
+ stateId: input.state.stateId,
57
+ cardId: input.state.cardId,
58
+ checkpointId: input.state.checkpointId,
59
+ cardChanged: input.previous?.cardId !== input.state.cardId,
60
+ checkpointChanged: input.previous?.checkpointId !== input.state.checkpointId,
61
+ parentTransportVersion: input.previous?.transportVersion ?? null,
62
+ transportVersion,
63
+ }),
64
+ cargo,
65
+ });
66
+ }
67
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/detection/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /** Nearest-repository ownership for one detected entity transition. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.nearestRepository = nearestRepository;
5
+ exports.recorderTargets = recorderTargets;
6
+ /** The nearest repo at or above `uuid`; nested repositories win. */
7
+ function nearestRepository(uuid, byUuid) {
8
+ const seen = new Set();
9
+ let cursor = uuid;
10
+ while (cursor !== null) {
11
+ if (seen.has(cursor))
12
+ throw new Error(`registry corrupt: parent cycle at ${cursor}`);
13
+ seen.add(cursor);
14
+ const row = byUuid(cursor);
15
+ if (!row)
16
+ throw new Error(`no entity ${cursor}`);
17
+ if (row.type === 'repo.git')
18
+ return row;
19
+ cursor = row.parentUuid;
20
+ }
21
+ return null;
22
+ }
23
+ /**
24
+ * Name every recorder whose state a transition can change.
25
+ *
26
+ * Ordinary changes outside repository territory publish on the entity UUID.
27
+ * A change wholly inside one repository publishes only the repository parcel.
28
+ * Crossing a repository boundary also publishes the entity graph transition,
29
+ * plus the source and/or destination repositories whose identity maps and
30
+ * Checkpoints changed.
31
+ */
32
+ function recorderTargets(transition, byUuid) {
33
+ const { base, result } = transition;
34
+ if (base !== null && base.uuid !== result.uuid) {
35
+ throw new Error('a recorder transition cannot change entity UUID');
36
+ }
37
+ const before = nearestRepository(base?.parentUUID ?? null, byUuid);
38
+ const after = nearestRepository(result.parentUUID, byUuid);
39
+ const add = (targets, target) => {
40
+ if (!targets.some((candidate) => candidate.resourceId === target.resourceId))
41
+ targets.push(target);
42
+ };
43
+ // Every `.git` boundary starts its own repository rail, even when nested.
44
+ // Its enclosing repository changes only when the boundary's graph entry
45
+ // changes; ordinary Card/Checkpoint advancement remains on the inner rail.
46
+ if (base?.type === 'repo.git' || result.type === 'repo.git') {
47
+ const targets = [];
48
+ add(targets, {
49
+ kind: result.type === 'repo.git' ? 'repository' : 'entity',
50
+ resourceId: result.uuid,
51
+ });
52
+ const boundaryChanged = base === null
53
+ || base.type !== result.type
54
+ || base.parentUUID !== result.parentUUID
55
+ || base.name !== result.name
56
+ || base.status !== result.status;
57
+ if (boundaryChanged) {
58
+ if (before)
59
+ add(targets, { kind: 'repository', resourceId: before.uuid });
60
+ if (after)
61
+ add(targets, { kind: 'repository', resourceId: after.uuid });
62
+ }
63
+ return Object.freeze(targets);
64
+ }
65
+ if (base === null) {
66
+ return Object.freeze(after
67
+ ? [{ kind: 'repository', resourceId: after.uuid }]
68
+ : [{ kind: 'entity', resourceId: result.uuid }]);
69
+ }
70
+ if (before?.uuid === after?.uuid) {
71
+ return Object.freeze(before
72
+ ? [{ kind: 'repository', resourceId: before.uuid }]
73
+ : [{ kind: 'entity', resourceId: result.uuid }]);
74
+ }
75
+ const targets = [{ kind: 'entity', resourceId: result.uuid }];
76
+ for (const repository of [before, after]) {
77
+ if (repository)
78
+ add(targets, { kind: 'repository', resourceId: repository.uuid });
79
+ }
80
+ return Object.freeze(targets);
81
+ }
82
+ //# sourceMappingURL=territory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"territory.js","sourceRoot":"","sources":["../../src/detection/territory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * The complete portable boundary from Watch into Detect and back.
4
+ *
5
+ * Watch contributes generation-stamped suspicion only. Detect retains that
6
+ * generation until Record has durably accepted every resulting proposal. A
7
+ * discovered directory creates a logical coverage request; the Watch host
8
+ * decides whether its backend needs another native handle.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.detectionBatch = detectionBatch;
12
+ exports.directoryCoverageRequests = directoryCoverageRequests;
13
+ const enrollment_js_1 = require("./enrollment.js");
14
+ const detectionRelativePath = (path) => {
15
+ const raw = String(path);
16
+ if (raw.startsWith('/') || /^[A-Za-z]:[\\/]/.test(raw) || raw.includes('\0')) {
17
+ throw new Error('detection path must be root-relative');
18
+ }
19
+ const normalized = (0, enrollment_js_1.normalizedRelativePath)(raw);
20
+ if (!normalized || normalized.split('/').some((segment) => segment === '.' || segment === '..')) {
21
+ throw new Error('detection path must be root-relative');
22
+ }
23
+ return normalized;
24
+ };
25
+ /** Freeze Watch's snapshot into Detection's input vocabulary. */
26
+ function detectionBatch(rootId, snapshot) {
27
+ if (!rootId)
28
+ throw new Error('detection batch root id is required');
29
+ if (!Number.isSafeInteger(snapshot.generation) || snapshot.generation < 0) {
30
+ throw new Error('detection batch generation is invalid');
31
+ }
32
+ const suspects = snapshot.paths === null
33
+ ? null
34
+ : Object.freeze([...new Set(snapshot.paths.map(detectionRelativePath))]);
35
+ return Object.freeze({ rootId, generation: snapshot.generation, suspects });
36
+ }
37
+ /**
38
+ * Tell Watch that newly enrolled directory ground now exists. This is emitted
39
+ * on every platform; only the Watch backend knows whether coverage expansion
40
+ * means another Linux inotify handle or merely a routing-table update.
41
+ */
42
+ function directoryCoverageRequests(batch, createdDirectories) {
43
+ const paths = [...new Set(createdDirectories.map(detectionRelativePath))]
44
+ .sort();
45
+ return Object.freeze(paths.map((relPath) => Object.freeze({
46
+ kind: 'directory-discovered',
47
+ rootId: batch.rootId,
48
+ relPath,
49
+ })));
50
+ }
51
+ //# sourceMappingURL=watch-boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-boundary.js","sourceRoot":"","sources":["../../src/detection/watch-boundary.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AA+BH,wCAYC;AAOD,8DAWC;AA1DD,mDAAyD;AAEzD,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAU,EAAE;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,UAAU,GAAG,IAAA,sCAAsB,EAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAeF,iEAAiE;AACjE,SAAgB,cAAc,CAC5B,MAAc,EACd,QAA2B;IAE3B,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,KAAK,IAAI;QACtC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB,CACvC,KAAqC,EACrC,kBAAqC;IAErC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;SACtE,IAAI,EAAE,CAAC;IACV,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QACxD,IAAI,EAAE,sBAA+B;QACrC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;KACR,CAAC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * Portable byte codecs shared by the entity layer — UTF-8, standard base64
4
+ * (padded, as Node's `Buffer#toString('base64')` emits it), base64url, and
5
+ * hex. They exist so cloud.ts and repo-states.ts can produce byte-for-byte
6
+ * the same wire text the engine produces with Buffer, without src/
7
+ * importing any Node module (PURPOSE.md axiom 2).
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.bytesToBase64Url = exports.bytesToBase64 = exports.utf8Decode = exports.utf8Encode = void 0;
11
+ exports.base64ToBytes = base64ToBytes;
12
+ exports.hexToBytes = hexToBytes;
13
+ const BASE64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
14
+ const BASE64_URL = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
15
+ const utf8Encode = (text) => new TextEncoder().encode(text);
16
+ exports.utf8Encode = utf8Encode;
17
+ const utf8Decode = (bytes) => new TextDecoder().decode(bytes);
18
+ exports.utf8Decode = utf8Decode;
19
+ function encode(bytes, alphabet, pad) {
20
+ // Write the ASCII result once. Building base64 through string appends makes
21
+ // V8 retain repository-sized ropes whose intermediate nodes can dwarf the
22
+ // parcel and exhaust the default heap.
23
+ const paddedLength = Math.ceil(bytes.length / 3) * 4;
24
+ const outputLength = pad ? paddedLength : Math.ceil(bytes.length * 4 / 3);
25
+ const out = new Uint8Array(outputLength);
26
+ let offset = 0;
27
+ for (let i = 0; i < bytes.length; i += 3) {
28
+ const a = bytes[i];
29
+ const b = bytes[i + 1];
30
+ const c = bytes[i + 2];
31
+ out[offset++] = alphabet.charCodeAt(a >> 2);
32
+ out[offset++] = alphabet.charCodeAt(((a & 0x03) << 4) | ((b ?? 0) >> 4));
33
+ if (b === undefined) {
34
+ if (pad) {
35
+ out[offset++] = 61;
36
+ out[offset++] = 61;
37
+ }
38
+ }
39
+ else {
40
+ out[offset++] = alphabet.charCodeAt(((b & 0x0f) << 2) | ((c ?? 0) >> 6));
41
+ if (c === undefined) {
42
+ if (pad)
43
+ out[offset++] = 61;
44
+ }
45
+ else {
46
+ out[offset++] = alphabet.charCodeAt(c & 0x3f);
47
+ }
48
+ }
49
+ }
50
+ return new TextDecoder().decode(out);
51
+ }
52
+ /** Bytes → standard base64 with padding (Buffer's 'base64' spelling). */
53
+ const bytesToBase64 = (bytes) => encode(bytes, BASE64, true);
54
+ exports.bytesToBase64 = bytesToBase64;
55
+ /** Bytes → unpadded base64url (Buffer's 'base64url' spelling). */
56
+ const bytesToBase64Url = (bytes) => encode(bytes, BASE64_URL, false);
57
+ exports.bytesToBase64Url = bytesToBase64Url;
58
+ /** Standard base64 (padded or unpadded) → bytes. */
59
+ function base64ToBytes(text) {
60
+ const padding = text.indexOf('=');
61
+ const length = padding === -1 ? text.length : padding;
62
+ const out = new Uint8Array(Math.floor(length * 6 / 8));
63
+ let offset = 0;
64
+ let buffer = 0;
65
+ let bits = 0;
66
+ for (let index = 0; index < length; index += 1) {
67
+ const char = text[index];
68
+ const value = BASE64.indexOf(char);
69
+ if (value === -1) {
70
+ throw new Error(`expected standard base64 like "aGVsbG8=" — found ${JSON.stringify(char)}`);
71
+ }
72
+ buffer = (buffer << 6) | value;
73
+ bits += 6;
74
+ if (bits >= 8) {
75
+ bits -= 8;
76
+ out[offset++] = (buffer >> bits) & 0xff;
77
+ }
78
+ }
79
+ return out;
80
+ }
81
+ /** Lowercase/uppercase hex → bytes. */
82
+ function hexToBytes(hex) {
83
+ if (hex.length % 2 !== 0 || /[^0-9a-f]/i.test(hex)) {
84
+ throw new Error(`expected even-length hex like "a1b2" — got ${JSON.stringify(hex)}`);
85
+ }
86
+ const out = new Uint8Array(hex.length / 2);
87
+ for (let i = 0; i < out.length; i += 1) {
88
+ out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
89
+ }
90
+ return out;
91
+ }
92
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/entities/bytes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ /**
3
+ * The entity-cloud boundary's pure half (engine
4
+ * registration/entity-cloud.js): the snapshot codec, record assertions,
5
+ * equality, the private resource id, and the repo travel law — only
6
+ * logical graph facts, never a path, inode, watcher, or database row.
7
+ *
8
+ * Wire parity is the contract here: `stableJson`, record key order, and
9
+ * snapshot sorting reproduce the engine's bytes exactly, so a snapshot
10
+ * packed on either side hashes and compares identically.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.sameRecords = exports.sameRecord = exports.stableJson = exports.ENTITY_CLOUD_SCHEMA_VERSION = exports.ENTITY_CLOUD_CONTRACT = void 0;
14
+ exports.privateEntityResourceId = privateEntityResourceId;
15
+ exports.recordsAreSubset = recordsAreSubset;
16
+ exports.assertRecord = assertRecord;
17
+ exports.enclosedByRepositoryAncestor = enclosedByRepositoryAncestor;
18
+ exports.travelingRecords = travelingRecords;
19
+ exports.snapshotFromRecords = snapshotFromRecords;
20
+ exports.parseSnapshot = parseSnapshot;
21
+ const types_js_1 = require("./types.js");
22
+ const bytes_js_1 = require("./bytes.js");
23
+ /** `@1` could project arbitrary pre-cloud registrations. `@2` omitted the
24
+ * declared built-in tool entities, so its toolbox root could not prove the
25
+ * snapshot membership it named. A resource contract names immutable
26
+ * authority semantics: both remain quarantined rather than reinterpreted
27
+ * or overwritten. `@3` begins with the complete verified user home; later
28
+ * user ground enters exclusively through `amalgm register`. */
29
+ exports.ENTITY_CLOUD_CONTRACT = 'amalgm-entity-registry@3';
30
+ exports.ENTITY_CLOUD_SCHEMA_VERSION = 1;
31
+ /** A 64-hex content head (a SHA-256 naming immutable bytes). */
32
+ const CONTENT_HEAD = /^[0-9a-f]{64}$/;
33
+ /** The deterministic private entity-resource id for a user under the
34
+ * current contract: `pvr_` + the first 32 base64url characters of
35
+ * sha256("private-user:<userId>:<contract>"). */
36
+ function privateEntityResourceId(userId, sha256Hex) {
37
+ return `pvr_${(0, bytes_js_1.bytesToBase64Url)((0, bytes_js_1.hexToBytes)(sha256Hex(`private-user:${userId}:${exports.ENTITY_CLOUD_CONTRACT}`)))
38
+ .slice(0, 32)}`;
39
+ }
40
+ /** The one JSON spelling every snapshot comparison and checksum uses. */
41
+ const stableJson = (value) => JSON.stringify(value);
42
+ exports.stableJson = stableJson;
43
+ const sameRecord = (left, right) => (0, exports.stableJson)(left) === (0, exports.stableJson)(right);
44
+ exports.sameRecord = sameRecord;
45
+ /** Two record lists describe the same graph (normalized, sorted, compared whole). */
46
+ const sameRecords = (left, right) => (0, exports.sameRecord)(snapshotFromRecords(left), snapshotFromRecords(right));
47
+ exports.sameRecords = sameRecords;
48
+ /** Every record in `records` appears byte-identically in `expected`. */
49
+ function recordsAreSubset(records, expected) {
50
+ const expectedByUuid = new Map(snapshotFromRecords(expected).records.map((record) => [record.uuid, record]));
51
+ return snapshotFromRecords(records).records
52
+ .every((record) => (0, exports.sameRecord)(record, expectedByUuid.get(record.uuid)));
53
+ }
54
+ /**
55
+ * Validate one snapshot record and normalize it (UUIDs lowercased,
56
+ * transportVersion defaulted to null). Refusals: an invalid shape; a
57
+ * parentless record whose type no tree root wears; a transport head on
58
+ * anything but a repository.
59
+ */
60
+ function assertRecord(value) {
61
+ const record = value;
62
+ if (!record || typeof record !== 'object'
63
+ || typeof record.uuid !== 'string' || !types_js_1.UUID_PATTERN.test(record.uuid)
64
+ || typeof record.type !== 'string' || !types_js_1.TYPES.has(record.type)
65
+ || (record.parentUUID !== null && (typeof record.parentUUID !== 'string' || !types_js_1.UUID_PATTERN.test(record.parentUUID)))
66
+ || typeof record.name !== 'string' || !record.name || record.name.includes('/') || record.name.includes('\0')
67
+ || !['active', 'trashed', 'deleted'].includes(record.status)
68
+ || typeof record.version !== 'string' || !/^[0-9a-f]{64}$/.test(record.version)
69
+ || (record.payloadVersion !== null && typeof record.payloadVersion !== 'string')
70
+ || (record.transportVersion !== undefined && record.transportVersion !== null
71
+ && (typeof record.transportVersion !== 'string' || !CONTENT_HEAD.test(record.transportVersion)))) {
72
+ throw new Error('cloud entity snapshot has an invalid record');
73
+ }
74
+ if (record.parentUUID === null && !types_js_1.ROOT_TYPES.has(record.type)) {
75
+ throw new Error(`cloud entity ${record.uuid} is not a valid tree root`);
76
+ }
77
+ const transportVersion = (record.transportVersion ?? null);
78
+ if (record.type !== 'repo.git' && transportVersion !== null) {
79
+ throw new Error('only repository entities may declare a transport head');
80
+ }
81
+ return {
82
+ uuid: record.uuid.toLowerCase(),
83
+ type: record.type,
84
+ parentUUID: record.parentUUID === null ? null : record.parentUUID.toLowerCase(),
85
+ name: record.name,
86
+ status: record.status,
87
+ version: record.version,
88
+ payloadVersion: record.payloadVersion,
89
+ transportVersion,
90
+ };
91
+ }
92
+ /**
93
+ * The repo travel law: a record with a `repo.git` PROPER ancestor never
94
+ * travels to the cloud on its own. The repository is the sync boundary —
95
+ * its one Card + Checkpoint state carries the worktree's bytes AND its
96
+ * children's permanent UUIDs (the transport identity map), so a register
97
+ * or a rebase is one parcel, never one postcard per file. Repository
98
+ * boundaries are retained separately by `travelingRecords`: every `.git`
99
+ * starts a new parcel even when another repository encloses it.
100
+ * Missing ancestry keeps the record traveling rather than risking a
101
+ * silently unsynced entity.
102
+ */
103
+ function enclosedByRepositoryAncestor(record, lookup) {
104
+ const seen = new Set([record.uuid]);
105
+ let parentUUID = record.parentUUID;
106
+ while (parentUUID !== null && parentUUID !== undefined) {
107
+ if (seen.has(parentUUID))
108
+ throw new Error(`cloud entity ${record.uuid} has a cyclic parent chain`);
109
+ seen.add(parentUUID);
110
+ const parent = lookup(parentUUID);
111
+ if (!parent)
112
+ return false;
113
+ if (parent.type === 'repo.git')
114
+ return true;
115
+ parentUUID = parent.parentUUID;
116
+ }
117
+ return false;
118
+ }
119
+ /** Project a complete local entity graph onto the cloud registry. Ordinary
120
+ * repository children keep their local SQLite identities inside the nearest
121
+ * repository parcel. Every nested repository and the folder spine required to
122
+ * reach it remain graph records, so each `.git` owns and exposes exactly one
123
+ * independent transport without publishing per-file postcards. */
124
+ function travelingRecords(records) {
125
+ const snapshot = snapshotFromRecords(records);
126
+ const byUuid = new Map(snapshot.records.map((record) => [record.uuid, record]));
127
+ const traveling = new Set(snapshot.records
128
+ .filter((record) => !enclosedByRepositoryAncestor(record, (uuid) => byUuid.get(uuid)))
129
+ .map((record) => record.uuid));
130
+ for (const repository of snapshot.records.filter((record) => record.type === 'repo.git')) {
131
+ let cursor = repository;
132
+ while (cursor) {
133
+ traveling.add(cursor.uuid);
134
+ if (cursor.parentUUID === null)
135
+ break;
136
+ cursor = byUuid.get(cursor.parentUUID);
137
+ }
138
+ }
139
+ return snapshot.records.filter((record) => traveling.has(record.uuid));
140
+ }
141
+ /** Normalize records into the one canonical snapshot: asserted, sorted by
142
+ * uuid, duplicates refused. */
143
+ function snapshotFromRecords(records) {
144
+ const normalized = records.map(assertRecord)
145
+ .sort((left, right) => (left.uuid < right.uuid ? -1 : left.uuid > right.uuid ? 1 : 0));
146
+ if (new Set(normalized.map((record) => record.uuid)).size !== normalized.length) {
147
+ throw new Error('cloud entity snapshot has duplicate UUIDs');
148
+ }
149
+ return {
150
+ schemaVersion: exports.ENTITY_CLOUD_SCHEMA_VERSION,
151
+ kind: 'amalgm-entity-registry',
152
+ records: normalized,
153
+ };
154
+ }
155
+ /** Parse snapshot bytes (or their UTF-8 text) back into the canonical form. */
156
+ function parseSnapshot(bytes) {
157
+ let snapshot;
158
+ try {
159
+ snapshot = JSON.parse(typeof bytes === 'string' ? bytes : (0, bytes_js_1.utf8Decode)(bytes));
160
+ }
161
+ catch {
162
+ throw new Error('cloud entity snapshot is not JSON');
163
+ }
164
+ if (snapshot?.schemaVersion !== exports.ENTITY_CLOUD_SCHEMA_VERSION
165
+ || snapshot?.kind !== 'amalgm-entity-registry'
166
+ || !Array.isArray(snapshot.records)) {
167
+ throw new Error('cloud entity snapshot has an unsupported shape');
168
+ }
169
+ return snapshotFromRecords(snapshot.records);
170
+ }
171
+ //# sourceMappingURL=cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/entities/cloud.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAyCH,0DAGC;AAaD,4CAMC;AAQD,oCAkCC;AAkBD,oEAeC;AAOD,4CAiBC;AAID,kDAWC;AAGD,sCAaC;AA/LD,yCAAiH;AACjH,yCAAsE;AAEtE;;;;;+DAK+D;AAClD,QAAA,qBAAqB,GAAG,0BAA0B,CAAC;AAEnD,QAAA,2BAA2B,GAAG,CAAC,CAAC;AAE7C,gEAAgE;AAChE,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAsBtC;;iDAEiD;AACjD,SAAgB,uBAAuB,CAAC,MAAc,EAAE,SAAoB;IAC1E,OAAO,OAAO,IAAA,2BAAgB,EAAC,IAAA,qBAAU,EAAC,SAAS,CAAC,gBAAgB,MAAM,IAAI,6BAAqB,EAAE,CAAC,CAAC,CAAC;SACrG,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACpB,CAAC;AAED,yEAAyE;AAClE,MAAM,UAAU,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAA/D,QAAA,UAAU,cAAqD;AAErE,MAAM,UAAU,GAAG,CAAC,IAAa,EAAE,KAAc,EAAW,EAAE,CACnE,IAAA,kBAAU,EAAC,IAAI,CAAC,KAAK,IAAA,kBAAU,EAAC,KAAK,CAAC,CAAC;AAD5B,QAAA,UAAU,cACkB;AAEzC,qFAAqF;AAC9E,MAAM,WAAW,GAAG,CAAC,IAAwB,EAAE,KAAyB,EAAW,EAAE,CAC1F,IAAA,kBAAU,EAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AADvD,QAAA,WAAW,eAC4C;AAEpE,wEAAwE;AACxE,SAAgB,gBAAgB,CAAC,OAA2B,EAAE,QAA4B;IACxF,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,mBAAmB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAC7E,CAAC;IACF,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC,OAAO;SACxC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,kBAAU,EAAC,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,KAGP,CAAC;IACT,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;WACpC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,uBAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;WAClE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,gBAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;WAC1D,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,uBAAY,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;WAChH,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;WAC1G,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAgB,CAAC;WACnE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;WAC5E,CAAC,MAAM,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,CAAC;WAC7E,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,IAAI,MAAM,CAAC,gBAAgB,KAAK,IAAI;eACxE,CAAC,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,qBAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,IAAI,2BAA2B,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAkB,CAAC;IAC5E,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAkB;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,MAAM,CAAC,UAAqB,CAAC,WAAW,EAAE;QAC3F,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAsB;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,cAAc,EAAE,MAAM,CAAC,cAA+B;QACtD,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAOD;;;;;;;;;;GAUG;AACH,SAAgB,4BAA4B,CAC1C,MAAiF,EACjF,MAA2B;IAE3B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACnC,OAAO,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACvD,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC;QACnG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAC5C,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;kEAIkE;AAClE,SAAgB,gBAAgB,CAAC,OAA2B;IAC1D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO;SACvC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,4BAA4B,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;SACrF,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjC,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;QACzF,IAAI,MAAM,GAAkC,UAAU,CAAC;QACvD,OAAO,MAAM,EAAE,CAAC;YACd,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI;gBAAE,MAAM;YACtC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;+BAC+B;AAC/B,SAAgB,mBAAmB,CAAC,OAA2B;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;SACzC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO;QACL,aAAa,EAAE,mCAA2B;QAC1C,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,UAAU;KACpB,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,SAAgB,aAAa,CAAC,KAA0B;IACtD,IAAI,QAA+E,CAAC;IACpF,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,qBAAU,EAAC,KAAK,CAAC,CAAoB,CAAC;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,QAAQ,EAAE,aAAa,KAAK,mCAA2B;WACtD,QAAQ,EAAE,IAAI,KAAK,wBAAwB;WAC3C,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * entities/ — the Register/Record pure cores: the entity model's laws
4
+ * (engine docs/entity-model.md — two axioms, the six-field record) as
5
+ * portable functions. Store reads arrive through `EntityReadPort`, hashing
6
+ * through `Sha256Hex`; nothing here touches SQLite, node:crypto, or a
7
+ * filesystem. Hash formulas and id derivations are byte-for-byte the
8
+ * engine's, so records interoperate across the cloud boundary.
9
+ *
10
+ * - types.ts the alphabet, the six fields, UUID shape, injected ports
11
+ * - bytes.ts portable byte codecs (utf8, base64, base64url, hex)
12
+ * - rules.ts version formula, naming, lifecycle inheritance,
13
+ * slot/container laws, record builders
14
+ * - moves.ts batch move validation: permutations, acyclicity, adoption
15
+ * - cloud.ts entity-cloud snapshot codec + the repo travel law
16
+ * - repo-states.ts Card + Checkpoint state codec and id derivations
17
+ */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
30
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
31
+ };
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ __exportStar(require("./types.js"), exports);
34
+ __exportStar(require("./bytes.js"), exports);
35
+ __exportStar(require("./rules.js"), exports);
36
+ __exportStar(require("./moves.js"), exports);
37
+ __exportStar(require("./cloud.js"), exports);
38
+ __exportStar(require("./repo-states.js"), exports);
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;AAEH,6CAA2B;AAC3B,6CAA2B;AAC3B,6CAA2B;AAC3B,6CAA2B;AAC3B,6CAA2B;AAC3B,mDAAiC"}