@agentshouse/mdruntime-adapter 0.1.0-cf22c8563f9f4 → 0.1.0-cf599f631976d

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 (72) hide show
  1. package/README.md +2 -2
  2. package/dist/actions.d.ts +6 -5
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +25 -322
  5. package/dist/adapter.d.ts +1 -0
  6. package/dist/adapter.d.ts.map +1 -1
  7. package/dist/adapter.js +278 -206
  8. package/dist/app-reference.d.ts +2 -0
  9. package/dist/app-reference.d.ts.map +1 -0
  10. package/dist/app-reference.js +2 -0
  11. package/dist/chunks.d.ts +38 -0
  12. package/dist/chunks.d.ts.map +1 -0
  13. package/dist/chunks.js +247 -0
  14. package/dist/crockford.d.ts +4 -0
  15. package/dist/crockford.d.ts.map +1 -0
  16. package/dist/crockford.js +3 -0
  17. package/dist/discovery.d.ts +25 -15
  18. package/dist/discovery.d.ts.map +1 -1
  19. package/dist/discovery.js +104 -52
  20. package/dist/history.d.ts +12 -0
  21. package/dist/history.d.ts.map +1 -0
  22. package/dist/history.js +92 -0
  23. package/dist/house-model.d.ts +682 -0
  24. package/dist/house-model.d.ts.map +1 -0
  25. package/dist/house-model.js +396 -0
  26. package/dist/index.d.ts +11 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +10 -0
  29. package/dist/model.d.ts +5 -4
  30. package/dist/model.d.ts.map +1 -1
  31. package/dist/model.js +40 -33
  32. package/dist/read.d.ts +63 -42
  33. package/dist/read.d.ts.map +1 -1
  34. package/dist/read.js +179 -262
  35. package/dist/refusal.d.ts +3 -8
  36. package/dist/refusal.d.ts.map +1 -1
  37. package/dist/refusal.js +10 -14
  38. package/dist/room-types.d.ts +5 -0
  39. package/dist/room-types.d.ts.map +1 -0
  40. package/dist/room-types.js +120 -0
  41. package/dist/search.d.ts +5 -0
  42. package/dist/search.d.ts.map +1 -0
  43. package/dist/search.js +47 -0
  44. package/dist/site.d.ts +1 -1
  45. package/dist/site.d.ts.map +1 -1
  46. package/dist/site.js +120 -105
  47. package/dist/space-schema.d.ts +7 -0
  48. package/dist/space-schema.d.ts.map +1 -0
  49. package/dist/space-schema.js +18 -0
  50. package/dist/stream.d.ts +15 -12
  51. package/dist/stream.d.ts.map +1 -1
  52. package/dist/stream.js +275 -147
  53. package/dist/transport.d.ts +90 -24
  54. package/dist/transport.d.ts.map +1 -1
  55. package/dist/transport.js +55 -9
  56. package/dist/upload.d.ts +12 -0
  57. package/dist/upload.d.ts.map +1 -0
  58. package/dist/upload.js +63 -0
  59. package/dist/version.d.ts +1 -0
  60. package/dist/version.d.ts.map +1 -1
  61. package/dist/version.js +1 -1
  62. package/dist/write.d.ts +20 -10
  63. package/dist/write.d.ts.map +1 -1
  64. package/dist/write.js +165 -59
  65. package/package.json +9 -6
  66. package/AGENTS.md +0 -244
  67. package/dist/gather.d.ts +0 -3
  68. package/dist/gather.d.ts.map +0 -1
  69. package/dist/gather.js +0 -40
  70. package/dist/links.d.ts +0 -20
  71. package/dist/links.d.ts.map +0 -1
  72. package/dist/links.js +0 -104
