@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.
- package/README.md +2 -2
- package/dist/actions.d.ts +4 -73
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +7 -316
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +148 -324
- 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 +21 -12
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +73 -51
- package/dist/history.d.ts +12 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +92 -0
- package/dist/house-model.d.ts +911 -0
- package/dist/house-model.d.ts.map +1 -0
- package/dist/house-model.js +496 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -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 +12 -11
- package/dist/part.d.ts.map +1 -1
- package/dist/part.js +66 -56
- package/dist/read.d.ts +19 -56
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +140 -298
- 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 +20 -0
- package/dist/room-stream.d.ts.map +1 -0
- package/dist/room-stream.js +78 -0
- package/dist/room-types.d.ts +4 -3
- package/dist/room-types.d.ts.map +1 -1
- package/dist/room-types.js +66 -7
- package/dist/search.d.ts +5 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +47 -0
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +88 -176
- package/dist/stream.d.ts +13 -14
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +169 -426
- package/dist/transport.d.ts +48 -36
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +54 -12
- 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 +19 -32
- package/package.json +8 -4
- package/AGENTS.md +0 -312
- package/dist/gather.d.ts +0 -4
- package/dist/gather.d.ts.map +0 -1
- package/dist/gather.js +0 -35
- package/dist/referrer.d.ts +0 -9
- package/dist/referrer.d.ts.map +0 -1
- package/dist/referrer.js +0 -41
package/dist/read.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { 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) {
|
|
@@ -126,19 +131,34 @@ function headed(head) {
|
|
|
126
131
|
return head === undefined ? {} : { head };
|
|
127
132
|
}
|
|
128
133
|
export function binaryFileOf(held) {
|
|
129
|
-
if (held.
|
|
134
|
+
if (held.media_type === undefined)
|
|
130
135
|
return undefined;
|
|
131
|
-
const {
|
|
132
|
-
if (typeof
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
219
|
-
return
|
|
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
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
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 (
|
|
308
|
-
|
|
309
|
-
|
|
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 (
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
if (
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
const
|
|
348
|
-
if (
|
|
349
|
-
|
|
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
|
-
|
|
310
|
+
}
|
|
311
|
+
start = end + 1;
|
|
312
|
+
const due = pace(line.length + ROW_WEIGHT);
|
|
313
|
+
if (due instanceof Promise)
|
|
314
|
+
await due;
|
|
356
315
|
}
|
|
357
|
-
|
|
358
|
-
|
|
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
|
|
319
|
+
return unfinished.length === 0 ? read : null;
|
|
369
320
|
}
|
|
370
|
-
function
|
|
371
|
-
if (typeof
|
|
372
|
-
return
|
|
373
|
-
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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
|
|
419
|
-
const
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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
|
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,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"}
|