@agentshouse/mdruntime 0.1.0-alpha.47 → 0.1.0-alpha.49

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/memory.ts"],"sourcesContent":["import type { ModelResult } from './model.js';\nimport {\n ROOM_CONTRACT_VERSION,\n type AcceptedMessage,\n type ActionRequest,\n type ActionResult,\n type Adapter,\n type Authorization,\n type BootstrapRequest,\n type BootstrapResult,\n type Capability,\n type ConversationAction,\n type ConversationEvent,\n type ConversationHistoryPage,\n type DiscoverResult,\n type DiscoveredRoom,\n type HeadChange,\n type HistoryRequest,\n type HistoryResult,\n type MdModelIdentity,\n type MutationRequest,\n type MutationResult,\n type ProviderLimit,\n type RefreshRequest,\n type RefreshResult,\n type Retention,\n type RoomVersionNotification,\n type ServiceMode,\n} from './adapter.js';\nimport { MD_MODEL } from './collection.js';\nimport { sameChange } from './overlay.js';\n\nconst FIXTURE_RETENTION: Retention = {\n history: { kind: 'duration', seconds: 1 },\n outcome: 1,\n refreshHorizon: 1,\n};\n\nfunction declaredRetention(value: Retention | undefined): Retention {\n const retention = value ?? FIXTURE_RETENTION;\n if (retention.history.kind === 'no-declared-time-bound') return retention;\n if (Number.isFinite(retention.history.seconds) && retention.history.seconds > 0) {\n return retention;\n }\n throw new Error('history retention duration must be a finite positive number of seconds');\n}\n\nexport type MemoryRoom = DiscoveredRoom & {\n model?: ModelResult;\n selectionModel?: ModelResult;\n documents?: Readonly<Record<string, string>>;\n revisions?: Readonly<Record<string, string>>;\n changes?: Readonly<Record<string, HeadChange>>;\n binaryTargets?: readonly string[];\n};\n\nexport type MemoryConversation = {\n conversation: string;\n messages?: readonly AcceptedMessage[];\n outcomes?: Partial<Record<ConversationAction, ActionResult>>;\n};\n\nexport type MemoryAdapterOptions = {\n rooms?: readonly MemoryRoom[];\n conversations?: readonly MemoryConversation[];\n historyPageSize?: number;\n pageSize?: number;\n mdModel?: MdModelIdentity;\n supportedVersions?: readonly number[];\n capabilities?: readonly Capability[];\n providerLimits?: readonly ProviderLimit[];\n retention?: Retention;\n};\n\nexport type MemoryAdapter = Adapter & {\n setRooms(rooms: readonly MemoryRoom[]): void;\n setConversations(conversations: readonly MemoryConversation[]): void;\n script(operation: keyof Adapter, answer: unknown): void;\n notifyRoomVersion(notification: RoomVersionNotification): void;\n notifyConversation(event: ConversationEvent): void;\n notifyServiceMode(mode: ServiceMode): void;\n selectedRooms(): readonly string[];\n replicatedConversations(): readonly string[];\n};\n\ntype Script<T, R> = T | ((request: R) => T | Promise<T>);\n\ntype RefreshContinuation = {\n room: MemoryRoom;\n from: MemoryRoom;\n at: number;\n};\n\nfunction named<T>(\n source: Readonly<Record<string, T>>,\n paths: readonly string[],\n): Readonly<Record<string, T>> {\n const taken: Record<string, T> = {};\n for (const path of paths) {\n const value = source[path];\n if (value !== undefined) taken[path] = value;\n }\n return taken;\n}\n\nasync function resolveScript<T, R>(\n answer: Script<T, R> | undefined,\n fallback: () => T | Promise<T>,\n request: R,\n) {\n if (answer === undefined) return fallback();\n return typeof answer === 'function' ? (answer as (value: R) => T | Promise<T>)(request) : answer;\n}\n\nexport function createMemoryAdapter(options: MemoryAdapterOptions = {}): MemoryAdapter {\n let rooms = options.rooms === undefined ? [] : [...options.rooms];\n const mdModel = options.mdModel ?? MD_MODEL;\n const supportedVersions = options.supportedVersions ?? [ROOM_CONTRACT_VERSION];\n const capabilities = options.capabilities ?? [];\n const providerLimits = options.providerLimits ?? [];\n const retention = declaredRetention(options.retention);\n const pageSize = options.pageSize;\n const scripts: Partial<Record<keyof Adapter, unknown>> = {};\n const served = new Map<string, Map<string, MemoryRoom>>();\n const refreshPages = new Map<string, RefreshContinuation>();\n const observers = new Set<(notification: RoomVersionNotification) => void>();\n const listeners = new Set<(event: ConversationEvent) => void>();\n const modeObservers = new Set<(mode: ServiceMode) => void>();\n const scripted = new Map<string, MemoryConversation>();\n const unsealed = new Map<string, string>();\n const sealed = new Set<string>();\n const historyPageSize = options.historyPageSize;\n let selected: readonly string[] = [];\n let replicated: readonly string[] = [];\n let issued = 0;\n\n function scriptConversations(entries: readonly MemoryConversation[]) {\n scripted.clear();\n for (const entry of entries) scripted.set(entry.conversation, entry);\n }\n\n scriptConversations(options.conversations ?? []);\n\n const ordinals = new Map<string, number>();\n\n function note<T>(locator: string, answer: T): T {\n const roomVersion = (answer as { roomVersion?: unknown }).roomVersion;\n const key = `${locator}\\u0000${String(roomVersion)}`;\n if (typeof roomVersion === 'string' && !ordinals.has(key)) ordinals.set(key, ordinals.size);\n return answer;\n }\n\n function reached(locator: string, roomVersion: string, target: string): boolean {\n const scripted = scripts.reached as\n | boolean\n | ((locator: string, roomVersion: string, target: string) => boolean)\n | undefined;\n if (typeof scripted === 'boolean') return scripted;\n if (scripted !== undefined) return scripted(locator, roomVersion, target);\n if (roomVersion === target) return true;\n const held = ordinals.get(`${locator}\\u0000${roomVersion}`);\n const wanted = ordinals.get(`${locator}\\u0000${target}`);\n return held !== undefined && wanted !== undefined && held >= wanted;\n }\n\n function retain(entries: readonly MemoryRoom[]) {\n for (const room of entries) {\n note(room.locator, room);\n const versions = served.get(room.locator) ?? new Map<string, MemoryRoom>();\n versions.set(room.roomVersion, room);\n served.set(room.locator, versions);\n }\n }\n\n retain(rooms);\n\n function declared(room: MemoryRoom): DiscoveredRoom {\n return {\n name: room.name,\n locator: room.locator,\n roomVersion: room.roomVersion,\n operations: room.operations,\n replica: room.replica,\n attachedModel: room.attachedModel,\n ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),\n ...(room.untypedFolders === undefined ? {} : { untypedFolders: room.untypedFolders }),\n providerOwnedPaths: room.providerOwnedPaths,\n };\n }\n\n function page(room: MemoryRoom, from: number): BootstrapResult {\n const paths = Object.keys(room.documents ?? {}).sort();\n const size = pageSize ?? paths.length;\n const taken = paths.slice(from, from + size);\n const next = from + taken.length;\n const targets = from === 0 ? (room.binaryTargets ?? []) : [];\n return {\n kind: 'bootstrap',\n roomVersion: room.roomVersion,\n documents: named(room.documents ?? {}, taken),\n revisions: named(room.revisions ?? {}, taken),\n changes: named(room.changes ?? {}, [...taken, ...targets]),\n binaryTargets: targets,\n ...(next < paths.length ? { pageToken: String(next) } : {}),\n };\n }\n\n function advancement(room: MemoryRoom, from: MemoryRoom, at: number): RefreshResult {\n const current = room.documents ?? {};\n const previous = from.documents ?? {};\n const currentTargets = new Set(room.binaryTargets ?? []);\n const previousTargets = new Set(from.binaryTargets ?? []);\n const headMoved = (path: string) =>\n room.revisions?.[path] !== from.revisions?.[path] ||\n !sameChange(room.changes?.[path], from.changes?.[path]);\n const changed = Object.keys(current)\n .filter((path) => current[path] !== previous[path] || headMoved(path))\n .sort();\n const size = pageSize ?? changed.length;\n const taken = changed.slice(at, at + size);\n const next = at + taken.length;\n const opening = at === 0;\n const pageToken = next < changed.length ? `refresh-${refreshPages.size}` : undefined;\n if (pageToken !== undefined) refreshPages.set(pageToken, { room, from, at: next });\n const targets = opening\n ? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))\n : [];\n return {\n kind: 'net-advancement',\n roomVersion: room.roomVersion,\n documents: named(current, taken),\n revisions: named(room.revisions ?? {}, taken),\n changes: named(room.changes ?? {}, [...taken, ...targets]),\n binaryTargets: targets,\n removals: opening\n ? [\n ...Object.keys(previous).filter(\n (path) => !(path in current) && !currentTargets.has(path),\n ),\n ...[...previousTargets].filter(\n (target) => !currentTargets.has(target) && !(target in current),\n ),\n ].sort()\n : [],\n ...(pageToken === undefined ? {} : { pageToken }),\n };\n }\n\n function historyOf(conversation: MemoryConversation, after: unknown): ActionResult {\n const messages = conversation.messages ?? [];\n const first =\n typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;\n const from = first === -1 ? messages.length : first;\n const page = messages.slice(from, from + (historyPageSize ?? messages.length));\n const last = page.at(-1);\n const result: ConversationHistoryPage = {\n messages: page,\n ...(last !== undefined && from + page.length < messages.length\n ? { next: last.position }\n : {}),\n };\n return { kind: 'action', result };\n }\n\n function conversationAction(request: ActionRequest): ActionResult {\n const name = request.name as ConversationAction;\n const input = (request.input ?? {}) as {\n conversation?: unknown;\n turn?: unknown;\n after?: unknown;\n };\n if (name === 'conversation.create') {\n issued += 1;\n const conversation = `conversation-${issued}`;\n scripted.set(conversation, { conversation });\n return { kind: 'action', result: { conversation } };\n }\n const named = typeof input.conversation === 'string' ? input.conversation : '';\n const conversation = scripted.get(named);\n if (conversation === undefined) {\n return { kind: 'rejected', code: 'unknown-conversation', fields: { conversation: named } };\n }\n const outcome = conversation.outcomes?.[name];\n if (outcome !== undefined) return outcome;\n if (name === 'conversation.history') return historyOf(conversation, input.after);\n if (name === 'conversation.send') {\n issued += 1;\n const turn = `turn-${issued}`;\n unsealed.set(turn, named);\n return { kind: 'action', result: { turn } };\n }\n if (name === 'conversation.cancel') {\n const turn = typeof input.turn === 'string' ? input.turn : '';\n if (sealed.has(turn) || !unsealed.has(turn)) {\n return { kind: 'rejected', code: 'turn-sealed', fields: { turn } };\n }\n unsealed.delete(turn);\n return { kind: 'action', result: { turn, cancelled: true } };\n }\n if (name === 'conversation.delete') scripted.delete(named);\n return { kind: 'action', result: { conversation: named } };\n }\n\n function discovery(): DiscoverResult {\n return {\n kind: 'discovery',\n supportedVersions,\n mdModel,\n rooms: rooms.map(declared),\n capabilities,\n providerLimits,\n retention,\n };\n }\n\n return {\n setRooms(next) {\n rooms = [...next];\n retain(rooms);\n },\n setConversations(next) {\n scriptConversations(next);\n },\n notifyRoomVersion(notification) {\n for (const observer of observers) observer(notification);\n },\n notifyConversation(event) {\n if (event.kind === 'accepted-message') {\n sealed.add(event.message.turn);\n unsealed.delete(event.message.turn);\n }\n for (const listener of listeners) listener(event);\n },\n notifyServiceMode(mode) {\n for (const observer of modeObservers) observer(mode);\n },\n selectedRooms() {\n return selected;\n },\n replicatedConversations() {\n return replicated;\n },\n conversations: {\n replicate(next) {\n replicated = [...next];\n },\n observe(notify) {\n listeners.add(notify);\n return () => {\n listeners.delete(notify);\n };\n },\n },\n serviceMode: {\n observe(notify) {\n modeObservers.add(notify);\n return () => {\n modeObservers.delete(notify);\n };\n },\n },\n roomVersions: {\n select(locators) {\n selected = [...locators];\n },\n observe(notify) {\n observers.add(notify);\n return () => {\n observers.delete(notify);\n };\n },\n },\n script(operation, answer) {\n if (answer === undefined) delete scripts[operation];\n else scripts[operation] = answer;\n },\n async model(_authorization, request) {\n return resolveScript(\n scripts.model as Script<ModelResult, typeof request> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n const answer = request.attached === 'collection' ? room?.model : room?.selectionModel;\n return answer ?? { kind: 'model-unavailable', reason: 'not-readable' };\n },\n request,\n );\n },\n async authorize() {\n return resolveScript<Authorization, void>(\n scripts.authorize as Script<Authorization, void> | undefined,\n () => ({}),\n undefined,\n );\n },\n async discover(_authorization: Authorization) {\n return resolveScript<DiscoverResult, void>(\n scripts.discover as Script<DiscoverResult, void> | undefined,\n discovery,\n undefined,\n ).then((answer) => {\n if (answer.kind === 'discovery') for (const room of answer.rooms) note(room.locator, room);\n return answer;\n });\n },\n reached,\n async bootstrap(_authorization: Authorization, request: BootstrapRequest) {\n return resolveScript<BootstrapResult, BootstrapRequest>(\n scripts.bootstrap as Script<BootstrapResult, BootstrapRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return page(room, request.pageToken === undefined ? 0 : Number(request.pageToken));\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async refresh(_authorization: Authorization, request: RefreshRequest) {\n return resolveScript<RefreshResult, RefreshRequest>(\n scripts.refresh as Script<RefreshResult, RefreshRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n if (request.pageToken !== undefined) {\n const continuation = refreshPages.get(request.pageToken);\n if (\n continuation === undefined ||\n continuation.room.locator !== request.locator ||\n continuation.from.roomVersion !== request.fromRoomVersion\n ) {\n throw new Error('Invalid Refresh Page Token');\n }\n return advancement(continuation.room, continuation.from, continuation.at);\n }\n if (\n request.minPosition !== undefined &&\n !reached(room.locator, room.roomVersion, request.minPosition)\n ) {\n return { kind: 'retryable-refusal', code: 'replica_behind', fields: {} };\n }\n if (request.fromRoomVersion === room.roomVersion) {\n return { kind: 'still-current' };\n }\n const from = served.get(room.locator)?.get(request.fromRoomVersion);\n if (from === undefined) return { kind: 'beyond-horizon' };\n return advancement(room, from, 0);\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async mutate(_authorization: Authorization, request: MutationRequest) {\n return resolveScript<MutationResult, MutationRequest>(\n scripts.mutate as Script<MutationResult, MutationRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return { kind: 'rejected', code: 'unscripted-mutation', fields: {}, affected: {} };\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async history(_authorization: Authorization, request: HistoryRequest) {\n return resolveScript<HistoryResult, HistoryRequest>(\n scripts.history as Script<HistoryResult, HistoryRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return {\n kind: 'history',\n revisions: [],\n };\n },\n request,\n );\n },\n async action(_authorization: Authorization, request: ActionRequest) {\n return resolveScript<ActionResult, ActionRequest>(\n scripts.action as Script<ActionResult, ActionRequest> | undefined,\n () => {\n if (request.name.startsWith('conversation.')) return conversationAction(request);\n return { kind: 'rejected', code: 'unscripted-action', fields: {} };\n },\n request,\n ).then((answer) => {\n if (answer.kind === 'action' && answer.at !== undefined) note(answer.at.locator, answer.at);\n return answer;\n });\n },\n };\n}\n"],"names":["ROOM_CONTRACT_VERSION","MD_MODEL","sameChange","FIXTURE_RETENTION","history","kind","seconds","outcome","refreshHorizon","declaredRetention","value","retention","Number","isFinite","Error","named","source","paths","taken","path","undefined","resolveScript","answer","fallback","request","createMemoryAdapter","options","rooms","mdModel","supportedVersions","capabilities","providerLimits","pageSize","scripts","served","Map","refreshPages","observers","Set","listeners","modeObservers","scripted","unsealed","sealed","historyPageSize","selected","replicated","issued","scriptConversations","entries","clear","entry","set","conversation","conversations","ordinals","note","locator","roomVersion","key","String","has","size","reached","target","held","get","wanted","retain","room","versions","declared","name","operations","replica","attachedModel","typedSelection","untypedFolders","providerOwnedPaths","page","from","Object","keys","documents","sort","length","slice","next","targets","binaryTargets","revisions","changes","pageToken","advancement","at","current","previous","currentTargets","previousTargets","headMoved","changed","filter","opening","removals","historyOf","after","messages","first","findIndex","message","position","last","result","conversationAction","input","code","fields","outcomes","turn","delete","cancelled","discovery","map","setRooms","setConversations","notifyRoomVersion","notification","observer","notifyConversation","event","add","listener","notifyServiceMode","mode","selectedRooms","replicatedConversations","replicate","observe","notify","serviceMode","roomVersions","select","locators","script","operation","model","_authorization","find","attached","selectionModel","reason","authorize","discover","then","bootstrap","refresh","continuation","fromRoomVersion","minPosition","mutate","affected","action","startsWith"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/memory.ts"],"sourcesContent":["import type { ModelResult } from './model.js';\nimport {\n ROOM_CONTRACT_VERSION,\n type AcceptedMessage,\n type ActionRequest,\n type ActionResult,\n type Adapter,\n type Authorization,\n type BootstrapRequest,\n type BootstrapResult,\n type Capability,\n type ConversationAction,\n type ConversationEvent,\n type ConversationHistories,\n type ConversationHistoryPage,\n type DiscoverResult,\n type DiscoveredRoom,\n type HeadChange,\n type HistoryRequest,\n type HistoryResult,\n type MdModelIdentity,\n type MutationRequest,\n type MutationResult,\n type ProviderLimit,\n type RefreshRequest,\n type RefreshResult,\n type Retention,\n type RoomAttachment,\n type RoomVersionNotification,\n type ServiceMode,\n} from './adapter.js';\nimport { MD_MODEL } from './collection.js';\nimport { sameChange } from './overlay.js';\n\nconst FIXTURE_RETENTION: Retention = {\n history: { kind: 'duration', seconds: 1 },\n outcome: 1,\n refreshHorizon: 1,\n};\n\nfunction declaredRetention(value: Retention | undefined): Retention {\n const retention = value ?? FIXTURE_RETENTION;\n if (retention.history.kind === 'no-declared-time-bound') return retention;\n if (Number.isFinite(retention.history.seconds) && retention.history.seconds > 0) {\n return retention;\n }\n throw new Error('history retention duration must be a finite positive number of seconds');\n}\n\nexport type MemoryRoom = DiscoveredRoom & {\n model?: ModelResult;\n selectionModel?: ModelResult;\n documents?: Readonly<Record<string, string>>;\n revisions?: Readonly<Record<string, string>>;\n changes?: Readonly<Record<string, HeadChange>>;\n binaryTargets?: readonly string[];\n attachments?: readonly RoomAttachment[];\n};\n\nexport type MemoryConversation = {\n conversation: string;\n messages?: readonly AcceptedMessage[];\n outcomes?: Partial<Record<ConversationAction, ActionResult>>;\n};\n\nexport type MemoryAdapterOptions = {\n rooms?: readonly MemoryRoom[];\n conversations?: readonly MemoryConversation[];\n historyPageSize?: number;\n pageSize?: number;\n mdModel?: MdModelIdentity;\n supportedVersions?: readonly number[];\n capabilities?: readonly Capability[];\n providerLimits?: readonly ProviderLimit[];\n retention?: Retention;\n};\n\nexport type MemoryAdapter = Adapter & {\n setRooms(rooms: readonly MemoryRoom[]): void;\n setConversations(conversations: readonly MemoryConversation[]): void;\n script(operation: keyof Adapter, answer: unknown): void;\n notifyRoomVersion(notification: RoomVersionNotification): void;\n notifyConversation(event: ConversationEvent): void;\n notifyServiceMode(mode: ServiceMode): void;\n selectedRooms(): readonly string[];\n replicatedConversations(): readonly string[];\n};\n\ntype Script<T, R> = T | ((request: R) => T | Promise<T>);\n\ntype RefreshContinuation = {\n room: MemoryRoom;\n from: MemoryRoom;\n at: number;\n};\n\nfunction named<T>(\n source: Readonly<Record<string, T>>,\n paths: readonly string[],\n): Readonly<Record<string, T>> {\n const taken: Record<string, T> = {};\n for (const path of paths) {\n const value = source[path];\n if (value !== undefined) taken[path] = value;\n }\n return taken;\n}\n\nasync function resolveScript<T, R>(\n answer: Script<T, R> | undefined,\n fallback: () => T | Promise<T>,\n request: R,\n) {\n if (answer === undefined) return fallback();\n return typeof answer === 'function' ? (answer as (value: R) => T | Promise<T>)(request) : answer;\n}\n\nexport function createMemoryAdapter(options: MemoryAdapterOptions = {}): MemoryAdapter {\n let rooms = options.rooms === undefined ? [] : [...options.rooms];\n const mdModel = options.mdModel ?? MD_MODEL;\n const supportedVersions = options.supportedVersions ?? [ROOM_CONTRACT_VERSION];\n const capabilities = options.capabilities ?? [];\n const providerLimits = options.providerLimits ?? [];\n const retention = declaredRetention(options.retention);\n const pageSize = options.pageSize;\n const scripts: Partial<Record<keyof Adapter, unknown>> = {};\n const served = new Map<string, Map<string, MemoryRoom>>();\n const refreshPages = new Map<string, RefreshContinuation>();\n const observers = new Set<(notification: RoomVersionNotification) => void>();\n const listeners = new Set<(event: ConversationEvent) => void>();\n const modeObservers = new Set<(mode: ServiceMode) => void>();\n const scripted = new Map<string, MemoryConversation>();\n const unsealed = new Map<string, string>();\n const sealed = new Set<string>();\n const historyPageSize = options.historyPageSize;\n let selected: readonly string[] = [];\n let replicated: readonly string[] = [];\n let issued = 0;\n\n function scriptConversations(entries: readonly MemoryConversation[]) {\n scripted.clear();\n for (const entry of entries) scripted.set(entry.conversation, entry);\n }\n\n scriptConversations(options.conversations ?? []);\n\n const ordinals = new Map<string, number>();\n\n function note<T>(locator: string, answer: T): T {\n const roomVersion = (answer as { roomVersion?: unknown }).roomVersion;\n const key = `${locator}\\u0000${String(roomVersion)}`;\n if (typeof roomVersion === 'string' && !ordinals.has(key)) ordinals.set(key, ordinals.size);\n return answer;\n }\n\n function reached(locator: string, roomVersion: string, target: string): boolean {\n const scripted = scripts.reached as\n | boolean\n | ((locator: string, roomVersion: string, target: string) => boolean)\n | undefined;\n if (typeof scripted === 'boolean') return scripted;\n if (scripted !== undefined) return scripted(locator, roomVersion, target);\n if (roomVersion === target) return true;\n const held = ordinals.get(`${locator}\\u0000${roomVersion}`);\n const wanted = ordinals.get(`${locator}\\u0000${target}`);\n return held !== undefined && wanted !== undefined && held >= wanted;\n }\n\n function retain(entries: readonly MemoryRoom[]) {\n for (const room of entries) {\n note(room.locator, room);\n const versions = served.get(room.locator) ?? new Map<string, MemoryRoom>();\n versions.set(room.roomVersion, room);\n served.set(room.locator, versions);\n }\n }\n\n retain(rooms);\n\n function declared(room: MemoryRoom): DiscoveredRoom {\n return {\n name: room.name,\n locator: room.locator,\n roomVersion: room.roomVersion,\n operations: room.operations,\n replica: room.replica,\n attachedModel: room.attachedModel,\n ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),\n ...(room.untypedFolders === undefined ? {} : { untypedFolders: room.untypedFolders }),\n providerOwnedPaths: room.providerOwnedPaths,\n };\n }\n\n function page(room: MemoryRoom, from: number): BootstrapResult {\n const paths = Object.keys(room.documents ?? {}).sort();\n const size = pageSize ?? paths.length;\n const taken = paths.slice(from, from + size);\n const next = from + taken.length;\n const targets = from === 0 ? (room.binaryTargets ?? []) : [];\n return {\n kind: 'bootstrap',\n roomVersion: room.roomVersion,\n documents: named(room.documents ?? {}, taken),\n revisions: named(room.revisions ?? {}, taken),\n changes: named(room.changes ?? {}, [...taken, ...targets]),\n binaryTargets: targets,\n ...(from === 0 && room.attachments !== undefined ? { attachments: room.attachments } : {}),\n ...(next < paths.length ? { pageToken: String(next) } : {}),\n };\n }\n\n function advancement(room: MemoryRoom, from: MemoryRoom, at: number): RefreshResult {\n const current = room.documents ?? {};\n const previous = from.documents ?? {};\n const currentTargets = new Set(room.binaryTargets ?? []);\n const previousTargets = new Set(from.binaryTargets ?? []);\n const headMoved = (path: string) =>\n room.revisions?.[path] !== from.revisions?.[path] ||\n !sameChange(room.changes?.[path], from.changes?.[path]);\n const changed = Object.keys(current)\n .filter((path) => current[path] !== previous[path] || headMoved(path))\n .sort();\n const size = pageSize ?? changed.length;\n const taken = changed.slice(at, at + size);\n const next = at + taken.length;\n const opening = at === 0;\n const pageToken = next < changed.length ? `refresh-${refreshPages.size}` : undefined;\n if (pageToken !== undefined) refreshPages.set(pageToken, { room, from, at: next });\n const targets = opening\n ? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))\n : [];\n const attachments = room.attachments ?? [];\n const declared =\n opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);\n return {\n kind: 'net-advancement',\n roomVersion: room.roomVersion,\n documents: named(current, taken),\n revisions: named(room.revisions ?? {}, taken),\n changes: named(room.changes ?? {}, [...taken, ...targets]),\n binaryTargets: targets,\n removals: opening\n ? [\n ...Object.keys(previous).filter(\n (path) => !(path in current) && !currentTargets.has(path),\n ),\n ...[...previousTargets].filter(\n (target) => !currentTargets.has(target) && !(target in current),\n ),\n ].sort()\n : [],\n ...(declared ? { attachments } : {}),\n ...(pageToken === undefined ? {} : { pageToken }),\n };\n }\n\n function pageOf(conversation: MemoryConversation, after: unknown): ConversationHistoryPage {\n const messages = conversation.messages ?? [];\n const first =\n typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;\n const from = first === -1 ? messages.length : first;\n const page = messages.slice(from, from + (historyPageSize ?? messages.length));\n const last = page.at(-1);\n return {\n conversation: conversation.conversation,\n messages: page,\n ...(last !== undefined && from + page.length < messages.length\n ? { next: last.position }\n : {}),\n };\n }\n\n function historiesOf(input: unknown): ActionResult {\n const asked = (input as { conversations?: unknown } | null)?.conversations;\n if (!Array.isArray(asked)) return { kind: 'rejected', code: 'invalid_request', fields: {} };\n const histories: ConversationHistoryPage[] = [];\n for (const entry of asked as readonly { conversation?: unknown; after?: unknown }[]) {\n const conversation =\n typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;\n if (conversation === undefined) continue;\n const outcome = conversation.outcomes?.['conversation.history'];\n if (outcome !== undefined) return outcome;\n histories.push(pageOf(conversation, entry.after));\n }\n const result: ConversationHistories = { histories };\n return { kind: 'action', result };\n }\n\n function conversationAction(request: ActionRequest): ActionResult {\n const name = request.name as ConversationAction;\n const input = (request.input ?? {}) as {\n conversation?: unknown;\n turn?: unknown;\n };\n if (name === 'conversation.history') return historiesOf(request.input);\n if (name === 'conversation.create') {\n issued += 1;\n const conversation = `conversation-${issued}`;\n scripted.set(conversation, { conversation });\n return { kind: 'action', result: { conversation } };\n }\n const named = typeof input.conversation === 'string' ? input.conversation : '';\n const conversation = scripted.get(named);\n if (conversation === undefined) {\n return { kind: 'rejected', code: 'unknown-conversation', fields: { conversation: named } };\n }\n const outcome = conversation.outcomes?.[name];\n if (outcome !== undefined) return outcome;\n if (name === 'conversation.send') {\n issued += 1;\n const turn = `turn-${issued}`;\n unsealed.set(turn, named);\n return { kind: 'action', result: { turn } };\n }\n if (name === 'conversation.cancel') {\n const turn = typeof input.turn === 'string' ? input.turn : '';\n if (sealed.has(turn) || !unsealed.has(turn)) {\n return { kind: 'rejected', code: 'turn-sealed', fields: { turn } };\n }\n unsealed.delete(turn);\n return { kind: 'action', result: { turn, cancelled: true } };\n }\n if (name === 'conversation.delete') scripted.delete(named);\n return { kind: 'action', result: { conversation: named } };\n }\n\n function discovery(): DiscoverResult {\n return {\n kind: 'discovery',\n supportedVersions,\n mdModel,\n rooms: rooms.map(declared),\n capabilities,\n providerLimits,\n retention,\n };\n }\n\n return {\n setRooms(next) {\n rooms = [...next];\n retain(rooms);\n },\n setConversations(next) {\n scriptConversations(next);\n },\n notifyRoomVersion(notification) {\n for (const observer of observers) observer(notification);\n },\n notifyConversation(event) {\n if (event.kind === 'accepted-message') {\n sealed.add(event.message.turn);\n unsealed.delete(event.message.turn);\n }\n for (const listener of listeners) listener(event);\n },\n notifyServiceMode(mode) {\n for (const observer of modeObservers) observer(mode);\n },\n selectedRooms() {\n return selected;\n },\n replicatedConversations() {\n return replicated;\n },\n conversations: {\n replicate(next) {\n replicated = [...next];\n },\n observe(notify) {\n listeners.add(notify);\n return () => {\n listeners.delete(notify);\n };\n },\n },\n serviceMode: {\n observe(notify) {\n modeObservers.add(notify);\n return () => {\n modeObservers.delete(notify);\n };\n },\n },\n roomVersions: {\n select(locators) {\n selected = [...locators];\n },\n observe(notify) {\n observers.add(notify);\n return () => {\n observers.delete(notify);\n };\n },\n },\n script(operation, answer) {\n if (answer === undefined) delete scripts[operation];\n else scripts[operation] = answer;\n },\n async model(_authorization, request) {\n return resolveScript(\n scripts.model as Script<ModelResult, typeof request> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n const answer = request.attached === 'collection' ? room?.model : room?.selectionModel;\n return answer ?? { kind: 'model-unavailable', reason: 'not-readable' };\n },\n request,\n );\n },\n async authorize() {\n return resolveScript<Authorization, void>(\n scripts.authorize as Script<Authorization, void> | undefined,\n () => ({}),\n undefined,\n );\n },\n async discover(_authorization: Authorization) {\n return resolveScript<DiscoverResult, void>(\n scripts.discover as Script<DiscoverResult, void> | undefined,\n discovery,\n undefined,\n ).then((answer) => {\n if (answer.kind === 'discovery') for (const room of answer.rooms) note(room.locator, room);\n return answer;\n });\n },\n reached,\n async bootstrap(_authorization: Authorization, request: BootstrapRequest) {\n return resolveScript<BootstrapResult, BootstrapRequest>(\n scripts.bootstrap as Script<BootstrapResult, BootstrapRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return page(room, request.pageToken === undefined ? 0 : Number(request.pageToken));\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async refresh(_authorization: Authorization, request: RefreshRequest) {\n return resolveScript<RefreshResult, RefreshRequest>(\n scripts.refresh as Script<RefreshResult, RefreshRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n if (request.pageToken !== undefined) {\n const continuation = refreshPages.get(request.pageToken);\n if (\n continuation === undefined ||\n continuation.room.locator !== request.locator ||\n continuation.from.roomVersion !== request.fromRoomVersion\n ) {\n throw new Error('Invalid Refresh Page Token');\n }\n return advancement(continuation.room, continuation.from, continuation.at);\n }\n if (\n request.minPosition !== undefined &&\n !reached(room.locator, room.roomVersion, request.minPosition)\n ) {\n return { kind: 'retryable-refusal', code: 'replica_behind', fields: {} };\n }\n if (request.fromRoomVersion === room.roomVersion) {\n return { kind: 'still-current' };\n }\n const from = served.get(room.locator)?.get(request.fromRoomVersion);\n if (from === undefined) return { kind: 'beyond-horizon' };\n return advancement(room, from, 0);\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async mutate(_authorization: Authorization, request: MutationRequest) {\n return resolveScript<MutationResult, MutationRequest>(\n scripts.mutate as Script<MutationResult, MutationRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return { kind: 'rejected', code: 'unscripted-mutation', fields: {}, affected: {} };\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async history(_authorization: Authorization, request: HistoryRequest) {\n return resolveScript<HistoryResult, HistoryRequest>(\n scripts.history as Script<HistoryResult, HistoryRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return {\n kind: 'history',\n revisions: [],\n };\n },\n request,\n );\n },\n async action(_authorization: Authorization, request: ActionRequest) {\n return resolveScript<ActionResult, ActionRequest>(\n scripts.action as Script<ActionResult, ActionRequest> | undefined,\n () => {\n if (request.name.startsWith('conversation.')) return conversationAction(request);\n return { kind: 'rejected', code: 'unscripted-action', fields: {} };\n },\n request,\n ).then((answer) => {\n if (answer.kind === 'action' && answer.at !== undefined) note(answer.at.locator, answer.at);\n return answer;\n });\n },\n };\n}\n"],"names":["ROOM_CONTRACT_VERSION","MD_MODEL","sameChange","FIXTURE_RETENTION","history","kind","seconds","outcome","refreshHorizon","declaredRetention","value","retention","Number","isFinite","Error","named","source","paths","taken","path","undefined","resolveScript","answer","fallback","request","createMemoryAdapter","options","rooms","mdModel","supportedVersions","capabilities","providerLimits","pageSize","scripts","served","Map","refreshPages","observers","Set","listeners","modeObservers","scripted","unsealed","sealed","historyPageSize","selected","replicated","issued","scriptConversations","entries","clear","entry","set","conversation","conversations","ordinals","note","locator","roomVersion","key","String","has","size","reached","target","held","get","wanted","retain","room","versions","declared","name","operations","replica","attachedModel","typedSelection","untypedFolders","providerOwnedPaths","page","from","Object","keys","documents","sort","length","slice","next","targets","binaryTargets","revisions","changes","attachments","pageToken","advancement","at","current","previous","currentTargets","previousTargets","headMoved","changed","filter","opening","JSON","stringify","removals","pageOf","after","messages","first","findIndex","message","position","last","historiesOf","input","asked","Array","isArray","code","fields","histories","outcomes","push","result","conversationAction","turn","delete","cancelled","discovery","map","setRooms","setConversations","notifyRoomVersion","notification","observer","notifyConversation","event","add","listener","notifyServiceMode","mode","selectedRooms","replicatedConversations","replicate","observe","notify","serviceMode","roomVersions","select","locators","script","operation","model","_authorization","find","attached","selectionModel","reason","authorize","discover","then","bootstrap","refresh","continuation","fromRoomVersion","minPosition","mutate","affected","action","startsWith"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,UAAU,EAAE,MAAM,OAAO,EACzB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,CAAC,cAAc,CAAC,CAiEzB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,UAAU,EAAE,MAAM,OAAO,EACzB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,CAAC,cAAc,CAAC,CAqEzB"}
package/dist/refresh.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { declaredAttachments } from './attachment.js';
1
2
  import { readStaged } from './replica.js';
2
3
  import { unconfirmed } from './transfer.js';
3
4
  export async function refreshRoom(adapter, authorization, confirmed, continuing, minPosition) {
@@ -23,7 +24,9 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing,
23
24
  ...confirmed.record.changes
24
25
  };
25
26
  const binaryTargets = new Set(confirmed.record.binaryTargets);
27
+ const attachments = [];
26
28
  const stage = (page)=>{
29
+ if (page.attachments !== undefined) attachments.push(page.attachments);
27
30
  Object.assign(documents, page.documents);
28
31
  Object.assign(revisions, page.revisions);
29
32
  for (const path of Object.keys(page.documents)){
@@ -71,7 +74,8 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing,
71
74
  ...binaryTargets
72
75
  ].sort(),
73
76
  revisions,
74
- changes
77
+ changes,
78
+ attachments: attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments)
75
79
  }, confirmed);
76
80
  return staged.kind === 'staged' ? {
77
81
  kind: 'advanced',
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type {\n Adapter,\n AdapterFailure,\n Authorization,\n HeadChange,\n RefreshPage,\n RetryableRefusal,\n} from './adapter.js';\nimport { readStaged, type ConfirmedLayer } from './replica.js';\nimport { unconfirmed, type Refused, type Unconfirmed } from './transfer.js';\n\nexport type RefreshOutcome =\n | { kind: 'still-current' }\n | { kind: 'advanced'; confirmed: ConfirmedLayer }\n | { kind: 'beyond-horizon' }\n | RetryableRefusal\n | Unconfirmed\n | Refused\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n continuing: () => boolean,\n minPosition: string | undefined,\n): Promise<RefreshOutcome> {\n const locator = confirmed.record.locator;\n const fromRoomVersion = confirmed.record.roomVersion;\n const first = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\n });\n if (first.kind !== 'net-advancement') return first;\n const roomVersion = first.roomVersion;\n const documents: Record<string, string> = { ...confirmed.record.documents };\n const revisions: Record<string, string> = { ...confirmed.record.revisions };\n const changes: Record<string, HeadChange> = { ...confirmed.record.changes };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n const stage = (page: RefreshPage) => {\n Object.assign(documents, page.documents);\n Object.assign(revisions, page.revisions);\n for (const path of Object.keys(page.documents)) {\n binaryTargets.delete(path);\n delete changes[path];\n }\n for (const target of page.binaryTargets) {\n delete documents[target];\n delete revisions[target];\n delete changes[target];\n binaryTargets.add(target);\n }\n Object.assign(changes, page.changes);\n for (const path of page.removals) {\n delete documents[path];\n delete revisions[path];\n delete changes[path];\n binaryTargets.delete(path);\n }\n };\n stage(first);\n let pageToken = first.pageToken;\n while (pageToken !== undefined) {\n if (!continuing()) return unconfirmed;\n const page = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\n pageToken,\n });\n if (page.kind === 'still-current' || page.kind === 'beyond-horizon') return unconfirmed;\n if (page.kind !== 'net-advancement') return page;\n if (page.roomVersion !== roomVersion) return unconfirmed;\n stage(page);\n pageToken = page.pageToken;\n }\n const staged = readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents,\n binaryTargets: [...binaryTargets].sort(),\n revisions,\n changes,\n },\n confirmed,\n );\n return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;\n}\n"],"names":["readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","continuing","minPosition","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","undefined","kind","documents","revisions","changes","binaryTargets","Set","stage","page","Object","assign","path","keys","delete","target","add","removals","pageToken","staged","sort"],"mappings":"AAQA,SAASA,UAAU,QAA6B,eAAe;AAC/D,SAASC,WAAW,QAAwC,gBAAgB;AAW5E,OAAO,eAAeC,YACpBC,OAAgB,EAChBC,aAA4B,EAC5BC,SAAyB,EACzBC,UAAyB,EACzBC,WAA+B;IAE/B,MAAMC,UAAUH,UAAUI,MAAM,CAACD,OAAO;IACxC,MAAME,kBAAkBL,UAAUI,MAAM,CAACE,WAAW;IACpD,MAAMC,QAAQ,MAAMT,QAAQU,OAAO,CAACT,eAAe;QACjDI;QACAM,WAAWT,UAAUI,MAAM,CAACM,OAAO,CAACD,SAAS;QAC7CJ;QACA,GAAIH,gBAAgBS,YAAY,CAAC,IAAI;YAAET;QAAY,CAAC;IACtD;IACA,IAAIK,MAAMK,IAAI,KAAK,mBAAmB,OAAOL;IAC7C,MAAMD,cAAcC,MAAMD,WAAW;IACrC,MAAMO,YAAoC;QAAE,GAAGb,UAAUI,MAAM,CAACS,SAAS;IAAC;IAC1E,MAAMC,YAAoC;QAAE,GAAGd,UAAUI,MAAM,CAACU,SAAS;IAAC;IAC1E,MAAMC,UAAsC;QAAE,GAAGf,UAAUI,MAAM,CAACW,OAAO;IAAC;IAC1E,MAAMC,gBAAgB,IAAIC,IAAIjB,UAAUI,MAAM,CAACY,aAAa;IAC5D,MAAME,QAAQ,CAACC;QACbC,OAAOC,MAAM,CAACR,WAAWM,KAAKN,SAAS;QACvCO,OAAOC,MAAM,CAACP,WAAWK,KAAKL,SAAS;QACvC,KAAK,MAAMQ,QAAQF,OAAOG,IAAI,CAACJ,KAAKN,SAAS,EAAG;YAC9CG,cAAcQ,MAAM,CAACF;YACrB,OAAOP,OAAO,CAACO,KAAK;QACtB;QACA,KAAK,MAAMG,UAAUN,KAAKH,aAAa,CAAE;YACvC,OAAOH,SAAS,CAACY,OAAO;YACxB,OAAOX,SAAS,CAACW,OAAO;YACxB,OAAOV,OAAO,CAACU,OAAO;YACtBT,cAAcU,GAAG,CAACD;QACpB;QACAL,OAAOC,MAAM,CAACN,SAASI,KAAKJ,OAAO;QACnC,KAAK,MAAMO,QAAQH,KAAKQ,QAAQ,CAAE;YAChC,OAAOd,SAAS,CAACS,KAAK;YACtB,OAAOR,SAAS,CAACQ,KAAK;YACtB,OAAOP,OAAO,CAACO,KAAK;YACpBN,cAAcQ,MAAM,CAACF;QACvB;IACF;IACAJ,MAAMX;IACN,IAAIqB,YAAYrB,MAAMqB,SAAS;IAC/B,MAAOA,cAAcjB,UAAW;QAC9B,IAAI,CAACV,cAAc,OAAOL;QAC1B,MAAMuB,OAAO,MAAMrB,QAAQU,OAAO,CAACT,eAAe;YAChDI;YACAM,WAAWT,UAAUI,MAAM,CAACM,OAAO,CAACD,SAAS;YAC7CJ;YACA,GAAIH,gBAAgBS,YAAY,CAAC,IAAI;gBAAET;YAAY,CAAC;YACpD0B;QACF;QACA,IAAIT,KAAKP,IAAI,KAAK,mBAAmBO,KAAKP,IAAI,KAAK,kBAAkB,OAAOhB;QAC5E,IAAIuB,KAAKP,IAAI,KAAK,mBAAmB,OAAOO;QAC5C,IAAIA,KAAKb,WAAW,KAAKA,aAAa,OAAOV;QAC7CsB,MAAMC;QACNS,YAAYT,KAAKS,SAAS;IAC5B;IACA,MAAMC,SAASlC,WACb;QACE,GAAGK,UAAUI,MAAM;QACnBE;QACAO;QACAG,eAAe;eAAIA;SAAc,CAACc,IAAI;QACtChB;QACAC;IACF,GACAf;IAEF,OAAO6B,OAAOjB,IAAI,KAAK,WAAW;QAAEA,MAAM;QAAYZ,WAAW6B,OAAO7B,SAAS;IAAC,IAAI6B;AACxF"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type {\n Adapter,\n AdapterFailure,\n Authorization,\n HeadChange,\n RefreshPage,\n RetryableRefusal,\n RoomAttachment,\n} from './adapter.js';\nimport { declaredAttachments } from './attachment.js';\nimport { readStaged, type ConfirmedLayer } from './replica.js';\nimport { unconfirmed, type Refused, type Unconfirmed } from './transfer.js';\n\nexport type RefreshOutcome =\n | { kind: 'still-current' }\n | { kind: 'advanced'; confirmed: ConfirmedLayer }\n | { kind: 'beyond-horizon' }\n | RetryableRefusal\n | Unconfirmed\n | Refused\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n continuing: () => boolean,\n minPosition: string | undefined,\n): Promise<RefreshOutcome> {\n const locator = confirmed.record.locator;\n const fromRoomVersion = confirmed.record.roomVersion;\n const first = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\n });\n if (first.kind !== 'net-advancement') return first;\n const roomVersion = first.roomVersion;\n const documents: Record<string, string> = { ...confirmed.record.documents };\n const revisions: Record<string, string> = { ...confirmed.record.revisions };\n const changes: Record<string, HeadChange> = { ...confirmed.record.changes };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n const attachments: (readonly RoomAttachment[])[] = [];\n const stage = (page: RefreshPage) => {\n if (page.attachments !== undefined) attachments.push(page.attachments);\n Object.assign(documents, page.documents);\n Object.assign(revisions, page.revisions);\n for (const path of Object.keys(page.documents)) {\n binaryTargets.delete(path);\n delete changes[path];\n }\n for (const target of page.binaryTargets) {\n delete documents[target];\n delete revisions[target];\n delete changes[target];\n binaryTargets.add(target);\n }\n Object.assign(changes, page.changes);\n for (const path of page.removals) {\n delete documents[path];\n delete revisions[path];\n delete changes[path];\n binaryTargets.delete(path);\n }\n };\n stage(first);\n let pageToken = first.pageToken;\n while (pageToken !== undefined) {\n if (!continuing()) return unconfirmed;\n const page = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\n pageToken,\n });\n if (page.kind === 'still-current' || page.kind === 'beyond-horizon') return unconfirmed;\n if (page.kind !== 'net-advancement') return page;\n if (page.roomVersion !== roomVersion) return unconfirmed;\n stage(page);\n pageToken = page.pageToken;\n }\n const staged = readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents,\n binaryTargets: [...binaryTargets].sort(),\n revisions,\n changes,\n attachments:\n attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments),\n },\n confirmed,\n );\n return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;\n}\n"],"names":["declaredAttachments","readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","continuing","minPosition","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","undefined","kind","documents","revisions","changes","binaryTargets","Set","attachments","stage","page","push","Object","assign","path","keys","delete","target","add","removals","pageToken","staged","sort","length"],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { ModelState } from './model.js';
2
- import type { Capability, Discovery, HeadChange, OperationScopes, ProviderLimit, ReplicaAdmission, TypedSelection } from './adapter.js';
2
+ import type { Capability, Discovery, HeadChange, OperationScopes, ProviderLimit, ReplicaAdmission, RoomAttachment, TypedSelection } from './adapter.js';
3
3
  import type { AcceptedMessage } from './adapter.js';
