@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
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/actions.ts"],"sourcesContent":["import { VERSION } from '@agentshouse/mdmodel';\nimport {\n changeBatchIdentity,\n type ActionDeclaration,\n type ActionRequest,\n type ActionResult,\n type ConversationCards,\n} from '@agentshouse/mdruntime';\nimport { doorRefusal } from './refusal.js';\nimport { PRIVATE_AUTHORITY } from './transport.js';\nimport type { HouseDoorAnswer, HouseTransport } from './transport.js';\n\nexport const CONVERSATION_ACTIONS = [\n 'conversation.create',\n 'conversation.send',\n 'conversation.answer',\n 'conversation.interrupt',\n 'conversation.kill',\n 'conversation.cancel',\n 'conversation.delete',\n 'conversation.history',\n] as const;\n\nexport const HOUSE_ACTS = [\n 'conversations/interaction/read',\n 'conversations/originals/read',\n 'apps/read',\n 'apps/customize',\n 'rooms/read',\n 'rooms/access/read',\n 'rooms/access/invitations',\n 'rooms/access/entries',\n 'rooms/access/invite',\n 'rooms/access/invitation-cancel',\n 'rooms/access/revoke',\n 'rooms/access/leave',\n 'rooms/roles/define',\n 'rooms/roles/remove',\n 'rooms/roles/assign',\n 'rooms/roles/unassign',\n 'rooms/settings/processing/read',\n 'rooms/settings/processing/write',\n 'profiles/create',\n 'profiles/read',\n 'profiles/edit',\n 'profiles/duplicate',\n 'profiles/delegate',\n 'agents/create',\n 'agents/read',\n 'routines/requests',\n 'routines/access',\n 'routines/owned',\n 'routines/granted',\n 'routines/grant',\n 'routines/send',\n 'routines/cancel',\n 'routines/start',\n 'routines/schedules',\n 'routines/schedules/create',\n 'routines/schedules/enabled',\n 'account/security/read',\n 'storage/inventory',\n 'storage/usage',\n 'usage/statement',\n 'storage/blob-store',\n 'storage/blob-store/select',\n 'storage/connections',\n 'storage/archive',\n 'storage/archive/status',\n 'environments/read',\n 'environments/create',\n 'environments/start',\n 'environments/stop',\n 'environments/delete',\n 'environments/renewals/read',\n 'environments/work/read',\n 'nodes/read',\n] as const;\n\nexport const HOUSE_PROVIDER_ACTIONS = [...CONVERSATION_ACTIONS, ...HOUSE_ACTS] as const;\n\nconst DECLARED = new Set<string>(HOUSE_PROVIDER_ACTIONS);\n\nexport const HISTORY_PAGE = 100;\n\nconst OCTET_STREAM = 'application/octet-stream';\n\nconst CONVERSATION_ROUTES: Readonly<Record<string, string>> = {\n 'conversation.create': '/door/conversations/create',\n 'conversation.send': '/door/conversations/send',\n 'conversation.answer': '/door/conversations/interaction/answer',\n 'conversation.interrupt': '/door/conversations/interrupt',\n 'conversation.kill': '/door/conversations/kill',\n 'conversation.cancel': '/door/conversations/cancel',\n 'conversation.delete': '/door/conversations/delete',\n 'conversation.history': '/door/conversations/history',\n 'conversations/interaction/read': '/door/conversations/interaction/read',\n 'conversations/originals/read': '/door/conversations/originals/read',\n};\n\nexport const HOUSE_CONVERSATION_CARDS: ConversationCards = {\n locator: PRIVATE_AUTHORITY,\n type: 'conversation',\n identity: 'conversation',\n agent: 'agent',\n};\n\nexport function declaredActions(): readonly ActionDeclaration[] {\n return HOUSE_PROVIDER_ACTIONS.map((name) => ({\n name,\n inputShape: {},\n resultKind: 'house',\n }));\n}\n\nexport function houseAction(\n transport: HouseTransport,\n request: ActionRequest,\n): Promise<ActionResult> {\n if (!DECLARED.has(request.name)) {\n return Promise.resolve({\n kind: 'rejected',\n code: 'action-unimplemented',\n fields: { name: request.name, mdModel: VERSION },\n });\n }\n if (request.name === 'conversation.send') return sendAction(transport, request.input);\n if (request.name === 'conversation.history') return historyAction(transport, request.input);\n return carry(transport, request.name, request.input);\n}\n\nfunction routeOf(name: string): string {\n return CONVERSATION_ROUTES[name] ?? `/door/${name}`;\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : {};\n}\n\nfunction text(value: unknown, name: string): string | undefined {\n const held = record(value)[name];\n return typeof held === 'string' ? held : undefined;\n}\n\nfunction operationId(input: unknown): string {\n return text(input, 'operation_id') ?? changeBatchIdentity();\n}\n\nfunction malformed(): ActionResult {\n return { kind: 'rejected', code: 'invalid_request', fields: {} };\n}\n\nfunction bodyOf(name: string, input: unknown): unknown {\n if (name === 'conversation.create') {\n return { agent_id: text(input, 'agent_id'), operation_id: operationId(input) };\n }\n if (\n name === 'conversation.interrupt' ||\n name === 'conversation.kill' ||\n name === 'conversation.delete'\n ) {\n return { conversation_id: text(input, 'conversation'), operation_id: operationId(input) };\n }\n if (name === 'conversation.cancel') {\n return {\n conversation_id: text(input, 'conversation'),\n message_id: text(input, 'turn'),\n operation_id: operationId(input),\n };\n }\n if (name === 'conversation.answer') {\n const nested = record(record(input).answer);\n return {\n conversation_id: text(input, 'conversation'),\n operation_id: operationId(input),\n interaction_id: text(nested, 'interaction_id'),\n revision: nested.revision,\n response: nested.response,\n };\n }\n return input;\n}\n\nfunction withTurn(body: unknown): unknown {\n const held = record(body);\n const turn = text(held, 'message_id');\n return turn === undefined ? body : { ...held, turn };\n}\n\nexport function actionOutcome(answer: HouseDoorAnswer, name: string): ActionResult {\n if (answer.status === 401) return { kind: 'revoked-authorization' };\n const refusal = doorRefusal(answer.body);\n if (refusal !== null) {\n return { kind: 'rejected', code: refusal.code, fields: refusal.fields };\n }\n if (answer.status === 0 || answer.status >= 400) return { kind: 'transport-uncertainty' };\n if (name === 'conversation.send') return { kind: 'action', result: withTurn(answer.body) };\n return { kind: 'action', result: answer.body };\n}\n\nasync function carry(\n transport: HouseTransport,\n name: string,\n input: unknown,\n): Promise<ActionResult> {\n const answer = await transport.door(routeOf(name), bodyOf(name, input));\n return actionOutcome(answer, name);\n}\n\nfunction sendFile(entry: unknown): Record<string, unknown> | null {\n const file = record(entry);\n const name = text(file, 'name');\n const bytes = file.byteLength;\n const sha256 = text(file, 'contentHash');\n if (name === undefined || typeof bytes !== 'number' || sha256 === undefined) return null;\n const mediaType = text(file, 'mediaType');\n const width = file.width;\n const height = file.height;\n return {\n name,\n media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,\n bytes,\n sha256,\n ...(typeof width === 'number' && typeof height === 'number'\n ? { dimensions: { width, height } }\n : {}),\n };\n}\n\nfunction sendFiles(input: unknown): readonly Record<string, unknown>[] | null {\n const files = record(input).files;\n if (files === undefined) return [];\n if (!Array.isArray(files)) return null;\n const declared: Record<string, unknown>[] = [];\n for (const entry of files) {\n const file = sendFile(entry);\n if (file === null) return null;\n declared.push(file);\n }\n return declared;\n}\n\nfunction sendBody(input: unknown): Record<string, unknown> | null {\n const files = sendFiles(input);\n if (files === null) return null;\n const textValue = text(input, 'text');\n return {\n conversation_id: text(input, 'conversation'),\n operation_id: operationId(input),\n ...(textValue !== undefined && textValue.length > 0 ? { text: textValue } : {}),\n ...(files.length === 0 ? {} : { files }),\n };\n}\n\nasync function fileBytes(file: unknown): Promise<Uint8Array | null> {\n const blob = record(file).blob;\n if (blob === undefined || typeof blob !== 'object' || blob === null) return null;\n if (!('arrayBuffer' in blob) || typeof blob.arrayBuffer !== 'function') return null;\n return new Uint8Array(await (blob as Blob).arrayBuffer());\n}\n\nfunction uploadGrant(\n entry: unknown,\n): { method: 'POST'; operation: string; url: string } | 'absent' | null {\n if (!('upload' in record(entry))) return 'absent';\n const upload = record(record(entry).upload);\n if (upload.method !== 'POST') return null;\n if (typeof upload.operation !== 'string' || typeof upload.url !== 'string') return null;\n return { method: 'POST', operation: upload.operation, url: upload.url };\n}\n\nasync function uploadOriginals(\n transport: HouseTransport,\n input: unknown,\n result: unknown,\n): Promise<ActionResult | null> {\n const originals = record(result).originals;\n if (!Array.isArray(originals) || originals.length === 0) return null;\n const files = Array.isArray(record(input).files) ? (record(input).files as unknown[]) : [];\n for (const [index, entry] of originals.entries()) {\n const grant = uploadGrant(entry);\n if (grant === 'absent') continue;\n if (grant === null) return malformed();\n const bytes = index < files.length ? await fileBytes(files[index]) : null;\n if (bytes === null) {\n return { kind: 'rejected', code: 'conversation_original_descriptor_required', fields: {} };\n }\n const delivered = await transport.transfer({\n act: 'conversation_original_upload',\n method: 'POST',\n url: grant.url,\n body: bytes,\n operation: grant.operation,\n });\n if (delivered.status === 200) continue;\n return actionOutcome(delivered, 'conversation.send');\n }\n return null;\n}\n\nasync function sendAction(transport: HouseTransport, input: unknown): Promise<ActionResult> {\n const body = sendBody(input);\n if (body === null) return malformed();\n const answer = await transport.door('/door/conversations/send', body);\n const outcome = actionOutcome(answer, 'conversation.send');\n if (outcome.kind !== 'action') return outcome;\n const uploaded = await uploadOriginals(transport, input, outcome.result);\n if (uploaded !== null) return uploaded;\n return outcome;\n}\n\ntype HistoryCursor = { accepted_at: string; message_id: string };\n\nfunction historyCursor(value: string): HistoryCursor | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n return null;\n }\n const acceptedAt = text(parsed, 'accepted_at');\n const messageId = text(parsed, 'message_id');\n if (acceptedAt === undefined || messageId === undefined) return null;\n return { accepted_at: acceptedAt, message_id: messageId };\n}\n\nfunction turned(entry: unknown): { turn: string; message: unknown } | null {\n const turn = text(entry, 'message_id');\n if (turn === undefined) return null;\n return { turn, message: structuredClone(entry) };\n}\n\nfunction olderCursor(entry: { message: unknown }): string | null {\n const acceptedAt = text(entry.message, 'accepted_at');\n const messageId = text(entry.message, 'message_id');\n if (acceptedAt === undefined || messageId === undefined) return null;\n return JSON.stringify({ accepted_at: acceptedAt, message_id: messageId });\n}\n\nexport async function readConversationHistory(\n transport: HouseTransport,\n conversationId: string,\n): Promise<{ messages: unknown[] } | { outcome: ActionResult }> {\n const messages: unknown[] = [];\n let after: HistoryCursor | undefined;\n for (;;) {\n const answer = await transport.door('/door/conversations/history', {\n conversation_id: conversationId,\n ...(after === undefined ? {} : { after }),\n limit: HISTORY_PAGE,\n });\n const outcome = actionOutcome(answer, 'conversation.history');\n if (outcome.kind !== 'action') return { outcome };\n const held = record(outcome.result);\n if (!Array.isArray(held.messages)) return { outcome: { kind: 'transport-uncertainty' } };\n for (const entry of held.messages) {\n if (text(entry, 'message_id') === undefined) {\n return { outcome: { kind: 'transport-uncertainty' } };\n }\n messages.push(entry);\n }\n if (held.next === null || held.next === undefined) return { messages };\n const next = record(held.next);\n const acceptedAt = text(next, 'accepted_at');\n const messageId = text(next, 'message_id');\n if (acceptedAt === undefined || messageId === undefined) {\n return { outcome: { kind: 'transport-uncertainty' } };\n }\n after = { accepted_at: acceptedAt, message_id: messageId };\n }\n}\n\nfunction historyPage(\n conversationId: string,\n messages: readonly { turn: string; message: unknown }[],\n until: number,\n): ActionResult {\n const from = Math.max(0, until - HISTORY_PAGE);\n const page = messages.slice(from, until);\n const first = page[0];\n const cursor = from === 0 || first === undefined ? null : olderCursor(first);\n if (from > 0 && cursor === null) return { kind: 'transport-uncertainty' };\n return {\n kind: 'action',\n result: {\n conversation_id: conversationId,\n messages: page,\n ...(cursor === null ? {} : { cursor }),\n },\n };\n}\n\nasync function historyAction(transport: HouseTransport, input: unknown): Promise<ActionResult> {\n const conversationId = text(input, 'conversation');\n if (conversationId === undefined) return malformed();\n const cursorValue = text(input, 'cursor');\n let olderThan: HistoryCursor | undefined;\n if (cursorValue !== undefined) {\n const parsed = historyCursor(cursorValue);\n if (parsed === null) {\n return { kind: 'rejected', code: 'unknown-cursor', fields: { cursor: cursorValue } };\n }\n olderThan = parsed;\n }\n const held = await readConversationHistory(transport, conversationId);\n if ('outcome' in held) return held.outcome;\n const messages: { turn: string; message: unknown }[] = [];\n for (const entry of held.messages) {\n const mapped = turned(entry);\n if (mapped === null) return { kind: 'transport-uncertainty' };\n messages.push(mapped);\n }\n if (olderThan === undefined) {\n return historyPage(conversationId, messages, messages.length);\n }\n const at = messages.findIndex(\n (entry) =>\n text(entry.message, 'accepted_at') === olderThan.accepted_at &&\n text(entry.message, 'message_id') === olderThan.message_id,\n );\n if (at === -1) {\n return { kind: 'rejected', code: 'unknown-cursor', fields: { cursor: cursorValue } };\n }\n return historyPage(conversationId, messages, at);\n}\n"],"names":["VERSION","changeBatchIdentity","doorRefusal","PRIVATE_AUTHORITY","CONVERSATION_ACTIONS","HOUSE_ACTS","HOUSE_PROVIDER_ACTIONS","DECLARED","Set","HISTORY_PAGE","OCTET_STREAM","CONVERSATION_ROUTES","HOUSE_CONVERSATION_CARDS","locator","type","identity","agent","declaredActions","map","name","inputShape","resultKind","houseAction","transport","request","has","Promise","resolve","kind","code","fields","mdModel","sendAction","input","historyAction","carry","routeOf","record","value","text","held","undefined","operationId","malformed","bodyOf","agent_id","operation_id","conversation_id","message_id","nested","answer","interaction_id","revision","response","withTurn","body","turn","actionOutcome","status","refusal","result","door","sendFile","entry","file","bytes","byteLength","sha256","mediaType","width","height","media_type","length","dimensions","sendFiles","files","Array","isArray","declared","push","sendBody","textValue","fileBytes","blob","arrayBuffer","Uint8Array","uploadGrant","upload","method","operation","url","uploadOriginals","originals","index","entries","grant","delivered","transfer","act","outcome","uploaded","historyCursor","parsed","JSON","parse","acceptedAt","messageId","accepted_at","turned","message","structuredClone","olderCursor","stringify","readConversationHistory","conversationId","messages","after","limit","next","historyPage","until","from","Math","max","page","slice","first","cursor","cursorValue","olderThan","mapped","at","findIndex"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/actions.ts"],"sourcesContent":["import {\n changeBatchIdentity,\n type AcceptedMessage,\n type ActionDeclaration,\n type ActionRequest,\n type ActionResult,\n type ConversationCards,\n type ConversationHistoryPage,\n} from '@agentshouse/mdruntime';\nimport { doorRefusal } from './refusal.js';\nimport { PRIVATE_LOCATOR } from './transport.js';\nimport type { HouseDoorAnswer, HouseTransport } from './transport.js';\n\nconst HISTORY_PAGE = 100;\n\nconst OCTET_STREAM = 'application/octet-stream';\n\nconst CONVERSATION_ROUTES: ReadonlyMap<string, string> = new Map([\n ['conversation.create', '/door/conversations/create'],\n ['conversation.send', '/door/conversations/send'],\n ['conversation.answer', '/door/conversations/interaction/answer'],\n ['conversation.interrupt', '/door/conversations/interrupt'],\n ['conversation.kill', '/door/conversations/kill'],\n ['conversation.cancel', '/door/conversations/cancel'],\n ['conversation.delete', '/door/conversations/delete'],\n ['conversation.history', '/door/conversations/history'],\n]);\n\nexport const HOUSE_CONVERSATION_CARDS: ConversationCards = {\n locator: PRIVATE_LOCATOR,\n type: 'house-conversation',\n identity: 'conversation',\n agent: 'agent',\n};\n\nexport function declaredActions(routes: readonly string[]): readonly ActionDeclaration[] {\n const mapped = new Map(\n [...CONVERSATION_ROUTES].map(([name, route]) => [route.slice('/door/'.length), name]),\n );\n return routes.map((route) => ({\n name: mapped.get(route) ?? route,\n inputShape: {},\n resultKind: 'house',\n }));\n}\n\nexport function houseAction(\n transport: HouseTransport,\n request: ActionRequest,\n): Promise<ActionResult> {\n if (request.name === 'conversation.send') return sendAction(transport, request.input);\n if (request.name === 'conversation.history') return historyAction(transport, request.input);\n const route = routeOf(request.name);\n if (route === null) return Promise.resolve(malformed());\n return carry(transport, route, request.name, request.input);\n}\n\nfunction routeOf(name: string): string | null {\n const mapped = CONVERSATION_ROUTES.get(name);\n if (mapped !== undefined) return mapped;\n const parts = name.split('/');\n if (parts.some((part) => part === '.' || part === '..')) return null;\n try {\n return `/door/${parts.map(encodeURIComponent).join('/')}`;\n } catch {\n return null;\n }\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : {};\n}\n\nfunction text(value: unknown, name: string): string | undefined {\n const held = record(value)[name];\n return typeof held === 'string' ? held : undefined;\n}\n\nfunction operationId(input: unknown): string {\n return text(input, 'operation_id') ?? changeBatchIdentity();\n}\n\nfunction malformed(): ActionResult {\n return { kind: 'rejected', code: 'invalid_request', fields: {} };\n}\n\nfunction bodyOf(name: string, input: unknown): unknown {\n if (name === 'conversation.create') {\n return { agent_id: text(input, 'agent_id'), operation_id: operationId(input) };\n }\n if (\n name === 'conversation.interrupt' ||\n name === 'conversation.kill' ||\n name === 'conversation.delete'\n ) {\n return { conversation_id: text(input, 'conversation'), operation_id: operationId(input) };\n }\n if (name === 'conversation.cancel') {\n return {\n conversation_id: text(input, 'conversation'),\n message_id: text(input, 'turn'),\n operation_id: operationId(input),\n };\n }\n if (name === 'conversation.answer') {\n const nested = record(record(input).answer);\n return {\n conversation_id: text(input, 'conversation'),\n operation_id: operationId(input),\n interaction_id: text(nested, 'interaction_id'),\n revision: nested.revision,\n response: nested.response,\n };\n }\n return input;\n}\n\nfunction withTurn(body: unknown): unknown {\n const held = record(body);\n const turn = text(held, 'message_id');\n return turn === undefined ? body : { ...held, turn };\n}\n\nexport function actionOutcome(answer: HouseDoorAnswer, name: string): ActionResult {\n if (answer.status === 401) return { kind: 'revoked-authorization' };\n const refusal = doorRefusal(answer.body);\n if (refusal !== null) {\n return { kind: 'rejected', code: refusal.code, fields: refusal.fields };\n }\n if (answer.status === 404)\n return { kind: 'rejected', code: 'action-unimplemented', fields: { name } };\n if (answer.status === 0 || answer.status >= 400) return { kind: 'transport-uncertainty' };\n if (name === 'conversation.send') return { kind: 'action', result: withTurn(answer.body) };\n return { kind: 'action', result: answer.body };\n}\n\nasync function carry(\n transport: HouseTransport,\n route: string,\n name: string,\n input: unknown,\n): Promise<ActionResult> {\n const answer = await transport.door(route, bodyOf(name, input));\n return actionOutcome(answer, name);\n}\n\nfunction sendFile(entry: unknown): Record<string, unknown> | null {\n const file = record(entry);\n const name = text(file, 'name');\n const bytes = file.byteLength;\n const sha256 = text(file, 'contentHash');\n if (name === undefined || typeof bytes !== 'number' || sha256 === undefined) return null;\n const mediaType = text(file, 'mediaType');\n const width = file.width;\n const height = file.height;\n return {\n name,\n media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,\n bytes,\n sha256,\n ...(typeof width === 'number' && typeof height === 'number'\n ? { dimensions: { width, height } }\n : {}),\n };\n}\n\nfunction sendFiles(input: unknown): readonly Record<string, unknown>[] | null {\n const files = record(input).files;\n if (files === undefined) return [];\n if (!Array.isArray(files)) return null;\n const declared: Record<string, unknown>[] = [];\n for (const entry of files) {\n const file = sendFile(entry);\n if (file === null) return null;\n declared.push(file);\n }\n return declared;\n}\n\nfunction sendBody(input: unknown): Record<string, unknown> | null {\n const files = sendFiles(input);\n if (files === null) return null;\n const textValue = text(input, 'text');\n return {\n conversation_id: text(input, 'conversation'),\n operation_id: operationId(input),\n ...(textValue !== undefined && textValue.length > 0 ? { text: textValue } : {}),\n ...(files.length === 0 ? {} : { files }),\n };\n}\n\nasync function fileBytes(file: unknown): Promise<Uint8Array | null> {\n const blob = record(file).blob;\n if (blob === undefined || typeof blob !== 'object' || blob === null) return null;\n if (!('arrayBuffer' in blob) || typeof blob.arrayBuffer !== 'function') return null;\n return new Uint8Array(await (blob as Blob).arrayBuffer());\n}\n\nfunction uploadGrant(\n entry: unknown,\n): { method: 'POST'; operation: string; url: string } | 'absent' | null {\n if (!('upload' in record(entry))) return 'absent';\n const upload = record(record(entry).upload);\n if (upload.method !== 'POST') return null;\n if (typeof upload.operation !== 'string' || typeof upload.url !== 'string') return null;\n return { method: 'POST', operation: upload.operation, url: upload.url };\n}\n\nasync function uploadOriginals(\n transport: HouseTransport,\n input: unknown,\n result: unknown,\n): Promise<ActionResult | null> {\n const originals = record(result).originals;\n if (!Array.isArray(originals) || originals.length === 0) return null;\n const files = Array.isArray(record(input).files) ? (record(input).files as unknown[]) : [];\n for (const [index, entry] of originals.entries()) {\n const grant = uploadGrant(entry);\n if (grant === 'absent') continue;\n if (grant === null) return malformed();\n const bytes = index < files.length ? await fileBytes(files[index]) : null;\n if (bytes === null) {\n return { kind: 'rejected', code: 'conversation_original_descriptor_required', fields: {} };\n }\n const delivered = await transport.transfer({\n act: 'conversation_original_upload',\n method: 'POST',\n url: grant.url,\n body: bytes,\n operation: grant.operation,\n });\n if (delivered.status === 200) continue;\n return actionOutcome(delivered, 'conversation.send');\n }\n return null;\n}\n\nasync function sendAction(transport: HouseTransport, input: unknown): Promise<ActionResult> {\n const body = sendBody(input);\n if (body === null) return malformed();\n const answer = await transport.door('/door/conversations/send', body);\n const outcome = actionOutcome(answer, 'conversation.send');\n if (outcome.kind !== 'action') return outcome;\n const uploaded = await uploadOriginals(transport, input, outcome.result);\n if (uploaded !== null) return uploaded;\n return outcome;\n}\n\ntype HistoryCursor = { accepted_at: string; message_id: string };\n\nfunction historyCursor(value: unknown): HistoryCursor | null {\n const acceptedAt = text(value, 'accepted_at');\n const messageId = text(value, 'message_id');\n if (acceptedAt === undefined || messageId === undefined) return null;\n return { accepted_at: acceptedAt, message_id: messageId };\n}\n\nfunction position(cursor: HistoryCursor): string {\n return JSON.stringify({ accepted_at: cursor.accepted_at, message_id: cursor.message_id });\n}\n\nfunction positionCursor(value: string): HistoryCursor | null {\n try {\n return historyCursor(JSON.parse(value) as unknown);\n } catch {\n return null;\n }\n}\n\nexport function acceptedMessage(entry: unknown): AcceptedMessage | null {\n const cursor = historyCursor(entry);\n if (cursor === null) return null;\n return {\n identity: cursor.message_id,\n turn: cursor.message_id,\n position: position(cursor),\n text: text(entry, 'text') ?? '',\n message: structuredClone(entry),\n };\n}\n\nasync function historyAction(transport: HouseTransport, input: unknown): Promise<ActionResult> {\n const conversationId = text(input, 'conversation');\n if (conversationId === undefined) return malformed();\n const afterValue = text(input, 'after');\n const after = afterValue === undefined ? undefined : positionCursor(afterValue);\n if (after === null) return malformed();\n const answer = await transport.door('/door/conversations/history', {\n conversation_id: conversationId,\n ...(after === undefined ? {} : { after }),\n limit: HISTORY_PAGE,\n });\n const outcome = actionOutcome(answer, 'conversation.history');\n if (outcome.kind !== 'action') return outcome;\n const held = record(outcome.result);\n if (!Array.isArray(held.messages)) return { kind: 'transport-uncertainty' };\n const messages: AcceptedMessage[] = [];\n for (const entry of held.messages) {\n const message = acceptedMessage(entry);\n if (message === null) return { kind: 'transport-uncertainty' };\n messages.push(message);\n }\n const next = held.next === null || held.next === undefined ? undefined : historyCursor(held.next);\n if (next === null) return { kind: 'transport-uncertainty' };\n const page: ConversationHistoryPage = {\n messages,\n ...(next === undefined ? {} : { next: position(next) }),\n };\n return { kind: 'action', result: page };\n}\n"],"names":["changeBatchIdentity","doorRefusal","PRIVATE_LOCATOR","HISTORY_PAGE","OCTET_STREAM","CONVERSATION_ROUTES","Map","HOUSE_CONVERSATION_CARDS","locator","type","identity","agent","declaredActions","routes","mapped","map","name","route","slice","length","get","inputShape","resultKind","houseAction","transport","request","sendAction","input","historyAction","routeOf","Promise","resolve","malformed","carry","undefined","parts","split","some","part","encodeURIComponent","join","record","value","text","held","operationId","kind","code","fields","bodyOf","agent_id","operation_id","conversation_id","message_id","nested","answer","interaction_id","revision","response","withTurn","body","turn","actionOutcome","status","refusal","result","door","sendFile","entry","file","bytes","byteLength","sha256","mediaType","width","height","media_type","dimensions","sendFiles","files","Array","isArray","declared","push","sendBody","textValue","fileBytes","blob","arrayBuffer","Uint8Array","uploadGrant","upload","method","operation","url","uploadOriginals","originals","index","entries","grant","delivered","transfer","act","outcome","uploaded","historyCursor","acceptedAt","messageId","accepted_at","position","cursor","JSON","stringify","positionCursor","parse","acceptedMessage","message","structuredClone","conversationId","afterValue","after","limit","messages","next","page"],"mappings":"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"}
package/dist/adapter.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import type { Adapter, Authorization } from '@agentshouse/mdruntime';
2
- import { type HouseTransport } from './transport.js';
2
+ import { type HouseSiteTransport, type HouseTransport } from './transport.js';
3
3
  export type AgentsHouseAdapterOptions = {
4
4
  transport: HouseTransport;
5
5
  authorize(): Promise<Authorization>;
6
+ } | {
7
+ site: HouseSiteTransport;
6
8
  };
