@agentshouse/mdruntime-adapter 0.1.0-cd23c45caa798 → 0.1.0-cd24cf2286fd6
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 -72
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +7 -319
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +204 -417
- 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 +641 -0
- package/dist/house-model.d.ts.map +1 -0
- package/dist/house-model.js +361 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -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 +31 -54
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +82 -300
- 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 +7 -0
- package/dist/room-types.d.ts.map +1 -0
- package/dist/room-types.js +123 -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 +82 -185
- 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 -14
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +230 -408
- package/dist/transport.d.ts +50 -40
- 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 +6 -1
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +28 -39
- package/package.json +8 -4
- package/AGENTS.md +0 -304
- package/dist/gather.d.ts +0 -4
- package/dist/gather.d.ts.map +0 -1
- package/dist/gather.js +0 -35
- package/dist/handed.d.ts +0 -15
- package/dist/handed.d.ts.map +0 -1
- package/dist/handed.js +0 -45
- package/dist/part.d.ts +0 -13
- package/dist/part.d.ts.map +0 -1
- package/dist/part.js +0 -80
- package/dist/referrer.d.ts +0 -7
- package/dist/referrer.d.ts.map +0 -1
- package/dist/referrer.js +0 -33
package/dist/refusal.js
CHANGED
|
@@ -39,11 +39,6 @@ export function classifyDoor(status, body, locator) {
|
|
|
39
39
|
return scopedRefusal(locator, failure.scope, failure.refusal);
|
|
40
40
|
return failure;
|
|
41
41
|
}
|
|
42
|
-
export function classifyRead(status, body, locator) {
|
|
43
|
-
if (doorRefusal(body)?.code === 'expired')
|
|
44
|
-
return { kind: 'beyond-horizon' };
|
|
45
|
-
return classifyDoor(status, body, locator);
|
|
46
|
-
}
|
|
47
42
|
export function discoveryFailure(status, body) {
|
|
48
43
|
const failure = doorFailure(status, body);
|
|
49
44
|
if (failure === null)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot', 'telegram-business', 'whatsapp', 'messenger', 'instagram', 'viber', 'tiktok'];
|
|
2
|
+
export type InboxChannelKind = (typeof INBOX_CHANNEL_KINDS)[number];
|
|
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[];
|
|
6
|
+
export declare const HOUSE_ROOM_TYPES: string;
|
|
7
|
+
//# sourceMappingURL=room-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,QA2FjB,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
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
|
+
];
|
|
24
|
+
const IDENTITY = "{ type: string, pattern: '^\\S+$' }";
|
|
25
|
+
const AGENT = [' agent: { type: string, format: uuid }', ' name: { type: string }'];
|
|
26
|
+
const ASSIGNEE = [
|
|
27
|
+
' type: object',
|
|
28
|
+
' properties:',
|
|
29
|
+
' user: { type: string, format: uuid }',
|
|
30
|
+
...AGENT,
|
|
31
|
+
];
|
|
32
|
+
export const HOUSE_ROOM_TYPES = [
|
|
33
|
+
`${CHAT_TYPE}:`,
|
|
34
|
+
' properties:',
|
|
35
|
+
' inbox: { type: string, format: uuid }',
|
|
36
|
+
` channel: { enum: [${INBOX_CHANNEL_KINDS.join(', ')}] }`,
|
|
37
|
+
` chat: ${IDENTITY}`,
|
|
38
|
+
' customer:',
|
|
39
|
+
' type: object',
|
|
40
|
+
' properties:',
|
|
41
|
+
' name: { type: string }',
|
|
42
|
+
` username: ${IDENTITY}`,
|
|
43
|
+
` phone: ${IDENTITY}`,
|
|
44
|
+
' assignee:',
|
|
45
|
+
...ASSIGNEE,
|
|
46
|
+
' return_to:',
|
|
47
|
+
' type: object',
|
|
48
|
+
' properties:',
|
|
49
|
+
...AGENT,
|
|
50
|
+
' required: [chat, customer]',
|
|
51
|
+
`${CHAT_MESSAGE_TYPE}:`,
|
|
52
|
+
' properties:',
|
|
53
|
+
' direction: { enum: [in, out] }',
|
|
54
|
+
' sender:',
|
|
55
|
+
' type: object',
|
|
56
|
+
' properties:',
|
|
57
|
+
' name: { type: string }',
|
|
58
|
+
` username: ${IDENTITY}`,
|
|
59
|
+
' sent_at: { type: string, format: date-time }',
|
|
60
|
+
` channel_message: ${IDENTITY}`,
|
|
61
|
+
' labelled: { const: true }',
|
|
62
|
+
' reactions:',
|
|
63
|
+
' type: array',
|
|
64
|
+
' items:',
|
|
65
|
+
' type: object',
|
|
66
|
+
' properties:',
|
|
67
|
+
' reaction: { type: string, minLength: 1 }',
|
|
68
|
+
' sender:',
|
|
69
|
+
' type: object',
|
|
70
|
+
' properties:',
|
|
71
|
+
` id: ${IDENTITY}`,
|
|
72
|
+
' name: { type: string }',
|
|
73
|
+
` username: ${IDENTITY}`,
|
|
74
|
+
' count: { type: integer, minimum: 1 }',
|
|
75
|
+
' required: [reaction]',
|
|
76
|
+
` post: ${IDENTITY}`,
|
|
77
|
+
' assignee:',
|
|
78
|
+
...ASSIGNEE,
|
|
79
|
+
' sent_outside: { const: true }',
|
|
80
|
+
' template:',
|
|
81
|
+
' type: object',
|
|
82
|
+
' properties:',
|
|
83
|
+
' name: { type: string, minLength: 1 }',
|
|
84
|
+
' language: { type: string, minLength: 1 }',
|
|
85
|
+
' required: [name, language]',
|
|
86
|
+
' values:',
|
|
87
|
+
' type: object',
|
|
88
|
+
' additionalProperties: { type: string }',
|
|
89
|
+
' withheld: { const: true }',
|
|
90
|
+
' required: [direction]',
|
|
91
|
+
' if: { properties: { direction: { const: in } } }',
|
|
92
|
+
' then: { required: [sent_at] }',
|
|
93
|
+
`${WAYFINDING_MAP_TYPE}:`,
|
|
94
|
+
' properties:',
|
|
95
|
+
' title: { type: string }',
|
|
96
|
+
' required: [title]',
|
|
97
|
+
' sections:',
|
|
98
|
+
...WAYFINDING_MAP_SECTIONS.map((name) => ` ${name}: { kind: text, required: true }`),
|
|
99
|
+
`${WAYFINDING_TICKET_TYPE}:`,
|
|
100
|
+
' properties:',
|
|
101
|
+
' title: { type: string }',
|
|
102
|
+
' kind: { enum: [research, prototype, grilling, task] }',
|
|
103
|
+
' status: { enum: [open, in-progress, done, out-of-scope] }',
|
|
104
|
+
` map: { type: string, reference: ${WAYFINDING_MAP_TYPE} }`,
|
|
105
|
+
` blocked_by: { type: array, items: { type: string, reference: ${WAYFINDING_TICKET_TYPE} } }`,
|
|
106
|
+
' assignee:',
|
|
107
|
+
...ASSIGNEE,
|
|
108
|
+
' conversation: { type: string, format: uuid }',
|
|
109
|
+
` app: { type: string, pattern: '${APP_REFERENCE_PATTERN.source}' }`,
|
|
110
|
+
' required: [title, kind, status, map, blocked_by]',
|
|
111
|
+
' sections:',
|
|
112
|
+
' Question: { kind: text }',
|
|
113
|
+
' Answer: { kind: text }',
|
|
114
|
+
' allOf:',
|
|
115
|
+
' - if: { properties: { status: { enum: [in-progress, done, out-of-scope] } }, required: [status] }',
|
|
116
|
+
' then: { required: [assignee] }',
|
|
117
|
+
' else: { properties: { assignee: false } }',
|
|
118
|
+
' - if: { properties: { assignee: { required: [agent] } }, required: [assignee] }',
|
|
119
|
+
' else: { properties: { conversation: false } }',
|
|
120
|
+
' - if: { properties: { status: { enum: [done, out-of-scope] } }, required: [status] }',
|
|
121
|
+
' then: { sections: { Answer: { kind: text, required: true } } }',
|
|
122
|
+
HOUSE_MODEL_TYPES,
|
|
123
|
+
].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;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 {
|
|
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';
|
|
8
8
|
import { houseNotifications } from './stream.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { followsVersion, logPosition, presented, reachedVersion, roomVersion, } from './version.js';
|
|
9
|
+
import { houseSiteRoute, SITE_DOOR_SUBMIT, SITE_FILES, SITE_SUBMISSION, } 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,180 +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
|
-
function settled(refused) {
|
|
28
|
-
return refused.kind === 'beyond-horizon' ? UNCERTAIN : refused;
|
|
29
|
-
}
|
|
30
26
|
export function createSiteAdapter(transport, snapshot = false) {
|
|
31
|
-
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);
|
|
32
35
|
const tracked = new Map();
|
|
33
|
-
const
|
|
34
|
-
function published(referrer) {
|
|
35
|
-
const named = houseReferrer(referrer, tracked);
|
|
36
|
-
return named === null || !tracked.has(named.locator) ? null : named;
|
|
37
|
-
}
|
|
36
|
+
const chunked = new Map();
|
|
38
37
|
function fileRoute(request) {
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
return { kind: '
|
|
42
|
-
}
|
|
43
|
-
if (request.fileRef === undefined)
|
|
44
|
-
return unfound();
|
|
45
|
-
const { room_ref, path, record } = named.referrer;
|
|
46
|
-
return `${SITE_FILES}${room_ref}/${encodeURIComponent(request.fileRef)}/${path === undefined
|
|
47
|
-
? `${SITE_FILE_RECORD}/${encodeURIComponent(record)}`
|
|
48
|
-
: encodeURIComponent(path)}`;
|
|
49
|
-
}
|
|
50
|
-
async function enumerated(entry, from, page) {
|
|
51
|
-
const answer = await transport.door(SITE_DOOR_ENUMERATE, {
|
|
52
|
-
positions: [
|
|
53
|
-
page === undefined
|
|
54
|
-
? presented(entry.authority, from)
|
|
55
|
-
: {
|
|
56
|
-
...presented(entry.authority, { position: page.after, logEpoch: from.logEpoch }),
|
|
57
|
-
page: { through: page.through, read: page.read },
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
});
|
|
61
|
-
const classified = classifyRead(answer.status, answer.body, entry.locator);
|
|
62
|
-
if (classified !== null)
|
|
63
|
-
return classified;
|
|
64
|
-
const found = parseEnumeration(answer.body, 'site');
|
|
65
|
-
if (found === null)
|
|
66
|
-
return UNCERTAIN;
|
|
67
|
-
return viewOf(found, entry) ?? { kind: 'room-not-readable', locator: entry.locator };
|
|
68
|
-
}
|
|
69
|
-
async function enumeration(entry, from) {
|
|
70
|
-
const first = await enumerated(entry, from);
|
|
71
|
-
return 'kind' in first ? first : wholeView(first, (page) => enumerated(entry, from, page));
|
|
72
|
-
}
|
|
73
|
-
async function partedRoom(entry) {
|
|
74
|
-
const cut = expired.get(entry.locator);
|
|
75
|
-
const answer = await transport.read(`${SITE_DOOR_BOOTSTRAP}${entry.authority}${cut === undefined ? '' : `?expired=${cut}`}`);
|
|
76
|
-
const classified = classifyDoor(answer.status, answer.body, entry.locator);
|
|
77
|
-
if (classified !== null)
|
|
78
|
-
return classified;
|
|
79
|
-
const room = parseSiteParted(answer.body);
|
|
80
|
-
return room === null || room.anchor !== entry.authority ? UNCERTAIN : room;
|
|
38
|
+
const entry = tracked.get(request.locator);
|
|
39
|
+
if (entry === undefined)
|
|
40
|
+
return { kind: 'room-not-readable', locator: request.locator };
|
|
41
|
+
return `${SITE_FILES}${entry.authority}/${encodeURIComponent(request.revision)}/${encodeURIComponent(request.path)}`;
|
|
81
42
|
}
|
|
82
|
-
async function
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (scope !== null)
|
|
92
|
-
return scope;
|
|
93
|
-
}
|
|
94
|
-
return unverifiedPart(entry.locator);
|
|
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;
|
|
95
52
|
}
|
|
96
|
-
async function
|
|
97
|
-
const
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const view = await enumeration(entry, scope);
|
|
106
|
-
if ('kind' in view)
|
|
107
|
-
return settled(view);
|
|
108
|
-
return stepped(advancedScope(scope, view));
|
|
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);
|
|
109
62
|
}
|
|
110
|
-
async function
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
return
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
notifications.
|
|
123
|
-
|
|
124
|
-
if (answer.kind !== 'net-advancement')
|
|
125
|
-
return answer;
|
|
126
|
-
const models = await viewModels(view, entry);
|
|
127
|
-
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());
|
|
128
77
|
}
|
|
129
78
|
return {
|
|
130
79
|
localSaves: true,
|
|
131
|
-
|
|
80
|
+
roomTypes: HOUSE_ROOM_TYPES,
|
|
81
|
+
nameableRoomTypes: HOUSE_NAMEABLE_ROOM_TYPES,
|
|
82
|
+
typedPaths: HOUSE_TYPED_PATHS,
|
|
132
83
|
async authorize() {
|
|
133
84
|
return {};
|
|
134
85
|
},
|
|
135
|
-
async discover() {
|
|
136
|
-
const answer = await transport.read(SITE_DOOR_DISCOVER);
|
|
137
|
-
const failed = discoveryFailure(answer.status, answer.body);
|
|
138
|
-
if (failed !== null)
|
|
139
|
-
return failed;
|
|
140
|
-
const document = parseSiteDiscovery(answer.body);
|
|
141
|
-
if (document === null)
|
|
142
|
-
return UNCERTAIN;
|
|
143
|
-
const entries = siteTracked(document);
|
|
144
|
-
tracked.clear();
|
|
145
|
-
for (const entry of entries)
|
|
146
|
-
tracked.set(entry.locator, entry);
|
|
147
|
-
notifications.track(entries);
|
|
148
|
-
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
149
|
-
},
|
|
150
86
|
async bootstrap(_authorization, request) {
|
|
151
87
|
const entry = tracked.get(request.locator);
|
|
152
88
|
if (entry === undefined)
|
|
153
89
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
if ('kind' in room)
|
|
158
|
-
return room;
|
|
159
|
-
continued = { room, next: 0, seen: [] };
|
|
160
|
-
}
|
|
161
|
-
else
|
|
162
|
-
continued = JSON.parse(request.pageToken);
|
|
163
|
-
const scope = await caughtUp(entry, continued);
|
|
164
|
-
if ('kind' in scope)
|
|
165
|
-
return scope;
|
|
166
|
-
notifications.reach(entry.authority, scope);
|
|
167
|
-
const next = continued.next + 1;
|
|
168
|
-
const more = next < continued.room.parts.length;
|
|
169
|
-
const seen = [
|
|
170
|
-
...continued.seen,
|
|
171
|
-
...entry.schemas.filter((schema) => scope.files.some((file) => file.path === schema)),
|
|
172
|
-
];
|
|
173
|
-
const models = await partModels(scope, entry, new Set(seen), !more);
|
|
174
|
-
return {
|
|
175
|
-
...(await stepped(bootstrapping(scope))),
|
|
176
|
-
...(models === undefined ? {} : { models }),
|
|
177
|
-
...(more ? { pageToken: JSON.stringify({ ...continued, next, seen }) } : {}),
|
|
178
|
-
};
|
|
90
|
+
return request.pageToken === undefined
|
|
91
|
+
? listedRoom(entry)
|
|
92
|
+
: chunkPage(entry, request.pageToken, request.arriving);
|
|
179
93
|
},
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
+
},
|
|
190
107
|
}
|
|
191
|
-
|
|
192
|
-
},
|
|
108
|
+
: {}),
|
|
193
109
|
async mutate() {
|
|
194
110
|
return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {}, retryable: false };
|
|
195
111
|
},
|
|
112
|
+
async attach() {
|
|
113
|
+
return { kind: 'rejected', code: 'write-grant', fields: {}, retryable: false };
|
|
114
|
+
},
|
|
196
115
|
async history() {
|
|
197
116
|
return { kind: 'no-history' };
|
|
198
117
|
},
|
|
@@ -203,8 +122,8 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
203
122
|
const read = await transport.download(route);
|
|
204
123
|
if (read.status === 404)
|
|
205
124
|
return unfound();
|
|
206
|
-
return read.status === 200 && read.
|
|
207
|
-
? { kind: 'binary',
|
|
125
|
+
return read.status === 200 && read.body !== null
|
|
126
|
+
? { kind: 'binary', body: read.body, mediaType: read.mediaType }
|
|
208
127
|
: UNCERTAIN;
|
|
209
128
|
},
|
|
210
129
|
async link(_authorization, request) {
|
|
@@ -217,13 +136,6 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
217
136
|
name: request.path.slice(request.path.lastIndexOf('/') + 1),
|
|
218
137
|
};
|
|
219
138
|
},
|
|
220
|
-
referrerScope(referrer) {
|
|
221
|
-
const named = published(referrer);
|
|
222
|
-
if (named === null)
|
|
223
|
-
return null;
|
|
224
|
-
const { path } = named.referrer;
|
|
225
|
-
return { locator: named.locator, ...(path === undefined ? {} : { path }) };
|
|
226
|
-
},
|
|
227
139
|
reached(locator, version, target) {
|
|
228
140
|
return reachedVersion(version, target, tracked.get(locator)?.logEpoch);
|
|
229
141
|
},
|
|
@@ -231,7 +143,7 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
231
143
|
return followsVersion(version, next);
|
|
232
144
|
},
|
|
233
145
|
async action(_authorization, request) {
|
|
234
|
-
if (request.name !==
|
|
146
|
+
if (request.name !== SITE_SUBMISSION) {
|
|
235
147
|
return {
|
|
236
148
|
kind: 'rejected',
|
|
237
149
|
code: 'action-unimplemented',
|
|
@@ -241,28 +153,13 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
241
153
|
}
|
|
242
154
|
if (!transport.online())
|
|
243
155
|
return UNCERTAIN;
|
|
244
|
-
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input),
|
|
156
|
+
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITE_SUBMISSION, request.input);
|
|
245
157
|
},
|
|
246
158
|
roomStream: snapshot
|
|
247
159
|
? undefined
|
|
248
160
|
: {
|
|
249
|
-
hold
|
|
250
|
-
notifications.send(rooms.flatMap((room) => {
|
|
251
|
-
const entry = tracked.get(room.locator);
|
|
252
|
-
const at = logPosition(room.roomVersion);
|
|
253
|
-
if (entry === undefined || at === null)
|
|
254
|
-
return [];
|
|
255
|
-
notifications.reach(entry.authority, at);
|
|
256
|
-
return [presented(entry.authority, at)];
|
|
257
|
-
}));
|
|
258
|
-
},
|
|
259
|
-
reopen: notifications.reopen,
|
|
161
|
+
hold: notifications.send,
|
|
260
162
|
observe: notifications.observe,
|
|
261
|
-
published(locator, roomVersion) {
|
|
262
|
-
const at = logPosition(roomVersion);
|
|
263
|
-
if (at !== null)
|
|
264
|
-
notifications.published(locator, at);
|
|
265
|
-
},
|
|
266
163
|
},
|
|
267
164
|
serviceMode: notifications.serviceMode,
|
|
268
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,23 +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
|
-
advance(tracked: TrackedAuthority, from: LogPosition, holds?: HeldRevision): Generator<number, StreamedAdvancement | null, void>;
|
|
19
21
|
conversations: ConversationStream;
|
|
20
22
|
serviceMode: ServiceModeSignal;
|
|
21
23
|
};
|
|
22
|
-
export declare function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications;
|
|
24
|
+
export declare function houseNotifications(transport: HouseDoor, mode: HouseMode, discovering: HouseDiscovering, spaces: SpaceSchemas): HouseNotifications;
|
|
23
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;AAUtD,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;AA2FF,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,YAAY,GACnB,kBAAkB,CA8XpB"}
|