@agentshouse/mdruntime-adapter 0.1.0-alpha.15 → 0.1.0-alpha.16

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.
package/dist/actions.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { changeBatchIdentity } from '@agentshouse/mdruntime';
2
2
  import { doorRefusal } from './refusal.js';
3
- import { PRIVATE_AUTHORITY } from './transport.js';
3
+ import { PRIVATE_LOCATOR } from './transport.js';
4
4
  export const HISTORY_PAGE = 100;
5
5
  const OCTET_STREAM = 'application/octet-stream';
6
6
  const CONVERSATION_ROUTES = new Map([
@@ -38,7 +38,7 @@ const CONVERSATION_ROUTES = new Map([
38
38
  ]
39
39
  ]);
40
40
  export const HOUSE_CONVERSATION_CARDS = {
41
- locator: PRIVATE_AUTHORITY,
41
+ locator: PRIVATE_LOCATOR,
42
42
  type: 'conversation',
43
43
  identity: 'conversation',
44
44
  agent: 'agent'
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/actions.ts"],"sourcesContent":["import {\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 { HouseDoor, HouseDoorAnswer, HouseTransport } from './transport.js';\n\nexport const 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_AUTHORITY,\n type: '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: 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: HouseDoor,\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":["changeBatchIdentity","doorRefusal","PRIVATE_AUTHORITY","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","parsed","JSON","parse","acceptedAt","messageId","accepted_at","turned","message","structuredClone","olderCursor","stringify","readConversationHistory","conversationId","messages","after","limit","next","historyPage","until","from","Math","max","page","first","cursor","cursorValue","olderThan","at","findIndex"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/actions.ts"],"sourcesContent":["import {\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_LOCATOR } from './transport.js';\nimport type { HouseDoor, HouseDoorAnswer, HouseTransport } from './transport.js';\n\nexport const 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: '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: 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: HouseDoor,\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":["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","parsed","JSON","parse","acceptedAt","messageId","accepted_at","turned","message","structuredClone","olderCursor","stringify","readConversationHistory","conversationId","messages","after","limit","next","historyPage","until","from","Math","max","page","first","cursor","cursorValue","olderThan","at","findIndex"],"mappings":"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"}
package/dist/adapter.js CHANGED
@@ -5,7 +5,7 @@ import { authorityRoot, bootstrapFrom, contentPrefixes, definitionsFrom, modelPr
5
5
  import { houseAction } from './actions.js';
6
6
  import { classifyDoor, discoveryFailure } from './refusal.js';
7
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';
8
+ import { DOOR_BATCH, DOOR_BATCH_UPLOAD, DOOR_BOOTSTRAP, DOOR_DISCOVER, DOOR_ENUMERATE, DOOR_REVISIONS, PRIVATE_LOCATOR } from './transport.js';
9
9
  import { batchPaths, deltaBody, deltaBytes, deltaDigest, historyOutcome, houseChanges, mutationOutcome, operationHead, rejectedMapping, revisionBody, uploadable } from './write.js';
10
10
  import { logPosition, presented } from './version.js';
11
11
  const UNCERTAIN = {
@@ -40,7 +40,7 @@ export function createAgentsHouseAdapter(options) {
40
40
  }
41
41
  async function acquireModels(entries) {
42
42
  const acquired = new Map();
43
- const privateEntry = entries.find((entry)=>entry.authority === PRIVATE_AUTHORITY);
43
+ const privateEntry = entries.find((entry)=>entry.locator === PRIVATE_LOCATOR);
44
44
  const prefixes = entries.map((entry)=>modelPrefix(entry, entry.modelRoot));
45
45
  if (privateEntry !== undefined) {
46
46
  prefixes.push(`${authorityRoot(undefined)}/${PROVIDER_SELECTION_MODEL_ROOT}`);
@@ -48,7 +48,7 @@ export function createAgentsHouseAdapter(options) {
48
48
  const answer = await transport.door(DOOR_BOOTSTRAP, {
49
49
  prefixes
50
50
  });
51
- const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);
51
+ const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);
52
52
  const envelope = classified === null ? parseEnvelope(await bundled(answer.body)) : null;
53
53
  const failure = modelFailure(classified, envelope);
54
54
  for (const entry of entries){
@@ -63,7 +63,7 @@ export function createAgentsHouseAdapter(options) {
63
63
  const locator = locatorOf(authority);
64
64
  const key = modelKey(locator, 'collection');
65
65
  const collection = models.retain(key, acquired.get(key));
66
- if (authority.kind !== 'private') {
66
+ if (authority.roomHandle !== null) {
67
67
  return discoveredRoom(authority, collection?.identity ?? null, undefined);
68
68
  }
69
69
  const selection = models.retain(modelKey(locator, 'typed-selection'), acquired.get(modelKey(locator, 'typed-selection')));
@@ -160,7 +160,7 @@ export function createAgentsHouseAdapter(options) {
160
160
  ...DISCOVER_PREFIXES
161
161
  ]
162
162
  });
163
- const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);
163
+ const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);
164
164
  if (classified !== null) return discoveryFailure(classified);
165
165
  const document = parseDiscovery(answer.body);
166
166
  if (document === null) return {
@@ -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 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(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","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","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
+ {"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_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)}/${PROVIDER_SELECTION_MODEL_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 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.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) 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","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_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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"}
@@ -25,7 +25,6 @@ export type HouseOperations = {
25
25
  delete: readonly string[];
26
26
  };
27
27
  export type HouseAuthority = LogPosition & {
28
- kind: 'room' | 'private';
29
28
  roomRef: string;
30
29
  roomHandle: string | null;
31
30
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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,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;IACvC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,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;AA4EhE,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAqB3E;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,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,UAAU,EAAE,CAU9E;AAED,wBAAgB,gBAAgB,IAAI,SAAS,UAAU,EAAE,CAKxD;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"}
package/dist/discovery.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { declaredActions, HOUSE_CONVERSATION_CARDS } from './actions.js';
2
- import { PRIVATE_AUTHORITY } from './transport.js';
2
+ import { PRIVATE_LOCATOR } from './transport.js';
3
3
  import { readPosition, roomVersion } from './version.js';
4
4
  export const ROOM_CONTRACT_VERSION = 1;
5
5
  export const MD_MODEL_IDENTITY = '@agentshouse/mdmodel';
@@ -59,7 +59,7 @@ function parseOperations(value) {
59
59
  function parseAuthority(value) {
60
60
  if (typeof value !== 'object' || value === null) return null;
61
61
  const held = value;
62
- if (held.kind !== 'room' && held.kind !== 'private') return null;
62
+ if (held.kind !== 'room') return null;
63
63
  if (typeof held.name !== 'string' || held.name.length === 0) return null;
64
64
  if (typeof held.collection_root !== 'string' || typeof held.model_root !== 'string') return null;
65
65
  if (held.managed_replication !== 'admitted' && held.managed_replication !== 'unavailable') {
@@ -69,24 +69,9 @@ function parseAuthority(value) {
69
69
  const protectedPaths = stringList(held.protected_paths);
70
70
  const operations = parseOperations(held.operations);
71
71
  if (at === null || protectedPaths === null || operations === null) return null;
72
- if (held.kind === 'private') {
73
- return {
74
- kind: 'private',
75
- roomRef: PRIVATE_AUTHORITY,
76
- roomHandle: null,
77
- name: held.name,
78
- collectionRoot: held.collection_root,
79
- modelRoot: held.model_root,
80
- managedReplication: held.managed_replication,
81
- protectedPaths,
82
- operations,
83
- ...at
84
- };
85
- }
86
72
  if (typeof held.room_ref !== 'string' || held.room_ref.length === 0) return null;
87
- if (typeof held.room_handle !== 'string' || held.room_handle.length === 0) return null;
73
+ if (held.room_handle !== null && (typeof held.room_handle !== 'string' || held.room_handle.length === 0)) return null;
88
74
  return {
89
- kind: 'room',
90
75
  roomRef: held.room_ref,
91
76
  roomHandle: held.room_handle,
92
77
  name: held.name,
@@ -213,7 +198,7 @@ export function siteSlots(document) {
213
198
  }));
214
199
  }
215
200
  export function locatorOf(authority) {
216
- return authority.roomHandle ?? PRIVATE_AUTHORITY;
201
+ return authority.roomHandle ?? PRIVATE_LOCATOR;
217
202
  }
218
203
  export function trackedFrom(document) {
219
204
  return document.authorities.map((authority)=>({
@@ -222,7 +207,7 @@ export function trackedFrom(document) {
222
207
  handle: authority.roomHandle ?? undefined,
223
208
  collectionRoot: authority.collectionRoot,
224
209
  modelRoot: authority.modelRoot,
225
- modelRoots: authority.kind === 'private' ? [
210
+ modelRoots: authority.roomHandle === null ? [
226
211
  authority.modelRoot,
227
212
  PROVIDER_SELECTION_MODEL_ROOT
228
213
  ] : [
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/discovery.ts"],"sourcesContent":["import type {\n Capability,\n DiscoveredRoom,\n Discovery,\n ProviderLimit,\n Retention,\n TypedSelection,\n} from '@agentshouse/mdruntime';\nimport { declaredActions, HOUSE_CONVERSATION_CARDS } from './actions.js';\nimport { PRIVATE_AUTHORITY } from './transport.js';\nimport { readPosition, roomVersion, type LogPosition } from './version.js';\n\nexport const ROOM_CONTRACT_VERSION = 1;\n\nexport const MD_MODEL_IDENTITY = '@agentshouse/mdmodel';\n\nexport const ROOM_VERSION_NOTIFICATIONS = 'room-version-notifications';\n\nexport const PROVIDER_ACTIONS = 'provider-actions';\n\nexport const MOVE_REFERENCE_REWRITES = 'move-reference-rewrites';\n\nexport const DISCOVER_PREFIXES: readonly string[] = ['/'];\n\nexport const PROVIDER_SELECTION_ROOTS: readonly string[] = ['agents', 'house'];\n\nexport const PROVIDER_SELECTION_MODEL_ROOT = 'house/settings/model';\n\nexport type HouseBounds = {\n max_authored_file_bytes: number;\n max_batch_operations: number;\n max_path_length: number;\n max_path_depth: number;\n max_mount_files: number;\n max_mount_bytes: number;\n change_retention_seconds: number;\n operation_retention_seconds: number;\n};\n\nexport type HouseOperations = {\n read: readonly string[];\n sync: readonly string[];\n write: readonly string[];\n delete: readonly string[];\n};\n\nexport type HouseAuthority = LogPosition & {\n kind: 'room' | 'private';\n roomRef: string;\n roomHandle: string | null;\n name: string;\n collectionRoot: string;\n modelRoot: string;\n managedReplication: 'admitted' | 'unavailable';\n protectedPaths: readonly string[];\n operations: HouseOperations;\n};\n\nexport type HouseDiscoveryDocument = {\n bounds: HouseBounds;\n mdModelVersion: string;\n authorities: readonly HouseAuthority[];\n actions: readonly string[];\n};\n\nexport type TrackedAuthority = LogPosition & {\n locator: string;\n authority: string;\n handle: string | undefined;\n collectionRoot: string;\n modelRoot: string;\n modelRoots: readonly string[];\n};\n\nexport type HouseSiteEntry = {\n roomRef: string;\n segment: string;\n};\n\nexport type HouseSiteSlot = {\n slot: string;\n entries: readonly HouseSiteEntry[];\n};\n\nexport type HouseSiteAuthority = LogPosition & {\n roomRef: string;\n roomHandle: string;\n collectionRoot: string;\n modelRoot: string;\n};\n\nexport type HouseSiteDiscovery = {\n bounds: HouseBounds;\n mdModelVersion: string;\n slots: readonly HouseSiteSlot[];\n authorities: readonly HouseSiteAuthority[];\n};\n\nexport type SiteTracked = TrackedAuthority & { handle: string };\n\nconst BOUND_KEYS: readonly (keyof HouseBounds)[] = [\n 'max_authored_file_bytes',\n 'max_batch_operations',\n 'max_path_length',\n 'max_path_depth',\n 'max_mount_files',\n 'max_mount_bytes',\n 'change_retention_seconds',\n 'operation_retention_seconds',\n];\n\nconst OPERATION_KEYS: readonly (keyof HouseOperations)[] = ['read', 'sync', 'write', 'delete'];\n\nfunction stringList(value: unknown): readonly string[] | null {\n if (!Array.isArray(value)) return null;\n return value.every((entry) => typeof entry === 'string') ? (value as string[]) : null;\n}\n\nfunction parseBounds(value: unknown): HouseBounds | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n const bounds: Partial<HouseBounds> = {};\n for (const key of BOUND_KEYS) {\n const amount = held[key];\n if (typeof amount !== 'number' || !Number.isFinite(amount)) return null;\n bounds[key] = amount;\n }\n return bounds as HouseBounds;\n}\n\nfunction parseOperations(value: unknown): HouseOperations | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n const operations: Partial<Record<keyof HouseOperations, readonly string[]>> = {};\n for (const key of OPERATION_KEYS) {\n const scopes = stringList(held[key]);\n if (scopes === null) return null;\n operations[key] = scopes;\n }\n return operations as HouseOperations;\n}\n\nfunction parseAuthority(value: unknown): HouseAuthority | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (held.kind !== 'room' && held.kind !== 'private') return null;\n if (typeof held.name !== 'string' || held.name.length === 0) return null;\n if (typeof held.collection_root !== 'string' || typeof held.model_root !== 'string') return null;\n if (held.managed_replication !== 'admitted' && held.managed_replication !== 'unavailable') {\n return null;\n }\n const at = readPosition(held);\n const protectedPaths = stringList(held.protected_paths);\n const operations = parseOperations(held.operations);\n if (at === null || protectedPaths === null || operations === null) return null;\n if (held.kind === 'private') {\n return {\n kind: 'private',\n roomRef: PRIVATE_AUTHORITY,\n roomHandle: null,\n name: held.name,\n collectionRoot: held.collection_root,\n modelRoot: held.model_root,\n managedReplication: held.managed_replication,\n protectedPaths,\n operations,\n ...at,\n };\n }\n if (typeof held.room_ref !== 'string' || held.room_ref.length === 0) return null;\n if (typeof held.room_handle !== 'string' || held.room_handle.length === 0) return null;\n return {\n kind: 'room',\n roomRef: held.room_ref,\n roomHandle: held.room_handle,\n name: held.name,\n collectionRoot: held.collection_root,\n modelRoot: held.model_root,\n managedReplication: held.managed_replication,\n protectedPaths,\n operations,\n ...at,\n };\n}\n\nexport function parseDiscovery(body: unknown): HouseDiscoveryDocument | null {\n if (typeof body !== 'object' || body === null) return null;\n const held = body as Record<string, unknown>;\n const bounds = parseBounds(held.bounds);\n if (bounds === null) return null;\n if (typeof held.md_model_version !== 'string' || held.md_model_version.length === 0) return null;\n const actions = stringList(held.actions);\n if (\n actions === null ||\n new Set(actions).size !== actions.length ||\n actions.some((name) => name.length === 0)\n )\n return null;\n if (!Array.isArray(held.authorities)) return null;\n const authorities: HouseAuthority[] = [];\n for (const entry of held.authorities) {\n const authority = parseAuthority(entry);\n if (authority === null) return null;\n authorities.push(authority);\n }\n return { bounds, mdModelVersion: held.md_model_version, authorities, actions };\n}\n\nfunction parseSiteEntry(value: unknown): HouseSiteEntry | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.room_ref !== 'string' || held.room_ref.length === 0) return null;\n if (typeof held.segment !== 'string' || held.segment.length === 0) return null;\n return { roomRef: held.room_ref, segment: held.segment };\n}\n\nfunction parseSiteSlot(value: unknown): HouseSiteSlot | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.slot !== 'string' || held.slot.length === 0) return null;\n if (!Array.isArray(held.entries)) return null;\n const entries: HouseSiteEntry[] = [];\n for (const entry of held.entries) {\n const parsed = parseSiteEntry(entry);\n if (parsed === null) return null;\n entries.push(parsed);\n }\n return { slot: held.slot, entries };\n}\n\nfunction parseSiteAuthority(value: unknown): HouseSiteAuthority | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (held.kind !== 'room') return null;\n if (typeof held.room_ref !== 'string' || held.room_ref.length === 0) return null;\n if (typeof held.room_handle !== 'string' || held.room_handle.length === 0) return null;\n if (typeof held.collection_root !== 'string' || typeof held.model_root !== 'string') return null;\n const at = readPosition(held);\n if (at === null) return null;\n return {\n roomRef: held.room_ref,\n roomHandle: held.room_handle,\n collectionRoot: held.collection_root,\n modelRoot: held.model_root,\n ...at,\n };\n}\n\nexport function parseSiteDiscovery(body: unknown): HouseSiteDiscovery | null {\n if (typeof body !== 'object' || body === null) return null;\n const held = body as Record<string, unknown>;\n const bounds = parseBounds(held.bounds);\n if (bounds === null) return null;\n if (typeof held.md_model_version !== 'string' || held.md_model_version.length === 0) return null;\n if (!Array.isArray(held.slots) || !Array.isArray(held.authorities)) return null;\n const slots: HouseSiteSlot[] = [];\n for (const entry of held.slots) {\n const slot = parseSiteSlot(entry);\n if (slot === null) return null;\n slots.push(slot);\n }\n const authorities: HouseSiteAuthority[] = [];\n for (const entry of held.authorities) {\n const authority = parseSiteAuthority(entry);\n if (authority === null) return null;\n authorities.push(authority);\n }\n return { bounds, mdModelVersion: held.md_model_version, slots, authorities };\n}\n\nexport function siteTracked(document: HouseSiteDiscovery): SiteTracked[] {\n return document.authorities.map((authority) => ({\n locator: authority.roomRef,\n authority: authority.roomRef,\n handle: authority.roomHandle,\n collectionRoot: authority.collectionRoot,\n modelRoot: authority.modelRoot,\n modelRoots: [authority.modelRoot],\n position: authority.position,\n logEpoch: authority.logEpoch,\n }));\n}\n\nexport function siteSlots(document: HouseSiteDiscovery): Discovery['slots'] {\n return document.slots.map(({ slot, entries }) => ({\n slot,\n entries: entries.map(({ roomRef, segment }) => ({ locator: roomRef, segment })),\n }));\n}\n\nexport function locatorOf(authority: HouseAuthority): string {\n return authority.roomHandle ?? PRIVATE_AUTHORITY;\n}\n\nexport function trackedFrom(document: HouseDiscoveryDocument): TrackedAuthority[] {\n return document.authorities.map((authority) => ({\n locator: locatorOf(authority),\n authority: authority.roomRef,\n handle: authority.roomHandle ?? undefined,\n collectionRoot: authority.collectionRoot,\n modelRoot: authority.modelRoot,\n modelRoots:\n authority.kind === 'private'\n ? [authority.modelRoot, PROVIDER_SELECTION_MODEL_ROOT]\n : [authority.modelRoot],\n position: authority.position,\n logEpoch: authority.logEpoch,\n }));\n}\n\nexport function providerLimits(bounds: HouseBounds): readonly ProviderLimit[] {\n return [\n { name: 'document-size', value: bounds.max_authored_file_bytes },\n { name: 'change-batch-operations', value: bounds.max_batch_operations },\n { name: 'path-length', value: bounds.max_path_length },\n { name: 'path-depth', value: bounds.max_path_depth },\n { name: 'write-rate' },\n { name: 'content-ceiling' },\n ];\n}\n\nexport function declaredRetention(bounds: HouseBounds): Retention {\n return {\n history: { kind: 'no-declared-time-bound' },\n outcome: bounds.operation_retention_seconds,\n refreshHorizon: bounds.change_retention_seconds,\n };\n}\n\nexport function capabilities(actions: readonly string[]): readonly Capability[] {\n return [\n { name: ROOM_VERSION_NOTIFICATIONS },\n {\n name: PROVIDER_ACTIONS,\n actions: declaredActions(actions),\n conversationCards: HOUSE_CONVERSATION_CARDS,\n },\n { name: MOVE_REFERENCE_REWRITES },\n ];\n}\n\nexport function siteCapabilities(): readonly Capability[] {\n return [\n { name: ROOM_VERSION_NOTIFICATIONS },\n { name: PROVIDER_ACTIONS, actions: [{ name: 'submit', inputShape: {}, resultKind: 'house' }] },\n ];\n}\n\nexport function providerSelection(attachedModel: TypedSelection['attachedModel']): TypedSelection {\n return { roots: [...PROVIDER_SELECTION_ROOTS], attachedModel };\n}\n\nexport function discoveredRoom(\n authority: HouseAuthority,\n attachedModel: DiscoveredRoom['attachedModel'],\n typedSelection: TypedSelection | undefined,\n): DiscoveredRoom {\n return {\n name: authority.name,\n locator: locatorOf(authority),\n collectionRoot: authority.collectionRoot,\n roomVersion: roomVersion(authority),\n operations: {\n read: [...authority.operations.read],\n sync: [...authority.operations.sync],\n write: [...authority.operations.write],\n delete: [...authority.operations.delete],\n },\n replica: { selection: locatorOf(authority), admission: authority.managedReplication },\n attachedModel,\n ...(typedSelection === undefined ? {} : { typedSelection }),\n providerOwnedPaths: [...authority.protectedPaths],\n };\n}\n\nexport function mapDiscovery(\n document: Pick<HouseDiscoveryDocument, 'bounds' | 'mdModelVersion'>,\n rooms: readonly DiscoveredRoom[],\n declared: readonly Capability[],\n): Discovery {\n return {\n kind: 'discovery',\n supportedVersions: [ROOM_CONTRACT_VERSION],\n mdModel: { identity: MD_MODEL_IDENTITY, version: document.mdModelVersion },\n rooms,\n capabilities: declared,\n providerLimits: providerLimits(document.bounds),\n retention: declaredRetention(document.bounds),\n };\n}\n"],"names":["declaredActions","HOUSE_CONVERSATION_CARDS","PRIVATE_AUTHORITY","readPosition","roomVersion","ROOM_CONTRACT_VERSION","MD_MODEL_IDENTITY","ROOM_VERSION_NOTIFICATIONS","PROVIDER_ACTIONS","MOVE_REFERENCE_REWRITES","DISCOVER_PREFIXES","PROVIDER_SELECTION_ROOTS","PROVIDER_SELECTION_MODEL_ROOT","BOUND_KEYS","OPERATION_KEYS","stringList","value","Array","isArray","every","entry","parseBounds","held","bounds","key","amount","Number","isFinite","parseOperations","operations","scopes","parseAuthority","kind","name","length","collection_root","model_root","managed_replication","at","protectedPaths","protected_paths","roomRef","roomHandle","collectionRoot","modelRoot","managedReplication","room_ref","room_handle","parseDiscovery","body","md_model_version","actions","Set","size","some","authorities","authority","push","mdModelVersion","parseSiteEntry","segment","parseSiteSlot","slot","entries","parsed","parseSiteAuthority","parseSiteDiscovery","slots","siteTracked","document","map","locator","handle","modelRoots","position","logEpoch","siteSlots","locatorOf","trackedFrom","undefined","providerLimits","max_authored_file_bytes","max_batch_operations","max_path_length","max_path_depth","declaredRetention","history","outcome","operation_retention_seconds","refreshHorizon","change_retention_seconds","capabilities","conversationCards","siteCapabilities","inputShape","resultKind","providerSelection","attachedModel","roots","discoveredRoom","typedSelection","read","sync","write","delete","replica","selection","admission","providerOwnedPaths","mapDiscovery","rooms","declared","supportedVersions","mdModel","identity","version","retention"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/discovery.ts"],"sourcesContent":["import type {\n Capability,\n DiscoveredRoom,\n Discovery,\n ProviderLimit,\n Retention,\n TypedSelection,\n} from '@agentshouse/mdruntime';\nimport { declaredActions, HOUSE_CONVERSATION_CARDS } from './actions.js';\nimport { PRIVATE_LOCATOR } from './transport.js';\nimport { readPosition, roomVersion, type LogPosition } from './version.js';\n\nexport const ROOM_CONTRACT_VERSION = 1;\n\nexport const MD_MODEL_IDENTITY = '@agentshouse/mdmodel';\n\nexport const ROOM_VERSION_NOTIFICATIONS = 'room-version-notifications';\n\nexport const PROVIDER_ACTIONS = 'provider-actions';\n\nexport const MOVE_REFERENCE_REWRITES = 'move-reference-rewrites';\n\nexport const DISCOVER_PREFIXES: readonly string[] = ['/'];\n\nexport const PROVIDER_SELECTION_ROOTS: readonly string[] = ['agents', 'house'];\n\nexport const PROVIDER_SELECTION_MODEL_ROOT = 'house/settings/model';\n\nexport type HouseBounds = {\n max_authored_file_bytes: number;\n max_batch_operations: number;\n max_path_length: number;\n max_path_depth: number;\n max_mount_files: number;\n max_mount_bytes: number;\n change_retention_seconds: number;\n operation_retention_seconds: number;\n};\n\nexport type HouseOperations = {\n read: readonly string[];\n sync: readonly string[];\n write: readonly string[];\n delete: readonly string[];\n};\n\nexport type HouseAuthority = LogPosition & {\n roomRef: string;\n roomHandle: string | null;\n name: string;\n collectionRoot: string;\n modelRoot: string;\n managedReplication: 'admitted' | 'unavailable';\n protectedPaths: readonly string[];\n operations: HouseOperations;\n};\n\nexport type HouseDiscoveryDocument = {\n bounds: HouseBounds;\n mdModelVersion: string;\n authorities: readonly HouseAuthority[];\n actions: readonly string[];\n};\n\nexport type TrackedAuthority = LogPosition & {\n locator: string;\n authority: string;\n handle: string | undefined;\n collectionRoot: string;\n modelRoot: string;\n modelRoots: readonly string[];\n};\n\nexport type HouseSiteEntry = {\n roomRef: string;\n segment: string;\n};\n\nexport type HouseSiteSlot = {\n slot: string;\n entries: readonly HouseSiteEntry[];\n};\n\nexport type HouseSiteAuthority = LogPosition & {\n roomRef: string;\n roomHandle: string;\n collectionRoot: string;\n modelRoot: string;\n};\n\nexport type HouseSiteDiscovery = {\n bounds: HouseBounds;\n mdModelVersion: string;\n slots: readonly HouseSiteSlot[];\n authorities: readonly HouseSiteAuthority[];\n};\n\nexport type SiteTracked = TrackedAuthority & { handle: string };\n\nconst BOUND_KEYS: readonly (keyof HouseBounds)[] = [\n 'max_authored_file_bytes',\n 'max_batch_operations',\n 'max_path_length',\n 'max_path_depth',\n 'max_mount_files',\n 'max_mount_bytes',\n 'change_retention_seconds',\n 'operation_retention_seconds',\n];\n\nconst OPERATION_KEYS: readonly (keyof HouseOperations)[] = ['read', 'sync', 'write', 'delete'];\n\nfunction stringList(value: unknown): readonly string[] | null {\n if (!Array.isArray(value)) return null;\n return value.every((entry) => typeof entry === 'string') ? (value as string[]) : null;\n}\n\nfunction parseBounds(value: unknown): HouseBounds | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n const bounds: Partial<HouseBounds> = {};\n for (const key of BOUND_KEYS) {\n const amount = held[key];\n if (typeof amount !== 'number' || !Number.isFinite(amount)) return null;\n bounds[key] = amount;\n }\n return bounds as HouseBounds;\n}\n\nfunction parseOperations(value: unknown): HouseOperations | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n const operations: Partial<Record<keyof HouseOperations, readonly string[]>> = {};\n for (const key of OPERATION_KEYS) {\n const scopes = stringList(held[key]);\n if (scopes === null) return null;\n operations[key] = scopes;\n }\n return operations as HouseOperations;\n}\n\nfunction parseAuthority(value: unknown): HouseAuthority | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (held.kind !== 'room') return null;\n if (typeof held.name !== 'string' || held.name.length === 0) return null;\n if (typeof held.collection_root !== 'string' || typeof held.model_root !== 'string') return null;\n if (held.managed_replication !== 'admitted' && held.managed_replication !== 'unavailable') {\n return null;\n }\n const at = readPosition(held);\n const protectedPaths = stringList(held.protected_paths);\n const operations = parseOperations(held.operations);\n if (at === null || protectedPaths === null || operations === null) return null;\n if (typeof held.room_ref !== 'string' || held.room_ref.length === 0) return null;\n if (\n held.room_handle !== null &&\n (typeof held.room_handle !== 'string' || held.room_handle.length === 0)\n )\n return null;\n return {\n roomRef: held.room_ref,\n roomHandle: held.room_handle,\n name: held.name,\n collectionRoot: held.collection_root,\n modelRoot: held.model_root,\n managedReplication: held.managed_replication,\n protectedPaths,\n operations,\n ...at,\n };\n}\n\nexport function parseDiscovery(body: unknown): HouseDiscoveryDocument | null {\n if (typeof body !== 'object' || body === null) return null;\n const held = body as Record<string, unknown>;\n const bounds = parseBounds(held.bounds);\n if (bounds === null) return null;\n if (typeof held.md_model_version !== 'string' || held.md_model_version.length === 0) return null;\n const actions = stringList(held.actions);\n if (\n actions === null ||\n new Set(actions).size !== actions.length ||\n actions.some((name) => name.length === 0)\n )\n return null;\n if (!Array.isArray(held.authorities)) return null;\n const authorities: HouseAuthority[] = [];\n for (const entry of held.authorities) {\n const authority = parseAuthority(entry);\n if (authority === null) return null;\n authorities.push(authority);\n }\n return { bounds, mdModelVersion: held.md_model_version, authorities, actions };\n}\n\nfunction parseSiteEntry(value: unknown): HouseSiteEntry | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.room_ref !== 'string' || held.room_ref.length === 0) return null;\n if (typeof held.segment !== 'string' || held.segment.length === 0) return null;\n return { roomRef: held.room_ref, segment: held.segment };\n}\n\nfunction parseSiteSlot(value: unknown): HouseSiteSlot | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.slot !== 'string' || held.slot.length === 0) return null;\n if (!Array.isArray(held.entries)) return null;\n const entries: HouseSiteEntry[] = [];\n for (const entry of held.entries) {\n const parsed = parseSiteEntry(entry);\n if (parsed === null) return null;\n entries.push(parsed);\n }\n return { slot: held.slot, entries };\n}\n\nfunction parseSiteAuthority(value: unknown): HouseSiteAuthority | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (held.kind !== 'room') return null;\n if (typeof held.room_ref !== 'string' || held.room_ref.length === 0) return null;\n if (typeof held.room_handle !== 'string' || held.room_handle.length === 0) return null;\n if (typeof held.collection_root !== 'string' || typeof held.model_root !== 'string') return null;\n const at = readPosition(held);\n if (at === null) return null;\n return {\n roomRef: held.room_ref,\n roomHandle: held.room_handle,\n collectionRoot: held.collection_root,\n modelRoot: held.model_root,\n ...at,\n };\n}\n\nexport function parseSiteDiscovery(body: unknown): HouseSiteDiscovery | null {\n if (typeof body !== 'object' || body === null) return null;\n const held = body as Record<string, unknown>;\n const bounds = parseBounds(held.bounds);\n if (bounds === null) return null;\n if (typeof held.md_model_version !== 'string' || held.md_model_version.length === 0) return null;\n if (!Array.isArray(held.slots) || !Array.isArray(held.authorities)) return null;\n const slots: HouseSiteSlot[] = [];\n for (const entry of held.slots) {\n const slot = parseSiteSlot(entry);\n if (slot === null) return null;\n slots.push(slot);\n }\n const authorities: HouseSiteAuthority[] = [];\n for (const entry of held.authorities) {\n const authority = parseSiteAuthority(entry);\n if (authority === null) return null;\n authorities.push(authority);\n }\n return { bounds, mdModelVersion: held.md_model_version, slots, authorities };\n}\n\nexport function siteTracked(document: HouseSiteDiscovery): SiteTracked[] {\n return document.authorities.map((authority) => ({\n locator: authority.roomRef,\n authority: authority.roomRef,\n handle: authority.roomHandle,\n collectionRoot: authority.collectionRoot,\n modelRoot: authority.modelRoot,\n modelRoots: [authority.modelRoot],\n position: authority.position,\n logEpoch: authority.logEpoch,\n }));\n}\n\nexport function siteSlots(document: HouseSiteDiscovery): Discovery['slots'] {\n return document.slots.map(({ slot, entries }) => ({\n slot,\n entries: entries.map(({ roomRef, segment }) => ({ locator: roomRef, segment })),\n }));\n}\n\nexport function locatorOf(authority: HouseAuthority): string {\n return authority.roomHandle ?? PRIVATE_LOCATOR;\n}\n\nexport function trackedFrom(document: HouseDiscoveryDocument): TrackedAuthority[] {\n return document.authorities.map((authority) => ({\n locator: locatorOf(authority),\n authority: authority.roomRef,\n handle: authority.roomHandle ?? undefined,\n collectionRoot: authority.collectionRoot,\n modelRoot: authority.modelRoot,\n modelRoots:\n authority.roomHandle === null\n ? [authority.modelRoot, PROVIDER_SELECTION_MODEL_ROOT]\n : [authority.modelRoot],\n position: authority.position,\n logEpoch: authority.logEpoch,\n }));\n}\n\nexport function providerLimits(bounds: HouseBounds): readonly ProviderLimit[] {\n return [\n { name: 'document-size', value: bounds.max_authored_file_bytes },\n { name: 'change-batch-operations', value: bounds.max_batch_operations },\n { name: 'path-length', value: bounds.max_path_length },\n { name: 'path-depth', value: bounds.max_path_depth },\n { name: 'write-rate' },\n { name: 'content-ceiling' },\n ];\n}\n\nexport function declaredRetention(bounds: HouseBounds): Retention {\n return {\n history: { kind: 'no-declared-time-bound' },\n outcome: bounds.operation_retention_seconds,\n refreshHorizon: bounds.change_retention_seconds,\n };\n}\n\nexport function capabilities(actions: readonly string[]): readonly Capability[] {\n return [\n { name: ROOM_VERSION_NOTIFICATIONS },\n {\n name: PROVIDER_ACTIONS,\n actions: declaredActions(actions),\n conversationCards: HOUSE_CONVERSATION_CARDS,\n },\n { name: MOVE_REFERENCE_REWRITES },\n ];\n}\n\nexport function siteCapabilities(): readonly Capability[] {\n return [\n { name: ROOM_VERSION_NOTIFICATIONS },\n { name: PROVIDER_ACTIONS, actions: [{ name: 'submit', inputShape: {}, resultKind: 'house' }] },\n ];\n}\n\nexport function providerSelection(attachedModel: TypedSelection['attachedModel']): TypedSelection {\n return { roots: [...PROVIDER_SELECTION_ROOTS], attachedModel };\n}\n\nexport function discoveredRoom(\n authority: HouseAuthority,\n attachedModel: DiscoveredRoom['attachedModel'],\n typedSelection: TypedSelection | undefined,\n): DiscoveredRoom {\n return {\n name: authority.name,\n locator: locatorOf(authority),\n collectionRoot: authority.collectionRoot,\n roomVersion: roomVersion(authority),\n operations: {\n read: [...authority.operations.read],\n sync: [...authority.operations.sync],\n write: [...authority.operations.write],\n delete: [...authority.operations.delete],\n },\n replica: { selection: locatorOf(authority), admission: authority.managedReplication },\n attachedModel,\n ...(typedSelection === undefined ? {} : { typedSelection }),\n providerOwnedPaths: [...authority.protectedPaths],\n };\n}\n\nexport function mapDiscovery(\n document: Pick<HouseDiscoveryDocument, 'bounds' | 'mdModelVersion'>,\n rooms: readonly DiscoveredRoom[],\n declared: readonly Capability[],\n): Discovery {\n return {\n kind: 'discovery',\n supportedVersions: [ROOM_CONTRACT_VERSION],\n mdModel: { identity: MD_MODEL_IDENTITY, version: document.mdModelVersion },\n rooms,\n capabilities: declared,\n providerLimits: providerLimits(document.bounds),\n retention: declaredRetention(document.bounds),\n };\n}\n"],"names":["declaredActions","HOUSE_CONVERSATION_CARDS","PRIVATE_LOCATOR","readPosition","roomVersion","ROOM_CONTRACT_VERSION","MD_MODEL_IDENTITY","ROOM_VERSION_NOTIFICATIONS","PROVIDER_ACTIONS","MOVE_REFERENCE_REWRITES","DISCOVER_PREFIXES","PROVIDER_SELECTION_ROOTS","PROVIDER_SELECTION_MODEL_ROOT","BOUND_KEYS","OPERATION_KEYS","stringList","value","Array","isArray","every","entry","parseBounds","held","bounds","key","amount","Number","isFinite","parseOperations","operations","scopes","parseAuthority","kind","name","length","collection_root","model_root","managed_replication","at","protectedPaths","protected_paths","room_ref","room_handle","roomRef","roomHandle","collectionRoot","modelRoot","managedReplication","parseDiscovery","body","md_model_version","actions","Set","size","some","authorities","authority","push","mdModelVersion","parseSiteEntry","segment","parseSiteSlot","slot","entries","parsed","parseSiteAuthority","parseSiteDiscovery","slots","siteTracked","document","map","locator","handle","modelRoots","position","logEpoch","siteSlots","locatorOf","trackedFrom","undefined","providerLimits","max_authored_file_bytes","max_batch_operations","max_path_length","max_path_depth","declaredRetention","history","outcome","operation_retention_seconds","refreshHorizon","change_retention_seconds","capabilities","conversationCards","siteCapabilities","inputShape","resultKind","providerSelection","attachedModel","roots","discoveredRoom","typedSelection","read","sync","write","delete","replica","selection","admission","providerOwnedPaths","mapDiscovery","rooms","declared","supportedVersions","mdModel","identity","version","retention"],"mappings":"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"}
package/dist/read.d.ts CHANGED
@@ -12,9 +12,7 @@ export type HouseContent = {
12
12
  content: string;
13
13
  };
14
14
  export type HouseScope = LogPosition & {
15
- scope: 'room' | 'private';
16
15
  anchor: string;
17
- roomHandle: string | undefined;
18
16
  files: readonly HouseManifestFile[];
19
17
  contents: readonly HouseContent[];
20
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
package/dist/read.js CHANGED
@@ -62,9 +62,10 @@ function parseScope(value, mode) {
62
62
  if (typeof held.manifest !== 'object' || held.manifest === null) return null;
63
63
  if (!Array.isArray(held.contents)) return null;
64
64
  const manifest = held.manifest;
65
- if (manifest.scope !== 'room' && manifest.scope !== 'private') return null;
65
+ if (manifest.scope !== 'room') return null;
66
66
  const at = readPosition(manifest);
67
- if (typeof manifest.anchor !== 'string' || at === null) return null;
67
+ if (typeof manifest.anchor !== 'string' || manifest.anchor.length === 0 || at === null) return null;
68
+ if (manifest.room_handle !== null && (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)) return null;
68
69
  if (!Array.isArray(manifest.files)) return null;
69
70
  const files = [];
70
71
  for (const entry of manifest.files){
@@ -83,9 +84,7 @@ function parseScope(value, mode) {
83
84
  });
84
85
  }
85
86
  return {
86
- scope: manifest.scope,
87
87
  anchor: manifest.anchor,
88
- roomHandle: typeof manifest.room_handle === 'string' ? manifest.room_handle : undefined,
89
88
  ...at,
90
89
  files,
91
90
  contents
@@ -105,8 +104,7 @@ export function parseEnvelope(body) {
105
104
  };
106
105
  }
107
106
  export function parseSiteBootstrap(body) {
108
- const scope = parseScope(body, 'site');
109
- return scope !== null && scope.scope === 'room' ? scope : null;
107
+ return parseScope(body, 'site');
110
108
  }
111
109
  function parseChange(value, mode) {
112
110
  if (typeof value !== 'object' || value === null) return null;
@@ -216,8 +214,7 @@ export function advancedScope(scope, view) {
216
214
  };
217
215
  }
218
216
  export function matchesScope(scope, tracked) {
219
- if (tracked.handle === undefined) return scope.scope === 'private';
220
- return scope.roomHandle === tracked.handle || scope.anchor === tracked.authority;
217
+ return scope.anchor === tracked.authority;
221
218
  }
222
219
  export function withinRoot(path, root) {
223
220
  return path === root || path.startsWith(`${root}/`);
package/dist/read.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/read.ts"],"sourcesContent":["import type { BootstrapPage, BootstrapResult, RefreshResult } from '@agentshouse/mdruntime';\nimport { PROVIDER_SELECTION_ROOTS, type TrackedAuthority } from './discovery.js';\nimport type { HouseMode } from './transport.js';\nimport { readPosition, roomVersion, type LogPosition } from './version.js';\n\nexport type HouseManifestFile = {\n path: string;\n revision: string | undefined;\n version: string;\n};\n\nexport type HouseContent = {\n path: string;\n content: string;\n};\n\nexport type HouseScope = LogPosition & {\n scope: 'room' | 'private';\n anchor: string;\n roomHandle: string | undefined;\n files: readonly HouseManifestFile[];\n contents: readonly HouseContent[];\n};\n\nexport type HouseEnvelope = {\n scopes: readonly HouseScope[];\n};\n\nexport type HouseGrant = {\n method: 'GET' | 'POST';\n operation: string;\n url: string;\n};\n\nexport type HouseChange =\n | { path: string; removed: true }\n | { path: string; content: string; revision: string | undefined; version: string }\n | { path: string; reference: { revision: string } };\n\nexport type HouseEnumeration = {\n authorities: readonly (LogPosition & {\n authority: string;\n changes: readonly HouseChange[];\n })[];\n};\n\nexport function authorityRoot(handle: string | undefined): string {\n return handle === undefined ? '/private' : `/rooms/${handle}`;\n}\n\nexport const ROOM_README = 'ROOM.md';\n\nexport function selectionRoots(tracked: TrackedAuthority): readonly string[] {\n if (tracked.handle === undefined) {\n return [tracked.collectionRoot, ...PROVIDER_SELECTION_ROOTS];\n }\n return [ROOM_README, tracked.collectionRoot];\n}\n\nexport function contentPrefixes(tracked: TrackedAuthority): readonly string[] {\n const root = authorityRoot(tracked.handle);\n return selectionRoots(tracked)\n .filter((entry) => entry !== ROOM_README)\n .map((entry) => `${root}/${entry}`);\n}\n\nexport function modelPrefix(tracked: TrackedAuthority, modelRoot: string): string {\n return `${authorityRoot(tracked.handle)}/${modelRoot}`;\n}\n\nexport function parseGrant(body: unknown): HouseGrant | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('transfer' in body) || typeof body.transfer !== 'object' || body.transfer === null) {\n return null;\n }\n const transfer = body.transfer as Record<string, unknown>;\n if (transfer.method !== 'GET' && transfer.method !== 'POST') return null;\n if (typeof transfer.operation !== 'string' || typeof transfer.url !== 'string') return null;\n return { method: transfer.method, operation: transfer.operation, url: transfer.url };\n}\n\nfunction parseFile(value: unknown, mode: HouseMode): HouseManifestFile | null {\n if (typeof value !== 'object' || value === null) return null;\n const file = value as Record<string, unknown>;\n if (typeof file.path !== 'string') return null;\n if (mode === 'site') {\n if (typeof file.sha256 !== 'string') return null;\n return { path: file.path, revision: undefined, version: file.sha256 };\n }\n if (typeof file.revision !== 'string') return null;\n return { path: file.path, revision: file.revision, version: file.revision };\n}\n\nfunction parseScope(value: unknown, mode: HouseMode): HouseScope | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.manifest !== 'object' || held.manifest === null) return null;\n if (!Array.isArray(held.contents)) return null;\n const manifest = held.manifest as Record<string, unknown>;\n if (manifest.scope !== 'room' && manifest.scope !== 'private') return null;\n const at = readPosition(manifest);\n if (typeof manifest.anchor !== 'string' || at === null) return null;\n if (!Array.isArray(manifest.files)) return null;\n const files: HouseManifestFile[] = [];\n for (const entry of manifest.files) {\n const file = parseFile(entry, mode);\n if (file === null) return null;\n files.push(file);\n }\n const contents: HouseContent[] = [];\n for (const entry of held.contents) {\n if (typeof entry !== 'object' || entry === null) return null;\n const content = entry as Record<string, unknown>;\n if (typeof content.path !== 'string' || typeof content.content !== 'string') return null;\n contents.push({ path: content.path, content: content.content });\n }\n return {\n scope: manifest.scope,\n anchor: manifest.anchor,\n roomHandle: typeof manifest.room_handle === 'string' ? manifest.room_handle : undefined,\n ...at,\n files,\n contents,\n };\n}\n\nexport function parseEnvelope(body: unknown): HouseEnvelope | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('scopes' in body) || !Array.isArray(body.scopes)) return null;\n const scopes: HouseScope[] = [];\n for (const entry of body.scopes) {\n const scope = parseScope(entry, 'credential');\n if (scope === null) return null;\n scopes.push(scope);\n }\n return { scopes };\n}\n\nexport function parseSiteBootstrap(body: unknown): HouseScope | null {\n const scope = parseScope(body, 'site');\n return scope !== null && scope.scope === 'room' ? scope : null;\n}\n\nfunction parseChange(value: unknown, mode: HouseMode): HouseChange | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.path !== 'string') return null;\n if (held.removed === true) return { path: held.path, removed: true };\n if (mode === 'site') {\n if (typeof held.content !== 'string' || typeof held.sha256 !== 'string') return null;\n return { path: held.path, content: held.content, revision: undefined, version: held.sha256 };\n }\n if (typeof held.content === 'string' && typeof held.revision === 'string') {\n return {\n path: held.path,\n content: held.content,\n revision: held.revision,\n version: held.revision,\n };\n }\n if (typeof held.reference === 'object' && held.reference !== null) {\n const reference = held.reference as Record<string, unknown>;\n if (typeof reference.revision !== 'string') return null;\n return { path: held.path, reference: { revision: reference.revision } };\n }\n return null;\n}\n\nexport function parseEnumeration(body: unknown, mode: HouseMode): HouseEnumeration | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('authorities' in body) || !Array.isArray(body.authorities)) return null;\n const authorities: HouseEnumeration['authorities'][number][] = [];\n for (const entry of body.authorities) {\n if (typeof entry !== 'object' || entry === null) return null;\n const held = entry as Record<string, unknown>;\n const at = readPosition(held);\n if (typeof held.authority !== 'string' || at === null) return null;\n if (!Array.isArray(held.changes)) return null;\n const changes: HouseChange[] = [];\n for (const change of held.changes) {\n const mapped = parseChange(change, mode);\n if (mapped === null) return null;\n changes.push(mapped);\n }\n authorities.push({ authority: held.authority, ...at, changes });\n }\n return { authorities };\n}\n\nexport function advancedScope(\n scope: HouseScope,\n view: HouseEnumeration['authorities'][number],\n): HouseScope {\n const files = new Map(scope.files.map((file) => [file.path, file]));\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n for (const change of view.changes) {\n files.delete(change.path);\n contents.delete(change.path);\n if ('removed' in change) continue;\n if ('content' in change) {\n files.set(change.path, {\n path: change.path,\n revision: change.revision,\n version: change.version,\n });\n contents.set(change.path, change.content);\n continue;\n }\n const { revision } = change.reference;\n files.set(change.path, { path: change.path, revision, version: revision });\n }\n return {\n ...scope,\n position: view.position,\n logEpoch: view.logEpoch,\n files: [...files.values()],\n contents: [...contents].map(([path, content]) => ({ path, content })),\n };\n}\n\nexport function matchesScope(scope: HouseScope, tracked: TrackedAuthority): boolean {\n if (tracked.handle === undefined) return scope.scope === 'private';\n return scope.roomHandle === tracked.handle || scope.anchor === tracked.authority;\n}\n\nexport function withinRoot(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport function selects(tracked: TrackedAuthority, path: string): boolean {\n if (tracked.modelRoots.some((root) => withinRoot(path, root))) return false;\n return selectionRoots(tracked).some((root) => withinRoot(path, root));\n}\n\nexport function bootstrapFrom(envelope: HouseEnvelope, tracked: TrackedAuthority): BootstrapResult {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n return bootstrapOf(scope, tracked);\n}\n\nexport function bootstrapOf(scope: HouseScope, tracked: TrackedAuthority): BootstrapPage {\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n for (const file of scope.files) {\n if (!selects(tracked, file.path)) continue;\n if (file.revision !== undefined) revisions[file.path] = file.revision;\n const content = contents.get(file.path);\n if (content === undefined) binaryTargets.push(file.path);\n else documents[file.path] = content;\n }\n return {\n kind: 'bootstrap',\n roomVersion: roomVersion(scope),\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n };\n}\n\nexport type HouseDefinitions = {\n definitions: Readonly<Record<string, string>>;\n versions: readonly string[];\n};\n\nexport const MODEL_DEFINITION_ADDRESS = 'types';\n\nexport function definitionAddress(path: string): string {\n return `${MODEL_DEFINITION_ADDRESS}/${path.slice(path.lastIndexOf('/') + 1)}`;\n}\n\nexport function definitionsFrom(\n envelope: HouseEnvelope,\n tracked: TrackedAuthority,\n modelRoot: string,\n): HouseDefinitions | null {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return null;\n return definitionsOf(scope, modelRoot);\n}\n\nexport function definitionsOf(scope: HouseScope, modelRoot: string): HouseDefinitions | null {\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const definitions: Record<string, string> = {};\n const versions: string[] = [];\n for (const file of scope.files) {\n if (!withinRoot(file.path, modelRoot)) continue;\n const content = contents.get(file.path);\n const address = definitionAddress(file.path);\n if (content === undefined || Object.hasOwn(definitions, address)) return null;\n definitions[address] = content;\n versions.push(`${file.path} ${file.version}`);\n }\n return { definitions, versions: versions.sort() };\n}\n\nexport function refreshFrom(\n enumeration: HouseEnumeration,\n tracked: TrackedAuthority,\n fromRoomVersion: string,\n): RefreshResult {\n const view = enumeration.authorities.find((entry) => entry.authority === tracked.authority);\n if (view === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n if (roomVersion(view) === fromRoomVersion) return { kind: 'still-current' };\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n const removals: string[] = [];\n for (const change of view.changes) {\n if (!selects(tracked, change.path)) continue;\n if ('removed' in change) {\n removals.push(change.path);\n continue;\n }\n if ('content' in change) {\n documents[change.path] = change.content;\n if (change.revision !== undefined) revisions[change.path] = change.revision;\n continue;\n }\n binaryTargets.push(change.path);\n revisions[change.path] = change.reference.revision;\n }\n return {\n kind: 'net-advancement',\n roomVersion: roomVersion(view),\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n removals: removals.sort(),\n };\n}\n"],"names":["PROVIDER_SELECTION_ROOTS","readPosition","roomVersion","authorityRoot","handle","undefined","ROOM_README","selectionRoots","tracked","collectionRoot","contentPrefixes","root","filter","entry","map","modelPrefix","modelRoot","parseGrant","body","transfer","method","operation","url","parseFile","value","mode","file","path","sha256","revision","version","parseScope","held","manifest","Array","isArray","contents","scope","at","anchor","files","push","content","roomHandle","room_handle","parseEnvelope","scopes","parseSiteBootstrap","parseChange","removed","reference","parseEnumeration","authorities","authority","changes","change","mapped","advancedScope","view","Map","delete","set","position","logEpoch","values","matchesScope","withinRoot","startsWith","selects","modelRoots","some","bootstrapFrom","envelope","find","kind","locator","bootstrapOf","documents","revisions","binaryTargets","get","sort","MODEL_DEFINITION_ADDRESS","definitionAddress","slice","lastIndexOf","definitionsFrom","definitionsOf","definitions","versions","address","Object","hasOwn","refreshFrom","enumeration","fromRoomVersion","removals"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/read.ts"],"sourcesContent":["import type { BootstrapPage, BootstrapResult, RefreshResult } from '@agentshouse/mdruntime';\nimport { PROVIDER_SELECTION_ROOTS, type TrackedAuthority } from './discovery.js';\nimport type { HouseMode } from './transport.js';\nimport { readPosition, roomVersion, type LogPosition } from './version.js';\n\nexport type HouseManifestFile = {\n path: string;\n revision: string | undefined;\n version: string;\n};\n\nexport type HouseContent = {\n path: string;\n content: string;\n};\n\nexport type HouseScope = LogPosition & {\n anchor: string;\n files: readonly HouseManifestFile[];\n contents: readonly HouseContent[];\n};\n\nexport type HouseEnvelope = {\n scopes: readonly HouseScope[];\n};\n\nexport type HouseGrant = {\n method: 'GET' | 'POST';\n operation: string;\n url: string;\n};\n\nexport type HouseChange =\n | { path: string; removed: true }\n | { path: string; content: string; revision: string | undefined; version: string }\n | { path: string; reference: { revision: string } };\n\nexport type HouseEnumeration = {\n authorities: readonly (LogPosition & {\n authority: string;\n changes: readonly HouseChange[];\n })[];\n};\n\nexport function authorityRoot(handle: string | undefined): string {\n return handle === undefined ? '/private' : `/rooms/${handle}`;\n}\n\nexport const ROOM_README = 'ROOM.md';\n\nexport function selectionRoots(tracked: TrackedAuthority): readonly string[] {\n if (tracked.handle === undefined) {\n return [tracked.collectionRoot, ...PROVIDER_SELECTION_ROOTS];\n }\n return [ROOM_README, tracked.collectionRoot];\n}\n\nexport function contentPrefixes(tracked: TrackedAuthority): readonly string[] {\n const root = authorityRoot(tracked.handle);\n return selectionRoots(tracked)\n .filter((entry) => entry !== ROOM_README)\n .map((entry) => `${root}/${entry}`);\n}\n\nexport function modelPrefix(tracked: TrackedAuthority, modelRoot: string): string {\n return `${authorityRoot(tracked.handle)}/${modelRoot}`;\n}\n\nexport function parseGrant(body: unknown): HouseGrant | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('transfer' in body) || typeof body.transfer !== 'object' || body.transfer === null) {\n return null;\n }\n const transfer = body.transfer as Record<string, unknown>;\n if (transfer.method !== 'GET' && transfer.method !== 'POST') return null;\n if (typeof transfer.operation !== 'string' || typeof transfer.url !== 'string') return null;\n return { method: transfer.method, operation: transfer.operation, url: transfer.url };\n}\n\nfunction parseFile(value: unknown, mode: HouseMode): HouseManifestFile | null {\n if (typeof value !== 'object' || value === null) return null;\n const file = value as Record<string, unknown>;\n if (typeof file.path !== 'string') return null;\n if (mode === 'site') {\n if (typeof file.sha256 !== 'string') return null;\n return { path: file.path, revision: undefined, version: file.sha256 };\n }\n if (typeof file.revision !== 'string') return null;\n return { path: file.path, revision: file.revision, version: file.revision };\n}\n\nfunction parseScope(value: unknown, mode: HouseMode): HouseScope | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.manifest !== 'object' || held.manifest === null) return null;\n if (!Array.isArray(held.contents)) return null;\n const manifest = held.manifest as Record<string, unknown>;\n if (manifest.scope !== 'room') return null;\n const at = readPosition(manifest);\n if (typeof manifest.anchor !== 'string' || manifest.anchor.length === 0 || at === null)\n return null;\n if (\n manifest.room_handle !== null &&\n (typeof manifest.room_handle !== 'string' || manifest.room_handle.length === 0)\n )\n return null;\n if (!Array.isArray(manifest.files)) return null;\n const files: HouseManifestFile[] = [];\n for (const entry of manifest.files) {\n const file = parseFile(entry, mode);\n if (file === null) return null;\n files.push(file);\n }\n const contents: HouseContent[] = [];\n for (const entry of held.contents) {\n if (typeof entry !== 'object' || entry === null) return null;\n const content = entry as Record<string, unknown>;\n if (typeof content.path !== 'string' || typeof content.content !== 'string') return null;\n contents.push({ path: content.path, content: content.content });\n }\n return {\n anchor: manifest.anchor,\n ...at,\n files,\n contents,\n };\n}\n\nexport function parseEnvelope(body: unknown): HouseEnvelope | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('scopes' in body) || !Array.isArray(body.scopes)) return null;\n const scopes: HouseScope[] = [];\n for (const entry of body.scopes) {\n const scope = parseScope(entry, 'credential');\n if (scope === null) return null;\n scopes.push(scope);\n }\n return { scopes };\n}\n\nexport function parseSiteBootstrap(body: unknown): HouseScope | null {\n return parseScope(body, 'site');\n}\n\nfunction parseChange(value: unknown, mode: HouseMode): HouseChange | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.path !== 'string') return null;\n if (held.removed === true) return { path: held.path, removed: true };\n if (mode === 'site') {\n if (typeof held.content !== 'string' || typeof held.sha256 !== 'string') return null;\n return { path: held.path, content: held.content, revision: undefined, version: held.sha256 };\n }\n if (typeof held.content === 'string' && typeof held.revision === 'string') {\n return {\n path: held.path,\n content: held.content,\n revision: held.revision,\n version: held.revision,\n };\n }\n if (typeof held.reference === 'object' && held.reference !== null) {\n const reference = held.reference as Record<string, unknown>;\n if (typeof reference.revision !== 'string') return null;\n return { path: held.path, reference: { revision: reference.revision } };\n }\n return null;\n}\n\nexport function parseEnumeration(body: unknown, mode: HouseMode): HouseEnumeration | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('authorities' in body) || !Array.isArray(body.authorities)) return null;\n const authorities: HouseEnumeration['authorities'][number][] = [];\n for (const entry of body.authorities) {\n if (typeof entry !== 'object' || entry === null) return null;\n const held = entry as Record<string, unknown>;\n const at = readPosition(held);\n if (typeof held.authority !== 'string' || at === null) return null;\n if (!Array.isArray(held.changes)) return null;\n const changes: HouseChange[] = [];\n for (const change of held.changes) {\n const mapped = parseChange(change, mode);\n if (mapped === null) return null;\n changes.push(mapped);\n }\n authorities.push({ authority: held.authority, ...at, changes });\n }\n return { authorities };\n}\n\nexport function advancedScope(\n scope: HouseScope,\n view: HouseEnumeration['authorities'][number],\n): HouseScope {\n const files = new Map(scope.files.map((file) => [file.path, file]));\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n for (const change of view.changes) {\n files.delete(change.path);\n contents.delete(change.path);\n if ('removed' in change) continue;\n if ('content' in change) {\n files.set(change.path, {\n path: change.path,\n revision: change.revision,\n version: change.version,\n });\n contents.set(change.path, change.content);\n continue;\n }\n const { revision } = change.reference;\n files.set(change.path, { path: change.path, revision, version: revision });\n }\n return {\n ...scope,\n position: view.position,\n logEpoch: view.logEpoch,\n files: [...files.values()],\n contents: [...contents].map(([path, content]) => ({ path, content })),\n };\n}\n\nexport function matchesScope(scope: HouseScope, tracked: TrackedAuthority): boolean {\n return scope.anchor === tracked.authority;\n}\n\nexport function withinRoot(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport function selects(tracked: TrackedAuthority, path: string): boolean {\n if (tracked.modelRoots.some((root) => withinRoot(path, root))) return false;\n return selectionRoots(tracked).some((root) => withinRoot(path, root));\n}\n\nexport function bootstrapFrom(envelope: HouseEnvelope, tracked: TrackedAuthority): BootstrapResult {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n return bootstrapOf(scope, tracked);\n}\n\nexport function bootstrapOf(scope: HouseScope, tracked: TrackedAuthority): BootstrapPage {\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n for (const file of scope.files) {\n if (!selects(tracked, file.path)) continue;\n if (file.revision !== undefined) revisions[file.path] = file.revision;\n const content = contents.get(file.path);\n if (content === undefined) binaryTargets.push(file.path);\n else documents[file.path] = content;\n }\n return {\n kind: 'bootstrap',\n roomVersion: roomVersion(scope),\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n };\n}\n\nexport type HouseDefinitions = {\n definitions: Readonly<Record<string, string>>;\n versions: readonly string[];\n};\n\nexport const MODEL_DEFINITION_ADDRESS = 'types';\n\nexport function definitionAddress(path: string): string {\n return `${MODEL_DEFINITION_ADDRESS}/${path.slice(path.lastIndexOf('/') + 1)}`;\n}\n\nexport function definitionsFrom(\n envelope: HouseEnvelope,\n tracked: TrackedAuthority,\n modelRoot: string,\n): HouseDefinitions | null {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return null;\n return definitionsOf(scope, modelRoot);\n}\n\nexport function definitionsOf(scope: HouseScope, modelRoot: string): HouseDefinitions | null {\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const definitions: Record<string, string> = {};\n const versions: string[] = [];\n for (const file of scope.files) {\n if (!withinRoot(file.path, modelRoot)) continue;\n const content = contents.get(file.path);\n const address = definitionAddress(file.path);\n if (content === undefined || Object.hasOwn(definitions, address)) return null;\n definitions[address] = content;\n versions.push(`${file.path} ${file.version}`);\n }\n return { definitions, versions: versions.sort() };\n}\n\nexport function refreshFrom(\n enumeration: HouseEnumeration,\n tracked: TrackedAuthority,\n fromRoomVersion: string,\n): RefreshResult {\n const view = enumeration.authorities.find((entry) => entry.authority === tracked.authority);\n if (view === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n if (roomVersion(view) === fromRoomVersion) return { kind: 'still-current' };\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n const removals: string[] = [];\n for (const change of view.changes) {\n if (!selects(tracked, change.path)) continue;\n if ('removed' in change) {\n removals.push(change.path);\n continue;\n }\n if ('content' in change) {\n documents[change.path] = change.content;\n if (change.revision !== undefined) revisions[change.path] = change.revision;\n continue;\n }\n binaryTargets.push(change.path);\n revisions[change.path] = change.reference.revision;\n }\n return {\n kind: 'net-advancement',\n roomVersion: roomVersion(view),\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n removals: removals.sort(),\n };\n}\n"],"names":["PROVIDER_SELECTION_ROOTS","readPosition","roomVersion","authorityRoot","handle","undefined","ROOM_README","selectionRoots","tracked","collectionRoot","contentPrefixes","root","filter","entry","map","modelPrefix","modelRoot","parseGrant","body","transfer","method","operation","url","parseFile","value","mode","file","path","sha256","revision","version","parseScope","held","manifest","Array","isArray","contents","scope","at","anchor","length","room_handle","files","push","content","parseEnvelope","scopes","parseSiteBootstrap","parseChange","removed","reference","parseEnumeration","authorities","authority","changes","change","mapped","advancedScope","view","Map","delete","set","position","logEpoch","values","matchesScope","withinRoot","startsWith","selects","modelRoots","some","bootstrapFrom","envelope","find","kind","locator","bootstrapOf","documents","revisions","binaryTargets","get","sort","MODEL_DEFINITION_ADDRESS","definitionAddress","slice","lastIndexOf","definitionsFrom","definitionsOf","definitions","versions","address","Object","hasOwn","refreshFrom","enumeration","fromRoomVersion","removals"],"mappings":"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"}
package/dist/site.js CHANGED
@@ -4,7 +4,7 @@ import { MODEL_ABSENT, failedModel, heldModel, modelKey, modelShelf } from './mo
4
4
  import { advancedScope, authorityRoot, bootstrapOf, definitionsOf, parseEnumeration, parseSiteBootstrap, refreshFrom, selectionRoots } from './read.js';
