@agentshouse/mdruntime 0.1.0-c969b8dee6cc8 → 0.1.0-c96e80d38e5f0

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 (231) hide show
  1. package/README.md +19 -16
  2. package/dist/adapter.d.ts +134 -76
  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 +38 -4
  7. package/dist/binary.d.ts +0 -5
  8. package/dist/binary.d.ts.map +1 -1
  9. package/dist/binary.js +1 -1
  10. package/dist/bootstrap.d.ts +25 -10
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +180 -103
  13. package/dist/chain.d.ts +11 -0
  14. package/dist/chain.d.ts.map +1 -0
  15. package/dist/chain.js +64 -0
  16. package/dist/change-set.d.ts +9 -16
  17. package/dist/change-set.d.ts.map +1 -1
  18. package/dist/change-set.js +11 -89
  19. package/dist/change.d.ts +31 -1
  20. package/dist/change.d.ts.map +1 -1
  21. package/dist/change.js +10 -1
  22. package/dist/client.d.ts +13 -9
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +80 -7
  25. package/dist/collection.d.ts +10 -21
  26. package/dist/collection.d.ts.map +1 -1
  27. package/dist/collection.js +39 -291
  28. package/dist/compile.d.ts +16 -0
  29. package/dist/compile.d.ts.map +1 -0
  30. package/dist/compile.js +789 -0
  31. package/dist/connection.d.ts +19 -15
  32. package/dist/connection.d.ts.map +1 -1
  33. package/dist/connection.js +3020 -1417
  34. package/dist/conversation.d.ts +23 -14
  35. package/dist/conversation.d.ts.map +1 -1
  36. package/dist/conversation.js +337 -179
  37. package/dist/digest.d.ts +7 -0
  38. package/dist/digest.d.ts.map +1 -0
  39. package/dist/digest.js +113 -0
  40. package/dist/durability.d.ts +2 -5
  41. package/dist/durability.d.ts.map +1 -1
  42. package/dist/durability.js +5 -0
  43. package/dist/entry.d.ts +4 -1
  44. package/dist/entry.d.ts.map +1 -1
  45. package/dist/entry.js +19 -23
  46. package/dist/file.d.ts +2 -19
  47. package/dist/file.d.ts.map +1 -1
  48. package/dist/file.js +7 -122
  49. package/dist/host.d.ts +4 -10
  50. package/dist/host.d.ts.map +1 -1
  51. package/dist/host.js +49 -31
  52. package/dist/identity.d.ts +0 -1
  53. package/dist/identity.d.ts.map +1 -1
  54. package/dist/identity.js +0 -3
  55. package/dist/index.d.ts +14 -11
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +6 -2
  58. package/dist/live.d.ts +22 -0
  59. package/dist/live.d.ts.map +1 -0
  60. package/dist/live.js +123 -0
  61. package/dist/media.d.ts +8 -0
  62. package/dist/media.d.ts.map +1 -0
  63. package/dist/media.js +218 -0
  64. package/dist/memory.d.ts +11 -7
  65. package/dist/memory.d.ts.map +1 -1
  66. package/dist/memory.js +198 -107
  67. package/dist/messages.d.ts +28 -0
  68. package/dist/messages.d.ts.map +1 -0
  69. package/dist/messages.js +89 -0
  70. package/dist/model.d.ts +6 -1
  71. package/dist/model.d.ts.map +1 -1
  72. package/dist/model.js +7 -10
  73. package/dist/name.d.ts +4 -0
  74. package/dist/name.d.ts.map +1 -0
  75. package/dist/name.js +122 -0
  76. package/dist/observation.d.ts +13 -0
  77. package/dist/observation.d.ts.map +1 -1
  78. package/dist/observation.js +84 -0
  79. package/dist/opened.d.ts +22 -0
  80. package/dist/opened.d.ts.map +1 -0
  81. package/dist/opened.js +107 -0
  82. package/dist/outcome.d.ts +40 -8
  83. package/dist/outcome.d.ts.map +1 -1
  84. package/dist/outcome.js +38 -2
  85. package/dist/overlay.d.ts +2 -5
  86. package/dist/overlay.d.ts.map +1 -1
  87. package/dist/overlay.js +87 -172
  88. package/dist/paths.d.ts +1 -0
  89. package/dist/paths.d.ts.map +1 -1
  90. package/dist/paths.js +4 -0
  91. package/dist/phrase.d.ts +3 -0
  92. package/dist/phrase.d.ts.map +1 -0
  93. package/dist/phrase.js +8 -0
  94. package/dist/query.d.ts +15 -1
  95. package/dist/query.d.ts.map +1 -1
  96. package/dist/query.js +33 -2
  97. package/dist/reach.d.ts +13 -4
  98. package/dist/reach.d.ts.map +1 -1
  99. package/dist/reach.js +200 -81
  100. package/dist/react.d.ts +1 -0
  101. package/dist/react.d.ts.map +1 -1
  102. package/dist/readiness.d.ts +14 -17
  103. package/dist/readiness.d.ts.map +1 -1
  104. package/dist/readiness.js +2 -8
  105. package/dist/recovery.d.ts +3 -2
  106. package/dist/recovery.d.ts.map +1 -1
  107. package/dist/recovery.js +34 -7
  108. package/dist/refresh.d.ts +18 -15
  109. package/dist/refresh.d.ts.map +1 -1
  110. package/dist/refresh.js +155 -58
  111. package/dist/replica.d.ts +54 -36
  112. package/dist/replica.d.ts.map +1 -1
  113. package/dist/replica.js +282 -189
  114. package/dist/room-draft.d.ts +22 -4
  115. package/dist/room-draft.d.ts.map +1 -1
  116. package/dist/room-draft.js +154 -67
  117. package/dist/rows.d.ts +39 -31
  118. package/dist/rows.d.ts.map +1 -1
  119. package/dist/rows.js +178 -101
  120. package/dist/save.d.ts +52 -14
  121. package/dist/save.d.ts.map +1 -1
  122. package/dist/save.js +513 -185
  123. package/dist/search.d.ts +12 -95
  124. package/dist/search.d.ts.map +1 -1
  125. package/dist/search.js +10 -266
  126. package/dist/shared.d.ts +7 -3
  127. package/dist/shared.d.ts.map +1 -1
  128. package/dist/shared.js +119 -66
  129. package/dist/status.d.ts +4 -3
  130. package/dist/status.d.ts.map +1 -1
  131. package/dist/status.js +3 -1
  132. package/dist/store.d.ts +91 -103
  133. package/dist/store.d.ts.map +1 -1
  134. package/dist/store.js +330 -693
  135. package/dist/stored.d.ts +162 -0
  136. package/dist/stored.d.ts.map +1 -0
  137. package/dist/stored.js +549 -0
  138. package/dist/tables.d.ts +353 -0
  139. package/dist/tables.d.ts.map +1 -0
  140. package/dist/tables.js +585 -0
  141. package/dist/transfer.d.ts +0 -5
  142. package/dist/transfer.d.ts.map +1 -1
  143. package/dist/turn.d.ts +5 -3
  144. package/dist/turn.d.ts.map +1 -1
  145. package/dist/turn.js +51 -21
  146. package/dist/validation.d.ts +29 -0
  147. package/dist/validation.d.ts.map +1 -0
  148. package/dist/validation.js +101 -0
  149. package/dist/windows.d.ts +2 -6
  150. package/dist/windows.d.ts.map +1 -1
  151. package/dist/windows.js +30 -34
  152. package/dist/wire.d.ts +18 -5
  153. package/dist/wire.d.ts.map +1 -1
  154. package/dist/wire.js +6 -2
  155. package/package.json +18 -19
  156. package/AGENTS.md +0 -305
  157. package/dist/acquisition.d.ts +0 -14
  158. package/dist/acquisition.d.ts.map +0 -1
  159. package/dist/acquisition.js +0 -24
  160. package/dist/chat/acts.d.ts +0 -33
  161. package/dist/chat/acts.d.ts.map +0 -1
  162. package/dist/chat/acts.js +0 -36
  163. package/dist/chat/context.d.ts +0 -3
  164. package/dist/chat/context.d.ts.map +0 -1
  165. package/dist/chat/context.js +0 -10
  166. package/dist/chat/earlier.d.ts +0 -10
  167. package/dist/chat/earlier.d.ts.map +0 -1
  168. package/dist/chat/earlier.js +0 -54
  169. package/dist/chat/input.d.ts +0 -9
  170. package/dist/chat/input.d.ts.map +0 -1
  171. package/dist/chat/input.js +0 -99
  172. package/dist/chat/kit.d.ts +0 -61
  173. package/dist/chat/kit.d.ts.map +0 -1
  174. package/dist/chat/kit.js +0 -123
  175. package/dist/chat/lasting.d.ts +0 -6
  176. package/dist/chat/lasting.d.ts.map +0 -1
  177. package/dist/chat/lasting.js +0 -19
  178. package/dist/chat/list.d.ts +0 -27
  179. package/dist/chat/list.d.ts.map +0 -1
  180. package/dist/chat/list.js +0 -99
  181. package/dist/chat/markdown.d.ts +0 -20
  182. package/dist/chat/markdown.d.ts.map +0 -1
  183. package/dist/chat/markdown.js +0 -188
  184. package/dist/chat/message.d.ts +0 -6
  185. package/dist/chat/message.d.ts.map +0 -1
  186. package/dist/chat/message.js +0 -192
  187. package/dist/chat/messages.d.ts +0 -22
  188. package/dist/chat/messages.d.ts.map +0 -1
  189. package/dist/chat/messages.js +0 -155
  190. package/dist/chat/name.d.ts +0 -6
  191. package/dist/chat/name.d.ts.map +0 -1
  192. package/dist/chat/name.js +0 -37
  193. package/dist/chat/opened.d.ts +0 -11
  194. package/dist/chat/opened.d.ts.map +0 -1
  195. package/dist/chat/opened.js +0 -17
  196. package/dist/chat/overlay.d.ts +0 -31
  197. package/dist/chat/overlay.d.ts.map +0 -1
  198. package/dist/chat/overlay.js +0 -97
  199. package/dist/chat/parts.d.ts +0 -57
  200. package/dist/chat/parts.d.ts.map +0 -1
  201. package/dist/chat/parts.js +0 -119
  202. package/dist/chat/process.d.ts +0 -20
  203. package/dist/chat/process.d.ts.map +0 -1
  204. package/dist/chat/process.js +0 -32
  205. package/dist/chat/provider.d.ts +0 -63
  206. package/dist/chat/provider.d.ts.map +0 -1
  207. package/dist/chat/provider.js +0 -628
  208. package/dist/chat/question.d.ts +0 -9
  209. package/dist/chat/question.d.ts.map +0 -1
  210. package/dist/chat/question.js +0 -69
  211. package/dist/chat/questions.d.ts +0 -31
  212. package/dist/chat/questions.d.ts.map +0 -1
  213. package/dist/chat/questions.js +0 -111
  214. package/dist/chat/read.d.ts +0 -5
  215. package/dist/chat/read.d.ts.map +0 -1
  216. package/dist/chat/read.js +0 -13
  217. package/dist/chat/ready.d.ts +0 -34
  218. package/dist/chat/ready.d.ts.map +0 -1
  219. package/dist/chat/ready.js +0 -91
  220. package/dist/chat/style.d.ts +0 -4
  221. package/dist/chat/style.d.ts.map +0 -1
  222. package/dist/chat/style.js +0 -302
  223. package/dist/chat.d.ts +0 -14
  224. package/dist/chat.d.ts.map +0 -1
  225. package/dist/chat.js +0 -8
  226. package/dist/read-side.d.ts +0 -25
  227. package/dist/read-side.d.ts.map +0 -1
  228. package/dist/read-side.js +0 -767
  229. package/dist/reads.d.ts +0 -11
  230. package/dist/reads.d.ts.map +0 -1
  231. package/dist/reads.js +0 -98
