@agentshouse/mdruntime 0.1.0-c16fc8caac7ff → 0.1.0-c1c2b722d3dcd

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 (152) hide show
  1. package/AGENTS.md +275 -275
  2. package/README.md +8 -8
  3. package/dist/adapter.d.ts +51 -9
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/attempt.d.ts.map +1 -1
  6. package/dist/attempt.js +14 -1
  7. package/dist/bootstrap.d.ts +3 -2
  8. package/dist/bootstrap.d.ts.map +1 -1
  9. package/dist/bootstrap.js +33 -7
  10. package/dist/change-set.d.ts +2 -0
  11. package/dist/change-set.d.ts.map +1 -1
  12. package/dist/change-set.js +36 -10
  13. package/dist/chat/acts.d.ts +3 -4
  14. package/dist/chat/acts.d.ts.map +1 -1
  15. package/dist/chat/acts.js +10 -10
  16. package/dist/chat/earlier.d.ts +10 -0
  17. package/dist/chat/earlier.d.ts.map +1 -0
  18. package/dist/chat/earlier.js +54 -0
  19. package/dist/chat/kit.d.ts +2 -1
  20. package/dist/chat/kit.d.ts.map +1 -1
  21. package/dist/chat/kit.js +3 -3
  22. package/dist/chat/list.d.ts +2 -1
  23. package/dist/chat/list.d.ts.map +1 -1
  24. package/dist/chat/list.js +42 -5
  25. package/dist/chat/markdown.d.ts +1 -0
  26. package/dist/chat/markdown.d.ts.map +1 -1
  27. package/dist/chat/markdown.js +78 -20
  28. package/dist/chat/message.d.ts.map +1 -1
  29. package/dist/chat/message.js +2 -2
  30. package/dist/chat/messages.d.ts +1 -0
  31. package/dist/chat/messages.d.ts.map +1 -1
  32. package/dist/chat/messages.js +4 -0
  33. package/dist/chat/pieces.d.ts +62 -0
  34. package/dist/chat/pieces.d.ts.map +1 -0
  35. package/dist/chat/pieces.js +1110 -0
  36. package/dist/chat/provider.d.ts +1 -1
  37. package/dist/chat/provider.d.ts.map +1 -1
  38. package/dist/chat/provider.js +62 -79
  39. package/dist/chat/question.d.ts +1 -1
  40. package/dist/chat/question.d.ts.map +1 -1
  41. package/dist/chat/question.js +7 -18
  42. package/dist/chat/ready.d.ts +1 -0
  43. package/dist/chat/ready.d.ts.map +1 -1
  44. package/dist/chat/ready.js +2 -2
  45. package/dist/chat/style.js +4 -4
  46. package/dist/chat.d.ts +1 -1
  47. package/dist/chat.d.ts.map +1 -1
  48. package/dist/chat.js +1 -1
  49. package/dist/client.d.ts +17 -9
  50. package/dist/client.d.ts.map +1 -1
  51. package/dist/client.js +19 -6
  52. package/dist/collection.d.ts +20 -5
  53. package/dist/collection.d.ts.map +1 -1
  54. package/dist/collection.js +309 -33
  55. package/dist/connection.d.ts +31 -9
  56. package/dist/connection.d.ts.map +1 -1
  57. package/dist/connection.js +1573 -372
  58. package/dist/conversation.d.ts +20 -7
  59. package/dist/conversation.d.ts.map +1 -1
  60. package/dist/conversation.js +474 -163
  61. package/dist/durability.d.ts +7 -1
  62. package/dist/durability.d.ts.map +1 -1
  63. package/dist/entry.d.ts +17 -0
  64. package/dist/entry.d.ts.map +1 -0
  65. package/dist/entry.js +157 -0
  66. package/dist/fence.d.ts +6 -0
  67. package/dist/fence.d.ts.map +1 -0
  68. package/dist/fence.js +10 -0
  69. package/dist/host.d.ts +14 -2
  70. package/dist/host.d.ts.map +1 -1
  71. package/dist/host.js +91 -9
  72. package/dist/identity.d.ts +2 -0
  73. package/dist/identity.d.ts.map +1 -1
  74. package/dist/identity.js +6 -0
  75. package/dist/index.d.ts +10 -7
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +2 -0
  78. package/dist/memory.d.ts +8 -2
  79. package/dist/memory.d.ts.map +1 -1
  80. package/dist/memory.js +33 -6
  81. package/dist/model.d.ts +4 -2
  82. package/dist/model.d.ts.map +1 -1
  83. package/dist/model.js +10 -1
  84. package/dist/observation.d.ts +7 -2
  85. package/dist/observation.d.ts.map +1 -1
  86. package/dist/observation.js +29 -12
  87. package/dist/outcome.d.ts +12 -2
  88. package/dist/outcome.d.ts.map +1 -1
  89. package/dist/outcome.js +4 -0
  90. package/dist/overlay.d.ts +3 -0
  91. package/dist/overlay.d.ts.map +1 -1
  92. package/dist/overlay.js +114 -95
  93. package/dist/query.d.ts +56 -4
  94. package/dist/query.d.ts.map +1 -1
  95. package/dist/query.js +36 -7
  96. package/dist/reach.d.ts +6 -3
  97. package/dist/reach.d.ts.map +1 -1
  98. package/dist/reach.js +30 -5
  99. package/dist/react.d.ts +8 -6
  100. package/dist/react.d.ts.map +1 -1
  101. package/dist/react.js +7 -17
  102. package/dist/read-side.d.ts +16 -7
  103. package/dist/read-side.d.ts.map +1 -1
  104. package/dist/read-side.js +484 -100
  105. package/dist/readiness.d.ts +53 -0
  106. package/dist/readiness.d.ts.map +1 -0
  107. package/dist/readiness.js +33 -0
  108. package/dist/reads.d.ts +11 -0
  109. package/dist/reads.d.ts.map +1 -0
  110. package/dist/reads.js +98 -0
  111. package/dist/recovery.d.ts +25 -0
  112. package/dist/recovery.d.ts.map +1 -0
  113. package/dist/recovery.js +197 -0
  114. package/dist/refresh.d.ts +4 -4
  115. package/dist/refresh.d.ts.map +1 -1
  116. package/dist/refresh.js +18 -11
  117. package/dist/replica.d.ts +10 -5
  118. package/dist/replica.d.ts.map +1 -1
  119. package/dist/replica.js +95 -32
  120. package/dist/room-draft.d.ts +13 -1
  121. package/dist/room-draft.d.ts.map +1 -1
  122. package/dist/room-draft.js +11 -12
  123. package/dist/rows.d.ts +6 -13
  124. package/dist/rows.d.ts.map +1 -1
  125. package/dist/rows.js +10 -13
  126. package/dist/save.d.ts +9 -3
  127. package/dist/save.d.ts.map +1 -1
  128. package/dist/save.js +187 -92
  129. package/dist/search.d.ts +49 -6
  130. package/dist/search.d.ts.map +1 -1
  131. package/dist/search.js +192 -47
  132. package/dist/seed.d.ts +16 -0
  133. package/dist/seed.d.ts.map +1 -0
  134. package/dist/seed.js +75 -0
  135. package/dist/shared.d.ts +14 -0
  136. package/dist/shared.d.ts.map +1 -0
  137. package/dist/shared.js +394 -0
  138. package/dist/status.d.ts +4 -0
  139. package/dist/status.d.ts.map +1 -1
  140. package/dist/store.d.ts +56 -11
  141. package/dist/store.d.ts.map +1 -1
  142. package/dist/store.js +311 -84
  143. package/dist/turn.d.ts +9 -0
  144. package/dist/turn.d.ts.map +1 -0
  145. package/dist/turn.js +64 -0
  146. package/dist/windows.d.ts +26 -0
  147. package/dist/windows.d.ts.map +1 -0
  148. package/dist/windows.js +93 -0
  149. package/dist/wire.d.ts +152 -32
  150. package/dist/wire.d.ts.map +1 -1
  151. package/dist/wire.js +52 -31
  152. package/package.json +6 -2
