@agentshouse/mdruntime 0.1.0-alpha.8 → 0.1.0-alpha.9

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 (70) hide show
  1. package/dist/adapter.d.ts +76 -21
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/adapter.js.map +1 -1
  4. package/dist/bootstrap.d.ts +4 -1
  5. package/dist/bootstrap.d.ts.map +1 -1
  6. package/dist/bootstrap.js +4 -2
  7. package/dist/bootstrap.js.map +1 -1
  8. package/dist/client.d.ts +63 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +227 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/collection.d.ts +14 -4
  13. package/dist/collection.d.ts.map +1 -1
  14. package/dist/collection.js +60 -35
  15. package/dist/collection.js.map +1 -1
  16. package/dist/connection.d.ts +28 -7
  17. package/dist/connection.d.ts.map +1 -1
  18. package/dist/connection.js +603 -368
  19. package/dist/connection.js.map +1 -1
  20. package/dist/conversation.d.ts +57 -0
  21. package/dist/conversation.d.ts.map +1 -0
  22. package/dist/conversation.js +401 -0
  23. package/dist/conversation.js.map +1 -0
  24. package/dist/durability.d.ts +8 -3
  25. package/dist/durability.d.ts.map +1 -1
  26. package/dist/durability.js +5 -59
  27. package/dist/durability.js.map +1 -1
  28. package/dist/file.d.ts +20 -0
  29. package/dist/file.d.ts.map +1 -0
  30. package/dist/file.js +149 -0
  31. package/dist/file.js.map +1 -0
  32. package/dist/host.d.ts +9 -0
  33. package/dist/host.d.ts.map +1 -0
  34. package/dist/host.js +200 -0
  35. package/dist/host.js.map +1 -0
  36. package/dist/index.d.ts +7 -4
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/memory.d.ts +14 -2
  40. package/dist/memory.d.ts.map +1 -1
  41. package/dist/memory.js +171 -11
  42. package/dist/memory.js.map +1 -1
  43. package/dist/outcome.d.ts +16 -9
  44. package/dist/outcome.d.ts.map +1 -1
  45. package/dist/outcome.js +10 -0
  46. package/dist/outcome.js.map +1 -1
  47. package/dist/query.d.ts +1 -0
  48. package/dist/query.d.ts.map +1 -1
  49. package/dist/query.js.map +1 -1
  50. package/dist/replica.d.ts +2 -1
  51. package/dist/replica.d.ts.map +1 -1
  52. package/dist/replica.js +16 -3
  53. package/dist/replica.js.map +1 -1
  54. package/dist/save.d.ts +3 -3
  55. package/dist/save.d.ts.map +1 -1
  56. package/dist/save.js +33 -14
  57. package/dist/save.js.map +1 -1
  58. package/dist/status.d.ts +11 -2
  59. package/dist/status.d.ts.map +1 -1
  60. package/dist/status.js +5 -4
  61. package/dist/status.js.map +1 -1
  62. package/dist/store.d.ts +32 -3
  63. package/dist/store.d.ts.map +1 -1
  64. package/dist/store.js +64 -7
  65. package/dist/store.js.map +1 -1
  66. package/dist/wire.d.ts +63 -0
  67. package/dist/wire.d.ts.map +1 -0
  68. package/dist/wire.js +139 -0
  69. package/dist/wire.js.map +1 -0
  70. package/package.json +10 -2
package/dist/memory.js CHANGED
@@ -39,13 +39,24 @@ export function createMemoryAdapter(options = {}) {
39
39
  const capabilities = options.capabilities ?? [];
40
40
  const providerLimits = options.providerLimits ?? [];
41
41
  const retention = declaredRetention(options.retention);
42
- const origins = options.origins ?? [
43
- 'https://origin.example'
44
- ];
45
42
  const pageSize = options.pageSize;
46
43
  const scripts = {};
47
44
  const served = new Map();
48
45
  const refreshPages = new Map();
46
+ const observers = new Set();
47
+ const listeners = new Set();
48
+ const scripted = new Map();
49
+ const unsealed = new Map();
50
+ const sealed = new Set();
51
+ const historyPageSize = options.historyPageSize;
52
+ let selected = [];
53
+ let viewed = [];
54
+ let issued = 0;
55
+ function scriptConversations(entries) {
56
+ scripted.clear();
57
+ for (const entry of entries)scripted.set(entry.conversation, entry);
58
+ }
59
+ scriptConversations(options.conversations ?? []);
49
60
  function retain(entries) {
50
61
  for (const room of entries){
51
62
  const versions = served.get(room.locator) ?? new Map();
@@ -63,6 +74,9 @@ export function createMemoryAdapter(options = {}) {
63
74
  operations: room.operations,
64
75
  replica: room.replica,
65
76
  attachedModel: room.attachedModel,
77
+ ...room.typedSelection === undefined ? {} : {
78
+ typedSelection: room.typedSelection
79
+ },
66
80
  providerOwnedPaths: room.providerOwnedPaths
67
81
  };
68
82
  }
@@ -117,6 +131,99 @@ export function createMemoryAdapter(options = {}) {
117
131
  }
118
132
  };
119
133
  }
