@agentshouse/mdruntime-adapter 0.1.0-cedb8e57837a7 → 0.1.0-cf1ebfb67feeb

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 (70) hide show
  1. package/README.md +2 -2
  2. package/dist/actions.d.ts +4 -69
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +7 -357
  5. package/dist/adapter.d.ts.map +1 -1
  6. package/dist/adapter.js +204 -411
  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 -13
  14. package/dist/discovery.d.ts.map +1 -1
  15. package/dist/discovery.js +73 -53
  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 +719 -0
  20. package/dist/house-model.d.ts.map +1 -0
  21. package/dist/house-model.js +393 -0
  22. package/dist/index.d.ts +11 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +10 -1
  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 +14 -0
  29. package/dist/part.d.ts.map +1 -0
  30. package/dist/part.js +90 -0
  31. package/dist/read.d.ts +35 -59
  32. package/dist/read.d.ts.map +1 -1
  33. package/dist/read.js +178 -266
  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 +7 -0
  41. package/dist/room-types.d.ts.map +1 -0
  42. package/dist/room-types.js +123 -0
  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 +83 -193
  48. package/dist/stream.d.ts +13 -13
  49. package/dist/stream.d.ts.map +1 -1
  50. package/dist/stream.js +166 -411
  51. package/dist/transport.d.ts +54 -40
  52. package/dist/transport.d.ts.map +1 -1
  53. package/dist/transport.js +54 -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 +28 -39
  60. package/package.json +8 -4
  61. package/AGENTS.md +0 -304
  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/handed.d.ts +0 -15
  66. package/dist/handed.d.ts.map +0 -1
  67. package/dist/handed.js +0 -45
  68. package/dist/referrer.d.ts +0 -7
  69. package/dist/referrer.d.ts.map +0 -1
  70. package/dist/referrer.js +0 -35
package/dist/read.js CHANGED
@@ -1,5 +1,6 @@
1
- import { patching, ROW_WEIGHT, stepped, } from '@agentshouse/mdruntime';
2
- 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';
3
4
  const REVISION_FILE = /^fr_([0-9a-z]+)\.[0-9a-z]+\.[0-9a-z]$/u;
