@agentshouse/mdruntime 0.1.0-cacb4c3f6734e → 0.1.0-caee7332d2235
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 +277 -222
- package/README.md +20 -10
- package/dist/adapter.d.ts +95 -20
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +15 -2
- 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 +18 -5
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +113 -37
- package/dist/change-set.d.ts +7 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +54 -16
- 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/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 +27 -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 +192 -0
- package/dist/chat/messages.d.ts +22 -0
- package/dist/chat/messages.d.ts.map +1 -0
- package/dist/chat/messages.js +171 -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/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 +63 -0
- package/dist/chat/provider.d.ts.map +1 -0
- package/dist/chat/provider.js +630 -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 +30 -13
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +79 -16
- package/dist/collection.d.ts +23 -13
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +349 -36
- package/dist/connection.d.ts +50 -16
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1968 -424
- package/dist/conversation.d.ts +31 -10
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +521 -170
- 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/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 +15 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +102 -19
- 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 +16 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/memory.d.ts +11 -4
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +91 -24
- package/dist/model.d.ts +14 -4
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +12 -1
- package/dist/observation.d.ts +7 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +29 -12
- 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 +38 -3
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +45 -1
- package/dist/overlay.d.ts +18 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +247 -165
- package/dist/query.d.ts +60 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +41 -38
- package/dist/reach.d.ts +8 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +73 -24
- package/dist/react.d.ts +31 -20
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +13 -21
- 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 +13 -3
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +72 -42
- package/dist/replica.d.ts +17 -8
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +165 -79
- package/dist/room-draft.d.ts +38 -9
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +141 -33
- package/dist/rows.d.ts +10 -13
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +19 -14
- package/dist/save.d.ts +35 -3
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +522 -107
- package/dist/search.d.ts +52 -8
- 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 +6 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -8
- package/dist/store.d.ts +91 -18
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +704 -283
- 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 +157 -33
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +65 -31
- 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/room-draft.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { apply, parse, serialize } from '@agentshouse/mdmodel';
|
|
1
|
+
import { apply, equalValue, frontmatterValue, parse, serialize, } from '@agentshouse/mdmodel';
|
|
2
|
+
import { runtimeError } from './failure.js';
|
|
3
|
+
import { hexDigest } from './file.js';
|
|
4
|
+
import { binaryLocalId } from './identity.js';
|
|
2
5
|
import { normalize } from './paths.js';
|
|
6
|
+
export function returnedBy(kind) {
|
|
7
|
+
return { kind, code: kind, fields: {}, retryable: false };
|
|
8
|
+
}
|
|
9
|
+
export function staleWrite(current) {
|
|
10
|
+
return { outcome: 'stale', code: 'stale', retryable: false, current };
|
|
11
|
+
}
|
|
3
12
|
function malformed() {
|
|
4
|
-
throw
|
|
13
|
+
throw runtimeError('room-draft-malformed');
|
|
5
14
|
}
|
|
6
15
|
function plain(value) {
|
|
7
16
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
8
17
|
}
|
|
9
|
-
function frontmatterValue(value) {
|
|
10
|
-
if (Array.isArray(value))
|
|
11
|
-
return value.every(frontmatterValue);
|
|
12
|
-
return (value === null ||
|
|
13
|
-
typeof value === 'string' ||
|
|
14
|
-
typeof value === 'boolean' ||
|
|
15
|
-
(typeof value === 'number' && Number.isFinite(value)));
|
|
16
|
-
}
|
|
17
18
|
function text(value) {
|
|
18
19
|
return typeof value === 'string' ? value : malformed();
|
|
19
20
|
}
|
|
@@ -61,6 +62,7 @@ const PART_NAMES = new Set([
|
|
|
61
62
|
'creation',
|
|
62
63
|
'move',
|
|
63
64
|
'removal',
|
|
65
|
+
'file',
|
|
64
66
|
]);
|
|
65
67
|
export function readParts(value) {
|
|
66
68
|
if (!plain(value) || Object.keys(value).some((name) => !PART_NAMES.has(name)))
|
|
@@ -96,6 +98,13 @@ export function readParts(value) {
|
|
|
96
98
|
const base = markdownBase(value.removal.base);
|
|
97
99
|
parts.removal = base === undefined ? {} : { base };
|
|
98
100
|
}
|
|
101
|
+
if (value.file !== undefined) {
|
|
102
|
+
if (!plain(value.file) || !(value.file.blob instanceof Blob))
|
|
103
|
+
malformed();
|
|
104
|
+
if (Object.keys(value).length > 1)
|
|
105
|
+
throw runtimeError('room-draft-file-exclusive');
|
|
106
|
+
parts.file = { blob: value.file.blob };
|
|
107
|
+
}
|
|
99
108
|
return parts;
|
|
100
109
|
}
|
|
101
110
|
function named(record) {
|
|
@@ -108,7 +117,7 @@ function kept(prior, base) {
|
|
|
108
117
|
if (prior !== undefined)
|
|
109
118
|
return prior.base;
|
|
110
119
|
if (base === undefined)
|
|
111
|
-
throw
|
|
120
|
+
throw runtimeError('room-draft-base-missing');
|
|
112
121
|
return base;
|
|
113
122
|
}
|
|
114
123
|
function editsText(parts) {
|
|
@@ -116,9 +125,32 @@ function editsText(parts) {
|
|
|
116
125
|
named(parts.fields).length > 0 ||
|
|
117
126
|
named(parts.sections).length > 0);
|
|
118
127
|
}
|
|
119
|
-
export function held(current, parts) {
|
|
128
|
+
export function held(current, parts, file) {
|
|
120
129
|
if (parts.markdown !== undefined && editsText(parts)) {
|
|
121
|
-
throw
|
|
130
|
+
throw runtimeError('room-draft-markdown-exclusive');
|
|
131
|
+
}
|
|
132
|
+
if (file !== undefined) {
|
|
133
|
+
if (current !== undefined && current.file === undefined) {
|
|
134
|
+
throw runtimeError('room-draft-file-exclusive');
|
|
135
|
+
}
|
|
136
|
+
return { file: { ...file, base: current?.file === undefined ? file.base : current.file.base } };
|
|
137
|
+
}
|
|
138
|
+
if (current?.file !== undefined) {
|
|
139
|
+
if (editsText(parts) ||
|
|
140
|
+
parts.markdown !== undefined ||
|
|
141
|
+
parts.creation !== undefined ||
|
|
142
|
+
(parts.move === undefined && parts.removal === undefined)) {
|
|
143
|
+
throw runtimeError('room-draft-file-exclusive');
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
file: current.file,
|
|
147
|
+
...(parts.move === undefined
|
|
148
|
+
? {}
|
|
149
|
+
: { move: { to: parts.move.to, base: kept(current.move, parts.move.base) } }),
|
|
150
|
+
...(parts.removal === undefined
|
|
151
|
+
? {}
|
|
152
|
+
: { removal: { base: kept(current.removal, parts.removal.base) } }),
|
|
153
|
+
};
|
|
122
154
|
}
|
|
123
155
|
const next = {};
|
|
124
156
|
const fields = named(parts.fields);
|
|
@@ -156,17 +188,9 @@ export function held(current, parts) {
|
|
|
156
188
|
next.removal = { base: kept(current?.removal, parts.removal.base) };
|
|
157
189
|
}
|
|
158
190
|
if (Object.keys(next).length === 0)
|
|
159
|
-
throw
|
|
191
|
+
throw runtimeError('room-draft-empty');
|
|
160
192
|
return next;
|
|
161
193
|
}
|
|
162
|
-
export function equalValue(left, right) {
|
|
163
|
-
if (left === right)
|
|
164
|
-
return true;
|
|
165
|
-
return (Array.isArray(left) &&
|
|
166
|
-
Array.isArray(right) &&
|
|
167
|
-
left.length === right.length &&
|
|
168
|
-
left.every((item, index) => equalValue(item, right[index])));
|
|
169
|
-
}
|
|
170
194
|
function sameField(left, right) {
|
|
171
195
|
if (left === null || right === null)
|
|
172
196
|
return left === right;
|
|
@@ -174,7 +198,7 @@ function sameField(left, right) {
|
|
|
174
198
|
}
|
|
175
199
|
export function underneath(parts, path, visible) {
|
|
176
200
|
const markdown = visible?.documents[path] ?? null;
|
|
177
|
-
const document = visible?.collection.
|
|
201
|
+
const document = visible?.collection.document(path);
|
|
178
202
|
const report = {};
|
|
179
203
|
const fields = {};
|
|
180
204
|
for (const [name, part] of named(parts.fields)) {
|
|
@@ -207,8 +231,28 @@ export function underneath(parts, path, visible) {
|
|
|
207
231
|
report.move = markdown;
|
|
208
232
|
if (parts.removal !== undefined && markdown !== parts.removal.base)
|
|
209
233
|
report.removal = markdown;
|
|
234
|
+
if (parts.file !== undefined) {
|
|
235
|
+
const file = binaryBase(visible, path);
|
|
236
|
+
if (file !== parts.file.base || markdown !== null)
|
|
237
|
+
report.file = file;
|
|
238
|
+
}
|
|
210
239
|
return report;
|
|
211
240
|
}
|
|
241
|
+
const UNTYPED_MEDIA_TYPE = 'application/octet-stream';
|
|
242
|
+
export async function heldFile(blob, base) {
|
|
243
|
+
const bytes = await blob.arrayBuffer();
|
|
244
|
+
return {
|
|
245
|
+
blob,
|
|
246
|
+
localId: binaryLocalId(),
|
|
247
|
+
byteLength: bytes.byteLength,
|
|
248
|
+
mediaType: blob.type === '' ? UNTYPED_MEDIA_TYPE : blob.type,
|
|
249
|
+
sha256: hexDigest(await crypto.subtle.digest('SHA-256', bytes)),
|
|
250
|
+
base,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
export function binaryBase(visible, path) {
|
|
254
|
+
return visible?.binaries[path] === undefined ? null : (visible.revisions[path] ?? null);
|
|
255
|
+
}
|
|
212
256
|
export function changedParts(path, report) {
|
|
213
257
|
return [
|
|
214
258
|
...(report.creation === undefined ? [] : [{ path, part: 'creation' }]),
|
|
@@ -218,6 +262,7 @@ export function changedParts(path, report) {
|
|
|
218
262
|
...(report.markdown === undefined ? [] : [{ path, part: 'markdown' }]),
|
|
219
263
|
...(report.move === undefined ? [] : [{ path, part: 'move' }]),
|
|
220
264
|
...(report.removal === undefined ? [] : [{ path, part: 'removal' }]),
|
|
265
|
+
...(report.file === undefined ? [] : [{ path, part: 'file' }]),
|
|
221
266
|
];
|
|
222
267
|
}
|
|
223
268
|
function joined(existing, returned) {
|
|
@@ -234,16 +279,15 @@ function frontmatterOf(fields) {
|
|
|
234
279
|
const opened = parse('---\n---\n');
|
|
235
280
|
if (!opened.ok)
|
|
236
281
|
return malformed();
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
return serialize(document);
|
|
282
|
+
const next = apply(opened.document, fields.map(([name, part]) => ({
|
|
283
|
+
kind: 'field',
|
|
284
|
+
name,
|
|
285
|
+
value: part.value,
|
|
286
|
+
prior: undefined,
|
|
287
|
+
})));
|
|
288
|
+
return next.outcome === 'applied' ? serialize(next.document) : malformed();
|
|
245
289
|
}
|
|
246
|
-
function
|
|
290
|
+
export function partsAfter(markdown, parts) {
|
|
247
291
|
const fields = named(parts.fields);
|
|
248
292
|
const pieces = [
|
|
249
293
|
...(fields.length === 0 ? [] : [frontmatterOf(fields)]),
|
|
@@ -274,18 +318,21 @@ export function returnedInto(existing, returned) {
|
|
|
274
318
|
delete next.fields;
|
|
275
319
|
delete next.sections;
|
|
276
320
|
delete next.preamble;
|
|
277
|
-
const value =
|
|
321
|
+
const value = partsAfter(whole.value, existing.markdown === undefined ? existing : returned);
|
|
278
322
|
next.markdown = { value, base: whole.base };
|
|
279
323
|
}
|
|
280
324
|
const creation = existing.creation ?? returned.creation;
|
|
281
325
|
const move = existing.move ?? returned.move;
|
|
282
326
|
const removal = existing.removal ?? returned.removal;
|
|
327
|
+
const file = existing.file ?? returned.file;
|
|
283
328
|
if (creation !== undefined)
|
|
284
329
|
next.creation = creation;
|
|
285
330
|
if (move !== undefined)
|
|
286
331
|
next.move = move;
|
|
287
332
|
if (removal !== undefined)
|
|
288
333
|
next.removal = removal;
|
|
334
|
+
if (file !== undefined)
|
|
335
|
+
next.file = file;
|
|
289
336
|
return next;
|
|
290
337
|
}
|
|
291
338
|
export function moveTarget(move) {
|
|
@@ -321,9 +368,70 @@ export function changesOf(path, parts) {
|
|
|
321
368
|
if (parts.markdown !== undefined) {
|
|
322
369
|
changes.push({ kind: 'replace', path, content: parts.markdown.value });
|
|
323
370
|
}
|
|
371
|
+
if (parts.file !== undefined && parts.removal === undefined) {
|
|
372
|
+
const { base, ...file } = parts.file;
|
|
373
|
+
const at = parts.move === undefined ? path : moveTarget(parts.move);
|
|
374
|
+
if (base !== null && at !== path)
|
|
375
|
+
changes.push({ kind: 'move', path, to: at });
|
|
376
|
+
changes.push({ kind: 'binary', path: at, ...file });
|
|
377
|
+
if (base === null && at !== path)
|
|
378
|
+
bases.push({ kind: 'absent', path: at });
|
|
379
|
+
return { changes, bases };
|
|
380
|
+
}
|
|
381
|
+
if (parts.file?.base === null)
|
|
382
|
+
return { changes, bases };
|
|
324
383
|
if (parts.move !== undefined)
|
|
325
384
|
changes.push({ kind: 'move', path, to: moveTarget(parts.move) });
|
|
326
385
|
if (parts.removal !== undefined)
|
|
327
386
|
changes.push({ kind: 'remove', path });
|
|
328
387
|
return { changes, bases };
|
|
329
388
|
}
|
|
389
|
+
function rebased(before, after) {
|
|
390
|
+
return before === undefined ? after : { ...after, base: before.base };
|
|
391
|
+
}
|
|
392
|
+
function rebasedAll(before, after) {
|
|
393
|
+
return {
|
|
394
|
+
...before,
|
|
395
|
+
...Object.fromEntries(Object.entries(after).map(([name, part]) => [name, rebased(before?.[name], part)])),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
export function joinedDraft(carried, saved) {
|
|
399
|
+
const draft = saved.find((item) => item.path === carried.path);
|
|
400
|
+
if (draft === undefined)
|
|
401
|
+
return carried;
|
|
402
|
+
const held = carried.parts;
|
|
403
|
+
const next = draft.parts;
|
|
404
|
+
return {
|
|
405
|
+
path: carried.path,
|
|
406
|
+
parts: {
|
|
407
|
+
...held,
|
|
408
|
+
...next,
|
|
409
|
+
...(next.fields === undefined ? {} : { fields: rebasedAll(held.fields, next.fields) }),
|
|
410
|
+
...(next.sections === undefined
|
|
411
|
+
? {}
|
|
412
|
+
: { sections: rebasedAll(held.sections, next.sections) }),
|
|
413
|
+
...(next.preamble === undefined ? {} : { preamble: rebased(held.preamble, next.preamble) }),
|
|
414
|
+
...(next.markdown === undefined ? {} : { markdown: rebased(held.markdown, next.markdown) }),
|
|
415
|
+
},
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
export function withdrawnDrafts(drafts, changes) {
|
|
419
|
+
return drafts.flatMap((draft) => {
|
|
420
|
+
const file = draft.parts.file;
|
|
421
|
+
const at = draft.parts.move?.to ?? draft.path;
|
|
422
|
+
const change = changes.find((item) => (item.kind === 'move' || item.kind === 'remove') && item.path === at);
|
|
423
|
+
if (file === undefined || change === undefined)
|
|
424
|
+
return [draft];
|
|
425
|
+
if (change.kind === 'move') {
|
|
426
|
+
return [
|
|
427
|
+
{
|
|
428
|
+
path: draft.path,
|
|
429
|
+
parts: change.to === draft.path ? { file } : { file, move: { to: change.to, base: null } },
|
|
430
|
+
},
|
|
431
|
+
];
|
|
432
|
+
}
|
|
433
|
+
return file.base === null
|
|
434
|
+
? []
|
|
435
|
+
: [{ path: draft.path, parts: { file, removal: { base: null } } }];
|
|
436
|
+
});
|
|
437
|
+
}
|
package/dist/rows.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Frontmatter } from '@agentshouse/mdmodel';
|
|
2
2
|
import type { HeadChange } from './adapter.js';
|
|
3
|
+
import type { BinaryFileRecord } from './binary.js';
|
|
3
4
|
import { type Composition } from './collection.js';
|
|
4
5
|
type Fields = Readonly<Record<string, unknown>>;
|
|
5
6
|
export type DocumentRow = {
|
|
@@ -12,17 +13,11 @@ export type DocumentRow = {
|
|
|
12
13
|
values: Fields;
|
|
13
14
|
reached: Readonly<Record<string, readonly unknown[]>>;
|
|
14
15
|
directories: readonly string[];
|
|
15
|
-
|
|
16
|
+
folder: string;
|
|
17
|
+
text: string | null;
|
|
16
18
|
change: HeadChange | null;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
key: string;
|
|
20
|
-
kind: 'body';
|
|
21
|
-
room: string;
|
|
22
|
-
path: string;
|
|
23
|
-
preamble: string;
|
|
24
|
-
sections: Readonly<Record<string, string>>;
|
|
25
|
-
markdown: string;
|
|
19
|
+
fileId: string | null;
|
|
20
|
+
binary: BinaryFileRecord | null;
|
|
26
21
|
};
|
|
27
22
|
export type ReferenceRow = {
|
|
28
23
|
key: string;
|
|
@@ -35,8 +30,10 @@ export type ReferenceRow = {
|
|
|
35
30
|
path: string;
|
|
36
31
|
type: string;
|
|
37
32
|
};
|
|
38
|
-
export type Row = DocumentRow |
|
|
33
|
+
export type Row = DocumentRow | ReferenceRow;
|
|
39
34
|
export declare function documentKey(room: string, path: string): string;
|
|
40
|
-
export declare function
|
|
35
|
+
export declare function roomOfKey(key: string): string;
|
|
36
|
+
export declare function markdownPath(path: string): boolean;
|
|
37
|
+
export declare function rowsOf(room: string, path: string, document: Frontmatter | null, composition: Composition, change: HeadChange | null, fileId: string | null, binary: BinaryFileRecord | null): readonly Row[];
|
|
41
38
|
export {};
|
|
42
39
|
//# sourceMappingURL=rows.d.ts.map
|
package/dist/rows.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../src/rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,
|
|
1
|
+
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../src/rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9D,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;IACtD,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG,WAAW,GAAG,YAAY,CAAC;AAM7C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAuFD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,UAAU,GAAG,IAAI,EACzB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAC9B,SAAS,GAAG,EAAE,CAmEhB"}
|
package/dist/rows.js
CHANGED
|
@@ -7,6 +7,9 @@ function keyOf(...parts) {
|
|
|
7
7
|
export function documentKey(room, path) {
|
|
8
8
|
return keyOf('d', room, path);
|
|
9
9
|
}
|
|
10
|
+
export function roomOfKey(key) {
|
|
11
|
+
return key.split('\u0000')[1];
|
|
12
|
+
}
|
|
10
13
|
function plainObject(value) {
|
|
11
14
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
12
15
|
}
|
|
@@ -61,14 +64,19 @@ function walk(reading, node, forms, exact) {
|
|
|
61
64
|
: [{ text: `${form.text}/${segment}`, through: form.through, pending: false }]), `${exact}/${segment}`);
|
|
62
65
|
}
|
|
63
66
|
}
|
|
67
|
+
function folderOf(path) {
|
|
68
|
+
return path.slice(0, Math.max(path.lastIndexOf('/'), 0));
|
|
69
|
+
}
|
|
64
70
|
function directoriesOf(path) {
|
|
65
71
|
const parts = path.split('/').slice(0, -1);
|
|
66
72
|
return ['', ...parts.map((_, index) => parts.slice(0, index + 1).join('/'))];
|
|
67
73
|
}
|
|
68
|
-
export function
|
|
74
|
+
export function markdownPath(path) {
|
|
75
|
+
return path.endsWith('.md');
|
|
76
|
+
}
|
|
77
|
+
export function rowsOf(room, path, document, composition, change, fileId, binary) {
|
|
69
78
|
const key = documentKey(room, path);
|
|
70
|
-
|
|
71
|
-
if (document === null || !path.endsWith('.md')) {
|
|
79
|
+
if (document === null || !markdownPath(path)) {
|
|
72
80
|
return [
|
|
73
81
|
{
|
|
74
82
|
key,
|
|
@@ -80,8 +88,11 @@ export function rowsOf(room, path, document, composition, change) {
|
|
|
80
88
|
values: {},
|
|
81
89
|
reached: {},
|
|
82
90
|
directories: directoriesOf(path),
|
|
83
|
-
|
|
91
|
+
folder: folderOf(path),
|
|
92
|
+
text: null,
|
|
84
93
|
change,
|
|
94
|
+
fileId,
|
|
95
|
+
binary,
|
|
85
96
|
},
|
|
86
97
|
];
|
|
87
98
|
}
|
|
@@ -110,17 +121,11 @@ export function rowsOf(room, path, document, composition, change) {
|
|
|
110
121
|
values,
|
|
111
122
|
reached,
|
|
112
123
|
directories: directoriesOf(path),
|
|
113
|
-
|
|
124
|
+
folder: folderOf(path),
|
|
125
|
+
text: document.content,
|
|
114
126
|
change,
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
key: body,
|
|
118
|
-
kind: 'body',
|
|
119
|
-
room,
|
|
120
|
-
path,
|
|
121
|
-
preamble: document.preamble,
|
|
122
|
-
sections: document.sections,
|
|
123
|
-
markdown: document.content,
|
|
127
|
+
fileId,
|
|
128
|
+
binary,
|
|
124
129
|
},
|
|
125
130
|
...[...reading.targets.values()].map(({ field, target: found, forms }) => ({
|
|
126
131
|
key: keyOf('r', room, path, field, found),
|
package/dist/save.d.ts
CHANGED
|
@@ -3,14 +3,17 @@ import { type Change, type ChangeBatch, type Precondition, type WrittenBy } from
|
|
|
3
3
|
import { type Composition } from './collection.js';
|
|
4
4
|
import type { VisibleLayer } from './replica.js';
|
|
5
5
|
import type { ChangedPart } from './room-draft.js';
|
|
6
|
+
import { type Later } from './turn.js';
|
|
6
7
|
export type SaveRefusal = {
|
|
7
|
-
|
|
8
|
+
code: string;
|
|
9
|
+
retryable: boolean;
|
|
8
10
|
file?: string;
|
|
9
11
|
location?: string;
|
|
10
12
|
referrers?: readonly string[];
|
|
11
13
|
parts?: readonly ChangedPart[];
|
|
12
14
|
};
|
|
13
15
|
export type SaveInput = {
|
|
16
|
+
local: boolean;
|
|
14
17
|
composition: Composition;
|
|
15
18
|
baseRoomVersion: string;
|
|
16
19
|
operations: import('./adapter.js').OperationScopes;
|
|
@@ -20,7 +23,13 @@ export type SaveInput = {
|
|
|
20
23
|
handle: string;
|
|
21
24
|
changes: readonly Change[];
|
|
22
25
|
bases: readonly Precondition[];
|
|
26
|
+
queued?: ReadonlySet<string>;
|
|
23
27
|
writtenBy?: WrittenBy;
|
|
28
|
+
clean?: {
|
|
29
|
+
text: Readonly<Record<string, string>>;
|
|
30
|
+
binaries: Readonly<Record<string, unknown>>;
|
|
31
|
+
composition: Composition;
|
|
32
|
+
};
|
|
24
33
|
};
|
|
25
34
|
export type BatchResult = {
|
|
26
35
|
kind: 'batch';
|
|
@@ -29,6 +38,29 @@ export type BatchResult = {
|
|
|
29
38
|
kind: 'refused';
|
|
30
39
|
refusal: SaveRefusal;
|
|
31
40
|
};
|
|
32
|
-
export declare function providerRewritten(batch: ChangeBatch, visible: VisibleLayer): ChangeBatch
|
|
33
|
-
export declare function
|
|
41
|
+
export declare function providerRewritten(batch: ChangeBatch, visible: VisibleLayer): Generator<number, ChangeBatch, void>;
|
|
42
|
+
export declare function queuedDocuments(queue: readonly ChangeBatch[]): ReadonlySet<string>;
|
|
43
|
+
export type Requeued = {
|
|
44
|
+
kind: 'requeued';
|
|
45
|
+
queue: readonly ChangeBatch[];
|
|
46
|
+
changes: readonly Change[];
|
|
47
|
+
queued: ReadonlySet<string>;
|
|
48
|
+
withdrawn: ReadonlyMap<string, ChangeBatch | null>;
|
|
49
|
+
owners: ReadonlySet<string>;
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'refused';
|
|
52
|
+
refusal: SaveRefusal;
|
|
53
|
+
};
|
|
54
|
+
export type Joining = {
|
|
55
|
+
kind: 'joined';
|
|
56
|
+
batch: ChangeBatch;
|
|
57
|
+
queue: readonly ChangeBatch[];
|
|
58
|
+
} | {
|
|
59
|
+
kind: 'refused';
|
|
60
|
+
refusal: SaveRefusal;
|
|
61
|
+
};
|
|
62
|
+
export declare function requeued(queue: readonly ChangeBatch[], changes: readonly Change[], visible: VisibleLayer, changeable: (batch: ChangeBatch) => boolean, state: (queue: readonly ChangeBatch[]) => VisibleLayer): Requeued;
|
|
63
|
+
export declare function joined(queue: readonly ChangeBatch[], owner: ChangeBatch, extra: ChangeBatch): Joining;
|
|
64
|
+
export declare function limitedIn(queue: readonly ChangeBatch[], batch: ChangeBatch, limits: readonly ProviderLimit[], state: (queue: readonly ChangeBatch[]) => VisibleLayer): SaveRefusal | null;
|
|
65
|
+
export declare function buildBatch(input: SaveInput): Later<BatchResult>;
|
|
34
66
|
//# sourceMappingURL=save.d.ts.map
|
package/dist/save.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
|