134
+ function historyOf(conversation, cursor) {
135
+ const messages = conversation.messages ?? [];
136
+ const until = typeof cursor === 'string' ? Number(cursor) : messages.length;
137
+ if (!Number.isInteger(until) || until < 0 || until > messages.length) {
138
+ return {
139
+ kind: 'rejected',
140
+ code: 'unknown-cursor',
141
+ fields: {
142
+ cursor
143
+ }
144
+ };
145
+ }
146
+ const size = historyPageSize ?? messages.length;
147
+ const from = Math.max(0, until - size);
148
+ return {
149
+ kind: 'action',
150
+ result: {
151
+ messages: messages.slice(from, until),
152
+ ...from === 0 ? {} : {
153
+ cursor: String(from)
154
+ }
155
+ }
156
+ };
157
+ }
158
+ function conversationAction(request) {
159
+ const name = request.name;
160
+ const input = request.input ?? {};
161
+ if (name === 'conversation.create') {
162
+ issued += 1;
163
+ const conversation = `conversation-${issued}`;
164
+ scripted.set(conversation, {
165
+ conversation
166
+ });
167
+ return {
168
+ kind: 'action',
169
+ result: {
170
+ conversation
171
+ }
172
+ };
173
+ }
174
+ const named = typeof input.conversation === 'string' ? input.conversation : '';
175
+ const conversation = scripted.get(named);
176
+ if (conversation === undefined) {
177
+ return {
178
+ kind: 'rejected',
179
+ code: 'unknown-conversation',
180
+ fields: {
181
+ conversation: named
182
+ }
183
+ };
184
+ }
185
+ const outcome = conversation.outcomes?.[name];
186
+ if (outcome !== undefined) return outcome;
187
+ if (name === 'conversation.history') return historyOf(conversation, input.cursor);
188
+ if (name === 'conversation.send') {
189
+ issued += 1;
190
+ const turn = `turn-${issued}`;
191
+ unsealed.set(turn, named);
192
+ return {
193
+ kind: 'action',
194
+ result: {
195
+ turn
196
+ }
197
+ };
198
+ }
199
+ if (name === 'conversation.cancel') {
200
+ const turn = typeof input.turn === 'string' ? input.turn : '';
201
+ if (sealed.has(turn) || !unsealed.has(turn)) {
202
+ return {
203
+ kind: 'rejected',
204
+ code: 'turn-sealed',
205
+ fields: {
206
+ turn
207
+ }
208
+ };
209
+ }
210
+ unsealed.delete(turn);
211
+ return {
212
+ kind: 'action',
213
+ result: {
214
+ turn,
215
+ cancelled: true
216
+ }
217
+ };
218
+ }
219
+ if (name === 'conversation.delete') scripted.delete(named);
220
+ return {
221
+ kind: 'action',
222
+ result: {
223
+ conversation: named
224
+ }
225
+ };
226
+ }
120
227
  function discovery() {
121
228
  return {
122
229
  kind: 'discovery',
@@ -125,8 +232,7 @@ export function createMemoryAdapter(options = {}) {
125
232
  rooms: rooms.map(declared),
126
233
  capabilities,
127
234
  providerLimits,
128
- retention,
129
- origins
235
+ retention
130
236
  };
131
237
  }
132
238
  return {
@@ -136,15 +242,64 @@ export function createMemoryAdapter(options = {}) {
136
242
  ];
137
243
  retain(rooms);
138
244
  },
245
+ setConversations (next) {
246
+ scriptConversations(next);
247
+ },
248
+ notifyRoomVersion (notification) {
249
+ for (const observer of observers)observer(notification);
250
+ },
251
+ notifyConversation (event) {
252
+ if (event.kind === 'accepted-message') {
253
+ sealed.add(event.message.turn);
254
+ unsealed.delete(event.message.turn);
255
+ }
256
+ for (const listener of listeners)listener(event);
257
+ },
258
+ selectedRooms () {
259
+ return selected;
260
+ },
261
+ viewedConversations () {
262
+ return viewed;
263
+ },
264
+ conversations: {
265
+ view (next) {
266
+ viewed = [
267
+ ...next
268
+ ];
269
+ },
270
+ observe (notify) {
271
+ listeners.add(notify);
272
+ return ()=>{
273
+ listeners.delete(notify);
274
+ };
275
+ }
276
+ },
277
+ roomVersions: {
278
+ select (locators) {
279
+ selected = [
280
+ ...locators
281
+ ];
282
+ },
283
+ observe (notify) {
284
+ observers.add(notify);
285
+ return ()=>{
286
+ observers.delete(notify);
287
+ };
288
+ }
289
+ },
139
290
  script (operation, answer) {
140
291
  if (answer === undefined) delete scripts[operation];
141
292
  else scripts[operation] = answer;
142
293
  },
143
294
  async model (_authorization, request) {
144
- return resolveScript(scripts.model, ()=>rooms.find((room)=>room.locator === request.locator)?.model ?? {
295
+ return resolveScript(scripts.model, ()=>{
296
+ const room = rooms.find((entry)=>entry.locator === request.locator);
297
+ const answer = request.attached === 'collection' ? room?.model : room?.selectionModel;
298
+ return answer ?? {
145
299
  kind: 'model-unavailable',
146
300
  reason: 'not-readable'
147
- }, request);
301
+ };
302
+ }, request);
148
303
  },
149
304
  async authorize () {
150
305
  return resolveScript(scripts.authorize, ()=>({}), undefined);
@@ -203,7 +358,8 @@ export function createMemoryAdapter(options = {}) {
203
358
  }
204
359
  return {
205
360
  kind: 'rejected',
206
- text: '',
361
+ code: 'unscripted-mutation',
362
+ fields: {},
207
363
  affected: {}
208
364
  };
209
365
  }, request);