package/dist/overlay.js CHANGED
@@ -1,4 +1,6 @@
1
- import { apply, parse, serialize } from '@agentshouse/mdmodel';
1
+ import { apply, frontmatterValue, parse, serialize, } from '@agentshouse/mdmodel';
2
+ import { differences, differing, drafted, patched, settled } from './shared.js';
3
+ import { finished } from './turn.js';
2
4
  export function acceptedBinaries(files) {
3
5
  return Object.fromEntries(Object.entries(files).map(([path, file]) => [path, { state: 'accepted', ...file }]));
4
6
  }
@@ -22,6 +24,9 @@ export function sameChange(left, right) {
22
24
  left.author?.name === right.author?.name);
23
25
  }
24
26
  const EMPTY_FRONTMATTER = '---\n---\n';
27
+ function isPart(change) {
28
+ return change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble';
29
+ }
25
30
  function at(path, name) {
26
31
  return `${path} ${name}`;
27
32
  }
@@ -54,51 +59,50 @@ function compose(fields, sections) {
54
59
  const opened = parse(skeleton);
55
60
  if (!opened.ok)
56
61
  return skeleton;
57
- let document = opened.document;
58
- for (const [name, value] of Object.entries(fields)) {
59
- const next = apply(document, { kind: 'field', name, value, prior: undefined });
60
- if (next.outcome === 'applied')
61
- document = next.document;
62
- }
63
- return serialize(document);
62
+ const next = apply(opened.document, Object.entries(fields).flatMap(([name, value]) => frontmatterValue(value) ? [{ kind: 'field', name, value, prior: undefined }] : []));
63
+ return serialize(next.outcome === 'applied' ? next.document : opened.document);
64
64
  }
