@agentshouse/mdruntime 0.1.0-c1db74d14e5fa → 0.1.0-c210758b77baa

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 (220) hide show
  1. package/AGENTS.md +268 -251
  2. package/README.md +9 -8
  3. package/dist/adapter.d.ts +76 -40
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/attached-model.d.ts +4 -1
  6. package/dist/attached-model.d.ts.map +1 -1
  7. package/dist/attached-model.js +13 -3
  8. package/dist/binary.d.ts +0 -5
  9. package/dist/binary.d.ts.map +1 -1
  10. package/dist/binary.js +1 -1
  11. package/dist/bootstrap.d.ts +26 -7
  12. package/dist/bootstrap.d.ts.map +1 -1
  13. package/dist/bootstrap.js +148 -78
  14. package/dist/chain.d.ts +11 -0
  15. package/dist/chain.d.ts.map +1 -0
  16. package/dist/chain.js +64 -0
  17. package/dist/change-set.d.ts +9 -16
  18. package/dist/change-set.d.ts.map +1 -1
  19. package/dist/change-set.js +11 -88
  20. package/dist/change.d.ts +31 -1
  21. package/dist/change.d.ts.map +1 -1
  22. package/dist/change.js +10 -1
  23. package/dist/chat/earlier.d.ts +10 -0
  24. package/dist/chat/earlier.d.ts.map +1 -0
  25. package/dist/chat/earlier.js +54 -0
  26. package/dist/chat/house.d.ts +25 -0
  27. package/dist/chat/house.d.ts.map +1 -0
  28. package/dist/chat/house.js +38 -0
  29. package/dist/chat/input.d.ts +3 -1
  30. package/dist/chat/input.d.ts.map +1 -1
  31. package/dist/chat/input.js +11 -18
  32. package/dist/chat/kit.d.ts +2 -1
  33. package/dist/chat/kit.d.ts.map +1 -1
  34. package/dist/chat/kit.js +3 -3
  35. package/dist/chat/list.d.ts +3 -1
  36. package/dist/chat/list.d.ts.map +1 -1
  37. package/dist/chat/list.js +47 -6
  38. package/dist/chat/markdown.d.ts +2 -2
  39. package/dist/chat/markdown.d.ts.map +1 -1
  40. package/dist/chat/markdown.js +83 -40
  41. package/dist/chat/message.d.ts +1 -0
  42. package/dist/chat/message.d.ts.map +1 -1
  43. package/dist/chat/message.js +73 -11
  44. package/dist/chat/messages.d.ts +15 -1
  45. package/dist/chat/messages.d.ts.map +1 -1
  46. package/dist/chat/messages.js +82 -23
  47. package/dist/chat/name.d.ts +1 -0
  48. package/dist/chat/name.d.ts.map +1 -1
  49. package/dist/chat/name.js +1 -1
  50. package/dist/chat/opened.d.ts +1 -0
  51. package/dist/chat/opened.d.ts.map +1 -1
  52. package/dist/chat/opened.js +2 -0
  53. package/dist/chat/overlay.d.ts +1 -0
  54. package/dist/chat/overlay.d.ts.map +1 -1
  55. package/dist/chat/overlay.js +11 -5
  56. package/dist/chat/parts.d.ts +1 -0
  57. package/dist/chat/parts.d.ts.map +1 -1
  58. package/dist/chat/parts.js +3 -2
  59. package/dist/chat/pieces.d.ts +62 -0
  60. package/dist/chat/pieces.d.ts.map +1 -0
  61. package/dist/chat/pieces.js +1110 -0
  62. package/dist/chat/provider.d.ts +9 -2
  63. package/dist/chat/provider.d.ts.map +1 -1
  64. package/dist/chat/provider.js +121 -106
  65. package/dist/chat/question.d.ts +1 -1
  66. package/dist/chat/question.d.ts.map +1 -1
  67. package/dist/chat/question.js +7 -18
  68. package/dist/chat/ready.d.ts +5 -1
  69. package/dist/chat/ready.d.ts.map +1 -1
  70. package/dist/chat/ready.js +7 -5
  71. package/dist/chat/room-file.d.ts +8 -0
  72. package/dist/chat/room-file.d.ts.map +1 -0
  73. package/dist/chat/room-file.js +72 -0
  74. package/dist/chat/steady.d.ts +3 -0
  75. package/dist/chat/steady.d.ts.map +1 -0
  76. package/dist/chat/steady.js +26 -0
  77. package/dist/chat/style.d.ts.map +1 -1
  78. package/dist/chat/style.js +6 -1
  79. package/dist/chat.d.ts +3 -2
  80. package/dist/chat.d.ts.map +1 -1
  81. package/dist/chat.js +2 -2
  82. package/dist/client.d.ts +15 -6
  83. package/dist/client.d.ts.map +1 -1
  84. package/dist/client.js +47 -8
  85. package/dist/collection.d.ts +6 -19
  86. package/dist/collection.d.ts.map +1 -1
  87. package/dist/collection.js +30 -287
  88. package/dist/compile.d.ts +16 -0
  89. package/dist/compile.d.ts.map +1 -0
  90. package/dist/compile.js +721 -0
  91. package/dist/connection.d.ts +25 -12
  92. package/dist/connection.d.ts.map +1 -1
  93. package/dist/connection.js +2615 -946
  94. package/dist/conversation.d.ts +18 -3
  95. package/dist/conversation.d.ts.map +1 -1
  96. package/dist/conversation.js +341 -107
  97. package/dist/digest.d.ts +7 -0
  98. package/dist/digest.d.ts.map +1 -0
  99. package/dist/digest.js +113 -0
  100. package/dist/durability.d.ts +3 -5
  101. package/dist/durability.d.ts.map +1 -1
  102. package/dist/durability.js +5 -0
  103. package/dist/entry.d.ts +3 -1
  104. package/dist/entry.d.ts.map +1 -1
  105. package/dist/entry.js +18 -23
  106. package/dist/file.d.ts +2 -10
  107. package/dist/file.d.ts.map +1 -1
  108. package/dist/file.js +3 -120
  109. package/dist/fulltext.d.ts +27 -0
  110. package/dist/fulltext.d.ts.map +1 -0
  111. package/dist/fulltext.js +368 -0
  112. package/dist/host.d.ts +10 -8
  113. package/dist/host.d.ts.map +1 -1
  114. package/dist/host.js +95 -18
  115. package/dist/identity.d.ts +0 -1
  116. package/dist/identity.d.ts.map +1 -1
  117. package/dist/identity.js +0 -3
  118. package/dist/index.d.ts +15 -11
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +5 -1
  121. package/dist/live.d.ts +22 -0
  122. package/dist/live.d.ts.map +1 -0
  123. package/dist/live.js +123 -0
  124. package/dist/memory.d.ts +8 -3
  125. package/dist/memory.d.ts.map +1 -1
  126. package/dist/memory.js +43 -25
  127. package/dist/messages.d.ts +28 -0
  128. package/dist/messages.d.ts.map +1 -0
  129. package/dist/messages.js +90 -0
  130. package/dist/model.d.ts +3 -2
  131. package/dist/model.d.ts.map +1 -1
  132. package/dist/model.js +1 -1
  133. package/dist/name.d.ts +4 -0
  134. package/dist/name.d.ts.map +1 -0
  135. package/dist/name.js +122 -0
  136. package/dist/observation.d.ts +14 -0
  137. package/dist/observation.d.ts.map +1 -1
  138. package/dist/observation.js +93 -3
  139. package/dist/opened.d.ts +22 -0
  140. package/dist/opened.d.ts.map +1 -0
  141. package/dist/opened.js +107 -0
  142. package/dist/outcome.d.ts +34 -4
  143. package/dist/outcome.d.ts.map +1 -1
  144. package/dist/outcome.js +25 -0
  145. package/dist/overlay.d.ts +3 -5
  146. package/dist/overlay.d.ts.map +1 -1
  147. package/dist/overlay.js +95 -156
  148. package/dist/query.d.ts +33 -2
  149. package/dist/query.d.ts.map +1 -1
  150. package/dist/query.js +48 -7
  151. package/dist/reach.d.ts +6 -5
  152. package/dist/reach.d.ts.map +1 -1
  153. package/dist/reach.js +170 -62
  154. package/dist/react.d.ts +3 -3
  155. package/dist/react.d.ts.map +1 -1
  156. package/dist/react.js +7 -17
  157. package/dist/readiness.d.ts +20 -9
  158. package/dist/readiness.d.ts.map +1 -1
  159. package/dist/readiness.js +6 -6
  160. package/dist/reads.d.ts +11 -0
  161. package/dist/reads.d.ts.map +1 -0
  162. package/dist/reads.js +100 -0
  163. package/dist/recovery.d.ts +2 -2
  164. package/dist/recovery.d.ts.map +1 -1
  165. package/dist/recovery.js +8 -7
  166. package/dist/refresh.d.ts +16 -15
  167. package/dist/refresh.d.ts.map +1 -1
  168. package/dist/refresh.js +112 -45
  169. package/dist/replica.d.ts +57 -33
  170. package/dist/replica.d.ts.map +1 -1
  171. package/dist/replica.js +295 -177
  172. package/dist/room-draft.d.ts +17 -2
  173. package/dist/room-draft.d.ts.map +1 -1
  174. package/dist/room-draft.js +65 -25
  175. package/dist/rows.d.ts +29 -29
  176. package/dist/rows.d.ts.map +1 -1
  177. package/dist/rows.js +113 -62
  178. package/dist/save.d.ts +51 -14
  179. package/dist/save.d.ts.map +1 -1
  180. package/dist/save.js +518 -180
  181. package/dist/search.d.ts +32 -43
  182. package/dist/search.d.ts.map +1 -1
  183. package/dist/search.js +37 -168
  184. package/dist/seed.d.ts +16 -0
  185. package/dist/seed.d.ts.map +1 -0
  186. package/dist/seed.js +75 -0
  187. package/dist/shared.d.ts +8 -3
  188. package/dist/shared.d.ts.map +1 -1
  189. package/dist/shared.js +129 -66
  190. package/dist/store.d.ts +99 -88
  191. package/dist/store.d.ts.map +1 -1
  192. package/dist/store.js +335 -641
  193. package/dist/stored.d.ts +145 -0
  194. package/dist/stored.d.ts.map +1 -0
  195. package/dist/stored.js +567 -0
  196. package/dist/tables.d.ts +354 -0
  197. package/dist/tables.d.ts.map +1 -0
  198. package/dist/tables.js +624 -0
  199. package/dist/turn.d.ts +5 -3
  200. package/dist/turn.d.ts.map +1 -1
  201. package/dist/turn.js +51 -21
  202. package/dist/validation.d.ts +30 -0
  203. package/dist/validation.d.ts.map +1 -0
  204. package/dist/validation.js +162 -0
  205. package/dist/windows.d.ts +22 -0
  206. package/dist/windows.d.ts.map +1 -0
  207. package/dist/windows.js +89 -0
  208. package/dist/wire.d.ts +163 -33
  209. package/dist/wire.d.ts.map +1 -1
  210. package/dist/wire.js +54 -32
  211. package/dist/words.d.ts +19 -0
  212. package/dist/words.d.ts.map +1 -0
  213. package/dist/words.js +150 -0
  214. package/package.json +11 -5
  215. package/dist/acquisition.d.ts +0 -14
  216. package/dist/acquisition.d.ts.map +0 -1
  217. package/dist/acquisition.js +0 -24
  218. package/dist/read-side.d.ts +0 -25
  219. package/dist/read-side.d.ts.map +0 -1
  220. package/dist/read-side.js +0 -639
