@agentshouse/mdruntime 0.1.0-c5d3fa6fb67bc → 0.1.0-c6636685d0c4b

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 (135) hide show
  1. package/AGENTS.md +205 -205
  2. package/README.md +8 -8
  3. package/dist/adapter.d.ts +36 -9
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/bootstrap.d.ts +2 -1
  6. package/dist/bootstrap.d.ts.map +1 -1
  7. package/dist/bootstrap.js +1 -1
  8. package/dist/change-set.d.ts +5 -2
  9. package/dist/change-set.d.ts.map +1 -1
  10. package/dist/change-set.js +6 -1
  11. package/dist/chat/earlier.d.ts +10 -0
  12. package/dist/chat/earlier.d.ts.map +1 -0
  13. package/dist/chat/earlier.js +54 -0
  14. package/dist/chat/kit.js +1 -1
  15. package/dist/chat/list.d.ts +2 -1
  16. package/dist/chat/list.d.ts.map +1 -1
  17. package/dist/chat/list.js +45 -5
  18. package/dist/chat/markdown.d.ts +1 -0
  19. package/dist/chat/markdown.d.ts.map +1 -1
  20. package/dist/chat/markdown.js +78 -20
  21. package/dist/chat/message.d.ts +1 -0
  22. package/dist/chat/message.d.ts.map +1 -1
  23. package/dist/chat/message.js +12 -2
  24. package/dist/chat/messages.d.ts +2 -0
  25. package/dist/chat/messages.d.ts.map +1 -1
  26. package/dist/chat/messages.js +52 -20
  27. package/dist/chat/overlay.d.ts +1 -0
  28. package/dist/chat/overlay.d.ts.map +1 -1
  29. package/dist/chat/overlay.js +10 -0
  30. package/dist/chat/pieces.d.ts +62 -0
  31. package/dist/chat/pieces.d.ts.map +1 -0
  32. package/dist/chat/pieces.js +1110 -0
  33. package/dist/chat/provider.d.ts +1 -0
  34. package/dist/chat/provider.d.ts.map +1 -1
  35. package/dist/chat/provider.js +23 -14
  36. package/dist/chat/question.d.ts +1 -1
  37. package/dist/chat/question.d.ts.map +1 -1
  38. package/dist/chat/question.js +7 -18
  39. package/dist/chat/ready.d.ts +1 -1
  40. package/dist/chat/ready.d.ts.map +1 -1
  41. package/dist/chat/ready.js +1 -1
  42. package/dist/chat/steady.d.ts +3 -0
  43. package/dist/chat/steady.d.ts.map +1 -0
  44. package/dist/chat/steady.js +26 -0
  45. package/dist/chat/style.js +1 -1
  46. package/dist/chat.d.ts +2 -2
  47. package/dist/chat.d.ts.map +1 -1
  48. package/dist/chat.js +2 -2
  49. package/dist/client.d.ts +6 -2
  50. package/dist/client.d.ts.map +1 -1
  51. package/dist/client.js +16 -5
  52. package/dist/collection.d.ts +4 -3
  53. package/dist/collection.d.ts.map +1 -1
  54. package/dist/collection.js +128 -63
  55. package/dist/connection.d.ts +12 -4
  56. package/dist/connection.d.ts.map +1 -1
  57. package/dist/connection.js +577 -217
  58. package/dist/conversation.d.ts +12 -0
  59. package/dist/conversation.d.ts.map +1 -1
  60. package/dist/conversation.js +196 -41
  61. package/dist/entry.d.ts.map +1 -1
  62. package/dist/entry.js +2 -1
  63. package/dist/host.d.ts +5 -4
  64. package/dist/host.d.ts.map +1 -1
  65. package/dist/host.js +45 -5
  66. package/dist/index.d.ts +5 -4
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +1 -0
  69. package/dist/memory.d.ts +6 -3
  70. package/dist/memory.d.ts.map +1 -1
  71. package/dist/memory.js +17 -11
  72. package/dist/observation.d.ts +2 -0
  73. package/dist/observation.d.ts.map +1 -1
  74. package/dist/observation.js +9 -3
  75. package/dist/outcome.d.ts +14 -2
  76. package/dist/outcome.d.ts.map +1 -1
  77. package/dist/outcome.js +7 -0
  78. package/dist/overlay.d.ts +4 -4
  79. package/dist/overlay.d.ts.map +1 -1
  80. package/dist/overlay.js +181 -140
  81. package/dist/query.d.ts +26 -2
  82. package/dist/query.d.ts.map +1 -1
  83. package/dist/query.js +34 -6
  84. package/dist/reach.d.ts +4 -1
  85. package/dist/reach.d.ts.map +1 -1
  86. package/dist/reach.js +90 -21
  87. package/dist/react.d.ts +3 -3
  88. package/dist/react.d.ts.map +1 -1
  89. package/dist/react.js +7 -17
  90. package/dist/read-side.d.ts +3 -1
  91. package/dist/read-side.d.ts.map +1 -1
  92. package/dist/read-side.js +271 -82
  93. package/dist/reads.d.ts +11 -0
  94. package/dist/reads.d.ts.map +1 -0
  95. package/dist/reads.js +98 -0
  96. package/dist/refresh.d.ts +4 -4
  97. package/dist/refresh.d.ts.map +1 -1
  98. package/dist/refresh.js +35 -16
  99. package/dist/replica.d.ts +11 -5
  100. package/dist/replica.d.ts.map +1 -1
  101. package/dist/replica.js +69 -40
  102. package/dist/room-draft.d.ts +12 -0
  103. package/dist/room-draft.d.ts.map +1 -1
  104. package/dist/room-draft.js +11 -12
  105. package/dist/rows.d.ts +1 -0
  106. package/dist/rows.d.ts.map +1 -1
  107. package/dist/rows.js +5 -0
  108. package/dist/save.d.ts +4 -2
  109. package/dist/save.d.ts.map +1 -1
  110. package/dist/save.js +195 -111
  111. package/dist/search.d.ts +17 -2
  112. package/dist/search.d.ts.map +1 -1
  113. package/dist/search.js +81 -7
  114. package/dist/seed.d.ts +16 -0
  115. package/dist/seed.d.ts.map +1 -0
  116. package/dist/seed.js +75 -0
  117. package/dist/shared.d.ts +4 -0
  118. package/dist/shared.d.ts.map +1 -1
  119. package/dist/shared.js +63 -33
  120. package/dist/store.d.ts +18 -2
  121. package/dist/store.d.ts.map +1 -1
  122. package/dist/store.js +398 -316
  123. package/dist/turn.d.ts +5 -3
  124. package/dist/turn.d.ts.map +1 -1
  125. package/dist/turn.js +26 -7
  126. package/dist/windows.d.ts +26 -0
  127. package/dist/windows.d.ts.map +1 -0
  128. package/dist/windows.js +93 -0
  129. package/dist/wire.d.ts +16 -0
  130. package/dist/wire.d.ts.map +1 -1
  131. package/dist/wire.js +4 -0
  132. package/package.json +2 -2
  133. package/dist/acquisition.d.ts +0 -14
  134. package/dist/acquisition.d.ts.map +0 -1
  135. package/dist/acquisition.js +0 -24