package/dist/chunks.js ADDED
@@ -0,0 +1,247 @@
1
+ import { paced, ROW_WEIGHT, stepped, } from '@agentshouse/mdruntime';
2
+ import { manifestedModels } from './model.js';
3
+ import { authorityRoot, bootstrapping, parseFile, } from './read.js';
4
+ import { classifyDoor } from './refusal.js';
5
+ import { houseDoorRoute } from './transport.js';
6
+ import { readPosition, roomVersion } from './version.js';
7
+ function authorKey(author) {
8
+ for (const kind of ['user', 'site', 'inbox']) {
9
+ if (typeof author[kind] === 'string')
10
+ return `${kind}:${author[kind]}`;
11
+ }
12
+ const { app, release, function: named } = author;
13
+ return typeof app === 'string' && typeof release === 'string' && typeof named === 'string'
14
+ ? `app:${app}:${release}:${named}`
15
+ : null;
16
+ }
17
+ function namesOf(authors) {
18
+ if (!Array.isArray(authors))
19
+ return null;
20
+ const names = new Map();
21
+ for (const author of authors) {
22
+ const key = typeof author === 'object' && author !== null ? authorKey(author) : null;
23
+ if (key === null || typeof author.name !== 'string')
24
+ return null;
25
+ names.set(key, author.name);
26
+ }
27
+ return names;
28
+ }
29
+ function modelsOf(models, mode) {
30
+ if (!Array.isArray(models))
31
+ return null;
32
+ const files = [];
33
+ const contents = [];
34
+ for (const entry of models) {
35
+ const file = parseFile(entry, mode);
36
+ if (file === null || typeof entry.content !== 'string')
37
+ return null;
38
+ files.push(file);
39
+ contents.push({ path: file.path, content: entry.content });
40
+ }
41
+ return { files, contents };
42
+ }
43
+ export function partId(logEpoch, hash) {
44
+ return `${logEpoch}:${hash}`;
45
+ }
46
+ function chunkedRoom(room, mode) {
47
+ const at = readPosition(room);
48
+ const names = mode === 'site' ? new Map() : namesOf(room.authors);
49
+ const models = modelsOf(room.models, mode);
50
+ if (at === null || names === null || models === null || !Array.isArray(room.chunks))
51
+ return null;
52
+ const chunks = new Map();
53
+ const parts = [];
54
+ for (const chunk of room.chunks) {
55
+ const { hash, bytes, download } = chunk;
56
+ if (typeof hash !== 'string' || typeof bytes !== 'number' || typeof download !== 'string')
57
+ return null;
58
+ const id = partId(at.logEpoch, hash);
59
+ chunks.set(id, { url: download, bytes });
60
+ parts.push({ id, bytes });
61
+ }
62
+ return { anchor: room.room_ref, ...at, mode, chunks, parts, names, models };
63
+ }
64
+ function listedRoom(room, mode) {
65
+ if (typeof room !== 'object' || room === null)
66
+ return null;
67
+ const held = room;
68
+ if (typeof held.room_ref !== 'string')
69
+ return null;
70
+ if (held.ready === false)
71
+ return { kind: 'not-ready' };
72
+ return held.ready === true ? chunkedRoom(held, mode) : null;
73
+ }
74
+ export function siteChunkList(answer, locator) {
75
+ const failure = classifyDoor(answer.status, answer.body, locator);
76
+ if (failure !== null)
77
+ return failure;
78
+ return listedRoom(answer.body, 'site') ?? { kind: 'transport-uncertainty' };
79
+ }
80
+ export async function chunkedHead(listed, entry, spaces) {
81
+ if (listed.anchor !== entry.authority)
82
+ return { kind: 'transport-uncertainty' };
83
+ const models = await manifestedModels({
84
+ anchor: listed.anchor,
85
+ position: listed.position,
86
+ logEpoch: listed.logEpoch,
87
+ models: listed.models,
88
+ }, entry, spaces);
89
+ return {
90
+ kind: 'bootstrap',
91
+ roomVersion: roomVersion(listed),
92
+ documents: {},
93
+ facts: {},
94
+ revisions: {},
95
+ changes: {},
96
+ binaryFiles: {},
97
+ parts: listed.parts,
98
+ ...(models === undefined ? {} : { models }),
99
+ };
100
+ }
101
+ export async function chunkPart(body, room, id, arriving) {
102
+ const address = room.chunks.get(id);
103
+ if (body === null || address === undefined)
104
+ return { kind: 'transport-uncertainty' };
105
+ const scope = await chunkScope(body, room, arriving).catch(() => null);
106
+ if (scope === null)
107
+ return { kind: 'transport-uncertainty' };
108
+ return { ...(await stepped(bootstrapping(scope))), bytes: address.bytes };
109
+ }
110
+ function listedRooms(answer) {
111
+ const rooms = answer.body?.rooms;
112
+ if (!Array.isArray(rooms))
113
+ return null;
114
+ const listed = new Map();
115
+ for (const room of rooms) {
116
+ const held = listedRoom(room, 'credential');
117
+ if (held === null)
118
+ return null;
119
+ listed.set(room.room_ref, held);
120
+ }
121
+ return listed;
122
+ }
123
+ export function chunkLister(transport, most) {
124
+ const asked = new Map();
125
+ function answered(entries, whole) {
126
+ const prefixes = whole ? ['/'] : entries.map((entry) => authorityRoot(entry.handle));
127
+ return transport.door(houseDoorRoute('room-chunks/list'), { prefixes }).then((answer) => {
128
+ const failure = classifyDoor(answer.status, answer.body, '');
129
+ if (failure !== null)
130
+ return failed(entries, failure);
131
+ const listed = listedRooms(answer);
132
+ return listed ?? failed(entries, { kind: 'transport-uncertainty' });
133
+ }, () => failed(entries, { kind: 'transport-uncertainty' }));
134
+ }
135
+ function failed(entries, failure) {
136
+ return new Map(entries.map((entry) => [
137
+ entry.authority,
138
+ failure.kind === 'room-not-readable' || failure.kind === 'scoped-refusal'
139
+ ? { ...failure, locator: entry.locator }
140
+ : failure,
141
+ ]));
142
+ }
143
+ function settled(entry, lists) {
144
+ return lists.then((listed) => listed.get(entry.authority) ?? { kind: 'room-not-readable', locator: entry.locator });
145
+ }
146
+ function askAll(entries) {
147
+ if (entries.length === 0)
148
+ return;
149
+ const lists = answered(entries, entries.length > most());
150
+ for (const entry of entries) {
151
+ const listed = settled(entry, lists);
152
+ listed.catch(() => { });
153
+ asked.set(entry.authority, { entry, listed });
154
+ }
155
+ }
156
+ function list(entry) {
157
+ const held = asked.get(entry.authority);
158
+ asked.delete(entry.authority);
159
+ return held?.listed ?? settled(entry, answered([entry], false));
160
+ }
161
+ return {
162
+ askAll,
163
+ list,
164
+ renew(entry, installing) {
165
+ if (!asked.has(entry.authority)) {
166
+ const waiting = [...asked.values()].map((held) => held.entry);
167
+ const due = new Map([entry, ...installing, ...waiting].map((held) => [held.authority, held]));
168
+ askAll([...due.values()]);
169
+ }
170
+ return list(entry);
171
+ },
172
+ forget() {
173
+ asked.clear();
174
+ },
175
+ };
176
+ }
177
+ function folderLine(entry) {
178
+ return typeof entry.folder === 'string' && Object.keys(entry).length === 1 ? entry.folder : null;
179
+ }
180
+ function chunkEntry(line, room, read) {
181
+ let entry;
182
+ try {
183
+ entry = JSON.parse(line);
184
+ }
185
+ catch {
186
+ return false;
187
+ }
188
+ if (typeof entry !== 'object' || entry === null)
189
+ return false;
190
+ const folder = folderLine(entry);
191
+ if (folder !== null) {
192
+ read.folders.push(folder);
193
+ return true;
194
+ }
195
+ const author = entry.author;
196
+ let named = entry;
197
+ if (author !== undefined) {
198
+ const key = typeof author === 'object' && author !== null ? authorKey(author) : null;
199
+ const name = key === null ? undefined : room.names.get(key);
200
+ if (name === undefined)
201
+ return false;
202
+ named = { ...entry, author: { ...author, name } };
203
+ }
204
+ const file = parseFile(named, room.mode);
205
+ if (file === null)
206
+ return false;
207
+ read.files.push(file);
208
+ if (typeof entry.content === 'string')
209
+ read.contents.push({ path: file.path, content: entry.content });
210
+ return true;
211
+ }
212
+ export async function chunkScope(body, room, arriving) {
213
+ const read = {
214
+ files: [],
215
+ contents: [],
216
+ folders: [],
217
+ };
218
+ const reader = body.getReader();
219
+ const decoder = new TextDecoder();
220
+ const pace = paced();
221
+ const unfinished = [];
222
+ let bytes = 0;
223
+ for (let chunk = await reader.read(); chunk.done !== true; chunk = await reader.read()) {
224
+ bytes += chunk.value.length;
225
+ arriving?.(bytes);
226
+ const text = decoder.decode(chunk.value, { stream: true });
227
+ let start = 0;
228
+ for (let end = text.indexOf('\n'); end !== -1; end = text.indexOf('\n', start)) {
229
+ const piece = text.slice(start, end);
230
+ const line = unfinished.length === 0 ? piece : unfinished.splice(0).join('') + piece;
231
+ start = end + 1;
232
+ if (line.length > 0 && !chunkEntry(line, room, read)) {
233
+ await reader.cancel();
234
+ return null;
235
+ }
236
+ const due = pace(line.length + ROW_WEIGHT);
237
+ if (due instanceof Promise)
238
+ await due;
239
+ }
240
+ if (start < text.length)
241
+ unfinished.push(text.slice(start));
242
+ }
243
+ const rest = unfinished.join('') + decoder.decode();
244
+ if (rest.length > 0 && !chunkEntry(rest, room, read))
245
+ return null;
246
+ return { anchor: room.anchor, position: room.position, logEpoch: room.logEpoch, ...read };
247
+ }
@@ -0,0 +1,4 @@
1
+ export declare const CROCKFORD_ALPHABET = "0123456789abcdefghjkmnpqrstvwxyz";
2
+ export declare const CROCKFORD_CHARACTER = "[0123456789abcdefghjkmnpqrstvwxyz]";
3
+ export declare const CROCKFORD_LEADING_CHARACTER: string;
4
+ //# sourceMappingURL=crockford.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crockford.d.ts","sourceRoot":"","sources":["../src/crockford.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,qCAAqC,CAAC;AAErE,eAAO,MAAM,mBAAmB,uCAA4B,CAAC;AAE7D,eAAO,MAAM,2BAA2B,QAAqC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const CROCKFORD_ALPHABET = '0123456789abcdefghjkmnpqrstvwxyz';
2
+ export const CROCKFORD_CHARACTER = `[${CROCKFORD_ALPHABET}]`;
3
+ export const CROCKFORD_LEADING_CHARACTER = `[${CROCKFORD_ALPHABET.slice(1)}]`;
@@ -1,7 +1,6 @@
1
- import type { Capability, DiscoveredRoom, Discovery, ProviderLimit, Retention } from '@agentshouse/mdruntime';
1
+ import type { Capability, DiscoveredRoom, Discovery, Member, ProviderLimit, Retention } from '@agentshouse/mdruntime';
2
2
  import { type LogPosition } from './version.js';