4
5
  function fileOf(revision) {
5
6
  return REVISION_FILE.exec(revision)?.[1];
@@ -7,11 +8,14 @@ function fileOf(revision) {
7
8
  export function answering() {
8
9
  return {
9
10
  documents: new Map(),
11
+ facts: new Map(),
10
12
  revisions: new Map(),
11
13
  fileIds: new Map(),
12
14
  changes: new Map(),
13
15
  binaryFiles: new Map(),
14
16
  removals: new Set(),
17
+ folders: new Set(),
18
+ folderRemovals: new Set(),
15
19
  };
16
20
  }
17
21
  export function revised(answer, path, revision) {
@@ -22,25 +26,45 @@ export function revised(answer, path, revision) {
22
26
  }
23
27
  export function forgotten(answer, path) {
24
28
  answer.documents.delete(path);
29
+ answer.facts.delete(path);
25
30
  answer.revisions.delete(path);
26
31
  answer.fileIds.delete(path);
27
32
  answer.changes.delete(path);
28
33
  answer.binaryFiles.delete(path);
29
34
  answer.removals.delete(path);
30
35
  }
31
- export function* answered(answer) {
32
- const removals = [];
33
- for (const path of answer.removals) {
34
- removals.push(path);
36
+ export function folded(answer, path, removed) {
37
+ if (removed) {
38
+ answer.folders.delete(path);
39
+ answer.folderRemovals.add(path);
40
+ }
41
+ else {
42
+ answer.folderRemovals.delete(path);
43
+ answer.folders.add(path);
44
+ }
45
+ }
46
+ function* pathsOf(paths) {
47
+ const list = [];
48
+ for (const path of paths) {
49
+ list.push(path);
35
50
  yield ROW_WEIGHT;
36
51
  }
52
+ return list;
53
+ }
54
+ export function* answered(answer) {
55
+ const removals = yield* pathsOf(answer.removals);
37
56
  return {
38
57
  documents: yield* patching({}, answer.documents),
58
+ facts: yield* patching({}, answer.facts),
39
59
  revisions: yield* patching({}, answer.revisions),
40
60
  ...(answer.fileIds.size === 0 ? {} : { fileIds: yield* patching({}, answer.fileIds) }),
41
61
  changes: yield* patching({}, answer.changes),
42
62
  binaryFiles: yield* patching({}, answer.binaryFiles),
43
63
  removals,
64
+ ...(answer.folders.size === 0 ? {} : { folders: yield* pathsOf(answer.folders) }),
65
+ ...(answer.folderRemovals.size === 0
66
+ ? {}
67
+ : { folderRemovals: yield* pathsOf(answer.folderRemovals) }),
44
68
  };
45
69
  }
46
70
  export function authorityRoot(handle) {
@@ -58,22 +82,39 @@ export function parseGrant(body) {
58
82
  const transfer = body.transfer;
59
83
  if (typeof transfer.url !== 'string')
60
84
  return null;
61
- if (transfer.method === 'GET')
62
- return { method: 'GET', url: transfer.url };
63
85
  if (transfer.method !== 'POST' || typeof transfer.operation !== 'string')
64
86
  return null;
65
- return { method: 'POST', operation: transfer.operation, url: transfer.url };
87
+ return { operation: transfer.operation, url: transfer.url };
88
+ }
89
+ export function parseFileAddress(body) {
90
+ if (typeof body !== 'object' || body === null)
91
+ return null;
92
+ const { download, name, sha256, media_type: mediaType } = body;
93
+ if (typeof download !== 'string' ||
94
+ typeof name !== 'string' ||
95
+ typeof sha256 !== 'string' ||
96
+ typeof mediaType !== 'string') {
97
+ return null;
98
+ }
99
+ return { url: download, name, sha256, mediaType };
66
100
  }
67
101
  function changeAuthor(value) {
68
102
  if (typeof value !== 'object' || value === null)
69
103
  return null;
70
- const { user, site, name } = value;
104
+ const { user, site, inbox, app, name } = value;
71
105
  if (typeof name !== 'string')
72
106
  return null;
73
- if (typeof user === 'string' && site === undefined)
107
+ const named = [user, site, inbox, app].filter((id) => id !== undefined);
108
+ if (named.length !== 1)
109
+ return null;
110
+ if (typeof user === 'string')
74
111
  return { kind: 'user', id: user, name };
75
- if (typeof site === 'string' && user === undefined)
112
+ if (typeof site === 'string')
76
113
  return { kind: 'site', id: site, name };
114
+ if (typeof inbox === 'string')
115
+ return { kind: 'inbox', id: inbox, name };
116
+ if (typeof app === 'string')
117
+ return { kind: 'app', id: app, name };
77
118
  return null;
78
119
  }
79
120
  export function headChange(held) {
@@ -90,19 +131,19 @@ function headed(head) {
90
131
  return head === undefined ? {} : { head };
91
132
  }
92
133
  export function binaryFileOf(held) {
93
- if (held.file === undefined)
134
+ if (held.media_type === undefined)
94
135
  return undefined;
95
- const { file, bytes, media_type: mediaType, sha256 } = held;
96
- if (typeof file !== 'string' ||
97
- typeof bytes !== 'number' ||
98
- typeof mediaType !== 'string' ||
99
- typeof sha256 !== 'string')
136
+ const { bytes, media_type: mediaType, sha256 } = held;
137
+ if (typeof bytes !== 'number' || typeof mediaType !== 'string' || typeof sha256 !== 'string')
100
138
  return null;
101
- return { fileRef: file, byteLength: bytes, mediaType, sha256 };
139
+ return { byteLength: bytes, mediaType, sha256 };
102
140
  }
103
141
  function binaried(binary) {
104
142
  return binary === undefined ? {} : { binary };
105
143
  }
144
+ export function carriedFacts(held) {
145
+ return held.facts === undefined ? {} : { facts: held.facts };
146
+ }
106
147
  function parseFile(value, mode) {
107
148
  if (typeof value !== 'object' || value === null)
108
149
  return null;
@@ -122,6 +163,7 @@ function parseFile(value, mode) {
122
163
  version: file.sha256,
123
164
  ...headed(head),
124
165
  ...binaried(binary),
166
+ ...carriedFacts(file),
125
167
  };
126
168
  }
127
169
  if (typeof file.revision !== 'string')
@@ -133,15 +175,32 @@ function parseFile(value, mode) {
133
175
  ...(typeof file.sha256 === 'string' ? { sha256: file.sha256 } : {}),
134
176
  ...headed(head),
135
177
  ...binaried(binary),
178
+ ...carriedFacts(file),
136
179
  };
137
180
  }
138
- function* parseScope(value, mode) {
181
+ function parseModels(value, mode) {
182
+ if (!Array.isArray(value))
183
+ return null;
184
+ const files = [];
185
+ const contents = [];
186
+ for (const entry of value) {
187
+ const file = parseFile(entry, mode);
188
+ const { content } = entry;
189
+ if (file === null || typeof content !== 'string')
190
+ return null;
191
+ files.push(file);
192
+ contents.push({ path: file.path, content });
193
+ }
194
+ return { files, contents };
195
+ }
196
+ function parseRoomHead(value, mode) {
139
197
  if (typeof value !== 'object' || value === null)
140
198
  return null;
141
199
  const held = value;
142
200
  if (typeof held.manifest !== 'object' || held.manifest === null)
143
201
  return null;
144
- if (!Array.isArray(held.contents))
202
+ const models = parseModels(held.models, mode);
203
+ if (models === null)
145
204
  return null;
146
205
  const manifest = held.manifest;
147
206
  if (manifest.scope !== 'room')
@@ -151,239 +210,115 @@ function* parseScope(value, mode) {
151
210
  return null;
152
211
  if (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)
153
212
  return null;
154
- if (!Array.isArray(manifest.files))
155
- return null;
156
- const files = [];
157
- for (const entry of manifest.files) {
158
- const file = parseFile(entry, mode);
159
- if (file === null)
160
- return null;
161
- files.push(file);
162
- yield ROW_WEIGHT;
163
- }
164
- const contents = [];
165
- for (const entry of held.contents) {
166
- if (typeof entry !== 'object' || entry === null)
167
- return null;
168
- const content = entry;
169
- if (typeof content.path !== 'string' || typeof content.content !== 'string')
170
- return null;
171
- contents.push({ path: content.path, content: content.content });
172
- yield ROW_WEIGHT;
173
- }
174
- return { anchor: manifest.anchor, ...at, files, contents };
175
- }
176
- function parseCut(value) {
177
- if (value === undefined)
178
- return undefined;
179
- if (typeof value !== 'object' || value === null)
180
- return null;
181
- const { position, log_epoch: logEpoch } = value;
182
- if (typeof position !== 'string' || typeof logEpoch !== 'string')
183
- return null;
184
- return { position, log_epoch: logEpoch };
213
+ return { anchor: manifest.anchor, ...at, models };
185
214
  }
186
- function parseCursor(value) {
187
- if (typeof value !== 'object' || value === null)
188
- return null;
189
- const { room, path, cut } = value;
190
- if (typeof room !== 'string' || (path !== null && typeof path !== 'string'))
191
- return null;
192
- const parsed = parseCut(cut);
193
- if (parsed === null)
194
- return null;
195
- return { room, path, ...(parsed === undefined ? {} : { cut: parsed }) };
196
- }
197
- export function* parseEnvelope(body) {
198
- if (typeof body !== 'object' || body === null)
199
- return null;
200
- if (!('scopes' in body) || !Array.isArray(body.scopes))
215
+ export async function roomHead(payload, mode) {
216
+ let text = '';
217
+ try {
218
+ for await (const chunk of gunzipped(payload))
219
+ text += chunk;
220
+ return text.endsWith('\n') && text.indexOf('\n') === text.length - 1
221
+ ? parseRoomHead(JSON.parse(text), mode)
222
+ : null;
223
+ }
224
+ catch {
201
225
  return null;
202
- const scopes = [];
203
- for (const entry of body.scopes) {
204
- const scope = yield* parseScope(entry, 'credential');
205
- if (scope === null)
206
- return null;
207
- scopes.push(scope);
208
226
  }
209
- if (!('next' in body) || body.next === undefined)
210
- return { scopes };
211
- const next = parseCursor(body.next);
212
- return next === null ? null : { scopes, next };
213
227
  }
214
- export function* parseSiteBootstrap(body) {
215
- return yield* parseScope(body, 'site');
228
+ export function manifested(room, pageToken, models) {
229
+ return {
230
+ kind: 'bootstrap',
231
+ roomVersion: roomVersion(room),
232
+ documents: {},
233
+ facts: {},
234
+ revisions: {},
235
+ changes: {},
236
+ binaryFiles: {},
237
+ pageToken,
238
+ ...(models === undefined ? {} : { models }),
239
+ };
216
240
  }
217
- export function siteBootstrapNext(body) {
218
- if (typeof body !== 'object' || body === null || !('next' in body))
219
- return null;
220
- return typeof body.next === 'string' && body.next.length > 0 ? body.next : null;
241
+ export function modelScope(room) {
242
+ return { ...emptyScope(room), files: room.models.files, contents: room.models.contents };
221
243
  }
222
- export function siteBootstrapOffset(body) {
223
- if (typeof body !== 'object' || body === null || !('offset' in body))
224
- return null;
225
- return Number.isSafeInteger(body.offset) && body.offset > 0
226
- ? body.offset
227
- : null;
244
+ export function emptyScope(room) {
245
+ return {
246
+ anchor: room.anchor,
247
+ position: room.position,
248
+ logEpoch: room.logEpoch,
249
+ files: [],
250
+ contents: [],
251
+ };
228
252
  }
229
- function parseChange(value, mode) {
230
- if (typeof value !== 'object' || value === null)
231
- return null;
232
- const held = value;
233
- if (typeof held.path !== 'string')
234
- return null;
235
- if (held.removed === true)
236
- return { path: held.path, removed: true };
237
- const head = headChange(held);
238
- const binary = binaryFileOf(held);
239
- if (head === null || binary === null)
240
- return null;
241
- if (binary !== undefined) {
242
- if (mode === 'credential' && typeof held.revision !== 'string')
243
- return null;
244
- const revision = typeof held.revision === 'string' ? held.revision : binary.sha256;
245
- return { path: held.path, binary, revision, version: revision, ...headed(head) };
253
+ function partLine(line, mode, read) {
254
+ if (read.ended)
255
+ return false;
256
+ let entry;
257
+ try {
258
+ entry = JSON.parse(line);
246
259
  }
247
- if (mode === 'site') {
248
- if (typeof held.content !== 'string' || typeof held.sha256 !== 'string')
249
- return null;
250
- return {
251
- path: held.path,
252
- content: held.content,
253
- revision: undefined,
254
- version: held.sha256,
255
- ...headed(head),
256
- };
260
+ catch {
261
+ return false;
257
262
  }
258
- if (typeof held.content === 'string' && typeof held.revision === 'string') {
259
- return {
260
- path: held.path,
261
- content: held.content,
262
- revision: held.revision,
263
- version: held.revision,
264
- ...headed(head),
265
- };
263
+ if (endLine(entry)) {
264
+ read.ended = true;
265
+ return true;
266
266
  }
267
- return null;
268
- }
269
- export function parseEnumeration(body, mode) {
270
- if (typeof body !== 'object' || body === null)
271
- return null;
272
- if (!('authorities' in body) || !Array.isArray(body.authorities))
273
- return null;
274
- const authorities = [];
275
- for (const entry of body.authorities) {
276
- if (typeof entry !== 'object' || entry === null)
277
- return null;
278
- const held = entry;
279
- const at = readPosition(held);
280
- if (typeof held.authority !== 'string' || at === null)
281
- return null;
282
- if (!Array.isArray(held.changes))
283
- return null;
284
- const changes = [];
285
- for (const change of held.changes) {
286
- const mapped = parseChange(change, mode);
287
- if (mapped === null)
267
+ if (folderLine(entry)) {
268
+ read.folders.push(entry.folder);
269
+ return true;
270
+ }
271
+ const file = parseFile(entry, mode);
272
+ if (file === null)
273
+ return false;
274
+ read.files.push(file);
275
+ const { content } = entry;
276
+ if (typeof content === 'string')
277
+ read.contents.push({ path: file.path, content });
278
+ else if (content !== undefined)
279
+ return false;
280
+ return true;
281
+ }
282
+ async function partRead(chunks, mode) {
283
+ const read = { files: [], contents: [], folders: [], ended: false };
284
+ const pace = paced();
285
+ const unfinished = [];
286
+ for (let chunk = await chunks.read(); chunk.done !== true; chunk = await chunks.read()) {
287
+ const text = chunk.value;
288
+ let start = 0;
289
+ for (let end = text.indexOf('\n'); end !== -1; end = text.indexOf('\n', start)) {
290
+ const piece = text.slice(start, end);
291
+ const line = unfinished.length === 0 ? piece : unfinished.splice(0).join('') + piece;
292
+ if (!partLine(line, mode, read)) {
293
+ await chunks.cancel();
288
294
  return null;
289
- changes.push(mapped);
295
+ }
296
+ start = end + 1;
297
+ const due = pace(line.length + ROW_WEIGHT);
298
+ if (due instanceof Promise)
299
+ await due;
290
300
  }
291
- const next = held.next === undefined ? undefined : readPage(held.next);
292
- if (next === null)
293
- return null;
294
- authorities.push({
295
- authority: held.authority,
296
- ...at,
297
- changes,
298
- ...(next === undefined ? {} : { next }),
299
- });
301
+ if (start < text.length)
302
+ unfinished.push(text.slice(start));
300
303
  }
301
- return { authorities };
304
+ return unfinished.length === 0 ? read : null;
302
305
  }
303
- function readPage(held) {
304
- if (typeof held !== 'object' || held === null)
305
- return null;
306
- const { after, through, read } = held;
307
- if (typeof after !== 'string' || !DECIMAL.test(after))
308
- return null;
309
- if (typeof through !== 'string' || !DECIMAL.test(through))
310
- return null;
311
- if (typeof read !== 'number' || !Number.isSafeInteger(read) || read < 0)
312
- return null;
313
- return { after, through, read };
306
+ function endLine(entry) {
307
+ if (typeof entry !== 'object' || entry === null || !('end' in entry))
308
+ return false;
309
+ return entry.end === true && Object.keys(entry).length === 1;
314
310
  }
315
- function advances(asked, next) {
316
- const moved = BigInt(next.through) - BigInt(asked.through);
317
- return moved > 0n || (moved === 0n && next.after === asked.after && next.read > asked.read);
311
+ function folderLine(entry) {
312
+ if (typeof entry !== 'object' || entry === null || !('folder' in entry))
313
+ return false;
314
+ return typeof entry.folder === 'string' && Object.keys(entry).length === 1;
318
315
  }
319
- export async function wholeView(first, more) {
320
- const changes = new Map(first.changes.map((change) => [change.path, change]));
321
- let view = first;
322
- while (view.next !== undefined) {
323
- const asked = view.next;
324
- const page = await more(asked);
325
- if ('kind' in page)
326
- return page;
327
- if (page.position !== asked.through ||
328
- page.logEpoch !== first.logEpoch ||
329
- (page.next !== undefined && !advances(asked, page.next))) {
330
- return { kind: 'transport-uncertainty' };
331
- }
332
- for (const change of page.changes) {
333
- changes.delete(change.path);
334
- changes.set(change.path, change);
335
- }
336
- view = page;
337
- }
338
- return {
339
- authority: first.authority,
340
- position: view.position,
341
- logEpoch: first.logEpoch,
342
- changes: [...changes.values()],
343
- };
344
- }
345
- export function* advancedScope(scope, view) {
346
- const files = new Map();
347
- for (const file of scope.files) {
348
- files.set(file.path, file);
349
- yield ROW_WEIGHT;
350
- }
351
- const contents = new Map();
352
- for (const entry of scope.contents) {
353
- contents.set(entry.path, entry.content);
354
- yield ROW_WEIGHT;
355
- }
356
- for (const change of view.changes) {
357
- files.delete(change.path);
358
- contents.delete(change.path);
359
- yield ROW_WEIGHT;
360
- if ('removed' in change)
361
- continue;
362
- files.set(change.path, {
363
- path: change.path,
364
- revision: change.revision,
365
- version: change.version,
366
- ...headed(change.head),
367
- ...('binary' in change ? { binary: change.binary } : {}),
368
- });
369
- if ('content' in change)
370
- contents.set(change.path, change.content);
371
- }
372
- const listed = [];
373
- for (const [path, content] of contents) {
374
- listed.push({ path, content });
375
- yield ROW_WEIGHT;
376
- }
377
- return {
378
- ...scope,
379
- position: view.position,
380
- logEpoch: view.logEpoch,
381
- files: [...files.values()],
382
- contents: listed,
383
- };
384
- }
385
- export function matchesScope(scope, tracked) {
386
- return scope.anchor === tracked.authority;
316
+ export async function housePart(room, payload, mode) {
317
+ const read = await partRead(gunzipped(payload).getReader(), mode).catch(() => null);
318
+ if (read === null)
319
+ return { kind: 'transport-uncertainty' };
320
+ const { ended, ...scope } = read;
321
+ return { scope: { ...emptyScope(room), ...scope }, ended };
387
322
  }
388
323
  export function* bootstrapping(scope) {
389
324
  const contents = new Map();
@@ -401,10 +336,14 @@ export function* bootstrapping(scope) {
401
336
  answer.binaryFiles.set(file.path, file.binary);
402
337
  else if (content !== undefined)
403
338
  answer.documents.set(file.path, content);
339
+ if (file.binary === undefined && file.facts !== undefined)
340
+ answer.facts.set(file.path, file.facts);
404
341
  if (file.revision !== undefined)
405
342
  revised(answer, file.path, file.revision);
406
343
  }
407
- const { removals: _removals, ...page } = yield* answered(answer);
344
+ for (const folder of scope.folders ?? [])
345
+ folded(answer, folder, false);
346
+ const { removals: _removals, folderRemovals: _folderRemovals, ...page } = yield* answered(answer);
408
347
  return { kind: 'bootstrap', roomVersion: roomVersion(scope), ...page };
409
348
  }
410
349
  export function schemaOf(scope, schema) {
@@ -416,30 +355,3 @@ export function schemaOf(scope, schema) {
416
355
  ? null
417
356
  : { schema: content.content, version: file.version, revision: file.revision ?? null };
418
357
  }
419
- export function viewOf(enumeration, tracked) {
420
- return enumeration.authorities.find((entry) => entry.authority === tracked.authority);
421
- }
422
- function* refreshing(view, fromRoomVersion) {
423
- if (roomVersion(view) === fromRoomVersion)
424
- return { kind: 'still-current' };
425
- const answer = answering();
426
- for (const change of view.changes) {
427
- yield ROW_WEIGHT;
428
- if ('removed' in change) {
429
- answer.removals.add(change.path);
430
- continue;
431
- }
432
- if ('content' in change)
433
- answer.documents.set(change.path, change.content);
434
- else
435
- answer.binaryFiles.set(change.path, change.binary);
436
- if (change.head !== undefined)
437
- answer.changes.set(change.path, change.head);
438
- if (change.revision !== undefined)
439
- revised(answer, change.path, change.revision);
440
- }
441
- return { kind: 'net-advancement', roomVersion: roomVersion(view), ...(yield* answered(answer)) };
442
- }
443
- export async function refreshFrom(view, fromRoomVersion) {
444
- return stepped(refreshing(view, fromRoomVersion));
445
- }
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"}