@agentshouse/mdruntime-adapter 0.1.0-cfded86738bb2 → 0.1.0-cfe552b74bdf7
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/README.md +2 -2
- package/dist/actions.d.ts +3 -56
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +1 -287
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +158 -326
- package/dist/app-reference.d.ts +2 -0
- package/dist/app-reference.d.ts.map +1 -0
- package/dist/app-reference.js +2 -0
- package/dist/crockford.d.ts +4 -0
- package/dist/crockford.d.ts.map +1 -0
- package/dist/crockford.js +3 -0
- package/dist/discovery.d.ts +12 -12
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +44 -51
- package/dist/history.d.ts +12 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +91 -0
- package/dist/house-model.d.ts +892 -0
- package/dist/house-model.d.ts.map +1 -0
- package/dist/house-model.js +482 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/model.d.ts +5 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +10 -29
- 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 +19 -57
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +84 -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 +2 -1
- package/dist/room-types.d.ts.map +1 -1
- package/dist/room-types.js +62 -3
- 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 -157
- package/dist/stream.d.ts +13 -14
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +168 -426
- package/dist/transport.d.ts +48 -36
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +55 -11
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +26 -15
- package/dist/write.d.ts +6 -1
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +17 -19
- package/package.json +8 -4
- package/AGENTS.md +0 -317
- 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];
|
|
@@ -8,6 +8,7 @@ function fileOf(revision) {
|
|
|
8
8
|
export function answering() {
|
|
9
9
|
return {
|
|
10
10
|
documents: new Map(),
|
|
11
|
+
outlines: new Map(),
|
|
11
12
|
revisions: new Map(),
|
|
12
13
|
fileIds: new Map(),
|
|
13
14
|
changes: new Map(),
|
|
@@ -25,6 +26,7 @@ export function revised(answer, path, revision) {
|
|
|
25
26
|
}
|
|
26
27
|
export function forgotten(answer, path) {
|
|
27
28
|
answer.documents.delete(path);
|
|
29
|
+
answer.outlines.delete(path);
|
|
28
30
|
answer.revisions.delete(path);
|
|
29
31
|
answer.fileIds.delete(path);
|
|
30
32
|
answer.changes.delete(path);
|
|
@@ -53,6 +55,7 @@ export function* answered(answer) {
|
|
|
53
55
|
const removals = yield* pathsOf(answer.removals);
|
|
54
56
|
return {
|
|
55
57
|
documents: yield* patching({}, answer.documents),
|
|
58
|
+
...(answer.outlines.size === 0 ? {} : { outlines: yield* patching({}, answer.outlines) }),
|
|
56
59
|
revisions: yield* patching({}, answer.revisions),
|
|
57
60
|
...(answer.fileIds.size === 0 ? {} : { fileIds: yield* patching({}, answer.fileIds) }),
|
|
58
61
|
changes: yield* patching({}, answer.changes),
|
|
@@ -98,10 +101,10 @@ export function parseFileAddress(body) {
|
|
|
98
101
|
function changeAuthor(value) {
|
|
99
102
|
if (typeof value !== 'object' || value === null)
|
|
100
103
|
return null;
|
|
101
|
-
const { user, site, inbox, name } = value;
|
|
104
|
+
const { user, site, inbox, app, name } = value;
|
|
102
105
|
if (typeof name !== 'string')
|
|
103
106
|
return null;
|
|
104
|
-
const named = [user, site, inbox].filter((id) => id !== undefined);
|
|
107
|
+
const named = [user, site, inbox, app].filter((id) => id !== undefined);
|
|
105
108
|
if (named.length !== 1)
|
|
106
109
|
return null;
|
|
107
110
|
if (typeof user === 'string')
|
|
@@ -110,6 +113,8 @@ function changeAuthor(value) {
|
|
|
110
113
|
return { kind: 'site', id: site, name };
|
|
111
114
|
if (typeof inbox === 'string')
|
|
112
115
|
return { kind: 'inbox', id: inbox, name };
|
|
116
|
+
if (typeof app === 'string')
|
|
117
|
+
return { kind: 'app', id: app, name };
|
|
113
118
|
return null;
|
|
114
119
|
}
|
|
115
120
|
export function headChange(held) {
|
|
@@ -136,6 +141,24 @@ export function binaryFileOf(held) {
|
|
|
136
141
|
function binaried(binary) {
|
|
137
142
|
return binary === undefined ? {} : { binary };
|
|
138
143
|
}
|
|
144
|
+
export function outlineOf(value) {
|
|
145
|
+
if (value === undefined)
|
|
146
|
+
return undefined;
|
|
147
|
+
if (typeof value !== 'object' || value === null)
|
|
148
|
+
return null;
|
|
149
|
+
const { type, fields, links } = value;
|
|
150
|
+
if (type !== null && typeof type !== 'string')
|
|
151
|
+
return null;
|
|
152
|
+
if (fields !== null && (typeof fields !== 'object' || Array.isArray(fields)))
|
|
153
|
+
return null;
|
|
154
|
+
if (!Array.isArray(links) || links.some((link) => typeof link !== 'string'))
|
|
155
|
+
return null;
|
|
156
|
+
return {
|
|
157
|
+
type: type,
|
|
158
|
+
fields: fields,
|
|
159
|
+
links: links,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
139
162
|
function parseFile(value, mode) {
|
|
140
163
|
if (typeof value !== 'object' || value === null)
|
|
141
164
|
return null;
|
|
@@ -157,7 +180,8 @@ function parseFile(value, mode) {
|
|
|
157
180
|
...binaried(binary),
|
|
158
181
|
};
|
|
159
182
|
}
|
|
160
|
-
|
|
183
|
+
const outline = outlineOf(file.outline);
|
|
184
|
+
if (typeof file.revision !== 'string' || outline === null)
|
|
161
185
|
return null;
|
|
162
186
|
return {
|
|
163
187
|
path: file.path,
|
|
@@ -166,15 +190,32 @@ function parseFile(value, mode) {
|
|
|
166
190
|
...(typeof file.sha256 === 'string' ? { sha256: file.sha256 } : {}),
|
|
167
191
|
...headed(head),
|
|
168
192
|
...binaried(binary),
|
|
193
|
+
...(outline === undefined ? {} : { outline }),
|
|
169
194
|
};
|
|
170
195
|
}
|
|
171
|
-
function
|
|
196
|
+
function parseModels(value, mode) {
|
|
197
|
+
if (!Array.isArray(value))
|
|
198
|
+
return null;
|
|
199
|
+
const files = [];
|
|
200
|
+
const contents = [];
|
|
201
|
+
for (const entry of value) {
|
|
202
|
+
const file = parseFile(entry, mode);
|
|
203
|
+
const { content } = entry;
|
|
204
|
+
if (file === null || typeof content !== 'string')
|
|
205
|
+
return null;
|
|
206
|
+
files.push(file);
|
|
207
|
+
contents.push({ path: file.path, content });
|
|
208
|
+
}
|
|
209
|
+
return { files, contents };
|
|
210
|
+
}
|
|
211
|
+
function parseRoomHead(value, mode) {
|
|
172
212
|
if (typeof value !== 'object' || value === null)
|
|
173
213
|
return null;
|
|
174
214
|
const held = value;
|
|
175
215
|
if (typeof held.manifest !== 'object' || held.manifest === null)
|
|
176
216
|
return null;
|
|
177
|
-
|
|
217
|
+
const models = parseModels(held.models, mode);
|
|
218
|
+
if (models === null)
|
|
178
219
|
return null;
|
|
179
220
|
const manifest = held.manifest;
|
|
180
221
|
if (manifest.scope !== 'room')
|
|
@@ -184,44 +225,22 @@ function parseRoomParts(value) {
|
|
|
184
225
|
return null;
|
|
185
226
|
if (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)
|
|
186
227
|
return null;
|
|
187
|
-
|
|
188
|
-
for (const entry of held.parts) {
|
|
189
|
-
const part = parsePart(entry);
|
|
190
|
-
if (part === null)
|
|
191
|
-
return null;
|
|
192
|
-
parts.push(part);
|
|
193
|
-
}
|
|
194
|
-
return { anchor: manifest.anchor, ...at, parts };
|
|
228
|
+
return { anchor: manifest.anchor, ...at, models };
|
|
195
229
|
}
|
|
196
|
-
export function
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if (room === null)
|
|
205
|
-
return null;
|
|
206
|
-
rooms.push(room);
|
|
230
|
+
export async function roomHead(payload, mode) {
|
|
231
|
+
let text = '';
|
|
232
|
+
try {
|
|
233
|
+
for await (const chunk of gunzipped(payload))
|
|
234
|
+
text += chunk;
|
|
235
|
+
return text.endsWith('\n') && text.indexOf('\n') === text.length - 1
|
|
236
|
+
? parseRoomHead(JSON.parse(text), mode)
|
|
237
|
+
: null;
|
|
207
238
|
}
|
|
208
|
-
|
|
209
|
-
return { rooms };
|
|
210
|
-
const next = body.next;
|
|
211
|
-
if (typeof next !== 'object' || next === null || typeof next.room !== 'string')
|
|
239
|
+
catch {
|
|
212
240
|
return null;
|
|
213
|
-
|
|
214
|
-
}
|
|
215
|
-
export function parseSiteParted(body) {
|
|
216
|
-
return parseRoomParts(body);
|
|
217
|
-
}
|
|
218
|
-
export function partInventory(room) {
|
|
219
|
-
return {
|
|
220
|
-
parts: room.parts.length,
|
|
221
|
-
bytes: room.parts.reduce((sum, part) => sum + part.bytes, 0),
|
|
222
|
-
};
|
|
241
|
+
}
|
|
223
242
|
}
|
|
224
|
-
export function manifested(room,
|
|
243
|
+
export function manifested(room, pageToken, models) {
|
|
225
244
|
return {
|
|
226
245
|
kind: 'bootstrap',
|
|
227
246
|
roomVersion: roomVersion(room),
|
|
@@ -229,10 +248,13 @@ export function manifested(room, inventory, pageToken) {
|
|
|
229
248
|
revisions: {},
|
|
230
249
|
changes: {},
|
|
231
250
|
binaryFiles: {},
|
|
232
|
-
inventory,
|
|
233
251
|
pageToken,
|
|
252
|
+
...(models === undefined ? {} : { models }),
|
|
234
253
|
};
|
|
235
254
|
}
|
|
255
|
+
export function modelScope(room) {
|
|
256
|
+
return { ...emptyScope(room), files: room.models.files, contents: room.models.contents };
|
|
257
|
+
}
|
|
236
258
|
export function emptyScope(room) {
|
|
237
259
|
return {
|
|
238
260
|
anchor: room.anchor,
|
|
@@ -243,6 +265,8 @@ export function emptyScope(room) {
|
|
|
243
265
|
};
|
|
244
266
|
}
|
|
245
267
|
function partLine(line, mode, read) {
|
|
268
|
+
if (read.ended)
|
|
269
|
+
return false;
|
|
246
270
|
let entry;
|
|
247
271
|
try {
|
|
248
272
|
entry = JSON.parse(line);
|
|
@@ -250,6 +274,10 @@ function partLine(line, mode, read) {
|
|
|
250
274
|
catch {
|
|
251
275
|
return false;
|
|
252
276
|
}
|
|
277
|
+
if (endLine(entry)) {
|
|
278
|
+
read.ended = true;
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
253
281
|
if (folderLine(entry)) {
|
|
254
282
|
read.folders.push(entry.folder);
|
|
255
283
|
return true;
|
|
@@ -266,7 +294,7 @@ function partLine(line, mode, read) {
|
|
|
266
294
|
return true;
|
|
267
295
|
}
|
|
268
296
|
async function partRead(chunks, mode) {
|
|
269
|
-
const read = { files: [], contents: [], folders: [] };
|
|
297
|
+
const read = { files: [], contents: [], folders: [], ended: false };
|
|
270
298
|
const pace = paced();
|
|
271
299
|
const unfinished = [];
|
|
272
300
|
for (let chunk = await chunks.read(); chunk.done !== true; chunk = await chunks.read()) {
|
|
@@ -289,157 +317,22 @@ async function partRead(chunks, mode) {
|
|
|
289
317
|
}
|
|
290
318
|
return unfinished.length === 0 ? read : null;
|
|
291
319
|
}
|
|
320
|
+
function endLine(entry) {
|
|
321
|
+
if (typeof entry !== 'object' || entry === null || !('end' in entry))
|
|
322
|
+
return false;
|
|
323
|
+
return entry.end === true && Object.keys(entry).length === 1;
|
|
324
|
+
}
|
|
292
325
|
function folderLine(entry) {
|
|
293
326
|
if (typeof entry !== 'object' || entry === null || !('folder' in entry))
|
|
294
327
|
return false;
|
|
295
328
|
return typeof entry.folder === 'string' && Object.keys(entry).length === 1;
|
|
296
329
|
}
|
|
297
|
-
export async function housePart(room,
|
|
298
|
-
const payload = await checkedPayload(frame, listed);
|
|
299
|
-
if (payload === null)
|
|
300
|
-
return null;
|
|
330
|
+
export async function housePart(room, payload, mode) {
|
|
301
331
|
const read = await partRead(gunzipped(payload).getReader(), mode).catch(() => null);
|
|
302
|
-
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
return null;
|
|
307
|
-
const { path, folder, removed, ...rest } = value;
|
|
308
|
-
return typeof path === 'string' &&
|
|
309
|
-
folder === true &&
|
|
310
|
-
(removed === undefined || removed === true) &&
|
|
311
|
-
Object.keys(rest).length === 0
|
|
312
|
-
? { path, removed: removed === true }
|
|
313
|
-
: null;
|
|
314
|
-
}
|
|
315
|
-
function parseChange(value, mode) {
|
|
316
|
-
if (typeof value !== 'object' || value === null)
|
|
317
|
-
return null;
|
|
318
|
-
const held = value;
|
|
319
|
-
if (typeof held.path !== 'string')
|
|
320
|
-
return null;
|
|
321
|
-
if (held.removed === true)
|
|
322
|
-
return { path: held.path, removed: true };
|
|
323
|
-
const head = headChange(held);
|
|
324
|
-
const binary = binaryFileOf(held);
|
|
325
|
-
if (head === null || binary === null)
|
|
326
|
-
return null;
|
|
327
|
-
if (binary !== undefined) {
|
|
328
|
-
if (mode === 'credential' && typeof held.revision !== 'string')
|
|
329
|
-
return null;
|
|
330
|
-
const revision = typeof held.revision === 'string' ? held.revision : binary.sha256;
|
|
331
|
-
return { path: held.path, binary, revision, version: revision, ...headed(head) };
|
|
332
|
-
}
|
|
333
|
-
if (mode === 'site') {
|
|
334
|
-
if (typeof held.content !== 'string' || typeof held.sha256 !== 'string')
|
|
335
|
-
return null;
|
|
336
|
-
return {
|
|
337
|
-
path: held.path,
|
|
338
|
-
content: held.content,
|
|
339
|
-
revision: undefined,
|
|
340
|
-
version: held.sha256,
|
|
341
|
-
...headed(head),
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
if (typeof held.content === 'string' && typeof held.revision === 'string') {
|
|
345
|
-
return {
|
|
346
|
-
path: held.path,
|
|
347
|
-
content: held.content,
|
|
348
|
-
revision: held.revision,
|
|
349
|
-
version: held.revision,
|
|
350
|
-
...headed(head),
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
return null;
|
|
354
|
-
}
|
|
355
|
-
export function parseEnumeration(body, mode) {
|
|
356
|
-
if (typeof body !== 'object' || body === null)
|
|
357
|
-
return null;
|
|
358
|
-
if (!('authorities' in body) || !Array.isArray(body.authorities))
|
|
359
|
-
return null;
|
|
360
|
-
const authorities = [];
|
|
361
|
-
for (const entry of body.authorities) {
|
|
362
|
-
if (typeof entry !== 'object' || entry === null)
|
|
363
|
-
return null;
|
|
364
|
-
const held = entry;
|
|
365
|
-
const at = readPosition(held);
|
|
366
|
-
if (typeof held.authority !== 'string' || at === null)
|
|
367
|
-
return null;
|
|
368
|
-
if (!Array.isArray(held.changes))
|
|
369
|
-
return null;
|
|
370
|
-
const changes = [];
|
|
371
|
-
const folders = [];
|
|
372
|
-
for (const change of held.changes) {
|
|
373
|
-
const folder = folderChange(change);
|
|
374
|
-
if (folder !== null) {
|
|
375
|
-
folders.push(folder);
|
|
376
|
-
continue;
|
|
377
|
-
}
|
|
378
|
-
const mapped = parseChange(change, mode);
|
|
379
|
-
if (mapped === null)
|
|
380
|
-
return null;
|
|
381
|
-
changes.push(mapped);
|
|
382
|
-
}
|
|
383
|
-
const next = held.next === undefined ? undefined : readPage(held.next);
|
|
384
|
-
if (next === null)
|
|
385
|
-
return null;
|
|
386
|
-
authorities.push({
|
|
387
|
-
authority: held.authority,
|
|
388
|
-
...at,
|
|
389
|
-
changes,
|
|
390
|
-
...(folders.length === 0 ? {} : { folders }),
|
|
391
|
-
...(next === undefined ? {} : { next }),
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
return { authorities };
|
|
395
|
-
}
|
|
396
|
-
function readPage(held) {
|
|
397
|
-
if (typeof held !== 'object' || held === null)
|
|
398
|
-
return null;
|
|
399
|
-
const { after, through, read } = held;
|
|
400
|
-
if (typeof after !== 'string' || !DECIMAL.test(after))
|
|
401
|
-
return null;
|
|
402
|
-
if (typeof through !== 'string' || !DECIMAL.test(through))
|
|
403
|
-
return null;
|
|
404
|
-
if (typeof read !== 'number' || !Number.isSafeInteger(read) || read < 0)
|
|
405
|
-
return null;
|
|
406
|
-
return { after, through, read };
|
|
407
|
-
}
|
|
408
|
-
function advances(asked, next) {
|
|
409
|
-
const moved = BigInt(next.through) - BigInt(asked.through);
|
|
410
|
-
return moved > 0n || (moved === 0n && next.after === asked.after && next.read > asked.read);
|
|
411
|
-
}
|
|
412
|
-
export async function wholeView(first, more) {
|
|
413
|
-
const changes = new Map(first.changes.map((change) => [change.path, change]));
|
|
414
|
-
const folders = new Map((first.folders ?? []).map((folder) => [folder.path, folder]));
|
|
415
|
-
let view = first;
|
|
416
|
-
while (view.next !== undefined) {
|
|
417
|
-
const asked = view.next;
|
|
418
|
-
const page = await more(asked);
|
|
419
|
-
if ('kind' in page)
|
|
420
|
-
return page;
|
|
421
|
-
if (page.position !== asked.through ||
|
|
422
|
-
page.logEpoch !== first.logEpoch ||
|
|
423
|
-
(page.next !== undefined && !advances(asked, page.next))) {
|
|
424
|
-
return { kind: 'transport-uncertainty' };
|
|
425
|
-
}
|
|
426
|
-
for (const change of page.changes) {
|
|
427
|
-
changes.delete(change.path);
|
|
428
|
-
changes.set(change.path, change);
|
|
429
|
-
}
|
|
430
|
-
for (const folder of page.folders ?? []) {
|
|
431
|
-
folders.delete(folder.path);
|
|
432
|
-
folders.set(folder.path, folder);
|
|
433
|
-
}
|
|
434
|
-
view = page;
|
|
435
|
-
}
|
|
436
|
-
return {
|
|
437
|
-
authority: first.authority,
|
|
438
|
-
position: view.position,
|
|
439
|
-
logEpoch: first.logEpoch,
|
|
440
|
-
changes: [...changes.values()],
|
|
441
|
-
...(folders.size === 0 ? {} : { folders: [...folders.values()] }),
|
|
442
|
-
};
|
|
332
|
+
if (read === null)
|
|
333
|
+
return { kind: 'transport-uncertainty' };
|
|
334
|
+
const { ended, ...scope } = read;
|
|
335
|
+
return { scope: { ...emptyScope(room), ...scope }, ended };
|
|
443
336
|
}
|
|
444
337
|
export function* bootstrapping(scope) {
|
|
445
338
|
const contents = new Map();
|
|
@@ -457,6 +350,8 @@ export function* bootstrapping(scope) {
|
|
|
457
350
|
answer.binaryFiles.set(file.path, file.binary);
|
|
458
351
|
else if (content !== undefined)
|
|
459
352
|
answer.documents.set(file.path, content);
|
|
353
|
+
else if (file.outline !== undefined)
|
|
354
|
+
answer.outlines.set(file.path, file.outline);
|
|
460
355
|
if (file.revision !== undefined)
|
|
461
356
|
revised(answer, file.path, file.revision);
|
|
462
357
|
}
|
|
@@ -474,34 +369,3 @@ export function schemaOf(scope, schema) {
|
|
|
474
369
|
? null
|
|
475
370
|
: { schema: content.content, version: file.version, revision: file.revision ?? null };
|
|
476
371
|
}
|
|
477
|
-
export function viewOf(enumeration, tracked) {
|
|
478
|
-
return enumeration.authorities.find((entry) => entry.authority === tracked.authority);
|
|
479
|
-
}
|
|
480
|
-
function* refreshing(view, fromRoomVersion) {
|
|
481
|
-
if (roomVersion(view) === fromRoomVersion)
|
|
482
|
-
return { kind: 'still-current' };
|
|
483
|
-
const answer = answering();
|
|
484
|
-
for (const change of view.changes) {
|
|
485
|
-
yield ROW_WEIGHT;
|
|
486
|
-
if ('removed' in change) {
|
|
487
|
-
answer.removals.add(change.path);
|
|
488
|
-
continue;
|
|
489
|
-
}
|
|
490
|
-
if ('content' in change)
|
|
491
|
-
answer.documents.set(change.path, change.content);
|
|
492
|
-
else
|
|
493
|
-
answer.binaryFiles.set(change.path, change.binary);
|
|
494
|
-
if (change.head !== undefined)
|
|
495
|
-
answer.changes.set(change.path, change.head);
|
|
496
|
-
if (change.revision !== undefined)
|
|
497
|
-
revised(answer, change.path, change.revision);
|
|
498
|
-
}
|
|
499
|
-
for (const folder of view.folders ?? []) {
|
|
500
|
-
yield ROW_WEIGHT;
|
|
501
|
-
folded(answer, folder.path, folder.removed);
|
|
502
|
-
}
|
|
503
|
-
return { kind: 'net-advancement', roomVersion: roomVersion(view), ...(yield* answered(answer)) };
|
|
504
|
-
}
|
|
505
|
-
export async function refreshFrom(view, fromRoomVersion) {
|
|
506
|
-
return stepped(refreshing(view, fromRoomVersion));
|
|
507
|
-
}
|
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,6 +1,7 @@
|
|
|
1
|
-
export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot', 'whatsapp', 'messenger', 'instagram'];
|
|
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
3
|
export declare const INBOX_CHAT_TYPE = "inbox-chat";
|
|
4
4
|
export declare const INBOX_MESSAGE_TYPE = "inbox-message";
|
|
5
|
+
export declare const HOUSE_NAMEABLE_ROOM_TYPES: string[];
|
|
5
6
|
export declare const HOUSE_ROOM_TYPES: string;
|
|
6
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":"
|
|
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,eAAe,eAAe,CAAC;AAE5C,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,eAAO,MAAM,yBAAyB,UAAwC,CAAC;AAyB/E,eAAO,MAAM,gBAAgB,QA6FjB,CAAC"}
|
package/dist/room-types.js
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
import { APP_REFERENCE_PATTERN } from './app-reference.js';
|
|
2
|
+
import { HOUSE_MODEL_TYPES } from './house-model.js';
|
|
3
|
+
export const INBOX_CHANNEL_KINDS = [
|
|
4
|
+
'telegram-bot',
|
|
5
|
+
'telegram-business',
|
|
6
|
+
'whatsapp',
|
|
7
|
+
'messenger',
|
|
8
|
+
'instagram',
|
|
9
|
+
'viber',
|
|
10
|
+
'tiktok',
|
|
11
|
+
];
|
|
2
12
|
export const INBOX_CHAT_TYPE = 'inbox-chat';
|
|
3
13
|
export const INBOX_MESSAGE_TYPE = 'inbox-message';
|
|
14
|
+
export const HOUSE_NAMEABLE_ROOM_TYPES = [INBOX_CHAT_TYPE, INBOX_MESSAGE_TYPE];
|
|
15
|
+
const WAYFINDING_MAP_TYPE = 'wayfinding-map';
|
|
16
|
+
const WAYFINDING_TICKET_TYPE = 'wayfinding-ticket';
|
|
17
|
+
const WAYFINDING_MAP_SECTIONS = [
|
|
18
|
+
'Destination',
|
|
19
|
+
'Notes',
|
|
20
|
+
'Decisions so far',
|
|
21
|
+
'Not yet specified',
|
|
22
|
+
'Out of scope',
|
|
23
|
+
];
|
|
4
24
|
const IDENTITY = "{ type: string, pattern: '^\\S+$' }";
|
|
5
25
|
const AGENT = [' agent: { type: string, format: uuid }', ' name: { type: string }'];
|
|
6
26
|
const ASSIGNEE = [
|
|
@@ -27,7 +47,6 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
27
47
|
' type: object',
|
|
28
48
|
' properties:',
|
|
29
49
|
...AGENT,
|
|
30
|
-
' conversation: { type: string, format: uuid }',
|
|
31
50
|
' required: [inbox, channel, chat, customer]',
|
|
32
51
|
`${INBOX_MESSAGE_TYPE}:`,
|
|
33
52
|
' properties:',
|
|
@@ -41,6 +60,7 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
41
60
|
` channel_message: ${IDENTITY}`,
|
|
42
61
|
' state: { enum: [sending, sent, failed] }',
|
|
43
62
|
' reason: { type: string }',
|
|
63
|
+
' labelled: { const: true }',
|
|
44
64
|
' reactions:',
|
|
45
65
|
' type: array',
|
|
46
66
|
' items:',
|
|
@@ -59,8 +79,47 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
59
79
|
' assignee:',
|
|
60
80
|
...ASSIGNEE,
|
|
61
81
|
' sent_outside: { const: true }',
|
|
82
|
+
' template:',
|
|
83
|
+
' type: object',
|
|
84
|
+
' properties:',
|
|
85
|
+
' name: { type: string, minLength: 1 }',
|
|
86
|
+
' language: { type: string, minLength: 1 }',
|
|
87
|
+
' required: [name, language]',
|
|
88
|
+
' values:',
|
|
89
|
+
' type: object',
|
|
90
|
+
' additionalProperties: { type: string }',
|
|
91
|
+
' withheld: { const: true }',
|
|
62
92
|
' required: [direction]',
|
|
63
93
|
' if: { properties: { direction: { const: in } } }',
|
|
64
94
|
' then: { required: [sent_at] }',
|
|
65
|
-
|
|
95
|
+
`${WAYFINDING_MAP_TYPE}:`,
|
|
96
|
+
' properties:',
|
|
97
|
+
' title: { type: string }',
|
|
98
|
+
' required: [title]',
|
|
99
|
+
' sections:',
|
|
100
|
+
...WAYFINDING_MAP_SECTIONS.map((name) => ` ${name}: { kind: text, required: true }`),
|
|
101
|
+
`${WAYFINDING_TICKET_TYPE}:`,
|
|
102
|
+
' properties:',
|
|
103
|
+
' title: { type: string }',
|
|
104
|
+
' kind: { enum: [research, prototype, grilling, task] }',
|
|
105
|
+
' status: { enum: [open, in-progress, done, out-of-scope] }',
|
|
106
|
+
` map: { type: string, reference: ${WAYFINDING_MAP_TYPE} }`,
|
|
107
|
+
` blocked_by: { type: array, items: { type: string, reference: ${WAYFINDING_TICKET_TYPE} } }`,
|
|
108
|
+
' assignee:',
|
|
109
|
+
...ASSIGNEE,
|
|
110
|
+
' conversation: { type: string, format: uuid }',
|
|
111
|
+
` app: { type: string, pattern: '${APP_REFERENCE_PATTERN.source}' }`,
|
|
112
|
+
' required: [title, kind, status, map, blocked_by]',
|
|
113
|
+
' sections:',
|
|
114
|
+
' Question: { kind: text }',
|
|
115
|
+
' Answer: { kind: text }',
|
|
116
|
+
' allOf:',
|
|
117
|
+
' - if: { properties: { status: { enum: [in-progress, done, out-of-scope] } }, required: [status] }',
|
|
118
|
+
' then: { required: [assignee] }',
|
|
119
|
+
' else: { properties: { assignee: false } }',
|
|
120
|
+
' - if: { properties: { assignee: { required: [agent] } }, required: [assignee] }',
|
|
121
|
+
' else: { properties: { conversation: false } }',
|
|
122
|
+
' - if: { properties: { status: { enum: [done, out-of-scope] } }, required: [status] }',
|
|
123
|
+
' then: { sections: { Answer: { kind: text, required: true } } }',
|
|
124
|
+
HOUSE_MODEL_TYPES,
|
|
66
125
|
].join('\n');
|
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"}
|