@agentshouse/mdruntime 0.1.0-alpha.5 → 0.1.0-alpha.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/AGENTS.md +210 -0
  2. package/README.md +44 -0
  3. package/dist/adapter.d.ts +253 -19
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +2 -1
  6. package/dist/adapter.js.map +1 -1
  7. package/dist/attachment.d.ts +3 -0
  8. package/dist/attachment.d.ts.map +1 -0
  9. package/dist/attachment.js +11 -0
  10. package/dist/attachment.js.map +1 -0
  11. package/dist/bootstrap.d.ts +7 -6
  12. package/dist/bootstrap.d.ts.map +1 -1
  13. package/dist/bootstrap.js +30 -10
  14. package/dist/bootstrap.js.map +1 -1
  15. package/dist/change-set.d.ts +33 -0
  16. package/dist/change-set.d.ts.map +1 -0
  17. package/dist/change-set.js +95 -0
  18. package/dist/change-set.js.map +1 -0
  19. package/dist/change.d.ts +10 -0
  20. package/dist/change.d.ts.map +1 -1
  21. package/dist/change.js.map +1 -1
  22. package/dist/client.d.ts +75 -0
  23. package/dist/client.d.ts.map +1 -0
  24. package/dist/client.js +237 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/collection.d.ts +26 -12
  27. package/dist/collection.d.ts.map +1 -1
  28. package/dist/collection.js +78 -31
  29. package/dist/collection.js.map +1 -1
  30. package/dist/connection.d.ts +85 -28
  31. package/dist/connection.d.ts.map +1 -1
  32. package/dist/connection.js +1756 -510
  33. package/dist/connection.js.map +1 -1
  34. package/dist/conversation.d.ts +79 -0
  35. package/dist/conversation.d.ts.map +1 -0
  36. package/dist/conversation.js +635 -0
  37. package/dist/conversation.js.map +1 -0
  38. package/dist/durability.d.ts +8 -3
  39. package/dist/durability.d.ts.map +1 -1
  40. package/dist/durability.js +8 -62
  41. package/dist/durability.js.map +1 -1
  42. package/dist/file.d.ts +20 -0
  43. package/dist/file.d.ts.map +1 -0
  44. package/dist/file.js +149 -0
  45. package/dist/file.js.map +1 -0
  46. package/dist/host.d.ts +14 -0
  47. package/dist/host.d.ts.map +1 -0
  48. package/dist/host.js +213 -0
  49. package/dist/host.js.map +1 -0
  50. package/dist/identity.d.ts +3 -0
  51. package/dist/identity.d.ts.map +1 -0
  52. package/dist/identity.js +23 -0
  53. package/dist/identity.js.map +1 -0
  54. package/dist/index.d.ts +15 -7
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/memory.d.ts +19 -2
  59. package/dist/memory.d.ts.map +1 -1
  60. package/dist/memory.js +283 -24
  61. package/dist/memory.js.map +1 -1
  62. package/dist/model.d.ts +55 -0
  63. package/dist/model.d.ts.map +1 -0
  64. package/dist/model.js +36 -0
  65. package/dist/model.js.map +1 -0
  66. package/dist/observation.d.ts +25 -0
  67. package/dist/observation.d.ts.map +1 -0
  68. package/dist/observation.js +92 -0
  69. package/dist/observation.js.map +1 -0
  70. package/dist/outcome.d.ts +22 -18
  71. package/dist/outcome.d.ts.map +1 -1
  72. package/dist/outcome.js +1 -11
  73. package/dist/outcome.js.map +1 -1
  74. package/dist/overlay.d.ts +9 -2
  75. package/dist/overlay.d.ts.map +1 -1
  76. package/dist/overlay.js +145 -6
  77. package/dist/overlay.js.map +1 -1
  78. package/dist/paths.d.ts +0 -1
  79. package/dist/paths.d.ts.map +1 -1
  80. package/dist/paths.js +0 -4
  81. package/dist/paths.js.map +1 -1
  82. package/dist/query.d.ts +213 -0
  83. package/dist/query.d.ts.map +1 -0
  84. package/dist/query.js +470 -0
  85. package/dist/query.js.map +1 -0
  86. package/dist/read-side.d.ts +14 -0
  87. package/dist/read-side.d.ts.map +1 -0
  88. package/dist/read-side.js +457 -0
  89. package/dist/read-side.js.map +1 -0
  90. package/dist/refresh.d.ts +4 -4
  91. package/dist/refresh.d.ts.map +1 -1
  92. package/dist/refresh.js +40 -10
  93. package/dist/refresh.js.map +1 -1
  94. package/dist/replica.d.ts +27 -4
  95. package/dist/replica.d.ts.map +1 -1
  96. package/dist/replica.js +255 -13
  97. package/dist/replica.js.map +1 -1
  98. package/dist/room-draft.d.ts +124 -0
  99. package/dist/room-draft.d.ts.map +1 -0
  100. package/dist/room-draft.js +406 -0
  101. package/dist/room-draft.js.map +1 -0
  102. package/dist/rows.d.ts +41 -0
  103. package/dist/rows.d.ts.map +1 -0
  104. package/dist/rows.js +102 -0
  105. package/dist/rows.js.map +1 -0
  106. package/dist/save.d.ts +11 -2
  107. package/dist/save.d.ts.map +1 -1
  108. package/dist/save.js +116 -128
  109. package/dist/save.js.map +1 -1
  110. package/dist/search.d.ts +61 -0
  111. package/dist/search.d.ts.map +1 -0
  112. package/dist/search.js +155 -0
  113. package/dist/search.js.map +1 -0
  114. package/dist/status.d.ts +9 -2
  115. package/dist/status.d.ts.map +1 -1
  116. package/dist/status.js +5 -4
  117. package/dist/status.js.map +1 -1
  118. package/dist/store.d.ts +90 -18
  119. package/dist/store.d.ts.map +1 -1
  120. package/dist/store.js +492 -67
  121. package/dist/store.js.map +1 -1
  122. package/dist/transfer.d.ts +5 -0
  123. package/dist/transfer.d.ts.map +1 -1
  124. package/dist/transfer.js.map +1 -1
  125. package/dist/wire.d.ts +64 -0
  126. package/dist/wire.d.ts.map +1 -0
  127. package/dist/wire.js +145 -0
  128. package/dist/wire.js.map +1 -0
  129. package/package.json +15 -13
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/memory.ts"],"sourcesContent":["import {\n ROOM_CONTRACT_VERSION,\n type ActionRequest,\n type ActionResult,\n type Adapter,\n type Authorization,\n type BootstrapRequest,\n type BootstrapResult,\n type Capability,\n type DiscoverResult,\n type DiscoveredRoom,\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} from './adapter.js';\nimport { MD_MODEL } from './collection.js';\n\nexport type MemoryRoom = DiscoveredRoom & {\n documents?: Readonly<Record<string, string>>;\n revisions?: Readonly<Record<string, string>>;\n binaryTargets?: readonly string[];\n};\n\nexport type MemoryAdapterOptions = {\n rooms?: readonly MemoryRoom[];\n pageSize?: number;\n mdModel?: MdModelIdentity;\n supportedVersions?: readonly number[];\n capabilities?: readonly Capability[];\n providerLimits?: readonly ProviderLimit[];\n retention?: Retention;\n origins?: readonly string[];\n};\n\nexport type MemoryAdapter = Adapter & {\n setRooms(rooms: readonly MemoryRoom[]): void;\n script(operation: keyof Adapter, answer: unknown): void;\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(\n source: Readonly<Record<string, string>>,\n paths: readonly string[],\n): Readonly<Record<string, string>> {\n const taken: Record<string, string> = {};\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 = options.retention ?? { history: 1, outcome: 1, refreshHorizon: 1 };\n const origins = options.origins ?? ['https://origin.example'];\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\n function retain(entries: readonly MemoryRoom[]) {\n for (const room of entries) {\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 writeGrants: room.writeGrants,\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 return {\n kind: 'bootstrap',\n roomVersion: room.roomVersion,\n documents: named(room.documents ?? {}, taken),\n revisions: named(room.revisions ?? {}, taken),\n binaryTargets: from === 0 ? (room.binaryTargets ?? []) : [],\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 changed = Object.keys(current)\n .filter((path) => current[path] !== previous[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 return {\n kind: 'net-advancement',\n roomVersion: room.roomVersion,\n documents: named(current, taken),\n revisions: named(room.revisions ?? {}, taken),\n binaryTargets: opening\n ? [...currentTargets].filter((target) => !previousTargets.has(target))\n : [],\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 discovery(): DiscoverResult {\n return {\n kind: 'discovery',\n supportedVersions,\n mdModel,\n rooms: rooms.map(declared),\n capabilities,\n providerLimits,\n retention,\n origins,\n };\n }\n\n return {\n setRooms(next) {\n rooms = [...next];\n retain(rooms);\n },\n script(operation, answer) {\n if (answer === undefined) delete scripts[operation];\n else scripts[operation] = answer;\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 );\n },\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 );\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 (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 );\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', text: '', affected: {} };\n },\n request,\n );\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 kind: 'rejected',\n text: '',\n }),\n request,\n );\n },\n };\n}\n"],"names":["ROOM_CONTRACT_VERSION","MD_MODEL","named","source","paths","taken","path","value","undefined","resolveScript","answer","fallback","request","createMemoryAdapter","options","rooms","mdModel","supportedVersions","capabilities","providerLimits","retention","history","outcome","refreshHorizon","origins","pageSize","scripts","served","Map","refreshPages","retain","entries","room","versions","get","locator","set","roomVersion","declared","name","writeGrants","providerOwnedPaths","page","from","Object","keys","documents","sort","size","length","slice","next","kind","revisions","binaryTargets","pageToken","String","advancement","at","current","previous","currentTargets","Set","previousTargets","changed","filter","opening","target","has","removals","discovery","map","setRooms","script","operation","authorize","discover","_authorization","bootstrap","find","entry","Number","refresh","continuation","fromRoomVersion","Error","mutate","text","affected","action"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/memory.ts"],"sourcesContent":["import type { ModelResult } from './model.js';\nimport {\n ROOM_CONTRACT_VERSION,\n type AcceptedMessage,\n type ActionRequest,\n type ActionResult,\n type Adapter,\n type Authorization,\n type BootstrapRequest,\n type BootstrapResult,\n type Capability,\n type ConversationAction,\n type ConversationEvent,\n type ConversationHistories,\n type ConversationHistoryPage,\n type DiscoverResult,\n type DiscoveredRoom,\n type HeadChange,\n type HistoryRequest,\n type HistoryResult,\n type MdModelIdentity,\n type MutationRequest,\n type MutationResult,\n type ProviderLimit,\n type RefreshRequest,\n type RefreshResult,\n type Retention,\n type RoomAttachment,\n type RoomVersionNotification,\n type ServiceMode,\n} from './adapter.js';\nimport { MD_MODEL } from './collection.js';\nimport { sameChange } from './overlay.js';\n\nconst FIXTURE_RETENTION: Retention = {\n history: { kind: 'duration', seconds: 1 },\n outcome: 1,\n refreshHorizon: 1,\n};\n\nfunction declaredRetention(value: Retention | undefined): Retention {\n const retention = value ?? FIXTURE_RETENTION;\n if (retention.history.kind === 'no-declared-time-bound') return retention;\n if (Number.isFinite(retention.history.seconds) && retention.history.seconds > 0) {\n return retention;\n }\n throw new Error('history retention duration must be a finite positive number of seconds');\n}\n\nexport type MemoryRoom = DiscoveredRoom & {\n model?: ModelResult;\n selectionModel?: ModelResult;\n documents?: Readonly<Record<string, string>>;\n revisions?: Readonly<Record<string, string>>;\n changes?: Readonly<Record<string, HeadChange>>;\n binaryTargets?: readonly string[];\n attachments?: readonly RoomAttachment[];\n};\n\nexport type MemoryConversation = {\n conversation: string;\n messages?: readonly AcceptedMessage[];\n outcomes?: Partial<Record<ConversationAction, ActionResult>>;\n};\n\nexport type MemoryAdapterOptions = {\n rooms?: readonly MemoryRoom[];\n conversations?: readonly MemoryConversation[];\n historyPageSize?: number;\n pageSize?: number;\n mdModel?: MdModelIdentity;\n supportedVersions?: readonly number[];\n capabilities?: readonly Capability[];\n providerLimits?: readonly ProviderLimit[];\n retention?: Retention;\n};\n\nexport type MemoryAdapter = Adapter & {\n setRooms(rooms: readonly MemoryRoom[]): void;\n setConversations(conversations: readonly MemoryConversation[]): void;\n script(operation: keyof Adapter, answer: unknown): void;\n notifyRoomVersion(notification: RoomVersionNotification): void;\n notifyConversation(event: ConversationEvent): void;\n notifyServiceMode(mode: ServiceMode): void;\n selectedRooms(): readonly string[];\n replicatedConversations(): readonly string[];\n};\n\ntype Script<T, R> = T | ((request: R) => T | Promise<T>);\n\ntype RefreshContinuation = {\n room: MemoryRoom;\n from: MemoryRoom;\n at: number;\n};\n\nfunction named<T>(\n source: Readonly<Record<string, T>>,\n paths: readonly string[],\n): Readonly<Record<string, T>> {\n const taken: Record<string, T> = {};\n for (const path of paths) {\n const value = source[path];\n if (value !== undefined) taken[path] = value;\n }\n return taken;\n}\n\nasync function resolveScript<T, R>(\n answer: Script<T, R> | undefined,\n fallback: () => T | Promise<T>,\n request: R,\n) {\n if (answer === undefined) return fallback();\n return typeof answer === 'function' ? (answer as (value: R) => T | Promise<T>)(request) : answer;\n}\n\nexport function createMemoryAdapter(options: MemoryAdapterOptions = {}): MemoryAdapter {\n let rooms = options.rooms === undefined ? [] : [...options.rooms];\n const mdModel = options.mdModel ?? MD_MODEL;\n const supportedVersions = options.supportedVersions ?? [ROOM_CONTRACT_VERSION];\n const capabilities = options.capabilities ?? [];\n const providerLimits = options.providerLimits ?? [];\n const retention = declaredRetention(options.retention);\n const pageSize = options.pageSize;\n const scripts: Partial<Record<keyof Adapter, unknown>> = {};\n const served = new Map<string, Map<string, MemoryRoom>>();\n const refreshPages = new Map<string, RefreshContinuation>();\n const observers = new Set<(notification: RoomVersionNotification) => void>();\n const listeners = new Set<(event: ConversationEvent) => void>();\n const modeObservers = new Set<(mode: ServiceMode) => void>();\n const scripted = new Map<string, MemoryConversation>();\n const unsealed = new Map<string, string>();\n const sealed = new Set<string>();\n const historyPageSize = options.historyPageSize;\n let selected: readonly string[] = [];\n let replicated: readonly string[] = [];\n let issued = 0;\n\n function scriptConversations(entries: readonly MemoryConversation[]) {\n scripted.clear();\n for (const entry of entries) scripted.set(entry.conversation, entry);\n }\n\n scriptConversations(options.conversations ?? []);\n\n const ordinals = new Map<string, number>();\n\n function note<T>(locator: string, answer: T): T {\n const roomVersion = (answer as { roomVersion?: unknown }).roomVersion;\n const key = `${locator}\\u0000${String(roomVersion)}`;\n if (typeof roomVersion === 'string' && !ordinals.has(key)) ordinals.set(key, ordinals.size);\n return answer;\n }\n\n function reached(locator: string, roomVersion: string, target: string): boolean {\n const scripted = scripts.reached as\n | boolean\n | ((locator: string, roomVersion: string, target: string) => boolean)\n | undefined;\n if (typeof scripted === 'boolean') return scripted;\n if (scripted !== undefined) return scripted(locator, roomVersion, target);\n if (roomVersion === target) return true;\n const held = ordinals.get(`${locator}\\u0000${roomVersion}`);\n const wanted = ordinals.get(`${locator}\\u0000${target}`);\n return held !== undefined && wanted !== undefined && held >= wanted;\n }\n\n function retain(entries: readonly MemoryRoom[]) {\n for (const room of entries) {\n note(room.locator, room);\n const versions = served.get(room.locator) ?? new Map<string, MemoryRoom>();\n versions.set(room.roomVersion, room);\n served.set(room.locator, versions);\n }\n }\n\n retain(rooms);\n\n function declared(room: MemoryRoom): DiscoveredRoom {\n return {\n name: room.name,\n locator: room.locator,\n roomVersion: room.roomVersion,\n operations: room.operations,\n replica: room.replica,\n attachedModel: room.attachedModel,\n ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),\n ...(room.untypedFolders === undefined ? {} : { untypedFolders: room.untypedFolders }),\n providerOwnedPaths: room.providerOwnedPaths,\n };\n }\n\n function page(room: MemoryRoom, from: number): BootstrapResult {\n const paths = Object.keys(room.documents ?? {}).sort();\n const size = pageSize ?? paths.length;\n const taken = paths.slice(from, from + size);\n const next = from + taken.length;\n const targets = from === 0 ? (room.binaryTargets ?? []) : [];\n return {\n kind: 'bootstrap',\n roomVersion: room.roomVersion,\n documents: named(room.documents ?? {}, taken),\n revisions: named(room.revisions ?? {}, taken),\n changes: named(room.changes ?? {}, [...taken, ...targets]),\n binaryTargets: targets,\n ...(from === 0 && room.attachments !== undefined ? { attachments: room.attachments } : {}),\n ...(next < paths.length ? { pageToken: String(next) } : {}),\n };\n }\n\n function advancement(room: MemoryRoom, from: MemoryRoom, at: number): RefreshResult {\n const current = room.documents ?? {};\n const previous = from.documents ?? {};\n const currentTargets = new Set(room.binaryTargets ?? []);\n const previousTargets = new Set(from.binaryTargets ?? []);\n const headMoved = (path: string) =>\n room.revisions?.[path] !== from.revisions?.[path] ||\n !sameChange(room.changes?.[path], from.changes?.[path]);\n const changed = Object.keys(current)\n .filter((path) => current[path] !== previous[path] || headMoved(path))\n .sort();\n const size = pageSize ?? changed.length;\n const taken = changed.slice(at, at + size);\n const next = at + taken.length;\n const opening = at === 0;\n const pageToken = next < changed.length ? `refresh-${refreshPages.size}` : undefined;\n if (pageToken !== undefined) refreshPages.set(pageToken, { room, from, at: next });\n const targets = opening\n ? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))\n : [];\n const attachments = room.attachments ?? [];\n const declared =\n opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);\n return {\n kind: 'net-advancement',\n roomVersion: room.roomVersion,\n documents: named(current, taken),\n revisions: named(room.revisions ?? {}, taken),\n changes: named(room.changes ?? {}, [...taken, ...targets]),\n binaryTargets: targets,\n removals: opening\n ? [\n ...Object.keys(previous).filter(\n (path) => !(path in current) && !currentTargets.has(path),\n ),\n ...[...previousTargets].filter(\n (target) => !currentTargets.has(target) && !(target in current),\n ),\n ].sort()\n : [],\n ...(declared ? { attachments } : {}),\n ...(pageToken === undefined ? {} : { pageToken }),\n };\n }\n\n function pageOf(conversation: MemoryConversation, after: unknown): ConversationHistoryPage {\n const messages = conversation.messages ?? [];\n const first =\n typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;\n const from = first === -1 ? messages.length : first;\n const page = messages.slice(from, from + (historyPageSize ?? messages.length));\n const last = page.at(-1);\n return {\n conversation: conversation.conversation,\n messages: page,\n ...(last !== undefined && from + page.length < messages.length\n ? { next: last.position }\n : {}),\n };\n }\n\n function historiesOf(input: unknown): ActionResult {\n const asked = (input as { conversations?: unknown } | null)?.conversations;\n if (!Array.isArray(asked)) return { kind: 'rejected', code: 'invalid_request', fields: {} };\n const histories: ConversationHistoryPage[] = [];\n for (const entry of asked as readonly { conversation?: unknown; after?: unknown }[]) {\n const conversation =\n typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;\n if (conversation === undefined) continue;\n const outcome = conversation.outcomes?.['conversation.history'];\n if (outcome !== undefined) return outcome;\n histories.push(pageOf(conversation, entry.after));\n }\n const result: ConversationHistories = { histories };\n return { kind: 'action', result };\n }\n\n function conversationAction(request: ActionRequest): ActionResult {\n const name = request.name as ConversationAction;\n const input = (request.input ?? {}) as {\n conversation?: unknown;\n turn?: unknown;\n };\n if (name === 'conversation.history') return historiesOf(request.input);\n if (name === 'conversation.create') {\n issued += 1;\n const conversation = `conversation-${issued}`;\n scripted.set(conversation, { conversation });\n return { kind: 'action', result: { conversation } };\n }\n const named = typeof input.conversation === 'string' ? input.conversation : '';\n const conversation = scripted.get(named);\n if (conversation === undefined) {\n return { kind: 'rejected', code: 'unknown-conversation', fields: { conversation: named } };\n }\n const outcome = conversation.outcomes?.[name];\n if (outcome !== undefined) return outcome;\n if (name === 'conversation.send') {\n issued += 1;\n const turn = `turn-${issued}`;\n unsealed.set(turn, named);\n return { kind: 'action', result: { turn } };\n }\n if (name === 'conversation.cancel') {\n const turn = typeof input.turn === 'string' ? input.turn : '';\n if (sealed.has(turn) || !unsealed.has(turn)) {\n return { kind: 'rejected', code: 'turn-sealed', fields: { turn } };\n }\n unsealed.delete(turn);\n return { kind: 'action', result: { turn, cancelled: true } };\n }\n if (name === 'conversation.delete') scripted.delete(named);\n return { kind: 'action', result: { conversation: named } };\n }\n\n function discovery(): DiscoverResult {\n return {\n kind: 'discovery',\n supportedVersions,\n mdModel,\n rooms: rooms.map(declared),\n capabilities,\n providerLimits,\n retention,\n };\n }\n\n return {\n setRooms(next) {\n rooms = [...next];\n retain(rooms);\n },\n setConversations(next) {\n scriptConversations(next);\n },\n notifyRoomVersion(notification) {\n for (const observer of observers) observer(notification);\n },\n notifyConversation(event) {\n if (event.kind === 'accepted-message') {\n sealed.add(event.message.turn);\n unsealed.delete(event.message.turn);\n }\n for (const listener of listeners) listener(event);\n },\n notifyServiceMode(mode) {\n for (const observer of modeObservers) observer(mode);\n },\n selectedRooms() {\n return selected;\n },\n replicatedConversations() {\n return replicated;\n },\n conversations: {\n replicate(next) {\n replicated = [...next];\n },\n observe(notify) {\n listeners.add(notify);\n return () => {\n listeners.delete(notify);\n };\n },\n },\n serviceMode: {\n observe(notify) {\n modeObservers.add(notify);\n return () => {\n modeObservers.delete(notify);\n };\n },\n },\n roomVersions: {\n select(locators) {\n selected = [...locators];\n },\n observe(notify) {\n observers.add(notify);\n return () => {\n observers.delete(notify);\n };\n },\n },\n script(operation, answer) {\n if (answer === undefined) delete scripts[operation];\n else scripts[operation] = answer;\n },\n async model(_authorization, request) {\n return resolveScript(\n scripts.model as Script<ModelResult, typeof request> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n const answer = request.attached === 'collection' ? room?.model : room?.selectionModel;\n return answer ?? { kind: 'model-unavailable', reason: 'not-readable' };\n },\n request,\n );\n },\n async authorize() {\n return resolveScript<Authorization, void>(\n scripts.authorize as Script<Authorization, void> | undefined,\n () => ({}),\n undefined,\n );\n },\n async discover(_authorization: Authorization) {\n return resolveScript<DiscoverResult, void>(\n scripts.discover as Script<DiscoverResult, void> | undefined,\n discovery,\n undefined,\n ).then((answer) => {\n if (answer.kind === 'discovery') for (const room of answer.rooms) note(room.locator, room);\n return answer;\n });\n },\n reached,\n async bootstrap(_authorization: Authorization, request: BootstrapRequest) {\n return resolveScript<BootstrapResult, BootstrapRequest>(\n scripts.bootstrap as Script<BootstrapResult, BootstrapRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return page(room, request.pageToken === undefined ? 0 : Number(request.pageToken));\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async refresh(_authorization: Authorization, request: RefreshRequest) {\n return resolveScript<RefreshResult, RefreshRequest>(\n scripts.refresh as Script<RefreshResult, RefreshRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n if (request.pageToken !== undefined) {\n const continuation = refreshPages.get(request.pageToken);\n if (\n continuation === undefined ||\n continuation.room.locator !== request.locator ||\n continuation.from.roomVersion !== request.fromRoomVersion\n ) {\n throw new Error('Invalid Refresh Page Token');\n }\n return advancement(continuation.room, continuation.from, continuation.at);\n }\n if (\n request.minPosition !== undefined &&\n !reached(room.locator, room.roomVersion, request.minPosition)\n ) {\n return { kind: 'retryable-refusal', code: 'replica_behind', fields: {} };\n }\n if (request.fromRoomVersion === room.roomVersion) {\n return { kind: 'still-current' };\n }\n const from = served.get(room.locator)?.get(request.fromRoomVersion);\n if (from === undefined) return { kind: 'beyond-horizon' };\n return advancement(room, from, 0);\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async mutate(_authorization: Authorization, request: MutationRequest) {\n return resolveScript<MutationResult, MutationRequest>(\n scripts.mutate as Script<MutationResult, MutationRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return { kind: 'rejected', code: 'unscripted-mutation', fields: {}, affected: {} };\n },\n request,\n ).then((answer) => note(request.locator, answer));\n },\n async history(_authorization: Authorization, request: HistoryRequest) {\n return resolveScript<HistoryResult, HistoryRequest>(\n scripts.history as Script<HistoryResult, HistoryRequest> | undefined,\n () => {\n const room = rooms.find((entry) => entry.locator === request.locator);\n if (room === undefined) {\n return { kind: 'room-not-readable', locator: request.locator };\n }\n return {\n kind: 'history',\n revisions: [],\n };\n },\n request,\n );\n },\n async action(_authorization: Authorization, request: ActionRequest) {\n return resolveScript<ActionResult, ActionRequest>(\n scripts.action as Script<ActionResult, ActionRequest> | undefined,\n () => {\n if (request.name.startsWith('conversation.')) return conversationAction(request);\n return { kind: 'rejected', code: 'unscripted-action', fields: {} };\n },\n request,\n ).then((answer) => {\n if (answer.kind === 'action' && answer.at !== undefined) note(answer.at.locator, answer.at);\n return answer;\n });\n },\n };\n}\n"],"names":["ROOM_CONTRACT_VERSION","MD_MODEL","sameChange","FIXTURE_RETENTION","history","kind","seconds","outcome","refreshHorizon","declaredRetention","value","retention","Number","isFinite","Error","named","source","paths","taken","path","undefined","resolveScript","answer","fallback","request","createMemoryAdapter","options","rooms","mdModel","supportedVersions","capabilities","providerLimits","pageSize","scripts","served","Map","refreshPages","observers","Set","listeners","modeObservers","scripted","unsealed","sealed","historyPageSize","selected","replicated","issued","scriptConversations","entries","clear","entry","set","conversation","conversations","ordinals","note","locator","roomVersion","key","String","has","size","reached","target","held","get","wanted","retain","room","versions","declared","name","operations","replica","attachedModel","typedSelection","untypedFolders","providerOwnedPaths","page","from","Object","keys","documents","sort","length","slice","next","targets","binaryTargets","revisions","changes","attachments","pageToken","advancement","at","current","previous","currentTargets","previousTargets","headMoved","changed","filter","opening","JSON","stringify","removals","pageOf","after","messages","first","findIndex","message","position","last","historiesOf","input","asked","Array","isArray","code","fields","histories","outcomes","push","result","conversationAction","turn","delete","cancelled","discovery","map","setRooms","setConversations","notifyRoomVersion","notification","observer","notifyConversation","event","add","listener","notifyServiceMode","mode","selectedRooms","replicatedConversations","replicate","observe","notify","serviceMode","roomVersions","select","locators","script","operation","model","_authorization","find","attached","selectionModel","reason","authorize","discover","then","bootstrap","refresh","continuation","fromRoomVersion","minPosition","mutate","affected","action","startsWith"],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { Definition, FieldSpec, SectionSpec, VerifiedModel } from '@agentshouse/mdmodel';
2
+ export type ModelIdentity = {
3
+ identity: string;
4
+ version: string;
5
+ };
6
+ export type ModelSnapshot = ModelIdentity & {
7
+ schema: string | null;
8
+ };
9
+ export type ModelUnavailableReason = 'not-readable' | 'revoked' | 'not-acquired' | 'version-changed' | 'invalid';
10
+ export type ModelResult = {
11
+ kind: 'model';
12
+ snapshot: ModelSnapshot;
13
+ } | {
14
+ kind: 'model-unavailable';
15
+ reason: ModelUnavailableReason;
16
+ } | {
17
+ kind: 'transport-uncertainty';
18
+ } | {
19
+ kind: 'revoked-authorization';
20
+ };
21
+ export type MdType = {
22
+ name: string;
23
+ fields: Readonly<Record<string, FieldSpec>>;
24
+ sections: Readonly<Record<string, SectionSpec>>;
25
+ };
26
+ export type ModelState = {
27
+ status: 'unavailable';
28
+ reason: ModelUnavailableReason;
29
+ } | {
30
+ status: 'current' | 'cached';
31
+ snapshot: ModelSnapshot;
32
+ verifiedWith: ModelIdentity;
33
+ types: VerifiedModel['types'];
34
+ };
35
+ export type TypesResult = {
36
+ status: 'unavailable';
37
+ reason: ModelUnavailableReason;
38
+ } | {
39
+ status: 'current' | 'cached';
40
+ identity: string;
41
+ version: string;
42
+ verifiedWith: ModelIdentity;
43
+ types: readonly MdType[];
44
+ };
45
+ export type ValidationReceipt = {
46
+ identity: string;
47
+ version: string;
48
+ source: 'current' | 'cached';
49
+ };
50
+ export declare const NO_MODEL: ModelState;
51
+ export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
52
+ export declare function modelTypes(state: ModelState): TypesResult;
53
+ export declare function cached(state: ModelState): ModelState;
54
+ export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
55
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE9F,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAC9B,cAAc,GACd,SAAS,GACT,cAAc,GACd,iBAAiB,GACjB,SAAS,CAAC;AACd,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,CAAC;AACtC,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;CACjD,CAAC;AACF,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AACN,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC;AACpG,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGhG;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAczD;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E"}
package/dist/model.js ADDED
@@ -0,0 +1,36 @@
1
+ export const NO_MODEL = {
2
+ status: 'unavailable',
3
+ reason: 'not-acquired'
4
+ };
5
+ export function definitionOf(state, type) {
6
+ if (state.status === 'unavailable' || type === undefined) return undefined;
7
+ return Object.hasOwn(state.types, type) ? state.types[type] : undefined;
8
+ }
9
+ export function modelTypes(state) {
10
+ return state.status === 'unavailable' ? {
11
+ ...state
12
+ } : {
13
+ status: state.status,
14
+ identity: state.snapshot.identity,
15
+ version: state.snapshot.version,
16
+ verifiedWith: {
17
+ ...state.verifiedWith
18
+ },
19
+ types: structuredClone(Object.values(state.types).sort((left, right)=>left.name < right.name ? -1 : left.name > right.name ? 1 : 0).map(({ name, fields, sections })=>({
20
+ name,
21
+ fields,
22
+ sections
23
+ })))
24
+ };
25
+ }
26
+ export function cached(state) {
27
+ return state.status === 'unavailable' ? state : {
28
+ ...state,
29
+ status: 'cached'
30
+ };
31
+ }
32
+ export function sameModel(left, right) {
33
+ return left.identity === right.identity && left.version === right.version;
34
+ }
35
+
36
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/model.ts"],"sourcesContent":["import type { Definition, FieldSpec, SectionSpec, VerifiedModel } from '@agentshouse/mdmodel';\n\nexport type ModelIdentity = { identity: string; version: string };\nexport type ModelSnapshot = ModelIdentity & { schema: string | null };\nexport type ModelUnavailableReason =\n | 'not-readable'\n | 'revoked'\n | 'not-acquired'\n | 'version-changed'\n | 'invalid';\nexport type ModelResult =\n | { kind: 'model'; snapshot: ModelSnapshot }\n | { kind: 'model-unavailable'; reason: ModelUnavailableReason }\n | { kind: 'transport-uncertainty' }\n | { kind: 'revoked-authorization' };\nexport type MdType = {\n name: string;\n fields: Readonly<Record<string, FieldSpec>>;\n sections: Readonly<Record<string, SectionSpec>>;\n};\nexport type ModelState =\n | { status: 'unavailable'; reason: ModelUnavailableReason }\n | {\n status: 'current' | 'cached';\n snapshot: ModelSnapshot;\n verifiedWith: ModelIdentity;\n types: VerifiedModel['types'];\n };\nexport type TypesResult =\n | { status: 'unavailable'; reason: ModelUnavailableReason }\n | {\n status: 'current' | 'cached';\n identity: string;\n version: string;\n verifiedWith: ModelIdentity;\n types: readonly MdType[];\n };\nexport type ValidationReceipt = { identity: string; version: string; source: 'current' | 'cached' };\nexport const NO_MODEL: ModelState = { status: 'unavailable', reason: 'not-acquired' };\nexport function definitionOf(state: ModelState, type: string | undefined): Definition | undefined {\n if (state.status === 'unavailable' || type === undefined) return undefined;\n return Object.hasOwn(state.types, type) ? state.types[type] : undefined;\n}\nexport function modelTypes(state: ModelState): TypesResult {\n return state.status === 'unavailable'\n ? { ...state }\n : {\n status: state.status,\n identity: state.snapshot.identity,\n version: state.snapshot.version,\n verifiedWith: { ...state.verifiedWith },\n types: structuredClone(\n Object.values(state.types)\n .sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0))\n .map(({ name, fields, sections }) => ({ name, fields, sections })),\n ),\n };\n}\nexport function cached(state: ModelState): ModelState {\n return state.status === 'unavailable' ? state : { ...state, status: 'cached' };\n}\nexport function sameModel(left: ModelIdentity, right: ModelIdentity): boolean {\n return left.identity === right.identity && left.version === right.version;\n}\n"],"names":["NO_MODEL","status","reason","definitionOf","state","type","undefined","Object","hasOwn","types","modelTypes","identity","snapshot","version","verifiedWith","structuredClone","values","sort","left","right","name","map","fields","sections","cached","sameModel"],"mappings":"AAsCA,OAAO,MAAMA,WAAuB;IAAEC,QAAQ;IAAeC,QAAQ;AAAe,EAAE;AACtF,OAAO,SAASC,aAAaC,KAAiB,EAAEC,IAAwB;IACtE,IAAID,MAAMH,MAAM,KAAK,iBAAiBI,SAASC,WAAW,OAAOA;IACjE,OAAOC,OAAOC,MAAM,CAACJ,MAAMK,KAAK,EAAEJ,QAAQD,MAAMK,KAAK,CAACJ,KAAK,GAAGC;AAChE;AACA,OAAO,SAASI,WAAWN,KAAiB;IAC1C,OAAOA,MAAMH,MAAM,KAAK,gBACpB;QAAE,GAAGG,KAAK;IAAC,IACX;QACEH,QAAQG,MAAMH,MAAM;QACpBU,UAAUP,MAAMQ,QAAQ,CAACD,QAAQ;QACjCE,SAAST,MAAMQ,QAAQ,CAACC,OAAO;QAC/BC,cAAc;YAAE,GAAGV,MAAMU,YAAY;QAAC;QACtCL,OAAOM,gBACLR,OAAOS,MAAM,CAACZ,MAAMK,KAAK,EACtBQ,IAAI,CAAC,CAACC,MAAMC,QAAWD,KAAKE,IAAI,GAAGD,MAAMC,IAAI,GAAG,CAAC,IAAIF,KAAKE,IAAI,GAAGD,MAAMC,IAAI,GAAG,IAAI,GAClFC,GAAG,CAAC,CAAC,EAAED,IAAI,EAAEE,MAAM,EAAEC,QAAQ,EAAE,GAAM,CAAA;gBAAEH;gBAAME;gBAAQC;YAAS,CAAA;IAErE;AACN;AACA,OAAO,SAASC,OAAOpB,KAAiB;IACtC,OAAOA,MAAMH,MAAM,KAAK,gBAAgBG,QAAQ;QAAE,GAAGA,KAAK;QAAEH,QAAQ;IAAS;AAC/E;AACA,OAAO,SAASwB,UAAUP,IAAmB,EAAEC,KAAoB;IACjE,OAAOD,KAAKP,QAAQ,KAAKQ,MAAMR,QAAQ,IAAIO,KAAKL,OAAO,KAAKM,MAAMN,OAAO;AAC3E"}
@@ -0,0 +1,25 @@
1
+ import type { QueryDocument, QueryGroup, QueryResult } from './query.js';
2
+ export type Observation<T> = {
3
+ current(): T;
4
+ subscribe(listener: (value: T) => void): () => void;
5
+ close(): void;
6
+ };
7
+ export type RowKey = string | number;
8
+ export type KeyedResult = {
9
+ result: QueryResult;
10
+ keys: readonly RowKey[];
11
+ };
12
+ export type QueryChange = {
13
+ changed: readonly (readonly [RowKey, QueryDocument | QueryGroup])[];
14
+ removed: readonly RowKey[];
15
+ order: readonly RowKey[] | null;
16
+ };
17
+ export type Observed = {
18
+ observation: Observation<unknown>;
19
+ receive(message: unknown): void;
20
+ end(): void;
21
+ };
22
+ export declare function rowsOf(result: QueryResult): readonly (QueryDocument | QueryGroup)[];
23
+ export declare function observed(first: unknown, stop: () => void, keyed: boolean): Observed;
24
+ export declare function opened(watch: (deliver: (message: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
25
+ //# sourceMappingURL=observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAEnF;AA0BD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B"}
@@ -0,0 +1,92 @@
1
+ export function rowsOf(result) {
2
+ return 'groups' in result ? result.groups : result.documents;
3
+ }
4
+ function keyedResult(first) {
5
+ const grouped = 'groups' in first.result;
6
+ const rows = rowsOf(first.result);
7
+ const byKey = new Map(first.keys.map((key, index)=>[
8
+ key,
9
+ rows[index]
10
+ ]));
11
+ let keys = first.keys;
12
+ return {
13
+ value: first.result,
14
+ next (message) {
15
+ const change = message;
16
+ for (const key of change.removed)byKey.delete(key);
17
+ for (const [key, row] of change.changed)byKey.set(key, row);
18
+ keys = change.order ?? keys.filter((key)=>byKey.has(key));
19
+ const next = keys.map((key)=>byKey.get(key));
20
+ return grouped ? {
21
+ groups: next
22
+ } : {
23
+ documents: next
24
+ };
25
+ }
26
+ };
27
+ }
28
+ function whole(first) {
29
+ return {
30
+ value: first,
31
+ next: (message)=>message
32
+ };
33
+ }
34
+ export function observed(first, stop, keyed) {
35
+ const reducer = keyed ? keyedResult(first) : whole(first);
36
+ let value = reducer.value;
37
+ let open = true;
38
+ const listeners = new Set();
39
+ const end = ()=>{
40
+ open = false;
41
+ listeners.clear();
42
+ };
43
+ return {
44
+ observation: {
45
+ current: ()=>value,
46
+ subscribe (listener) {
47
+ const entry = {
48
+ hear: listener
49
+ };
50
+ if (open) listeners.add(entry);
51
+ return ()=>{
52
+ listeners.delete(entry);
53
+ };
54
+ },
55
+ close () {
56
+ if (!open) return;
57
+ end();
58
+ stop();
59
+ }
60
+ },
61
+ receive (message) {
62
+ if (!open) return;
63
+ value = reducer.next(message);
64
+ for (const entry of [
65
+ ...listeners
66
+ ]){
67
+ if (listeners.has(entry)) entry.hear(value);
68
+ }
69
+ },
70
+ end
71
+ };
72
+ }
73
+ export function opened(watch, keyed) {
74
+ return new Promise((resolve, reject)=>{
75
+ let handle;
76
+ let stop = ()=>{};
77
+ try {
78
+ stop = watch((message)=>{
79
+ if (handle !== undefined) {
80
+ handle.receive(message);
81
+ return;
82
+ }
83
+ handle = observed(message, ()=>stop(), keyed);
84
+ resolve(handle.observation);
85
+ });
86
+ } catch (error) {
87
+ reject(error);
88
+ }
89
+ });
90
+ }
91
+
92
+ //# sourceMappingURL=observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/observation.ts"],"sourcesContent":["import type { QueryDocument, QueryGroup, QueryResult } from './query.js';\n\nexport type Observation<T> = {\n current(): T;\n subscribe(listener: (value: T) => void): () => void;\n close(): void;\n};\n\nexport type RowKey = string | number;\n\nexport type KeyedResult = { result: QueryResult; keys: readonly RowKey[] };\n\nexport type QueryChange = {\n changed: readonly (readonly [RowKey, QueryDocument | QueryGroup])[];\n removed: readonly RowKey[];\n order: readonly RowKey[] | null;\n};\n\nexport type Observed = {\n observation: Observation<unknown>;\n receive(message: unknown): void;\n end(): void;\n};\n\nexport function rowsOf(result: QueryResult): readonly (QueryDocument | QueryGroup)[] {\n return 'groups' in result ? result.groups : result.documents;\n}\n\nfunction keyedResult(first: KeyedResult) {\n const grouped = 'groups' in first.result;\n const rows = rowsOf(first.result);\n const byKey = new Map(first.keys.map((key, index) => [key, rows[index]]));\n let keys = first.keys;\n return {\n value: first.result,\n next(message: unknown): QueryResult {\n const change = message as QueryChange;\n for (const key of change.removed) byKey.delete(key);\n for (const [key, row] of change.changed) byKey.set(key, row);\n keys = change.order ?? keys.filter((key) => byKey.has(key));\n const next = keys.map((key) => byKey.get(key) as QueryDocument | QueryGroup);\n return grouped\n ? { groups: next as readonly QueryGroup[] }\n : { documents: next as readonly QueryDocument[] };\n },\n };\n}\n\nfunction whole(first: unknown) {\n return { value: first, next: (message: unknown) => message };\n}\n\nexport function observed(first: unknown, stop: () => void, keyed: boolean): Observed {\n const reducer = keyed ? keyedResult(first as KeyedResult) : whole(first);\n let value = reducer.value;\n let open = true;\n const listeners = new Set<{ hear: (value: unknown) => void }>();\n const end = () => {\n open = false;\n listeners.clear();\n };\n return {\n observation: {\n current: () => value,\n subscribe(listener) {\n const entry = { hear: listener };\n if (open) listeners.add(entry);\n return () => {\n listeners.delete(entry);\n };\n },\n close() {\n if (!open) return;\n end();\n stop();\n },\n },\n receive(message) {\n if (!open) return;\n value = reducer.next(message);\n for (const entry of [...listeners]) {\n if (listeners.has(entry)) entry.hear(value);\n }\n },\n end,\n };\n}\n\nexport function opened(\n watch: (deliver: (message: unknown) => void) => () => void,\n keyed: boolean,\n): Promise<Observation<unknown>> {\n return new Promise((resolve, reject) => {\n let handle: Observed | undefined;\n let stop = () => {};\n try {\n stop = watch((message) => {\n if (handle !== undefined) {\n handle.receive(message);\n return;\n }\n handle = observed(message, () => stop(), keyed);\n resolve(handle.observation);\n });\n } catch (error) {\n reject(error);\n }\n });\n}\n"],"names":["rowsOf","result","groups","documents","keyedResult","first","grouped","rows","byKey","Map","keys","map","key","index","value","next","message","change","removed","delete","row","changed","set","order","filter","has","get","whole","observed","stop","keyed","reducer","open","listeners","Set","end","clear","observation","current","subscribe","listener","entry","hear","add","close","receive","opened","watch","Promise","resolve","reject","handle","undefined","error"],"mappings":"AAwBA,OAAO,SAASA,OAAOC,MAAmB;IACxC,OAAO,YAAYA,SAASA,OAAOC,MAAM,GAAGD,OAAOE,SAAS;AAC9D;AAEA,SAASC,YAAYC,KAAkB;IACrC,MAAMC,UAAU,YAAYD,MAAMJ,MAAM;IACxC,MAAMM,OAAOP,OAAOK,MAAMJ,MAAM;IAChC,MAAMO,QAAQ,IAAIC,IAAIJ,MAAMK,IAAI,CAACC,GAAG,CAAC,CAACC,KAAKC,QAAU;YAACD;YAAKL,IAAI,CAACM,MAAM;SAAC;IACvE,IAAIH,OAAOL,MAAMK,IAAI;IACrB,OAAO;QACLI,OAAOT,MAAMJ,MAAM;QACnBc,MAAKC,OAAgB;YACnB,MAAMC,SAASD;YACf,KAAK,MAAMJ,OAAOK,OAAOC,OAAO,CAAEV,MAAMW,MAAM,CAACP;YAC/C,KAAK,MAAM,CAACA,KAAKQ,IAAI,IAAIH,OAAOI,OAAO,CAAEb,MAAMc,GAAG,CAACV,KAAKQ;YACxDV,OAAOO,OAAOM,KAAK,IAAIb,KAAKc,MAAM,CAAC,CAACZ,MAAQJ,MAAMiB,GAAG,CAACb;YACtD,MAAMG,OAAOL,KAAKC,GAAG,CAAC,CAACC,MAAQJ,MAAMkB,GAAG,CAACd;YACzC,OAAON,UACH;gBAAEJ,QAAQa;YAA8B,IACxC;gBAAEZ,WAAWY;YAAiC;QACpD;IACF;AACF;AAEA,SAASY,MAAMtB,KAAc;IAC3B,OAAO;QAAES,OAAOT;QAAOU,MAAM,CAACC,UAAqBA;IAAQ;AAC7D;AAEA,OAAO,SAASY,SAASvB,KAAc,EAAEwB,IAAgB,EAAEC,KAAc;IACvE,MAAMC,UAAUD,QAAQ1B,YAAYC,SAAwBsB,MAAMtB;IAClE,IAAIS,QAAQiB,QAAQjB,KAAK;IACzB,IAAIkB,OAAO;IACX,MAAMC,YAAY,IAAIC;IACtB,MAAMC,MAAM;QACVH,OAAO;QACPC,UAAUG,KAAK;IACjB;IACA,OAAO;QACLC,aAAa;YACXC,SAAS,IAAMxB;YACfyB,WAAUC,QAAQ;gBAChB,MAAMC,QAAQ;oBAAEC,MAAMF;gBAAS;gBAC/B,IAAIR,MAAMC,UAAUU,GAAG,CAACF;gBACxB,OAAO;oBACLR,UAAUd,MAAM,CAACsB;gBACnB;YACF;YACAG;gBACE,IAAI,CAACZ,MAAM;gBACXG;gBACAN;YACF;QACF;QACAgB,SAAQ7B,OAAO;YACb,IAAI,CAACgB,MAAM;YACXlB,QAAQiB,QAAQhB,IAAI,CAACC;YACrB,KAAK,MAAMyB,SAAS;mBAAIR;aAAU,CAAE;gBAClC,IAAIA,UAAUR,GAAG,CAACgB,QAAQA,MAAMC,IAAI,CAAC5B;YACvC;QACF;QACAqB;IACF;AACF;AAEA,OAAO,SAASW,OACdC,KAA0D,EAC1DjB,KAAc;IAEd,OAAO,IAAIkB,QAAQ,CAACC,SAASC;QAC3B,IAAIC;QACJ,IAAItB,OAAO,KAAO;QAClB,IAAI;YACFA,OAAOkB,MAAM,CAAC/B;gBACZ,IAAImC,WAAWC,WAAW;oBACxBD,OAAON,OAAO,CAAC7B;oBACf;gBACF;gBACAmC,SAASvB,SAASZ,SAAS,IAAMa,QAAQC;gBACzCmB,QAAQE,OAAOd,WAAW;YAC5B;QACF,EAAE,OAAOgB,OAAO;YACdH,OAAOG;QACT;IACF;AACF"}
package/dist/outcome.d.ts CHANGED
@@ -1,30 +1,34 @@
1
+ import type { ActionResult, ProviderRefusal } from './adapter.js';
1
2
  import type { ChangeBatch } from './change.js';
2
3
  export type AffectedState = Readonly<Record<string, string>>;
3
- export type QueueOutcome = {
4
- kind: 'pending';
5
- } | {
6
- kind: 'conflicted';
4
+ export type CallResult = ActionResult | {
5
+ kind: 'undeclared';
6
+ };
7
+ export type AcceptedOutcome = {
8
+ kind: 'accepted';
7
9
  roomVersion: string;
10
+ author?: string;
11
+ time?: string;
12
+ };
13
+ export type SubmissionOutcome = AcceptedOutcome | (ProviderRefusal & {
14
+ kind: 'conflicted';
15
+ roomVersion?: string;
8
16
  affected: AffectedState;
9
- text: string;
10
- } | {
17
+ }) | (ProviderRefusal & {
11
18
  kind: 'rejected';
12
19
  affected: AffectedState;
13
- text: string;
14
- } | {
20
+ }) | {
15
21
  kind: 'expired';
22
+ } | {
23
+ kind: 'withdrawn';
16
24
  };
17
- export type AcceptedOutcome = {
18
- kind: 'accepted';
19
- roomVersion: string;
20
- author: string;
21
- time: string;
25
+ export type Submission = {
26
+ readonly state: 'waiting' | 'submitted';
27
+ } | {
28
+ readonly state: 'reset';
29
+ readonly reset: string;
22
30
  };
23
- export type SubmissionOutcome = QueueOutcome | AcceptedOutcome;
24
31
  export type QueueEntry = {
25
32
  readonly batch: ChangeBatch;
26
- readonly outcome: QueueOutcome;
27
- };
28
- export declare function refused(outcome: SubmissionOutcome | undefined): boolean;
29
- export declare function queuedOutcome(outcome: SubmissionOutcome | undefined): QueueOutcome;
33
+ } & Submission;
30
34
  //# sourceMappingURL=outcome.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7D,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,eAAe,CAAC;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC,CAAC;AAEF,wBAAgB,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAIvE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAKlF"}
1
+ {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7D,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,CAAC,eAAe,GAAG;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;CACzB,CAAC,GACF,CAAC,eAAe,GAAG;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;CACzB,CAAC,GACF;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1B,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,UAAU,CAAC"}
package/dist/outcome.js CHANGED
@@ -1,13 +1,3 @@
1
- export function refused(outcome) {
2
- return outcome?.kind === 'conflicted' || outcome?.kind === 'rejected' || outcome?.kind === 'expired';
3
- }
4
- export function queuedOutcome(outcome) {
5
- if (outcome === undefined || outcome.kind === 'accepted' || outcome.kind === 'pending') {
6
- return {
7
- kind: 'pending'
8
- };
9
- }
10
- return outcome;
11
- }
1
+ export { };
12
2
 
13
3
  //# sourceMappingURL=outcome.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/outcome.ts"],"sourcesContent":["import type { ChangeBatch } from './change.js';\n\nexport type AffectedState = Readonly<Record<string, string>>;\n\nexport type QueueOutcome =\n | { kind: 'pending' }\n | {\n kind: 'conflicted';\n roomVersion: string;\n affected: AffectedState;\n text: string;\n }\n | {\n kind: 'rejected';\n affected: AffectedState;\n text: string;\n }\n | { kind: 'expired' };\n\nexport type AcceptedOutcome = {\n kind: 'accepted';\n roomVersion: string;\n author: string;\n time: string;\n};\n\nexport type SubmissionOutcome = QueueOutcome | AcceptedOutcome;\n\nexport type QueueEntry = {\n readonly batch: ChangeBatch;\n readonly outcome: QueueOutcome;\n};\n\nexport function refused(outcome: SubmissionOutcome | undefined): boolean {\n return (\n outcome?.kind === 'conflicted' || outcome?.kind === 'rejected' || outcome?.kind === 'expired'\n );\n}\n\nexport function queuedOutcome(outcome: SubmissionOutcome | undefined): QueueOutcome {\n if (outcome === undefined || outcome.kind === 'accepted' || outcome.kind === 'pending') {\n return { kind: 'pending' };\n }\n return outcome;\n}\n"],"names":["refused","outcome","kind","queuedOutcome","undefined"],"mappings":"AAiCA,OAAO,SAASA,QAAQC,OAAsC;IAC5D,OACEA,SAASC,SAAS,gBAAgBD,SAASC,SAAS,cAAcD,SAASC,SAAS;AAExF;AAEA,OAAO,SAASC,cAAcF,OAAsC;IAClE,IAAIA,YAAYG,aAAaH,QAAQC,IAAI,KAAK,cAAcD,QAAQC,IAAI,KAAK,WAAW;QACtF,OAAO;YAAEA,MAAM;QAAU;IAC3B;IACA,OAAOD;AACT"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/outcome.ts"],"sourcesContent":["import type { ActionResult, ProviderRefusal } from './adapter.js';\nimport type { ChangeBatch } from './change.js';\n\nexport type AffectedState = Readonly<Record<string, string>>;\n\nexport type CallResult = ActionResult | { kind: 'undeclared' };\n\nexport type AcceptedOutcome = {\n kind: 'accepted';\n roomVersion: string;\n author?: string;\n time?: string;\n};\n\nexport type SubmissionOutcome =\n | AcceptedOutcome\n | (ProviderRefusal & {\n kind: 'conflicted';\n roomVersion?: string;\n affected: AffectedState;\n })\n | (ProviderRefusal & {\n kind: 'rejected';\n affected: AffectedState;\n })\n | { kind: 'expired' }\n | { kind: 'withdrawn' };\n\nexport type Submission =\n | { readonly state: 'waiting' | 'submitted' }\n | { readonly state: 'reset'; readonly reset: string };\n\nexport type QueueEntry = { readonly batch: ChangeBatch } & Submission;\n"],"names":[],"mappings":"AAgCA,WAAsE"}
package/dist/overlay.d.ts CHANGED
@@ -1,8 +1,15 @@
1
+ import type { HeadChange } from './adapter.js';
1
2
  import type { ChangeBatch } from './change.js';
2
- export type Layer = {
3
+ export type Heads = {
4
+ revisions: Readonly<Record<string, string>>;
5
+ changes: Readonly<Record<string, HeadChange>>;
6
+ };
7
+ export type Layer = Heads & {
3
8
  documents: Readonly<Record<string, string>>;
4
9
  binaryTargets: readonly string[];
5
- revisions: Readonly<Record<string, string>>;
6
10
  };
11
+ export declare function sameChange(left: HeadChange | undefined, right: HeadChange | undefined): boolean;
7
12
  export declare function overlay(base: Layer, queue: readonly ChangeBatch[]): Layer;
13
+ export declare function sameLayerText(left: Layer, right: Layer): boolean;
14
+ export declare function overlayChanged(base: Layer, queue: readonly ChangeBatch[], previousBase: Layer, previousQueue: readonly ChangeBatch[], previousVisible: Layer): Layer;
8
15
  //# sourceMappingURL=overlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAyIF,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,KAAK,CAezE"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAQ/F;AAoJD,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,KAAK,CAiBzE;AAQD,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAQhE;AAmBD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,KAAK,EACnB,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,eAAe,EAAE,KAAK,GACrB,KAAK,CA4FP"}