package/dist/bootstrap.js CHANGED
@@ -1,96 +1,165 @@
1
1
  import { transferIdentity } from './identity.js';
2
- import { advancement } from './refresh.js';
3
- import { acceptedBinaries } from './overlay.js';
4
- import { readStaged } from './replica.js';
2
+ import { advancement, pageEntries } from './refresh.js';
5
3
  import { unconfirmed } from './transfer.js';
4
+ 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
- binaries: acceptedBinaries(page.binaryFiles),
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) };
26
- }
27
- await staging.abandon(room.locator);
28
- return null;
29
- }
30
- function pooled(pool, layer) {
17
+ function heldTogether(first, second) {
18
+ if (first === null)
19
+ return second;
31
20
  return {
32
- documents: { ...pool?.documents, ...layer.documents },
33
- revisions: { ...pool?.revisions, ...layer.revisions },
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
+ },
34
35
  };
35
36
  }
37
+ const NO_CONTENT = {
38
+ files: () => Promise.resolve([]),
39
+ contents: () => Promise.resolve(new Map()),
40
+ };
36
41
  export async function bootstrapRoom(adapter, authorization, room, held, remodel, continuing, staging, reuse) {
37
- const first = await bundle(adapter, authorization, room, held, remodel, continuing, staging, await heldTransfer(staging, room), 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, remodel, continuing, staging, resumed, reuse);
38
47
  if (first.kind !== 'expired')
39
48
  return first;
40
- await staging.abandon(room.locator);
41
- const replacement = await bundle(adapter, authorization, room, held, remodel, continuing, staging, null, pooled(reuse, first.held));
42
- if (replacement.kind !== 'expired')
43
- return replacement;
44
- await staging.abandon(room.locator);
45
- return unconfirmed;
49
+ await staging.setAside(room.locator);
50
+ try {
51
+ const replacement = await bundle(adapter, authorization, room, held, 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);
60
+ }
61
+ }
62
+ const RESUMED_LOOKUPS = 2;
63
+ function compositionFor(room, models) {
64
+ return {
65
+ model: models.collection,
66
+ selection: room.typedSelection === undefined
67
+ ? null
68
+ : { roots: room.typedSelection.roots, model: models.selection },
69
+ };
46
70
  }
