@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.
Files changed (67) hide show
  1. package/README.md +2 -2
  2. package/dist/actions.d.ts +3 -68
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +1 -355
  5. package/dist/adapter.d.ts.map +1 -1
  6. package/dist/adapter.js +196 -410
  7. package/dist/app-reference.d.ts +2 -0
  8. package/dist/app-reference.d.ts.map +1 -0
  9. package/dist/app-reference.js +2 -0
  10. package/dist/crockford.d.ts +4 -0
  11. package/dist/crockford.d.ts.map +1 -0
  12. package/dist/crockford.js +3 -0
  13. package/dist/discovery.d.ts +12 -12
  14. package/dist/discovery.d.ts.map +1 -1
  15. package/dist/discovery.js +44 -51
  16. package/dist/history.d.ts +12 -0
  17. package/dist/history.d.ts.map +1 -0
  18. package/dist/history.js +91 -0
  19. package/dist/house-model.d.ts +2249 -0
  20. package/dist/house-model.d.ts.map +1 -0
  21. package/dist/house-model.js +1237 -0
  22. package/dist/index.d.ts +10 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +9 -1
  25. package/dist/model.d.ts +5 -2
  26. package/dist/model.d.ts.map +1 -1
  27. package/dist/model.js +10 -29
  28. package/dist/part.d.ts +14 -0
  29. package/dist/part.d.ts.map +1 -0
  30. package/dist/part.js +90 -0
  31. package/dist/read.d.ts +27 -59
  32. package/dist/read.d.ts.map +1 -1
  33. package/dist/read.js +167 -266
  34. package/dist/refusal.d.ts +0 -3
  35. package/dist/refusal.d.ts.map +1 -1
  36. package/dist/refusal.js +0 -5
  37. package/dist/room-stream.d.ts +19 -0
  38. package/dist/room-stream.d.ts.map +1 -0
  39. package/dist/room-stream.js +57 -0
  40. package/dist/room-types.d.ts +7 -0
  41. package/dist/room-types.d.ts.map +1 -0
  42. package/dist/room-types.js +126 -0
  43. package/dist/site.d.ts.map +1 -1
  44. package/dist/site.js +81 -193
  45. package/dist/stream.d.ts +13 -13
  46. package/dist/stream.d.ts.map +1 -1
  47. package/dist/stream.js +161 -409
  48. package/dist/transport.d.ts +49 -39
  49. package/dist/transport.d.ts.map +1 -1
  50. package/dist/transport.js +53 -11
  51. package/dist/upload.d.ts +12 -0
  52. package/dist/upload.d.ts.map +1 -0
  53. package/dist/upload.js +63 -0
  54. package/dist/write.d.ts +4 -0
  55. package/dist/write.d.ts.map +1 -1
  56. package/dist/write.js +22 -18
  57. package/package.json +8 -4
  58. package/AGENTS.md +0 -304
  59. package/dist/gather.d.ts +0 -4
  60. package/dist/gather.d.ts.map +0 -1
  61. package/dist/gather.js +0 -35
  62. package/dist/handed.d.ts +0 -15
  63. package/dist/handed.d.ts.map +0 -1
  64. package/dist/handed.js +0 -45
  65. package/dist/referrer.d.ts +0 -7
  66. package/dist/referrer.d.ts.map +0 -1
  67. 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');
@@ -1 +1 @@
1
- {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAUR,MAAM,wBAAwB,CAAC;AA4BhC,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAyCxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAwR1F"}
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, SITE_SUBMIT } from './actions.js';
2
+ import { actionOutcome } from './actions.js';
3
3
  import { mapDiscovery, parseSiteDiscovery, siteCapabilities, siteTracked, } from './discovery.js';
