@agentshouse/mdruntime 0.1.0-c05b32a1b6587 → 0.1.0-c069136dcb4e8

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 (232) hide show
  1. package/README.md +18 -15
  2. package/dist/adapter.d.ts +112 -45
  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 +27 -11
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +184 -81
  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 -14
  17. package/dist/change-set.d.ts.map +1 -1
  18. package/dist/change-set.js +11 -63
  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 +24 -12
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +98 -11
  25. package/dist/collection.d.ts +10 -7
  26. package/dist/collection.d.ts.map +1 -1
  27. package/dist/collection.js +38 -79
  28. package/dist/compile.d.ts +16 -0
  29. package/dist/compile.d.ts.map +1 -0
  30. package/dist/compile.js +773 -0
  31. package/dist/connection.d.ts +45 -16
  32. package/dist/connection.d.ts.map +1 -1
  33. package/dist/connection.js +3479 -918
  34. package/dist/conversation.d.ts +30 -14
  35. package/dist/conversation.d.ts.map +1 -1
  36. package/dist/conversation.js +655 -241
  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 +4 -1
  41. package/dist/durability.d.ts.map +1 -1
  42. package/dist/durability.js +5 -0
  43. package/dist/entry.d.ts +6 -3
  44. package/dist/entry.d.ts.map +1 -1
  45. package/dist/entry.js +18 -23
  46. package/dist/fence.d.ts +6 -0
  47. package/dist/fence.d.ts.map +1 -0
  48. package/dist/fence.js +10 -0
  49. package/dist/file.d.ts +2 -19
  50. package/dist/file.d.ts.map +1 -1
  51. package/dist/file.js +7 -122
  52. package/dist/fulltext.d.ts +27 -0
  53. package/dist/fulltext.d.ts.map +1 -0
  54. package/dist/fulltext.js +370 -0
  55. package/dist/host.d.ts +13 -2
  56. package/dist/host.d.ts.map +1 -1
  57. package/dist/host.js +129 -15
  58. package/dist/identity.d.ts +1 -0
  59. package/dist/identity.d.ts.map +1 -1
  60. package/dist/identity.js +3 -0
  61. package/dist/index.d.ts +15 -9
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +6 -0
  64. package/dist/live.d.ts +22 -0
  65. package/dist/live.d.ts.map +1 -0
  66. package/dist/live.js +124 -0
  67. package/dist/media.d.ts +8 -0
  68. package/dist/media.d.ts.map +1 -0
  69. package/dist/media.js +218 -0
  70. package/dist/memory.d.ts +13 -4
  71. package/dist/memory.d.ts.map +1 -1
  72. package/dist/memory.js +147 -46
  73. package/dist/messages.d.ts +28 -0
  74. package/dist/messages.d.ts.map +1 -0
  75. package/dist/messages.js +90 -0
  76. package/dist/model.d.ts +9 -2
  77. package/dist/model.d.ts.map +1 -1
  78. package/dist/model.js +8 -2
  79. package/dist/name.d.ts +4 -0
  80. package/dist/name.d.ts.map +1 -0
  81. package/dist/name.js +122 -0
  82. package/dist/observation.d.ts +20 -2
  83. package/dist/observation.d.ts.map +1 -1
  84. package/dist/observation.js +113 -12
  85. package/dist/opened.d.ts +22 -0
  86. package/dist/opened.d.ts.map +1 -0
  87. package/dist/opened.js +107 -0
  88. package/dist/outcome.d.ts +49 -7
  89. package/dist/outcome.d.ts.map +1 -1
  90. package/dist/outcome.js +40 -0
  91. package/dist/overlay.d.ts +3 -4
  92. package/dist/overlay.d.ts.map +1 -1
  93. package/dist/overlay.js +100 -182
  94. package/dist/paths.d.ts +1 -0
  95. package/dist/paths.d.ts.map +1 -1
  96. package/dist/paths.js +4 -0
  97. package/dist/query.d.ts +66 -4
  98. package/dist/query.d.ts.map +1 -1
  99. package/dist/query.js +48 -7
  100. package/dist/reach.d.ts +18 -6
  101. package/dist/reach.d.ts.map +1 -1
  102. package/dist/reach.js +224 -70
  103. package/dist/react.d.ts +8 -6
  104. package/dist/react.d.ts.map +1 -1
  105. package/dist/react.js +7 -17
  106. package/dist/readiness.d.ts +52 -0
  107. package/dist/readiness.d.ts.map +1 -0
  108. package/dist/readiness.js +27 -0
  109. package/dist/recovery.d.ts +26 -0
  110. package/dist/recovery.d.ts.map +1 -0
  111. package/dist/recovery.js +224 -0
  112. package/dist/refresh.d.ts +16 -14
  113. package/dist/refresh.d.ts.map +1 -1
  114. package/dist/refresh.js +115 -51
  115. package/dist/replica.d.ts +55 -33
  116. package/dist/replica.d.ts.map +1 -1
  117. package/dist/replica.js +297 -154
  118. package/dist/room-draft.d.ts +34 -4
  119. package/dist/room-draft.d.ts.map +1 -1
  120. package/dist/room-draft.js +105 -31
  121. package/dist/rows.d.ts +37 -37
  122. package/dist/rows.d.ts.map +1 -1
  123. package/dist/rows.js +173 -104
  124. package/dist/save.d.ts +53 -9
  125. package/dist/save.d.ts.map +1 -1
  126. package/dist/save.js +537 -170
  127. package/dist/search.d.ts +39 -28
  128. package/dist/search.d.ts.map +1 -1
  129. package/dist/search.js +37 -105
  130. package/dist/seed.d.ts +16 -0
  131. package/dist/seed.d.ts.map +1 -0
  132. package/dist/seed.js +75 -0
  133. package/dist/shared.d.ts +15 -0
  134. package/dist/shared.d.ts.map +1 -0
  135. package/dist/shared.js +421 -0
  136. package/dist/status.d.ts +5 -0
  137. package/dist/status.d.ts.map +1 -1
  138. package/dist/status.js +3 -1
  139. package/dist/store.d.ts +102 -78
  140. package/dist/store.d.ts.map +1 -1
  141. package/dist/store.js +312 -479
  142. package/dist/stored.d.ts +130 -0
  143. package/dist/stored.d.ts.map +1 -0
  144. package/dist/stored.js +560 -0
  145. package/dist/tables.d.ts +325 -0
  146. package/dist/tables.d.ts.map +1 -0
  147. package/dist/tables.js +578 -0
  148. package/dist/transfer.d.ts +0 -5
  149. package/dist/transfer.d.ts.map +1 -1
  150. package/dist/turn.d.ts +9 -0
  151. package/dist/turn.d.ts.map +1 -0
  152. package/dist/turn.js +75 -0
  153. package/dist/validation.d.ts +29 -0
  154. package/dist/validation.d.ts.map +1 -0
  155. package/dist/validation.js +101 -0
  156. package/dist/windows.d.ts +22 -0
  157. package/dist/windows.d.ts.map +1 -0
  158. package/dist/windows.js +89 -0
  159. package/dist/wire.d.ts +168 -32
  160. package/dist/wire.d.ts.map +1 -1
  161. package/dist/wire.js +56 -31
  162. package/dist/words.d.ts +19 -0
  163. package/dist/words.d.ts.map +1 -0
  164. package/dist/words.js +156 -0
  165. package/package.json +18 -19
  166. package/AGENTS.md +0 -302
  167. package/dist/chat/acts.d.ts +0 -34
  168. package/dist/chat/acts.d.ts.map +0 -1
  169. package/dist/chat/acts.js +0 -36
  170. package/dist/chat/context.d.ts +0 -3
  171. package/dist/chat/context.d.ts.map +0 -1
  172. package/dist/chat/context.js +0 -10
  173. package/dist/chat/input.d.ts +0 -9
  174. package/dist/chat/input.d.ts.map +0 -1
  175. package/dist/chat/input.js +0 -99
  176. package/dist/chat/kit.d.ts +0 -60
  177. package/dist/chat/kit.d.ts.map +0 -1
  178. package/dist/chat/kit.js +0 -123
  179. package/dist/chat/lasting.d.ts +0 -6
  180. package/dist/chat/lasting.d.ts.map +0 -1
  181. package/dist/chat/lasting.js +0 -19
  182. package/dist/chat/list.d.ts +0 -26
  183. package/dist/chat/list.d.ts.map +0 -1
  184. package/dist/chat/list.js +0 -62
  185. package/dist/chat/markdown.d.ts +0 -20
  186. package/dist/chat/markdown.d.ts.map +0 -1
  187. package/dist/chat/markdown.js +0 -188
  188. package/dist/chat/message.d.ts +0 -6
  189. package/dist/chat/message.d.ts.map +0 -1
  190. package/dist/chat/message.js +0 -192
  191. package/dist/chat/messages.d.ts +0 -21
  192. package/dist/chat/messages.d.ts.map +0 -1
  193. package/dist/chat/messages.js +0 -151
  194. package/dist/chat/name.d.ts +0 -6
  195. package/dist/chat/name.d.ts.map +0 -1
  196. package/dist/chat/name.js +0 -37
  197. package/dist/chat/opened.d.ts +0 -11
  198. package/dist/chat/opened.d.ts.map +0 -1
  199. package/dist/chat/opened.js +0 -17
  200. package/dist/chat/overlay.d.ts +0 -31
  201. package/dist/chat/overlay.d.ts.map +0 -1
  202. package/dist/chat/overlay.js +0 -97
  203. package/dist/chat/parts.d.ts +0 -57
  204. package/dist/chat/parts.d.ts.map +0 -1
  205. package/dist/chat/parts.js +0 -119
  206. package/dist/chat/process.d.ts +0 -20
  207. package/dist/chat/process.d.ts.map +0 -1
  208. package/dist/chat/process.js +0 -32
  209. package/dist/chat/provider.d.ts +0 -63
  210. package/dist/chat/provider.d.ts.map +0 -1
  211. package/dist/chat/provider.js +0 -645
  212. package/dist/chat/question.d.ts +0 -9
  213. package/dist/chat/question.d.ts.map +0 -1
  214. package/dist/chat/question.js +0 -80
  215. package/dist/chat/questions.d.ts +0 -31
  216. package/dist/chat/questions.d.ts.map +0 -1
  217. package/dist/chat/questions.js +0 -111
  218. package/dist/chat/read.d.ts +0 -5
  219. package/dist/chat/read.d.ts.map +0 -1
  220. package/dist/chat/read.js +0 -13
  221. package/dist/chat/ready.d.ts +0 -33
  222. package/dist/chat/ready.d.ts.map +0 -1
  223. package/dist/chat/ready.js +0 -91
  224. package/dist/chat/style.d.ts +0 -4
  225. package/dist/chat/style.d.ts.map +0 -1
  226. package/dist/chat/style.js +0 -302
  227. package/dist/chat.d.ts +0 -14
  228. package/dist/chat.d.ts.map +0 -1
  229. package/dist/chat.js +0 -8
  230. package/dist/read-side.d.ts +0 -18
  231. package/dist/read-side.d.ts.map +0 -1
  232. package/dist/read-side.js +0 -440