47
71
  async function bundle(adapter, authorization, room, held, remodel, continuing, staging, kept, pool) {
48
72
  const locator = room.locator;
49
73
  const selection = room.replica.selection;
50
- const documents = { ...kept?.layer.documents };
51
- const revisions = { ...kept?.layer.revisions };
52
- const changes = { ...kept?.layer.changes };
53
- const written = { ...kept?.layer.written };
54
- const binaries = { ...kept?.layer.binaries };
55
- let transfer = kept?.record ?? null;
56
- while (transfer === null || transfer.pageToken !== null) {
57
- if (!continuing())
58
- return unconfirmed;
74
+ let transfer = kept;
75
+ let lookups = kept === null ? 0 : RESUMED_LOOKUPS;
76
+ let ahead = null;
77
+ const arriving = staging.arriving(locator);
78
+ const asking = async (token) => {
79
+ const looked = token !== null && lookups > 0;
80
+ if (looked)
81
+ lookups -= 1;
82
+ const received = looked ? await staging.received(locator, token) : null;
59
83
  const page = await adapter.bootstrap(authorization, {
60
84
  locator,
61
85
  selection,
62
- ...(transfer?.pageToken == null ? {} : { pageToken: transfer.pageToken }),
86
+ ...(token === null
87
+ ? {}
88
+ : { pageToken: token, arriving: (bytes) => arriving.at(token, bytes) }),
63
89
  ...(pool === null ? {} : { held: pool }),
90
+ ...(received === null ? {} : { received }),
64
91
  });
65
- if (page.kind === 'beyond-horizon')
66
- return { kind: 'expired', held: { documents, revisions } };
67
- if (page.kind !== 'bootstrap') {
68
- if (!RESUMABLE.has(page.kind))
69
- await staging.abandon(locator);
70
- return page;
92
+ if (token !== null && page.kind === 'bootstrap' && page.received !== undefined) {
93
+ await staging.keep(locator, token, page.received);
71
94
  }
72
- transfer = {
73
- locator,
74
- transfer: transfer?.transfer ?? transferIdentity(),
75
- selection,
76
- from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
77
- ? transfer.from
78
- : page.roomVersion,
79
- last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
80
- ? transfer.last
81
- : page.roomVersion,
82
- pageToken: page.pageToken ?? null,
83
- models: remodel(page.models, transfer?.models ?? held),
84
- };
85
- const staged = pageLayer(page);
86
- if (!(await staging.stage(transfer, staged)))
87
- return unconfirmed;
88
- Object.assign(documents, staged.documents);
89
- Object.assign(revisions, staged.revisions);
90
- Object.assign(changes, staged.changes);
91
- Object.assign(written, staged.written);
92
- Object.assign(binaries, staged.binaries);
95
+ return page;
96
+ };
97
+ try {
98
+ while (transfer === null || transfer.writing !== null || transfer.pageToken !== null) {
99
+ if (!continuing())
100
+ return unconfirmed;
101
+ const writing = transfer?.writing ?? null;
102
+ const asked = writing === null ? (transfer?.pageToken ?? null) : writing.token;
103
+ const fetched = ahead !== null && ahead.token === asked ? ahead : null;
104
+ if (ahead !== fetched)
105
+ ahead?.release();
106
+ ahead = null;
107
+ const turned = fetched?.release ??
108
+ (await staging.turn(locator, transfer === null ? 'listing' : 'downloading'));
109
+ try {
110
+ if (!continuing())
111
+ return unconfirmed;
112
+ const page = await (fetched?.page ?? asking(asked));
113
+ if (page.kind === 'beyond-horizon') {
114
+ const key = transfer?.key ?? null;
115
+ return { kind: 'expired', held: key === null ? NO_CONTENT : staging.content(key), key };
116
+ }
117
+ if (page.kind !== 'bootstrap') {
118
+ if (!RESUMABLE.has(page.kind))
119
+ await staging.abandon(locator);
120
+ return page;
121
+ }
122
+ const later = page.pageToken;
123
+ const spare = later === undefined || !continuing() ? null : staging.spare();
124
+ if (later !== undefined && spare !== null) {
125
+ const answer = asking(later);
126
+ answer.catch(() => { });
127
+ ahead = { token: later, page: answer, release: spare };
128
+ }
129
+ const next = {
130
+ locator,
131
+ transfer: transfer?.transfer ?? transferIdentity(),
132
+ selection,
133
+ from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
134
+ ? transfer.from
135
+ : page.roomVersion,
136
+ last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
137
+ ? transfer.last
138
+ : page.roomVersion,
139
+ pageToken: later ?? null,
140
+ writing: { token: asked, written: asked === null ? 0 : (writing?.written ?? 0) },
141
+ inventory: page.inventory ?? transfer?.inventory ?? null,
142
+ done: transfer?.done ?? NOTHING_DONE,
143
+ models: remodel(page.models, transfer?.models ?? held),
144
+ key: transfer?.key ?? null,
145
+ };
146
+ const staged = await staging.stage(next, await pageOf(page), compositionFor(room, next.models), page.received ?? null);
147
+ if (staged === null)
148
+ return unconfirmed;
149
+ transfer = staged;
150
+ }
151
+ finally {
152
+ turned();
153
+ }
154
+ }
155
+ }
156
+ finally {
157
+ ahead?.release();
158
+ arriving.end();
93
159
  }
160
+ await staging.turn(locator, 'replaying');
161
+ if (!continuing())
162
+ return unconfirmed;
94
163
  const record = {
95
164
  locator,
96
165
  name: room.name,
@@ -103,25 +172,26 @@ async function bundle(adapter, authorization, room, held, remodel, continuing, s
103
172
  providerOwnedPaths: room.providerOwnedPaths,
104
173
  roomVersion: transfer.from,
105
174
  transfer: transfer.transfer,
106
- documents,
107
- binaries,
108
- revisions,
109
- changes,
110
- written,
175
+ inventory: transfer.inventory,
176
+ key: transfer.key,
111
177
  };
112
- const reconciled = transfer.last === transfer.from
178
+ const due = [room.roomVersion, ...staging.announced(locator)];
179
+ const last = transfer.last;
180
+ const reconciled = last === transfer.from && due.every((version) => adapter.reached(locator, last, version))
113
181
  ? { kind: 'still-current' }
114
- : await advancement(adapter, authorization, record, remodel, continuing);
182
+ : await advancement(adapter, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key));
115
183
  if (reconciled.kind === 'advanced' || reconciled.kind === 'still-current') {
116
- const read = readStaged(reconciled.kind === 'advanced' ? reconciled.record : record);
117
- if (read.kind === 'refused') {
184
+ const refreshed = reconciled.kind === 'advanced';
185
+ const result = refreshed ? reconciled.record : record;
186
+ const refused = await staging.validate(result, refreshed ? 'refreshed' : 'confirmed');
187
+ if (refused !== null) {
118
188
  await staging.abandon(locator);
119
- return read;
189
+ return refused;
120
190
  }
121
- return { kind: 'staged', confirmed: read.confirmed, stored: record };
191
+ return { kind: 'staged', record: result, refreshed };
122
192
  }
123
193
  if (reconciled.kind === 'beyond-horizon') {
124
- return { kind: 'expired', held: { documents, revisions } };
194
+ return { kind: 'expired', held: staging.content(record.key), key: record.key };
125
195
  }
126
196
  if (!RESUMABLE.has(reconciled.kind))
127
197
  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,15 +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;
12
- text: string | null;
2
+ readonly locator: string;
3
+ readonly path: string | null;
13
4
  };
14
5
  export type ChangeSet = {
15
6
  documents: readonly DocumentChange[];
@@ -20,16 +11,18 @@ export type ChangeSet = {
20
11
  rooms: readonly string[];
21
12
  queues: readonly string[];
22
13
  presentations: readonly string[];
23
- messages: readonly MessageChange[];
24
14
  conversations: readonly string[];
25
15
  };
26
- export declare function changeSet(locator: string, before: Replica | null, after: Replica | null, changed?: {
16
+ type Changed = {
17
+ documents?: readonly string[] | null;
27
18
  drafts?: readonly string[];
28
19
  room?: boolean;
29
20
  queue?: boolean;
30
21
  presentation?: string;
31
- }): ChangeSet;
32
- export declare function entering(locator: string, replica: Replica, paths: readonly string[]): ChangeSet;
33
- 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;
34
25
  export declare function mergeChangeSets(sets: readonly ChangeSet[]): ChangeSet;
26
+ export declare function touches(set: ChangeSet, locator: string, path: string): boolean;
27
+ export {};
35
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":"AAIA,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,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE5F,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;AAuBF,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,CA8DX;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAiB/F;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,104 +1,25 @@
1
- import { passingFrontmatter } from './collection.js';
2
- import { binaryRecord } from './binary.js';
3
- import { changedPaths, sameBinary, sameChange } from './overlay.js';
4
- import { beneath } from './paths.js';
5
- import { compositionOf, sameMembership } from './replica.js';
6
- import { markdownPath, rowsOf } from './rows.js';
7
- function rowsAt(locator, replica, path) {
8
- if (replica === null)
9
- return [];
10
- const visible = replica.visible;
11
- const document = markdownPath(path) ? passingFrontmatter(visible.collection, path) : null;
12
- const held = visible.documents[path] !== undefined && document !== undefined;
13
- const binary = visible.binaries[path];
14
- if (!held && binary === undefined)
15
- return [];
16
- return rowsOf(locator, path, document ?? null, compositionOf(replica.confirmed.record), visible.changes[path] ?? null, binary === undefined ? null : binaryRecord(path, binary, visible.revisions[path]));
17
- }
18
- function modelShape(model) {
19
- return model.status === 'unavailable' ? 'unavailable' : JSON.stringify(model.types);
20
- }
21
- export function changeSet(locator, before, after, changed = {}) {
22
- const documents = [];
23
- const oldRoom = before?.confirmed.record;
24
- const newRoom = after?.confirmed.record;
25
- const collectionChanged = oldRoom !== undefined &&
26
- newRoom !== undefined &&
27
- modelShape(oldRoom.model) !== modelShape(newRoom.model);
28
- const selectionChanged = oldRoom !== undefined &&
29
- newRoom !== undefined &&
30
- modelShape(oldRoom.selectionModel) !== modelShape(newRoom.selectionModel);
31
- const reclassified = oldRoom !== undefined && newRoom !== undefined && !sameMembership(oldRoom, newRoom);
32
- const paths = before === null || after === null || collectionChanged || selectionChanged || reclassified
33
- ? new Set([
34
- ...Object.keys(before?.visible.documents ?? {}),
35
- ...Object.keys(after?.visible.documents ?? {}),
36
- ...Object.keys(before?.visible.binaries ?? {}),
37
- ...Object.keys(after?.visible.binaries ?? {}),
38
- ])
39
- : changedPaths(before.visible, after.visible);
40
- for (const path of paths) {
41
- if (after?.visible.documents[path] === undefined &&
42
- after?.visible.binaries[path] === undefined &&
43
- before?.visible.documents[path] === undefined &&
44
- before?.visible.binaries[path] === undefined)
45
- continue;
46
- const selected = newRoom?.typedSelection?.roots.some((root) => beneath(root, path)) ?? false;
47
- const retyped = selected ? selectionChanged : collectionChanged;
48
- if (before?.visible.documents[path] === after?.visible.documents[path] &&
49
- sameBinary(before?.visible.binaries[path], after?.visible.binaries[path]) &&
50
- before?.visible.revisions[path] === after?.visible.revisions[path] &&
51
- sameChange(before?.visible.changes[path], after?.visible.changes[path]) &&
52
- !retyped &&
53
- !reclassified)
54
- continue;
55
- documents.push({
56
- locator,
57
- path,
58
- get before() {
59
- return rowsAt(locator, before, path);
60
- },
61
- get after() {
62
- return rowsAt(locator, after, path);
63
- },
64
- });
65
- }
1
+ export function changeSet(locator, changed = {}) {
2
+ const documents = changed.documents;
66
3
  return {
67
- documents,
4
+ documents: documents === undefined
5
+ ? []
6
+ : documents === null
7
+ ? [{ locator, path: null }]
8
+ : documents.map((path) => ({ locator, path })),
68
9
  drafts: (changed.drafts ?? []).map((path) => ({ locator, path })),
69
10
  rooms: changed.room ? [locator] : [],
70
11
  queues: changed.queue ? [locator] : [],
71
12
  presentations: changed.presentation === undefined ? [] : [changed.presentation],
72
- messages: [],
73
13
  conversations: [],
74
14
  };
75
15
  }
76
- export function entering(locator, replica, paths) {
77
- return {
78
- documents: paths.map((path) => ({
79
- locator,
80
- path,
81
- before: [],
82
- get after() {
83
- return rowsAt(locator, replica, path);
84
- },
85
- })),
86
- drafts: [],
87
- rooms: [],
88
- queues: [],
89
- presentations: [],
90
- messages: [],
91
- conversations: [],
92
- };
93
- }
94
- export function conversationChangeSet(messages, conversations) {
16
+ export function conversationChangeSet(conversations) {
95
17
  return {
96
18
  documents: [],
97
19
  drafts: [],
98
20
  rooms: [],
99
21
  queues: [],
100
22
  presentations: [],
101
- messages,
102
23
  conversations: [...new Set(conversations)],
103
24
  };
104
25
  }
@@ -109,7 +30,9 @@ export function mergeChangeSets(sets) {
109
30
  rooms: [...new Set(sets.flatMap((set) => set.rooms))],
110
31
  queues: [...new Set(sets.flatMap((set) => set.queues))],
111
32
  presentations: [...new Set(sets.flatMap((set) => set.presentations))],
112
- messages: sets.flatMap((set) => set.messages),
113
33
  conversations: [...new Set(sets.flatMap((set) => set.conversations))],
114
34
  };
115
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;
@@ -29,7 +30,6 @@ export type Change = {
29
30
  readonly kind: 'binary';
30
31
  readonly path: string;
31
32
  readonly localId: string;
32
- readonly blob: Blob;
33
33
  readonly byteLength: number;
34
34
  readonly mediaType: string;
35
35
  readonly sha256: string;
@@ -40,6 +40,32 @@ export type Change = {
40
40
  } | {
41
41
  readonly kind: 'remove';
42
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
+ }[];
43
69
  };
44
70
  export type Precondition = {
45
71
  readonly kind: 'field';
@@ -81,9 +107,13 @@ export type ChangeBatch = {
81
107
  readonly changes: readonly Change[];
82
108
  readonly preconditions: readonly Precondition[];
83
109
  readonly writtenBy?: WrittenBy;
110
+ readonly between?: RoomMove;
84
111
  };
85
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;
86
115
  export declare function landing(changes: readonly Change[], index: number, path: string): string | null;
87
116
  export declare function departure(changes: readonly Change[], index: number): string;
88
117
  export declare function queuedFile(batch: ChangeBatch, path: string, localId: string): number;
118
+ export {};
89
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
@@ -1,7 +1,7 @@
1
1
  function frozen(value) {
2
2
  if (Array.isArray(value))
3
3
  return Object.freeze(value.map((item) => frozen(item)));
4
- if (value === null || typeof value !== 'object' || value instanceof Blob)
4
+ if (value === null || typeof value !== 'object')
5
5
  return value;
6
6
  const copy = {};
7
7
  for (const [name, item] of Object.entries(value))
@@ -11,6 +11,15 @@ 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
+ }
14
23
  export function landing(changes, index, path) {
15
24
  let at = path;
16
25
  for (const change of changes.slice(index + 1)) {
@@ -0,0 +1,10 @@
1
+ import type { MdRuntimeClient } from '../client.js';
2
+ import type { ConversationView } from '../conversation.js';
3
+ export declare const CHAT_WINDOW = 50;
4
+ export type Paged = {
5
+ readonly view: ConversationView | null;
6
+ readonly hasEarlier: boolean;
7
+ loadEarlier(): Promise<void>;
8
+ };
9
+ export declare function useEarlier(client: MdRuntimeClient, thread: string | null, held: ConversationView | null): Paged;
10
+ //# sourceMappingURL=earlier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"earlier.d.ts","sourceRoot":"","sources":["../../src/chat/earlier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,eAAO,MAAM,WAAW,KAAK,CAAC;AAU9B,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAuBF,wBAAgB,UAAU,CACxB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAC5B,KAAK,CA8BP"}