@agentshouse/mdruntime-adapter 0.1.0-cc1bdabaf4e28 → 0.1.0-cc34762b70bb0
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/dist/actions.d.ts +4 -59
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +7 -289
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +134 -327
- package/dist/discovery.d.ts +19 -6
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +63 -30
- package/dist/history.d.ts +12 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +92 -0
- package/dist/house-model.d.ts +718 -1
- package/dist/house-model.d.ts.map +1 -1
- package/dist/house-model.js +393 -442
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/model.d.ts +2 -3
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -17
- package/dist/part.d.ts +11 -12
- package/dist/part.d.ts.map +1 -1
- package/dist/part.js +63 -55
- package/dist/read.d.ts +10 -58
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +37 -220
- package/dist/refusal.d.ts +0 -3
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +0 -5
- package/dist/room-stream.d.ts +19 -0
- package/dist/room-stream.d.ts.map +1 -0
- package/dist/room-stream.js +57 -0
- package/dist/room-types.d.ts +3 -3
- package/dist/room-types.d.ts.map +1 -1
- package/dist/room-types.js +8 -7
- package/dist/search.d.ts +5 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +47 -0
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +75 -158
- package/dist/stream.d.ts +13 -14
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +163 -425
- package/dist/transport.d.ts +48 -35
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +54 -11
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +2 -2
- package/dist/write.d.ts +6 -1
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +17 -24
- package/package.json +2 -2
- package/dist/gather.d.ts +0 -4
- package/dist/gather.d.ts.map +0 -1
- package/dist/gather.js +0 -35
package/dist/read.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { paced, patching, ROW_WEIGHT,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { paced, patching, ROW_WEIGHT, } from '@agentshouse/mdruntime';
|
|
2
|
+
import { gunzipped } from './part.js';
|
|
3
|
+
import { readPosition, roomVersion } from './version.js';
|
|
4
4
|
const REVISION_FILE = /^fr_([0-9a-z]+)\.[0-9a-z]+\.[0-9a-z]$/u;
|
|
5
5
|
function fileOf(revision) {
|
|
6
6
|
return REVISION_FILE.exec(revision)?.[1];
|
|
@@ -98,10 +98,10 @@ export function parseFileAddress(body) {
|
|
|
98
98
|
function changeAuthor(value) {
|
|
99
99
|
if (typeof value !== 'object' || value === null)
|
|
100
100
|
return null;
|
|
101
|
-
const { user, site, inbox, name } = value;
|
|
101
|
+
const { user, site, inbox, app, name } = value;
|
|
102
102
|
if (typeof name !== 'string')
|
|
103
103
|
return null;
|
|
104
|
-
const named = [user, site, inbox].filter((id) => id !== undefined);
|
|
104
|
+
const named = [user, site, inbox, app].filter((id) => id !== undefined);
|
|
105
105
|
if (named.length !== 1)
|
|
106
106
|
return null;
|
|
107
107
|
if (typeof user === 'string')
|
|
@@ -110,6 +110,8 @@ function changeAuthor(value) {
|
|
|
110
110
|
return { kind: 'site', id: site, name };
|
|
111
111
|
if (typeof inbox === 'string')
|
|
112
112
|
return { kind: 'inbox', id: inbox, name };
|
|
113
|
+
if (typeof app === 'string')
|
|
114
|
+
return { kind: 'app', id: app, name };
|
|
113
115
|
return null;
|
|
114
116
|
}
|
|
115
117
|
export function headChange(held) {
|
|
@@ -183,14 +185,12 @@ function parseModels(value, mode) {
|
|
|
183
185
|
}
|
|
184
186
|
return { files, contents };
|
|
185
187
|
}
|
|
186
|
-
function
|
|
188
|
+
function parseRoomHead(value, mode) {
|
|
187
189
|
if (typeof value !== 'object' || value === null)
|
|
188
190
|
return null;
|
|
189
191
|
const held = value;
|
|
190
192
|
if (typeof held.manifest !== 'object' || held.manifest === null)
|
|
191
193
|
return null;
|
|
192
|
-
if (!Array.isArray(held.parts))
|
|
193
|
-
return null;
|
|
194
194
|
const models = parseModels(held.models, mode);
|
|
195
195
|
if (models === null)
|
|
196
196
|
return null;
|
|
@@ -202,44 +202,22 @@ function parseRoomParts(value, mode) {
|
|
|
202
202
|
return null;
|
|
203
203
|
if (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)
|
|
204
204
|
return null;
|
|
205
|
-
|
|
206
|
-
for (const entry of held.parts) {
|
|
207
|
-
const part = parsePart(entry);
|
|
208
|
-
if (part === null)
|
|
209
|
-
return null;
|
|
210
|
-
parts.push(part);
|
|
211
|
-
}
|
|
212
|
-
return { anchor: manifest.anchor, ...at, models, parts };
|
|
205
|
+
return { anchor: manifest.anchor, ...at, models };
|
|
213
206
|
}
|
|
214
|
-
export function
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
if (room === null)
|
|
223
|
-
return null;
|
|
224
|
-
rooms.push(room);
|
|
207
|
+
export async function roomHead(payload, mode) {
|
|
208
|
+
let text = '';
|
|
209
|
+
try {
|
|
210
|
+
for await (const chunk of gunzipped(payload))
|
|
211
|
+
text += chunk;
|
|
212
|
+
return text.endsWith('\n') && text.indexOf('\n') === text.length - 1
|
|
213
|
+
? parseRoomHead(JSON.parse(text), mode)
|
|
214
|
+
: null;
|
|
225
215
|
}
|
|
226
|
-
|
|
227
|
-
return { rooms };
|
|
228
|
-
const next = body.next;
|
|
229
|
-
if (typeof next !== 'object' || next === null || typeof next.room !== 'string')
|
|
216
|
+
catch {
|
|
230
217
|
return null;
|
|
231
|
-
|
|
232
|
-
}
|
|
233
|
-
export function parseSiteParted(body) {
|
|
234
|
-
return parseRoomParts(body, 'site');
|
|
235
|
-
}
|
|
236
|
-
export function partInventory(room) {
|
|
237
|
-
return {
|
|
238
|
-
parts: room.parts.length,
|
|
239
|
-
bytes: room.parts.reduce((sum, part) => sum + part.bytes, 0),
|
|
240
|
-
};
|
|
218
|
+
}
|
|
241
219
|
}
|
|
242
|
-
export function manifested(room,
|
|
220
|
+
export function manifested(room, pageToken, models) {
|
|
243
221
|
return {
|
|
244
222
|
kind: 'bootstrap',
|
|
245
223
|
roomVersion: roomVersion(room),
|
|
@@ -247,7 +225,6 @@ export function manifested(room, inventory, pageToken, models) {
|
|
|
247
225
|
revisions: {},
|
|
248
226
|
changes: {},
|
|
249
227
|
binaryFiles: {},
|
|
250
|
-
inventory,
|
|
251
228
|
pageToken,
|
|
252
229
|
...(models === undefined ? {} : { models }),
|
|
253
230
|
};
|
|
@@ -265,6 +242,8 @@ export function emptyScope(room) {
|
|
|
265
242
|
};
|
|
266
243
|
}
|
|
267
244
|
function partLine(line, mode, read) {
|
|
245
|
+
if (read.ended)
|
|
246
|
+
return false;
|
|
268
247
|
let entry;
|
|
269
248
|
try {
|
|
270
249
|
entry = JSON.parse(line);
|
|
@@ -272,6 +251,10 @@ function partLine(line, mode, read) {
|
|
|
272
251
|
catch {
|
|
273
252
|
return false;
|
|
274
253
|
}
|
|
254
|
+
if (endLine(entry)) {
|
|
255
|
+
read.ended = true;
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
275
258
|
if (folderLine(entry)) {
|
|
276
259
|
read.folders.push(entry.folder);
|
|
277
260
|
return true;
|
|
@@ -288,7 +271,7 @@ function partLine(line, mode, read) {
|
|
|
288
271
|
return true;
|
|
289
272
|
}
|
|
290
273
|
async function partRead(chunks, mode) {
|
|
291
|
-
const read = { files: [], contents: [], folders: [] };
|
|
274
|
+
const read = { files: [], contents: [], folders: [], ended: false };
|
|
292
275
|
const pace = paced();
|
|
293
276
|
const unfinished = [];
|
|
294
277
|
for (let chunk = await chunks.read(); chunk.done !== true; chunk = await chunks.read()) {
|
|
@@ -311,157 +294,22 @@ async function partRead(chunks, mode) {
|
|
|
311
294
|
}
|
|
312
295
|
return unfinished.length === 0 ? read : null;
|
|
313
296
|
}
|
|
297
|
+
function endLine(entry) {
|
|
298
|
+
if (typeof entry !== 'object' || entry === null || !('end' in entry))
|
|
299
|
+
return false;
|
|
300
|
+
return entry.end === true && Object.keys(entry).length === 1;
|
|
301
|
+
}
|
|
314
302
|
function folderLine(entry) {
|
|
315
303
|
if (typeof entry !== 'object' || entry === null || !('folder' in entry))
|
|
316
304
|
return false;
|
|
317
305
|
return typeof entry.folder === 'string' && Object.keys(entry).length === 1;
|
|
318
306
|
}
|
|
319
|
-
export async function housePart(room,
|
|
320
|
-
const payload = await checkedPayload(frame, listed);
|
|
321
|
-
if (payload === null)
|
|
322
|
-
return null;
|
|
307
|
+
export async function housePart(room, payload, mode) {
|
|
323
308
|
const read = await partRead(gunzipped(payload).getReader(), mode).catch(() => null);
|
|
324
|
-
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
return null;
|
|
329
|
-
const { path, folder, removed, ...rest } = value;
|
|
330
|
-
return typeof path === 'string' &&
|
|
331
|
-
folder === true &&
|
|
332
|
-
(removed === undefined || removed === true) &&
|
|
333
|
-
Object.keys(rest).length === 0
|
|
334
|
-
? { path, removed: removed === true }
|
|
335
|
-
: null;
|
|
336
|
-
}
|
|
337
|
-
function parseChange(value, mode) {
|
|
338
|
-
if (typeof value !== 'object' || value === null)
|
|
339
|
-
return null;
|
|
340
|
-
const held = value;
|
|
341
|
-
if (typeof held.path !== 'string')
|
|
342
|
-
return null;
|
|
343
|
-
if (held.removed === true)
|
|
344
|
-
return { path: held.path, removed: true };
|
|
345
|
-
const head = headChange(held);
|
|
346
|
-
const binary = binaryFileOf(held);
|
|
347
|
-
if (head === null || binary === null)
|
|
348
|
-
return null;
|
|
349
|
-
if (binary !== undefined) {
|
|
350
|
-
if (mode === 'credential' && typeof held.revision !== 'string')
|
|
351
|
-
return null;
|
|
352
|
-
const revision = typeof held.revision === 'string' ? held.revision : binary.sha256;
|
|
353
|
-
return { path: held.path, binary, revision, version: revision, ...headed(head) };
|
|
354
|
-
}
|
|
355
|
-
if (mode === 'site') {
|
|
356
|
-
if (typeof held.content !== 'string' || typeof held.sha256 !== 'string')
|
|
357
|
-
return null;
|
|
358
|
-
return {
|
|
359
|
-
path: held.path,
|
|
360
|
-
content: held.content,
|
|
361
|
-
revision: undefined,
|
|
362
|
-
version: held.sha256,
|
|
363
|
-
...headed(head),
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
if (typeof held.content === 'string' && typeof held.revision === 'string') {
|
|
367
|
-
return {
|
|
368
|
-
path: held.path,
|
|
369
|
-
content: held.content,
|
|
370
|
-
revision: held.revision,
|
|
371
|
-
version: held.revision,
|
|
372
|
-
...headed(head),
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
return null;
|
|
376
|
-
}
|
|
377
|
-
export function parseEnumeration(body, mode) {
|
|
378
|
-
if (typeof body !== 'object' || body === null)
|
|
379
|
-
return null;
|
|
380
|
-
if (!('authorities' in body) || !Array.isArray(body.authorities))
|
|
381
|
-
return null;
|
|
382
|
-
const authorities = [];
|
|
383
|
-
for (const entry of body.authorities) {
|
|
384
|
-
if (typeof entry !== 'object' || entry === null)
|
|
385
|
-
return null;
|
|
386
|
-
const held = entry;
|
|
387
|
-
const at = readPosition(held);
|
|
388
|
-
if (typeof held.authority !== 'string' || at === null)
|
|
389
|
-
return null;
|
|
390
|
-
if (!Array.isArray(held.changes))
|
|
391
|
-
return null;
|
|
392
|
-
const changes = [];
|
|
393
|
-
const folders = [];
|
|
394
|
-
for (const change of held.changes) {
|
|
395
|
-
const folder = folderChange(change);
|
|
396
|
-
if (folder !== null) {
|
|
397
|
-
folders.push(folder);
|
|
398
|
-
continue;
|
|
399
|
-
}
|
|
400
|
-
const mapped = parseChange(change, mode);
|
|
401
|
-
if (mapped === null)
|
|
402
|
-
return null;
|
|
403
|
-
changes.push(mapped);
|
|
404
|
-
}
|
|
405
|
-
const next = held.next === undefined ? undefined : readPage(held.next);
|
|
406
|
-
if (next === null)
|
|
407
|
-
return null;
|
|
408
|
-
authorities.push({
|
|
409
|
-
authority: held.authority,
|
|
410
|
-
...at,
|
|
411
|
-
changes,
|
|
412
|
-
...(folders.length === 0 ? {} : { folders }),
|
|
413
|
-
...(next === undefined ? {} : { next }),
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
return { authorities };
|
|
417
|
-
}
|
|
418
|
-
function readPage(held) {
|
|
419
|
-
if (typeof held !== 'object' || held === null)
|
|
420
|
-
return null;
|
|
421
|
-
const { after, through, read } = held;
|
|
422
|
-
if (typeof after !== 'string' || !DECIMAL.test(after))
|
|
423
|
-
return null;
|
|
424
|
-
if (typeof through !== 'string' || !DECIMAL.test(through))
|
|
425
|
-
return null;
|
|
426
|
-
if (typeof read !== 'number' || !Number.isSafeInteger(read) || read < 0)
|
|
427
|
-
return null;
|
|
428
|
-
return { after, through, read };
|
|
429
|
-
}
|
|
430
|
-
function advances(asked, next) {
|
|
431
|
-
const moved = BigInt(next.through) - BigInt(asked.through);
|
|
432
|
-
return moved > 0n || (moved === 0n && next.after === asked.after && next.read > asked.read);
|
|
433
|
-
}
|
|
434
|
-
export async function wholeView(first, more) {
|
|
435
|
-
const changes = new Map(first.changes.map((change) => [change.path, change]));
|
|
436
|
-
const folders = new Map((first.folders ?? []).map((folder) => [folder.path, folder]));
|
|
437
|
-
let view = first;
|
|
438
|
-
while (view.next !== undefined) {
|
|
439
|
-
const asked = view.next;
|
|
440
|
-
const page = await more(asked);
|
|
441
|
-
if ('kind' in page)
|
|
442
|
-
return page;
|
|
443
|
-
if (page.position !== asked.through ||
|
|
444
|
-
page.logEpoch !== first.logEpoch ||
|
|
445
|
-
(page.next !== undefined && !advances(asked, page.next))) {
|
|
446
|
-
return { kind: 'transport-uncertainty' };
|
|
447
|
-
}
|
|
448
|
-
for (const change of page.changes) {
|
|
449
|
-
changes.delete(change.path);
|
|
450
|
-
changes.set(change.path, change);
|
|
451
|
-
}
|
|
452
|
-
for (const folder of page.folders ?? []) {
|
|
453
|
-
folders.delete(folder.path);
|
|
454
|
-
folders.set(folder.path, folder);
|
|
455
|
-
}
|
|
456
|
-
view = page;
|
|
457
|
-
}
|
|
458
|
-
return {
|
|
459
|
-
authority: first.authority,
|
|
460
|
-
position: view.position,
|
|
461
|
-
logEpoch: first.logEpoch,
|
|
462
|
-
changes: [...changes.values()],
|
|
463
|
-
...(folders.size === 0 ? {} : { folders: [...folders.values()] }),
|
|
464
|
-
};
|
|
309
|
+
if (read === null)
|
|
310
|
+
return { kind: 'transport-uncertainty' };
|
|
311
|
+
const { ended, ...scope } = read;
|
|
312
|
+
return { scope: { ...emptyScope(room), ...scope }, ended };
|
|
465
313
|
}
|
|
466
314
|
export function* bootstrapping(scope) {
|
|
467
315
|
const contents = new Map();
|
|
@@ -496,34 +344,3 @@ export function schemaOf(scope, schema) {
|
|
|
496
344
|
? null
|
|
497
345
|
: { schema: content.content, version: file.version, revision: file.revision ?? null };
|
|
498
346
|
}
|
|
499
|
-
export function viewOf(enumeration, tracked) {
|
|
500
|
-
return enumeration.authorities.find((entry) => entry.authority === tracked.authority);
|
|
501
|
-
}
|
|
502
|
-
function* refreshing(view, fromRoomVersion) {
|
|
503
|
-
if (roomVersion(view) === fromRoomVersion)
|
|
504
|
-
return { kind: 'still-current' };
|
|
505
|
-
const answer = answering();
|
|
506
|
-
for (const change of view.changes) {
|
|
507
|
-
yield ROW_WEIGHT;
|
|
508
|
-
if ('removed' in change) {
|
|
509
|
-
answer.removals.add(change.path);
|
|
510
|
-
continue;
|
|
511
|
-
}
|
|
512
|
-
if ('content' in change)
|
|
513
|
-
answer.documents.set(change.path, change.content);
|
|
514
|
-
else
|
|
515
|
-
answer.binaryFiles.set(change.path, change.binary);
|
|
516
|
-
if (change.head !== undefined)
|
|
517
|
-
answer.changes.set(change.path, change.head);
|
|
518
|
-
if (change.revision !== undefined)
|
|
519
|
-
revised(answer, change.path, change.revision);
|
|
520
|
-
}
|
|
521
|
-
for (const folder of view.folders ?? []) {
|
|
522
|
-
yield ROW_WEIGHT;
|
|
523
|
-
folded(answer, folder.path, folder.removed);
|
|
524
|
-
}
|
|
525
|
-
return { kind: 'net-advancement', roomVersion: roomVersion(view), ...(yield* answered(answer)) };
|
|
526
|
-
}
|
|
527
|
-
export async function refreshFrom(view, fromRoomVersion) {
|
|
528
|
-
return stepped(refreshing(view, fromRoomVersion));
|
|
529
|
-
}
|
package/dist/refusal.d.ts
CHANGED
|
@@ -2,8 +2,5 @@ import type { AdapterFailure, DiscoverResult, ProviderRefusal, ScopedRefusal } f
|
|
|
2
2
|
export declare function doorRefusal(body: unknown): ProviderRefusal | null;
|
|
3
3
|
export declare function scopedRefusal(locator: string, scope: ScopedRefusal['scope'], refusal: ProviderRefusal): ScopedRefusal;
|
|
4
4
|
export declare function classifyDoor(status: number, body: unknown, locator: string): AdapterFailure | null;
|
|
5
|
-
export declare function classifyRead(status: number, body: unknown, locator: string): AdapterFailure | {
|
|
6
|
-
kind: 'beyond-horizon';
|
|
7
|
-
} | null;
|
|
8
5
|
export declare function discoveryFailure(status: number, body: unknown): DiscoverResult | null;
|
|
9
6
|
//# sourceMappingURL=refusal.d.ts.map
|
package/dist/refusal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACd,MAAM,wBAAwB,CAAC;AAEhC,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAOjE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,eAAe,GACvB,aAAa,CAEf;AAqBD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG,IAAI,CAMvB;AAED,wBAAgB,
|
|
1
|
+
{"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACd,MAAM,wBAAwB,CAAC;AAEhC,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAOjE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,eAAe,GACvB,aAAa,CAEf;AAqBD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG,IAAI,CAMvB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAQrF"}
|
package/dist/refusal.js
CHANGED
|
@@ -39,11 +39,6 @@ export function classifyDoor(status, body, locator) {
|
|
|
39
39
|
return scopedRefusal(locator, failure.scope, failure.refusal);
|
|
40
40
|
return failure;
|
|
41
41
|
}
|
|
42
|
-
export function classifyRead(status, body, locator) {
|
|
43
|
-
if (doorRefusal(body)?.code === 'expired')
|
|
44
|
-
return { kind: 'beyond-horizon' };
|
|
45
|
-
return classifyDoor(status, body, locator);
|
|
46
|
-
}
|
|
47
42
|
export function discoveryFailure(status, body) {
|
|
48
43
|
const failure = doorFailure(status, body);
|
|
49
44
|
if (failure === null)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BootstrapResult, RoomModels } from '@agentshouse/mdruntime';
|
|
2
|
+
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
+
import { type HouseScope } from './read.js';
|
|
4
|
+
import type { HouseMode } from './transport.js';
|
|
5
|
+
export type StreamedPart = {
|
|
6
|
+
readonly scope: HouseScope;
|
|
7
|
+
readonly first: boolean;
|
|
8
|
+
readonly ended: boolean;
|
|
9
|
+
readonly models: RoomModels | undefined;
|
|
10
|
+
readonly pageToken: string | undefined;
|
|
11
|
+
readonly bytes: number;
|
|
12
|
+
};
|
|
13
|
+
export declare function roomStreams(mode: HouseMode): {
|
|
14
|
+
head: (entry: TrackedAuthority, room: ReadableStream<Uint8Array>, arriving: ((bytes: number) => void) | undefined, signal: AbortSignal | undefined) => Promise<BootstrapResult>;
|
|
15
|
+
part: (entry: TrackedAuthority, token: string) => Promise<StreamedPart | Exclude<BootstrapResult, {
|
|
16
|
+
kind: 'bootstrap';
|
|
17
|
+
}>>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=room-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-stream.d.ts","sourceRoot":"","sources":["../src/room-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAuD,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAYhD,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS;kBAKhC,gBAAgB,QACjB,cAAc,CAAC,UAAU,CAAC,YACtB,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,UACvC,WAAW,GAAG,SAAS,KAC9B,OAAO,CAAC,eAAe,CAAC;kBAelB,gBAAgB,SAChB,MAAM,KACZ,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;EAkC3E"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { manifestedModels, partModels } from './model.js';
|
|
2
|
+
import { roomFrames } from './part.js';
|
|
3
|
+
import { housePart, manifested, roomHead } from './read.js';
|
|
4
|
+
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
5
|
+
export function roomStreams(mode) {
|
|
6
|
+
const open = new Map();
|
|
7
|
+
let opened = 0;
|
|
8
|
+
async function head(entry, room, arriving, signal) {
|
|
9
|
+
const frames = roomFrames(room, arriving, signal);
|
|
10
|
+
const first = await frames();
|
|
11
|
+
if (first.kind !== 'frame')
|
|
12
|
+
return UNCERTAIN;
|
|
13
|
+
const held = await roomHead(first.payload, mode);
|
|
14
|
+
if (held === null || held.anchor !== entry.authority)
|
|
15
|
+
return UNCERTAIN;
|
|
16
|
+
const { models, seen } = await manifestedModels(held, entry);
|
|
17
|
+
opened += 1;
|
|
18
|
+
const id = String(opened);
|
|
19
|
+
open.set(id, { entry, head: held, frames, next: 1, seen });
|
|
20
|
+
signal?.addEventListener('abort', () => open.delete(id), { once: true });
|
|
21
|
+
return { ...manifested(held, `${id}:1`, models), bytes: first.bytes };
|
|
22
|
+
}
|
|
23
|
+
async function part(entry, token) {
|
|
24
|
+
const [id = '', at = ''] = token.split(':');
|
|
25
|
+
const room = open.get(id);
|
|
26
|
+
if (room === undefined || room.entry.locator !== entry.locator || String(room.next) !== at)
|
|
27
|
+
return UNCERTAIN;
|
|
28
|
+
const frame = await room.frames();
|
|
29
|
+
if (frame.kind !== 'frame') {
|
|
30
|
+
open.delete(id);
|
|
31
|
+
return UNCERTAIN;
|
|
32
|
+
}
|
|
33
|
+
const read = await housePart(room.head, frame.payload, mode);
|
|
34
|
+
if ('kind' in read) {
|
|
35
|
+
open.delete(id);
|
|
36
|
+
return read;
|
|
37
|
+
}
|
|
38
|
+
const { scope, ended } = read;
|
|
39
|
+
const first = room.next === 1;
|
|
40
|
+
room.next += 1;
|
|
41
|
+
room.seen = [
|
|
42
|
+
...room.seen,
|
|
43
|
+
...(scope.files.some((file) => file.path === entry.schema) ? [entry.schema] : []),
|
|
44
|
+
];
|
|
45
|
+
if (ended)
|
|
46
|
+
open.delete(id);
|
|
47
|
+
return {
|
|
48
|
+
scope,
|
|
49
|
+
first,
|
|
50
|
+
ended,
|
|
51
|
+
models: await partModels(scope, entry, new Set(room.seen), ended),
|
|
52
|
+
pageToken: ended ? undefined : `${id}:${room.next}`,
|
|
53
|
+
bytes: frame.bytes,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { head, part };
|
|
57
|
+
}
|
package/dist/room-types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot', 'whatsapp', 'messenger', 'instagram', 'viber', 'tiktok'];
|
|
1
|
+
export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot', 'telegram-business', 'whatsapp', 'messenger', 'instagram', 'viber', 'tiktok'];
|
|
2
2
|
export type InboxChannelKind = (typeof INBOX_CHANNEL_KINDS)[number];
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
3
|
+
export declare const CHAT_TYPE = "chat";
|
|
4
|
+
export declare const CHAT_MESSAGE_TYPE = "chat-message";
|
|
5
5
|
export declare const HOUSE_NAMEABLE_ROOM_TYPES: string[];
|
|
6
6
|
export declare const HOUSE_ROOM_TYPES: string;
|
|
7
7
|
//# sourceMappingURL=room-types.d.ts.map
|
package/dist/room-types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-types.d.ts","sourceRoot":"","sources":["../src/room-types.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,YAC9B,cAAc,EACd,UAAU,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,QAAQ,CACA,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"room-types.d.ts","sourceRoot":"","sources":["../src/room-types.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,YAC9B,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,QAAQ,CACA,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,eAAO,MAAM,yBAAyB,UAAiC,CAAC;AAyBxE,eAAO,MAAM,gBAAgB,QA6FjB,CAAC"}
|
package/dist/room-types.js
CHANGED
|
@@ -2,15 +2,16 @@ import { APP_REFERENCE_PATTERN } from './app-reference.js';
|
|
|
2
2
|
import { HOUSE_MODEL_TYPES } from './house-model.js';
|
|
3
3
|
export const INBOX_CHANNEL_KINDS = [
|
|
4
4
|
'telegram-bot',
|
|
5
|
+
'telegram-business',
|
|
5
6
|
'whatsapp',
|
|
6
7
|
'messenger',
|
|
7
8
|
'instagram',
|
|
8
9
|
'viber',
|
|
9
10
|
'tiktok',
|
|
10
11
|
];
|
|
11
|
-
export const
|
|
12
|
-
export const
|
|
13
|
-
export const HOUSE_NAMEABLE_ROOM_TYPES = [
|
|
12
|
+
export const CHAT_TYPE = 'chat';
|
|
13
|
+
export const CHAT_MESSAGE_TYPE = 'chat-message';
|
|
14
|
+
export const HOUSE_NAMEABLE_ROOM_TYPES = [CHAT_TYPE, CHAT_MESSAGE_TYPE];
|
|
14
15
|
const WAYFINDING_MAP_TYPE = 'wayfinding-map';
|
|
15
16
|
const WAYFINDING_TICKET_TYPE = 'wayfinding-ticket';
|
|
16
17
|
const WAYFINDING_MAP_SECTIONS = [
|
|
@@ -29,7 +30,7 @@ const ASSIGNEE = [
|
|
|
29
30
|
...AGENT,
|
|
30
31
|
];
|
|
31
32
|
export const HOUSE_ROOM_TYPES = [
|
|
32
|
-
`${
|
|
33
|
+
`${CHAT_TYPE}:`,
|
|
33
34
|
' properties:',
|
|
34
35
|
' inbox: { type: string, format: uuid }',
|
|
35
36
|
` channel: { enum: [${INBOX_CHANNEL_KINDS.join(', ')}] }`,
|
|
@@ -46,9 +47,8 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
46
47
|
' type: object',
|
|
47
48
|
' properties:',
|
|
48
49
|
...AGENT,
|
|
49
|
-
'
|
|
50
|
-
|
|
51
|
-
`${INBOX_MESSAGE_TYPE}:`,
|
|
50
|
+
' required: [chat, customer]',
|
|
51
|
+
`${CHAT_MESSAGE_TYPE}:`,
|
|
52
52
|
' properties:',
|
|
53
53
|
' direction: { enum: [in, out] }',
|
|
54
54
|
' sender:',
|
|
@@ -60,6 +60,7 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
60
60
|
` channel_message: ${IDENTITY}`,
|
|
61
61
|
' state: { enum: [sending, sent, failed] }',
|
|
62
62
|
' reason: { type: string }',
|
|
63
|
+
' labelled: { const: true }',
|
|
63
64
|
' reactions:',
|
|
64
65
|
' type: array',
|
|
65
66
|
' items:',
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SearchAnswer, SearchAsk } from '@agentshouse/mdruntime';
|
|
2
|
+
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
+
import { type HouseTransport } from './transport.js';
|
|
4
|
+
export declare function houseSearch(transport: Pick<HouseTransport, 'door'>, tracked: readonly TrackedAuthority[], request: SearchAsk): Promise<SearchAnswer>;
|
|
5
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAa,MAAM,wBAAwB,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAsBrE,wBAAsB,WAAW,CAC/B,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACvC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { doorRefusal } from './refusal.js';
|
|
2
|
+
import { houseDoorRoute } from './transport.js';
|
|
3
|
+
const ROOMS = '/rooms/';
|
|
4
|
+
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
5
|
+
function hitOf(file, locators) {
|
|
6
|
+
if (typeof file !== 'object' || file === null)
|
|
7
|
+
return null;
|
|
8
|
+
const { path, line, snippet } = file;
|
|
9
|
+
if (typeof path !== 'string' || !path.startsWith(ROOMS))
|
|
10
|
+
return null;
|
|
11
|
+
const slash = path.indexOf('/', ROOMS.length);
|
|
12
|
+
if (slash < 0)
|
|
13
|
+
return null;
|
|
14
|
+
const room = locators.get(path.slice(ROOMS.length, slash));
|
|
15
|
+
if (room === undefined)
|
|
16
|
+
return null;
|
|
17
|
+
return {
|
|
18
|
+
room,
|
|
19
|
+
path: path.slice(slash + 1),
|
|
20
|
+
...(typeof line === 'number' ? { line } : {}),
|
|
21
|
+
...(typeof snippet === 'string' ? { snippet } : {}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export async function houseSearch(transport, tracked, request) {
|
|
25
|
+
const named = request.rooms === null
|
|
26
|
+
? null
|
|
27
|
+
: tracked.filter((entry) => request.rooms.includes(entry.locator));
|
|
28
|
+
if (named !== null && named.length === 0)
|
|
29
|
+
return { kind: 'found', documents: [] };
|
|
30
|
+
const answer = await transport.door(houseDoorRoute('search'), {
|
|
31
|
+
query: request.text,
|
|
32
|
+
...(named === null ? {} : { paths: named.map((entry) => `${ROOMS}${entry.handle}`) }),
|
|
33
|
+
});
|
|
34
|
+
if (answer.status === 401)
|
|
35
|
+
return { kind: 'revoked-authorization' };
|
|
36
|
+
const refusal = doorRefusal(answer.body);
|
|
37
|
+
if (refusal !== null)
|
|
38
|
+
return { kind: 'rejected', ...refusal };
|
|
39
|
+
const files = answer.body?.files;
|
|
40
|
+
if (answer.status !== 200 || !Array.isArray(files))
|
|
41
|
+
return UNCERTAIN;
|
|
42
|
+
const locators = new Map(tracked.map((entry) => [entry.handle, entry.locator]));
|
|
43
|
+
return {
|
|
44
|
+
kind: 'found',
|
|
45
|
+
documents: files.flatMap((file) => hitOf(file, locators) ?? []),
|
|
46
|
+
};
|
|
47
|
+
}
|
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,
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAQR,MAAM,wBAAwB,CAAC;AAgBhC,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAuBxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAuK1F"}
|