@agentshouse/mdruntime 0.1.0-ca6edc1abd618 → 0.1.0-ca92b54804c33

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 (149) hide show
  1. package/README.md +2 -2
  2. package/dist/adapter.d.ts +101 -70
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +3 -10
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +29 -47
  7. package/dist/bootstrap.d.ts +16 -14
  8. package/dist/bootstrap.d.ts.map +1 -1
  9. package/dist/bootstrap.js +272 -129
  10. package/dist/chain.d.ts +2 -1
  11. package/dist/chain.d.ts.map +1 -1
  12. package/dist/change.d.ts +1 -0
  13. package/dist/change.d.ts.map +1 -1
  14. package/dist/client.d.ts +13 -9
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +54 -6
  17. package/dist/collection.d.ts +7 -4
  18. package/dist/collection.d.ts.map +1 -1
  19. package/dist/collection.js +23 -17
  20. package/dist/compile.d.ts +1 -6
  21. package/dist/compile.d.ts.map +1 -1
  22. package/dist/compile.js +108 -243
  23. package/dist/connection.d.ts +14 -11
  24. package/dist/connection.d.ts.map +1 -1
  25. package/dist/connection.js +2264 -1933
  26. package/dist/context.d.ts +2 -0
  27. package/dist/context.d.ts.map +1 -0
  28. package/dist/context.js +7 -0
  29. package/dist/conversation.d.ts +21 -17
  30. package/dist/conversation.d.ts.map +1 -1
  31. package/dist/conversation.js +405 -253
  32. package/dist/durability.d.ts +6 -1
  33. package/dist/durability.d.ts.map +1 -1
  34. package/dist/entry.d.ts +3 -2
  35. package/dist/entry.d.ts.map +1 -1
  36. package/dist/entry.js +18 -8
  37. package/dist/file.d.ts +2 -11
  38. package/dist/file.d.ts.map +1 -1
  39. package/dist/file.js +6 -4
  40. package/dist/host.d.ts +3 -7
  41. package/dist/host.d.ts.map +1 -1
  42. package/dist/host.js +26 -29
  43. package/dist/identity.d.ts +0 -1
  44. package/dist/identity.d.ts.map +1 -1
  45. package/dist/identity.js +0 -3
  46. package/dist/index.d.ts +12 -9
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +4 -1
  49. package/dist/job.d.ts +14 -0
  50. package/dist/job.d.ts.map +1 -0
  51. package/dist/job.js +28 -0
  52. package/dist/live.d.ts +5 -4
  53. package/dist/live.d.ts.map +1 -1
  54. package/dist/live.js +62 -20
  55. package/dist/media.d.ts +8 -0
  56. package/dist/media.d.ts.map +1 -0
  57. package/dist/media.js +218 -0
  58. package/dist/memory.d.ts +12 -5
  59. package/dist/memory.d.ts.map +1 -1
  60. package/dist/memory.js +216 -85
  61. package/dist/messages.d.ts +3 -3
  62. package/dist/messages.d.ts.map +1 -1
  63. package/dist/messages.js +20 -19
  64. package/dist/model.d.ts +8 -10
  65. package/dist/model.d.ts.map +1 -1
  66. package/dist/model.js +5 -17
  67. package/dist/observation.d.ts +3 -2
  68. package/dist/observation.d.ts.map +1 -1
  69. package/dist/observation.js +8 -3
  70. package/dist/outcome.d.ts +13 -5
  71. package/dist/outcome.d.ts.map +1 -1
  72. package/dist/outcome.js +16 -2
  73. package/dist/overlay.d.ts +1 -0
  74. package/dist/overlay.d.ts.map +1 -1
  75. package/dist/overlay.js +11 -0
  76. package/dist/paths.d.ts +1 -0
  77. package/dist/paths.d.ts.map +1 -1
  78. package/dist/paths.js +4 -0
  79. package/dist/query.d.ts +8 -207
  80. package/dist/query.d.ts.map +1 -1
  81. package/dist/query.js +3 -505
  82. package/dist/reach.d.ts +18 -11
  83. package/dist/reach.d.ts.map +1 -1
  84. package/dist/reach.js +195 -126
  85. package/dist/react.d.ts +3 -1
  86. package/dist/react.d.ts.map +1 -1
  87. package/dist/readiness.d.ts +3 -17
  88. package/dist/readiness.d.ts.map +1 -1
  89. package/dist/readiness.js +4 -10
  90. package/dist/recovery.d.ts +1 -0
  91. package/dist/recovery.d.ts.map +1 -1
  92. package/dist/recovery.js +35 -1
  93. package/dist/refresh.d.ts +7 -5
  94. package/dist/refresh.d.ts.map +1 -1
  95. package/dist/refresh.js +33 -5
  96. package/dist/replica.d.ts +10 -8
  97. package/dist/replica.d.ts.map +1 -1
  98. package/dist/replica.js +52 -20
  99. package/dist/room-draft.d.ts +21 -5
  100. package/dist/room-draft.d.ts.map +1 -1
  101. package/dist/room-draft.js +98 -51
  102. package/dist/rows.d.ts +18 -16
  103. package/dist/rows.d.ts.map +1 -1
  104. package/dist/rows.js +45 -153
  105. package/dist/save.d.ts +2 -0
  106. package/dist/save.d.ts.map +1 -1
  107. package/dist/save.js +22 -13
  108. package/dist/search.d.ts +12 -63
  109. package/dist/search.d.ts.map +1 -1
  110. package/dist/search.js +9 -52
  111. package/dist/shared.d.ts +0 -1
  112. package/dist/shared.d.ts.map +1 -1
  113. package/dist/shared.js +0 -10
  114. package/dist/status.d.ts +4 -5
  115. package/dist/status.d.ts.map +1 -1
  116. package/dist/status.js +3 -7
  117. package/dist/store.d.ts +101 -61
  118. package/dist/store.d.ts.map +1 -1
  119. package/dist/store.js +153 -161
  120. package/dist/stored.d.ts +66 -55
  121. package/dist/stored.d.ts.map +1 -1
  122. package/dist/stored.js +341 -273
  123. package/dist/tables.d.ts +90 -63
  124. package/dist/tables.d.ts.map +1 -1
  125. package/dist/tables.js +174 -98
  126. package/dist/transfer.d.ts +0 -5
  127. package/dist/transfer.d.ts.map +1 -1
  128. package/dist/validation.d.ts +3 -4
  129. package/dist/validation.d.ts.map +1 -1
  130. package/dist/validation.js +42 -100
  131. package/dist/windows.d.ts +1 -12
  132. package/dist/windows.d.ts.map +1 -1
  133. package/dist/windows.js +2 -75
  134. package/dist/wire.d.ts +17 -8
  135. package/dist/wire.d.ts.map +1 -1
  136. package/dist/wire.js +5 -2
  137. package/package.json +2 -2
  138. package/dist/fence.d.ts +0 -6
  139. package/dist/fence.d.ts.map +0 -1
  140. package/dist/fence.js +0 -10
  141. package/dist/fulltext.d.ts +0 -27
  142. package/dist/fulltext.d.ts.map +0 -1
  143. package/dist/fulltext.js +0 -368
  144. package/dist/reads.d.ts +0 -11
  145. package/dist/reads.d.ts.map +0 -1
  146. package/dist/reads.js +0 -100
  147. package/dist/words.d.ts +0 -19
  148. package/dist/words.d.ts.map +0 -1
  149. package/dist/words.js +0 -150