7
9
  export declare function createAgentsHouseAdapter(options: AgentsHouseAdapterOptions): Adapter;
8
10
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,OAAO,EACP,aAAa,EAcd,MAAM,wBAAwB,CAAC;AA2BhC,OAAO,EAQL,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAexB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,CAAC;AAqCF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CA0RpF"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,OAAO,EACP,aAAa,EAad,MAAM,wBAAwB,CAAC;AAqChC,OAAO,EAQL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAiBxB,MAAM,MAAM,yBAAyB,GACjC;IACE,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AA2BjC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAuQpF"}
package/dist/adapter.js CHANGED
@@ -1,15 +1,13 @@
1
- import { DISCOVER_PREFIXES, PROVIDER_SELECTION_MODEL_ROOT, discoveredRoom, locatorOf, mapDiscovery, parseDiscovery, providerSelection, trackedFrom } from './discovery.js';
1
+ import { DISCOVER_PREFIXES, HOUSE_TYPES_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';
2
4
  import { authorityRoot, bootstrapFrom, contentPrefixes, definitionsFrom, modelPrefix, parseEnumeration, parseEnvelope, parseGrant, refreshFrom } from './read.js';
3
5
  import { houseAction } from './actions.js';
4
- import { classifyDoor } from './refusal.js';
6
+ import { classifyDoor, discoveryFailure } from './refusal.js';
5
7
  import { houseNotifications } from './stream.js';
6
- import { DOOR_BATCH, DOOR_BATCH_UPLOAD, DOOR_BOOTSTRAP, DOOR_DISCOVER, DOOR_ENUMERATE, DOOR_REVISIONS, PRIVATE_AUTHORITY } from './transport.js';
7
- import { sha256Hex } from './digest.js';
8
- import { batchPaths, deltaBody, deltaBytes, deltaDigest, historyOutcome, houseChanges, mutationOutcome, rejectedMapping, revisionBody, uploadable } from './write.js';
9
- const MODEL_ABSENT = {
10
- kind: 'model-unavailable',
11
- reason: 'not-readable'
12
- };
8
+ import { DOOR_BATCH, DOOR_BATCH_UPLOAD, DOOR_BOOTSTRAP, DOOR_DISCOVER, DOOR_ENUMERATE, DOOR_REVISIONS, PRIVATE_LOCATOR } 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';
13
11
  const UNCERTAIN = {
14
12
  kind: 'transport-uncertainty'
15
13
  };
@@ -28,86 +26,47 @@ function modelFailure(classified, envelope) {
28
26
  kind: 'transport-uncertainty'
29
27
  } : MODEL_ABSENT;
30
28
  }
