@agentshouse/mdruntime-adapter 0.1.0-cedb8e57837a7 → 0.1.0-cf059d0c8e9c0
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 +3 -68
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +1 -355
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +196 -410
- 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 +12 -12
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +44 -51
- package/dist/history.d.ts +12 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +91 -0
- package/dist/house-model.d.ts +2249 -0
- package/dist/house-model.d.ts.map +1 -0
- package/dist/house-model.js +1237 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- 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 +14 -0
- package/dist/part.d.ts.map +1 -0
- package/dist/part.js +90 -0
- package/dist/read.d.ts +27 -59
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +167 -266
- 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 +19 -0
- package/dist/room-stream.d.ts.map +1 -0
- package/dist/room-stream.js +57 -0
- package/dist/room-types.d.ts +7 -0
- package/dist/room-types.d.ts.map +1 -0
- package/dist/room-types.js +126 -0
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +81 -193
- package/dist/stream.d.ts +13 -13
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +161 -409
- package/dist/transport.d.ts +49 -39
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +53 -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 +4 -0
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +22 -18
- 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/referrer.d.ts +0 -7
- package/dist/referrer.d.ts.map +0 -1
- package/dist/referrer.js +0 -35
|
@@ -0,0 +1,126 @@
|
|
|
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 INBOX_CHAT_TYPE = 'inbox-chat';
|
|
13
|
+
export const INBOX_MESSAGE_TYPE = 'inbox-message';
|
|
14
|
+
export const HOUSE_NAMEABLE_ROOM_TYPES = [INBOX_CHAT_TYPE, INBOX_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
|
+
`${INBOX_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
|
+
' conversation: { type: string, format: uuid }',
|
|
51
|
+
' required: [inbox, channel, chat, customer]',
|
|
52
|
+
`${INBOX_MESSAGE_TYPE}:`,
|
|
53
|
+
' properties:',
|
|
54
|
+
' direction: { enum: [in, out] }',
|
|
55
|
+
' sender:',
|
|
56
|
+
' type: object',
|
|
57
|
+
' properties:',
|
|
58
|
+
' name: { type: string }',
|
|
59
|
+
` username: ${IDENTITY}`,
|
|
60
|
+
' sent_at: { type: string, format: date-time }',
|
|
61
|
+
` channel_message: ${IDENTITY}`,
|
|
62
|
+
' state: { enum: [sending, sent, failed] }',
|
|
63
|
+
' reason: { type: string }',
|
|
64
|
+
' labelled: { const: true }',
|
|
65
|
+
' reactions:',
|
|
66
|
+
' type: array',
|
|
67
|
+
' items:',
|
|
68
|
+
' type: object',
|
|
69
|
+
' properties:',
|
|
70
|
+
' reaction: { type: string, minLength: 1 }',
|
|
71
|
+
' sender:',
|
|
72
|
+
' type: object',
|
|
73
|
+
' properties:',
|
|
74
|
+
` id: ${IDENTITY}`,
|
|
75
|
+
' name: { type: string }',
|
|
76
|
+
` username: ${IDENTITY}`,
|
|
77
|
+
' count: { type: integer, minimum: 1 }',
|
|
78
|
+
' required: [reaction]',
|
|
79
|
+
` post: ${IDENTITY}`,
|
|
80
|
+
' assignee:',
|
|
81
|
+
...ASSIGNEE,
|
|
82
|
+
' sent_outside: { const: true }',
|
|
83
|
+
' template:',
|
|
84
|
+
' type: object',
|
|
85
|
+
' properties:',
|
|
86
|
+
' name: { type: string, minLength: 1 }',
|
|
87
|
+
' language: { type: string, minLength: 1 }',
|
|
88
|
+
' required: [name, language]',
|
|
89
|
+
' values:',
|
|
90
|
+
' type: object',
|
|
91
|
+
' additionalProperties: { type: string }',
|
|
92
|
+
' withheld: { const: true }',
|
|
93
|
+
' required: [direction]',
|
|
94
|
+
' if: { properties: { direction: { const: in } } }',
|
|
95
|
+
' then: { required: [sent_at] }',
|
|
96
|
+
`${WAYFINDING_MAP_TYPE}:`,
|
|
97
|
+
' properties:',
|
|
98
|
+
' title: { type: string }',
|
|
99
|
+
' required: [title]',
|
|
100
|
+
' sections:',
|
|
101
|
+
...WAYFINDING_MAP_SECTIONS.map((name) => ` ${name}: { kind: text, required: true }`),
|
|
102
|
+
`${WAYFINDING_TICKET_TYPE}:`,
|
|
103
|
+
' properties:',
|
|
104
|
+
' title: { type: string }',
|
|
105
|
+
' kind: { enum: [research, prototype, grilling, task] }',
|
|
106
|
+
' status: { enum: [open, in-progress, done, out-of-scope] }',
|
|
107
|
+
` map: { type: string, reference: ${WAYFINDING_MAP_TYPE} }`,
|
|
108
|
+
` blocked_by: { type: array, items: { type: string, reference: ${WAYFINDING_TICKET_TYPE} } }`,
|
|
109
|
+
' assignee:',
|
|
110
|
+
...ASSIGNEE,
|
|
111
|
+
' conversation: { type: string, format: uuid }',
|
|
112
|
+
` app: { type: string, pattern: '${APP_REFERENCE_PATTERN.source}' }`,
|
|
113
|
+
' required: [title, kind, status, map, blocked_by]',
|
|
114
|
+
' sections:',
|
|
115
|
+
' Question: { kind: text }',
|
|
116
|
+
' Answer: { kind: text }',
|
|
117
|
+
' allOf:',
|
|
118
|
+
' - if: { properties: { status: { enum: [in-progress, done, out-of-scope] } }, required: [status] }',
|
|
119
|
+
' then: { required: [assignee] }',
|
|
120
|
+
' else: { properties: { assignee: false } }',
|
|
121
|
+
' - if: { properties: { assignee: { required: [agent] } }, required: [assignee] }',
|
|
122
|
+
' else: { properties: { conversation: false } }',
|
|
123
|
+
' - if: { properties: { status: { enum: [done, out-of-scope] } }, required: [status] }',
|
|
124
|
+
' then: { sections: { Answer: { kind: text, required: true } } }',
|
|
125
|
+
HOUSE_MODEL_TYPES,
|
|
126
|
+
].join('\n');
|
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,CAkK1F"}
|
package/dist/site.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
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 {
|
|
4
|
+
import { bootstrapping } from './read.js';
|
|
5
|
+
import { roomStreams } from './room-stream.js';
|
|
6
|
+
import { classifyDoor, discoveryFailure } from './refusal.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, logPosition, presented, 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 };
|
|
@@ -24,192 +23,97 @@ function siteRoom(tracked) {
|
|
|
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 notifications = houseNotifications(transport, 'site'
|
|
27
|
+
const notifications = houseNotifications(transport, 'site', {
|
|
28
|
+
opened: async () => {
|
|
29
|
+
const found = await discovered();
|
|
30
|
+
return found.kind === 'discovery' ? found : null;
|
|
31
|
+
},
|
|
32
|
+
changed: () => null,
|
|
33
|
+
});
|
|
32
34
|
const tracked = new Map();
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return named === null || !tracked.has(named.locator) ? null : named;
|
|
36
|
-
}
|
|
35
|
+
const read = new Map();
|
|
36
|
+
const rooms = roomStreams('site');
|
|
37
37
|
function fileRoute(request) {
|
|
38
|
-
const
|
|
39
|
-
if (
|
|
40
|
-
return { kind: '
|
|
41
|
-
}
|
|
42
|
-
if (request.fileRef === undefined)
|
|
43
|
-
return unfound();
|
|
44
|
-
const { room_ref, path, record } = named.referrer;
|
|
45
|
-
return `${SITE_FILES}${room_ref}/${encodeURIComponent(request.fileRef)}/${path === undefined
|
|
46
|
-
? `${SITE_FILE_RECORD}/${encodeURIComponent(record)}`
|
|
47
|
-
: encodeURIComponent(path)}`;
|
|
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)}`;
|
|
48
42
|
}
|
|
49
|
-
async function
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
});
|
|
60
|
-
const classified = classifyRead(answer.status, answer.body, entry.locator);
|
|
61
|
-
if (classified !== null)
|
|
62
|
-
return classified;
|
|
63
|
-
const found = parseEnumeration(answer.body, 'site');
|
|
64
|
-
if (found === null)
|
|
65
|
-
return UNCERTAIN;
|
|
66
|
-
return viewOf(found, entry) ?? { kind: 'room-not-readable', locator: entry.locator };
|
|
43
|
+
async function openedRoom(entry, arriving, signal) {
|
|
44
|
+
const cut = read.get(entry.locator);
|
|
45
|
+
const answered = await transport.streamed(`${houseSiteRoute('bootstrap')}/${entry.authority}${cut === undefined ? '' : `?expired=${cut}`}`, signal ?? new AbortController().signal);
|
|
46
|
+
if (answered.room === null)
|
|
47
|
+
return classifyDoor(answered.status, answered.body, entry.locator) ?? UNCERTAIN;
|
|
48
|
+
const head = await rooms.head(entry, answered.room, arriving, signal);
|
|
49
|
+
const at = head.kind === 'bootstrap' ? logPosition(head.roomVersion) : null;
|
|
50
|
+
if (at !== null)
|
|
51
|
+
read.set(entry.locator, at.position);
|
|
52
|
+
return head;
|
|
67
53
|
}
|
|
68
|
-
async function
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
async function bootstrapPart(entry, after, offset) {
|
|
73
|
-
const query = [
|
|
74
|
-
...(after === null ? [] : [`after=${encodeURIComponent(after)}`]),
|
|
75
|
-
...(offset === null ? [] : [`offset=${offset}`]),
|
|
76
|
-
];
|
|
77
|
-
const answer = await transport.read(`${SITE_DOOR_BOOTSTRAP}${entry.authority}${query.length === 0 ? '' : `?${query.join('&')}`}`);
|
|
78
|
-
const classified = classifyDoor(answer.status, answer.body, entry.locator);
|
|
79
|
-
if (classified !== null)
|
|
80
|
-
return { failure: classified };
|
|
81
|
-
const scope = await stepped(parseSiteBootstrap(answer.body));
|
|
82
|
-
return scope === null ? { failure: UNCERTAIN } : { body: answer.body, scope };
|
|
83
|
-
}
|
|
84
|
-
async function assembled(entry, scope, path, offset) {
|
|
85
|
-
const opened = scope.contents.at(-1);
|
|
86
|
-
if (opened === undefined || opened.path !== path || opened.content.length !== offset) {
|
|
87
|
-
return UNCERTAIN;
|
|
88
|
-
}
|
|
89
|
-
let text = opened.content;
|
|
90
|
-
for (;;) {
|
|
91
|
-
const part = await bootstrapPart(entry, path, text.length);
|
|
92
|
-
if ('failure' in part)
|
|
93
|
-
return part.failure;
|
|
94
|
-
const [piece] = part.scope.contents;
|
|
95
|
-
if (piece === undefined ||
|
|
96
|
-
part.scope.contents.length !== 1 ||
|
|
97
|
-
piece.path !== path ||
|
|
98
|
-
piece.content.length === 0) {
|
|
99
|
-
return UNCERTAIN;
|
|
100
|
-
}
|
|
101
|
-
text += piece.content;
|
|
102
|
-
const more = siteBootstrapOffset(part.body);
|
|
103
|
-
if (more === null)
|
|
104
|
-
break;
|
|
105
|
-
if (more !== text.length)
|
|
106
|
-
return UNCERTAIN;
|
|
107
|
-
}
|
|
108
|
-
const file = scope.files.find((held) => held.path === path);
|
|
109
|
-
if (file === undefined || (await sha256Hex(text)) !== file.version)
|
|
110
|
-
return UNCERTAIN;
|
|
111
|
-
return { ...scope, contents: [...scope.contents.slice(0, -1), { path, content: text }] };
|
|
112
|
-
}
|
|
113
|
-
async function caughtUp(entry, after) {
|
|
114
|
-
const part = await bootstrapPart(entry, after, null);
|
|
115
|
-
if ('failure' in part)
|
|
54
|
+
async function streamedPage(entry, token) {
|
|
55
|
+
const part = await rooms.part(entry, token);
|
|
56
|
+
if ('kind' in part)
|
|
116
57
|
return part;
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
const { scope } = part;
|
|
126
|
-
if (after !== null || next !== null || roomVersion(scope) === roomVersion(entry)) {
|
|
127
|
-
return { scope, next };
|
|
128
|
-
}
|
|
129
|
-
const view = await enumeration(entry, scope);
|
|
130
|
-
if ('kind' in view)
|
|
131
|
-
return { failure: settled(view) };
|
|
132
|
-
return { scope: await stepped(advancedScope(scope, view)), next: null };
|
|
58
|
+
const { folders: _folders, ...page } = await stepped(bootstrapping(part.scope));
|
|
59
|
+
return {
|
|
60
|
+
...page,
|
|
61
|
+
...(part.models === undefined ? {} : { models: part.models }),
|
|
62
|
+
...(part.pageToken === undefined ? {} : { pageToken: part.pageToken }),
|
|
63
|
+
bytes: part.bytes,
|
|
64
|
+
};
|
|
133
65
|
}
|
|
134
|
-
async function
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
return
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
notifications.
|
|
147
|
-
|
|
148
|
-
if (answer.kind !== 'net-advancement')
|
|
149
|
-
return answer;
|
|
150
|
-
const models = await viewModels(view, entry);
|
|
151
|
-
return models === undefined ? answer : { ...answer, models };
|
|
66
|
+
async function discovered() {
|
|
67
|
+
const answer = await transport.read(houseSiteRoute('discover'));
|
|
68
|
+
const failed = discoveryFailure(answer.status, answer.body);
|
|
69
|
+
if (failed !== null)
|
|
70
|
+
return failed;
|
|
71
|
+
const document = parseSiteDiscovery(answer.body);
|
|
72
|
+
if (document === null)
|
|
73
|
+
return UNCERTAIN;
|
|
74
|
+
const entries = siteTracked(document);
|
|
75
|
+
tracked.clear();
|
|
76
|
+
for (const entry of entries)
|
|
77
|
+
tracked.set(entry.locator, entry);
|
|
78
|
+
notifications.track(entries);
|
|
79
|
+
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
152
80
|
}
|
|
153
81
|
return {
|
|
154
82
|
localSaves: true,
|
|
155
|
-
|
|
83
|
+
roomTypes: HOUSE_ROOM_TYPES,
|
|
84
|
+
nameableRoomTypes: HOUSE_NAMEABLE_ROOM_TYPES,
|
|
156
85
|
async authorize() {
|
|
157
86
|
return {};
|
|
158
87
|
},
|
|
159
|
-
async discover() {
|
|
160
|
-
const answer = await transport.read(SITE_DOOR_DISCOVER);
|
|
161
|
-
const failed = discoveryFailure(answer.status, answer.body);
|
|
162
|
-
if (failed !== null)
|
|
163
|
-
return failed;
|
|
164
|
-
const document = parseSiteDiscovery(answer.body);
|
|
165
|
-
if (document === null)
|
|
166
|
-
return UNCERTAIN;
|
|
167
|
-
const entries = siteTracked(document);
|
|
168
|
-
tracked.clear();
|
|
169
|
-
for (const entry of entries)
|
|
170
|
-
tracked.set(entry.locator, entry);
|
|
171
|
-
notifications.track(entries);
|
|
172
|
-
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
173
|
-
},
|
|
174
88
|
async bootstrap(_authorization, request) {
|
|
175
89
|
const entry = tracked.get(request.locator);
|
|
176
90
|
if (entry === undefined)
|
|
177
91
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
178
|
-
|
|
179
|
-
?
|
|
180
|
-
:
|
|
181
|
-
const held = await caughtUp(entry, continued?.after ?? null);
|
|
182
|
-
if ('failure' in held)
|
|
183
|
-
return held.failure;
|
|
184
|
-
notifications.reach(entry.authority, held.scope);
|
|
185
|
-
const seen = [
|
|
186
|
-
...(continued?.seen ?? []),
|
|
187
|
-
...entry.schemas.filter((schema) => held.scope.files.some((file) => file.path === schema)),
|
|
188
|
-
];
|
|
189
|
-
const models = await partModels(held.scope, entry, new Set(seen), held.next === null);
|
|
190
|
-
const continuation = held.next === null ? null : { after: held.next, seen };
|
|
191
|
-
return {
|
|
192
|
-
...(await stepped(bootstrapping(held.scope))),
|
|
193
|
-
...(models === undefined ? {} : { models }),
|
|
194
|
-
...(continuation === null ? {} : { pageToken: JSON.stringify(continuation) }),
|
|
195
|
-
};
|
|
92
|
+
return request.pageToken === undefined
|
|
93
|
+
? openedRoom(entry, request.arriving, request.signal)
|
|
94
|
+
: streamedPage(entry, request.pageToken);
|
|
196
95
|
},
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
+
},
|
|
207
109
|
}
|
|
208
|
-
|
|
209
|
-
},
|
|
110
|
+
: {}),
|
|
210
111
|
async mutate() {
|
|
211
112
|
return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {}, retryable: false };
|
|
212
113
|
},
|
|
114
|
+
async attach() {
|
|
115
|
+
return { kind: 'rejected', code: 'write-grant', fields: {}, retryable: false };
|
|
116
|
+
},
|
|
213
117
|
async history() {
|
|
214
118
|
return { kind: 'no-history' };
|
|
215
119
|
},
|
|
@@ -220,8 +124,8 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
220
124
|
const read = await transport.download(route);
|
|
221
125
|
if (read.status === 404)
|
|
222
126
|
return unfound();
|
|
223
|
-
return read.status === 200 && read.
|
|
224
|
-
? { kind: 'binary',
|
|
127
|
+
return read.status === 200 && read.body !== null
|
|
128
|
+
? { kind: 'binary', body: read.body, mediaType: read.mediaType }
|
|
225
129
|
: UNCERTAIN;
|
|
226
130
|
},
|
|
227
131
|
async link(_authorization, request) {
|
|
@@ -234,13 +138,6 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
234
138
|
name: request.path.slice(request.path.lastIndexOf('/') + 1),
|
|
235
139
|
};
|
|
236
140
|
},
|
|
237
|
-
referrerScope(referrer) {
|
|
238
|
-
const named = published(referrer);
|
|
239
|
-
if (named === null)
|
|
240
|
-
return null;
|
|
241
|
-
const { path } = named.referrer;
|
|
242
|
-
return { kind: 'room', locator: named.locator, ...(path === undefined ? {} : { path }) };
|
|
243
|
-
},
|
|
244
141
|
reached(locator, version, target) {
|
|
245
142
|
return reachedVersion(version, target, tracked.get(locator)?.logEpoch);
|
|
246
143
|
},
|
|
@@ -248,7 +145,7 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
248
145
|
return followsVersion(version, next);
|
|
249
146
|
},
|
|
250
147
|
async action(_authorization, request) {
|
|
251
|
-
if (request.name !==
|
|
148
|
+
if (request.name !== SITE_SUBMISSION) {
|
|
252
149
|
return {
|
|
253
150
|
kind: 'rejected',
|
|
254
151
|
code: 'action-unimplemented',
|
|
@@ -258,7 +155,7 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
258
155
|
}
|
|
259
156
|
if (!transport.online())
|
|
260
157
|
return UNCERTAIN;
|
|
261
|
-
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input),
|
|
158
|
+
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITE_SUBMISSION);
|
|
262
159
|
},
|
|
263
160
|
roomStream: snapshot
|
|
264
161
|
? undefined
|
|
@@ -267,19 +164,10 @@ export function createSiteAdapter(transport, snapshot = false) {
|
|
|
267
164
|
notifications.send(rooms.flatMap((room) => {
|
|
268
165
|
const entry = tracked.get(room.locator);
|
|
269
166
|
const at = logPosition(room.roomVersion);
|
|
270
|
-
|
|
271
|
-
return [];
|
|
272
|
-
notifications.reach(entry.authority, at);
|
|
273
|
-
return [presented(entry.authority, at)];
|
|
167
|
+
return entry === undefined || at === null ? [] : [presented(entry.authority, at)];
|
|
274
168
|
}));
|
|
275
169
|
},
|
|
276
|
-
reopen: notifications.reopen,
|
|
277
170
|
observe: notifications.observe,
|
|
278
|
-
published(locator, roomVersion) {
|
|
279
|
-
const at = logPosition(roomVersion);
|
|
280
|
-
if (at !== null)
|
|
281
|
-
notifications.published(locator, at);
|
|
282
|
-
},
|
|
283
171
|
},
|
|
284
172
|
serviceMode: notifications.serviceMode,
|
|
285
173
|
};
|
package/dist/stream.d.ts
CHANGED
|
@@ -1,23 +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
|
-
advance(tracked: TrackedAuthority, from: LogPosition, holds?: HeldRevision): Generator<number, StreamedAdvancement | null, void>;
|
|
19
19
|
conversations: ConversationStream;
|
|
20
20
|
serviceMode: ServiceModeSignal;
|
|
21
21
|
};
|
|
22
|
-
export declare function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications;
|
|
22
|
+
export declare function houseNotifications(transport: HouseDoor, mode: HouseMode, discovering: HouseDiscovering): HouseNotifications;
|
|
23
23
|
//# 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,
|
|
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,EAIvB,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EAEvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAWvD,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,aAAa,EAElB,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;CACpE,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,aAAa,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,aAAa,EAAE,kBAAkB,CAAC;IAClC,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAkFF,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,gBAAgB,GAC5B,kBAAkB,CA6TpB"}
|