@agentshouse/mdruntime-adapter 0.1.0-ccda1a2da11c3 → 0.1.0-ccdfb41af2abb

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.
Files changed (67) hide show
  1. package/README.md +2 -2
  2. package/dist/actions.d.ts +3 -71
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +1 -317
  5. package/dist/adapter.d.ts.map +1 -1
  6. package/dist/adapter.js +171 -336
  7. package/dist/app-reference.d.ts +2 -0
  8. package/dist/app-reference.d.ts.map +1 -0
  9. package/dist/app-reference.js +2 -0
  10. package/dist/crockford.d.ts +4 -0
  11. package/dist/crockford.d.ts.map +1 -0
  12. package/dist/crockford.js +3 -0
  13. package/dist/discovery.d.ts +12 -12
  14. package/dist/discovery.d.ts.map +1 -1
  15. package/dist/discovery.js +44 -51
  16. package/dist/history.d.ts +12 -0
  17. package/dist/history.d.ts.map +1 -0
  18. package/dist/history.js +91 -0
  19. package/dist/house-model.d.ts +892 -0
  20. package/dist/house-model.d.ts.map +1 -0
  21. package/dist/house-model.js +482 -0
  22. package/dist/index.d.ts +10 -3
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +9 -2
  25. package/dist/model.d.ts +5 -2
  26. package/dist/model.d.ts.map +1 -1
  27. package/dist/model.js +10 -29
  28. package/dist/part.d.ts +12 -11
  29. package/dist/part.d.ts.map +1 -1
  30. package/dist/part.js +66 -56
  31. package/dist/read.d.ts +19 -56
  32. package/dist/read.d.ts.map +1 -1
  33. package/dist/read.js +138 -297
  34. package/dist/refusal.d.ts +0 -3
  35. package/dist/refusal.d.ts.map +1 -1
  36. package/dist/refusal.js +0 -5
  37. package/dist/room-stream.d.ts +19 -0
  38. package/dist/room-stream.d.ts.map +1 -0
  39. package/dist/room-stream.js +57 -0
  40. package/dist/room-types.d.ts +2 -1
  41. package/dist/room-types.d.ts.map +1 -1
  42. package/dist/room-types.js +62 -3
  43. package/dist/search.d.ts +5 -0
  44. package/dist/search.d.ts.map +1 -0
  45. package/dist/search.js +47 -0
  46. package/dist/site.d.ts.map +1 -1
  47. package/dist/site.js +79 -177
  48. package/dist/stream.d.ts +13 -14
  49. package/dist/stream.d.ts.map +1 -1
  50. package/dist/stream.js +168 -426
  51. package/dist/transport.d.ts +48 -38
  52. package/dist/transport.d.ts.map +1 -1
  53. package/dist/transport.js +55 -11
  54. package/dist/upload.d.ts +12 -0
  55. package/dist/upload.d.ts.map +1 -0
  56. package/dist/upload.js +63 -0
  57. package/dist/write.d.ts +6 -1
  58. package/dist/write.d.ts.map +1 -1
  59. package/dist/write.js +19 -32
  60. package/package.json +8 -4
  61. package/AGENTS.md +0 -309
  62. package/dist/gather.d.ts +0 -4
  63. package/dist/gather.d.ts.map +0 -1
  64. package/dist/gather.js +0 -35
  65. package/dist/referrer.d.ts +0 -9
  66. package/dist/referrer.d.ts.map +0 -1
  67. package/dist/referrer.js +0 -41
