@agentshouse/mdruntime 0.1.0-c3903a68dcbbf → 0.1.0-c4478f1a5ac2a
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 +196 -97
- package/README.md +22 -12
- package/dist/adapter.d.ts +149 -64
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -9
- 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 +20 -6
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +110 -38
- package/dist/change-set.d.ts +2 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +49 -21
- package/dist/change.d.ts +15 -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/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 +620 -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 +23 -19
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +69 -32
- package/dist/collection.d.ts +21 -14
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +270 -32
- package/dist/connection.d.ts +36 -38
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1605 -841
- package/dist/conversation.d.ts +43 -19
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +523 -210
- 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/host.d.ts +11 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +54 -69
- package/dist/identity.d.ts +5 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +19 -1
- package/dist/index.d.ts +12 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/memory.d.ts +15 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +147 -47
- package/dist/model.d.ts +14 -12
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +15 -3
- package/dist/observation.d.ts +6 -1
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +38 -17
- 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 +35 -22
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +42 -1
- package/dist/overlay.d.ts +15 -3
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +94 -77
- package/dist/paths.d.ts +0 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +0 -16
- package/dist/query.d.ts +40 -6
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +78 -36
- 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 +16 -5
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +405 -137
- 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 +12 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +45 -36
- package/dist/replica.d.ts +10 -7
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +122 -79
- package/dist/room-draft.d.ts +29 -9
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +137 -26
- package/dist/rows.d.ts +10 -14
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +85 -50
- package/dist/save.d.ts +32 -3
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +465 -93
- package/dist/search.d.ts +31 -8
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +109 -44
- package/dist/shared.d.ts +11 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +368 -0
- package/dist/status.d.ts +2 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -8
- package/dist/store.d.ts +71 -32
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +509 -221
- package/dist/turn.d.ts +7 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +45 -0
- package/dist/wire.d.ts +58 -19
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +65 -67
- package/package.json +31 -7
- 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,80 +1,127 @@
|
|
|
1
|
-
import { parse } from '@agentshouse/mdmodel';
|
|
2
|
-
import { immutable } from './change.js';
|
|
3
|
-
import {
|
|
4
|
-
import { overlay, overlayChanged, sameLayerText } from './overlay.js';
|
|
1
|
+
import { equalValue, parse } from '@agentshouse/mdmodel';
|
|
2
|
+
import { immutable, landing } from './change.js';
|
|
3
|
+
import { changedCleanly, collectionOf, unreadable, validateCollection, } from './collection.js';
|
|
4
|
+
import { acceptedBinaries, overlay, overlayChanged, sameLayerText, } from './overlay.js';
|
|
5
5
|
import { providerRewritten } from './save.js';
|
|
6
|
-
import {
|
|
6
|
+
import { drafted, patched, settled, shared } from './shared.js';
|
|
7
7
|
export function compositionOf(record) {
|
|
8
8
|
return {
|
|
9
9
|
model: record.model,
|
|
10
10
|
selection: record.typedSelection === null
|
|
11
11
|
? null
|
|
12
12
|
: { roots: record.typedSelection.roots, model: record.selectionModel },
|
|
13
|
-
untypedFolders: record.untypedFolders,
|
|
14
13
|
};
|
|
15
14
|
}
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
function held(record) {
|
|
16
|
+
const documents = shared(record.documents);
|
|
17
|
+
const binaries = shared(record.binaries);
|
|
18
|
+
const revisions = shared(record.revisions);
|
|
19
|
+
const changes = shared(record.changes);
|
|
20
|
+
const written = shared(record.written);
|
|
21
|
+
return documents === record.documents &&
|
|
22
|
+
binaries === record.binaries &&
|
|
23
|
+
revisions === record.revisions &&
|
|
24
|
+
changes === record.changes &&
|
|
25
|
+
written === record.written
|
|
26
|
+
? record
|
|
27
|
+
: { ...record, documents, binaries, revisions, changes, written };
|
|
28
|
+
}
|
|
29
|
+
export function confirmedOf(record, previous) {
|
|
30
|
+
const kept = held(record);
|
|
31
|
+
return {
|
|
32
|
+
record: kept,
|
|
33
|
+
collection: collectionOf(kept.documents, compositionOf(kept), previous?.collection),
|
|
34
|
+
};
|
|
23
35
|
}
|
|
24
36
|
export function sameMembership(record, other) {
|
|
25
|
-
return (JSON.stringify(record.
|
|
26
|
-
JSON.stringify(
|
|
27
|
-
JSON.stringify(other.typedSelection?.roots ?? null));
|
|
37
|
+
return (JSON.stringify(record.typedSelection?.roots ?? null) ===
|
|
38
|
+
JSON.stringify(other.typedSelection?.roots ?? null));
|
|
28
39
|
}
|
|
29
|
-
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
function cleanly(record, previous) {
|
|
41
|
+
if (previous === undefined)
|
|
42
|
+
return false;
|
|
43
|
+
const before = previous.record;
|
|
44
|
+
return changedCleanly({ text: record.documents, binaries: record.binaries }, { text: before.documents, binaries: before.binaries, composition: compositionOf(before) }, compositionOf(record));
|
|
45
|
+
}
|
|
46
|
+
export function readStaged(staged, previous) {
|
|
47
|
+
const record = held(staged);
|
|
48
|
+
const textChanged = previous === undefined || !sameLayerText(record, previous.record);
|
|
49
|
+
const modeled = record.model.status !== 'unavailable' || record.selectionModel.status !== 'unavailable';
|
|
50
|
+
if (modeled &&
|
|
51
|
+
(textChanged ||
|
|
52
|
+
record.model !== previous?.record.model ||
|
|
53
|
+
record.selectionModel !== previous?.record.selectionModel) &&
|
|
54
|
+
!cleanly(record, previous)) {
|
|
55
|
+
const verdict = validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
|
|
36
56
|
if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {
|
|
37
57
|
return { kind: 'refused', refusal: verdict };
|
|
38
58
|
}
|
|
59
|
+
if (verdict.verdict === 'refuse') {
|
|
60
|
+
const refused = unreadable(record.documents, previous?.record.documents);
|
|
61
|
+
if (refused !== null)
|
|
62
|
+
return refused;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (textChanged) {
|
|
66
|
+
const refused = unreadable(record.documents, previous?.record.documents);
|
|
67
|
+
if (refused !== null)
|
|
68
|
+
return refused;
|
|
39
69
|
}
|
|
40
|
-
return
|
|
70
|
+
return { kind: 'staged', confirmed: confirmedOf(record, previous) };
|
|
41
71
|
}
|
|
42
72
|
export function readReclassified(record, previous) {
|
|
43
|
-
const verdict = validateCollection(record.documents, record.
|
|
73
|
+
const verdict = validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
|
|
44
74
|
if (verdict.verdict !== 'refuse')
|
|
45
|
-
return
|
|
75
|
+
return { kind: 'staged', confirmed: confirmedOf(record, previous) };
|
|
46
76
|
return verdict.rule === 'model-unavailable'
|
|
47
77
|
? { kind: 'deferred' }
|
|
48
78
|
: { kind: 'refused', refusal: verdict };
|
|
49
79
|
}
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
80
|
+
function returnedBinaries(held, submitted, accepted) {
|
|
81
|
+
const binaries = drafted(held);
|
|
82
|
+
for (const change of submitted.changes) {
|
|
83
|
+
if (change.kind !== 'move')
|
|
84
|
+
continue;
|
|
85
|
+
const moved = binaries[change.path];
|
|
86
|
+
if (moved === undefined || accepted.revisions[change.to] === undefined)
|
|
87
|
+
continue;
|
|
88
|
+
binaries[change.to] = moved;
|
|
89
|
+
delete binaries[change.path];
|
|
90
|
+
}
|
|
91
|
+
Object.assign(binaries, acceptedBinaries(accepted.binaryFiles ?? {}));
|
|
92
|
+
for (const path of accepted.removals)
|
|
93
|
+
delete binaries[path];
|
|
94
|
+
return settled(binaries);
|
|
95
|
+
}
|
|
96
|
+
export function applyReturned(confirmed, submitted, accepted, roomVersion, writtenAt) {
|
|
97
|
+
const { documents, revisions, changes, removals } = accepted;
|
|
98
|
+
const nextDocuments = drafted(confirmed.record.documents);
|
|
99
|
+
const nextRevisions = drafted(confirmed.record.revisions);
|
|
100
|
+
const nextChanges = drafted(confirmed.record.changes);
|
|
101
|
+
const nextWritten = drafted(confirmed.record.written);
|
|
102
|
+
Object.assign(nextDocuments, documents);
|
|
103
|
+
Object.assign(nextRevisions, revisions);
|
|
104
|
+
for (const path of Object.keys(documents))
|
|
105
|
+
nextWritten[path] = writtenAt;
|
|
59
106
|
for (const [path, revision] of Object.entries(revisions)) {
|
|
60
107
|
if (confirmed.record.revisions[path] !== revision)
|
|
61
108
|
delete nextChanges[path];
|
|
62
109
|
}
|
|
110
|
+
Object.assign(nextChanges, changes);
|
|
63
111
|
for (const path of removals) {
|
|
64
112
|
delete nextDocuments[path];
|
|
65
113
|
delete nextRevisions[path];
|
|
66
114
|
delete nextChanges[path];
|
|
67
115
|
delete nextWritten[path];
|
|
68
|
-
binaryTargets.delete(path);
|
|
69
116
|
}
|
|
70
117
|
return readStaged({
|
|
71
118
|
...confirmed.record,
|
|
72
119
|
roomVersion,
|
|
73
|
-
documents: nextDocuments,
|
|
74
|
-
revisions: nextRevisions,
|
|
75
|
-
changes: nextChanges,
|
|
76
|
-
written: nextWritten,
|
|
77
|
-
|
|
120
|
+
documents: settled(nextDocuments),
|
|
121
|
+
revisions: settled(nextRevisions),
|
|
122
|
+
changes: settled(nextChanges),
|
|
123
|
+
written: settled(nextWritten),
|
|
124
|
+
binaries: returnedBinaries(confirmed.record.binaries, submitted, accepted),
|
|
78
125
|
}, confirmed);
|
|
79
126
|
}
|
|
80
127
|
function predicted(confirmed, batches, previous) {
|
|
@@ -88,8 +135,6 @@ function predicted(confirmed, batches, previous) {
|
|
|
88
135
|
const hasMove = batch.changes.some((change) => change.kind === 'move');
|
|
89
136
|
const reuseRewrite = old?.collection !== undefined &&
|
|
90
137
|
sameLayerText(before, old.before) &&
|
|
91
|
-
JSON.stringify(old.collection.composition.untypedFolders) ===
|
|
92
|
-
JSON.stringify(composition.untypedFolders) &&
|
|
93
138
|
old.collection.composition.model === composition.model &&
|
|
94
139
|
old.collection.composition.selection?.model === composition.selection?.model &&
|
|
95
140
|
JSON.stringify(old.collection.composition.selection?.roots) ===
|
|
@@ -97,9 +142,7 @@ function predicted(confirmed, batches, previous) {
|
|
|
97
142
|
const collection = hasMove
|
|
98
143
|
? reuseRewrite
|
|
99
144
|
? old.collection
|
|
100
|
-
:
|
|
101
|
-
? { text: confirmed.record.documents, collection: confirmed.collection }
|
|
102
|
-
: { text: old.before.documents, collection: old.collection })
|
|
145
|
+
: collectionOf(before.documents, composition, old?.collection ?? confirmed.collection)
|
|
103
146
|
: undefined;
|
|
104
147
|
const effective = collection === undefined
|
|
105
148
|
? batch
|
|
@@ -120,7 +163,7 @@ function predicted(confirmed, batches, previous) {
|
|
|
120
163
|
}
|
|
121
164
|
return { layer, replay };
|
|
122
165
|
}
|
|
123
|
-
export function replicaOf(confirmed, queue,
|
|
166
|
+
export function replicaOf(confirmed, queue, previous) {
|
|
124
167
|
const batches = Object.freeze(queue.map(immutable));
|
|
125
168
|
if (batches.length === 0) {
|
|
126
169
|
return {
|
|
@@ -128,7 +171,7 @@ export function replicaOf(confirmed, queue, rewriting, previous) {
|
|
|
128
171
|
queue: batches,
|
|
129
172
|
visible: {
|
|
130
173
|
documents: confirmed.record.documents,
|
|
131
|
-
|
|
174
|
+
binaries: confirmed.record.binaries,
|
|
132
175
|
revisions: confirmed.record.revisions,
|
|
133
176
|
changes: confirmed.record.changes,
|
|
134
177
|
collection: confirmed.collection,
|
|
@@ -136,26 +179,19 @@ export function replicaOf(confirmed, queue, rewriting, previous) {
|
|
|
136
179
|
replay: [],
|
|
137
180
|
};
|
|
138
181
|
}
|
|
139
|
-
const
|
|
140
|
-
const layer = rewriting === 'provider'
|
|
141
|
-
? predictedState.layer
|
|
142
|
-
: previous === undefined
|
|
143
|
-
? overlay(confirmed.record, batches)
|
|
144
|
-
: overlayChanged(confirmed.record, batches, previous.confirmed.record, previous.queue, previous.visible);
|
|
182
|
+
const { layer, replay } = predicted(confirmed, batches, previous);
|
|
145
183
|
return {
|
|
146
184
|
confirmed,
|
|
147
185
|
queue: batches,
|
|
148
|
-
replay
|
|
186
|
+
replay,
|
|
149
187
|
visible: {
|
|
150
188
|
...layer,
|
|
151
|
-
collection:
|
|
152
|
-
? undefined
|
|
153
|
-
: { text: previous.visible.documents, collection: previous.visible.collection }),
|
|
189
|
+
collection: collectionOf(layer.documents, compositionOf(confirmed.record), previous?.visible.collection ?? confirmed.collection),
|
|
154
190
|
},
|
|
155
191
|
};
|
|
156
192
|
}
|
|
157
193
|
function present(layer, path) {
|
|
158
|
-
return layer.documents[path] !== undefined || layer.
|
|
194
|
+
return layer.documents[path] !== undefined || layer.binaries[path] !== undefined;
|
|
159
195
|
}
|
|
160
196
|
function holds(layer, preconditions) {
|
|
161
197
|
const parsed = new Map();
|
|
@@ -176,6 +212,8 @@ function holds(layer, preconditions) {
|
|
|
176
212
|
if (precondition.kind === 'revision') {
|
|
177
213
|
return present(layer, path) && layer.revisions[path] === precondition.revision;
|
|
178
214
|
}
|
|
215
|
+
if (precondition.kind === 'content')
|
|
216
|
+
return layer.documents[path] === precondition.content;
|
|
179
217
|
const document = documentAt(path);
|
|
180
218
|
if (document === null)
|
|
181
219
|
return false;
|
|
@@ -220,36 +258,33 @@ function effects(change) {
|
|
|
220
258
|
{ kind: 'present', path: change.to },
|
|
221
259
|
];
|
|
222
260
|
}
|
|
261
|
+
if (change.kind === 'binary')
|
|
262
|
+
return [{ kind: 'present', path }];
|
|
223
263
|
return [{ kind: 'absent', path }];
|
|
224
264
|
}
|
|
225
|
-
function
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if (change.kind === 'remove')
|
|
231
|
-
return null;
|
|
232
|
-
if (change.kind === 'move')
|
|
233
|
-
at = change.to;
|
|
234
|
-
}
|
|
235
|
-
return at;
|
|
236
|
-
}
|
|
237
|
-
export function landed(batch, confirmed) {
|
|
238
|
-
const layer = confirmed.record;
|
|
265
|
+
export function landed(batch, confirmed, current = {}) {
|
|
266
|
+
const layer = {
|
|
267
|
+
...confirmed.record,
|
|
268
|
+
documents: patched(confirmed.record.documents, Object.entries(current)),
|
|
269
|
+
};
|
|
239
270
|
return batch.changes.every((change, index) => {
|
|
240
271
|
if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {
|
|
241
|
-
const at =
|
|
272
|
+
const at = landing(batch.changes, index, change.path);
|
|
242
273
|
return at === null || layer.documents[at] === change.content;
|
|
243
274
|
}
|
|
275
|
+
if (change.kind === 'binary') {
|
|
276
|
+
const at = landing(batch.changes, index, change.path);
|
|
277
|
+
return at === null || layer.binaries[at]?.sha256 === change.sha256;
|
|
278
|
+
}
|
|
244
279
|
return effects(change).every((effect) => {
|
|
245
280
|
if (effect.kind === 'absent')
|
|
246
281
|
return holds(layer, [effect]);
|
|
247
|
-
const at =
|
|
282
|
+
const at = landing(batch.changes, index, effect.path);
|
|
248
283
|
return at === null || holds(layer, [{ ...effect, path: at }]);
|
|
249
284
|
});
|
|
250
285
|
});
|
|
251
286
|
}
|
|
252
|
-
export function withdrawals(confirmed, queue, withdrawable,
|
|
287
|
+
export function withdrawals(confirmed, queue, withdrawable, local) {
|
|
253
288
|
if (!queue.some(withdrawable))
|
|
254
289
|
return [];
|
|
255
290
|
const composition = compositionOf(confirmed.record);
|
|
@@ -260,13 +295,21 @@ export function withdrawals(confirmed, queue, withdrawable, rewriting) {
|
|
|
260
295
|
withdrawn.push(batch);
|
|
261
296
|
continue;
|
|
262
297
|
}
|
|
263
|
-
const effective =
|
|
298
|
+
const effective = batch.changes.some((change) => change.kind === 'move')
|
|
264
299
|
? providerRewritten(batch, {
|
|
265
300
|
...layer,
|
|
266
|
-
collection:
|
|
301
|
+
collection: collectionOf(layer.documents, composition),
|
|
267
302
|
})
|
|
268
303
|
: batch;
|
|
269
|
-
|
|
304
|
+
let unapplied = false;
|
|
305
|
+
const next = overlay(layer, [effective], () => {
|
|
306
|
+
unapplied = true;
|
|
307
|
+
});
|
|
308
|
+
if (local && unapplied) {
|
|
309
|
+
withdrawn.push(batch);
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
layer = next;
|
|
270
313
|
}
|
|
271
314
|
return withdrawn;
|
|
272
315
|
}
|
package/dist/room-draft.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ProviderRefusal } from './adapter.js';
|
|
2
|
+
import type { Open } from './open.js';
|
|
2
3
|
import type { Change, Precondition } from './change.js';
|
|
3
4
|
import type { VisibleLayer } from './replica.js';
|
|
4
5
|
export type FieldValue = {
|
|
@@ -36,6 +37,17 @@ export type RoomDraftParts = {
|
|
|
36
37
|
readonly removal?: {
|
|
37
38
|
readonly base?: string | null;
|
|
38
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;
|
|
39
51
|
};
|
|
40
52
|
type HeldParts = {
|
|
41
53
|
readonly fields?: Readonly<Record<string, {
|
|
@@ -62,6 +74,7 @@ type HeldParts = {
|
|
|
62
74
|
readonly removal?: {
|
|
63
75
|
readonly base: string | null;
|
|
64
76
|
};
|
|
77
|
+
readonly file?: HeldFile;
|
|
65
78
|
};
|
|
66
79
|
type ChangedUnderneath = {
|
|
67
80
|
readonly fields?: Readonly<Record<string, FieldValue>>;
|
|
@@ -71,14 +84,12 @@ type ChangedUnderneath = {
|
|
|
71
84
|
readonly creation?: string;
|
|
72
85
|
readonly move?: string | null;
|
|
73
86
|
readonly removal?: string | null;
|
|
87
|
+
readonly file?: string | null;
|
|
74
88
|
};
|
|
75
|
-
export type ReturnReason =
|
|
76
|
-
readonly kind: 'conflicted' | 'rejected';
|
|
77
|
-
}) | {
|
|
78
|
-
readonly kind: 'expired';
|
|
79
|
-
} | {
|
|
80
|
-
readonly kind: 'withdrawn';
|
|
89
|
+
export type ReturnReason = ProviderRefusal & {
|
|
90
|
+
readonly kind: 'conflicted' | 'rejected' | 'expired' | 'withdrawn';
|
|
81
91
|
};
|
|
92
|
+
export declare function returnedBy(kind: 'expired' | 'withdrawn'): ReturnReason;
|
|
82
93
|
export type RoomDraft = {
|
|
83
94
|
readonly room: string;
|
|
84
95
|
readonly path: string;
|
|
@@ -92,11 +103,14 @@ export type RoomDraftWrite = {
|
|
|
92
103
|
readonly roomDraft: RoomDraft | null;
|
|
93
104
|
} | {
|
|
94
105
|
readonly outcome: 'stale';
|
|
106
|
+
readonly code: string;
|
|
107
|
+
readonly retryable: boolean;
|
|
95
108
|
readonly current: RoomDraft | null;
|
|
96
109
|
};
|
|
110
|
+
export declare function staleWrite(current: RoomDraft | null): RoomDraftWrite;
|
|
97
111
|
export type ChangedPart = {
|
|
98
112
|
readonly path: string;
|
|
99
|
-
readonly part: 'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal'
|
|
113
|
+
readonly part: Open<'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal' | 'file'>;
|
|
100
114
|
readonly name?: string;
|
|
101
115
|
};
|
|
102
116
|
export type RoomDraftRecord = {
|
|
@@ -111,14 +125,20 @@ export type SavedDraft = {
|
|
|
111
125
|
readonly parts: HeldParts;
|
|
112
126
|
};
|
|
113
127
|
export declare function readParts(value: unknown): RoomDraftParts;
|
|
114
|
-
export declare function held(current: HeldParts | undefined, parts: RoomDraftParts): HeldParts;
|
|
115
|
-
export declare function equalValue(left: unknown, right: unknown): boolean;
|
|
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[];
|
|
118
133
|
export declare function returnedInto(existing: HeldParts | undefined, returned: HeldParts): HeldParts;
|
|
134
|
+
export declare function moveTarget(move: {
|
|
135
|
+
readonly to: string;
|
|
136
|
+
}): string;
|
|
119
137
|
export declare function changesOf(path: string, parts: HeldParts): {
|
|
120
138
|
changes: readonly Change[];
|
|
121
139
|
bases: readonly Precondition[];
|
|
122
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[];
|
|
123
143
|
export {};
|
|
124
144
|
//# 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":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"room-draft.d.ts","sourceRoot":"","sources":["../src/room-draft.ts"],"names":[],"mappings":"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"}
|