@agentshouse/mdruntime-adapter 0.1.0-cd0511bd2d033 → 0.1.0-cd0b0339c1003
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 +1 -1
- package/dist/actions.d.ts +2 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +10 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +68 -76
- package/dist/chunks.d.ts +38 -0
- package/dist/chunks.d.ts.map +1 -0
- package/dist/chunks.js +247 -0
- package/dist/discovery.d.ts +1 -2
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +4 -5
- package/dist/history.js +1 -1
- package/dist/house-model.d.ts +70 -107
- package/dist/house-model.d.ts.map +1 -1
- package/dist/house-model.js +59 -56
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/model.d.ts +5 -7
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +30 -18
- package/dist/read.d.ts +11 -9
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +36 -144
- package/dist/room-types.d.ts +0 -2
- package/dist/room-types.d.ts.map +1 -1
- package/dist/room-types.js +2 -7
- package/dist/search.js +1 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +31 -41
- package/dist/space-schema.d.ts +7 -0
- package/dist/space-schema.d.ts.map +1 -0
- package/dist/space-schema.js +18 -0
- package/dist/stream.d.ts +6 -4
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +86 -16
- package/dist/transport.d.ts +5 -8
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +12 -12
- package/package.json +2 -2
- package/dist/part.d.ts +0 -14
- package/dist/part.d.ts.map +0 -1
- package/dist/part.js +0 -90
- package/dist/room-stream.d.ts +0 -19
- package/dist/room-stream.d.ts.map +0 -1
- package/dist/room-stream.js +0 -57
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ host.attach(port, 'my-app');
|
|
|
25
25
|
|
|
26
26
|
App code never imports this package; it reaches the Runtime only through the
|
|
27
27
|
client its host hands it. The rules an App's agent follows are the `apps/` pages
|
|
28
|
-
of House's Guide, which House's `
|
|
28
|
+
of House's Guide, which House's `guide/open` opens.
|
|
29
29
|
|
|
30
30
|
## License
|
|
31
31
|
|
package/dist/actions.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { ActionDeclaration, ActionRequest, ActionResult } from '@agentshouse/mdruntime';
|
|
2
2
|
import type { HouseDoorAnswer, HouseTransport } from './transport.js';
|
|
3
3
|
export type HouseActDoor = Pick<HouseTransport, 'door'>;
|
|
4
|
+
export declare const HOUSE_UNKEPT_READS: readonly string[];
|
|
5
|
+
export declare const HOUSE_LEADING_READS: readonly string[];
|
|
4
6
|
export declare function declaredActions(routes: readonly string[]): readonly ActionDeclaration[];
|
|
5
7
|
export declare function houseAction(transport: HouseActDoor, request: ActionRequest): Promise<ActionResult>;
|
|
6
8
|
export declare function actionOutcome(answer: HouseDoorAnswer, name: string, input: unknown): ActionResult;
|
package/dist/actions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE7F,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAExD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,iBAAiB,EAAE,CAEvF;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAIvB;AAwBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,CAUjG"}
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE7F,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAExD,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAG/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAKhD,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,iBAAiB,EAAE,CAEvF;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAIvB;AAwBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,CAUjG"}
|
package/dist/actions.js
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { doorRefusal } from './refusal.js';
|
|
2
|
+
export const HOUSE_UNKEPT_READS = [
|
|
3
|
+
'account/security/read',
|
|
4
|
+
'clients/last-use/list',
|
|
5
|
+
];
|
|
6
|
+
export const HOUSE_LEADING_READS = [
|
|
7
|
+
'rooms/list',
|
|
8
|
+
'apps/list',
|
|
9
|
+
'sites/list',
|
|
10
|
+
'rooms/members/list',
|
|
11
|
+
];
|
|
2
12
|
export function declaredActions(routes) {
|
|
3
13
|
return routes.map((name) => ({ name, inputShape: {}, resultKind: 'house', room: 'room_ref' }));
|
|
4
14
|
}
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,OAAO,EAIP,aAAa,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,OAAO,EAIP,aAAa,EAed,MAAM,wBAAwB,CAAC;AAyBhC,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAoBxB,MAAM,MAAM,yBAAyB,GACjC;IACE,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAoBrD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAkbpF"}
|
package/dist/adapter.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { stepped } from '@agentshouse/mdruntime';
|
|
2
2
|
import { capabilities, discoveredRoom, mapDiscovery, parseAuthorityChange, parseDiscovery, trackedFrom, } from './discovery.js';
|
|
3
3
|
import { createSiteAdapter } from './site.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { parseFileAddress, parseGrant } from './read.js';
|
|
5
|
+
import { chunkedHead, chunkLister, chunkPart } from './chunks.js';
|
|
6
|
+
import { spaceSchemas } from './space-schema.js';
|
|
7
7
|
import { finishedUpload, houseUpload } from './upload.js';
|
|
8
|
-
import { houseAction } from './actions.js';
|
|
8
|
+
import { houseAction, HOUSE_LEADING_READS, HOUSE_UNKEPT_READS } from './actions.js';
|
|
9
9
|
import { houseSearch } from './search.js';
|
|
10
10
|
import { classifyDoor, doorRefusal } from './refusal.js';
|
|
11
11
|
import { houseNotifications, } from './stream.js';
|
|
@@ -13,7 +13,7 @@ import { houseDoorRoute, } from './transport.js';
|
|
|
13
13
|
import { batchPaths, deltaBody, deltaBytes, deltaDigest, historyOutcome, houseChanges, houseMove, mutationOutcome, operationHead, rejectedMapping, revisionBody, uploadable, } from './write.js';
|
|
14
14
|
import { HOUSE_TYPED_PATHS } from './house-model.js';
|
|
15
15
|
import { HOUSE_NAMEABLE_ROOM_TYPES, HOUSE_ROOM_TYPES } from './room-types.js';
|
|
16
|
-
import { followsVersion,
|
|
16
|
+
import { followsVersion, reachedVersion, roomVersion } from './version.js';
|
|
17
17
|
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
18
18
|
const UNCERTAIN_READ = { kind: 'transport-uncertainty' };
|
|
19
19
|
const OCTET_STREAM = 'application/octet-stream';
|
|
@@ -21,43 +21,20 @@ const EXPIRED_ADDRESS = 403;
|
|
|
21
21
|
function lapsedGrant(outcome) {
|
|
22
22
|
return outcome.kind === 'rejected' && outcome.code === 'upload_unavailable';
|
|
23
23
|
}
|
|
24
|
-
async function heldFiles(authority, held, bound) {
|
|
25
|
-
const listed = await held.files(null, bound + 1);
|
|
26
|
-
const files = listed.slice(0, bound);
|
|
27
|
-
const through = listed.length > bound ? (files.at(-1)?.path ?? null) : null;
|
|
28
|
-
return files.length === 0 ? null : { room: authority, through, files };
|
|
29
|
-
}
|
|
30
|
-
async function reused(scope, held) {
|
|
31
|
-
const sent = new Set(scope.contents.map((entry) => entry.path));
|
|
32
|
-
const contents = [...scope.contents];
|
|
33
|
-
const asked = scope.files.filter((file) => file.binary === undefined && !sent.has(file.path));
|
|
34
|
-
if (asked.length === 0)
|
|
35
|
-
return scope;
|
|
36
|
-
if (held === undefined)
|
|
37
|
-
return null;
|
|
38
|
-
const kept = await held.contents(asked.map(({ path }) => path));
|
|
39
|
-
for (const file of asked) {
|
|
40
|
-
const found = kept.get(file.path);
|
|
41
|
-
if (found === undefined ||
|
|
42
|
-
found.revision !== file.revision ||
|
|
43
|
-
(await sha256Hex(found.content)) !== file.sha256) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
contents.push({ path: file.path, content: found.content });
|
|
47
|
-
}
|
|
48
|
-
return { ...scope, contents };
|
|
49
|
-
}
|
|
50
24
|
export function createAgentsHouseAdapter(options) {
|
|
51
25
|
if ('site' in options)
|
|
52
26
|
return createSiteAdapter(options.site, options.snapshot === true);
|
|
53
27
|
const transport = options.transport;
|
|
28
|
+
const spaces = spaceSchemas();
|
|
54
29
|
const notifications = houseNotifications(transport, 'credential', {
|
|
55
30
|
opened: async (frame) => (frame === null ? null : opened(frame)),
|
|
56
31
|
changed,
|
|
57
|
-
|
|
32
|
+
expired: (authorities) => lister.askAll(authorities.flatMap((authority) => [...tracked.values()].filter((entry) => entry.authority === authority))),
|
|
33
|
+
}, spaces);
|
|
58
34
|
const tracked = new Map();
|
|
59
|
-
const
|
|
60
|
-
const
|
|
35
|
+
const lister = chunkLister(transport, () => declared().max_prefixes);
|
|
36
|
+
const chunked = new Map();
|
|
37
|
+
const renewals = new WeakMap();
|
|
61
38
|
let bounds;
|
|
62
39
|
function declared() {
|
|
63
40
|
if (bounds === undefined)
|
|
@@ -70,6 +47,7 @@ export function createAgentsHouseAdapter(options) {
|
|
|
70
47
|
return null;
|
|
71
48
|
bounds = document.bounds;
|
|
72
49
|
tracked.clear();
|
|
50
|
+
lister.forget();
|
|
73
51
|
for (const entry of trackedFrom(document))
|
|
74
52
|
tracked.set(entry.locator, entry);
|
|
75
53
|
notifications.track([...tracked.values()]);
|
|
@@ -94,42 +72,52 @@ export function createAgentsHouseAdapter(options) {
|
|
|
94
72
|
member: change.member,
|
|
95
73
|
};
|
|
96
74
|
}
|
|
97
|
-
async function
|
|
98
|
-
const
|
|
99
|
-
if ('kind' in
|
|
100
|
-
return
|
|
101
|
-
const
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
return {
|
|
107
|
-
...(await stepped(bootstrapping(scope))),
|
|
108
|
-
...(part.models === undefined ? {} : { models: part.models }),
|
|
109
|
-
...(part.pageToken === undefined ? {} : { pageToken: part.pageToken }),
|
|
110
|
-
bytes: part.bytes,
|
|
111
|
-
};
|
|
75
|
+
async function listedRoom(entry) {
|
|
76
|
+
const listed = await lister.list(entry);
|
|
77
|
+
if ('kind' in listed)
|
|
78
|
+
return listed;
|
|
79
|
+
const head = await chunkedHead(listed, entry, spaces);
|
|
80
|
+
if (head.kind === 'bootstrap')
|
|
81
|
+
chunked.set(entry.locator, listed);
|
|
82
|
+
return head;
|
|
112
83
|
}
|
|
113
|
-
async function
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return
|
|
84
|
+
async function chunkRead(entry, id) {
|
|
85
|
+
const room = chunked.get(entry.locator);
|
|
86
|
+
const address = room?.chunks.get(id);
|
|
87
|
+
if (room === undefined || address === undefined)
|
|
88
|
+
return null;
|
|
89
|
+
const read = await transport.download(address.url);
|
|
90
|
+
if (read.status !== EXPIRED_ADDRESS)
|
|
91
|
+
return { room, read };
|
|
92
|
+
const renewed = await renewal(entry, room);
|
|
93
|
+
if ('kind' in renewed || !renewed.chunks.has(id))
|
|
94
|
+
return null;
|
|
95
|
+
chunked.set(entry.locator, renewed);
|
|
96
|
+
return { room: renewed, read: await transport.download(renewed.chunks.get(id).url) };
|
|
126
97
|
}
|
|
127
|
-
function
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
98
|
+
function renewal(entry, stale) {
|
|
99
|
+
const held = renewals.get(stale);
|
|
100
|
+
if (held !== undefined)
|
|
101
|
+
return held;
|
|
102
|
+
const renewed = lister.renew(entry, [...chunked.keys()].flatMap((locator) => tracked.get(locator) ?? []));
|
|
103
|
+
renewals.set(stale, renewed);
|
|
104
|
+
return renewed;
|
|
105
|
+
}
|
|
106
|
+
function hold(rooms) {
|
|
107
|
+
for (const room of rooms) {
|
|
108
|
+
const listed = chunked.get(room.locator);
|
|
109
|
+
if (listed !== undefined &&
|
|
110
|
+
room.roomVersion !== null &&
|
|
111
|
+
reachedVersion(room.roomVersion, roomVersion(listed), listed.logEpoch))
|
|
112
|
+
chunked.delete(room.locator);
|
|
113
|
+
}
|
|
114
|
+
notifications.send(rooms);
|
|
115
|
+
}
|
|
116
|
+
async function chunkPage(entry, id, arriving) {
|
|
117
|
+
const fetched = await chunkRead(entry, id);
|
|
118
|
+
if (fetched === null || fetched.read.status !== 200)
|
|
119
|
+
return UNCERTAIN_READ;
|
|
120
|
+
return chunkPart(fetched.read.body, fetched.room, id, arriving);
|
|
133
121
|
}
|
|
134
122
|
function authorityFor(locator) {
|
|
135
123
|
return tracked.get(locator);
|
|
@@ -154,7 +142,7 @@ export function createAgentsHouseAdapter(options) {
|
|
|
154
142
|
if (handed !== undefined && handed.sha256 === sha256) {
|
|
155
143
|
return { body: { ...head, paths, upload: handed, runtime: notifications.runtime } };
|
|
156
144
|
}
|
|
157
|
-
const minted = await transport.door(houseDoorRoute('batch-upload'), {
|
|
145
|
+
const minted = await transport.door(houseDoorRoute('files/batch-upload'), {
|
|
158
146
|
...head,
|
|
159
147
|
paths,
|
|
160
148
|
bytes,
|
|
@@ -207,11 +195,13 @@ export function createAgentsHouseAdapter(options) {
|
|
|
207
195
|
: { body: inline };
|
|
208
196
|
if ('outcome' in prepared)
|
|
209
197
|
return prepared.outcome;
|
|
210
|
-
const answer = await transport.door(houseDoorRoute('batch'), prepared.body);
|
|
198
|
+
const answer = await transport.door(houseDoorRoute('files/batch'), prepared.body);
|
|
211
199
|
const stagedFiles = await staged(answer, request);
|
|
212
200
|
if (stagedFiles === false)
|
|
213
201
|
return UNCERTAIN;
|
|
214
|
-
const settled = stagedFiles === null
|
|
202
|
+
const settled = stagedFiles === null
|
|
203
|
+
? answer
|
|
204
|
+
: await transport.door(houseDoorRoute('files/batch'), prepared.body);
|
|
215
205
|
if (stagedFiles === true && (await staged(settled, request)) !== null)
|
|
216
206
|
return UNCERTAIN;
|
|
217
207
|
return stepped(mutationOutcome(settled.status, settled.body, entry.locator, entry.handle, into === undefined
|
|
@@ -279,7 +269,7 @@ export function createAgentsHouseAdapter(options) {
|
|
|
279
269
|
const entry = authorityFor(request.locator);
|
|
280
270
|
if (entry === undefined)
|
|
281
271
|
return null;
|
|
282
|
-
return () => transport.door(houseDoorRoute('files/
|
|
272
|
+
return () => transport.door(houseDoorRoute('files/read'), {
|
|
283
273
|
room_ref: entry.authority,
|
|
284
274
|
path: request.path,
|
|
285
275
|
revision: request.revision,
|
|
@@ -289,6 +279,8 @@ export function createAgentsHouseAdapter(options) {
|
|
|
289
279
|
roomTypes: HOUSE_ROOM_TYPES,
|
|
290
280
|
nameableRoomTypes: HOUSE_NAMEABLE_ROOM_TYPES,
|
|
291
281
|
typedPaths: HOUSE_TYPED_PATHS,
|
|
282
|
+
unkeptReads: HOUSE_UNKEPT_READS,
|
|
283
|
+
leadingReads: HOUSE_LEADING_READS,
|
|
292
284
|
async authorize() {
|
|
293
285
|
return options.authorize();
|
|
294
286
|
},
|
|
@@ -297,8 +289,8 @@ export function createAgentsHouseAdapter(options) {
|
|
|
297
289
|
if (entry === undefined)
|
|
298
290
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
299
291
|
return request.pageToken === undefined
|
|
300
|
-
?
|
|
301
|
-
:
|
|
292
|
+
? listedRoom(entry)
|
|
293
|
+
: chunkPage(entry, request.pageToken, request.arriving);
|
|
302
294
|
},
|
|
303
295
|
async mutate(_authorization, request, keep) {
|
|
304
296
|
const entry = authorityFor(request.locator);
|
|
@@ -329,7 +321,7 @@ export function createAgentsHouseAdapter(options) {
|
|
|
329
321
|
const entry = authorityFor(request.locator);
|
|
330
322
|
if (entry === undefined)
|
|
331
323
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
332
|
-
const answer = await transport.door(houseDoorRoute('revisions'), revisionBody({
|
|
324
|
+
const answer = await transport.door(houseDoorRoute('files/revisions/list'), revisionBody({
|
|
333
325
|
path: request.path,
|
|
334
326
|
handle: entry.handle,
|
|
335
327
|
...(request.revision === undefined ? {} : { revision: request.revision }),
|
|
@@ -394,7 +386,7 @@ export function createAgentsHouseAdapter(options) {
|
|
|
394
386
|
return houseSearch(transport, [...tracked.values()], request);
|
|
395
387
|
},
|
|
396
388
|
roomStream: {
|
|
397
|
-
hold
|
|
389
|
+
hold,
|
|
398
390
|
observe: notifications.observe,
|
|
399
391
|
},
|
|
400
392
|
conversations: notifications.conversations,
|
package/dist/chunks.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type AdapterFailure, type BootstrapPart, type BootstrapResult } from '@agentshouse/mdruntime';
|
|
2
|
+
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
+
import { type HouseModels, type HouseScope } from './read.js';
|
|
4
|
+
import type { SpaceSchemas } from './space-schema.js';
|
|
5
|
+
import { type HouseDoor, type HouseMode } from './transport.js';
|
|
6
|
+
import { type LogPosition } from './version.js';
|
|
7
|
+
export type ChunkAddress = {
|
|
8
|
+
readonly url: string;
|
|
9
|
+
readonly bytes: number;
|
|
10
|
+
};
|
|
11
|
+
export type ChunkedRoom = LogPosition & {
|
|
12
|
+
readonly anchor: string;
|
|
13
|
+
readonly mode: HouseMode;
|
|
14
|
+
readonly chunks: ReadonlyMap<string, ChunkAddress>;
|
|
15
|
+
readonly parts: readonly BootstrapPart[];
|
|
16
|
+
readonly names: ReadonlyMap<string, string>;
|
|
17
|
+
readonly models: HouseModels;
|
|
18
|
+
};
|
|
19
|
+
export type Listed = ChunkedRoom | {
|
|
20
|
+
readonly kind: 'not-ready';
|
|
21
|
+
} | AdapterFailure;
|
|
22
|
+
type Answered = {
|
|
23
|
+
readonly status: number;
|
|
24
|
+
readonly body: unknown;
|
|
25
|
+
};
|
|
26
|
+
export declare function partId(logEpoch: string, hash: string): string;
|
|
27
|
+
export declare function siteChunkList(answer: Answered, locator: string): Listed;
|
|
28
|
+
export declare function chunkedHead(listed: ChunkedRoom, entry: TrackedAuthority, spaces: SpaceSchemas): Promise<BootstrapResult>;
|
|
29
|
+
export declare function chunkPart(body: ReadableStream<Uint8Array> | null, room: ChunkedRoom, id: string, arriving: ((bytes: number) => void) | undefined): Promise<BootstrapResult>;
|
|
30
|
+
export declare function chunkLister(transport: HouseDoor, most: () => number): {
|
|
31
|
+
askAll: (entries: readonly TrackedAuthority[]) => void;
|
|
32
|
+
list: (entry: TrackedAuthority) => Promise<Listed>;
|
|
33
|
+
renew(entry: TrackedAuthority, installing: readonly TrackedAuthority[]): Promise<Listed>;
|
|
34
|
+
forget(): void;
|
|
35
|
+
};
|
|
36
|
+
export declare function chunkScope(body: ReadableStream<Uint8Array>, room: ChunkedRoom, arriving: ((bytes: number) => void) | undefined): Promise<HouseScope | null>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=chunks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunks.d.ts","sourceRoot":"","sources":["../src/chunks.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3E,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG,cAAc,CAAC;AAEnF,KAAK,QAAQ,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAoCpE,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AA4BD,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,eAAe,CAAC,CAuB1B;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,EACvC,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC9C,OAAO,CAAC,eAAe,CAAC,CAM1B;AAgBD,wBAAgB,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,MAAM;sBAwCzC,SAAS,gBAAgB,EAAE;kBAU/B,gBAAgB,KAAG,OAAO,CAAC,MAAM,CAAC;iBASxC,gBAAgB,cAAc,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;;EAc3F;AAuCD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC9C,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgC5B"}
|
package/dist/chunks.js
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { paced, ROW_WEIGHT, stepped, } from '@agentshouse/mdruntime';
|
|
2
|
+
import { manifestedModels } from './model.js';
|
|
3
|
+
import { authorityRoot, bootstrapping, parseFile, } from './read.js';
|
|
4
|
+
import { classifyDoor } from './refusal.js';
|
|
5
|
+
import { houseDoorRoute } from './transport.js';
|
|
6
|
+
import { readPosition, roomVersion } from './version.js';
|
|
7
|
+
function authorKey(author) {
|
|
8
|
+
for (const kind of ['user', 'site', 'inbox']) {
|
|
9
|
+
if (typeof author[kind] === 'string')
|
|
10
|
+
return `${kind}:${author[kind]}`;
|
|
11
|
+
}
|
|
12
|
+
const { app, release, function: named } = author;
|
|
13
|
+
return typeof app === 'string' && typeof release === 'string' && typeof named === 'string'
|
|
14
|
+
? `app:${app}:${release}:${named}`
|
|
15
|
+
: null;
|
|
16
|
+
}
|
|
17
|
+
function namesOf(authors) {
|
|
18
|
+
if (!Array.isArray(authors))
|
|
19
|
+
return null;
|
|
20
|
+
const names = new Map();
|
|
21
|
+
for (const author of authors) {
|
|
22
|
+
const key = typeof author === 'object' && author !== null ? authorKey(author) : null;
|
|
23
|
+
if (key === null || typeof author.name !== 'string')
|
|
24
|
+
return null;
|
|
25
|
+
names.set(key, author.name);
|
|
26
|
+
}
|
|
27
|
+
return names;
|
|
28
|
+
}
|
|
29
|
+
function modelsOf(models, mode) {
|
|
30
|
+
if (!Array.isArray(models))
|
|
31
|
+
return null;
|
|
32
|
+
const files = [];
|
|
33
|
+
const contents = [];
|
|
34
|
+
for (const entry of models) {
|
|
35
|
+
const file = parseFile(entry, mode);
|
|
36
|
+
if (file === null || typeof entry.content !== 'string')
|
|
37
|
+
return null;
|
|
38
|
+
files.push(file);
|
|
39
|
+
contents.push({ path: file.path, content: entry.content });
|
|
40
|
+
}
|
|
41
|
+
return { files, contents };
|
|
42
|
+
}
|
|
43
|
+
export function partId(logEpoch, hash) {
|
|
44
|
+
return `${logEpoch}:${hash}`;
|
|
45
|
+
}
|
|
46
|
+
function chunkedRoom(room, mode) {
|
|
47
|
+
const at = readPosition(room);
|
|
48
|
+
const names = mode === 'site' ? new Map() : namesOf(room.authors);
|
|
49
|
+
const models = modelsOf(room.models, mode);
|
|
50
|
+
if (at === null || names === null || models === null || !Array.isArray(room.chunks))
|
|
51
|
+
return null;
|
|
52
|
+
const chunks = new Map();
|
|
53
|
+
const parts = [];
|
|
54
|
+
for (const chunk of room.chunks) {
|
|
55
|
+
const { hash, bytes, download } = chunk;
|
|
56
|
+
if (typeof hash !== 'string' || typeof bytes !== 'number' || typeof download !== 'string')
|
|
57
|
+
return null;
|
|
58
|
+
const id = partId(at.logEpoch, hash);
|
|
59
|
+
chunks.set(id, { url: download, bytes });
|
|
60
|
+
parts.push({ id, bytes });
|
|
61
|
+
}
|
|
62
|
+
return { anchor: room.room_ref, ...at, mode, chunks, parts, names, models };
|
|
63
|
+
}
|
|
64
|
+
function listedRoom(room, mode) {
|
|
65
|
+
if (typeof room !== 'object' || room === null)
|
|
66
|
+
return null;
|
|
67
|
+
const held = room;
|
|
68
|
+
if (typeof held.room_ref !== 'string')
|
|
69
|
+
return null;
|
|
70
|
+
if (held.ready === false)
|
|
71
|
+
return { kind: 'not-ready' };
|
|
72
|
+
return held.ready === true ? chunkedRoom(held, mode) : null;
|
|
73
|
+
}
|
|
74
|
+
export function siteChunkList(answer, locator) {
|
|
75
|
+
const failure = classifyDoor(answer.status, answer.body, locator);
|
|
76
|
+
if (failure !== null)
|
|
77
|
+
return failure;
|
|
78
|
+
return listedRoom(answer.body, 'site') ?? { kind: 'transport-uncertainty' };
|
|
79
|
+
}
|
|
80
|
+
export async function chunkedHead(listed, entry, spaces) {
|
|
81
|
+
if (listed.anchor !== entry.authority)
|
|
82
|
+
return { kind: 'transport-uncertainty' };
|
|
83
|
+
const models = await manifestedModels({
|
|
84
|
+
anchor: listed.anchor,
|
|
85
|
+
position: listed.position,
|
|
86
|
+
logEpoch: listed.logEpoch,
|
|
87
|
+
models: listed.models,
|
|
88
|
+
}, entry, spaces);
|
|
89
|
+
return {
|
|
90
|
+
kind: 'bootstrap',
|
|
91
|
+
roomVersion: roomVersion(listed),
|
|
92
|
+
documents: {},
|
|
93
|
+
facts: {},
|
|
94
|
+
revisions: {},
|
|
95
|
+
changes: {},
|
|
96
|
+
binaryFiles: {},
|
|
97
|
+
parts: listed.parts,
|
|
98
|
+
...(models === undefined ? {} : { models }),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export async function chunkPart(body, room, id, arriving) {
|
|
102
|
+
const address = room.chunks.get(id);
|
|
103
|
+
if (body === null || address === undefined)
|
|
104
|
+
return { kind: 'transport-uncertainty' };
|
|
105
|
+
const scope = await chunkScope(body, room, arriving).catch(() => null);
|
|
106
|
+
if (scope === null)
|
|
107
|
+
return { kind: 'transport-uncertainty' };
|
|
108
|
+
return { ...(await stepped(bootstrapping(scope))), bytes: address.bytes };
|
|
109
|
+
}
|
|
110
|
+
function listedRooms(answer) {
|
|
111
|
+
const rooms = answer.body?.rooms;
|
|
112
|
+
if (!Array.isArray(rooms))
|
|
113
|
+
return null;
|
|
114
|
+
const listed = new Map();
|
|
115
|
+
for (const room of rooms) {
|
|
116
|
+
const held = listedRoom(room, 'credential');
|
|
117
|
+
if (held === null)
|
|
118
|
+
return null;
|
|
119
|
+
listed.set(room.room_ref, held);
|
|
120
|
+
}
|
|
121
|
+
return listed;
|
|
122
|
+
}
|
|
123
|
+
export function chunkLister(transport, most) {
|
|
124
|
+
const asked = new Map();
|
|
125
|
+
function answered(entries, whole) {
|
|
126
|
+
const prefixes = whole ? ['/'] : entries.map((entry) => authorityRoot(entry.handle));
|
|
127
|
+
return transport.door(houseDoorRoute('room-chunks/list'), { prefixes }).then((answer) => {
|
|
128
|
+
const failure = classifyDoor(answer.status, answer.body, '');
|
|
129
|
+
if (failure !== null)
|
|
130
|
+
return failed(entries, failure);
|
|
131
|
+
const listed = listedRooms(answer);
|
|
132
|
+
return listed ?? failed(entries, { kind: 'transport-uncertainty' });
|
|
133
|
+
}, () => failed(entries, { kind: 'transport-uncertainty' }));
|
|
134
|
+
}
|
|
135
|
+
function failed(entries, failure) {
|
|
136
|
+
return new Map(entries.map((entry) => [
|
|
137
|
+
entry.authority,
|
|
138
|
+
failure.kind === 'room-not-readable' || failure.kind === 'scoped-refusal'
|
|
139
|
+
? { ...failure, locator: entry.locator }
|
|
140
|
+
: failure,
|
|
141
|
+
]));
|
|
142
|
+
}
|
|
143
|
+
function settled(entry, lists) {
|
|
144
|
+
return lists.then((listed) => listed.get(entry.authority) ?? { kind: 'room-not-readable', locator: entry.locator });
|
|
145
|
+
}
|
|
146
|
+
function askAll(entries) {
|
|
147
|
+
if (entries.length === 0)
|
|
148
|
+
return;
|
|
149
|
+
const lists = answered(entries, entries.length > most());
|
|
150
|
+
for (const entry of entries) {
|
|
151
|
+
const listed = settled(entry, lists);
|
|
152
|
+
listed.catch(() => { });
|
|
153
|
+
asked.set(entry.authority, { entry, listed });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function list(entry) {
|
|
157
|
+
const held = asked.get(entry.authority);
|
|
158
|
+
asked.delete(entry.authority);
|
|
159
|
+
return held?.listed ?? settled(entry, answered([entry], false));
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
askAll,
|
|
163
|
+
list,
|
|
164
|
+
renew(entry, installing) {
|
|
165
|
+
if (!asked.has(entry.authority)) {
|
|
166
|
+
const waiting = [...asked.values()].map((held) => held.entry);
|
|
167
|
+
const due = new Map([entry, ...installing, ...waiting].map((held) => [held.authority, held]));
|
|
168
|
+
askAll([...due.values()]);
|
|
169
|
+
}
|
|
170
|
+
return list(entry);
|
|
171
|
+
},
|
|
172
|
+
forget() {
|
|
173
|
+
asked.clear();
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function folderLine(entry) {
|
|
178
|
+
return typeof entry.folder === 'string' && Object.keys(entry).length === 1 ? entry.folder : null;
|
|
179
|
+
}
|
|
180
|
+
function chunkEntry(line, room, read) {
|
|
181
|
+
let entry;
|
|
182
|
+
try {
|
|
183
|
+
entry = JSON.parse(line);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
if (typeof entry !== 'object' || entry === null)
|
|
189
|
+
return false;
|
|
190
|
+
const folder = folderLine(entry);
|
|
191
|
+
if (folder !== null) {
|
|
192
|
+
read.folders.push(folder);
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
const author = entry.author;
|
|
196
|
+
let named = entry;
|
|
197
|
+
if (author !== undefined) {
|
|
198
|
+
const key = typeof author === 'object' && author !== null ? authorKey(author) : null;
|
|
199
|
+
const name = key === null ? undefined : room.names.get(key);
|
|
200
|
+
if (name === undefined)
|
|
201
|
+
return false;
|
|
202
|
+
named = { ...entry, author: { ...author, name } };
|
|
203
|
+
}
|
|
204
|
+
const file = parseFile(named, room.mode);
|
|
205
|
+
if (file === null)
|
|
206
|
+
return false;
|
|
207
|
+
read.files.push(file);
|
|
208
|
+
if (typeof entry.content === 'string')
|
|
209
|
+
read.contents.push({ path: file.path, content: entry.content });
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
export async function chunkScope(body, room, arriving) {
|
|
213
|
+
const read = {
|
|
214
|
+
files: [],
|
|
215
|
+
contents: [],
|
|
216
|
+
folders: [],
|
|
217
|
+
};
|
|
218
|
+
const reader = body.getReader();
|
|
219
|
+
const decoder = new TextDecoder();
|
|
220
|
+
const pace = paced();
|
|
221
|
+
const unfinished = [];
|
|
222
|
+
let bytes = 0;
|
|
223
|
+
for (let chunk = await reader.read(); chunk.done !== true; chunk = await reader.read()) {
|
|
224
|
+
bytes += chunk.value.length;
|
|
225
|
+
arriving?.(bytes);
|
|
226
|
+
const text = decoder.decode(chunk.value, { stream: true });
|
|
227
|
+
let start = 0;
|
|
228
|
+
for (let end = text.indexOf('\n'); end !== -1; end = text.indexOf('\n', start)) {
|
|
229
|
+
const piece = text.slice(start, end);
|
|
230
|
+
const line = unfinished.length === 0 ? piece : unfinished.splice(0).join('') + piece;
|
|
231
|
+
start = end + 1;
|
|
232
|
+
if (line.length > 0 && !chunkEntry(line, room, read)) {
|
|
233
|
+
await reader.cancel();
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
const due = pace(line.length + ROW_WEIGHT);
|
|
237
|
+
if (due instanceof Promise)
|
|
238
|
+
await due;
|
|
239
|
+
}
|
|
240
|
+
if (start < text.length)
|
|
241
|
+
unfinished.push(text.slice(start));
|
|
242
|
+
}
|
|
243
|
+
const rest = unfinished.join('') + decoder.decode();
|
|
244
|
+
if (rest.length > 0 && !chunkEntry(rest, room, read))
|
|
245
|
+
return null;
|
|
246
|
+
return { anchor: room.anchor, position: room.position, logEpoch: room.logEpoch, ...read };
|
|
247
|
+
}
|
package/dist/discovery.d.ts
CHANGED
|
@@ -12,13 +12,12 @@ export type HouseBounds = {
|
|
|
12
12
|
max_inline_body_bytes: number;
|
|
13
13
|
max_upload_bytes: number;
|
|
14
14
|
max_prefixes: number;
|
|
15
|
-
max_held_files: number;
|
|
16
15
|
change_retention_seconds: number;
|
|
17
16
|
max_move_documents?: number;
|
|
18
17
|
};
|
|
19
18
|
export type HouseOperations = {
|
|
20
19
|
write: readonly string[];
|
|
21
|
-
|
|
20
|
+
erase: readonly string[];
|
|
22
21
|
};
|
|
23
22
|
export type HouseAccessLevel = 'search' | 'open' | 'keep';
|
|
24
23
|
export type HouseAuthority = LogPosition & {
|
package/dist/discovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,MAAM,EACN,aAAa,EACb,SAAS,EACV,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3E,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/discovery.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { declaredActions } from './actions.js';
|
|
2
|
-
import {
|
|
2
|
+
import { SITES_SUBMISSIONS_CREATE } from './transport.js';
|
|
3
3
|
import { readPosition, roomVersion } from './version.js';
|
|
4
4
|
export const PROVIDER_ACTIONS = 'provider-actions';
|
|
5
5
|
const BOUND_KEYS = [
|
|
@@ -13,10 +13,9 @@ const BOUND_KEYS = [
|
|
|
13
13
|
'max_inline_body_bytes',
|
|
14
14
|
'max_upload_bytes',
|
|
15
15
|
'max_prefixes',
|
|
16
|
-
'max_held_files',
|
|
17
16
|
'change_retention_seconds',
|
|
18
17
|
];
|
|
19
|
-
const OPERATION_KEYS = ['write', '
|
|
18
|
+
const OPERATION_KEYS = ['write', 'erase'];
|
|
20
19
|
const ACCESS_LEVELS = ['search', 'open', 'keep'];
|
|
21
20
|
function stringList(value) {
|
|
22
21
|
if (!Array.isArray(value))
|
|
@@ -268,7 +267,7 @@ export function siteCapabilities() {
|
|
|
268
267
|
return [
|
|
269
268
|
{
|
|
270
269
|
name: PROVIDER_ACTIONS,
|
|
271
|
-
actions: [{ name:
|
|
270
|
+
actions: [{ name: SITES_SUBMISSIONS_CREATE, inputShape: {}, resultKind: 'house' }],
|
|
272
271
|
},
|
|
273
272
|
];
|
|
274
273
|
}
|
|
@@ -281,7 +280,7 @@ export function discoveredRoom(authority) {
|
|
|
281
280
|
roomVersion: roomVersion(authority),
|
|
282
281
|
operations: {
|
|
283
282
|
write: [...authority.operations.write],
|
|
284
|
-
|
|
283
|
+
erase: [...authority.operations.erase],
|
|
285
284
|
},
|
|
286
285
|
replica: {
|
|
287
286
|
selection: locator,
|
package/dist/history.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { actionOutcome } from './actions.js';
|
|
2
2
|
import { houseDoorRoute } from './transport.js';
|
|
3
3
|
export const HISTORY_PAGE = 100;
|
|
4
|
-
const HISTORY = 'conversations/history';
|
|
4
|
+
const HISTORY = 'conversations/history/list';
|
|
5
5
|
function record(value) {
|
|
6
6
|
return typeof value === 'object' && value !== null ? value : {};
|
|
7
7
|
}
|