31
- if (classified.kind === 'revoked-authorization') return {
32
- kind: 'revoked-authorization'
33
- };
34
- if (classified.kind === 'transport-uncertainty') return {
35
- kind: 'transport-uncertainty'
36
- };
37
- return MODEL_ABSENT;
38
- }
39
- function modelVersion(revisions) {
40
- return sha256Hex(JSON.stringify(revisions));
29
+ return failedModel(classified);
41
30
  }
42
31
  export function createAgentsHouseAdapter(options) {
32
+ if ('site' in options) return createSiteAdapter(options.site);
43
33
  const transport = options.transport;
44
- const notifications = houseNotifications(transport);
34
+ const notifications = houseNotifications(transport, 'credential');
45
35
  const tracked = new Map();
46
- const models = new Map();
36
+ const models = modelShelf();
47
37
  const submissions = new Map();
48
- function modelKey(locator, attached) {
49
- return `${locator} ${attached}`;
50
- }
51
- async function held(envelope, entry, modelRoot, identity, failure) {
52
- const read = envelope === null ? null : definitionsFrom(envelope, entry, modelRoot);
53
- if (read === null) return {
54
- snapshot: failure,
55
- identity: null
56
- };
57
- const version = await modelVersion(read.revisions);
58
- return {
59
- snapshot: {
60
- kind: 'model',
61
- snapshot: {
62
- identity,
63
- version,
64
- definitions: read.definitions
65
- }
66
- },
67
- identity: {
68
- identity,
69
- version
70
- }
71
- };
38
+ function held(envelope, entry, modelRoot, identity, failure) {
39
+ return heldModel(envelope === null ? null : definitionsFrom(envelope, entry, modelRoot), identity, failure);
72
40
  }
73
41
  async function acquireModels(entries) {
74
42
  const acquired = new Map();
75
- const privateEntry = entries.find((entry)=>entry.authority === PRIVATE_AUTHORITY);
43
+ const privateEntry = entries.find((entry)=>entry.locator === PRIVATE_LOCATOR);
76
44
  const prefixes = entries.map((entry)=>modelPrefix(entry, entry.modelRoot));
77
45
  if (privateEntry !== undefined) {
78
- prefixes.push(`${authorityRoot(undefined)}/${PROVIDER_SELECTION_MODEL_ROOT}`);
46
+ prefixes.push(`${authorityRoot(undefined)}/${HOUSE_TYPES_ROOT}`);
79
47
  }
80
48
  const answer = await transport.door(DOOR_BOOTSTRAP, {
81
49
  prefixes
82
50
  });
83
- const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);
51
+ const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);
84
52
  const envelope = classified === null ? parseEnvelope(await bundled(answer.body)) : null;
85
53
  const failure = modelFailure(classified, envelope);
86
54
  for (const entry of entries){
87
55
  acquired.set(modelKey(entry.locator, 'collection'), await held(envelope, entry, entry.modelRoot, `${authorityRoot(entry.handle)}/${entry.modelRoot}`, failure));
88
56
  }
89
57
  if (privateEntry !== undefined) {
90
- acquired.set(modelKey(privateEntry.locator, 'typed-selection'), await held(envelope, privateEntry, PROVIDER_SELECTION_MODEL_ROOT, `${authorityRoot(undefined)}/${PROVIDER_SELECTION_MODEL_ROOT}`, failure));
58
+ acquired.set(modelKey(privateEntry.locator, 'typed-selection'), await held(envelope, privateEntry, HOUSE_TYPES_ROOT, `${authorityRoot(undefined)}/${HOUSE_TYPES_ROOT}`, failure));
91
59
  }
92
60
  return acquired;
93
61
  }