@@ -224,10 +380,14 @@ export function createMemoryAdapter(options = {}) {
224
380
  }, request);
225
381
  },
226
382
  async action (_authorization, request) {
227
- return resolveScript(scripts.action, ()=>({
383
+ return resolveScript(scripts.action, ()=>{
384
+ if (request.name.startsWith('conversation.')) return conversationAction(request);
385
+ return {
228
386
  kind: 'rejected',
229
- text: ''
230
- }), request);
387
+ code: 'unscripted-action',
388
+ fields: {}
389
+ };
390
+ }, request);
231
391
  }
232
392
  };
233
393
  }
@@ -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 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\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 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 = declaredRetention(options.retention);\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 collectionRoot: room.collectionRoot,\n roomVersion: room.roomVersion,\n operations: room.operations,\n replica: room.replica,\n attachedModel: room.attachedModel,\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 model(_authorization, request) {\n return resolveScript(\n scripts.model as Script<ModelResult, typeof request> | undefined,\n () =>\n rooms.find((room) => room.locator === request.locator)?.model ?? {\n kind: 'model-unavailable',\n 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 );\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","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","origins","pageSize","scripts","served","Map","refreshPages","retain","entries","room","versions","get","locator","set","roomVersion","declared","name","collectionRoot","operations","replica","attachedModel","providerOwnedPaths","page","from","Object","keys","documents","sort","size","length","slice","next","revisions","binaryTargets","pageToken","String","advancement","at","current","previous","currentTargets","Set","previousTargets","changed","filter","opening","target","has","removals","discovery","map","setRooms","script","operation","model","_authorization","find","reason","authorize","discover","bootstrap","entry","refresh","continuation","fromRoomVersion","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 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 ConversationMessage,\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 type RoomVersionNotification,\n} from './adapter.js';\nimport { MD_MODEL } from './collection.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 binaryTargets?: readonly string[];\n};\n\nexport type MemoryConversation = {\n conversation: string;\n messages?: readonly ConversationMessage[];\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 selectedRooms(): readonly string[];\n viewedConversations(): 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(\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 = 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 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 viewed: 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 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 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 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 historyOf(conversation: MemoryConversation, cursor: unknown): ActionResult {\n const messages = conversation.messages ?? [];\n const until = typeof cursor === 'string' ? Number(cursor) : messages.length;\n if (!Number.isInteger(until) || until < 0 || until > messages.length) {\n return { kind: 'rejected', code: 'unknown-cursor', fields: { cursor } };\n }\n const size = historyPageSize ?? messages.length;\n const from = Math.max(0, until - size);\n return {\n kind: 'action',\n result: {\n messages: messages.slice(from, until),\n ...(from === 0 ? {} : { cursor: String(from) }),\n },\n };\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 cursor?: 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.cursor);\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 selectedRooms() {\n return selected;\n },\n viewedConversations() {\n return viewed;\n },\n conversations: {\n view(next) {\n viewed = [...next];\n },\n observe(notify) {\n listeners.add(notify);\n return () => {\n listeners.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 );\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', code: 'unscripted-mutation', fields: {}, 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 if (request.name.startsWith('conversation.')) return conversationAction(request);\n return { kind: 'rejected', code: 'unscripted-action', fields: {} };\n },\n request,\n );\n },\n };\n}\n"],"names":["ROOM_CONTRACT_VERSION","MD_MODEL","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","scripted","unsealed","sealed","historyPageSize","selected","viewed","issued","scriptConversations","entries","clear","entry","set","conversation","conversations","retain","room","versions","get","locator","roomVersion","declared","name","collectionRoot","operations","replica","attachedModel","typedSelection","providerOwnedPaths","page","from","Object","keys","documents","sort","size","length","slice","next","revisions","binaryTargets","pageToken","String","advancement","at","current","previous","currentTargets","previousTargets","changed","filter","opening","target","has","removals","historyOf","cursor","messages","until","isInteger","code","fields","Math","max","result","conversationAction","input","outcomes","turn","delete","cancelled","discovery","map","setRooms","setConversations","notifyRoomVersion","notification","observer","notifyConversation","event","add","message","listener","selectedRooms","viewedConversations","view","observe","notify","roomVersions","select","locators","script","operation","model","_authorization","find","attached","selectionModel","reason","authorize","discover","bootstrap","refresh","continuation","fromRoomVersion","mutate","affected","action","startsWith"],"mappings":"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"}
package/dist/outcome.d.ts CHANGED
@@ -1,30 +1,37 @@
1
+ import type { ActionResult, ProviderRefusal, RetryableRefusal } from './adapter.js';
1
2
  import type { ChangeBatch } from './change.js';
2
3
  export type AffectedState = Readonly<Record<string, string>>;