65
- function edited(document, change, priors) {
66
- if (change.kind === 'field') {
67
- return apply(document, {
65
+ function edited(change, priors) {
66
+ if (change.kind === 'field')
67
+ return {
68
68
  kind: 'field',
69
69
  name: change.name,
70
70
  value: change.value,
71
71
  prior: priors.field(change.path, change.name),
72
- });
73
- }
74
- if (change.kind === 'preamble') {
75
- return apply(document, {
76
- kind: 'preamble',
77
- value: change.value,
78
- prior: priors.preamble(change.path),
79
- });
80
- }
81
- if (change.kind !== 'section')
82
- return null;
83
- return apply(document, {
72
+ };
73
+ if (change.kind === 'preamble')
74
+ return { kind: 'preamble', value: change.value, prior: priors.preamble(change.path) };
75
+ return {
84
76
  kind: 'section',
85
77
  name: change.name,
86
78
  value: change.value,
87
79
  prior: priors.section(change.path, change.name),
88
- });
80
+ };
89
81
  }
90
- function edit(staged, change, priors) {
91
- const text = staged.documents[change.path];
82
+ function edit(staged, changes, priors) {
83
+ const path = changes[0].path;
84
+ delete staged.revisions[path];
85
+ const text = staged.documents[path];
92
86
  if (text === undefined)
93
- return false;
94
- const parsed = parse(text, change.path);
87
+ return changes.length;
88
+ const parsed = parse(text, path);
95
89
  if (!parsed.ok)
96
- return false;
97
- const next = edited(parsed.document, change, priors);
98
- if (next?.outcome !== 'applied')
99
- return false;
100
- staged.documents[change.path] = serialize(next.document);
101
- return true;
90
+ return changes.length;
91
+ const wanted = changes.map((change) => edited(change, priors));
92
+ const first = apply(parsed.document, wanted);
93
+ if (first.outcome === 'refuse')
94
+ return changes.length;
95
+ if (first.outcome === 'applied') {
96
+ staged.documents[path] = serialize(first.document);
97
+ return 0;
98
+ }
99
+ const stale = new Set(first.stale);
100
+ const kept = wanted.filter((_, at) => !stale.has(at));
101
+ const rest = apply(parsed.document, kept);
102
+ if (rest.outcome !== 'applied')
103
+ return changes.length;
104
+ staged.documents[path] = serialize(rest.document);
105
+ return first.stale.length;
102
106
  }
103
107
  function relocate(staged, from, to) {
104
108
  const text = staged.documents[from];
@@ -118,32 +122,37 @@ function relocate(staged, from, to) {
118
122
  }
119
123
  function moveHead(heads, from, to) {
120
124
  const revision = heads.revisions[from];
125
+ const fileId = heads.fileIds[from];
121
126
  const change = heads.changes[from];
122
127
  delete heads.revisions[from];
128
+ delete heads.fileIds[from];
123
129
  delete heads.changes[from];
130
+ delete heads.fileIds[to];
124
131
  delete heads.changes[to];
125
132
  if (revision !== undefined)
126
133
  heads.revisions[to] = revision;
134
+ if (fileId !== undefined)
135
+ heads.fileIds[to] = fileId;
127
136
  if (change !== undefined)
128
137
  heads.changes[to] = change;
129
138
  }
130
139
  function erase(staged, path) {
131
140
  delete staged.documents[path];
132
141
  delete staged.revisions[path];
142
+ delete staged.fileIds[path];
133
143
  delete staged.changes[path];
134
144
  delete staged.binaries[path];
135
145
  }
136
- function stage(staged, change, priors) {
137
- if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
138
- return edit(staged, change, priors);
139
- }
146
+ function stage(staged, change) {
140
147
  if (change.kind === 'create') {
141
148
  staged.documents[change.path] =
142
149
  'content' in change ? change.content : compose(change.fields, change.sections);
150
+ delete staged.fileIds[change.path];
143
151
  delete staged.changes[change.path];
144
152
  return true;
145
153
  }
146
154
  if (change.kind === 'replace') {
155
+ delete staged.revisions[change.path];
147
156
  if (staged.documents[change.path] === undefined)
148
157
  return false;
149
158
  staged.documents[change.path] = change.content;
@@ -171,50 +180,83 @@ function stage(staged, change, priors) {
171
180
  }
172
181
  export function overlay(base, queue, unapplied) {
173
182
  const staged = {
174
- documents: { ...base.documents },
175
- binaries: { ...base.binaries },
176
- revisions: { ...base.revisions },
177
- changes: { ...base.changes },
183
+ documents: drafted(base.documents),
184
+ binaries: drafted(base.binaries),
185
+ revisions: drafted(base.revisions),
186
+ fileIds: drafted(base.fileIds),
187
+ changes: drafted(base.changes),
178
188
  };
179
189
  for (const batch of queue) {
180
190
  const priors = priorsOf(batch.preconditions);
181
- for (const change of batch.changes) {
182
- if (!stage(staged, change, priors))
191
+ for (let index = 0; index < batch.changes.length; index += 1) {
192
+ const change = batch.changes[index];
193
+ if (!isPart(change)) {
194
+ if (!stage(staged, change))
195
+ unapplied?.();
196
+ continue;
197
+ }
198
+ const run = [change];
199
+ while (index + 1 < batch.changes.length) {
200
+ const next = batch.changes[index + 1];
201
+ if (!isPart(next) || next.path !== change.path)
202
+ break;
203
+ run.push(next);
204
+ index += 1;
205
+ }
206
+ for (let left = edit(staged, run, priors); left > 0; left -= 1)
183
207
  unapplied?.();
184
208
  }
185
209
  }
186
210
  return {
187
- documents: staged.documents,
188
- binaries: staged.binaries,
189
- revisions: staged.revisions,
190
- changes: staged.changes,
211
+ documents: settled(staged.documents),
212
+ binaries: settled(staged.binaries),
213
+ revisions: settled(staged.revisions),
214
+ fileIds: settled(staged.fileIds),
215
+ changes: settled(staged.changes),
191
216
  };
192
217
  }
193
218
  function pathsOf(batch) {
194
219
  return batch.changes.flatMap((change) => change.kind === 'move' ? [change.path, change.to] : [change.path]);
195
220
  }
196
221
  export function sameLayerText(left, right) {
197
- const paths = Object.keys(left.documents);
198
- return (paths.length === Object.keys(right.documents).length &&
199
- paths.every((path) => left.documents[path] === right.documents[path]) &&
200
- sameBinaries(left.binaries, right.binaries));
222
+ return finished(sameText(left, right));
223
+ }
224
+ export function* sameText(left, right) {
225
+ return ((yield* differences(left.documents, right.documents)).size === 0 &&
226
+ (yield* differences(left.binaries, right.binaries, sameBinary)).size === 0);
201
227
  }
202
- function sameBinaries(left, right) {
203
- const paths = Object.keys(left);
204
- return (paths.length === Object.keys(right).length &&
205
- paths.every((path) => sameBinary(left[path], right[path])));
228
+ export function changedPaths(left, right) {
229
+ return new Set([
230
+ ...differing(left.documents, right.documents),
231
+ ...differing(left.revisions, right.revisions),
232
+ ...differing(left.fileIds, right.fileIds),
233
+ ...differing(left.changes, right.changes, sameChange),
234
+ ...differing(left.binaries, right.binaries, sameBinary),
235
+ ]);
206
236
  }
207
237
  function replayHeads(base, queue) {
208
- const heads = { revisions: { ...base.revisions }, changes: { ...base.changes } };
238
+ const heads = {
239
+ revisions: drafted(base.revisions),
240
+ fileIds: drafted(base.fileIds),
241
+ changes: drafted(base.changes),
242
+ };
209
243
  for (const batch of queue) {
210
244
  for (const change of batch.changes) {
211
245
  if (change.kind === 'remove') {
212
246
  delete heads.revisions[change.path];
247
+ delete heads.fileIds[change.path];
213
248
  delete heads.changes[change.path];
214
249
  }
215
250
  else if (change.kind === 'create') {
251
+ delete heads.fileIds[change.path];
216
252
  delete heads.changes[change.path];
217
253
  }
254
+ else if (change.kind === 'replace' ||
255
+ change.kind === 'field' ||
256
+ change.kind === 'section' ||
257
+ change.kind === 'preamble') {
258
+ delete heads.revisions[change.path];
259
+ }
218
260
  else if (change.kind === 'binary') {
219
261
  delete heads.revisions[change.path];
220
262
  delete heads.changes[change.path];
@@ -224,7 +266,11 @@ function replayHeads(base, queue) {
224
266
  }
225
267
  }
226
268
  }
227
- return heads;
269
+ return {
270
+ revisions: settled(heads.revisions),
271
+ fileIds: settled(heads.fileIds),
272
+ changes: settled(heads.changes),
273
+ };
228
274
  }
229
275
  export function overlayChanged(base, queue, previousBase, previousQueue, previousVisible) {
230
276
  const before = previousQueue.map((batch) => JSON.stringify(batch));
@@ -238,24 +284,7 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
238
284
  ...replayHeads(base, queue),
239
285
  };
240
286
  }
241
- const affected = new Set();
242
- const paths = new Set([
243
- ...Object.keys(base.documents),
244
- ...Object.keys(previousBase.documents),
245
- ...Object.keys(base.revisions),
246
- ...Object.keys(previousBase.revisions),
247
- ...Object.keys(base.changes),
248
- ...Object.keys(previousBase.changes),
249
- ...Object.keys(base.binaries),
250
- ...Object.keys(previousBase.binaries),
251
- ]);
252
- for (const path of paths) {
253
- if (base.documents[path] !== previousBase.documents[path] ||
254
- base.revisions[path] !== previousBase.revisions[path] ||
255
- !sameChange(base.changes[path], previousBase.changes[path]) ||
256
- !sameBinary(base.binaries[path], previousBase.binaries[path]))
257
- affected.add(path);
258
- }
287
+ const affected = new Set(changedPaths(base, previousBase));
259
288
  const oldIds = new Set(before);
260
289
  const newIds = new Set(after);
261
290
  for (const batch of previousQueue) {
@@ -285,6 +314,7 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
285
314
  }
286
315
  const documents = {};
287
316
  const revisions = {};
317
+ const fileIds = {};
288
318
  const changes = {};
289
319
  const binaries = {};
290
320
  for (const path of affected) {
@@ -292,30 +322,19 @@ export function overlayChanged(base, queue, previousBase, previousQueue, previou
292
322
  documents[path] = base.documents[path];
293
323
  if (base.revisions[path] !== undefined)
294
324
  revisions[path] = base.revisions[path];
325
+ if (base.fileIds[path] !== undefined)
326
+ fileIds[path] = base.fileIds[path];
295
327
  if (base.changes[path] !== undefined)
296
328
  changes[path] = base.changes[path];
297
329
  if (base.binaries[path] !== undefined)
298
330
  binaries[path] = base.binaries[path];
299
331
  }
300
- const staged = overlay({ documents, revisions, changes, binaries }, queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))));
301
- const mergedDocuments = { ...previousVisible.documents };
302
- const mergedRevisions = { ...previousVisible.revisions };
303
- const mergedChanges = { ...previousVisible.changes };
304
- const mergedBinaries = { ...previousVisible.binaries };
305
- for (const path of affected) {
306
- delete mergedDocuments[path];
307
- delete mergedRevisions[path];
308
- delete mergedChanges[path];
309
- delete mergedBinaries[path];
310
- }
311
- Object.assign(mergedDocuments, staged.documents);
312
- Object.assign(mergedRevisions, staged.revisions);
313
- Object.assign(mergedChanges, staged.changes);
314
- Object.assign(mergedBinaries, staged.binaries);
332
+ const staged = overlay({ documents, revisions, fileIds, changes, binaries }, queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))));
315
333
  return {
316
- documents: mergedDocuments,
317
- revisions: mergedRevisions,
318
- changes: mergedChanges,
319
- binaries: mergedBinaries,
334
+ documents: patched(previousVisible.documents, Object.entries(staged.documents), affected),
335
+ revisions: patched(previousVisible.revisions, Object.entries(staged.revisions), affected),
336
+ fileIds: patched(previousVisible.fileIds, Object.entries(staged.fileIds), affected),
337
+ changes: patched(previousVisible.changes, Object.entries(staged.changes), affected),
338
+ binaries: patched(previousVisible.binaries, Object.entries(staged.binaries), affected),
320
339
  };
321
340
  }
package/dist/query.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type Definition } from '@agentshouse/mdmodel';
2
2
  import type { HeadChange } from './adapter.js';