5
5
  import { classifyDoor, discoveryFailure } from './refusal.js';
6
6
  import { houseNotifications } from './stream.js';
7
- import { PRIVATE_AUTHORITY, SITE_DOOR_BOOTSTRAP, SITE_DOOR_DISCOVER, SITE_DOOR_ENUMERATE, SITE_DOOR_SUBMIT } from './transport.js';
7
+ import { PRIVATE_LOCATOR, SITE_DOOR_BOOTSTRAP, SITE_DOOR_DISCOVER, SITE_DOOR_ENUMERATE, SITE_DOOR_SUBMIT } from './transport.js';
8
8
  import { logPosition, presented, roomVersion } from './version.js';
9
9
  const UNCERTAIN = {
10
10
  kind: 'transport-uncertainty'
@@ -113,7 +113,7 @@ export function createSiteAdapter(transport) {
113
113
  },
114
114
  async discover () {
115
115
  const answer = await transport.door(SITE_DOOR_DISCOVER, {});
116
- const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);
116
+ const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);
117
117
  if (classified !== null) return discoveryFailure(classified);
118
118
  const document = parseSiteDiscovery(answer.body);
119
119
  if (document === null) return UNCERTAIN;
package/dist/site.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/site.ts"],"sourcesContent":["import type {\n Adapter,\n AdapterFailure,\n BootstrapResult,\n DiscoverResult,\n DiscoveredRoom,\n ModelResult,\n RefreshResult,\n} from '@agentshouse/mdruntime';\nimport { actionOutcome } from './actions.js';\nimport {\n mapDiscovery,\n parseSiteDiscovery,\n siteCapabilities,\n siteSlots,\n siteTracked,\n type SiteTracked,\n} from './discovery.js';\nimport {\n MODEL_ABSENT,\n failedModel,\n heldModel,\n modelKey,\n modelShelf,\n type HeldModel,\n} from './model.js';\nimport {\n advancedScope,\n authorityRoot,\n bootstrapOf,\n definitionsOf,\n parseEnumeration,\n parseSiteBootstrap,\n refreshFrom,\n selectionRoots,\n type HouseEnumeration,\n type HouseScope,\n} from './read.js';\nimport { classifyDoor, discoveryFailure } from './refusal.js';\nimport { houseNotifications } from './stream.js';\nimport {\n PRIVATE_AUTHORITY,\n SITE_DOOR_BOOTSTRAP,\n SITE_DOOR_DISCOVER,\n SITE_DOOR_ENUMERATE,\n SITE_DOOR_SUBMIT,\n type HouseSiteTransport,\n} from './transport.js';\nimport { logPosition, presented, roomVersion, type LogPosition } from './version.js';\n\ntype Refused = AdapterFailure | { kind: 'beyond-horizon' };\n\ntype CaughtUp = { scope: HouseScope } | { failure: AdapterFailure };\n\ntype Acquired = { roomVersion: string; model: HeldModel };\n\nconst UNCERTAIN = { kind: 'transport-uncertainty' } as const;\n\nfunction siteRoom(\n tracked: SiteTracked,\n attachedModel: DiscoveredRoom['attachedModel'],\n): DiscoveredRoom {\n const read = selectionRoots(tracked);\n return {\n name: tracked.handle,\n locator: tracked.locator,\n collectionRoot: tracked.collectionRoot,\n roomVersion: roomVersion(tracked),\n operations: { read: [...read], sync: [...read], write: [], delete: [] },\n replica: { selection: tracked.locator, admission: 'admitted' },\n attachedModel,\n providerOwnedPaths: [],\n };\n}\n\nfunction settled(refused: Refused): AdapterFailure {\n return refused.kind === 'beyond-horizon' ? UNCERTAIN : refused;\n}\n\nexport function createSiteAdapter(transport: HouseSiteTransport): Adapter {\n const notifications = houseNotifications(transport, 'site');\n const tracked = new Map<string, SiteTracked>();\n const models = modelShelf();\n const acquired = new Map<string, Acquired>();\n let caught = new Map<string, CaughtUp>();\n\n async function enumeration(\n entry: SiteTracked,\n from: LogPosition,\n ): Promise<HouseEnumeration | Refused> {\n const answer = await transport.door(SITE_DOOR_ENUMERATE, {\n positions: [presented(entry.authority, from)],\n });\n const classified = classifyDoor(answer.status, answer.body, entry.locator);\n if (classified !== null) return classified;\n return parseEnumeration(answer.body, 'site') ?? UNCERTAIN;\n }\n\n async function caughtUp(entry: SiteTracked): Promise<CaughtUp> {\n const answer = await transport.read(`${SITE_DOOR_BOOTSTRAP}${entry.authority}`);\n const classified = classifyDoor(answer.status, answer.body, entry.locator);\n if (classified !== null) return { failure: settled(classified) };\n const scope = parseSiteBootstrap(answer.body);\n if (scope === null) return { failure: UNCERTAIN };\n if (roomVersion(scope) === roomVersion(entry)) return { scope };\n const found = await enumeration(entry, scope);\n if ('kind' in found) return { failure: settled(found) };\n const view = found.authorities.find((held) => held.authority === entry.authority);\n if (view === undefined)\n return { failure: { kind: 'room-not-readable', locator: entry.locator } };\n return { scope: advancedScope(scope, view) };\n }\n\n async function refreshed(entry: SiteTracked, fromRoomVersion: string): Promise<RefreshResult> {\n const from = logPosition(fromRoomVersion);\n if (from === null) return { kind: 'beyond-horizon' };\n const streamed = notifications.advance(entry, from);\n if (streamed !== null) return streamed;\n const found = await enumeration(entry, from);\n if ('kind' in found) return found;\n return refreshFrom(found, entry, fromRoomVersion);\n }\n\n async function acquire(entry: SiteTracked, held: CaughtUp): Promise<HeldModel> {\n if ('failure' in held) return { snapshot: failedModel(held.failure), identity: null };\n const model = await heldModel(\n definitionsOf(held.scope, entry.modelRoot),\n `${authorityRoot(entry.handle)}/${entry.modelRoot}`,\n MODEL_ABSENT,\n );\n acquired.set(entry.authority, { roomVersion: roomVersion(held.scope), model });\n return model;\n }\n\n return {\n async authorize() {\n return {};\n },\n\n async model(_authorization, request): Promise<ModelResult> {\n return models.answer(request);\n },\n\n async discover(): Promise<DiscoverResult> {\n const answer = await transport.door(SITE_DOOR_DISCOVER, {});\n const classified = classifyDoor(answer.status, answer.body, PRIVATE_AUTHORITY);\n if (classified !== null) return discoveryFailure(classified);\n const document = parseSiteDiscovery(answer.body);\n if (document === null) return UNCERTAIN;\n const entries = siteTracked(document);\n tracked.clear();\n for (const entry of entries) tracked.set(entry.locator, entry);\n notifications.track(entries);\n const published = new Set(entries.map((entry) => entry.authority));\n for (const authority of [...acquired.keys()]) {\n if (!published.has(authority)) acquired.delete(authority);\n }\n const fresh = new Map<string, CaughtUp>();\n const current = new Map<string, HeldModel>();\n for (const entry of entries) {\n const kept = acquired.get(entry.authority);\n if (kept !== undefined && kept.roomVersion === roomVersion(entry)) {\n current.set(entry.authority, kept.model);\n continue;\n }\n const held = await caughtUp(entry);\n fresh.set(entry.authority, held);\n current.set(entry.authority, await acquire(entry, held));\n }\n caught = fresh;\n const rooms = entries.map((entry) => {\n const shelved = models.retain(\n modelKey(entry.locator, 'collection'),\n current.get(entry.authority),\n );\n return siteRoom(entry, shelved?.identity ?? null);\n });\n models.keep(entries.map((entry) => entry.locator));\n return { ...mapDiscovery(document, rooms, siteCapabilities()), slots: siteSlots(document) };\n },\n\n async bootstrap(_authorization, request): Promise<BootstrapResult> {\n const entry = tracked.get(request.locator);\n if (entry === undefined) return { kind: 'room-not-readable', locator: request.locator };\n if (request.pageToken !== undefined) return UNCERTAIN;\n const held = caught.get(entry.authority) ?? (await caughtUp(entry));\n if ('failure' in held) return held.failure;\n return bootstrapOf(held.scope, entry);\n },\n\n async refresh(_authorization, request): Promise<RefreshResult> {\n const entry = tracked.get(request.locator);\n if (entry === undefined) return { kind: 'room-not-readable', locator: request.locator };\n if (request.pageToken !== undefined) return UNCERTAIN;\n const result = await refreshed(entry, request.fromRoomVersion);\n if (result.kind === 'beyond-horizon') caught.delete(entry.authority);\n return result;\n },\n\n async mutate() {\n return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {} };\n },\n\n async history() {\n return { kind: 'no-history' };\n },\n\n async action(_authorization, request) {\n if (request.name !== 'submit') {\n return { kind: 'rejected', code: 'action-unimplemented', fields: { name: request.name } };\n }\n if (!transport.online()) return UNCERTAIN;\n return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), 'submit');\n },\n\n roomVersions: notifications,\n };\n}\n"],"names":["actionOutcome","mapDiscovery","parseSiteDiscovery","siteCapabilities","siteSlots","siteTracked","MODEL_ABSENT","failedModel","heldModel","modelKey","modelShelf","advancedScope","authorityRoot","bootstrapOf","definitionsOf","parseEnumeration","parseSiteBootstrap","refreshFrom","selectionRoots","classifyDoor","discoveryFailure","houseNotifications","PRIVATE_AUTHORITY","SITE_DOOR_BOOTSTRAP","SITE_DOOR_DISCOVER","SITE_DOOR_ENUMERATE","SITE_DOOR_SUBMIT","logPosition","presented","roomVersion","UNCERTAIN","kind","siteRoom","tracked","attachedModel","read","name","handle","locator","collectionRoot","operations","sync","write","delete","replica","selection","admission","providerOwnedPaths","settled","refused","createSiteAdapter","transport","notifications","Map","models","acquired","caught","enumeration","entry","from","answer","door","positions","authority","classified","status","body","caughtUp","failure","scope","found","view","authorities","find","held","undefined","refreshed","fromRoomVersion","streamed","advance","acquire","snapshot","identity","model","modelRoot","set","authorize","_authorization","request","discover","document","entries","clear","track","published","Set","map","keys","has","fresh","current","kept","get","rooms","shelved","retain","keep","slots","bootstrap","pageToken","refresh","result","mutate","affected","code","fields","history","action","online","input","roomVersions"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/site.ts"],"sourcesContent":["import type {\n Adapter,\n AdapterFailure,\n BootstrapResult,\n DiscoverResult,\n DiscoveredRoom,\n ModelResult,\n RefreshResult,\n} from '@agentshouse/mdruntime';\nimport { actionOutcome } from './actions.js';\nimport {\n mapDiscovery,\n parseSiteDiscovery,\n siteCapabilities,\n siteSlots,\n siteTracked,\n type SiteTracked,\n} from './discovery.js';\nimport {\n MODEL_ABSENT,\n failedModel,\n heldModel,\n modelKey,\n modelShelf,\n type HeldModel,\n} from './model.js';\nimport {\n advancedScope,\n authorityRoot,\n bootstrapOf,\n definitionsOf,\n parseEnumeration,\n parseSiteBootstrap,\n refreshFrom,\n selectionRoots,\n type HouseEnumeration,\n type HouseScope,\n} from './read.js';\nimport { classifyDoor, discoveryFailure } from './refusal.js';\nimport { houseNotifications } from './stream.js';\nimport {\n PRIVATE_LOCATOR,\n SITE_DOOR_BOOTSTRAP,\n SITE_DOOR_DISCOVER,\n SITE_DOOR_ENUMERATE,\n SITE_DOOR_SUBMIT,\n type HouseSiteTransport,\n} from './transport.js';\nimport { logPosition, presented, roomVersion, type LogPosition } from './version.js';\n\ntype Refused = AdapterFailure | { kind: 'beyond-horizon' };\n\ntype CaughtUp = { scope: HouseScope } | { failure: AdapterFailure };\n\ntype Acquired = { roomVersion: string; model: HeldModel };\n\nconst UNCERTAIN = { kind: 'transport-uncertainty' } as const;\n\nfunction siteRoom(\n tracked: SiteTracked,\n attachedModel: DiscoveredRoom['attachedModel'],\n): DiscoveredRoom {\n const read = selectionRoots(tracked);\n return {\n name: tracked.handle,\n locator: tracked.locator,\n collectionRoot: tracked.collectionRoot,\n roomVersion: roomVersion(tracked),\n operations: { read: [...read], sync: [...read], write: [], delete: [] },\n replica: { selection: tracked.locator, admission: 'admitted' },\n attachedModel,\n providerOwnedPaths: [],\n };\n}\n\nfunction settled(refused: Refused): AdapterFailure {\n return refused.kind === 'beyond-horizon' ? UNCERTAIN : refused;\n}\n\nexport function createSiteAdapter(transport: HouseSiteTransport): Adapter {\n const notifications = houseNotifications(transport, 'site');\n const tracked = new Map<string, SiteTracked>();\n const models = modelShelf();\n const acquired = new Map<string, Acquired>();\n let caught = new Map<string, CaughtUp>();\n\n async function enumeration(\n entry: SiteTracked,\n from: LogPosition,\n ): Promise<HouseEnumeration | Refused> {\n const answer = await transport.door(SITE_DOOR_ENUMERATE, {\n positions: [presented(entry.authority, from)],\n });\n const classified = classifyDoor(answer.status, answer.body, entry.locator);\n if (classified !== null) return classified;\n return parseEnumeration(answer.body, 'site') ?? UNCERTAIN;\n }\n\n async function caughtUp(entry: SiteTracked): Promise<CaughtUp> {\n const answer = await transport.read(`${SITE_DOOR_BOOTSTRAP}${entry.authority}`);\n const classified = classifyDoor(answer.status, answer.body, entry.locator);\n if (classified !== null) return { failure: settled(classified) };\n const scope = parseSiteBootstrap(answer.body);\n if (scope === null) return { failure: UNCERTAIN };\n if (roomVersion(scope) === roomVersion(entry)) return { scope };\n const found = await enumeration(entry, scope);\n if ('kind' in found) return { failure: settled(found) };\n const view = found.authorities.find((held) => held.authority === entry.authority);\n if (view === undefined)\n return { failure: { kind: 'room-not-readable', locator: entry.locator } };\n return { scope: advancedScope(scope, view) };\n }\n\n async function refreshed(entry: SiteTracked, fromRoomVersion: string): Promise<RefreshResult> {\n const from = logPosition(fromRoomVersion);\n if (from === null) return { kind: 'beyond-horizon' };\n const streamed = notifications.advance(entry, from);\n if (streamed !== null) return streamed;\n const found = await enumeration(entry, from);\n if ('kind' in found) return found;\n return refreshFrom(found, entry, fromRoomVersion);\n }\n\n async function acquire(entry: SiteTracked, held: CaughtUp): Promise<HeldModel> {\n if ('failure' in held) return { snapshot: failedModel(held.failure), identity: null };\n const model = await heldModel(\n definitionsOf(held.scope, entry.modelRoot),\n `${authorityRoot(entry.handle)}/${entry.modelRoot}`,\n MODEL_ABSENT,\n );\n acquired.set(entry.authority, { roomVersion: roomVersion(held.scope), model });\n return model;\n }\n\n return {\n async authorize() {\n return {};\n },\n\n async model(_authorization, request): Promise<ModelResult> {\n return models.answer(request);\n },\n\n async discover(): Promise<DiscoverResult> {\n const answer = await transport.door(SITE_DOOR_DISCOVER, {});\n const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);\n if (classified !== null) return discoveryFailure(classified);\n const document = parseSiteDiscovery(answer.body);\n if (document === null) return UNCERTAIN;\n const entries = siteTracked(document);\n tracked.clear();\n for (const entry of entries) tracked.set(entry.locator, entry);\n notifications.track(entries);\n const published = new Set(entries.map((entry) => entry.authority));\n for (const authority of [...acquired.keys()]) {\n if (!published.has(authority)) acquired.delete(authority);\n }\n const fresh = new Map<string, CaughtUp>();\n const current = new Map<string, HeldModel>();\n for (const entry of entries) {\n const kept = acquired.get(entry.authority);\n if (kept !== undefined && kept.roomVersion === roomVersion(entry)) {\n current.set(entry.authority, kept.model);\n continue;\n }\n const held = await caughtUp(entry);\n fresh.set(entry.authority, held);\n current.set(entry.authority, await acquire(entry, held));\n }\n caught = fresh;\n const rooms = entries.map((entry) => {\n const shelved = models.retain(\n modelKey(entry.locator, 'collection'),\n current.get(entry.authority),\n );\n return siteRoom(entry, shelved?.identity ?? null);\n });\n models.keep(entries.map((entry) => entry.locator));\n return { ...mapDiscovery(document, rooms, siteCapabilities()), slots: siteSlots(document) };\n },\n\n async bootstrap(_authorization, request): Promise<BootstrapResult> {\n const entry = tracked.get(request.locator);\n if (entry === undefined) return { kind: 'room-not-readable', locator: request.locator };\n if (request.pageToken !== undefined) return UNCERTAIN;\n const held = caught.get(entry.authority) ?? (await caughtUp(entry));\n if ('failure' in held) return held.failure;\n return bootstrapOf(held.scope, entry);\n },\n\n async refresh(_authorization, request): Promise<RefreshResult> {\n const entry = tracked.get(request.locator);\n if (entry === undefined) return { kind: 'room-not-readable', locator: request.locator };\n if (request.pageToken !== undefined) return UNCERTAIN;\n const result = await refreshed(entry, request.fromRoomVersion);\n if (result.kind === 'beyond-horizon') caught.delete(entry.authority);\n return result;\n },\n\n async mutate() {\n return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {} };\n },\n\n async history() {\n return { kind: 'no-history' };\n },\n\n async action(_authorization, request) {\n if (request.name !== 'submit') {\n return { kind: 'rejected', code: 'action-unimplemented', fields: { name: request.name } };\n }\n if (!transport.online()) return UNCERTAIN;\n return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), 'submit');\n },\n\n roomVersions: notifications,\n };\n}\n"],"names":["actionOutcome","mapDiscovery","parseSiteDiscovery","siteCapabilities","siteSlots","siteTracked","MODEL_ABSENT","failedModel","heldModel","modelKey","modelShelf","advancedScope","authorityRoot","bootstrapOf","definitionsOf","parseEnumeration","parseSiteBootstrap","refreshFrom","selectionRoots","classifyDoor","discoveryFailure","houseNotifications","PRIVATE_LOCATOR","SITE_DOOR_BOOTSTRAP","SITE_DOOR_DISCOVER","SITE_DOOR_ENUMERATE","SITE_DOOR_SUBMIT","logPosition","presented","roomVersion","UNCERTAIN","kind","siteRoom","tracked","attachedModel","read","name","handle","locator","collectionRoot","operations","sync","write","delete","replica","selection","admission","providerOwnedPaths","settled","refused","createSiteAdapter","transport","notifications","Map","models","acquired","caught","enumeration","entry","from","answer","door","positions","authority","classified","status","body","caughtUp","failure","scope","found","view","authorities","find","held","undefined","refreshed","fromRoomVersion","streamed","advance","acquire","snapshot","identity","model","modelRoot","set","authorize","_authorization","request","discover","document","entries","clear","track","published","Set","map","keys","has","fresh","current","kept","get","rooms","shelved","retain","keep","slots","bootstrap","pageToken","refresh","result","mutate","affected","code","fields","history","action","online","input","roomVersions"],"mappings":"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"}
package/dist/stream.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { RefreshPage, SelectedRooms, ViewedConversations } from '@agentshouse/mdruntime';
2
2
  import type { TrackedAuthority } from './discovery.js';
