@agentshouse/mdruntime-adapter 0.1.0-cfdb3a66f1a92 → 0.1.0-cfe552b74bdf7
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 -42
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +3 -332
- package/dist/adapter.d.ts +1 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +278 -277
- 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 +14 -12
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +65 -50
- 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 +892 -0
- package/dist/house-model.d.ts.map +1 -0
- package/dist/house-model.js +482 -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 -3
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +10 -32
- 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 +52 -43
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +247 -203
- package/dist/refusal.d.ts +0 -3
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +2 -6
- 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 +125 -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 +1 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +115 -130
- package/dist/stream.d.ts +12 -12
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +206 -158
- package/dist/transport.d.ts +81 -24
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +55 -11
- package/dist/upload.d.ts +12 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +63 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/write.d.ts +18 -2
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +110 -71
- package/package.json +8 -5
- package/AGENTS.md +0 -318
- 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 @@
|
|
|
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,eAAe,eAAe,CAAC;AAE5C,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,eAAO,MAAM,yBAAyB,UAAwC,CAAC;AAyB/E,eAAO,MAAM,gBAAgB,QA6FjB,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
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
|
+
' required: [inbox, channel, chat, customer]',
|
|
51
|
+
`${INBOX_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
|
+
' state: { enum: [sending, sent, failed] }',
|
|
62
|
+
' reason: { type: string }',
|
|
63
|
+
' labelled: { const: true }',
|
|
64
|
+
' reactions:',
|
|
65
|
+
' type: array',
|
|
66
|
+
' items:',
|
|
67
|
+
' type: object',
|
|
68
|
+
' properties:',
|
|
69
|
+
' reaction: { type: string, minLength: 1 }',
|
|
70
|
+
' sender:',
|
|
71
|
+
' type: object',
|
|
72
|
+
' properties:',
|
|
73
|
+
` id: ${IDENTITY}`,
|
|
74
|
+
' name: { type: string }',
|
|
75
|
+
` username: ${IDENTITY}`,
|
|
76
|
+
' count: { type: integer, minimum: 1 }',
|
|
77
|
+
' required: [reaction]',
|
|
78
|
+
` post: ${IDENTITY}`,
|
|
79
|
+
' assignee:',
|
|
80
|
+
...ASSIGNEE,
|
|
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 }',
|
|
92
|
+
' required: [direction]',
|
|
93
|
+
' if: { properties: { direction: { const: in } } }',
|
|
94
|
+
' then: { required: [sent_at] }',
|
|
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,
|
|
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
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Adapter } from '@agentshouse/mdruntime';
|
|
2
2
|
import { type HouseSiteTransport } from './transport.js';
|
|
3
|
-
export declare function createSiteAdapter(transport: HouseSiteTransport): Adapter;
|
|
3
|
+
export declare function createSiteAdapter(transport: HouseSiteTransport, snapshot?: boolean): Adapter;
|
|
4
4
|
//# sourceMappingURL=site.d.ts.map
|
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,155 +1,142 @@
|
|
|
1
|
+
import { stepped } from '@agentshouse/mdruntime';
|
|
1
2
|
import { actionOutcome } from './actions.js';
|
|
2
3
|
import { mapDiscovery, parseSiteDiscovery, siteCapabilities, siteTracked, } from './discovery.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { classifyDoor,
|
|
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';
|
|
6
8
|
import { houseNotifications } from './stream.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
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';
|
|
10
11
|
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
12
|
+
function unfound() {
|
|
13
|
+
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
14
|
+
}
|
|
11
15
|
function siteRoom(tracked) {
|
|
12
16
|
return {
|
|
13
17
|
name: tracked.handle,
|
|
14
18
|
locator: tracked.locator,
|
|
15
19
|
handle: tracked.handle,
|
|
16
20
|
roomVersion: roomVersion(tracked),
|
|
17
|
-
operations: {
|
|
18
|
-
replica: { selection: tracked.locator, admission: 'admitted' },
|
|
21
|
+
operations: { write: [], delete: [] },
|
|
22
|
+
replica: { selection: tracked.locator, admission: 'admitted', offline: 'open' },
|
|
19
23
|
providerOwnedPaths: [],
|
|
20
24
|
};
|
|
21
25
|
}
|
|
22
|
-
function
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
export function createSiteAdapter(transport, snapshot = false) {
|
|
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
|
+
});
|
|
27
34
|
const tracked = new Map();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
const read = new Map();
|
|
36
|
+
const rooms = roomStreams('site');
|
|
37
|
+
function fileRoute(request) {
|
|
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)}`;
|
|
31
42
|
}
|
|
32
|
-
async function
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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;
|
|
40
53
|
}
|
|
41
|
-
async function
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if ('kind' in found)
|
|
53
|
-
return { failure: settled(found) };
|
|
54
|
-
const view = viewOf(found, entry);
|
|
55
|
-
if (view === undefined)
|
|
56
|
-
return { failure: { kind: 'room-not-readable', locator: entry.locator } };
|
|
57
|
-
return { scope: advancedScope(scope, view) };
|
|
54
|
+
async function streamedPage(entry, token) {
|
|
55
|
+
const part = await rooms.part(entry, token);
|
|
56
|
+
if ('kind' in part)
|
|
57
|
+
return part;
|
|
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
|
+
};
|
|
58
65
|
}
|
|
59
|
-
async function
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
return { kind: 'room-not-readable', locator: entry.locator };
|
|
74
|
-
notifications.reach(entry.authority, view);
|
|
75
|
-
const answer = refreshFrom(view, fromRoomVersion);
|
|
76
|
-
if (answer.kind !== 'net-advancement')
|
|
77
|
-
return answer;
|
|
78
|
-
const models = await viewModels(view, entry);
|
|
79
|
-
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());
|
|
80
80
|
}
|
|
81
81
|
return {
|
|
82
82
|
localSaves: true,
|
|
83
|
+
roomTypes: HOUSE_ROOM_TYPES,
|
|
84
|
+
nameableRoomTypes: HOUSE_NAMEABLE_ROOM_TYPES,
|
|
83
85
|
async authorize() {
|
|
84
86
|
return {};
|
|
85
87
|
},
|
|
86
|
-
async discover() {
|
|
87
|
-
const answer = await transport.read(SITE_DOOR_DISCOVER);
|
|
88
|
-
const failed = discoveryFailure(answer.status, answer.body);
|
|
89
|
-
if (failed !== null)
|
|
90
|
-
return failed;
|
|
91
|
-
const document = parseSiteDiscovery(answer.body);
|
|
92
|
-
if (document === null)
|
|
93
|
-
return UNCERTAIN;
|
|
94
|
-
const entries = siteTracked(document);
|
|
95
|
-
tracked.clear();
|
|
96
|
-
for (const entry of entries)
|
|
97
|
-
tracked.set(entry.locator, entry);
|
|
98
|
-
notifications.track(entries);
|
|
99
|
-
return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
|
|
100
|
-
},
|
|
101
88
|
async bootstrap(_authorization, request) {
|
|
102
89
|
const entry = tracked.get(request.locator);
|
|
103
90
|
if (entry === undefined)
|
|
104
91
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if ('failure' in held)
|
|
109
|
-
return held.failure;
|
|
110
|
-
notifications.reach(entry.authority, held.scope);
|
|
111
|
-
const models = await scopeModels(held.scope, entry);
|
|
112
|
-
return { ...bootstrapOf(held.scope), ...(models === undefined ? {} : { models }) };
|
|
113
|
-
},
|
|
114
|
-
async refresh(_authorization, request) {
|
|
115
|
-
const entry = tracked.get(request.locator);
|
|
116
|
-
if (entry === undefined)
|
|
117
|
-
return { kind: 'room-not-readable', locator: request.locator };
|
|
118
|
-
if (request.pageToken !== undefined)
|
|
119
|
-
return UNCERTAIN;
|
|
120
|
-
return refreshed(entry, request.fromRoomVersion);
|
|
92
|
+
return request.pageToken === undefined
|
|
93
|
+
? openedRoom(entry, request.arriving, request.signal)
|
|
94
|
+
: streamedPage(entry, request.pageToken);
|
|
121
95
|
},
|
|
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
|
+
},
|
|
109
|
+
}
|
|
110
|
+
: {}),
|
|
122
111
|
async mutate() {
|
|
123
112
|
return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {}, retryable: false };
|
|
124
113
|
},
|
|
114
|
+
async attach() {
|
|
115
|
+
return { kind: 'rejected', code: 'write-grant', fields: {}, retryable: false };
|
|
116
|
+
},
|
|
125
117
|
async history() {
|
|
126
118
|
return { kind: 'no-history' };
|
|
127
119
|
},
|
|
128
120
|
async binary(_authorization, request) {
|
|
129
|
-
const
|
|
130
|
-
if (
|
|
131
|
-
return
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
return
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const read = await transport.download(`${SITE_FILES}${room_ref}/${encodeURIComponent(request.fileRef)}/${path === undefined
|
|
138
|
-
? `${SITE_FILE_RECORD}/${encodeURIComponent(record)}`
|
|
139
|
-
: encodeURIComponent(path)}`);
|
|
140
|
-
if (read.status === 404) {
|
|
141
|
-
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
142
|
-
}
|
|
143
|
-
return read.status === 200 && read.blob !== null
|
|
144
|
-
? { 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 }
|
|
145
129
|
: UNCERTAIN;
|
|
146
130
|
},
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
if (
|
|
150
|
-
return
|
|
151
|
-
|
|
152
|
-
|
|
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
|
+
};
|
|
153
140
|
},
|
|
154
141
|
reached(locator, version, target) {
|
|
155
142
|
return reachedVersion(version, target, tracked.get(locator)?.logEpoch);
|
|
@@ -158,7 +145,7 @@ export function createSiteAdapter(transport) {
|
|
|
158
145
|
return followsVersion(version, next);
|
|
159
146
|
},
|
|
160
147
|
async action(_authorization, request) {
|
|
161
|
-
if (request.name !==
|
|
148
|
+
if (request.name !== SITE_SUBMISSION) {
|
|
162
149
|
return {
|
|
163
150
|
kind: 'rejected',
|
|
164
151
|
code: 'action-unimplemented',
|
|
@@ -168,22 +155,20 @@ export function createSiteAdapter(transport) {
|
|
|
168
155
|
}
|
|
169
156
|
if (!transport.online())
|
|
170
157
|
return UNCERTAIN;
|
|
171
|
-
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input),
|
|
158
|
+
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITE_SUBMISSION);
|
|
172
159
|
},
|
|
173
|
-
roomStream:
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
160
|
+
roomStream: snapshot
|
|
161
|
+
? undefined
|
|
162
|
+
: {
|
|
163
|
+
hold(rooms) {
|
|
164
|
+
notifications.send(rooms.flatMap((room) => {
|
|
165
|
+
const entry = tracked.get(room.locator);
|
|
166
|
+
const at = logPosition(room.roomVersion);
|
|
167
|
+
return entry === undefined || at === null ? [] : [presented(entry.authority, at)];
|
|
168
|
+
}));
|
|
169
|
+
},
|
|
170
|
+
observe: notifications.observe,
|
|
183
171
|
},
|
|
184
|
-
reopen: notifications.reopen,
|
|
185
|
-
observe: notifications.observe,
|
|
186
|
-
},
|
|
187
172
|
serviceMode: notifications.serviceMode,
|
|
188
173
|
};
|
|
189
174
|
}
|
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
|
-
|
|
9
|
-
|
|
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;
|
|
10
13
|
};
|
|
11
14
|
export type HouseNotifications = {
|
|
12
15
|
runtime: string;
|
|
13
16
|
observe(notify: (event: RoomStreamEvent) => void): () => void;
|
|
14
17
|
send(rooms: readonly HouseHeldRoom[]): 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): StreamedAdvancement | null;
|
|
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,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;AAYvD,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;AAqFF,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,gBAAgB,GAC5B,kBAAkB,CA6TpB"}
|