@agentshouse/mdruntime 0.1.0-cee9c8aa4cd86 → 0.1.0-cf1e7fdb9c600

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 (221) hide show
  1. package/README.md +11 -9
  2. package/dist/adapter.d.ts +96 -63
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +2 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +28 -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 +17 -9
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +143 -94
  13. package/dist/chain.d.ts +2 -1
  14. package/dist/chain.d.ts.map +1 -1
  15. package/dist/client.d.ts +12 -12
  16. package/dist/client.d.ts.map +1 -1
  17. package/dist/client.js +54 -8
  18. package/dist/collection.d.ts +7 -4
  19. package/dist/collection.d.ts.map +1 -1
  20. package/dist/collection.js +24 -19
  21. package/dist/compile.d.ts +1 -6
  22. package/dist/compile.d.ts.map +1 -1
  23. package/dist/compile.js +118 -247
  24. package/dist/connection.d.ts +11 -11
  25. package/dist/connection.d.ts.map +1 -1
  26. package/dist/connection.js +1602 -1147
  27. package/dist/context.d.ts +2 -0
  28. package/dist/context.d.ts.map +1 -0
  29. package/dist/{chat/context.js → context.js} +1 -4
  30. package/dist/conversation.d.ts +18 -14
  31. package/dist/conversation.d.ts.map +1 -1
  32. package/dist/conversation.js +266 -150
  33. package/dist/durability.d.ts +1 -5
  34. package/dist/durability.d.ts.map +1 -1
  35. package/dist/durability.js +5 -0
  36. package/dist/entry.d.ts +3 -2
  37. package/dist/entry.d.ts.map +1 -1
  38. package/dist/entry.js +15 -6
  39. package/dist/file.d.ts +2 -11
  40. package/dist/file.d.ts.map +1 -1
  41. package/dist/file.js +6 -4
  42. package/dist/host.d.ts +3 -6
  43. package/dist/host.d.ts.map +1 -1
  44. package/dist/host.js +49 -35
  45. package/dist/index.d.ts +15 -12
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +6 -3
  48. package/dist/job.d.ts +14 -0
  49. package/dist/job.d.ts.map +1 -0
  50. package/dist/job.js +28 -0
  51. package/dist/live.d.ts +2 -1
  52. package/dist/live.d.ts.map +1 -1
  53. package/dist/live.js +9 -5
  54. package/dist/media.d.ts +8 -0
  55. package/dist/media.d.ts.map +1 -0
  56. package/dist/media.js +218 -0
  57. package/dist/memory.d.ts +11 -6
  58. package/dist/memory.d.ts.map +1 -1
  59. package/dist/memory.js +178 -100
  60. package/dist/messages.d.ts +2 -2
  61. package/dist/messages.d.ts.map +1 -1
  62. package/dist/messages.js +15 -16
  63. package/dist/model.d.ts +7 -3
  64. package/dist/model.d.ts.map +1 -1
  65. package/dist/model.js +7 -13
  66. package/dist/observation.d.ts +3 -2
  67. package/dist/observation.d.ts.map +1 -1
  68. package/dist/observation.js +8 -3
  69. package/dist/outcome.d.ts +13 -6
  70. package/dist/outcome.d.ts.map +1 -1
  71. package/dist/outcome.js +16 -5
  72. package/dist/overlay.js +1 -1
  73. package/dist/paths.d.ts +1 -0
  74. package/dist/paths.d.ts.map +1 -1
  75. package/dist/paths.js +4 -0
  76. package/dist/query.d.ts +10 -205
  77. package/dist/query.d.ts.map +1 -1
  78. package/dist/query.js +3 -494
  79. package/dist/reach.d.ts +14 -9
  80. package/dist/reach.d.ts.map +1 -1
  81. package/dist/reach.js +81 -71
  82. package/dist/react.d.ts +3 -1
  83. package/dist/react.d.ts.map +1 -1
  84. package/dist/readiness.d.ts +13 -16
  85. package/dist/readiness.d.ts.map +1 -1
  86. package/dist/readiness.js +2 -8
  87. package/dist/recovery.d.ts +1 -0
  88. package/dist/recovery.d.ts.map +1 -1
  89. package/dist/recovery.js +26 -0
  90. package/dist/refresh.d.ts +10 -4
  91. package/dist/refresh.d.ts.map +1 -1
  92. package/dist/refresh.js +104 -30
  93. package/dist/replica.d.ts +6 -5
  94. package/dist/replica.d.ts.map +1 -1
  95. package/dist/replica.js +8 -7
  96. package/dist/room-draft.d.ts +20 -3
  97. package/dist/room-draft.d.ts.map +1 -1
  98. package/dist/room-draft.js +131 -51
  99. package/dist/rows.d.ts +8 -15
  100. package/dist/rows.d.ts.map +1 -1
  101. package/dist/rows.js +51 -151
  102. package/dist/save.d.ts +2 -0
  103. package/dist/save.d.ts.map +1 -1
  104. package/dist/save.js +13 -7
  105. package/dist/search.d.ts +12 -63
  106. package/dist/search.d.ts.map +1 -1
  107. package/dist/search.js +9 -52
  108. package/dist/shared.d.ts +0 -1
  109. package/dist/shared.d.ts.map +1 -1
  110. package/dist/shared.js +0 -10
  111. package/dist/status.d.ts +4 -3
  112. package/dist/status.d.ts.map +1 -1
  113. package/dist/status.js +3 -1
  114. package/dist/store.d.ts +32 -30
  115. package/dist/store.d.ts.map +1 -1
  116. package/dist/store.js +64 -58
  117. package/dist/stored.d.ts +42 -18
  118. package/dist/stored.d.ts.map +1 -1
  119. package/dist/stored.js +193 -194
  120. package/dist/tables.d.ts +60 -39
  121. package/dist/tables.d.ts.map +1 -1
  122. package/dist/tables.js +77 -59
  123. package/dist/transfer.d.ts +0 -5
  124. package/dist/transfer.d.ts.map +1 -1
  125. package/dist/validation.d.ts +3 -4
  126. package/dist/validation.d.ts.map +1 -1
  127. package/dist/validation.js +39 -97
  128. package/dist/windows.d.ts +1 -12
  129. package/dist/windows.d.ts.map +1 -1
  130. package/dist/windows.js +2 -75
  131. package/dist/wire.d.ts +6 -9
  132. package/dist/wire.d.ts.map +1 -1
  133. package/dist/wire.js +3 -3
  134. package/package.json +11 -18
  135. package/AGENTS.md +0 -320
  136. package/dist/chat/acts.d.ts +0 -33
  137. package/dist/chat/acts.d.ts.map +0 -1
  138. package/dist/chat/acts.js +0 -36
  139. package/dist/chat/context.d.ts +0 -3
  140. package/dist/chat/context.d.ts.map +0 -1
  141. package/dist/chat/earlier.d.ts +0 -10
  142. package/dist/chat/earlier.d.ts.map +0 -1
  143. package/dist/chat/earlier.js +0 -54
  144. package/dist/chat/house.d.ts +0 -25
  145. package/dist/chat/house.d.ts.map +0 -1
  146. package/dist/chat/house.js +0 -38
  147. package/dist/chat/input.d.ts +0 -11
  148. package/dist/chat/input.d.ts.map +0 -1
  149. package/dist/chat/input.js +0 -92
  150. package/dist/chat/kit.d.ts +0 -61
  151. package/dist/chat/kit.d.ts.map +0 -1
  152. package/dist/chat/kit.js +0 -123
  153. package/dist/chat/lasting.d.ts +0 -6
  154. package/dist/chat/lasting.d.ts.map +0 -1
  155. package/dist/chat/lasting.js +0 -19
  156. package/dist/chat/list.d.ts +0 -28
  157. package/dist/chat/list.d.ts.map +0 -1
  158. package/dist/chat/list.js +0 -103
  159. package/dist/chat/markdown.d.ts +0 -21
  160. package/dist/chat/markdown.d.ts.map +0 -1
  161. package/dist/chat/markdown.js +0 -246
  162. package/dist/chat/message.d.ts +0 -7
  163. package/dist/chat/message.d.ts.map +0 -1
  164. package/dist/chat/message.js +0 -254
  165. package/dist/chat/messages.d.ts +0 -35
  166. package/dist/chat/messages.d.ts.map +0 -1
  167. package/dist/chat/messages.js +0 -210
  168. package/dist/chat/name.d.ts +0 -7
  169. package/dist/chat/name.d.ts.map +0 -1
  170. package/dist/chat/name.js +0 -37
  171. package/dist/chat/opened.d.ts +0 -12
  172. package/dist/chat/opened.d.ts.map +0 -1
  173. package/dist/chat/opened.js +0 -19
  174. package/dist/chat/overlay.d.ts +0 -32
  175. package/dist/chat/overlay.d.ts.map +0 -1
  176. package/dist/chat/overlay.js +0 -103
  177. package/dist/chat/parts.d.ts +0 -58
  178. package/dist/chat/parts.d.ts.map +0 -1
  179. package/dist/chat/parts.js +0 -120
  180. package/dist/chat/pieces.d.ts +0 -62
  181. package/dist/chat/pieces.d.ts.map +0 -1
  182. package/dist/chat/pieces.js +0 -1110
  183. package/dist/chat/process.d.ts +0 -20
  184. package/dist/chat/process.d.ts.map +0 -1
  185. package/dist/chat/process.js +0 -32
  186. package/dist/chat/provider.d.ts +0 -70
  187. package/dist/chat/provider.d.ts.map +0 -1
  188. package/dist/chat/provider.js +0 -635
  189. package/dist/chat/question.d.ts +0 -9
  190. package/dist/chat/question.d.ts.map +0 -1
  191. package/dist/chat/question.js +0 -69
  192. package/dist/chat/questions.d.ts +0 -31
  193. package/dist/chat/questions.d.ts.map +0 -1
  194. package/dist/chat/questions.js +0 -111
  195. package/dist/chat/read.d.ts +0 -5
  196. package/dist/chat/read.d.ts.map +0 -1
  197. package/dist/chat/read.js +0 -13
  198. package/dist/chat/ready.d.ts +0 -37
  199. package/dist/chat/ready.d.ts.map +0 -1
  200. package/dist/chat/ready.js +0 -93
  201. package/dist/chat/room-file.d.ts +0 -8
  202. package/dist/chat/room-file.d.ts.map +0 -1
  203. package/dist/chat/room-file.js +0 -72
  204. package/dist/chat/steady.d.ts +0 -3
  205. package/dist/chat/steady.d.ts.map +0 -1
  206. package/dist/chat/steady.js +0 -26
  207. package/dist/chat/style.d.ts +0 -4
  208. package/dist/chat/style.d.ts.map +0 -1
  209. package/dist/chat/style.js +0 -307
  210. package/dist/chat.d.ts +0 -15
  211. package/dist/chat.d.ts.map +0 -1
  212. package/dist/chat.js +0 -8
  213. package/dist/fulltext.d.ts +0 -27
  214. package/dist/fulltext.d.ts.map +0 -1
  215. package/dist/fulltext.js +0 -368
  216. package/dist/reads.d.ts +0 -11
  217. package/dist/reads.d.ts.map +0 -1
  218. package/dist/reads.js +0 -98
  219. package/dist/words.d.ts +0 -19
  220. package/dist/words.d.ts.map +0 -1
  221. package/dist/words.js +0 -150
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,13 +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 = [];
57
+ const attached = new Map();
58
+ const linked = new WeakMap();
59
+ const carried = new Map();
61
60
  let expiring = [];
