@agentshouse/mdruntime-adapter 0.1.0-cf9ab9b7cbbca → 0.1.0-cfd2dc1938a2c
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 +6 -66
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +23 -340
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +245 -366
- 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/authored-path.d.ts +11 -0
- package/dist/authored-path.d.ts.map +1 -0
- package/dist/authored-path.js +35 -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 +23 -15
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +92 -55
- 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 +397 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/model.d.ts +5 -4
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +34 -41
- package/dist/read.d.ts +57 -64
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +154 -318
- package/dist/refusal.d.ts +1 -3
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +4 -5
- package/dist/room-types.d.ts +5 -0
- package/dist/room-types.d.ts.map +1 -0
- package/dist/room-types.js +120 -0
- 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 +102 -202
- 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 +261 -421
- package/dist/transport.d.ts +66 -43
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +54 -11
- package/dist/upload.d.ts +12 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +63 -0
- package/dist/write.d.ts +18 -2
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +108 -80
- package/package.json +8 -4
- package/AGENTS.md +0 -299
- package/dist/gather.d.ts +0 -4
- package/dist/gather.d.ts.map +0 -1
- package/dist/gather.js +0 -45
- package/dist/handed.d.ts +0 -15
- package/dist/handed.d.ts.map +0 -1
- package/dist/handed.js +0 -38
- package/dist/referrer.d.ts +0 -7
- package/dist/referrer.d.ts.map +0 -1
- package/dist/referrer.js +0 -35
|
@@ -0,0 +1,120 @@
|
|
|
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';
|
|
4
|
+
export const INBOX_CHANNEL_KINDS = [
|
|
5
|
+
'telegram-bot',
|
|
6
|
+
'telegram-business',
|
|
7
|
+
'whatsapp',
|
|
8
|
+
'messenger',
|
|
9
|
+
'instagram',
|
|
10
|
+
'viber',
|
|
11
|
+
'tiktok',
|
|
12
|
+
];
|
|
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
|
+
];
|
|
23
|
+
const IDENTITY = "{ type: string, pattern: '^\\S+$' }";
|
|
24
|
+
const AGENT = [' agent: { type: string, format: uuid }', ' name: { type: string }'];
|
|
25
|
+
const ASSIGNEE = [
|
|
26
|
+
' type: object',
|
|
27
|
+
' properties:',
|
|
28
|
+
' user: { type: string, format: uuid }',
|
|
29
|
+
...AGENT,
|
|
30
|
+
];
|
|
31
|
+
export const HOUSE_ROOM_TYPES = [
|
|
32
|
+
`${CHAT_TYPE}:`,
|
|
33
|
+
' properties:',
|
|
34
|
+
' inbox: { type: string, format: uuid }',
|
|
35
|
+
` channel: { enum: [${INBOX_CHANNEL_KINDS.join(', ')}] }`,
|
|
36
|
+
` chat: ${IDENTITY}`,
|
|
37
|
+
' customer:',
|
|
38
|
+
' type: object',
|
|
39
|
+
' properties:',
|
|
40
|
+
' name: { type: string }',
|
|
41
|
+
` username: ${IDENTITY}`,
|
|
42
|
+
` phone: ${IDENTITY}`,
|
|
43
|
+
' assignee:',
|
|
44
|
+
...ASSIGNEE,
|
|
45
|
+
' return_to:',
|
|
46
|
+
' type: object',
|
|
47
|
+
' properties:',
|
|
48
|
+
...AGENT,
|
|
49
|
+
' required: [chat, customer]',
|
|
50
|
+
`${CHAT_MESSAGE_TYPE}:`,
|
|
51
|
+
' properties:',
|
|
52
|
+
' direction: { enum: [in, out] }',
|
|
53
|
+
' sender:',
|
|
54
|
+
...ASSIGNEE,
|
|
55
|
+
` username: ${IDENTITY}`,
|
|
56
|
+
' sent_at: { type: string, format: date-time }',
|
|
57
|
+
` channel_message: ${IDENTITY}`,
|
|
58
|
+
' labelled: { const: true }',
|
|
59
|
+
' reactions:',
|
|
60
|
+
' type: array',
|
|
61
|
+
' items:',
|
|
62
|
+
' type: object',
|
|
63
|
+
' properties:',
|
|
64
|
+
' reaction: { type: string, minLength: 1 }',
|
|
65
|
+
' sender:',
|
|
66
|
+
' type: object',
|
|
67
|
+
' properties:',
|
|
68
|
+
` id: ${IDENTITY}`,
|
|
69
|
+
' name: { type: string }',
|
|
70
|
+
` username: ${IDENTITY}`,
|
|
71
|
+
' count: { type: integer, minimum: 1 }',
|
|
72
|
+
' required: [reaction]',
|
|
73
|
+
` post: ${IDENTITY}`,
|
|
74
|
+
' assignee:',
|
|
75
|
+
...ASSIGNEE,
|
|
76
|
+
' sent_outside: { const: true }',
|
|
77
|
+
' template:',
|
|
78
|
+
' type: object',
|
|
79
|
+
' properties:',
|
|
80
|
+
' name: { type: string, minLength: 1 }',
|
|
81
|
+
' language: { type: string, minLength: 1 }',
|
|
82
|
+
' required: [name, language]',
|
|
83
|
+
' values:',
|
|
84
|
+
' type: object',
|
|
85
|
+
' additionalProperties: { type: string }',
|
|
86
|
+
' withheld: { const: true }',
|
|
87
|
+
' required: [direction]',
|
|
88
|
+
' if: { properties: { direction: { const: in } } }',
|
|
89
|
+
' then: { required: [sent_at] }',
|
|
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,
|
|
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;AAgBhC,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAuBxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAkK1F"}
|
package/dist/site.js
CHANGED
|
@@ -1,227 +1,142 @@
|
|
|
1
|
-
import { actionOutcome
|
|
1
|
+
import { actionOutcome } from './actions.js';
|
|
2
|
+
import { chunkedHead, chunkPart, siteChunkList } from './chunks.js';
|
|
2
3
|
import { mapDiscovery, parseSiteDiscovery, siteCapabilities, siteTracked, } from './discovery.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { spaceSchemas } from './space-schema.js';
|
|
5
|
+
import { discoveryFailure } from './refusal.js';
|
|
6
|
+
import { admittedPath } from './authored-path.js';
|
|
7
|
+
import { HOUSE_TYPED_PATHS } from './house-model.js';
|
|
8
|
+
import { HOUSE_NAMEABLE_ROOM_TYPES, HOUSE_ROOM_TYPES } from './room-types.js';
|
|
7
9
|
import { houseNotifications } from './stream.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { followsVersion, logPosition, presented, reachedVersion, roomVersion, } from './version.js';
|
|
10
|
+
import { houseSiteRoute, SITE_DOOR_SUBMIT, SITE_FILES, SITES_SUBMISSIONS_CREATE, } from './transport.js';
|
|
11
|
+
import { followsVersion, reachedVersion, roomVersion } from './version.js';
|
|
11
12
|
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
13
|
+
function unfound() {
|
|
14
|
+
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
15
|
+
}
|
|
12
16
|
function siteRoom(tracked) {
|
|
13
17
|
return {
|
|
14
18
|
name: tracked.handle,
|
|
15
19
|
locator: tracked.locator,
|
|
16
20
|
handle: tracked.handle,
|
|
17
21
|
roomVersion: roomVersion(tracked),
|
|
18
|
-
operations: {
|
|
19
|
-
replica: { selection: tracked.locator, admission: 'admitted' },
|
|
22
|
+
operations: { write: [], erase: [] },
|
|
23
|
+
replica: { selection: tracked.locator, admission: 'admitted', offline: 'open' },
|
|
20
24
|
providerOwnedPaths: [],
|
|
21
25
|
};
|
|
22
26
|
}
|
|
23
|
-
function settled(refused) {
|
|
24
|
-
return refused.kind === 'beyond-horizon' ? UNCERTAIN : refused;
|
|
25
|
-
}
|
|
26
27
|
export function createSiteAdapter(transport, snapshot = false) {
|
|
27
|
-
const
|
|
28
|
+
const spaces = spaceSchemas();
|
|
29
|
+
const notifications = houseNotifications(transport, 'site', {
|
|
30
|
+
opened: async () => {
|
|
31
|
+
const found = await discovered();
|
|
32
|
+
return found.kind === 'discovery' ? found : null;
|
|
33
|
+
},
|
|
34
|
+
changed: () => null,
|
|
35
|
+
}, spaces);
|
|
28
36
|
const tracked = new Map();
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
positions: [
|
|
36
|
-
page === undefined
|
|
37
|
-
? presented(entry.authority, from)
|
|
38
|
-
: {
|
|
39
|
-
...presented(entry.authority, { position: page.after, logEpoch: from.logEpoch }),
|
|
40
|
-
page: { through: page.through, read: page.read },
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
});
|
|
44
|
-
const classified = classifyRead(answer.status, answer.body, entry.locator);
|
|
45
|
-
if (classified !== null)
|
|
46
|
-
return classified;
|
|
47
|
-
const found = parseEnumeration(answer.body, 'site');
|
|
48
|
-
if (found === null)
|
|
49
|
-
return UNCERTAIN;
|
|
50
|
-
return viewOf(found, entry) ?? { kind: 'room-not-readable', locator: entry.locator };
|
|
51
|
-
}
|
|
52
|
-
async function enumeration(entry, from) {
|
|
53
|
-
const first = await enumerated(entry, from);
|
|
54
|
-
return 'kind' in first ? first : wholeView(first, (page) => enumerated(entry, from, page));
|
|
37
|
+
const chunked = new Map();
|
|
38
|
+
function fileRoute(request) {
|
|
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)}`;
|
|
55
43
|
}
|
|
56
|
-
async function
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const scope = parseSiteBootstrap(answer.body);
|
|
66
|
-
return scope === null ? { failure: UNCERTAIN } : { body: answer.body, scope };
|
|
44
|
+
async function listedRoom(entry) {
|
|
45
|
+
const past = chunked.get(entry.locator)?.position;
|
|
46
|
+
const listed = siteChunkList(await transport.read(`${houseSiteRoute('chunks')}/${entry.authority}${past === undefined ? '' : `?expired=${past}`}`), entry.locator);
|
|
47
|
+
if ('kind' in listed)
|
|
48
|
+
return listed;
|
|
49
|
+
const head = await chunkedHead(listed, entry, spaces);
|
|
50
|
+
if (head.kind === 'bootstrap')
|
|
51
|
+
chunked.set(entry.locator, listed);
|
|
52
|
+
return head;
|
|
67
53
|
}
|
|
68
|
-
async function
|
|
69
|
-
const
|
|
70
|
-
|
|
54
|
+
async function chunkPage(entry, id, arriving) {
|
|
55
|
+
const room = chunked.get(entry.locator);
|
|
56
|
+
const address = room?.chunks.get(id);
|
|
57
|
+
if (room === undefined || address === undefined)
|
|
71
58
|
return UNCERTAIN;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
for (;;) {
|
|
75
|
-
const part = await bootstrapPart(entry, path, text.length);
|
|
76
|
-
if ('failure' in part)
|
|
77
|
-
return part.failure;
|
|
78
|
-
const [piece] = part.scope.contents;
|
|
79
|
-
if (piece === undefined ||
|
|
80
|
-
part.scope.contents.length !== 1 ||
|
|
81
|
-
piece.path !== path ||
|
|
82
|
-
piece.content.length === 0) {
|
|
83
|
-
return UNCERTAIN;
|
|
84
|
-
}
|
|
85
|
-
text += piece.content;
|
|
86
|
-
const more = siteBootstrapOffset(part.body);
|
|
87
|
-
if (more === null)
|
|
88
|
-
break;
|
|
89
|
-
if (more !== text.length)
|
|
90
|
-
return UNCERTAIN;
|
|
91
|
-
}
|
|
92
|
-
const file = scope.files.find((held) => held.path === path);
|
|
93
|
-
if (file === undefined || (await sha256Hex(text)) !== file.version)
|
|
59
|
+
const read = await transport.download(address.url);
|
|
60
|
+
if (read.status !== 200)
|
|
94
61
|
return UNCERTAIN;
|
|
95
|
-
return
|
|
96
|
-
}
|
|
97
|
-
async function caughtUp(entry, after) {
|
|
98
|
-
const part = await bootstrapPart(entry, after, null);
|
|
99
|
-
if ('failure' in part)
|
|
100
|
-
return part;
|
|
101
|
-
const next = siteBootstrapNext(part.body);
|
|
102
|
-
const offset = siteBootstrapOffset(part.body);
|
|
103
|
-
if (offset !== null) {
|
|
104
|
-
if (next === null)
|
|
105
|
-
return { failure: UNCERTAIN };
|
|
106
|
-
const scope = await assembled(entry, part.scope, next, offset);
|
|
107
|
-
return 'kind' in scope ? { failure: scope } : { scope, next };
|
|
108
|
-
}
|
|
109
|
-
const { scope } = part;
|
|
110
|
-
if (after !== null || next !== null || roomVersion(scope) === roomVersion(entry)) {
|
|
111
|
-
return { scope, next };
|
|
112
|
-
}
|
|
113
|
-
const view = await enumeration(entry, scope);
|
|
114
|
-
if ('kind' in view)
|
|
115
|
-
return { failure: settled(view) };
|
|
116
|
-
return { scope: advancedScope(scope, view), next: null };
|
|
62
|
+
return chunkPart(read.body, room, id, arriving);
|
|
117
63
|
}
|
|
118
|
-
async function
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
notifications.
|
|
131
|
-
|
|
132
|
-
if (answer.kind !== 'net-advancement')
|
|
133
|
-
return answer;
|
|
134
|
-
const models = await viewModels(view, entry);
|
|
135
|
-
return models === undefined ? answer : { ...answer, models };
|
|
64
|
+
async function discovered() {
|
|
65
|
+
const answer = await transport.read(houseSiteRoute('discover'));
|
|
66
|
+
const failed = discoveryFailure(answer.status, answer.body);
|
|
67
|
+
if (failed !== null)
|
|
68
|
+
return failed;
|
|
69
|
+
const document = parseSiteDiscovery(answer.body);
|
|
70
|
+
if (document === null)
|
|
71
|
+
return UNCERTAIN;
|
|
72
|
+
const entries = siteTracked(document);
|
|
73
|
+
tracked.clear();
|
|
74
|
+
for (const entry of entries)
|
|
75
|
+
tracked.set(entry.locator, entry);
|
|
76
|
+
notifications.track(entries);
|
|
77
|
+
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
136
78
|
}
|
|
137
79
|
return {
|
|
138
80
|
localSaves: true,
|
|
139
|
-
|
|
81
|
+
roomTypes: HOUSE_ROOM_TYPES,
|
|
82
|
+
nameableRoomTypes: HOUSE_NAMEABLE_ROOM_TYPES,
|
|
83
|
+
typedPaths: HOUSE_TYPED_PATHS,
|
|
84
|
+
pathRule: admittedPath,
|
|
140
85
|
async authorize() {
|
|
141
86
|
return {};
|
|
142
87
|
},
|
|
143
|
-
async discover() {
|
|
144
|
-
const answer = await transport.read(SITE_DOOR_DISCOVER);
|
|
145
|
-
const failed = discoveryFailure(answer.status, answer.body);
|
|
146
|
-
if (failed !== null)
|
|
147
|
-
return failed;
|
|
148
|
-
const document = parseSiteDiscovery(answer.body);
|
|
149
|
-
if (document === null)
|
|
150
|
-
return UNCERTAIN;
|
|
151
|
-
const entries = siteTracked(document);
|
|
152
|
-
tracked.clear();
|
|
153
|
-
for (const entry of entries)
|
|
154
|
-
tracked.set(entry.locator, entry);
|
|
155
|
-
notifications.track(entries);
|
|
156
|
-
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
157
|
-
},
|
|
158
88
|
async bootstrap(_authorization, request) {
|
|
159
89
|
const entry = tracked.get(request.locator);
|
|
160
90
|
if (entry === undefined)
|
|
161
91
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
162
|
-
|
|
163
|
-
?
|
|
164
|
-
:
|
|
165
|
-
const held = await caughtUp(entry, continued?.after ?? null);
|
|
166
|
-
if ('failure' in held)
|
|
167
|
-
return held.failure;
|
|
168
|
-
notifications.reach(entry.authority, held.scope);
|
|
169
|
-
const seen = [
|
|
170
|
-
...(continued?.seen ?? []),
|
|
171
|
-
...entry.schemas.filter((schema) => held.scope.files.some((file) => file.path === schema)),
|
|
172
|
-
];
|
|
173
|
-
const models = await partModels(held.scope, entry, new Set(seen), held.next === null);
|
|
174
|
-
const continuation = held.next === null ? null : { after: held.next, seen };
|
|
175
|
-
return {
|
|
176
|
-
...bootstrapOf(held.scope),
|
|
177
|
-
...(models === undefined ? {} : { models }),
|
|
178
|
-
...(continuation === null ? {} : { pageToken: JSON.stringify(continuation) }),
|
|
179
|
-
};
|
|
92
|
+
return request.pageToken === undefined
|
|
93
|
+
? listedRoom(entry)
|
|
94
|
+
: chunkPage(entry, request.pageToken, request.arriving);
|
|
180
95
|
},
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
96
|
+
...(snapshot
|
|
97
|
+
? {
|
|
98
|
+
discover: discovered,
|
|
99
|
+
async refresh(_authorization, request) {
|
|
100
|
+
const entry = tracked.get(request.locator);
|
|
101
|
+
if (entry === undefined)
|
|
102
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
103
|
+
if (request.pageToken !== undefined)
|
|
104
|
+
return UNCERTAIN;
|
|
105
|
+
return request.fromRoomVersion === roomVersion(entry)
|
|
106
|
+
? { kind: 'still-current' }
|
|
107
|
+
: { kind: 'beyond-horizon' };
|
|
108
|
+
},
|
|
191
109
|
}
|
|
192
|
-
|
|
193
|
-
},
|
|
110
|
+
: {}),
|
|
194
111
|
async mutate() {
|
|
195
112
|
return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {}, retryable: false };
|
|
196
113
|
},
|
|
114
|
+
async attach() {
|
|
115
|
+
return { kind: 'rejected', code: 'write-grant', fields: {}, retryable: false };
|
|
116
|
+
},
|
|
197
117
|
async history() {
|
|
198
118
|
return { kind: 'no-history' };
|
|
199
119
|
},
|
|
200
120
|
async binary(_authorization, request) {
|
|
201
|
-
const
|
|
202
|
-
if (
|
|
203
|
-
return
|
|
204
|
-
|
|
205
|
-
if (
|
|
206
|
-
return
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
const read = await transport.download(`${SITE_FILES}${room_ref}/${encodeURIComponent(request.fileRef)}/${path === undefined
|
|
210
|
-
? `${SITE_FILE_RECORD}/${encodeURIComponent(record)}`
|
|
211
|
-
: encodeURIComponent(path)}`);
|
|
212
|
-
if (read.status === 404) {
|
|
213
|
-
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
214
|
-
}
|
|
215
|
-
return read.status === 200 && read.blob !== null
|
|
216
|
-
? { kind: 'binary', blob: read.blob }
|
|
121
|
+
const route = fileRoute(request);
|
|
122
|
+
if (typeof route !== 'string')
|
|
123
|
+
return route;
|
|
124
|
+
const read = await transport.download(route);
|
|
125
|
+
if (read.status === 404)
|
|
126
|
+
return unfound();
|
|
127
|
+
return read.status === 200 && read.body !== null
|
|
128
|
+
? { kind: 'binary', body: read.body, mediaType: read.mediaType }
|
|
217
129
|
: UNCERTAIN;
|
|
218
130
|
},
|
|
219
|
-
|
|
220
|
-
const
|
|
221
|
-
if (
|
|
222
|
-
return
|
|
223
|
-
|
|
224
|
-
|
|
131
|
+
async link(_authorization, request) {
|
|
132
|
+
const route = fileRoute(request);
|
|
133
|
+
if (typeof route !== 'string')
|
|
134
|
+
return route;
|
|
135
|
+
return {
|
|
136
|
+
kind: 'link',
|
|
137
|
+
url: route,
|
|
138
|
+
name: request.path.slice(request.path.lastIndexOf('/') + 1),
|
|
139
|
+
};
|
|
225
140
|
},
|
|
226
141
|
reached(locator, version, target) {
|
|
227
142
|
return reachedVersion(version, target, tracked.get(locator)?.logEpoch);
|
|
@@ -230,7 +145,7 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
230
145
|
return followsVersion(version, next);
|
|
231
146
|
},
|
|
232
147
|
async action(_authorization, request) {
|
|
233
|
-
if (request.name !==
|
|
148
|
+
if (request.name !== SITES_SUBMISSIONS_CREATE) {
|
|
234
149
|
return {
|
|
235
150
|
kind: 'rejected',
|
|
236
151
|
code: 'action-unimplemented',
|
|
@@ -240,28 +155,13 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
240
155
|
}
|
|
241
156
|
if (!transport.online())
|
|
242
157
|
return UNCERTAIN;
|
|
243
|
-
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input),
|
|
158
|
+
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITES_SUBMISSIONS_CREATE, request.input);
|
|
244
159
|
},
|
|
245
160
|
roomStream: snapshot
|
|
246
161
|
? undefined
|
|
247
162
|
: {
|
|
248
|
-
hold
|
|
249
|
-
notifications.send(rooms.flatMap((room) => {
|
|
250
|
-
const entry = tracked.get(room.locator);
|
|
251
|
-
const at = logPosition(room.roomVersion);
|
|
252
|
-
if (entry === undefined || at === null)
|
|
253
|
-
return [];
|
|
254
|
-
notifications.reach(entry.authority, at);
|
|
255
|
-
return [presented(entry.authority, at)];
|
|
256
|
-
}), null);
|
|
257
|
-
},
|
|
258
|
-
reopen: notifications.reopen,
|
|
163
|
+
hold: notifications.send,
|
|
259
164
|
observe: notifications.observe,
|
|
260
|
-
published(locator, roomVersion) {
|
|
261
|
-
const at = logPosition(roomVersion);
|
|
262
|
-
if (at !== null)
|
|
263
|
-
notifications.published(locator, at);
|
|
264
|
-
},
|
|
265
165
|
},
|
|
266
166
|
serviceMode: notifications.serviceMode,
|
|
267
167
|
};
|
|
@@ -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
|
-
|
|
9
|
-
|
|
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;
|
|
10
15
|
};
|
|
11
16
|
export type HouseNotifications = {
|
|
12
17
|
runtime: string;
|
|
13
|
-
observe(notify: (event: RoomStreamEvent) => void
|
|
14
|
-
send(rooms: readonly
|
|
15
|
-
published(locator: string, at: LogPosition): void;
|
|
16
|
-
reopen(): void;
|
|
18
|
+
observe(notify: (event: RoomStreamEvent) => void): () => void;
|
|
19
|
+
send(rooms: readonly HeldRoom[]): void;
|
|
17
20
|
track(authorities: readonly TrackedAuthority[]): void;
|
|
18
|
-
reach(authority: string, at: LogPosition): void;
|
|
19
|
-
advance(tracked: TrackedAuthority, from: LogPosition, holds?: HeldRevision): StreamedAdvancement | null;
|
|
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,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;AAYtD,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;AAgGF,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,YAAY,GACnB,kBAAkB,CA8XpB"}
|