package/dist/memory.js CHANGED
@@ -1,7 +1,11 @@
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
- outcome: 1,
8
+ outcome: 604_800,
5
9
  refreshHorizon: 1,
6
10
  };
7
11
  function declaredRetention(value) {
@@ -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);
@@ -55,8 +54,11 @@ export function createMemoryAdapter(options = {}) {
55
54
  const scripted = new Map();
56
55
  const unsealed = new Map();
57
56
  const sealed = new Set();
57
+ const sentTurns = new Map();
58
58
  const historyPageSize = options.historyPageSize;
59
- let held = [];
59
+ const attached = new Map();
60
+ const linked = new WeakMap();
61
+ const carried = new Map();
60
62
  let expiring = [];
61
63
  let replicated = [];
62
64
  let issued = 0;
@@ -86,6 +88,19 @@ export function createMemoryAdapter(options = {}) {
86
88
  const wanted = ordinals.get(`${locator}\u0000${target}`);
87
89
  return held !== undefined && wanted !== undefined && held >= wanted;
88
90
  }
91
+ function heldBlob(room, path) {
92
+ return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
93
+ }
94
+ function freePath(room, name) {
95
+ const dot = name.lastIndexOf('.');
96
+ const stem = dot > 0 ? name.slice(0, dot) : name;
97
+ const extension = dot > 0 ? name.slice(dot) : '';
98
+ for (let count = 1;; count += 1) {
99
+ const path = `${ATTACHMENTS}/${count === 1 ? stem : `${stem}-${count}`}${extension}`;
100
+ if (heldBlob(room, path) === undefined && room.documents?.[path] === undefined)
101
+ return path;
102
+ }
103
+ }
89
104
  function retain(entries) {
90
105
  for (const room of entries) {
91
106
  note(room.locator, room);
@@ -121,22 +136,37 @@ export function createMemoryAdapter(options = {}) {
121
136
  ...(opening ? { models: modelsOf(room) } : {}),
122
137
  documents: named(room.documents ?? {}, taken),
123
138
  revisions: named(room.revisions ?? {}, [...taken, ...targets]),
139
+ ...(room.fileIds === undefined
140
+ ? {}
141
+ : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
124
142
  changes: named(room.changes ?? {}, [...taken, ...targets]),
125
143
  binaryFiles: named(room.binaryFiles ?? {}, targets),
144
+ ...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
126
145
  ...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
127
146
  };
128
147
  }
129
- function advancement(room, from, at) {
148
+ function foldersMoved(room, from) {
149
+ const now = new Set(room.folders ?? []);
150
+ const before = new Set(from.folders ?? []);
151
+ const folders = [...now].filter((folder) => !before.has(folder)).sort();
152
+ const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
153
+ return {
154
+ ...(folders.length === 0 ? {} : { folders }),
155
+ ...(folderRemovals.length === 0 ? {} : { folderRemovals }),
156
+ };
157
+ }
158
+ function advancement(room, from, at, whole = false) {
130
159
  const current = room.documents ?? {};
131
160
  const previous = from.documents ?? {};
132
161
  const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
133
162
  const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
134
163
  const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
164
+ room.fileIds?.[path] !== from.fileIds?.[path] ||
135
165
  !sameChange(room.changes?.[path], from.changes?.[path]);
136
166
  const changed = Object.keys(current)
137
167
  .filter((path) => current[path] !== previous[path] || headMoved(path))
138
168
  .sort();
139
- const size = pageSize ?? changed.length;
169
+ const size = whole ? changed.length : (pageSize ?? changed.length);
140
170
  const taken = changed.slice(at, at + size);
141
171
  const next = at + taken.length;
142
172
  const opening = at === 0;
@@ -153,8 +183,12 @@ export function createMemoryAdapter(options = {}) {
153
183
  ...(models === undefined ? {} : { models }),
154
184
  documents: named(current, taken),
155
185
  revisions: named(room.revisions ?? {}, [...taken, ...targets]),
186
+ ...(room.fileIds === undefined
187
+ ? {}
188
+ : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
156
189
  changes: named(room.changes ?? {}, [...taken, ...targets]),
157
190
  binaryFiles: named(room.binaryFiles ?? {}, targets),
191
+ ...(opening ? foldersMoved(room, from) : {}),
158
192
  removals: opening
159
193
  ? [
160
194
  ...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
@@ -164,6 +198,26 @@ export function createMemoryAdapter(options = {}) {
164
198
  ...(pageToken === undefined ? {} : { pageToken }),
165
199
  };
166
200
  }
201
+ function carry(locator) {
202
+ const at = carried.get(locator);
203
+ const current = rooms.find((entry) => entry.locator === locator);
204
+ if (at === undefined || current === undefined || current.roomVersion === at)
205
+ return;
206
+ const from = served.get(locator)?.get(at);
207
+ carried.set(locator, current.roomVersion);
208
+ if (from === undefined)
209
+ return;
210
+ const page = advancement(current, from, 0, true);
211
+ for (const observer of observers) {
212
+ observer({
213
+ kind: 'room-change',
214
+ locator,
215
+ from: at,
216
+ roomVersion: current.roomVersion,
217
+ read: async () => page,
218
+ });
219
+ }
220
+ }
167
221
  function pageOf(conversation, after) {
168
222
  const messages = conversation.messages ?? [];
169
223
  const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
@@ -220,9 +274,15 @@ export function createMemoryAdapter(options = {}) {
220
274
  if (outcome !== undefined)
221
275
  return outcome;
222
276
  if (name === 'conversation.send') {
277
+ const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
278
+ const answered = operation === null ? undefined : sentTurns.get(operation);
279
+ if (answered !== undefined)
280
+ return { kind: 'action', result: { turn: answered } };
223
281
  issued += 1;
224
282
  const turn = `turn-${issued}`;
225
283
  unsealed.set(turn, named);
284
+ if (operation !== null)
285
+ sentTurns.set(operation, turn);
226
286
  return { kind: 'action', result: { turn } };
227
287
  }
228
288
  if (name === 'conversation.cancel') {
@@ -238,7 +298,9 @@ export function createMemoryAdapter(options = {}) {
238
298
  return { kind: 'action', result: { conversation: named } };
239
299
  }
240
300
  function announceList() {
241
- const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined ? [] : [{ conversation, ...listed }]);
301
+ const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
302
+ ? []
303
+ : [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
242
304
  for (const listener of listeners)
243
305
  listener({ kind: 'list', entries });
244
306
  }
@@ -253,6 +315,8 @@ export function createMemoryAdapter(options = {}) {
253
315
  };
254
316
  }
255
317
  return {
318
+ ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
319
+ ...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
256
320
  setRooms(next) {
257
321
  rooms = [...next];
258
322
  retain(rooms);
@@ -261,20 +325,28 @@ export function createMemoryAdapter(options = {}) {
261
325
  scriptConversations(next);
262
326
  },
263
327
  open() {
328
+ carried.clear();
264
329
  announceList();
265
330
  for (const observer of observers)
266
331
  observer({ kind: 'opened' });
267
332
  },
268
- close(revoked = false) {
333
+ close({ revoked = false, lost = !revoked } = {}) {
334
+ carried.clear();
269
335
  for (const observer of observers)
270
- observer({ kind: 'closed', revoked });
336
+ observer({ kind: 'closed', revoked, lost });
271
337
  },
272
338
  expire(locators) {
273
339
  expiring = [...locators];
274
340
  },
275
- notifyRoomVersion({ locator, roomVersion }) {
276
- for (const observer of observers)
277
- observer({ kind: 'room-version', locator, roomVersion });
341
+ notifyRoomVersion({ locator }) {
342
+ carry(locator);
343
+ },
344
+ notifyAuthorityChanged(scope) {
345
+ for (const observer of observers) {
346
+ observer(scope === undefined
347
+ ? { kind: 'authority-changed' }
348
+ : { kind: 'authority-changed', scope });
349
+ }
278
350
  },
279
351
  notifyConversation(event) {
280
352
  if (event.kind === 'accepted-message') {
@@ -289,7 +361,7 @@ export function createMemoryAdapter(options = {}) {
289
361
  observer(mode);
290
362
  },
291
363
  heldRooms() {
292
- return held;
364
+ return [...carried.keys()].sort();
293
365
  },
294
366
  replicatedConversations() {
295
367
  return replicated;
@@ -304,6 +376,9 @@ export function createMemoryAdapter(options = {}) {
304
376
  listeners.delete(notify);
305
377
  };
306
378
  },
379
+ ...(options.agents === undefined
380
+ ? {}
381
+ : { agents: () => Promise.resolve(structuredClone(options.agents)) }),
307
382
  },
308
383
  serviceMode: {
309
384
  observe(notify) {
@@ -315,29 +390,38 @@ export function createMemoryAdapter(options = {}) {
315
390
  },
316
391
  roomStream: {
317
392
  hold(asked) {
318
- held = asked.map((room) => room.locator);
319
- const expired = expiring.filter((locator) => held.includes(locator));
320
- expiring = [];
321
- const moved = asked.flatMap((room) => {
393
+ const named = asked.map((room) => room.locator);
394
+ const unknown = asked.flatMap((room) => {
322
395
  const current = rooms.find((entry) => entry.locator === room.locator);
323
396
  return current === undefined ||
324
- expired.includes(room.locator) ||
325
- current.roomVersion === room.roomVersion
397
+ current.roomVersion === room.roomVersion ||
398
+ served.get(room.locator)?.has(room.roomVersion) === true
326
399
  ? []
327
- : [{ locator: room.locator, roomVersion: current.roomVersion }];
400
+ : [room.locator];
328
401
  });
402
+ const expired = [
403
+ ...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
404
+ ];
405
+ expiring = expiring.filter((locator) => !named.includes(locator));
329
406
  queueMicrotask(() => {
330
- for (const observer of observers) {
331
- for (const room of moved)
332
- observer({ kind: 'room-version', ...room });
333
- observer({ kind: 'opening', expired });
407
+ for (const room of asked) {
408
+ if (expired.includes(room.locator))
409
+ carried.delete(room.locator);
410
+ else {
411
+ carried.set(room.locator, room.roomVersion);
412
+ carry(room.locator);
413
+ }
334
414
  }
415
+ for (const observer of observers)
416
+ observer({ kind: 'opening', expired });
335
417
  });
336
418
  },
337
419
  reopen() {
338
420
  queueMicrotask(() => {
339
- for (const observer of observers)
340
- observer({ kind: 'closed', revoked: false });
421
+ carried.clear();
422
+ for (const observer of observers) {
423
+ observer({ kind: 'closed', revoked: false, lost: false });
424
+ }
341
425
  });
342
426
  },
343
427
  observe(notify) {
@@ -346,7 +430,7 @@ export function createMemoryAdapter(options = {}) {
346
430
  if (!observers.has(notify))
347
431
  return;
348
432
  if (options.unopened === true) {
349
- notify({ kind: 'closed', revoked: false });
433
+ notify({ kind: 'closed', revoked: false, lost: true });
350
434
  return;
351
435
  }
352
436
  announceList();
@@ -429,7 +513,13 @@ export function createMemoryAdapter(options = {}) {
429
513
  retryable: false,
430
514
  affected: {},
431
515
  };
432
- }, request).then((answer) => note(request.locator, answer));
516
+ }, request).then((answer) => {
517
+ const destination = request.changeBatch.between?.destination.room;
518
+ if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
519
+ note(destination, answer.destination);
520
+ }
521
+ return note(request.locator, answer);
522
+ });
433
523
  },
434
524
  async history(_authorization, request) {
435
525
  return resolveScript(scripts.history, () => {
@@ -445,27 +535,38 @@ export function createMemoryAdapter(options = {}) {
445
535
  },
446
536
  async binary(_authorization, request) {
447
537
  return resolveScript(scripts.binary, () => {
448
- if (request.kind === 'reference') {
449
- return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
450
- }
451
538
  const room = rooms.find((entry) => entry.locator === request.locator);
452
539
  if (room === undefined)
453
540
  return { kind: 'room-not-readable', locator: request.locator };
454
- const blob = room.blobs?.[request.path];
541
+ const blob = heldBlob(room, request.path);
455
542
  return blob === undefined
456
543
  ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
457
- : { kind: 'binary', blob };
544
+ : { kind: 'binary', body: blob.stream(), mediaType: blob.type };
545
+ }, request);
546
+ },
547
+ async link(_authorization, request) {
548
+ return resolveScript(scripts.link, () => {
549
+ const room = rooms.find((entry) => entry.locator === request.locator);
550
+ if (room === undefined)
551
+ return { kind: 'room-not-readable', locator: request.locator };
552
+ const blob = heldBlob(room, request.path);
553
+ if (blob === undefined) {
554
+ return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
555
+ }
556
+ const url = linked.get(blob) ?? URL.createObjectURL(blob);
557
+ linked.set(blob, url);
558
+ return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
458
559
  }, request);
459
560
  },
460
- referrerScope(referrer) {
461
- if (typeof referrer !== 'object' || referrer === null)
462
- return null;
463
- const { room, path, message } = referrer;
464
- if (typeof message === 'string')
465
- return { kind: 'conversations' };
466
- if (typeof room !== 'string')
467
- return null;
468
- return { kind: 'room', locator: room, ...(typeof path === 'string' ? { path } : {}) };
561
+ async attach(_authorization, request) {
562
+ return resolveScript(scripts.attach, () => {
563
+ const room = rooms.find((entry) => entry.locator === request.locator);
564
+ if (room === undefined)
565
+ return { kind: 'room-not-readable', locator: request.locator };
566
+ const path = freePath(room, request.name);
567
+ attached.set(`${room.locator}\u0000${path}`, request.blob);
568
+ return { kind: 'attached', path, revision: `attached-${attached.size}` };
569
+ }, request);
469
570
  },
470
571
  async action(_authorization, request) {
471
572
  return resolveScript(scripts.action, () => {
@@ -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): MessageWindow;
24
+ export declare function messageCount(connection: Connection, conversation: string): 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,CAoCN;AAYD,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,GACvC,aAAa,CAUf;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAMjF;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,CAW9F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAG9D"}
@@ -0,0 +1,90 @@
1
+ import { indexMessage, unindexMessages } from './fulltext.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
+ let id;
40
+ if (held === undefined) {
41
+ connection.run('INSERT INTO conversation_messages (conversation, identity, turn, position, message, text) VALUES (?, ?, ?, ?, ?, ?)', [conversation, message.identity, ...record]);
42
+ id = Number(connection.rows('SELECT last_insert_rowid() AS id')[0].id);
43
+ }
44
+ else {
45
+ id = Number(held.id);
46
+ unindexMessages(connection, [id]);
47
+ connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, id]);
48
+ }
49
+ indexMessage(connection, id, message.text);
50
+ }
51
+ if (read !== undefined) {
52
+ connection.run('INSERT OR REPLACE INTO conversation_reads (conversation, read, partial) VALUES (?, ?, ?)', [conversation, read.at, read.partial ? 1 : 0]);
53
+ }
54
+ return null;
55
+ }
56
+ function accepted(row) {
57
+ return {
58
+ identity: text(row.identity),
59
+ turn: text(row.turn),
60
+ position: text(row.position),
61
+ text: text(row.text),
62
+ message: JSON.parse(text(row.message)),
63
+ };
64
+ }
65
+ export function messageWindow(connection, conversation, limit, before) {
66
+ const rows = connection.rows(`SELECT identity, turn, position, message, text FROM conversation_messages WHERE conversation = ?${before === null ? '' : ' AND (position < ? OR (position = ? AND identity < ?))'} ORDER BY position DESC, identity DESC LIMIT ?`, before === null
67
+ ? [conversation, limit + 1]
68
+ : [conversation, before[0], before[0], before[1], limit + 1]);
69
+ return { messages: rows.slice(0, limit).map(accepted).reverse(), more: rows.length > limit };
70
+ }
71
+ export function messageCount(connection, conversation) {
72
+ const [counted] = connection.rows('SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?', [conversation]);
73
+ return Number(counted?.held ?? 0);
74
+ }
75
+ export function turnArrived(connection, conversation, turn) {
76
+ return (connection.rows('SELECT 1 FROM conversation_messages WHERE conversation = ? AND turn = ? LIMIT 1', [conversation, turn]).length > 0);
77
+ }
78
+ export function droppedMessages(connection, conversations) {
79
+ for (const conversation of conversations) {
80
+ unindexMessages(connection, connection
81
+ .rows('SELECT id FROM conversation_messages WHERE conversation = ?', [conversation])
82
+ .map((row) => Number(row.id)));
83
+ connection.run('DELETE FROM conversation_messages WHERE conversation = ?', [conversation]);
84
+ connection.run('DELETE FROM conversation_reads WHERE conversation = ?', [conversation]);
85
+ }
86
+ }
87
+ export function forgottenMessages(connection) {
88
+ connection.run('DELETE FROM conversation_messages');
89
+ connection.run('DELETE FROM conversation_reads');
90
+ }
package/dist/model.d.ts CHANGED
@@ -28,13 +28,19 @@ export type ModelState = {
28
28
  verifiedWith: ModelIdentity;
29
29
  types: VerifiedModel['types'];
30
30
  };
31
- export type TypesResult = {
31
+ export type StoredModel = Extract<ModelState, {
32
32
  status: 'unavailable';
33
+ }> | Omit<Extract<ModelState, {
34
+ status: 'current' | 'cached';
35
+ }>, 'types'>;
36
+ export type TypesResult = {
37
+ status: Open<'unavailable'>;
33
38
  reason: ModelUnavailableReason;
39
+ types: null;
34
40
  schema?: string | null;
35
41
  revision?: string | null;
36
42
  } | {
37
- status: 'current' | 'cached';
43
+ status: Open<'current' | 'cached'>;
38
44
  identity: string;
39
45
  version: string;
40
46
  verifiedWith: ModelIdentity;
@@ -50,6 +56,7 @@ export type ValidationReceipt = {
50
56
  export declare const NO_MODEL: ModelState;
51
57
  export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
52
58
  export declare function modelTypes(state: ModelState): TypesResult;
59
+ export declare function storedModel(state: ModelState): StoredModel;
53
60
  export declare function cached(state: ModelState): ModelState;
54
61
  export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
55
62
  export declare function referenceField(facts: ValueFacts | undefined): boolean;
@@ -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,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,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,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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"}
package/dist/model.js CHANGED
@@ -6,7 +6,7 @@ export function definitionOf(state, type) {
6
6
  }
7
7
  export function modelTypes(state) {
8
8
  return state.status === 'unavailable'
9
- ? { ...state }
9
+ ? { ...state, types: null }
10
10
  : {
11
11
  status: state.status,
12
12
  identity: state.snapshot.identity,
@@ -14,9 +14,15 @@ export function modelTypes(state) {
14
14
  verifiedWith: { ...state.verifiedWith },
15
15
  schema: state.snapshot.schema,
16
16
  revision: state.snapshot.revision,
17
- types: structuredClone(Object.values(state.types).sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0)),
17
+ types: Object.values(state.types).sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0),
18
18
  };
19
19
  }
20
+ export function storedModel(state) {
21
+ if (state.status === 'unavailable')
22
+ return state;
23
+ const { types: _types, ...stored } = state;
24
+ return stored;
25
+ }
20
26
  export function cached(state) {
21
27
  return state.status === 'unavailable' ? state : { ...state, status: 'cached' };
22
28
  }
package/dist/name.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function transliterated(text: string): string;
2
+ export declare function nameFrom(title: string): string;
3
+ export declare function cutName(name: string, most: number): string;
4
+ //# sourceMappingURL=name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAgHA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}