@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,191 @@
1
+ "use strict";
2
+ /**
3
+ * Minimal three-way line-based merge (diff3) for live-document reconcile —
4
+ * the engine behind every `MergeOutcome` in `contracts/docs.ts`.
5
+ *
6
+ * merge3(base, ours, theirs) — all three are whole-file strings — answers:
7
+ * given that both OURS and THEIRS evolved from BASE, what single text keeps
8
+ * both sides' changes? Hunks (line regions changed relative to BASE) that
9
+ * touch different base regions merge automatically; hunks that overlap are
10
+ * conflicts. On conflict this module NEVER picks a winner silently: the
11
+ * merged text keeps OURS for the conflicted region and the conflict is
12
+ * reported to the caller, which is responsible for preserving THEIRS
13
+ * durably (the engine writes a sidecar file — axiom: never a silent
14
+ * winner).
15
+ *
16
+ * No dependencies by design. The diff is a plain LCS over lines (common
17
+ * prefix/suffix trimmed first); regions too large to LCS degrade to a
18
+ * single whole-region hunk, which can only ever OVER-report a conflict,
19
+ * never lose an edit.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.merge3 = merge3;
23
+ /**
24
+ * Cap on the LCS DP table (cells = changed-lines² after prefix/suffix
25
+ * trim). 4M cells ≈ 16MB of Int32 — beyond it the changed region collapses
26
+ * into one hunk per side, trading merge granularity for bounded memory.
27
+ */
28
+ const MAX_LCS_CELLS = 4 * 1024 * 1024;
29
+ /** Split into lines with their terminators kept, so join('') reassembles exactly. */
30
+ function splitLines(text) {
31
+ if (text === '')
32
+ return [];
33
+ return text.split(/(?<=\n)/);
34
+ }
35
+ /**
36
+ * Longest common subsequence between a[aStart..aEnd) and b[bStart..bEnd),
37
+ * returned as matched index pairs [aIndex, bIndex] in increasing order.
38
+ */
39
+ function lcsMatches(a, aStart, aEnd, b, bStart, bEnd) {
40
+ const n = aEnd - aStart;
41
+ const m = bEnd - bStart;
42
+ const width = m + 1;
43
+ const table = new Int32Array((n + 1) * width);
44
+ for (let i = 1; i <= n; i += 1) {
45
+ const line = a[aStart + i - 1];
46
+ for (let j = 1; j <= m; j += 1) {
47
+ table[i * width + j] =
48
+ line === b[bStart + j - 1]
49
+ ? table[(i - 1) * width + (j - 1)] + 1
50
+ : Math.max(table[(i - 1) * width + j], table[i * width + (j - 1)]);
51
+ }
52
+ }
53
+ const matches = [];
54
+ let i = n;
55
+ let j = m;
56
+ while (i > 0 && j > 0) {
57
+ if (a[aStart + i - 1] === b[bStart + j - 1] &&
58
+ table[i * width + j] === table[(i - 1) * width + (j - 1)] + 1) {
59
+ matches.push([aStart + i - 1, bStart + j - 1]);
60
+ i -= 1;
61
+ j -= 1;
62
+ }
63
+ else if (table[(i - 1) * width + j] >= table[i * width + (j - 1)]) {
64
+ i -= 1;
65
+ }
66
+ else {
67
+ j -= 1;
68
+ }
69
+ }
70
+ matches.reverse();
71
+ return matches;
72
+ }
73
+ /**
74
+ * Regions where `side` differs from `base`, in base order. Outside these
75
+ * hunks the two arrays match line for line.
76
+ */
77
+ function diffHunks(base, side) {
78
+ let prefix = 0;
79
+ const maxPrefix = Math.min(base.length, side.length);
80
+ while (prefix < maxPrefix && base[prefix] === side[prefix])
81
+ prefix += 1;
82
+ let baseEnd = base.length;
83
+ let sideEnd = side.length;
84
+ while (baseEnd > prefix && sideEnd > prefix && base[baseEnd - 1] === side[sideEnd - 1]) {
85
+ baseEnd -= 1;
86
+ sideEnd -= 1;
87
+ }
88
+ const n = baseEnd - prefix;
89
+ const m = sideEnd - prefix;
90
+ if (n === 0 && m === 0)
91
+ return [];
92
+ if (n === 0 || m === 0 || n * m > MAX_LCS_CELLS) {
93
+ return [{ baseStart: prefix, baseLength: n, sideStart: prefix, sideLength: m }];
94
+ }
95
+ const hunks = [];
96
+ let b = prefix;
97
+ let s = prefix;
98
+ for (const [mb, ms] of lcsMatches(base, prefix, baseEnd, side, prefix, sideEnd)) {
99
+ if (mb > b || ms > s) {
100
+ hunks.push({ baseStart: b, baseLength: mb - b, sideStart: s, sideLength: ms - s });
101
+ }
102
+ b = mb + 1;
103
+ s = ms + 1;
104
+ }
105
+ if (baseEnd > b || sideEnd > s) {
106
+ hunks.push({ baseStart: b, baseLength: baseEnd - b, sideStart: s, sideLength: sideEnd - s });
107
+ }
108
+ return hunks;
109
+ }
110
+ /**
111
+ * The side's lines corresponding to the group's base range [start, end).
112
+ * Between its own hunks a side matches the base line for line, so the range
113
+ * extends from the first hunk (pulled back by the matched lead-in) to the
114
+ * last hunk (pushed forward by the matched tail).
115
+ */
116
+ function sideSlice(group, sideHunks, baseLines, sideLines) {
117
+ if (sideHunks.length === 0)
118
+ return baseLines.slice(group.start, group.end);
119
+ const first = sideHunks[0];
120
+ const last = sideHunks[sideHunks.length - 1];
121
+ const lo = first.sideStart - (first.baseStart - group.start);
122
+ const hi = last.sideStart + last.sideLength + (group.end - (last.baseStart + last.baseLength));
123
+ return sideLines.slice(lo, hi);
124
+ }
125
+ /**
126
+ * Three-way merge of whole-file strings.
127
+ *
128
+ * Fast paths: either side identical to base (or to the other side)
129
+ * short-circuits without diffing.
130
+ */
131
+ function merge3(baseText, oursText, theirsText) {
132
+ if (oursText === theirsText)
133
+ return { text: oursText, conflicts: [] };
134
+ if (oursText === baseText)
135
+ return { text: theirsText, conflicts: [] };
136
+ if (theirsText === baseText)
137
+ return { text: oursText, conflicts: [] };
138
+ const base = splitLines(baseText);
139
+ const ours = splitLines(oursText);
140
+ const theirs = splitLines(theirsText);
141
+ const hunks = [
142
+ ...diffHunks(base, ours).map((h) => ({ ...h, side: 'ours' })),
143
+ ...diffHunks(base, theirs).map((h) => ({ ...h, side: 'theirs' })),
144
+ ].sort((a, b) => a.baseStart - b.baseStart || (a.side === b.side ? 0 : a.side === 'ours' ? -1 : 1));
145
+ // Group hunks whose base ranges overlap. Adjacent (touching) ranges stay
146
+ // separate — they merge cleanly — with one exception: insertions from both
147
+ // sides at the exact same base point have no defined order, so they group
148
+ // (and therefore conflict) too.
149
+ const groups = [];
150
+ for (const hunk of hunks) {
151
+ const group = groups[groups.length - 1];
152
+ const joins = group &&
153
+ (hunk.baseStart < group.end ||
154
+ (hunk.baseStart === group.end &&
155
+ hunk.baseLength === 0 &&
156
+ group.hunks.some((h) => h.side !== hunk.side && h.baseLength === 0 && h.baseStart === hunk.baseStart)));
157
+ if (joins) {
158
+ group.hunks.push(hunk);
159
+ group.end = Math.max(group.end, hunk.baseStart + hunk.baseLength);
160
+ }
161
+ else {
162
+ groups.push({ start: hunk.baseStart, end: hunk.baseStart + hunk.baseLength, hunks: [hunk] });
163
+ }
164
+ }
165
+ const out = [];
166
+ const conflicts = [];
167
+ let cursor = 0;
168
+ for (const group of groups) {
169
+ out.push(base.slice(cursor, group.start).join(''));
170
+ const oursHunks = group.hunks.filter((h) => h.side === 'ours');
171
+ const theirsHunks = group.hunks.filter((h) => h.side === 'theirs');
172
+ const oursRegion = sideSlice(group, oursHunks, base, ours).join('');
173
+ const theirsRegion = sideSlice(group, theirsHunks, base, theirs).join('');
174
+ if (theirsHunks.length === 0 || oursRegion === theirsRegion) {
175
+ out.push(oursRegion);
176
+ }
177
+ else if (oursHunks.length === 0) {
178
+ out.push(theirsRegion);
179
+ }
180
+ else {
181
+ // Overlap with different content on each side: keep OURS in the text,
182
+ // surface the conflict to the caller.
183
+ conflicts.push({ baseStart: group.start, baseEnd: group.end, ours: oursRegion, theirs: theirsRegion });
184
+ out.push(oursRegion);
185
+ }
186
+ cursor = group.end;
187
+ }
188
+ out.push(base.slice(cursor).join(''));
189
+ return { text: out.join(''), conflicts };
190
+ }
191
+ //# sourceMappingURL=merge3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge3.js","sourceRoot":"","sources":["../../src/merge/merge3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /** Pure acceptance decision used by a transactional cloud adapter. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.acceptEntityRecord = acceptEntityRecord;
5
+ const codec_js_1 = require("./codec.js");
6
+ /**
7
+ * Permission and cargo existence are effects proved by the cloud adapter
8
+ * before calling this decision. `headSequence` is locked for this entity UUID
9
+ * only. `existing` is the row found by the entity mutation identity.
10
+ */
11
+ function acceptEntityRecord(input) {
12
+ if (input.existing !== null) {
13
+ const { globalSequence: _globalSequence, actorId: _actorId, originDeviceId: _originDeviceId, acceptedAt: _acceptedAt, ...existingLocal } = input.existing;
14
+ if ((0, codec_js_1.encodeEntityRecord)(existingLocal) !== (0, codec_js_1.encodeEntityRecord)(input.submitted)) {
15
+ throw new Error('mutationId was already accepted with different record bytes');
16
+ }
17
+ return Object.freeze({ kind: 'duplicate', record: input.existing });
18
+ }
19
+ if (!Number.isSafeInteger(input.headSequence) || input.headSequence < 0) {
20
+ throw new Error('entity head sequence must be a non-negative safe integer');
21
+ }
22
+ const record = Object.freeze({
23
+ ...input.submitted,
24
+ globalSequence: input.headSequence + 1,
25
+ actorId: input.actorId,
26
+ originDeviceId: input.originDeviceId,
27
+ acceptedAt: input.acceptedAt,
28
+ });
29
+ return Object.freeze({ kind: 'append', record });
30
+ }
31
+ //# sourceMappingURL=authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority.js","sourceRoot":"","sources":["../../src/records/authority.ts"],"names":[],"mappings":";AAAA,sEAAsE;;AActE,gDAgCC;AA5CD,yCAAgD;AAOhD;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,KAOlC;IACC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,EACJ,cAAc,EAAE,eAAe,EAC/B,OAAO,EAAE,QAAQ,EACjB,cAAc,EAAE,eAAe,EAC/B,UAAU,EAAE,WAAW,EACvB,GAAG,aAAa,EACjB,GAAG,KAAK,CAAC,QAAQ,CAAC;QACnB,IAAI,IAAA,6BAAkB,EAAC,aAAa,CAAC,KAAK,IAAA,6BAAkB,EAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,MAAM,GAAyB,MAAM,CAAC,MAAM,CAAC;QACjD,GAAG,KAAK,CAAC,SAAS;QAClB,cAAc,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC;QACtC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /** JSON codec for records whose exact replay may contain Uint8Array spans. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.encodeEntityRecord = void 0;
5
+ exports.decodeLocalEntityRecord = decodeLocalEntityRecord;
6
+ exports.decodeAcceptedEntityRecord = decodeAcceptedEntityRecord;
7
+ const bytes_js_1 = require("../entities/bytes.js");
8
+ const contracts_js_1 = require("./contracts.js");
9
+ const BYTES = '$amalgmBytesBase64';
10
+ const encodeValue = (value) => {
11
+ if (value instanceof Uint8Array)
12
+ return { [BYTES]: (0, bytes_js_1.bytesToBase64)(value) };
13
+ if (Array.isArray(value))
14
+ return value.map(encodeValue);
15
+ if (value !== null && typeof value === 'object') {
16
+ return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, encodeValue(child)]));
17
+ }
18
+ return value;
19
+ };
20
+ const decodeValue = (value) => {
21
+ if (Array.isArray(value))
22
+ return value.map(decodeValue);
23
+ if (value !== null && typeof value === 'object') {
24
+ const entries = Object.entries(value);
25
+ if (entries.length === 1 && entries[0][0] === BYTES && typeof entries[0][1] === 'string') {
26
+ return (0, bytes_js_1.base64ToBytes)(entries[0][1]);
27
+ }
28
+ return Object.fromEntries(entries.map(([key, child]) => [key, decodeValue(child)]));
29
+ }
30
+ return value;
31
+ };
32
+ const encodeEntityRecord = (record) => JSON.stringify(encodeValue(record));
33
+ exports.encodeEntityRecord = encodeEntityRecord;
34
+ function decodeLocalEntityRecord(encoded) {
35
+ const value = decodeValue(JSON.parse(encoded));
36
+ const checked = (0, contracts_js_1.checkLocalEntityRecord)(value);
37
+ if (!checked.ok)
38
+ throw new Error(checked.error);
39
+ return checked.value;
40
+ }
41
+ function decodeAcceptedEntityRecord(encoded) {
42
+ const value = decodeValue(JSON.parse(encoded));
43
+ const checked = (0, contracts_js_1.checkAcceptedEntityRecord)(value);
44
+ if (!checked.ok)
45
+ throw new Error(checked.error);
46
+ return checked.value;
47
+ }
48
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/records/codec.ts"],"names":[],"mappings":";AAAA,8EAA8E;;;AAoC9E,0DAKC;AAED,gEAKC;AA9CD,mDAAoE;AACpE,iDAKwB;AAExB,MAAM,KAAK,GAAG,oBAAoB,CAAC;AAEnC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE;IAC9C,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,IAAA,wBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;IAC1E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC3F,OAAO,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,CAAC,MAAgD,EAAU,EAAE,CAC7F,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AADzB,QAAA,kBAAkB,sBACO;AAEtC,SAAgB,uBAAuB,CAAC,OAAe;IACrD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAA,qCAAsB,EAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC;AAED,SAAgB,0BAA0B,CAAC,OAAe;IACxD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAA,wCAAyB,EAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * The exact entity record carried from local Record to cloud acceptance.
4
+ *
5
+ * The entity UUID is the channel. `globalSequence` exists only after the
6
+ * authority accepts the record and is dense independently on that UUID.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.entityMutationKey = exports.ENTITY_RECORD_CONTRACT = void 0;
10
+ exports.checkLocalEntityRecord = checkLocalEntityRecord;
11
+ exports.checkAcceptedEntityRecord = checkAcceptedEntityRecord;
12
+ exports.createLocalEntityRecord = createLocalEntityRecord;
13
+ const cloud_js_1 = require("../entities/cloud.js");
14
+ const types_js_1 = require("../entities/types.js");
15
+ const record_proposal_js_1 = require("../detection/record-proposal.js");
16
+ const validate_js_1 = require("../contracts/validate.js");
17
+ exports.ENTITY_RECORD_CONTRACT = 'amalgm.entity-record@1';
18
+ const HASH = /^[0-9a-f]{64}$/;
19
+ const FACETS = new Set(['create', 'rename', 'move', 'retype', 'content', 'trash', 'restore']);
20
+ const EXAMPLE = '{ contract: "amalgm.entity-record@1", mutationId: "m1", authorityId: "pvr_...", entityId: "UUID", basedOnState: null, resultState: "64-hex", lastSeenGlobalSequence: 0, change: {...}, createdAt: 1 }';
21
+ const isSequence = (value, positive = false) => typeof value === 'number'
22
+ && Number.isSafeInteger(value)
23
+ && value >= (positive ? 1 : 0);
24
+ function checkChange(value) {
25
+ if (!(0, validate_js_1.isRecord)(value) || value.contract !== record_proposal_js_1.DETECTED_CHANGE_CONTRACT) {
26
+ return (0, validate_js_1.failShape)(EXAMPLE, `change.contract was not ${record_proposal_js_1.DETECTED_CHANGE_CONTRACT}`);
27
+ }
28
+ if (typeof value.entityId !== 'string' || !types_js_1.UUID_PATTERN.test(value.entityId)) {
29
+ return (0, validate_js_1.failShape)(EXAMPLE, 'change.entityId was not an entity UUID');
30
+ }
31
+ if (value.basedOnState !== null
32
+ && (typeof value.basedOnState !== 'string' || !HASH.test(value.basedOnState))) {
33
+ return (0, validate_js_1.failShape)(EXAMPLE, 'change.basedOnState was not null or lowercase SHA-256');
34
+ }
35
+ if (!Array.isArray(value.facets) || value.facets.length === 0
36
+ || value.facets.some((facet) => typeof facet !== 'string' || !FACETS.has(facet))
37
+ || new Set(value.facets).size !== value.facets.length) {
38
+ return (0, validate_js_1.failShape)(EXAMPLE, 'change.facets was empty, duplicated, or unknown');
39
+ }
40
+ if (!(0, validate_js_1.isRecord)(value.replay) || !(0, validate_js_1.isNonEmptyString)(value.replay.kind)) {
41
+ return (0, validate_js_1.failShape)(EXAMPLE, 'change.replay was not a replay instruction');
42
+ }
43
+ if (!Array.isArray(value.cargo)) {
44
+ return (0, validate_js_1.failShape)(EXAMPLE, 'change.cargo was not an array');
45
+ }
46
+ try {
47
+ const result = (0, cloud_js_1.assertRecord)(value.result);
48
+ if (result.uuid !== value.entityId) {
49
+ return (0, validate_js_1.failShape)(EXAMPLE, 'change.entityId did not equal change.result.uuid');
50
+ }
51
+ }
52
+ catch (error) {
53
+ return (0, validate_js_1.failShape)(EXAMPLE, `change.result was invalid: ${error instanceof Error ? error.message : String(error)}`);
54
+ }
55
+ return (0, validate_js_1.pass)(value);
56
+ }
57
+ function checkLocalEntityRecord(value) {
58
+ if (!(0, validate_js_1.isRecord)(value) || value.contract !== exports.ENTITY_RECORD_CONTRACT) {
59
+ return (0, validate_js_1.failShape)(EXAMPLE, `contract was not ${exports.ENTITY_RECORD_CONTRACT}`);
60
+ }
61
+ for (const field of ['mutationId', 'authorityId']) {
62
+ if (!(0, validate_js_1.isNonEmptyString)(value[field])) {
63
+ return (0, validate_js_1.failShape)(EXAMPLE, `${field} was not a non-empty string`);
64
+ }
65
+ }
66
+ if (typeof value.entityId !== 'string' || !types_js_1.UUID_PATTERN.test(value.entityId)) {
67
+ return (0, validate_js_1.failShape)(EXAMPLE, 'entityId was not an entity UUID');
68
+ }
69
+ if (value.basedOnState !== null
70
+ && (typeof value.basedOnState !== 'string' || !HASH.test(value.basedOnState))) {
71
+ return (0, validate_js_1.failShape)(EXAMPLE, 'basedOnState was not null or lowercase SHA-256');
72
+ }
73
+ if (typeof value.resultState !== 'string' || !HASH.test(value.resultState)) {
74
+ return (0, validate_js_1.failShape)(EXAMPLE, 'resultState was not lowercase SHA-256');
75
+ }
76
+ if (!isSequence(value.lastSeenGlobalSequence) || !isSequence(value.createdAt)) {
77
+ return (0, validate_js_1.failShape)(EXAMPLE, 'lastSeenGlobalSequence and createdAt must be non-negative safe integers');
78
+ }
79
+ const change = checkChange(value.change);
80
+ if (!change.ok)
81
+ return change;
82
+ if (change.value.entityId !== value.entityId
83
+ || change.value.basedOnState !== value.basedOnState
84
+ || change.value.result.version !== value.resultState) {
85
+ return (0, validate_js_1.failShape)(EXAMPLE, 'record lineage did not exactly match its Detect proposal');
86
+ }
87
+ return (0, validate_js_1.pass)(value);
88
+ }
89
+ function checkAcceptedEntityRecord(value) {
90
+ const local = checkLocalEntityRecord(value);
91
+ if (!local.ok)
92
+ return local;
93
+ if (!(0, validate_js_1.isRecord)(value)
94
+ || !isSequence(value.globalSequence, true)
95
+ || !(0, validate_js_1.isNonEmptyString)(value.actorId)
96
+ || !(0, validate_js_1.isNonEmptyString)(value.originDeviceId)
97
+ || !isSequence(value.acceptedAt)) {
98
+ return (0, validate_js_1.failShape)(EXAMPLE, 'accepted record lacked a positive sequence or server-derived acceptance fields');
99
+ }
100
+ return (0, validate_js_1.pass)(value);
101
+ }
102
+ const entityMutationKey = (record) => `${record.entityId}\u0000${record.mutationId}`;
103
+ exports.entityMutationKey = entityMutationKey;
104
+ function createLocalEntityRecord(input) {
105
+ const record = Object.freeze({
106
+ contract: exports.ENTITY_RECORD_CONTRACT,
107
+ mutationId: input.mutationId,
108
+ authorityId: input.authorityId,
109
+ entityId: input.change.entityId,
110
+ basedOnState: input.change.basedOnState,
111
+ resultState: input.change.result.version,
112
+ lastSeenGlobalSequence: input.lastSeenGlobalSequence,
113
+ change: input.change,
114
+ createdAt: input.createdAt,
115
+ });
116
+ const checked = checkLocalEntityRecord(record);
117
+ if (!checked.ok)
118
+ throw new Error(checked.error);
119
+ return record;
120
+ }
121
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/records/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /** Pure per-entity Receive law. Apply is intentionally absent. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.receiveEntityRecord = receiveEntityRecord;
5
+ const codec_js_1 = require("./codec.js");
6
+ /** Decide one durable inbox transaction against this entity's own cursor. */
7
+ function receiveEntityRecord(receivedThrough, record, existing) {
8
+ if (!Number.isSafeInteger(receivedThrough) || receivedThrough < 0) {
9
+ throw new Error('received-through must be a non-negative safe integer');
10
+ }
11
+ if (record.globalSequence <= receivedThrough) {
12
+ if (existing === null) {
13
+ throw new Error('entity cursor claims a sequence that is absent from the inbox');
14
+ }
15
+ if ((0, codec_js_1.encodeEntityRecord)(existing) !== (0, codec_js_1.encodeEntityRecord)(record)) {
16
+ throw new Error('one entity sequence cannot name two accepted record bytes');
17
+ }
18
+ return Object.freeze({ kind: 'duplicate', record: existing });
19
+ }
20
+ if (existing !== null) {
21
+ throw new Error('inbox contains a sequence beyond its entity cursor');
22
+ }
23
+ if (record.globalSequence !== receivedThrough + 1) {
24
+ return Object.freeze({
25
+ kind: 'gap',
26
+ entityId: record.entityId,
27
+ after: receivedThrough,
28
+ received: record.globalSequence,
29
+ });
30
+ }
31
+ return Object.freeze({
32
+ kind: 'insert',
33
+ record,
34
+ receivedThrough: record.globalSequence,
35
+ });
36
+ }
37
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/records/inbox.ts"],"names":[],"mappings":";AAAA,kEAAkE;;AAWlE,kDAiCC;AAzCD,yCAAgD;AAOhD,6EAA6E;AAC7E,SAAgB,mBAAmB,CACjC,eAAuB,EACvB,MAA4B,EAC5B,QAAqC;IAErC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,IAAA,6BAAkB,EAAC,QAAQ,CAAC,KAAK,IAAA,6BAAkB,EAAC,MAAM,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,KAAK,eAAe,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE,MAAM,CAAC,cAAc;SAChC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,eAAe,EAAE,MAAM,CAAC,cAAc;KACvC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /** Entity Record, local Outbox, cloud acceptance, and local Inbox laws. */
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ __exportStar(require("./authority.js"), exports);
19
+ __exportStar(require("./codec.js"), exports);
20
+ __exportStar(require("./contracts.js"), exports);
21
+ __exportStar(require("./inbox.js"), exports);
22
+ __exportStar(require("./outbox.js"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/records/index.ts"],"names":[],"mappings":";AAAA,2EAA2E;;;;;;;;;;;;;;;;AAE3E,iDAA+B;AAC/B,6CAA2B;AAC3B,iDAA+B;AAC/B,6CAA2B;AAC3B,8CAA4B"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /** Pure laws for the local-only record outbox. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.nextEntitySends = nextEntitySends;
5
+ exports.acceptOutboxRow = acceptOutboxRow;
6
+ const codec_js_1 = require("./codec.js");
7
+ /**
8
+ * Choose at most one pending row per entity. This preserves causality within
9
+ * one UUID channel while allowing unrelated entity channels to send in
10
+ * parallel. Input must be in durable local insertion order.
11
+ */
12
+ function nextEntitySends(rows) {
13
+ const selected = [];
14
+ const seen = new Set();
15
+ for (const row of rows) {
16
+ if (row.status !== 'pending')
17
+ continue;
18
+ if (seen.has(row.record.entityId))
19
+ continue;
20
+ seen.add(row.record.entityId);
21
+ selected.push(row);
22
+ }
23
+ return Object.freeze(selected);
24
+ }
25
+ /** Stamp a retained local receipt from the authority's exact acknowledgement. */
26
+ function acceptOutboxRow(row, accepted) {
27
+ if (row.record.authorityId !== accepted.authorityId
28
+ || row.record.entityId !== accepted.entityId
29
+ || row.record.mutationId !== accepted.mutationId) {
30
+ throw new Error('an acknowledgement cannot stamp a different outbox record');
31
+ }
32
+ const { globalSequence: _globalSequence, actorId: _actorId, originDeviceId: _originDeviceId, acceptedAt: _acceptedAt, ...acceptedLocal } = accepted;
33
+ if ((0, codec_js_1.encodeEntityRecord)(row.record) !== (0, codec_js_1.encodeEntityRecord)(acceptedLocal)) {
34
+ throw new Error('an acknowledgement cannot change the outbox record bytes');
35
+ }
36
+ if (row.status === 'accepted') {
37
+ if (row.globalSequence !== accepted.globalSequence) {
38
+ throw new Error('one outbox record cannot have two official entity sequences');
39
+ }
40
+ return row;
41
+ }
42
+ return Object.freeze({
43
+ record: row.record,
44
+ status: 'accepted',
45
+ globalSequence: accepted.globalSequence,
46
+ });
47
+ }
48
+ //# sourceMappingURL=outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/records/outbox.ts"],"names":[],"mappings":";AAAA,kDAAkD;;AAclD,0CAUC;AAGD,0CA2BC;AAnDD,yCAAgD;AAMhD;;;;GAIG;AACH,SAAgB,eAAe,CAAC,IAA0B;IACxD,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QACvC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,iFAAiF;AACjF,SAAgB,eAAe,CAAC,GAAc,EAAE,QAA8B;IAC5E,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW;WAC9C,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ;WACzC,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,EACJ,cAAc,EAAE,eAAe,EAC/B,OAAO,EAAE,QAAQ,EACjB,cAAc,EAAE,eAAe,EAC/B,UAAU,EAAE,WAAW,EACvB,GAAG,aAAa,EACjB,GAAG,QAAQ,CAAC;IACb,IAAI,IAAA,6BAAkB,EAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAA,6BAAkB,EAAC,aAAa,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,UAAU;QAClB,cAAc,EAAE,QAAQ,CAAC,cAAc;KACxC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /** Login-time Register/Add convergence over injected local and cloud effects. */
18
+ __exportStar(require("./user-ground.js"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registration/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iFAAiF;AACjF,mDAAiC"}