94
- function retainModel(key, acquired) {
95
- if (acquired === undefined) return models.get(key);
96
- if (acquired.snapshot.kind === 'transport-uncertainty') {
97
- const previous = models.get(key);
98
- if (previous !== undefined && previous.identity !== null) return previous;
99
- }
100
- models.set(key, acquired);
101
- return acquired;
102
- }
103
62
  function roomOf(authority, acquired) {
104
63
  const locator = locatorOf(authority);
105
64
  const key = modelKey(locator, 'collection');
106
- const collection = retainModel(key, acquired.get(key));
107
- if (authority.kind !== 'private') {
65
+ const collection = models.retain(key, acquired.get(key));
66
+ if (authority.roomHandle !== null) {
108
67
  return discoveredRoom(authority, collection?.identity ?? null, undefined);
109
68
  }
110
- const selection = retainModel(modelKey(locator, 'typed-selection'), acquired.get(modelKey(locator, 'typed-selection')));
69
+ const selection = models.retain(modelKey(locator, 'typed-selection'), acquired.get(modelKey(locator, 'typed-selection')));
111
70
  return discoveredRoom(authority, collection?.identity ?? null, providerSelection(selection?.identity ?? null));
112
71
  }
113
72
  function authorityFor(locator) {
@@ -124,15 +83,15 @@ export function createAgentsHouseAdapter(options) {
124
83
  });
125
84
  return answer.status === 200 ? answer.body : null;
126
85
  }
