@agentshouse/mdruntime-adapter 0.1.0-ccd2ccb1f7214 → 0.1.0-ccda1a2da11c3
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 +50 -40
- package/dist/actions.d.ts +11 -5
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +77 -97
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +183 -139
- package/dist/discovery.d.ts +3 -2
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +24 -6
- package/dist/gather.d.ts +1 -1
- package/dist/gather.d.ts.map +1 -1
- package/dist/gather.js +4 -14
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/part.d.ts +13 -0
- package/dist/part.d.ts.map +1 -0
- package/dist/part.js +80 -0
- package/dist/read.d.ts +51 -27
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +241 -124
- package/dist/referrer.d.ts +2 -0
- package/dist/referrer.d.ts.map +1 -1
- package/dist/referrer.js +8 -2
- package/dist/room-types.d.ts +6 -0
- package/dist/room-types.d.ts.map +1 -0
- package/dist/room-types.js +66 -0
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +63 -76
- package/dist/stream.d.ts +3 -3
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +38 -34
- package/dist/transport.d.ts +6 -3
- package/dist/transport.d.ts.map +1 -1
- package/dist/write.d.ts +12 -1
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +90 -42
- package/package.json +2 -2
- package/dist/handed.d.ts +0 -15
- package/dist/handed.d.ts.map +0 -1
- package/dist/handed.js +0 -38
package/dist/read.js
CHANGED
|
@@ -1,21 +1,72 @@
|
|
|
1
|
+
import { patching, ROW_WEIGHT, stepped, } from '@agentshouse/mdruntime';
|
|
2
|
+
import { checkedPayload, gunzipped, parsePart } from './part.js';
|
|
1
3
|
import { DECIMAL, readPosition, roomVersion } from './version.js';
|
|
2
4
|
const REVISION_FILE = /^fr_([0-9a-z]+)\.[0-9a-z]+\.[0-9a-z]$/u;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
function fileOf(revision) {
|
|
6
|
+
return REVISION_FILE.exec(revision)?.[1];
|
|
7
|
+
}
|
|
8
|
+
export function answering() {
|
|
9
|
+
return {
|
|
10
|
+
documents: new Map(),
|
|
11
|
+
revisions: new Map(),
|
|
12
|
+
fileIds: new Map(),
|
|
13
|
+
changes: new Map(),
|
|
14
|
+
binaryFiles: new Map(),
|
|
15
|
+
removals: new Set(),
|
|
16
|
+
folders: new Set(),
|
|
17
|
+
folderRemovals: new Set(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function revised(answer, path, revision) {
|
|
21
|
+
answer.revisions.set(path, revision);
|
|
22
|
+
const file = fileOf(revision);
|
|
23
|
+
if (file !== undefined)
|
|
24
|
+
answer.fileIds.set(path, file);
|
|
25
|
+
}
|
|
26
|
+
export function forgotten(answer, path) {
|
|
27
|
+
answer.documents.delete(path);
|
|
28
|
+
answer.revisions.delete(path);
|
|
29
|
+
answer.fileIds.delete(path);
|
|
30
|
+
answer.changes.delete(path);
|
|
31
|
+
answer.binaryFiles.delete(path);
|
|
32
|
+
answer.removals.delete(path);
|
|
33
|
+
}
|
|
34
|
+
export function folded(answer, path, removed) {
|
|
35
|
+
if (removed) {
|
|
36
|
+
answer.folders.delete(path);
|
|
37
|
+
answer.folderRemovals.add(path);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
answer.folderRemovals.delete(path);
|
|
41
|
+
answer.folders.add(path);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function* pathsOf(paths) {
|
|
45
|
+
const list = [];
|
|
46
|
+
for (const path of paths) {
|
|
47
|
+
list.push(path);
|
|
48
|
+
yield ROW_WEIGHT;
|
|
49
|
+
}
|
|
50
|
+
return list;
|
|
51
|
+
}
|
|
52
|
+
export function* answered(answer) {
|
|
53
|
+
const removals = yield* pathsOf(answer.removals);
|
|
54
|
+
return {
|
|
55
|
+
documents: yield* patching({}, answer.documents),
|
|
56
|
+
revisions: yield* patching({}, answer.revisions),
|
|
57
|
+
...(answer.fileIds.size === 0 ? {} : { fileIds: yield* patching({}, answer.fileIds) }),
|
|
58
|
+
changes: yield* patching({}, answer.changes),
|
|
59
|
+
binaryFiles: yield* patching({}, answer.binaryFiles),
|
|
60
|
+
removals,
|
|
61
|
+
...(answer.folders.size === 0 ? {} : { folders: yield* pathsOf(answer.folders) }),
|
|
62
|
+
...(answer.folderRemovals.size === 0
|
|
63
|
+
? {}
|
|
64
|
+
: { folderRemovals: yield* pathsOf(answer.folderRemovals) }),
|
|
65
|
+
};
|
|
9
66
|
}
|
|
10
67
|
export function authorityRoot(handle) {
|
|
11
68
|
return `/rooms/${handle}`;
|
|
12
69
|
}
|
|
13
|
-
export function contentPrefixes(tracked) {
|
|
14
|
-
return [
|
|
15
|
-
authorityRoot(tracked.handle),
|
|
16
|
-
...tracked.schemas.map((schema) => schemaPath(tracked.handle, schema)),
|
|
17
|
-
];
|
|
18
|
-
}
|
|
19
70
|
export function schemaPath(handle, schema) {
|
|
20
71
|
return `${authorityRoot(handle)}/${schema}`;
|
|
21
72
|
}
|
|
@@ -28,22 +79,37 @@ export function parseGrant(body) {
|
|
|
28
79
|
const transfer = body.transfer;
|
|
29
80
|
if (typeof transfer.url !== 'string')
|
|
30
81
|
return null;
|
|
31
|
-
if (transfer.method === 'GET')
|
|
32
|
-
return { method: 'GET', url: transfer.url };
|
|
33
82
|
if (transfer.method !== 'POST' || typeof transfer.operation !== 'string')
|
|
34
83
|
return null;
|
|
35
|
-
return {
|
|
84
|
+
return { operation: transfer.operation, url: transfer.url };
|
|
85
|
+
}
|
|
86
|
+
export function parseFileAddress(body) {
|
|
87
|
+
if (typeof body !== 'object' || body === null)
|
|
88
|
+
return null;
|
|
89
|
+
const { download, name, sha256, media_type: mediaType } = body;
|
|
90
|
+
if (typeof download !== 'string' ||
|
|
91
|
+
typeof name !== 'string' ||
|
|
92
|
+
typeof sha256 !== 'string' ||
|
|
93
|
+
typeof mediaType !== 'string') {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return { url: download, name, sha256, mediaType };
|
|
36
97
|
}
|
|
37
98
|
function changeAuthor(value) {
|
|
38
99
|
if (typeof value !== 'object' || value === null)
|
|
39
100
|
return null;
|
|
40
|
-
const { user, site, name } = value;
|
|
101
|
+
const { user, site, inbox, name } = value;
|
|
41
102
|
if (typeof name !== 'string')
|
|
42
103
|
return null;
|
|
43
|
-
|
|
104
|
+
const named = [user, site, inbox].filter((id) => id !== undefined);
|
|
105
|
+
if (named.length !== 1)
|
|
106
|
+
return null;
|
|
107
|
+
if (typeof user === 'string')
|
|
44
108
|
return { kind: 'user', id: user, name };
|
|
45
|
-
if (typeof site === 'string'
|
|
109
|
+
if (typeof site === 'string')
|
|
46
110
|
return { kind: 'site', id: site, name };
|
|
111
|
+
if (typeof inbox === 'string')
|
|
112
|
+
return { kind: 'inbox', id: inbox, name };
|
|
47
113
|
return null;
|
|
48
114
|
}
|
|
49
115
|
export function headChange(held) {
|
|
@@ -105,13 +171,13 @@ function parseFile(value, mode) {
|
|
|
105
171
|
...binaried(binary),
|
|
106
172
|
};
|
|
107
173
|
}
|
|
108
|
-
function
|
|
174
|
+
function parseRoomParts(value) {
|
|
109
175
|
if (typeof value !== 'object' || value === null)
|
|
110
176
|
return null;
|
|
111
177
|
const held = value;
|
|
112
178
|
if (typeof held.manifest !== 'object' || held.manifest === null)
|
|
113
179
|
return null;
|
|
114
|
-
if (!Array.isArray(held.
|
|
180
|
+
if (!Array.isArray(held.parts))
|
|
115
181
|
return null;
|
|
116
182
|
const manifest = held.manifest;
|
|
117
183
|
if (manifest.scope !== 'room')
|
|
@@ -121,77 +187,103 @@ function parseScope(value, mode) {
|
|
|
121
187
|
return null;
|
|
122
188
|
if (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)
|
|
123
189
|
return null;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const file = parseFile(entry, mode);
|
|
129
|
-
if (file === null)
|
|
130
|
-
return null;
|
|
131
|
-
files.push(file);
|
|
132
|
-
}
|
|
133
|
-
const contents = [];
|
|
134
|
-
for (const entry of held.contents) {
|
|
135
|
-
if (typeof entry !== 'object' || entry === null)
|
|
190
|
+
const parts = [];
|
|
191
|
+
for (const entry of held.parts) {
|
|
192
|
+
const part = parsePart(entry);
|
|
193
|
+
if (part === null)
|
|
136
194
|
return null;
|
|
137
|
-
|
|
138
|
-
if (typeof content.path !== 'string' || typeof content.content !== 'string')
|
|
139
|
-
return null;
|
|
140
|
-
contents.push({ path: content.path, content: content.content });
|
|
195
|
+
parts.push(part);
|
|
141
196
|
}
|
|
142
|
-
return { anchor: manifest.anchor, ...at,
|
|
143
|
-
}
|
|
144
|
-
function parseCut(value) {
|
|
145
|
-
if (value === undefined)
|
|
146
|
-
return undefined;
|
|
147
|
-
if (typeof value !== 'object' || value === null)
|
|
148
|
-
return null;
|
|
149
|
-
const { position, log_epoch: logEpoch } = value;
|
|
150
|
-
if (typeof position !== 'string' || typeof logEpoch !== 'string')
|
|
151
|
-
return null;
|
|
152
|
-
return { position, log_epoch: logEpoch };
|
|
153
|
-
}
|
|
154
|
-
function parseCursor(value) {
|
|
155
|
-
if (typeof value !== 'object' || value === null)
|
|
156
|
-
return null;
|
|
157
|
-
const { room, path, cut } = value;
|
|
158
|
-
if (typeof room !== 'string' || (path !== null && typeof path !== 'string'))
|
|
159
|
-
return null;
|
|
160
|
-
const parsed = parseCut(cut);
|
|
161
|
-
if (parsed === null)
|
|
162
|
-
return null;
|
|
163
|
-
return { room, path, ...(parsed === undefined ? {} : { cut: parsed }) };
|
|
197
|
+
return { anchor: manifest.anchor, ...at, parts };
|
|
164
198
|
}
|
|
165
|
-
export function
|
|
199
|
+
export function parseParted(body) {
|
|
166
200
|
if (typeof body !== 'object' || body === null)
|
|
167
201
|
return null;
|
|
168
202
|
if (!('scopes' in body) || !Array.isArray(body.scopes))
|
|
169
203
|
return null;
|
|
170
|
-
const
|
|
204
|
+
const rooms = [];
|
|
171
205
|
for (const entry of body.scopes) {
|
|
172
|
-
const
|
|
173
|
-
if (
|
|
206
|
+
const room = parseRoomParts(entry);
|
|
207
|
+
if (room === null)
|
|
174
208
|
return null;
|
|
175
|
-
|
|
209
|
+
rooms.push(room);
|
|
176
210
|
}
|
|
177
211
|
if (!('next' in body) || body.next === undefined)
|
|
178
|
-
return {
|
|
179
|
-
const next =
|
|
180
|
-
|
|
212
|
+
return { rooms };
|
|
213
|
+
const next = body.next;
|
|
214
|
+
if (typeof next !== 'object' || next === null || typeof next.room !== 'string')
|
|
215
|
+
return null;
|
|
216
|
+
return { rooms, next: next.room };
|
|
181
217
|
}
|
|
182
|
-
export function
|
|
183
|
-
return
|
|
218
|
+
export function parseSiteParted(body) {
|
|
219
|
+
return parseRoomParts(body);
|
|
184
220
|
}
|
|
185
|
-
export function
|
|
186
|
-
|
|
221
|
+
export function emptyScope(room) {
|
|
222
|
+
return {
|
|
223
|
+
anchor: room.anchor,
|
|
224
|
+
position: room.position,
|
|
225
|
+
logEpoch: room.logEpoch,
|
|
226
|
+
files: [],
|
|
227
|
+
contents: [],
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function* partLines(text, mode) {
|
|
231
|
+
const files = [];
|
|
232
|
+
const contents = [];
|
|
233
|
+
const folders = [];
|
|
234
|
+
let start = 0;
|
|
235
|
+
while (start < text.length) {
|
|
236
|
+
const end = text.indexOf('\n', start);
|
|
237
|
+
if (end === -1)
|
|
238
|
+
return null;
|
|
239
|
+
let entry;
|
|
240
|
+
try {
|
|
241
|
+
entry = JSON.parse(text.slice(start, end));
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
start = end + 1;
|
|
247
|
+
if (folderLine(entry)) {
|
|
248
|
+
folders.push(entry.folder);
|
|
249
|
+
yield ROW_WEIGHT;
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
const file = parseFile(entry, mode);
|
|
253
|
+
if (file === null)
|
|
254
|
+
return null;
|
|
255
|
+
files.push(file);
|
|
256
|
+
const { content } = entry;
|
|
257
|
+
if (typeof content === 'string')
|
|
258
|
+
contents.push({ path: file.path, content });
|
|
259
|
+
else if (content !== undefined)
|
|
260
|
+
return null;
|
|
261
|
+
yield ROW_WEIGHT;
|
|
262
|
+
}
|
|
263
|
+
return { files, contents, folders };
|
|
264
|
+
}
|
|
265
|
+
function folderLine(entry) {
|
|
266
|
+
if (typeof entry !== 'object' || entry === null || !('folder' in entry))
|
|
267
|
+
return false;
|
|
268
|
+
return typeof entry.folder === 'string' && Object.keys(entry).length === 1;
|
|
269
|
+
}
|
|
270
|
+
export async function housePart(room, body, listed, mode) {
|
|
271
|
+
const payload = await checkedPayload(body, listed);
|
|
272
|
+
if (payload === null)
|
|
187
273
|
return null;
|
|
188
|
-
|
|
274
|
+
const text = await gunzipped(payload);
|
|
275
|
+
const read = text === null ? null : await stepped(partLines(text, mode));
|
|
276
|
+
return read === null ? { kind: 'transport-uncertainty' } : { ...emptyScope(room), ...read };
|
|
189
277
|
}
|
|
190
|
-
|
|
191
|
-
if (typeof
|
|
278
|
+
function folderChange(value) {
|
|
279
|
+
if (typeof value !== 'object' || value === null)
|
|
192
280
|
return null;
|
|
193
|
-
|
|
194
|
-
|
|
281
|
+
const { path, folder, removed, ...rest } = value;
|
|
282
|
+
return typeof path === 'string' &&
|
|
283
|
+
folder === true &&
|
|
284
|
+
(removed === undefined || removed === true) &&
|
|
285
|
+
Object.keys(rest).length === 0
|
|
286
|
+
? { path, removed: removed === true }
|
|
195
287
|
: null;
|
|
196
288
|
}
|
|
197
289
|
function parseChange(value, mode) {
|
|
@@ -250,7 +342,13 @@ export function parseEnumeration(body, mode) {
|
|
|
250
342
|
if (!Array.isArray(held.changes))
|
|
251
343
|
return null;
|
|
252
344
|
const changes = [];
|
|
345
|
+
const folders = [];
|
|
253
346
|
for (const change of held.changes) {
|
|
347
|
+
const folder = folderChange(change);
|
|
348
|
+
if (folder !== null) {
|
|
349
|
+
folders.push(folder);
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
254
352
|
const mapped = parseChange(change, mode);
|
|
255
353
|
if (mapped === null)
|
|
256
354
|
return null;
|
|
@@ -263,6 +361,7 @@ export function parseEnumeration(body, mode) {
|
|
|
263
361
|
authority: held.authority,
|
|
264
362
|
...at,
|
|
265
363
|
changes,
|
|
364
|
+
...(folders.length === 0 ? {} : { folders }),
|
|
266
365
|
...(next === undefined ? {} : { next }),
|
|
267
366
|
});
|
|
268
367
|
}
|
|
@@ -286,6 +385,7 @@ function advances(asked, next) {
|
|
|
286
385
|
}
|
|
287
386
|
export async function wholeView(first, more) {
|
|
288
387
|
const changes = new Map(first.changes.map((change) => [change.path, change]));
|
|
388
|
+
const folders = new Map((first.folders ?? []).map((folder) => [folder.path, folder]));
|
|
289
389
|
let view = first;
|
|
290
390
|
while (view.next !== undefined) {
|
|
291
391
|
const asked = view.next;
|
|
@@ -301,6 +401,10 @@ export async function wholeView(first, more) {
|
|
|
301
401
|
changes.delete(change.path);
|
|
302
402
|
changes.set(change.path, change);
|
|
303
403
|
}
|
|
404
|
+
for (const folder of page.folders ?? []) {
|
|
405
|
+
folders.delete(folder.path);
|
|
406
|
+
folders.set(folder.path, folder);
|
|
407
|
+
}
|
|
304
408
|
view = page;
|
|
305
409
|
}
|
|
306
410
|
return {
|
|
@@ -308,14 +412,24 @@ export async function wholeView(first, more) {
|
|
|
308
412
|
position: view.position,
|
|
309
413
|
logEpoch: first.logEpoch,
|
|
310
414
|
changes: [...changes.values()],
|
|
415
|
+
...(folders.size === 0 ? {} : { folders: [...folders.values()] }),
|
|
311
416
|
};
|
|
312
417
|
}
|
|
313
|
-
export function advancedScope(scope, view) {
|
|
314
|
-
const files = new Map(
|
|
315
|
-
const
|
|
418
|
+
export function* advancedScope(scope, view) {
|
|
419
|
+
const files = new Map();
|
|
420
|
+
for (const file of scope.files) {
|
|
421
|
+
files.set(file.path, file);
|
|
422
|
+
yield ROW_WEIGHT;
|
|
423
|
+
}
|
|
424
|
+
const contents = new Map();
|
|
425
|
+
for (const entry of scope.contents) {
|
|
426
|
+
contents.set(entry.path, entry.content);
|
|
427
|
+
yield ROW_WEIGHT;
|
|
428
|
+
}
|
|
316
429
|
for (const change of view.changes) {
|
|
317
430
|
files.delete(change.path);
|
|
318
431
|
contents.delete(change.path);
|
|
432
|
+
yield ROW_WEIGHT;
|
|
319
433
|
if ('removed' in change)
|
|
320
434
|
continue;
|
|
321
435
|
files.set(change.path, {
|
|
@@ -328,43 +442,51 @@ export function advancedScope(scope, view) {
|
|
|
328
442
|
if ('content' in change)
|
|
329
443
|
contents.set(change.path, change.content);
|
|
330
444
|
}
|
|
445
|
+
const kept = [];
|
|
446
|
+
for (const [path, content] of contents) {
|
|
447
|
+
kept.push({ path, content });
|
|
448
|
+
yield ROW_WEIGHT;
|
|
449
|
+
}
|
|
450
|
+
const folders = new Set(scope.folders);
|
|
451
|
+
for (const folder of view.folders ?? []) {
|
|
452
|
+
if (folder.removed)
|
|
453
|
+
folders.delete(folder.path);
|
|
454
|
+
else
|
|
455
|
+
folders.add(folder.path);
|
|
456
|
+
yield ROW_WEIGHT;
|
|
457
|
+
}
|
|
331
458
|
return {
|
|
332
459
|
...scope,
|
|
333
460
|
position: view.position,
|
|
334
461
|
logEpoch: view.logEpoch,
|
|
335
462
|
files: [...files.values()],
|
|
336
|
-
contents:
|
|
463
|
+
contents: kept,
|
|
464
|
+
...(folders.size === 0 ? {} : { folders: [...folders] }),
|
|
337
465
|
};
|
|
338
466
|
}
|
|
339
|
-
export function
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
const
|
|
346
|
-
const changes = {};
|
|
347
|
-
const binaryFiles = {};
|
|
467
|
+
export function* bootstrapping(scope) {
|
|
468
|
+
const contents = new Map();
|
|
469
|
+
for (const entry of scope.contents) {
|
|
470
|
+
contents.set(entry.path, entry.content);
|
|
471
|
+
yield ROW_WEIGHT;
|
|
472
|
+
}
|
|
473
|
+
const answer = answering();
|
|
348
474
|
for (const file of scope.files) {
|
|
349
|
-
|
|
350
|
-
revisions[file.path] = file.revision;
|
|
475
|
+
yield ROW_WEIGHT;
|
|
351
476
|
if (file.head !== undefined)
|
|
352
|
-
changes
|
|
477
|
+
answer.changes.set(file.path, file.head);
|
|
353
478
|
const content = contents.get(file.path);
|
|
354
479
|
if (file.binary !== undefined)
|
|
355
|
-
binaryFiles
|
|
480
|
+
answer.binaryFiles.set(file.path, file.binary);
|
|
356
481
|
else if (content !== undefined)
|
|
357
|
-
documents
|
|
482
|
+
answer.documents.set(file.path, content);
|
|
483
|
+
if (file.revision !== undefined)
|
|
484
|
+
revised(answer, file.path, file.revision);
|
|
358
485
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
revisions,
|
|
364
|
-
...identities(revisions),
|
|
365
|
-
changes,
|
|
366
|
-
binaryFiles,
|
|
367
|
-
};
|
|
486
|
+
for (const folder of scope.folders ?? [])
|
|
487
|
+
folded(answer, folder, false);
|
|
488
|
+
const { removals: _removals, folderRemovals: _folderRemovals, ...page } = yield* answered(answer);
|
|
489
|
+
return { kind: 'bootstrap', roomVersion: roomVersion(scope), ...page };
|
|
368
490
|
}
|
|
369
491
|
export function schemaOf(scope, schema) {
|
|
370
492
|
const file = scope.files.find((entry) => entry.path === schema);
|
|
@@ -378,36 +500,31 @@ export function schemaOf(scope, schema) {
|
|
|
378
500
|
export function viewOf(enumeration, tracked) {
|
|
379
501
|
return enumeration.authorities.find((entry) => entry.authority === tracked.authority);
|
|
380
502
|
}
|
|
381
|
-
|
|
503
|
+
function* refreshing(view, fromRoomVersion) {
|
|
382
504
|
if (roomVersion(view) === fromRoomVersion)
|
|
383
505
|
return { kind: 'still-current' };
|
|
384
|
-
const
|
|
385
|
-
const revisions = {};
|
|
386
|
-
const changes = {};
|
|
387
|
-
const binaryFiles = {};
|
|
388
|
-
const removals = [];
|
|
506
|
+
const answer = answering();
|
|
389
507
|
for (const change of view.changes) {
|
|
508
|
+
yield ROW_WEIGHT;
|
|
390
509
|
if ('removed' in change) {
|
|
391
|
-
removals.
|
|
510
|
+
answer.removals.add(change.path);
|
|
392
511
|
continue;
|
|
393
512
|
}
|
|
394
513
|
if ('content' in change)
|
|
395
|
-
documents
|
|
514
|
+
answer.documents.set(change.path, change.content);
|
|
396
515
|
else
|
|
397
|
-
binaryFiles
|
|
398
|
-
if (change.revision !== undefined)
|
|
399
|
-
revisions[change.path] = change.revision;
|
|
516
|
+
answer.binaryFiles.set(change.path, change.binary);
|
|
400
517
|
if (change.head !== undefined)
|
|
401
|
-
changes
|
|
518
|
+
answer.changes.set(change.path, change.head);
|
|
519
|
+
if (change.revision !== undefined)
|
|
520
|
+
revised(answer, change.path, change.revision);
|
|
402
521
|
}
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
removals: removals.sort(),
|
|
412
|
-
};
|
|
522
|
+
for (const folder of view.folders ?? []) {
|
|
523
|
+
yield ROW_WEIGHT;
|
|
524
|
+
folded(answer, folder.path, folder.removed);
|
|
525
|
+
}
|
|
526
|
+
return { kind: 'net-advancement', roomVersion: roomVersion(view), ...(yield* answered(answer)) };
|
|
527
|
+
}
|
|
528
|
+
export async function refreshFrom(view, fromRoomVersion) {
|
|
529
|
+
return stepped(refreshing(view, fromRoomVersion));
|
|
413
530
|
}
|
package/dist/referrer.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import type { ReferrerScope } from '@agentshouse/mdruntime';
|
|
1
2
|
import type { TrackedAuthority } from './discovery.js';
|
|
2
3
|
export type HouseReferrer = {
|
|
3
4
|
locator: string;
|
|
4
5
|
referrer: Readonly<Record<string, string>>;
|
|
5
6
|
};
|
|
6
7
|
export declare function houseReferrer(referrer: unknown, tracked: ReadonlyMap<string, TrackedAuthority>): HouseReferrer | null;
|
|
8
|
+
export declare function houseReferrerScope(referrer: unknown, tracked: ReadonlyMap<string, TrackedAuthority>): ReferrerScope | null;
|
|
7
9
|
//# sourceMappingURL=referrer.d.ts.map
|
package/dist/referrer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referrer.d.ts","sourceRoot":"","sources":["../src/referrer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAgB5F,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC7C,aAAa,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"referrer.d.ts","sourceRoot":"","sources":["../src/referrer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAgB5F,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC7C,aAAa,GAAG,IAAI,CAoBtB;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC7C,aAAa,GAAG,IAAI,CAOtB"}
|
package/dist/referrer.js
CHANGED
|
@@ -29,7 +29,13 @@ export function houseReferrer(referrer, tracked) {
|
|
|
29
29
|
referrer: { room_ref: roomRef, record: held.record },
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
|
-
if (named(held, 'message'))
|
|
33
|
-
return { locator: '', referrer: { message: held.message } };
|
|
34
32
|
return null;
|
|
35
33
|
}
|
|
34
|
+
export function houseReferrerScope(referrer, tracked) {
|
|
35
|
+
const held = fields(referrer);
|
|
36
|
+
if (held !== null && named(held, 'room', 'path')) {
|
|
37
|
+
return { locator: held.room, path: held.path };
|
|
38
|
+
}
|
|
39
|
+
const found = houseReferrer(referrer, tracked);
|
|
40
|
+
return found === null ? null : { locator: found.locator };
|
|
41
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot'];
|
|
2
|
+
export type InboxChannelKind = (typeof INBOX_CHANNEL_KINDS)[number];
|
|
3
|
+
export declare const INBOX_CHAT_TYPE = "inbox-chat";
|
|
4
|
+
export declare const INBOX_MESSAGE_TYPE = "inbox-message";
|
|
5
|
+
export declare const HOUSE_ROOM_TYPES: string;
|
|
6
|
+
//# sourceMappingURL=room-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-types.d.ts","sourceRoot":"","sources":["../src/room-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,YAAI,cAAc,CAAU,CAAC;AAE7D,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAalD,eAAO,MAAM,gBAAgB,QAsDjB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export const INBOX_CHANNEL_KINDS = ['telegram-bot'];
|
|
2
|
+
export const INBOX_CHAT_TYPE = 'inbox-chat';
|
|
3
|
+
export const INBOX_MESSAGE_TYPE = 'inbox-message';
|
|
4
|
+
const IDENTITY = "{ type: string, pattern: '^\\S+$' }";
|
|
5
|
+
const AGENT = [' agent: { type: string, format: uuid }', ' name: { type: string }'];
|
|
6
|
+
const ASSIGNEE = [
|
|
7
|
+
' type: object',
|
|
8
|
+
' properties:',
|
|
9
|
+
' user: { type: string, format: uuid }',
|
|
10
|
+
...AGENT,
|
|
11
|
+
];
|
|
12
|
+
export const HOUSE_ROOM_TYPES = [
|
|
13
|
+
`${INBOX_CHAT_TYPE}:`,
|
|
14
|
+
' properties:',
|
|
15
|
+
' inbox: { type: string, format: uuid }',
|
|
16
|
+
` channel: { enum: [${INBOX_CHANNEL_KINDS.join(', ')}] }`,
|
|
17
|
+
` chat: ${IDENTITY}`,
|
|
18
|
+
' customer:',
|
|
19
|
+
' type: object',
|
|
20
|
+
' properties:',
|
|
21
|
+
' name: { type: string }',
|
|
22
|
+
` username: ${IDENTITY}`,
|
|
23
|
+
` phone: ${IDENTITY}`,
|
|
24
|
+
' assignee:',
|
|
25
|
+
...ASSIGNEE,
|
|
26
|
+
' return_to:',
|
|
27
|
+
' type: object',
|
|
28
|
+
' properties:',
|
|
29
|
+
...AGENT,
|
|
30
|
+
' conversation: { type: string, format: uuid }',
|
|
31
|
+
' required: [inbox, channel, chat, customer]',
|
|
32
|
+
`${INBOX_MESSAGE_TYPE}:`,
|
|
33
|
+
' properties:',
|
|
34
|
+
' direction: { enum: [in, out] }',
|
|
35
|
+
' sender:',
|
|
36
|
+
' type: object',
|
|
37
|
+
' properties:',
|
|
38
|
+
' name: { type: string }',
|
|
39
|
+
` username: ${IDENTITY}`,
|
|
40
|
+
' sent_at: { type: string, format: date-time }',
|
|
41
|
+
` channel_message: ${IDENTITY}`,
|
|
42
|
+
' state: { enum: [sending, sent, failed] }',
|
|
43
|
+
' reason: { type: string }',
|
|
44
|
+
' reactions:',
|
|
45
|
+
' type: array',
|
|
46
|
+
' items:',
|
|
47
|
+
' type: object',
|
|
48
|
+
' properties:',
|
|
49
|
+
' reaction: { type: string, minLength: 1 }',
|
|
50
|
+
' sender:',
|
|
51
|
+
' type: object',
|
|
52
|
+
' properties:',
|
|
53
|
+
` id: ${IDENTITY}`,
|
|
54
|
+
' name: { type: string }',
|
|
55
|
+
` username: ${IDENTITY}`,
|
|
56
|
+
' count: { type: integer, minimum: 1 }',
|
|
57
|
+
' required: [reaction]',
|
|
58
|
+
` post: ${IDENTITY}`,
|
|
59
|
+
' assignee:',
|
|
60
|
+
...ASSIGNEE,
|
|
61
|
+
' sent_outside: { const: true }',
|
|
62
|
+
' required: [direction]',
|
|
63
|
+
' if: { properties: { direction: { const: in } } }',
|
|
64
|
+
' then: { required: [sent_at] }',
|
|
65
|
+
'',
|
|
66
|
+
].join('\n');
|
package/dist/site.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAUR,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAUR,MAAM,wBAAwB,CAAC;AA8BhC,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAuCxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAoQ1F"}
|