61
+ let openings = 0;
62
+ const declaredRooms = new Set();
62
63
  let replicated = [];
64
+ let heldCursor = null;
63
65
  let issued = 0;
64
66
  function scriptConversations(entries) {
65
67
  scripted.clear();
@@ -87,6 +89,19 @@ export function createMemoryAdapter(options = {}) {
87
89
  const wanted = ordinals.get(`${locator}\u0000${target}`);
88
90
  return held !== undefined && wanted !== undefined && held >= wanted;
89
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
+ }
90
105
  function retain(entries) {
91
106
  for (const room of entries) {
92
107
  note(room.locator, room);
@@ -141,7 +156,7 @@ export function createMemoryAdapter(options = {}) {
141
156
  ...(folderRemovals.length === 0 ? {} : { folderRemovals }),
142
157
  };
143
158
  }
144
- function advancement(room, from, at) {
159
+ function advancement(room, from, at, whole = false) {
145
160
  const current = room.documents ?? {};
146
161
  const previous = from.documents ?? {};
147
162
  const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
@@ -152,7 +167,7 @@ export function createMemoryAdapter(options = {}) {
152
167
  const changed = Object.keys(current)
153
168
  .filter((path) => current[path] !== previous[path] || headMoved(path))
154
169
  .sort();
155
- const size = pageSize ?? changed.length;
170
+ const size = whole ? changed.length : (pageSize ?? changed.length);
156
171
  const taken = changed.slice(at, at + size);
157
172
  const next = at + taken.length;
158
173
  const opening = at === 0;
@@ -184,6 +199,26 @@ export function createMemoryAdapter(options = {}) {
184
199
  ...(pageToken === undefined ? {} : { pageToken }),
185
200
  };
186
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
+ }
187
222
  function pageOf(conversation, after) {
188
223
  const messages = conversation.messages ?? [];
189
224
  const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
@@ -198,16 +233,13 @@ export function createMemoryAdapter(options = {}) {
198
233
  : {}),
199
234
  };
200
235
  }
201
- function historiesOf(input) {
202
- const asked = input?.conversations;
203
- if (!Array.isArray(asked))
204
- return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
236
+ function historiesOf(request) {
205
237
  const histories = [];
206
- for (const entry of asked) {
207
- 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);
208
240
  if (conversation === undefined)
209
241
  continue;
210
- const outcome = conversation.outcomes?.['conversation.history'];
242
+ const outcome = conversation.outcomes?.history;
211
243
  if (outcome !== undefined)
212
244
  return outcome;
213
245
  histories.push(pageOf(conversation, entry.after));
@@ -218,15 +250,13 @@ export function createMemoryAdapter(options = {}) {
218
250
  function conversationAction(request) {
219
251
  const name = request.name;
220
252
  const input = (request.input ?? {});
221
- if (name === 'conversation.history')
222
- return historiesOf(request.input);
223
- if (name === 'conversation.create') {
253
+ if (name === 'conversations/create') {
224
254
  issued += 1;
225
255
  const conversation = `conversation-${issued}`;
226
256
  scripted.set(conversation, { conversation });
227
- return { kind: 'action', result: { conversation } };
257
+ return { kind: 'action', result: { conversation_id: conversation } };
228
258
  }
229
- const named = typeof input.conversation === 'string' ? input.conversation : '';
259
+ const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
230
260
  const conversation = scripted.get(named);
231
261
  if (conversation === undefined) {
232
262
  return {
@@ -239,34 +269,28 @@ export function createMemoryAdapter(options = {}) {
239
269
  const outcome = conversation.outcomes?.[name];
240
270
  if (outcome !== undefined)
241
271
  return outcome;
242
- if (name === 'conversation.send') {
272
+ if (name === 'conversations/send') {
243
273
  const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
244
274
  const answered = operation === null ? undefined : sentTurns.get(operation);
245
275
  if (answered !== undefined)
246
- return { kind: 'action', result: { turn: answered } };
276
+ return { kind: 'action', result: { message_id: answered } };
247
277
  issued += 1;
248
278
  const turn = `turn-${issued}`;
249
- unsealed.set(turn, named);
250
279
  if (operation !== null)
251
280
  sentTurns.set(operation, turn);
252
- return { kind: 'action', result: { turn } };
281
+ return { kind: 'action', result: { message_id: turn } };
253
282
  }
254
- if (name === 'conversation.cancel') {
255
- const turn = typeof input.turn === 'string' ? input.turn : '';
256
- if (sealed.has(turn) || !unsealed.has(turn)) {
257
- return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
258
- }
259
- unsealed.delete(turn);
260
- return { kind: 'action', result: { turn, cancelled: true } };
261
- }
262
- if (name === 'conversation.delete')
283
+ if (name === 'conversations/delete')
263
284
  scripted.delete(named);
264
- return { kind: 'action', result: { conversation: named } };
285
+ return { kind: 'action', result: { conversation_id: named } };
265
286
  }
266
287
  function announceList() {
267
- const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined ? [] : [{ conversation, ...listed }]);
268
- for (const listener of listeners)
269
- 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
+ }
270
294
  }
271
295
  function discovery() {
272
296
  return {
@@ -278,8 +302,42 @@ export function createMemoryAdapter(options = {}) {
278
302
  ...(options.member === undefined ? {} : { member: options.member }),
279
303
  };
280
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
+ }
281
338
  return {
282
- ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
339
+ ...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
340
+ ...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
283
341
  setRooms(next) {
284
342
  rooms = [...next];
285
343
  retain(rooms);
@@ -288,33 +346,37 @@ export function createMemoryAdapter(options = {}) {
288
346
  scriptConversations(next);
289
347
  },
290
348
  open() {
349
+ carried.clear();
291
350
  announceList();
292
- for (const observer of observers)
293
- observer({ kind: 'opened' });
351
+ opened(emitAll);
294
352
  },
295
- close({ revoked = false, lost = !revoked } = {}) {
296
- for (const observer of observers)
297
- observer({ kind: 'closed', revoked, lost });
353
+ close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
354
+ openings += 1;
355
+ carried.clear();
356
+ emitAll({ kind: 'closed', revoked, lost, authorityChanged });
298
357
  },
299
358
  expire(locators) {
300
359
  expiring = [...locators];
301
360
  },
302
- notifyRoomVersion({ locator, roomVersion }) {
303
- for (const observer of observers)
304
- observer({ kind: 'room-version', locator, roomVersion });
361
+ notifyRoomVersion({ locator }) {
362
+ carry(locator);
305
363
  },
306
- notifyAuthorityChanged(scope) {
307
- for (const observer of observers) {
308
- observer(scope === undefined
309
- ? { kind: 'authority-changed' }
310
- : { kind: 'authority-changed', scope });
311
- }
364
+ notifyAuthorityChanged(locators) {
365
+ const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
366
+ const listed = rooms.filter((room) => named.has(room.locator));
367
+ const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
368
+ for (const room of listed)
369
+ declaredRooms.add(room.locator);
370
+ for (const locator of left)
371
+ declaredRooms.delete(locator);
372
+ emitAll({
373
+ kind: 'authority-changed',
374
+ rooms: listed.map(declared),
375
+ left,
376
+ ...(options.member === undefined ? {} : { member: options.member }),
377
+ });
312
378
  },
313
379
  notifyConversation(event) {
314
- if (event.kind === 'accepted-message') {
315
- sealed.add(event.message.turn);
316
- unsealed.delete(event.message.turn);
317
- }
318
380
  for (const listener of listeners)
319
381
  listener(event);
320
382
  },
@@ -323,21 +385,31 @@ export function createMemoryAdapter(options = {}) {
323
385
  observer(mode);
324
386
  },
325
387
  heldRooms() {
326
- return held;
388
+ return [...carried.keys()].sort();
327
389
  },
328
390
  replicatedConversations() {
329
391
  return replicated;
330
392
  },
393
+ heldConversationCursor() {
394
+ return heldCursor;
395
+ },
331
396
  conversations: {
332
397
  replicate(next) {
333
398
  replicated = [...next];
334
399
  },
400
+ hold(cursor) {
401
+ heldCursor = cursor;
402
+ },
335
403
  observe(notify) {
336
404
  listeners.add(notify);
337
405
  return () => {
338
406
  listeners.delete(notify);
339
407
  };
340
408
  },
409
+ history: (request) => Promise.resolve(historiesOf(request)),
410
+ ...(options.agents === undefined
411
+ ? {}
412
+ : { agents: () => Promise.resolve(structuredClone(options.agents)) }),
341
413
  },
342
414
  serviceMode: {
343
415
  observe(notify) {
@@ -349,44 +421,45 @@ export function createMemoryAdapter(options = {}) {
349
421
  },
350
422
  roomStream: {
351
423
  hold(asked) {
352
- held = asked.map((room) => room.locator);
353
- const expired = expiring.filter((locator) => held.includes(locator));
354
- expiring = [];
355
- const moved = asked.flatMap((room) => {
424
+ const named = asked.map((room) => room.locator);
425
+ const unknown = asked.flatMap((room) => {
356
426
  const current = rooms.find((entry) => entry.locator === room.locator);
357
427
  return current === undefined ||
358
- expired.includes(room.locator) ||
359
- current.roomVersion === room.roomVersion
428
+ current.roomVersion === room.roomVersion ||
429
+ served.get(room.locator)?.has(room.roomVersion) === true
360
430
  ? []
361
- : [{ locator: room.locator, roomVersion: current.roomVersion }];
362
- });
363
- queueMicrotask(() => {
364
- for (const observer of observers) {
365
- for (const room of moved)
366
- observer({ kind: 'room-version', ...room });
367
- observer({ kind: 'opening', expired });
368
- }
431
+ : [room.locator];
369
432
  });
370
- },
371
- reopen() {
433
+ const expired = [
434
+ ...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
435
+ ];
436
+ expiring = expiring.filter((locator) => !named.includes(locator));
372
437
  queueMicrotask(() => {
373
- for (const observer of observers) {
374
- observer({ kind: 'closed', revoked: false, lost: false });
438
+ for (const room of asked) {
439
+ if (expired.includes(room.locator))
440
+ carried.delete(room.locator);
441
+ else {
442
+ carried.set(room.locator, room.roomVersion);
443
+ carry(room.locator);
444
+ }
375
445
  }
446
+ emitAll({ kind: 'caught-up', expired });
376
447
  });
377
448
  },
378
- published() { },
379
449
  observe(notify) {
380
450
  observers.add(notify);
381
451
  queueMicrotask(() => {
382
452
  if (!observers.has(notify))
383
453
  return;
384
454
  if (options.unopened === true) {
385
- notify({ kind: 'closed', revoked: false, lost: true });
455
+ notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
386
456
  return;
387
457
  }
388
458
  announceList();
389
- notify({ kind: 'opened' });
459
+ opened((event) => {
460
+ if (observers.has(notify))
461
+ notify(event);
462
+ });
390
463
  });
391
464
  return () => {
392
465
  observers.delete(notify);
@@ -403,12 +476,7 @@ export function createMemoryAdapter(options = {}) {
403
476
  return resolveScript(scripts.authorize, () => ({}), undefined);
404
477
  },
405
478
  async discover(_authorization) {
406
- return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
407
- if (answer.kind === 'discovery')
408
- for (const room of answer.rooms)
409
- note(room.locator, room);
410
- return answer;
411
- });
479
+ return discovered();
412
480
  },
413
481
  reached,
414
482
  follows(locator, roomVersion, next) {
@@ -487,32 +555,42 @@ export function createMemoryAdapter(options = {}) {
487
555
  },
488
556
  async binary(_authorization, request) {
489
557
  return resolveScript(scripts.binary, () => {
490
- if (request.kind === 'reference') {
491
- return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
492
- }
493
558
  const room = rooms.find((entry) => entry.locator === request.locator);
494
559
  if (room === undefined)
495
560
  return { kind: 'room-not-readable', locator: request.locator };
496
- const blob = room.blobs?.[request.path];
561
+ const blob = heldBlob(room, request.path);
497
562
  return blob === undefined
498
563
  ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
499
564
  : { kind: 'binary', body: blob.stream(), mediaType: blob.type };
500
565
  }, request);
501
566
  },
502
567
  async link(_authorization, request) {
503
- return resolveScript(scripts.link, () => ({ kind: 'rejected', code: 'unscripted-link', fields: {}, retryable: false }), request);
568
+ return resolveScript(scripts.link, () => {
569
+ const room = rooms.find((entry) => entry.locator === request.locator);
570
+ if (room === undefined)
571
+ return { kind: 'room-not-readable', locator: request.locator };
572
+ const blob = heldBlob(room, request.path);
573
+ if (blob === undefined) {
574
+ return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
575
+ }
576
+ const url = linked.get(blob) ?? URL.createObjectURL(blob);
577
+ linked.set(blob, url);
578
+ return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
579
+ }, request);
504
580
  },
505
- referrerScope(referrer) {
506
- if (typeof referrer !== 'object' || referrer === null)
507
- return null;
508
- const { room, path } = referrer;
509
- if (typeof room !== 'string')
510
- return null;
511
- return { locator: room, ...(typeof path === 'string' ? { path } : {}) };
581
+ async attach(_authorization, request) {
582
+ return resolveScript(scripts.attach, () => {
583
+ const room = rooms.find((entry) => entry.locator === request.locator);
584
+ if (room === undefined)
585
+ return { kind: 'room-not-readable', locator: request.locator };
586
+ const path = freePath(room, request.name);
587
+ attached.set(`${room.locator}\u0000${path}`, request.blob);
588
+ return { kind: 'attached', path, revision: `attached-${attached.size}` };
589
+ }, request);
512
590
  },
513
591
  async action(_authorization, request) {
514
592
  return resolveScript(scripts.action, () => {
515
- if (request.name.startsWith('conversation.'))
593
+ if (request.name.startsWith('conversations/'))
516
594
  return conversationAction(request);
517
595
  return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
518
596
  }, request).then((answer) => {
@@ -20,8 +20,8 @@ export type ConversationWrite = {
20
20
  };
21
21
  export declare function heldConversations(connection: Connection): HeldConversation[];
22
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;
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
25
  export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
26
26
  export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
27
27
  export declare function forgottenMessages(connection: Connection): void;
@@ -1 +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"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,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"}
package/dist/messages.js CHANGED
@@ -1,4 +1,4 @@
1
- import { indexMessage, unindexMessages } from './fulltext.js';
1
+ import { sql } from '@agentshouse/mdmodel';
2
2
  export const MESSAGE_TABLES = [
3
3
  'CREATE TABLE conversation_reads (conversation TEXT PRIMARY KEY, read TEXT, partial INTEGER NOT NULL) WITHOUT ROWID',
4
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)',
@@ -36,17 +36,12 @@ export function keptMessages(connection, { conversation, messages, read }) {
36
36
  JSON.stringify(message.message ?? null),
37
37
  message.text,
38
38
  ];
39
- let id;
40
39
  if (held === undefined) {
41
40
  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
41
  }
44
42
  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]);
43
+ connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, held.id]);
48
44
  }
49
- indexMessage(connection, id, message.text);
50
45
  }
51
46
  if (read !== undefined) {
52
47
  connection.run('INSERT OR REPLACE INTO conversation_reads (conversation, read, partial) VALUES (?, ?, ?)', [conversation, read.at, read.partial ? 1 : 0]);
@@ -62,14 +57,21 @@ function accepted(row) {
62
57
  message: JSON.parse(text(row.message)),
63
58
  };
64
59
  }
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]);
60
+ function holding(phrase) {
61
+ return phrase === null
62
+ ? { sql: '', bind: [] }
63
+ : { sql: ` AND ${sql.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]);
69
70
  return { messages: rows.slice(0, limit).map(accepted).reverse(), more: rows.length > limit };
70
71
  }
71
- export function messageCount(connection, conversation) {
72
- const [counted] = connection.rows('SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?', [conversation]);
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]);
73
75
  return Number(counted?.held ?? 0);
74
76
  }
75
77
  export function turnArrived(connection, conversation, turn) {
@@ -77,9 +79,6 @@ export function turnArrived(connection, conversation, turn) {
77
79
  }
78
80
  export function droppedMessages(connection, conversations) {
79
81
  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
82
  connection.run('DELETE FROM conversation_messages WHERE conversation = ?', [conversation]);
84
83
  connection.run('DELETE FROM conversation_reads WHERE conversation = ?', [conversation]);
85
84
  }
package/dist/model.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Definition, ValueFacts, VerifiedModel } from '@agentshouse/mdmodel';
1
+ import type { Definition, VerifiedModel } from '@agentshouse/mdmodel';
2
2
  import type { Open } from './open.js';
3
3
  export type ModelIdentity = {
4
4
  identity: string;
@@ -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,7 @@ 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
- export declare function referenceField(facts: ValueFacts | undefined): boolean;
58
62
  //# 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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"}
package/dist/model.js CHANGED
@@ -14,24 +14,18 @@ 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
  }
23
29
  export function sameModel(left, right) {
24
30
  return left.identity === right.identity && left.version === right.version;
25
31
  }
26
- export function sameTyping(left, right) {
27
- if (left === right)
28
- return true;
29
- if (left.status === 'unavailable' || right.status === 'unavailable') {
30
- return left.status === right.status;
31
- }
32
- return (left.snapshot.schema === right.snapshot.schema &&
33
- sameModel(left.verifiedWith, right.verifiedWith));
34
- }
35
- export function referenceField(facts) {
36
- return facts?.reference !== undefined || facts?.items?.reference !== undefined;
37
- }
@@ -27,8 +27,8 @@ export declare function rowsOf(result: QueryResult): readonly (QueryDocument | Q
27
27
  export declare function whole(message: QueryMessage): message is KeyedResult;
28
28
  export declare function applied(keyed: KeyedResult, message: QueryMessage): KeyedResult;
29
29
  export declare function observed(first: unknown, stop: () => void, keyed: boolean): Observed;
30
- export declare function opened(watch: (deliver: (message: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
31
- export declare function observing<Topic extends string>(watch: (topic: Topic, input: readonly unknown[], deliver: (message: unknown) => void) => () => void): (topic: Topic, ...input: unknown[]) => Promise<Observation<unknown>>;
30
+ export declare function opened(watch: (deliver: (message: unknown) => void, fail: (error: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
31
+ export declare function observing<Topic extends string>(watch: (topic: Topic, input: readonly unknown[], deliver: (message: unknown) => void, fail: (error: unknown) => void) => () => void): (topic: Topic, ...input: unknown[]) => Promise<Observation<unknown>>;
32
32
  export type Digest = {
33
33
  readonly pending: string;
34
34
  } | {
@@ -38,6 +38,7 @@ export type Digest = {
38
38
  readonly next: string | undefined;
39
39
  readonly total: number | undefined;
40
40
  };
41
+ export declare function hashed(text: string): number;
41
42
  export declare function digestOf({ result, keys }: KeyedResult): Digest;
42
43
  export declare function digestApplied(digest: Digest, message: QueryMessage): Digest;
43
44
  export declare function changeOf(previous: Digest, next: KeyedResult): QueryMessage | null;
@@ -1 +1 @@
1
- {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"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"}