4
- import { partModels, streamedModels, viewModels } from './model.js';
5
- import { advancedScope, bootstrapping, parseEnumeration, parseSiteBootstrap, refreshFrom, siteBootstrapNext, siteBootstrapOffset, viewOf, wholeView, } from './read.js';
6
- import { sha256Hex } from './digest.js';
7
- import { classifyDoor, classifyRead, discoveryFailure } from './refusal.js';
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 { SITE_DOOR_BOOTSTRAP, SITE_DOOR_DISCOVER, SITE_DOOR_ENUMERATE, SITE_DOOR_SUBMIT, SITE_FILE_RECORD, SITE_FILES, } from './transport.js';
10
- import { houseReferrer } from './referrer.js';
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
- function published(referrer) {
34
- const named = houseReferrer(referrer, tracked);
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 named = published(request.kind === 'path' ? { room: request.locator, path: request.path } : request.referrer);
39
- if (named === null) {
40
- return { kind: 'rejected', code: 'referrer_unknown', fields: {}, retryable: false };
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 enumerated(entry, from, page) {
50
- const answer = await transport.door(SITE_DOOR_ENUMERATE, {
51
- positions: [
52
- page === undefined
53
- ? presented(entry.authority, from)
54
- : {
55
- ...presented(entry.authority, { position: page.after, logEpoch: from.logEpoch }),
56
- page: { through: page.through, read: page.read },
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 enumeration(entry, from) {
69
- const first = await enumerated(entry, from);
70
- return 'kind' in first ? first : wholeView(first, (page) => enumerated(entry, from, page));
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 next = siteBootstrapNext(part.body);
118
- const offset = siteBootstrapOffset(part.body);
119
- if (offset !== null) {
120
- if (next === null)
121
- return { failure: UNCERTAIN };
122
- const scope = await assembled(entry, part.scope, next, offset);
123
- return 'kind' in scope ? { failure: scope } : { scope, next };
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 refreshed(entry, fromRoomVersion) {
135
- const from = logPosition(fromRoomVersion);
136
- if (from === null)
137
- return { kind: 'beyond-horizon' };
138
- const streamed = await stepped(notifications.advance(entry, from));
139
- if (streamed !== null) {
140
- const models = await streamedModels(streamed.schemas, entry, 'site');
141
- return models === undefined ? streamed.page : { ...streamed.page, models };
142
- }
143
- const view = await enumeration(entry, from);
144
- if ('kind' in view)
145
- return view;
146
- notifications.reach(entry.authority, view);
147
- const answer = await refreshFrom(view, fromRoomVersion);
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
- exhaustiveDiscovery: true,
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
- const continued = request.pageToken === undefined
179
- ? null
180
- : JSON.parse(request.pageToken);
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
- async refresh(_authorization, request) {
198
- const entry = tracked.get(request.locator);
199
- if (entry === undefined)
200
- return { kind: 'room-not-readable', locator: request.locator };
201
- if (request.pageToken !== undefined)
202
- return UNCERTAIN;
203
- if (snapshot) {
204
- return request.fromRoomVersion === roomVersion(entry)
205
- ? { kind: 'still-current' }
206
- : { kind: 'beyond-horizon' };
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
- return refreshed(entry, request.fromRoomVersion);
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.blob !== null
224
- ? { kind: 'binary', blob: read.blob }
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 !== SITE_SUBMIT) {
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), SITE_SUBMIT);
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
- if (entry === undefined || at === null)
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 ConversationStream, type RefreshPage, type RoomStreamEvent, type ServiceModeSignal, type StreamReceipts } from '@agentshouse/mdruntime';
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 { HouseDoor, HouseHeldRoom, HouseMode, HouseStreamEntry } from './transport.js';
4
- import { type LogPosition } from './version.js';
5
- export type HeldRevision = (path: string, revision: string) => boolean;
6
- export type StreamedAdvancement = {
7
- page: RefreshPage;
8
- schemas: ReadonlyMap<string, HouseStreamEntry>;
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, receipts: StreamReceipts): () => 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
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EAEvB,KAAK,WAAW,EAChB,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAEpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EAEb,SAAS,EAET,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AA0C7D,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;AAEvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,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,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAAC;IACxF,IAAI,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI,CAAC;IAC5C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAClD,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAChD,OAAO,CACL,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,WAAW,EACjB,KAAK,CAAC,EAAE,YAAY,GACnB,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;IACvD,aAAa,EAAE,kBAAkB,CAAC;IAClC,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAmFF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CA0iB5F"}
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"}