@agentshouse/mdruntime 0.1.0-cf24798931067 → 0.1.0-cf53a3b60b194

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 (202) hide show
  1. package/README.md +21 -9
  2. package/dist/adapter.d.ts +133 -30
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +5 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +21 -4
  7. package/dist/attempt.d.ts.map +1 -1
  8. package/dist/attempt.js +14 -1
  9. package/dist/binary.d.ts +18 -0
  10. package/dist/binary.d.ts.map +1 -0
  11. package/dist/binary.js +8 -0
  12. package/dist/bootstrap.d.ts +32 -9
  13. package/dist/bootstrap.d.ts.map +1 -1
  14. package/dist/bootstrap.js +192 -67
  15. package/dist/chain.d.ts +11 -0
  16. package/dist/chain.d.ts.map +1 -0
  17. package/dist/chain.js +64 -0
  18. package/dist/change-set.d.ts +9 -14
  19. package/dist/change-set.d.ts.map +1 -1
  20. package/dist/change-set.js +11 -62
  21. package/dist/change.d.ts +41 -0
  22. package/dist/change.d.ts.map +1 -1
  23. package/dist/change.js +34 -0
  24. package/dist/client.d.ts +28 -10
  25. package/dist/client.d.ts.map +1 -1
  26. package/dist/client.js +103 -6
  27. package/dist/collection.d.ts +12 -6
  28. package/dist/collection.d.ts.map +1 -1
  29. package/dist/collection.js +51 -76
  30. package/dist/compile.d.ts +16 -0
  31. package/dist/compile.d.ts.map +1 -0
  32. package/dist/compile.js +765 -0
  33. package/dist/connection.d.ts +51 -16
  34. package/dist/connection.d.ts.map +1 -1
  35. package/dist/connection.js +3747 -760
  36. package/dist/conversation.d.ts +30 -9
  37. package/dist/conversation.d.ts.map +1 -1
  38. package/dist/conversation.js +602 -197
  39. package/dist/digest.d.ts +7 -0
  40. package/dist/digest.d.ts.map +1 -0
  41. package/dist/digest.js +113 -0
  42. package/dist/durability.d.ts +5 -1
  43. package/dist/durability.d.ts.map +1 -1
  44. package/dist/durability.js +5 -0
  45. package/dist/entry.d.ts +19 -0
  46. package/dist/entry.d.ts.map +1 -0
  47. package/dist/entry.js +151 -0
  48. package/dist/fence.d.ts +6 -0
  49. package/dist/fence.d.ts.map +1 -0
  50. package/dist/fence.js +10 -0
  51. package/dist/file.d.ts +2 -19
  52. package/dist/file.d.ts.map +1 -1
  53. package/dist/file.js +7 -122
  54. package/dist/fulltext.d.ts +27 -0
  55. package/dist/fulltext.d.ts.map +1 -0
  56. package/dist/fulltext.js +368 -0
  57. package/dist/host.d.ts +15 -3
  58. package/dist/host.d.ts.map +1 -1
  59. package/dist/host.js +130 -14
  60. package/dist/identity.d.ts +2 -0
  61. package/dist/identity.d.ts.map +1 -1
  62. package/dist/identity.js +6 -0
  63. package/dist/index.d.ts +15 -8
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +6 -0
  66. package/dist/live.d.ts +22 -0
  67. package/dist/live.d.ts.map +1 -0
  68. package/dist/live.js +124 -0
  69. package/dist/media.d.ts +8 -0
  70. package/dist/media.d.ts.map +1 -0
  71. package/dist/media.js +208 -0
  72. package/dist/memory.d.ts +12 -5
  73. package/dist/memory.d.ts.map +1 -1
  74. package/dist/memory.js +112 -24
  75. package/dist/messages.d.ts +28 -0
  76. package/dist/messages.d.ts.map +1 -0
  77. package/dist/messages.js +90 -0
  78. package/dist/model.d.ts +10 -2
  79. package/dist/model.d.ts.map +1 -1
  80. package/dist/model.js +17 -2
  81. package/dist/name.d.ts +4 -0
  82. package/dist/name.d.ts.map +1 -0
  83. package/dist/name.js +122 -0
  84. package/dist/observation.d.ts +20 -2
  85. package/dist/observation.d.ts.map +1 -1
  86. package/dist/observation.js +113 -12
  87. package/dist/opened.d.ts +22 -0
  88. package/dist/opened.d.ts.map +1 -0
  89. package/dist/opened.js +107 -0
  90. package/dist/outcome.d.ts +52 -1
  91. package/dist/outcome.d.ts.map +1 -1
  92. package/dist/outcome.js +46 -0
  93. package/dist/overlay.d.ts +15 -5
  94. package/dist/overlay.d.ts.map +1 -1
  95. package/dist/overlay.js +129 -177
  96. package/dist/paths.d.ts +1 -0
  97. package/dist/paths.d.ts.map +1 -1
  98. package/dist/paths.js +4 -0
  99. package/dist/query.d.ts +68 -4
  100. package/dist/query.d.ts.map +1 -1
  101. package/dist/query.js +48 -7
  102. package/dist/reach.d.ts +18 -4
  103. package/dist/reach.d.ts.map +1 -1
  104. package/dist/reach.js +227 -51
  105. package/dist/react.d.ts +8 -6
  106. package/dist/react.d.ts.map +1 -1
  107. package/dist/react.js +7 -17
  108. package/dist/readiness.d.ts +64 -0
  109. package/dist/readiness.d.ts.map +1 -0
  110. package/dist/readiness.js +33 -0
  111. package/dist/reads.d.ts +11 -0
  112. package/dist/reads.d.ts.map +1 -0
  113. package/dist/reads.js +100 -0
  114. package/dist/recovery.d.ts +25 -0
  115. package/dist/recovery.d.ts.map +1 -0
  116. package/dist/recovery.js +198 -0
  117. package/dist/refresh.d.ts +16 -15
  118. package/dist/refresh.d.ts.map +1 -1
  119. package/dist/refresh.js +113 -54
  120. package/dist/replica.d.ts +59 -33
  121. package/dist/replica.d.ts.map +1 -1
  122. package/dist/replica.js +309 -157
  123. package/dist/room-draft.d.ts +35 -3
  124. package/dist/room-draft.d.ts.map +1 -1
  125. package/dist/room-draft.js +174 -16
  126. package/dist/rows.d.ts +37 -35
  127. package/dist/rows.d.ts.map +1 -1
  128. package/dist/rows.js +173 -102
  129. package/dist/save.d.ts +70 -3
  130. package/dist/save.d.ts.map +1 -1
  131. package/dist/save.js +805 -147
  132. package/dist/search.d.ts +39 -28
  133. package/dist/search.d.ts.map +1 -1
  134. package/dist/search.js +37 -105
  135. package/dist/seed.d.ts +16 -0
  136. package/dist/seed.d.ts.map +1 -0
  137. package/dist/seed.js +75 -0
  138. package/dist/shared.d.ts +16 -0
  139. package/dist/shared.d.ts.map +1 -0
  140. package/dist/shared.js +431 -0
  141. package/dist/status.d.ts +9 -0
  142. package/dist/status.d.ts.map +1 -1
  143. package/dist/status.js +3 -1
  144. package/dist/store.d.ts +128 -79
  145. package/dist/store.d.ts.map +1 -1
  146. package/dist/store.js +376 -457
  147. package/dist/stored.d.ts +154 -0
  148. package/dist/stored.d.ts.map +1 -0
  149. package/dist/stored.js +578 -0
  150. package/dist/tables.d.ts +362 -0
  151. package/dist/tables.d.ts.map +1 -0
  152. package/dist/tables.js +627 -0
  153. package/dist/turn.d.ts +9 -0
  154. package/dist/turn.d.ts.map +1 -0
  155. package/dist/turn.js +75 -0
  156. package/dist/validation.d.ts +30 -0
  157. package/dist/validation.d.ts.map +1 -0
  158. package/dist/validation.js +162 -0
  159. package/dist/windows.d.ts +22 -0
  160. package/dist/windows.d.ts.map +1 -0
  161. package/dist/windows.js +89 -0
  162. package/dist/wire.d.ts +168 -30
  163. package/dist/wire.d.ts.map +1 -1
  164. package/dist/wire.js +56 -29
  165. package/dist/words.d.ts +19 -0
  166. package/dist/words.d.ts.map +1 -0
  167. package/dist/words.js +156 -0
  168. package/package.json +26 -15
  169. package/AGENTS.md +0 -290
  170. package/dist/attachment.d.ts +0 -3
  171. package/dist/attachment.d.ts.map +0 -1
  172. package/dist/attachment.js +0 -8
  173. package/dist/chat/acts.d.ts +0 -34
  174. package/dist/chat/acts.d.ts.map +0 -1
  175. package/dist/chat/acts.js +0 -36
  176. package/dist/chat/messages.d.ts +0 -21
  177. package/dist/chat/messages.d.ts.map +0 -1
  178. package/dist/chat/messages.js +0 -151
  179. package/dist/chat/overlay.d.ts +0 -31
  180. package/dist/chat/overlay.d.ts.map +0 -1
  181. package/dist/chat/overlay.js +0 -97
  182. package/dist/chat/parts.d.ts +0 -57
  183. package/dist/chat/parts.d.ts.map +0 -1
  184. package/dist/chat/parts.js +0 -119
  185. package/dist/chat/process.d.ts +0 -20
  186. package/dist/chat/process.d.ts.map +0 -1
  187. package/dist/chat/process.js +0 -32
  188. package/dist/chat/provider.d.ts +0 -57
  189. package/dist/chat/provider.d.ts.map +0 -1
  190. package/dist/chat/provider.js +0 -637
  191. package/dist/chat/questions.d.ts +0 -31
  192. package/dist/chat/questions.d.ts.map +0 -1
  193. package/dist/chat/questions.js +0 -111
  194. package/dist/chat/read.d.ts +0 -5
  195. package/dist/chat/read.d.ts.map +0 -1
  196. package/dist/chat/read.js +0 -13
  197. package/dist/chat.d.ts +0 -7
  198. package/dist/chat.d.ts.map +0 -1
  199. package/dist/chat.js +0 -2
  200. package/dist/read-side.d.ts +0 -18
  201. package/dist/read-side.d.ts.map +0 -1
  202. package/dist/read-side.js +0 -433