127
- async function uploaded(identity, changes, delta, bytes, entry) {
86
+ async function uploaded(head, changes, delta, bytes, entry) {
128
87
  const paths = batchPaths(changes);
129
88
  const sha256 = await deltaDigest(delta);
130
- const retained = submissions.get(identity);
131
- if (retained !== undefined && retained.sha256 === sha256) return {
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 {
132
91
  body: retained.body
133
92
  };
134
93
  const minted = await transport.door(DOOR_BATCH_UPLOAD, {
135
- operation_id: identity,
94
+ ...head,
136
95
  paths,
137
96
  bytes,
138
97
  sha256
@@ -156,11 +115,11 @@ export function createAgentsHouseAdapter(options) {
156
115
  outcome: UNCERTAIN
157
116
  };
158
117
  const holding = parseGrant(delivered.body);
159
- if (holding === null) return {
118
+ if (holding === null || holding.method !== 'POST') return {
160
119
  outcome: UNCERTAIN
161
120
  };
162
121
  const body = {
163
- operation_id: identity,
122
+ ...head,
164
123
  paths,
165
124
  upload: {
166
125
  url: holding.url,
@@ -169,7 +128,7 @@ export function createAgentsHouseAdapter(options) {
169
128
  sha256
170
129
  }
171
130
  };
172
- submissions.set(identity, {
131
+ submissions.set(head.operation_id, {
173
132
  sha256,
174
133
  body
175
134
  });
@@ -177,10 +136,10 @@ export function createAgentsHouseAdapter(options) {
177
136
  body
178
137
  };
179
138
  }
180
- async function submit(identity, changes, delta, bytes, entry) {
181
- const prepared = uploadable(bytes) ? await uploaded(identity, changes, delta, bytes, entry) : {
139
+ async function submit(head, changes, delta, bytes, entry) {
140
+ const prepared = uploadable(bytes) ? await uploaded(head, changes, delta, bytes, entry) : {
182
141
  body: {
183
- operation_id: identity,
142
+ ...head,
184
143
  changes
185
144
  }
186
145
  };
@@ -193,7 +152,7 @@ export function createAgentsHouseAdapter(options) {
193
152
  return options.authorize();
194
153
  },
195
154
  async model (_authorization, request) {
196
- return models.get(modelKey(request.locator, request.attached))?.snapshot ?? MODEL_ABSENT;
155
+ return models.answer(request);
197
156
  },
198
157
  async discover (_authorization) {
199
158
  const answer = await transport.door(DOOR_DISCOVER, {
@@ -201,20 +160,8 @@ export function createAgentsHouseAdapter(options) {
201
160
  ...DISCOVER_PREFIXES
202
161
  ]
203
162
  });
204
- const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);
205
- if (classified !== null) {
206
- if (classified.kind === 'revoked-authorization') return classified;
207
- if (classified.kind === 'scoped-refusal') {
208
- return {
209
- kind: 'contract-unavailable',
210
- code: classified.code,
211
- fields: classified.fields
212
- };
213
- }
214
- return {
215
- kind: 'transport-uncertainty'
216
- };
217
- }
163
+ const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);
164
+ if (classified !== null) return discoveryFailure(classified);
218
165
  const document = parseDiscovery(answer.body);
219
166
  if (document === null) return {
220
167
  kind: 'transport-uncertainty'
@@ -224,12 +171,8 @@ export function createAgentsHouseAdapter(options) {
224
171
  for (const entry of entries)tracked.set(entry.locator, entry);
225
172
  notifications.track(entries);
226
173
  const acquired = await acquireModels(entries);
227
- for (const key of [
228
- ...models.keys()
229
- ]){
230
- if (!entries.some((entry)=>key.startsWith(`${entry.locator} `))) models.delete(key);
231
- }
232
- return mapDiscovery(document, document.authorities.map((authority)=>roomOf(authority, acquired)));
174
+ models.keep(entries.map((entry)=>entry.locator));
175
+ return mapDiscovery(document, document.authorities.map((authority)=>roomOf(authority, acquired)), capabilities(document.actions));
233
176
  },
234
177
  async bootstrap (_authorization, request) {
235
178
  const entry = authorityFor(request.locator);
@@ -266,22 +209,23 @@ export function createAgentsHouseAdapter(options) {
266
209
  if (request.pageToken !== undefined) return {
267
210
  kind: 'transport-uncertainty'
268
211
  };
269
- const streamed = notifications.advance(entry, request.fromRoomVersion);
212
+ const from = logPosition(request.fromRoomVersion);
213
+ if (from === null) return {
214
+ kind: 'beyond-horizon'
215
+ };
216
+ const streamed = notifications.advance(entry, from);
270
217
  if (streamed !== null) return streamed;
271
218
  const answer = await transport.door(DOOR_ENUMERATE, {
272
219
  prefixes: [
273
220
  ...contentPrefixes(entry)
274
221
  ],
275
222
  positions: [
276
- {
277
- authority: entry.authority,
278
- position: request.fromRoomVersion
279
- }
223
+ presented(entry.authority, from)
280
224
  ]
281
225
  });
282
226
  const classified = classifyDoor(answer.status, answer.body, entry.locator);
283
227
  if (classified !== null) return classified;
284
- const enumeration = parseEnumeration(answer.body);
228
+ const enumeration = parseEnumeration(answer.body, 'credential');
285
229
  if (enumeration === null) return {
286
230
  kind: 'transport-uncertainty'
287
231
  };
@@ -295,16 +239,16 @@ export function createAgentsHouseAdapter(options) {
295
239
  };
296
240
  const mapped = houseChanges(request.changeBatch, entry.handle);
297
241
  if (mapped.kind === 'unmapped') return rejectedMapping(mapped);
298
- const identity = request.changeBatch.id;
242
+ const head = operationHead(request.changeBatch);
299
243
  const delta = deltaBody(mapped.changes);
300
244
  const bytes = deltaBytes(delta);
301
- const resent = submissions.has(identity);
302
- let outcome = await submit(identity, mapped.changes, delta, bytes, entry);
245
+ const resent = submissions.has(head.operation_id);
246
+ let outcome = await submit(head, mapped.changes, delta, bytes, entry);
303
247
  if (resent && lapsedGrant(outcome)) {
304
- submissions.delete(identity);
305
- outcome = await submit(identity, mapped.changes, delta, bytes, entry);
248
+ submissions.delete(head.operation_id);
249
+ outcome = await submit(head, mapped.changes, delta, bytes, entry);
306
250
  }
307
- if (RESOLVED_OUTCOMES.has(outcome.kind)) submissions.delete(identity);
251
+ if (RESOLVED_OUTCOMES.has(outcome.kind)) submissions.delete(head.operation_id);
308
252
  return outcome;
309
253
  },
310
254
  async history (_authorization, request) {
@@ -1 +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 ModelIdentity,\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 discoveredRoom,\n locatorOf,\n mapDiscovery,\n parseDiscovery,\n providerSelection,\n trackedFrom,\n type HouseAuthority,\n type TrackedAuthority,\n} from './discovery.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 } 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 HouseTransport,\n} from './transport.js';\nimport { sha256Hex } from './digest.js';\nimport {\n batchPaths,\n deltaBody,\n deltaBytes,\n deltaDigest,\n historyOutcome,\n houseChanges,\n mutationOutcome,\n rejectedMapping,\n revisionBody,\n uploadable,\n} from './write.js';\n\nexport type AgentsHouseAdapterOptions = {\n transport: HouseTransport;\n authorize(): Promise<Authorization>;\n};\n\ntype HeldModel = { snapshot: ModelResult; identity: ModelIdentity | null };\n\nconst MODEL_ABSENT: ModelResult = { kind: 'model-unavailable', reason: 'not-readable' };\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 if (classified.kind === 'revoked-authorization') return { kind: 'revoked-authorization' };\n if (classified.kind === 'transport-uncertainty') return { kind: 'transport-uncertainty' };\n return MODEL_ABSENT;\n}\n\nfunction modelVersion(revisions: readonly string[]): Promise<string> {\n return sha256Hex(JSON.stringify(revisions));\n}\n\nexport function createAgentsHouseAdapter(options: AgentsHouseAdapterOptions): Adapter {\n const transport = options.transport;\n const notifications = houseNotifications(transport);\n const tracked = new Map<string, TrackedAuthority>();\n const models = new Map<string, HeldModel>();\n const submissions = new Map<string, { sha256: string; body: Record<string, unknown> }>();\n\n function modelKey(locator: string, attached: ModelRequest['attached']): string {\n return `${locator} ${attached}`;\n }\n\n async function held(\n envelope: ReturnType<typeof parseEnvelope>,\n entry: TrackedAuthority,\n modelRoot: string,\n identity: string,\n failure: ModelResult,\n ): Promise<HeldModel> {\n const read = envelope === null ? null : definitionsFrom(envelope, entry, modelRoot);\n if (read === null) return { snapshot: failure, identity: null };\n const version = await modelVersion(read.revisions);\n return {\n snapshot: { kind: 'model', snapshot: { identity, version, definitions: read.definitions } },\n identity: { identity, version },\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 retainModel(key: string, acquired: HeldModel | undefined): HeldModel | undefined {\n if (acquired === undefined) return models.get(key);\n if (acquired.snapshot.kind === 'transport-uncertainty') {\n const previous = models.get(key);\n if (previous !== undefined && previous.identity !== null) return previous;\n }\n models.set(key, acquired);\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 = retainModel(key, acquired.get(key));\n if (authority.kind !== 'private') {\n return discoveredRoom(authority, collection?.identity ?? null, undefined);\n }\n const selection = retainModel(\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 identity: string,\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(identity);\n if (retained !== undefined && retained.sha256 === sha256) return { body: retained.body };\n const minted = await transport.door(DOOR_BATCH_UPLOAD, {\n operation_id: identity,\n paths,\n bytes,\n sha256,\n });\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 operation_id: identity,\n paths,\n upload: { url: holding.url, operation: holding.operation, bytes, sha256 },\n };\n submissions.set(identity, { sha256, body });\n return { body };\n }\n\n async function submit(\n identity: string,\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(identity, changes, delta, bytes, entry)\n : { body: { operation_id: identity, 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.get(modelKey(request.locator, request.attached))?.snapshot ?? MODEL_ABSENT;\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) {\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 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 for (const key of [...models.keys()]) {\n if (!entries.some((entry) => key.startsWith(`${entry.locator} `))) models.delete(key);\n }\n return mapDiscovery(\n document,\n document.authorities.map((authority) => roomOf(authority, acquired)),\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 streamed = notifications.advance(entry, request.fromRoomVersion);\n if (streamed !== null) return streamed;\n const answer = await transport.door(DOOR_ENUMERATE, {\n prefixes: [...contentPrefixes(entry)],\n positions: [{ authority: entry.authority, position: request.fromRoomVersion }],\n });\n const classified = classifyDoor(answer.status, answer.body, entry.locator);\n if (classified !== null) return classified;\n const enumeration = parseEnumeration(answer.body);\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 identity = request.changeBatch.id;\n const delta = deltaBody(mapped.changes);\n const bytes = deltaBytes(delta);\n const resent = submissions.has(identity);\n let outcome = await submit(identity, mapped.changes, delta, bytes, entry);\n if (resent && lapsedGrant(outcome)) {\n submissions.delete(identity);\n outcome = await submit(identity, mapped.changes, delta, bytes, entry);\n }\n if (RESOLVED_OUTCOMES.has(outcome.kind)) submissions.delete(identity);\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","discoveredRoom","locatorOf","mapDiscovery","parseDiscovery","providerSelection","trackedFrom","authorityRoot","bootstrapFrom","contentPrefixes","definitionsFrom","modelPrefix","parseEnumeration","parseEnvelope","parseGrant","refreshFrom","houseAction","classifyDoor","houseNotifications","DOOR_BATCH","DOOR_BATCH_UPLOAD","DOOR_BOOTSTRAP","DOOR_DISCOVER","DOOR_ENUMERATE","DOOR_REVISIONS","PRIVATE_AUTHORITY","sha256Hex","batchPaths","deltaBody","deltaBytes","deltaDigest","historyOutcome","houseChanges","mutationOutcome","rejectedMapping","revisionBody","uploadable","MODEL_ABSENT","kind","reason","UNCERTAIN","RESOLVED_OUTCOMES","Set","lapsedGrant","outcome","code","modelFailure","classified","envelope","modelVersion","revisions","JSON","stringify","createAgentsHouseAdapter","options","transport","notifications","tracked","Map","models","submissions","modelKey","locator","attached","held","entry","modelRoot","identity","failure","read","snapshot","version","definitions","acquireModels","entries","acquired","privateEntry","find","authority","prefixes","map","undefined","push","answer","door","status","body","bundled","set","handle","retainModel","key","get","previous","roomOf","collection","selection","authorityFor","grant","method","transfer","act","url","uploaded","changes","delta","bytes","paths","sha256","retained","minted","operation_id","delivered","operation","holding","upload","submit","prepared","authorize","model","_authorization","request","discover","fields","document","clear","track","keys","some","startsWith","delete","authorities","bootstrap","pageToken","refresh","streamed","advance","fromRoomVersion","positions","position","enumeration","mutate","mapped","changeBatch","id","resent","has","history","path","revision","action","roomVersions","conversations"],"mappings":"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"}
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 HOUSE_TYPES_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_LOCATOR,\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.locator === PRIVATE_LOCATOR);\n const prefixes = entries.map((entry) => modelPrefix(entry, entry.modelRoot));\n if (privateEntry !== undefined) {\n prefixes.push(`${authorityRoot(undefined)}/${HOUSE_TYPES_ROOT}`);\n }\n const answer = await transport.door(DOOR_BOOTSTRAP, { prefixes });\n const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);\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 HOUSE_TYPES_ROOT,\n `${authorityRoot(undefined)}/${HOUSE_TYPES_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.roomHandle !== null) {\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 || holding.method !== 'POST') 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_LOCATOR);\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(document.actions),\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","HOUSE_TYPES_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_LOCATOR","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","locator","prefixes","map","undefined","push","answer","door","status","body","bundled","set","handle","roomOf","authority","key","collection","retain","get","roomHandle","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","actions","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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"}
@@ -1,11 +1,13 @@
1
1
  import type { Capability, DiscoveredRoom, Discovery, ProviderLimit, Retention, TypedSelection } from '@agentshouse/mdruntime';
2
+ import { type LogPosition } from './version.js';
2
3
  export declare const ROOM_CONTRACT_VERSION = 1;
3
4
  export declare const MD_MODEL_IDENTITY = "@agentshouse/mdmodel";
4
5
  export declare const ROOM_VERSION_NOTIFICATIONS = "room-version-notifications";
5
6
  export declare const PROVIDER_ACTIONS = "provider-actions";
7
+ export declare const MOVE_REFERENCE_REWRITES = "move-reference-rewrites";
6
8
  export declare const DISCOVER_PREFIXES: readonly string[];
7
9
  export declare const PROVIDER_SELECTION_ROOTS: readonly string[];
8
- export declare const PROVIDER_SELECTION_MODEL_ROOT = "house/settings/model";
10
+ export declare const HOUSE_TYPES_ROOT = "house/types";
9
11
  export type HouseBounds = {
10
12
  max_authored_file_bytes: number;
11
13
  max_batch_operations: number;
@@ -22,8 +24,7 @@ export type HouseOperations = {
22
24
  write: readonly string[];
23
25
  delete: readonly string[];
24
26
  };
25
- export type HouseAuthority = {
26
- kind: 'room' | 'private';
27
+ export type HouseAuthority = LogPosition & {
27
28
  roomRef: string;
28
29
  roomHandle: string | null;
29
30
  name: string;
@@ -32,29 +33,55 @@ export type HouseAuthority = {
32
33
  managedReplication: 'admitted' | 'unavailable';
33
34
  protectedPaths: readonly string[];
34
35
  operations: HouseOperations;
35
- position: string;
36
36
  };
37
37
  export type HouseDiscoveryDocument = {
38
38
  bounds: HouseBounds;
39
39
  mdModelVersion: string;
40
40
  authorities: readonly HouseAuthority[];
41
+ actions: readonly string[];
41
42
  };
42
- export type TrackedAuthority = {
43
+ export type TrackedAuthority = LogPosition & {
43
44
  locator: string;
44
45
  authority: string;
45
46
  handle: string | undefined;
46
47
  collectionRoot: string;
47
48
  modelRoot: string;
48
49
  modelRoots: readonly string[];
49
- roomVersion: 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;
50
73
  };
51
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'];
52
78
  export declare function locatorOf(authority: HouseAuthority): string;
53
79
  export declare function trackedFrom(document: HouseDiscoveryDocument): TrackedAuthority[];
54
80
  export declare function providerLimits(bounds: HouseBounds): readonly ProviderLimit[];
55
81
  export declare function declaredRetention(bounds: HouseBounds): Retention;
56
- export declare function capabilities(): readonly Capability[];
82
+ export declare function capabilities(actions: readonly string[]): readonly Capability[];
83
+ export declare function siteCapabilities(): readonly Capability[];
57
84
  export declare function providerSelection(attachedModel: TypedSelection['attachedModel']): TypedSelection;
58
85
  export declare function discoveredRoom(authority: HouseAuthority, attachedModel: DiscoveredRoom['attachedModel'], typedSelection: TypedSelection | undefined): DiscoveredRoom;
59
- export declare function mapDiscovery(document: HouseDiscoveryDocument, rooms: readonly DiscoveredRoom[]): Discovery;
86
+ export declare function mapDiscovery(document: Pick<HouseDiscoveryDocument, 'bounds' | 'mdModelVersion'>, rooms: readonly DiscoveredRoom[], declared: readonly Capability[]): Discovery;
60
87
  //# sourceMappingURL=discovery.d.ts.map