4
+ export type CallResult = ActionResult | {
5
+ kind: 'undeclared';
6
+ };
3
7
  export type QueueOutcome = {
4
8
  kind: 'pending';
5
- } | {
9
+ } | (ProviderRefusal & {
6
10
  kind: 'conflicted';
7
- roomVersion: string;
11
+ roomVersion?: string;
8
12
  affected: AffectedState;
9
- text: string;
10
- } | {
13
+ }) | (ProviderRefusal & {
11
14
  kind: 'rejected';
12
15
  affected: AffectedState;
13
- text: string;
14
- } | {
16
+ }) | RetryableRefusal | {
15
17
  kind: 'expired';
16
18
  };
17
19
  export type AcceptedOutcome = {
18
20
  kind: 'accepted';
19
21
  roomVersion: string;
20
- author: string;
21
- time: string;
22
+ author?: string;
23
+ time?: string;
22
24
  };
23
25
  export type SubmissionOutcome = QueueOutcome | AcceptedOutcome;
24
26
  export type QueueEntry = {
25
27
  readonly batch: ChangeBatch;
26
28
  readonly outcome: QueueOutcome;
27
29
  };
28
- export declare function refused(outcome: SubmissionOutcome | undefined): boolean;
30
+ export type RefusedOutcome = Extract<QueueOutcome, {
31
+ kind: 'conflicted' | 'rejected' | 'expired';
32
+ }>;
33
+ export declare function refused(outcome: SubmissionOutcome | undefined): outcome is RefusedOutcome;
34
+ export declare function withheldUntilReset(outcome: SubmissionOutcome | undefined, at: number): boolean;
35
+ export declare function refusalOf(outcome: RefusedOutcome): ProviderRefusal | null;
29
36
  export declare function queuedOutcome(outcome: SubmissionOutcome | undefined): QueueOutcome;
30
37
  //# 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,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpF,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,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB,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,gBAAgB,GAChB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,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,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,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AAEpG,wBAAgB,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,OAAO,IAAI,cAAc,CAIzF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAM9F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CAGzE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAKlF"}
package/dist/outcome.js CHANGED
@@ -1,6 +1,16 @@
1
1
  export function refused(outcome) {
2
2
  return outcome?.kind === 'conflicted' || outcome?.kind === 'rejected' || outcome?.kind === 'expired';
3
3
  }