package/dist/bootstrap.js CHANGED
@@ -1,75 +1,202 @@
1
- import { declaredAttachments } from './attachment.js';
2
1
  import { transferIdentity } from './identity.js';
3
- import { advancement } from './refresh.js';
4
- import { readStaged } from './replica.js';
2
+ import { advancement, pageEntries } from './refresh.js';
5
3
  import { unconfirmed } from './transfer.js';
4
+ export const NOTHING_DONE = { parts: 0, bytes: 0 };
6
5
  const RESUMABLE = new Set([
7
6
  'transport-uncertainty',
8
7
  'retryable-refusal',
9
8
  'unconfirmed',
10
9
  ]);
11
- function pageLayer(page) {
10
+ const NOTHING_PRIOR = () => Promise.resolve(new Map());
11
+ async function pageOf(page) {
12
12
  return {
13
- documents: page.documents,
14
- revisions: page.revisions,
15
- changes: page.changes,
16
- written: Object.fromEntries(Object.keys(page.documents).map((path) => [path, page.roomVersion])),
17
- binaryTargets: page.binaryTargets,
13
+ entries: await pageEntries(page, [], page.roomVersion, NOTHING_PRIOR),
14
+ folders: page.folders ?? [],
18
15
  };
19
16
  }
20
- async function heldTransfer(staging, room) {
21
- const record = staging.held(room.locator);
22
- if (record === null)
23
- return null;
24
- if (record.selection === room.replica.selection) {
25
- return { record, layer: await staging.staged(record) };
17
+ function heldTogether(first, second) {
18
+ if (first === null)
19
+ return second;
20
+ return {
21
+ async files(after, limit) {
22
+ const [left, right] = await Promise.all([
23
+ first.files(after, limit),
24
+ second.files(after, limit),
25
+ ]);
26
+ const merged = new Map([...left, ...right].map((file) => [file.path, file]));
27
+ return [...merged.values()]
28
+ .sort((one, other) => (one.path < other.path ? -1 : one.path > other.path ? 1 : 0))
29
+ .slice(0, limit);
30
+ },
31
+ async contents(paths) {
32
+ const [left, right] = await Promise.all([first.contents(paths), second.contents(paths)]);
33
+ return new Map([...left, ...right]);
34
+ },
35
+ };
36
+ }
37
+ const NO_CONTENT = {
38
+ files: () => Promise.resolve([]),
39
+ contents: () => Promise.resolve(new Map()),
40
+ };
41
+ export async function bootstrapRoom(adapter, authorization, room, held, builtIn, remodel, continuing, staging, reuse) {
42
+ const kept = staging.held(room.locator);
43
+ const resumed = kept !== null && kept.selection === room.replica.selection ? kept : null;
44
+ if (kept !== null && resumed === null)
45
+ await staging.abandon(room.locator);
46
+ const first = await bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, resumed, reuse);
47
+ if (first.kind !== 'expired')
48
+ return first;
49
+ await staging.setAside(room.locator);
50
+ try {
51
+ const replacement = await bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, null, heldTogether(reuse, first.held));
52
+ if (replacement.kind !== 'expired')
53
+ return replacement;
54
+ await staging.abandon(room.locator);
55
+ return unconfirmed;
56
+ }
57
+ finally {
58
+ if (first.key !== null)
59
+ await staging.release(first.key);
26
60
  }
27
- await staging.abandon(room.locator);
28
- return null;
29
61
  }
30
- export async function bootstrapRoom(adapter, authorization, room, held, remodel, continuing, staging) {
62
+ const UNASKED = { page: unconfirmed, reused: false };
63
+ const NOTHING_KEPT = Promise.resolve();
64
+ function dropped(ahead) {
65
+ void ahead?.fetched.then(({ next, written }) => {
66
+ written();
67
+ dropped(next);
68
+ }, () => { });
69
+ }
70
+ function compositionFor(room, models, builtIn) {
71
+ return {
72
+ model: models.collection,
73
+ selection: room.typedSelection === undefined
74
+ ? null
75
+ : { roots: room.typedSelection.roots, model: builtIn },
76
+ };
77
+ }
78
+ async function bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, kept, pool) {
31
79
  const locator = room.locator;
32
80
  const selection = room.replica.selection;
33
- const kept = await heldTransfer(staging, room);
34
- const documents = { ...kept?.layer.documents };
35
- const revisions = { ...kept?.layer.revisions };
36
- const changes = { ...kept?.layer.changes };
37
- const written = { ...kept?.layer.written };
38
- const binaryTargets = new Set(kept?.layer.binaryTargets);
39
- let transfer = kept?.record ?? null;
40
- while (transfer === null || transfer.pageToken !== null) {
41
- if (!continuing())
42
- return unconfirmed;
81
+ let transfer = kept;
82
+ let looking = kept !== null;
83
+ let stopped = false;
84
+ let begin = () => { };
85
+ const begun = kept === null
86
+ ? new Promise((resolve) => {
87
+ begin = resolve;
88
+ })
89
+ : NOTHING_KEPT;
90
+ const arriving = staging.arriving(locator);
91
+ const asking = async (token) => {
92
+ const received = token !== null && looking ? await staging.received(locator, token) : null;
93
+ if (received === null)
94
+ looking = false;
43
95
  const page = await adapter.bootstrap(authorization, {
44
96
  locator,
45
97
  selection,
46
- ...(transfer?.pageToken == null ? {} : { pageToken: transfer.pageToken }),
98
+ ...(token === null
99
+ ? {}
100
+ : { pageToken: token, arriving: (bytes) => arriving.at(token, bytes) }),
101
+ ...(pool === null ? {} : { held: pool }),
102
+ ...(received === null ? {} : { received }),
47
103
  });
48
- if (page.kind !== 'bootstrap') {
49
- if (!RESUMABLE.has(page.kind))
50
- await staging.abandon(locator);
51
- return page;
104
+ return { page, reused: received !== null };
105
+ };
106
+ const fetching = (token) => {
107
+ const fetched = (async () => {
108
+ const release = await staging.turn(locator, token === null ? 'listing' : 'downloading');
109
+ let asked;
110
+ try {
111
+ asked = stopped || !continuing() ? UNASKED : await asking(token);
112
+ }
113
+ finally {
114
+ release();
115
+ }
116
+ const { page, reused } = asked;
117
+ if (page.kind !== 'bootstrap') {
118
+ return { page, kept: NOTHING_KEPT, next: null, written: () => { } };
119
+ }
120
+ const received = page.received;
121
+ const written = staging.queued(received?.byteLength ?? 0);
122
+ let kept = NOTHING_KEPT;
123
+ if (token !== null && received !== undefined && !reused) {
124
+ kept = begun.then(() => staging.keep(locator, token, received));
125
+ kept.catch(() => { });
126
+ }
127
+ const later = page.pageToken;
128
+ const next = later === undefined || stopped || !continuing() ? null : fetching(later);
129
+ return { page, kept, next, written };
130
+ })();
131
+ fetched.catch(() => { });
132
+ return { token, fetched };
133
+ };
134
+ let ahead = null;
135
+ try {
136
+ while (transfer === null || transfer.pageToken !== null) {
137
+ if (!continuing())
138
+ return unconfirmed;
139
+ const asked = transfer?.pageToken ?? null;
140
+ const current = ahead !== null && ahead.token === asked ? ahead : fetching(asked);
141
+ if (ahead !== current)
142
+ dropped(ahead);
143
+ ahead = null;
144
+ const fetched = await current.fetched;
145
+ ahead = fetched.next;
146
+ try {
147
+ if (!continuing())
148
+ return unconfirmed;
149
+ const page = fetched.page;
150
+ if (page.kind === 'beyond-horizon') {
151
+ const key = transfer?.key ?? null;
152
+ return { kind: 'expired', held: key === null ? NO_CONTENT : staging.content(key), key };
153
+ }
154
+ if (page.kind !== 'bootstrap') {
155
+ if (!RESUMABLE.has(page.kind))
156
+ await staging.abandon(locator);
157
+ return page;
158
+ }
159
+ await fetched.kept;
160
+ const done = transfer?.done ?? NOTHING_DONE;
161
+ const part = page.received?.byteLength;
162
+ const next = {
163
+ locator,
164
+ transfer: transfer?.transfer ?? transferIdentity(),
165
+ selection,
166
+ from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
167
+ ? transfer.from
168
+ : page.roomVersion,
169
+ last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
170
+ ? transfer.last
171
+ : page.roomVersion,
172
+ pageToken: page.pageToken ?? null,
173
+ inventory: page.inventory ?? transfer?.inventory ?? null,
174
+ done: part === undefined ? done : { parts: done.parts + 1, bytes: done.bytes + part },
175
+ models: remodel(page.models, transfer?.models ?? held),
176
+ key: transfer?.key ?? null,
177
+ };
178
+ const staged = await staging.stage(next, await pageOf(page), compositionFor(room, next.models, builtIn), part === undefined ? null : asked);
179
+ if (staged === null)
180
+ return unconfirmed;
181
+ transfer = staged;
182
+ begin();
183
+ }
184
+ finally {
185
+ fetched.written();
186
+ }
52
187
  }
53
- transfer = {
54
- locator,
55
- transfer: transfer?.transfer ?? transferIdentity(),
56
- selection,
57
- from: transfer?.from ?? page.roomVersion,
58
- last: page.roomVersion,
59
- pageToken: page.pageToken ?? null,
60
- models: remodel(page.models, transfer?.models ?? held),
61
- attachments: [...(transfer?.attachments ?? []), page.attachments ?? []],
62
- };
63
- const staged = pageLayer(page);
64
- if (!(await staging.stage(transfer, staged)))
65
- return unconfirmed;
66
- Object.assign(documents, staged.documents);
67
- Object.assign(revisions, staged.revisions);
68
- Object.assign(changes, staged.changes);
69
- Object.assign(written, staged.written);
70
- for (const target of staged.binaryTargets)
71
- binaryTargets.add(target);
72
188
  }
189
+ finally {
190
+ stopped = true;
191
+ dropped(ahead);
192
+ arriving.end();
193
+ }
194
+ const composition = compositionFor(room, transfer.models, builtIn);
195
+ if (!(await staging.derive(locator, transfer.key, composition)))
196
+ return unconfirmed;
197
+ await staging.turn(locator, 'replaying');
198
+ if (!continuing())
199
+ return unconfirmed;
73
200
  const record = {
74
201
  locator,
75
202
  name: room.name,
@@ -78,31 +205,29 @@ export async function bootstrapRoom(adapter, authorization, room, held, remodel,
78
205
  replica: room.replica,
79
206
  model: transfer.models.collection,
80
207
  typedSelection: room.typedSelection ?? null,
81
- selectionModel: transfer.models.selection,
82
208
  providerOwnedPaths: room.providerOwnedPaths,
83
209
  roomVersion: transfer.from,
84
210
  transfer: transfer.transfer,
85
- documents,
86
- binaryTargets: [...binaryTargets].sort(),
87
- revisions,
88
- changes,
89
- written,
90
- attachments: declaredAttachments(transfer.attachments),
211
+ inventory: transfer.inventory,
212
+ key: transfer.key,
91
213
  };
92
- const reconciled = transfer.last === transfer.from
214
+ const due = [room.roomVersion, ...staging.announced(locator)];
215
+ const last = transfer.last;
216
+ const reconciled = last === transfer.from && due.every((version) => adapter.reached(locator, last, version))
93
217
  ? { kind: 'still-current' }
94
- : await advancement(adapter, authorization, record, remodel, continuing);
218
+ : await advancement(adapter, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key, composition));
95
219
  if (reconciled.kind === 'advanced' || reconciled.kind === 'still-current') {
96
- const read = readStaged(reconciled.kind === 'advanced' ? reconciled.record : record);
97
- if (read.kind === 'refused') {
220
+ const refreshed = reconciled.kind === 'advanced';
221
+ const result = refreshed ? reconciled.record : record;
222
+ const refused = await staging.validate(result, refreshed ? 'refreshed' : 'confirmed');
223
+ if (refused !== null) {
98
224
  await staging.abandon(locator);
99
- return read;
225
+ return refused;
100
226
  }
101
- return { kind: 'staged', confirmed: read.confirmed, stored: record };
227
+ return { kind: 'staged', record: result, refreshed };
102
228
  }
103
229
  if (reconciled.kind === 'beyond-horizon') {
104
- await staging.abandon(locator);
105
- return unconfirmed;
230
+ return { kind: 'expired', held: staging.content(record.key), key: record.key };
106
231
  }
107
232
  if (!RESUMABLE.has(reconciled.kind))
108
233
  await staging.abandon(locator);
@@ -0,0 +1,11 @@
1
+ import type { MdRuntimeClient } from './client.js';
2
+ import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
3
+ type Rows = DocumentResult | GroupResult;
4
+ export type WindowAnswer = Rows | PendingResult;
5
+ export type WindowChain = {
6
+ want(count: number): void;
7
+ close(): void;
8
+ };
9
+ export declare function chainedWindows(runtime: MdRuntimeClient, query: DocumentQuery | GroupQuery, count: number, publish: (answers: readonly (WindowAnswer | null)[], settled: boolean) => void): WindowChain;
10
+ export {};
11
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,KAAK,IAAI,GAAG,cAAc,GAAG,WAAW,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAaF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,aAAa,GAAG,UAAU,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAC7E,WAAW,CAkEb"}
package/dist/chain.js ADDED
@@ -0,0 +1,64 @@
1
+ function answered(answer) {
2
+ return answer !== null && !('pending' in answer);
3
+ }
4
+ export function chainedWindows(runtime, query, count, publish) {
5
+ let links = [];
6
+ let wanted = count;
7
+ let closed = false;
8
+ const observe = runtime.observe;
9
+ const open = (after, shown) => {
10
+ const link = { after, observation: null, value: shown, fresh: false };
11
+ void observe('query', after === undefined ? query : { ...query, after }).then((observation) => {
12
+ if (closed || !links.includes(link)) {
13
+ observation.close();
14
+ return;
15
+ }
16
+ link.observation = observation;
17
+ const take = (value) => {
18
+ link.value = value;
19
+ link.fresh = true;
20
+ settle();
21
+ };
22
+ observation.subscribe(take);
23
+ take(observation.current());
24
+ }, () => { });
25
+ return link;
26
+ };
27
+ const settle = () => {
28
+ if (closed)
29
+ return;
30
+ const next = [];
31
+ for (let at = 0; at < wanted; at += 1) {
32
+ const before = next[at - 1];
33
+ if (before !== undefined && !before.fresh) {
34
+ next.push(...links.slice(at, wanted));
35
+ break;
36
+ }
37
+ if (before !== undefined && (!answered(before.value) || before.value.next === undefined)) {
38
+ break;
39
+ }
40
+ const after = before === undefined ? undefined : before.value.next;
41
+ const held = links[at];
42
+ next.push(held !== undefined && held.after === after ? held : open(after, held?.value ?? null));
43
+ }
44
+ for (const link of links)
45
+ if (!next.includes(link))
46
+ link.observation?.close();
47
+ links = next;
48
+ publish(links.map((link) => link.value), links.every((link) => link.fresh));
49
+ };
50
+ settle();
51
+ return {
52
+ want(count) {
53
+ if (count === wanted)
54
+ return;
55
+ wanted = count;
56
+ settle();
57
+ },
58
+ close() {
59
+ closed = true;
60
+ for (const link of links)
61
+ link.observation?.close();
62
+ },
63
+ };
64
+ }
@@ -1,14 +1,6 @@
1
- import { type Replica } from './replica.js';
2
- import { type Row } from './rows.js';
3
1
  export type DocumentChange = {
4
- locator: string;
5
- path: string;
6
- before: readonly Row[];
7
- after: readonly Row[];
8
- };
9
- export type MessageChange = {
10
- conversation: string;
11
- identity: string;
2
+ readonly locator: string;
3
+ readonly path: string | null;
12
4
  };
13
5
  export type ChangeSet = {
14
6
  documents: readonly DocumentChange[];
@@ -19,15 +11,18 @@ export type ChangeSet = {
19
11
  rooms: readonly string[];
20
12
  queues: readonly string[];
21
13
  presentations: readonly string[];
22
- messages: readonly MessageChange[];
23
14
  conversations: readonly string[];
24
15
  };
25
- export declare function changeSet(locator: string, before: Replica | null, after: Replica | null, changed?: {
16
+ type Changed = {
17
+ documents?: readonly string[] | null;
26
18
  drafts?: readonly string[];
27
19
  room?: boolean;
28
20
  queue?: boolean;
29
21
  presentation?: string;
30
- }): ChangeSet;
31
- export declare function conversationChangeSet(messages: readonly MessageChange[], conversations: readonly string[]): ChangeSet;
22
+ };
23
+ export declare function changeSet(locator: string, changed?: Changed): ChangeSet;
24
+ export declare function conversationChangeSet(conversations: readonly string[]): ChangeSet;
32
25
  export declare function mergeChangeSets(sets: readonly ChangeSet[]): ChangeSet;
26
+ export declare function touches(set: ChangeSet, locator: string, path: string): boolean;
27
+ export {};
33
28
  //# sourceMappingURL=change-set.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAwB,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,EAAE,CAAC;IACvB,KAAK,EAAE,SAAS,GAAG,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,SAAS;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAqBF,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GAAG,IAAI,EACtB,KAAK,EAAE,OAAO,GAAG,IAAI,EACrB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,SAAS,CAqDX;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,SAAS,CAUX;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAUrE"}
1
+ {"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,SAAS;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,GAAG,SAAS,CAe3E;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CASjF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CASrE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAI9E"}
@@ -1,78 +1,25 @@
1
- import { passingDocument } from './collection.js';
2
- import { sameChange } from './overlay.js';
3
- import { beneath } from './paths.js';
4
- import { compositionOf, sameMembership } from './replica.js';
5
- import { markdownPath, rowsOf } from './rows.js';
6
- function rowsAt(locator, replica, path) {
7
- if (replica === null)
8
- return [];
9
- const visible = replica.visible;
10
- const document = markdownPath(path) ? passingDocument(visible.collection, path) : null;
11
- const held = visible.documents[path] !== undefined && document !== undefined;
12
- if (!held && !visible.binaryTargets.includes(path))
13
- return [];
14
- return rowsOf(locator, path, document ?? null, compositionOf(replica.confirmed.record), visible.changes[path] ?? null);
15
- }
16
- function modelShape(model) {
17
- return model.status === 'unavailable' ? 'unavailable' : JSON.stringify(model.types);
18
- }
19
- export function changeSet(locator, before, after, changed = {}) {
20
- const paths = new Set([
21
- ...Object.keys(before?.visible.documents ?? {}),
22
- ...Object.keys(after?.visible.documents ?? {}),
23
- ...(before?.visible.binaryTargets ?? []),
24
- ...(after?.visible.binaryTargets ?? []),
25
- ]);
26
- const documents = [];
27
- const oldRoom = before?.confirmed.record;
28
- const newRoom = after?.confirmed.record;
29
- const collectionChanged = oldRoom !== undefined &&
30
- newRoom !== undefined &&
31
- modelShape(oldRoom.model) !== modelShape(newRoom.model);
32
- const selectionChanged = oldRoom !== undefined &&
33
- newRoom !== undefined &&
34
- modelShape(oldRoom.selectionModel) !== modelShape(newRoom.selectionModel);
35
- const reclassified = oldRoom !== undefined && newRoom !== undefined && !sameMembership(oldRoom, newRoom);
36
- for (const path of paths) {
37
- const selected = newRoom?.typedSelection?.roots.some((root) => beneath(root, path)) ?? false;
38
- const retyped = selected ? selectionChanged : collectionChanged;
39
- if (before?.visible.documents[path] === after?.visible.documents[path] &&
40
- before?.visible.binaryTargets.includes(path) ===
41
- after?.visible.binaryTargets.includes(path) &&
42
- before?.visible.revisions[path] === after?.visible.revisions[path] &&
43
- sameChange(before?.visible.changes[path], after?.visible.changes[path]) &&
44
- !retyped &&
45
- !reclassified)
46
- continue;
47
- documents.push({
48
- locator,
49
- path,
50
- get before() {
51
- return rowsAt(locator, before, path);
52
- },
53
- get after() {
54
- return rowsAt(locator, after, path);
55
- },
56
- });
57
- }
1
+ export function changeSet(locator, changed = {}) {
2
+ const documents = changed.documents;
58
3
  return {
59
- documents,
4
+ documents: documents === undefined
5
+ ? []
6
+ : documents === null
7
+ ? [{ locator, path: null }]
8
+ : documents.map((path) => ({ locator, path })),
60
9
  drafts: (changed.drafts ?? []).map((path) => ({ locator, path })),
61
10
  rooms: changed.room ? [locator] : [],
62
11
  queues: changed.queue ? [locator] : [],
63
12
  presentations: changed.presentation === undefined ? [] : [changed.presentation],
64
- messages: [],
65
13
  conversations: [],
66
14
  };
67
15
  }
68
- export function conversationChangeSet(messages, conversations) {
16
+ export function conversationChangeSet(conversations) {
69
17
  return {
70
18
  documents: [],
71
19
  drafts: [],
72
20
  rooms: [],
73
21
  queues: [],
74
22
  presentations: [],
75
- messages,
76
23
  conversations: [...new Set(conversations)],
77
24
  };
78
25
  }
@@ -83,7 +30,9 @@ export function mergeChangeSets(sets) {
83
30
  rooms: [...new Set(sets.flatMap((set) => set.rooms))],
84
31
  queues: [...new Set(sets.flatMap((set) => set.queues))],
85
32
  presentations: [...new Set(sets.flatMap((set) => set.presentations))],
86
- messages: sets.flatMap((set) => set.messages),
87
33
  conversations: [...new Set(sets.flatMap((set) => set.conversations))],
88
34
  };
89
35
  }
36
+ export function touches(set, locator, path) {
37
+ return set.documents.some((change) => change.locator === locator && (change.path === null || change.path === path));
38
+ }
package/dist/change.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { BinaryFile, HeadChange } from './adapter.js';
1
2
  export type Change = {
2
3
  readonly kind: 'field';
3
4
  readonly path: string;
@@ -25,6 +26,13 @@ export type Change = {
25
26
  readonly kind: 'replace';
26
27
  readonly path: string;
27
28
  readonly content: string;
29
+ } | {
30
+ readonly kind: 'binary';
31
+ readonly path: string;
32
+ readonly localId: string;
33
+ readonly byteLength: number;
34
+ readonly mediaType: string;
35
+ readonly sha256: string;
28
36
  } | {
29
37
  readonly kind: 'move';
30
38
  readonly path: string;
@@ -32,6 +40,32 @@ export type Change = {
32
40
  } | {
33
41
  readonly kind: 'remove';
34
42
  readonly path: string;
43
+ } | (Arriving & {
44
+ readonly content: string;
45
+ }) | (Arriving & {
46
+ readonly binary: BinaryFile;
47
+ });
48
+ type Arriving = {
49
+ readonly kind: 'arrival';
50
+ readonly path: string;
51
+ readonly revision?: string;
52
+ readonly fileId?: string;
53
+ readonly change?: HeadChange;
54
+ };
55
+ export type RoomMove = {
56
+ readonly source: {
57
+ readonly room: string;
58
+ readonly baseRoomVersion: string;
59
+ };
60
+ readonly destination: {
61
+ readonly room: string;
62
+ readonly baseRoomVersion: string;
63
+ readonly handle: string;
64
+ };
65
+ readonly moves: readonly {
66
+ readonly path: string;
67
+ readonly to: string;
68
+ }[];
35
69
  };
36
70
  export type Precondition = {
37
71
  readonly kind: 'field';
@@ -73,6 +107,13 @@ export type ChangeBatch = {
73
107
  readonly changes: readonly Change[];
74
108
  readonly preconditions: readonly Precondition[];
75
109
  readonly writtenBy?: WrittenBy;
110
+ readonly between?: RoomMove;
76
111
  };
77
112
  export declare function immutable(batch: ChangeBatch): ChangeBatch;
113
+ export declare function partnerOf(batch: ChangeBatch, locator: string): string | null;
114
+ export declare function leaving(batch: ChangeBatch, locator: string): boolean;
115
+ export declare function landing(changes: readonly Change[], index: number, path: string): string | null;
116
+ export declare function departure(changes: readonly Change[], index: number): string;
117
+ export declare function queuedFile(batch: ChangeBatch, path: string, localId: string): number;
118
+ export {};
78
119
  //# sourceMappingURL=change.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../src/change.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../src/change.ts"],"names":[],"mappings":"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"}
package/dist/change.js CHANGED
@@ -11,3 +11,37 @@ function frozen(value) {
11
11
  export function immutable(batch) {
12
12
  return frozen(batch);
13
13
  }
14
+ export function partnerOf(batch, locator) {
15
+ const between = batch.between;
16
+ if (between === undefined)
17
+ return null;
18
+ return between.source.room === locator ? between.destination.room : between.source.room;
19
+ }
20
+ export function leaving(batch, locator) {
21
+ return batch.between?.source.room === locator;
22
+ }
23
+ export function landing(changes, index, path) {
24
+ let at = path;
25
+ for (const change of changes.slice(index + 1)) {
26
+ if (change.path !== at)
27
+ continue;
28
+ if (change.kind === 'remove')
29
+ return null;
30
+ if (change.kind === 'move')
31
+ at = change.to;
32
+ }
33
+ return at;
34
+ }
35
+ export function departure(changes, index) {
36
+ let at = changes[index].path;
37
+ for (const change of changes.slice(0, index).reverse()) {
38
+ if (change.kind === 'move' && change.to === at)
39
+ at = change.path;
40
+ }
41
+ return at;
42
+ }
43
+ export function queuedFile(batch, path, localId) {
44
+ return batch.changes.findIndex((change, index) => change.kind === 'binary' &&
45
+ change.localId === localId &&
46
+ landing(batch.changes, index, change.path) === path);
47
+ }