@agentshouse/mdruntime 0.1.0-c99e5271060cd → 0.1.0-c9b1e59e5baeb
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 +274 -244
- package/README.md +18 -8
- package/dist/adapter.d.ts +98 -20
- package/dist/adapter.d.ts.map +1 -1
- 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 +3 -2
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +38 -15
- package/dist/change-set.d.ts +7 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +45 -13
- package/dist/change.d.ts +11 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +26 -1
- package/dist/chat/acts.d.ts +33 -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/earlier.d.ts +10 -0
- package/dist/chat/earlier.d.ts.map +1 -0
- package/dist/chat/earlier.js +54 -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 +61 -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 +28 -0
- package/dist/chat/list.d.ts.map +1 -0
- package/dist/chat/list.js +99 -0
- package/dist/chat/markdown.d.ts +21 -0
- package/dist/chat/markdown.d.ts.map +1 -0
- package/dist/chat/markdown.js +246 -0
- package/dist/chat/message.d.ts +6 -0
- package/dist/chat/message.d.ts.map +1 -0
- package/dist/chat/message.js +199 -0
- package/dist/chat/messages.d.ts +22 -0
- package/dist/chat/messages.d.ts.map +1 -0
- package/dist/chat/messages.js +175 -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 +32 -0
- package/dist/chat/overlay.d.ts.map +1 -0
- package/dist/chat/overlay.js +107 -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/pieces.d.ts +62 -0
- package/dist/chat/pieces.d.ts.map +1 -0
- package/dist/chat/pieces.js +1110 -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 +64 -0
- package/dist/chat/provider.d.ts.map +1 -0
- package/dist/chat/provider.js +637 -0
- package/dist/chat/question.d.ts +9 -0
- package/dist/chat/question.d.ts.map +1 -0
- package/dist/chat/question.js +69 -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 +34 -0
- package/dist/chat/ready.d.ts.map +1 -0
- package/dist/chat/ready.js +91 -0
- 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.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 +26 -11
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +27 -4
- package/dist/collection.d.ts +20 -5
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +309 -33
- package/dist/connection.d.ts +41 -13
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1819 -407
- package/dist/conversation.d.ts +34 -9
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +552 -168
- package/dist/durability.d.ts +7 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +17 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +157 -0
- package/dist/expectation.d.ts +21 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +70 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/host.d.ts +15 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +99 -13
- package/dist/identity.d.ts +4 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +12 -0
- package/dist/index.d.ts +15 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/memory.d.ts +10 -4
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +64 -17
- package/dist/model.d.ts +4 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +10 -1
- package/dist/observation.d.ts +7 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +29 -12
- package/dist/outcome.d.ts +17 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +10 -0
- package/dist/overlay.d.ts +18 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +238 -160
- package/dist/query.d.ts +58 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +36 -7
- package/dist/reach.d.ts +8 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +55 -8
- package/dist/react.d.ts +10 -7
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -17
- package/dist/read-side.d.ts +16 -7
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +495 -102
- package/dist/readiness.d.ts +53 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +33 -0
- package/dist/reads.d.ts +11 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +98 -0
- package/dist/recovery.d.ts +25 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +197 -0
- package/dist/refresh.d.ts +4 -4
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +51 -30
- package/dist/replica.d.ts +15 -6
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +137 -66
- package/dist/room-draft.d.ts +32 -3
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +129 -12
- package/dist/rows.d.ts +8 -13
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +12 -13
- package/dist/save.d.ts +32 -2
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +495 -97
- package/dist/search.d.ts +49 -6
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +192 -47
- 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 +15 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +398 -0
- package/dist/status.d.ts +4 -1
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -8
- package/dist/store.d.ts +71 -21
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +625 -320
- package/dist/turn.d.ts +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +64 -0
- 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 +153 -30
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +53 -29
- package/package.json +26 -14
- package/dist/attachment.d.ts +0 -3
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -8
package/dist/replica.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { equalValue, parse } from '@agentshouse/mdmodel';
|
|
2
|
-
import { immutable } from './change.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { immutable, landing } from './change.js';
|
|
3
|
+
import { changedCleanly, collecting, unreadable, validateCollection, } from './collection.js';
|
|
4
|
+
import { acceptedBinaries, overlayChanged, overlaying, sameText, } from './overlay.js';
|
|
5
5
|
import { providerRewritten } from './save.js';
|
|
6
|
-
import {
|
|
6
|
+
import { drafted, patched, settled, sharing } from './shared.js';
|
|
7
|
+
import { finished, stepped } from './turn.js';
|
|
7
8
|
export function compositionOf(record) {
|
|
8
9
|
return {
|
|
9
10
|
model: record.model,
|
|
@@ -12,57 +13,112 @@ export function compositionOf(record) {
|
|
|
12
13
|
: { roots: record.typedSelection.roots, model: record.selectionModel },
|
|
13
14
|
};
|
|
14
15
|
}
|
|
16
|
+
function* holding(record) {
|
|
17
|
+
const documents = yield* sharing(record.documents);
|
|
18
|
+
const binaries = yield* sharing(record.binaries);
|
|
19
|
+
const revisions = yield* sharing(record.revisions);
|
|
20
|
+
const fileIds = yield* sharing(record.fileIds);
|
|
21
|
+
const changes = yield* sharing(record.changes);
|
|
22
|
+
const written = yield* sharing(record.written);
|
|
23
|
+
return documents === record.documents &&
|
|
24
|
+
binaries === record.binaries &&
|
|
25
|
+
revisions === record.revisions &&
|
|
26
|
+
fileIds === record.fileIds &&
|
|
27
|
+
changes === record.changes &&
|
|
28
|
+
written === record.written
|
|
29
|
+
? record
|
|
30
|
+
: { ...record, documents, binaries, revisions, fileIds, changes, written };
|
|
31
|
+
}
|
|
15
32
|
export function confirmedOf(record, previous) {
|
|
33
|
+
return finished(confirming(record, previous));
|
|
34
|
+
}
|
|
35
|
+
function* confirming(record, previous) {
|
|
36
|
+
const kept = yield* holding(record);
|
|
16
37
|
return {
|
|
17
|
-
record,
|
|
18
|
-
collection:
|
|
38
|
+
record: kept,
|
|
39
|
+
collection: yield* collecting(kept.documents, compositionOf(kept), previous?.collection),
|
|
19
40
|
};
|
|
20
41
|
}
|
|
21
42
|
export function sameMembership(record, other) {
|
|
22
43
|
return (JSON.stringify(record.typedSelection?.roots ?? null) ===
|
|
23
44
|
JSON.stringify(other.typedSelection?.roots ?? null));
|
|
24
45
|
}
|
|
25
|
-
|
|
26
|
-
|
|
46
|
+
function* cleanly(record, previous) {
|
|
47
|
+
if (previous === undefined)
|
|
48
|
+
return false;
|
|
49
|
+
const before = previous.record;
|
|
50
|
+
return yield* changedCleanly({ text: record.documents, binaries: record.binaries }, { text: before.documents, binaries: before.binaries, composition: compositionOf(before) }, compositionOf(record));
|
|
51
|
+
}
|
|
52
|
+
function* staging(staged, previous) {
|
|
53
|
+
const record = yield* holding(staged);
|
|
54
|
+
const textChanged = previous === undefined || !(yield* sameText(record, previous.record));
|
|
27
55
|
const modeled = record.model.status !== 'unavailable' || record.selectionModel.status !== 'unavailable';
|
|
28
56
|
if (modeled &&
|
|
29
57
|
(textChanged ||
|
|
30
58
|
record.model !== previous?.record.model ||
|
|
31
|
-
record.selectionModel !== previous?.record.selectionModel)
|
|
32
|
-
|
|
59
|
+
record.selectionModel !== previous?.record.selectionModel) &&
|
|
60
|
+
!(yield* cleanly(record, previous))) {
|
|
61
|
+
const verdict = yield* validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
|
|
33
62
|
if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {
|
|
34
63
|
return { kind: 'refused', refusal: verdict };
|
|
35
64
|
}
|
|
36
65
|
if (verdict.verdict === 'refuse') {
|
|
37
|
-
const refused = unreadable(record.documents, previous?.record.documents);
|
|
66
|
+
const refused = yield* unreadable(record.documents, previous?.record.documents);
|
|
38
67
|
if (refused !== null)
|
|
39
68
|
return refused;
|
|
40
69
|
}
|
|
41
70
|
}
|
|
42
71
|
else if (textChanged) {
|
|
43
|
-
const refused = unreadable(record.documents, previous?.record.documents);
|
|
72
|
+
const refused = yield* unreadable(record.documents, previous?.record.documents);
|
|
44
73
|
if (refused !== null)
|
|
45
74
|
return refused;
|
|
46
75
|
}
|
|
47
|
-
return { kind: 'staged', confirmed:
|
|
76
|
+
return { kind: 'staged', confirmed: yield* confirming(record, previous) };
|
|
48
77
|
}
|
|
49
|
-
export function
|
|
50
|
-
|
|
78
|
+
export function readStaged(staged, previous) {
|
|
79
|
+
return stepped(staging(staged, previous));
|
|
80
|
+
}
|
|
81
|
+
function* reclassifying(record, previous) {
|
|
82
|
+
const verdict = yield* validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
|
|
51
83
|
if (verdict.verdict !== 'refuse')
|
|
52
|
-
return { kind: 'staged', confirmed:
|
|
84
|
+
return { kind: 'staged', confirmed: yield* confirming(record, previous) };
|
|
53
85
|
return verdict.rule === 'model-unavailable'
|
|
54
86
|
? { kind: 'deferred' }
|
|
55
87
|
: { kind: 'refused', refusal: verdict };
|
|
56
88
|
}
|
|
57
|
-
export function
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
89
|
+
export function readReclassified(record, previous) {
|
|
90
|
+
return stepped(reclassifying(record, previous));
|
|
91
|
+
}
|
|
92
|
+
function returnedBinaries(held, submitted, accepted) {
|
|
93
|
+
const binaries = drafted(held);
|
|
94
|
+
for (const change of submitted.changes) {
|
|
95
|
+
if (change.kind !== 'move')
|
|
96
|
+
continue;
|
|
97
|
+
const moved = binaries[change.path];
|
|
98
|
+
if (moved === undefined || accepted.revisions[change.to] === undefined)
|
|
99
|
+
continue;
|
|
100
|
+
binaries[change.to] = moved;
|
|
101
|
+
delete binaries[change.path];
|
|
102
|
+
}
|
|
103
|
+
Object.assign(binaries, acceptedBinaries(accepted.binaryFiles ?? {}));
|
|
104
|
+
for (const path of accepted.removals)
|
|
105
|
+
delete binaries[path];
|
|
106
|
+
return settled(binaries);
|
|
107
|
+
}
|
|
108
|
+
export function applyReturned(confirmed, submitted, accepted, roomVersion, writtenAt) {
|
|
109
|
+
const { documents, revisions, fileIds, changes, removals } = accepted;
|
|
110
|
+
const nextDocuments = drafted(confirmed.record.documents);
|
|
111
|
+
const nextRevisions = drafted(confirmed.record.revisions);
|
|
112
|
+
const nextFileIds = drafted(confirmed.record.fileIds);
|
|
113
|
+
const nextChanges = drafted(confirmed.record.changes);
|
|
114
|
+
const nextWritten = drafted(confirmed.record.written);
|
|
115
|
+
Object.assign(nextDocuments, documents);
|
|
116
|
+
Object.assign(nextRevisions, revisions);
|
|
117
|
+
for (const path of Object.keys({ ...documents, ...revisions }))
|
|
118
|
+
delete nextFileIds[path];
|
|
119
|
+
Object.assign(nextFileIds, fileIds);
|
|
120
|
+
for (const path of Object.keys(documents))
|
|
121
|
+
nextWritten[path] = writtenAt;
|
|
66
122
|
for (const [path, revision] of Object.entries(revisions)) {
|
|
67
123
|
if (confirmed.record.revisions[path] !== revision)
|
|
68
124
|
delete nextChanges[path];
|
|
@@ -71,24 +127,22 @@ export function applyReturned(confirmed, documents, revisions, changes, removals
|
|
|
71
127
|
for (const path of removals) {
|
|
72
128
|
delete nextDocuments[path];
|
|
73
129
|
delete nextRevisions[path];
|
|
130
|
+
delete nextFileIds[path];
|
|
74
131
|
delete nextChanges[path];
|
|
75
132
|
delete nextWritten[path];
|
|
76
|
-
binaryTargets.delete(path);
|
|
77
133
|
}
|
|
78
134
|
return readStaged({
|
|
79
135
|
...confirmed.record,
|
|
80
136
|
roomVersion,
|
|
81
|
-
documents: nextDocuments,
|
|
82
|
-
revisions: nextRevisions,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
? confirmed.record.attachments
|
|
88
|
-
: declaredAttachments([attachments]),
|
|
137
|
+
documents: settled(nextDocuments),
|
|
138
|
+
revisions: settled(nextRevisions),
|
|
139
|
+
fileIds: settled(nextFileIds),
|
|
140
|
+
changes: settled(nextChanges),
|
|
141
|
+
written: settled(nextWritten),
|
|
142
|
+
binaries: returnedBinaries(confirmed.record.binaries, submitted, accepted),
|
|
89
143
|
}, confirmed);
|
|
90
144
|
}
|
|
91
|
-
function
|
|
145
|
+
function* predicting(confirmed, batches, previous) {
|
|
92
146
|
const composition = compositionOf(confirmed.record);
|
|
93
147
|
let layer = confirmed.record;
|
|
94
148
|
const replay = [];
|
|
@@ -98,7 +152,7 @@ function predicted(confirmed, batches, previous) {
|
|
|
98
152
|
const old = prior.get(batch.id);
|
|
99
153
|
const hasMove = batch.changes.some((change) => change.kind === 'move');
|
|
100
154
|
const reuseRewrite = old?.collection !== undefined &&
|
|
101
|
-
|
|
155
|
+
(yield* sameText(before, old.before)) &&
|
|
102
156
|
old.collection.composition.model === composition.model &&
|
|
103
157
|
old.collection.composition.selection?.model === composition.selection?.model &&
|
|
104
158
|
JSON.stringify(old.collection.composition.selection?.roots) ===
|
|
@@ -106,17 +160,17 @@ function predicted(confirmed, batches, previous) {
|
|
|
106
160
|
const collection = hasMove
|
|
107
161
|
? reuseRewrite
|
|
108
162
|
? old.collection
|
|
109
|
-
:
|
|
163
|
+
: yield* collecting(before.documents, composition, old?.collection ?? confirmed.collection)
|
|
110
164
|
: undefined;
|
|
111
165
|
const effective = collection === undefined
|
|
112
166
|
? batch
|
|
113
167
|
: reuseRewrite
|
|
114
168
|
? old.effective
|
|
115
|
-
: providerRewritten(batch, { ...before, collection });
|
|
169
|
+
: yield* providerRewritten(batch, { ...before, collection });
|
|
116
170
|
layer =
|
|
117
171
|
old === undefined
|
|
118
|
-
?
|
|
119
|
-
: overlayChanged(before,
|
|
172
|
+
? yield* overlaying(before, [effective])
|
|
173
|
+
: yield* overlayChanged(before, effective, old.before, old.effective, old.after);
|
|
120
174
|
replay.push({
|
|
121
175
|
id: batch.id,
|
|
122
176
|
before,
|
|
@@ -127,7 +181,7 @@ function predicted(confirmed, batches, previous) {
|
|
|
127
181
|
}
|
|
128
182
|
return { layer, replay };
|
|
129
183
|
}
|
|
130
|
-
export function
|
|
184
|
+
export function* replicating(confirmed, queue, previous) {
|
|
131
185
|
const batches = Object.freeze(queue.map(immutable));
|
|
132
186
|
if (batches.length === 0) {
|
|
133
187
|
return {
|
|
@@ -135,27 +189,31 @@ export function replicaOf(confirmed, queue, previous) {
|
|
|
135
189
|
queue: batches,
|
|
136
190
|
visible: {
|
|
137
191
|
documents: confirmed.record.documents,
|
|
138
|
-
|
|
192
|
+
binaries: confirmed.record.binaries,
|
|
139
193
|
revisions: confirmed.record.revisions,
|
|
194
|
+
fileIds: confirmed.record.fileIds,
|
|
140
195
|
changes: confirmed.record.changes,
|
|
141
196
|
collection: confirmed.collection,
|
|
142
197
|
},
|
|
143
198
|
replay: [],
|
|
144
199
|
};
|
|
145
200
|
}
|
|
146
|
-
const { layer, replay } =
|
|
201
|
+
const { layer, replay } = yield* predicting(confirmed, batches, previous);
|
|
147
202
|
return {
|
|
148
203
|
confirmed,
|
|
149
204
|
queue: batches,
|
|
150
205
|
replay,
|
|
151
206
|
visible: {
|
|
152
207
|
...layer,
|
|
153
|
-
collection:
|
|
208
|
+
collection: yield* collecting(layer.documents, compositionOf(confirmed.record), previous?.visible.collection ?? confirmed.collection),
|
|
154
209
|
},
|
|
155
210
|
};
|
|
156
211
|
}
|
|
212
|
+
export function replicaOf(confirmed, queue, previous) {
|
|
213
|
+
return finished(replicating(confirmed, queue, previous));
|
|
214
|
+
}
|
|
157
215
|
function present(layer, path) {
|
|
158
|
-
return layer.documents[path] !== undefined || layer.
|
|
216
|
+
return layer.documents[path] !== undefined || layer.binaries[path] !== undefined;
|
|
159
217
|
}
|
|
160
218
|
function holds(layer, preconditions) {
|
|
161
219
|
const parsed = new Map();
|
|
@@ -222,61 +280,74 @@ function effects(change) {
|
|
|
222
280
|
{ kind: 'present', path: change.to },
|
|
223
281
|
];
|
|
224
282
|
}
|
|
283
|
+
if (change.kind === 'binary')
|
|
284
|
+
return [{ kind: 'present', path }];
|
|
225
285
|
return [{ kind: 'absent', path }];
|
|
226
286
|
}
|
|
227
|
-
function after(changes, index, path) {
|
|
228
|
-
let at = path;
|
|
229
|
-
for (const change of changes.slice(index + 1)) {
|
|
230
|
-
if (change.path !== at)
|
|
231
|
-
continue;
|
|
232
|
-
if (change.kind === 'remove')
|
|
233
|
-
return null;
|
|
234
|
-
if (change.kind === 'move')
|
|
235
|
-
at = change.to;
|
|
236
|
-
}
|
|
237
|
-
return at;
|
|
238
|
-
}
|
|
239
287
|
export function landed(batch, confirmed, current = {}) {
|
|
240
|
-
const layer = {
|
|
288
|
+
const layer = {
|
|
289
|
+
...confirmed.record,
|
|
290
|
+
documents: patched(confirmed.record.documents, Object.entries(current)),
|
|
291
|
+
};
|
|
241
292
|
return batch.changes.every((change, index) => {
|
|
242
293
|
if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {
|
|
243
|
-
const at =
|
|
294
|
+
const at = landing(batch.changes, index, change.path);
|
|
244
295
|
return at === null || layer.documents[at] === change.content;
|
|
245
296
|
}
|
|
297
|
+
if (change.kind === 'binary') {
|
|
298
|
+
const at = landing(batch.changes, index, change.path);
|
|
299
|
+
return at === null || layer.binaries[at]?.sha256 === change.sha256;
|
|
300
|
+
}
|
|
246
301
|
return effects(change).every((effect) => {
|
|
247
302
|
if (effect.kind === 'absent')
|
|
248
303
|
return holds(layer, [effect]);
|
|
249
|
-
const at =
|
|
304
|
+
const at = landing(batch.changes, index, effect.path);
|
|
250
305
|
return at === null || holds(layer, [{ ...effect, path: at }]);
|
|
251
306
|
});
|
|
252
307
|
});
|
|
253
308
|
}
|
|
254
|
-
|
|
309
|
+
function founded(batch, layer) {
|
|
310
|
+
let changed = false;
|
|
311
|
+
const preconditions = batch.preconditions.map((precondition) => {
|
|
312
|
+
if (precondition.kind !== 'content')
|
|
313
|
+
return precondition;
|
|
314
|
+
const revision = layer.revisions[precondition.path];
|
|
315
|
+
if (revision === undefined || layer.documents[precondition.path] !== precondition.content) {
|
|
316
|
+
return precondition;
|
|
317
|
+
}
|
|
318
|
+
changed = true;
|
|
319
|
+
return { kind: 'revision', path: precondition.path, revision };
|
|
320
|
+
});
|
|
321
|
+
return changed ? immutable({ ...batch, preconditions }) : batch;
|
|
322
|
+
}
|
|
323
|
+
export function* standing(confirmed, queue, withdrawable, local) {
|
|
255
324
|
if (!queue.some(withdrawable))
|
|
256
|
-
return [];
|
|
325
|
+
return { withdrawn: [], kept: queue };
|
|
257
326
|
const composition = compositionOf(confirmed.record);
|
|
258
327
|
let layer = confirmed.record;
|
|
259
328
|
const withdrawn = [];
|
|
329
|
+
const kept = [];
|
|
260
330
|
for (const batch of queue) {
|
|
261
331
|
if (withdrawable(batch) && !holds(layer, batch.preconditions)) {
|
|
262
332
|
withdrawn.push(batch);
|
|
263
333
|
continue;
|
|
264
334
|
}
|
|
265
335
|
const effective = batch.changes.some((change) => change.kind === 'move')
|
|
266
|
-
? providerRewritten(batch, {
|
|
336
|
+
? yield* providerRewritten(batch, {
|
|
267
337
|
...layer,
|
|
268
|
-
collection:
|
|
338
|
+
collection: yield* collecting(layer.documents, composition),
|
|
269
339
|
})
|
|
270
340
|
: batch;
|
|
271
341
|
let unapplied = false;
|
|
272
|
-
const next =
|
|
342
|
+
const next = yield* overlaying(layer, [effective], () => {
|
|
273
343
|
unapplied = true;
|
|
274
344
|
});
|
|
275
345
|
if (local && unapplied) {
|
|
276
346
|
withdrawn.push(batch);
|
|
277
347
|
continue;
|
|
278
348
|
}
|
|
349
|
+
kept.push(local || !withdrawable(batch) ? batch : founded(batch, layer));
|
|
279
350
|
layer = next;
|
|
280
351
|
}
|
|
281
|
-
return withdrawn;
|
|
352
|
+
return { withdrawn, kept };
|
|
282
353
|
}
|
package/dist/room-draft.d.ts
CHANGED
|
@@ -37,6 +37,17 @@ export type RoomDraftParts = {
|
|
|
37
37
|
readonly removal?: {
|
|
38
38
|
readonly base?: string | null;
|
|
39
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;
|
|
40
51
|
};
|
|
41
52
|
type HeldParts = {
|
|
42
53
|
readonly fields?: Readonly<Record<string, {
|
|
@@ -63,6 +74,7 @@ type HeldParts = {
|
|
|
63
74
|
readonly removal?: {
|
|
64
75
|
readonly base: string | null;
|
|
65
76
|
};
|
|
77
|
+
readonly file?: HeldFile;
|
|
66
78
|
};
|
|
67
79
|
type ChangedUnderneath = {
|
|
68
80
|
readonly fields?: Readonly<Record<string, FieldValue>>;
|
|
@@ -72,9 +84,10 @@ type ChangedUnderneath = {
|
|
|
72
84
|
readonly creation?: string;
|
|
73
85
|
readonly move?: string | null;
|
|
74
86
|
readonly removal?: string | null;
|
|
87
|
+
readonly file?: string | null;
|
|
75
88
|
};
|
|
76
89
|
export type ReturnReason = ProviderRefusal & {
|
|
77
|
-
readonly kind: 'conflicted' | 'rejected' | 'expired' | 'withdrawn'
|
|
90
|
+
readonly kind: Open<'conflicted' | 'rejected' | 'expired' | 'withdrawn'>;
|
|
78
91
|
};
|
|
79
92
|
export declare function returnedBy(kind: 'expired' | 'withdrawn'): ReturnReason;
|
|
80
93
|
export type RoomDraft = {
|
|
@@ -97,7 +110,7 @@ export type RoomDraftWrite = {
|
|
|
97
110
|
export declare function staleWrite(current: RoomDraft | null): RoomDraftWrite;
|
|
98
111
|
export type ChangedPart = {
|
|
99
112
|
readonly path: string;
|
|
100
|
-
readonly part: Open<'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal'>;
|
|
113
|
+
readonly part: Open<'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal' | 'file'>;
|
|
101
114
|
readonly name?: string;
|
|
102
115
|
};
|
|
103
116
|
export type RoomDraftRecord = {
|
|
@@ -112,9 +125,23 @@ export type SavedDraft = {
|
|
|
112
125
|
readonly parts: HeldParts;
|
|
113
126
|
};
|
|
114
127
|
export declare function readParts(value: unknown): RoomDraftParts;
|
|
115
|
-
export declare function held(current: HeldParts | undefined, parts: RoomDraftParts): HeldParts;
|
|
128
|
+
export declare function held(current: HeldParts | undefined, parts: RoomDraftParts, file?: HeldFile): HeldParts;
|
|
116
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;
|
|
117
132
|
export declare function changedParts(path: string, report: ChangedUnderneath): readonly ChangedPart[];
|
|
133
|
+
export type TextParts = {
|
|
134
|
+
readonly fields?: Readonly<Record<string, {
|
|
135
|
+
readonly value: unknown;
|
|
136
|
+
}>>;
|
|
137
|
+
readonly sections?: Readonly<Record<string, {
|
|
138
|
+
readonly value: string;
|
|
139
|
+
}>>;
|
|
140
|
+
readonly preamble?: {
|
|
141
|
+
readonly value: string;
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
export declare function partsAfter(markdown: string, parts: TextParts): string;
|
|
118
145
|
export declare function returnedInto(existing: HeldParts | undefined, returned: HeldParts): HeldParts;
|
|
119
146
|
export declare function moveTarget(move: {
|
|
120
147
|
readonly to: string;
|
|
@@ -123,5 +150,7 @@ export declare function changesOf(path: string, parts: HeldParts): {
|
|
|
123
150
|
changes: readonly Change[];
|
|
124
151
|
bases: readonly Precondition[];
|
|
125
152
|
};
|
|
153
|
+
export declare function joinedDraft(carried: SavedDraft, saved: readonly SavedDraft[]): SavedDraft;
|
|
154
|
+
export declare function withdrawnDrafts(drafts: readonly SavedDraft[], changes: readonly Change[]): readonly SavedDraft[];
|
|
126
155
|
export {};
|
|
127
156
|
//# sourceMappingURL=room-draft.d.ts.map
|
package/dist/room-draft.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-draft.d.ts","sourceRoot":"","sources":["../src/room-draft.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"room-draft.d.ts","sourceRoot":"","sources":["../src/room-draft.ts"],"names":[],"mappings":"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"}
|