3
3
  import type { BinaryFileRecord } from './binary.js';
4
+ import type { Open } from './open.js';
4
5
  export type Value = string | number | boolean | null;
5
6
  export type Predicate = Value | {
6
7
  $eq: Value;
@@ -37,6 +38,8 @@ export type Filter = {
37
38
  types?: readonly string[];
38
39
  where?: Where;
39
40
  pathPrefix?: string;
41
+ folder?: string;
42
+ paths?: readonly string[];
40
43
  hop?: Related & {
41
44
  field: string;
42
45
  };
@@ -44,7 +47,7 @@ export type Filter = {
44
47
  field?: string;
45
48
  };
46
49
  };
47
- export type Key = 'room' | 'path' | 'type' | {
50
+ export type Key = 'room' | 'path' | 'type' | 'folder' | {
48
51
  field: string;
49
52
  };
50
53
  export type Select = 'all' | {
@@ -54,6 +57,7 @@ export type Select = 'all' | {
54
57
  markdown?: true;
55
58
  backlinks?: true;
56
59
  change?: true;
60
+ fileId?: true;
57
61
  };
58
62
  export type OrderOptions = {
59
63
  nulls?: 'first' | 'last';
@@ -69,6 +73,8 @@ export type DocumentQuery = Filter & {
69
73
  direction?: Direction;
70
74
  } & OrderOptions)[];
71
75
  limit?: number;
76
+ after?: string;
77
+ total?: true;
72
78
  };
73
79
  export type GroupQuery = Filter & {
74
80
  groupBy: readonly Exclude<Key, 'path'>[];
@@ -77,6 +83,8 @@ export type GroupQuery = Filter & {
77
83
  direction?: Direction;
78
84
  }[];
79
85
  limit?: number;
86
+ after?: string;
87
+ total?: true;
80
88
  };
81
89
  export type LocalQuery = DocumentQuery | GroupQuery;
82
90
  export type Backlink = {
@@ -94,19 +102,49 @@ export type QueryDocument = {
94
102
  markdown?: string;
95
103
  backlinks?: readonly Backlink[];
96
104
  change?: HeadChange | null;
105
+ fileId?: string | null;
97
106
  binaryFile?: BinaryFileRecord;
98
107
  };
99
108
  export type QueryGroup = {
100
109
  key: readonly unknown[];
101
110
  count: number;
102
111
  };
103
- export type DocumentResult = {
112
+ export type CoveredRoom = {
113
+ room: string;
114
+ generation: string;
115
+ current: boolean;
116
+ };
117
+ export type QueryCoverage = {
118
+ rooms: readonly CoveredRoom[];
119
+ indexes: readonly string[];
120
+ overlay: readonly string[];
121
+ };
122
+ export type Awaits = Open<'acquisition' | 'preparation' | 'index'>;
123
+ export type PendingRoom = {
124
+ room: string;
125
+ awaits: Awaits;
126
+ };
127
+ export type PendingResult = {
128
+ pending: readonly PendingRoom[];
129
+ };
130
+ export type DocumentRows = {
104
131
  documents: readonly QueryDocument[];
132
+ next?: string;
133
+ total?: number;
105
134
  };
106
- export type GroupResult = {
135
+ export type GroupRows = {
107
136
  groups: readonly QueryGroup[];
137
+ next?: string;
138
+ total?: number;
139
+ };
140
+ export type QueryRows = DocumentRows | GroupRows;
141
+ export type DocumentResult = DocumentRows & {
142
+ coverage: QueryCoverage;
143
+ };
144
+ export type GroupResult = GroupRows & {
145
+ coverage: QueryCoverage;
108
146
  };
109
- export type QueryResult = DocumentResult | GroupResult;
147
+ export type QueryResult = DocumentResult | GroupResult | PendingResult;
110
148
  export type QueryErrorCode = 'invalid-query' | 'unknown-type' | 'unknown-field' | 'wrong-kind';
111
149
  export type RoomFacts = {
112
150
  locator: string;
@@ -161,6 +199,8 @@ export type KeyPlan = {
161
199
  of: 'path';
162
200
  } | {
163
201
  of: 'type';
202
+ } | {
203
+ of: 'folder';
164
204
  } | {
165
205
  of: 'field';
166
206
  field: string;
@@ -173,6 +213,7 @@ export type DocumentShape = {
173
213
  markdown: boolean;
174
214
  backlinks: boolean;
175
215
  change: boolean;
216
+ fileId: boolean;
176
217
  orderBy: readonly {
177
218
  key: KeyPlan;
178
219
  options: OrderOptions & {
@@ -192,10 +233,17 @@ export type PlanReach = {
192
233
  rooms: readonly string[];
193
234
  documents: readonly string[];
194
235
  };
236
+ export type Continuation = {
237
+ text: string;
238
+ values: readonly unknown[] | null;
239
+ };
195
240
  export type Plan = {
241
+ key: string;
196
242
  rooms: readonly string[] | null;
197
243
  reach: PlanReach | null;
198
244
  root: Scope;
245
+ folder: string | null;
246
+ paths: readonly string[] | null;
199
247
  hop: (Scope & {
200
248
  field: string;
201
249
  }) | null;
@@ -204,6 +252,8 @@ export type Plan = {
204
252
  }) | null;
205
253
  shape: DocumentShape | GroupShape;
206
254
  limit: number | null;
255
+ after: Continuation | null;
256
+ total: boolean;
207
257
  };
208
258
  export declare class QueryError extends Error {
209
259
  readonly code: QueryErrorCode;
@@ -214,9 +264,11 @@ type Entries = Readonly<Record<string, unknown>>;
214
264
  export declare function invalid(at: string, problem: string): never;
215
265
  export declare function plain(value: unknown): value is Entries;
216
266
  export declare function known(value: Entries, allowed: readonly string[], at: string): void;
267
+ export declare function flag(input: unknown, at: string): boolean;
217
268
  export declare function planOf(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
218
269
  export declare function limitOf(input: unknown): number | null;
219
270
  export declare function filterOf(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
271
+ export declare function queryKey(query: unknown): string;
220
272
  export declare function identityOf(plan: Plan): string;
221
273
  export {};
222
274
  //# 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,9 +12,9 @@ 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
- const PARTS = ['fields', 'sections', 'preamble', 'markdown', 'backlinks', 'change'];
17
+ const PARTS = ['fields', 'sections', 'preamble', 'markdown', 'backlinks', 'change', 'fileId'];
17
18
  const ORDER = ['by', 'direction', 'nulls', 'stringSort', 'locale', 'localeOptions'];
18
19
  const CALENDAR_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
19
20
  const STRAY_ESCAPE = /~(?![01])/u;
@@ -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)
@@ -377,6 +386,7 @@ function documentShape(typed, input) {
377
386
  markdown: true,
378
387
  backlinks: true,
379
388
  change: true,
389
+ fileId: true,
380
390
  orderBy,
381
391
  };
382
392
  }
@@ -391,6 +401,7 @@ function documentShape(typed, input) {
391
401
  markdown: flag(select.markdown, 'select.markdown'),
392
402
  backlinks: flag(select.backlinks, 'select.backlinks'),
393
403
  change: flag(select.change, 'select.change'),
404
+ fileId: flag(select.fileId, 'select.fileId'),
394
405
  orderBy,
395
406
  };
396
407
  }
@@ -421,20 +432,35 @@ export function planOf(input, facts, reach = null) {
421
432
  invalid('select', 'a grouped query selects nothing');
422
433
  if (!grouped && input.select === undefined)
423
434
  invalid('select', 'a Document query must select');
424
- known(input, [...FILTER, 'orderBy', 'limit', grouped ? 'groupBy' : 'select'], '');
435
+ known(input, [...FILTER, 'orderBy', 'limit', 'after', 'total', grouped ? 'groupBy' : 'select'], '');
425
436
  const limit = limitOf(input.limit);
426
437
  const rooms = input.rooms === undefined ? null : names(input.rooms, 'rooms');
427
438
  const { typed, ...root } = scope(facts, rooms, input, '');
439
+ const shape = grouped ? groupShape(typed, input) : documentShape(typed, input);
428
440
  return {
441
+ key: queryKey(input),
429
442
  rooms,
430
443
  reach,
431
444
  root,
445
+ folder: input.folder === undefined ? null : directory(input.folder, 'folder'),
446
+ paths: input.paths === undefined ? null : pathsOf(input.paths),
432
447
  hop: input.hop === undefined ? null : hopOf(facts, rooms, typed, input.hop),
433
448
  backlinks: input.backlinks === undefined ? null : backlinksOf(facts, rooms, input.backlinks),
434
- shape: grouped ? groupShape(typed, input) : documentShape(typed, input),
449
+ shape,
435
450
  limit,
451
+ after: continuationOf(input.after, shape.orderBy.length + 1),
452
+ total: flag(input.total, 'total'),
436
453
  };
437
454
  }
455
+ function continuationOf(input, arity) {
456
+ if (input === undefined)
457
+ return null;
458
+ const values = typeof input === 'string' ? decodedCursor(input) : null;
459
+ if (values === null || (values.length !== 0 && values.length !== arity)) {
460
+ invalid('after', 'expects the next an earlier result of this query returned');
461
+ }
462
+ return { text: input, values: values.length === 0 ? null : values };
463
+ }
438
464
  export function limitOf(input) {
439
465
  if (input === undefined)
440
466
  return null;
@@ -449,6 +475,9 @@ export function filterOf(input, facts, reach = null) {
449
475
  known(input, FILTER, '');
450
476
  return planOf({ ...input, select: {} }, facts, reach);
451
477
  }
478
+ export function queryKey(query) {
479
+ return canonical(query);
480
+ }
452
481
  function canonical(value) {
453
482
  if (Array.isArray(value))
454
483
  return `[${value.map(canonical).join(',')}]`;