@agentshouse/mdruntime-adapter 0.1.0-ce5ef9afd7e9a → 0.1.0-ce752a56d9714

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 (66) hide show
  1. package/README.md +2 -2
  2. package/dist/actions.d.ts +4 -73
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +7 -316
  5. package/dist/adapter.d.ts.map +1 -1
  6. package/dist/adapter.js +148 -324
  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 +21 -12
  14. package/dist/discovery.d.ts.map +1 -1
  15. package/dist/discovery.js +73 -51
  16. package/dist/history.d.ts +12 -0
  17. package/dist/history.d.ts.map +1 -0
  18. package/dist/history.js +92 -0
  19. package/dist/house-model.d.ts +911 -0
  20. package/dist/house-model.d.ts.map +1 -0
  21. package/dist/house-model.js +496 -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 +140 -298
  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 +20 -0
  38. package/dist/room-stream.d.ts.map +1 -0
  39. package/dist/room-stream.js +78 -0
  40. package/dist/room-types.d.ts +4 -3
  41. package/dist/room-types.d.ts.map +1 -1
  42. package/dist/room-types.js +66 -7
  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 +88 -176
  48. package/dist/stream.d.ts +13 -14
  49. package/dist/stream.d.ts.map +1 -1
  50. package/dist/stream.js +169 -426
  51. package/dist/transport.d.ts +48 -36
  52. package/dist/transport.d.ts.map +1 -1
  53. package/dist/transport.js +54 -12
  54. package/dist/upload.d.ts.map +1 -1
  55. package/dist/upload.js +26 -15
  56. package/dist/write.d.ts +6 -1
  57. package/dist/write.d.ts.map +1 -1
  58. package/dist/write.js +19 -32
  59. package/package.json +8 -4
  60. package/AGENTS.md +0 -312
  61. package/dist/gather.d.ts +0 -4
  62. package/dist/gather.d.ts.map +0 -1
  63. package/dist/gather.js +0 -35
  64. package/dist/referrer.d.ts +0 -9
  65. package/dist/referrer.d.ts.map +0 -1
  66. 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;
@@ -147,17 +167,19 @@ function parseFile(value, mode) {
147
167
  return null;
148
168
  const head = headChange(file);
149
169
  const binary = binaryFileOf(file);
150
- if (head === null || binary === null)
170
+ const outline = outlineOf(file.outline);
171
+ if (head === null || binary === null || outline === null)
151
172
  return null;
152
173
  if (mode === 'site') {
153
174
  if (typeof file.sha256 !== 'string')
154
175
  return null;
155
176
  return {
156
177
  path: file.path,
157
- revision: binary?.sha256,
178
+ revision: binary?.sha256 ?? file.sha256,
158
179
  version: file.sha256,
159
180
  ...headed(head),
160
181
  ...binaried(binary),
182
+ ...(outline === undefined ? {} : { outline }),
161
183
  };
162
184
  }
163
185
  if (typeof file.revision !== 'string')
@@ -169,15 +191,32 @@ function parseFile(value, mode) {
169
191
  ...(typeof file.sha256 === 'string' ? { sha256: file.sha256 } : {}),
170
192
  ...headed(head),
171
193
  ...binaried(binary),
194
+ ...(outline === undefined ? {} : { outline }),
172
195
  };
173
196
  }
174
- function parseRoomParts(value) {
197
+ function parseModels(value, mode) {
198
+ if (!Array.isArray(value))
199
+ return null;
200
+ const files = [];
201
+ const contents = [];
202
+ for (const entry of value) {
203
+ const file = parseFile(entry, mode);
204
+ const { content } = entry;
205
+ if (file === null || typeof content !== 'string')
206
+ return null;
207
+ files.push(file);
208
+ contents.push({ path: file.path, content });
209
+ }
210
+ return { files, contents };
211
+ }
212
+ function parseRoomHead(value, mode) {
175
213
  if (typeof value !== 'object' || value === null)
176
214
  return null;
177
215
  const held = value;
178
216
  if (typeof held.manifest !== 'object' || held.manifest === null)
179
217
  return null;
180
- if (!Array.isArray(held.parts))
218
+ const models = parseModels(held.models, mode);
219
+ if (models === null)
181
220
  return null;
182
221
  const manifest = held.manifest;
183
222
  if (manifest.scope !== 'room')
@@ -187,36 +226,35 @@ function parseRoomParts(value) {
187
226
  return null;
188
227
  if (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)
189
228
  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 };
229
+ return { anchor: manifest.anchor, ...at, models };
198
230
  }
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);
231
+ export async function roomHead(payload, mode) {
232
+ let text = '';
233
+ try {
234
+ for await (const chunk of gunzipped(payload))
235
+ text += chunk;
236
+ return text.endsWith('\n') && text.indexOf('\n') === text.length - 1
237
+ ? parseRoomHead(JSON.parse(text), mode)
238
+ : null;
210
239
  }
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')
240
+ catch {
215
241
  return null;
216
- return { rooms, next: next.room };
242
+ }
243
+ }
244
+ export function manifested(room, pageToken, models) {
245
+ return {
246
+ kind: 'bootstrap',
247
+ roomVersion: roomVersion(room),
248
+ documents: {},
249
+ revisions: {},
250
+ changes: {},
251
+ binaryFiles: {},
252
+ pageToken,
253
+ ...(models === undefined ? {} : { models }),
254
+ };
217
255
  }
