@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.
- package/AGENTS.md +205 -205
- package/README.md +8 -8
- package/dist/adapter.d.ts +36 -9
- package/dist/adapter.d.ts.map +1 -1
- package/dist/bootstrap.d.ts +2 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +1 -1
- package/dist/change-set.d.ts +5 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +6 -1
- package/dist/chat/earlier.d.ts +10 -0
- package/dist/chat/earlier.d.ts.map +1 -0
- package/dist/chat/earlier.js +54 -0
- package/dist/chat/kit.js +1 -1
- package/dist/chat/list.d.ts +2 -1
- package/dist/chat/list.d.ts.map +1 -1
- package/dist/chat/list.js +45 -5
- package/dist/chat/markdown.d.ts +1 -0
- package/dist/chat/markdown.d.ts.map +1 -1
- package/dist/chat/markdown.js +78 -20
- package/dist/chat/message.d.ts +1 -0
- package/dist/chat/message.d.ts.map +1 -1
- package/dist/chat/message.js +12 -2
- package/dist/chat/messages.d.ts +2 -0
- package/dist/chat/messages.d.ts.map +1 -1
- package/dist/chat/messages.js +52 -20
- package/dist/chat/overlay.d.ts +1 -0
- package/dist/chat/overlay.d.ts.map +1 -1
- package/dist/chat/overlay.js +10 -0
- package/dist/chat/pieces.d.ts +62 -0
- package/dist/chat/pieces.d.ts.map +1 -0
- package/dist/chat/pieces.js +1110 -0
- package/dist/chat/provider.d.ts +1 -0
- package/dist/chat/provider.d.ts.map +1 -1
- package/dist/chat/provider.js +23 -14
- package/dist/chat/question.d.ts +1 -1
- package/dist/chat/question.d.ts.map +1 -1
- package/dist/chat/question.js +7 -18
- package/dist/chat/ready.d.ts +1 -1
- package/dist/chat/ready.d.ts.map +1 -1
- package/dist/chat/ready.js +1 -1
- package/dist/chat/steady.d.ts +3 -0
- package/dist/chat/steady.d.ts.map +1 -0
- package/dist/chat/steady.js +26 -0
- package/dist/chat/style.js +1 -1
- package/dist/chat.d.ts +2 -2
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +2 -2
- package/dist/client.d.ts +6 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +16 -5
- package/dist/collection.d.ts +4 -3
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +128 -63
- package/dist/connection.d.ts +12 -4
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +577 -217
- package/dist/conversation.d.ts +12 -0
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +196 -41
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +2 -1
- package/dist/host.d.ts +5 -4
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +45 -5
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/memory.d.ts +6 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +17 -11
- package/dist/observation.d.ts +2 -0
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +9 -3
- package/dist/outcome.d.ts +14 -2
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +7 -0
- package/dist/overlay.d.ts +4 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +181 -140
- package/dist/query.d.ts +26 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +34 -6
- package/dist/reach.d.ts +4 -1
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +90 -21
- package/dist/react.d.ts +3 -3
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -17
- package/dist/read-side.d.ts +3 -1
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +271 -82
- package/dist/reads.d.ts +11 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +98 -0
- package/dist/refresh.d.ts +4 -4
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +35 -16
- package/dist/replica.d.ts +11 -5
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +69 -40
- package/dist/room-draft.d.ts +12 -0
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +11 -12
- package/dist/rows.d.ts +1 -0
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +5 -0
- package/dist/save.d.ts +4 -2
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +195 -111
- package/dist/search.d.ts +17 -2
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +81 -7
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +75 -0
- package/dist/shared.d.ts +4 -0
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +63 -33
- package/dist/store.d.ts +18 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +398 -316
- package/dist/turn.d.ts +5 -3
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +26 -7
- package/dist/windows.d.ts +26 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +93 -0
- package/dist/wire.d.ts +16 -0
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +4 -0
- package/package.json +2 -2
- package/dist/acquisition.d.ts +0 -14
- package/dist/acquisition.d.ts.map +0 -1
- 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 {
|
|
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
|
-
|
|
59
|
-
|
|
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(
|
|
67
|
-
if (change.kind === 'field')
|
|
68
|
-
return
|
|
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
|
-
|
|
76
|
-
|
|
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,
|
|
92
|
-
const
|
|
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
|
|
95
|
-
const parsed = parse(text,
|
|
88
|
+
return changes.length;
|
|
89
|
+
const parsed = parse(text, path);
|
|
96
90
|
if (!parsed.ok)
|
|
97
|
-
return
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
|
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
|
|
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 (
|
|
193
|
-
|
|
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:
|
|
199
|
-
binaries:
|
|
200
|
-
revisions:
|
|
201
|
-
fileIds:
|
|
202
|
-
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
|
-
|
|
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
|
|
209
|
-
return (
|
|
210
|
-
|
|
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
|
-
...
|
|
215
|
-
...
|
|
216
|
-
...
|
|
217
|
-
...
|
|
218
|
-
...
|
|
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
|
|
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
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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:
|
|
255
|
-
fileIds:
|
|
256
|
-
changes:
|
|
297
|
+
revisions: yield* settling(heads.revisions),
|
|
298
|
+
fileIds: yield* settling(heads.fileIds),
|
|
299
|
+
changes: yield* settling(heads.changes),
|
|
257
300
|
};
|
|
258
301
|
}
|
|
259
|
-
|
|
260
|
-
const
|
|
261
|
-
const
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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,
|
|
321
|
+
...(yield* replayHeads(base, batch)),
|
|
269
322
|
};
|
|
270
323
|
}
|
|
271
|
-
const affected = new Set(changedPaths(base, previousBase));
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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 =
|
|
356
|
+
const staged = replayed ? yield* overlaying(restricted, [batch]) : base;
|
|
357
|
+
const from = (path) => (touched.has(path) ? staged : base);
|
|
317
358
|
return {
|
|
318
|
-
documents:
|
|
319
|
-
revisions:
|
|
320
|
-
fileIds:
|
|
321
|
-
changes:
|
|
322
|
-
binaries:
|
|
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
|
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EAGhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
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
|
|
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(',')}]`;
|