4
4
  import type { ChangeBatch } from './change.js';
5
5
  import type { ChatDraftFile } from './file.js';
@@ -21,6 +21,7 @@ export type ReplicaRecord = {
21
21
  binaryTargets: readonly string[];
22
22
  revisions: Readonly<Record<string, string>>;
23
23
  changes: Readonly<Record<string, HeadChange>>;
24
+ attachments: readonly RoomAttachment[];
24
25
  };
25
26
  export type PendingState = {
26
27
  readonly drafts: readonly SavedDraft[];
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/store.js CHANGED
@@ -3,6 +3,7 @@ const DATABASE = 'mdruntime';
3
3
  const ROOMS = 'rooms';
4
4
  const DOCUMENTS = 'documents';
5
5
  const BINARY_TARGETS = 'binaryTargets';
6
+ const ATTACHMENTS = 'attachments';
6
7
  const PENDING_CHANGES = 'pendingChanges';
7
8
  const OUTCOMES = 'outcomes';
8
9
  const DECLARATIONS = 'declarations';
@@ -12,7 +13,7 @@ const CONVERSATIONS = 'conversations';
12
13
  const MESSAGES = 'messages';
13
14
  const CHAT_DRAFTS = 'chatDrafts';
14
15
  const CURRENT = 'current';
15
- const SCHEMA = 17;
16
+ const SCHEMA = 18;
16
17
  function settled(request) {
17
18
  return new Promise((resolve, reject)=>{
18
19
  request.onsuccess = ()=>resolve(request.result);
@@ -63,7 +64,7 @@ function amendPending(database, locator, id, amendment) {
63
64
  return completed(transaction);
64
65
  }
65
66
  function roomRecord(record, queue) {
66
- const { documents, binaryTargets, revisions, changes, ...room } = record;
67
+ const { documents, binaryTargets, revisions, changes, attachments, ...room } = record;
67
68
  return {
68
69
  ...room,
69
70
  order: queue.map((batch)=>batch.id)
@@ -106,6 +107,12 @@ export async function openRuntimeStore() {
106
107
  'path'
107
108
  ]
108
109
  });
110
+ database.createObjectStore(ATTACHMENTS, {
111
+ keyPath: [
112
+ 'locator',
113
+ 'reference'
114
+ ]
115
+ });
109
116
  database.createObjectStore(PENDING_CHANGES, {
110
117
  keyPath: [
111
118
  'locator',
@@ -146,12 +153,14 @@ export async function openRuntimeStore() {
146
153
  const transaction = database.transaction([
147
154
  ROOMS,
148
155
  DOCUMENTS,
149
- BINARY_TARGETS
156
+ BINARY_TARGETS,
157
+ ATTACHMENTS
150
158
  ], 'readonly');
151
- const [rooms, documents, targets] = await Promise.all([
159
+ const [rooms, documents, targets, attachments] = await Promise.all([
152
160
  settled(transaction.objectStore(ROOMS).getAll()),
153
161
  settled(transaction.objectStore(DOCUMENTS).getAll()),
154
- settled(transaction.objectStore(BINARY_TARGETS).getAll())
162
+ settled(transaction.objectStore(BINARY_TARGETS).getAll()),
163
+ settled(transaction.objectStore(ATTACHMENTS).getAll())
155
164
  ]);
156
165
  const byRoom = new Map();
157
166
  for (const { order, ...room } of rooms){
@@ -160,7 +169,8 @@ export async function openRuntimeStore() {
160
169
  documents: {},
161
170
  revisions: {},
162
171
  changes: {},
163
- binaryTargets: []
172
+ binaryTargets: [],
173
+ attachments: []
164
174
  });
165
175
  }
166
176
  const head = (room, held)=>{
@@ -183,6 +193,11 @@ export async function openRuntimeStore() {
183
193
  room.binaryTargets.push(target.path);
184
194
  head(room, target);
185
195
  }
196
+ for (const { locator, ...attachment } of attachments){
197
+ const room = byRoom.get(locator);
198
+ if (room === undefined) continue;
199
+ room.attachments.push(attachment);
200
+ }
186
201
  return [
187
202
  ...byRoom.values()
188
203
  ];
@@ -192,6 +207,7 @@ export async function openRuntimeStore() {
192
207
  ROOMS,
193
208
  DOCUMENTS,
194
209
  BINARY_TARGETS,
210
+ ATTACHMENTS,
195
211
  PENDING_CHANGES,
196
212
  OUTCOMES,
197
213
  ROOM_DRAFTS
@@ -233,6 +249,25 @@ export async function openRuntimeStore() {
233
249
  });
234
250
  }
235
251
  }
252
+ const attachments = transaction.objectStore(ATTACHMENTS);
253
+ const held = new Map((previous?.attachments ?? []).map((attachment)=>[
254
+ attachment.reference,
255
+ attachment
256
+ ]));
257
+ const declared = new Set(next.attachments.map((attachment)=>attachment.reference));
258
+ for (const reference of held.keys()){
259
+ if (!declared.has(reference)) attachments.delete([
260
+ next.locator,
261
+ reference
262
+ ]);
263
+ }
264
+ for (const attachment of next.attachments){
265
+ if (held.get(attachment.reference) === attachment) continue;
266
+ attachments.put({
267
+ ...attachment,
268
+ locator: next.locator
269
+ });
270
+ }
236
271
  if (previousQueue !== undefined) {
237
272
  const pending = transaction.objectStore(PENDING_CHANGES);
238
273
  const before = new Set(previousQueue.map((batch)=>batch.id));
@@ -477,6 +512,7 @@ export async function openRuntimeStore() {
477
512
  ROOMS,
478
513
  DOCUMENTS,
479
514
  BINARY_TARGETS,
515
+ ATTACHMENTS,
480
516
  PENDING_CHANGES,
481
517
  OUTCOMES,
482
518
  ROOM_DRAFTS
@@ -486,6 +522,7 @@ export async function openRuntimeStore() {
486
522
  for (const name of [
487
523
  DOCUMENTS,
488
524
  BINARY_TARGETS,
525
+ ATTACHMENTS,
489
526
  PENDING_CHANGES,
490
527
  ROOM_DRAFTS
491
528
  ]){
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/store.ts"],"sourcesContent":["import type { ModelState } from './model.js';\nimport type {\n Capability,\n Discovery,\n HeadChange,\n OperationScopes,\n ProviderLimit,\n ReplicaAdmission,\n TypedSelection,\n} from './adapter.js';\nimport type { AcceptedMessage } from './adapter.js';\nimport type { ChangeBatch } from './change.js';\nimport { sameChange } from './overlay.js';\nimport type { ChatDraftFile } from './file.js';\nimport type { Submission, SubmissionOutcome } from './outcome.js';\nimport type { RoomDraftRecord, SavedDraft } from './room-draft.js';\n\nconst DATABASE = 'mdruntime';\nconst ROOMS = 'rooms';\nconst DOCUMENTS = 'documents';\nconst BINARY_TARGETS = 'binaryTargets';\nconst PENDING_CHANGES = 'pendingChanges';\nconst OUTCOMES = 'outcomes';\nconst DECLARATIONS = 'declarations';\nconst ROOM_DRAFTS = 'roomDrafts';\nconst PRESENTATION = 'presentation';\nconst CONVERSATIONS = 'conversations';\nconst MESSAGES = 'messages';\nconst CHAT_DRAFTS = 'chatDrafts';\nconst CURRENT = 'current';\nconst SCHEMA = 17;\n\nexport type ReplicaRecord = {\n locator: string;\n name: string;\n operations: OperationScopes;\n replica: ReplicaAdmission;\n model: ModelState;\n attachedModel: import('./model.js').ModelIdentity | null;\n typedSelection: TypedSelection | null;\n selectionModel: ModelState;\n untypedFolders: readonly string[];\n providerOwnedPaths: readonly string[];\n roomVersion: string;\n documents: Readonly<Record<string, string>>;\n binaryTargets: readonly string[];\n revisions: Readonly<Record<string, string>>;\n changes: Readonly<Record<string, HeadChange>>;\n};\n\ntype RoomRecord = Omit<ReplicaRecord, 'documents' | 'binaryTargets' | 'revisions' | 'changes'> & {\n order: readonly string[];\n};\n\ntype DocumentRecord = {\n locator: string;\n path: string;\n content: string;\n revision: string | null;\n change: HeadChange | null;\n};\n\ntype BinaryTargetRecord = {\n locator: string;\n path: string;\n revision: string | null;\n change: HeadChange | null;\n};\n\nexport type PendingState = {\n readonly drafts: readonly SavedDraft[];\n readonly submission: Submission;\n readonly lost: boolean;\n readonly upload?: unknown;\n};\n\ntype PendingChangeRecord = PendingState & {\n locator: string;\n id: string;\n batch: ChangeBatch;\n};\n\nexport type OutcomeRecord = {\n locator: string;\n id: string;\n outcome: SubmissionOutcome;\n};\n\ntype DeclarationRecord = {\n lastCompleted: string | null;\n generation: string | null;\n providerLimits: readonly ProviderLimit[];\n capabilities: readonly Capability[];\n slots: NonNullable<Discovery['slots']>;\n};\n\nexport type QueueRecord = {\n locator: string;\n pending: readonly { batch: ChangeBatch; state: PendingState }[];\n};\n\nexport type PresentationRecord = {\n app: string;\n value: unknown;\n};\n\ntype ConversationRecord = {\n conversation: string;\n read: string | null;\n};\n\ntype MessageRecord = AcceptedMessage & { conversation: string };\n\nexport type HeldConversation = {\n conversation: string;\n read: string | null | undefined;\n messages: readonly AcceptedMessage[];\n};\n\nexport type ConversationWrite = {\n conversation: string;\n messages: readonly AcceptedMessage[];\n read?: string | null;\n sealed?: boolean;\n};\n\nexport type ChatDraftRecord = {\n conversation: string;\n text: string;\n files: readonly ChatDraftFile[];\n turn: string | null;\n};\n\nexport type RecordWrite = {\n next: ReplicaRecord;\n previous: ReplicaRecord | null;\n queue: readonly ChangeBatch[];\n previousQueue?: readonly ChangeBatch[];\n saved?: readonly SavedDraft[];\n outcomes?: readonly { id: string; outcome: SubmissionOutcome | null }[];\n roomDrafts?: readonly RoomDraftRecord[];\n consumedRoomDrafts?: readonly string[];\n};\n\nexport type RuntimeStore = {\n all(): Promise<readonly ReplicaRecord[]>;\n write(input: RecordWrite): Promise<void>;\n revokeModels(\n records: readonly { record: ReplicaRecord; queue: readonly ChangeBatch[] }[],\n ): Promise<void>;\n lastCompleted(): Promise<string | null>;\n complete(at: string): Promise<void>;\n providerLimits(): Promise<readonly ProviderLimit[]>;\n capabilities(): Promise<readonly Capability[]>;\n slots(): Promise<NonNullable<Discovery['slots']>>;\n declare(\n limits: readonly ProviderLimit[],\n capabilities: readonly Capability[],\n slots: NonNullable<Discovery['slots']>,\n ): Promise<void>;\n queues(): Promise<readonly QueueRecord[]>;\n outcomes(): Promise<readonly OutcomeRecord[]>;\n submit(locator: string, id: string, submission: Submission, lost: boolean): Promise<void>;\n keepUpload(locator: string, id: string, upload: unknown): Promise<void>;\n roomDrafts(): Promise<readonly RoomDraftRecord[]>;\n presentation(): Promise<readonly PresentationRecord[]>;\n present(record: PresentationRecord): Promise<void>;\n conversations(): Promise<readonly HeldConversation[]>;\n keepMessages(write: ConversationWrite): Promise<void>;\n dropConversations(conversations: readonly string[]): Promise<void>;\n chatDrafts(): Promise<readonly ChatDraftRecord[]>;\n keepChatDraft(record: ChatDraftRecord): Promise<void>;\n dropChatDraft(conversation: string): Promise<void>;\n keepRoomDraft(record: RoomDraftRecord): Promise<void>;\n discardRoomDraft(locator: string, path: string): Promise<void>;\n dropRooms(locators: readonly string[]): Promise<void>;\n generation(): Promise<string | null>;\n rememberGeneration(value: string): Promise<void>;\n close(): void;\n};\n\nfunction settled<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction completed(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n transaction.onabort = () => reject(transaction.error);\n });\n}\n\nconst EMPTY_DECLARATIONS: DeclarationRecord = {\n lastCompleted: null,\n generation: null,\n providerLimits: [],\n capabilities: [],\n slots: [],\n};\n\nfunction declaration(database: IDBDatabase): Promise<DeclarationRecord> {\n const transaction = database.transaction(DECLARATIONS, 'readonly');\n return settled<DeclarationRecord | undefined>(\n transaction.objectStore(DECLARATIONS).get(CURRENT),\n ).then((record) => record ?? EMPTY_DECLARATIONS);\n}\n\nfunction updateDeclaration(\n database: IDBDatabase,\n update: (record: DeclarationRecord) => DeclarationRecord,\n): Promise<void> {\n const transaction = database.transaction(DECLARATIONS, 'readwrite');\n const store = transaction.objectStore(DECLARATIONS);\n const prior = store.get(CURRENT);\n prior.onsuccess = () => {\n store.put(\n update((prior.result as DeclarationRecord | undefined) ?? EMPTY_DECLARATIONS),\n CURRENT,\n );\n };\n return completed(transaction);\n}\n\nfunction amendPending(\n database: IDBDatabase,\n locator: string,\n id: string,\n amendment: Partial<PendingState>,\n): Promise<void> {\n const transaction = database.transaction(PENDING_CHANGES, 'readwrite');\n const pending = transaction.objectStore(PENDING_CHANGES);\n const request = pending.get([locator, id]);\n request.onsuccess = () => {\n const record = request.result as PendingChangeRecord | undefined;\n if (record !== undefined) pending.put({ ...record, ...amendment });\n };\n return completed(transaction);\n}\n\nfunction roomRecord(record: ReplicaRecord, queue: readonly ChangeBatch[]): RoomRecord {\n const { documents, binaryTargets, revisions, changes, ...room } = record;\n return { ...room, order: queue.map((batch) => batch.id) };\n}\n\nfunction removeRoomEntries(store: IDBObjectStore, locator: string) {\n const keys = store.getAllKeys();\n keys.onsuccess = () => {\n for (const key of keys.result) {\n if (Array.isArray(key) && key[0] === locator) store.delete(key);\n }\n };\n}\n\nexport function removeRuntimeStore(): Promise<void> {\n return new Promise((resolve, reject) => {\n const removal = indexedDB.deleteDatabase(DATABASE);\n removal.onsuccess = () => resolve();\n removal.onerror = () => reject(removal.error);\n });\n}\n\nexport async function openRuntimeStore(): Promise<RuntimeStore> {\n const opening = indexedDB.open(DATABASE, SCHEMA);\n opening.onupgradeneeded = () => {\n const database = opening.result;\n for (const name of [...database.objectStoreNames]) database.deleteObjectStore(name);\n database.createObjectStore(ROOMS, { keyPath: 'locator' });\n database.createObjectStore(DOCUMENTS, { keyPath: ['locator', 'path'] });\n database.createObjectStore(BINARY_TARGETS, { keyPath: ['locator', 'path'] });\n database.createObjectStore(PENDING_CHANGES, { keyPath: ['locator', 'id'] });\n const outcomes = database.createObjectStore(OUTCOMES, { keyPath: 'id' });\n outcomes.createIndex('locator', 'locator');\n database.createObjectStore(DECLARATIONS);\n database.createObjectStore(ROOM_DRAFTS, { keyPath: ['locator', 'path'] });\n database.createObjectStore(PRESENTATION, { keyPath: 'app' });\n database.createObjectStore(CONVERSATIONS, { keyPath: 'conversation' });\n const messages = database.createObjectStore(MESSAGES, {\n keyPath: ['conversation', 'identity'],\n });\n messages.createIndex('conversation', 'conversation');\n database.createObjectStore(CHAT_DRAFTS, { keyPath: 'conversation' });\n };\n const database = await settled(opening);\n return {\n async all() {\n const transaction = database.transaction([ROOMS, DOCUMENTS, BINARY_TARGETS], 'readonly');\n const [rooms, documents, targets] = await Promise.all([\n settled<RoomRecord[]>(transaction.objectStore(ROOMS).getAll()),\n settled<DocumentRecord[]>(transaction.objectStore(DOCUMENTS).getAll()),\n settled<BinaryTargetRecord[]>(transaction.objectStore(BINARY_TARGETS).getAll()),\n ]);\n const byRoom = new Map<string, ReplicaRecord>();\n for (const { order, ...room } of rooms) {\n byRoom.set(room.locator, {\n ...room,\n documents: {},\n revisions: {},\n changes: {},\n binaryTargets: [],\n });\n }\n const head = (room: ReplicaRecord, held: DocumentRecord | BinaryTargetRecord) => {\n if (held.revision !== null) {\n (room.revisions as Record<string, string>)[held.path] = held.revision;\n }\n if (held.change !== null) {\n (room.changes as Record<string, HeadChange>)[held.path] = held.change;\n }\n };\n for (const document of documents) {\n const room = byRoom.get(document.locator);\n if (room === undefined) continue;\n (room.documents as Record<string, string>)[document.path] = document.content;\n head(room, document);\n }\n for (const target of targets) {\n const room = byRoom.get(target.locator);\n if (room === undefined) continue;\n (room.binaryTargets as string[]).push(target.path);\n head(room, target);\n }\n return [...byRoom.values()];\n },\n async write({\n next,\n previous,\n queue,\n previousQueue,\n saved,\n outcomes,\n roomDrafts,\n consumedRoomDrafts,\n }) {\n const transaction = database.transaction(\n [ROOMS, DOCUMENTS, BINARY_TARGETS, PENDING_CHANGES, OUTCOMES, ROOM_DRAFTS],\n 'readwrite',\n );\n transaction.objectStore(ROOMS).put(roomRecord(next, queue));\n const documents = transaction.objectStore(DOCUMENTS);\n for (const path of Object.keys(previous?.documents ?? {})) {\n if (next.documents[path] === undefined) documents.delete([next.locator, path]);\n }\n for (const [path, content] of Object.entries(next.documents)) {\n if (\n previous?.documents[path] === content &&\n previous.revisions[path] === next.revisions[path] &&\n sameChange(previous.changes[path], next.changes[path])\n )\n continue;\n documents.put({\n locator: next.locator,\n path,\n content,\n revision: next.revisions[path] ?? null,\n change: next.changes[path] ?? null,\n } satisfies DocumentRecord);\n }\n const targets = transaction.objectStore(BINARY_TARGETS);\n const beforeTargets = new Set(previous?.binaryTargets ?? []);\n const afterTargets = new Set(next.binaryTargets);\n for (const path of beforeTargets) {\n if (!afterTargets.has(path)) targets.delete([next.locator, path]);\n }\n for (const path of afterTargets) {\n if (\n !beforeTargets.has(path) ||\n previous?.revisions[path] !== next.revisions[path] ||\n !sameChange(previous?.changes[path], next.changes[path])\n ) {\n targets.put({\n locator: next.locator,\n path,\n revision: next.revisions[path] ?? null,\n change: next.changes[path] ?? null,\n } satisfies BinaryTargetRecord);\n }\n }\n if (previousQueue !== undefined) {\n const pending = transaction.objectStore(PENDING_CHANGES);\n const before = new Set(previousQueue.map((batch) => batch.id));\n const after = new Set(queue.map((batch) => batch.id));\n for (const id of before) {\n if (!after.has(id)) pending.delete([next.locator, id]);\n }\n for (const batch of queue) {\n if (!before.has(batch.id)) {\n pending.put({\n locator: next.locator,\n id: batch.id,\n batch,\n drafts: saved ?? [],\n submission: { state: 'waiting' },\n lost: false,\n } satisfies PendingChangeRecord);\n }\n }\n }\n const outcomeStore = transaction.objectStore(OUTCOMES);\n for (const entry of outcomes ?? []) {\n if (entry.outcome === null) outcomeStore.delete(entry.id);\n else outcomeStore.put({ locator: next.locator, id: entry.id, outcome: entry.outcome });\n }\n const draftStore = transaction.objectStore(ROOM_DRAFTS);\n for (const path of consumedRoomDrafts ?? []) draftStore.delete([next.locator, path]);\n for (const record of roomDrafts ?? []) draftStore.put(record);\n await completed(transaction);\n },\n async revokeModels(records) {\n const transaction = database.transaction(ROOMS, 'readwrite');\n const rooms = transaction.objectStore(ROOMS);\n const revoked: ModelState = { status: 'unavailable', reason: 'revoked' };\n for (const { record, queue } of records) {\n rooms.put(roomRecord({ ...record, model: revoked, selectionModel: revoked }, queue));\n }\n await completed(transaction);\n },\n async lastCompleted() {\n return (await declaration(database)).lastCompleted;\n },\n complete(at) {\n return updateDeclaration(database, (record) => ({ ...record, lastCompleted: at }));\n },\n async providerLimits() {\n return (await declaration(database)).providerLimits;\n },\n async capabilities() {\n return (await declaration(database)).capabilities;\n },\n async slots() {\n return (await declaration(database)).slots;\n },\n declare(limits, capabilities, slots) {\n return updateDeclaration(database, (record) => ({\n ...record,\n providerLimits: limits,\n capabilities,\n slots,\n }));\n },\n async queues() {\n const transaction = database.transaction([ROOMS, PENDING_CHANGES], 'readonly');\n const [rooms, pending] = await Promise.all([\n settled<RoomRecord[]>(transaction.objectStore(ROOMS).getAll()),\n settled<PendingChangeRecord[]>(transaction.objectStore(PENDING_CHANGES).getAll()),\n ]);\n const byId = new Map(pending.map((record) => [`${record.locator}\\0${record.id}`, record]));\n return rooms.map((room) => ({\n locator: room.locator,\n pending: room.order.map((id) => {\n const record = byId.get(`${room.locator}\\0${id}`);\n if (record === undefined) throw new Error(`Missing Pending Change ${room.locator}/${id}`);\n const { batch, drafts, submission, lost, upload } = record;\n return { batch, state: { drafts, submission, lost, upload } };\n }),\n }));\n },\n async outcomes() {\n const transaction = database.transaction(OUTCOMES, 'readonly');\n return settled<OutcomeRecord[]>(transaction.objectStore(OUTCOMES).getAll());\n },\n submit(locator, id, submission, lost) {\n return amendPending(database, locator, id, { submission, lost });\n },\n keepUpload(locator, id, upload) {\n return amendPending(database, locator, id, { upload });\n },\n async roomDrafts() {\n const transaction = database.transaction(ROOM_DRAFTS, 'readonly');\n return settled<RoomDraftRecord[]>(transaction.objectStore(ROOM_DRAFTS).getAll());\n },\n async presentation() {\n const transaction = database.transaction(PRESENTATION, 'readonly');\n return settled<PresentationRecord[]>(transaction.objectStore(PRESENTATION).getAll());\n },\n async present(record) {\n const transaction = database.transaction(PRESENTATION, 'readwrite');\n transaction.objectStore(PRESENTATION).put(record);\n await completed(transaction);\n },\n async conversations() {\n const transaction = database.transaction([CONVERSATIONS, MESSAGES], 'readonly');\n const [reads, messages] = await Promise.all([\n settled<ConversationRecord[]>(transaction.objectStore(CONVERSATIONS).getAll()),\n settled<MessageRecord[]>(transaction.objectStore(MESSAGES).getAll()),\n ]);\n const held = new Map<string, HeldConversation & { messages: AcceptedMessage[] }>();\n for (const { conversation, read } of reads) {\n held.set(conversation, { conversation, read, messages: [] });\n }\n for (const { conversation, ...message } of messages) {\n const entry = held.get(conversation) ?? { conversation, read: undefined, messages: [] };\n entry.messages.push(message);\n held.set(conversation, entry);\n }\n return [...held.values()];\n },\n async keepMessages({ conversation, messages, read, sealed }) {\n const transaction = database.transaction([CONVERSATIONS, MESSAGES, CHAT_DRAFTS], 'readwrite');\n const stored = transaction.objectStore(MESSAGES);\n for (const message of messages) {\n stored.put({ ...message, conversation } satisfies MessageRecord);\n }\n if (read !== undefined) {\n transaction\n .objectStore(CONVERSATIONS)\n .put({ conversation, read } satisfies ConversationRecord);\n }\n if (sealed === true) transaction.objectStore(CHAT_DRAFTS).delete(conversation);\n await completed(transaction);\n },\n async dropConversations(conversations) {\n const transaction = database.transaction([CONVERSATIONS, MESSAGES, CHAT_DRAFTS], 'readwrite');\n const messages = transaction.objectStore(MESSAGES);\n for (const conversation of conversations) {\n transaction.objectStore(CONVERSATIONS).delete(conversation);\n transaction.objectStore(CHAT_DRAFTS).delete(conversation);\n const keys = messages.index('conversation').getAllKeys(conversation);\n keys.onsuccess = () => {\n for (const key of keys.result) messages.delete(key);\n };\n }\n await completed(transaction);\n },\n async chatDrafts() {\n const transaction = database.transaction(CHAT_DRAFTS, 'readonly');\n return settled<ChatDraftRecord[]>(transaction.objectStore(CHAT_DRAFTS).getAll());\n },\n async keepChatDraft(record) {\n const transaction = database.transaction(CHAT_DRAFTS, 'readwrite');\n transaction.objectStore(CHAT_DRAFTS).put(record);\n await completed(transaction);\n },\n async dropChatDraft(conversation) {\n const transaction = database.transaction(CHAT_DRAFTS, 'readwrite');\n transaction.objectStore(CHAT_DRAFTS).delete(conversation);\n await completed(transaction);\n },\n async keepRoomDraft(record) {\n const transaction = database.transaction(ROOM_DRAFTS, 'readwrite');\n transaction.objectStore(ROOM_DRAFTS).put(record);\n await completed(transaction);\n },\n async discardRoomDraft(locator, path) {\n const transaction = database.transaction(ROOM_DRAFTS, 'readwrite');\n transaction.objectStore(ROOM_DRAFTS).delete([locator, path]);\n await completed(transaction);\n },\n async dropRooms(locators) {\n const transaction = database.transaction(\n [ROOMS, DOCUMENTS, BINARY_TARGETS, PENDING_CHANGES, OUTCOMES, ROOM_DRAFTS],\n 'readwrite',\n );\n for (const locator of locators) {\n transaction.objectStore(ROOMS).delete(locator);\n for (const name of [DOCUMENTS, BINARY_TARGETS, PENDING_CHANGES, ROOM_DRAFTS]) {\n removeRoomEntries(transaction.objectStore(name), locator);\n }\n const outcomes = transaction.objectStore(OUTCOMES);\n const ids = outcomes.index('locator').getAllKeys(locator);\n ids.onsuccess = () => {\n for (const id of ids.result) outcomes.delete(id);\n };\n }\n await completed(transaction);\n },\n async generation() {\n return (await declaration(database)).generation;\n },\n rememberGeneration(value) {\n return updateDeclaration(database, (record) => ({ ...record, generation: value }));\n },\n close() {\n database.close();\n },\n };\n}\n"],"names":["sameChange","DATABASE","ROOMS","DOCUMENTS","BINARY_TARGETS","PENDING_CHANGES","OUTCOMES","DECLARATIONS","ROOM_DRAFTS","PRESENTATION","CONVERSATIONS","MESSAGES","CHAT_DRAFTS","CURRENT","SCHEMA","settled","request","Promise","resolve","reject","onsuccess","result","onerror","error","completed","transaction","oncomplete","onabort","EMPTY_DECLARATIONS","lastCompleted","generation","providerLimits","capabilities","slots","declaration","database","objectStore","get","then","record","updateDeclaration","update","store","prior","put","amendPending","locator","id","amendment","pending","undefined","roomRecord","queue","documents","binaryTargets","revisions","changes","room","order","map","batch","removeRoomEntries","keys","getAllKeys","key","Array","isArray","delete","removeRuntimeStore","removal","indexedDB","deleteDatabase","openRuntimeStore","opening","open","onupgradeneeded","name","objectStoreNames","deleteObjectStore","createObjectStore","keyPath","outcomes","createIndex","messages","all","rooms","targets","getAll","byRoom","Map","set","head","held","revision","path","change","document","content","target","push","values","write","next","previous","previousQueue","saved","roomDrafts","consumedRoomDrafts","Object","entries","beforeTargets","Set","afterTargets","has","before","after","drafts","submission","state","lost","outcomeStore","entry","outcome","draftStore","revokeModels","records","revoked","status","reason","model","selectionModel","complete","at","declare","limits","queues","byId","Error","upload","submit","keepUpload","presentation","present","conversations","reads","conversation","read","message","keepMessages","sealed","stored","dropConversations","index","chatDrafts","keepChatDraft","dropChatDraft","keepRoomDraft","discardRoomDraft","dropRooms","locators","ids","rememberGeneration","value","close"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/store.ts"],"sourcesContent":["import type { ModelState } from './model.js';\nimport type {\n Capability,\n Discovery,\n HeadChange,\n OperationScopes,\n ProviderLimit,\n ReplicaAdmission,\n RoomAttachment,\n TypedSelection,\n} from './adapter.js';\nimport type { AcceptedMessage } from './adapter.js';\nimport type { ChangeBatch } from './change.js';\nimport { sameChange } from './overlay.js';\nimport type { ChatDraftFile } from './file.js';\nimport type { Submission, SubmissionOutcome } from './outcome.js';\nimport type { RoomDraftRecord, SavedDraft } from './room-draft.js';\n\nconst DATABASE = 'mdruntime';\nconst ROOMS = 'rooms';\nconst DOCUMENTS = 'documents';\nconst BINARY_TARGETS = 'binaryTargets';\nconst ATTACHMENTS = 'attachments';\nconst PENDING_CHANGES = 'pendingChanges';\nconst OUTCOMES = 'outcomes';\nconst DECLARATIONS = 'declarations';\nconst ROOM_DRAFTS = 'roomDrafts';\nconst PRESENTATION = 'presentation';\nconst CONVERSATIONS = 'conversations';\nconst MESSAGES = 'messages';\nconst CHAT_DRAFTS = 'chatDrafts';\nconst CURRENT = 'current';\nconst SCHEMA = 18;\n\nexport type ReplicaRecord = {\n locator: string;\n name: string;\n operations: OperationScopes;\n replica: ReplicaAdmission;\n model: ModelState;\n attachedModel: import('./model.js').ModelIdentity | null;\n typedSelection: TypedSelection | null;\n selectionModel: ModelState;\n untypedFolders: readonly string[];\n providerOwnedPaths: readonly string[];\n roomVersion: string;\n documents: Readonly<Record<string, string>>;\n binaryTargets: readonly string[];\n revisions: Readonly<Record<string, string>>;\n changes: Readonly<Record<string, HeadChange>>;\n attachments: readonly RoomAttachment[];\n};\n\ntype RoomRecord = Omit<\n ReplicaRecord,\n 'documents' | 'binaryTargets' | 'revisions' | 'changes' | 'attachments'\n> & {\n order: readonly string[];\n};\n\ntype AttachmentRecord = RoomAttachment & { locator: string };\n\ntype DocumentRecord = {\n locator: string;\n path: string;\n content: string;\n revision: string | null;\n change: HeadChange | null;\n};\n\ntype BinaryTargetRecord = {\n locator: string;\n path: string;\n revision: string | null;\n change: HeadChange | null;\n};\n\nexport type PendingState = {\n readonly drafts: readonly SavedDraft[];\n readonly submission: Submission;\n readonly lost: boolean;\n readonly upload?: unknown;\n};\n\ntype PendingChangeRecord = PendingState & {\n locator: string;\n id: string;\n batch: ChangeBatch;\n};\n\nexport type OutcomeRecord = {\n locator: string;\n id: string;\n outcome: SubmissionOutcome;\n};\n\ntype DeclarationRecord = {\n lastCompleted: string | null;\n generation: string | null;\n providerLimits: readonly ProviderLimit[];\n capabilities: readonly Capability[];\n slots: NonNullable<Discovery['slots']>;\n};\n\nexport type QueueRecord = {\n locator: string;\n pending: readonly { batch: ChangeBatch; state: PendingState }[];\n};\n\nexport type PresentationRecord = {\n app: string;\n value: unknown;\n};\n\ntype ConversationRecord = {\n conversation: string;\n read: string | null;\n};\n\ntype MessageRecord = AcceptedMessage & { conversation: string };\n\nexport type HeldConversation = {\n conversation: string;\n read: string | null | undefined;\n messages: readonly AcceptedMessage[];\n};\n\nexport type ConversationWrite = {\n conversation: string;\n messages: readonly AcceptedMessage[];\n read?: string | null;\n sealed?: boolean;\n};\n\nexport type ChatDraftRecord = {\n conversation: string;\n text: string;\n files: readonly ChatDraftFile[];\n turn: string | null;\n};\n\nexport type RecordWrite = {\n next: ReplicaRecord;\n previous: ReplicaRecord | null;\n queue: readonly ChangeBatch[];\n previousQueue?: readonly ChangeBatch[];\n saved?: readonly SavedDraft[];\n outcomes?: readonly { id: string; outcome: SubmissionOutcome | null }[];\n roomDrafts?: readonly RoomDraftRecord[];\n consumedRoomDrafts?: readonly string[];\n};\n\nexport type RuntimeStore = {\n all(): Promise<readonly ReplicaRecord[]>;\n write(input: RecordWrite): Promise<void>;\n revokeModels(\n records: readonly { record: ReplicaRecord; queue: readonly ChangeBatch[] }[],\n ): Promise<void>;\n lastCompleted(): Promise<string | null>;\n complete(at: string): Promise<void>;\n providerLimits(): Promise<readonly ProviderLimit[]>;\n capabilities(): Promise<readonly Capability[]>;\n slots(): Promise<NonNullable<Discovery['slots']>>;\n declare(\n limits: readonly ProviderLimit[],\n capabilities: readonly Capability[],\n slots: NonNullable<Discovery['slots']>,\n ): Promise<void>;\n queues(): Promise<readonly QueueRecord[]>;\n outcomes(): Promise<readonly OutcomeRecord[]>;\n submit(locator: string, id: string, submission: Submission, lost: boolean): Promise<void>;\n keepUpload(locator: string, id: string, upload: unknown): Promise<void>;\n roomDrafts(): Promise<readonly RoomDraftRecord[]>;\n presentation(): Promise<readonly PresentationRecord[]>;\n present(record: PresentationRecord): Promise<void>;\n conversations(): Promise<readonly HeldConversation[]>;\n keepMessages(write: ConversationWrite): Promise<void>;\n dropConversations(conversations: readonly string[]): Promise<void>;\n chatDrafts(): Promise<readonly ChatDraftRecord[]>;\n keepChatDraft(record: ChatDraftRecord): Promise<void>;\n dropChatDraft(conversation: string): Promise<void>;\n keepRoomDraft(record: RoomDraftRecord): Promise<void>;\n discardRoomDraft(locator: string, path: string): Promise<void>;\n dropRooms(locators: readonly string[]): Promise<void>;\n generation(): Promise<string | null>;\n rememberGeneration(value: string): Promise<void>;\n close(): void;\n};\n\nfunction settled<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction completed(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n transaction.onabort = () => reject(transaction.error);\n });\n}\n\nconst EMPTY_DECLARATIONS: DeclarationRecord = {\n lastCompleted: null,\n generation: null,\n providerLimits: [],\n capabilities: [],\n slots: [],\n};\n\nfunction declaration(database: IDBDatabase): Promise<DeclarationRecord> {\n const transaction = database.transaction(DECLARATIONS, 'readonly');\n return settled<DeclarationRecord | undefined>(\n transaction.objectStore(DECLARATIONS).get(CURRENT),\n ).then((record) => record ?? EMPTY_DECLARATIONS);\n}\n\nfunction updateDeclaration(\n database: IDBDatabase,\n update: (record: DeclarationRecord) => DeclarationRecord,\n): Promise<void> {\n const transaction = database.transaction(DECLARATIONS, 'readwrite');\n const store = transaction.objectStore(DECLARATIONS);\n const prior = store.get(CURRENT);\n prior.onsuccess = () => {\n store.put(\n update((prior.result as DeclarationRecord | undefined) ?? EMPTY_DECLARATIONS),\n CURRENT,\n );\n };\n return completed(transaction);\n}\n\nfunction amendPending(\n database: IDBDatabase,\n locator: string,\n id: string,\n amendment: Partial<PendingState>,\n): Promise<void> {\n const transaction = database.transaction(PENDING_CHANGES, 'readwrite');\n const pending = transaction.objectStore(PENDING_CHANGES);\n const request = pending.get([locator, id]);\n request.onsuccess = () => {\n const record = request.result as PendingChangeRecord | undefined;\n if (record !== undefined) pending.put({ ...record, ...amendment });\n };\n return completed(transaction);\n}\n\nfunction roomRecord(record: ReplicaRecord, queue: readonly ChangeBatch[]): RoomRecord {\n const { documents, binaryTargets, revisions, changes, attachments, ...room } = record;\n return { ...room, order: queue.map((batch) => batch.id) };\n}\n\nfunction removeRoomEntries(store: IDBObjectStore, locator: string) {\n const keys = store.getAllKeys();\n keys.onsuccess = () => {\n for (const key of keys.result) {\n if (Array.isArray(key) && key[0] === locator) store.delete(key);\n }\n };\n}\n\nexport function removeRuntimeStore(): Promise<void> {\n return new Promise((resolve, reject) => {\n const removal = indexedDB.deleteDatabase(DATABASE);\n removal.onsuccess = () => resolve();\n removal.onerror = () => reject(removal.error);\n });\n}\n\nexport async function openRuntimeStore(): Promise<RuntimeStore> {\n const opening = indexedDB.open(DATABASE, SCHEMA);\n opening.onupgradeneeded = () => {\n const database = opening.result;\n for (const name of [...database.objectStoreNames]) database.deleteObjectStore(name);\n database.createObjectStore(ROOMS, { keyPath: 'locator' });\n database.createObjectStore(DOCUMENTS, { keyPath: ['locator', 'path'] });\n database.createObjectStore(BINARY_TARGETS, { keyPath: ['locator', 'path'] });\n database.createObjectStore(ATTACHMENTS, { keyPath: ['locator', 'reference'] });\n database.createObjectStore(PENDING_CHANGES, { keyPath: ['locator', 'id'] });\n const outcomes = database.createObjectStore(OUTCOMES, { keyPath: 'id' });\n outcomes.createIndex('locator', 'locator');\n database.createObjectStore(DECLARATIONS);\n database.createObjectStore(ROOM_DRAFTS, { keyPath: ['locator', 'path'] });\n database.createObjectStore(PRESENTATION, { keyPath: 'app' });\n database.createObjectStore(CONVERSATIONS, { keyPath: 'conversation' });\n const messages = database.createObjectStore(MESSAGES, {\n keyPath: ['conversation', 'identity'],\n });\n messages.createIndex('conversation', 'conversation');\n database.createObjectStore(CHAT_DRAFTS, { keyPath: 'conversation' });\n };\n const database = await settled(opening);\n return {\n async all() {\n const transaction = database.transaction(\n [ROOMS, DOCUMENTS, BINARY_TARGETS, ATTACHMENTS],\n 'readonly',\n );\n const [rooms, documents, targets, attachments] = await Promise.all([\n settled<RoomRecord[]>(transaction.objectStore(ROOMS).getAll()),\n settled<DocumentRecord[]>(transaction.objectStore(DOCUMENTS).getAll()),\n settled<BinaryTargetRecord[]>(transaction.objectStore(BINARY_TARGETS).getAll()),\n settled<AttachmentRecord[]>(transaction.objectStore(ATTACHMENTS).getAll()),\n ]);\n const byRoom = new Map<string, ReplicaRecord>();\n for (const { order, ...room } of rooms) {\n byRoom.set(room.locator, {\n ...room,\n documents: {},\n revisions: {},\n changes: {},\n binaryTargets: [],\n attachments: [],\n });\n }\n const head = (room: ReplicaRecord, held: DocumentRecord | BinaryTargetRecord) => {\n if (held.revision !== null) {\n (room.revisions as Record<string, string>)[held.path] = held.revision;\n }\n if (held.change !== null) {\n (room.changes as Record<string, HeadChange>)[held.path] = held.change;\n }\n };\n for (const document of documents) {\n const room = byRoom.get(document.locator);\n if (room === undefined) continue;\n (room.documents as Record<string, string>)[document.path] = document.content;\n head(room, document);\n }\n for (const target of targets) {\n const room = byRoom.get(target.locator);\n if (room === undefined) continue;\n (room.binaryTargets as string[]).push(target.path);\n head(room, target);\n }\n for (const { locator, ...attachment } of attachments) {\n const room = byRoom.get(locator);\n if (room === undefined) continue;\n (room.attachments as RoomAttachment[]).push(attachment);\n }\n return [...byRoom.values()];\n },\n async write({\n next,\n previous,\n queue,\n previousQueue,\n saved,\n outcomes,\n roomDrafts,\n consumedRoomDrafts,\n }) {\n const transaction = database.transaction(\n [ROOMS, DOCUMENTS, BINARY_TARGETS, ATTACHMENTS, PENDING_CHANGES, OUTCOMES, ROOM_DRAFTS],\n 'readwrite',\n );\n transaction.objectStore(ROOMS).put(roomRecord(next, queue));\n const documents = transaction.objectStore(DOCUMENTS);\n for (const path of Object.keys(previous?.documents ?? {})) {\n if (next.documents[path] === undefined) documents.delete([next.locator, path]);\n }\n for (const [path, content] of Object.entries(next.documents)) {\n if (\n previous?.documents[path] === content &&\n previous.revisions[path] === next.revisions[path] &&\n sameChange(previous.changes[path], next.changes[path])\n )\n continue;\n documents.put({\n locator: next.locator,\n path,\n content,\n revision: next.revisions[path] ?? null,\n change: next.changes[path] ?? null,\n } satisfies DocumentRecord);\n }\n const targets = transaction.objectStore(BINARY_TARGETS);\n const beforeTargets = new Set(previous?.binaryTargets ?? []);\n const afterTargets = new Set(next.binaryTargets);\n for (const path of beforeTargets) {\n if (!afterTargets.has(path)) targets.delete([next.locator, path]);\n }\n for (const path of afterTargets) {\n if (\n !beforeTargets.has(path) ||\n previous?.revisions[path] !== next.revisions[path] ||\n !sameChange(previous?.changes[path], next.changes[path])\n ) {\n targets.put({\n locator: next.locator,\n path,\n revision: next.revisions[path] ?? null,\n change: next.changes[path] ?? null,\n } satisfies BinaryTargetRecord);\n }\n }\n const attachments = transaction.objectStore(ATTACHMENTS);\n const held = new Map(\n (previous?.attachments ?? []).map((attachment) => [attachment.reference, attachment]),\n );\n const declared = new Set(next.attachments.map((attachment) => attachment.reference));\n for (const reference of held.keys()) {\n if (!declared.has(reference)) attachments.delete([next.locator, reference]);\n }\n for (const attachment of next.attachments) {\n if (held.get(attachment.reference) === attachment) continue;\n attachments.put({ ...attachment, locator: next.locator } satisfies AttachmentRecord);\n }\n if (previousQueue !== undefined) {\n const pending = transaction.objectStore(PENDING_CHANGES);\n const before = new Set(previousQueue.map((batch) => batch.id));\n const after = new Set(queue.map((batch) => batch.id));\n for (const id of before) {\n if (!after.has(id)) pending.delete([next.locator, id]);\n }\n for (const batch of queue) {\n if (!before.has(batch.id)) {\n pending.put({\n locator: next.locator,\n id: batch.id,\n batch,\n drafts: saved ?? [],\n submission: { state: 'waiting' },\n lost: false,\n } satisfies PendingChangeRecord);\n }\n }\n }\n const outcomeStore = transaction.objectStore(OUTCOMES);\n for (const entry of outcomes ?? []) {\n if (entry.outcome === null) outcomeStore.delete(entry.id);\n else outcomeStore.put({ locator: next.locator, id: entry.id, outcome: entry.outcome });\n }\n const draftStore = transaction.objectStore(ROOM_DRAFTS);\n for (const path of consumedRoomDrafts ?? []) draftStore.delete([next.locator, path]);\n for (const record of roomDrafts ?? []) draftStore.put(record);\n await completed(transaction);\n },\n async revokeModels(records) {\n const transaction = database.transaction(ROOMS, 'readwrite');\n const rooms = transaction.objectStore(ROOMS);\n const revoked: ModelState = { status: 'unavailable', reason: 'revoked' };\n for (const { record, queue } of records) {\n rooms.put(roomRecord({ ...record, model: revoked, selectionModel: revoked }, queue));\n }\n await completed(transaction);\n },\n async lastCompleted() {\n return (await declaration(database)).lastCompleted;\n },\n complete(at) {\n return updateDeclaration(database, (record) => ({ ...record, lastCompleted: at }));\n },\n async providerLimits() {\n return (await declaration(database)).providerLimits;\n },\n async capabilities() {\n return (await declaration(database)).capabilities;\n },\n async slots() {\n return (await declaration(database)).slots;\n },\n declare(limits, capabilities, slots) {\n return updateDeclaration(database, (record) => ({\n ...record,\n providerLimits: limits,\n capabilities,\n slots,\n }));\n },\n async queues() {\n const transaction = database.transaction([ROOMS, PENDING_CHANGES], 'readonly');\n const [rooms, pending] = await Promise.all([\n settled<RoomRecord[]>(transaction.objectStore(ROOMS).getAll()),\n settled<PendingChangeRecord[]>(transaction.objectStore(PENDING_CHANGES).getAll()),\n ]);\n const byId = new Map(pending.map((record) => [`${record.locator}\\0${record.id}`, record]));\n return rooms.map((room) => ({\n locator: room.locator,\n pending: room.order.map((id) => {\n const record = byId.get(`${room.locator}\\0${id}`);\n if (record === undefined) throw new Error(`Missing Pending Change ${room.locator}/${id}`);\n const { batch, drafts, submission, lost, upload } = record;\n return { batch, state: { drafts, submission, lost, upload } };\n }),\n }));\n },\n async outcomes() {\n const transaction = database.transaction(OUTCOMES, 'readonly');\n return settled<OutcomeRecord[]>(transaction.objectStore(OUTCOMES).getAll());\n },\n submit(locator, id, submission, lost) {\n return amendPending(database, locator, id, { submission, lost });\n },\n keepUpload(locator, id, upload) {\n return amendPending(database, locator, id, { upload });\n },\n async roomDrafts() {\n const transaction = database.transaction(ROOM_DRAFTS, 'readonly');\n return settled<RoomDraftRecord[]>(transaction.objectStore(ROOM_DRAFTS).getAll());\n },\n async presentation() {\n const transaction = database.transaction(PRESENTATION, 'readonly');\n return settled<PresentationRecord[]>(transaction.objectStore(PRESENTATION).getAll());\n },\n async present(record) {\n const transaction = database.transaction(PRESENTATION, 'readwrite');\n transaction.objectStore(PRESENTATION).put(record);\n await completed(transaction);\n },\n async conversations() {\n const transaction = database.transaction([CONVERSATIONS, MESSAGES], 'readonly');\n const [reads, messages] = await Promise.all([\n settled<ConversationRecord[]>(transaction.objectStore(CONVERSATIONS).getAll()),\n settled<MessageRecord[]>(transaction.objectStore(MESSAGES).getAll()),\n ]);\n const held = new Map<string, HeldConversation & { messages: AcceptedMessage[] }>();\n for (const { conversation, read } of reads) {\n held.set(conversation, { conversation, read, messages: [] });\n }\n for (const { conversation, ...message } of messages) {\n const entry = held.get(conversation) ?? { conversation, read: undefined, messages: [] };\n entry.messages.push(message);\n held.set(conversation, entry);\n }\n return [...held.values()];\n },\n async keepMessages({ conversation, messages, read, sealed }) {\n const transaction = database.transaction([CONVERSATIONS, MESSAGES, CHAT_DRAFTS], 'readwrite');\n const stored = transaction.objectStore(MESSAGES);\n for (const message of messages) {\n stored.put({ ...message, conversation } satisfies MessageRecord);\n }\n if (read !== undefined) {\n transaction\n .objectStore(CONVERSATIONS)\n .put({ conversation, read } satisfies ConversationRecord);\n }\n if (sealed === true) transaction.objectStore(CHAT_DRAFTS).delete(conversation);\n await completed(transaction);\n },\n async dropConversations(conversations) {\n const transaction = database.transaction([CONVERSATIONS, MESSAGES, CHAT_DRAFTS], 'readwrite');\n const messages = transaction.objectStore(MESSAGES);\n for (const conversation of conversations) {\n transaction.objectStore(CONVERSATIONS).delete(conversation);\n transaction.objectStore(CHAT_DRAFTS).delete(conversation);\n const keys = messages.index('conversation').getAllKeys(conversation);\n keys.onsuccess = () => {\n for (const key of keys.result) messages.delete(key);\n };\n }\n await completed(transaction);\n },\n async chatDrafts() {\n const transaction = database.transaction(CHAT_DRAFTS, 'readonly');\n return settled<ChatDraftRecord[]>(transaction.objectStore(CHAT_DRAFTS).getAll());\n },\n async keepChatDraft(record) {\n const transaction = database.transaction(CHAT_DRAFTS, 'readwrite');\n transaction.objectStore(CHAT_DRAFTS).put(record);\n await completed(transaction);\n },\n async dropChatDraft(conversation) {\n const transaction = database.transaction(CHAT_DRAFTS, 'readwrite');\n transaction.objectStore(CHAT_DRAFTS).delete(conversation);\n await completed(transaction);\n },\n async keepRoomDraft(record) {\n const transaction = database.transaction(ROOM_DRAFTS, 'readwrite');\n transaction.objectStore(ROOM_DRAFTS).put(record);\n await completed(transaction);\n },\n async discardRoomDraft(locator, path) {\n const transaction = database.transaction(ROOM_DRAFTS, 'readwrite');\n transaction.objectStore(ROOM_DRAFTS).delete([locator, path]);\n await completed(transaction);\n },\n async dropRooms(locators) {\n const transaction = database.transaction(\n [ROOMS, DOCUMENTS, BINARY_TARGETS, ATTACHMENTS, PENDING_CHANGES, OUTCOMES, ROOM_DRAFTS],\n 'readwrite',\n );\n for (const locator of locators) {\n transaction.objectStore(ROOMS).delete(locator);\n for (const name of [DOCUMENTS, BINARY_TARGETS, ATTACHMENTS, PENDING_CHANGES, ROOM_DRAFTS]) {\n removeRoomEntries(transaction.objectStore(name), locator);\n }\n const outcomes = transaction.objectStore(OUTCOMES);\n const ids = outcomes.index('locator').getAllKeys(locator);\n ids.onsuccess = () => {\n for (const id of ids.result) outcomes.delete(id);\n };\n }\n await completed(transaction);\n },\n async generation() {\n return (await declaration(database)).generation;\n },\n rememberGeneration(value) {\n return updateDeclaration(database, (record) => ({ ...record, generation: value }));\n },\n close() {\n database.close();\n },\n };\n}\n"],"names":["sameChange","DATABASE","ROOMS","DOCUMENTS","BINARY_TARGETS","ATTACHMENTS","PENDING_CHANGES","OUTCOMES","DECLARATIONS","ROOM_DRAFTS","PRESENTATION","CONVERSATIONS","MESSAGES","CHAT_DRAFTS","CURRENT","SCHEMA","settled","request","Promise","resolve","reject","onsuccess","result","onerror","error","completed","transaction","oncomplete","onabort","EMPTY_DECLARATIONS","lastCompleted","generation","providerLimits","capabilities","slots","declaration","database","objectStore","get","then","record","updateDeclaration","update","store","prior","put","amendPending","locator","id","amendment","pending","undefined","roomRecord","queue","documents","binaryTargets","revisions","changes","attachments","room","order","map","batch","removeRoomEntries","keys","getAllKeys","key","Array","isArray","delete","removeRuntimeStore","removal","indexedDB","deleteDatabase","openRuntimeStore","opening","open","onupgradeneeded","name","objectStoreNames","deleteObjectStore","createObjectStore","keyPath","outcomes","createIndex","messages","all","rooms","targets","getAll","byRoom","Map","set","head","held","revision","path","change","document","content","target","push","attachment","values","write","next","previous","previousQueue","saved","roomDrafts","consumedRoomDrafts","Object","entries","beforeTargets","Set","afterTargets","has","reference","declared","before","after","drafts","submission","state","lost","outcomeStore","entry","outcome","draftStore","revokeModels","records","revoked","status","reason","model","selectionModel","complete","at","declare","limits","queues","byId","Error","upload","submit","keepUpload","presentation","present","conversations","reads","conversation","read","message","keepMessages","sealed","stored","dropConversations","index","chatDrafts","keepChatDraft","dropChatDraft","keepRoomDraft","discardRoomDraft","dropRooms","locators","ids","rememberGeneration","value","close"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentshouse/mdruntime",
3
- "version": "0.1.0-alpha.47",
3
+ "version": "0.1.0-alpha.49",
4
4
  "description": "The headless core of MD App",
5
5
  "license": "MIT",
6
6
  "type": "module",