@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
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { stepped } from '@agentshouse/mdruntime';
|
|
2
|
+
import { manifestedModels, partModels } from './model.js';
|
|
3
|
+
import { roomFrames } from './part.js';
|
|
4
|
+
import { bootstrapping, housePart, manifested, roomHead, } from './read.js';
|
|
5
|
+
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
6
|
+
export function roomStreams(mode) {
|
|
7
|
+
const open = new Map();
|
|
8
|
+
let opened = 0;
|
|
9
|
+
async function head(entry, room, arriving, signal) {
|
|
10
|
+
const frames = roomFrames(room, arriving, signal);
|
|
11
|
+
const first = await frames();
|
|
12
|
+
if (first.kind !== 'frame')
|
|
13
|
+
return UNCERTAIN;
|
|
14
|
+
const held = await roomHead(first.payload, mode);
|
|
15
|
+
if (held === null || held.anchor !== entry.authority)
|
|
16
|
+
return UNCERTAIN;
|
|
17
|
+
const { models, seen } = await manifestedModels(held, entry);
|
|
18
|
+
opened += 1;
|
|
19
|
+
const id = String(opened);
|
|
20
|
+
open.set(id, { entry, head: held, frames, next: 1, seen });
|
|
21
|
+
signal?.addEventListener('abort', () => open.delete(id), { once: true });
|
|
22
|
+
return { ...manifested(held, `${id}:1`, models), bytes: first.bytes };
|
|
23
|
+
}
|
|
24
|
+
async function part(entry, token) {
|
|
25
|
+
const [id = '', at = ''] = token.split(':');
|
|
26
|
+
const room = open.get(id);
|
|
27
|
+
if (room === undefined || room.entry.locator !== entry.locator || String(room.next) !== at)
|
|
28
|
+
return UNCERTAIN;
|
|
29
|
+
const frame = await room.frames();
|
|
30
|
+
if (frame.kind !== 'frame') {
|
|
31
|
+
open.delete(id);
|
|
32
|
+
return UNCERTAIN;
|
|
33
|
+
}
|
|
34
|
+
const read = await housePart(room.head, frame.payload, mode);
|
|
35
|
+
if ('kind' in read) {
|
|
36
|
+
open.delete(id);
|
|
37
|
+
return read;
|
|
38
|
+
}
|
|
39
|
+
const { scope, ended } = read;
|
|
40
|
+
const first = room.next === 1;
|
|
41
|
+
room.next += 1;
|
|
42
|
+
room.seen = [
|
|
43
|
+
...room.seen,
|
|
44
|
+
...(scope.files.some((file) => file.path === entry.schema) ? [entry.schema] : []),
|
|
45
|
+
];
|
|
46
|
+
if (ended)
|
|
47
|
+
open.delete(id);
|
|
48
|
+
return {
|
|
49
|
+
scope,
|
|
50
|
+
first,
|
|
51
|
+
ended,
|
|
52
|
+
models: await partModels(scope, entry, new Set(room.seen), ended),
|
|
53
|
+
pageToken: ended ? undefined : `${id}:${room.next}`,
|
|
54
|
+
bytes: frame.bytes,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async function named(entry, room, signal) {
|
|
58
|
+
const opened = await head(entry, room, undefined, signal);
|
|
59
|
+
if (opened.kind !== 'bootstrap')
|
|
60
|
+
return opened;
|
|
61
|
+
const files = [];
|
|
62
|
+
const contents = [];
|
|
63
|
+
let last = null;
|
|
64
|
+
for (let token = opened.pageToken; token !== undefined;) {
|
|
65
|
+
const read = await part(entry, token);
|
|
66
|
+
if ('kind' in read)
|
|
67
|
+
return read;
|
|
68
|
+
files.push(...read.scope.files);
|
|
69
|
+
contents.push(...read.scope.contents);
|
|
70
|
+
last = read.scope;
|
|
71
|
+
token = read.pageToken;
|
|
72
|
+
}
|
|
73
|
+
if (last === null)
|
|
74
|
+
return UNCERTAIN;
|
|
75
|
+
return stepped(bootstrapping({ ...last, files, contents }));
|
|
76
|
+
}
|
|
77
|
+
return { head, part, named };
|
|
78
|
+
}
|
package/dist/room-types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot'];
|
|
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
|
|
3
|
+
export declare const CHAT_TYPE = "chat";
|
|
4
|
+
export declare const CHAT_MESSAGE_TYPE = "chat-message";
|
|
5
|
+
export declare const HOUSE_NAMEABLE_ROOM_TYPES: string[];
|
|
5
6
|
export declare const HOUSE_ROOM_TYPES: string;
|
|
6
7
|
//# 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":"AAGA,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,SAAS,SAAS,CAAC;AAEhC,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,eAAO,MAAM,yBAAyB,UAAiC,CAAC;AAyBxE,eAAO,MAAM,gBAAgB,QA6FjB,CAAC"}
|
package/dist/room-types.js
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export const
|
|
1
|
+
import { APP_REFERENCE_PATTERN } from './app-reference.js';
|
|
2
|
+
import { HOUSE_MODEL_TYPES } from './house-model.js';
|
|
3
|
+
export const INBOX_CHANNEL_KINDS = [
|
|
4
|
+
'telegram-bot',
|
|
5
|
+
'telegram-business',
|
|
6
|
+
'whatsapp',
|
|
7
|
+
'messenger',
|
|
8
|
+
'instagram',
|
|
9
|
+
'viber',
|
|
10
|
+
'tiktok',
|
|
11
|
+
];
|
|
12
|
+
export const CHAT_TYPE = 'chat';
|
|
13
|
+
export const CHAT_MESSAGE_TYPE = 'chat-message';
|
|
14
|
+
export const HOUSE_NAMEABLE_ROOM_TYPES = [CHAT_TYPE, CHAT_MESSAGE_TYPE];
|
|
15
|
+
const WAYFINDING_MAP_TYPE = 'wayfinding-map';
|
|
16
|
+
const WAYFINDING_TICKET_TYPE = 'wayfinding-ticket';
|
|
17
|
+
const WAYFINDING_MAP_SECTIONS = [
|
|
18
|
+
'Destination',
|
|
19
|
+
'Notes',
|
|
20
|
+
'Decisions so far',
|
|
21
|
+
'Not yet specified',
|
|
22
|
+
'Out of scope',
|
|
23
|
+
];
|
|
4
24
|
const IDENTITY = "{ type: string, pattern: '^\\S+$' }";
|
|
5
25
|
const AGENT = [' agent: { type: string, format: uuid }', ' name: { type: string }'];
|
|
6
26
|
const ASSIGNEE = [
|
|
@@ -10,7 +30,7 @@ const ASSIGNEE = [
|
|
|
10
30
|
...AGENT,
|
|
11
31
|
];
|
|
12
32
|
export const HOUSE_ROOM_TYPES = [
|
|
13
|
-
`${
|
|
33
|
+
`${CHAT_TYPE}:`,
|
|
14
34
|
' properties:',
|
|
15
35
|
' inbox: { type: string, format: uuid }',
|
|
16
36
|
` channel: { enum: [${INBOX_CHANNEL_KINDS.join(', ')}] }`,
|
|
@@ -27,9 +47,8 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
27
47
|
' type: object',
|
|
28
48
|
' properties:',
|
|
29
49
|
...AGENT,
|
|
30
|
-
' conversation: { type: string, format: uuid }',
|
|
31
50
|
' required: [inbox, channel, chat, customer]',
|
|
32
|
-
`${
|
|
51
|
+
`${CHAT_MESSAGE_TYPE}:`,
|
|
33
52
|
' properties:',
|
|
34
53
|
' direction: { enum: [in, out] }',
|
|
35
54
|
' sender:',
|
|
@@ -41,6 +60,7 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
41
60
|
` channel_message: ${IDENTITY}`,
|
|
42
61
|
' state: { enum: [sending, sent, failed] }',
|
|
43
62
|
' reason: { type: string }',
|
|
63
|
+
' labelled: { const: true }',
|
|
44
64
|
' reactions:',
|
|
45
65
|
' type: array',
|
|
46
66
|
' items:',
|
|
@@ -59,8 +79,47 @@ export const HOUSE_ROOM_TYPES = [
|
|
|
59
79
|
' assignee:',
|
|
60
80
|
...ASSIGNEE,
|
|
61
81
|
' sent_outside: { const: true }',
|
|
82
|
+
' template:',
|
|
83
|
+
' type: object',
|
|
84
|
+
' properties:',
|
|
85
|
+
' name: { type: string, minLength: 1 }',
|
|
86
|
+
' language: { type: string, minLength: 1 }',
|
|
87
|
+
' required: [name, language]',
|
|
88
|
+
' values:',
|
|
89
|
+
' type: object',
|
|
90
|
+
' additionalProperties: { type: string }',
|
|
91
|
+
' withheld: { const: true }',
|
|
62
92
|
' required: [direction]',
|
|
63
93
|
' if: { properties: { direction: { const: in } } }',
|
|
64
94
|
' then: { required: [sent_at] }',
|
|
65
|
-
|
|
95
|
+
`${WAYFINDING_MAP_TYPE}:`,
|
|
96
|
+
' properties:',
|
|
97
|
+
' title: { type: string }',
|
|
98
|
+
' required: [title]',
|
|
99
|
+
' sections:',
|
|
100
|
+
...WAYFINDING_MAP_SECTIONS.map((name) => ` ${name}: { kind: text, required: true }`),
|
|
101
|
+
`${WAYFINDING_TICKET_TYPE}:`,
|
|
102
|
+
' properties:',
|
|
103
|
+
' title: { type: string }',
|
|
104
|
+
' kind: { enum: [research, prototype, grilling, task] }',
|
|
105
|
+
' status: { enum: [open, in-progress, done, out-of-scope] }',
|
|
106
|
+
` map: { type: string, reference: ${WAYFINDING_MAP_TYPE} }`,
|
|
107
|
+
` blocked_by: { type: array, items: { type: string, reference: ${WAYFINDING_TICKET_TYPE} } }`,
|
|
108
|
+
' assignee:',
|
|
109
|
+
...ASSIGNEE,
|
|
110
|
+
' conversation: { type: string, format: uuid }',
|
|
111
|
+
` app: { type: string, pattern: '${APP_REFERENCE_PATTERN.source}' }`,
|
|
112
|
+
' required: [title, kind, status, map, blocked_by]',
|
|
113
|
+
' sections:',
|
|
114
|
+
' Question: { kind: text }',
|
|
115
|
+
' Answer: { kind: text }',
|
|
116
|
+
' allOf:',
|
|
117
|
+
' - if: { properties: { status: { enum: [in-progress, done, out-of-scope] } }, required: [status] }',
|
|
118
|
+
' then: { required: [assignee] }',
|
|
119
|
+
' else: { properties: { assignee: false } }',
|
|
120
|
+
' - if: { properties: { assignee: { required: [agent] } }, required: [assignee] }',
|
|
121
|
+
' else: { properties: { conversation: false } }',
|
|
122
|
+
' - if: { properties: { status: { enum: [done, out-of-scope] } }, required: [status] }',
|
|
123
|
+
' then: { sections: { Answer: { kind: text, required: true } } }',
|
|
124
|
+
HOUSE_MODEL_TYPES,
|
|
66
125
|
].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('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;AAgBhC,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAuBxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAsL1F"}
|
package/dist/site.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { stepped } from '@agentshouse/mdruntime';
|
|
2
|
-
import { actionOutcome
|
|
2
|
+
import { actionOutcome } from './actions.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 { bootstrapping } from './read.js';
|
|
5
|
+
import { roomStreams } from './room-stream.js';
|
|
6
|
+
import { classifyDoor, discoveryFailure } from './refusal.js';
|
|
7
|
+
import { HOUSE_TYPED_PATHS } from './house-model.js';
|
|
8
|
+
import { HOUSE_NAMEABLE_ROOM_TYPES, HOUSE_ROOM_TYPES } from './room-types.js';
|
|
9
9
|
import { houseNotifications } from './stream.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import { followsVersion, logPosition, presented, reachedVersion, roomVersion, } from './version.js';
|
|
10
|
+
import { houseSiteRoute, SITE_DOOR_SUBMIT, SITE_FILES, SITE_SUBMISSION, } from './transport.js';
|
|
11
|
+
import { followsVersion, logPosition, presented, reachedVersion, roomVersion } from './version.js';
|
|
13
12
|
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
14
13
|
function unfound() {
|
|
15
14
|
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
@@ -25,177 +24,106 @@ function siteRoom(tracked) {
|
|
|
25
24
|
providerOwnedPaths: [],
|
|
26
25
|
};
|
|
27
26
|
}
|
|
28
|
-
function settled(refused) {
|
|
29
|
-
return refused.kind === 'beyond-horizon' ? UNCERTAIN : refused;
|
|
30
|
-
}
|
|
31
27
|
export function createSiteAdapter(transport, snapshot = false) {
|
|
32
|
-
const notifications = houseNotifications(transport, 'site'
|
|
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
|
+
});
|
|
33
35
|
const tracked = new Map();
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
const named = houseReferrer(referrer, tracked);
|
|
37
|
-
return named === null || !tracked.has(named.locator) ? null : named;
|
|
38
|
-
}
|
|
36
|
+
const read = new Map();
|
|
37
|
+
const rooms = roomStreams('site');
|
|
39
38
|
function fileRoute(request) {
|
|
40
|
-
const
|
|
41
|
-
if (
|
|
42
|
-
return { kind: '
|
|
43
|
-
}
|
|
44
|
-
if (request.fileRef === undefined)
|
|
45
|
-
return unfound();
|
|
46
|
-
const { room_ref, path, record } = named.referrer;
|
|
47
|
-
return `${SITE_FILES}${room_ref}/${encodeURIComponent(request.fileRef)}/${path === undefined
|
|
48
|
-
? `${SITE_FILE_RECORD}/${encodeURIComponent(record)}`
|
|
49
|
-
: encodeURIComponent(path)}`;
|
|
50
|
-
}
|
|
51
|
-
async function enumerated(entry, from, page) {
|
|
52
|
-
const answer = await transport.door(SITE_DOOR_ENUMERATE, {
|
|
53
|
-
positions: [
|
|
54
|
-
page === undefined
|
|
55
|
-
? presented(entry.authority, from)
|
|
56
|
-
: {
|
|
57
|
-
...presented(entry.authority, { position: page.after, logEpoch: from.logEpoch }),
|
|
58
|
-
page: { through: page.through, read: page.read },
|
|
59
|
-
},
|
|
60
|
-
],
|
|
61
|
-
});
|
|
62
|
-
const classified = classifyRead(answer.status, answer.body, entry.locator);
|
|
63
|
-
if (classified !== null)
|
|
64
|
-
return classified;
|
|
65
|
-
const found = parseEnumeration(answer.body, 'site');
|
|
66
|
-
if (found === null)
|
|
67
|
-
return UNCERTAIN;
|
|
68
|
-
return viewOf(found, entry) ?? { kind: 'room-not-readable', locator: entry.locator };
|
|
69
|
-
}
|
|
70
|
-
async function enumeration(entry, from) {
|
|
71
|
-
const first = await enumerated(entry, from);
|
|
72
|
-
return 'kind' in first ? first : wholeView(first, (page) => enumerated(entry, from, page));
|
|
39
|
+
const entry = tracked.get(request.locator);
|
|
40
|
+
if (entry === undefined)
|
|
41
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
42
|
+
return `${SITE_FILES}${entry.authority}/${encodeURIComponent(request.revision)}/${encodeURIComponent(request.path)}`;
|
|
73
43
|
}
|
|
74
|
-
async function
|
|
75
|
-
const cut =
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
|
|
44
|
+
async function openedRoom(entry, arriving, signal) {
|
|
45
|
+
const cut = read.get(entry.locator);
|
|
46
|
+
const answered = await transport.streamed(`${houseSiteRoute('bootstrap')}/${entry.authority}${cut === undefined ? '' : `?expired=${cut}`}`, signal ?? new AbortController().signal);
|
|
47
|
+
if (answered.room === null)
|
|
48
|
+
return classifyDoor(answered.status, answered.body, entry.locator) ?? UNCERTAIN;
|
|
49
|
+
const head = await rooms.head(entry, answered.room, arriving, signal);
|
|
50
|
+
const at = head.kind === 'bootstrap' ? logPosition(head.roomVersion) : null;
|
|
51
|
+
if (at !== null)
|
|
52
|
+
read.set(entry.locator, at.position);
|
|
53
|
+
return head;
|
|
82
54
|
}
|
|
83
|
-
async function
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
expired.set(entry.locator, room.position);
|
|
89
|
-
if (failure !== null)
|
|
90
|
-
return failure;
|
|
91
|
-
const scope = await housePart(room, answer.body, listed, 'site');
|
|
92
|
-
if (scope !== null)
|
|
93
|
-
return scope;
|
|
94
|
-
}
|
|
95
|
-
return unverifiedPart(entry.locator);
|
|
55
|
+
async function namedDocument(entry, path, signal) {
|
|
56
|
+
const answered = await transport.streamed(`${houseSiteRoute('bootstrap')}/${entry.authority}?path=${encodeURIComponent(path)}`, signal ?? new AbortController().signal);
|
|
57
|
+
if (answered.room === null)
|
|
58
|
+
return classifyDoor(answered.status, answered.body, entry.locator) ?? UNCERTAIN;
|
|
59
|
+
return rooms.named(entry, answered.room, signal);
|
|
96
60
|
}
|
|
97
|
-
async function
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return settled(view);
|
|
109
|
-
return stepped(advancedScope(scope, view));
|
|
61
|
+
async function streamedPage(entry, token) {
|
|
62
|
+
const part = await rooms.part(entry, token);
|
|
63
|
+
if ('kind' in part)
|
|
64
|
+
return part;
|
|
65
|
+
const { folders: _folders, ...page } = await stepped(bootstrapping(part.scope));
|
|
66
|
+
return {
|
|
67
|
+
...page,
|
|
68
|
+
...(part.models === undefined ? {} : { models: part.models }),
|
|
69
|
+
...(part.pageToken === undefined ? {} : { pageToken: part.pageToken }),
|
|
70
|
+
bytes: part.bytes,
|
|
71
|
+
};
|
|
110
72
|
}
|
|
111
|
-
async function
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
notifications.
|
|
124
|
-
|
|
125
|
-
if (answer.kind !== 'net-advancement')
|
|
126
|
-
return answer;
|
|
127
|
-
const models = await viewModels(view, entry);
|
|
128
|
-
return models === undefined ? answer : { ...answer, models };
|
|
73
|
+
async function discovered() {
|
|
74
|
+
const answer = await transport.read(houseSiteRoute('discover'));
|
|
75
|
+
const failed = discoveryFailure(answer.status, answer.body);
|
|
76
|
+
if (failed !== null)
|
|
77
|
+
return failed;
|
|
78
|
+
const document = parseSiteDiscovery(answer.body);
|
|
79
|
+
if (document === null)
|
|
80
|
+
return UNCERTAIN;
|
|
81
|
+
const entries = siteTracked(document);
|
|
82
|
+
tracked.clear();
|
|
83
|
+
for (const entry of entries)
|
|
84
|
+
tracked.set(entry.locator, entry);
|
|
85
|
+
notifications.track(entries);
|
|
86
|
+
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
129
87
|
}
|
|
130
88
|
return {
|
|
131
89
|
localSaves: true,
|
|
132
|
-
exhaustiveDiscovery: true,
|
|
133
90
|
roomTypes: HOUSE_ROOM_TYPES,
|
|
91
|
+
nameableRoomTypes: HOUSE_NAMEABLE_ROOM_TYPES,
|
|
92
|
+
typedPaths: HOUSE_TYPED_PATHS,
|
|
134
93
|
async authorize() {
|
|
135
94
|
return {};
|
|
136
95
|
},
|
|
137
|
-
async discover() {
|
|
138
|
-
const answer = await transport.read(SITE_DOOR_DISCOVER);
|
|
139
|
-
const failed = discoveryFailure(answer.status, answer.body);
|
|
140
|
-
if (failed !== null)
|
|
141
|
-
return failed;
|
|
142
|
-
const document = parseSiteDiscovery(answer.body);
|
|
143
|
-
if (document === null)
|
|
144
|
-
return UNCERTAIN;
|
|
145
|
-
const entries = siteTracked(document);
|
|
146
|
-
tracked.clear();
|
|
147
|
-
for (const entry of entries)
|
|
148
|
-
tracked.set(entry.locator, entry);
|
|
149
|
-
notifications.track(entries);
|
|
150
|
-
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
151
|
-
},
|
|
152
96
|
async bootstrap(_authorization, request) {
|
|
153
97
|
const entry = tracked.get(request.locator);
|
|
154
98
|
if (entry === undefined)
|
|
155
99
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
continued = { room, next: 0, seen: [] };
|
|
162
|
-
}
|
|
163
|
-
else
|
|
164
|
-
continued = JSON.parse(request.pageToken);
|
|
165
|
-
const scope = await caughtUp(entry, continued);
|
|
166
|
-
if ('kind' in scope)
|
|
167
|
-
return scope;
|
|
168
|
-
notifications.reach(entry.authority, scope);
|
|
169
|
-
const next = continued.next + 1;
|
|
170
|
-
const more = next < continued.room.parts.length;
|
|
171
|
-
const seen = [
|
|
172
|
-
...continued.seen,
|
|
173
|
-
...entry.schemas.filter((schema) => scope.files.some((file) => file.path === schema)),
|
|
174
|
-
];
|
|
175
|
-
const models = await partModels(scope, entry, new Set(seen), !more);
|
|
176
|
-
const { folders: _folders, ...page } = await stepped(bootstrapping(scope));
|
|
177
|
-
return {
|
|
178
|
-
...page,
|
|
179
|
-
...(models === undefined ? {} : { models }),
|
|
180
|
-
...(more ? { pageToken: JSON.stringify({ ...continued, next, seen }) } : {}),
|
|
181
|
-
};
|
|
100
|
+
if (request.path !== undefined)
|
|
101
|
+
return namedDocument(entry, request.path, request.signal);
|
|
102
|
+
return request.pageToken === undefined
|
|
103
|
+
? openedRoom(entry, request.arriving, request.signal)
|
|
104
|
+
: streamedPage(entry, request.pageToken);
|
|
182
105
|
},
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
106
|
+
...(snapshot
|
|
107
|
+
? {
|
|
108
|
+
discover: discovered,
|
|
109
|
+
async refresh(_authorization, request) {
|
|
110
|
+
const entry = tracked.get(request.locator);
|
|
111
|
+
if (entry === undefined)
|
|
112
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
113
|
+
if (request.pageToken !== undefined)
|
|
114
|
+
return UNCERTAIN;
|
|
115
|
+
return request.fromRoomVersion === roomVersion(entry)
|
|
116
|
+
? { kind: 'still-current' }
|
|
117
|
+
: { kind: 'beyond-horizon' };
|
|
118
|
+
},
|
|
193
119
|
}
|
|
194
|
-
|
|
195
|
-
},
|
|
120
|
+
: {}),
|
|
196
121
|
async mutate() {
|
|
197
122
|
return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {}, retryable: false };
|
|
198
123
|
},
|
|
124
|
+
async attach() {
|
|
125
|
+
return { kind: 'rejected', code: 'write-grant', fields: {}, retryable: false };
|
|
126
|
+
},
|
|
199
127
|
async history() {
|
|
200
128
|
return { kind: 'no-history' };
|
|
201
129
|
},
|
|
@@ -220,13 +148,6 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
220
148
|
name: request.path.slice(request.path.lastIndexOf('/') + 1),
|
|
221
149
|
};
|
|
222
150
|
},
|
|
223
|
-
referrerScope(referrer) {
|
|
224
|
-
const named = published(referrer);
|
|
225
|
-
if (named === null)
|
|
226
|
-
return null;
|
|
227
|
-
const { path } = named.referrer;
|
|
228
|
-
return { locator: named.locator, ...(path === undefined ? {} : { path }) };
|
|
229
|
-
},
|
|
230
151
|
reached(locator, version, target) {
|
|
231
152
|
return reachedVersion(version, target, tracked.get(locator)?.logEpoch);
|
|
232
153
|
},
|
|
@@ -234,7 +155,7 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
234
155
|
return followsVersion(version, next);
|
|
235
156
|
},
|
|
236
157
|
async action(_authorization, request) {
|
|
237
|
-
if (request.name !==
|
|
158
|
+
if (request.name !== SITE_SUBMISSION) {
|
|
238
159
|
return {
|
|
239
160
|
kind: 'rejected',
|
|
240
161
|
code: 'action-unimplemented',
|
|
@@ -244,7 +165,7 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
244
165
|
}
|
|
245
166
|
if (!transport.online())
|
|
246
167
|
return UNCERTAIN;
|
|
247
|
-
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input),
|
|
168
|
+
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITE_SUBMISSION, request.input);
|
|
248
169
|
},
|
|
249
170
|
roomStream: snapshot
|
|
250
171
|
? undefined
|
|
@@ -253,19 +174,10 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
253
174
|
notifications.send(rooms.flatMap((room) => {
|
|
254
175
|
const entry = tracked.get(room.locator);
|
|
255
176
|
const at = logPosition(room.roomVersion);
|
|
256
|
-
|
|
257
|
-
return [];
|
|
258
|
-
notifications.reach(entry.authority, at);
|
|
259
|
-
return [presented(entry.authority, at)];
|
|
177
|
+
return entry === undefined || at === null ? [] : [presented(entry.authority, at)];
|
|
260
178
|
}));
|
|
261
179
|
},
|
|
262
|
-
reopen: notifications.reopen,
|
|
263
180
|
observe: notifications.observe,
|
|
264
|
-
published(locator, roomVersion) {
|
|
265
|
-
const at = logPosition(roomVersion);
|
|
266
|
-
if (at !== null)
|
|
267
|
-
notifications.published(locator, at);
|
|
268
|
-
},
|
|
269
181
|
},
|
|
270
182
|
serviceMode: notifications.serviceMode,
|
|
271
183
|
};
|
package/dist/stream.d.ts
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type AuthorityChange, type Discovery, type ConversationStream, type RoomStreamEvent, type ServiceModeSignal } from '@agentshouse/mdruntime';
|
|
2
2
|
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
-
import type
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
import { type HouseDoor, type HouseHeldRoom, type HouseMode, type HouseStreamFrame } from './transport.js';
|
|
4
|
+
export type HouseOpeningFrame = Extract<HouseStreamFrame, {
|
|
5
|
+
type: 'opening';
|
|
6
|
+
}>;
|
|
7
|
+
export type HouseAuthorityChangedFrame = Extract<HouseStreamFrame, {
|
|
8
|
+
type: 'authority_changed';
|
|
9
|
+
}>;
|
|
10
|
+
export type HouseDiscovering = {
|
|
11
|
+
opened(frame: HouseOpeningFrame | null): Promise<Discovery | null>;
|
|
12
|
+
changed(frame: HouseAuthorityChangedFrame): AuthorityChange | null;
|
|
9
13
|
};
|
|
10
14
|
export type HouseNotifications = {
|
|
11
15
|
runtime: string;
|
|
12
|
-
observe(notify: (event: RoomStreamEvent) => void
|
|
16
|
+
observe(notify: (event: RoomStreamEvent) => void): () => void;
|
|
13
17
|
send(rooms: readonly HouseHeldRoom[]): void;
|
|
14
|
-
published(locator: string, at: LogPosition): void;
|
|
15
|
-
reopen(): void;
|
|
16
18
|
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
19
|
conversations: ConversationStream;
|
|
21
20
|
serviceMode: ServiceModeSignal;
|
|
22
21
|
};
|
|
23
|
-
export declare function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications;
|
|
22
|
+
export declare function houseNotifications(transport: HouseDoor, mode: HouseMode, discovering: HouseDiscovering): HouseNotifications;
|
|
24
23
|
//# sourceMappingURL=stream.d.ts.map
|