package/dist/read.js CHANGED
@@ -1,6 +1,6 @@
1
- import { patching, ROW_WEIGHT, stepped, } from '@agentshouse/mdruntime';
2
- import { checkedPayload, gunzipped, parsePart } from './part.js';
3
- import { DECIMAL, readPosition, roomVersion } from './version.js';
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) {
@@ -126,19 +131,34 @@ function headed(head) {
126
131
  return head === undefined ? {} : { head };
127
132
  }
128
133
  export function binaryFileOf(held) {
129
- if (held.file === undefined)
134
+ if (held.media_type === undefined)
130
135
  return undefined;
131
- const { file, bytes, media_type: mediaType, sha256 } = held;
132
- if (typeof file !== 'string' ||
133
- typeof bytes !== 'number' ||
134
- typeof mediaType !== 'string' ||
135
- typeof sha256 !== 'string')
136
+ const { bytes, media_type: mediaType, sha256 } = held;
137
+ if (typeof bytes !== 'number' || typeof mediaType !== 'string' || typeof sha256 !== 'string')
136
138
  return null;
137
- return { fileRef: file, byteLength: bytes, mediaType, sha256 };
139
+ return { byteLength: bytes, mediaType, sha256 };
138
140
  }
139
141
  function binaried(binary) {
140
142
  return binary === undefined ? {} : { binary };
141
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
+ }
142
162
  function parseFile(value, mode) {
143
163
  if (typeof value !== 'object' || value === null)
144
164
  return null;
@@ -160,7 +180,8 @@ function parseFile(value, mode) {
160
180
  ...binaried(binary),
161
181
  };
162
182
  }
163
- if (typeof file.revision !== 'string')
183
+ const outline = outlineOf(file.outline);
184
+ if (typeof file.revision !== 'string' || outline === null)
164
185
  return null;
165
186
  return {
166
187
  path: file.path,
@@ -169,15 +190,32 @@ function parseFile(value, mode) {
169
190
  ...(typeof file.sha256 === 'string' ? { sha256: file.sha256 } : {}),
170
191
  ...headed(head),
171
192
  ...binaried(binary),
193
+ ...(outline === undefined ? {} : { outline }),
172
194
  };
173
195
  }
174
- function parseRoomParts(value) {
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) {
175
212
  if (typeof value !== 'object' || value === null)
176
213
  return null;
177
214
  const held = value;
178
215
  if (typeof held.manifest !== 'object' || held.manifest === null)
179
216
  return null;
180
- if (!Array.isArray(held.parts))
217
+ const models = parseModels(held.models, mode);
218
+ if (models === null)
181
219
  return null;
182
220
  const manifest = held.manifest;
183
221
  if (manifest.scope !== 'room')
@@ -187,36 +225,35 @@ function parseRoomParts(value) {
187
225
  return null;
188
226
  if (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)
189
227
  return null;
190
- const parts = [];
191
- for (const entry of held.parts) {
192
- const part = parsePart(entry);
193
- if (part === null)
194
- return null;
195
- parts.push(part);
196
- }
197
- return { anchor: manifest.anchor, ...at, parts };
228
+ return { anchor: manifest.anchor, ...at, models };
198
229
  }
199
- export function parseParted(body) {
200
- if (typeof body !== 'object' || body === null)
201
- return null;
202
- if (!('scopes' in body) || !Array.isArray(body.scopes))
203
- return null;
204
- const rooms = [];
205
- for (const entry of body.scopes) {
206
- const room = parseRoomParts(entry);
207
- if (room === null)
208
- return null;
209
- 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;
210
238
  }
211
- if (!('next' in body) || body.next === undefined)
212
- return { rooms };
213
- const next = body.next;
214
- if (typeof next !== 'object' || next === null || typeof next.room !== 'string')
239
+ catch {
215
240
  return null;
216
- return { rooms, next: next.room };
241
+ }
242
+ }
243
+ export function manifested(room, pageToken, models) {
244
+ return {
245
+ kind: 'bootstrap',
246
+ roomVersion: roomVersion(room),
247
+ documents: {},
248
+ revisions: {},
249
+ changes: {},
250
+ binaryFiles: {},
251
+ pageToken,
252
+ ...(models === undefined ? {} : { models }),
253
+ };
217
254
  }
218
- export function parseSiteParted(body) {
219
- return parseRoomParts(body);
255
+ export function modelScope(room) {
256
+ return { ...emptyScope(room), files: room.models.files, contents: room.models.contents };
220
257
  }
221
258
  export function emptyScope(room) {
222
259
  return {
@@ -227,242 +264,75 @@ export function emptyScope(room) {
227
264
  contents: [],
228
265
  };
229
266
  }
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;
267
+ function partLine(line, mode, read) {
268
+ if (read.ended)
269
+ return false;
270
+ let entry;
271
+ try {
272
+ entry = JSON.parse(line);
262
273
  }
263
- return { files, contents, folders };
264
- }
265
- function folderLine(entry) {
266
- if (typeof entry !== 'object' || entry === null || !('folder' in entry))
274
+ catch {
267
275
  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)
273
- return null;
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 };
277
- }
278
- function folderChange(value) {
279
- if (typeof value !== 'object' || value === null)
280
- return null;
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 }
287
- : null;
288
- }
289
- function parseChange(value, mode) {
290
- if (typeof value !== 'object' || value === null)
291
- return null;
292
- const held = value;
293
- if (typeof held.path !== 'string')
294
- return null;
295
- if (held.removed === true)
296
- return { path: held.path, removed: true };
297
- const head = headChange(held);
298
- const binary = binaryFileOf(held);
299
- if (head === null || binary === null)
300
- return null;
301
- if (binary !== undefined) {
302
- if (mode === 'credential' && typeof held.revision !== 'string')
303
- return null;
304
- const revision = typeof held.revision === 'string' ? held.revision : binary.sha256;
305
- return { path: held.path, binary, revision, version: revision, ...headed(head) };
306
276
  }
307
- if (mode === 'site') {
308
- if (typeof held.content !== 'string' || typeof held.sha256 !== 'string')
309
- return null;
310
- return {
311
- path: held.path,
312
- content: held.content,
313
- revision: undefined,
314
- version: held.sha256,
315
- ...headed(head),
316
- };
277
+ if (endLine(entry)) {
278
+ read.ended = true;
279
+ return true;
317
280
  }
318
- if (typeof held.content === 'string' && typeof held.revision === 'string') {
319
- return {
320
- path: held.path,
321
- content: held.content,
322
- revision: held.revision,
323
- version: held.revision,
324
- ...headed(head),
325
- };
281
+ if (folderLine(entry)) {
282
+ read.folders.push(entry.folder);
283
+ return true;
326
284
  }
327
- return null;
328
- }
329
- export function parseEnumeration(body, mode) {
330
- if (typeof body !== 'object' || body === null)
331
- return null;
332
- if (!('authorities' in body) || !Array.isArray(body.authorities))
333
- return null;
334
- const authorities = [];
335
- for (const entry of body.authorities) {
336
- if (typeof entry !== 'object' || entry === null)
337
- return null;
338
- const held = entry;
339
- const at = readPosition(held);
340
- if (typeof held.authority !== 'string' || at === null)
341
- return null;
342
- if (!Array.isArray(held.changes))
343
- return null;
344
- const changes = [];
345
- const folders = [];
346
- for (const change of held.changes) {
347
- const folder = folderChange(change);
348
- if (folder !== null) {
349
- folders.push(folder);
350
- continue;
351
- }
352
- const mapped = parseChange(change, mode);
353
- if (mapped === null)
285
+ const file = parseFile(entry, mode);
286
+ if (file === null)
287
+ return false;
288
+ read.files.push(file);
289
+ const { content } = entry;
290
+ if (typeof content === 'string')
291
+ read.contents.push({ path: file.path, content });
292
+ else if (content !== undefined)
293
+ return false;
294
+ return true;
295
+ }
296
+ async function partRead(chunks, mode) {
297
+ const read = { files: [], contents: [], folders: [], ended: false };
298
+ const pace = paced();
299
+ const unfinished = [];
300
+ for (let chunk = await chunks.read(); chunk.done !== true; chunk = await chunks.read()) {
301
+ const text = chunk.value;
302
+ let start = 0;
303
+ for (let end = text.indexOf('\n'); end !== -1; end = text.indexOf('\n', start)) {
304
+ const piece = text.slice(start, end);
305
+ const line = unfinished.length === 0 ? piece : unfinished.splice(0).join('') + piece;
306
+ if (!partLine(line, mode, read)) {
307
+ await chunks.cancel();
354
308
  return null;
355
- changes.push(mapped);
309
+ }
310
+ start = end + 1;
311
+ const due = pace(line.length + ROW_WEIGHT);
312
+ if (due instanceof Promise)
313
+ await due;
356
314
  }
357
- const next = held.next === undefined ? undefined : readPage(held.next);
358
- if (next === null)
359
- return null;
360
- authorities.push({
361
- authority: held.authority,
362
- ...at,
363
- changes,
364
- ...(folders.length === 0 ? {} : { folders }),
365
- ...(next === undefined ? {} : { next }),
366
- });
315
+ if (start < text.length)
316
+ unfinished.push(text.slice(start));
367
317
  }
368
- return { authorities };
318
+ return unfinished.length === 0 ? read : null;
369
319
  }
370
- function readPage(held) {
371
- if (typeof held !== 'object' || held === null)
372
- return null;
373
- const { after, through, read } = held;
374
- if (typeof after !== 'string' || !DECIMAL.test(after))
375
- return null;
376
- if (typeof through !== 'string' || !DECIMAL.test(through))
377
- return null;
378
- if (typeof read !== 'number' || !Number.isSafeInteger(read) || read < 0)
379
- return null;
380
- return { after, through, read };
381
- }
382
- function advances(asked, next) {
383
- const moved = BigInt(next.through) - BigInt(asked.through);
384
- return moved > 0n || (moved === 0n && next.after === asked.after && next.read > asked.read);
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;
385
324
  }
386
- export async function wholeView(first, more) {
387
- const changes = new Map(first.changes.map((change) => [change.path, change]));
388
- const folders = new Map((first.folders ?? []).map((folder) => [folder.path, folder]));
389
- let view = first;
390
- while (view.next !== undefined) {
391
- const asked = view.next;
392
- const page = await more(asked);
393
- if ('kind' in page)
394
- return page;
395
- if (page.position !== asked.through ||
396
- page.logEpoch !== first.logEpoch ||
397
- (page.next !== undefined && !advances(asked, page.next))) {
398
- return { kind: 'transport-uncertainty' };
399
- }
400
- for (const change of page.changes) {
401
- changes.delete(change.path);
402
- changes.set(change.path, change);
403
- }
404
- for (const folder of page.folders ?? []) {
405
- folders.delete(folder.path);
406
- folders.set(folder.path, folder);
407
- }
408
- view = page;
409
- }
410
- return {
411
- authority: first.authority,
412
- position: view.position,
413
- logEpoch: first.logEpoch,
414
- changes: [...changes.values()],
415
- ...(folders.size === 0 ? {} : { folders: [...folders.values()] }),
416
- };
325
+ function folderLine(entry) {
326
+ if (typeof entry !== 'object' || entry === null || !('folder' in entry))
327
+ return false;
328
+ return typeof entry.folder === 'string' && Object.keys(entry).length === 1;
417
329
  }
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
- }
429
- for (const change of view.changes) {
430
- files.delete(change.path);
431
- contents.delete(change.path);
432
- yield ROW_WEIGHT;
433
- if ('removed' in change)
434
- continue;
435
- files.set(change.path, {
436
- path: change.path,
437
- revision: change.revision,
438
- version: change.version,
439
- ...headed(change.head),
440
- ...('binary' in change ? { binary: change.binary } : {}),
441
- });
442
- if ('content' in change)
443
- contents.set(change.path, change.content);
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
- }
458
- return {
459
- ...scope,
460
- position: view.position,
461
- logEpoch: view.logEpoch,
462
- files: [...files.values()],
463
- contents: kept,
464
- ...(folders.size === 0 ? {} : { folders: [...folders] }),
465
- };
330
+ export async function housePart(room, payload, mode) {
331
+ const read = await partRead(gunzipped(payload).getReader(), mode).catch(() => null);
332
+ if (read === null)
333
+ return { kind: 'transport-uncertainty' };
334
+ const { ended, ...scope } = read;
335
+ return { scope: { ...emptyScope(room), ...scope }, ended };
466
336
  }
467
337
  export function* bootstrapping(scope) {
468
338
  const contents = new Map();
@@ -480,6 +350,8 @@ export function* bootstrapping(scope) {
480
350
  answer.binaryFiles.set(file.path, file.binary);
481
351
  else if (content !== undefined)
482
352
  answer.documents.set(file.path, content);
353
+ else if (file.outline !== undefined)
354
+ answer.outlines.set(file.path, file.outline);
483
355
  if (file.revision !== undefined)
484
356
  revised(answer, file.path, file.revision);
485
357
  }
@@ -497,34 +369,3 @@ export function schemaOf(scope, schema) {
497
369
  ? null
498
370
  : { schema: content.content, version: file.version, revision: file.revision ?? null };
499
371
  }
500
- export function viewOf(enumeration, tracked) {
501
- return enumeration.authorities.find((entry) => entry.authority === tracked.authority);
502
- }
503
- function* refreshing(view, fromRoomVersion) {
504
- if (roomVersion(view) === fromRoomVersion)
505
- return { kind: 'still-current' };
506
- const answer = answering();
507
- for (const change of view.changes) {
508
- yield ROW_WEIGHT;
509
- if ('removed' in change) {
510
- answer.removals.add(change.path);
511
- continue;
512
- }
513
- if ('content' in change)
514
- answer.documents.set(change.path, change.content);
515
- else
516
- answer.binaryFiles.set(change.path, change.binary);
517
- if (change.head !== undefined)
518
- answer.changes.set(change.path, change.head);
519
- if (change.revision !== undefined)
520
- revised(answer, change.path, change.revision);
521
- }
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));
530
- }
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
@@ -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,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAGpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAQrF"}
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
+ }
@@ -1,6 +1,7 @@
1
- export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot'];
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
@@ -1 +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"}
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"}