3
- import { type HouseDoor } from './transport.js';
3
+ import type { HouseDoor } from './transport.js';
4
4
  import type { HouseMode } from './transport.js';
5
5
  import { type LogPosition } from './version.js';
6
6
  export type HouseNotifications = SelectedRooms & {
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAEX,aAAa,EACb,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAqB,KAAK,SAAS,EAA6B,MAAM,gBAAgB,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAsC,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAc7D,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;IAC1E,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAaF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CA+O5F"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAEX,aAAa,EACb,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAsC,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAc7D,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;IAC1E,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAaF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CA8O5F"}
package/dist/stream.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { actionOutcome, HISTORY_PAGE, readConversationHistory } from './actions.js';
2
2
  import { selects } from './read.js';
3
- import { PRIVATE_AUTHORITY } from './transport.js';
4
3
  import { roomVersion } from './version.js';
5
4
  const HELD_POSITIONS_MAX = 256;
6
5
  function position(value) {
@@ -28,16 +27,13 @@ export function houseNotifications(transport, mode) {
28
27
  const rooms = new Set();
29
28
  for (const locator of selected){
30
29
  const authority = authorities.get(locator);
31
- if (authority === undefined || authority === PRIVATE_AUTHORITY) continue;
30
+ if (authority === undefined) continue;
32
31
  rooms.add(authority);
33
32
  }
34
33
  for (const room of rooms)named.push({
35
34
  kind: 'room',
36
35
  room
37
36
  });
38
- if (authorities.has(PRIVATE_AUTHORITY)) named.push({
39
- kind: 'private'
40
- });
41
37
  for (const conversation of viewed){
42
38
  named.push({
43
39
  kind: 'conversation',
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/stream.ts"],"sourcesContent":["import type {\n ConversationEvent,\n RefreshPage,\n RoomVersionNotification,\n SelectedRooms,\n ViewedConversations,\n} from '@agentshouse/mdruntime';\nimport { actionOutcome, HISTORY_PAGE, readConversationHistory } from './actions.js';\nimport type { TrackedAuthority } from './discovery.js';\nimport { selects } from './read.js';\nimport { PRIVATE_AUTHORITY, type HouseDoor, type HouseStreamAuthority } from './transport.js';\nimport type { HouseMode, HouseStreamEntry, HouseStreamFrame } from './transport.js';\nimport { roomVersion, type LogPosition } from './version.js';\n\nconst HELD_POSITIONS_MAX = 256;\n\ntype HeldFrame = {\n position: bigint;\n entries: readonly HouseStreamEntry[];\n};\n\ntype HeldLine = {\n logEpoch: string;\n frames: readonly HeldFrame[];\n};\n\nexport type HouseNotifications = SelectedRooms & {\n track(authorities: readonly TrackedAuthority[]): void;\n advance(tracked: TrackedAuthority, from: LogPosition): RefreshPage | null;\n conversations: ViewedConversations;\n};\n\nfunction position(value: string): bigint | null {\n if (!/^(?:0|[1-9][0-9]*)$/.test(value)) return null;\n return BigInt(value);\n}\n\nfunction messageTurn(message: unknown): string | null {\n if (typeof message !== 'object' || message === null) return null;\n const turn = (message as { message_id?: unknown }).message_id;\n return typeof turn === 'string' ? turn : null;\n}\n\nexport function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications {\n const stream = transport.stream;\n const lines = new Map<string, HeldLine>();\n const locators = new Map<string, string[]>();\n const authorities = new Map<string, string>();\n const observers = new Set<(notification: RoomVersionNotification) => void>();\n const conversationObservers = new Set<(event: ConversationEvent) => void>();\n const subscribedConversations = new Set<string>();\n let selected: readonly string[] = [];\n let viewed: readonly string[] = [];\n let listening = false;\n\n function subscribe() {\n const named: HouseStreamAuthority[] = [];\n const rooms = new Set<string>();\n for (const locator of selected) {\n const authority = authorities.get(locator);\n if (authority === undefined || authority === PRIVATE_AUTHORITY) continue;\n rooms.add(authority);\n }\n for (const room of rooms) named.push({ kind: 'room', room });\n if (authorities.has(PRIVATE_AUTHORITY)) named.push({ kind: 'private' });\n for (const conversation of viewed) {\n named.push({ kind: 'conversation', conversation });\n }\n stream.subscribe(named);\n }\n\n function emitConversation(event: ConversationEvent) {\n if (!viewed.includes(event.conversation)) return;\n for (const observer of conversationObservers) observer(event);\n }\n\n async function catchUp(conversation: string, history: boolean) {\n const viewedAnswer = await transport.door('/door/conversations/view', {\n conversation_id: conversation,\n });\n const summary = actionOutcome(viewedAnswer, 'conversations/view');\n if (\n summary.kind === 'action' &&\n typeof summary.result === 'object' &&\n summary.result !== null\n ) {\n emitConversation({\n kind: 'session-summary',\n conversation,\n summary: structuredClone('session' in summary.result ? summary.result.session : null),\n });\n }\n if (!history) return;\n const heldHistory = await readConversationHistory(transport, conversation);\n if ('outcome' in heldHistory) return;\n const newest = heldHistory.messages.slice(-HISTORY_PAGE);\n for (const entry of newest) {\n const turn = messageTurn(entry);\n if (turn === null) return;\n emitConversation({\n kind: 'accepted-message',\n conversation,\n message: { turn, message: structuredClone(entry) },\n });\n }\n }\n\n function announce(authority: string, at: LogPosition) {\n const version = roomVersion(at);\n for (const locator of locators.get(authority) ?? []) {\n for (const observer of observers) observer({ locator, roomVersion: version });\n }\n }\n\n function interrupt(authority: string) {\n const line = lines.get(authority);\n if (line !== undefined) lines.set(authority, { logEpoch: line.logEpoch, frames: [] });\n }\n\n function resubscribed(authority: string, position?: string, logEpoch?: string) {\n if (position === undefined || logEpoch === undefined) {\n interrupt(authority);\n return;\n }\n const held = lines.get(authority)?.logEpoch;\n lines.set(authority, { logEpoch, frames: [] });\n if (held !== logEpoch) announce(authority, { position, logEpoch });\n }\n\n function receive(frame: HouseStreamFrame) {\n if (frame.type === 'draft') {\n emitConversation({\n kind: 'growing-text',\n conversation: frame.conversation_id,\n turn: frame.turn_id,\n text: frame.text,\n });\n return;\n }\n if (frame.type === 'message') {\n const turn = messageTurn(frame.message);\n if (turn === null) return;\n emitConversation({\n kind: 'accepted-message',\n conversation: frame.conversation_id,\n message: { turn, message: structuredClone(frame.message) },\n });\n return;\n }\n if (frame.type === 'session') {\n emitConversation({\n kind: 'session-summary',\n conversation: frame.conversation_id,\n summary: structuredClone(frame.summary),\n });\n return;\n }\n if (frame.type === 'subscribed' && viewed.includes(frame.authority)) {\n const reconnect = subscribedConversations.has(frame.authority);\n subscribedConversations.add(frame.authority);\n void catchUp(frame.authority, reconnect);\n return;\n }\n if (frame.type === 'subscribed') {\n resubscribed(frame.authority, frame.position, frame.log_epoch);\n return;\n }\n if (frame.type !== 'entries') {\n interrupt(frame.authority);\n return;\n }\n const at = position(frame.position);\n if (at === null) {\n interrupt(frame.authority);\n return;\n }\n const line = lines.get(frame.authority);\n if (line?.logEpoch === frame.log_epoch) {\n const last = line.frames.at(-1);\n const continued = last !== undefined && last.position + 1n === at;\n const next = continued\n ? [...line.frames, { position: at, entries: frame.entries }]\n : [{ position: at, entries: frame.entries }];\n lines.set(frame.authority, {\n logEpoch: line.logEpoch,\n frames: next.length > HELD_POSITIONS_MAX ? [] : next,\n });\n } else {\n interrupt(frame.authority);\n }\n announce(frame.authority, { position: frame.position, logEpoch: frame.log_epoch });\n }\n\n return {\n conversations: {\n view(next) {\n const open = new Set(next);\n for (const conversation of subscribedConversations) {\n if (!open.has(conversation)) subscribedConversations.delete(conversation);\n }\n viewed = [...next];\n subscribe();\n },\n observe(notify) {\n conversationObservers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n conversationObservers.delete(notify);\n };\n },\n },\n track(entries) {\n locators.clear();\n authorities.clear();\n for (const entry of entries) {\n locators.set(entry.authority, [...(locators.get(entry.authority) ?? []), entry.locator]);\n authorities.set(entry.locator, entry.authority);\n if (lines.get(entry.authority)?.logEpoch !== entry.logEpoch) {\n lines.set(entry.authority, { logEpoch: entry.logEpoch, frames: [] });\n }\n }\n for (const authority of lines.keys()) {\n if (!locators.has(authority)) lines.delete(authority);\n }\n },\n select(named) {\n selected = [...named];\n subscribe();\n },\n observe(notify) {\n observers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n observers.delete(notify);\n };\n },\n advance(tracked, from) {\n const line = lines.get(tracked.authority);\n const start = position(from.position);\n if (line === undefined || start === null || line.logEpoch !== from.logEpoch) return null;\n const at = line.frames.findIndex((frame) => frame.position === start + 1n);\n if (at === -1) return null;\n const pending = line.frames.slice(at);\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const removals: string[] = [];\n for (const frame of pending) {\n for (const entry of frame.entries) {\n if (!selects(tracked, entry.path)) continue;\n if (entry.kind === 'removed') {\n delete documents[entry.path];\n delete revisions[entry.path];\n if (!removals.includes(entry.path)) removals.push(entry.path);\n continue;\n }\n if (entry.text === undefined) return null;\n if (mode === 'credential' && entry.revision === undefined) return null;\n documents[entry.path] = entry.text;\n if (entry.revision !== undefined) revisions[entry.path] = entry.revision;\n const removed = removals.indexOf(entry.path);\n if (removed !== -1) removals.splice(removed, 1);\n }\n }\n const last = pending.at(-1);\n if (last === undefined) return null;\n lines.set(tracked.authority, { logEpoch: line.logEpoch, frames: pending });\n return {\n kind: 'net-advancement',\n roomVersion: roomVersion({ position: last.position.toString(), logEpoch: line.logEpoch }),\n documents,\n revisions,\n binaryTargets: [],\n removals: removals.sort(),\n };\n },\n };\n}\n"],"names":["actionOutcome","HISTORY_PAGE","readConversationHistory","selects","PRIVATE_AUTHORITY","roomVersion","HELD_POSITIONS_MAX","position","value","test","BigInt","messageTurn","message","turn","message_id","houseNotifications","transport","mode","stream","lines","Map","locators","authorities","observers","Set","conversationObservers","subscribedConversations","selected","viewed","listening","subscribe","named","rooms","locator","authority","get","undefined","add","room","push","kind","has","conversation","emitConversation","event","includes","observer","catchUp","history","viewedAnswer","door","conversation_id","summary","result","structuredClone","session","heldHistory","newest","messages","slice","entry","announce","at","version","interrupt","line","set","logEpoch","frames","resubscribed","held","receive","frame","type","turn_id","text","reconnect","log_epoch","last","continued","next","entries","length","conversations","view","open","delete","observe","notify","track","clear","keys","select","advance","tracked","from","start","findIndex","pending","documents","revisions","removals","path","revision","removed","indexOf","splice","toString","binaryTargets","sort"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/stream.ts"],"sourcesContent":["import type {\n ConversationEvent,\n RefreshPage,\n RoomVersionNotification,\n SelectedRooms,\n ViewedConversations,\n} from '@agentshouse/mdruntime';\nimport { actionOutcome, HISTORY_PAGE, readConversationHistory } from './actions.js';\nimport type { TrackedAuthority } from './discovery.js';\nimport { selects } from './read.js';\nimport type { HouseDoor, HouseStreamAuthority } from './transport.js';\nimport type { HouseMode, HouseStreamEntry, HouseStreamFrame } from './transport.js';\nimport { roomVersion, type LogPosition } from './version.js';\n\nconst HELD_POSITIONS_MAX = 256;\n\ntype HeldFrame = {\n position: bigint;\n entries: readonly HouseStreamEntry[];\n};\n\ntype HeldLine = {\n logEpoch: string;\n frames: readonly HeldFrame[];\n};\n\nexport type HouseNotifications = SelectedRooms & {\n track(authorities: readonly TrackedAuthority[]): void;\n advance(tracked: TrackedAuthority, from: LogPosition): RefreshPage | null;\n conversations: ViewedConversations;\n};\n\nfunction position(value: string): bigint | null {\n if (!/^(?:0|[1-9][0-9]*)$/.test(value)) return null;\n return BigInt(value);\n}\n\nfunction messageTurn(message: unknown): string | null {\n if (typeof message !== 'object' || message === null) return null;\n const turn = (message as { message_id?: unknown }).message_id;\n return typeof turn === 'string' ? turn : null;\n}\n\nexport function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications {\n const stream = transport.stream;\n const lines = new Map<string, HeldLine>();\n const locators = new Map<string, string[]>();\n const authorities = new Map<string, string>();\n const observers = new Set<(notification: RoomVersionNotification) => void>();\n const conversationObservers = new Set<(event: ConversationEvent) => void>();\n const subscribedConversations = new Set<string>();\n let selected: readonly string[] = [];\n let viewed: readonly string[] = [];\n let listening = false;\n\n function subscribe() {\n const named: HouseStreamAuthority[] = [];\n const rooms = new Set<string>();\n for (const locator of selected) {\n const authority = authorities.get(locator);\n if (authority === undefined) continue;\n rooms.add(authority);\n }\n for (const room of rooms) named.push({ kind: 'room', room });\n for (const conversation of viewed) {\n named.push({ kind: 'conversation', conversation });\n }\n stream.subscribe(named);\n }\n\n function emitConversation(event: ConversationEvent) {\n if (!viewed.includes(event.conversation)) return;\n for (const observer of conversationObservers) observer(event);\n }\n\n async function catchUp(conversation: string, history: boolean) {\n const viewedAnswer = await transport.door('/door/conversations/view', {\n conversation_id: conversation,\n });\n const summary = actionOutcome(viewedAnswer, 'conversations/view');\n if (\n summary.kind === 'action' &&\n typeof summary.result === 'object' &&\n summary.result !== null\n ) {\n emitConversation({\n kind: 'session-summary',\n conversation,\n summary: structuredClone('session' in summary.result ? summary.result.session : null),\n });\n }\n if (!history) return;\n const heldHistory = await readConversationHistory(transport, conversation);\n if ('outcome' in heldHistory) return;\n const newest = heldHistory.messages.slice(-HISTORY_PAGE);\n for (const entry of newest) {\n const turn = messageTurn(entry);\n if (turn === null) return;\n emitConversation({\n kind: 'accepted-message',\n conversation,\n message: { turn, message: structuredClone(entry) },\n });\n }\n }\n\n function announce(authority: string, at: LogPosition) {\n const version = roomVersion(at);\n for (const locator of locators.get(authority) ?? []) {\n for (const observer of observers) observer({ locator, roomVersion: version });\n }\n }\n\n function interrupt(authority: string) {\n const line = lines.get(authority);\n if (line !== undefined) lines.set(authority, { logEpoch: line.logEpoch, frames: [] });\n }\n\n function resubscribed(authority: string, position?: string, logEpoch?: string) {\n if (position === undefined || logEpoch === undefined) {\n interrupt(authority);\n return;\n }\n const held = lines.get(authority)?.logEpoch;\n lines.set(authority, { logEpoch, frames: [] });\n if (held !== logEpoch) announce(authority, { position, logEpoch });\n }\n\n function receive(frame: HouseStreamFrame) {\n if (frame.type === 'draft') {\n emitConversation({\n kind: 'growing-text',\n conversation: frame.conversation_id,\n turn: frame.turn_id,\n text: frame.text,\n });\n return;\n }\n if (frame.type === 'message') {\n const turn = messageTurn(frame.message);\n if (turn === null) return;\n emitConversation({\n kind: 'accepted-message',\n conversation: frame.conversation_id,\n message: { turn, message: structuredClone(frame.message) },\n });\n return;\n }\n if (frame.type === 'session') {\n emitConversation({\n kind: 'session-summary',\n conversation: frame.conversation_id,\n summary: structuredClone(frame.summary),\n });\n return;\n }\n if (frame.type === 'subscribed' && viewed.includes(frame.authority)) {\n const reconnect = subscribedConversations.has(frame.authority);\n subscribedConversations.add(frame.authority);\n void catchUp(frame.authority, reconnect);\n return;\n }\n if (frame.type === 'subscribed') {\n resubscribed(frame.authority, frame.position, frame.log_epoch);\n return;\n }\n if (frame.type !== 'entries') {\n interrupt(frame.authority);\n return;\n }\n const at = position(frame.position);\n if (at === null) {\n interrupt(frame.authority);\n return;\n }\n const line = lines.get(frame.authority);\n if (line?.logEpoch === frame.log_epoch) {\n const last = line.frames.at(-1);\n const continued = last !== undefined && last.position + 1n === at;\n const next = continued\n ? [...line.frames, { position: at, entries: frame.entries }]\n : [{ position: at, entries: frame.entries }];\n lines.set(frame.authority, {\n logEpoch: line.logEpoch,\n frames: next.length > HELD_POSITIONS_MAX ? [] : next,\n });\n } else {\n interrupt(frame.authority);\n }\n announce(frame.authority, { position: frame.position, logEpoch: frame.log_epoch });\n }\n\n return {\n conversations: {\n view(next) {\n const open = new Set(next);\n for (const conversation of subscribedConversations) {\n if (!open.has(conversation)) subscribedConversations.delete(conversation);\n }\n viewed = [...next];\n subscribe();\n },\n observe(notify) {\n conversationObservers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n conversationObservers.delete(notify);\n };\n },\n },\n track(entries) {\n locators.clear();\n authorities.clear();\n for (const entry of entries) {\n locators.set(entry.authority, [...(locators.get(entry.authority) ?? []), entry.locator]);\n authorities.set(entry.locator, entry.authority);\n if (lines.get(entry.authority)?.logEpoch !== entry.logEpoch) {\n lines.set(entry.authority, { logEpoch: entry.logEpoch, frames: [] });\n }\n }\n for (const authority of lines.keys()) {\n if (!locators.has(authority)) lines.delete(authority);\n }\n },\n select(named) {\n selected = [...named];\n subscribe();\n },\n observe(notify) {\n observers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n observers.delete(notify);\n };\n },\n advance(tracked, from) {\n const line = lines.get(tracked.authority);\n const start = position(from.position);\n if (line === undefined || start === null || line.logEpoch !== from.logEpoch) return null;\n const at = line.frames.findIndex((frame) => frame.position === start + 1n);\n if (at === -1) return null;\n const pending = line.frames.slice(at);\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const removals: string[] = [];\n for (const frame of pending) {\n for (const entry of frame.entries) {\n if (!selects(tracked, entry.path)) continue;\n if (entry.kind === 'removed') {\n delete documents[entry.path];\n delete revisions[entry.path];\n if (!removals.includes(entry.path)) removals.push(entry.path);\n continue;\n }\n if (entry.text === undefined) return null;\n if (mode === 'credential' && entry.revision === undefined) return null;\n documents[entry.path] = entry.text;\n if (entry.revision !== undefined) revisions[entry.path] = entry.revision;\n const removed = removals.indexOf(entry.path);\n if (removed !== -1) removals.splice(removed, 1);\n }\n }\n const last = pending.at(-1);\n if (last === undefined) return null;\n lines.set(tracked.authority, { logEpoch: line.logEpoch, frames: pending });\n return {\n kind: 'net-advancement',\n roomVersion: roomVersion({ position: last.position.toString(), logEpoch: line.logEpoch }),\n documents,\n revisions,\n binaryTargets: [],\n removals: removals.sort(),\n };\n },\n };\n}\n"],"names":["actionOutcome","HISTORY_PAGE","readConversationHistory","selects","roomVersion","HELD_POSITIONS_MAX","position","value","test","BigInt","messageTurn","message","turn","message_id","houseNotifications","transport","mode","stream","lines","Map","locators","authorities","observers","Set","conversationObservers","subscribedConversations","selected","viewed","listening","subscribe","named","rooms","locator","authority","get","undefined","add","room","push","kind","conversation","emitConversation","event","includes","observer","catchUp","history","viewedAnswer","door","conversation_id","summary","result","structuredClone","session","heldHistory","newest","messages","slice","entry","announce","at","version","interrupt","line","set","logEpoch","frames","resubscribed","held","receive","frame","type","turn_id","text","reconnect","has","log_epoch","last","continued","next","entries","length","conversations","view","open","delete","observe","notify","track","clear","keys","select","advance","tracked","from","start","findIndex","pending","documents","revisions","removals","path","revision","removed","indexOf","splice","toString","binaryTargets","sort"],"mappings":"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"}
@@ -8,7 +8,7 @@ export declare const SITE_DOOR_DISCOVER = "/_house/door/discover";
8
8
  export declare const SITE_DOOR_BOOTSTRAP = "/_house/door/bootstrap/";
9
9
  export declare const SITE_DOOR_ENUMERATE = "/_house/door/enumerate";
10
10
  export declare const SITE_DOOR_SUBMIT = "/_house/door/submit";
11
- export declare const PRIVATE_AUTHORITY = "private";
11
+ export declare const PRIVATE_LOCATOR = "private";
12
12
  export type HouseMode = 'credential' | 'site';
13
13
  export type HouseDoorAnswer = {
14
14
  status: number;
@@ -26,8 +26,6 @@ export type HouseByteTransfer = {
26
26
  export type HouseStreamAuthority = {
27
27
  kind: 'room';
28
28
  room: string;
29
- } | {
30
- kind: 'private';
31
29
  } | {
32
30
  kind: 'conversation';
33
31
  conversation: string;
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
package/dist/transport.js CHANGED
@@ -8,6 +8,6 @@ export const SITE_DOOR_DISCOVER = '/_house/door/discover';
8
8
  export const SITE_DOOR_BOOTSTRAP = '/_house/door/bootstrap/';
9
9
  export const SITE_DOOR_ENUMERATE = '/_house/door/enumerate';
10
10
  export const SITE_DOOR_SUBMIT = '/_house/door/submit';
11
- export const PRIVATE_AUTHORITY = 'private';
11
+ export const PRIVATE_LOCATOR = 'private';
12
12
 
13
13
  //# sourceMappingURL=transport.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/transport.ts"],"sourcesContent":["export const DOOR_DISCOVER = '/door/discover';\n\nexport const DOOR_BOOTSTRAP = '/door/bootstrap';\n\nexport const DOOR_ENUMERATE = '/door/enumerate';\n\nexport const DOOR_BATCH = '/door/batch';\n\nexport const DOOR_BATCH_UPLOAD = '/door/batch-upload';\n\nexport const DOOR_REVISIONS = '/door/revisions';\n\nexport const SITE_DOOR_DISCOVER = '/_house/door/discover';\n\nexport const SITE_DOOR_BOOTSTRAP = '/_house/door/bootstrap/';\n\nexport const SITE_DOOR_ENUMERATE = '/_house/door/enumerate';\n\nexport const SITE_DOOR_SUBMIT = '/_house/door/submit';\n\nexport const PRIVATE_AUTHORITY = 'private';\n\nexport type HouseMode = 'credential' | 'site';\n\nexport type HouseDoorAnswer = {\n status: number;\n body: unknown;\n};\n\nexport type HouseByteAct =\n | 'working_copy_bundle'\n | 'authored_batch_upload'\n | 'conversation_original_upload';\n\nexport type HouseByteBody = string | ArrayBuffer | Uint8Array;\n\nexport type HouseByteTransfer = {\n act: HouseByteAct;\n method: 'GET' | 'POST';\n url: string;\n body?: HouseByteBody;\n operation?: string;\n};\n\nexport type HouseStreamAuthority =\n | { kind: 'room'; room: string }\n | { kind: 'private' }\n | { kind: 'conversation'; conversation: string };\n\nexport type HouseStreamEntry = {\n path: string;\n kind: 'edited' | 'removed';\n revision?: string;\n text?: string;\n};\n\nexport type HouseStreamFrame =\n | {\n type: 'entries';\n authority: string;\n position: string;\n log_epoch: string;\n entries: readonly HouseStreamEntry[];\n }\n | { type: 'subscribed'; authority: string; position?: string; log_epoch?: string }\n | { type: 'refused'; authority: string; code: string }\n | { type: 'unsubscribed'; authority: string; code?: string }\n | {\n type: 'draft';\n conversation_id: string;\n session_id: string;\n turn_id: string;\n text: string;\n }\n | { type: 'message'; conversation_id: string; message: unknown }\n | { type: 'session'; conversation_id: string; summary: unknown };\n\nexport type HouseStream = {\n subscribe(authorities: readonly HouseStreamAuthority[]): void;\n observe(receive: (frame: HouseStreamFrame) => void): () => void;\n};\n\nexport type HouseDoor = {\n door(route: string, body: unknown): Promise<HouseDoorAnswer>;\n stream: HouseStream;\n};\n\nexport type HouseTransport = HouseDoor & {\n transfer(request: HouseByteTransfer): Promise<HouseDoorAnswer>;\n};\n\nexport type HouseSiteTransport = HouseDoor & {\n online(): boolean;\n read(route: string): Promise<HouseDoorAnswer>;\n};\n"],"names":["DOOR_DISCOVER","DOOR_BOOTSTRAP","DOOR_ENUMERATE","DOOR_BATCH","DOOR_BATCH_UPLOAD","DOOR_REVISIONS","SITE_DOOR_DISCOVER","SITE_DOOR_BOOTSTRAP","SITE_DOOR_ENUMERATE","SITE_DOOR_SUBMIT","PRIVATE_AUTHORITY"],"mappings":"AAAA,OAAO,MAAMA,gBAAgB,iBAAiB;AAE9C,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,aAAa,cAAc;AAExC,OAAO,MAAMC,oBAAoB,qBAAqB;AAEtD,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,qBAAqB,wBAAwB;AAE1D,OAAO,MAAMC,sBAAsB,0BAA0B;AAE7D,OAAO,MAAMC,sBAAsB,yBAAyB;AAE5D,OAAO,MAAMC,mBAAmB,sBAAsB;AAEtD,OAAO,MAAMC,oBAAoB,UAAU"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/transport.ts"],"sourcesContent":["export const DOOR_DISCOVER = '/door/discover';\n\nexport const DOOR_BOOTSTRAP = '/door/bootstrap';\n\nexport const DOOR_ENUMERATE = '/door/enumerate';\n\nexport const DOOR_BATCH = '/door/batch';\n\nexport const DOOR_BATCH_UPLOAD = '/door/batch-upload';\n\nexport const DOOR_REVISIONS = '/door/revisions';\n\nexport const SITE_DOOR_DISCOVER = '/_house/door/discover';\n\nexport const SITE_DOOR_BOOTSTRAP = '/_house/door/bootstrap/';\n\nexport const SITE_DOOR_ENUMERATE = '/_house/door/enumerate';\n\nexport const SITE_DOOR_SUBMIT = '/_house/door/submit';\n\nexport const PRIVATE_LOCATOR = 'private';\n\nexport type HouseMode = 'credential' | 'site';\n\nexport type HouseDoorAnswer = {\n status: number;\n body: unknown;\n};\n\nexport type HouseByteAct =\n | 'working_copy_bundle'\n | 'authored_batch_upload'\n | 'conversation_original_upload';\n\nexport type HouseByteBody = string | ArrayBuffer | Uint8Array;\n\nexport type HouseByteTransfer = {\n act: HouseByteAct;\n method: 'GET' | 'POST';\n url: string;\n body?: HouseByteBody;\n operation?: string;\n};\n\nexport type HouseStreamAuthority =\n | { kind: 'room'; room: string }\n | { kind: 'conversation'; conversation: string };\n\nexport type HouseStreamEntry = {\n path: string;\n kind: 'edited' | 'removed';\n revision?: string;\n text?: string;\n};\n\nexport type HouseStreamFrame =\n | {\n type: 'entries';\n authority: string;\n position: string;\n log_epoch: string;\n entries: readonly HouseStreamEntry[];\n }\n | { type: 'subscribed'; authority: string; position?: string; log_epoch?: string }\n | { type: 'refused'; authority: string; code: string }\n | { type: 'unsubscribed'; authority: string; code?: string }\n | {\n type: 'draft';\n conversation_id: string;\n session_id: string;\n turn_id: string;\n text: string;\n }\n | { type: 'message'; conversation_id: string; message: unknown }\n | { type: 'session'; conversation_id: string; summary: unknown };\n\nexport type HouseStream = {\n subscribe(authorities: readonly HouseStreamAuthority[]): void;\n observe(receive: (frame: HouseStreamFrame) => void): () => void;\n};\n\nexport type HouseDoor = {\n door(route: string, body: unknown): Promise<HouseDoorAnswer>;\n stream: HouseStream;\n};\n\nexport type HouseTransport = HouseDoor & {\n transfer(request: HouseByteTransfer): Promise<HouseDoorAnswer>;\n};\n\nexport type HouseSiteTransport = HouseDoor & {\n online(): boolean;\n read(route: string): Promise<HouseDoorAnswer>;\n};\n"],"names":["DOOR_DISCOVER","DOOR_BOOTSTRAP","DOOR_ENUMERATE","DOOR_BATCH","DOOR_BATCH_UPLOAD","DOOR_REVISIONS","SITE_DOOR_DISCOVER","SITE_DOOR_BOOTSTRAP","SITE_DOOR_ENUMERATE","SITE_DOOR_SUBMIT","PRIVATE_LOCATOR"],"mappings":"AAAA,OAAO,MAAMA,gBAAgB,iBAAiB;AAE9C,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,aAAa,cAAc;AAExC,OAAO,MAAMC,oBAAoB,qBAAqB;AAEtD,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,qBAAqB,wBAAwB;AAE1D,OAAO,MAAMC,sBAAsB,0BAA0B;AAE7D,OAAO,MAAMC,sBAAsB,yBAAyB;AAE5D,OAAO,MAAMC,mBAAmB,sBAAsB;AAEtD,OAAO,MAAMC,kBAAkB,UAAU"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentshouse/mdruntime-adapter",
3
- "version": "0.1.0-alpha.15",
3
+ "version": "0.1.0-alpha.16",
4
4
  "description": "Agents House Adapter for the MD Runtime",
5
5
  "license": "MIT",
6
6
  "type": "module",