@agentshouse/mdruntime 0.1.0-alpha.9 → 0.1.0-c0105dbd22806
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 +299 -0
- package/README.md +54 -0
- package/dist/adapter.d.ts +246 -40
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -10
- package/dist/attached-model.d.ts +11 -0
- package/dist/attached-model.d.ts.map +1 -0
- package/dist/attached-model.js +47 -0
- package/dist/attempt.d.ts +16 -0
- package/dist/attempt.d.ts.map +1 -0
- package/dist/attempt.js +70 -0
- package/dist/binary.d.ts +23 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +8 -0
- package/dist/bootstrap.d.ts +17 -7
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +97 -41
- package/dist/change-set.d.ts +33 -0
- package/dist/change-set.d.ts.map +1 -0
- package/dist/change-set.js +90 -0
- package/dist/change.d.ts +24 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +31 -5
- package/dist/chat/acts.d.ts +34 -0
- package/dist/chat/acts.d.ts.map +1 -0
- package/dist/chat/acts.js +36 -0
- package/dist/chat/context.d.ts +3 -0
- package/dist/chat/context.d.ts.map +1 -0
- package/dist/chat/context.js +10 -0
- package/dist/chat/input.d.ts +9 -0
- package/dist/chat/input.d.ts.map +1 -0
- package/dist/chat/input.js +99 -0
- package/dist/chat/kit.d.ts +60 -0
- package/dist/chat/kit.d.ts.map +1 -0
- package/dist/chat/kit.js +123 -0
- package/dist/chat/lasting.d.ts +6 -0
- package/dist/chat/lasting.d.ts.map +1 -0
- package/dist/chat/lasting.js +19 -0
- package/dist/chat/list.d.ts +26 -0
- package/dist/chat/list.d.ts.map +1 -0
- package/dist/chat/list.js +62 -0
- package/dist/chat/markdown.d.ts +20 -0
- package/dist/chat/markdown.d.ts.map +1 -0
- package/dist/chat/markdown.js +188 -0
- package/dist/chat/message.d.ts +6 -0
- package/dist/chat/message.d.ts.map +1 -0
- package/dist/chat/message.js +192 -0
- package/dist/chat/messages.d.ts +21 -0
- package/dist/chat/messages.d.ts.map +1 -0
- package/dist/chat/messages.js +151 -0
- package/dist/chat/name.d.ts +6 -0
- package/dist/chat/name.d.ts.map +1 -0
- package/dist/chat/name.js +37 -0
- package/dist/chat/opened.d.ts +11 -0
- package/dist/chat/opened.d.ts.map +1 -0
- package/dist/chat/opened.js +17 -0
- package/dist/chat/overlay.d.ts +31 -0
- package/dist/chat/overlay.d.ts.map +1 -0
- package/dist/chat/overlay.js +97 -0
- package/dist/chat/parts.d.ts +57 -0
- package/dist/chat/parts.d.ts.map +1 -0
- package/dist/chat/parts.js +119 -0
- package/dist/chat/process.d.ts +20 -0
- package/dist/chat/process.d.ts.map +1 -0
- package/dist/chat/process.js +32 -0
- package/dist/chat/provider.d.ts +63 -0
- package/dist/chat/provider.d.ts.map +1 -0
- package/dist/chat/provider.js +645 -0
- package/dist/chat/question.d.ts +9 -0
- package/dist/chat/question.d.ts.map +1 -0
- package/dist/chat/question.js +80 -0
- package/dist/chat/questions.d.ts +31 -0
- package/dist/chat/questions.d.ts.map +1 -0
- package/dist/chat/questions.js +111 -0
- package/dist/chat/read.d.ts +5 -0
- package/dist/chat/read.d.ts.map +1 -0
- package/dist/chat/read.js +13 -0
- package/dist/chat/ready.d.ts +33 -0
- package/dist/chat/ready.d.ts.map +1 -0
- package/dist/chat/ready.js +91 -0
- package/dist/chat/style.d.ts +4 -0
- package/dist/chat/style.d.ts.map +1 -0
- package/dist/chat/style.js +302 -0
- package/dist/chat.d.ts +14 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +8 -0
- package/dist/client.d.ts +49 -33
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +164 -183
- package/dist/collection.d.ts +9 -17
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +83 -89
- package/dist/connection.d.ts +66 -48
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1964 -1173
- package/dist/conversation.d.ts +65 -24
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +675 -334
- package/dist/durability.js +6 -6
- package/dist/entry.d.ts +17 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +156 -0
- package/dist/expectation.d.ts +21 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +70 -0
- package/dist/failure.d.ts +13 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +19 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/file.d.ts +2 -2
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +48 -71
- package/dist/host.d.ts +15 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +109 -127
- package/dist/identity.d.ts +4 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +22 -9
- package/dist/index.d.ts +17 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/log.js +5 -6
- package/dist/memory.d.ts +19 -8
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +304 -216
- package/dist/model.d.ts +16 -30
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +21 -21
- package/dist/observation.d.ts +27 -0
- package/dist/observation.d.ts.map +1 -0
- package/dist/observation.js +95 -0
- package/dist/open.d.ts +2 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +1 -0
- package/dist/outcome.d.ts +37 -31
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +36 -18
- package/dist/overlay.d.ts +22 -4
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +236 -54
- package/dist/paths.d.ts +0 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +6 -29
- package/dist/query.d.ts +219 -10
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +462 -15
- package/dist/reach.d.ts +42 -0
- package/dist/reach.d.ts.map +1 -0
- package/dist/reach.js +294 -0
- package/dist/react.d.ts +41 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +64 -0
- package/dist/read-side.d.ts +18 -0
- package/dist/read-side.d.ts.map +1 -0
- package/dist/read-side.js +440 -0
- package/dist/refresh.d.ts +15 -5
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +64 -41
- package/dist/replica.d.ts +28 -5
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +249 -40
- package/dist/room-draft.d.ts +144 -0
- package/dist/room-draft.d.ts.map +1 -0
- package/dist/room-draft.js +438 -0
- package/dist/rows.d.ts +46 -0
- package/dist/rows.d.ts.map +1 -0
- package/dist/rows.js +145 -0
- package/dist/save.d.ts +33 -5
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +630 -366
- package/dist/search.d.ts +62 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +125 -0
- package/dist/status.d.ts +6 -8
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +8 -20
- package/dist/store.d.ts +89 -34
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +513 -132
- package/dist/transfer.d.ts +5 -0
- package/dist/transfer.d.ts.map +1 -1
- package/dist/transfer.js +1 -5
- package/dist/wire.d.ts +59 -19
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +88 -105
- package/package.json +34 -16
- package/dist/adapter.js.map +0 -1
- package/dist/bootstrap.js.map +0 -1
- package/dist/change.js.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/collection.js.map +0 -1
- package/dist/connection.js.map +0 -1
- package/dist/conversation.js.map +0 -1
- package/dist/durability.js.map +0 -1
- package/dist/file.js.map +0 -1
- package/dist/host.js.map +0 -1
- package/dist/identity.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/log.js.map +0 -1
- package/dist/memory.js.map +0 -1
- package/dist/model.js.map +0 -1
- package/dist/outcome.js.map +0 -1
- package/dist/overlay.js.map +0 -1
- package/dist/paths.js.map +0 -1
- package/dist/query.js.map +0 -1
- package/dist/refresh.js.map +0 -1
- package/dist/replica.js.map +0 -1
- package/dist/save.js.map +0 -1
- package/dist/status.js.map +0 -1
- package/dist/store.js.map +0 -1
- package/dist/transfer.js.map +0 -1
- package/dist/wire.js.map +0 -1
package/dist/replica.js
CHANGED
|
@@ -1,56 +1,144 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { equalValue, parse } from '@agentshouse/mdmodel';
|
|
2
|
+
import { immutable, landing } from './change.js';
|
|
3
|
+
import { collectionOf, unreadable, validateCollection, } from './collection.js';
|
|
4
|
+
import { acceptedBinaries, overlay, overlayChanged, sameLayerText, } from './overlay.js';
|
|
5
|
+
import { providerRewritten } from './save.js';
|
|
4
6
|
export function compositionOf(record) {
|
|
5
7
|
return {
|
|
6
|
-
collectionRoot: record.collectionRoot,
|
|
7
8
|
model: record.model,
|
|
8
|
-
selection: record.typedSelection === null
|
|
9
|
-
|
|
10
|
-
model: record.selectionModel
|
|
11
|
-
}
|
|
9
|
+
selection: record.typedSelection === null
|
|
10
|
+
? null
|
|
11
|
+
: { roots: record.typedSelection.roots, model: record.selectionModel },
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
export function
|
|
15
|
-
|
|
16
|
-
return collection === null ? null : {
|
|
14
|
+
export function confirmedOf(record, previous) {
|
|
15
|
+
return {
|
|
17
16
|
record,
|
|
18
|
-
collection
|
|
17
|
+
collection: collectionOf(record.documents, compositionOf(record), previous?.collection),
|
|
19
18
|
};
|
|
20
19
|
}
|
|
21
|
-
export function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
export function sameMembership(record, other) {
|
|
21
|
+
return (JSON.stringify(record.typedSelection?.roots ?? null) ===
|
|
22
|
+
JSON.stringify(other.typedSelection?.roots ?? null));
|
|
23
|
+
}
|
|
24
|
+
export function readStaged(record, previous) {
|
|
25
|
+
const textChanged = previous === undefined || !sameLayerText(record, previous.record);
|
|
26
|
+
const modeled = record.model.status !== 'unavailable' || record.selectionModel.status !== 'unavailable';
|
|
27
|
+
if (modeled &&
|
|
28
|
+
(textChanged ||
|
|
29
|
+
record.model !== previous?.record.model ||
|
|
30
|
+
record.selectionModel !== previous?.record.selectionModel)) {
|
|
31
|
+
const verdict = validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
|
|
32
|
+
if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {
|
|
33
|
+
return { kind: 'refused', refusal: verdict };
|
|
34
|
+
}
|
|
35
|
+
if (verdict.verdict === 'refuse') {
|
|
36
|
+
const refused = unreadable(record.documents, previous?.record.documents);
|
|
37
|
+
if (refused !== null)
|
|
38
|
+
return refused;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (textChanged) {
|
|
42
|
+
const refused = unreadable(record.documents, previous?.record.documents);
|
|
43
|
+
if (refused !== null)
|
|
44
|
+
return refused;
|
|
25
45
|
}
|
|
26
|
-
return
|
|
46
|
+
return { kind: 'staged', confirmed: confirmedOf(record, previous) };
|
|
27
47
|
}
|
|
28
|
-
export function
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
48
|
+
export function readReclassified(record, previous) {
|
|
49
|
+
const verdict = validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
|
|
50
|
+
if (verdict.verdict !== 'refuse')
|
|
51
|
+
return { kind: 'staged', confirmed: confirmedOf(record, previous) };
|
|
52
|
+
return verdict.rule === 'model-unavailable'
|
|
53
|
+
? { kind: 'deferred' }
|
|
54
|
+
: { kind: 'refused', refusal: verdict };
|
|
55
|
+
}
|
|
56
|
+
function returnedBinaries(held, submitted, accepted) {
|
|
57
|
+
const binaries = { ...held };
|
|
58
|
+
for (const change of submitted.changes) {
|
|
59
|
+
if (change.kind !== 'move')
|
|
60
|
+
continue;
|
|
61
|
+
const moved = binaries[change.path];
|
|
62
|
+
if (moved === undefined || accepted.revisions[change.to] === undefined)
|
|
63
|
+
continue;
|
|
64
|
+
binaries[change.to] = moved;
|
|
65
|
+
delete binaries[change.path];
|
|
66
|
+
}
|
|
67
|
+
Object.assign(binaries, acceptedBinaries(accepted.binaryFiles ?? {}));
|
|
68
|
+
for (const path of accepted.removals)
|
|
69
|
+
delete binaries[path];
|
|
70
|
+
return binaries;
|
|
71
|
+
}
|
|
72
|
+
export function applyReturned(confirmed, submitted, accepted, roomVersion, writtenAt) {
|
|
73
|
+
const { documents, revisions, changes, removals } = accepted;
|
|
74
|
+
const nextDocuments = { ...confirmed.record.documents, ...documents };
|
|
75
|
+
const nextRevisions = { ...confirmed.record.revisions, ...revisions };
|
|
76
|
+
const nextChanges = { ...confirmed.record.changes };
|
|
77
|
+
const nextWritten = {
|
|
78
|
+
...confirmed.record.written,
|
|
79
|
+
...Object.fromEntries(Object.keys(documents).map((path) => [path, writtenAt])),
|
|
36
80
|
};
|
|
37
|
-
const
|
|
38
|
-
|
|
81
|
+
for (const [path, revision] of Object.entries(revisions)) {
|
|
82
|
+
if (confirmed.record.revisions[path] !== revision)
|
|
83
|
+
delete nextChanges[path];
|
|
84
|
+
}
|
|
85
|
+
Object.assign(nextChanges, changes);
|
|
86
|
+
for (const path of removals) {
|
|
39
87
|
delete nextDocuments[path];
|
|
40
88
|
delete nextRevisions[path];
|
|
41
|
-
|
|
89
|
+
delete nextChanges[path];
|
|
90
|
+
delete nextWritten[path];
|
|
42
91
|
}
|
|
43
92
|
return readStaged({
|
|
44
93
|
...confirmed.record,
|
|
45
94
|
roomVersion,
|
|
46
95
|
documents: nextDocuments,
|
|
47
96
|
revisions: nextRevisions,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
},
|
|
97
|
+
changes: nextChanges,
|
|
98
|
+
written: nextWritten,
|
|
99
|
+
binaries: returnedBinaries(confirmed.record.binaries, submitted, accepted),
|
|
100
|
+
}, confirmed);
|
|
52
101
|
}
|
|
53
|
-
|
|
102
|
+
function predicted(confirmed, batches, previous) {
|
|
103
|
+
const composition = compositionOf(confirmed.record);
|
|
104
|
+
let layer = confirmed.record;
|
|
105
|
+
const replay = [];
|
|
106
|
+
const prior = new Map(previous?.replay.map((step) => [step.id, step]) ?? []);
|
|
107
|
+
for (const batch of batches) {
|
|
108
|
+
const before = layer;
|
|
109
|
+
const old = prior.get(batch.id);
|
|
110
|
+
const hasMove = batch.changes.some((change) => change.kind === 'move');
|
|
111
|
+
const reuseRewrite = old?.collection !== undefined &&
|
|
112
|
+
sameLayerText(before, old.before) &&
|
|
113
|
+
old.collection.composition.model === composition.model &&
|
|
114
|
+
old.collection.composition.selection?.model === composition.selection?.model &&
|
|
115
|
+
JSON.stringify(old.collection.composition.selection?.roots) ===
|
|
116
|
+
JSON.stringify(composition.selection?.roots);
|
|
117
|
+
const collection = hasMove
|
|
118
|
+
? reuseRewrite
|
|
119
|
+
? old.collection
|
|
120
|
+
: collectionOf(before.documents, composition, old?.collection ?? confirmed.collection)
|
|
121
|
+
: undefined;
|
|
122
|
+
const effective = collection === undefined
|
|
123
|
+
? batch
|
|
124
|
+
: reuseRewrite
|
|
125
|
+
? old.effective
|
|
126
|
+
: providerRewritten(batch, { ...before, collection });
|
|
127
|
+
layer =
|
|
128
|
+
old === undefined
|
|
129
|
+
? overlay(before, [effective])
|
|
130
|
+
: overlayChanged(before, [effective], old.before, [old.effective], old.after);
|
|
131
|
+
replay.push({
|
|
132
|
+
id: batch.id,
|
|
133
|
+
before,
|
|
134
|
+
after: layer,
|
|
135
|
+
effective,
|
|
136
|
+
...(collection === undefined ? {} : { collection }),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return { layer, replay };
|
|
140
|
+
}
|
|
141
|
+
export function replicaOf(confirmed, queue, previous) {
|
|
54
142
|
const batches = Object.freeze(queue.map(immutable));
|
|
55
143
|
if (batches.length === 0) {
|
|
56
144
|
return {
|
|
@@ -58,21 +146,142 @@ export function replicaOf(confirmed, queue) {
|
|
|
58
146
|
queue: batches,
|
|
59
147
|
visible: {
|
|
60
148
|
documents: confirmed.record.documents,
|
|
61
|
-
|
|
149
|
+
binaries: confirmed.record.binaries,
|
|
62
150
|
revisions: confirmed.record.revisions,
|
|
63
|
-
|
|
64
|
-
|
|
151
|
+
changes: confirmed.record.changes,
|
|
152
|
+
collection: confirmed.collection,
|
|
153
|
+
},
|
|
154
|
+
replay: [],
|
|
65
155
|
};
|
|
66
156
|
}
|
|
67
|
-
const layer =
|
|
157
|
+
const { layer, replay } = predicted(confirmed, batches, previous);
|
|
68
158
|
return {
|
|
69
159
|
confirmed,
|
|
70
160
|
queue: batches,
|
|
161
|
+
replay,
|
|
71
162
|
visible: {
|
|
72
163
|
...layer,
|
|
73
|
-
collection:
|
|
164
|
+
collection: collectionOf(layer.documents, compositionOf(confirmed.record), previous?.visible.collection ?? confirmed.collection),
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function present(layer, path) {
|
|
169
|
+
return layer.documents[path] !== undefined || layer.binaries[path] !== undefined;
|
|
170
|
+
}
|
|
171
|
+
function holds(layer, preconditions) {
|
|
172
|
+
const parsed = new Map();
|
|
173
|
+
const documentAt = (path) => {
|
|
174
|
+
if (!parsed.has(path)) {
|
|
175
|
+
const text = layer.documents[path];
|
|
176
|
+
const opened = text === undefined ? null : parse(text, path);
|
|
177
|
+
parsed.set(path, opened?.ok === true ? opened.document : null);
|
|
74
178
|
}
|
|
179
|
+
return parsed.get(path) ?? null;
|
|
75
180
|
};
|
|
181
|
+
return preconditions.every((precondition) => {
|
|
182
|
+
const path = precondition.path;
|
|
183
|
+
if (precondition.kind === 'absent')
|
|
184
|
+
return !present(layer, path);
|
|
185
|
+
if (precondition.kind === 'present')
|
|
186
|
+
return present(layer, path);
|
|
187
|
+
if (precondition.kind === 'revision') {
|
|
188
|
+
return present(layer, path) && layer.revisions[path] === precondition.revision;
|
|
189
|
+
}
|
|
190
|
+
if (precondition.kind === 'content')
|
|
191
|
+
return layer.documents[path] === precondition.content;
|
|
192
|
+
const document = documentAt(path);
|
|
193
|
+
if (document === null)
|
|
194
|
+
return false;
|
|
195
|
+
if (precondition.kind === 'field') {
|
|
196
|
+
const value = Object.hasOwn(document.fields, precondition.name)
|
|
197
|
+
? document.fields[precondition.name]
|
|
198
|
+
: undefined;
|
|
199
|
+
return equalValue(value, precondition.value);
|
|
200
|
+
}
|
|
201
|
+
if (precondition.kind === 'section') {
|
|
202
|
+
return (Object.hasOwn(document.sections, precondition.name) &&
|
|
203
|
+
document.sections[precondition.name] === precondition.value);
|
|
204
|
+
}
|
|
205
|
+
return document.preamble === precondition.value;
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function effects(change) {
|
|
209
|
+
const path = change.path;
|
|
210
|
+
if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
|
|
211
|
+
return [change];
|
|
212
|
+
}
|
|
213
|
+
if (change.kind === 'create' && !('content' in change)) {
|
|
214
|
+
return [
|
|
215
|
+
{ kind: 'present', path },
|
|
216
|
+
...Object.entries(change.fields).map(([name, value]) => ({
|
|
217
|
+
kind: 'field',
|
|
218
|
+
path,
|
|
219
|
+
name,
|
|
220
|
+
value,
|
|
221
|
+
})),
|
|
222
|
+
...Object.entries(change.sections).map(([name, value]) => ({
|
|
223
|
+
kind: 'section',
|
|
224
|
+
path,
|
|
225
|
+
name,
|
|
226
|
+
value,
|
|
227
|
+
})),
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
if (change.kind === 'move') {
|
|
231
|
+
return [
|
|
232
|
+
{ kind: 'absent', path },
|
|
233
|
+
{ kind: 'present', path: change.to },
|
|
234
|
+
];
|
|
235
|
+
}
|
|
236
|
+
if (change.kind === 'binary')
|
|
237
|
+
return [{ kind: 'present', path }];
|
|
238
|
+
return [{ kind: 'absent', path }];
|
|
239
|
+
}
|
|
240
|
+
export function landed(batch, confirmed, current = {}) {
|
|
241
|
+
const layer = { ...confirmed.record, documents: { ...confirmed.record.documents, ...current } };
|
|
242
|
+
return batch.changes.every((change, index) => {
|
|
243
|
+
if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {
|
|
244
|
+
const at = landing(batch.changes, index, change.path);
|
|
245
|
+
return at === null || layer.documents[at] === change.content;
|
|
246
|
+
}
|
|
247
|
+
if (change.kind === 'binary') {
|
|
248
|
+
const at = landing(batch.changes, index, change.path);
|
|
249
|
+
return at === null || layer.binaries[at]?.sha256 === change.sha256;
|
|
250
|
+
}
|
|
251
|
+
return effects(change).every((effect) => {
|
|
252
|
+
if (effect.kind === 'absent')
|
|
253
|
+
return holds(layer, [effect]);
|
|
254
|
+
const at = landing(batch.changes, index, effect.path);
|
|
255
|
+
return at === null || holds(layer, [{ ...effect, path: at }]);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
export function withdrawals(confirmed, queue, withdrawable, local) {
|
|
260
|
+
if (!queue.some(withdrawable))
|
|
261
|
+
return [];
|
|
262
|
+
const composition = compositionOf(confirmed.record);
|
|
263
|
+
let layer = confirmed.record;
|
|
264
|
+
const withdrawn = [];
|
|
265
|
+
for (const batch of queue) {
|
|
266
|
+
if (withdrawable(batch) && !holds(layer, batch.preconditions)) {
|
|
267
|
+
withdrawn.push(batch);
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const effective = batch.changes.some((change) => change.kind === 'move')
|
|
271
|
+
? providerRewritten(batch, {
|
|
272
|
+
...layer,
|
|
273
|
+
collection: collectionOf(layer.documents, composition),
|
|
274
|
+
})
|
|
275
|
+
: batch;
|
|
276
|
+
let unapplied = false;
|
|
277
|
+
const next = overlay(layer, [effective], () => {
|
|
278
|
+
unapplied = true;
|
|
279
|
+
});
|
|
280
|
+
if (local && unapplied) {
|
|
281
|
+
withdrawn.push(batch);
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
layer = next;
|
|
285
|
+
}
|
|
286
|
+
return withdrawn;
|
|
76
287
|
}
|
|
77
|
-
|
|
78
|
-
//# sourceMappingURL=replica.js.map
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { ProviderRefusal } from './adapter.js';
|
|
2
|
+
import type { Open } from './open.js';
|
|
3
|
+
import type { Change, Precondition } from './change.js';
|
|
4
|
+
import type { VisibleLayer } from './replica.js';
|
|
5
|
+
export type FieldValue = {
|
|
6
|
+
readonly value: unknown;
|
|
7
|
+
} | null;
|
|
8
|
+
export type RoomDraftCreation = {
|
|
9
|
+
readonly type: string;
|
|
10
|
+
readonly fields: Readonly<Record<string, unknown>>;
|
|
11
|
+
readonly sections: Readonly<Record<string, string>>;
|
|
12
|
+
} | {
|
|
13
|
+
readonly markdown: string;
|
|
14
|
+
};
|
|
15
|
+
export type RoomDraftParts = {
|
|
16
|
+
readonly fields?: Readonly<Record<string, {
|
|
17
|
+
readonly value: unknown;
|
|
18
|
+
readonly base?: FieldValue;
|
|
19
|
+
}>>;
|
|
20
|
+
readonly sections?: Readonly<Record<string, {
|
|
21
|
+
readonly value: string;
|
|
22
|
+
readonly base?: string;
|
|
23
|
+
}>>;
|
|
24
|
+
readonly preamble?: {
|
|
25
|
+
readonly value: string;
|
|
26
|
+
readonly base?: string;
|
|
27
|
+
};
|
|
28
|
+
readonly markdown?: {
|
|
29
|
+
readonly value: string;
|
|
30
|
+
readonly base?: string;
|
|
31
|
+
};
|
|
32
|
+
readonly creation?: RoomDraftCreation;
|
|
33
|
+
readonly move?: {
|
|
34
|
+
readonly to: string;
|
|
35
|
+
readonly base?: string | null;
|
|
36
|
+
};
|
|
37
|
+
readonly removal?: {
|
|
38
|
+
readonly base?: string | null;
|
|
39
|
+
};
|
|
40
|
+
readonly file?: {
|
|
41
|
+
readonly blob: Blob;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export type HeldFile = {
|
|
45
|
+
readonly blob: Blob;
|
|
46
|
+
readonly localId: string;
|
|
47
|
+
readonly byteLength: number;
|
|
48
|
+
readonly mediaType: string;
|
|
49
|
+
readonly sha256: string;
|
|
50
|
+
readonly base: string | null;
|
|
51
|
+
};
|
|
52
|
+
type HeldParts = {
|
|
53
|
+
readonly fields?: Readonly<Record<string, {
|
|
54
|
+
readonly value: unknown;
|
|
55
|
+
readonly base: FieldValue;
|
|
56
|
+
}>>;
|
|
57
|
+
readonly sections?: Readonly<Record<string, {
|
|
58
|
+
readonly value: string;
|
|
59
|
+
readonly base: string;
|
|
60
|
+
}>>;
|
|
61
|
+
readonly preamble?: {
|
|
62
|
+
readonly value: string;
|
|
63
|
+
readonly base: string;
|
|
64
|
+
};
|
|
65
|
+
readonly markdown?: {
|
|
66
|
+
readonly value: string;
|
|
67
|
+
readonly base: string;
|
|
68
|
+
};
|
|
69
|
+
readonly creation?: RoomDraftCreation;
|
|
70
|
+
readonly move?: {
|
|
71
|
+
readonly to: string;
|
|
72
|
+
readonly base: string | null;
|
|
73
|
+
};
|
|
74
|
+
readonly removal?: {
|
|
75
|
+
readonly base: string | null;
|
|
76
|
+
};
|
|
77
|
+
readonly file?: HeldFile;
|
|
78
|
+
};
|
|
79
|
+
type ChangedUnderneath = {
|
|
80
|
+
readonly fields?: Readonly<Record<string, FieldValue>>;
|
|
81
|
+
readonly sections?: Readonly<Record<string, string | null>>;
|
|
82
|
+
readonly preamble?: string | null;
|
|
83
|
+
readonly markdown?: string | null;
|
|
84
|
+
readonly creation?: string;
|
|
85
|
+
readonly move?: string | null;
|
|
86
|
+
readonly removal?: string | null;
|
|
87
|
+
readonly file?: string | null;
|
|
88
|
+
};
|
|
89
|
+
export type ReturnReason = ProviderRefusal & {
|
|
90
|
+
readonly kind: 'conflicted' | 'rejected' | 'expired' | 'withdrawn';
|
|
91
|
+
};
|
|
92
|
+
export declare function returnedBy(kind: 'expired' | 'withdrawn'): ReturnReason;
|
|
93
|
+
export type RoomDraft = {
|
|
94
|
+
readonly room: string;
|
|
95
|
+
readonly path: string;
|
|
96
|
+
readonly revision: string;
|
|
97
|
+
readonly parts: HeldParts;
|
|
98
|
+
readonly changedUnderneath: ChangedUnderneath;
|
|
99
|
+
readonly returned: ReturnReason | null;
|
|
100
|
+
};
|
|
101
|
+
export type RoomDraftWrite = {
|
|
102
|
+
readonly outcome: 'written';
|
|
103
|
+
readonly roomDraft: RoomDraft | null;
|
|
104
|
+
} | {
|
|
105
|
+
readonly outcome: 'stale';
|
|
106
|
+
readonly code: string;
|
|
107
|
+
readonly retryable: boolean;
|
|
108
|
+
readonly current: RoomDraft | null;
|
|
109
|
+
};
|
|
110
|
+
export declare function staleWrite(current: RoomDraft | null): RoomDraftWrite;
|
|
111
|
+
export type ChangedPart = {
|
|
112
|
+
readonly path: string;
|
|
113
|
+
readonly part: Open<'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal' | 'file'>;
|
|
114
|
+
readonly name?: string;
|
|
115
|
+
};
|
|
116
|
+
export type RoomDraftRecord = {
|
|
117
|
+
readonly locator: string;
|
|
118
|
+
readonly path: string;
|
|
119
|
+
readonly revision: string;
|
|
120
|
+
readonly parts: HeldParts;
|
|
121
|
+
readonly returned: ReturnReason | null;
|
|
122
|
+
};
|
|
123
|
+
export type SavedDraft = {
|
|
124
|
+
readonly path: string;
|
|
125
|
+
readonly parts: HeldParts;
|
|
126
|
+
};
|
|
127
|
+
export declare function readParts(value: unknown): RoomDraftParts;
|
|
128
|
+
export declare function held(current: HeldParts | undefined, parts: RoomDraftParts, file?: HeldFile): HeldParts;
|
|
129
|
+
export declare function underneath(parts: HeldParts, path: string, visible: VisibleLayer | undefined): ChangedUnderneath;
|
|
130
|
+
export declare function heldFile(blob: Blob, base: string | null): Promise<HeldFile>;
|
|
131
|
+
export declare function binaryBase(visible: VisibleLayer | undefined, path: string): string | null;
|
|
132
|
+
export declare function changedParts(path: string, report: ChangedUnderneath): readonly ChangedPart[];
|
|
133
|
+
export declare function returnedInto(existing: HeldParts | undefined, returned: HeldParts): HeldParts;
|
|
134
|
+
export declare function moveTarget(move: {
|
|
135
|
+
readonly to: string;
|
|
136
|
+
}): string;
|
|
137
|
+
export declare function changesOf(path: string, parts: HeldParts): {
|
|
138
|
+
changes: readonly Change[];
|
|
139
|
+
bases: readonly Precondition[];
|
|
140
|
+
};
|
|
141
|
+
export declare function joinedDraft(carried: SavedDraft, saved: readonly SavedDraft[]): SavedDraft;
|
|
142
|
+
export declare function withdrawnDrafts(drafts: readonly SavedDraft[], changes: readonly Change[]): readonly SavedDraft[];
|
|
143
|
+
export {};
|
|
144
|
+
//# sourceMappingURL=room-draft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-draft.d.ts","sourceRoot":"","sources":["../src/room-draft.ts"],"names":[],"mappings":"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"}
|