@agentshouse/mdruntime-adapter 0.1.0-cd519a0f878dc → 0.1.0-cd5a35054e28c

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/dist/actions.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { type AcceptedMessage, type ActionDeclaration, type ActionRequest, type ActionResult, type ConversationAgents, type ConversationHistories, type ConversationHistoryRequest, type FileDeclaration } from '@agentshouse/mdruntime';
1
+ import { type AcceptedMessage, type ActionDeclaration, type ActionRequest, type ActionResult, type ConversationAgents, type ConversationHistories, type ConversationHistoryRequest } from '@agentshouse/mdruntime';
2
2
  import type { HouseDoorAnswer, HouseTransport } from './transport.js';
3
+ export type HouseActDoor = Pick<HouseTransport, 'door'>;
3
4
  export declare const HISTORY_PAGE = 100;
4
- export declare const TRIGGER_ROOMS = 100;
5
5
  type Operated = {
6
6
  readonly operation_id?: string;
7
7
  };
@@ -9,10 +9,6 @@ type ConversationControl = Operated & {
9
9
  readonly conversation: string;
10
10
  };
11
11
  export type AppInputs = {
12
- readonly 'conversation.attach': FileDeclaration & {
13
- readonly room: string;
14
- readonly blob: Blob;
15
- };
16
12
  readonly 'conversation.answer': ConversationControl & {
17
13
  readonly answer: {
18
14
  readonly interaction_id: string;
@@ -31,14 +27,8 @@ export type AppInputs = {
31
27
  readonly operation_id: string;
32
28
  readonly text: string;
33
29
  };
34
- readonly 'trigger.list': {
35
- readonly room_refs: readonly string[];
36
- };
37
30
  };
38
31
  export type AppAnswers = {
39
- readonly 'conversation.attach': {
40
- readonly path: string;
41
- };
42
32
  readonly 'conversation.history': ConversationHistories;
43
33
  };
44
34
  export type AppAnswerAdditions = {
@@ -55,8 +45,13 @@ export declare const HOUSE_SITE_ACTS: Readonly<Record<string, string>>;
55
45
  export declare const HOUSE_APP_BATCHES: Readonly<Partial<Record<string, readonly string[]>>>;
56
46
  export declare function houseConversationAgents(locator: string): ConversationAgents;
57
47
  export declare function declaredActions(routes: readonly string[]): readonly ActionDeclaration[];
58
- export declare function houseAction(transport: HouseTransport, request: ActionRequest): Promise<ActionResult>;
48
+ export declare function houseAction(transport: HouseActDoor, request: ActionRequest): Promise<ActionResult>;
59
49
  export declare function actionOutcome(answer: HouseDoorAnswer, name: string): ActionResult;
50
+ type HistoryCursor = {
51
+ accepted_at: string;
52
+ message_id: string;
53
+ };
54
+ export declare function cursorPosition(cursor: HistoryCursor): string;
60
55
  export declare function acceptedMessage(entry: unknown): AcceptedMessage | null;
61
56
  export {};
62
57
  //# sourceMappingURL=actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
package/dist/actions.js CHANGED
@@ -1,9 +1,6 @@
1
1
  import { changeBatchIdentity, HISTORY_CONVERSATIONS, } from '@agentshouse/mdruntime';
2
2
  import { doorRefusal } from './refusal.js';
3
- import { finishedUpload, houseUpload } from './upload.js';
4
3
  export const HISTORY_PAGE = 100;
5
- export const TRIGGER_ROOMS = 100;
6
- const OCTET_STREAM = 'application/octet-stream';
7
4
  function mapped(door, input = (given) => given) {
8
5
  return {
9
6
  door,
@@ -12,18 +9,16 @@ function mapped(door, input = (given) => given) {
12
9
  },
13
10
  };
14
11
  }
15
- function carried(door, carry, batched, room) {
12
+ function carried(door, carry, batched) {
16
13
  return {
17
14
  door,
18
15
  ...(batched === undefined ? {} : { batched }),
19
- ...(room === undefined ? {} : { room }),
20
16
  carry: (transport, input, name) => carry(transport, `/door/${door}`, input, name),
21
17
  };
22
18
  }
23
19
  const APP_ACTS = {
24
20
  'access.read': mapped('rooms/access/read'),
25
21
  'conversation.answer': mapped('conversations/interaction/answer', answerBody),
26
- 'conversation.attach': carried('conversations/attach', attachAction, undefined, 'room'),
27
22
  'conversation.create': carried('conversations/create', createAction),
28
23
  'conversation.delete': mapped('conversations/delete', controlBody),
29
24
  'conversation.history': carried('conversations/history', historyAction, ['conversations']),
@@ -50,7 +45,6 @@ const APP_ACTS = {
50
45
  'routineAllowance.list': mapped('routines/allowance'),
51
46
  'routineRequest.list': mapped('routines/requests'),
52
47
  'storage.read': mapped('storage/inventory'),
53
- 'trigger.list': carried('triggers/read', triggersAction, ['room_refs'], 'room_refs'),
54
48
  'triggerOccurrence.list': mapped('triggers/fired'),
55
49
  };
56
50
  export const HOUSE_APP_ACTS = Object.fromEntries(Object.entries(APP_ACTS).map(([name, act]) => [name, act.door]));
@@ -60,14 +54,13 @@ export const HOUSE_SITE_ACTS = {
60
54
  };
61
55
  export const HOUSE_APP_BATCHES = Object.fromEntries(Object.entries(APP_ACTS).flatMap(([name, act]) => act.batched === undefined ? [] : [[name, act.batched]]));
62
56
  const APP_NAMES = new Map(Object.entries(APP_ACTS).map(([name, act]) => [act.door, name]));
63
- const APP_ROOMS = new Map(Object.entries(APP_ACTS).flatMap(([name, act]) => act.room === undefined ? [] : [[name, act.room]]));
64
57
  export function houseConversationAgents(locator) {
65
58
  return { locator, type: 'house-agent', identity: 'agent', name: 'name', retired: 'retired' };
66
59
  }
67
60
  export function declaredActions(routes) {
68
61
  return routes.map((route) => {
69
62
  const name = APP_NAMES.get(route) ?? route;
70
- return { name, inputShape: {}, resultKind: 'house', room: APP_ROOMS.get(name) ?? 'room_ref' };
63
+ return { name, inputShape: {}, resultKind: 'house', room: 'room_ref' };
71
64
  });
72
65
  }
73
66
  export function houseAction(transport, request) {
@@ -181,47 +174,6 @@ async function sendAction(transport, route, input, name) {
181
174
  return outcome;
182
175
  return { ...outcome, result: withTurn(outcome.result) };
183
176
  }
184
- function attachBody(input) {
185
- const room = text(input, 'room');
186
- const name = text(input, 'name');
187
- const sha256 = text(input, 'contentHash');
188
- const bytes = record(input).byteLength;
189
- if (room === undefined || name === undefined || sha256 === undefined)
190
- return null;
191
- if (typeof bytes !== 'number')
192
- return null;
193
- const mediaType = text(input, 'mediaType');
194
- return {
195
- room_ref: room,
196
- name,
197
- bytes,
198
- sha256,
199
- media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,
200
- };
201
- }
202
- async function attachAction(transport, route, input, name) {
203
- const body = attachBody(input);
204
- const blob = record(input).blob;
205
- if (body === null || !(blob instanceof Blob))
206
- return malformed();
207
- const outcome = actionOutcome(await transport.door(route, body), name);
208
- if (outcome.kind !== 'action')
209
- return outcome;
210
- const upload = houseUpload(record(outcome.result).upload);
211
- if (upload === null)
212
- return { kind: 'transport-uncertainty' };
213
- const finished = await finishedUpload(transport, upload, blob);
214
- if (finished === null)
215
- return { kind: 'transport-uncertainty' };
216
- const settled = actionOutcome(finished, name);
217
- if (settled.kind !== 'action')
218
- return settled;
219
- const path = text(settled.result, 'path');
220
- if (path === undefined)
221
- return { kind: 'transport-uncertainty' };
222
- const result = { path };
223
- return { kind: 'action', result };
224
- }
225
177
  function historyCursor(value) {
226
178
  const acceptedAt = text(value, 'accepted_at');
227
179
  const messageId = text(value, 'message_id');
@@ -229,7 +181,7 @@ function historyCursor(value) {
229
181
  return null;
230
182
  return { accepted_at: acceptedAt, message_id: messageId };
231
183
  }
232
- function position(cursor) {
184
+ export function cursorPosition(cursor) {
233
185
  return JSON.stringify({ accepted_at: cursor.accepted_at, message_id: cursor.message_id });
234
186
  }
235
187
  function positionCursor(value) {
@@ -247,7 +199,7 @@ export function acceptedMessage(entry) {
247
199
  return {
248
200
  identity: cursor.message_id,
249
201
  turn: text(entry, 'turn_id') ?? cursor.message_id,
250
- position: position(cursor),
202
+ position: cursorPosition(cursor),
251
203
  text: text(entry, 'text') ?? '',
252
204
  message: structuredClone(record(entry)),
253
205
  };
@@ -267,7 +219,7 @@ function historyPage(entry) {
267
219
  const next = held.next === null || held.next === undefined ? undefined : historyCursor(held.next);
268
220
  if (next === null)
269
221
  return null;
270
- return { conversation, messages, ...(next === undefined ? {} : { next: position(next) }) };
222
+ return { conversation, messages, ...(next === undefined ? {} : { next: cursorPosition(next) }) };
271
223
  }
272
224
  function historyAsks(input) {
273
225
  const asked = record(input).conversations;
@@ -286,22 +238,6 @@ function historyAsks(input) {
286
238
  }
287
239
  return asks;
288
240
  }
289
- async function triggersAction(transport, route, input, name) {
290
- const asked = record(input).room_refs;
291
- if (!Array.isArray(asked) || asked.length === 0)
292
- return malformed();
293
- const rooms = [];
294
- for (let at = 0; at < asked.length; at += TRIGGER_ROOMS) {
295
- const outcome = actionOutcome(await transport.door(route, { room_refs: asked.slice(at, at + TRIGGER_ROOMS) }), name);
296
- if (outcome.kind !== 'action')
297
- return outcome;
298
- const answered = record(outcome.result).rooms;
299
- if (!Array.isArray(answered))
300
- return { kind: 'transport-uncertainty' };
301
- rooms.push(...answered);
302
- }
303
- return { kind: 'action', result: { rooms } };
304
- }
305
241
  async function historyAction(transport, route, input, name) {
306
242
  const asks = historyAsks(input);
307
243
  if (asks === null)
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,OAAO,EACP,aAAa,EAkBd,MAAM,wBAAwB,CAAC;AA0ChC,OAAO,EASL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AA0BxB,MAAM,MAAM,yBAAyB,GACjC;IACE,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AA8ErD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAmoBpF"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,OAAO,EAGP,aAAa,EAkBd,MAAM,wBAAwB,CAAC;AAoChC,OAAO,EAUL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AA0BxB,MAAM,MAAM,yBAAyB,GACjC;IACE,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAqErD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CA+jBpF"}
package/dist/adapter.js CHANGED
@@ -1,21 +1,22 @@
1
1
  import { stepped } from '@agentshouse/mdruntime';
2
2
  import { DISCOVER_PREFIXES, capabilities, discoveredRoom, mapDiscovery, parseDiscovery, trackedFrom, } from './discovery.js';
3
- import { manifestedModels, partModels, streamedModels, viewModels } from './model.js';
4
- import { gathered, gatheredEach, selections } from './gather.js';
3
+ import { streamedModels, viewModels } from './model.js';
4
+ import { gathered, selections } from './gather.js';
5
5
  import { createSiteAdapter } from './site.js';
6
- import { authorityRoot, bootstrapping, emptyScope, housePart, manifested, parseEnumeration, parseFileAddress, parseGrant, parseParted, partInventory, refreshFrom, viewOf, wholeView, } from './read.js';
7
- import { PART_ATTEMPTS, partArrival, partFrame, unverifiedPart } from './part.js';
6
+ import { authorityRoot, bootstrapping, parseEnumeration, parseFileAddress, parseGrant, refreshFrom, viewOf, wholeView, } from './read.js';
7
+ import { roomStreams } from './room-stream.js';
8
8
  import { sha256Hex } from './digest.js';
9
9
  import { finishedUpload, houseUpload } from './upload.js';
10
10
  import { houseAction } from './actions.js';
11
11
  import { classifyDoor, classifyRead, discoveryFailure, doorRefusal } from './refusal.js';
12
12
  import { houseNotifications } from './stream.js';
13
- import { DOOR_BATCH, DOOR_BATCH_UPLOAD, DOOR_BOOTSTRAP, DOOR_DISCOVER, DOOR_ENUMERATE, DOOR_FILES_GET, DOOR_REVISIONS, } from './transport.js';
13
+ import { DOOR_BATCH, DOOR_BATCH_UPLOAD, DOOR_BOOTSTRAP, DOOR_DISCOVER, DOOR_ENUMERATE, DOOR_FILES_ATTACH, DOOR_FILES_GET, DOOR_REVISIONS, } from './transport.js';
14
14
  import { batchPaths, deltaBody, deltaBytes, deltaDigest, historyOutcome, houseChanges, houseMove, mutationOutcome, operationHead, rejectedMapping, revisionBody, uploadable, } from './write.js';
15
15
  import { HOUSE_NAMEABLE_ROOM_TYPES, HOUSE_ROOM_TYPES } from './room-types.js';
16
16
  import { followsVersion, logPosition, presented, reachedVersion, roomVersion, } from './version.js';
17
17
  const UNCERTAIN = { kind: 'transport-uncertainty' };
18
18
  const UNCERTAIN_READ = { kind: 'transport-uncertainty' };
19
+ const OCTET_STREAM = 'application/octet-stream';
19
20
  const EXPIRED_ADDRESS = 403;
20
21
  function lapsedGrant(outcome) {
21
22
  return outcome.kind === 'rejected' && outcome.code === 'upload_unavailable';
@@ -53,6 +54,8 @@ export function createAgentsHouseAdapter(options) {
53
54
  const notifications = houseNotifications(transport, 'credential');
54
55
  const tracked = new Map();
55
56
  const handed = new Map();
57
+ const rooms = roomStreams('credential');
58
+ const unreused = new Set();
56
59
  let heldRevisions;
57
60
  let bounds;
58
61
  function declared() {
@@ -60,73 +63,40 @@ export function createAgentsHouseAdapter(options) {
60
63
  throw new Error('no Discovery declared the bounds');
61
64
  return bounds;
62
65
  }
63
- async function fetchedPart(entry, continued, listed, received, arriving) {
64
- if (received !== undefined) {
65
- const kept = new Uint8Array(received);
66
- const held = await housePart(continued.room, kept, listed, 'credential');
67
- if (held !== null)
68
- return 'kind' in held ? held : { scope: held, frame: kept };
69
- }
70
- for (let attempt = 0; attempt < PART_ATTEMPTS; attempt += 1) {
71
- const answered = await transport.door(DOOR_BOOTSTRAP, {
72
- prefixes: [authorityRoot(entry.handle)],
73
- part: listed.part,
74
- ...(continued.held === undefined ? {} : { held: [continued.held] }),
75
- }, partArrival(listed, arriving));
76
- const failure = classifyRead(answered.status, answered.body, entry.locator);
77
- if (failure !== null)
78
- return failure;
79
- const frame = partFrame(answered.body);
80
- if (frame === null)
81
- continue;
82
- const scope = await housePart(continued.room, frame, listed, 'credential');
83
- if (scope !== null)
84
- return 'kind' in scope ? scope : { scope, frame };
85
- }
86
- return unverifiedPart(entry.locator);
87
- }
88
- async function manifestPage(asked, continued) {
89
- const inventory = partInventory(continued.room);
90
- if (inventory.parts === 0) {
91
- const page = await partPage(asked, continued, undefined, undefined);
92
- return page.kind === 'bootstrap' ? { ...page, inventory } : page;
93
- }
94
- const { models, seen } = await manifestedModels(continued.room, asked.entry);
95
- return manifested(continued.room, inventory, JSON.stringify({ ...continued, seen }), models);
96
- }
97
- async function partPage(asked, continued, received, arriving) {
98
- const { entry } = asked;
99
- const listed = continued.room.parts[continued.next];
100
- const sent = listed === undefined
101
- ? { scope: emptyScope(continued.room), frame: null }
102
- : await fetchedPart(entry, continued, listed, received, arriving);
103
- if ('kind' in sent)
104
- return sent;
105
- const scope = await reused(sent.scope, asked.held);
66
+ async function streamedPage(entry, token, held) {
67
+ const part = await rooms.part(entry, token);
68
+ if ('kind' in part)
69
+ return part;
70
+ const scope = await reused(part.scope, held);
106
71
  if (scope === null) {
107
- return asked.held === undefined
108
- ? UNCERTAIN_READ
109
- : bootstrapTogether({ entry, held: undefined });
72
+ unreused.add(entry.locator);
73
+ return UNCERTAIN_READ;
110
74
  }
111
- const next = continued.next + 1;
112
- const more = next < continued.room.parts.length;
113
- if (continued.next === 0 && !more)
75
+ if (part.first && part.ended)
114
76
  handed.set(entry.locator, roomVersion(scope));
115
77
  else
116
78
  handed.delete(entry.locator);
117
79
  notifications.reach(entry.authority, scope);
118
- const seen = [
119
- ...continued.seen,
120
- ...(scope.files.some((file) => file.path === entry.schema) ? [entry.schema] : []),
121
- ];
122
- const models = await partModels(scope, entry, new Set(seen), !more);
123
80
  return {
124
81
  ...(await stepped(bootstrapping(scope))),
125
- ...(models === undefined ? {} : { models }),
126
- ...(more ? { pageToken: JSON.stringify({ ...continued, next, seen }) } : {}),
127
- ...(sent.frame === null ? {} : { received: sent.frame }),
82
+ ...(part.models === undefined ? {} : { models: part.models }),
83
+ ...(part.pageToken === undefined ? {} : { pageToken: part.pageToken }),
84
+ bytes: part.bytes,
128
85
  };
129
86
  }
87
+ async function openedRoom(entry, request) {
88
+ const reusing = unreused.delete(entry.locator) ? undefined : request.held;
89
+ const files = reusing === undefined
90
+ ? null
91
+ : await heldFiles(entry.authority, reusing, declared().max_held_files);
92
+ const answered = await transport.streamed(DOOR_BOOTSTRAP, {
93
+ prefixes: [authorityRoot(entry.handle)],
94
+ ...(files === null ? {} : { held: [files] }),
95
+ }, request.signal ?? new AbortController().signal);
96
+ if (answered.room === null)
97
+ return classifyDoor(answered.status, answered.body, entry.locator) ?? UNCERTAIN_READ;
98
+ return rooms.head(entry, answered.room, request.arriving, request.signal);
99
+ }
130
100
  async function enumeratedPage(ask, page) {
131
101
  const answer = await transport.door(DOOR_ENUMERATE, {
132
102
  prefixes: [authorityRoot(ask.entry.handle)],
@@ -223,61 +193,6 @@ export function createAgentsHouseAdapter(options) {
223
193
  return result;
224
194
  return { ...result, at: { locator, roomVersion: roomVersion({ position, logEpoch }) } };
225
195
  }
226
- async function holding(asks) {
227
- const bound = Math.floor(declared().max_held_files / Math.max(1, asks.filter((ask) => ask.held !== undefined).length));
228
- const held = [];
229
- for (const ask of asks) {
230
- if (ask.held === undefined || bound === 0)
231
- continue;
232
- const files = await heldFiles(ask.entry.authority, ask.held, bound);
233
- if (files !== null)
234
- held.push(files);
235
- }
236
- return held;
237
- }
238
- async function bootstrapped(asks, answer) {
239
- let open = asks.map((asked, ask) => ({ entry: asked.entry, asked, ask }));
240
- while (open.length > 0) {
241
- const unreached = [];
242
- for (const part of selections(open, declared().max_prefixes)) {
243
- const held = await holding(part.map(({ asked }) => asked));
244
- const answered = await transport.door(DOOR_BOOTSTRAP, {
245
- prefixes: part.map(({ entry }) => authorityRoot(entry.handle)),
246
- ...(held.length === 0 ? {} : { held }),
247
- });
248
- const classified = part.map(({ entry }) => classifyDoor(answered.status, answered.body, entry.locator));
249
- const parted = classified[0] === null ? parseParted(answered.body) : null;
250
- for (const [index, asked] of part.entries()) {
251
- const failure = classified[index];
252
- if (failure !== null && failure !== undefined) {
253
- answer(asked.ask, failure);
254
- continue;
255
- }
256
- if (parted === null) {
257
- answer(asked.ask, UNCERTAIN_READ);
258
- continue;
259
- }
260
- const room = parted.rooms.find((candidate) => candidate.anchor === asked.entry.authority);
261
- if (room === undefined && parted.next !== undefined) {
262
- unreached.push(asked);
263
- continue;
264
- }
265
- if (room === undefined) {
266
- answer(asked.ask, { kind: 'room-not-readable', locator: asked.entry.locator });
267
- continue;
268
- }
269
- const kept = held.find((files) => files.room === asked.entry.authority);
270
- answer(asked.ask, await manifestPage(asked.asked, {
271
- room,
272
- next: 0,
273
- seen: [],
274
- ...(kept === undefined ? {} : { held: kept }),
275
- }));
276
- }
277
- }
278
- open = unreached;
279
- }
280
- }
281
196
  function layered(asks) {
282
197
  const depths = new Map();
283
198
  const layers = [];
@@ -324,7 +239,6 @@ export function createAgentsHouseAdapter(options) {
324
239
  }
325
240
  return answers;
326
241
  }
327
- const bootstrapTogether = gatheredEach(bootstrapped);
328
242
  const enumerateTogether = gathered(enumerated);
329
243
  async function uploaded(head, changes, delta, bytes, entry, handed, keep) {
330
244
  const paths = batchPaths(changes);
@@ -412,9 +326,22 @@ export function createAgentsHouseAdapter(options) {
412
326
  function linked(answer, locator) {
413
327
  const address = addressed(answer, locator);
414
328
  return address.kind === 'address'
415
- ? { kind: 'link', url: address.url, name: address.name }
329
+ ? { kind: 'link', url: address.url, name: address.name, mediaType: address.mediaType }
416
330
  : address;
417
331
  }
332
+ function refusedAttach(answer, locator) {
333
+ const failure = classifyDoor(answer.status, answer.body, locator);
334
+ if (failure === null)
335
+ return null;
336
+ return failure.kind === 'scoped-refusal'
337
+ ? {
338
+ kind: 'rejected',
339
+ code: failure.code,
340
+ fields: failure.fields,
341
+ retryable: failure.retryable,
342
+ }
343
+ : failure;
344
+ }
418
345
  async function downloaded(ask, locator) {
419
346
  let address = addressed(await ask(), locator);
420
347
  if (address.kind !== 'address')
@@ -495,11 +422,9 @@ export function createAgentsHouseAdapter(options) {
495
422
  const entry = authorityFor(request.locator);
496
423
  if (entry === undefined)
497
424
  return { kind: 'room-not-readable', locator: request.locator };
498
- const asked = { entry, held: request.held };
499
- if (request.pageToken !== undefined) {
500
- return partPage(asked, JSON.parse(request.pageToken), request.received, request.arriving);
501
- }
502
- return bootstrapTogether(asked);
425
+ return request.pageToken === undefined
426
+ ? openedRoom(entry, request)
427
+ : streamedPage(entry, request.pageToken, request.held);
503
428
  },
504
429
  async refresh(_authorization, request) {
505
430
  const entry = authorityFor(request.locator);
@@ -568,6 +493,35 @@ export function createAgentsHouseAdapter(options) {
568
493
  return { kind: 'room-not-readable', locator: request.locator };
569
494
  return linked(await ask(), request.locator);
570
495
  },
496
+ async attach(_authorization, request) {
497
+ const entry = authorityFor(request.locator);
498
+ if (entry === undefined)
499
+ return { kind: 'room-not-readable', locator: request.locator };
500
+ const declared = await transport.door(DOOR_FILES_ATTACH, {
501
+ room_ref: entry.authority,
502
+ name: request.name,
503
+ bytes: request.byteLength,
504
+ sha256: request.sha256,
505
+ media_type: request.mediaType.length > 0 ? request.mediaType : OCTET_STREAM,
506
+ });
507
+ const refused = refusedAttach(declared, request.locator);
508
+ if (refused !== null)
509
+ return refused;
510
+ const upload = houseUpload(declared.body?.upload);
511
+ if (upload === null)
512
+ return UNCERTAIN_READ;
513
+ const finished = await finishedUpload(transport, upload, request.blob);
514
+ if (finished === null)
515
+ return UNCERTAIN_READ;
516
+ const unfinished = refusedAttach(finished, request.locator);
517
+ if (unfinished !== null)
518
+ return unfinished;
519
+ const { path, revision } = (finished.body ?? {});
520
+ const root = `/rooms/${entry.handle}/`;
521
+ return typeof path === 'string' && path.startsWith(root) && typeof revision === 'string'
522
+ ? { kind: 'attached', path: path.slice(root.length), revision }
523
+ : UNCERTAIN_READ;
524
+ },
571
525
  reached(locator, version, target) {
572
526
  return reachedVersion(version, target, authorityFor(locator)?.logEpoch);
573
527
  },
@@ -22,7 +22,7 @@ export type HouseOperations = {
22
22
  write: readonly string[];
23
23
  delete: readonly string[];
24
24
  };
25
- export type HouseReadLevel = 'mcp' | 'online' | 'local';
25
+ export type HouseAccessLevel = 'search' | 'open' | 'keep';
26
26
  export type HouseAuthority = LogPosition & {
27
27
  roomRef: string;
28
28
  roomHandle: string;
@@ -31,7 +31,7 @@ export type HouseAuthority = LogPosition & {
31
31
  typedSelection: readonly string[] | null;
32
32
  managedReplication: 'admitted' | 'unavailable';
33
33
  protectedPaths: readonly string[];
34
- read: HouseReadLevel;
34
+ level: HouseAccessLevel;
35
35
  operations: HouseOperations;
36
36
  };
37
37
  export type HouseDiscoveryDocument = {
@@ -62,7 +62,7 @@ export declare function siteTracked(document: HouseSiteDiscovery): TrackedAuthor
62
62
  export declare function trackedFrom(document: HouseDiscoveryDocument): TrackedAuthority[];
63
63
  export declare function providerLimits(bounds: HouseBounds): readonly ProviderLimit[];
64
64
  export declare function declaredRetention(bounds: HouseBounds): Retention;
65
- export declare function capabilities(actions: HouseDiscoveryDocument['actions'], rooms: readonly Pick<TrackedAuthority, 'authority' | 'typedSelection'>[]): readonly Capability[];
65
+ export declare function capabilities(actions: HouseDiscoveryDocument['actions'], rooms: readonly Pick<TrackedAuthority, 'authority' | 'handle'>[]): readonly Capability[];
66
66
  export declare function siteCapabilities(): readonly Capability[];
67
67
  export declare function discoveredRoom(authority: HouseAuthority): DiscoveredRoom;
68
68
  export declare function mapDiscovery(document: Pick<HouseDiscoveryDocument, 'bounds'>, rooms: readonly DiscoveredRoom[], declared: readonly Capability[]): Discovery;
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,MAAM,EACN,aAAa,EACb,SAAS,EACV,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3E,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAAU,CAAC;AAI1D,MAAM,MAAM,WAAW,GAAG;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACzC,kBAAkB,EAAE,UAAU,GAAG,aAAa,CAAC;IAC/C,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IACvC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC5C,CAAC;AA0GF,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAsB3E;AAmBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAa3E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,gBAAgB,EAAE,CAU5E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,gBAAgB,EAAE,CAUhF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,aAAa,EAAE,CAa5E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAMhE;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC,EAC1C,KAAK,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,QAAQ,CAAC,EAAE,GAC/D,SAAS,UAAU,EAAE,CASvB;AAED,wBAAgB,gBAAgB,IAAI,SAAS,UAAU,EAAE,CAOxD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,cAAc,GAAG,cAAc,CAqBxE;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,EAChD,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,EAAE,SAAS,UAAU,EAAE,GAC9B,SAAS,CAQX"}
package/dist/discovery.js CHANGED
@@ -2,6 +2,7 @@ import { declaredActions, houseConversationAgents, SITE_SUBMIT } from './actions
2
2
  import { readPosition, roomVersion } from './version.js';
3
3
  export const PROVIDER_ACTIONS = 'provider-actions';
4
4
  export const DISCOVER_PREFIXES = ['/'];
5
+ const PRIVATE_HANDLE = 'private';
5
6
  const BOUND_KEYS = [
6
7
  'max_authored_file_bytes',
7
8
  'max_batch_operations',
@@ -18,7 +19,7 @@ const BOUND_KEYS = [
18
19
  'operation_retention_seconds',
19
20
  ];
20
21
  const OPERATION_KEYS = ['write', 'delete'];
21
- const READ_LEVELS = ['mcp', 'online', 'local'];
22
+ const ACCESS_LEVELS = ['search', 'open', 'keep'];
22
23
  function stringList(value) {
23
24
  if (!Array.isArray(value))
24
25
  return null;
@@ -86,11 +87,11 @@ function parseAuthority(value) {
86
87
  const typedSelection = parseTypedSelection(held.typed_selection);
87
88
  const protectedPaths = stringList(held.protected_paths);
88
89
  const operations = parseOperations(held.operations);
89
- const read = READ_LEVELS.find((level) => level === held.read);
90
+ const level = ACCESS_LEVELS.find((one) => one === held.level);
90
91
  if (at === null ||
91
92
  typedSelection === undefined ||
92
93
  protectedPaths === null ||
93
- read === undefined ||
94
+ level === undefined ||
94
95
  operations === null)
95
96
  return null;
96
97
  if (typeof held.room_ref !== 'string' || held.room_ref.length === 0)
@@ -105,7 +106,7 @@ function parseAuthority(value) {
105
106
  typedSelection,
106
107
  managedReplication: held.managed_replication,
107
108
  protectedPaths,
108
- read,
109
+ level,
109
110
  operations,
110
111
  ...at,
111
112
  };
@@ -220,14 +221,12 @@ export function declaredRetention(bounds) {
220
221
  };
221
222
  }
222
223
  export function capabilities(actions, rooms) {
223
- const house = rooms.find((room) => room.typedSelection !== null);
224
+ const own = rooms.find((room) => room.handle === PRIVATE_HANDLE);
224
225
  return [
225
226
  {
226
227
  name: PROVIDER_ACTIONS,
227
228
  actions: declaredActions(actions),
228
- ...(house === undefined
229
- ? {}
230
- : { conversationAgents: houseConversationAgents(house.authority) }),
229
+ ...(own === undefined ? {} : { conversationAgents: houseConversationAgents(own.authority) }),
231
230
  },
232
231
  ];
233
232
  }
@@ -253,7 +252,7 @@ export function discoveredRoom(authority) {
253
252
  replica: {
254
253
  selection: locator,
255
254
  admission: authority.managedReplication,
256
- offline: authority.read === 'online' ? 'locked' : 'open',
255
+ offline: authority.level === 'open' ? 'locked' : 'open',
257
256
  },
258
257
  ...(authority.typedSelection === null
259
258
  ? {}
package/dist/gather.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export declare function gatheredEach<A, R>(send: (asks: readonly A[], answer: (ask: number, result: R) => void) => Promise<void>): (ask: A) => Promise<R>;
2
1
  export declare function gathered<A, R>(send: (asks: readonly A[]) => Promise<readonly R[]>): (ask: A) => Promise<R>;
3
2
  export declare function selections<T>(items: readonly T[], limit: number): readonly (readonly T[])[];
4
3
  //# sourceMappingURL=gather.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../src/gather.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GACpF,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAwBxB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,GAClD,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAMxB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAO3F"}
1
+ {"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../src/gather.ts"],"names":[],"mappings":"AAkCA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,GAClD,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAMxB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAO3F"}
package/dist/gather.js CHANGED
@@ -1,4 +1,4 @@
1
- export function gatheredEach(send) {
1
+ function gatheredEach(send) {
2
2
  let held = [];
3
3
  function flush() {
4
4
  const taken = held;