@agentshouse/mdruntime 0.1.0-alpha.44 → 0.1.0-alpha.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/memory.js CHANGED
@@ -88,7 +88,6 @@ export function createMemoryAdapter(options = {}) {
88
88
  return {
89
89
  name: room.name,
90
90
  locator: room.locator,
91
- collectionRoot: room.collectionRoot,
92
91
  roomVersion: room.roomVersion,
93
92
  operations: room.operations,
94
93
  replica: room.replica,
@@ -96,6 +95,9 @@ export function createMemoryAdapter(options = {}) {
96
95
  ...room.typedSelection === undefined ? {} : {
97
96
  typedSelection: room.typedSelection
98
97
  },
98
+ ...room.untypedFolders === undefined ? {} : {
99
+ untypedFolders: room.untypedFolders
100
+ },
99
101
  providerOwnedPaths: room.providerOwnedPaths
100
102
  };
101
103
  }
@@ -373,7 +375,7 @@ export function createMemoryAdapter(options = {}) {
373
375
  }
374
376
  return advancement(continuation.room, continuation.from, continuation.at);
375
377
  }
376
- if (request.reach !== undefined && !reached(room.locator, room.roomVersion, request.reach)) {
378
+ if (request.minPosition !== undefined && !reached(room.locator, room.roomVersion, request.minPosition)) {
377
379
  return {
378
380
  kind: 'retryable-refusal',
379
381
  code: 'replica_behind',
@@ -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 collectionRoot: room.collectionRoot,\n roomVersion: room.roomVersion,\n operations: room.operations,\n replica: room.replica,\n attachedModel: room.attachedModel,\n ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),\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.reach !== undefined &&\n !reached(room.locator, room.roomVersion, request.reach)\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","collectionRoot","operations","replica","attachedModel","typedSelection","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","reach","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 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":"AACA,SACEA,qBAAqB,QA0BhB,eAAe;AACtB,SAASC,QAAQ,QAAQ,kBAAkB;AAC3C,SAASC,UAAU,QAAQ,eAAe;AAE1C,MAAMC,oBAA+B;IACnCC,SAAS;QAAEC,MAAM;QAAYC,SAAS;IAAE;IACxCC,SAAS;IACTC,gBAAgB;AAClB;AAEA,SAASC,kBAAkBC,KAA4B;IACrD,MAAMC,YAAYD,SAASP;IAC3B,IAAIQ,UAAUP,OAAO,CAACC,IAAI,KAAK,0BAA0B,OAAOM;IAChE,IAAIC,OAAOC,QAAQ,CAACF,UAAUP,OAAO,CAACE,OAAO,KAAKK,UAAUP,OAAO,CAACE,OAAO,GAAG,GAAG;QAC/E,OAAOK;IACT;IACA,MAAM,IAAIG,MAAM;AAClB;AAgDA,SAASC,MACPC,MAAmC,EACnCC,KAAwB;IAExB,MAAMC,QAA2B,CAAC;IAClC,KAAK,MAAMC,QAAQF,MAAO;QACxB,MAAMP,QAAQM,MAAM,CAACG,KAAK;QAC1B,IAAIT,UAAUU,WAAWF,KAAK,CAACC,KAAK,GAAGT;IACzC;IACA,OAAOQ;AACT;AAEA,eAAeG,cACbC,MAAgC,EAChCC,QAA8B,EAC9BC,OAAU;IAEV,IAAIF,WAAWF,WAAW,OAAOG;IACjC,OAAO,OAAOD,WAAW,aAAa,AAACA,OAAwCE,WAAWF;AAC5F;AAEA,OAAO,SAASG,oBAAoBC,UAAgC,CAAC,CAAC;IACpE,IAAIC,QAAQD,QAAQC,KAAK,KAAKP,YAAY,EAAE,GAAG;WAAIM,QAAQC,KAAK;KAAC;IACjE,MAAMC,UAAUF,QAAQE,OAAO,IAAI3B;IACnC,MAAM4B,oBAAoBH,QAAQG,iBAAiB,IAAI;QAAC7B;KAAsB;IAC9E,MAAM8B,eAAeJ,QAAQI,YAAY,IAAI,EAAE;IAC/C,MAAMC,iBAAiBL,QAAQK,cAAc,IAAI,EAAE;IACnD,MAAMpB,YAAYF,kBAAkBiB,QAAQf,SAAS;IACrD,MAAMqB,WAAWN,QAAQM,QAAQ;IACjC,MAAMC,UAAmD,CAAC;IAC1D,MAAMC,SAAS,IAAIC;IACnB,MAAMC,eAAe,IAAID;IACzB,MAAME,YAAY,IAAIC;IACtB,MAAMC,YAAY,IAAID;IACtB,MAAME,gBAAgB,IAAIF;IAC1B,MAAMG,WAAW,IAAIN;IACrB,MAAMO,WAAW,IAAIP;IACrB,MAAMQ,SAAS,IAAIL;IACnB,MAAMM,kBAAkBlB,QAAQkB,eAAe;IAC/C,IAAIC,WAA8B,EAAE;IACpC,IAAIC,aAAgC,EAAE;IACtC,IAAIC,SAAS;IAEb,SAASC,oBAAoBC,OAAsC;QACjER,SAASS,KAAK;QACd,KAAK,MAAMC,SAASF,QAASR,SAASW,GAAG,CAACD,MAAME,YAAY,EAAEF;IAChE;IAEAH,oBAAoBtB,QAAQ4B,aAAa,IAAI,EAAE;IAE/C,MAAMC,WAAW,IAAIpB;IAErB,SAASqB,KAAQC,OAAe,EAAEnC,MAAS;QACzC,MAAMoC,cAAc,AAACpC,OAAqCoC,WAAW;QACrE,MAAMC,MAAM,GAAGF,QAAQ,MAAM,EAAEG,OAAOF,cAAc;QACpD,IAAI,OAAOA,gBAAgB,YAAY,CAACH,SAASM,GAAG,CAACF,MAAMJ,SAASH,GAAG,CAACO,KAAKJ,SAASO,IAAI;QAC1F,OAAOxC;IACT;IAEA,SAASyC,QAAQN,OAAe,EAAEC,WAAmB,EAAEM,MAAc;QACnE,MAAMvB,WAAWR,QAAQ8B,OAAO;QAIhC,IAAI,OAAOtB,aAAa,WAAW,OAAOA;QAC1C,IAAIA,aAAarB,WAAW,OAAOqB,SAASgB,SAASC,aAAaM;QAClE,IAAIN,gBAAgBM,QAAQ,OAAO;QACnC,MAAMC,OAAOV,SAASW,GAAG,CAAC,GAAGT,QAAQ,MAAM,EAAEC,aAAa;QAC1D,MAAMS,SAASZ,SAASW,GAAG,CAAC,GAAGT,QAAQ,MAAM,EAAEO,QAAQ;QACvD,OAAOC,SAAS7C,aAAa+C,WAAW/C,aAAa6C,QAAQE;IAC/D;IAEA,SAASC,OAAOnB,OAA8B;QAC5C,KAAK,MAAMoB,QAAQpB,QAAS;YAC1BO,KAAKa,KAAKZ,OAAO,EAAEY;YACnB,MAAMC,WAAWpC,OAAOgC,GAAG,CAACG,KAAKZ,OAAO,KAAK,IAAItB;YACjDmC,SAASlB,GAAG,CAACiB,KAAKX,WAAW,EAAEW;YAC/BnC,OAAOkB,GAAG,CAACiB,KAAKZ,OAAO,EAAEa;QAC3B;IACF;IAEAF,OAAOzC;IAEP,SAAS4C,SAASF,IAAgB;QAChC,OAAO;YACLG,MAAMH,KAAKG,IAAI;YACff,SAASY,KAAKZ,OAAO;YACrBC,aAAaW,KAAKX,WAAW;YAC7Be,YAAYJ,KAAKI,UAAU;YAC3BC,SAASL,KAAKK,OAAO;YACrBC,eAAeN,KAAKM,aAAa;YACjC,GAAIN,KAAKO,cAAc,KAAKxD,YAAY,CAAC,IAAI;gBAAEwD,gBAAgBP,KAAKO,cAAc;YAAC,CAAC;YACpF,GAAIP,KAAKQ,cAAc,KAAKzD,YAAY,CAAC,IAAI;gBAAEyD,gBAAgBR,KAAKQ,cAAc;YAAC,CAAC;YACpFC,oBAAoBT,KAAKS,kBAAkB;QAC7C;IACF;IAEA,SAASC,KAAKV,IAAgB,EAAEW,IAAY;QAC1C,MAAM/D,QAAQgE,OAAOC,IAAI,CAACb,KAAKc,SAAS,IAAI,CAAC,GAAGC,IAAI;QACpD,MAAMtB,OAAO9B,YAAYf,MAAMoE,MAAM;QACrC,MAAMnE,QAAQD,MAAMqE,KAAK,CAACN,MAAMA,OAAOlB;QACvC,MAAMyB,OAAOP,OAAO9D,MAAMmE,MAAM;QAChC,MAAMG,UAAUR,SAAS,IAAKX,KAAKoB,aAAa,IAAI,EAAE,GAAI,EAAE;QAC5D,OAAO;YACLpF,MAAM;YACNqD,aAAaW,KAAKX,WAAW;YAC7ByB,WAAWpE,MAAMsD,KAAKc,SAAS,IAAI,CAAC,GAAGjE;YACvCwE,WAAW3E,MAAMsD,KAAKqB,SAAS,IAAI,CAAC,GAAGxE;YACvCyE,SAAS5E,MAAMsD,KAAKsB,OAAO,IAAI,CAAC,GAAG;mBAAIzE;mBAAUsE;aAAQ;YACzDC,eAAeD;YACf,GAAID,OAAOtE,MAAMoE,MAAM,GAAG;gBAAEO,WAAWhC,OAAO2B;YAAM,IAAI,CAAC,CAAC;QAC5D;IACF;IAEA,SAASM,YAAYxB,IAAgB,EAAEW,IAAgB,EAAEc,EAAU;QACjE,MAAMC,UAAU1B,KAAKc,SAAS,IAAI,CAAC;QACnC,MAAMa,WAAWhB,KAAKG,SAAS,IAAI,CAAC;QACpC,MAAMc,iBAAiB,IAAI3D,IAAI+B,KAAKoB,aAAa,IAAI,EAAE;QACvD,MAAMS,kBAAkB,IAAI5D,IAAI0C,KAAKS,aAAa,IAAI,EAAE;QACxD,MAAMU,YAAY,CAAChF,OACjBkD,KAAKqB,SAAS,EAAE,CAACvE,KAAK,KAAK6D,KAAKU,SAAS,EAAE,CAACvE,KAAK,IACjD,CAACjB,WAAWmE,KAAKsB,OAAO,EAAE,CAACxE,KAAK,EAAE6D,KAAKW,OAAO,EAAE,CAACxE,KAAK;QACxD,MAAMiF,UAAUnB,OAAOC,IAAI,CAACa,SACzBM,MAAM,CAAC,CAAClF,OAAS4E,OAAO,CAAC5E,KAAK,KAAK6E,QAAQ,CAAC7E,KAAK,IAAIgF,UAAUhF,OAC/DiE,IAAI;QACP,MAAMtB,OAAO9B,YAAYoE,QAAQf,MAAM;QACvC,MAAMnE,QAAQkF,QAAQd,KAAK,CAACQ,IAAIA,KAAKhC;QACrC,MAAMyB,OAAOO,KAAK5E,MAAMmE,MAAM;QAC9B,MAAMiB,UAAUR,OAAO;QACvB,MAAMF,YAAYL,OAAOa,QAAQf,MAAM,GAAG,CAAC,QAAQ,EAAEjD,aAAa0B,IAAI,EAAE,GAAG1C;QAC3E,IAAIwE,cAAcxE,WAAWgB,aAAagB,GAAG,CAACwC,WAAW;YAAEvB;YAAMW;YAAMc,IAAIP;QAAK;QAChF,MAAMC,UAAUc,UACZ;eAAIL;SAAe,CAACI,MAAM,CAAC,CAACrC,SAAW,CAACkC,gBAAgBrC,GAAG,CAACG,WAAWmC,UAAUnC,WACjF,EAAE;QACN,OAAO;YACL3D,MAAM;YACNqD,aAAaW,KAAKX,WAAW;YAC7ByB,WAAWpE,MAAMgF,SAAS7E;YAC1BwE,WAAW3E,MAAMsD,KAAKqB,SAAS,IAAI,CAAC,GAAGxE;YACvCyE,SAAS5E,MAAMsD,KAAKsB,OAAO,IAAI,CAAC,GAAG;mBAAIzE;mBAAUsE;aAAQ;YACzDC,eAAeD;YACfe,UAAUD,UACN;mBACKrB,OAAOC,IAAI,CAACc,UAAUK,MAAM,CAC7B,CAAClF,OAAS,CAAEA,CAAAA,QAAQ4E,OAAM,KAAM,CAACE,eAAepC,GAAG,CAAC1C;mBAEnD;uBAAI+E;iBAAgB,CAACG,MAAM,CAC5B,CAACrC,SAAW,CAACiC,eAAepC,GAAG,CAACG,WAAW,CAAEA,CAAAA,UAAU+B,OAAM;aAEhE,CAACX,IAAI,KACN,EAAE;YACN,GAAIQ,cAAcxE,YAAY,CAAC,IAAI;gBAAEwE;YAAU,CAAC;QAClD;IACF;IAEA,SAASY,UAAUnD,YAAgC,EAAEoD,KAAc;QACjE,MAAMC,WAAWrD,aAAaqD,QAAQ,IAAI,EAAE;QAC5C,MAAMC,QACJ,OAAOF,UAAU,WAAWC,SAASE,SAAS,CAAC,CAACC,UAAYA,QAAQC,QAAQ,GAAGL,SAAS;QAC1F,MAAMzB,OAAO2B,UAAU,CAAC,IAAID,SAASrB,MAAM,GAAGsB;QAC9C,MAAM5B,OAAO2B,SAASpB,KAAK,CAACN,MAAMA,OAAQpC,CAAAA,mBAAmB8D,SAASrB,MAAM,AAAD;QAC3E,MAAM0B,OAAOhC,KAAKe,EAAE,CAAC,CAAC;QACtB,MAAMkB,SAAkC;YACtCN,UAAU3B;YACV,GAAIgC,SAAS3F,aAAa4D,OAAOD,KAAKM,MAAM,GAAGqB,SAASrB,MAAM,GAC1D;gBAAEE,MAAMwB,KAAKD,QAAQ;YAAC,IACtB,CAAC,CAAC;QACR;QACA,OAAO;YAAEzG,MAAM;YAAU2G;QAAO;IAClC;IAEA,SAASC,mBAAmBzF,OAAsB;QAChD,MAAMgD,OAAOhD,QAAQgD,IAAI;QACzB,MAAM0C,QAAS1F,QAAQ0F,KAAK,IAAI,CAAC;QAKjC,IAAI1C,SAAS,uBAAuB;YAClCzB,UAAU;YACV,MAAMM,eAAe,CAAC,aAAa,EAAEN,QAAQ;YAC7CN,SAASW,GAAG,CAACC,cAAc;gBAAEA;YAAa;YAC1C,OAAO;gBAAEhD,MAAM;gBAAU2G,QAAQ;oBAAE3D;gBAAa;YAAE;QACpD;QACA,MAAMtC,QAAQ,OAAOmG,MAAM7D,YAAY,KAAK,WAAW6D,MAAM7D,YAAY,GAAG;QAC5E,MAAMA,eAAeZ,SAASyB,GAAG,CAACnD;QAClC,IAAIsC,iBAAiBjC,WAAW;YAC9B,OAAO;gBAAEf,MAAM;gBAAY8G,MAAM;gBAAwBC,QAAQ;oBAAE/D,cAActC;gBAAM;YAAE;QAC3F;QACA,MAAMR,UAAU8C,aAAagE,QAAQ,EAAE,CAAC7C,KAAK;QAC7C,IAAIjE,YAAYa,WAAW,OAAOb;QAClC,IAAIiE,SAAS,wBAAwB,OAAOgC,UAAUnD,cAAc6D,MAAMT,KAAK;QAC/E,IAAIjC,SAAS,qBAAqB;YAChCzB,UAAU;YACV,MAAMuE,OAAO,CAAC,KAAK,EAAEvE,QAAQ;YAC7BL,SAASU,GAAG,CAACkE,MAAMvG;YACnB,OAAO;gBAAEV,MAAM;gBAAU2G,QAAQ;oBAAEM;gBAAK;YAAE;QAC5C;QACA,IAAI9C,SAAS,uBAAuB;YAClC,MAAM8C,OAAO,OAAOJ,MAAMI,IAAI,KAAK,WAAWJ,MAAMI,IAAI,GAAG;YAC3D,IAAI3E,OAAOkB,GAAG,CAACyD,SAAS,CAAC5E,SAASmB,GAAG,CAACyD,OAAO;gBAC3C,OAAO;oBAAEjH,MAAM;oBAAY8G,MAAM;oBAAeC,QAAQ;wBAAEE;oBAAK;gBAAE;YACnE;YACA5E,SAAS6E,MAAM,CAACD;YAChB,OAAO;gBAAEjH,MAAM;gBAAU2G,QAAQ;oBAAEM;oBAAME,WAAW;gBAAK;YAAE;QAC7D;QACA,IAAIhD,SAAS,uBAAuB/B,SAAS8E,MAAM,CAACxG;QACpD,OAAO;YAAEV,MAAM;YAAU2G,QAAQ;gBAAE3D,cAActC;YAAM;QAAE;IAC3D;IAEA,SAAS0G;QACP,OAAO;YACLpH,MAAM;YACNwB;YACAD;YACAD,OAAOA,MAAM+F,GAAG,CAACnD;YACjBzC;YACAC;YACApB;QACF;IACF;IAEA,OAAO;QACLgH,UAASpC,IAAI;YACX5D,QAAQ;mBAAI4D;aAAK;YACjBnB,OAAOzC;QACT;QACAiG,kBAAiBrC,IAAI;YACnBvC,oBAAoBuC;QACtB;QACAsC,mBAAkBC,YAAY;YAC5B,KAAK,MAAMC,YAAY1F,UAAW0F,SAASD;QAC7C;QACAE,oBAAmBC,KAAK;YACtB,IAAIA,MAAM5H,IAAI,KAAK,oBAAoB;gBACrCsC,OAAOuF,GAAG,CAACD,MAAMpB,OAAO,CAACS,IAAI;gBAC7B5E,SAAS6E,MAAM,CAACU,MAAMpB,OAAO,CAACS,IAAI;YACpC;YACA,KAAK,MAAMa,YAAY5F,UAAW4F,SAASF;QAC7C;QACAG,mBAAkBC,IAAI;YACpB,KAAK,MAAMN,YAAYvF,cAAeuF,SAASM;QACjD;QACAC;YACE,OAAOzF;QACT;QACA0F;YACE,OAAOzF;QACT;QACAQ,eAAe;YACbkF,WAAUjD,IAAI;gBACZzC,aAAa;uBAAIyC;iBAAK;YACxB;YACAkD,SAAQC,MAAM;gBACZnG,UAAU2F,GAAG,CAACQ;gBACd,OAAO;oBACLnG,UAAUgF,MAAM,CAACmB;gBACnB;YACF;QACF;QACAC,aAAa;YACXF,SAAQC,MAAM;gBACZlG,cAAc0F,GAAG,CAACQ;gBAClB,OAAO;oBACLlG,cAAc+E,MAAM,CAACmB;gBACvB;YACF;QACF;QACAE,cAAc;YACZC,QAAOC,QAAQ;gBACbjG,WAAW;uBAAIiG;iBAAS;YAC1B;YACAL,SAAQC,MAAM;gBACZrG,UAAU6F,GAAG,CAACQ;gBACd,OAAO;oBACLrG,UAAUkF,MAAM,CAACmB;gBACnB;YACF;QACF;QACAK,QAAOC,SAAS,EAAE1H,MAAM;YACtB,IAAIA,WAAWF,WAAW,OAAOa,OAAO,CAAC+G,UAAU;iBAC9C/G,OAAO,CAAC+G,UAAU,GAAG1H;QAC5B;QACA,MAAM2H,OAAMC,cAAc,EAAE1H,OAAO;YACjC,OAAOH,cACLY,QAAQgH,KAAK,EACb;gBACE,MAAM5E,OAAO1C,MAAMwH,IAAI,CAAC,CAAChG,QAAUA,MAAMM,OAAO,KAAKjC,QAAQiC,OAAO;gBACpE,MAAMnC,SAASE,QAAQ4H,QAAQ,KAAK,eAAe/E,MAAM4E,QAAQ5E,MAAMgF;gBACvE,OAAO/H,UAAU;oBAAEjB,MAAM;oBAAqBiJ,QAAQ;gBAAe;YACvE,GACA9H;QAEJ;QACA,MAAM+H;YACJ,OAAOlI,cACLY,QAAQsH,SAAS,EACjB,IAAO,CAAA,CAAC,CAAA,GACRnI;QAEJ;QACA,MAAMoI,UAASN,cAA6B;YAC1C,OAAO7H,cACLY,QAAQuH,QAAQ,EAChB/B,WACArG,WACAqI,IAAI,CAAC,CAACnI;gBACN,IAAIA,OAAOjB,IAAI,KAAK,aAAa,KAAK,MAAMgE,QAAQ/C,OAAOK,KAAK,CAAE6B,KAAKa,KAAKZ,OAAO,EAAEY;gBACrF,OAAO/C;YACT;QACF;QACAyC;QACA,MAAM2F,WAAUR,cAA6B,EAAE1H,OAAyB;YACtE,OAAOH,cACLY,QAAQyH,SAAS,EACjB;gBACE,MAAMrF,OAAO1C,MAAMwH,IAAI,CAAC,CAAChG,QAAUA,MAAMM,OAAO,KAAKjC,QAAQiC,OAAO;gBACpE,IAAIY,SAASjD,WAAW;oBACtB,OAAO;wBAAEf,MAAM;wBAAqBoD,SAASjC,QAAQiC,OAAO;oBAAC;gBAC/D;gBACA,OAAOsB,KAAKV,MAAM7C,QAAQoE,SAAS,KAAKxE,YAAY,IAAIR,OAAOY,QAAQoE,SAAS;YAClF,GACApE,SACAiI,IAAI,CAAC,CAACnI,SAAWkC,KAAKhC,QAAQiC,OAAO,EAAEnC;QAC3C;QACA,MAAMqI,SAAQT,cAA6B,EAAE1H,OAAuB;YAClE,OAAOH,cACLY,QAAQ0H,OAAO,EACf;gBACE,MAAMtF,OAAO1C,MAAMwH,IAAI,CAAC,CAAChG,QAAUA,MAAMM,OAAO,KAAKjC,QAAQiC,OAAO;gBACpE,IAAIY,SAASjD,WAAW;oBACtB,OAAO;wBAAEf,MAAM;wBAAqBoD,SAASjC,QAAQiC,OAAO;oBAAC;gBAC/D;gBACA,IAAIjC,QAAQoE,SAAS,KAAKxE,WAAW;oBACnC,MAAMwI,eAAexH,aAAa8B,GAAG,CAAC1C,QAAQoE,SAAS;oBACvD,IACEgE,iBAAiBxI,aACjBwI,aAAavF,IAAI,CAACZ,OAAO,KAAKjC,QAAQiC,OAAO,IAC7CmG,aAAa5E,IAAI,CAACtB,WAAW,KAAKlC,QAAQqI,eAAe,EACzD;wBACA,MAAM,IAAI/I,MAAM;oBAClB;oBACA,OAAO+E,YAAY+D,aAAavF,IAAI,EAAEuF,aAAa5E,IAAI,EAAE4E,aAAa9D,EAAE;gBAC1E;gBACA,IACEtE,QAAQsI,WAAW,KAAK1I,aACxB,CAAC2C,QAAQM,KAAKZ,OAAO,EAAEY,KAAKX,WAAW,EAAElC,QAAQsI,WAAW,GAC5D;oBACA,OAAO;wBAAEzJ,MAAM;wBAAqB8G,MAAM;wBAAkBC,QAAQ,CAAC;oBAAE;gBACzE;gBACA,IAAI5F,QAAQqI,eAAe,KAAKxF,KAAKX,WAAW,EAAE;oBAChD,OAAO;wBAAErD,MAAM;oBAAgB;gBACjC;gBACA,MAAM2E,OAAO9C,OAAOgC,GAAG,CAACG,KAAKZ,OAAO,GAAGS,IAAI1C,QAAQqI,eAAe;gBAClE,IAAI7E,SAAS5D,WAAW,OAAO;oBAAEf,MAAM;gBAAiB;gBACxD,OAAOwF,YAAYxB,MAAMW,MAAM;YACjC,GACAxD,SACAiI,IAAI,CAAC,CAACnI,SAAWkC,KAAKhC,QAAQiC,OAAO,EAAEnC;QAC3C;QACA,MAAMyI,QAAOb,cAA6B,EAAE1H,OAAwB;YAClE,OAAOH,cACLY,QAAQ8H,MAAM,EACd;gBACE,MAAM1F,OAAO1C,MAAMwH,IAAI,CAAC,CAAChG,QAAUA,MAAMM,OAAO,KAAKjC,QAAQiC,OAAO;gBACpE,IAAIY,SAASjD,WAAW;oBACtB,OAAO;wBAAEf,MAAM;wBAAqBoD,SAASjC,QAAQiC,OAAO;oBAAC;gBAC/D;gBACA,OAAO;oBAAEpD,MAAM;oBAAY8G,MAAM;oBAAuBC,QAAQ,CAAC;oBAAG4C,UAAU,CAAC;gBAAE;YACnF,GACAxI,SACAiI,IAAI,CAAC,CAACnI,SAAWkC,KAAKhC,QAAQiC,OAAO,EAAEnC;QAC3C;QACA,MAAMlB,SAAQ8I,cAA6B,EAAE1H,OAAuB;YAClE,OAAOH,cACLY,QAAQ7B,OAAO,EACf;gBACE,MAAMiE,OAAO1C,MAAMwH,IAAI,CAAC,CAAChG,QAAUA,MAAMM,OAAO,KAAKjC,QAAQiC,OAAO;gBACpE,IAAIY,SAASjD,WAAW;oBACtB,OAAO;wBAAEf,MAAM;wBAAqBoD,SAASjC,QAAQiC,OAAO;oBAAC;gBAC/D;gBACA,OAAO;oBACLpD,MAAM;oBACNqF,WAAW,EAAE;gBACf;YACF,GACAlE;QAEJ;QACA,MAAMyI,QAAOf,cAA6B,EAAE1H,OAAsB;YAChE,OAAOH,cACLY,QAAQgI,MAAM,EACd;gBACE,IAAIzI,QAAQgD,IAAI,CAAC0F,UAAU,CAAC,kBAAkB,OAAOjD,mBAAmBzF;gBACxE,OAAO;oBAAEnB,MAAM;oBAAY8G,MAAM;oBAAqBC,QAAQ,CAAC;gBAAE;YACnE,GACA5F,SACAiI,IAAI,CAAC,CAACnI;gBACN,IAAIA,OAAOjB,IAAI,KAAK,YAAYiB,OAAOwE,EAAE,KAAK1E,WAAWoC,KAAKlC,OAAOwE,EAAE,CAACrC,OAAO,EAAEnC,OAAOwE,EAAE;gBAC1F,OAAOxE;YACT;QACF;IACF;AACF"}
package/dist/refresh.d.ts CHANGED
@@ -9,5 +9,5 @@ export type RefreshOutcome = {
9
9
  } | {
10
10
  kind: 'beyond-horizon';
11
11
  } | RetryableRefusal | Unconfirmed | Refused | AdapterFailure;
12
- export declare function refreshRoom(adapter: Adapter, authorization: Authorization, confirmed: ConfirmedLayer, continuing: () => boolean, reach: string | undefined): Promise<RefreshOutcome>;
12
+ export declare function refreshRoom(adapter: Adapter, authorization: Authorization, confirmed: ConfirmedLayer, continuing: () => boolean, minPosition: string | undefined): Promise<RefreshOutcome>;
13
13
  //# sourceMappingURL=refresh.d.ts.map
@@ -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,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,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,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"}
package/dist/refresh.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import { readStaged } from './replica.js';
2
2
  import { unconfirmed } from './transfer.js';
3
- export async function refreshRoom(adapter, authorization, confirmed, continuing, reach) {
3
+ export async function refreshRoom(adapter, authorization, confirmed, continuing, minPosition) {
4
4
  const locator = confirmed.record.locator;
5
5
  const fromRoomVersion = confirmed.record.roomVersion;
6
6
  const first = await adapter.refresh(authorization, {
7
7
  locator,
8
8
  selection: confirmed.record.replica.selection,
9
9
  fromRoomVersion,
10
- ...reach === undefined ? {} : {
11
- reach
10
+ ...minPosition === undefined ? {} : {
11
+ minPosition
12
12
  }
13
13
  });
14
14
  if (first.kind !== 'net-advancement') return first;
@@ -52,8 +52,8 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing,
52
52
  locator,
53
53
  selection: confirmed.record.replica.selection,
54
54
  fromRoomVersion,
55
- ...reach === undefined ? {} : {
56
- reach
55
+ ...minPosition === undefined ? {} : {
56
+ minPosition
57
57
  },
58
58
  pageToken
59
59
  });
@@ -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 reach: 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 ...(reach === undefined ? {} : { reach }),\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 ...(reach === undefined ? {} : { reach }),\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","reach","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,KAAyB;IAEzB,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,UAAUS,YAAY,CAAC,IAAI;YAAET;QAAM,CAAC;IAC1C;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,UAAUS,YAAY,CAAC,IAAI;gBAAET;YAAM,CAAC;YACxC0B;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} 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"}
package/dist/replica.d.ts CHANGED
@@ -3,7 +3,7 @@ import { type Collection, type Composition } from './collection.js';
3
3
  import { type Layer } from './overlay.js';
4
4
  import { type Rewriting } from './save.js';
5
5
  import type { ReplicaRecord } from './store.js';
6
- import type { Refused, Unconfirmed } from './transfer.js';
6
+ import type { Refused } from './transfer.js';
7
7
  export type ConfirmedLayer = {
8
8
  record: ReplicaRecord;
9
9
  collection: Collection;
@@ -14,7 +14,7 @@ export type VisibleLayer = Layer & {
14
14
  export type Staged = {
15
15
  kind: 'staged';
16
16
  confirmed: ConfirmedLayer;
17
- } | Refused | Unconfirmed;
17
+ } | Refused;
18
18
  export type Replica = {
19
19
  confirmed: ConfirmedLayer;
20
20
  queue: readonly ChangeBatch[];
@@ -30,7 +30,11 @@ type ReplayStep = {
30
30
  };
31
31
  export declare function compositionOf(record: ReplicaRecord): Composition;
32
32
  export declare function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
33
+ export declare function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean;
33
34
  export declare function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
35
+ export declare function readReclassified(record: ReplicaRecord, previous: ConfirmedLayer): Staged | {
36
+ kind: 'deferred';
37
+ };
34
38
  export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], roomVersion: string): Staged;
35
39
  export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], rewriting: Rewriting, previous?: Replica): Replica;
36
40
  export declare function landed(batch: ChangeBatch, confirmed: ConfirmedLayer): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAAG,OAAO,GAAG,WAAW,CAAC;AAE3F,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAShE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAWtF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkBnF;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,GAClB,MAAM,CAyBR;AAuDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,EAAE,SAAS,EACpB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CA4CT;AAkFD,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAa7E;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC7C,SAAS,EAAE,SAAS,GACnB,SAAS,WAAW,EAAE,CAoBxB"}
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAShE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAWtF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAMnF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkBnF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAM/B;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,GAClB,MAAM,CAyBR;AAwDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,EAAE,SAAS,EACpB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CA4CT;AAkFD,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAa7E;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC7C,SAAS,EAAE,SAAS,GACnB,SAAS,WAAW,EAAE,CAoBxB"}
package/dist/replica.js CHANGED
@@ -6,12 +6,12 @@ import { providerRewritten } from './save.js';
6
6
  import { equalValue } from './room-draft.js';
7
7
  export function compositionOf(record) {
8
8
  return {
9
- collectionRoot: record.collectionRoot,
10
9
  model: record.model,
11
10
  selection: record.typedSelection === null ? null : {
12
11
  roots: record.typedSelection.roots,
13
12
  model: record.selectionModel
14
- }
13
+ },
14
+ untypedFolders: record.untypedFolders
15
15
  };
16
16
  }