package/dist/tables.js CHANGED
@@ -1,11 +1,15 @@
1
+ import { sql } from '@agentshouse/mdmodel';
1
2
  import { answerQuery } from './compile.js';
2
- import { searched, SEARCH_TABLES } from './fulltext.js';
3
3
  import { droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
4
- import { abandon, release, commit, counts, ended, entries, erase, fenceRooms, files, opened, rederive, referrers, refreshing, REPLICA_TABLES, keepPart, stage, transferPart, typed, typedWithin, unrefresh, walk, } from './stored.js';
4
+ import { abandon, release, commit, covering, demoted, ended, entries, erase, facts, fenceRooms, folders, heldLocators, heldRoom, heldRooms, offlineMode, opened, overlaid, presentation, rederive, referrers, refreshing, REPLICA_TABLES, resume, stage, typed, stagedLocators, typedWithin, unrefresh, } from './stored.js';
5
5
  const STATEMENTS_HELD = 256;
6
6
  export function sqliteConnection(engine, database) {
7
7
  const decoder = new TextDecoder();
8
8
  const held = new Map();
9
+ database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
10
+ arity: 2,
11
+ deterministic: true,
12
+ });
9
13
  function prepared(sql) {
10
14
  if (sql.includes(';'))
11
15
  return null;
@@ -72,7 +76,7 @@ const TABLES = [
72
76
  ['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
73
77
  [
74
78
  'authored_pending',
75
- 'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, PRIMARY KEY (locator, id)',
79
+ 'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, paths TEXT NOT NULL, moving INTEGER NOT NULL, PRIMARY KEY (locator, id)',
76
80
  ],
77
81
  [
78
82
  'authored_room_drafts',
@@ -89,32 +93,39 @@ export const RUNTIME_TABLES = [
89
93
  'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
90
94
  ...REPLICA_TABLES,
91
95
  ...MESSAGE_TABLES,
92
- ...SEARCH_TABLES,
93
96
  ];
94
97
  const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
95
98
  const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
96
99
  const UNOWNED_PARTS = `DELETE FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS} UNION SELECT key FROM opened_files)`;
97
100
  const READS = new Set([
98
- 'authored.queues',
101
+ 'authored.status',
102
+ 'authored.moving',
103
+ 'authored.pending',
104
+ 'authored.batch',
105
+ 'authored.order',
106
+ 'authored.queued',
99
107
  'authored.roomDrafts',
108
+ 'authored.chatDraft.read',
100
109
  'authored.chatDrafts',
101
110
  'authored.calls',
102
111
  'authored.fences',
112
+ 'authored.unsent',
103
113
  'authored.fact',
104
114
  'authored.file',
105
115
  'replica.open',
116
+ 'replica.rooms',
117
+ 'replica.room',
118
+ 'replica.covering',
119
+ 'replica.offline',
120
+ 'replica.held',
121
+ 'replica.facts',
122
+ 'replica.presentation',
106
123
  'replica.query',
107
124
  'replica.entries',
108
125
  'replica.typed',
109
126
  'replica.referrers',
110
- 'replica.walk',
111
- 'replica.files',
127
+ 'replica.folders',
112
128
  'replica.typedWithin',
113
- 'replica.counts',
114
- 'replica.search',
115
- 'replica.received',
116
- 'replica.receivedParts',
117
- 'replica.transferPart',
118
129
  'opened.find',
119
130
  'file.part',
120
131
  'conversation.held',
@@ -132,19 +143,19 @@ const KINDS = new Set([
132
143
  'authored.claim',
133
144
  'authored.end',
134
145
  'replica.stage',
135
- 'replica.keepPart',
146
+ 'replica.resume',
136
147
  'replica.refresh',
137
148
  'replica.unrefresh',
138
149
  'replica.commit',
139
150
  'replica.fence',
140
151
  'replica.erase',
141
152
  'replica.abandon',
153
+ 'replica.unfence',
142
154
  'replica.release',
143
155
  'replica.rederive',
156
+ 'replica.demote',
144
157
  'replica.fact',
145
158
  'replica.present',
146
- 'replica.receive',
147
- 'replica.unreceive',
148
159
  'opened.begin',
149
160
  'opened.part',
150
161
  'opened.keep',
@@ -225,29 +236,71 @@ function unowned(connection) {
225
236
  connection.run(UNOWNED_PARTS);
226
237
  }
227
238
  function queued(connection) {
239
+ return connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
240
+ locator: text(row.locator),
241
+ ids: JSON.parse(text(row.ids)),
242
+ }));
243
+ }
244
+ function heldWork(connection, locator) {
245
+ const room = heldRoom(connection, locator);
246
+ const pending = new Map(connection
247
+ .rows('SELECT id, batch, state FROM authored_pending WHERE locator = ?', [locator])
248
+ .map((row) => [
249
+ text(row.id),
250
+ { id: text(row.id), batch: text(row.batch), state: text(row.state) },
251
+ ]));
228
252
  return {
229
- queues: connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
230
- locator: text(row.locator),
231
- ids: JSON.parse(text(row.ids)),
232
- })),
233
- pending: connection
234
- .rows('SELECT locator, id, batch, state FROM authored_pending')
235
- .map((row) => ({
236
- locator: text(row.locator),
237
- id: text(row.id),
238
- batch: text(row.batch),
239
- state: text(row.state),
240
- })),
253
+ room: room === null ? null : { ...room, overlaid: overlaid(connection, room.key) },
254
+ queue: heldOrder(connection, locator).map((id) => {
255
+ const held = pending.get(id);
256
+ if (held === undefined)
257
+ throw new Error(`Missing Pending Change ${locator}/${id}`);
258
+ return held;
259
+ }),
260
+ };
261
+ }
262
+ function status(connection) {
263
+ const [completed] = connection.rows("SELECT value FROM replica_facts WHERE name = 'lastCompleted'");
264
+ return {
265
+ queued: texts(connection.rows('SELECT locator FROM authored_queues'), 'locator'),
266
+ lastCompleted: completed === undefined ? null : text(completed.value),
267
+ changes: connection
268
+ .rows('SELECT p.locator, c.value AS path FROM authored_pending p, json_each(p.paths) c')
269
+ .map((row) => ({ locator: text(row.locator), path: text(row.path) })),
270
+ resets: connection
271
+ .rows(`SELECT locator, json_extract(state, '$.submission.reset') AS reset FROM authored_pending
272
+ WHERE json_extract(state, '$.submission.state') = 'reset'`)
273
+ .map((row) => ({ locator: text(row.locator), reset: text(row.reset) })),
274
+ returned: texts(connection.rows(`SELECT record FROM authored_room_drafts WHERE json_type(record, '$.returned') = 'object'`), 'record'),
275
+ };
276
+ }
277
+ function pendingOf(connection, locator, id) {
278
+ const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
279
+ return {
280
+ state: held === undefined ? null : text(held.state),
281
+ room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
241
282
  };
242
283
  }
284
+ function roomDraftRecords(connection, locator, paths) {
285
+ if (locator === null) {
286
+ return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
287
+ }
288
+ if (paths === null) {
289
+ return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ?', [locator]), 'record');
290
+ }
291
+ return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ? AND path IN (SELECT value FROM json_each(?))', [locator, JSON.stringify(paths)]), 'record');
292
+ }
293
+ function chatDraftRecord(connection, conversation) {
294
+ const [held] = connection.rows('SELECT record FROM authored_chat_drafts WHERE conversation = ?', [
295
+ conversation,
296
+ ]);
297
+ return held === undefined ? null : text(held.record);
298
+ }
243
299
  function heldOrder(connection, locator) {
244
300
  const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
245
301
  return held === undefined ? [] : JSON.parse(text(held.ids));
246
302
  }
247
- function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts, amendments }) {
248
- for (const { id, amendment } of amendments ?? []) {
249
- amended(connection, { kind: 'authored.amend', locator, id, amendment });
250
- }
303
+ function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts }) {
251
304
  for (const path of consumedRoomDrafts ?? []) {
252
305
  connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
253
306
  locator,
@@ -274,19 +327,26 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
274
327
  connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
275
328
  }
276
329
  }