package/dist/overlay.js CHANGED
@@ -1,5 +1,6 @@
1
- import { apply, parse, serialize } from '@agentshouse/mdmodel';
2
- import { differing, drafted, patched, settled } from './shared.js';
1
+ import { apply, frontmatterValue, parse, serialize, } from '@agentshouse/mdmodel';
2
+ import { differences, drafted, patching, settling } from './shared.js';
3
+ import { ROW_WEIGHT } from './turn.js';
3
4
  export function acceptedBinaries(files) {
4
5
  return Object.fromEntries(Object.entries(files).map(([path, file]) => [path, { state: 'accepted', ...file }]));
5
6
  }
@@ -23,10 +24,13 @@ export function sameChange(left, right) {
23
24
  left.author?.name === right.author?.name);
24
25
  }
25
26
  const EMPTY_FRONTMATTER = '---\n---\n';
27
+ function isPart(change) {
28
+ return change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble';
29
+ }
26
30
  function at(path, name) {
27
31
  return `${path} ${name}`;
28
32
  }
29
- function priorsOf(preconditions) {
33
+ function* priorsOf(preconditions) {
30
34
  const fields = new Map();
31
35
  const sections = new Map();
32
36
  const preambles = new Map();
@@ -40,6 +44,7 @@ function priorsOf(preconditions) {
40
44
  if (precondition.kind === 'preamble') {
41
45
  preambles.set(precondition.path, precondition.value);
42
46
  }
47
+ yield ROW_WEIGHT;
43
48
  }
44
49
  return {
45
50
  field: (path, name) => fields.get(at(path, name)),
@@ -55,51 +60,50 @@ function compose(fields, sections) {
55
60
  const opened = parse(skeleton);
56
61
  if (!opened.ok)
57
62
  return skeleton;
58
- let document = opened.document;
59
- for (const [name, value] of Object.entries(fields)) {
60
- const next = apply(document, { kind: 'field', name, value, prior: undefined });
61
- if (next.outcome === 'applied')
62
- document = next.document;
63
- }
64
- return serialize(document);
63
+ const next = apply(opened.document, Object.entries(fields).flatMap(([name, value]) => frontmatterValue(value) ? [{ kind: 'field', name, value, prior: undefined }] : []));
64
+ return serialize(next.outcome === 'applied' ? next.document : opened.document);
65
65
  }
66
- function edited(document, change, priors) {
67
- if (change.kind === 'field') {
68
- return apply(document, {
66
+ function edited(change, priors) {
67
+ if (change.kind === 'field')
68
+ return {
69
69
  kind: 'field',
70
70
  name: change.name,
71
71
  value: change.value,
72
72
  prior: priors.field(change.path, change.name),
73
- });
74
- }
75
- if (change.kind === 'preamble') {
76
- return apply(document, {
77
- kind: 'preamble',
78
- value: change.value,
79
- prior: priors.preamble(change.path),
80
- });
81
- }
82
- if (change.kind !== 'section')
83
- return null;
84
- return apply(document, {
73
+ };
74
+ if (change.kind === 'preamble')
75
+ return { kind: 'preamble', value: change.value, prior: priors.preamble(change.path) };
76
+ return {
85
77
  kind: 'section',
86
78
  name: change.name,
87
79
  value: change.value,
88
80
  prior: priors.section(change.path, change.name),
89
- });
81
+ };
90
82
  }
91
- function edit(staged, change, priors) {
92
- const text = staged.documents[change.path];
83
+ function edit(staged, changes, priors) {
84
+ const path = changes[0].path;
85
+ delete staged.revisions[path];
86
+ const text = staged.documents[path];
93
87
  if (text === undefined)
94
- return false;
95
- const parsed = parse(text, change.path);
88
+ return changes.length;
89
+ const parsed = parse(text, path);
96
90
  if (!parsed.ok)
97
- return false;
98
- const next = edited(parsed.document, change, priors);
99
- if (next?.outcome !== 'applied')
100
- return false;
101
- staged.documents[change.path] = serialize(next.document);
102
- return true;
91
+ return changes.length;
92
+ const wanted = changes.map((change) => edited(change, priors));
93
+ const first = apply(parsed.document, wanted);
94
+ if (first.outcome === 'refuse')
95
+ return changes.length;
96
+ if (first.outcome === 'applied') {
97
+ staged.documents[path] = serialize(first.document);
98
+ return 0;
99
+ }
100
+ const stale = new Set(first.stale);
101
+ const kept = wanted.filter((_, at) => !stale.has(at));
102
+ const rest = apply(parsed.document, kept);
103
+ if (rest.outcome !== 'applied')
104
+ return changes.length;
105
+ staged.documents[path] = serialize(rest.document);
106
+ return first.stale.length;
103
107
  }
104
108
  function relocate(staged, from, to) {
105
109
  const text = staged.documents[from];
@@ -140,11 +144,7 @@ function erase(staged, path) {
140
144
  delete staged.changes[path];
141
145
  delete staged.binaries[path];
142
146
  }
143
- function stage(staged, change, priors) {
144
- if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
145
- delete staged.revisions[change.path];
146
- return edit(staged, change, priors);
147
- }
147
+ function stage(staged, change) {
148
148
  if (change.kind === 'create') {
149
149
  staged.documents[change.path] =
150
150
  'content' in change ? change.content : compose(change.fields, change.sections);
@@ -179,7 +179,7 @@ function stage(staged, change, priors) {
179
179
  erase(staged, change.path);
180
180
  return true;
181
181
  }
182
- export function overlay(base, queue, unapplied) {
182
+ export function* overlaying(base, queue, unapplied) {
183
183
  const staged = {
184
184
  documents: drafted(base.documents),
185
185
  binaries: drafted(base.binaries),
@@ -188,137 +188,178 @@ export function overlay(base, queue, unapplied) {
188
188
  changes: drafted(base.changes),
189
189
  };
190
190
  for (const batch of queue) {
191
- const priors = priorsOf(batch.preconditions);
192
- for (const change of batch.changes) {
193
- if (!stage(staged, change, priors))
191
+ const priors = yield* priorsOf(batch.preconditions);
192
+ for (let index = 0; index < batch.changes.length; index += 1) {
193
+ const change = batch.changes[index];
194
+ if (!isPart(change)) {
195
+ if (!stage(staged, change))
196
+ unapplied?.();
197
+ yield ROW_WEIGHT;
198
+ continue;
199
+ }
200
+ const run = [change];
201
+ while (index + 1 < batch.changes.length) {
202
+ const next = batch.changes[index + 1];
203
+ if (!isPart(next) || next.path !== change.path)
204
+ break;
205
+ run.push(next);
206
+ index += 1;
207
+ }
208
+ const text = staged.documents[change.path] ?? '';
209
+ for (let left = edit(staged, run, priors); left > 0; left -= 1)
194
210
  unapplied?.();
211
+ yield ROW_WEIGHT + text.length;
195
212
  }
196
213
  }
197
214
  return {
198
- documents: settled(staged.documents),
199
- binaries: settled(staged.binaries),
200
- revisions: settled(staged.revisions),
201
- fileIds: settled(staged.fileIds),
202
- changes: settled(staged.changes),
215
+ documents: yield* settling(staged.documents),
216
+ binaries: yield* settling(staged.binaries),
217
+ revisions: yield* settling(staged.revisions),
218
+ fileIds: yield* settling(staged.fileIds),
219
+ changes: yield* settling(staged.changes),
203
220
  };
204
221
  }
205
- function pathsOf(batch) {
206
- return batch.changes.flatMap((change) => change.kind === 'move' ? [change.path, change.to] : [change.path]);
222
+ function* pathsOf(batch) {
223
+ const paths = new Set();
224
+ for (const change of batch.changes) {
225
+ paths.add(change.path);
226
+ if (change.kind === 'move')
227
+ paths.add(change.to);
228
+ yield ROW_WEIGHT;
229
+ }
230
+ return paths;
207
231
  }
208
- export function sameLayerText(left, right) {
209
- return (differing(left.documents, right.documents).size === 0 &&
210
- differing(left.binaries, right.binaries, sameBinary).size === 0);
232
+ export function* sameText(left, right) {
233
+ return ((yield* differences(left.documents, right.documents)).size === 0 &&
234
+ (yield* differences(left.binaries, right.binaries, sameBinary)).size === 0);
211
235
  }
212
- export function changedPaths(left, right) {
236
+ export function* changedPaths(left, right) {
213
237
  return new Set([
214
- ...differing(left.documents, right.documents),
215
- ...differing(left.revisions, right.revisions),
216
- ...differing(left.fileIds, right.fileIds),
217
- ...differing(left.changes, right.changes, sameChange),
218
- ...differing(left.binaries, right.binaries, sameBinary),
238
+ ...(yield* differences(left.documents, right.documents)),
239
+ ...(yield* differences(left.revisions, right.revisions)),
240
+ ...(yield* differences(left.fileIds, right.fileIds)),
241
+ ...(yield* differences(left.changes, right.changes, sameChange)),
242
+ ...(yield* differences(left.binaries, right.binaries, sameBinary)),
219
243
  ]);
220
244
  }
221
- function replayHeads(base, queue) {
245
+ function* sameItems(left, right) {
246
+ if (left.length !== right.length)
247
+ return false;
248
+ for (let index = 0; index < left.length; index += 1) {
249
+ const item = JSON.stringify(left[index]);
250
+ if (item !== JSON.stringify(right[index]))
251
+ return false;
252
+ yield ROW_WEIGHT + item.length;
253
+ }
254
+ return true;
255
+ }
256
+ function* sameBatch(left, right) {
257
+ if (left === right)
258
+ return true;
259
+ const { changes, preconditions, ...rest } = left;
260
+ const { changes: others, preconditions: priors, ...held } = right;
261
+ return (JSON.stringify(rest) === JSON.stringify(held) &&
262
+ (yield* sameItems(changes, others)) &&
263
+ (yield* sameItems(preconditions, priors)));
264
+ }
265
+ function* replayHeads(base, batch) {
222
266
  const heads = {
223
267
  revisions: drafted(base.revisions),
224
268
  fileIds: drafted(base.fileIds),
225
269
  changes: drafted(base.changes),
226
270
  };
227
- for (const batch of queue) {
228
- for (const change of batch.changes) {
229
- if (change.kind === 'remove') {
230
- delete heads.revisions[change.path];
231
- delete heads.fileIds[change.path];
232
- delete heads.changes[change.path];
233
- }
234
- else if (change.kind === 'create') {
235
- delete heads.fileIds[change.path];
236
- delete heads.changes[change.path];
237
- }
238
- else if (change.kind === 'replace' ||
239
- change.kind === 'field' ||
240
- change.kind === 'section' ||
241
- change.kind === 'preamble') {
242
- delete heads.revisions[change.path];
243
- }
244
- else if (change.kind === 'binary') {
245
- delete heads.revisions[change.path];
246
- delete heads.changes[change.path];
247
- }
248
- else if (change.kind === 'move') {
249
- moveHead(heads, change.path, change.to);
250
- }
271
+ for (const change of batch.changes) {
272
+ if (change.kind === 'remove') {
273
+ delete heads.revisions[change.path];
274
+ delete heads.fileIds[change.path];
275
+ delete heads.changes[change.path];
276
+ }
277
+ else if (change.kind === 'create') {
278
+ delete heads.fileIds[change.path];
279
+ delete heads.changes[change.path];
280
+ }
281
+ else if (change.kind === 'replace' ||
282
+ change.kind === 'field' ||
283
+ change.kind === 'section' ||
284
+ change.kind === 'preamble') {
285
+ delete heads.revisions[change.path];
251
286
  }
287
+ else if (change.kind === 'binary') {
288
+ delete heads.revisions[change.path];
289
+ delete heads.changes[change.path];
290
+ }
291
+ else if (change.kind === 'move') {
292
+ moveHead(heads, change.path, change.to);
293
+ }
294
+ yield ROW_WEIGHT;
252
295
  }
253
296
  return {
254
- revisions: settled(heads.revisions),
255
- fileIds: settled(heads.fileIds),
256
- changes: settled(heads.changes),
297
+ revisions: yield* settling(heads.revisions),
298
+ fileIds: yield* settling(heads.fileIds),
299
+ changes: yield* settling(heads.changes),
257
300
  };
258
301
  }
259
- export function overlayChanged(base, queue, previousBase, previousQueue, previousVisible) {
260
- const before = previousQueue.map((batch) => JSON.stringify(batch));
261
- const after = queue.map((batch) => JSON.stringify(batch));
262
- if (before.length === after.length &&
263
- before.every((id, index) => id === after[index]) &&
264
- sameLayerText(base, previousBase)) {
302
+ function* repatched(held, paths, value) {
303
+ const set = [];
304
+ const removed = [];
305
+ for (const path of paths) {
306
+ const found = value(path);
307
+ if (found === undefined)
308
+ removed.push(path);
309
+ else
310
+ set.push([path, found]);
311
+ yield ROW_WEIGHT;
312
+ }
313
+ return yield* patching(held, set, removed);
314
+ }
315
+ export function* overlayChanged(base, batch, previousBase, previousBatch, previousVisible) {
316
+ const same = yield* sameBatch(batch, previousBatch);
317
+ if (same && (yield* sameText(base, previousBase))) {
265
318
  return {
266
319
  documents: previousVisible.documents,
267
320
  binaries: previousVisible.binaries,
268
- ...replayHeads(base, queue),
321
+ ...(yield* replayHeads(base, batch)),
269
322
  };
270
323
  }
271
- const affected = new Set(changedPaths(base, previousBase));
272
- const oldIds = new Set(before);
273
- const newIds = new Set(after);
274
- for (const batch of previousQueue) {
275
- if (!newIds.has(JSON.stringify(batch)))
276
- for (const path of pathsOf(batch))
277
- affected.add(path);
278
- }
279
- for (const batch of queue) {
280
- if (!oldIds.has(JSON.stringify(batch)))
281
- for (const path of pathsOf(batch))
282
- affected.add(path);
324
+ const affected = new Set(yield* changedPaths(base, previousBase));
325
+ const touched = yield* pathsOf(batch);
326
+ let replayed = !same;
327
+ if (replayed)
328
+ for (const path of yield* pathsOf(previousBatch))
329
+ affected.add(path);
330
+ for (const path of touched) {
331
+ if (affected.has(path))
332
+ replayed = true;
333
+ yield ROW_WEIGHT;
283
334
  }
284
- let expanded = true;
285
- while (expanded) {
286
- expanded = false;
287
- for (const batch of queue) {
288
- const touched = pathsOf(batch);
289
- if (!touched.some((path) => affected.has(path)))
290
- continue;
291
- for (const path of touched) {
292
- if (affected.has(path))
293
- continue;
294
- affected.add(path);
295
- expanded = true;
296
- }
297
- }
298
- }
299
- const documents = {};
300
- const revisions = {};
301
- const fileIds = {};
302
- const changes = {};
303
- const binaries = {};
304
- for (const path of affected) {
335
+ const restricted = {
336
+ documents: {},
337
+ revisions: {},
338
+ fileIds: {},
339
+ changes: {},
340
+ binaries: {},
341
+ };
342
+ for (const path of replayed ? touched : []) {
343
+ affected.add(path);
305
344
  if (base.documents[path] !== undefined)
306
- documents[path] = base.documents[path];
345
+ restricted.documents[path] = base.documents[path];
307
346
  if (base.revisions[path] !== undefined)
308
- revisions[path] = base.revisions[path];
347
+ restricted.revisions[path] = base.revisions[path];
309
348
  if (base.fileIds[path] !== undefined)
310
- fileIds[path] = base.fileIds[path];
349
+ restricted.fileIds[path] = base.fileIds[path];
311
350
  if (base.changes[path] !== undefined)
312
- changes[path] = base.changes[path];
351
+ restricted.changes[path] = base.changes[path];
313
352
  if (base.binaries[path] !== undefined)
314
- binaries[path] = base.binaries[path];
353
+ restricted.binaries[path] = base.binaries[path];
354
+ yield ROW_WEIGHT;
315
355
  }
316
- const staged = overlay({ documents, revisions, fileIds, changes, binaries }, queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))));
356
+ const staged = replayed ? yield* overlaying(restricted, [batch]) : base;
357
+ const from = (path) => (touched.has(path) ? staged : base);
317
358
  return {
318
- documents: patched(previousVisible.documents, Object.entries(staged.documents), affected),
319
- revisions: patched(previousVisible.revisions, Object.entries(staged.revisions), affected),
320
- fileIds: patched(previousVisible.fileIds, Object.entries(staged.fileIds), affected),
321
- changes: patched(previousVisible.changes, Object.entries(staged.changes), affected),
322
- binaries: patched(previousVisible.binaries, Object.entries(staged.binaries), affected),
359
+ documents: yield* repatched(previousVisible.documents, affected, (path) => from(path).documents[path]),
360
+ revisions: yield* repatched(previousVisible.revisions, affected, (path) => from(path).revisions[path]),
361
+ fileIds: yield* repatched(previousVisible.fileIds, affected, (path) => from(path).fileIds[path]),
362
+ changes: yield* repatched(previousVisible.changes, affected, (path) => from(path).changes[path]),
363
+ binaries: yield* repatched(previousVisible.binaries, affected, (path) => from(path).binaries[path]),
323
364
  };
324
365
  }
package/dist/query.d.ts CHANGED
@@ -38,6 +38,8 @@ export type Filter = {
38
38
  types?: readonly string[];
39
39
  where?: Where;
40
40
  pathPrefix?: string;
41
+ folder?: string;
42
+ paths?: readonly string[];
41
43
  hop?: Related & {
42
44
  field: string;
43
45
  };
@@ -45,7 +47,7 @@ export type Filter = {
45
47
  field?: string;
46
48
  };
47
49
  };
48
- export type Key = 'room' | 'path' | 'type' | {
50
+ export type Key = 'room' | 'path' | 'type' | 'folder' | {
49
51
  field: string;
50
52
  };
51
53
  export type Select = 'all' | {
@@ -71,6 +73,8 @@ export type DocumentQuery = Filter & {
71
73
  direction?: Direction;
72
74
  } & OrderOptions)[];
73
75
  limit?: number;
76
+ after?: string;
77
+ total?: true;
74
78
  };
75
79
  export type GroupQuery = Filter & {
76
80
  groupBy: readonly Exclude<Key, 'path'>[];
@@ -79,6 +83,8 @@ export type GroupQuery = Filter & {
79
83
  direction?: Direction;
80
84
  }[];
81
85
  limit?: number;
86
+ after?: string;
87
+ total?: true;
82
88
  };
83
89
  export type LocalQuery = DocumentQuery | GroupQuery;
84
90
  export type Backlink = {
@@ -113,7 +119,7 @@ export type QueryCoverage = {
113
119
  indexes: readonly string[];
114
120
  overlay: readonly string[];
115
121
  };
116
- export type Awaits = Open<'acquisition' | 'preparation' | 'index'>;
122
+ export type Awaits = Open<'acquisition' | 'preparation' | 'index' | 'unlock'>;
117
123
  export type PendingRoom = {
118
124
  room: string;
119
125
  awaits: Awaits;
@@ -123,9 +129,13 @@ export type PendingResult = {
123
129
  };
124
130
  export type DocumentRows = {
125
131
  documents: readonly QueryDocument[];
132
+ next?: string;
133
+ total?: number;
126
134
  };
127
135
  export type GroupRows = {
128
136
  groups: readonly QueryGroup[];
137
+ next?: string;
138
+ total?: number;
129
139
  };
130
140
  export type QueryRows = DocumentRows | GroupRows;
131
141
  export type DocumentResult = DocumentRows & {
@@ -189,6 +199,8 @@ export type KeyPlan = {
189
199
  of: 'path';
190
200
  } | {
191
201
  of: 'type';
202
+ } | {
203
+ of: 'folder';
192
204
  } | {
193
205
  of: 'field';
194
206
  field: string;
@@ -221,10 +233,18 @@ export type PlanReach = {
221
233
  rooms: readonly string[];
222
234
  documents: readonly string[];
223
235
  };
236
+ export type Continuation = {
237
+ text: string;
238
+ values: readonly unknown[] | null;
239
+ };
224
240
  export type Plan = {
241
+ key: string;
225
242
  rooms: readonly string[] | null;
226
243
  reach: PlanReach | null;
244
+ locked: readonly string[];
227
245
  root: Scope;
246
+ folder: string | null;
247
+ paths: readonly string[] | null;
228
248
  hop: (Scope & {
229
249
  field: string;
230
250
  }) | null;
@@ -233,6 +253,8 @@ export type Plan = {
233
253
  }) | null;
234
254
  shape: DocumentShape | GroupShape;
235
255
  limit: number | null;
256
+ after: Continuation | null;
257
+ total: boolean;
236
258
  };
237
259
  export declare class QueryError extends Error {
238
260
  readonly code: QueryErrorCode;
@@ -243,9 +265,11 @@ type Entries = Readonly<Record<string, unknown>>;
243
265
  export declare function invalid(at: string, problem: string): never;
244
266
  export declare function plain(value: unknown): value is Entries;
245
267
  export declare function known(value: Entries, allowed: readonly string[], at: string): void;
268
+ export declare function flag(input: unknown, at: string): boolean;
246
269
  export declare function planOf(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
247
270
  export declare function limitOf(input: unknown): number | null;
248
271
  export declare function filterOf(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
272
+ export declare function queryKey(query: unknown): string;
249
273
  export declare function identityOf(plan: Plan): string;
250
274
  export {};
251
275
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
package/dist/query.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { pointerFacts, } from '@agentshouse/mdmodel';
2
2
  import { referenceField } from './model.js';
3
3
  import { normalize } from './paths.js';
4
+ import { decodedCursor } from './windows.js';
4
5
  export class QueryError extends Error {
5
6
  code;
6
7
  retryable = false;
@@ -11,7 +12,7 @@ export class QueryError extends Error {
11
12
  }
12
13
  const RANGE = ['$gt', '$gte', '$lt', '$lte'];
13
14
  const SINGLE = ['$eq', '$ne', '$in', '$nin', '$all', '$size', '$exists'];
14
- const FILTER = ['rooms', 'types', 'where', 'pathPrefix', 'hop', 'backlinks'];
15
+ const FILTER = ['rooms', 'types', 'where', 'pathPrefix', 'folder', 'paths', 'hop', 'backlinks'];
15
16
  const RELATED = ['types', 'where', 'pathPrefix', 'field'];
16
17
  const PARTS = ['fields', 'sections', 'preamble', 'markdown', 'backlinks', 'change', 'fileId'];
17
18
  const ORDER = ['by', 'direction', 'nulls', 'stringSort', 'locale', 'localeOptions'];
@@ -60,6 +61,13 @@ function names(input, at) {
60
61
  invalid(at, 'expects a list of names');
61
62
  return [...new Set(listed)].sort();
62
63
  }
64
+ function pathsOf(input) {
65
+ const listed = list(input, 'paths');
66
+ if (listed.some((item) => typeof item !== 'string' || item === '' || normalize(item) !== item)) {
67
+ invalid('paths', 'expects a list of Paths');
68
+ }
69
+ return [...new Set(listed)].sort();
70
+ }
63
71
  function directory(input, at) {
64
72
  if (typeof input !== 'string' || normalize(input) !== input) {
65
73
  invalid(at, 'expects a normalized directory');
@@ -279,15 +287,16 @@ function backlinksOf(facts, rooms, input) {
279
287
  return { types, where, pathPrefix, field };
280
288
  }
281
289
  function keyPlan(typed, input, at, path) {
282
- if (input === 'room' || input === 'type' || (path && input === 'path'))
290
+ if (input === 'room' || input === 'type' || input === 'folder' || (path && input === 'path')) {
283
291
  return { of: input };
292
+ }
284
293
  if (plain(input) && Object.hasOwn(input, 'field') && Object.keys(input).length === 1) {
285
294
  if (specs(typed, input.field, place(at, 'field')).some(several)) {
286
295
  invalid(place(at, 'field'), 'a path that can hold several values');
287
296
  }
288
297
  return { of: 'field', field: input.field };
289
298
  }
290
- return invalid(at, path ? 'expects room, path, type or a field' : 'expects room, type or a field');
299
+ return invalid(at, path ? 'expects room, path, type, folder or a field' : 'expects room, type, folder or a field');
291
300
  }
292
301
  function direction(input, at) {
293
302
  if (input === undefined)
@@ -349,7 +358,7 @@ function parts(typed, input, at, fields) {
349
358
  });
350
359
  return named;
351
360
  }
352
- function flag(input, at) {
361
+ export function flag(input, at) {
353
362
  if (input === undefined)
354
363
  return false;
355
364
  if (input !== true)
@@ -423,20 +432,36 @@ export function planOf(input, facts, reach = null) {
423
432
  invalid('select', 'a grouped query selects nothing');
424
433
  if (!grouped && input.select === undefined)
425
434
  invalid('select', 'a Document query must select');
426
- known(input, [...FILTER, 'orderBy', 'limit', grouped ? 'groupBy' : 'select'], '');
435
+ known(input, [...FILTER, 'orderBy', 'limit', 'after', 'total', grouped ? 'groupBy' : 'select'], '');
427
436
  const limit = limitOf(input.limit);
428
437
  const rooms = input.rooms === undefined ? null : names(input.rooms, 'rooms');
429
438
  const { typed, ...root } = scope(facts, rooms, input, '');
439
+ const shape = grouped ? groupShape(typed, input) : documentShape(typed, input);
430
440
  return {
441
+ key: queryKey(input),
431
442
  rooms,
432
443
  reach,
444
+ locked: [],
433
445
  root,
446
+ folder: input.folder === undefined ? null : directory(input.folder, 'folder'),
447
+ paths: input.paths === undefined ? null : pathsOf(input.paths),
434
448
  hop: input.hop === undefined ? null : hopOf(facts, rooms, typed, input.hop),
435
449
  backlinks: input.backlinks === undefined ? null : backlinksOf(facts, rooms, input.backlinks),
436
- shape: grouped ? groupShape(typed, input) : documentShape(typed, input),
450
+ shape,
437
451
  limit,
452
+ after: continuationOf(input.after, shape.orderBy.length + 1),
453
+ total: flag(input.total, 'total'),
438
454
  };
439
455
  }
456
+ function continuationOf(input, arity) {
457
+ if (input === undefined)
458
+ return null;
459
+ const values = typeof input === 'string' ? decodedCursor(input) : null;
460
+ if (values === null || (values.length !== 0 && values.length !== arity)) {
461
+ invalid('after', 'expects the next an earlier result of this query returned');
462
+ }
463
+ return { text: input, values: values.length === 0 ? null : values };
464
+ }
440
465
  export function limitOf(input) {
441
466
  if (input === undefined)
442
467
  return null;
@@ -451,6 +476,9 @@ export function filterOf(input, facts, reach = null) {
451
476
  known(input, FILTER, '');
452
477
  return planOf({ ...input, select: {} }, facts, reach);
453
478
  }
479
+ export function queryKey(query) {
480
+ return canonical(query);
481
+ }
454
482
  function canonical(value) {
455
483
  if (Array.isArray(value))
456
484
  return `[${value.map(canonical).join(',')}]`;