17
17
  export function readConfirmed(record, previous) {
@@ -27,6 +27,9 @@ export function readConfirmed(record, previous) {
27
27
  }
28
28
  } : read;
29
29
  }
30
+ export function sameMembership(record, other) {
31
+ return JSON.stringify(record.untypedFolders) === JSON.stringify(other.untypedFolders) && JSON.stringify(record.typedSelection?.roots ?? null) === JSON.stringify(other.typedSelection?.roots ?? null);
32
+ }
30
33
  export function readStaged(record, previous) {
31
34
  if ((record.model.status === 'current' || record.selectionModel.status === 'current') && (previous === undefined || !sameLayerText(record, previous.record) || record.model !== previous.record.model || record.selectionModel !== previous.record.selectionModel)) {
32
35
  const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));
@@ -39,6 +42,16 @@ export function readStaged(record, previous) {
39
42
  }
40
43
  return readConfirmed(record, previous);
41
44
  }
45
+ export function readReclassified(record, previous) {
46
+ const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));
47
+ if (verdict.verdict !== 'refuse') return readConfirmed(record, previous);
48
+ return verdict.rule === 'model-unavailable' ? {
49
+ kind: 'deferred'
50
+ } : {
51
+ kind: 'refused',
52
+ refusal: verdict
53
+ };
54
+ }
42
55
  export function applyReturned(confirmed, documents, revisions, removals, roomVersion) {
43
56
  const nextDocuments = {
44
57
  ...confirmed.record.documents,
@@ -84,7 +97,7 @@ function predicted(confirmed, batches, previous) {
84
97
  const before = layer;
85
98
  const old = prior.get(batch.id);
86
99
  const hasMove = batch.changes.some((change)=>change.kind === 'move');
87
- const reuseRewrite = old?.collection !== undefined && sameLayerText(before, old.before) && old.collection.composition.collectionRoot === composition.collectionRoot && old.collection.composition.model === composition.model && old.collection.composition.selection?.model === composition.selection?.model && JSON.stringify(old.collection.composition.selection?.roots) === JSON.stringify(composition.selection?.roots);
100
+ const reuseRewrite = old?.collection !== undefined && sameLayerText(before, old.before) && JSON.stringify(old.collection.composition.untypedFolders) === JSON.stringify(composition.untypedFolders) && old.collection.composition.model === composition.model && old.collection.composition.selection?.model === composition.selection?.model && JSON.stringify(old.collection.composition.selection?.roots) === JSON.stringify(composition.selection?.roots);
88
101
  const collection = hasMove ? reuseRewrite ? old.collection : parseCollection(before.documents, composition, old?.collection === undefined ? {
89
102
  text: confirmed.record.documents,
90
103
  collection: confirmed.collection
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import { parse, type Document } from '@agentshouse/mdmodel';\nimport { immutable, type Change, type ChangeBatch, type Precondition } from './change.js';\nimport {\n parseCollection,\n readCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { overlay, overlayChanged, sameLayerText, type Layer } from './overlay.js';\nimport { providerRewritten, type Rewriting } from './save.js';\nimport { equalValue } from './room-draft.js';\nimport type { ReplicaRecord } from './store.js';\nimport type { Refused, Unconfirmed } from './transfer.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Staged = { kind: 'staged'; confirmed: ConfirmedLayer } | Refused | Unconfirmed;\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n replay: readonly ReplayStep[];\n};\n\ntype ReplayStep = {\n id: string;\n before: Layer;\n after: Layer;\n effective: ChangeBatch;\n collection?: Collection;\n};\n\nexport function compositionOf(record: ReplicaRecord): Composition {\n return {\n collectionRoot: record.collectionRoot,\n model: record.model,\n selection:\n record.typedSelection === null\n ? null\n : { roots: record.typedSelection.roots, model: record.selectionModel },\n };\n}\n\nexport function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n const read = readCollection(\n record.documents,\n compositionOf(record),\n previous === undefined\n ? undefined\n : { text: previous.record.documents, collection: previous.collection },\n );\n return read.kind === 'read'\n ? { kind: 'staged', confirmed: { record, collection: read.collection } }\n : read;\n}\n\nexport function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n if (\n (record.model.status === 'current' || record.selectionModel.status === 'current') &&\n (previous === undefined ||\n !sameLayerText(record, previous.record) ||\n record.model !== previous.record.model ||\n record.selectionModel !== previous.record.selectionModel)\n ) {\n const verdict = validateCollection(\n record.documents,\n record.binaryTargets,\n compositionOf(record),\n );\n if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {\n return { kind: 'refused', refusal: verdict };\n }\n }\n return readConfirmed(record, previous);\n}\n\nexport function applyReturned(\n confirmed: ConfirmedLayer,\n documents: Readonly<Record<string, string>>,\n revisions: Readonly<Record<string, string>>,\n removals: readonly string[],\n roomVersion: string,\n): Staged {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const nextChanges = { ...confirmed.record.changes };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const [path, revision] of Object.entries(revisions)) {\n if (confirmed.record.revisions[path] !== revision) delete nextChanges[path];\n }\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n delete nextChanges[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n changes: nextChanges,\n binaryTargets: [...binaryTargets].sort(),\n },\n confirmed,\n );\n}\n\nfunction predicted(\n confirmed: ConfirmedLayer,\n batches: readonly ChangeBatch[],\n previous?: Replica,\n): { layer: Layer; replay: readonly ReplayStep[] } {\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const replay: ReplayStep[] = [];\n const prior = new Map(previous?.replay.map((step) => [step.id, step]) ?? []);\n for (const batch of batches) {\n const before = layer;\n const old = prior.get(batch.id);\n const hasMove = batch.changes.some((change) => change.kind === 'move');\n const reuseRewrite =\n old?.collection !== undefined &&\n sameLayerText(before, old.before) &&\n old.collection.composition.collectionRoot === composition.collectionRoot &&\n old.collection.composition.model === composition.model &&\n old.collection.composition.selection?.model === composition.selection?.model &&\n JSON.stringify(old.collection.composition.selection?.roots) ===\n JSON.stringify(composition.selection?.roots);\n const collection = hasMove\n ? reuseRewrite\n ? old.collection\n : parseCollection(\n before.documents,\n composition,\n old?.collection === undefined\n ? { text: confirmed.record.documents, collection: confirmed.collection }\n : { text: old.before.documents, collection: old.collection },\n )\n : undefined;\n const effective =\n collection === undefined\n ? batch\n : reuseRewrite\n ? old.effective\n : providerRewritten(batch, { ...before, collection });\n layer =\n old === undefined\n ? overlay(before, [effective])\n : overlayChanged(before, [effective], old.before, [old.effective], old.after);\n replay.push({\n id: batch.id,\n before,\n after: layer,\n effective,\n ...(collection === undefined ? {} : { collection }),\n });\n }\n return { layer, replay };\n}\n\nexport function replicaOf(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n rewriting: Rewriting,\n previous?: Replica,\n): Replica {\n const batches = Object.freeze(queue.map(immutable));\n if (batches.length === 0) {\n return {\n confirmed,\n queue: batches,\n visible: {\n documents: confirmed.record.documents,\n binaryTargets: confirmed.record.binaryTargets,\n revisions: confirmed.record.revisions,\n changes: confirmed.record.changes,\n collection: confirmed.collection,\n },\n replay: [],\n };\n }\n const predictedState = rewriting === 'provider' ? predicted(confirmed, batches, previous) : null;\n const layer =\n rewriting === 'provider'\n ? predictedState!.layer\n : previous === undefined\n ? overlay(confirmed.record, batches)\n : overlayChanged(\n confirmed.record,\n batches,\n previous.confirmed.record,\n previous.queue,\n previous.visible,\n );\n return {\n confirmed,\n queue: batches,\n replay: predictedState?.replay ?? [],\n visible: {\n ...layer,\n collection: parseCollection(\n layer.documents,\n compositionOf(confirmed.record),\n previous === undefined\n ? undefined\n : { text: previous.visible.documents, collection: previous.visible.collection },\n ),\n },\n };\n}\n\nfunction present(layer: Layer, path: string): boolean {\n return layer.documents[path] !== undefined || layer.binaryTargets.includes(path);\n}\n\nfunction holds(layer: Layer, preconditions: readonly Precondition[]): boolean {\n const parsed = new Map<string, Document | null>();\n const documentAt = (path: string) => {\n if (!parsed.has(path)) {\n const text = layer.documents[path];\n const opened = text === undefined ? null : parse(text, path);\n parsed.set(path, opened?.ok === true ? opened.document : null);\n }\n return parsed.get(path) ?? null;\n };\n return preconditions.every((precondition) => {\n const path = precondition.path;\n if (precondition.kind === 'absent') return !present(layer, path);\n if (precondition.kind === 'present') return present(layer, path);\n if (precondition.kind === 'revision') {\n return present(layer, path) && layer.revisions[path] === precondition.revision;\n }\n const document = documentAt(path);\n if (document === null) return false;\n if (precondition.kind === 'field') {\n const value = Object.hasOwn(document.fields, precondition.name)\n ? document.fields[precondition.name]\n : undefined;\n return equalValue(value, precondition.value);\n }\n if (precondition.kind === 'section') {\n return (\n Object.hasOwn(document.sections, precondition.name) &&\n document.sections[precondition.name] === precondition.value\n );\n }\n return document.preamble === precondition.value;\n });\n}\n\nfunction effects(change: Change): readonly Precondition[] {\n const path = change.path;\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n return [change];\n }\n if (change.kind === 'create' && !('content' in change)) {\n return [\n { kind: 'present', path },\n ...Object.entries(change.fields).map(([name, value]): Precondition => ({\n kind: 'field',\n path,\n name,\n value,\n })),\n ...Object.entries(change.sections).map(([name, value]): Precondition => ({\n kind: 'section',\n path,\n name,\n value,\n })),\n ];\n }\n if (change.kind === 'move') {\n return [\n { kind: 'absent', path },\n { kind: 'present', path: change.to },\n ];\n }\n return [{ kind: 'absent', path }];\n}\n\nfunction after(changes: readonly Change[], index: number, path: string): string | null {\n let at = path;\n for (const change of changes.slice(index + 1)) {\n if (change.path !== at) continue;\n if (change.kind === 'remove') return null;\n if (change.kind === 'move') at = change.to;\n }\n return at;\n}\n\nexport function landed(batch: ChangeBatch, confirmed: ConfirmedLayer): boolean {\n const layer = confirmed.record;\n return batch.changes.every((change, index) => {\n if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {\n const at = after(batch.changes, index, change.path);\n return at === null || layer.documents[at] === change.content;\n }\n return effects(change).every((effect) => {\n if (effect.kind === 'absent') return holds(layer, [effect]);\n const at = after(batch.changes, index, effect.path);\n return at === null || holds(layer, [{ ...effect, path: at }]);\n });\n });\n}\n\nexport function withdrawals(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n withdrawable: (batch: ChangeBatch) => boolean,\n rewriting: Rewriting,\n): readonly ChangeBatch[] {\n if (!queue.some(withdrawable)) return [];\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const withdrawn: ChangeBatch[] = [];\n for (const batch of queue) {\n if (withdrawable(batch) && !holds(layer, batch.preconditions)) {\n withdrawn.push(batch);\n continue;\n }\n const effective =\n rewriting === 'provider' && batch.changes.some((change) => change.kind === 'move')\n ? providerRewritten(batch, {\n ...layer,\n collection: parseCollection(layer.documents, composition),\n })\n : batch;\n layer = overlay(layer, [effective]);\n }\n return withdrawn;\n}\n"],"names":["parse","immutable","parseCollection","readCollection","validateCollection","overlay","overlayChanged","sameLayerText","providerRewritten","equalValue","compositionOf","record","collectionRoot","model","selection","typedSelection","roots","selectionModel","readConfirmed","previous","read","documents","undefined","text","collection","kind","confirmed","readStaged","status","verdict","binaryTargets","rule","refusal","applyReturned","revisions","removals","roomVersion","nextDocuments","nextRevisions","nextChanges","changes","Set","path","revision","Object","entries","delete","sort","predicted","batches","composition","layer","replay","prior","Map","map","step","id","batch","before","old","get","hasMove","some","change","reuseRewrite","JSON","stringify","effective","after","push","replicaOf","queue","rewriting","freeze","length","visible","predictedState","present","includes","holds","preconditions","parsed","documentAt","has","opened","set","ok","document","every","precondition","value","hasOwn","fields","name","sections","preamble","effects","to","index","at","slice","landed","content","effect","withdrawals","withdrawable","withdrawn"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import { parse, type Document } from '@agentshouse/mdmodel';\nimport { immutable, type Change, type ChangeBatch, type Precondition } from './change.js';\nimport {\n parseCollection,\n readCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { overlay, overlayChanged, sameLayerText, type Layer } from './overlay.js';\nimport { providerRewritten, type Rewriting } from './save.js';\nimport { equalValue } from './room-draft.js';\nimport type { ReplicaRecord } from './store.js';\nimport type { Refused } from './transfer.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Staged = { kind: 'staged'; confirmed: ConfirmedLayer } | Refused;\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n replay: readonly ReplayStep[];\n};\n\ntype ReplayStep = {\n id: string;\n before: Layer;\n after: Layer;\n effective: ChangeBatch;\n collection?: Collection;\n};\n\nexport function compositionOf(record: ReplicaRecord): Composition {\n return {\n model: record.model,\n selection:\n record.typedSelection === null\n ? null\n : { roots: record.typedSelection.roots, model: record.selectionModel },\n untypedFolders: record.untypedFolders,\n };\n}\n\nexport function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n const read = readCollection(\n record.documents,\n compositionOf(record),\n previous === undefined\n ? undefined\n : { text: previous.record.documents, collection: previous.collection },\n );\n return read.kind === 'read'\n ? { kind: 'staged', confirmed: { record, collection: read.collection } }\n : read;\n}\n\nexport function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean {\n return (\n JSON.stringify(record.untypedFolders) === JSON.stringify(other.untypedFolders) &&\n JSON.stringify(record.typedSelection?.roots ?? null) ===\n JSON.stringify(other.typedSelection?.roots ?? null)\n );\n}\n\nexport function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n if (\n (record.model.status === 'current' || record.selectionModel.status === 'current') &&\n (previous === undefined ||\n !sameLayerText(record, previous.record) ||\n record.model !== previous.record.model ||\n record.selectionModel !== previous.record.selectionModel)\n ) {\n const verdict = validateCollection(\n record.documents,\n record.binaryTargets,\n compositionOf(record),\n );\n if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {\n return { kind: 'refused', refusal: verdict };\n }\n }\n return readConfirmed(record, previous);\n}\n\nexport function readReclassified(\n record: ReplicaRecord,\n previous: ConfirmedLayer,\n): Staged | { kind: 'deferred' } {\n const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));\n if (verdict.verdict !== 'refuse') return readConfirmed(record, previous);\n return verdict.rule === 'model-unavailable'\n ? { kind: 'deferred' }\n : { kind: 'refused', refusal: verdict };\n}\n\nexport function applyReturned(\n confirmed: ConfirmedLayer,\n documents: Readonly<Record<string, string>>,\n revisions: Readonly<Record<string, string>>,\n removals: readonly string[],\n roomVersion: string,\n): Staged {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const nextChanges = { ...confirmed.record.changes };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const [path, revision] of Object.entries(revisions)) {\n if (confirmed.record.revisions[path] !== revision) delete nextChanges[path];\n }\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n delete nextChanges[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n changes: nextChanges,\n binaryTargets: [...binaryTargets].sort(),\n },\n confirmed,\n );\n}\n\nfunction predicted(\n confirmed: ConfirmedLayer,\n batches: readonly ChangeBatch[],\n previous?: Replica,\n): { layer: Layer; replay: readonly ReplayStep[] } {\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const replay: ReplayStep[] = [];\n const prior = new Map(previous?.replay.map((step) => [step.id, step]) ?? []);\n for (const batch of batches) {\n const before = layer;\n const old = prior.get(batch.id);\n const hasMove = batch.changes.some((change) => change.kind === 'move');\n const reuseRewrite =\n old?.collection !== undefined &&\n sameLayerText(before, old.before) &&\n JSON.stringify(old.collection.composition.untypedFolders) ===\n JSON.stringify(composition.untypedFolders) &&\n old.collection.composition.model === composition.model &&\n old.collection.composition.selection?.model === composition.selection?.model &&\n JSON.stringify(old.collection.composition.selection?.roots) ===\n JSON.stringify(composition.selection?.roots);\n const collection = hasMove\n ? reuseRewrite\n ? old.collection\n : parseCollection(\n before.documents,\n composition,\n old?.collection === undefined\n ? { text: confirmed.record.documents, collection: confirmed.collection }\n : { text: old.before.documents, collection: old.collection },\n )\n : undefined;\n const effective =\n collection === undefined\n ? batch\n : reuseRewrite\n ? old.effective\n : providerRewritten(batch, { ...before, collection });\n layer =\n old === undefined\n ? overlay(before, [effective])\n : overlayChanged(before, [effective], old.before, [old.effective], old.after);\n replay.push({\n id: batch.id,\n before,\n after: layer,\n effective,\n ...(collection === undefined ? {} : { collection }),\n });\n }\n return { layer, replay };\n}\n\nexport function replicaOf(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n rewriting: Rewriting,\n previous?: Replica,\n): Replica {\n const batches = Object.freeze(queue.map(immutable));\n if (batches.length === 0) {\n return {\n confirmed,\n queue: batches,\n visible: {\n documents: confirmed.record.documents,\n binaryTargets: confirmed.record.binaryTargets,\n revisions: confirmed.record.revisions,\n changes: confirmed.record.changes,\n collection: confirmed.collection,\n },\n replay: [],\n };\n }\n const predictedState = rewriting === 'provider' ? predicted(confirmed, batches, previous) : null;\n const layer =\n rewriting === 'provider'\n ? predictedState!.layer\n : previous === undefined\n ? overlay(confirmed.record, batches)\n : overlayChanged(\n confirmed.record,\n batches,\n previous.confirmed.record,\n previous.queue,\n previous.visible,\n );\n return {\n confirmed,\n queue: batches,\n replay: predictedState?.replay ?? [],\n visible: {\n ...layer,\n collection: parseCollection(\n layer.documents,\n compositionOf(confirmed.record),\n previous === undefined\n ? undefined\n : { text: previous.visible.documents, collection: previous.visible.collection },\n ),\n },\n };\n}\n\nfunction present(layer: Layer, path: string): boolean {\n return layer.documents[path] !== undefined || layer.binaryTargets.includes(path);\n}\n\nfunction holds(layer: Layer, preconditions: readonly Precondition[]): boolean {\n const parsed = new Map<string, Document | null>();\n const documentAt = (path: string) => {\n if (!parsed.has(path)) {\n const text = layer.documents[path];\n const opened = text === undefined ? null : parse(text, path);\n parsed.set(path, opened?.ok === true ? opened.document : null);\n }\n return parsed.get(path) ?? null;\n };\n return preconditions.every((precondition) => {\n const path = precondition.path;\n if (precondition.kind === 'absent') return !present(layer, path);\n if (precondition.kind === 'present') return present(layer, path);\n if (precondition.kind === 'revision') {\n return present(layer, path) && layer.revisions[path] === precondition.revision;\n }\n const document = documentAt(path);\n if (document === null) return false;\n if (precondition.kind === 'field') {\n const value = Object.hasOwn(document.fields, precondition.name)\n ? document.fields[precondition.name]\n : undefined;\n return equalValue(value, precondition.value);\n }\n if (precondition.kind === 'section') {\n return (\n Object.hasOwn(document.sections, precondition.name) &&\n document.sections[precondition.name] === precondition.value\n );\n }\n return document.preamble === precondition.value;\n });\n}\n\nfunction effects(change: Change): readonly Precondition[] {\n const path = change.path;\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n return [change];\n }\n if (change.kind === 'create' && !('content' in change)) {\n return [\n { kind: 'present', path },\n ...Object.entries(change.fields).map(([name, value]): Precondition => ({\n kind: 'field',\n path,\n name,\n value,\n })),\n ...Object.entries(change.sections).map(([name, value]): Precondition => ({\n kind: 'section',\n path,\n name,\n value,\n })),\n ];\n }\n if (change.kind === 'move') {\n return [\n { kind: 'absent', path },\n { kind: 'present', path: change.to },\n ];\n }\n return [{ kind: 'absent', path }];\n}\n\nfunction after(changes: readonly Change[], index: number, path: string): string | null {\n let at = path;\n for (const change of changes.slice(index + 1)) {\n if (change.path !== at) continue;\n if (change.kind === 'remove') return null;\n if (change.kind === 'move') at = change.to;\n }\n return at;\n}\n\nexport function landed(batch: ChangeBatch, confirmed: ConfirmedLayer): boolean {\n const layer = confirmed.record;\n return batch.changes.every((change, index) => {\n if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {\n const at = after(batch.changes, index, change.path);\n return at === null || layer.documents[at] === change.content;\n }\n return effects(change).every((effect) => {\n if (effect.kind === 'absent') return holds(layer, [effect]);\n const at = after(batch.changes, index, effect.path);\n return at === null || holds(layer, [{ ...effect, path: at }]);\n });\n });\n}\n\nexport function withdrawals(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n withdrawable: (batch: ChangeBatch) => boolean,\n rewriting: Rewriting,\n): readonly ChangeBatch[] {\n if (!queue.some(withdrawable)) return [];\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const withdrawn: ChangeBatch[] = [];\n for (const batch of queue) {\n if (withdrawable(batch) && !holds(layer, batch.preconditions)) {\n withdrawn.push(batch);\n continue;\n }\n const effective =\n rewriting === 'provider' && batch.changes.some((change) => change.kind === 'move')\n ? providerRewritten(batch, {\n ...layer,\n collection: parseCollection(layer.documents, composition),\n })\n : batch;\n layer = overlay(layer, [effective]);\n }\n return withdrawn;\n}\n"],"names":["parse","immutable","parseCollection","readCollection","validateCollection","overlay","overlayChanged","sameLayerText","providerRewritten","equalValue","compositionOf","record","model","selection","typedSelection","roots","selectionModel","untypedFolders","readConfirmed","previous","read","documents","undefined","text","collection","kind","confirmed","sameMembership","other","JSON","stringify","readStaged","status","verdict","binaryTargets","rule","refusal","readReclassified","applyReturned","revisions","removals","roomVersion","nextDocuments","nextRevisions","nextChanges","changes","Set","path","revision","Object","entries","delete","sort","predicted","batches","composition","layer","replay","prior","Map","map","step","id","batch","before","old","get","hasMove","some","change","reuseRewrite","effective","after","push","replicaOf","queue","rewriting","freeze","length","visible","predictedState","present","includes","holds","preconditions","parsed","documentAt","has","opened","set","ok","document","every","precondition","value","hasOwn","fields","name","sections","preamble","effects","to","index","at","slice","landed","content","effect","withdrawals","withdrawable","withdrawn"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,cAAc,EAAE,eAAe,CAAC;IACnD,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAwK9C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAOxF;AA2MD,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CA8FxD"}
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,cAAc,EAAE,eAAe,CAAC;IACnD,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAwK9C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAOxF;AA2MD,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAgGxD"}
package/dist/save.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { definitionOf } from './model.js';
2
2
  import { apply, links, parse, retarget, serialize, target } from '@agentshouse/mdmodel';
3
3
  import { immutable } from './change.js';
4
- import { governing, parseCollection, validateCollection } from './collection.js';
4
+ import { governing, untyped, parseCollection, validateCollection } from './collection.js';
5
5
  import { changeBatchIdentity } from './identity.js';
6
6
  import { overlay } from './overlay.js';
7
7
  import { covered, normalize, relative } from './paths.js';
@@ -436,7 +436,7 @@ export function buildBatch(input) {
436
436
  };
437
437
  const typedPaths = [
438
438
  ...new Set(predicted.changes.flatMap(affected))
439
- ].filter((path)=>typed(input.visible.documents[path]) || typed(resulting.documents[path]));
439
+ ].filter((path)=>!untyped(input.composition.untypedFolders, path) && (typed(input.visible.documents[path]) || typed(resulting.documents[path])));
440
440
  const needsModel = typedPaths.length > 0;
441
441
  const withoutModel = typedPaths.find((path)=>governing(input.composition, path).status === 'unavailable');
442
442
  if (withoutModel !== undefined) return refuse('model-unavailable', withoutModel);