@agentshouse/mdruntime 0.1.0-ce5c5bb29be5a → 0.1.0-ce6bc9239a3ee

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 (201) hide show
  1. package/README.md +2 -2
  2. package/dist/acceptance.d.ts +26 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +384 -0
  5. package/dist/adapter.d.ts +81 -49
  6. package/dist/adapter.d.ts.map +1 -1
  7. package/dist/attached-model.d.ts +3 -10
  8. package/dist/attached-model.d.ts.map +1 -1
  9. package/dist/attached-model.js +21 -56
  10. package/dist/bootstrap.d.ts +9 -5
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +209 -75
  13. package/dist/chain.d.ts +2 -1
  14. package/dist/chain.d.ts.map +1 -1
  15. package/dist/change.d.ts +1 -0
  16. package/dist/change.d.ts.map +1 -1
  17. package/dist/chat-types.d.ts +3 -0
  18. package/dist/chat-types.d.ts.map +1 -0
  19. package/dist/chat-types.js +2 -0
  20. package/dist/client.d.ts +16 -6
  21. package/dist/client.d.ts.map +1 -1
  22. package/dist/client.js +3 -1
  23. package/dist/collection.d.ts +2 -1
  24. package/dist/collection.d.ts.map +1 -1
  25. package/dist/compile.d.ts +6 -6
  26. package/dist/compile.d.ts.map +1 -1
  27. package/dist/compile.js +262 -318
  28. package/dist/connection.d.ts +20 -44
  29. package/dist/connection.d.ts.map +1 -1
  30. package/dist/connection.js +1438 -3393
  31. package/dist/context.d.ts +2 -0
  32. package/dist/context.d.ts.map +1 -0
  33. package/dist/context.js +7 -0
  34. package/dist/conversation-row.d.ts +33 -0
  35. package/dist/conversation-row.d.ts.map +1 -0
  36. package/dist/conversation-row.js +47 -0
  37. package/dist/conversation.d.ts +26 -17
  38. package/dist/conversation.d.ts.map +1 -1
  39. package/dist/conversation.js +441 -307
  40. package/dist/durability.d.ts +6 -0
  41. package/dist/durability.d.ts.map +1 -1
  42. package/dist/entry.d.ts +2 -2
  43. package/dist/entry.d.ts.map +1 -1
  44. package/dist/entry.js +17 -7
  45. package/dist/figures.d.ts +48 -0
  46. package/dist/figures.d.ts.map +1 -0
  47. package/dist/figures.js +197 -0
  48. package/dist/host.d.ts +4 -6
  49. package/dist/host.d.ts.map +1 -1
  50. package/dist/host.js +22 -26
  51. package/dist/identity.d.ts +0 -1
  52. package/dist/identity.d.ts.map +1 -1
  53. package/dist/identity.js +0 -3
  54. package/dist/index.d.ts +18 -8
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +5 -1
  57. package/dist/install.d.ts +86 -0
  58. package/dist/install.d.ts.map +1 -0
  59. package/dist/install.js +537 -0
  60. package/dist/job.d.ts +33 -0
  61. package/dist/job.d.ts.map +1 -0
  62. package/dist/job.js +54 -0
  63. package/dist/live.d.ts +5 -4
  64. package/dist/live.d.ts.map +1 -1
  65. package/dist/live.js +63 -22
  66. package/dist/log.d.ts +1 -0
  67. package/dist/log.d.ts.map +1 -1
  68. package/dist/memory.d.ts +11 -4
  69. package/dist/memory.d.ts.map +1 -1
  70. package/dist/memory.js +171 -81
  71. package/dist/messages.d.ts +27 -3
  72. package/dist/messages.d.ts.map +1 -1
  73. package/dist/messages.js +97 -19
  74. package/dist/model.d.ts +2 -9
  75. package/dist/model.d.ts.map +1 -1
  76. package/dist/model.js +0 -9
  77. package/dist/observation.d.ts +2 -2
  78. package/dist/observation.d.ts.map +1 -1
  79. package/dist/observation.js +7 -2
  80. package/dist/outcome.d.ts +1 -0
  81. package/dist/outcome.d.ts.map +1 -1
  82. package/dist/outcome.js +3 -0
  83. package/dist/overlay.d.ts +1 -0
  84. package/dist/overlay.d.ts.map +1 -1
  85. package/dist/overlay.js +11 -0
  86. package/dist/parts.d.ts +59 -0
  87. package/dist/parts.d.ts.map +1 -0
  88. package/dist/parts.js +118 -0
  89. package/dist/query.d.ts +14 -209
  90. package/dist/query.d.ts.map +1 -1
  91. package/dist/query.js +3 -505
  92. package/dist/questions.d.ts +32 -0
  93. package/dist/questions.d.ts.map +1 -0
  94. package/dist/questions.js +118 -0
  95. package/dist/reach.d.ts +12 -12
  96. package/dist/reach.d.ts.map +1 -1
  97. package/dist/reach.js +182 -136
  98. package/dist/react.d.ts +5 -2
  99. package/dist/react.d.ts.map +1 -1
  100. package/dist/read.d.ts +7 -0
  101. package/dist/read.d.ts.map +1 -0
  102. package/dist/read.js +17 -0
  103. package/dist/readiness.d.ts +0 -2
  104. package/dist/readiness.d.ts.map +1 -1
  105. package/dist/reads.d.ts +36 -0
  106. package/dist/reads.d.ts.map +1 -0
  107. package/dist/reads.js +136 -0
  108. package/dist/recovery.d.ts.map +1 -1
  109. package/dist/recovery.js +9 -1
  110. package/dist/refresh.d.ts +6 -4
  111. package/dist/refresh.d.ts.map +1 -1
  112. package/dist/refresh.js +32 -4
  113. package/dist/replica.d.ts +8 -8
  114. package/dist/replica.d.ts.map +1 -1
  115. package/dist/replica.js +50 -15
  116. package/dist/room-draft.d.ts +4 -3
  117. package/dist/room-draft.d.ts.map +1 -1
  118. package/dist/room-draft.js +65 -52
  119. package/dist/room-drafts.d.ts +29 -0
  120. package/dist/room-drafts.d.ts.map +1 -0
  121. package/dist/room-drafts.js +216 -0
  122. package/dist/rows.d.ts +14 -21
  123. package/dist/rows.d.ts.map +1 -1
  124. package/dist/rows.js +48 -184
  125. package/dist/save.d.ts.map +1 -1
  126. package/dist/save.js +11 -8
  127. package/dist/saves.d.ts +96 -0
  128. package/dist/saves.d.ts.map +1 -0
  129. package/dist/saves.js +999 -0
  130. package/dist/search.d.ts +12 -63
  131. package/dist/search.d.ts.map +1 -1
  132. package/dist/search.js +9 -52
  133. package/dist/seed.d.ts +16 -2
  134. package/dist/seed.d.ts.map +1 -1
  135. package/dist/seed.js +66 -0
  136. package/dist/socket/admission.d.ts +7 -0
  137. package/dist/socket/admission.d.ts.map +1 -0
  138. package/dist/socket/admission.js +39 -0
  139. package/dist/socket/answers.d.ts +6 -0
  140. package/dist/socket/answers.d.ts.map +1 -0
  141. package/dist/socket/answers.js +20 -0
  142. package/dist/socket/reads.d.ts +10 -0
  143. package/dist/socket/reads.d.ts.map +1 -0
  144. package/dist/socket/reads.js +31 -0
  145. package/dist/socket.d.ts +43 -0
  146. package/dist/socket.d.ts.map +1 -0
  147. package/dist/socket.js +96 -0
  148. package/dist/source.d.ts +61 -0
  149. package/dist/source.d.ts.map +1 -0
  150. package/dist/source.js +81 -0
  151. package/dist/status.d.ts +0 -2
  152. package/dist/status.d.ts.map +1 -1
  153. package/dist/status.js +0 -6
  154. package/dist/store/fences.d.ts +16 -0
  155. package/dist/store/fences.d.ts.map +1 -0
  156. package/dist/store/fences.js +26 -0
  157. package/dist/store/installs.d.ts +30 -0
  158. package/dist/store/installs.d.ts.map +1 -0
  159. package/dist/store/installs.js +34 -0
  160. package/dist/store/records.d.ts +212 -0
  161. package/dist/store/records.d.ts.map +1 -0
  162. package/dist/store/records.js +408 -0
  163. package/dist/store/room-held.d.ts +8 -0
  164. package/dist/store/room-held.d.ts.map +1 -0
  165. package/dist/store/room-held.js +17 -0
  166. package/dist/store/watchers.d.ts +15 -0
  167. package/dist/store/watchers.d.ts.map +1 -0
  168. package/dist/store/watchers.js +36 -0
  169. package/dist/store/writes.d.ts +24 -0
  170. package/dist/store/writes.d.ts.map +1 -0
  171. package/dist/store/writes.js +125 -0
  172. package/dist/store.d.ts +78 -145
  173. package/dist/store.d.ts.map +1 -1
  174. package/dist/store.js +117 -367
  175. package/dist/stored.d.ts +58 -32
  176. package/dist/stored.d.ts.map +1 -1
  177. package/dist/stored.js +264 -187
  178. package/dist/tables.d.ts +107 -25
  179. package/dist/tables.d.ts.map +1 -1
  180. package/dist/tables.js +193 -47
  181. package/dist/tallies.d.ts +18 -0
  182. package/dist/tallies.d.ts.map +1 -0
  183. package/dist/tallies.js +129 -0
  184. package/dist/validation.d.ts.map +1 -1
  185. package/dist/validation.js +7 -4
  186. package/dist/windows.d.ts +1 -12
  187. package/dist/windows.d.ts.map +1 -1
  188. package/dist/windows.js +2 -75
  189. package/dist/wire.d.ts +15 -4
  190. package/dist/wire.d.ts.map +1 -1
  191. package/dist/wire.js +6 -1
  192. package/package.json +2 -2
  193. package/dist/fence.d.ts +0 -6
  194. package/dist/fence.d.ts.map +0 -1
  195. package/dist/fence.js +0 -10
  196. package/dist/fulltext.d.ts +0 -27
  197. package/dist/fulltext.d.ts.map +0 -1
  198. package/dist/fulltext.js +0 -370
  199. package/dist/words.d.ts +0 -19
  200. package/dist/words.d.ts.map +0 -1
  201. package/dist/words.js +0 -156