4
+ export function withheldUntilReset(outcome, at) {
5
+ return outcome?.kind === 'retryable-refusal' && outcome.reset !== undefined && at < Date.parse(outcome.reset);
6
+ }
7
+ export function refusalOf(outcome) {
8
+ if (outcome.kind === 'expired') return null;
9
+ return {
10
+ code: outcome.code,
11
+ fields: outcome.fields
12
+ };
13
+ }
4
14
  export function queuedOutcome(outcome) {
5
15
  if (outcome === undefined || outcome.kind === 'accepted' || outcome.kind === 'pending') {
6
16
  return {
@@ -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, RetryableRefusal } 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 QueueOutcome =\n | { kind: 'pending' }\n | (ProviderRefusal & {\n kind: 'conflicted';\n roomVersion?: string;\n affected: AffectedState;\n })\n | (ProviderRefusal & {\n kind: 'rejected';\n affected: AffectedState;\n })\n | RetryableRefusal\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 type RefusedOutcome = Extract<QueueOutcome, { kind: 'conflicted' | 'rejected' | 'expired' }>;\n\nexport function refused(outcome: SubmissionOutcome | undefined): outcome is RefusedOutcome {\n return (\n outcome?.kind === 'conflicted' || outcome?.kind === 'rejected' || outcome?.kind === 'expired'\n );\n}\n\nexport function withheldUntilReset(outcome: SubmissionOutcome | undefined, at: number): boolean {\n return (\n outcome?.kind === 'retryable-refusal' &&\n outcome.reset !== undefined &&\n at < Date.parse(outcome.reset)\n );\n}\n\nexport function refusalOf(outcome: RefusedOutcome): ProviderRefusal | null {\n if (outcome.kind === 'expired') return null;\n return { code: outcome.code, fields: outcome.fields };\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","withheldUntilReset","at","reset","undefined","Date","parse","refusalOf","code","fields","queuedOutcome"],"mappings":"AAqCA,OAAO,SAASA,QAAQC,OAAsC;IAC5D,OACEA,SAASC,SAAS,gBAAgBD,SAASC,SAAS,cAAcD,SAASC,SAAS;AAExF;AAEA,OAAO,SAASC,mBAAmBF,OAAsC,EAAEG,EAAU;IACnF,OACEH,SAASC,SAAS,uBAClBD,QAAQI,KAAK,KAAKC,aAClBF,KAAKG,KAAKC,KAAK,CAACP,QAAQI,KAAK;AAEjC;AAEA,OAAO,SAASI,UAAUR,OAAuB;IAC/C,IAAIA,QAAQC,IAAI,KAAK,WAAW,OAAO;IACvC,OAAO;QAAEQ,MAAMT,QAAQS,IAAI;QAAEC,QAAQV,QAAQU,MAAM;IAAC;AACtD;AAEA,OAAO,SAASC,cAAcX,OAAsC;IAClE,IAAIA,YAAYK,aAAaL,QAAQC,IAAI,KAAK,cAAcD,QAAQC,IAAI,KAAK,WAAW;QACtF,OAAO;YAAEA,MAAM;QAAU;IAC3B;IACA,OAAOD;AACT"}
package/dist/query.d.ts CHANGED
@@ -6,6 +6,7 @@ export type QueryInput = {
6
6
  roomVersion: string;
7
7
  documents: Readonly<Record<string, Document>>;
8
8
  model: TypesResult;
9
+ typedSelection: TypesResult | null;
9
10
  };
10
11
  export type QueryBinding = (rooms: readonly QueryInput[], options: QueryOptions) => QueryResult;
11
12
  export declare function rawQuery(rooms: readonly QueryInput[]): QueryResult;
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9C,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,WAAW,CAAC;AAChG,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,CAgBlE"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9C,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,EAAE,WAAW,GAAG,IAAI,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,WAAW,CAAC;AAChG,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,CAgBlE"}
package/dist/query.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/query.ts"],"sourcesContent":["import type { QueryOptions, QueryResult } from '@agentshouse/query';\nimport type { Document } from '@agentshouse/mdmodel';\nimport type { TypesResult } from './model.js';\n\nexport type QueryInput = {\n room: string;\n roomVersion: string;\n documents: Readonly<Record<string, Document>>;\n model: TypesResult;\n};\nexport type QueryBinding = (rooms: readonly QueryInput[], options: QueryOptions) => QueryResult;\nexport function rawQuery(rooms: readonly QueryInput[]): QueryResult {\n return {\n roomVersions: Object.fromEntries(rooms.map((room) => [room.room, room.roomVersion])),\n groups: null,\n documents: rooms.flatMap((room) =>\n Object.entries(room.documents)\n .filter(([path]) => path.endsWith('.md'))\n .map(([path, document]) => ({\n ...structuredClone(document),\n type: document.type ?? 'any',\n room: room.room,\n path,\n backlinks: [],\n })),\n ),\n };\n}\n"],"names":["rawQuery","rooms","roomVersions","Object","fromEntries","map","room","roomVersion","groups","documents","flatMap","entries","filter","path","endsWith","document","structuredClone","type","backlinks"],"mappings":"AAWA,OAAO,SAASA,SAASC,KAA4B;IACnD,OAAO;QACLC,cAAcC,OAAOC,WAAW,CAACH,MAAMI,GAAG,CAAC,CAACC,OAAS;gBAACA,KAAKA,IAAI;gBAAEA,KAAKC,WAAW;aAAC;QAClFC,QAAQ;QACRC,WAAWR,MAAMS,OAAO,CAAC,CAACJ,OACxBH,OAAOQ,OAAO,CAACL,KAAKG,SAAS,EAC1BG,MAAM,CAAC,CAAC,CAACC,KAAK,GAAKA,KAAKC,QAAQ,CAAC,QACjCT,GAAG,CAAC,CAAC,CAACQ,MAAME,SAAS,GAAM,CAAA;oBAC1B,GAAGC,gBAAgBD,SAAS;oBAC5BE,MAAMF,SAASE,IAAI,IAAI;oBACvBX,MAAMA,KAAKA,IAAI;oBACfO;oBACAK,WAAW,EAAE;gBACf,CAAA;IAEN;AACF"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/query.ts"],"sourcesContent":["import type { QueryOptions, QueryResult } from '@agentshouse/query';\nimport type { Document } from '@agentshouse/mdmodel';\nimport type { TypesResult } from './model.js';\n\nexport type QueryInput = {\n room: string;\n roomVersion: string;\n documents: Readonly<Record<string, Document>>;\n model: TypesResult;\n typedSelection: TypesResult | null;\n};\nexport type QueryBinding = (rooms: readonly QueryInput[], options: QueryOptions) => QueryResult;\nexport function rawQuery(rooms: readonly QueryInput[]): QueryResult {\n return {\n roomVersions: Object.fromEntries(rooms.map((room) => [room.room, room.roomVersion])),\n groups: null,\n documents: rooms.flatMap((room) =>\n Object.entries(room.documents)\n .filter(([path]) => path.endsWith('.md'))\n .map(([path, document]) => ({\n ...structuredClone(document),\n type: document.type ?? 'any',\n room: room.room,\n path,\n backlinks: [],\n })),\n ),\n };\n}\n"],"names":["rawQuery","rooms","roomVersions","Object","fromEntries","map","room","roomVersion","groups","documents","flatMap","entries","filter","path","endsWith","document","structuredClone","type","backlinks"],"mappings":"AAYA,OAAO,SAASA,SAASC,KAA4B;IACnD,OAAO;QACLC,cAAcC,OAAOC,WAAW,CAACH,MAAMI,GAAG,CAAC,CAACC,OAAS;gBAACA,KAAKA,IAAI;gBAAEA,KAAKC,WAAW;aAAC;QAClFC,QAAQ;QACRC,WAAWR,MAAMS,OAAO,CAAC,CAACJ,OACxBH,OAAOQ,OAAO,CAACL,KAAKG,SAAS,EAC1BG,MAAM,CAAC,CAAC,CAACC,KAAK,GAAKA,KAAKC,QAAQ,CAAC,QACjCT,GAAG,CAAC,CAAC,CAACQ,MAAME,SAAS,GAAM,CAAA;oBAC1B,GAAGC,gBAAgBD,SAAS;oBAC5BE,MAAMF,SAASE,IAAI,IAAI;oBACvBX,MAAMA,KAAKA,IAAI;oBACfO;oBACAK,WAAW,EAAE;gBACf,CAAA;IAEN;AACF"}
package/dist/replica.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { AttachedModelBinding } from './model.js';
2
2
  import { type ChangeBatch } from './change.js';