3
3
  export declare const PROVIDER_ACTIONS = "provider-actions";
4
- export declare const DISCOVER_PREFIXES: readonly string[];
5
4
  export type HouseBounds = {
6
5
  max_authored_file_bytes: number;
7
6
  max_batch_operations: number;
@@ -14,40 +13,41 @@ export type HouseBounds = {
14
13
  max_upload_bytes: number;
15
14
  max_prefixes: number;
16
15
  change_retention_seconds: number;
17
- operation_retention_seconds: number;
16
+ max_move_documents?: number;
18
17
  };
19
18
  export type HouseOperations = {
20
- read: readonly string[];
21
- sync: readonly string[];
22
19
  write: readonly string[];
23
- delete: readonly string[];
24
- };
25
- export type HouseModel = {
26
- root: string;
27
- paths: readonly string[];
20
+ erase: readonly string[];
28
21
  };
22
+ export type HouseAccessLevel = 'search' | 'open' | 'keep';
29
23
  export type HouseAuthority = LogPosition & {
30
24
  roomRef: string;
31
25
  roomHandle: string;
32
26
  name: string;
33
27
  schema: string;
34
- houseModel: HouseModel | null;
28
+ typedSelection: readonly string[] | null;
35
29
  managedReplication: 'admitted' | 'unavailable';
36
30
  protectedPaths: readonly string[];
31
+ level: HouseAccessLevel;
37
32
  operations: HouseOperations;
38
33
  };
39
34
  export type HouseDiscoveryDocument = {
35
+ member: Member;
40
36
  bounds: HouseBounds;
41
37
  authorities: readonly HouseAuthority[];
42
38
  actions: readonly string[];
43
39
  };
40
+ export type HouseAuthorityChange = {
41
+ member: Member;
42
+ authorities: readonly HouseAuthority[];
43
+ left: readonly string[];
44
+ };
44
45
  export type TrackedAuthority = LogPosition & {
45
46
  locator: string;
46
47
  authority: string;
47
48
  handle: string;
48
49
  schema: string;
49
- houseModel: HouseModel | null;
50
- schemas: readonly string[];
50
+ typedSelection: readonly string[] | null;
51
51
  };
52
52
  export type HouseSiteAuthority = LogPosition & {
53
53
  roomRef: string;
@@ -58,14 +58,24 @@ export type HouseSiteDiscovery = {
58
58
  bounds: HouseBounds;
59
59
  authorities: readonly HouseSiteAuthority[];
60
60
  };
61
+ type RoomOwn = 'room_ref' | 'room_handle' | 'name' | 'position';
62
+ type Folded<A extends Record<RoomOwn, unknown>> = {
63
+ readonly shapes: readonly Omit<A, RoomOwn>[];
64
+ readonly rooms: readonly (Pick<A, RoomOwn> & {
65
+ readonly shape: number;
66
+ })[];
67
+ };
68
+ export declare function foldedAuthorities<A extends Record<RoomOwn, unknown>>(authorities: readonly A[]): Folded<A>;
61
69
  export declare function parseDiscovery(body: unknown): HouseDiscoveryDocument | null;
70
+ export declare function parseAuthorityChange(body: unknown): HouseAuthorityChange | null;
62
71
  export declare function parseSiteDiscovery(body: unknown): HouseSiteDiscovery | null;
63
72
  export declare function siteTracked(document: HouseSiteDiscovery): TrackedAuthority[];
64
- export declare function trackedFrom(document: HouseDiscoveryDocument): TrackedAuthority[];
73
+ export declare function trackedFrom(document: Pick<HouseDiscoveryDocument, 'authorities'>): TrackedAuthority[];
65
74
  export declare function providerLimits(bounds: HouseBounds): readonly ProviderLimit[];
66
75
  export declare function declaredRetention(bounds: HouseBounds): Retention;
67
- export declare function capabilities(document: HouseDiscoveryDocument): readonly Capability[];
76
+ export declare function capabilities(actions: HouseDiscoveryDocument['actions']): readonly Capability[];
68
77
  export declare function siteCapabilities(): readonly Capability[];
69
78
  export declare function discoveredRoom(authority: HouseAuthority): DiscoveredRoom;
70
79
  export declare function mapDiscovery(document: Pick<HouseDiscoveryDocument, 'bounds'>, rooms: readonly DiscoveredRoom[], declared: readonly Capability[]): Discovery;
80
+ export {};
71
81
  //# sourceMappingURL=discovery.d.ts.map
@@ -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":"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"}
package/dist/discovery.js CHANGED
@@ -1,7 +1,7 @@
1
- import { declaredActions, houseConversationAgents } from './actions.js';
1
+ import { declaredActions } from './actions.js';
2
+ import { SITES_SUBMISSIONS_CREATE } from './transport.js';
2
3
  import { readPosition, roomVersion } from './version.js';
3
4
  export const PROVIDER_ACTIONS = 'provider-actions';
4
- export const DISCOVER_PREFIXES = ['/'];
5
5
  const BOUND_KEYS = [
6
6
  'max_authored_file_bytes',
7
7
  'max_batch_operations',
@@ -14,9 +14,9 @@ const BOUND_KEYS = [
14
14
  'max_upload_bytes',
15
15
  'max_prefixes',
16
16
  'change_retention_seconds',
17
- 'operation_retention_seconds',
18
17
  ];
19
- const OPERATION_KEYS = ['read', 'sync', 'write', 'delete'];
18
+ const OPERATION_KEYS = ['write', 'erase'];
19
+ const ACCESS_LEVELS = ['search', 'open', 'keep'];
20
20
  function stringList(value) {
21
21
  if (!Array.isArray(value))
22
22
  return null;
@@ -33,18 +33,26 @@ function parseBounds(value) {
33
33
  return null;
34
34
  bounds[key] = amount;
35
35
  }
36
+ const moves = held.max_move_documents;
37
+ if (moves !== undefined) {
38
+ if (typeof moves !== 'number' || !Number.isFinite(moves))
39
+ return null;
40
+ bounds.max_move_documents = moves;
41
+ }
36
42
  return bounds;
37
43
  }
38
- function parseHouseModel(value) {
44
+ function parseTypedSelection(value) {
39
45
  if (value === undefined)
40
46
  return null;
47
+ return stringList(value) ?? undefined;
48
+ }
49
+ function parseMember(value) {
41
50
  if (typeof value !== 'object' || value === null)
42
- return undefined;
43
- const held = value;
44
- const paths = stringList(held.paths);
45
- if (typeof held.root !== 'string' || held.root.length === 0 || paths === null)
46
- return undefined;
47
- return { root: held.root, paths };
51
+ return null;
52
+ const { user, name } = value;
53
+ if (typeof user !== 'string' || typeof name !== 'string')
54
+ return null;
55
+ return { kind: 'user', id: user, name };
48
56
  }
49
57
  function parseOperations(value) {
50
58
  if (typeof value !== 'object' || value === null)
@@ -73,10 +81,15 @@ function parseAuthority(value) {
73
81
  return null;
74
82
  }
75
83
  const at = readPosition(held);
76
- const houseModel = parseHouseModel(held.house_model);
84
+ const typedSelection = parseTypedSelection(held.typed_selection);
77
85
  const protectedPaths = stringList(held.protected_paths);
78
86
  const operations = parseOperations(held.operations);
79
- if (at === null || houseModel === undefined || protectedPaths === null || operations === null)
87
+ const level = ACCESS_LEVELS.find((one) => one === held.level);
88
+ if (at === null ||
89
+ typedSelection === undefined ||
90
+ protectedPaths === null ||
91
+ level === undefined ||
92
+ operations === null)
80
93
  return null;
81
94
  if (typeof held.room_ref !== 'string' || held.room_ref.length === 0)
82
95
  return null;
@@ -87,17 +100,62 @@ function parseAuthority(value) {
87
100
  roomHandle: held.room_handle,
88
101
  name: held.name,
89
102
  schema: held.model_root,
90
- houseModel,
103
+ typedSelection,
91
104
  managedReplication: held.managed_replication,
92
105
  protectedPaths,
106
+ level,
93
107
  operations,
94
108
  ...at,
95
109
  };
96
110
  }
111
+ function parseAuthorities(value) {
112
+ if (!Array.isArray(value))
113
+ return null;
114
+ const authorities = [];
115
+ for (const entry of value) {
116
+ const authority = parseAuthority(entry);
117
+ if (authority === null)
118
+ return null;
119
+ authorities.push(authority);
120
+ }
121
+ return authorities;
122
+ }
123
+ export function foldedAuthorities(authorities) {
124
+ const shapes = [];
125
+ const known = new Map();
126
+ const rooms = authorities.map(({ room_ref, room_handle, name, position, ...shape }) => {
127
+ const key = JSON.stringify(shape);
128
+ let held = known.get(key);
129
+ if (held === undefined) {
130
+ held = shapes.push(shape) - 1;
131
+ known.set(key, held);
132
+ }
133
+ return { room_ref, room_handle, name, position, shape: held };
134
+ });
135
+ return { shapes, rooms };
136
+ }
137
+ function unfolded(shapes, rooms) {
138
+ if (!Array.isArray(shapes) || !Array.isArray(rooms))
139
+ return null;
140
+ const authorities = [];
141
+ for (const room of rooms) {
142
+ if (typeof room !== 'object' || room === null)
143
+ return null;
144
+ const { shape, ...own } = room;
145
+ const held = typeof shape === 'number' ? shapes[shape] : undefined;
146
+ if (typeof held !== 'object' || held === null)
147
+ return null;
148
+ authorities.push({ ...held, ...own });
149
+ }
150
+ return authorities;
151
+ }
97
152
  export function parseDiscovery(body) {
98
153
  if (typeof body !== 'object' || body === null)
99
154
  return null;
100
155
  const held = body;
156
+ const member = parseMember(held.member);
157
+ if (member === null)
158
+ return null;
101
159
  const bounds = parseBounds(held.bounds);
102
160
  if (bounds === null)
103
161
  return null;
@@ -106,16 +164,19 @@ export function parseDiscovery(body) {
106
164
  new Set(actions).size !== actions.length ||
107
165
  actions.some((name) => name.length === 0))
108
166
  return null;
109
- if (!Array.isArray(held.authorities))
167
+ const authorities = parseAuthorities(unfolded(held.shapes, held.rooms));
168
+ return authorities === null ? null : { member, bounds, authorities, actions };
169
+ }
170
+ export function parseAuthorityChange(body) {
171
+ if (typeof body !== 'object' || body === null)
110
172
  return null;
111
- const authorities = [];
112
- for (const entry of held.authorities) {
113
- const authority = parseAuthority(entry);
114
- if (authority === null)
115
- return null;
116
- authorities.push(authority);
117
- }
118
- return { bounds, authorities, actions };
173
+ const held = body;
174
+ const member = parseMember(held.member);
175
+ const authorities = parseAuthorities(held.authorities);
176
+ const left = stringList(held.left);
177
+ if (member === null || authorities === null || left === null)
178
+ return null;
179
+ return { member, authorities, left };
119
180
  }
120
181
  function parseSiteAuthority(value) {
121
182
  if (typeof value !== 'object' || value === null)
@@ -163,25 +224,18 @@ export function siteTracked(document) {
163
224
  authority: authority.roomRef,
164
225
  handle: authority.roomHandle,
165
226
  schema: authority.schema,
166
- houseModel: null,
167
- schemas: [authority.schema],
227
+ typedSelection: null,
168
228
  position: authority.position,
169
229
  logEpoch: authority.logEpoch,
170
230
  }));
171
231
  }
172
- function schemasOf(authority) {
173
- return authority.houseModel === null
174
- ? [authority.schema]
175
- : [authority.schema, authority.houseModel.root];
176
- }
177
232
  export function trackedFrom(document) {
178
233
  return document.authorities.map((authority) => ({
179
234
  locator: authority.roomRef,
180
235
  authority: authority.roomRef,
181
236
  handle: authority.roomHandle,
182
237
  schema: authority.schema,
183
- houseModel: authority.houseModel,
184
- schemas: schemasOf(authority),
238
+ typedSelection: authority.typedSelection,
185
239
  position: authority.position,
186
240
  logEpoch: authority.logEpoch,
187
241
  }));
@@ -193,34 +247,30 @@ export function providerLimits(bounds) {
193
247
  { name: 'change-documents', value: bounds.max_batch_documents },
194
248
  { name: 'path-length', value: bounds.max_path_length },
195
249
  { name: 'path-depth', value: bounds.max_path_depth },
250
+ ...(bounds.max_move_documents === undefined
251
+ ? []
252
+ : [{ name: 'move-documents', value: bounds.max_move_documents }]),
196
253
  { name: 'write-rate' },
197
- { name: 'content-ceiling' },
254
+ { name: 'storage-limit' },
198
255
  ];
199
256
  }
200
257
  export function declaredRetention(bounds) {
201
258
  return {
202
259
  history: { kind: 'no-declared-time-bound' },
203
- outcome: bounds.operation_retention_seconds,
204
260
  refreshHorizon: bounds.change_retention_seconds,
205
261
  };
206
262
  }
207
- export function capabilities(document) {
208
- const house = document.authorities.find((authority) => authority.houseModel !== null);
263
+ export function capabilities(actions) {
264
+ return [{ name: PROVIDER_ACTIONS, actions: declaredActions(actions) }];
265
+ }
266
+ export function siteCapabilities() {
209
267
  return [
210
268
  {
211
269
  name: PROVIDER_ACTIONS,
212
- actions: declaredActions(document.actions),
213
- ...(house === undefined
214
- ? {}
215
- : { conversationAgents: houseConversationAgents(house.roomRef) }),
270
+ actions: [{ name: SITES_SUBMISSIONS_CREATE, inputShape: {}, resultKind: 'house' }],
216
271
  },
217
272
  ];
218
273
  }
219
- export function siteCapabilities() {
220
- return [
221
- { name: PROVIDER_ACTIONS, actions: [{ name: 'submit', inputShape: {}, resultKind: 'house' }] },
222
- ];
223
- }
224
274
  export function discoveredRoom(authority) {
225
275
  const locator = authority.roomRef;
226
276
  return {
@@ -229,16 +279,18 @@ export function discoveredRoom(authority) {
229
279
  handle: authority.roomHandle,
230
280
  roomVersion: roomVersion(authority),
231
281
  operations: {
232
- read: [...authority.operations.read],
233
- sync: [...authority.operations.sync],
234
282
  write: [...authority.operations.write],
235
- delete: [...authority.operations.delete],
283
+ erase: [...authority.operations.erase],
284
+ },
285
+ replica: {
286
+ selection: locator,
287
+ admission: authority.managedReplication,
288
+ offline: authority.level === 'open' ? 'locked' : 'open',
236
289
  },
237
- replica: { selection: locator, admission: authority.managedReplication },
238
- ...(authority.houseModel === null
290
+ ...(authority.typedSelection === null
239
291
  ? {}
240
- : { typedSelection: { roots: [...authority.houseModel.paths] } }),
241
- providerOwnedPaths: [...authority.protectedPaths, ...schemasOf(authority)],
292
+ : { typedSelection: { roots: [...authority.typedSelection] } }),
293
+ providerOwnedPaths: [...authority.protectedPaths, authority.schema],
242
294
  };
243
295
  }
244
296
  export function mapDiscovery(document, rooms, declared) {
@@ -0,0 +1,12 @@
1
+ import type { AcceptedMessage, ActionResult, ConversationHistoryRequest } from '@agentshouse/mdruntime';
2
+ import { type HouseDoor } from './transport.js';
3
+ export declare const HISTORY_PAGE = 100;
4
+ type HistoryCursor = {
5
+ accepted_at: string;
6
+ message_id: string;
7
+ };
8
+ export declare function cursorPosition(cursor: HistoryCursor): string;
9
+ export declare function acceptedMessage(entry: unknown): AcceptedMessage | null;
10
+ export declare function houseHistory(transport: HouseDoor, request: ConversationHistoryRequest): Promise<ActionResult>;
11
+ export {};
12
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAGZ,0BAA0B,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhE,eAAO,MAAM,YAAY,MAAM,CAAC;AAIhC,KAAK,aAAa,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAkBjE,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE5D;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAUtE;AA8BD,wBAAsB,YAAY,CAChC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,YAAY,CAAC,CAqBvB"}