package/dist/tables.js CHANGED
@@ -1,11 +1,17 @@
1
+ import { sql } from '@agentshouse/mdmodel';
1
2
  import { answerQuery } from './compile.js';
2
- import { searched, SEARCH_TABLES } from './fulltext.js';
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, folders, opened, rederive, referrers, refreshing, REPLICA_TABLES, stage, typed, typedWithin, unrefresh, } from './stored.js';
3
+ import { conversationRows, droppedMessages, forgottenMessages, heldConversations, jobMarkers, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
4
+ import { keptRead, READ_TABLES, readsOfOtherBuildsForgotten, storedRead, } from './reads.js';
5
+ import { conversationTallies, roomTallies, } from './tallies.js';
6
+ 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
7
  const STATEMENTS_HELD = 256;
6
8
  export function sqliteConnection(engine, database) {
7
9
  const decoder = new TextDecoder();
8
10
  const held = new Map();
11
+ database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
12
+ arity: 2,
13
+ deterministic: true,
14
+ });
9
15
  function prepared(sql) {
10
16
  if (sql.includes(';'))
11
17
  return null;
@@ -72,7 +78,7 @@ const TABLES = [
72
78
  ['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
73
79
  [
74
80
  '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)',
81
+ '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
82
  ],
77
83
  [
78
84
  'authored_room_drafts',
@@ -89,35 +95,51 @@ export const RUNTIME_TABLES = [
89
95
  'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
90
96
  ...REPLICA_TABLES,
91
97
  ...MESSAGE_TABLES,
92
- ...SEARCH_TABLES,
98
+ ...READ_TABLES,
93
99
  ];
94
100
  const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
95
101
  const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
96
102
  const UNOWNED_PARTS = `DELETE FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS} UNION SELECT key FROM opened_files)`;
97
103
  const READS = new Set([
98
- 'authored.queues',
104
+ 'authored.status',
105
+ 'authored.moving',
106
+ 'authored.pending',
107
+ 'authored.batch',
108
+ 'authored.order',
109
+ 'authored.queued',
99
110
  'authored.roomDrafts',
111
+ 'authored.chatDraft.read',
100
112
  'authored.chatDrafts',
101
113
  'authored.calls',
102
114
  'authored.fences',
115
+ 'authored.unsent',
103
116
  'authored.fact',
104
117
  'authored.file',
105
118
  'replica.open',
119
+ 'replica.rooms',
120
+ 'replica.room',
121
+ 'replica.covering',
122
+ 'replica.offline',
123
+ 'replica.held',
124
+ 'replica.facts',
125
+ 'replica.presentation',
106
126
  'replica.query',
127
+ 'replica.tallies',
107
128
  'replica.entries',
108
129
  'replica.typed',
109
130
  'replica.referrers',
110
- 'replica.files',
111
131
  'replica.folders',
112
132
  'replica.typedWithin',
113
- 'replica.counts',
114
- 'replica.search',
115
133
  'opened.find',
116
134
  'file.part',
117
135
  'conversation.held',
118
136
  'conversation.window',
119
137
  'conversation.count',
120
138
  'conversation.turn',
139
+ 'conversation.rows',
140
+ 'conversation.jobs',
141
+ 'conversation.tallies',
142
+ 'read.stored',
121
143
  ]);
122
144
  const KINDS = new Set([
123
145
  ...READS,
@@ -129,14 +151,17 @@ const KINDS = new Set([
129
151
  'authored.claim',
130
152
  'authored.end',
131
153
  'replica.stage',
154
+ 'replica.resume',
132
155
  'replica.refresh',
133
156
  'replica.unrefresh',
134
157
  'replica.commit',
135
158
  'replica.fence',
136
159
  'replica.erase',
137
160
  'replica.abandon',
161
+ 'replica.unfence',
138
162
  'replica.release',
139
163
  'replica.rederive',
164
+ 'replica.demote',
140
165
  'replica.fact',
141
166
  'replica.present',
142
167
  'opened.begin',
@@ -147,6 +172,8 @@ const KINDS = new Set([
147
172
  'conversation.keep',
148
173
  'conversation.drop',
149
174
  'space.probe',
175
+ 'read.keep',
176
+ 'read.builds',
150
177
  ]);
151
178
  export function isRuntime(request) {
152
179
  return KINDS.has(request.kind);
@@ -219,21 +246,66 @@ function unowned(connection) {
219
246
  connection.run(UNOWNED_PARTS);
220
247
  }
221
248
  function queued(connection) {
249
+ return connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
250
+ locator: text(row.locator),
251
+ ids: JSON.parse(text(row.ids)),
252
+ }));
253
+ }
254
+ function heldWork(connection, locator) {
255
+ const room = heldRoom(connection, locator);
256
+ const pending = new Map(connection
257
+ .rows('SELECT id, batch, state FROM authored_pending WHERE locator = ?', [locator])
258
+ .map((row) => [
259
+ text(row.id),
260
+ { id: text(row.id), batch: text(row.batch), state: text(row.state) },
261
+ ]));
222
262
  return {
223
- queues: connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
224
- locator: text(row.locator),
225
- ids: JSON.parse(text(row.ids)),
226
- })),
227
- pending: connection
228
- .rows('SELECT locator, id, batch, state FROM authored_pending')
229
- .map((row) => ({
230
- locator: text(row.locator),
231
- id: text(row.id),
232
- batch: text(row.batch),
233
- state: text(row.state),
234
- })),
263
+ room: room === null ? null : { ...room, overlaid: overlaid(connection, room.key) },
264
+ queue: heldOrder(connection, locator).map((id) => {
265
+ const held = pending.get(id);
266
+ if (held === undefined)
267
+ throw new Error(`Missing Pending Change ${locator}/${id}`);
268
+ return held;
269
+ }),
270
+ };
271
+ }
272
+ function status(connection) {
273
+ const [completed] = connection.rows("SELECT value FROM replica_facts WHERE name = 'lastCompleted'");
274
+ return {
275
+ queued: texts(connection.rows('SELECT locator FROM authored_queues'), 'locator'),
276
+ lastCompleted: completed === undefined ? null : text(completed.value),
277
+ changes: connection
278
+ .rows('SELECT p.locator, c.value AS path FROM authored_pending p, json_each(p.paths) c')
279
+ .map((row) => ({ locator: text(row.locator), path: text(row.path) })),
280
+ resets: connection
281
+ .rows(`SELECT locator, json_extract(state, '$.submission.reset') AS reset FROM authored_pending
282
+ WHERE json_extract(state, '$.submission.state') = 'reset'`)
283
+ .map((row) => ({ locator: text(row.locator), reset: text(row.reset) })),
284
+ returned: texts(connection.rows(`SELECT record FROM authored_room_drafts WHERE json_type(record, '$.returned') = 'object'`), 'record'),
235
285
  };
236
286
  }
287
+ function pendingOf(connection, locator, id) {
288
+ const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
289
+ return {
290
+ state: held === undefined ? null : text(held.state),
291
+ room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
292
+ };
293
+ }
294
+ function roomDraftRecords(connection, locator, paths) {
295
+ if (locator === null) {
296
+ return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
297
+ }
298
+ if (paths === null) {
299
+ return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ?', [locator]), 'record');
300
+ }
301
+ 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');
302
+ }
303
+ function chatDraftRecord(connection, conversation) {
304
+ const [held] = connection.rows('SELECT record FROM authored_chat_drafts WHERE conversation = ?', [
305
+ conversation,
306
+ ]);
307
+ return held === undefined ? null : text(held.record);
308
+ }
237
309
  function heldOrder(connection, locator) {
238
310
  const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
239
311
  return held === undefined ? [] : JSON.parse(text(held.ids));
@@ -265,19 +337,26 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
265
337
  connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
266
338
  }
267
339
  }
268
- for (const { id, batch, state, files } of added ?? []) {
340
+ for (const { id, batch, state, files, paths, moving } of added ?? []) {
269
341
  if (before.has(id) || !after.has(id))
270
342
  continue;
271
- connection.run('INSERT OR REPLACE INTO authored_pending (locator, id, batch, state, files) VALUES (?, ?, ?, ?, ?)', [locator, id, batch, state, owned(files)]);
343
+ 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]);
272
344
  }
273
- for (const { id, batch, files } of founded ?? []) {
345
+ for (const { id, batch, files, paths, moving } of founded ?? []) {
274
346
  const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
275
347
  if (held === undefined || !before.has(id))
276
348
  continue;
277
- connection.run('UPDATE authored_pending SET batch = ?, files = ? WHERE locator = ? AND id = ?', [batch, owned([...JSON.parse(text(held.files)), ...files]), locator, id]);
349
+ connection.run('UPDATE authored_pending SET batch = ?, files = ?, paths = ?, moving = ? WHERE locator = ? AND id = ?', [
350
+ batch,
351
+ owned([...JSON.parse(text(held.files)), ...files]),
352
+ JSON.stringify(paths),
353
+ moving ? 1 : 0,
354
+ locator,
355
+ id,
356
+ ]);
278
357
  }
279
358
  }
280
- async function kept(connection, { writes, files, whole, discards }) {
359
+ async function kept(connection, { writes, files, whole }) {
281
360
  const refused = writes.find(({ locator }) => fenced(connection, locator));
282
361
  if (refused !== undefined && whole)
283
362
  return refused.locator;
@@ -286,8 +365,6 @@ async function kept(connection, { writes, files, whole, discards }) {
286
365
  if (!fenced(connection, write.locator))
287
366
  keptRows(connection, write);
288
367
  }
289
- for (const locator of discards ?? [])
290
- roomWork(connection, locator);
291
368
  unowned(connection);
292
369
  return refused?.locator ?? null;
293
370
  }
@@ -357,11 +434,15 @@ function fence(connection, locators) {
357
434
  return fenceRooms(connection, locators);
358
435
  }
359
436
  function erased(connection, { locator, limit }) {
360
- const done = erase(connection, locator, limit);
361
- if (locator !== null && !done.remaining) {
437
+ return erase(connection, locator, limit);
438
+ }
439
+ function unfenced(connection, locators) {
440
+ const erased = locators.filter((locator) => connection.rows('SELECT 1 FROM replica_erasing WHERE locator = ? LIMIT 1', [locator])
441
+ .length === 0);
442
+ for (const locator of erased) {
362
443
  connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
363
444
  }
364
- return done;
445
+ return erased;
365
446
  }
366
447
  function claim(connection, holder) {
367
448
  const held = fact(connection, 'holder');
@@ -440,6 +521,16 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
440
521
  unowned(connection);
441
522
  return true;
442
523
  }
524
+ const UNSENT = [
525
+ ['pending-change', 'authored_pending'],
526
+ ['call', 'authored_calls'],
527
+ ['room-draft', 'authored_room_drafts'],
528
+ ['chat-draft', 'authored_chat_drafts'],
529
+ ];
530
+ function unsent(connection) {
531
+ const [held] = connection.rows(`SELECT ${UNSENT.map(([kind, table]) => `(SELECT count(*) FROM ${table}) AS "${kind}"`).join(', ')}`);
532
+ return UNSENT.map(([kind]) => ({ kind, count: count(held?.[kind]) })).filter((work) => work.count > 0);
533
+ }
443
534
  function cleaned(connection) {
444
535
  connection.run('DELETE FROM opened_files');
445
536
  const [freed] = connection.rows(`SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS})`);
@@ -449,7 +540,7 @@ function cleaned(connection) {
449
540
  async function committed(connection, { authored, rooms }) {
450
541
  const refused = authored === undefined ? null : await kept(connection, authored);
451
542
  if (refused !== null && authored?.whole === true) {
452
- return { fenced: refused, counts: {}, changed: {}, indexed: {} };
543
+ return { fenced: refused, changed: {}, indexed: {} };
453
544
  }
454
545
  return {
455
546
  fenced: refused,
@@ -458,16 +549,42 @@ async function committed(connection, { authored, rooms }) {
458
549
  }
459
550
  export function answerRuntime(connection, request, spool) {
460
551
  switch (request.kind) {
461
- case 'authored.queues':
462
- return queued(connection);
552
+ case 'authored.status':
553
+ return status(connection);
554
+ case 'authored.moving':
555
+ return {
556
+ queues: queued(connection),
557
+ pending: connection
558
+ .rows('SELECT locator, id, batch, state FROM authored_pending WHERE moving = 1 ORDER BY locator')
559
+ .map((row) => ({
560
+ locator: text(row.locator),
561
+ id: text(row.id),
562
+ batch: text(row.batch),
563
+ state: text(row.state),
564
+ })),
565
+ };
566
+ case 'authored.pending':
567
+ return pendingOf(connection, request.locator, request.id);
568
+ case 'authored.batch': {
569
+ const [held] = connection.rows('SELECT batch FROM authored_pending WHERE locator = ? AND id = ?', [request.locator, request.id]);
570
+ return held === undefined ? null : text(held.batch);
571
+ }
572
+ case 'authored.order':
573
+ return heldOrder(connection, request.locator);
574
+ case 'authored.queued':
575
+ return texts(connection.rows('SELECT locator FROM authored_queues'), 'locator');
463
576
  case 'authored.roomDrafts':
464
- return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
577
+ return roomDraftRecords(connection, request.locator, request.paths);
578
+ case 'authored.chatDraft.read':
579
+ return chatDraftRecord(connection, request.conversation);
465
580
  case 'authored.chatDrafts':
466
581
  return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
467
582
  case 'authored.calls':
468
583
  return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
469
584
  case 'authored.fences':
470
585
  return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
586
+ case 'authored.unsent':
587
+ return unsent(connection);
471
588
  case 'authored.fact':
472
589
  return fact(connection, request.name);
473
590
  case 'authored.file':
@@ -488,28 +605,43 @@ export function answerRuntime(connection, request, spool) {
488
605
  return end(connection, request.holder);
489
606
  case 'replica.open':
490
607
  return opened(connection);
608
+ case 'replica.rooms':
609
+ return heldRooms(connection, request.locators);
610
+ case 'replica.room':
611
+ return heldWork(connection, request.locator);
612
+ case 'replica.covering':
613
+ return {
614
+ rooms: covering(connection),
615
+ queues: queued(connection),
616
+ };
617
+ case 'replica.offline':
618
+ return offlineMode(connection, request.locator);
619
+ case 'replica.held':
620
+ return { held: heldLocators(connection), staged: stagedLocators(connection) };
621
+ case 'replica.demote':
622
+ return demoted(connection);
623
+ case 'replica.facts':
624
+ return facts(connection);
625
+ case 'replica.presentation':
626
+ return presentation(connection, request.app);
491
627
  case 'replica.query':
492
628
  return answerQuery(connection, request.plan, request.rooms, request.budget);
629
+ case 'replica.tallies':
630
+ return roomTallies(connection, request.totals, request.rooms, request.since);
493
631
  case 'replica.entries':
494
632
  return entries(connection, request.key, request.view, request.paths);
495
633
  case 'replica.typed':
496
634
  return typed(connection, request.key, request.view, request.paths);
497
635
  case 'replica.referrers':
498
- return referrers(connection, request.key, request.view, request.targets, request.kinds);
499
- case 'replica.files':
500
- return files(connection, request.key, request.view, request.after, request.limit);
636
+ return referrers(connection, request.key, request.view, request.targets);
501
637
  case 'replica.folders':
502
638
  return folders(connection, request.key, request.view, request.paths);
503
639
  case 'replica.typedWithin':
504
640
  return typedWithin(connection, request.key, request.view, request.roots, request.within);
505
- case 'replica.counts':
506
- return counts(connection, request.rooms);
507
- case 'replica.search': {
508
- const { kind: _kind, ...ask } = request;
509
- return searched(connection, ask);
510
- }
511
641
  case 'replica.stage':
512
642
  return fenced(connection, request.locator) ? null : stage(connection, request);
643
+ case 'replica.resume':
644
+ return fenced(connection, request.locator) ? null : resume(connection, request);
513
645
  case 'replica.refresh':
514
646
  return refreshing(connection, request);
515
647
  case 'replica.unrefresh':
@@ -522,6 +654,8 @@ export function answerRuntime(connection, request, spool) {
522
654
  return erased(connection, request);
523
655
  case 'replica.abandon':
524
656
  return abandon(connection, request.locator);
657
+ case 'replica.unfence':
658
+ return unfenced(connection, request.locators);
525
659
  case 'replica.release':
526
660
  return release(connection, request.key);
527
661
  case 'replica.rederive':
@@ -553,17 +687,23 @@ export function answerRuntime(connection, request, spool) {
553
687
  case 'file.part':
554
688
  return filePart(connection, request.key, request.part);
555
689
  case 'conversation.held':
556
- return heldConversations(connection);
690
+ return heldConversations(connection, request.conversations);
557
691
  case 'conversation.keep': {
558
692
  const { kind: _kind, ...write } = request;
559
693
  return keptMessages(connection, write);
560
694
  }
561
695
  case 'conversation.window':
562
- return messageWindow(connection, request.conversation, request.limit, request.before);
696
+ return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
563
697
  case 'conversation.count':
564
- return messageCount(connection, request.conversation);
698
+ return messageCount(connection, request.conversation, request.phrase);
565
699
  case 'conversation.turn':
566
700
  return turnArrived(connection, request.conversation, request.turn);
701
+ case 'conversation.rows':
702
+ return conversationRows(connection, request.conversations);
703
+ case 'conversation.jobs':
704
+ return jobMarkers(connection, request.conversation);
705
+ case 'conversation.tallies':
706
+ return conversationTallies(connection, request.conversations, request.since);
567
707
  case 'conversation.drop':
568
708
  chatDraft(connection, {
569
709
  kind: 'authored.chatDraft',
@@ -574,5 +714,11 @@ export function answerRuntime(connection, request, spool) {
574
714
  return null;
575
715
  case 'space.probe':
576
716
  return spool.probe(PROBE_BYTES).then(() => null);
717
+ case 'read.stored':
718
+ return storedRead(connection, request);
719
+ case 'read.keep':
720
+ return keptRead(connection, request, request.answer);
721
+ case 'read.builds':
722
+ return readsOfOtherBuildsForgotten(connection, request.build);
577
723
  }
578
724
  }
@@ -0,0 +1,18 @@
1
+ import { type QueryRoom } from './compile.js';
2
+ import type { GroupTotal, Plan } from './query.js';
3
+ import type { Connection } from './tables.js';
4
+ export type RoomTally = {
5
+ readonly key: number;
6
+ readonly documents: GroupTotal;
7
+ readonly files: GroupTotal;
8
+ readonly documentTimes: readonly (readonly [string | null, string | null])[];
9
+ readonly chatTimes: readonly string[];
10
+ readonly messageTimes: readonly string[];
11
+ };
12
+ export type ConversationTally = {
13
+ readonly conversation: string;
14
+ readonly said: readonly string[];
15
+ };
16
+ export declare function roomTallies(connection: Connection, totals: Plan, rooms: readonly QueryRoom[], since: string): RoomTally[];
17
+ export declare function conversationTallies(connection: Connection, conversations: readonly string[] | null, since: string): ConversationTally[];
18
+ //# sourceMappingURL=tallies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tallies.d.ts","sourceRoot":"","sources":["../src/tallies.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAI1D,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;IAC7E,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAmHpG,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,KAAK,EAAE,MAAM,GACZ,SAAS,EAAE,CAwBb;AA0BD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,EACvC,KAAK,EAAE,MAAM,GACZ,iBAAiB,EAAE,CAerB"}
@@ -0,0 +1,129 @@
1
+ import { instantKey, sql } from '@agentshouse/mdmodel';
2
+ import { CHAT_MESSAGE_TYPE, CHAT_TYPE } from './chat-types.js';
3
+ import { answerQuery, VISIBLE, within } from './compile.js';
4
+ import { HOUSE_DIRECTORY } from './figures.js';
5
+ const NONE = { count: 0, size: 0 };
6
+ const { all, fragment, joined } = sql;
7
+ function instant(value) {
8
+ return typeof value === 'string' ? value : null;
9
+ }
10
+ function held(alias, keys) {
11
+ const reserved = within(alias, HOUSE_DIRECTORY);
12
+ return all([
13
+ fragment(`${alias}.key IN (SELECT value FROM json_each(?))`, [JSON.stringify(keys)]),
14
+ fragment(VISIBLE(alias)),
15
+ fragment(`NOT ${reserved.sql}`, reserved.bind),
16
+ ]);
17
+ }
18
+ function valued(alias, document, field) {
19
+ return joined([
20
+ fragment(`${alias}.doc = ${document}.id AND `),
21
+ sql.grouped(sql.placed(alias, field, 'exact')),
22
+ fragment(` AND ${alias}.item = -1`),
23
+ ], '');
24
+ }
25
+ function inboxed(card) {
26
+ return joined([
27
+ fragment('EXISTS (SELECT 1 FROM replica_values i WHERE '),
28
+ valued('i', card, '/inbox'),
29
+ fragment(" AND i.kind = 'string')"),
30
+ ], '');
31
+ }
32
+ function rowsOf(connection, query) {
33
+ return connection.rows(query.sql, query.bind);
34
+ }
35
+ function documentTimes(connection, keys, since) {
36
+ return rowsOf(connection, joined([
37
+ fragment('SELECT d.key AS key, d.created_instant AS created, d.changed_instant AS changed FROM replica_entries d WHERE '),
38
+ held('d', keys),
39
+ fragment(" AND d.binary IS NULL AND COALESCE(d.type, '') NOT IN (?, ?) AND (d.created_instant >= ? OR d.changed_instant >= ?)", [CHAT_TYPE, CHAT_MESSAGE_TYPE, since, since]),
40
+ ], ''));
41
+ }
42
+ function chatTimes(connection, keys, since) {
43
+ return rowsOf(connection, joined([
44
+ fragment('SELECT d.key AS key, d.created_instant AS at FROM replica_entries d WHERE '),
45
+ held('d', keys),
46
+ fragment(' AND d.type = ? AND d.created_instant >= ? AND ', [CHAT_TYPE, since]),
47
+ inboxed('d'),
48
+ ], ''));
49
+ }
50
+ function messageTimes(connection, keys, since) {
51
+ return rowsOf(connection, joined([
52
+ fragment('SELECT m.key AS key, s.instant AS at FROM replica_entries m JOIN replica_values s ON '),
53
+ valued('s', 'm', '/sent_at'),
54
+ fragment(' AND s.instant >= ? JOIN replica_values r ON ', [since]),
55
+ valued('r', 'm', '/direction'),
56
+ fragment(" AND r.kind = 'string' AND r.value = 'in' WHERE "),
57
+ held('m', keys),
58
+ fragment(` AND m.type = ? AND EXISTS (SELECT 1 FROM replica_entries c WHERE c.key = m.key AND c.type = ? AND ${VISIBLE('c')} AND c.folder = m.folder AND `, [CHAT_MESSAGE_TYPE, CHAT_TYPE]),
59
+ inboxed('c'),
60
+ fragment(')'),
61
+ ], ''));
62
+ }
63
+ function byKey(rows, read) {
64
+ const kept = new Map();
65
+ for (const row of rows) {
66
+ const key = Number(row.key);
67
+ const list = kept.get(key) ?? [];
68
+ list.push(read(row));
69
+ kept.set(key, list);
70
+ }
71
+ return kept;
72
+ }
73
+ export function roomTallies(connection, totals, rooms, since) {
74
+ const keys = rooms.map(({ key }) => key);
75
+ const from = instantKey(since);
76
+ const answered = answerQuery(connection, totals, rooms);
77
+ const summed = new Map(('groups' in answered ? answered.groups : []).map((group) => [String(group.key[0]), group]));
78
+ const documents = byKey(documentTimes(connection, keys, from), (row) => [instant(row.created), instant(row.changed)]);
79
+ const chats = byKey(chatTimes(connection, keys, from), (row) => instant(row.at));
80
+ const messages = byKey(messageTimes(connection, keys, from), (row) => instant(row.at));
81
+ return rooms.map(({ locator, key }) => {
82
+ const total = summed.get(locator);
83
+ return {
84
+ key,
85
+ documents: total?.documents ?? NONE,
86
+ files: total?.files ?? NONE,
87
+ documentTimes: documents.get(key) ?? [],
88
+ chatTimes: chats.get(key) ?? [],
89
+ messageTimes: messages.get(key) ?? [],
90
+ };
91
+ });
92
+ }
93
+ const ACCEPTED = "message ->> '$.accepted_at'";
94
+ const NEWER = 'ORDER BY n.position DESC, n.identity DESC LIMIT 1';
95
+ const SAID = `WITH RECURSIVE
96
+ named(conversation) AS (SELECT value FROM json_each(?)),
97
+ walk(id, conversation, position, identity, at) AS (
98
+ SELECT m.id, m.conversation, m.position, m.identity, m.${ACCEPTED}
99
+ FROM named JOIN conversation_messages m ON m.id = (
100
+ SELECT n.id FROM conversation_messages n WHERE n.conversation = named.conversation ${NEWER}
101
+ )
102
+ UNION ALL
103
+ SELECT m.id, m.conversation, m.position, m.identity, m.${ACCEPTED}
104
+ FROM walk JOIN conversation_messages m ON m.id = (
105
+ SELECT n.id FROM conversation_messages n WHERE n.conversation = walk.conversation
106
+ AND (n.position < walk.position OR (n.position = walk.position AND n.identity < walk.identity))
107
+ ${NEWER}
108
+ )
109
+ WHERE julianday(walk.at) >= julianday(?)
110
+ )
111
+ SELECT walk.conversation AS conversation, walk.at AS at
112
+ FROM walk JOIN conversation_messages m ON m.id = walk.id
113
+ WHERE m.message ->> '$.role' IN ('user', 'assistant') AND julianday(walk.at) >= julianday(?)`;
114
+ export function conversationTallies(connection, conversations, since) {
115
+ const named = conversations ??
116
+ connection
117
+ .rows('SELECT DISTINCT conversation FROM conversation_messages')
118
+ .map((row) => String(row.conversation));
119
+ const from = instantKey(since);
120
+ const said = new Map();
121
+ for (const row of connection.rows(SAID, [JSON.stringify(named), since, since])) {
122
+ const at = instantKey(row.at);
123
+ if (at === null || at < from)
124
+ continue;
125
+ const conversation = String(row.conversation);
126
+ said.set(conversation, [...(said.get(conversation) ?? []), at]);
127
+ }
128
+ return named.map((conversation) => ({ conversation, said: said.get(conversation) ?? [] }));
129
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,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;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,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"}
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"}
@@ -5,8 +5,7 @@ const NO_TYPES = { types: {} };
5
5
  function modelOf(model) {
6
6
  return model.status === 'unavailable' ? NO_TYPES : { types: model.types };
7
7
  }
8
- function typedText(content) {
9
- const read = parse(content);
8
+ function typedText(read) {
10
9
  return read.ok && read.document.type !== undefined && read.document.type !== 'any';
11
10
  }
12
11
  function partVerdict(part) {
@@ -28,10 +27,14 @@ export async function validatedCollection(walk, lookup, composition) {
28
27
  if (content === null)
29
28
  continue;
30
29
  const part = partOf(path);
31
- if (part.model.status === 'unavailable' && part.unmodeled === null && typedText(content)) {
30
+ const parsed = parse(content, path);
31
+ if (part.model.status === 'unavailable' && part.unmodeled === null && typedText(parsed)) {
32
32
  part.unmodeled = path;
33
33
  }
34
- const assessment = assess(path, content, false, modelOf(part.model), { anyRoom: true });
34
+ const assessment = assess(path, parsed, false, modelOf(part.model), {
35
+ anyRoom: true,
36
+ typedPaths: composition.typedPaths,
37
+ });
35
38
  assessed.push({ part, assessment });
36
39
  await pace(content.length + assessment.targets.length * ROW_WEIGHT);
37
40
  }
package/dist/windows.d.ts CHANGED
@@ -1,22 +1,11 @@
1
1
  export declare const MAXIMUM_WINDOW = 1000;
2
- export declare const FROM_START = "[]";
2
+ export declare const FROM_START: string;
3
3
  export declare function capped(limit: number | null | undefined): number;
4
- export type Ordering = {
5
- readonly direction: 'asc' | 'desc';
6
- readonly nulls: 'first' | 'last';
7
- readonly stringSort: 'lexical' | 'locale';
8
- readonly locale: string | undefined;
9
- readonly localeOptions: Intl.CollatorOptions | undefined;
10
- };
11
4
  interface Placed {
12
5
  readonly position: string;
13
6
  readonly identity: string;
14
7
  }
15
8
  export declare function messageOrder(left: Placed, right: Placed): number;
16
9
  export declare function precedes(message: Placed, before: readonly [string, string] | null): boolean;
17
- export declare function byCodePoint(left: string, right: string): number;
18
- export declare function compared(left: unknown, right: unknown, ordering: Ordering): number;
19
- export declare function cursorOf(values: readonly unknown[]): string;
20
- export declare function decodedCursor(text: string): readonly unknown[] | null;
21
10
  export {};
22
11
  //# sourceMappingURL=windows.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../src/windows.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,UAAU,OAAO,CAAC;AAE/B,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE/D;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;CAC1D,CAAC;AAEF,UAAU,MAAM;IACd,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,OAAO,CAE3F;AAaD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/D;AA4BD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAMlF;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAE3D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,CAOrE"}
1
+ {"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../src/windows.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,UAAU,QAAe,CAAC;AAEvC,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE/D;AAED,UAAU,MAAM;IACd,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,OAAO,CAE3F"}