277
- for (const { id, batch, state, files } of added ?? []) {
330
+ for (const { id, batch, state, files, paths, moving } of added ?? []) {
278
331
  if (before.has(id) || !after.has(id))
279
332
  continue;
280
- connection.run('INSERT OR REPLACE INTO authored_pending (locator, id, batch, state, files) VALUES (?, ?, ?, ?, ?)', [locator, id, batch, state, owned(files)]);
333
+ connection.run('INSERT OR REPLACE INTO authored_pending (locator, id, batch, state, files, paths, moving) VALUES (?, ?, ?, ?, ?, ?, ?)', [locator, id, batch, state, owned(files), JSON.stringify(paths), moving ? 1 : 0]);
281
334
  }
282
- for (const { id, batch, files } of founded ?? []) {
335
+ for (const { id, batch, files, paths, moving } of founded ?? []) {
283
336
  const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
284
337
  if (held === undefined || !before.has(id))
285
338
  continue;
286
- connection.run('UPDATE authored_pending SET batch = ?, files = ? WHERE locator = ? AND id = ?', [batch, owned([...JSON.parse(text(held.files)), ...files]), locator, id]);
339
+ connection.run('UPDATE authored_pending SET batch = ?, files = ?, paths = ?, moving = ? WHERE locator = ? AND id = ?', [
340
+ batch,
341
+ owned([...JSON.parse(text(held.files)), ...files]),
342
+ JSON.stringify(paths),
343
+ moving ? 1 : 0,
344
+ locator,
345
+ id,
346
+ ]);
287
347
  }
288
348
  }
289
- async function kept(connection, { writes, files, whole, discards }) {
349
+ async function kept(connection, { writes, files, whole }) {
290
350
  const refused = writes.find(({ locator }) => fenced(connection, locator));
291
351
  if (refused !== undefined && whole)
292
352
  return refused.locator;
@@ -295,8 +355,6 @@ async function kept(connection, { writes, files, whole, discards }) {
295
355
  if (!fenced(connection, write.locator))
296
356
  keptRows(connection, write);
297
357
  }
298
- for (const locator of discards ?? [])
299
- roomWork(connection, locator);
300
358
  unowned(connection);
301
359
  return refused?.locator ?? null;
302
360
  }
@@ -366,11 +424,15 @@ function fence(connection, locators) {
366
424
  return fenceRooms(connection, locators);
367
425
  }
368
426
  function erased(connection, { locator, limit }) {
369
- const done = erase(connection, locator, limit);
370
- if (locator !== null && !done.remaining) {
427
+ return erase(connection, locator, limit);
428
+ }
429
+ function unfenced(connection, locators) {
430
+ const erased = locators.filter((locator) => connection.rows('SELECT 1 FROM replica_erasing WHERE locator = ? LIMIT 1', [locator])
431
+ .length === 0);
432
+ for (const locator of erased) {
371
433
  connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
372
434
  }
373
- return done;
435
+ return erased;
374
436
  }
375
437
  function claim(connection, holder) {
376
438
  const held = fact(connection, 'holder');
@@ -449,6 +511,16 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
449
511
  unowned(connection);
450
512
  return true;
451
513
  }
514
+ const UNSENT = [
515
+ ['pending-change', 'authored_pending'],
516
+ ['call', 'authored_calls'],
517
+ ['room-draft', 'authored_room_drafts'],
518
+ ['chat-draft', 'authored_chat_drafts'],
519
+ ];
520
+ function unsent(connection) {
521
+ const [held] = connection.rows(`SELECT ${UNSENT.map(([kind, table]) => `(SELECT count(*) FROM ${table}) AS "${kind}"`).join(', ')}`);
522
+ return UNSENT.map(([kind]) => ({ kind, count: count(held?.[kind]) })).filter((work) => work.count > 0);
523
+ }
452
524
  function cleaned(connection) {
453
525
  connection.run('DELETE FROM opened_files');
454
526
  const [freed] = connection.rows(`SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS})`);
@@ -458,47 +530,51 @@ function cleaned(connection) {
458
530
  async function committed(connection, { authored, rooms }) {
459
531
  const refused = authored === undefined ? null : await kept(connection, authored);
460
532
  if (refused !== null && authored?.whole === true) {
461
- return { fenced: refused, counts: {}, changed: {}, indexed: {} };
533
+ return { fenced: refused, changed: {}, indexed: {} };
462
534
  }
463
535
  return {
464
536
  fenced: refused,
465
537
  ...commit(connection, rooms.filter(({ locator }) => !fenced(connection, locator))),
466
538
  };
467
539
  }
468
- function receivedParts(connection, key, count) {
469
- return connection
470
- .rows('SELECT value FROM replica_received_parts WHERE key = ? AND part < ? ORDER BY part', [
471
- key,
472
- count,
473
- ])
474
- .map((row) => JSON.parse(text(row.value)));
475
- }
476
- function receive(connection, { key, head, part }) {
477
- connection.run('INSERT OR REPLACE INTO replica_received (key, head) VALUES (?, ?)', [key, head]);
478
- if (part !== undefined) {
479
- connection.run('INSERT OR REPLACE INTO replica_received_parts (key, part, value) VALUES (?, ?, ?)', [key, part.index, part.value]);
480
- }
481
- return null;
482
- }
483
- function unreceive(connection, keys) {
484
- for (const key of keys) {
485
- connection.run('DELETE FROM replica_received WHERE key = ?', [key]);
486
- connection.run('DELETE FROM replica_received_parts WHERE key = ?', [key]);
487
- }
488
- return null;
489
- }
490
540
  export function answerRuntime(connection, request, spool) {
491
541
  switch (request.kind) {
492
- case 'authored.queues':
493
- return queued(connection);
542
+ case 'authored.status':
543
+ return status(connection);
544
+ case 'authored.moving':
545
+ return {
546
+ queues: queued(connection),
547
+ pending: connection
548
+ .rows('SELECT locator, id, batch, state FROM authored_pending WHERE moving = 1 ORDER BY locator')
549
+ .map((row) => ({
550
+ locator: text(row.locator),
551
+ id: text(row.id),
552
+ batch: text(row.batch),
553
+ state: text(row.state),
554
+ })),
555
+ };
556
+ case 'authored.pending':
557
+ return pendingOf(connection, request.locator, request.id);
558
+ case 'authored.batch': {
559
+ const [held] = connection.rows('SELECT batch FROM authored_pending WHERE locator = ? AND id = ?', [request.locator, request.id]);
560
+ return held === undefined ? null : text(held.batch);
561
+ }
562
+ case 'authored.order':
563
+ return heldOrder(connection, request.locator);
564
+ case 'authored.queued':
565
+ return texts(connection.rows('SELECT locator FROM authored_queues'), 'locator');
494
566
  case 'authored.roomDrafts':
495
- return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
567
+ return roomDraftRecords(connection, request.locator, request.paths);
568
+ case 'authored.chatDraft.read':
569
+ return chatDraftRecord(connection, request.conversation);
496
570
  case 'authored.chatDrafts':
497
571
  return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
498
572
  case 'authored.calls':
499
573
  return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
500
574
  case 'authored.fences':
501
575
  return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
576
+ case 'authored.unsent':
577
+ return unsent(connection);
502
578
  case 'authored.fact':
503
579
  return fact(connection, request.name);
504
580
  case 'authored.file':
@@ -519,6 +595,25 @@ export function answerRuntime(connection, request, spool) {
519
595
  return end(connection, request.holder);
520
596
  case 'replica.open':
521
597
  return opened(connection);
598
+ case 'replica.rooms':
599
+ return heldRooms(connection, request.locators);
600
+ case 'replica.room':
601
+ return heldWork(connection, request.locator);
602
+ case 'replica.covering':
603
+ return {
604
+ rooms: covering(connection),
605
+ queues: queued(connection),
606
+ };
607
+ case 'replica.offline':
608
+ return offlineMode(connection, request.locator);
609
+ case 'replica.held':
610
+ return { held: heldLocators(connection), staged: stagedLocators(connection) };
611
+ case 'replica.demote':
612
+ return demoted(connection);
613
+ case 'replica.facts':
614
+ return facts(connection);
615
+ case 'replica.presentation':
616
+ return presentation(connection, request.app);
522
617
  case 'replica.query':
523
618
  return answerQuery(connection, request.plan, request.rooms, request.budget);
524
619
  case 'replica.entries':
@@ -526,32 +621,15 @@ export function answerRuntime(connection, request, spool) {
526
621
  case 'replica.typed':
527
622
  return typed(connection, request.key, request.view, request.paths);
528
623
  case 'replica.referrers':
529
- return referrers(connection, request.key, request.view, request.targets, request.kinds);
530
- case 'replica.walk':
531
- return walk(connection, request.key, request.view, request.after, request.bytes);
532
- case 'replica.files':
533
- return files(connection, request.key, request.view, request.after, request.limit);
624
+ return referrers(connection, request.key, request.view, request.targets);
625
+ case 'replica.folders':
626
+ return folders(connection, request.key, request.view, request.paths);
534
627
  case 'replica.typedWithin':
535
628
  return typedWithin(connection, request.key, request.view, request.roots, request.within);
536
- case 'replica.counts':
537
- return counts(connection, request.rooms);
538
- case 'replica.search': {
539
- const { kind: _kind, ...ask } = request;
540
- return searched(connection, ask);
541
- }
542
- case 'replica.received':
543
- return connection.rows('SELECT key, head FROM replica_received').map((row) => ({
544
- key: text(row.key),
545
- head: JSON.parse(text(row.head)),
546
- }));
547
- case 'replica.receivedParts':
548
- return receivedParts(connection, request.key, request.count);
549
629
  case 'replica.stage':
550
630
  return fenced(connection, request.locator) ? null : stage(connection, request);
551
- case 'replica.transferPart':
552
- return transferPart(connection, request.locator, request.token);
553
- case 'replica.keepPart':
554
- return fenced(connection, request.locator) ? null : keepPart(connection, request);
631
+ case 'replica.resume':
632
+ return fenced(connection, request.locator) ? null : resume(connection, request);
555
633
  case 'replica.refresh':
556
634
  return refreshing(connection, request);
557
635
  case 'replica.unrefresh':
@@ -563,11 +641,13 @@ export function answerRuntime(connection, request, spool) {
563
641
  case 'replica.erase':
564
642
  return erased(connection, request);
565
643
  case 'replica.abandon':
566
- return abandon(connection, request.locator, request.kept);
644
+ return abandon(connection, request.locator);
645
+ case 'replica.unfence':
646
+ return unfenced(connection, request.locators);
567
647
  case 'replica.release':
568
648
  return release(connection, request.key);
569
649
  case 'replica.rederive':
570
- return rederive(connection, request.key, request.limit);
650
+ return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
571
651
  case 'replica.fact':
572
652
  connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
573
653
  request.name,
@@ -580,10 +660,6 @@ export function answerRuntime(connection, request, spool) {
580
660
  request.value,
581
661
  ]);
582
662
  return null;
583
- case 'replica.receive':
584
- return receive(connection, request);
585
- case 'replica.unreceive':
586
- return unreceive(connection, request.keys);
587
663
  case 'opened.find':
588
664
  return openedFile(connection, request);
589
665
  case 'opened.begin':
@@ -599,15 +675,15 @@ export function answerRuntime(connection, request, spool) {
599
675
  case 'file.part':
600
676
  return filePart(connection, request.key, request.part);
601
677
  case 'conversation.held':
602
- return heldConversations(connection);
678
+ return heldConversations(connection, request.conversations);
603
679
  case 'conversation.keep': {
604
680
  const { kind: _kind, ...write } = request;
605
681
  return keptMessages(connection, write);
606
682
  }
607
683
  case 'conversation.window':
608
- return messageWindow(connection, request.conversation, request.limit, request.before);
684
+ return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
609
685
  case 'conversation.count':
610
- return messageCount(connection, request.conversation);
686
+ return messageCount(connection, request.conversation, request.phrase);
611
687
  case 'conversation.turn':
612
688
  return turnArrived(connection, request.conversation, request.turn);
613
689
  case 'conversation.drop':
@@ -1,10 +1,5 @@
1
- import type { Refusal } from '@agentshouse/mdmodel';
2
1
  export type Unconfirmed = {
3
2
  kind: 'unconfirmed';
4
3
  };
5
- export type Refused = {
6
- kind: 'refused';
7
- refusal: Refusal;
8
- };
9
4
  export declare const unconfirmed: Unconfirmed;
10
5
  //# sourceMappingURL=transfer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAElD,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5D,eAAO,MAAM,WAAW,EAAE,WAAqC,CAAC"}
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAElD,eAAO,MAAM,WAAW,EAAE,WAAqC,CAAC"}
@@ -19,12 +19,11 @@ export type Changed = {
19
19
  readonly was: string | null | undefined;
20
20
  readonly now: string | null | undefined;
21
21
  };
22
- type CleanSource = {
22
+ type Neighbourhood = {
23
23
  readonly lookup: Lookup;
24
24
  readonly texts: (paths: readonly string[]) => Promise<ReadonlyMap<string, string | null>>;
25
- readonly referrers: ((targets: readonly string[]) => Promise<readonly string[]>) | null;
25
+ readonly referrers: (targets: readonly string[]) => Promise<readonly string[]>;
26
26
  };
27
- export declare function sameComposition(left: Composition, right: Composition): boolean;
28
- export declare function changedCleanly(changes: readonly Changed[], previous: Composition, composition: Composition, source: CleanSource): Promise<boolean>;
27
+ export declare function validatedNeighbourhood(changes: readonly Changed[], composition: Composition, source: Neighbourhood): Promise<Validation>;
29
28
  export {};
30
29
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,UAAU,EAGhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMxE,KAAK,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,IAAI,GAAG,CACjB,KAAK,EAAE,MAAM,GAAG,IAAI,KACjB,OAAO,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAEtF,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAyBvF,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,UAAU,CAAC,CAyCrB;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1F,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;CACzF,CAAC;AAaF,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAQ9E;AAqCD,wBAAsB,cAAc,CAClC,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAsDlB"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,UAAU,EAGhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM7D,KAAK,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,IAAI,GAAG,CACjB,KAAK,EAAE,MAAM,GAAG,IAAI,KACjB,OAAO,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAEtF,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAwBvF,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,UAAU,CAAC,CA6CrB;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1F,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CAChF,CAAC;AAkBF,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,UAAU,CAAC,CAgCrB"}