@agentshouse/mdruntime-adapter 0.1.0-cdcec0737ac0e → 0.1.0-cdd3671d36a47

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 (52) hide show
  1. package/README.md +1 -1
  2. package/dist/actions.d.ts +2 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +15 -3
  5. package/dist/adapter.d.ts.map +1 -1
  6. package/dist/adapter.js +67 -75
  7. package/dist/authored-path.d.ts +11 -0
  8. package/dist/authored-path.d.ts.map +1 -0
  9. package/dist/authored-path.js +35 -0
  10. package/dist/chunks.d.ts +38 -0
  11. package/dist/chunks.d.ts.map +1 -0
  12. package/dist/chunks.js +247 -0
  13. package/dist/discovery.d.ts +2 -2
  14. package/dist/discovery.d.ts.map +1 -1
  15. package/dist/discovery.js +8 -5
  16. package/dist/history.js +1 -1
  17. package/dist/house-model.d.ts +93 -102
  18. package/dist/house-model.d.ts.map +1 -1
  19. package/dist/house-model.js +79 -55
  20. package/dist/index.d.ts +3 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -1
  23. package/dist/model.d.ts +3 -7
  24. package/dist/model.d.ts.map +1 -1
  25. package/dist/model.js +3 -13
  26. package/dist/read.d.ts +9 -9
  27. package/dist/read.d.ts.map +1 -1
  28. package/dist/read.js +24 -143
  29. package/dist/refusal.d.ts +1 -0
  30. package/dist/refusal.d.ts.map +1 -1
  31. package/dist/refusal.js +4 -0
  32. package/dist/room-types.d.ts +0 -2
  33. package/dist/room-types.d.ts.map +1 -1
  34. package/dist/room-types.js +2 -5
  35. package/dist/search.js +1 -1
  36. package/dist/site.d.ts.map +1 -1
  37. package/dist/site.js +30 -40
  38. package/dist/stream.d.ts +4 -3
  39. package/dist/stream.d.ts.map +1 -1
  40. package/dist/stream.js +83 -14
  41. package/dist/transport.d.ts +4 -8
  42. package/dist/transport.d.ts.map +1 -1
  43. package/dist/transport.js +12 -12
  44. package/dist/write.d.ts.map +1 -1
  45. package/dist/write.js +3 -5
  46. package/package.json +2 -2
  47. package/dist/part.d.ts +0 -14
  48. package/dist/part.d.ts.map +0 -1
  49. package/dist/part.js +0 -90
  50. package/dist/room-stream.d.ts +0 -20
  51. package/dist/room-stream.d.ts.map +0 -1
  52. package/dist/room-stream.js +0 -57
package/dist/read.js CHANGED
@@ -1,6 +1,5 @@
1
- import { paced, patching, ROW_WEIGHT, } from '@agentshouse/mdruntime';
2
- import { gunzipped } from './part.js';
3
- import { readPosition, roomVersion } from './version.js';
1
+ import { patching, ROW_WEIGHT, } from '@agentshouse/mdruntime';
2
+ import { roomVersion } from './version.js';
4
3
  const REVISION_FILE = /^fr_([0-9a-z]+)\.[0-9a-z]+\.[0-9a-z]$/u;