3
- import { type Collection } from './collection.js';
3
+ import { type Collection, type Composition } from './collection.js';
4
4
  import { type Layer } from './overlay.js';
5
5
  import type { ReplicaRecord } from './store.js';
6
6
  export type ConfirmedLayer = {
@@ -15,6 +15,7 @@ export type Replica = {
15
15
  queue: readonly ChangeBatch[];
16
16
  visible: VisibleLayer;
17
17
  };
18
+ export declare function compositionOf(record: ReplicaRecord): Composition;
18
19
  export declare function readConfirmed(record: ReplicaRecord): ConfirmedLayer | null;
19
20
  export declare function readStaged(record: ReplicaRecord, binding: AttachedModelBinding | null): ConfirmedLayer | null;
20
21
  export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], roomVersion: string, binding: AttachedModelBinding | null): ConfirmedLayer | null;
@@ -1 +1 @@
1
- {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,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,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG,IAAI,CAG1E;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,cAAc,GAAG,IAAI,CAcvB;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,EACnB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,cAAc,GAAG,IAAI,CAmBvB;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAuB3F"}
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,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,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAShE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG,IAAI,CAG1E;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,cAAc,GAAG,IAAI,CAcvB;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,EACnB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,cAAc,GAAG,IAAI,CAmBvB;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAuB3F"}
package/dist/replica.js CHANGED
@@ -1,15 +1,28 @@
1
1
  import { immutable } from './change.js';
2
2
  import { parseCollection, readCollection, validateCollection } from './collection.js';
3
3
  import { overlay } from './overlay.js';
4
+ export function compositionOf(record) {
5
+ return {
6
+ collectionRoot: record.collectionRoot,
7
+ model: record.model,
8
+ selection: record.typedSelection === null ? null : {
9
+ roots: record.typedSelection.roots,
10
+ model: record.selectionModel
11
+ }
12
+ };
13
+ }
4
14
  export function readConfirmed(record) {
5
- const collection = readCollection(record.documents, record.collectionRoot, record.model);
15
+ const collection = readCollection(record.documents, compositionOf(record));
6
16
  return collection === null ? null : {
7
17
  record,
8
18
  collection
9
19
  };
10
20
  }
11
21
  export function readStaged(record, binding) {
12
- if (record.model.status === 'current' && binding !== null && validateCollection(record.documents, record.binaryTargets, record.collectionRoot, record.model, binding).verdict === 'refuse') return null;
22
+ if (binding !== null && (record.model.status === 'current' || record.selectionModel.status === 'current')) {
23
+ const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record), binding);
24
+ if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') return null;
25
+ }
13
26
  return readConfirmed(record);
14
27
  }
