@agentshouse/mdruntime-adapter 0.1.0-alpha.3 → 0.1.0-alpha.30

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 (49) hide show
  1. package/AGENTS.md +122 -22
  2. package/dist/actions.d.ts +3 -11
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +119 -224
  5. package/dist/actions.js.map +1 -1
  6. package/dist/adapter.d.ts +3 -1
  7. package/dist/adapter.d.ts.map +1 -1
  8. package/dist/adapter.js +48 -104
  9. package/dist/adapter.js.map +1 -1
  10. package/dist/discovery.d.ts +35 -8
  11. package/dist/discovery.d.ts.map +1 -1
  12. package/dist/discovery.js +136 -32
  13. package/dist/discovery.js.map +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/model.d.ts +19 -0
  18. package/dist/model.d.ts.map +1 -0
  19. package/dist/model.js +64 -0
  20. package/dist/model.js.map +1 -0
  21. package/dist/read.d.ts +20 -15
  22. package/dist/read.d.ts.map +1 -1
  23. package/dist/read.js +118 -39
  24. package/dist/read.js.map +1 -1
  25. package/dist/refusal.d.ts +4 -1
  26. package/dist/refusal.d.ts.map +1 -1
  27. package/dist/refusal.js +13 -0
  28. package/dist/refusal.js.map +1 -1
  29. package/dist/site.d.ts +4 -0
  30. package/dist/site.d.ts.map +1 -0
  31. package/dist/site.js +205 -0
  32. package/dist/site.js.map +1 -0
  33. package/dist/stream.d.ts +6 -5
  34. package/dist/stream.d.ts.map +1 -1
  35. package/dist/stream.js +107 -119
  36. package/dist/stream.js.map +1 -1
  37. package/dist/transport.d.ts +16 -25
  38. package/dist/transport.d.ts.map +1 -1
  39. package/dist/transport.js +5 -1
  40. package/dist/transport.js.map +1 -1
  41. package/dist/version.d.ts +14 -0
  42. package/dist/version.d.ts.map +1 -0
  43. package/dist/version.js +29 -0
  44. package/dist/version.js.map +1 -0
  45. package/dist/write.d.ts +6 -0
  46. package/dist/write.d.ts.map +1 -1
  47. package/dist/write.js +24 -7
  48. package/dist/write.js.map +1 -1
  49. package/package.json +3 -3
package/dist/read.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { PROVIDER_SELECTION_ROOTS } from './discovery.js';
2
+ import { readPosition, roomVersion } from './version.js';
2
3
  export function authorityRoot(handle) {
3
4
  return handle === undefined ? '/private' : `/rooms/${handle}`;
4
5
  }
@@ -28,32 +29,53 @@ export function parseGrant(body) {
28
29
  return null;
29
30
  }
30
31
  const transfer = body.transfer;
31
- if (transfer.method !== 'GET' && transfer.method !== 'POST') return null;
32
- if (typeof transfer.operation !== 'string' || typeof transfer.url !== 'string') return null;
32
+ if (typeof transfer.url !== 'string') return null;
33
+ if (transfer.method === 'GET') return {
34
+ method: 'GET',
35
+ url: transfer.url
36
+ };
37
+ if (transfer.method !== 'POST' || typeof transfer.operation !== 'string') return null;
33
38
  return {
34
- method: transfer.method,
39
+ method: 'POST',
35
40
  operation: transfer.operation,
36
41
  url: transfer.url
37
42
  };
38
43
  }
