@agentshouse/mdruntime-adapter 0.1.0-cb89e0425af50 → 0.1.0-cbbc9b36e7fd4

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 (46) hide show
  1. package/AGENTS.md +256 -226
  2. package/dist/actions.d.ts +61 -1
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +80 -86
  5. package/dist/adapter.d.ts +1 -0
  6. package/dist/adapter.d.ts.map +1 -1
  7. package/dist/adapter.js +229 -63
  8. package/dist/discovery.d.ts +1 -0
  9. package/dist/discovery.d.ts.map +1 -1
  10. package/dist/discovery.js +6 -2
  11. package/dist/handed.d.ts +15 -0
  12. package/dist/handed.d.ts.map +1 -0
  13. package/dist/handed.js +38 -0
  14. package/dist/index.d.ts +2 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/model.d.ts +0 -1
  18. package/dist/model.d.ts.map +1 -1
  19. package/dist/model.js +0 -3
  20. package/dist/read.d.ts +26 -7
  21. package/dist/read.d.ts.map +1 -1
  22. package/dist/read.js +136 -78
  23. package/dist/referrer.d.ts +7 -0
  24. package/dist/referrer.d.ts.map +1 -0
  25. package/dist/referrer.js +35 -0
  26. package/dist/refusal.d.ts.map +1 -1
  27. package/dist/refusal.js +2 -1
  28. package/dist/site.d.ts +1 -1
  29. package/dist/site.d.ts.map +1 -1
  30. package/dist/site.js +157 -47
  31. package/dist/stream.d.ts +5 -4
  32. package/dist/stream.d.ts.map +1 -1
  33. package/dist/stream.js +300 -14
  34. package/dist/transport.d.ts +48 -10
  35. package/dist/transport.d.ts.map +1 -1
  36. package/dist/transport.js +3 -0
  37. package/dist/version.d.ts +1 -0
  38. package/dist/version.d.ts.map +1 -1
  39. package/dist/version.js +1 -1
  40. package/dist/write.d.ts +2 -9
  41. package/dist/write.d.ts.map +1 -1
  42. package/dist/write.js +59 -10
  43. package/package.json +2 -3
  44. package/dist/links.d.ts +0 -20
  45. package/dist/links.d.ts.map +0 -1
  46. package/dist/links.js +0 -104
package/dist/read.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { BootstrapPage, RefreshResult, RoomAttachment } from '@agentshouse/mdruntime';
1
+ import type { AdapterFailure, BinaryFile, BootstrapPage, RefreshResult } from '@agentshouse/mdruntime';
2
2
  import type { TrackedAuthority } from './discovery.js';
3
3
  import type { HouseMode } from './transport.js';
4
4
  import { type LogPosition } from './version.js';
@@ -7,7 +7,9 @@ export type HouseManifestFile = {
7
7
  path: string;
8
8
  revision: string | undefined;
9
9
  version: string;
10
+ sha256?: string;
10
11
  head?: HeadChange;
12
+ binary?: BinaryFile;
11
13
  };