5
4
  function fileOf(revision) {
6
5
  return REVISION_FILE.exec(revision)?.[1];
@@ -11,6 +10,7 @@ export function answering() {
11
10
  facts: new Map(),
12
11
  revisions: new Map(),
13
12
  fileIds: new Map(),
13
+ created: new Map(),
14
14
  changes: new Map(),
15
15
  binaryFiles: new Map(),
16
16
  removals: new Set(),
@@ -29,6 +29,7 @@ export function forgotten(answer, path) {
29
29
  answer.facts.delete(path);
30
30
  answer.revisions.delete(path);
31
31
  answer.fileIds.delete(path);
32
+ answer.created.delete(path);
32
33
  answer.changes.delete(path);
33
34
  answer.binaryFiles.delete(path);
34
35
  answer.removals.delete(path);
@@ -58,6 +59,7 @@ export function* answered(answer) {
58
59
  facts: yield* patching({}, answer.facts),
59
60
  revisions: yield* patching({}, answer.revisions),
60
61
  ...(answer.fileIds.size === 0 ? {} : { fileIds: yield* patching({}, answer.fileIds) }),
62
+ ...(answer.created.size === 0 ? {} : { created: yield* patching({}, answer.created) }),
61
63
  changes: yield* patching({}, answer.changes),
62
64
  binaryFiles: yield* patching({}, answer.binaryFiles),
63
65
  removals,
@@ -121,11 +123,19 @@ export function headChange(held) {
121
123
  const author = held.author === undefined ? null : changeAuthor(held.author);
122
124
  if (held.author !== undefined && author === null)
123
125
  return null;
124
- if (held.created_at === undefined)
126
+ if (held.changed_at === undefined)
125
127
  return undefined;
126
- if (typeof held.created_at !== 'string')
128
+ if (typeof held.changed_at !== 'string')
127
129
  return null;
128
- return { author, time: held.created_at };
130
+ return { author, time: held.changed_at };
131
+ }
132
+ export function createdOf(held) {
133
+ if (held.created_at === undefined)
134
+ return undefined;
135
+ return typeof held.created_at === 'string' ? held.created_at : null;
136
+ }
137
+ function createdHeld(created) {
138
+ return created === undefined ? {} : { created };
129
139
  }
130
140
  function headed(head) {
131
141
  return head === undefined ? {} : { head };
@@ -147,15 +157,16 @@ export function carriedFacts(held) {
147
157
  function carriedSpace(held) {
148
158
  return typeof held.space === 'string' ? { space: held.space } : {};
149
159
  }
150
- function parseFile(value, mode) {
160
+ export function parseFile(value, mode) {
151
161
  if (typeof value !== 'object' || value === null)
152
162
  return null;
153
163
  const file = value;
154
164
  if (typeof file.path !== 'string')
155
165
  return null;
156
166
  const head = headChange(file);
167
+ const created = createdOf(file);
157
168
  const binary = binaryFileOf(file);
158
- if (head === null || binary === null)
169
+ if (head === null || created === null || binary === null)
159
170
  return null;
160
171
  if (mode === 'site') {
161
172
  if (typeof file.sha256 !== 'string')
@@ -177,153 +188,21 @@ function parseFile(value, mode) {
177
188
  version: file.revision,
178
189
  ...(typeof file.sha256 === 'string' ? { sha256: file.sha256 } : {}),
179
190
  ...headed(head),
191
+ ...createdHeld(created),
180
192
  ...binaried(binary),
181
193
  ...carriedFacts(file),
182
194
  ...carriedSpace(file),
183
195
  };
184
196
  }
185
- function parseModels(value, mode) {
186
- if (!Array.isArray(value))
187
- return null;
188
- const files = [];
189
- const contents = [];
190
- for (const entry of value) {
191
- const file = parseFile(entry, mode);
192
- const { content } = entry;
193
- if (file === null || typeof content !== 'string')
194
- return null;
195
- files.push(file);
196
- contents.push({ path: file.path, content });
197
- }
198
- return { files, contents };
199
- }
200
- function parseRoomHead(value, mode) {
201
- if (typeof value !== 'object' || value === null)
202
- return null;
203
- const held = value;
204
- if (typeof held.manifest !== 'object' || held.manifest === null)
205
- return null;
206
- const models = parseModels(held.models, mode);
207
- if (models === null)
208
- return null;
209
- const manifest = held.manifest;
210
- if (manifest.scope !== 'room')
211
- return null;
212
- const at = readPosition(manifest);
213
- if (typeof manifest.anchor !== 'string' || manifest.anchor.length === 0 || at === null)
214
- return null;
215
- if (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)
216
- return null;
217
- return { anchor: manifest.anchor, ...at, models };
218
- }
219
- export async function roomHead(payload, mode) {
220
- let text = '';
221
- try {
222
- for await (const chunk of gunzipped(payload))
223
- text += chunk;
224
- return text.endsWith('\n') && text.indexOf('\n') === text.length - 1
225
- ? parseRoomHead(JSON.parse(text), mode)
226
- : null;
227
- }
228
- catch {
229
- return null;
230
- }
231
- }
232
- export function manifested(room, pageToken, models) {
233
- return {
234
- kind: 'bootstrap',
235
- roomVersion: roomVersion(room),
236
- documents: {},
237
- facts: {},
238
- revisions: {},
239
- changes: {},
240
- binaryFiles: {},
241
- pageToken,
242
- ...(models === undefined ? {} : { models }),
243
- };
244
- }
245
197
  export function modelScope(room) {
246
- return { ...emptyScope(room), files: room.models.files, contents: room.models.contents };
247
- }
248
- export function emptyScope(room) {
249
198
  return {
250
199
  anchor: room.anchor,
251
200
  position: room.position,
252
201
  logEpoch: room.logEpoch,
253
- files: [],
254
- contents: [],
202
+ files: room.models.files,
203
+ contents: room.models.contents,
255
204
  };
256
205
  }
257
- function partLine(line, mode, read) {
258
- if (read.ended)
259
- return false;
260
- let entry;
261
- try {
262
- entry = JSON.parse(line);
263
- }
264
- catch {
265
- return false;
266
- }
267
- if (endLine(entry)) {
268
- read.ended = true;
269
- return true;
270
- }
271
- if (folderLine(entry)) {
272
- read.folders.push(entry.folder);
273
- return true;
274
- }
275
- const file = parseFile(entry, mode);
276
- if (file === null)
277
- return false;
278
- read.files.push(file);
279
- const { content } = entry;
280
- if (typeof content === 'string')
281
- read.contents.push({ path: file.path, content });
282
- else if (content !== undefined)
283
- return false;
284
- return true;
285
- }
286
- async function partRead(chunks, mode) {
287
- const read = { files: [], contents: [], folders: [], ended: false };
288
- const pace = paced();
289
- const unfinished = [];
290
- for (let chunk = await chunks.read(); chunk.done !== true; chunk = await chunks.read()) {
291
- const text = chunk.value;
292
- let start = 0;
293
- for (let end = text.indexOf('\n'); end !== -1; end = text.indexOf('\n', start)) {
294
- const piece = text.slice(start, end);
295
- const line = unfinished.length === 0 ? piece : unfinished.splice(0).join('') + piece;
296
- if (!partLine(line, mode, read)) {
297
- await chunks.cancel();
298
- return null;
299
- }
300
- start = end + 1;
301
- const due = pace(line.length + ROW_WEIGHT);
302
- if (due instanceof Promise)
303
- await due;
304
- }
305
- if (start < text.length)
306
- unfinished.push(text.slice(start));
307
- }
308
- return unfinished.length === 0 ? read : null;
309
- }
310
- function endLine(entry) {
311
- if (typeof entry !== 'object' || entry === null || !('end' in entry))
312
- return false;
313
- return entry.end === true && Object.keys(entry).length === 1;
314
- }
315
- function folderLine(entry) {
316
- if (typeof entry !== 'object' || entry === null || !('folder' in entry))
317
- return false;
318
- return typeof entry.folder === 'string' && Object.keys(entry).length === 1;
319
- }
320
- export async function housePart(room, payload, mode) {
321
- const read = await partRead(gunzipped(payload).getReader(), mode).catch(() => null);
322
- if (read === null)
323
- return { kind: 'transport-uncertainty' };
324
- const { ended, ...scope } = read;
325
- return { scope: { ...emptyScope(room), ...scope }, ended };
326
- }
327
206
  export function* bootstrapping(scope) {
328
207
  const contents = new Map();
329
208
  for (const entry of scope.contents) {
@@ -337,6 +216,8 @@ export function* bootstrapping(scope) {
337
216
  continue;
338
217
  if (file.head !== undefined)
339
218
  answer.changes.set(file.path, file.head);
219
+ if (file.created !== undefined)
220
+ answer.created.set(file.path, file.created);
340
221
  const content = contents.get(file.path);
341
222
  if (file.binary !== undefined)
342
223
  answer.binaryFiles.set(file.path, file.binary);
package/dist/refusal.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { AdapterFailure, DiscoverResult, ProviderRefusal, ScopedRefusal } from '@agentshouse/mdruntime';
2
2
  export declare function doorRefusal(body: unknown): ProviderRefusal | null;
3
+ export declare function resetOf(refusal: ProviderRefusal | null): string | undefined;
3
4
  export declare function scopedRefusal(locator: string, scope: ScopedRefusal['scope'], refusal: ProviderRefusal): ScopedRefusal;
4
5
  export declare function classifyDoor(status: number, body: unknown, locator: string): AdapterFailure | null;
5
6
  export declare function discoveryFailure(status: number, body: unknown): DiscoverResult | null;
@@ -1 +1 @@
1
- {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACd,MAAM,wBAAwB,CAAC;AAEhC,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAOjE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,eAAe,GACvB,aAAa,CAEf;AAqBD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG,IAAI,CAMvB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAQrF"}
1
+ {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACd,MAAM,wBAAwB,CAAC;AAEhC,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAOjE;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAG3E;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,eAAe,GACvB,aAAa,CAEf;AAqBD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG,IAAI,CAMvB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAQrF"}
package/dist/refusal.js CHANGED
@@ -9,6 +9,10 @@ export function doorRefusal(body) {
9
9
  const { code, retryable, ...fields } = error;
10
10
  return { code, fields, retryable: retryable === true };
11
11
  }
12
+ export function resetOf(refusal) {
13
+ const reset = refusal?.fields.retry_at;
14
+ return refusal?.retryable === true && typeof reset === 'string' ? reset : undefined;
15
+ }
12
16
  export function scopedRefusal(locator, scope, refusal) {
13
17
  return { kind: 'scoped-refusal', locator, scope, ...refusal };
14
18
  }
@@ -1,7 +1,5 @@
1
1
  export declare const INBOX_CHANNEL_KINDS: readonly ['telegram-bot', 'telegram-business', 'whatsapp', 'messenger', 'instagram', 'viber', 'tiktok'];
2
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
3
  export declare const HOUSE_NAMEABLE_ROOM_TYPES: string[];
6
4
  export declare const HOUSE_ROOM_TYPES: string;
7
5
  //# sourceMappingURL=room-types.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"room-types.d.ts","sourceRoot":"","sources":["../src/room-types.ts"],"names":[],"mappings":"AAIA,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,yBAAyB,UAAiC,CAAC;AAyBxE,eAAO,MAAM,gBAAgB,QAyFjB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { CHAT_MESSAGE_TYPE, CHAT_TYPE } from '@agentshouse/mdruntime';
1
2
  import { APP_REFERENCE_PATTERN } from './app-reference.js';
2
3
  import { HOUSE_MODEL_TYPES } from './house-model.js';
3
4
  export const INBOX_CHANNEL_KINDS = [
@@ -9,8 +10,6 @@ export const INBOX_CHANNEL_KINDS = [
9
10
  'viber',
10
11
  'tiktok',
11
12
  ];
12
- export const CHAT_TYPE = 'chat';
13
- export const CHAT_MESSAGE_TYPE = 'chat-message';
14
13
  export const HOUSE_NAMEABLE_ROOM_TYPES = [CHAT_TYPE, CHAT_MESSAGE_TYPE];
15
14
  const WAYFINDING_MAP_TYPE = 'wayfinding-map';
16
15
  const WAYFINDING_TICKET_TYPE = 'wayfinding-ticket';
@@ -52,9 +51,7 @@ export const HOUSE_ROOM_TYPES = [
52
51
  ' properties:',
53
52
  ' direction: { enum: [in, out] }',
54
53
  ' sender:',
55
- ' type: object',
56
- ' properties:',
57
- ' name: { type: string }',
54
+ ...ASSIGNEE,
58
55
  ` username: ${IDENTITY}`,
59
56
  ' sent_at: { type: string, format: date-time }',
60
57
  ` channel_message: ${IDENTITY}`,
package/dist/search.js CHANGED
@@ -27,7 +27,7 @@ export async function houseSearch(transport, tracked, request) {
27
27
  : tracked.filter((entry) => request.rooms.includes(entry.locator));
28
28
  if (named !== null && named.length === 0)
29
29
  return { kind: 'found', documents: [] };
30
- const answer = await transport.door(houseDoorRoute('search'), {
30
+ const answer = await transport.door(houseDoorRoute('rooms/search'), {
31
31
  query: request.text,
32
32
  ...(named === null ? {} : { paths: named.map((entry) => `${ROOMS}${entry.handle}`) }),
33
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAQR,MAAM,wBAAwB,CAAC;AAiBhC,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAuBxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CA6K1F"}
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAQR,MAAM,wBAAwB,CAAC;AAgBhC,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAuBxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAkK1F"}
package/dist/site.js CHANGED
@@ -1,15 +1,14 @@
1
- import { stepped } from '@agentshouse/mdruntime';
2
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 { bootstrapping } from './read.js';
5
- import { roomStreams } from './room-stream.js';
6
4
  import { spaceSchemas } from './space-schema.js';
7
- import { classifyDoor, discoveryFailure } from './refusal.js';
5
+ import { discoveryFailure } from './refusal.js';
6
+ import { admittedPath } from './authored-path.js';
8
7
  import { HOUSE_TYPED_PATHS } from './house-model.js';
9
8
  import { HOUSE_NAMEABLE_ROOM_TYPES, HOUSE_ROOM_TYPES } from './room-types.js';
10
9
  import { houseNotifications } from './stream.js';
11
- import { houseSiteRoute, SITE_DOOR_SUBMIT, SITE_FILES, SITE_SUBMISSION, } from './transport.js';
12
- import { followsVersion, logPosition, presented, reachedVersion, roomVersion } from './version.js';
10
+ import { houseSiteRoute, SITE_DOOR_SUBMIT, SITE_FILES, SITES_SUBMISSIONS_CREATE, } from './transport.js';
11
+ import { followsVersion, reachedVersion, roomVersion } from './version.js';
13
12
  const UNCERTAIN = { kind: 'transport-uncertainty' };
14
13
  function unfound() {
15
14
  return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
@@ -20,7 +19,7 @@ function siteRoom(tracked) {
20
19
  locator: tracked.locator,
21
20
  handle: tracked.handle,
22
21
  roomVersion: roomVersion(tracked),
23
- operations: { write: [], delete: [] },
22
+ operations: { write: [], erase: [] },
24
23
  replica: { selection: tracked.locator, admission: 'admitted', offline: 'open' },
25
24
  providerOwnedPaths: [],
26
25
  };
@@ -35,36 +34,32 @@ export function createSiteAdapter(transport, snapshot = false) {
35
34
  changed: () => null,
36
35
  }, spaces);
37
36
  const tracked = new Map();
38
- const read = new Map();
39
- const rooms = roomStreams('site', spaces);
37
+ const chunked = new Map();
40
38
  function fileRoute(request) {
41
39
  const entry = tracked.get(request.locator);
42
40
  if (entry === undefined)
43
41
  return { kind: 'room-not-readable', locator: request.locator };
44
42
  return `${SITE_FILES}${entry.authority}/${encodeURIComponent(request.revision)}/${encodeURIComponent(request.path)}`;
45
43
  }
46
- async function openedRoom(entry, arriving, signal) {
47
- const cut = read.get(entry.locator);
48
- const answered = await transport.streamed(`${houseSiteRoute('bootstrap')}/${entry.authority}${cut === undefined ? '' : `?expired=${cut}`}`, signal ?? new AbortController().signal);
49
- if (answered.room === null)
50
- return classifyDoor(answered.status, answered.body, entry.locator) ?? UNCERTAIN;
51
- const head = await rooms.head(entry, answered.room, arriving, signal);
52
- const at = head.kind === 'bootstrap' ? logPosition(head.roomVersion) : null;
53
- if (at !== null)
54
- read.set(entry.locator, at.position);
44
+ async function listedRoom(entry) {
45
+ const past = chunked.get(entry.locator)?.position;
46
+ const listed = siteChunkList(await transport.read(`${houseSiteRoute('chunks')}/${entry.authority}${past === undefined ? '' : `?expired=${past}`}`), entry.locator);
47
+ if ('kind' in listed)
48
+ return listed;
49
+ const head = await chunkedHead(listed, entry, spaces);
50
+ if (head.kind === 'bootstrap')
51
+ chunked.set(entry.locator, listed);
55
52
  return head;
56
53
  }
57
- async function streamedPage(entry, token) {
58
- const part = await rooms.part(entry, token);
59
- if ('kind' in part)
60
- return part;
61
- const { folders: _folders, ...page } = await stepped(bootstrapping(part.scope));
62
- return {
63
- ...page,
64
- ...(part.models === undefined ? {} : { models: part.models }),
65
- ...(part.pageToken === undefined ? {} : { pageToken: part.pageToken }),
66
- bytes: part.bytes,
67
- };
54
+ async function chunkPage(entry, id, arriving) {
55
+ const room = chunked.get(entry.locator);
56
+ const address = room?.chunks.get(id);
57
+ if (room === undefined || address === undefined)
58
+ return UNCERTAIN;
59
+ const read = await transport.download(address.url);
60
+ if (read.status !== 200)
61
+ return UNCERTAIN;
62
+ return chunkPart(read.body, room, id, arriving);
68
63
  }
69
64
  async function discovered() {
70
65
  const answer = await transport.read(houseSiteRoute('discover'));
@@ -86,6 +81,7 @@ export function createSiteAdapter(transport, snapshot = false) {
86
81
  roomTypes: HOUSE_ROOM_TYPES,
87
82
  nameableRoomTypes: HOUSE_NAMEABLE_ROOM_TYPES,
88
83
  typedPaths: HOUSE_TYPED_PATHS,
84
+ pathRule: admittedPath,
89
85
  async authorize() {
90
86
  return {};
91
87
  },
@@ -94,8 +90,8 @@ export function createSiteAdapter(transport, snapshot = false) {
94
90
  if (entry === undefined)
95
91
  return { kind: 'room-not-readable', locator: request.locator };
96
92
  return request.pageToken === undefined
97
- ? openedRoom(entry, request.arriving, request.signal)
98
- : streamedPage(entry, request.pageToken);
93
+ ? listedRoom(entry)
94
+ : chunkPage(entry, request.pageToken, request.arriving);
99
95
  },
100
96
  ...(snapshot
101
97
  ? {
@@ -149,7 +145,7 @@ export function createSiteAdapter(transport, snapshot = false) {
149
145
  return followsVersion(version, next);
150
146
  },
151
147
  async action(_authorization, request) {
152
- if (request.name !== SITE_SUBMISSION) {
148
+ if (request.name !== SITES_SUBMISSIONS_CREATE) {
153
149
  return {
154
150
  kind: 'rejected',
155
151
  code: 'action-unimplemented',
@@ -159,18 +155,12 @@ export function createSiteAdapter(transport, snapshot = false) {
159
155
  }
160
156
  if (!transport.online())
161
157
  return UNCERTAIN;
162
- return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITE_SUBMISSION, request.input);
158
+ return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITES_SUBMISSIONS_CREATE, request.input);
163
159
  },
164
160
  roomStream: snapshot
165
161
  ? undefined
166
162
  : {
167
- hold(rooms) {
168
- notifications.send(rooms.flatMap((room) => {
169
- const entry = tracked.get(room.locator);
170
- const at = logPosition(room.roomVersion);
171
- return entry === undefined || at === null ? [] : [presented(entry.authority, at)];
172
- }));
173
- },
163
+ hold: notifications.send,
174
164
  observe: notifications.observe,
175
165
  },
176
166
  serviceMode: notifications.serviceMode,
package/dist/stream.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { type AuthorityChange, type Discovery, type ConversationStream, type RoomStreamEvent, type ServiceModeSignal } from '@agentshouse/mdruntime';
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
3
  import type { SpaceSchemas } from './space-schema.js';
4
- import { type HouseDoor, type HouseHeldRoom, type HouseMode, type HouseStreamFrame } from './transport.js';
4
+ import { type HouseDoor, type HouseMode, type HouseStreamFrame } from './transport.js';
5
5
  export type HouseOpeningFrame = Extract<HouseStreamFrame, {
6
6
  type: 'opening';
7
7
  }>;
@@ -11,11 +11,12 @@ export type HouseAuthorityChangedFrame = Extract<HouseStreamFrame, {
11
11
  export type HouseDiscovering = {
12
12
  opened(frame: HouseOpeningFrame | null): Promise<Discovery | null>;
13
13
  changed(frame: HouseAuthorityChangedFrame): AuthorityChange | null;
14
+ expired?(authorities: readonly string[]): void;
14
15
  };
15
16
  export type HouseNotifications = {
16
17
  runtime: string;
17
18
  observe(notify: (event: RoomStreamEvent) => void): () => void;
18
- send(rooms: readonly HouseHeldRoom[]): void;
19
+ send(rooms: readonly HeldRoom[]): void;
19
20
  track(authorities: readonly TrackedAuthority[]): void;
20
21
  conversations: ConversationStream;
21
22
  serviceMode: ServiceModeSignal;
@@ -1 +1 @@
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;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAUtD,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;AA0FF,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,YAAY,GACnB,kBAAkB,CA8TpB"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAEpB,KAAK,SAAS,EACd,KAAK,kBAAkB,EAEvB,KAAK,QAAQ,EAGb,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EAEvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAYtD,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,SAAS,EAGd,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AAaxB,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAE/E,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAAC;AAElG,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,KAAK,EAAE,0BAA0B,GAAG,eAAe,GAAG,IAAI,CAAC;IACnE,OAAO,CAAC,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI,CAAC;IACvC,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,aAAa,EAAE,kBAAkB,CAAC;IAClC,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAgGF,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,YAAY,GACnB,kBAAkB,CA8XpB"}