@agentshouse/mdruntime-adapter 0.1.0-ca80960fd750d → 0.1.0-ca9b5ec924eff
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 +5 -59
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +11 -289
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +157 -358
- 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/chunks.d.ts +38 -0
- package/dist/chunks.d.ts.map +1 -0
- package/dist/chunks.js +247 -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 +22 -15
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +75 -56
- 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 +682 -0
- package/dist/house-model.d.ts.map +1 -0
- package/dist/house-model.js +394 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/model.d.ts +5 -8
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +32 -46
- package/dist/read.d.ts +21 -59
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +50 -330
- package/dist/refusal.d.ts +0 -3
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +0 -5
- package/dist/room-types.d.ts +2 -3
- package/dist/room-types.d.ts.map +1 -1
- package/dist/room-types.js +49 -12
- 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 +75 -167
- 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 +16 -15
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +233 -423
- package/dist/transport.d.ts +47 -36
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +54 -11
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +2 -2
- package/dist/write.d.ts +6 -1
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +18 -25
- package/package.json +7 -3
- 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/part.d.ts +0 -15
- package/dist/part.d.ts.map +0 -1
- package/dist/part.js +0 -82
package/dist/room-types.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot', 'whatsapp', 'messenger', 'instagram', 'viber', 'tiktok'];
|
|
1
|
+
export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot', 'telegram-business', 'whatsapp', 'messenger', 'instagram', 'viber', 'tiktok'];
|
|
2
2
|
export type InboxChannelKind = (typeof INBOX_CHANNEL_KINDS)[number];
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const INBOX_MESSAGE_TYPE = "inbox-message";
|
|
3
|
+
export declare const HOUSE_NAMEABLE_ROOM_TYPES: string[];
|
|
5
4
|
export declare const HOUSE_ROOM_TYPES: string;
|
|
6
5
|
//# sourceMappingURL=room-types.d.ts.map
|
package/dist/room-types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-types.d.ts","sourceRoot":"","sources":["../src/room-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"room-types.d.ts","sourceRoot":"","sources":["../src/room-types.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB,YAC9B,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,QAAQ,CACA,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,eAAO,MAAM,yBAAyB,UAAiC,CAAC;AAyBxE,eAAO,MAAM,gBAAgB,QAyFjB,CAAC"}
|
package/dist/room-types.js
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
|
+
import { CHAT_MESSAGE_TYPE, CHAT_TYPE } from '@agentshouse/mdruntime';
|
|
2
|
+
import { APP_REFERENCE_PATTERN } from './app-reference.js';
|
|
3
|
+
import { HOUSE_MODEL_TYPES } from './house-model.js';
|
|
1
4
|
export const INBOX_CHANNEL_KINDS = [
|
|
2
5
|
'telegram-bot',
|
|
6
|
+
'telegram-business',
|
|
3
7
|
'whatsapp',
|
|
4
8
|
'messenger',
|
|
5
9
|
'instagram',
|
|
6
10
|
'viber',
|
|
7
11
|
'tiktok',
|
|
8
12
|
];
|
|
9
|
-
export const
|
|
10
|
-
|
|
13
|
+
export const HOUSE_NAMEABLE_ROOM_TYPES = [CHAT_TYPE, CHAT_MESSAGE_TYPE];
|
|
14
|
+
const WAYFINDING_MAP_TYPE = 'wayfinding-map';
|
|
15
|
+
const WAYFINDING_TICKET_TYPE = 'wayfinding-ticket';
|
|
16
|
+
const WAYFINDING_MAP_SECTIONS = [
|
|
17
|
+
'Destination',
|
|
18
|
+
'Notes',
|
|
19
|
+
'Decisions so far',
|
|
20
|
+
'Not yet specified',
|
|
21
|
+
'Out of scope',
|
|
22
|
+
];
|
|
11
23
|
const IDENTITY = "{ type: string, pattern: '^\\S+$' }";
|
|
12
24
|
const AGENT = [' agent: { type: string, format: uuid }', ' name: { type: string }'];
|
|
13
25
|
const ASSIGNEE = [
|
|
@@ -17,7 +29,7 @@ const ASSIGNEE = [
|
|
|
17
29
|
...AGENT,
|
|
18
30
|
];
|
|
19
31
|
export const HOUSE_ROOM_TYPES = [
|
|
20
|
-
`${
|
|
32
|
+
`${CHAT_TYPE}:`,
|
|
21
33
|
' properties:',
|
|
22
34
|
' inbox: { type: string, format: uuid }',
|
|
23
35
|
` channel: { enum: [${INBOX_CHANNEL_KINDS.join(', ')}] }`,
|
|
@@ -34,20 +46,16 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
34
46
|
' type: object',
|
|
35
47
|
' properties:',
|
|
36
48
|
...AGENT,
|
|
37
|
-
'
|
|
38
|
-
|
|
39
|
-
`${INBOX_MESSAGE_TYPE}:`,
|
|
49
|
+
' required: [chat, customer]',
|
|
50
|
+
`${CHAT_MESSAGE_TYPE}:`,
|
|
40
51
|
' properties:',
|
|
41
52
|
' direction: { enum: [in, out] }',
|
|
42
53
|
' sender:',
|
|
43
|
-
|
|
44
|
-
' properties:',
|
|
45
|
-
' name: { type: string }',
|
|
54
|
+
...ASSIGNEE,
|
|
46
55
|
` username: ${IDENTITY}`,
|
|
47
56
|
' sent_at: { type: string, format: date-time }',
|
|
48
57
|
` channel_message: ${IDENTITY}`,
|
|
49
|
-
'
|
|
50
|
-
' reason: { type: string }',
|
|
58
|
+
' labelled: { const: true }',
|
|
51
59
|
' reactions:',
|
|
52
60
|
' type: array',
|
|
53
61
|
' items:',
|
|
@@ -79,5 +87,34 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
79
87
|
' required: [direction]',
|
|
80
88
|
' if: { properties: { direction: { const: in } } }',
|
|
81
89
|
' then: { required: [sent_at] }',
|
|
82
|
-
|
|
90
|
+
`${WAYFINDING_MAP_TYPE}:`,
|
|
91
|
+
' properties:',
|
|
92
|
+
' title: { type: string }',
|
|
93
|
+
' required: [title]',
|
|
94
|
+
' sections:',
|
|
95
|
+
...WAYFINDING_MAP_SECTIONS.map((name) => ` ${name}: { kind: text, required: true }`),
|
|
96
|
+
`${WAYFINDING_TICKET_TYPE}:`,
|
|
97
|
+
' properties:',
|
|
98
|
+
' title: { type: string }',
|
|
99
|
+
' kind: { enum: [research, prototype, grilling, task] }',
|
|
100
|
+
' status: { enum: [open, in-progress, done, out-of-scope] }',
|
|
101
|
+
` map: { type: string, reference: ${WAYFINDING_MAP_TYPE} }`,
|
|
102
|
+
` blocked_by: { type: array, items: { type: string, reference: ${WAYFINDING_TICKET_TYPE} } }`,
|
|
103
|
+
' assignee:',
|
|
104
|
+
...ASSIGNEE,
|
|
105
|
+
' conversation: { type: string, format: uuid }',
|
|
106
|
+
` app: { type: string, pattern: '${APP_REFERENCE_PATTERN.source}' }`,
|
|
107
|
+
' required: [title, kind, status, map, blocked_by]',
|
|
108
|
+
' sections:',
|
|
109
|
+
' Question: { kind: text }',
|
|
110
|
+
' Answer: { kind: text }',
|
|
111
|
+
' allOf:',
|
|
112
|
+
' - if: { properties: { status: { enum: [in-progress, done, out-of-scope] } }, required: [status] }',
|
|
113
|
+
' then: { required: [assignee] }',
|
|
114
|
+
' else: { properties: { assignee: false } }',
|
|
115
|
+
' - if: { properties: { assignee: { required: [agent] } }, required: [assignee] }',
|
|
116
|
+
' else: { properties: { conversation: false } }',
|
|
117
|
+
' - if: { properties: { status: { enum: [done, out-of-scope] } }, required: [status] }',
|
|
118
|
+
' then: { sections: { Answer: { kind: text, required: true } } }',
|
|
119
|
+
HOUSE_MODEL_TYPES,
|
|
83
120
|
].join('\n');
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SearchAnswer, SearchAsk } from '@agentshouse/mdruntime';
|
|
2
|
+
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
+
import { type HouseTransport } from './transport.js';
|
|
4
|
+
export declare function houseSearch(transport: Pick<HouseTransport, 'door'>, tracked: readonly TrackedAuthority[], request: SearchAsk): Promise<SearchAnswer>;
|
|
5
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAa,MAAM,wBAAwB,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAsBrE,wBAAsB,WAAW,CAC/B,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACvC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { doorRefusal } from './refusal.js';
|
|
2
|
+
import { houseDoorRoute } from './transport.js';
|
|
3
|
+
const ROOMS = '/rooms/';
|
|
4
|
+
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
5
|
+
function hitOf(file, locators) {
|
|
6
|
+
if (typeof file !== 'object' || file === null)
|
|
7
|
+
return null;
|
|
8
|
+
const { path, line, snippet } = file;
|
|
9
|
+
if (typeof path !== 'string' || !path.startsWith(ROOMS))
|
|
10
|
+
return null;
|
|
11
|
+
const slash = path.indexOf('/', ROOMS.length);
|
|
12
|
+
if (slash < 0)
|
|
13
|
+
return null;
|
|
14
|
+
const room = locators.get(path.slice(ROOMS.length, slash));
|
|
15
|
+
if (room === undefined)
|
|
16
|
+
return null;
|
|
17
|
+
return {
|
|
18
|
+
room,
|
|
19
|
+
path: path.slice(slash + 1),
|
|
20
|
+
...(typeof line === 'number' ? { line } : {}),
|
|
21
|
+
...(typeof snippet === 'string' ? { snippet } : {}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export async function houseSearch(transport, tracked, request) {
|
|
25
|
+
const named = request.rooms === null
|
|
26
|
+
? null
|
|
27
|
+
: tracked.filter((entry) => request.rooms.includes(entry.locator));
|
|
28
|
+
if (named !== null && named.length === 0)
|
|
29
|
+
return { kind: 'found', documents: [] };
|
|
30
|
+
const answer = await transport.door(houseDoorRoute('rooms/search'), {
|
|
31
|
+
query: request.text,
|
|
32
|
+
...(named === null ? {} : { paths: named.map((entry) => `${ROOMS}${entry.handle}`) }),
|
|
33
|
+
});
|
|
34
|
+
if (answer.status === 401)
|
|
35
|
+
return { kind: 'revoked-authorization' };
|
|
36
|
+
const refusal = doorRefusal(answer.body);
|
|
37
|
+
if (refusal !== null)
|
|
38
|
+
return { kind: 'rejected', ...refusal };
|
|
39
|
+
const files = answer.body?.files;
|
|
40
|
+
if (answer.status !== 200 || !Array.isArray(files))
|
|
41
|
+
return UNCERTAIN;
|
|
42
|
+
const locators = new Map(tracked.map((entry) => [entry.handle, entry.locator]));
|
|
43
|
+
return {
|
|
44
|
+
kind: 'found',
|
|
45
|
+
documents: files.flatMap((file) => hitOf(file, locators) ?? []),
|
|
46
|
+
};
|
|
47
|
+
}
|
package/dist/site.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAQR,MAAM,wBAAwB,CAAC;AAehC,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAuBxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAiK1F"}
|
package/dist/site.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { actionOutcome } from './actions.js';
|
|
2
|
+
import { chunkedHead, chunkPart, siteChunkList } from './chunks.js';
|
|
3
3
|
import { mapDiscovery, parseSiteDiscovery, siteCapabilities, siteTracked, } from './discovery.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { HOUSE_ROOM_TYPES } from './room-types.js';
|
|
4
|
+
import { spaceSchemas } from './space-schema.js';
|
|
5
|
+
import { discoveryFailure } from './refusal.js';
|
|
6
|
+
import { HOUSE_TYPED_PATHS } from './house-model.js';
|
|
7
|
+
import { HOUSE_NAMEABLE_ROOM_TYPES, HOUSE_ROOM_TYPES } from './room-types.js';
|
|
9
8
|
import { houseNotifications } from './stream.js';
|
|
10
|
-
import {
|
|
11
|
-
import { followsVersion,
|
|
9
|
+
import { houseSiteRoute, SITE_DOOR_SUBMIT, SITE_FILES, SITES_SUBMISSIONS_CREATE, } from './transport.js';
|
|
10
|
+
import { followsVersion, reachedVersion, roomVersion } from './version.js';
|
|
12
11
|
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
13
12
|
function unfound() {
|
|
14
13
|
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
@@ -19,176 +18,100 @@ function siteRoom(tracked) {
|
|
|
19
18
|
locator: tracked.locator,
|
|
20
19
|
handle: tracked.handle,
|
|
21
20
|
roomVersion: roomVersion(tracked),
|
|
22
|
-
operations: { write: [],
|
|
21
|
+
operations: { write: [], erase: [] },
|
|
23
22
|
replica: { selection: tracked.locator, admission: 'admitted', offline: 'open' },
|
|
24
23
|
providerOwnedPaths: [],
|
|
25
24
|
};
|
|
26
25
|
}
|
|
27
26
|
export function createSiteAdapter(transport, snapshot = false) {
|
|
28
|
-
const
|
|
27
|
+
const spaces = spaceSchemas();
|
|
28
|
+
const notifications = houseNotifications(transport, 'site', {
|
|
29
|
+
opened: async () => {
|
|
30
|
+
const found = await discovered();
|
|
31
|
+
return found.kind === 'discovery' ? found : null;
|
|
32
|
+
},
|
|
33
|
+
changed: () => null,
|
|
34
|
+
}, spaces);
|
|
29
35
|
const tracked = new Map();
|
|
30
|
-
const
|
|
36
|
+
const chunked = new Map();
|
|
31
37
|
function fileRoute(request) {
|
|
32
38
|
const entry = tracked.get(request.locator);
|
|
33
39
|
if (entry === undefined)
|
|
34
40
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
35
41
|
return `${SITE_FILES}${entry.authority}/${encodeURIComponent(request.revision)}/${encodeURIComponent(request.path)}`;
|
|
36
42
|
}
|
|
37
|
-
async function
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
],
|
|
47
|
-
});
|
|
48
|
-
const classified = classifyRead(answer.status, answer.body, entry.locator);
|
|
49
|
-
if (classified !== null)
|
|
50
|
-
return classified;
|
|
51
|
-
const found = parseEnumeration(answer.body, 'site');
|
|
52
|
-
if (found === null)
|
|
53
|
-
return UNCERTAIN;
|
|
54
|
-
return viewOf(found, entry) ?? { kind: 'room-not-readable', locator: entry.locator };
|
|
55
|
-
}
|
|
56
|
-
async function enumeration(entry, from) {
|
|
57
|
-
const first = await enumerated(entry, from);
|
|
58
|
-
return 'kind' in first ? first : wholeView(first, (page) => enumerated(entry, from, page));
|
|
43
|
+
async function listedRoom(entry) {
|
|
44
|
+
const past = chunked.get(entry.locator)?.position;
|
|
45
|
+
const listed = siteChunkList(await transport.read(`${houseSiteRoute('chunks')}/${entry.authority}${past === undefined ? '' : `?expired=${past}`}`), entry.locator);
|
|
46
|
+
if ('kind' in listed)
|
|
47
|
+
return listed;
|
|
48
|
+
const head = await chunkedHead(listed, entry, spaces);
|
|
49
|
+
if (head.kind === 'bootstrap')
|
|
50
|
+
chunked.set(entry.locator, listed);
|
|
51
|
+
return head;
|
|
59
52
|
}
|
|
60
|
-
async function
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
async function fetchedPart(entry, room, listed, received, arriving) {
|
|
70
|
-
if (received !== undefined) {
|
|
71
|
-
const kept = new Uint8Array(received);
|
|
72
|
-
const held = await housePart(room, kept, listed, 'site');
|
|
73
|
-
if (held !== null)
|
|
74
|
-
return 'kind' in held ? held : { scope: held, frame: kept };
|
|
75
|
-
}
|
|
76
|
-
for (let attempt = 0; attempt < PART_ATTEMPTS; attempt += 1) {
|
|
77
|
-
const answer = await transport.read(`${SITE_DOOR_BOOTSTRAP}${entry.authority}?part=${encodeURIComponent(listed.part)}`, partArrival(listed, arriving));
|
|
78
|
-
const failure = classifyRead(answer.status, answer.body, entry.locator);
|
|
79
|
-
if (failure?.kind === 'beyond-horizon')
|
|
80
|
-
expired.set(entry.locator, room.position);
|
|
81
|
-
if (failure !== null)
|
|
82
|
-
return failure;
|
|
83
|
-
const frame = partFrame(answer.body);
|
|
84
|
-
if (frame === null)
|
|
85
|
-
continue;
|
|
86
|
-
const scope = await housePart(room, frame, listed, 'site');
|
|
87
|
-
if (scope !== null)
|
|
88
|
-
return 'kind' in scope ? scope : { scope, frame };
|
|
89
|
-
}
|
|
90
|
-
return unverifiedPart(entry.locator);
|
|
53
|
+
async function chunkPage(entry, id, arriving) {
|
|
54
|
+
const room = chunked.get(entry.locator);
|
|
55
|
+
const address = room?.chunks.get(id);
|
|
56
|
+
if (room === undefined || address === undefined)
|
|
57
|
+
return UNCERTAIN;
|
|
58
|
+
const read = await transport.download(address.url);
|
|
59
|
+
if (read.status !== 200)
|
|
60
|
+
return UNCERTAIN;
|
|
61
|
+
return chunkPart(read.body, room, id, arriving);
|
|
91
62
|
}
|
|
92
|
-
async function
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
notifications.
|
|
105
|
-
|
|
106
|
-
if (answer.kind !== 'net-advancement')
|
|
107
|
-
return answer;
|
|
108
|
-
const models = await viewModels(view, entry);
|
|
109
|
-
return models === undefined ? answer : { ...answer, models };
|
|
63
|
+
async function discovered() {
|
|
64
|
+
const answer = await transport.read(houseSiteRoute('discover'));
|
|
65
|
+
const failed = discoveryFailure(answer.status, answer.body);
|
|
66
|
+
if (failed !== null)
|
|
67
|
+
return failed;
|
|
68
|
+
const document = parseSiteDiscovery(answer.body);
|
|
69
|
+
if (document === null)
|
|
70
|
+
return UNCERTAIN;
|
|
71
|
+
const entries = siteTracked(document);
|
|
72
|
+
tracked.clear();
|
|
73
|
+
for (const entry of entries)
|
|
74
|
+
tracked.set(entry.locator, entry);
|
|
75
|
+
notifications.track(entries);
|
|
76
|
+
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
110
77
|
}
|
|
111
78
|
return {
|
|
112
79
|
localSaves: true,
|
|
113
|
-
exhaustiveDiscovery: true,
|
|
114
80
|
roomTypes: HOUSE_ROOM_TYPES,
|
|
81
|
+
nameableRoomTypes: HOUSE_NAMEABLE_ROOM_TYPES,
|
|
82
|
+
typedPaths: HOUSE_TYPED_PATHS,
|
|
115
83
|
async authorize() {
|
|
116
84
|
return {};
|
|
117
85
|
},
|
|
118
|
-
async discover() {
|
|
119
|
-
const answer = await transport.read(SITE_DOOR_DISCOVER);
|
|
120
|
-
const failed = discoveryFailure(answer.status, answer.body);
|
|
121
|
-
if (failed !== null)
|
|
122
|
-
return failed;
|
|
123
|
-
const document = parseSiteDiscovery(answer.body);
|
|
124
|
-
if (document === null)
|
|
125
|
-
return UNCERTAIN;
|
|
126
|
-
const entries = siteTracked(document);
|
|
127
|
-
tracked.clear();
|
|
128
|
-
for (const entry of entries)
|
|
129
|
-
tracked.set(entry.locator, entry);
|
|
130
|
-
notifications.track(entries);
|
|
131
|
-
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
132
|
-
},
|
|
133
86
|
async bootstrap(_authorization, request) {
|
|
134
87
|
const entry = tracked.get(request.locator);
|
|
135
88
|
if (entry === undefined)
|
|
136
89
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const room = await partedRoom(entry);
|
|
141
|
-
if ('kind' in room)
|
|
142
|
-
return room;
|
|
143
|
-
const { models, seen } = await manifestedModels(room, entry);
|
|
144
|
-
continued = { room, next: 0, seen };
|
|
145
|
-
inventory = partInventory(room);
|
|
146
|
-
if (inventory.parts > 0) {
|
|
147
|
-
return manifested(room, inventory, JSON.stringify(continued), models);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
else
|
|
151
|
-
continued = JSON.parse(request.pageToken);
|
|
152
|
-
const listed = continued.room.parts[continued.next];
|
|
153
|
-
const sent = listed === undefined
|
|
154
|
-
? { scope: emptyScope(continued.room), frame: null }
|
|
155
|
-
: await fetchedPart(entry, continued.room, listed, request.received, request.arriving);
|
|
156
|
-
if ('kind' in sent)
|
|
157
|
-
return sent;
|
|
158
|
-
const { scope } = sent;
|
|
159
|
-
notifications.reach(entry.authority, scope);
|
|
160
|
-
const next = continued.next + 1;
|
|
161
|
-
const more = next < continued.room.parts.length;
|
|
162
|
-
const seen = [
|
|
163
|
-
...continued.seen,
|
|
164
|
-
...entry.schemas.filter((schema) => scope.files.some((file) => file.path === schema)),
|
|
165
|
-
];
|
|
166
|
-
const models = await partModels(scope, entry, new Set(seen), !more);
|
|
167
|
-
const { folders: _folders, ...page } = await stepped(bootstrapping(scope));
|
|
168
|
-
return {
|
|
169
|
-
...page,
|
|
170
|
-
...(models === undefined ? {} : { models }),
|
|
171
|
-
...(more ? { pageToken: JSON.stringify({ ...continued, next, seen }) } : {}),
|
|
172
|
-
...(inventory === undefined ? {} : { inventory }),
|
|
173
|
-
...(sent.frame === null ? {} : { received: sent.frame }),
|
|
174
|
-
};
|
|
90
|
+
return request.pageToken === undefined
|
|
91
|
+
? listedRoom(entry)
|
|
92
|
+
: chunkPage(entry, request.pageToken, request.arriving);
|
|
175
93
|
},
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
94
|
+
...(snapshot
|
|
95
|
+
? {
|
|
96
|
+
discover: discovered,
|
|
97
|
+
async refresh(_authorization, request) {
|
|
98
|
+
const entry = tracked.get(request.locator);
|
|
99
|
+
if (entry === undefined)
|
|
100
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
101
|
+
if (request.pageToken !== undefined)
|
|
102
|
+
return UNCERTAIN;
|
|
103
|
+
return request.fromRoomVersion === roomVersion(entry)
|
|
104
|
+
? { kind: 'still-current' }
|
|
105
|
+
: { kind: 'beyond-horizon' };
|
|
106
|
+
},
|
|
186
107
|
}
|
|
187
|
-
|
|
188
|
-
},
|
|
108
|
+
: {}),
|
|
189
109
|
async mutate() {
|
|
190
110
|
return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {}, retryable: false };
|
|
191
111
|
},
|
|
112
|
+
async attach() {
|
|
113
|
+
return { kind: 'rejected', code: 'write-grant', fields: {}, retryable: false };
|
|
114
|
+
},
|
|
192
115
|
async history() {
|
|
193
116
|
return { kind: 'no-history' };
|
|
194
117
|
},
|
|
@@ -220,7 +143,7 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
220
143
|
return followsVersion(version, next);
|
|
221
144
|
},
|
|
222
145
|
async action(_authorization, request) {
|
|
223
|
-
if (request.name !==
|
|
146
|
+
if (request.name !== SITES_SUBMISSIONS_CREATE) {
|
|
224
147
|
return {
|
|
225
148
|
kind: 'rejected',
|
|
226
149
|
code: 'action-unimplemented',
|
|
@@ -230,28 +153,13 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
230
153
|
}
|
|
231
154
|
if (!transport.online())
|
|
232
155
|
return UNCERTAIN;
|
|
233
|
-
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input),
|
|
156
|
+
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITES_SUBMISSIONS_CREATE, request.input);
|
|
234
157
|
},
|
|
235
158
|
roomStream: snapshot
|
|
236
159
|
? undefined
|
|
237
160
|
: {
|
|
238
|
-
hold
|
|
239
|
-
notifications.send(rooms.flatMap((room) => {
|
|
240
|
-
const entry = tracked.get(room.locator);
|
|
241
|
-
const at = logPosition(room.roomVersion);
|
|
242
|
-
if (entry === undefined || at === null)
|
|
243
|
-
return [];
|
|
244
|
-
notifications.reach(entry.authority, at);
|
|
245
|
-
return [presented(entry.authority, at)];
|
|
246
|
-
}));
|
|
247
|
-
},
|
|
248
|
-
reopen: notifications.reopen,
|
|
161
|
+
hold: notifications.send,
|
|
249
162
|
observe: notifications.observe,
|
|
250
|
-
published(locator, roomVersion) {
|
|
251
|
-
const at = logPosition(roomVersion);
|
|
252
|
-
if (at !== null)
|
|
253
|
-
notifications.published(locator, at);
|
|
254
|
-
},
|
|
255
163
|
},
|
|
256
164
|
serviceMode: notifications.serviceMode,
|
|
257
165
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type SpaceSchemas = {
|
|
2
|
+
held(space: string, revision: string): string | undefined;
|
|
3
|
+
keep(space: string, revision: string, text: string): void;
|
|
4
|
+
};
|
|
5
|
+
export declare function spaceSchemas(): SpaceSchemas;
|
|
6
|
+
export declare function spaceIdentity(space: string): string;
|
|
7
|
+
//# sourceMappingURL=space-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space-schema.d.ts","sourceRoot":"","sources":["../src/space-schema.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF,wBAAgB,YAAY,IAAI,YAAY,CAY3C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const HELD_TEXTS = 16;
|
|
2
|
+
export function spaceSchemas() {
|
|
3
|
+
const texts = new Map();
|
|
4
|
+
const key = (space, revision) => `${space} ${revision}`;
|
|
5
|
+
return {
|
|
6
|
+
held: (space, revision) => texts.get(key(space, revision)),
|
|
7
|
+
keep(space, revision, text) {
|
|
8
|
+
const named = key(space, revision);
|
|
9
|
+
texts.delete(named);
|
|
10
|
+
texts.set(named, text);
|
|
11
|
+
if (texts.size > HELD_TEXTS)
|
|
12
|
+
texts.delete(texts.keys().next().value);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function spaceIdentity(space) {
|
|
17
|
+
return `space:${space}`;
|
|
18
|
+
}
|
package/dist/stream.d.ts
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type AuthorityChange, type Discovery, type ConversationStream, type HeldRoom, type RoomStreamEvent, type ServiceModeSignal } from '@agentshouse/mdruntime';
|
|
2
2
|
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
-
import type {
|
|
4
|
-
import { type
|
|
5
|
-
export type
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
import type { SpaceSchemas } from './space-schema.js';
|
|
4
|
+
import { type HouseDoor, type HouseMode, type HouseStreamFrame } from './transport.js';
|
|
5
|
+
export type HouseOpeningFrame = Extract<HouseStreamFrame, {
|
|
6
|
+
type: 'opening';
|
|
7
|
+
}>;
|
|
8
|
+
export type HouseAuthorityChangedFrame = Extract<HouseStreamFrame, {
|
|
9
|
+
type: 'authority_changed';
|
|
10
|
+
}>;
|
|
11
|
+
export type HouseDiscovering = {
|
|
12
|
+
opened(frame: HouseOpeningFrame | null): Promise<Discovery | null>;
|
|
13
|
+
changed(frame: HouseAuthorityChangedFrame): AuthorityChange | null;
|
|
14
|
+
expired?(authorities: readonly string[]): void;
|
|
9
15
|
};
|
|
10
16
|
export type HouseNotifications = {
|
|
11
17
|
runtime: string;
|
|
12
|
-
observe(notify: (event: RoomStreamEvent) => void
|
|
13
|
-
send(rooms: readonly
|
|
14
|
-
published(locator: string, at: LogPosition): void;
|
|
15
|
-
reopen(): void;
|
|
18
|
+
observe(notify: (event: RoomStreamEvent) => void): () => void;
|
|
19
|
+
send(rooms: readonly HeldRoom[]): void;
|
|
16
20
|
track(authorities: readonly TrackedAuthority[]): void;
|
|
17
|
-
reach(authority: string, at: LogPosition): void;
|
|
18
|
-
edited(tracked: TrackedAuthority, from: LogPosition): readonly string[];
|
|
19
|
-
advance(tracked: TrackedAuthority, from: LogPosition, holds?: HeldRevision): Generator<number, StreamedAdvancement | null, void>;
|
|
20
21
|
conversations: ConversationStream;
|
|
21
22
|
serviceMode: ServiceModeSignal;
|
|
22
23
|
};
|
|
23
|
-
export declare function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications;
|
|
24
|
+
export declare function houseNotifications(transport: HouseDoor, mode: HouseMode, discovering: HouseDiscovering, spaces: SpaceSchemas): HouseNotifications;
|
|
24
25
|
//# sourceMappingURL=stream.d.ts.map
|
package/dist/stream.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EAEvB,KAAK,
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAEpB,KAAK,SAAS,EACd,KAAK,kBAAkB,EAEvB,KAAK,QAAQ,EAGb,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EAEvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWtD,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,SAAS,EAGd,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AAaxB,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAE/E,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAAC;AAElG,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,KAAK,EAAE,0BAA0B,GAAG,eAAe,GAAG,IAAI,CAAC;IACnE,OAAO,CAAC,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI,CAAC;IACvC,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,aAAa,EAAE,kBAAkB,CAAC;IAClC,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AA6FF,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,YAAY,GACnB,kBAAkB,CA8XpB"}
|