@agentshouse/mdruntime-adapter 0.1.0-alpha.1 → 0.1.0-alpha.10

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 (58) hide show
  1. package/AGENTS.md +82 -0
  2. package/dist/actions.d.ts +16 -0
  3. package/dist/actions.d.ts.map +1 -0
  4. package/dist/actions.js +454 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/adapter.d.ts +10 -0
  7. package/dist/adapter.d.ts.map +1 -0
  8. package/dist/adapter.js +285 -0
  9. package/dist/adapter.js.map +1 -0
  10. package/dist/digest.d.ts +3 -0
  11. package/dist/digest.d.ts.map +1 -0
  12. package/dist/digest.js +11 -0
  13. package/dist/digest.js.map +1 -0
  14. package/dist/discovery.d.ts +87 -0
  15. package/dist/discovery.d.ts.map +1 -0
  16. package/dist/discovery.js +347 -0
  17. package/dist/discovery.js.map +1 -0
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +2 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/map.d.ts +3 -0
  23. package/dist/map.d.ts.map +1 -0
  24. package/dist/map.js +15 -0
  25. package/dist/map.js.map +1 -0
  26. package/dist/model.d.ts +19 -0
  27. package/dist/model.d.ts.map +1 -0
  28. package/dist/model.js +64 -0
  29. package/dist/model.js.map +1 -0
  30. package/dist/read.d.ts +73 -0
  31. package/dist/read.d.ts.map +1 -0
  32. package/dist/read.js +326 -0
  33. package/dist/read.js.map +1 -0
  34. package/dist/refusal.d.ts +11 -0
  35. package/dist/refusal.d.ts.map +1 -0
  36. package/dist/refusal.js +78 -0
  37. package/dist/refusal.js.map +1 -0
  38. package/dist/site.d.ts +4 -0
  39. package/dist/site.d.ts.map +1 -0
  40. package/dist/site.js +200 -0
  41. package/dist/site.js.map +1 -0
  42. package/dist/stream.d.ts +12 -0
  43. package/dist/stream.d.ts.map +1 -0
  44. package/dist/stream.js +298 -0
  45. package/dist/stream.js.map +1 -0
  46. package/dist/transport.d.ts +88 -0
  47. package/dist/transport.d.ts.map +1 -0
  48. package/dist/transport.js +12 -0
  49. package/dist/transport.js.map +1 -0
  50. package/dist/version.d.ts +14 -0
  51. package/dist/version.d.ts.map +1 -0
  52. package/dist/version.js +29 -0
  53. package/dist/version.js.map +1 -0
  54. package/dist/write.d.ts +47 -0
  55. package/dist/write.d.ts.map +1 -0
  56. package/dist/write.js +389 -0
  57. package/dist/write.js.map +1 -0
  58. package/package.json +7 -2