12
14
  export type HouseContent = {
13
15
  path: string;
@@ -17,11 +19,15 @@ export type HouseScope = LogPosition & {
17
19
  anchor: string;
18
20
  files: readonly HouseManifestFile[];
19
21
  contents: readonly HouseContent[];
20
- attachments?: readonly RoomAttachment[];
22
+ };
23
+ export type HouseCut = {
24
+ position: string;
25
+ log_epoch: string;
21
26
  };
22
27
  export type HouseCursor = {
23
28
  room: string;
24
29
  path: string | null;
30
+ cut?: HouseCut;
25
31
  };
26
32
  export type HouseEnvelope = {
27
33
  scopes: readonly HouseScope[];
@@ -46,14 +52,23 @@ export type HouseChange = {
46
52
  head?: HeadChange;
47
53
  } | {
48
54
  path: string;
49
- reference: {
50
- revision: string;
51
- };
55
+ binary: BinaryFile;
56
+ revision: string | undefined;
57
+ version: string;
58
+ head?: HeadChange;
59
+ };
60
+ export type HousePage = {
61
+ after: string;
62
+ through: string;
63
+ read: number;
52
64
  };
53
65
  export type HouseView = LogPosition & {
54
66
  authority: string;
55
67
  changes: readonly HouseChange[];
56
- attachments?: readonly RoomAttachment[];
68
+ next?: HousePage;
69
+ };
70
+ type PageFailure = AdapterFailure | {
71
+ kind: 'beyond-horizon';
57
72
  };
58
73
  export type HouseEnumeration = {
59
74
  authorities: readonly HouseView[];
@@ -66,10 +81,13 @@ export declare function headChange(held: {
66
81
  readonly author?: unknown;
67
82
  readonly created_at?: unknown;
68
83
  }): HeadChange | undefined | null;
69
- export declare function parseOriginals(value: unknown): readonly RoomAttachment[] | null;
84
+ export declare function binaryFileOf(held: Readonly<Record<string, unknown>>): BinaryFile | undefined | null;
70
85
  export declare function parseEnvelope(body: unknown): HouseEnvelope | null;
71
86
  export declare function parseSiteBootstrap(body: unknown): HouseScope | null;
87
+ export declare function siteBootstrapNext(body: unknown): string | null;
88
+ export declare function siteBootstrapOffset(body: unknown): number | null;
72
89
  export declare function parseEnumeration(body: unknown, mode: HouseMode): HouseEnumeration | null;
90
+ export declare function wholeView(first: HouseView, more: (page: HousePage) => Promise<HouseView | PageFailure>): Promise<HouseView | PageFailure>;
73
91
  export declare function advancedScope(scope: HouseScope, view: HouseView): HouseScope;
74
92
  export declare function matchesScope(scope: HouseScope, tracked: TrackedAuthority): boolean;
75
93
  export declare function bootstrapOf(scope: HouseScope): BootstrapPage;
@@ -81,4 +99,5 @@ export type HouseSchema = {
81
99
  export declare function schemaOf(scope: HouseScope, schema: string): HouseSchema | null;
82
100
  export declare function viewOf(enumeration: HouseEnumeration, tracked: TrackedAuthority): HouseView | undefined;
83
101
  export declare function refreshFrom(view: HouseView, fromRoomVersion: string): RefreshResult;
102
+ export {};
84
103
  //# sourceMappingURL=read.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
package/dist/read.js CHANGED
@@ -1,4 +1,4 @@
1
- import { readPosition, roomVersion } from './version.js';
1
+ import { DECIMAL, readPosition, roomVersion } from './version.js';
2
2
  export function authorityRoot(handle) {
3
3
  return `/rooms/${handle}`;
4
4
  }
@@ -51,32 +51,19 @@ export function headChange(held) {
51
51
  function headed(head) {
52
52
  return head === undefined ? {} : { head };
53
53
  }
54
- function parseOriginal(value) {
55
- if (typeof value !== 'object' || value === null)
56
- return null;
57
- const { attachment, name, bytes, media_type: mediaType } = value;
58
- if (typeof attachment !== 'string' || typeof name !== 'string')
59
- return null;
60
- if (typeof bytes !== 'number' || !Number.isSafeInteger(bytes) || bytes < 0)
61
- return null;
62
- if (mediaType !== null && typeof mediaType !== 'string')
63
- return null;
64
- return { reference: attachment, name, byteLength: bytes, mediaType, entry: value };
65
- }
66
- export function parseOriginals(value) {
67
- if (!Array.isArray(value))
54
+ export function binaryFileOf(held) {
55
+ if (held.file === undefined)
56
+ return undefined;
57
+ const { file, bytes, media_type: mediaType, sha256 } = held;
58
+ if (typeof file !== 'string' ||
59
+ typeof bytes !== 'number' ||
60
+ typeof mediaType !== 'string' ||
61
+ typeof sha256 !== 'string')
68
62
  return null;
69
- const attachments = [];
70
- for (const entry of value) {
71
- const attachment = parseOriginal(entry);
72
- if (attachment === null)
73
- return null;
74
- attachments.push(attachment);
75
- }
76
- return attachments;
63
+ return { fileRef: file, byteLength: bytes, mediaType, sha256 };
77
64
  }
78
- function declared(attachments) {
79
- return attachments === undefined ? {} : { attachments };
65
+ function binaried(binary) {
66
+ return binary === undefined ? {} : { binary };
80
67
  }
81
68
  function parseFile(value, mode) {
82
69
  if (typeof value !== 'object' || value === null)
@@ -85,16 +72,30 @@ function parseFile(value, mode) {
85
72
  if (typeof file.path !== 'string')
86
73
  return null;
87
74
  const head = headChange(file);
88
- if (head === null)
75
+ const binary = binaryFileOf(file);
76
+ if (head === null || binary === null)
89
77
  return null;
90
78
  if (mode === 'site') {
91
79
  if (typeof file.sha256 !== 'string')
92
80
  return null;
93
- return { path: file.path, revision: undefined, version: file.sha256, ...headed(head) };
81
+ return {
82
+ path: file.path,
83
+ revision: binary?.sha256,
84
+ version: file.sha256,
85
+ ...headed(head),
86
+ ...binaried(binary),
87
+ };
94
88
  }
95
89
  if (typeof file.revision !== 'string')
96
90
  return null;
97
- return { path: file.path, revision: file.revision, version: file.revision, ...headed(head) };
91
+ return {
92
+ path: file.path,
93
+ revision: file.revision,
94
+ version: file.revision,
95
+ ...(typeof file.sha256 === 'string' ? { sha256: file.sha256 } : {}),
96
+ ...headed(head),
97
+ ...binaried(binary),
98
+ };
98
99
  }
99
100
  function parseScope(value, mode) {
100
101
  if (typeof value !== 'object' || value === null)
@@ -130,20 +131,28 @@ function parseScope(value, mode) {
130
131
  return null;
131
132
  contents.push({ path: content.path, content: content.content });
132
133
  }
133
- if (mode === 'site')
134
- return { anchor: manifest.anchor, ...at, files, contents };
135
- const attachments = parseOriginals(held.originals);
136
- if (attachments === null)
134
+ return { anchor: manifest.anchor, ...at, files, contents };
135
+ }
136
+ function parseCut(value) {
137
+ if (value === undefined)
138
+ return undefined;
139
+ if (typeof value !== 'object' || value === null)
140
+ return null;
141
+ const { position, log_epoch: logEpoch } = value;
142
+ if (typeof position !== 'string' || typeof logEpoch !== 'string')
137
143
  return null;
138
- return { anchor: manifest.anchor, ...at, files, contents, attachments };
144
+ return { position, log_epoch: logEpoch };
139
145
  }
140
146
  function parseCursor(value) {
141
147
  if (typeof value !== 'object' || value === null)
142
148
  return null;
143
- const { room, path } = value;
149
+ const { room, path, cut } = value;
144
150
  if (typeof room !== 'string' || (path !== null && typeof path !== 'string'))
145
151
  return null;
146
- return { room, path };
152
+ const parsed = parseCut(cut);
153
+ if (parsed === null)
154
+ return null;
155
+ return { room, path, ...(parsed === undefined ? {} : { cut: parsed }) };
147
156
  }
148
157
  export function parseEnvelope(body) {
149
158
  if (typeof body !== 'object' || body === null)
@@ -165,6 +174,18 @@ export function parseEnvelope(body) {
165
174
  export function parseSiteBootstrap(body) {
166
175
  return parseScope(body, 'site');
167
176
  }
177
+ export function siteBootstrapNext(body) {
178
+ if (typeof body !== 'object' || body === null || !('next' in body))
179
+ return null;
180
+ return typeof body.next === 'string' && body.next.length > 0 ? body.next : null;
181
+ }
182
+ export function siteBootstrapOffset(body) {
183
+ if (typeof body !== 'object' || body === null || !('offset' in body))
184
+ return null;
185
+ return Number.isSafeInteger(body.offset) && body.offset > 0
186
+ ? body.offset
187
+ : null;
188
+ }
168
189
  function parseChange(value, mode) {
169
190
  if (typeof value !== 'object' || value === null)
170
191
  return null;
@@ -174,8 +195,15 @@ function parseChange(value, mode) {
174
195
  if (held.removed === true)
175
196
  return { path: held.path, removed: true };
176
197
  const head = headChange(held);
177
- if (head === null)
198
+ const binary = binaryFileOf(held);
199
+ if (head === null || binary === null)
178
200
  return null;
201
+ if (binary !== undefined) {
202
+ if (mode === 'credential' && typeof held.revision !== 'string')
203
+ return null;
204
+ const revision = typeof held.revision === 'string' ? held.revision : binary.sha256;
205
+ return { path: held.path, binary, revision, version: revision, ...headed(head) };
206
+ }
179
207
  if (mode === 'site') {
180
208
  if (typeof held.content !== 'string' || typeof held.sha256 !== 'string')
181
209
  return null;
@@ -196,12 +224,6 @@ function parseChange(value, mode) {
196
224
  ...headed(head),
197
225
  };
198
226
  }
199
- if (typeof held.reference === 'object' && held.reference !== null) {
200
- const reference = held.reference;
201
- if (typeof reference.revision !== 'string')
202
- return null;
203
- return { path: held.path, reference: { revision: reference.revision } };
204
- }
205
227
  return null;
206
228
  }
207
229
  export function parseEnumeration(body, mode) {
@@ -226,17 +248,60 @@ export function parseEnumeration(body, mode) {
226
248
  return null;
227
249
  changes.push(mapped);
228
250
  }
229
- if (mode === 'site') {
230
- authorities.push({ authority: held.authority, ...at, changes });
231
- continue;
232
- }
233
- const attachments = parseOriginals(held.originals);
234
- if (attachments === null)
251
+ const next = held.next === undefined ? undefined : readPage(held.next);
252
+ if (next === null)
235
253
  return null;
236
- authorities.push({ authority: held.authority, ...at, changes, attachments });
254
+ authorities.push({
255
+ authority: held.authority,
256
+ ...at,
257
+ changes,
258
+ ...(next === undefined ? {} : { next }),
259
+ });
237
260
  }
238
261
  return { authorities };
239
262
  }
263
+ function readPage(held) {
264
+ if (typeof held !== 'object' || held === null)
265
+ return null;
266
+ const { after, through, read } = held;
267
+ if (typeof after !== 'string' || !DECIMAL.test(after))
268
+ return null;
269
+ if (typeof through !== 'string' || !DECIMAL.test(through))
270
+ return null;
271
+ if (typeof read !== 'number' || !Number.isSafeInteger(read) || read < 0)
272
+ return null;
273
+ return { after, through, read };
274
+ }
275
+ function advances(asked, next) {
276
+ const moved = BigInt(next.through) - BigInt(asked.through);
277
+ return moved > 0n || (moved === 0n && next.after === asked.after && next.read > asked.read);
278
+ }
279
+ export async function wholeView(first, more) {
280
+ const changes = new Map(first.changes.map((change) => [change.path, change]));
281
+ let view = first;
282
+ while (view.next !== undefined) {
283
+ const asked = view.next;
284
+ const page = await more(asked);
285
+ if ('kind' in page)
286
+ return page;
287
+ if (page.position !== asked.through ||
288
+ page.logEpoch !== first.logEpoch ||
289
+ (page.next !== undefined && !advances(asked, page.next))) {
290
+ return { kind: 'transport-uncertainty' };
291
+ }
292
+ for (const change of page.changes) {
293
+ changes.delete(change.path);
294
+ changes.set(change.path, change);
295
+ }
296
+ view = page;
297
+ }
298
+ return {
299
+ authority: first.authority,
300
+ position: view.position,
301
+ logEpoch: first.logEpoch,
302
+ changes: [...changes.values()],
303
+ };
304
+ }
240
305
  export function advancedScope(scope, view) {
241
306
  const files = new Map(scope.files.map((file) => [file.path, file]));
242
307
  const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));
@@ -245,18 +310,15 @@ export function advancedScope(scope, view) {
245
310
  contents.delete(change.path);
246
311
  if ('removed' in change)
247
312
  continue;
248
- if ('content' in change) {
249
- files.set(change.path, {
250
- path: change.path,
251
- revision: change.revision,
252
- version: change.version,
253
- ...headed(change.head),
254
- });
313
+ files.set(change.path, {
314
+ path: change.path,
315
+ revision: change.revision,
316
+ version: change.version,
317
+ ...headed(change.head),
318
+ ...('binary' in change ? { binary: change.binary } : {}),
319
+ });
320
+ if ('content' in change)
255
321
  contents.set(change.path, change.content);
256
- continue;
257
- }
258
- const { revision } = change.reference;
259
- files.set(change.path, { path: change.path, revision, version: revision });
260
322
  }
261
323
  return {
262
324
  ...scope,
@@ -274,16 +336,16 @@ export function bootstrapOf(scope) {
274
336
  const documents = {};
275
337
  const revisions = {};
276
338
  const changes = {};
277
- const binaryTargets = [];
339
+ const binaryFiles = {};
278
340
  for (const file of scope.files) {
279
341
  if (file.revision !== undefined)
280
342
  revisions[file.path] = file.revision;
281
343
  if (file.head !== undefined)
282
344
  changes[file.path] = file.head;
283
345
  const content = contents.get(file.path);
284
- if (content === undefined)
285
- binaryTargets.push(file.path);
286
- else
346
+ if (file.binary !== undefined)
347
+ binaryFiles[file.path] = file.binary;
348
+ else if (content !== undefined)
287
349
  documents[file.path] = content;
288
350
  }
289
351
  return {
@@ -292,8 +354,7 @@ export function bootstrapOf(scope) {
292
354
  documents,
293
355
  revisions,
294
356
  changes,
295
- binaryTargets: binaryTargets.sort(),
296
- ...declared(scope.attachments),
357
+ binaryFiles,
297
358
  };
298
359
  }
299
360
  export function schemaOf(scope, schema) {
@@ -314,23 +375,21 @@ export function refreshFrom(view, fromRoomVersion) {
314
375
  const documents = {};
315
376
  const revisions = {};
316
377
  const changes = {};
317
- const binaryTargets = [];
378
+ const binaryFiles = {};
318
379
  const removals = [];
319
380
  for (const change of view.changes) {
320
381
  if ('removed' in change) {
321
382
  removals.push(change.path);
322
383
  continue;
323
384
  }
324
- if ('content' in change) {
385
+ if ('content' in change)
325
386
  documents[change.path] = change.content;
326
- if (change.revision !== undefined)
327
- revisions[change.path] = change.revision;
328
- if (change.head !== undefined)
329
- changes[change.path] = change.head;
330
- continue;
331
- }
332
- binaryTargets.push(change.path);
333
- revisions[change.path] = change.reference.revision;
387
+ else
388
+ binaryFiles[change.path] = change.binary;
389
+ if (change.revision !== undefined)
390
+ revisions[change.path] = change.revision;
391
+ if (change.head !== undefined)
392
+ changes[change.path] = change.head;
334
393
  }
335
394
  return {
336
395
  kind: 'net-advancement',
@@ -338,8 +397,7 @@ export function refreshFrom(view, fromRoomVersion) {
338
397
  documents,
339
398
  revisions,
340
399
  changes,
341
- binaryTargets: binaryTargets.sort(),
400
+ binaryFiles,
342
401
  removals: removals.sort(),
343
- ...declared(view.attachments),
344
402
  };
345
403
  }
@@ -0,0 +1,7 @@
1
+ import type { TrackedAuthority } from './discovery.js';
2
+ export type HouseReferrer = {
3
+ locator: string;
4
+ referrer: Readonly<Record<string, string>>;
5
+ };
6
+ export declare function houseReferrer(referrer: unknown, tracked: ReadonlyMap<string, TrackedAuthority>): HouseReferrer | null;
7
+ //# sourceMappingURL=referrer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referrer.d.ts","sourceRoot":"","sources":["../src/referrer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAgB5F,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC7C,aAAa,GAAG,IAAI,CAqBtB"}
@@ -0,0 +1,35 @@
1
+ function fields(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
3
+ ? value
4
+ : null;
5
+ }
6
+ function named(held, ...keys) {
7
+ const present = Object.keys(held);
8
+ return (present.length === keys.length &&
9
+ keys.every((key) => typeof held[key] === 'string' && held[key] !== ''));
10
+ }
11
+ export function houseReferrer(referrer, tracked) {
12
+ const held = fields(referrer);
13
+ if (held === null)
14
+ return null;
15
+ if (named(held, 'room', 'path')) {
16
+ const entry = tracked.get(held.room);
17
+ if (entry === undefined)
18
+ return null;
19
+ return {
20
+ locator: entry.locator,
21
+ referrer: { room_ref: entry.authority, path: held.path },
22
+ };
23
+ }
24
+ if (named(held, 'room_ref', 'record')) {
25
+ const roomRef = held.room_ref;
26
+ const entry = [...tracked.values()].find((candidate) => candidate.authority === roomRef);
27
+ return {
28
+ locator: entry?.locator ?? roomRef,
29
+ referrer: { room_ref: roomRef, record: held.record },
30
+ };
31
+ }
32
+ if (named(held, 'message'))
33
+ return { locator: '', referrer: { message: held.message } };
34
+ return null;
35
+ }
@@ -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;AAmBD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG,IAAI,CAMvB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAGpD;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,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,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAGpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAQrF"}
package/dist/refusal.js CHANGED
@@ -18,8 +18,9 @@ function doorFailure(status, body) {
18
18
  const refusal = doorRefusal(body);
19
19
  if (status === 401)
20
20
  return { kind: 'revoked-authorization' };
21
- if (refusal?.retryable === true)
21
+ if (refusal?.retryable === true || refusal?.code === 'update_required') {
22
22
  return { kind: 'transport-uncertainty' };
23
+ }
23
24
  if (status === 404 || refusal?.code === 'room_not_found')
24
25
  return { kind: 'room-not-readable' };
25
26
  if (status < 400)
package/dist/site.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import type { Adapter } from '@agentshouse/mdruntime';
2
2
  import { type HouseSiteTransport } from './transport.js';
3
- export declare function createSiteAdapter(transport: HouseSiteTransport): Adapter;
3
+ export declare function createSiteAdapter(transport: HouseSiteTransport, snapshot?: boolean): Adapter;
4
4
  //# sourceMappingURL=site.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAMR,MAAM,wBAAwB,CAAC;AAsBhC,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAgCxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAwIxE"}
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAOR,MAAM,wBAAwB,CAAC;AA2BhC,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAmCxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CA+Q1F"}