218
- export function parseSiteParted(body) {
219
- return parseRoomParts(body);
256
+ export function modelScope(room) {
257
+ return { ...emptyScope(room), files: room.models.files, contents: room.models.contents };
220
258
  }
221
259
  export function emptyScope(room) {
222
260
  return {
@@ -227,242 +265,75 @@ export function emptyScope(room) {
227
265
  contents: [],
228
266
  };
229
267
  }
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;
268
+ function partLine(line, mode, read) {
269
+ if (read.ended)
270
+ return false;
271
+ let entry;
272
+ try {
273
+ entry = JSON.parse(line);
262
274
  }
263
- return { files, contents, folders };
264
- }
265
- function folderLine(entry) {
266
- if (typeof entry !== 'object' || entry === null || !('folder' in entry))
275
+ catch {
267
276
  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
277
  }
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
- };
278
+ if (endLine(entry)) {
279
+ read.ended = true;
280
+ return true;
317
281
  }
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
- };
282
+ if (folderLine(entry)) {
283
+ read.folders.push(entry.folder);
284
+ return true;
326
285
  }
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)
286
+ const file = parseFile(entry, mode);
287
+ if (file === null)
288
+ return false;
289
+ read.files.push(file);
290
+ const { content } = entry;
291
+ if (typeof content === 'string')
292
+ read.contents.push({ path: file.path, content });
293
+ else if (content !== undefined)
294
+ return false;
295
+ return true;
296
+ }
297
+ async function partRead(chunks, mode) {
298
+ const read = { files: [], contents: [], folders: [], ended: false };
299
+ const pace = paced();
300
+ const unfinished = [];
301
+ for (let chunk = await chunks.read(); chunk.done !== true; chunk = await chunks.read()) {
302
+ const text = chunk.value;
303
+ let start = 0;
304
+ for (let end = text.indexOf('\n'); end !== -1; end = text.indexOf('\n', start)) {
305
+ const piece = text.slice(start, end);
306
+ const line = unfinished.length === 0 ? piece : unfinished.splice(0).join('') + piece;
307
+ if (!partLine(line, mode, read)) {
308
+ await chunks.cancel();
354
309
  return null;
355
- changes.push(mapped);
310
+ }
311
+ start = end + 1;
312
+ const due = pace(line.length + ROW_WEIGHT);
313
+ if (due instanceof Promise)
314
+ await due;
356
315
  }
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
- });
316
+ if (start < text.length)
317
+ unfinished.push(text.slice(start));
367
318
  }
368
- return { authorities };
319
+ return unfinished.length === 0 ? read : null;
369
320
  }
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);
321
+ function endLine(entry) {
322
+ if (typeof entry !== 'object' || entry === null || !('end' in entry))
323
+ return false;
324
+ return entry.end === true && Object.keys(entry).length === 1;
385
325
  }
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
- };
326
+ function folderLine(entry) {
327
+ if (typeof entry !== 'object' || entry === null || !('folder' in entry))
328
+ return false;
329
+ return typeof entry.folder === 'string' && Object.keys(entry).length === 1;
417
330
  }
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
- };
331
+ export async function housePart(room, payload, mode) {
332
+ const read = await partRead(gunzipped(payload).getReader(), mode).catch(() => null);
333
+ if (read === null)
334
+ return { kind: 'transport-uncertainty' };
335
+ const { ended, ...scope } = read;
336
+ return { scope: { ...emptyScope(room), ...scope }, ended };
466
337
  }
467
338
  export function* bootstrapping(scope) {
468
339
  const contents = new Map();
@@ -480,6 +351,8 @@ export function* bootstrapping(scope) {
480
351
  answer.binaryFiles.set(file.path, file.binary);
481
352
  else if (content !== undefined)
482
353
  answer.documents.set(file.path, content);
354
+ else if (file.outline !== undefined)
355
+ answer.outlines.set(file.path, file.outline);
483
356
  if (file.revision !== undefined)
484
357
  revised(answer, file.path, file.revision);
485
358
  }
@@ -497,34 +370,3 @@ export function schemaOf(scope, schema) {
497
370
  ? null
498
371
  : { schema: content.content, version: file.version, revision: file.revision ?? null };
499
372
  }
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,20 @@
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
+ named: (entry: TrackedAuthority, room: ReadableStream<Uint8Array>, signal: AbortSignal | undefined) => Promise<BootstrapResult>;
19
+ };
20
+ //# 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;AAE1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AACnB,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;mBAkCjE,gBAAgB,QACjB,cAAc,CAAC,UAAU,CAAC,UACxB,WAAW,GAAG,SAAS,KAC9B,OAAO,CAAC,eAAe,CAAC;EAmB5B"}