15
28
  export function applyReturned(confirmed, documents, revisions, removals, roomVersion, binding) {
@@ -57,7 +70,7 @@ export function replicaOf(confirmed, queue) {
57
70
  queue: batches,
58
71
  visible: {
59
72
  ...layer,
60
- collection: parseCollection(layer.documents, confirmed.record.model)
73
+ collection: parseCollection(layer.documents, compositionOf(confirmed.record))
61
74
  }
62
75
  };
63
76
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import type { AttachedModelBinding } from './model.js';\nimport { immutable, type ChangeBatch } from './change.js';\nimport {\n parseCollection,\n readCollection,\n validateCollection,\n type Collection,\n} from './collection.js';\nimport { overlay, type Layer } from './overlay.js';\nimport type { ReplicaRecord } from './store.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n};\n\nexport function readConfirmed(record: ReplicaRecord): ConfirmedLayer | null {\n const collection = readCollection(record.documents, record.collectionRoot, record.model);\n return collection === null ? null : { record, collection };\n}\n\nexport function readStaged(\n record: ReplicaRecord,\n binding: AttachedModelBinding | null,\n): ConfirmedLayer | null {\n if (\n record.model.status === 'current' &&\n binding !== null &&\n validateCollection(\n record.documents,\n record.binaryTargets,\n record.collectionRoot,\n record.model,\n binding,\n ).verdict === 'refuse'\n )\n return null;\n return readConfirmed(record);\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 binding: AttachedModelBinding | null,\n): ConfirmedLayer | null {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n binaryTargets: [...binaryTargets].sort(),\n },\n binding,\n );\n}\n\nexport function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[]): 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 collection: confirmed.collection,\n },\n };\n }\n const layer = overlay(confirmed.record, batches);\n return {\n confirmed,\n queue: batches,\n visible: {\n ...layer,\n collection: parseCollection(layer.documents, confirmed.record.model),\n },\n };\n}\n"],"names":["immutable","parseCollection","readCollection","validateCollection","overlay","readConfirmed","record","collection","documents","collectionRoot","model","readStaged","binding","status","binaryTargets","verdict","applyReturned","confirmed","revisions","removals","roomVersion","nextDocuments","nextRevisions","Set","path","delete","sort","replicaOf","queue","batches","Object","freeze","map","length","visible","layer"],"mappings":"AACA,SAASA,SAAS,QAA0B,cAAc;AAC1D,SACEC,eAAe,EACfC,cAAc,EACdC,kBAAkB,QAEb,kBAAkB;AACzB,SAASC,OAAO,QAAoB,eAAe;AAkBnD,OAAO,SAASC,cAAcC,MAAqB;IACjD,MAAMC,aAAaL,eAAeI,OAAOE,SAAS,EAAEF,OAAOG,cAAc,EAAEH,OAAOI,KAAK;IACvF,OAAOH,eAAe,OAAO,OAAO;QAAED;QAAQC;IAAW;AAC3D;AAEA,OAAO,SAASI,WACdL,MAAqB,EACrBM,OAAoC;IAEpC,IACEN,OAAOI,KAAK,CAACG,MAAM,KAAK,aACxBD,YAAY,QACZT,mBACEG,OAAOE,SAAS,EAChBF,OAAOQ,aAAa,EACpBR,OAAOG,cAAc,EACrBH,OAAOI,KAAK,EACZE,SACAG,OAAO,KAAK,UAEd,OAAO;IACT,OAAOV,cAAcC;AACvB;AAEA,OAAO,SAASU,cACdC,SAAyB,EACzBT,SAA2C,EAC3CU,SAA2C,EAC3CC,QAA2B,EAC3BC,WAAmB,EACnBR,OAAoC;IAEpC,MAAMS,gBAAgB;QAAE,GAAGJ,UAAUX,MAAM,CAACE,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMc,gBAAgB;QAAE,GAAGL,UAAUX,MAAM,CAACY,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMJ,gBAAgB,IAAIS,IAAIN,UAAUX,MAAM,CAACQ,aAAa;IAC5D,KAAK,MAAMU,QAAQL,SAAU;QAC3B,OAAOE,aAAa,CAACG,KAAK;QAC1B,OAAOF,aAAa,CAACE,KAAK;QAC1BV,cAAcW,MAAM,CAACD;IACvB;IACA,OAAOb,WACL;QACE,GAAGM,UAAUX,MAAM;QACnBc;QACAZ,WAAWa;QACXH,WAAWI;QACXR,eAAe;eAAIA;SAAc,CAACY,IAAI;IACxC,GACAd;AAEJ;AAEA,OAAO,SAASe,UAAUV,SAAyB,EAAEW,KAA6B;IAChF,MAAMC,UAAUC,OAAOC,MAAM,CAACH,MAAMI,GAAG,CAAChC;IACxC,IAAI6B,QAAQI,MAAM,KAAK,GAAG;QACxB,OAAO;YACLhB;YACAW,OAAOC;YACPK,SAAS;gBACP1B,WAAWS,UAAUX,MAAM,CAACE,SAAS;gBACrCM,eAAeG,UAAUX,MAAM,CAACQ,aAAa;gBAC7CI,WAAWD,UAAUX,MAAM,CAACY,SAAS;gBACrCX,YAAYU,UAAUV,UAAU;YAClC;QACF;IACF;IACA,MAAM4B,QAAQ/B,QAAQa,UAAUX,MAAM,EAAEuB;IACxC,OAAO;QACLZ;QACAW,OAAOC;QACPK,SAAS;YACP,GAAGC,KAAK;YACR5B,YAAYN,gBAAgBkC,MAAM3B,SAAS,EAAES,UAAUX,MAAM,CAACI,KAAK;QACrE;IACF;AACF"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import type { AttachedModelBinding } from './model.js';\nimport { immutable, type ChangeBatch } from './change.js';\nimport {\n parseCollection,\n readCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { overlay, type Layer } from './overlay.js';\nimport type { ReplicaRecord } from './store.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\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): ConfirmedLayer | null {\n const collection = readCollection(record.documents, compositionOf(record));\n return collection === null ? null : { record, collection };\n}\n\nexport function readStaged(\n record: ReplicaRecord,\n binding: AttachedModelBinding | null,\n): ConfirmedLayer | null {\n if (\n binding !== null &&\n (record.model.status === 'current' || record.selectionModel.status === 'current')\n ) {\n const verdict = validateCollection(\n record.documents,\n record.binaryTargets,\n compositionOf(record),\n binding,\n );\n if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') return null;\n }\n return readConfirmed(record);\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 binding: AttachedModelBinding | null,\n): ConfirmedLayer | null {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n binaryTargets: [...binaryTargets].sort(),\n },\n binding,\n );\n}\n\nexport function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[]): 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 collection: confirmed.collection,\n },\n };\n }\n const layer = overlay(confirmed.record, batches);\n return {\n confirmed,\n queue: batches,\n visible: {\n ...layer,\n collection: parseCollection(layer.documents, compositionOf(confirmed.record)),\n },\n };\n}\n"],"names":["immutable","parseCollection","readCollection","validateCollection","overlay","compositionOf","record","collectionRoot","model","selection","typedSelection","roots","selectionModel","readConfirmed","collection","documents","readStaged","binding","status","verdict","binaryTargets","rule","applyReturned","confirmed","revisions","removals","roomVersion","nextDocuments","nextRevisions","Set","path","delete","sort","replicaOf","queue","batches","Object","freeze","map","length","visible","layer"],"mappings":"AACA,SAASA,SAAS,QAA0B,cAAc;AAC1D,SACEC,eAAe,EACfC,cAAc,EACdC,kBAAkB,QAGb,kBAAkB;AACzB,SAASC,OAAO,QAAoB,eAAe;AAkBnD,OAAO,SAASC,cAAcC,MAAqB;IACjD,OAAO;QACLC,gBAAgBD,OAAOC,cAAc;QACrCC,OAAOF,OAAOE,KAAK;QACnBC,WACEH,OAAOI,cAAc,KAAK,OACtB,OACA;YAAEC,OAAOL,OAAOI,cAAc,CAACC,KAAK;YAAEH,OAAOF,OAAOM,cAAc;QAAC;IAC3E;AACF;AAEA,OAAO,SAASC,cAAcP,MAAqB;IACjD,MAAMQ,aAAaZ,eAAeI,OAAOS,SAAS,EAAEV,cAAcC;IAClE,OAAOQ,eAAe,OAAO,OAAO;QAAER;QAAQQ;IAAW;AAC3D;AAEA,OAAO,SAASE,WACdV,MAAqB,EACrBW,OAAoC;IAEpC,IACEA,YAAY,QACXX,CAAAA,OAAOE,KAAK,CAACU,MAAM,KAAK,aAAaZ,OAAOM,cAAc,CAACM,MAAM,KAAK,SAAQ,GAC/E;QACA,MAAMC,UAAUhB,mBACdG,OAAOS,SAAS,EAChBT,OAAOc,aAAa,EACpBf,cAAcC,SACdW;QAEF,IAAIE,QAAQA,OAAO,KAAK,YAAYA,QAAQE,IAAI,KAAK,qBAAqB,OAAO;IACnF;IACA,OAAOR,cAAcP;AACvB;AAEA,OAAO,SAASgB,cACdC,SAAyB,EACzBR,SAA2C,EAC3CS,SAA2C,EAC3CC,QAA2B,EAC3BC,WAAmB,EACnBT,OAAoC;IAEpC,MAAMU,gBAAgB;QAAE,GAAGJ,UAAUjB,MAAM,CAACS,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMa,gBAAgB;QAAE,GAAGL,UAAUjB,MAAM,CAACkB,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMJ,gBAAgB,IAAIS,IAAIN,UAAUjB,MAAM,CAACc,aAAa;IAC5D,KAAK,MAAMU,QAAQL,SAAU;QAC3B,OAAOE,aAAa,CAACG,KAAK;QAC1B,OAAOF,aAAa,CAACE,KAAK;QAC1BV,cAAcW,MAAM,CAACD;IACvB;IACA,OAAOd,WACL;QACE,GAAGO,UAAUjB,MAAM;QACnBoB;QACAX,WAAWY;QACXH,WAAWI;QACXR,eAAe;eAAIA;SAAc,CAACY,IAAI;IACxC,GACAf;AAEJ;AAEA,OAAO,SAASgB,UAAUV,SAAyB,EAAEW,KAA6B;IAChF,MAAMC,UAAUC,OAAOC,MAAM,CAACH,MAAMI,GAAG,CAACtC;IACxC,IAAImC,QAAQI,MAAM,KAAK,GAAG;QACxB,OAAO;YACLhB;YACAW,OAAOC;YACPK,SAAS;gBACPzB,WAAWQ,UAAUjB,MAAM,CAACS,SAAS;gBACrCK,eAAeG,UAAUjB,MAAM,CAACc,aAAa;gBAC7CI,WAAWD,UAAUjB,MAAM,CAACkB,SAAS;gBACrCV,YAAYS,UAAUT,UAAU;YAClC;QACF;IACF;IACA,MAAM2B,QAAQrC,QAAQmB,UAAUjB,MAAM,EAAE6B;IACxC,OAAO;QACLZ;QACAW,OAAOC;QACPK,SAAS;YACP,GAAGC,KAAK;YACR3B,YAAYb,gBAAgBwC,MAAM1B,SAAS,EAAEV,cAAckB,UAAUjB,MAAM;QAC7E;IACF;AACF"}
package/dist/save.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import type { AttachedModelBinding, ModelState } from './model.js';
1
+ import type { AttachedModelBinding } from './model.js';
2
2
  import type { ProviderLimit } from './adapter.js';
3
3
  import { type Change, type ChangeBatch } from './change.js';
4
+ import { type Composition } from './collection.js';
4
5
  import type { VisibleLayer } from './replica.js';
5
6
  export type SaveRefusal = {
6
7
  source?: 'model';
@@ -10,10 +11,9 @@ export type SaveRefusal = {
10
11
  referrers?: readonly string[];
11
12
  };
12
13
  export type SaveInput = {
13
- collectionRoot: string;
14
+ composition: Composition;
14
15
  baseRoomVersion: string;
15
16
  operations: import('./adapter.js').OperationScopes;
16
- model: ModelState;
17
17
  binding: AttachedModelBinding | null;
18
18
  providerOwnedPaths: readonly string[];
19
19
  providerLimits: readonly ProviderLimit[];
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAa,KAAK,MAAM,EAAE,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAK1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,cAAc,EAAE,eAAe,CAAC;IACnD,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrC,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;CAC5B,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;AA4X9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAiGxD"}
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,YAAY,CAAC;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAa,KAAK,MAAM,EAAE,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAML,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,cAAc,EAAE,eAAe,CAAC;IACnD,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrC,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;CAC5B,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;AA2Y9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAmGxD"}