@agentshouse/mdruntime 0.1.0-ca68e8b4bbebc → 0.1.0-ca69b8fe1fa9f
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/README.md +19 -16
- package/dist/adapter.d.ts +142 -70
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +5 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +38 -4
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +26 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +181 -103
- package/dist/chain.d.ts +12 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -89
- package/dist/change.d.ts +31 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +10 -1
- package/dist/client.d.ts +19 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +86 -9
- package/dist/collection.d.ts +11 -21
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +39 -291
- package/dist/compile.d.ts +11 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +589 -0
- package/dist/connection.d.ts +28 -17
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3147 -1396
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/{chat/context.js → context.js} +1 -4
- package/dist/conversation.d.ts +29 -14
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +423 -198
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/durability.d.ts +2 -5
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +5 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +31 -27
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -122
- package/dist/host.d.ts +3 -10
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +65 -39
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +19 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/job.d.ts +14 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +28 -0
- package/dist/live.d.ts +23 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +127 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +218 -0
- package/dist/memory.d.ts +12 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +202 -103
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +89 -0
- package/dist/model.d.ts +7 -3
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -13
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +17 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +100 -5
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/outcome.d.ts +45 -7
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +39 -0
- package/dist/overlay.d.ts +2 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +87 -172
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -0
- package/dist/query.d.ts +16 -190
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -470
- package/dist/reach.d.ts +17 -8
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +219 -90
- package/dist/react.d.ts +4 -3
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +2 -14
- package/dist/readiness.d.ts +14 -17
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +2 -8
- package/dist/recovery.d.ts +3 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +34 -7
- package/dist/refresh.d.ts +18 -15
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +155 -58
- package/dist/replica.d.ts +56 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +301 -191
- package/dist/room-draft.d.ts +23 -4
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +158 -71
- package/dist/rows.d.ts +22 -30
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +63 -114
- package/dist/save.d.ts +53 -14
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +529 -185
- package/dist/search.d.ts +12 -82
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -207
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +18 -4
- package/dist/shared.d.ts +7 -3
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +119 -66
- package/dist/status.d.ts +4 -3
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -1
- package/dist/store.d.ts +92 -98
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +330 -675
- package/dist/stored.d.ts +162 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +543 -0
- package/dist/tables.d.ts +353 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +588 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +5 -3
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +51 -21
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +104 -0
- package/dist/windows.d.ts +11 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +16 -0
- package/dist/wire.d.ts +34 -5
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +10 -2
- package/package.json +18 -19
- package/AGENTS.md +0 -299
- package/dist/acquisition.d.ts +0 -14
- package/dist/acquisition.d.ts.map +0 -1
- package/dist/acquisition.js +0 -24
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -61
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -27
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -63
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -22
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -155
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -629
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts +0 -31
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/questions.js +0 -111
- package/dist/chat/read.d.ts +0 -5
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/read.js +0 -13
- package/dist/chat/ready.d.ts +0 -34
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/read-side.d.ts +0 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -642
- package/dist/reads.d.ts +0 -11
- package/dist/reads.d.ts.map +0 -1
- package/dist/reads.js +0 -98
package/dist/overlay.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { apply, parse, serialize } from '@agentshouse/mdmodel';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { apply, frontmatterValue, parse, serialize, } from '@agentshouse/mdmodel';
|
|
2
|
+
import { drafted, entriesIn, settling } from './shared.js';
|
|
3
|
+
import { ROW_WEIGHT } from './turn.js';
|
|
4
|
+
export function* acceptedBinaries(files) {
|
|
5
|
+
for (const [path, file] of entriesIn(files))
|
|
6
|
+
yield [path, { state: 'accepted', ...file }];
|
|
5
7
|
}
|
|
6
8
|
export function sameBinary(left, right) {
|
|
7
9
|
if (left === undefined || right === undefined)
|
|
@@ -11,7 +13,7 @@ export function sameBinary(left, right) {
|
|
|
11
13
|
left.mediaType === right.mediaType &&
|
|
12
14
|
left.sha256 === right.sha256 &&
|
|
13
15
|
(left.state === 'accepted'
|
|
14
|
-
? right.state === 'accepted'
|
|
16
|
+
? right.state === 'accepted'
|
|
15
17
|
: right.state === 'pending' && left.localId === right.localId));
|
|
16
18
|
}
|
|
17
19
|
export function sameChange(left, right) {
|
|
@@ -23,10 +25,13 @@ export function sameChange(left, right) {
|
|
|
23
25
|
left.author?.name === right.author?.name);
|
|
24
26
|
}
|
|
25
27
|
const EMPTY_FRONTMATTER = '---\n---\n';
|
|
28
|
+
function isPart(change) {
|
|
29
|
+
return change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble';
|
|
30
|
+
}
|
|
26
31
|
function at(path, name) {
|
|
27
32
|
return `${path} ${name}`;
|
|
28
33
|
}
|
|
29
|
-
function priorsOf(preconditions) {
|
|
34
|
+
function* priorsOf(preconditions) {
|
|
30
35
|
const fields = new Map();
|
|
31
36
|
const sections = new Map();
|
|
32
37
|
const preambles = new Map();
|
|
@@ -40,6 +45,7 @@ function priorsOf(preconditions) {
|
|
|
40
45
|
if (precondition.kind === 'preamble') {
|
|
41
46
|
preambles.set(precondition.path, precondition.value);
|
|
42
47
|
}
|
|
48
|
+
yield ROW_WEIGHT;
|
|
43
49
|
}
|
|
44
50
|
return {
|
|
45
51
|
field: (path, name) => fields.get(at(path, name)),
|
|
@@ -55,51 +61,50 @@ function compose(fields, sections) {
|
|
|
55
61
|
const opened = parse(skeleton);
|
|
56
62
|
if (!opened.ok)
|
|
57
63
|
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);
|
|
64
|
+
const next = apply(opened.document, Object.entries(fields).flatMap(([name, value]) => frontmatterValue(value) ? [{ kind: 'field', name, value, prior: undefined }] : []));
|
|
65
|
+
return serialize(next.outcome === 'applied' ? next.document : opened.document);
|
|
65
66
|
}
|
|
66
|
-
function edited(
|
|
67
|
-
if (change.kind === 'field')
|
|
68
|
-
return
|
|
67
|
+
function edited(change, priors) {
|
|
68
|
+
if (change.kind === 'field')
|
|
69
|
+
return {
|
|
69
70
|
kind: 'field',
|
|
70
71
|
name: change.name,
|
|
71
72
|
value: change.value,
|
|
72
73
|
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, {
|
|
74
|
+
};
|
|
75
|
+
if (change.kind === 'preamble')
|
|
76
|
+
return { kind: 'preamble', value: change.value, prior: priors.preamble(change.path) };
|
|
77
|
+
return {
|
|
85
78
|
kind: 'section',
|
|
86
79
|
name: change.name,
|
|
87
80
|
value: change.value,
|
|
88
81
|
prior: priors.section(change.path, change.name),
|
|
89
|
-
}
|
|
82
|
+
};
|
|
90
83
|
}
|
|
91
|
-
function edit(staged,
|
|
92
|
-
const
|
|
84
|
+
function edit(staged, changes, priors) {
|
|
85
|
+
const path = changes[0].path;
|
|
86
|
+
delete staged.revisions[path];
|
|
87
|
+
const text = staged.documents[path];
|
|
93
88
|
if (text === undefined)
|
|
94
|
-
return
|
|
95
|
-
const parsed = parse(text,
|
|
89
|
+
return changes.length;
|
|
90
|
+
const parsed = parse(text, path);
|
|
96
91
|
if (!parsed.ok)
|
|
97
|
-
return
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
92
|
+
return changes.length;
|
|
93
|
+
const wanted = changes.map((change) => edited(change, priors));
|
|
94
|
+
const first = apply(parsed.document, wanted);
|
|
95
|
+
if (first.outcome === 'refuse')
|
|
96
|
+
return changes.length;
|
|
97
|
+
if (first.outcome === 'applied') {
|
|
98
|
+
staged.documents[path] = serialize(first.document);
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
const stale = new Set(first.stale);
|
|
102
|
+
const kept = wanted.filter((_, at) => !stale.has(at));
|
|
103
|
+
const rest = apply(parsed.document, kept);
|
|
104
|
+
if (rest.outcome !== 'applied')
|
|
105
|
+
return changes.length;
|
|
106
|
+
staged.documents[path] = serialize(rest.document);
|
|
107
|
+
return first.stale.length;
|
|
103
108
|
}
|
|
104
109
|
function relocate(staged, from, to) {
|
|
105
110
|
const text = staged.documents[from];
|
|
@@ -140,11 +145,7 @@ function erase(staged, path) {
|
|
|
140
145
|
delete staged.changes[path];
|
|
141
146
|
delete staged.binaries[path];
|
|
142
147
|
}
|
|
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
|
-
}
|
|
148
|
+
function stage(staged, change) {
|
|
148
149
|
if (change.kind === 'create') {
|
|
149
150
|
staged.documents[change.path] =
|
|
150
151
|
'content' in change ? change.content : compose(change.fields, change.sections);
|
|
@@ -176,10 +177,27 @@ function stage(staged, change, priors) {
|
|
|
176
177
|
if (change.kind === 'move') {
|
|
177
178
|
return relocate(staged, change.path, change.to);
|
|
178
179
|
}
|
|
180
|
+
if (change.kind === 'arrival') {
|
|
181
|
+
erase(staged, change.path);
|
|
182
|
+
if ('content' in change)
|
|
183
|
+
staged.documents[change.path] = change.content;
|
|
184
|
+
else
|
|
185
|
+
staged.binaries[change.path] = { state: 'accepted', ...change.binary };
|
|
186
|
+
arrive(staged, change);
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
179
189
|
erase(staged, change.path);
|
|
180
190
|
return true;
|
|
181
191
|
}
|
|
182
|
-
|
|
192
|
+
function arrive(heads, change) {
|
|
193
|
+
if (change.revision !== undefined)
|
|
194
|
+
heads.revisions[change.path] = change.revision;
|
|
195
|
+
if (change.fileId !== undefined)
|
|
196
|
+
heads.fileIds[change.path] = change.fileId;
|
|
197
|
+
if (change.change !== undefined)
|
|
198
|
+
heads.changes[change.path] = change.change;
|
|
199
|
+
}
|
|
200
|
+
export function* overlaying(base, queue, unapplied) {
|
|
183
201
|
const staged = {
|
|
184
202
|
documents: drafted(base.documents),
|
|
185
203
|
binaries: drafted(base.binaries),
|
|
@@ -188,137 +206,34 @@ export function overlay(base, queue, unapplied) {
|
|
|
188
206
|
changes: drafted(base.changes),
|
|
189
207
|
};
|
|
190
208
|
for (const batch of queue) {
|
|
191
|
-
const priors = priorsOf(batch.preconditions);
|
|
192
|
-
for (
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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),
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
function pathsOf(batch) {
|
|
206
|
-
return batch.changes.flatMap((change) => change.kind === 'move' ? [change.path, change.to] : [change.path]);
|
|
207
|
-
}
|
|
208
|
-
export function sameLayerText(left, right) {
|
|
209
|
-
return (differing(left.documents, right.documents).size === 0 &&
|
|
210
|
-
differing(left.binaries, right.binaries, sameBinary).size === 0);
|
|
211
|
-
}
|
|
212
|
-
export function changedPaths(left, right) {
|
|
213
|
-
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),
|
|
219
|
-
]);
|
|
220
|
-
}
|
|
221
|
-
function replayHeads(base, queue) {
|
|
222
|
-
const heads = {
|
|
223
|
-
revisions: drafted(base.revisions),
|
|
224
|
-
fileIds: drafted(base.fileIds),
|
|
225
|
-
changes: drafted(base.changes),
|
|
226
|
-
};
|
|
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
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
return {
|
|
254
|
-
revisions: settled(heads.revisions),
|
|
255
|
-
fileIds: settled(heads.fileIds),
|
|
256
|
-
changes: settled(heads.changes),
|
|
257
|
-
};
|
|
258
|
-
}
|
|
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)) {
|
|
265
|
-
return {
|
|
266
|
-
documents: previousVisible.documents,
|
|
267
|
-
binaries: previousVisible.binaries,
|
|
268
|
-
...replayHeads(base, queue),
|
|
269
|
-
};
|
|
270
|
-
}
|
|
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);
|
|
283
|
-
}
|
|
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)))
|
|
209
|
+
const priors = yield* priorsOf(batch.preconditions);
|
|
210
|
+
for (let index = 0; index < batch.changes.length; index += 1) {
|
|
211
|
+
const change = batch.changes[index];
|
|
212
|
+
if (!isPart(change)) {
|
|
213
|
+
if (!stage(staged, change))
|
|
214
|
+
unapplied?.();
|
|
215
|
+
yield ROW_WEIGHT;
|
|
290
216
|
continue;
|
|
291
|
-
for (const path of touched) {
|
|
292
|
-
if (affected.has(path))
|
|
293
|
-
continue;
|
|
294
|
-
affected.add(path);
|
|
295
|
-
expanded = true;
|
|
296
217
|
}
|
|
218
|
+
const run = [change];
|
|
219
|
+
while (index + 1 < batch.changes.length) {
|
|
220
|
+
const next = batch.changes[index + 1];
|
|
221
|
+
if (!isPart(next) || next.path !== change.path)
|
|
222
|
+
break;
|
|
223
|
+
run.push(next);
|
|
224
|
+
index += 1;
|
|
225
|
+
}
|
|
226
|
+
const text = staged.documents[change.path] ?? '';
|
|
227
|
+
for (let left = edit(staged, run, priors); left > 0; left -= 1)
|
|
228
|
+
unapplied?.();
|
|
229
|
+
yield ROW_WEIGHT + text.length;
|
|
297
230
|
}
|
|
298
231
|
}
|
|
299
|
-
const documents = {};
|
|
300
|
-
const revisions = {};
|
|
301
|
-
const fileIds = {};
|
|
302
|
-
const changes = {};
|
|
303
|
-
const binaries = {};
|
|
304
|
-
for (const path of affected) {
|
|
305
|
-
if (base.documents[path] !== undefined)
|
|
306
|
-
documents[path] = base.documents[path];
|
|
307
|
-
if (base.revisions[path] !== undefined)
|
|
308
|
-
revisions[path] = base.revisions[path];
|
|
309
|
-
if (base.fileIds[path] !== undefined)
|
|
310
|
-
fileIds[path] = base.fileIds[path];
|
|
311
|
-
if (base.changes[path] !== undefined)
|
|
312
|
-
changes[path] = base.changes[path];
|
|
313
|
-
if (base.binaries[path] !== undefined)
|
|
314
|
-
binaries[path] = base.binaries[path];
|
|
315
|
-
}
|
|
316
|
-
const staged = overlay({ documents, revisions, fileIds, changes, binaries }, queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))));
|
|
317
232
|
return {
|
|
318
|
-
documents:
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
233
|
+
documents: yield* settling(staged.documents),
|
|
234
|
+
binaries: yield* settling(staged.binaries),
|
|
235
|
+
revisions: yield* settling(staged.revisions),
|
|
236
|
+
fileIds: yield* settling(staged.fileIds),
|
|
237
|
+
changes: yield* settling(staged.changes),
|
|
323
238
|
};
|
|
324
239
|
}
|
package/dist/paths.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function normalize(path: string): string | null;
|
|
2
2
|
export declare function beneath(prefix: string, path: string): boolean;
|
|
3
3
|
export declare function covered(prefixes: readonly string[], path: string): boolean;
|
|
4
|
+
export declare function ancestors(path: string): readonly string[];
|
|
4
5
|
//# sourceMappingURL=paths.d.ts.map
|
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E"}
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAGzD"}
|
package/dist/paths.js
CHANGED
|
@@ -22,3 +22,7 @@ export function covered(prefixes, path) {
|
|
|
22
22
|
return normalized !== null && (normalized === '' || beneath(normalized, path));
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
|
+
export function ancestors(path) {
|
|
26
|
+
const parts = path.split('/');
|
|
27
|
+
return parts.slice(1).map((_, at) => parts.slice(0, at + 1).join('/'));
|
|
28
|
+
}
|
package/dist/query.d.ts
CHANGED
|
@@ -1,86 +1,7 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type HeldRooms, type QueryPlan } from '@agentshouse/mdmodel';
|
|
2
2
|
import type { HeadChange } from './adapter.js';
|
|
3
3
|
import type { BinaryFileRecord } from './binary.js';
|
|
4
4
|
import type { Open } from './open.js';
|
|
5
|
-
export type Value = string | number | boolean | null;
|
|
6
|
-
export type Predicate = Value | {
|
|
7
|
-
$eq: Value;
|
|
8
|
-
} | {
|
|
9
|
-
$ne: Value;
|
|
10
|
-
} | {
|
|
11
|
-
$in: readonly Value[];
|
|
12
|
-
} | {
|
|
13
|
-
$nin: readonly Value[];
|
|
14
|
-
} | {
|
|
15
|
-
$gt?: Value;
|
|
16
|
-
$gte?: Value;
|
|
17
|
-
$lt?: Value;
|
|
18
|
-
$lte?: Value;
|
|
19
|
-
} | {
|
|
20
|
-
$all: readonly Value[];
|
|
21
|
-
} | {
|
|
22
|
-
$size: number;
|
|
23
|
-
} | {
|
|
24
|
-
$exists: boolean;
|
|
25
|
-
};
|
|
26
|
-
export type Where = {
|
|
27
|
-
$and?: readonly Where[];
|
|
28
|
-
$or?: readonly Where[];
|
|
29
|
-
[field: string]: Predicate | readonly Where[] | undefined;
|
|
30
|
-
};
|
|
31
|
-
export type Related = {
|
|
32
|
-
types?: readonly string[];
|
|
33
|
-
where?: Where;
|
|
34
|
-
pathPrefix?: string;
|
|
35
|
-
};
|
|
36
|
-
export type Filter = {
|
|
37
|
-
rooms?: readonly string[];
|
|
38
|
-
types?: readonly string[];
|
|
39
|
-
where?: Where;
|
|
40
|
-
pathPrefix?: string;
|
|
41
|
-
hop?: Related & {
|
|
42
|
-
field: string;
|
|
43
|
-
};
|
|
44
|
-
backlinks?: Related & {
|
|
45
|
-
field?: string;
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
export type Key = 'room' | 'path' | 'type' | {
|
|
49
|
-
field: string;
|
|
50
|
-
};
|
|
51
|
-
export type Select = 'all' | {
|
|
52
|
-
fields?: 'all' | readonly string[];
|
|
53
|
-
sections?: 'all' | readonly string[];
|
|
54
|
-
preamble?: true;
|
|
55
|
-
markdown?: true;
|
|
56
|
-
backlinks?: true;
|
|
57
|
-
change?: true;
|
|
58
|
-
fileId?: true;
|
|
59
|
-
};
|
|
60
|
-
export type OrderOptions = {
|
|
61
|
-
nulls?: 'first' | 'last';
|
|
62
|
-
stringSort?: 'lexical' | 'locale';
|
|
63
|
-
locale?: string;
|
|
64
|
-
localeOptions?: Readonly<Record<string, unknown>>;
|
|
65
|
-
};
|
|
66
|
-
export type Direction = 'asc' | 'desc';
|
|
67
|
-
export type DocumentQuery = Filter & {
|
|
68
|
-
select: Select;
|
|
69
|
-
orderBy?: readonly ({
|
|
70
|
-
by: Key;
|
|
71
|
-
direction?: Direction;
|
|
72
|
-
} & OrderOptions)[];
|
|
73
|
-
limit?: number;
|
|
74
|
-
};
|
|
75
|
-
export type GroupQuery = Filter & {
|
|
76
|
-
groupBy: readonly Exclude<Key, 'path'>[];
|
|
77
|
-
orderBy?: readonly {
|
|
78
|
-
by: 'count' | Exclude<Key, 'path'>;
|
|
79
|
-
direction?: Direction;
|
|
80
|
-
}[];
|
|
81
|
-
limit?: number;
|
|
82
|
-
};
|
|
83
|
-
export type LocalQuery = DocumentQuery | GroupQuery;
|
|
84
5
|
export type Backlink = {
|
|
85
6
|
path: string;
|
|
86
7
|
type: string;
|
|
@@ -94,9 +15,11 @@ export type QueryDocument = {
|
|
|
94
15
|
sections?: Readonly<Record<string, string>>;
|
|
95
16
|
preamble?: string;
|
|
96
17
|
markdown?: string;
|
|
18
|
+
textHeld?: false;
|
|
97
19
|
backlinks?: readonly Backlink[];
|
|
98
20
|
change?: HeadChange | null;
|
|
99
21
|
fileId?: string | null;
|
|
22
|
+
revision?: string | null;
|
|
100
23
|
binaryFile?: BinaryFileRecord;
|
|
101
24
|
};
|
|
102
25
|
export type QueryGroup = {
|
|
@@ -113,7 +36,7 @@ export type QueryCoverage = {
|
|
|
113
36
|
indexes: readonly string[];
|
|
114
37
|
overlay: readonly string[];
|
|
115
38
|
};
|
|
116
|
-
export type Awaits = Open<'acquisition' | 'preparation' | '
|
|
39
|
+
export type Awaits = Open<'acquisition' | 'preparation' | 'unlock'>;
|
|
117
40
|
export type PendingRoom = {
|
|
118
41
|
room: string;
|
|
119
42
|
awaits: Awaits;
|
|
@@ -123,9 +46,13 @@ export type PendingResult = {
|
|
|
123
46
|
};
|
|
124
47
|
export type DocumentRows = {
|
|
125
48
|
documents: readonly QueryDocument[];
|
|
49
|
+
next?: string;
|
|
50
|
+
total?: number;
|
|
126
51
|
};
|
|
127
52
|
export type GroupRows = {
|
|
128
53
|
groups: readonly QueryGroup[];
|
|
54
|
+
next?: string;
|
|
55
|
+
total?: number;
|
|
129
56
|
};
|
|
130
57
|
export type QueryRows = DocumentRows | GroupRows;
|
|
131
58
|
export type DocumentResult = DocumentRows & {
|
|
@@ -135,120 +62,19 @@ export type GroupResult = GroupRows & {
|
|
|
135
62
|
coverage: QueryCoverage;
|
|
136
63
|
};
|
|
137
64
|
export type QueryResult = DocumentResult | GroupResult | PendingResult;
|
|
138
|
-
export type
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
types: readonly Definition[];
|
|
143
|
-
};
|
|
144
|
-
export type HeldRooms = {
|
|
145
|
-
listed: boolean;
|
|
146
|
-
rooms: readonly RoomFacts[];
|
|
147
|
-
};
|
|
148
|
-
export type Test = {
|
|
149
|
-
op: 'eq';
|
|
150
|
-
value: Value;
|
|
151
|
-
} | {
|
|
152
|
-
op: 'ne';
|
|
153
|
-
value: Value;
|
|
154
|
-
} | {
|
|
155
|
-
op: 'in';
|
|
156
|
-
values: readonly Value[];
|
|
157
|
-
} | {
|
|
158
|
-
op: 'nin';
|
|
159
|
-
values: readonly Value[];
|
|
160
|
-
} | {
|
|
161
|
-
op: 'range';
|
|
162
|
-
bounds: readonly (readonly ['gt' | 'gte' | 'lt' | 'lte', Value])[];
|
|
163
|
-
} | {
|
|
164
|
-
op: 'all';
|
|
165
|
-
values: readonly Value[];
|
|
166
|
-
} | {
|
|
167
|
-
op: 'size';
|
|
168
|
-
size: number;
|
|
169
|
-
} | {
|
|
170
|
-
op: 'exists';
|
|
171
|
-
exists: boolean;
|
|
172
|
-
};
|
|
173
|
-
export type Condition = {
|
|
174
|
-
every: readonly Condition[];
|
|
175
|
-
} | {
|
|
176
|
-
some: readonly Condition[];
|
|
177
|
-
} | {
|
|
178
|
-
field: string;
|
|
179
|
-
test: Test;
|
|
180
|
-
};
|
|
181
|
-
export type Scope = {
|
|
182
|
-
types: readonly string[] | null;
|
|
183
|
-
where: Condition | null;
|
|
184
|
-
pathPrefix: string | null;
|
|
185
|
-
};
|
|
186
|
-
export type KeyPlan = {
|
|
187
|
-
of: 'room';
|
|
188
|
-
} | {
|
|
189
|
-
of: 'path';
|
|
190
|
-
} | {
|
|
191
|
-
of: 'type';
|
|
192
|
-
} | {
|
|
193
|
-
of: 'field';
|
|
194
|
-
field: string;
|
|
195
|
-
};
|
|
196
|
-
export type DocumentShape = {
|
|
197
|
-
kind: 'documents';
|
|
198
|
-
fields: 'all' | readonly string[] | null;
|
|
199
|
-
sections: 'all' | readonly string[] | null;
|
|
200
|
-
preamble: boolean;
|
|
201
|
-
markdown: boolean;
|
|
202
|
-
backlinks: boolean;
|
|
203
|
-
change: boolean;
|
|
204
|
-
fileId: boolean;
|
|
205
|
-
orderBy: readonly {
|
|
206
|
-
key: KeyPlan;
|
|
207
|
-
options: OrderOptions & {
|
|
208
|
-
direction: Direction;
|
|
209
|
-
};
|
|
210
|
-
}[];
|
|
211
|
-
};
|
|
212
|
-
export type GroupShape = {
|
|
213
|
-
kind: 'groups';
|
|
214
|
-
groupBy: readonly KeyPlan[];
|
|
215
|
-
orderBy: readonly {
|
|
216
|
-
by: 'count' | number;
|
|
217
|
-
direction: Direction;
|
|
218
|
-
}[];
|
|
65
|
+
export type PlanArea = {
|
|
66
|
+
room: string;
|
|
67
|
+
path: string;
|
|
68
|
+
open: readonly string[];
|
|
219
69
|
};
|
|
220
70
|
export type PlanReach = {
|
|
221
71
|
rooms: readonly string[];
|
|
222
72
|
documents: readonly string[];
|
|
73
|
+
areas: readonly PlanArea[];
|
|
223
74
|
};
|
|
224
|
-
export type Plan = {
|
|
225
|
-
key: string;
|
|
226
|
-
rooms: readonly string[] | null;
|
|
75
|
+
export type Plan = QueryPlan & {
|
|
227
76
|
reach: PlanReach | null;
|
|
228
|
-
|
|
229
|
-
hop: (Scope & {
|
|
230
|
-
field: string;
|
|
231
|
-
}) | null;
|
|
232
|
-
backlinks: (Scope & {
|
|
233
|
-
field: string | null;
|
|
234
|
-
}) | null;
|
|
235
|
-
shape: DocumentShape | GroupShape;
|
|
236
|
-
limit: number | null;
|
|
77
|
+
locked: readonly string[];
|
|
237
78
|
};
|
|
238
|
-
export declare
|
|
239
|
-
readonly code: QueryErrorCode;
|
|
240
|
-
readonly retryable = false;
|
|
241
|
-
constructor(code: QueryErrorCode, at: string, problem: string);
|
|
242
|
-
}
|
|
243
|
-
type Entries = Readonly<Record<string, unknown>>;
|
|
244
|
-
export declare function invalid(at: string, problem: string): never;
|
|
245
|
-
export declare function plain(value: unknown): value is Entries;
|
|
246
|
-
export declare function known(value: Entries, allowed: readonly string[], at: string): void;
|
|
247
|
-
export declare function flag(input: unknown, at: string): boolean;
|
|
248
|
-
export declare function planOf(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
|
|
249
|
-
export declare function limitOf(input: unknown): number | null;
|
|
250
|
-
export declare function filterOf(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
|
|
251
|
-
export declare function queryKey(query: unknown): string;
|
|
252
|
-
export declare function identityOf(plan: Plan): string;
|
|
253
|
-
export {};
|
|
79
|
+
export declare function planWithin(input: unknown, facts: HeldRooms, reach?: PlanReach | null): Plan;
|
|
254
80
|
//# 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,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|