39
- function parseScope(value) {
44
+ function parseFile(value, mode) {
45
+ if (typeof value !== 'object' || value === null) return null;
46
+ const file = value;
47
+ if (typeof file.path !== 'string') return null;
48
+ if (mode === 'site') {
49
+ if (typeof file.sha256 !== 'string') return null;
50
+ return {
51
+ path: file.path,
52
+ revision: undefined,
53
+ version: file.sha256
54
+ };
55
+ }
56
+ if (typeof file.revision !== 'string') return null;
57
+ return {
58
+ path: file.path,
59
+ revision: file.revision,
60
+ version: file.revision
61
+ };
62
+ }
63
+ function parseScope(value, mode) {
40
64
  if (typeof value !== 'object' || value === null) return null;
41
65
  const held = value;
42
66
  if (typeof held.manifest !== 'object' || held.manifest === null) return null;
43
67
  if (!Array.isArray(held.contents)) return null;
44
68
  const manifest = held.manifest;
45
- if (manifest.scope !== 'room' && manifest.scope !== 'private') return null;
46
- if (typeof manifest.anchor !== 'string' || typeof manifest.position !== 'string') return null;
69
+ if (manifest.scope !== 'room') return null;
70
+ const at = readPosition(manifest);
71
+ if (typeof manifest.anchor !== 'string' || manifest.anchor.length === 0 || at === null) return null;
72
+ if (manifest.room_handle !== null && (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)) return null;
47
73
  if (!Array.isArray(manifest.files)) return null;
48
74
  const files = [];
49
75
  for (const entry of manifest.files){
50
- if (typeof entry !== 'object' || entry === null) return null;
51
- const file = entry;
52
- if (typeof file.path !== 'string' || typeof file.revision !== 'string') return null;
53
- files.push({
54
- path: file.path,
55
- revision: file.revision
56
- });
76
+ const file = parseFile(entry, mode);
77
+ if (file === null) return null;
78
+ files.push(file);
57
79
  }
58
80
  const contents = [];
59
81
  for (const entry of held.contents){
@@ -66,10 +88,8 @@ function parseScope(value) {
66
88
  });
67
89
  }
68
90
  return {
69
- scope: manifest.scope,
70
91
  anchor: manifest.anchor,
71
- roomHandle: typeof manifest.room_handle === 'string' ? manifest.room_handle : undefined,
72
- position: manifest.position,
92
+ ...at,
73
93
  files,
74
94
  contents
75
95
  };
@@ -79,7 +99,7 @@ export function parseEnvelope(body) {
79
99
  if (!('scopes' in body) || !Array.isArray(body.scopes)) return null;
80
100
  const scopes = [];
81
101
  for (const entry of body.scopes){
82
- const scope = parseScope(entry);
102
+ const scope = parseScope(entry, 'credential');
83
103
  if (scope === null) return null;
84
104
  scopes.push(scope);
85
105
  }
@@ -87,7 +107,10 @@ export function parseEnvelope(body) {
87
107
  scopes
88
108
  };
89
109
  }
90
- function parseChange(value) {
110
+ export function parseSiteBootstrap(body) {
111
+ return parseScope(body, 'site');
112
+ }
113
+ function parseChange(value, mode) {
91
114
  if (typeof value !== 'object' || value === null) return null;
92
115
  const held = value;
93
116
  if (typeof held.path !== 'string') return null;
@@ -95,11 +118,21 @@ function parseChange(value) {
95
118
  path: held.path,
96
119
  removed: true
97
120
  };
121
+ if (mode === 'site') {
122
+ if (typeof held.content !== 'string' || typeof held.sha256 !== 'string') return null;
123
+ return {
124
+ path: held.path,
125
+ content: held.content,
126
+ revision: undefined,
127
+ version: held.sha256
128
+ };
129
+ }
98
130
  if (typeof held.content === 'string' && typeof held.revision === 'string') {
99
131
  return {
100
132
  path: held.path,
101
133
  content: held.content,
102
- revision: held.revision
134
+ revision: held.revision,
135
+ version: held.revision
103
136
  };
104
137
  }
105
138
  if (typeof held.reference === 'object' && held.reference !== null) {
@@ -114,24 +147,25 @@ function parseChange(value) {
114
147
  }
115
148
  return null;
116
149
  }
117
- export function parseEnumeration(body) {
150
+ export function parseEnumeration(body, mode) {
118
151
  if (typeof body !== 'object' || body === null) return null;
119
152
  if (!('authorities' in body) || !Array.isArray(body.authorities)) return null;
120
153
  const authorities = [];
121
154
  for (const entry of body.authorities){
122
155
  if (typeof entry !== 'object' || entry === null) return null;
123
156
  const held = entry;
124
- if (typeof held.authority !== 'string' || typeof held.position !== 'string') return null;
157
+ const at = readPosition(held);
158
+ if (typeof held.authority !== 'string' || at === null) return null;
125
159
  if (!Array.isArray(held.changes)) return null;
126
160
  const changes = [];
127
161
  for (const change of held.changes){
128
- const mapped = parseChange(change);
162
+ const mapped = parseChange(change, mode);
129
163
  if (mapped === null) return null;
130
164
  changes.push(mapped);
131
165
  }
132
166
  authorities.push({
133
167
  authority: held.authority,
134
- position: held.position,
168
+ ...at,
135
169
  changes
136
170
  });
137
171
  }
@@ -139,9 +173,52 @@ export function parseEnumeration(body) {
139
173
  authorities
140
174
  };
141
175
  }
176
+ export function advancedScope(scope, view) {
177
+ const files = new Map(scope.files.map((file)=>[
178
+ file.path,
179
+ file
180
+ ]));
181
+ const contents = new Map(scope.contents.map((entry)=>[
182
+ entry.path,
183
+ entry.content
184
+ ]));
185
+ for (const change of view.changes){
186
+ files.delete(change.path);
187
+ contents.delete(change.path);
188
+ if ('removed' in change) continue;
189
+ if ('content' in change) {
190
+ files.set(change.path, {
191
+ path: change.path,
192
+ revision: change.revision,
193
+ version: change.version
194
+ });
195
+ contents.set(change.path, change.content);
196
+ continue;
197
+ }
198
+ const { revision } = change.reference;
199
+ files.set(change.path, {
200
+ path: change.path,
201
+ revision,
202
+ version: revision
203
+ });
204
+ }
205
+ return {
206
+ ...scope,
207
+ position: view.position,
208
+ logEpoch: view.logEpoch,
209
+ files: [
210
+ ...files.values()
211
+ ],
212
+ contents: [
213
+ ...contents
214
+ ].map(([path, content])=>({
215
+ path,
216
+ content
217
+ }))
218
+ };
219
+ }
142
220
  export function matchesScope(scope, tracked) {
143
- if (tracked.handle === undefined) return scope.scope === 'private';
144
- return scope.roomHandle === tracked.handle || scope.anchor === tracked.authority;
221
+ return scope.anchor === tracked.authority;
145
222
  }
146
223
  export function withinRoot(path, root) {
147
224
  return path === root || path.startsWith(`${root}/`);
@@ -156,6 +233,9 @@ export function bootstrapFrom(envelope, tracked) {
156
233
  kind: 'room-not-readable',
157
234
  locator: tracked.locator
158
235
  };
236
+ return bootstrapOf(scope, tracked);
237
+ }
238
+ export function bootstrapOf(scope, tracked) {
159
239
  const contents = new Map(scope.contents.map((entry)=>[
160
240
  entry.path,
161
241
  entry.content
@@ -165,43 +245,42 @@ export function bootstrapFrom(envelope, tracked) {
165
245
  const binaryTargets = [];
166
246
  for (const file of scope.files){
167
247
  if (!selects(tracked, file.path)) continue;
168
- revisions[file.path] = file.revision;
248
+ if (file.revision !== undefined) revisions[file.path] = file.revision;
169
249
  const content = contents.get(file.path);
170
250
  if (content === undefined) binaryTargets.push(file.path);
171
251
  else documents[file.path] = content;
172
252
  }
173
253
  return {
174
254
  kind: 'bootstrap',
175
- roomVersion: scope.position,
255
+ roomVersion: roomVersion(scope),
176
256
  documents,
177
257
  revisions,
178
258
  binaryTargets: binaryTargets.sort()
179
259
  };
180
260
  }
181
- export const MODEL_DEFINITION_ADDRESS = 'types';
182
- export function definitionAddress(path) {
183
- return `${MODEL_DEFINITION_ADDRESS}/${path.slice(path.lastIndexOf('/') + 1)}`;
184
- }
185
261
  export function definitionsFrom(envelope, tracked, modelRoot) {
186
262
  const scope = envelope.scopes.find((entry)=>matchesScope(entry, tracked));
187
263
  if (scope === undefined) return null;
264
+ return definitionsOf(scope, modelRoot);
265
+ }
266
+ export function definitionsOf(scope, modelRoot) {
188
267
  const contents = new Map(scope.contents.map((entry)=>[
189
268
  entry.path,
190
269
  entry.content
191
270
  ]));
192
271
  const definitions = {};
193
- const revisions = [];
272
+ const versions = [];
194
273
  for (const file of scope.files){
195
274
  if (!withinRoot(file.path, modelRoot)) continue;
196
275
  const content = contents.get(file.path);
197
- const address = definitionAddress(file.path);
198
- if (content === undefined || Object.hasOwn(definitions, address)) return null;
276
+ const address = file.path;
277
+ if (content === undefined) return null;
199
278
  definitions[address] = content;
200
- revisions.push(`${file.path} ${file.revision}`);
279
+ versions.push(`${file.path} ${file.version}`);
201
280
  }
202
281
  return {
203
282
  definitions,
204
- revisions: revisions.sort()
283
+ versions: versions.sort()
205
284
  };
206
285
  }
207
286
  export function refreshFrom(enumeration, tracked, fromRoomVersion) {
@@ -210,7 +289,7 @@ export function refreshFrom(enumeration, tracked, fromRoomVersion) {
210
289
  kind: 'room-not-readable',
211
290
  locator: tracked.locator
212
291
  };
213
- if (view.position === fromRoomVersion) return {
292
+ if (roomVersion(view) === fromRoomVersion) return {
214
293
  kind: 'still-current'
215
294
  };
216
295
  const documents = {};
@@ -225,7 +304,7 @@ export function refreshFrom(enumeration, tracked, fromRoomVersion) {
225
304
  }
226
305
  if ('content' in change) {
227
306
  documents[change.path] = change.content;
228
- revisions[change.path] = change.revision;
307
+ if (change.revision !== undefined) revisions[change.path] = change.revision;
229
308
  continue;
230
309
  }
231
310
  binaryTargets.push(change.path);
@@ -233,7 +312,7 @@ export function refreshFrom(enumeration, tracked, fromRoomVersion) {
233
312
  }
234
313
  return {
235
314
  kind: 'net-advancement',
236
- roomVersion: view.position,
315
+ roomVersion: roomVersion(view),
237
316
  documents,
238
317
  revisions,
239
318
  binaryTargets: binaryTargets.sort(),
package/dist/read.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/read.ts"],"sourcesContent":["import type { BootstrapResult, RefreshResult } from '@agentshouse/mdruntime';\nimport { PROVIDER_SELECTION_ROOTS, type TrackedAuthority } from './discovery.js';\n\nexport type HouseManifestFile = {\n path: string;\n revision: string;\n};\n\nexport type HouseContent = {\n path: string;\n content: string;\n};\n\nexport type HouseScope = {\n scope: 'room' | 'private';\n anchor: string;\n roomHandle: string | undefined;\n position: string;\n files: readonly HouseManifestFile[];\n contents: readonly HouseContent[];\n};\n\nexport type HouseEnvelope = {\n scopes: readonly HouseScope[];\n};\n\nexport type HouseGrant = {\n method: 'GET' | 'POST';\n operation: string;\n url: string;\n};\n\nexport type HouseChange =\n | { path: string; removed: true }\n | { path: string; content: string; revision: string }\n | { path: string; reference: { revision: string } };\n\nexport type HouseEnumeration = {\n authorities: readonly {\n authority: string;\n position: string;\n changes: readonly HouseChange[];\n }[];\n};\n\nexport function authorityRoot(handle: string | undefined): string {\n return handle === undefined ? '/private' : `/rooms/${handle}`;\n}\n\nexport const ROOM_README = 'ROOM.md';\n\nexport function selectionRoots(tracked: TrackedAuthority): readonly string[] {\n if (tracked.handle === undefined) {\n return [tracked.collectionRoot, ...PROVIDER_SELECTION_ROOTS];\n }\n return [ROOM_README, tracked.collectionRoot];\n}\n\nexport function contentPrefixes(tracked: TrackedAuthority): readonly string[] {\n const root = authorityRoot(tracked.handle);\n return selectionRoots(tracked)\n .filter((entry) => entry !== ROOM_README)\n .map((entry) => `${root}/${entry}`);\n}\n\nexport function modelPrefix(tracked: TrackedAuthority, modelRoot: string): string {\n return `${authorityRoot(tracked.handle)}/${modelRoot}`;\n}\n\nexport function parseGrant(body: unknown): HouseGrant | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('transfer' in body) || typeof body.transfer !== 'object' || body.transfer === null) {\n return null;\n }\n const transfer = body.transfer as Record<string, unknown>;\n if (transfer.method !== 'GET' && transfer.method !== 'POST') return null;\n if (typeof transfer.operation !== 'string' || typeof transfer.url !== 'string') return null;\n return { method: transfer.method, operation: transfer.operation, url: transfer.url };\n}\n\nfunction parseScope(value: unknown): HouseScope | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.manifest !== 'object' || held.manifest === null) return null;\n if (!Array.isArray(held.contents)) return null;\n const manifest = held.manifest as Record<string, unknown>;\n if (manifest.scope !== 'room' && manifest.scope !== 'private') return null;\n if (typeof manifest.anchor !== 'string' || typeof manifest.position !== 'string') return null;\n if (!Array.isArray(manifest.files)) return null;\n const files: HouseManifestFile[] = [];\n for (const entry of manifest.files) {\n if (typeof entry !== 'object' || entry === null) return null;\n const file = entry as Record<string, unknown>;\n if (typeof file.path !== 'string' || typeof file.revision !== 'string') return null;\n files.push({ path: file.path, revision: file.revision });\n }\n const contents: HouseContent[] = [];\n for (const entry of held.contents) {\n if (typeof entry !== 'object' || entry === null) return null;\n const content = entry as Record<string, unknown>;\n if (typeof content.path !== 'string' || typeof content.content !== 'string') return null;\n contents.push({ path: content.path, content: content.content });\n }\n return {\n scope: manifest.scope,\n anchor: manifest.anchor,\n roomHandle: typeof manifest.room_handle === 'string' ? manifest.room_handle : undefined,\n position: manifest.position,\n files,\n contents,\n };\n}\n\nexport function parseEnvelope(body: unknown): HouseEnvelope | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('scopes' in body) || !Array.isArray(body.scopes)) return null;\n const scopes: HouseScope[] = [];\n for (const entry of body.scopes) {\n const scope = parseScope(entry);\n if (scope === null) return null;\n scopes.push(scope);\n }\n return { scopes };\n}\n\nfunction parseChange(value: unknown): HouseChange | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.path !== 'string') return null;\n if (held.removed === true) return { path: held.path, removed: true };\n if (typeof held.content === 'string' && typeof held.revision === 'string') {\n return { path: held.path, content: held.content, revision: held.revision };\n }\n if (typeof held.reference === 'object' && held.reference !== null) {\n const reference = held.reference as Record<string, unknown>;\n if (typeof reference.revision !== 'string') return null;\n return { path: held.path, reference: { revision: reference.revision } };\n }\n return null;\n}\n\nexport function parseEnumeration(body: unknown): HouseEnumeration | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('authorities' in body) || !Array.isArray(body.authorities)) return null;\n const authorities: HouseEnumeration['authorities'][number][] = [];\n for (const entry of body.authorities) {\n if (typeof entry !== 'object' || entry === null) return null;\n const held = entry as Record<string, unknown>;\n if (typeof held.authority !== 'string' || typeof held.position !== 'string') return null;\n if (!Array.isArray(held.changes)) return null;\n const changes: HouseChange[] = [];\n for (const change of held.changes) {\n const mapped = parseChange(change);\n if (mapped === null) return null;\n changes.push(mapped);\n }\n authorities.push({ authority: held.authority, position: held.position, changes });\n }\n return { authorities };\n}\n\nexport function matchesScope(scope: HouseScope, tracked: TrackedAuthority): boolean {\n if (tracked.handle === undefined) return scope.scope === 'private';\n return scope.roomHandle === tracked.handle || scope.anchor === tracked.authority;\n}\n\nexport function withinRoot(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport function selects(tracked: TrackedAuthority, path: string): boolean {\n if (tracked.modelRoots.some((root) => withinRoot(path, root))) return false;\n return selectionRoots(tracked).some((root) => withinRoot(path, root));\n}\n\nexport function bootstrapFrom(envelope: HouseEnvelope, tracked: TrackedAuthority): BootstrapResult {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n for (const file of scope.files) {\n if (!selects(tracked, file.path)) continue;\n revisions[file.path] = file.revision;\n const content = contents.get(file.path);\n if (content === undefined) binaryTargets.push(file.path);\n else documents[file.path] = content;\n }\n return {\n kind: 'bootstrap',\n roomVersion: scope.position,\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n };\n}\n\nexport type HouseDefinitions = {\n definitions: Readonly<Record<string, string>>;\n revisions: readonly string[];\n};\n\nexport const MODEL_DEFINITION_ADDRESS = 'types';\n\nexport function definitionAddress(path: string): string {\n return `${MODEL_DEFINITION_ADDRESS}/${path.slice(path.lastIndexOf('/') + 1)}`;\n}\n\nexport function definitionsFrom(\n envelope: HouseEnvelope,\n tracked: TrackedAuthority,\n modelRoot: string,\n): HouseDefinitions | null {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return null;\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const definitions: Record<string, string> = {};\n const revisions: string[] = [];\n for (const file of scope.files) {\n if (!withinRoot(file.path, modelRoot)) continue;\n const content = contents.get(file.path);\n const address = definitionAddress(file.path);\n if (content === undefined || Object.hasOwn(definitions, address)) return null;\n definitions[address] = content;\n revisions.push(`${file.path} ${file.revision}`);\n }\n return { definitions, revisions: revisions.sort() };\n}\n\nexport function refreshFrom(\n enumeration: HouseEnumeration,\n tracked: TrackedAuthority,\n fromRoomVersion: string,\n): RefreshResult {\n const view = enumeration.authorities.find((entry) => entry.authority === tracked.authority);\n if (view === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n if (view.position === fromRoomVersion) return { kind: 'still-current' };\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n const removals: string[] = [];\n for (const change of view.changes) {\n if (!selects(tracked, change.path)) continue;\n if ('removed' in change) {\n removals.push(change.path);\n continue;\n }\n if ('content' in change) {\n documents[change.path] = change.content;\n revisions[change.path] = change.revision;\n continue;\n }\n binaryTargets.push(change.path);\n revisions[change.path] = change.reference.revision;\n }\n return {\n kind: 'net-advancement',\n roomVersion: view.position,\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n removals: removals.sort(),\n };\n}\n"],"names":["PROVIDER_SELECTION_ROOTS","authorityRoot","handle","undefined","ROOM_README","selectionRoots","tracked","collectionRoot","contentPrefixes","root","filter","entry","map","modelPrefix","modelRoot","parseGrant","body","transfer","method","operation","url","parseScope","value","held","manifest","Array","isArray","contents","scope","anchor","position","files","file","path","revision","push","content","roomHandle","room_handle","parseEnvelope","scopes","parseChange","removed","reference","parseEnumeration","authorities","authority","changes","change","mapped","matchesScope","withinRoot","startsWith","selects","modelRoots","some","bootstrapFrom","envelope","find","kind","locator","Map","documents","revisions","binaryTargets","get","roomVersion","sort","MODEL_DEFINITION_ADDRESS","definitionAddress","slice","lastIndexOf","definitionsFrom","definitions","address","Object","hasOwn","refreshFrom","enumeration","fromRoomVersion","view","removals"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/read.ts"],"sourcesContent":["import type { BootstrapPage, BootstrapResult, RefreshResult } from '@agentshouse/mdruntime';\nimport { PROVIDER_SELECTION_ROOTS, type TrackedAuthority } from './discovery.js';\nimport type { HouseMode } from './transport.js';\nimport { readPosition, roomVersion, type LogPosition } from './version.js';\n\nexport type HouseManifestFile = {\n path: string;\n revision: string | undefined;\n version: string;\n};\n\nexport type HouseContent = {\n path: string;\n content: string;\n};\n\nexport type HouseScope = LogPosition & {\n anchor: string;\n files: readonly HouseManifestFile[];\n contents: readonly HouseContent[];\n};\n\nexport type HouseEnvelope = {\n scopes: readonly HouseScope[];\n};\n\nexport type HouseGrant =\n | { method: 'GET'; url: string }\n | { method: 'POST'; operation: string; url: string };\n\nexport type HouseChange =\n | { path: string; removed: true }\n | { path: string; content: string; revision: string | undefined; version: string }\n | { path: string; reference: { revision: string } };\n\nexport type HouseEnumeration = {\n authorities: readonly (LogPosition & {\n authority: string;\n changes: readonly HouseChange[];\n })[];\n};\n\nexport function authorityRoot(handle: string | undefined): string {\n return handle === undefined ? '/private' : `/rooms/${handle}`;\n}\n\nexport const ROOM_README = 'ROOM.md';\n\nexport function selectionRoots(tracked: TrackedAuthority): readonly string[] {\n if (tracked.handle === undefined) {\n return [tracked.collectionRoot, ...PROVIDER_SELECTION_ROOTS];\n }\n return [ROOM_README, tracked.collectionRoot];\n}\n\nexport function contentPrefixes(tracked: TrackedAuthority): readonly string[] {\n const root = authorityRoot(tracked.handle);\n return selectionRoots(tracked)\n .filter((entry) => entry !== ROOM_README)\n .map((entry) => `${root}/${entry}`);\n}\n\nexport function modelPrefix(tracked: TrackedAuthority, modelRoot: string): string {\n return `${authorityRoot(tracked.handle)}/${modelRoot}`;\n}\n\nexport function parseGrant(body: unknown): HouseGrant | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('transfer' in body) || typeof body.transfer !== 'object' || body.transfer === null) {\n return null;\n }\n const transfer = body.transfer as Record<string, unknown>;\n if (typeof transfer.url !== 'string') return null;\n if (transfer.method === 'GET') return { method: 'GET', url: transfer.url };\n if (transfer.method !== 'POST' || typeof transfer.operation !== 'string') return null;\n return { method: 'POST', operation: transfer.operation, url: transfer.url };\n}\n\nfunction parseFile(value: unknown, mode: HouseMode): HouseManifestFile | null {\n if (typeof value !== 'object' || value === null) return null;\n const file = value as Record<string, unknown>;\n if (typeof file.path !== 'string') return null;\n if (mode === 'site') {\n if (typeof file.sha256 !== 'string') return null;\n return { path: file.path, revision: undefined, version: file.sha256 };\n }\n if (typeof file.revision !== 'string') return null;\n return { path: file.path, revision: file.revision, version: file.revision };\n}\n\nfunction parseScope(value: unknown, mode: HouseMode): HouseScope | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.manifest !== 'object' || held.manifest === null) return null;\n if (!Array.isArray(held.contents)) return null;\n const manifest = held.manifest as Record<string, unknown>;\n if (manifest.scope !== 'room') return null;\n const at = readPosition(manifest);\n if (typeof manifest.anchor !== 'string' || manifest.anchor.length === 0 || at === null)\n return null;\n if (\n manifest.room_handle !== null &&\n (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)\n )\n return null;\n if (!Array.isArray(manifest.files)) return null;\n const files: HouseManifestFile[] = [];\n for (const entry of manifest.files) {\n const file = parseFile(entry, mode);\n if (file === null) return null;\n files.push(file);\n }\n const contents: HouseContent[] = [];\n for (const entry of held.contents) {\n if (typeof entry !== 'object' || entry === null) return null;\n const content = entry as Record<string, unknown>;\n if (typeof content.path !== 'string' || typeof content.content !== 'string') return null;\n contents.push({ path: content.path, content: content.content });\n }\n return {\n anchor: manifest.anchor,\n ...at,\n files,\n contents,\n };\n}\n\nexport function parseEnvelope(body: unknown): HouseEnvelope | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('scopes' in body) || !Array.isArray(body.scopes)) return null;\n const scopes: HouseScope[] = [];\n for (const entry of body.scopes) {\n const scope = parseScope(entry, 'credential');\n if (scope === null) return null;\n scopes.push(scope);\n }\n return { scopes };\n}\n\nexport function parseSiteBootstrap(body: unknown): HouseScope | null {\n return parseScope(body, 'site');\n}\n\nfunction parseChange(value: unknown, mode: HouseMode): HouseChange | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.path !== 'string') return null;\n if (held.removed === true) return { path: held.path, removed: true };\n if (mode === 'site') {\n if (typeof held.content !== 'string' || typeof held.sha256 !== 'string') return null;\n return { path: held.path, content: held.content, revision: undefined, version: held.sha256 };\n }\n if (typeof held.content === 'string' && typeof held.revision === 'string') {\n return {\n path: held.path,\n content: held.content,\n revision: held.revision,\n version: held.revision,\n };\n }\n if (typeof held.reference === 'object' && held.reference !== null) {\n const reference = held.reference as Record<string, unknown>;\n if (typeof reference.revision !== 'string') return null;\n return { path: held.path, reference: { revision: reference.revision } };\n }\n return null;\n}\n\nexport function parseEnumeration(body: unknown, mode: HouseMode): HouseEnumeration | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('authorities' in body) || !Array.isArray(body.authorities)) return null;\n const authorities: HouseEnumeration['authorities'][number][] = [];\n for (const entry of body.authorities) {\n if (typeof entry !== 'object' || entry === null) return null;\n const held = entry as Record<string, unknown>;\n const at = readPosition(held);\n if (typeof held.authority !== 'string' || at === null) return null;\n if (!Array.isArray(held.changes)) return null;\n const changes: HouseChange[] = [];\n for (const change of held.changes) {\n const mapped = parseChange(change, mode);\n if (mapped === null) return null;\n changes.push(mapped);\n }\n authorities.push({ authority: held.authority, ...at, changes });\n }\n return { authorities };\n}\n\nexport function advancedScope(\n scope: HouseScope,\n view: HouseEnumeration['authorities'][number],\n): HouseScope {\n const files = new Map(scope.files.map((file) => [file.path, file]));\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n for (const change of view.changes) {\n files.delete(change.path);\n contents.delete(change.path);\n if ('removed' in change) continue;\n if ('content' in change) {\n files.set(change.path, {\n path: change.path,\n revision: change.revision,\n version: change.version,\n });\n contents.set(change.path, change.content);\n continue;\n }\n const { revision } = change.reference;\n files.set(change.path, { path: change.path, revision, version: revision });\n }\n return {\n ...scope,\n position: view.position,\n logEpoch: view.logEpoch,\n files: [...files.values()],\n contents: [...contents].map(([path, content]) => ({ path, content })),\n };\n}\n\nexport function matchesScope(scope: HouseScope, tracked: TrackedAuthority): boolean {\n return scope.anchor === tracked.authority;\n}\n\nexport function withinRoot(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport function selects(tracked: TrackedAuthority, path: string): boolean {\n if (tracked.modelRoots.some((root) => withinRoot(path, root))) return false;\n return selectionRoots(tracked).some((root) => withinRoot(path, root));\n}\n\nexport function bootstrapFrom(envelope: HouseEnvelope, tracked: TrackedAuthority): BootstrapResult {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n return bootstrapOf(scope, tracked);\n}\n\nexport function bootstrapOf(scope: HouseScope, tracked: TrackedAuthority): BootstrapPage {\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n for (const file of scope.files) {\n if (!selects(tracked, file.path)) continue;\n if (file.revision !== undefined) revisions[file.path] = file.revision;\n const content = contents.get(file.path);\n if (content === undefined) binaryTargets.push(file.path);\n else documents[file.path] = content;\n }\n return {\n kind: 'bootstrap',\n roomVersion: roomVersion(scope),\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n };\n}\n\nexport type HouseDefinitions = {\n definitions: Readonly<Record<string, string>>;\n versions: readonly string[];\n};\n\nexport function definitionsFrom(\n envelope: HouseEnvelope,\n tracked: TrackedAuthority,\n modelRoot: string,\n): HouseDefinitions | null {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return null;\n return definitionsOf(scope, modelRoot);\n}\n\nexport function definitionsOf(scope: HouseScope, modelRoot: string): HouseDefinitions | null {\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const definitions: Record<string, string> = {};\n const versions: string[] = [];\n for (const file of scope.files) {\n if (!withinRoot(file.path, modelRoot)) continue;\n const content = contents.get(file.path);\n const address = file.path;\n if (content === undefined) return null;\n definitions[address] = content;\n versions.push(`${file.path} ${file.version}`);\n }\n return { definitions, versions: versions.sort() };\n}\n\nexport function refreshFrom(\n enumeration: HouseEnumeration,\n tracked: TrackedAuthority,\n fromRoomVersion: string,\n): RefreshResult {\n const view = enumeration.authorities.find((entry) => entry.authority === tracked.authority);\n if (view === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n if (roomVersion(view) === fromRoomVersion) return { kind: 'still-current' };\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n const removals: string[] = [];\n for (const change of view.changes) {\n if (!selects(tracked, change.path)) continue;\n if ('removed' in change) {\n removals.push(change.path);\n continue;\n }\n if ('content' in change) {\n documents[change.path] = change.content;\n if (change.revision !== undefined) revisions[change.path] = change.revision;\n continue;\n }\n binaryTargets.push(change.path);\n revisions[change.path] = change.reference.revision;\n }\n return {\n kind: 'net-advancement',\n roomVersion: roomVersion(view),\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n removals: removals.sort(),\n };\n}\n"],"names":["PROVIDER_SELECTION_ROOTS","readPosition","roomVersion","authorityRoot","handle","undefined","ROOM_README","selectionRoots","tracked","collectionRoot","contentPrefixes","root","filter","entry","map","modelPrefix","modelRoot","parseGrant","body","transfer","url","method","operation","parseFile","value","mode","file","path","sha256","revision","version","parseScope","held","manifest","Array","isArray","contents","scope","at","anchor","length","room_handle","files","push","content","parseEnvelope","scopes","parseSiteBootstrap","parseChange","removed","reference","parseEnumeration","authorities","authority","changes","change","mapped","advancedScope","view","Map","delete","set","position","logEpoch","values","matchesScope","withinRoot","startsWith","selects","modelRoots","some","bootstrapFrom","envelope","find","kind","locator","bootstrapOf","documents","revisions","binaryTargets","get","sort","definitionsFrom","definitionsOf","definitions","versions","address","refreshFrom","enumeration","fromRoomVersion","removals"],"mappings":"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"}
package/dist/refusal.d.ts CHANGED
@@ -1,8 +1,11 @@
1
- import type { AdapterFailure, ProviderRefusal, ScopedRefusal } from '@agentshouse/mdruntime';
1
+ import type { AdapterFailure, DiscoverResult, ProviderRefusal, ScopedRefusal } from '@agentshouse/mdruntime';
2
2
  export type DoorRefusal = ProviderRefusal;
3
3
  export declare function doorRefusal(body: unknown): DoorRefusal | null;
4
4
  export declare function scopedRefusal(locator: string, scope: ScopedRefusal['scope'], refusal: DoorRefusal): ScopedRefusal;
5
5
  export declare function classifyDoor(status: number, body: unknown, locator: string): AdapterFailure | {
6
6
  kind: 'beyond-horizon';
7
7
  } | null;
8
+ export declare function discoveryFailure(classified: AdapterFailure | {
9
+ kind: 'beyond-horizon';
10
+ }): DiscoverResult;
8
11
  //# sourceMappingURL=refusal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAgB7F,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAO7D;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,aAAa,CAEf;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,CAepD"}
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;AAgBhC,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAO7D;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,aAAa,CAEf;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,CAepD;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,cAAc,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACtD,cAAc,CAMhB"}
package/dist/refusal.js CHANGED
@@ -61,5 +61,18 @@ export function classifyDoor(status, body, locator) {
61
61
  if (status === 403) return scopedRefusal(locator, 'operation', refusal);
62
62
  return scopedRefusal(locator, 'undisclosed', refusal);
63
63
  }
64
+ export function discoveryFailure(classified) {
65
+ if (classified.kind === 'revoked-authorization') return classified;
66
+ if (classified.kind === 'scoped-refusal') {
67
+ return {
68
+ kind: 'contract-unavailable',
69
+ code: classified.code,
70
+ fields: classified.fields
71
+ };
72
+ }
73
+ return {
74
+ kind: 'transport-uncertainty'
75
+ };
76
+ }
64
77
 
65
78
  //# sourceMappingURL=refusal.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/refusal.ts"],"sourcesContent":["import type { AdapterFailure, ProviderRefusal, ScopedRefusal } from '@agentshouse/mdruntime';\n\nconst RETRYABLE_CODES = new Set([\n 'auth_unavailable',\n 'replica_behind',\n 'read_replica_unavailable',\n 'read_replica_lagging',\n 'read_pool_acquisition_timed_out',\n 'sync_unavailable',\n 'sync_failed',\n 'rate_limited',\n 'operation_contended',\n 'service_mode_write_halted',\n 'transaction_budget_exceeded',\n]);\n\nexport type DoorRefusal = ProviderRefusal;\n\nexport function doorRefusal(body: unknown): DoorRefusal | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('error' in body) || typeof body.error !== 'object' || body.error === null) return null;\n const error = body.error as Record<string, unknown>;\n if (typeof error.code !== 'string') return null;\n const { code, ...fields } = error;\n return { code, fields };\n}\n\nexport function scopedRefusal(\n locator: string,\n scope: ScopedRefusal['scope'],\n refusal: DoorRefusal,\n): ScopedRefusal {\n return { kind: 'scoped-refusal', locator, scope, code: refusal.code, fields: refusal.fields };\n}\n\nexport function classifyDoor(\n status: number,\n body: unknown,\n locator: string,\n): AdapterFailure | { kind: 'beyond-horizon' } | null {\n if (status === 0) return { kind: 'transport-uncertainty' };\n const refusal = doorRefusal(body);\n if (status === 401) return { kind: 'revoked-authorization' };\n if (refusal !== null && RETRYABLE_CODES.has(refusal.code))\n return { kind: 'transport-uncertainty' };\n if (refusal !== null && refusal.code === 'position_expired') return { kind: 'beyond-horizon' };\n if (status === 404 || refusal?.code === 'room_not_found') {\n return { kind: 'room-not-readable', locator };\n }\n if (status >= 500) return { kind: 'transport-uncertainty' };\n if (status < 400) return null;\n if (refusal === null) return { kind: 'transport-uncertainty' };\n if (status === 403) return scopedRefusal(locator, 'operation', refusal);\n return scopedRefusal(locator, 'undisclosed', refusal);\n}\n"],"names":["RETRYABLE_CODES","Set","doorRefusal","body","error","code","fields","scopedRefusal","locator","scope","refusal","kind","classifyDoor","status","has"],"mappings":"AAEA,MAAMA,kBAAkB,IAAIC,IAAI;IAC9B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAID,OAAO,SAASC,YAAYC,IAAa;IACvC,IAAI,OAAOA,SAAS,YAAYA,SAAS,MAAM,OAAO;IACtD,IAAI,CAAE,CAAA,WAAWA,IAAG,KAAM,OAAOA,KAAKC,KAAK,KAAK,YAAYD,KAAKC,KAAK,KAAK,MAAM,OAAO;IACxF,MAAMA,QAAQD,KAAKC,KAAK;IACxB,IAAI,OAAOA,MAAMC,IAAI,KAAK,UAAU,OAAO;IAC3C,MAAM,EAAEA,IAAI,EAAE,GAAGC,QAAQ,GAAGF;IAC5B,OAAO;QAAEC;QAAMC;IAAO;AACxB;AAEA,OAAO,SAASC,cACdC,OAAe,EACfC,KAA6B,EAC7BC,OAAoB;IAEpB,OAAO;QAAEC,MAAM;QAAkBH;QAASC;QAAOJ,MAAMK,QAAQL,IAAI;QAAEC,QAAQI,QAAQJ,MAAM;IAAC;AAC9F;AAEA,OAAO,SAASM,aACdC,MAAc,EACdV,IAAa,EACbK,OAAe;IAEf,IAAIK,WAAW,GAAG,OAAO;QAAEF,MAAM;IAAwB;IACzD,MAAMD,UAAUR,YAAYC;IAC5B,IAAIU,WAAW,KAAK,OAAO;QAAEF,MAAM;IAAwB;IAC3D,IAAID,YAAY,QAAQV,gBAAgBc,GAAG,CAACJ,QAAQL,IAAI,GACtD,OAAO;QAAEM,MAAM;IAAwB;IACzC,IAAID,YAAY,QAAQA,QAAQL,IAAI,KAAK,oBAAoB,OAAO;QAAEM,MAAM;IAAiB;IAC7F,IAAIE,WAAW,OAAOH,SAASL,SAAS,kBAAkB;QACxD,OAAO;YAAEM,MAAM;YAAqBH;QAAQ;IAC9C;IACA,IAAIK,UAAU,KAAK,OAAO;QAAEF,MAAM;IAAwB;IAC1D,IAAIE,SAAS,KAAK,OAAO;IACzB,IAAIH,YAAY,MAAM,OAAO;QAAEC,MAAM;IAAwB;IAC7D,IAAIE,WAAW,KAAK,OAAON,cAAcC,SAAS,aAAaE;IAC/D,OAAOH,cAAcC,SAAS,eAAeE;AAC/C"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/refusal.ts"],"sourcesContent":["import type {\n AdapterFailure,\n DiscoverResult,\n ProviderRefusal,\n ScopedRefusal,\n} from '@agentshouse/mdruntime';\n\nconst RETRYABLE_CODES = new Set([\n 'auth_unavailable',\n 'replica_behind',\n 'read_replica_unavailable',\n 'read_replica_lagging',\n 'read_pool_acquisition_timed_out',\n 'sync_unavailable',\n 'sync_failed',\n 'rate_limited',\n 'operation_contended',\n 'service_mode_write_halted',\n 'transaction_budget_exceeded',\n]);\n\nexport type DoorRefusal = ProviderRefusal;\n\nexport function doorRefusal(body: unknown): DoorRefusal | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('error' in body) || typeof body.error !== 'object' || body.error === null) return null;\n const error = body.error as Record<string, unknown>;\n if (typeof error.code !== 'string') return null;\n const { code, ...fields } = error;\n return { code, fields };\n}\n\nexport function scopedRefusal(\n locator: string,\n scope: ScopedRefusal['scope'],\n refusal: DoorRefusal,\n): ScopedRefusal {\n return { kind: 'scoped-refusal', locator, scope, code: refusal.code, fields: refusal.fields };\n}\n\nexport function classifyDoor(\n status: number,\n body: unknown,\n locator: string,\n): AdapterFailure | { kind: 'beyond-horizon' } | null {\n if (status === 0) return { kind: 'transport-uncertainty' };\n const refusal = doorRefusal(body);\n if (status === 401) return { kind: 'revoked-authorization' };\n if (refusal !== null && RETRYABLE_CODES.has(refusal.code))\n return { kind: 'transport-uncertainty' };\n if (refusal !== null && refusal.code === 'position_expired') return { kind: 'beyond-horizon' };\n if (status === 404 || refusal?.code === 'room_not_found') {\n return { kind: 'room-not-readable', locator };\n }\n if (status >= 500) return { kind: 'transport-uncertainty' };\n if (status < 400) return null;\n if (refusal === null) return { kind: 'transport-uncertainty' };\n if (status === 403) return scopedRefusal(locator, 'operation', refusal);\n return scopedRefusal(locator, 'undisclosed', refusal);\n}\n\nexport function discoveryFailure(\n classified: AdapterFailure | { kind: 'beyond-horizon' },\n): DiscoverResult {\n if (classified.kind === 'revoked-authorization') return classified;\n if (classified.kind === 'scoped-refusal') {\n return { kind: 'contract-unavailable', code: classified.code, fields: classified.fields };\n }\n return { kind: 'transport-uncertainty' };\n}\n"],"names":["RETRYABLE_CODES","Set","doorRefusal","body","error","code","fields","scopedRefusal","locator","scope","refusal","kind","classifyDoor","status","has","discoveryFailure","classified"],"mappings":"AAOA,MAAMA,kBAAkB,IAAIC,IAAI;IAC9B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAID,OAAO,SAASC,YAAYC,IAAa;IACvC,IAAI,OAAOA,SAAS,YAAYA,SAAS,MAAM,OAAO;IACtD,IAAI,CAAE,CAAA,WAAWA,IAAG,KAAM,OAAOA,KAAKC,KAAK,KAAK,YAAYD,KAAKC,KAAK,KAAK,MAAM,OAAO;IACxF,MAAMA,QAAQD,KAAKC,KAAK;IACxB,IAAI,OAAOA,MAAMC,IAAI,KAAK,UAAU,OAAO;IAC3C,MAAM,EAAEA,IAAI,EAAE,GAAGC,QAAQ,GAAGF;IAC5B,OAAO;QAAEC;QAAMC;IAAO;AACxB;AAEA,OAAO,SAASC,cACdC,OAAe,EACfC,KAA6B,EAC7BC,OAAoB;IAEpB,OAAO;QAAEC,MAAM;QAAkBH;QAASC;QAAOJ,MAAMK,QAAQL,IAAI;QAAEC,QAAQI,QAAQJ,MAAM;IAAC;AAC9F;AAEA,OAAO,SAASM,aACdC,MAAc,EACdV,IAAa,EACbK,OAAe;IAEf,IAAIK,WAAW,GAAG,OAAO;QAAEF,MAAM;IAAwB;IACzD,MAAMD,UAAUR,YAAYC;IAC5B,IAAIU,WAAW,KAAK,OAAO;QAAEF,MAAM;IAAwB;IAC3D,IAAID,YAAY,QAAQV,gBAAgBc,GAAG,CAACJ,QAAQL,IAAI,GACtD,OAAO;QAAEM,MAAM;IAAwB;IACzC,IAAID,YAAY,QAAQA,QAAQL,IAAI,KAAK,oBAAoB,OAAO;QAAEM,MAAM;IAAiB;IAC7F,IAAIE,WAAW,OAAOH,SAASL,SAAS,kBAAkB;QACxD,OAAO;YAAEM,MAAM;YAAqBH;QAAQ;IAC9C;IACA,IAAIK,UAAU,KAAK,OAAO;QAAEF,MAAM;IAAwB;IAC1D,IAAIE,SAAS,KAAK,OAAO;IACzB,IAAIH,YAAY,MAAM,OAAO;QAAEC,MAAM;IAAwB;IAC7D,IAAIE,WAAW,KAAK,OAAON,cAAcC,SAAS,aAAaE;IAC/D,OAAOH,cAAcC,SAAS,eAAeE;AAC/C;AAEA,OAAO,SAASK,iBACdC,UAAuD;IAEvD,IAAIA,WAAWL,IAAI,KAAK,yBAAyB,OAAOK;IACxD,IAAIA,WAAWL,IAAI,KAAK,kBAAkB;QACxC,OAAO;YAAEA,MAAM;YAAwBN,MAAMW,WAAWX,IAAI;YAAEC,QAAQU,WAAWV,MAAM;QAAC;IAC1F;IACA,OAAO;QAAEK,MAAM;IAAwB;AACzC"}
package/dist/site.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { Adapter } from '@agentshouse/mdruntime';
2
+ import { type HouseSiteTransport } from './transport.js';
3
+ export declare function createSiteAdapter(transport: HouseSiteTransport): Adapter;
4
+ //# sourceMappingURL=site.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAOR,MAAM,wBAAwB,CAAC;AAgChC,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAgCxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CA0IxE"}