@@ -0,0 +1,285 @@
1
+ import { DISCOVER_PREFIXES, PROVIDER_SELECTION_MODEL_ROOT, capabilities, discoveredRoom, locatorOf, mapDiscovery, parseDiscovery, providerSelection, trackedFrom } from './discovery.js';
2
+ import { MODEL_ABSENT, failedModel, heldModel, modelKey, modelShelf } from './model.js';
3
+ import { createSiteAdapter } from './site.js';
4
+ import { authorityRoot, bootstrapFrom, contentPrefixes, definitionsFrom, modelPrefix, parseEnumeration, parseEnvelope, parseGrant, refreshFrom } from './read.js';
5
+ import { houseAction } from './actions.js';
6
+ import { classifyDoor, discoveryFailure } from './refusal.js';
7
+ import { houseNotifications } from './stream.js';
8
+ import { DOOR_BATCH, DOOR_BATCH_UPLOAD, DOOR_BOOTSTRAP, DOOR_DISCOVER, DOOR_ENUMERATE, DOOR_REVISIONS, PRIVATE_AUTHORITY } from './transport.js';
9
+ import { batchPaths, deltaBody, deltaBytes, deltaDigest, historyOutcome, houseChanges, mutationOutcome, operationHead, rejectedMapping, revisionBody, uploadable } from './write.js';
10
+ import { logPosition, presented } from './version.js';
11
+ const UNCERTAIN = {
12
+ kind: 'transport-uncertainty'
13
+ };
14
+ const RESOLVED_OUTCOMES = new Set([
15
+ 'accepted',
16
+ 'conflicted',
17
+ 'rejected',
18
+ 'expired'
19
+ ]);
20
+ function lapsedGrant(outcome) {
21
+ return outcome.kind === 'rejected' && outcome.code === 'upload_unavailable';
22
+ }
23
+ function modelFailure(classified, envelope) {
24
+ if (classified === null) {
25
+ return envelope === null ? {
26
+ kind: 'transport-uncertainty'
27
+ } : MODEL_ABSENT;
28
+ }
29
+ return failedModel(classified);
30
+ }
31
+ export function createAgentsHouseAdapter(options) {
32
+ if ('site' in options) return createSiteAdapter(options.site);
33
+ const transport = options.transport;
34
+ const notifications = houseNotifications(transport, 'credential');
35
+ const tracked = new Map();
36
+ const models = modelShelf();
37
+ const submissions = new Map();
38
+ function held(envelope, entry, modelRoot, identity, failure) {
39
+ return heldModel(envelope === null ? null : definitionsFrom(envelope, entry, modelRoot), identity, failure);
40
+ }
41
+ async function acquireModels(entries) {
42
+ const acquired = new Map();
43
+ const privateEntry = entries.find((entry)=>entry.authority === PRIVATE_AUTHORITY);
44
+ const prefixes = entries.map((entry)=>modelPrefix(entry, entry.modelRoot));
45
+ if (privateEntry !== undefined) {
46
+ prefixes.push(`${authorityRoot(undefined)}/${PROVIDER_SELECTION_MODEL_ROOT}`);
47
+ }
48
+ const answer = await transport.door(DOOR_BOOTSTRAP, {
49
+ prefixes
50
+ });
51
+ const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);
52
+ const envelope = classified === null ? parseEnvelope(await bundled(answer.body)) : null;
53
+ const failure = modelFailure(classified, envelope);
54
+ for (const entry of entries){
55
+ acquired.set(modelKey(entry.locator, 'collection'), await held(envelope, entry, entry.modelRoot, `${authorityRoot(entry.handle)}/${entry.modelRoot}`, failure));
56
+ }
57
+ if (privateEntry !== undefined) {
58
+ acquired.set(modelKey(privateEntry.locator, 'typed-selection'), await held(envelope, privateEntry, PROVIDER_SELECTION_MODEL_ROOT, `${authorityRoot(undefined)}/${PROVIDER_SELECTION_MODEL_ROOT}`, failure));
59
+ }
60
+ return acquired;
61
+ }
62
+ function roomOf(authority, acquired) {
63
+ const locator = locatorOf(authority);
64
+ const key = modelKey(locator, 'collection');
65
+ const collection = models.retain(key, acquired.get(key));
66
+ if (authority.kind !== 'private') {
67
+ return discoveredRoom(authority, collection?.identity ?? null, undefined);
68
+ }
69
+ const selection = models.retain(modelKey(locator, 'typed-selection'), acquired.get(modelKey(locator, 'typed-selection')));
70
+ return discoveredRoom(authority, collection?.identity ?? null, providerSelection(selection?.identity ?? null));
71
+ }
72
+ function authorityFor(locator) {
73
+ return tracked.get(locator);
74
+ }
75
+ async function bundled(body) {
76
+ const grant = parseGrant(body);
77
+ if (grant === null) return body;
78
+ if (grant.method !== 'GET') return null;
79
+ const answer = await transport.transfer({
80
+ act: 'working_copy_bundle',
81
+ method: 'GET',
82
+ url: grant.url
83
+ });
84
+ return answer.status === 200 ? answer.body : null;
85
+ }
86
+ async function uploaded(head, changes, delta, bytes, entry) {
87
+ const paths = batchPaths(changes);
88
+ const sha256 = await deltaDigest(delta);
89
+ const retained = submissions.get(head.operation_id);
90
+ if (retained !== undefined && retained.sha256 === sha256 && retained.body.app_ref === head.app_ref && retained.body.release === head.release) return {
91
+ body: retained.body
92
+ };
93
+ const minted = await transport.door(DOOR_BATCH_UPLOAD, {
94
+ ...head,
95
+ paths,
96
+ bytes,
97
+ sha256
98
+ });
99
+ if (minted.status !== 200) {
100
+ return {
101
+ outcome: mutationOutcome(minted.status, minted.body, entry.locator, entry.handle)
102
+ };
103
+ }
104
+ const grant = parseGrant(minted.body);
105
+ if (grant === null || grant.method !== 'POST') return {
106
+ outcome: UNCERTAIN
107
+ };
108
+ const delivered = await transport.transfer({
109
+ act: 'authored_batch_upload',
110
+ method: 'POST',
111
+ url: grant.url,
112
+ body: `${grant.operation}\n${delta}`
113
+ });
114
+ if (delivered.status !== 200) return {
115
+ outcome: UNCERTAIN
116
+ };
117
+ const holding = parseGrant(delivered.body);
118
+ if (holding === null) return {
119
+ outcome: UNCERTAIN
120
+ };
121
+ const body = {
122
+ ...head,
123
+ paths,
124
+ upload: {
125
+ url: holding.url,
126
+ operation: holding.operation,
127
+ bytes,
128
+ sha256
129
+ }
130
+ };
131
+ submissions.set(head.operation_id, {
132
+ sha256,
133
+ body
134
+ });
135
+ return {
136
+ body
137
+ };
138
+ }
139
+ async function submit(head, changes, delta, bytes, entry) {
140
+ const prepared = uploadable(bytes) ? await uploaded(head, changes, delta, bytes, entry) : {
141
+ body: {
142
+ ...head,
143
+ changes
144
+ }
145
+ };
146
+ if ('outcome' in prepared) return prepared.outcome;
147
+ const answer = await transport.door(DOOR_BATCH, prepared.body);
148
+ return mutationOutcome(answer.status, answer.body, entry.locator, entry.handle);
149
+ }
150
+ return {
151
+ async authorize () {
152
+ return options.authorize();
153
+ },
154
+ async model (_authorization, request) {
155
+ return models.answer(request);
156
+ },
157
+ async discover (_authorization) {
158
+ const answer = await transport.door(DOOR_DISCOVER, {
159
+ prefixes: [
160
+ ...DISCOVER_PREFIXES
161
+ ]
162
+ });
163
+ const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);
164
+ if (classified !== null) return discoveryFailure(classified);
165
+ const document = parseDiscovery(answer.body);
166
+ if (document === null) return {
167
+ kind: 'transport-uncertainty'
168
+ };
169
+ const entries = trackedFrom(document);
170
+ tracked.clear();
171
+ for (const entry of entries)tracked.set(entry.locator, entry);
172
+ notifications.track(entries);
173
+ const acquired = await acquireModels(entries);
174
+ models.keep(entries.map((entry)=>entry.locator));
175
+ return mapDiscovery(document, document.authorities.map((authority)=>roomOf(authority, acquired)), capabilities());
176
+ },
177
+ async bootstrap (_authorization, request) {
178
+ const entry = authorityFor(request.locator);
179
+ if (entry === undefined) return {
180
+ kind: 'room-not-readable',
181
+ locator: request.locator
182
+ };
183
+ if (request.pageToken !== undefined) return {
184
+ kind: 'transport-uncertainty'
185
+ };
186
+ const answer = await transport.door(DOOR_BOOTSTRAP, {
187
+ prefixes: [
188
+ ...contentPrefixes(entry)
189
+ ]
190
+ });
191
+ const classified = classifyDoor(answer.status, answer.body, entry.locator);
192
+ if (classified !== null) {
193
+ return classified.kind === 'beyond-horizon' ? {
194
+ kind: 'transport-uncertainty'
195
+ } : classified;
196
+ }
197
+ const envelope = parseEnvelope(await bundled(answer.body));
198
+ if (envelope === null) return {
199
+ kind: 'transport-uncertainty'
200
+ };
201
+ return bootstrapFrom(envelope, entry);
202
+ },
203
+ async refresh (_authorization, request) {
204
+ const entry = authorityFor(request.locator);
205
+ if (entry === undefined) return {
206
+ kind: 'room-not-readable',
207
+ locator: request.locator
208
+ };
209
+ if (request.pageToken !== undefined) return {
210
+ kind: 'transport-uncertainty'
211
+ };
212
+ const from = logPosition(request.fromRoomVersion);
213
+ if (from === null) return {
214
+ kind: 'beyond-horizon'
215
+ };
216
+ const streamed = notifications.advance(entry, from);
217
+ if (streamed !== null) return streamed;
218
+ const answer = await transport.door(DOOR_ENUMERATE, {
219
+ prefixes: [
220
+ ...contentPrefixes(entry)
221
+ ],
222
+ positions: [
223
+ presented(entry.authority, from)
224
+ ]
225
+ });
226
+ const classified = classifyDoor(answer.status, answer.body, entry.locator);
227
+ if (classified !== null) return classified;
228
+ const enumeration = parseEnumeration(answer.body, 'credential');
229
+ if (enumeration === null) return {
230
+ kind: 'transport-uncertainty'
231
+ };
232
+ return refreshFrom(enumeration, entry, request.fromRoomVersion);
233
+ },
234
+ async mutate (_authorization, request) {
235
+ const entry = authorityFor(request.locator);
236
+ if (entry === undefined) return {
237
+ kind: 'room-not-readable',
238
+ locator: request.locator
239
+ };
240
+ const mapped = houseChanges(request.changeBatch, entry.handle);
241
+ if (mapped.kind === 'unmapped') return rejectedMapping(mapped);
242
+ const head = operationHead(request.changeBatch);
243
+ const delta = deltaBody(mapped.changes);
244
+ const bytes = deltaBytes(delta);
245
+ const resent = submissions.has(head.operation_id);
246
+ let outcome = await submit(head, mapped.changes, delta, bytes, entry);
247
+ if (resent && lapsedGrant(outcome)) {
248
+ submissions.delete(head.operation_id);
249
+ outcome = await submit(head, mapped.changes, delta, bytes, entry);
250
+ }
251
+ if (RESOLVED_OUTCOMES.has(outcome.kind)) submissions.delete(head.operation_id);
252
+ return outcome;
253
+ },
254
+ async history (_authorization, request) {
255
+ const entry = authorityFor(request.locator);
256
+ if (entry === undefined) return {
257
+ kind: 'room-not-readable',
258
+ locator: request.locator
259
+ };
260
+ const answer = await transport.door(DOOR_REVISIONS, revisionBody({
261
+ path: request.path,
262
+ handle: entry.handle,
263
+ ...request.revision === undefined ? {} : {
264
+ revision: request.revision
265
+ },
266
+ ...request.pageToken === undefined ? {} : {
267
+ pageToken: request.pageToken
268
+ }
269
+ }));
270
+ return historyOutcome(answer.status, answer.body, entry.locator, {
271
+ path: request.path,
272
+ ...request.revision === undefined ? {} : {
273
+ revision: request.revision
274
+ }
275
+ });
276
+ },
277
+ async action (_authorization, request) {
278
+ return houseAction(transport, request);
279
+ },
280
+ roomVersions: notifications,
281
+ conversations: notifications.conversations
282
+ };
283
+ }
284
+
285
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/adapter.ts"],"sourcesContent":["import type {\n ActionRequest,\n ActionResult,\n Adapter,\n Authorization,\n BootstrapRequest,\n BootstrapResult,\n DiscoverResult,\n DiscoveredRoom,\n HistoryRequest,\n HistoryResult,\n ModelRequest,\n ModelResult,\n MutationRequest,\n MutationResult,\n RefreshRequest,\n RefreshResult,\n} from '@agentshouse/mdruntime';\nimport {\n DISCOVER_PREFIXES,\n PROVIDER_SELECTION_MODEL_ROOT,\n capabilities,\n discoveredRoom,\n locatorOf,\n mapDiscovery,\n parseDiscovery,\n providerSelection,\n trackedFrom,\n type HouseAuthority,\n type TrackedAuthority,\n} from './discovery.js';\nimport {\n MODEL_ABSENT,\n failedModel,\n heldModel,\n modelKey,\n modelShelf,\n type HeldModel,\n} from './model.js';\nimport { createSiteAdapter } from './site.js';\nimport {\n authorityRoot,\n bootstrapFrom,\n contentPrefixes,\n definitionsFrom,\n modelPrefix,\n parseEnumeration,\n parseEnvelope,\n parseGrant,\n refreshFrom,\n} from './read.js';\nimport { houseAction } from './actions.js';\nimport { classifyDoor, discoveryFailure } from './refusal.js';\nimport { houseNotifications } from './stream.js';\nimport {\n DOOR_BATCH,\n DOOR_BATCH_UPLOAD,\n DOOR_BOOTSTRAP,\n DOOR_DISCOVER,\n DOOR_ENUMERATE,\n DOOR_REVISIONS,\n PRIVATE_AUTHORITY,\n type HouseSiteTransport,\n type HouseTransport,\n} from './transport.js';\nimport {\n batchPaths,\n deltaBody,\n deltaBytes,\n deltaDigest,\n historyOutcome,\n houseChanges,\n mutationOutcome,\n operationHead,\n rejectedMapping,\n revisionBody,\n uploadable,\n type OperationHead,\n} from './write.js';\nimport { logPosition, presented } from './version.js';\n\nexport type AgentsHouseAdapterOptions =\n | {\n transport: HouseTransport;\n authorize(): Promise<Authorization>;\n }\n | { site: HouseSiteTransport };\n\nconst UNCERTAIN: MutationResult = { kind: 'transport-uncertainty' };\n\nconst RESOLVED_OUTCOMES: ReadonlySet<MutationResult['kind']> = new Set([\n 'accepted',\n 'conflicted',\n 'rejected',\n 'expired',\n]);\n\ntype Submission = { body: Record<string, unknown> } | { outcome: MutationResult };\n\nfunction lapsedGrant(outcome: MutationResult): boolean {\n return outcome.kind === 'rejected' && outcome.code === 'upload_unavailable';\n}\n\nfunction modelFailure(\n classified: ReturnType<typeof classifyDoor>,\n envelope: ReturnType<typeof parseEnvelope>,\n): ModelResult {\n if (classified === null) {\n return envelope === null ? { kind: 'transport-uncertainty' } : MODEL_ABSENT;\n }\n return failedModel(classified);\n}\n\nexport function createAgentsHouseAdapter(options: AgentsHouseAdapterOptions): Adapter {\n if ('site' in options) return createSiteAdapter(options.site);\n const transport = options.transport;\n const notifications = houseNotifications(transport, 'credential');\n const tracked = new Map<string, TrackedAuthority>();\n const models = modelShelf();\n const submissions = new Map<string, { sha256: string; body: Record<string, unknown> }>();\n\n function held(\n envelope: ReturnType<typeof parseEnvelope>,\n entry: TrackedAuthority,\n modelRoot: string,\n identity: string,\n failure: ModelResult,\n ): Promise<HeldModel> {\n return heldModel(\n envelope === null ? null : definitionsFrom(envelope, entry, modelRoot),\n identity,\n failure,\n );\n }\n\n async function acquireModels(\n entries: readonly TrackedAuthority[],\n ): Promise<Map<string, HeldModel>> {\n const acquired = new Map<string, HeldModel>();\n const privateEntry = entries.find((entry) => entry.authority === PRIVATE_AUTHORITY);\n const prefixes = entries.map((entry) => modelPrefix(entry, entry.modelRoot));\n if (privateEntry !== undefined) {\n prefixes.push(`${authorityRoot(undefined)}/${PROVIDER_SELECTION_MODEL_ROOT}`);\n }\n const answer = await transport.door(DOOR_BOOTSTRAP, { prefixes });\n const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);\n const envelope = classified === null ? parseEnvelope(await bundled(answer.body)) : null;\n const failure: ModelResult = modelFailure(classified, envelope);\n for (const entry of entries) {\n acquired.set(\n modelKey(entry.locator, 'collection'),\n await held(\n envelope,\n entry,\n entry.modelRoot,\n `${authorityRoot(entry.handle)}/${entry.modelRoot}`,\n failure,\n ),\n );\n }\n if (privateEntry !== undefined) {\n acquired.set(\n modelKey(privateEntry.locator, 'typed-selection'),\n await held(\n envelope,\n privateEntry,\n PROVIDER_SELECTION_MODEL_ROOT,\n `${authorityRoot(undefined)}/${PROVIDER_SELECTION_MODEL_ROOT}`,\n failure,\n ),\n );\n }\n return acquired;\n }\n\n function roomOf(authority: HouseAuthority, acquired: Map<string, HeldModel>): DiscoveredRoom {\n const locator = locatorOf(authority);\n const key = modelKey(locator, 'collection');\n const collection = models.retain(key, acquired.get(key));\n if (authority.kind !== 'private') {\n return discoveredRoom(authority, collection?.identity ?? null, undefined);\n }\n const selection = models.retain(\n modelKey(locator, 'typed-selection'),\n acquired.get(modelKey(locator, 'typed-selection')),\n );\n return discoveredRoom(\n authority,\n collection?.identity ?? null,\n providerSelection(selection?.identity ?? null),\n );\n }\n\n function authorityFor(locator: string): TrackedAuthority | undefined {\n return tracked.get(locator);\n }\n\n async function bundled(body: unknown): Promise<unknown> {\n const grant = parseGrant(body);\n if (grant === null) return body;\n if (grant.method !== 'GET') return null;\n const answer = await transport.transfer({\n act: 'working_copy_bundle',\n method: 'GET',\n url: grant.url,\n });\n return answer.status === 200 ? answer.body : null;\n }\n\n async function uploaded(\n head: OperationHead,\n changes: readonly Readonly<Record<string, unknown>>[],\n delta: string,\n bytes: number,\n entry: TrackedAuthority,\n ): Promise<Submission> {\n const paths = batchPaths(changes);\n const sha256 = await deltaDigest(delta);\n const retained = submissions.get(head.operation_id);\n if (\n retained !== undefined &&\n retained.sha256 === sha256 &&\n retained.body.app_ref === head.app_ref &&\n retained.body.release === head.release\n )\n return { body: retained.body };\n const minted = await transport.door(DOOR_BATCH_UPLOAD, { ...head, paths, bytes, sha256 });\n if (minted.status !== 200) {\n return { outcome: mutationOutcome(minted.status, minted.body, entry.locator, entry.handle) };\n }\n const grant = parseGrant(minted.body);\n if (grant === null || grant.method !== 'POST') return { outcome: UNCERTAIN };\n const delivered = await transport.transfer({\n act: 'authored_batch_upload',\n method: 'POST',\n url: grant.url,\n body: `${grant.operation}\\n${delta}`,\n });\n if (delivered.status !== 200) return { outcome: UNCERTAIN };\n const holding = parseGrant(delivered.body);\n if (holding === null) return { outcome: UNCERTAIN };\n const body = {\n ...head,\n paths,\n upload: { url: holding.url, operation: holding.operation, bytes, sha256 },\n };\n submissions.set(head.operation_id, { sha256, body });\n return { body };\n }\n\n async function submit(\n head: OperationHead,\n changes: readonly Readonly<Record<string, unknown>>[],\n delta: string,\n bytes: number,\n entry: TrackedAuthority,\n ): Promise<MutationResult> {\n const prepared: Submission = uploadable(bytes)\n ? await uploaded(head, changes, delta, bytes, entry)\n : { body: { ...head, changes } };\n if ('outcome' in prepared) return prepared.outcome;\n const answer = await transport.door(DOOR_BATCH, prepared.body);\n return mutationOutcome(answer.status, answer.body, entry.locator, entry.handle);\n }\n\n return {\n async authorize() {\n return options.authorize();\n },\n\n async model(_authorization: Authorization, request: ModelRequest): Promise<ModelResult> {\n return models.answer(request);\n },\n\n async discover(_authorization: Authorization): Promise<DiscoverResult> {\n const answer = await transport.door(DOOR_DISCOVER, { prefixes: [...DISCOVER_PREFIXES] });\n const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);\n if (classified !== null) return discoveryFailure(classified);\n const document = parseDiscovery(answer.body);\n if (document === null) return { kind: 'transport-uncertainty' };\n const entries = trackedFrom(document);\n tracked.clear();\n for (const entry of entries) tracked.set(entry.locator, entry);\n notifications.track(entries);\n const acquired = await acquireModels(entries);\n models.keep(entries.map((entry) => entry.locator));\n return mapDiscovery(\n document,\n document.authorities.map((authority) => roomOf(authority, acquired)),\n capabilities(),\n );\n },\n\n async bootstrap(\n _authorization: Authorization,\n request: BootstrapRequest,\n ): Promise<BootstrapResult> {\n const entry = authorityFor(request.locator);\n if (entry === undefined) return { kind: 'room-not-readable', locator: request.locator };\n if (request.pageToken !== undefined) return { kind: 'transport-uncertainty' };\n const answer = await transport.door(DOOR_BOOTSTRAP, {\n prefixes: [...contentPrefixes(entry)],\n });\n const classified = classifyDoor(answer.status, answer.body, entry.locator);\n if (classified !== null) {\n return classified.kind === 'beyond-horizon'\n ? { kind: 'transport-uncertainty' }\n : classified;\n }\n const envelope = parseEnvelope(await bundled(answer.body));\n if (envelope === null) return { kind: 'transport-uncertainty' };\n return bootstrapFrom(envelope, entry);\n },\n\n async refresh(_authorization: Authorization, request: RefreshRequest): Promise<RefreshResult> {\n const entry = authorityFor(request.locator);\n if (entry === undefined) return { kind: 'room-not-readable', locator: request.locator };\n if (request.pageToken !== undefined) return { kind: 'transport-uncertainty' };\n const from = logPosition(request.fromRoomVersion);\n if (from === null) return { kind: 'beyond-horizon' };\n const streamed = notifications.advance(entry, from);\n if (streamed !== null) return streamed;\n const answer = await transport.door(DOOR_ENUMERATE, {\n prefixes: [...contentPrefixes(entry)],\n positions: [presented(entry.authority, from)],\n });\n const classified = classifyDoor(answer.status, answer.body, entry.locator);\n if (classified !== null) return classified;\n const enumeration = parseEnumeration(answer.body, 'credential');\n if (enumeration === null) return { kind: 'transport-uncertainty' };\n return refreshFrom(enumeration, entry, request.fromRoomVersion);\n },\n\n async mutate(_authorization: Authorization, request: MutationRequest): Promise<MutationResult> {\n const entry = authorityFor(request.locator);\n if (entry === undefined) return { kind: 'room-not-readable', locator: request.locator };\n const mapped = houseChanges(request.changeBatch, entry.handle);\n if (mapped.kind === 'unmapped') return rejectedMapping(mapped);\n const head = operationHead(request.changeBatch);\n const delta = deltaBody(mapped.changes);\n const bytes = deltaBytes(delta);\n const resent = submissions.has(head.operation_id);\n let outcome = await submit(head, mapped.changes, delta, bytes, entry);\n if (resent && lapsedGrant(outcome)) {\n submissions.delete(head.operation_id);\n outcome = await submit(head, mapped.changes, delta, bytes, entry);\n }\n if (RESOLVED_OUTCOMES.has(outcome.kind)) submissions.delete(head.operation_id);\n return outcome;\n },\n\n async history(_authorization: Authorization, request: HistoryRequest): Promise<HistoryResult> {\n const entry = authorityFor(request.locator);\n if (entry === undefined) return { kind: 'room-not-readable', locator: request.locator };\n const answer = await transport.door(\n DOOR_REVISIONS,\n revisionBody({\n path: request.path,\n handle: entry.handle,\n ...(request.revision === undefined ? {} : { revision: request.revision }),\n ...(request.pageToken === undefined ? {} : { pageToken: request.pageToken }),\n }),\n );\n return historyOutcome(answer.status, answer.body, entry.locator, {\n path: request.path,\n ...(request.revision === undefined ? {} : { revision: request.revision }),\n });\n },\n\n async action(_authorization: Authorization, request: ActionRequest): Promise<ActionResult> {\n return houseAction(transport, request);\n },\n\n roomVersions: notifications,\n conversations: notifications.conversations,\n };\n}\n"],"names":["DISCOVER_PREFIXES","PROVIDER_SELECTION_MODEL_ROOT","capabilities","discoveredRoom","locatorOf","mapDiscovery","parseDiscovery","providerSelection","trackedFrom","MODEL_ABSENT","failedModel","heldModel","modelKey","modelShelf","createSiteAdapter","authorityRoot","bootstrapFrom","contentPrefixes","definitionsFrom","modelPrefix","parseEnumeration","parseEnvelope","parseGrant","refreshFrom","houseAction","classifyDoor","discoveryFailure","houseNotifications","DOOR_BATCH","DOOR_BATCH_UPLOAD","DOOR_BOOTSTRAP","DOOR_DISCOVER","DOOR_ENUMERATE","DOOR_REVISIONS","PRIVATE_AUTHORITY","batchPaths","deltaBody","deltaBytes","deltaDigest","historyOutcome","houseChanges","mutationOutcome","operationHead","rejectedMapping","revisionBody","uploadable","logPosition","presented","UNCERTAIN","kind","RESOLVED_OUTCOMES","Set","lapsedGrant","outcome","code","modelFailure","classified","envelope","createAgentsHouseAdapter","options","site","transport","notifications","tracked","Map","models","submissions","held","entry","modelRoot","identity","failure","acquireModels","entries","acquired","privateEntry","find","authority","prefixes","map","undefined","push","answer","door","status","body","bundled","set","locator","handle","roomOf","key","collection","retain","get","selection","authorityFor","grant","method","transfer","act","url","uploaded","head","changes","delta","bytes","paths","sha256","retained","operation_id","app_ref","release","minted","delivered","operation","holding","upload","submit","prepared","authorize","model","_authorization","request","discover","document","clear","track","keep","authorities","bootstrap","pageToken","refresh","from","fromRoomVersion","streamed","advance","positions","enumeration","mutate","mapped","changeBatch","resent","has","delete","history","path","revision","action","roomVersions","conversations"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function textBytes(value: string): number;
2
+ export declare function sha256Hex(value: string): Promise<string>;
3
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG9D"}
package/dist/digest.js ADDED
@@ -0,0 +1,11 @@
1
+ export function textBytes(value) {
2
+ return new TextEncoder().encode(value).length;
3
+ }
4
+ export async function sha256Hex(value) {
5
+ const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));
6
+ return [
7
+ ...new Uint8Array(digest)
8
+ ].map((byte)=>byte.toString(16).padStart(2, '0')).join('');
9
+ }
10
+
11
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/digest.ts"],"sourcesContent":["export function textBytes(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nexport async function sha256Hex(value: string): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n"],"names":["textBytes","value","TextEncoder","encode","length","sha256Hex","digest","crypto","subtle","Uint8Array","map","byte","toString","padStart","join"],"mappings":"AAAA,OAAO,SAASA,UAAUC,KAAa;IACrC,OAAO,IAAIC,cAAcC,MAAM,CAACF,OAAOG,MAAM;AAC/C;AAEA,OAAO,eAAeC,UAAUJ,KAAa;IAC3C,MAAMK,SAAS,MAAMC,OAAOC,MAAM,CAACF,MAAM,CAAC,WAAW,IAAIJ,cAAcC,MAAM,CAACF;IAC9E,OAAO;WAAI,IAAIQ,WAAWH;KAAQ,CAACI,GAAG,CAAC,CAACC,OAASA,KAAKC,QAAQ,CAAC,IAAIC,QAAQ,CAAC,GAAG,MAAMC,IAAI,CAAC;AAC5F"}
@@ -0,0 +1,87 @@
1
+ import type { Capability, DiscoveredRoom, Discovery, ProviderLimit, Retention, TypedSelection } from '@agentshouse/mdruntime';
2
+ import { type LogPosition } from './version.js';
3
+ export declare const ROOM_CONTRACT_VERSION = 1;
4
+ export declare const MD_MODEL_IDENTITY = "@agentshouse/mdmodel";
5
+ export declare const ROOM_VERSION_NOTIFICATIONS = "room-version-notifications";
6
+ export declare const PROVIDER_ACTIONS = "provider-actions";
7
+ export declare const MOVE_REFERENCE_REWRITES = "move-reference-rewrites";
8
+ export declare const DISCOVER_PREFIXES: readonly string[];
9
+ export declare const PROVIDER_SELECTION_ROOTS: readonly string[];
10
+ export declare const PROVIDER_SELECTION_MODEL_ROOT = "house/settings/model";
11
+ export type HouseBounds = {
12
+ max_authored_file_bytes: number;
13
+ max_batch_operations: number;
14
+ max_path_length: number;
15
+ max_path_depth: number;
16
+ max_mount_files: number;
17
+ max_mount_bytes: number;
18
+ change_retention_seconds: number;
19
+ operation_retention_seconds: number;
20
+ };
21
+ export type HouseOperations = {
22
+ read: readonly string[];
23
+ sync: readonly string[];
24
+ write: readonly string[];
25
+ delete: readonly string[];
26
+ };
27
+ export type HouseAuthority = LogPosition & {
28
+ kind: 'room' | 'private';
29
+ roomRef: string;
30
+ roomHandle: string | null;
31
+ name: string;
32
+ collectionRoot: string;
33
+ modelRoot: string;
34
+ managedReplication: 'admitted' | 'unavailable';
35
+ protectedPaths: readonly string[];
36
+ operations: HouseOperations;
37
+ };
38
+ export type HouseDiscoveryDocument = {
39
+ bounds: HouseBounds;
40
+ mdModelVersion: string;
41
+ authorities: readonly HouseAuthority[];
42
+ };
43
+ export type TrackedAuthority = LogPosition & {
44
+ locator: string;
45
+ authority: string;
46
+ handle: string | undefined;
47
+ collectionRoot: string;
48
+ modelRoot: string;
49
+ modelRoots: readonly string[];
50
+ };
51
+ export type HouseSiteEntry = {
52
+ roomRef: string;
53
+ segment: string;
54
+ };
55
+ export type HouseSiteSlot = {
56
+ slot: string;
57
+ entries: readonly HouseSiteEntry[];
58
+ };
59
+ export type HouseSiteAuthority = LogPosition & {
60
+ roomRef: string;
61
+ roomHandle: string;
62
+ collectionRoot: string;
63
+ modelRoot: string;
64
+ };
65
+ export type HouseSiteDiscovery = {
66
+ bounds: HouseBounds;
67
+ mdModelVersion: string;
68
+ slots: readonly HouseSiteSlot[];
69
+ authorities: readonly HouseSiteAuthority[];
70
+ };
71
+ export type SiteTracked = TrackedAuthority & {
72
+ handle: string;
73
+ };
74
+ export declare function parseDiscovery(body: unknown): HouseDiscoveryDocument | null;
75
+ export declare function parseSiteDiscovery(body: unknown): HouseSiteDiscovery | null;
76
+ export declare function siteTracked(document: HouseSiteDiscovery): SiteTracked[];
77
+ export declare function siteSlots(document: HouseSiteDiscovery): Discovery['slots'];
78
+ export declare function locatorOf(authority: HouseAuthority): string;
79
+ export declare function trackedFrom(document: HouseDiscoveryDocument): TrackedAuthority[];
80
+ export declare function providerLimits(bounds: HouseBounds): readonly ProviderLimit[];
81
+ export declare function declaredRetention(bounds: HouseBounds): Retention;
82
+ export declare function capabilities(): readonly Capability[];
83
+ export declare function siteCapabilities(): readonly Capability[];
84
+ export declare function providerSelection(attachedModel: TypedSelection['attachedModel']): TypedSelection;
85
+ export declare function discoveredRoom(authority: HouseAuthority, attachedModel: DiscoveredRoom['attachedModel'], typedSelection: TypedSelection | undefined): DiscoveredRoom;
86
+ export declare function mapDiscovery(document: Pick<HouseDiscoveryDocument, 'bounds' | 'mdModelVersion'>, rooms: readonly DiscoveredRoom[], declared: readonly Capability[]): Discovery;
87
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,SAAS,EACT,cAAc,EACf,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3E,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AAExD,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAEjE,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAAU,CAAC;AAE1D,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAAwB,CAAC;AAE/E,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,UAAU,GAAG,aAAa,CAAC;IAC/C,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,UAAU,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAuFhE,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAc3E;AA0CD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAoB3E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,WAAW,EAAE,CAWvE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,CAAC,OAAO,CAAC,CAK1E;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAE3D;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,sBAAsB,GAAG,gBAAgB,EAAE,CAchF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,aAAa,EAAE,CAS5E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAMhE;AAED,wBAAgB,YAAY,IAAI,SAAS,UAAU,EAAE,CAUpD;AAED,wBAAgB,gBAAgB,IAAI,SAAS,UAAU,EAAE,CAExD;AAED,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,cAAc,CAAC,eAAe,CAAC,GAAG,cAAc,CAEhG;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,cAAc,CAAC,eAAe,CAAC,EAC9C,cAAc,EAAE,cAAc,GAAG,SAAS,GACzC,cAAc,CAiBhB;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,gBAAgB,CAAC,EACnE,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,EAAE,SAAS,UAAU,EAAE,GAC9B,SAAS,CAUX"}