package/dist/memory.js CHANGED
@@ -1,4 +1,8 @@
1
1
  import { sameChange } from './overlay.js';
2
+ const ATTACHMENTS = 'attachments';
3
+ function lastName(path) {
4
+ return path.slice(path.lastIndexOf('/') + 1);
5
+ }
2
6
  const FIXTURE_RETENTION = {
3
7
  history: { kind: 'duration', seconds: 1 },
4
8
  outcome: 604_800,
@@ -15,12 +19,7 @@ function declaredRetention(value) {
15
19
  }
16
20
  const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
17
21
  function modelsOf(room) {
18
- return {
19
- collection: room.model ?? MODEL_ABSENT,
20
- ...(room.typedSelection === undefined
21
- ? {}
22
- : { selection: room.selectionModel ?? MODEL_ABSENT }),
23
- };
22
+ return { collection: room.model ?? MODEL_ABSENT };
24
23
  }
25
24
  function changedModels(room, from) {
26
25
  const now = modelsOf(room);
@@ -53,14 +52,16 @@ export function createMemoryAdapter(options = {}) {
53
52
  const listeners = new Set();
54
53
  const modeObservers = new Set();
55
54
  const scripted = new Map();
56
- const unsealed = new Map();
57
- const sealed = new Set();
58
55
  const sentTurns = new Map();
59
56
  const historyPageSize = options.historyPageSize;
60
- let held = [];
61
- let heldDemand = null;
57
+ const attached = new Map();
58
+ const linked = new WeakMap();
59
+ const carried = new Map();
62
60
  let expiring = [];
61
+ let openings = 0;
62
+ const declaredRooms = new Set();
63
63
  let replicated = [];
64
+ let heldCursor = null;
64
65
  let issued = 0;
65
66
  function scriptConversations(entries) {
66
67
  scripted.clear();
@@ -88,6 +89,19 @@ export function createMemoryAdapter(options = {}) {
88
89
  const wanted = ordinals.get(`${locator}\u0000${target}`);
89
90
  return held !== undefined && wanted !== undefined && held >= wanted;
90
91
  }
92
+ function heldBlob(room, path) {
93
+ return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
94
+ }
95
+ function freePath(room, name) {
96
+ const dot = name.lastIndexOf('.');
97
+ const stem = dot > 0 ? name.slice(0, dot) : name;
98
+ const extension = dot > 0 ? name.slice(dot) : '';
99
+ for (let count = 1;; count += 1) {
100
+ const path = `${ATTACHMENTS}/${count === 1 ? stem : `${stem}-${count}`}${extension}`;
101
+ if (heldBlob(room, path) === undefined && room.documents?.[path] === undefined)
102
+ return path;
103
+ }
104
+ }
91
105
  function retain(entries) {
92
106
  for (const room of entries) {
93
107
  note(room.locator, room);
@@ -128,10 +142,21 @@ export function createMemoryAdapter(options = {}) {
128
142
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
129
143
  changes: named(room.changes ?? {}, [...taken, ...targets]),
130
144
  binaryFiles: named(room.binaryFiles ?? {}, targets),
145
+ ...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
131
146
  ...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
132
147
  };
133
148
  }
134
- function advancement(room, from, at) {
149
+ function foldersMoved(room, from) {
150
+ const now = new Set(room.folders ?? []);
151
+ const before = new Set(from.folders ?? []);
152
+ const folders = [...now].filter((folder) => !before.has(folder)).sort();
153
+ const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
154
+ return {
155
+ ...(folders.length === 0 ? {} : { folders }),
156
+ ...(folderRemovals.length === 0 ? {} : { folderRemovals }),
157
+ };
158
+ }
159
+ function advancement(room, from, at, whole = false) {
135
160
  const current = room.documents ?? {};
136
161
  const previous = from.documents ?? {};
137
162
  const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
@@ -142,7 +167,7 @@ export function createMemoryAdapter(options = {}) {
142
167
  const changed = Object.keys(current)
143
168
  .filter((path) => current[path] !== previous[path] || headMoved(path))
144
169
  .sort();
145
- const size = pageSize ?? changed.length;
170
+ const size = whole ? changed.length : (pageSize ?? changed.length);
146
171
  const taken = changed.slice(at, at + size);
147
172
  const next = at + taken.length;
148
173
  const opening = at === 0;
@@ -164,6 +189,7 @@ export function createMemoryAdapter(options = {}) {
164
189
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
165
190
  changes: named(room.changes ?? {}, [...taken, ...targets]),
166
191
  binaryFiles: named(room.binaryFiles ?? {}, targets),
192
+ ...(opening ? foldersMoved(room, from) : {}),
167
193
  removals: opening
168
194
  ? [
169
195
  ...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
@@ -173,6 +199,26 @@ export function createMemoryAdapter(options = {}) {
173
199
  ...(pageToken === undefined ? {} : { pageToken }),
174
200
  };
175
201
  }
202
+ function carry(locator) {
203
+ const at = carried.get(locator);
204
+ const current = rooms.find((entry) => entry.locator === locator);
205
+ if (at === undefined || current === undefined || current.roomVersion === at)
206
+ return;
207
+ const from = served.get(locator)?.get(at);
208
+ carried.set(locator, current.roomVersion);
209
+ if (from === undefined)
210
+ return;
211
+ const page = advancement(current, from, 0, true);
212
+ for (const observer of observers) {
213
+ observer({
214
+ kind: 'room-change',
215
+ locator,
216
+ from: at,
217
+ roomVersion: current.roomVersion,
218
+ read: async () => page,
219
+ });
220
+ }
221
+ }
176
222
  function pageOf(conversation, after) {
177
223
  const messages = conversation.messages ?? [];
178
224
  const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
@@ -187,16 +233,13 @@ export function createMemoryAdapter(options = {}) {
187
233
  : {}),
188
234
  };
189
235
  }
190
- function historiesOf(input) {
191
- const asked = input?.conversations;
192
- if (!Array.isArray(asked))
193
- return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
236
+ function historiesOf(request) {
194
237
  const histories = [];
195
- for (const entry of asked) {
196
- const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
238
+ for (const entry of request.conversations) {
239
+ const conversation = scripted.get(entry.conversation);
197
240
  if (conversation === undefined)
198
241
  continue;
199
- const outcome = conversation.outcomes?.['conversation.history'];
242
+ const outcome = conversation.outcomes?.history;
200
243
  if (outcome !== undefined)
201
244
  return outcome;
202
245
  histories.push(pageOf(conversation, entry.after));
@@ -207,15 +250,13 @@ export function createMemoryAdapter(options = {}) {
207
250
  function conversationAction(request) {
208
251
  const name = request.name;
209
252
  const input = (request.input ?? {});
210
- if (name === 'conversation.history')
211
- return historiesOf(request.input);
212
- if (name === 'conversation.create') {
253
+ if (name === 'conversations/create') {
213
254
  issued += 1;
214
255
  const conversation = `conversation-${issued}`;
215
256
  scripted.set(conversation, { conversation });
216
- return { kind: 'action', result: { conversation } };
257
+ return { kind: 'action', result: { conversation_id: conversation } };
217
258
  }
218
- const named = typeof input.conversation === 'string' ? input.conversation : '';
259
+ const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
219
260
  const conversation = scripted.get(named);
220
261
  if (conversation === undefined) {
221
262
  return {
@@ -228,34 +269,28 @@ export function createMemoryAdapter(options = {}) {
228
269
  const outcome = conversation.outcomes?.[name];
229
270
  if (outcome !== undefined)
230
271
  return outcome;
231
- if (name === 'conversation.send') {
272
+ if (name === 'conversations/send') {
232
273
  const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
233
274
  const answered = operation === null ? undefined : sentTurns.get(operation);
234
275
  if (answered !== undefined)
235
- return { kind: 'action', result: { turn: answered } };
276
+ return { kind: 'action', result: { message_id: answered } };
236
277
  issued += 1;
237
278
  const turn = `turn-${issued}`;
238
- unsealed.set(turn, named);
239
279
  if (operation !== null)
240
280
  sentTurns.set(operation, turn);
241
- return { kind: 'action', result: { turn } };
281
+ return { kind: 'action', result: { message_id: turn } };
242
282
  }
243
- if (name === 'conversation.cancel') {
244
- const turn = typeof input.turn === 'string' ? input.turn : '';
245
- if (sealed.has(turn) || !unsealed.has(turn)) {
246
- return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
247
- }
248
- unsealed.delete(turn);
249
- return { kind: 'action', result: { turn, cancelled: true } };
250
- }
251
- if (name === 'conversation.delete')
283
+ if (name === 'conversations/delete')
252
284
  scripted.delete(named);
253
- return { kind: 'action', result: { conversation: named } };
285
+ return { kind: 'action', result: { conversation_id: named } };
254
286
  }
255
287
  function announceList() {
256
- const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined ? [] : [{ conversation, ...listed }]);
257
- for (const listener of listeners)
258
- listener({ kind: 'list', entries });
288
+ const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
289
+ ? []
290
+ : [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
291
+ for (const listener of listeners) {
292
+ listener({ kind: 'list', entries, whole: true, more: false, cursor: null });
293
+ }
259
294
  }
260
295
  function discovery() {
261
296
  return {
@@ -267,8 +302,41 @@ export function createMemoryAdapter(options = {}) {
267
302
  ...(options.member === undefined ? {} : { member: options.member }),
268
303
  };
269
304
  }
305
+ function discovered() {
306
+ return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
307
+ if (answer.kind === 'discovery')
308
+ for (const room of answer.rooms)
309
+ note(room.locator, room);
310
+ return answer;
311
+ });
312
+ }
313
+ function opened(notify) {
314
+ const opening = ++openings;
315
+ notify({ kind: 'opened' });
316
+ void discovered()
317
+ .catch(() => ({ kind: 'transport-uncertainty' }))
318
+ .then((answer) => {
319
+ if (opening !== openings)
320
+ return;
321
+ if (answer.kind !== 'discovery') {
322
+ openings += 1;
323
+ carried.clear();
324
+ const revoked = answer.kind === 'revoked-authorization';
325
+ notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
326
+ return;
327
+ }
328
+ declaredRooms.clear();
329
+ for (const room of answer.rooms)
330
+ declaredRooms.add(room.locator);
331
+ notify({ kind: 'discovered', discovery: answer });
332
+ });
333
+ }
334
+ function emitAll(event) {
335
+ for (const observer of observers)
336
+ observer(event);
337
+ }
270
338
  return {
271
- ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
339
+ ...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
272
340
  setRooms(next) {
273
341
  rooms = [...next];
274
342
  retain(rooms);
@@ -277,30 +345,37 @@ export function createMemoryAdapter(options = {}) {
277
345
  scriptConversations(next);
278
346
  },
279
347
  open() {
348
+ carried.clear();
280
349
  announceList();
281
- for (const observer of observers)
282
- observer({ kind: 'opened' });
350
+ opened(emitAll);
283
351
  },
284
- close({ revoked = false, lost = !revoked } = {}) {
285
- for (const observer of observers)
286
- observer({ kind: 'closed', revoked, lost });
352
+ close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
353
+ openings += 1;
354
+ carried.clear();
355
+ emitAll({ kind: 'closed', revoked, lost, authorityChanged });
287
356
  },
288
357
  expire(locators) {
289
358
  expiring = [...locators];
290
359
  },
291
- notifyRoomVersion({ locator, roomVersion }) {
292
- for (const observer of observers)
293
- observer({ kind: 'room-version', locator, roomVersion });
360
+ notifyRoomVersion({ locator }) {
361
+ carry(locator);
294
362
  },
295
- notifyAuthorityChanged() {
296
- for (const observer of observers)
297
- observer({ kind: 'authority-changed' });
363
+ notifyAuthorityChanged(locators) {
364
+ const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
365
+ const listed = rooms.filter((room) => named.has(room.locator));
366
+ const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
367
+ for (const room of listed)
368
+ declaredRooms.add(room.locator);
369
+ for (const locator of left)
370
+ declaredRooms.delete(locator);
371
+ emitAll({
372
+ kind: 'authority-changed',
373
+ rooms: listed.map(declared),
374
+ left,
375
+ ...(options.member === undefined ? {} : { member: options.member }),
376
+ });
298
377
  },
299
378
  notifyConversation(event) {
300
- if (event.kind === 'accepted-message') {
301
- sealed.add(event.message.turn);
302
- unsealed.delete(event.message.turn);
303
- }
304
379
  for (const listener of listeners)
305
380
  listener(event);
306
381
  },
@@ -309,24 +384,31 @@ export function createMemoryAdapter(options = {}) {
309
384
  observer(mode);
310
385
  },
311
386
  heldRooms() {
312
- return held;
313
- },
314
- heldDemand() {
315
- return heldDemand;
387
+ return [...carried.keys()].sort();
316
388
  },
317
389
  replicatedConversations() {
318
390
  return replicated;
319
391
  },
392
+ heldConversationCursor() {
393
+ return heldCursor;
394
+ },
320
395
  conversations: {
321
396
  replicate(next) {
322
397
  replicated = [...next];
323
398
  },
399
+ hold(cursor) {
400
+ heldCursor = cursor;
401
+ },
324
402
  observe(notify) {
325
403
  listeners.add(notify);
326
404
  return () => {
327
405
  listeners.delete(notify);
328
406
  };
329
407
  },
408
+ history: (request) => Promise.resolve(historiesOf(request)),
409
+ ...(options.agents === undefined
410
+ ? {}
411
+ : { agents: () => Promise.resolve(structuredClone(options.agents)) }),
330
412
  },
331
413
  serviceMode: {
332
414
  observe(notify) {
@@ -337,46 +419,46 @@ export function createMemoryAdapter(options = {}) {
337
419
  },
338
420
  },
339
421
  roomStream: {
340
- hold(asked, demand) {
341
- held = asked.map((room) => room.locator);
342
- heldDemand = demand;
343
- const expired = expiring.filter((locator) => held.includes(locator));
344
- expiring = [];
345
- const moved = asked.flatMap((room) => {
422
+ hold(asked) {
423
+ const named = asked.map((room) => room.locator);
424
+ const unknown = asked.flatMap((room) => {
346
425
  const current = rooms.find((entry) => entry.locator === room.locator);
347
426
  return current === undefined ||
348
- expired.includes(room.locator) ||
349
- current.roomVersion === room.roomVersion
427
+ current.roomVersion === room.roomVersion ||
428
+ served.get(room.locator)?.has(room.roomVersion) === true
350
429
  ? []
351
- : [{ locator: room.locator, roomVersion: current.roomVersion }];
352
- });
353
- queueMicrotask(() => {
354
- for (const observer of observers) {
355
- for (const room of moved)
356
- observer({ kind: 'room-version', ...room });
357
- observer({ kind: 'opening', expired });
358
- }
430
+ : [room.locator];
359
431
  });
360
- },
361
- reopen() {
432
+ const expired = [
433
+ ...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
434
+ ];
435
+ expiring = expiring.filter((locator) => !named.includes(locator));
362
436
  queueMicrotask(() => {
363
- for (const observer of observers) {
364
- observer({ kind: 'closed', revoked: false, lost: false });
437
+ for (const room of asked) {
438
+ if (expired.includes(room.locator))
439
+ carried.delete(room.locator);
440
+ else {
441
+ carried.set(room.locator, room.roomVersion);
442
+ carry(room.locator);
443
+ }
365
444
  }
445
+ emitAll({ kind: 'caught-up', expired });
366
446
  });
367
447
  },
368
- published() { },
369
448
  observe(notify) {
370
449
  observers.add(notify);
371
450
  queueMicrotask(() => {
372
451
  if (!observers.has(notify))
373
452
  return;
374
453
  if (options.unopened === true) {
375
- notify({ kind: 'closed', revoked: false, lost: true });
454
+ notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
376
455
  return;
377
456
  }
378
457
  announceList();
379
- notify({ kind: 'opened' });
458
+ opened((event) => {
459
+ if (observers.has(notify))
460
+ notify(event);
461
+ });
380
462
  });
381
463
  return () => {
382
464
  observers.delete(notify);
@@ -393,12 +475,7 @@ export function createMemoryAdapter(options = {}) {
393
475
  return resolveScript(scripts.authorize, () => ({}), undefined);
394
476
  },
395
477
  async discover(_authorization) {
396
- return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
397
- if (answer.kind === 'discovery')
398
- for (const room of answer.rooms)
399
- note(room.locator, room);
400
- return answer;
401
- });
478
+ return discovered();
402
479
  },
403
480
  reached,
404
481
  follows(locator, roomVersion, next) {
@@ -455,7 +532,13 @@ export function createMemoryAdapter(options = {}) {
455
532
  retryable: false,
456
533
  affected: {},
457
534
  };
458
- }, request).then((answer) => note(request.locator, answer));
535
+ }, request).then((answer) => {
536
+ const destination = request.changeBatch.between?.destination.room;
537
+ if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
538
+ note(destination, answer.destination);
539
+ }
540
+ return note(request.locator, answer);
541
+ });
459
542
  },
460
543
  async history(_authorization, request) {
461
544
  return resolveScript(scripts.history, () => {
@@ -471,34 +554,42 @@ export function createMemoryAdapter(options = {}) {
471
554
  },
472
555
  async binary(_authorization, request) {
473
556
  return resolveScript(scripts.binary, () => {
474
- if (request.kind === 'reference') {
475
- return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
476
- }
477
557
  const room = rooms.find((entry) => entry.locator === request.locator);
478
558
  if (room === undefined)
479
559
  return { kind: 'room-not-readable', locator: request.locator };
480
- const blob = room.blobs?.[request.path];
560
+ const blob = heldBlob(room, request.path);
481
561
  return blob === undefined
482
562
  ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
483
- : { kind: 'binary', blob };
563
+ : { kind: 'binary', body: blob.stream(), mediaType: blob.type };
484
564
  }, request);
485
565
  },
486
566
  async link(_authorization, request) {
487
- return resolveScript(scripts.link, () => ({ kind: 'rejected', code: 'unscripted-link', fields: {}, retryable: false }), request);
567
+ return resolveScript(scripts.link, () => {
568
+ const room = rooms.find((entry) => entry.locator === request.locator);
569
+ if (room === undefined)
570
+ return { kind: 'room-not-readable', locator: request.locator };
571
+ const blob = heldBlob(room, request.path);
572
+ if (blob === undefined) {
573
+ return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
574
+ }
575
+ const url = linked.get(blob) ?? URL.createObjectURL(blob);
576
+ linked.set(blob, url);
577
+ return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
578
+ }, request);
488
579
  },
489
- referrerScope(referrer) {
490
- if (typeof referrer !== 'object' || referrer === null)
491
- return null;
492
- const { room, path, message } = referrer;
493
- if (typeof message === 'string')
494
- return { kind: 'conversations' };
495
- if (typeof room !== 'string')
496
- return null;
497
- return { kind: 'room', locator: room, ...(typeof path === 'string' ? { path } : {}) };
580
+ async attach(_authorization, request) {
581
+ return resolveScript(scripts.attach, () => {
582
+ const room = rooms.find((entry) => entry.locator === request.locator);
583
+ if (room === undefined)
584
+ return { kind: 'room-not-readable', locator: request.locator };
585
+ const path = freePath(room, request.name);
586
+ attached.set(`${room.locator}\u0000${path}`, request.blob);
587
+ return { kind: 'attached', path, revision: `attached-${attached.size}` };
588
+ }, request);
498
589
  },
499
590
  async action(_authorization, request) {
500
591
  return resolveScript(scripts.action, () => {
501
- if (request.name.startsWith('conversation.'))
592
+ if (request.name.startsWith('conversations/'))
502
593
  return conversationAction(request);
503
594
  return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
504
595
  }, request).then((answer) => {
@@ -0,0 +1,28 @@
1
+ import type { AcceptedMessage } from './adapter.js';
2
+ import type { Connection } from './tables.js';
3
+ export declare const MESSAGE_TABLES: readonly string[];
4
+ export type HeldConversation = {
5
+ readonly conversation: string;
6
+ readonly read: string | null | undefined;
7
+ readonly partial: boolean;
8
+ };
9
+ export type MessageWindow = {
10
+ readonly messages: AcceptedMessage[];
11
+ readonly more: boolean;
12
+ };
13
+ export type ConversationWrite = {
14
+ readonly conversation: string;
15
+ readonly messages: readonly AcceptedMessage[];
16
+ readonly read?: {
17
+ readonly at: string | null;
18
+ readonly partial: boolean;
19
+ };
20
+ };
21
+ export declare function heldConversations(connection: Connection): HeldConversation[];
22
+ export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
23
+ export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null, phrase: string | null): MessageWindow;
24
+ export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): number;
25
+ export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
26
+ export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
27
+ export declare function forgottenMessages(connection: Connection): void;
28
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAE1D,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAM3C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3E,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAmB5E;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAClD,IAAI,CA+BN;AAkBD,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,EACxC,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,aAAa,CAWf;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,MAAM,CAOR;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO/F;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAK9F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAG9D"}
@@ -0,0 +1,89 @@
1
+ import { HOLDS_PHRASE } from './phrase.js';
2
+ export const MESSAGE_TABLES = [
3
+ 'CREATE TABLE conversation_reads (conversation TEXT PRIMARY KEY, read TEXT, partial INTEGER NOT NULL) WITHOUT ROWID',
4
+ 'CREATE TABLE conversation_messages (id INTEGER PRIMARY KEY, conversation TEXT NOT NULL, identity TEXT NOT NULL, turn TEXT NOT NULL, position TEXT NOT NULL, message TEXT NOT NULL, text TEXT NOT NULL)',
5
+ 'CREATE UNIQUE INDEX conversation_messages_identity ON conversation_messages (conversation, identity)',
6
+ 'CREATE INDEX conversation_messages_position ON conversation_messages (conversation, position, identity)',
7
+ 'CREATE INDEX conversation_messages_turn ON conversation_messages (conversation, turn)',
8
+ ];
9
+ function text(value) {
10
+ return typeof value === 'string' ? value : String(value);
11
+ }
12
+ export function heldConversations(connection) {
13
+ const held = new Map();
14
+ for (const row of connection.rows('SELECT conversation, read, partial FROM conversation_reads')) {
15
+ held.set(text(row.conversation), {
16
+ conversation: text(row.conversation),
17
+ read: row.read === null ? null : text(row.read),
18
+ partial: Number(row.partial) === 1,
19
+ });
20
+ }
21
+ for (const row of connection.rows('SELECT DISTINCT conversation FROM conversation_messages WHERE conversation NOT IN (SELECT conversation FROM conversation_reads)')) {
22
+ held.set(text(row.conversation), {
23
+ conversation: text(row.conversation),
24
+ read: undefined,
25
+ partial: true,
26
+ });
27
+ }
28
+ return [...held.values()];
29
+ }
30
+ export function keptMessages(connection, { conversation, messages, read }) {
31
+ for (const message of messages) {
32
+ const [held] = connection.rows('SELECT id FROM conversation_messages WHERE conversation = ? AND identity = ?', [conversation, message.identity]);
33
+ const record = [
34
+ message.turn,
35
+ message.position,
36
+ JSON.stringify(message.message ?? null),
37
+ message.text,
38
+ ];
39
+ if (held === undefined) {
40
+ connection.run('INSERT INTO conversation_messages (conversation, identity, turn, position, message, text) VALUES (?, ?, ?, ?, ?, ?)', [conversation, message.identity, ...record]);
41
+ }
42
+ else {
43
+ connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, held.id]);
44
+ }
45
+ }
46
+ if (read !== undefined) {
47
+ connection.run('INSERT OR REPLACE INTO conversation_reads (conversation, read, partial) VALUES (?, ?, ?)', [conversation, read.at, read.partial ? 1 : 0]);
48
+ }
49
+ return null;
50
+ }
51
+ function accepted(row) {
52
+ return {
53
+ identity: text(row.identity),
54
+ turn: text(row.turn),
55
+ position: text(row.position),
56
+ text: text(row.text),
57
+ message: JSON.parse(text(row.message)),
58
+ };
59
+ }
60
+ function holding(phrase) {
61
+ return phrase === null
62
+ ? { sql: '', bind: [] }
63
+ : { sql: ` AND ${HOLDS_PHRASE}(text, ?)`, bind: [phrase.toLowerCase()] };
64
+ }
65
+ export function messageWindow(connection, conversation, limit, before, phrase) {
66
+ const held = holding(phrase);
67
+ const rows = connection.rows(`SELECT identity, turn, position, message, text FROM conversation_messages WHERE conversation = ?${held.sql}${before === null ? '' : ' AND (position < ? OR (position = ? AND identity < ?))'} ORDER BY position DESC, identity DESC LIMIT ?`, before === null
68
+ ? [conversation, ...held.bind, limit + 1]
69
+ : [conversation, ...held.bind, before[0], before[0], before[1], limit + 1]);
70
+ return { messages: rows.slice(0, limit).map(accepted).reverse(), more: rows.length > limit };
71
+ }
72
+ export function messageCount(connection, conversation, phrase) {
73
+ const held = holding(phrase);
74
+ const [counted] = connection.rows(`SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?${held.sql}`, [conversation, ...held.bind]);
75
+ return Number(counted?.held ?? 0);
76
+ }
77
+ export function turnArrived(connection, conversation, turn) {
78
+ return (connection.rows('SELECT 1 FROM conversation_messages WHERE conversation = ? AND turn = ? LIMIT 1', [conversation, turn]).length > 0);
79
+ }
80
+ export function droppedMessages(connection, conversations) {
81
+ for (const conversation of conversations) {
82
+ connection.run('DELETE FROM conversation_messages WHERE conversation = ?', [conversation]);
83
+ connection.run('DELETE FROM conversation_reads WHERE conversation = ?', [conversation]);
84
+ }
85
+ }
86
+ export function forgottenMessages(connection) {
87
+ connection.run('DELETE FROM conversation_messages');
88
+ connection.run('DELETE FROM conversation_reads');
89
+ }
package/dist/model.d.ts CHANGED
@@ -28,6 +28,11 @@ export type ModelState = {
28
28
  verifiedWith: ModelIdentity;
29
29
  types: VerifiedModel['types'];
30
30
  };
31
+ export type StoredModel = Extract<ModelState, {
32
+ status: 'unavailable';
33
+ }> | Omit<Extract<ModelState, {
34
+ status: 'current' | 'cached';
35
+ }>, 'types'>;
31
36
  export type TypesResult = {
32
37
  status: Open<'unavailable'>;
33
38
  reason: ModelUnavailableReason;
@@ -51,8 +56,8 @@ export type ValidationReceipt = {
51
56
  export declare const NO_MODEL: ModelState;
52
57
  export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
53
58
  export declare function modelTypes(state: ModelState): TypesResult;
59
+ export declare function storedModel(state: ModelState): StoredModel;
54
60
  export declare function cached(state: ModelState): ModelState;
55
61
  export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
56
- export declare function sameTyping(left: ModelState, right: ModelState): boolean;
57
62
  export declare function referenceField(facts: ValueFacts | undefined): boolean;
58
63
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC/F,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC,CAAC;AACnG,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAChC,MAAM,MAAM,UAAU,GAClB;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB;IACE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AACN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;CACpC,CAAC;AACF,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGhG;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAgBzD;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CASvE;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAErE"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}