@agentshouse/mdruntime 0.1.0-c3c7796382e28 → 0.1.0-c3faae279d4d2

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 (288) hide show
  1. package/README.md +2 -2
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +385 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +251 -0
  8. package/dist/adapter.d.ts +90 -70
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +3 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +29 -47
  13. package/dist/bootstrap.d.ts +14 -17
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +259 -152
  16. package/dist/cell.d.ts +6 -0
  17. package/dist/cell.d.ts.map +1 -0
  18. package/dist/cell.js +9 -0
  19. package/dist/chain.d.ts +2 -1
  20. package/dist/chain.d.ts.map +1 -1
  21. package/dist/change.d.ts +1 -0
  22. package/dist/change.d.ts.map +1 -1
  23. package/dist/change.js +4 -2
  24. package/dist/chat-types.d.ts +5 -0
  25. package/dist/chat-types.d.ts.map +1 -0
  26. package/dist/chat-types.js +13 -0
  27. package/dist/client.d.ts +21 -6
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +4 -2
  30. package/dist/collection.d.ts +2 -4
  31. package/dist/collection.d.ts.map +1 -1
  32. package/dist/collection.js +1 -17
  33. package/dist/compile.d.ts +6 -6
  34. package/dist/compile.d.ts.map +1 -1
  35. package/dist/compile.js +272 -326
  36. package/dist/connection.d.ts +5 -143
  37. package/dist/connection.d.ts.map +1 -1
  38. package/dist/connection.js +102 -5122
  39. package/dist/context.d.ts +2 -0
  40. package/dist/context.d.ts.map +1 -0
  41. package/dist/context.js +7 -0
  42. package/dist/conversation-live.d.ts +136 -0
  43. package/dist/conversation-live.d.ts.map +1 -0
  44. package/dist/conversation-live.js +248 -0
  45. package/dist/conversation-row.d.ts +33 -0
  46. package/dist/conversation-row.d.ts.map +1 -0
  47. package/dist/conversation-row.js +53 -0
  48. package/dist/conversation.d.ts +41 -43
  49. package/dist/conversation.d.ts.map +1 -1
  50. package/dist/conversation.js +870 -779
  51. package/dist/discovery.d.ts +10 -0
  52. package/dist/discovery.d.ts.map +1 -0
  53. package/dist/discovery.js +175 -0
  54. package/dist/durability.d.ts +15 -1
  55. package/dist/durability.d.ts.map +1 -1
  56. package/dist/entry.d.ts +3 -2
  57. package/dist/entry.d.ts.map +1 -1
  58. package/dist/entry.js +18 -8
  59. package/dist/figures.d.ts +49 -0
  60. package/dist/figures.d.ts.map +1 -0
  61. package/dist/figures.js +197 -0
  62. package/dist/holdings.d.ts +29 -0
  63. package/dist/holdings.d.ts.map +1 -0
  64. package/dist/holdings.js +95 -0
  65. package/dist/host.d.ts +4 -7
  66. package/dist/host.d.ts.map +1 -1
  67. package/dist/host.js +29 -31
  68. package/dist/identity.d.ts +0 -1
  69. package/dist/identity.d.ts.map +1 -1
  70. package/dist/identity.js +0 -3
  71. package/dist/index.d.ts +26 -8
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +8 -1
  74. package/dist/install.d.ts +56 -0
  75. package/dist/install.d.ts.map +1 -0
  76. package/dist/install.js +554 -0
  77. package/dist/job.d.ts +33 -0
  78. package/dist/job.d.ts.map +1 -0
  79. package/dist/job.js +54 -0
  80. package/dist/lifecycle.d.ts +7 -0
  81. package/dist/lifecycle.d.ts.map +1 -0
  82. package/dist/lifecycle.js +268 -0
  83. package/dist/listing.d.ts +53 -0
  84. package/dist/listing.d.ts.map +1 -0
  85. package/dist/listing.js +176 -0
  86. package/dist/live.d.ts +5 -4
  87. package/dist/live.d.ts.map +1 -1
  88. package/dist/live.js +62 -23
  89. package/dist/locks.d.ts +9 -0
  90. package/dist/locks.d.ts.map +1 -0
  91. package/dist/locks.js +61 -0
  92. package/dist/log.d.ts +1 -0
  93. package/dist/log.d.ts.map +1 -1
  94. package/dist/lost.d.ts +5 -0
  95. package/dist/lost.d.ts.map +1 -0
  96. package/dist/lost.js +61 -0
  97. package/dist/media.d.ts +2 -2
  98. package/dist/media.d.ts.map +1 -1
  99. package/dist/media.js +22 -12
  100. package/dist/memory.d.ts +12 -5
  101. package/dist/memory.d.ts.map +1 -1
  102. package/dist/memory.js +175 -83
  103. package/dist/messages.d.ts +27 -3
  104. package/dist/messages.d.ts.map +1 -1
  105. package/dist/messages.js +103 -31
  106. package/dist/model.d.ts +2 -10
  107. package/dist/model.d.ts.map +1 -1
  108. package/dist/model.js +0 -18
  109. package/dist/models.d.ts +14 -0
  110. package/dist/models.d.ts.map +1 -0
  111. package/dist/models.js +195 -0
  112. package/dist/observation.d.ts +2 -2
  113. package/dist/observation.d.ts.map +1 -1
  114. package/dist/observation.js +14 -14
  115. package/dist/opened.js +3 -3
  116. package/dist/opening.d.ts +4 -0
  117. package/dist/opening.d.ts.map +1 -0
  118. package/dist/opening.js +57 -0
  119. package/dist/outcome.d.ts +4 -4
  120. package/dist/outcome.d.ts.map +1 -1
  121. package/dist/outcome.js +3 -0
  122. package/dist/overlay.d.ts +1 -0
  123. package/dist/overlay.d.ts.map +1 -1
  124. package/dist/overlay.js +11 -0
  125. package/dist/parts.d.ts +60 -0
  126. package/dist/parts.d.ts.map +1 -0
  127. package/dist/parts.js +126 -0
  128. package/dist/paths.d.ts +2 -0
  129. package/dist/paths.d.ts.map +1 -1
  130. package/dist/paths.js +26 -0
  131. package/dist/preparation.d.ts +20 -0
  132. package/dist/preparation.d.ts.map +1 -0
  133. package/dist/preparation.js +226 -0
  134. package/dist/queries.d.ts +16 -0
  135. package/dist/queries.d.ts.map +1 -0
  136. package/dist/queries.js +272 -0
  137. package/dist/query.d.ts +14 -210
  138. package/dist/query.d.ts.map +1 -1
  139. package/dist/query.js +3 -505
  140. package/dist/questions.d.ts +34 -0
  141. package/dist/questions.d.ts.map +1 -0
  142. package/dist/questions.js +122 -0
  143. package/dist/reach.d.ts +15 -12
  144. package/dist/reach.d.ts.map +1 -1
  145. package/dist/reach.js +185 -139
  146. package/dist/react.d.ts +10 -2
  147. package/dist/react.d.ts.map +1 -1
  148. package/dist/read.d.ts +7 -0
  149. package/dist/read.d.ts.map +1 -0
  150. package/dist/read.js +17 -0
  151. package/dist/readiness.d.ts +3 -18
  152. package/dist/readiness.d.ts.map +1 -1
  153. package/dist/readiness.js +4 -10
  154. package/dist/reads.d.ts +36 -10
  155. package/dist/reads.d.ts.map +1 -1
  156. package/dist/reads.js +157 -86
  157. package/dist/recovery.d.ts +1 -0
  158. package/dist/recovery.d.ts.map +1 -1
  159. package/dist/recovery.js +35 -1
  160. package/dist/refresh.d.ts +7 -5
  161. package/dist/refresh.d.ts.map +1 -1
  162. package/dist/refresh.js +33 -5
  163. package/dist/refusal.d.ts +5 -0
  164. package/dist/refusal.d.ts.map +1 -0
  165. package/dist/refusal.js +55 -0
  166. package/dist/replica.d.ts +10 -10
  167. package/dist/replica.d.ts.map +1 -1
  168. package/dist/replica.js +53 -21
  169. package/dist/room-draft.d.ts +21 -7
  170. package/dist/room-draft.d.ts.map +1 -1
  171. package/dist/room-draft.js +101 -54
  172. package/dist/room-drafts.d.ts +24 -0
  173. package/dist/room-drafts.d.ts.map +1 -0
  174. package/dist/room-drafts.js +217 -0
  175. package/dist/rows.d.ts +14 -21
  176. package/dist/rows.d.ts.map +1 -1
  177. package/dist/rows.js +48 -184
  178. package/dist/runtime.d.ts +43 -0
  179. package/dist/runtime.d.ts.map +1 -0
  180. package/dist/runtime.js +1 -0
  181. package/dist/save.d.ts +7 -1
  182. package/dist/save.d.ts.map +1 -1
  183. package/dist/save.js +31 -24
  184. package/dist/saves.d.ts +70 -0
  185. package/dist/saves.d.ts.map +1 -0
  186. package/dist/saves.js +1005 -0
  187. package/dist/search.d.ts +12 -63
  188. package/dist/search.d.ts.map +1 -1
  189. package/dist/search.js +9 -52
  190. package/dist/seed.d.ts +11 -2
  191. package/dist/seed.d.ts.map +1 -1
  192. package/dist/seed.js +71 -1
  193. package/dist/shared.d.ts +1 -7
  194. package/dist/shared.d.ts.map +1 -1
  195. package/dist/shared.js +13 -105
  196. package/dist/shown.d.ts +31 -0
  197. package/dist/shown.d.ts.map +1 -0
  198. package/dist/shown.js +292 -0
  199. package/dist/socket/admission.d.ts +7 -0
  200. package/dist/socket/admission.d.ts.map +1 -0
  201. package/dist/socket/admission.js +39 -0
  202. package/dist/socket/answers.d.ts +6 -0
  203. package/dist/socket/answers.d.ts.map +1 -0
  204. package/dist/socket/answers.js +20 -0
  205. package/dist/socket/lanes.d.ts +20 -0
  206. package/dist/socket/lanes.d.ts.map +1 -0
  207. package/dist/socket/lanes.js +77 -0
  208. package/dist/socket/reads.d.ts +10 -0
  209. package/dist/socket/reads.d.ts.map +1 -0
  210. package/dist/socket/reads.js +31 -0
  211. package/dist/socket/rooms.d.ts +44 -0
  212. package/dist/socket/rooms.d.ts.map +1 -0
  213. package/dist/socket/rooms.js +90 -0
  214. package/dist/socket/session.d.ts +38 -0
  215. package/dist/socket/session.d.ts.map +1 -0
  216. package/dist/socket/session.js +23 -0
  217. package/dist/socket.d.ts +70 -0
  218. package/dist/socket.d.ts.map +1 -0
  219. package/dist/socket.js +175 -0
  220. package/dist/source.d.ts +61 -0
  221. package/dist/source.d.ts.map +1 -0
  222. package/dist/source.js +82 -0
  223. package/dist/status.d.ts +4 -5
  224. package/dist/status.d.ts.map +1 -1
  225. package/dist/status.js +3 -7
  226. package/dist/store/fences.d.ts +16 -0
  227. package/dist/store/fences.d.ts.map +1 -0
  228. package/dist/store/fences.js +26 -0
  229. package/dist/store/installs.d.ts +30 -0
  230. package/dist/store/installs.d.ts.map +1 -0
  231. package/dist/store/installs.js +34 -0
  232. package/dist/store/readiness.d.ts +10 -0
  233. package/dist/store/readiness.d.ts.map +1 -0
  234. package/dist/store/readiness.js +52 -0
  235. package/dist/store/records.d.ts +212 -0
  236. package/dist/store/records.d.ts.map +1 -0
  237. package/dist/store/records.js +431 -0
  238. package/dist/store/room-held.d.ts +8 -0
  239. package/dist/store/room-held.d.ts.map +1 -0
  240. package/dist/store/room-held.js +17 -0
  241. package/dist/store/space.d.ts +11 -0
  242. package/dist/store/space.d.ts.map +1 -0
  243. package/dist/store/space.js +41 -0
  244. package/dist/store/watchers.d.ts +17 -0
  245. package/dist/store/watchers.d.ts.map +1 -0
  246. package/dist/store/watchers.js +56 -0
  247. package/dist/store/writes.d.ts +24 -0
  248. package/dist/store/writes.d.ts.map +1 -0
  249. package/dist/store/writes.js +125 -0
  250. package/dist/store.d.ts +115 -171
  251. package/dist/store.d.ts.map +1 -1
  252. package/dist/store.js +143 -416
  253. package/dist/stored.d.ts +61 -57
  254. package/dist/stored.d.ts.map +1 -1
  255. package/dist/stored.js +311 -233
  256. package/dist/surface.d.ts +88 -0
  257. package/dist/surface.d.ts.map +1 -0
  258. package/dist/surface.js +223 -0
  259. package/dist/sync.d.ts +19 -0
  260. package/dist/sync.d.ts.map +1 -0
  261. package/dist/sync.js +532 -0
  262. package/dist/tables.d.ts +126 -64
  263. package/dist/tables.d.ts.map +1 -1
  264. package/dist/tables.js +221 -105
  265. package/dist/tallies.d.ts +18 -0
  266. package/dist/tallies.d.ts.map +1 -0
  267. package/dist/tallies.js +129 -0
  268. package/dist/transfer.d.ts +0 -5
  269. package/dist/transfer.d.ts.map +1 -1
  270. package/dist/validation.d.ts +3 -4
  271. package/dist/validation.d.ts.map +1 -1
  272. package/dist/validation.js +42 -100
  273. package/dist/windows.d.ts +1 -12
  274. package/dist/windows.d.ts.map +1 -1
  275. package/dist/windows.js +2 -75
  276. package/dist/wire.d.ts +17 -5
  277. package/dist/wire.d.ts.map +1 -1
  278. package/dist/wire.js +7 -1
  279. package/package.json +2 -2
  280. package/dist/fence.d.ts +0 -6
  281. package/dist/fence.d.ts.map +0 -1
  282. package/dist/fence.js +0 -10
  283. package/dist/fulltext.d.ts +0 -27
  284. package/dist/fulltext.d.ts.map +0 -1
  285. package/dist/fulltext.js +0 -368
  286. package/dist/words.d.ts +0 -19
  287. package/dist/words.d.ts.map +0 -1
  288. package/dist/words.js +0 -150
package/dist/memory.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { documentFacts, parse } from '@agentshouse/mdmodel';
2
+ import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
1
3
  import { sameChange } from './overlay.js';
2
4
  const ATTACHMENTS = 'attachments';
3
5
  function lastName(path) {
@@ -5,7 +7,6 @@ function lastName(path) {
5
7
  }
6
8
  const FIXTURE_RETENTION = {
7
9
  history: { kind: 'duration', seconds: 1 },
8
- outcome: 604_800,
9
10
  refreshHorizon: 1,
10
11
  };
11
12
  function declaredRetention(value) {
@@ -52,15 +53,16 @@ export function createMemoryAdapter(options = {}) {
52
53
  const listeners = new Set();
53
54
  const modeObservers = new Set();
54
55
  const scripted = new Map();
55
- const unsealed = new Map();
56
- const sealed = new Set();
57
56
  const sentTurns = new Map();
58
57
  const historyPageSize = options.historyPageSize;
59
58
  const attached = new Map();
60
59
  const linked = new WeakMap();
61
- let held = [];
60
+ const carried = new Map();
62
61
  let expiring = [];
62
+ let openings = 0;
63
+ const declaredRooms = new Set();
63
64
  let replicated = [];
65
+ let heldCursor = null;
64
66
  let issued = 0;
65
67
  function scriptConversations(entries) {
66
68
  scripted.clear();
@@ -101,8 +103,35 @@ export function createMemoryAdapter(options = {}) {
101
103
  return path;
102
104
  }
103
105
  }
106
+ const saved = new WeakMap();
107
+ function factsAt(room, path, content) {
108
+ const types = schemaTypes(room.model?.kind === 'model' ? room.model.snapshot.schema : null, NO_ROOM_TYPES);
109
+ let held = saved.get(types);
110
+ if (held === undefined) {
111
+ held = new Map();
112
+ saved.set(types, held);
113
+ }
114
+ const key = `${path}\u0000${content}`;
115
+ if (!held.has(key)) {
116
+ const facts = documentFacts(path, parse(content, path), { types });
117
+ held.set(key, facts === null ? null : JSON.parse(JSON.stringify(facts)));
118
+ }
119
+ return held.get(key);
120
+ }
121
+ function factsIn(room, paths) {
122
+ const facts = {};
123
+ for (const path of paths) {
124
+ const content = room.documents?.[path];
125
+ const held = room.facts?.[path] ?? (content === undefined ? null : factsAt(room, path, content));
126
+ if (held !== null)
127
+ facts[path] = held;
128
+ }
129
+ return facts;
130
+ }
104
131
  function retain(entries) {
105
132
  for (const room of entries) {
133
+ for (const [path, content] of Object.entries(room.documents ?? {}))
134
+ factsAt(room, path, content);
106
135
  note(room.locator, room);
107
136
  const versions = served.get(room.locator) ?? new Map();
108
137
  versions.set(room.roomVersion, room);
@@ -120,6 +149,7 @@ export function createMemoryAdapter(options = {}) {
120
149
  replica: room.replica,
121
150
  ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
122
151
  providerOwnedPaths: room.providerOwnedPaths,
152
+ authoredPaths: room.authoredPaths,
123
153
  };
124
154
  }
125
155
  function page(room, after) {
@@ -135,10 +165,14 @@ export function createMemoryAdapter(options = {}) {
135
165
  roomVersion: room.roomVersion,
136
166
  ...(opening ? { models: modelsOf(room) } : {}),
137
167
  documents: named(room.documents ?? {}, taken),
168
+ facts: factsIn(room, taken),
138
169
  revisions: named(room.revisions ?? {}, [...taken, ...targets]),
139
170
  ...(room.fileIds === undefined
140
171
  ? {}
141
172
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
173
+ ...(room.created === undefined
174
+ ? {}
175
+ : { created: named(room.created, [...taken, ...targets]) }),
142
176
  changes: named(room.changes ?? {}, [...taken, ...targets]),
143
177
  binaryFiles: named(room.binaryFiles ?? {}, targets),
144
178
  ...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
@@ -155,18 +189,19 @@ export function createMemoryAdapter(options = {}) {
155
189
  ...(folderRemovals.length === 0 ? {} : { folderRemovals }),
156
190
  };
157
191
  }
158
- function advancement(room, from, at) {
192
+ function advancement(room, from, at, whole = false) {
159
193
  const current = room.documents ?? {};
160
194
  const previous = from.documents ?? {};
161
195
  const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
162
196
  const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
163
197
  const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
164
198
  room.fileIds?.[path] !== from.fileIds?.[path] ||
199
+ room.created?.[path] !== from.created?.[path] ||
165
200
  !sameChange(room.changes?.[path], from.changes?.[path]);
166
201
  const changed = Object.keys(current)
167
202
  .filter((path) => current[path] !== previous[path] || headMoved(path))
168
203
  .sort();
169
- const size = pageSize ?? changed.length;
204
+ const size = whole ? changed.length : (pageSize ?? changed.length);
170
205
  const taken = changed.slice(at, at + size);
171
206
  const next = at + taken.length;
172
207
  const opening = at === 0;
@@ -182,10 +217,14 @@ export function createMemoryAdapter(options = {}) {
182
217
  roomVersion: room.roomVersion,
183
218
  ...(models === undefined ? {} : { models }),
184
219
  documents: named(current, taken),
220
+ facts: factsIn(room, taken),
185
221
  revisions: named(room.revisions ?? {}, [...taken, ...targets]),
186
222
  ...(room.fileIds === undefined
187
223
  ? {}
188
224
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
225
+ ...(room.created === undefined
226
+ ? {}
227
+ : { created: named(room.created, [...taken, ...targets]) }),
189
228
  changes: named(room.changes ?? {}, [...taken, ...targets]),
190
229
  binaryFiles: named(room.binaryFiles ?? {}, targets),
191
230
  ...(opening ? foldersMoved(room, from) : {}),
@@ -198,6 +237,26 @@ export function createMemoryAdapter(options = {}) {
198
237
  ...(pageToken === undefined ? {} : { pageToken }),
199
238
  };
200
239
  }
240
+ function carry(locator) {
241
+ const at = carried.get(locator);
242
+ const current = rooms.find((entry) => entry.locator === locator);
243
+ if (at === undefined || current === undefined || current.roomVersion === at)
244
+ return;
245
+ const from = served.get(locator)?.get(at);
246
+ carried.set(locator, current.roomVersion);
247
+ if (from === undefined)
248
+ return;
249
+ const page = advancement(current, from, 0, true);
250
+ for (const observer of observers) {
251
+ observer({
252
+ kind: 'room-change',
253
+ locator,
254
+ from: at,
255
+ roomVersion: current.roomVersion,
256
+ read: async () => page,
257
+ });
258
+ }
259
+ }
201
260
  function pageOf(conversation, after) {
202
261
  const messages = conversation.messages ?? [];
203
262
  const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
@@ -212,16 +271,13 @@ export function createMemoryAdapter(options = {}) {
212
271
  : {}),
213
272
  };
214
273
  }
215
- function historiesOf(input) {
216
- const asked = input?.conversations;
217
- if (!Array.isArray(asked))
218
- return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
274
+ function historiesOf(request) {
219
275
  const histories = [];
220
- for (const entry of asked) {
221
- const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
276
+ for (const entry of request.conversations) {
277
+ const conversation = scripted.get(entry.conversation);
222
278
  if (conversation === undefined)
223
279
  continue;
224
- const outcome = conversation.outcomes?.['conversation.history'];
280
+ const outcome = conversation.outcomes?.history;
225
281
  if (outcome !== undefined)
226
282
  return outcome;
227
283
  histories.push(pageOf(conversation, entry.after));
@@ -232,15 +288,13 @@ export function createMemoryAdapter(options = {}) {
232
288
  function conversationAction(request) {
233
289
  const name = request.name;
234
290
  const input = (request.input ?? {});
235
- if (name === 'conversation.history')
236
- return historiesOf(request.input);
237
- if (name === 'conversation.create') {
291
+ if (name === 'conversations/create') {
238
292
  issued += 1;
239
293
  const conversation = `conversation-${issued}`;
240
294
  scripted.set(conversation, { conversation });
241
- return { kind: 'action', result: { conversation } };
295
+ return { kind: 'action', result: { conversation_id: conversation } };
242
296
  }
243
- const named = typeof input.conversation === 'string' ? input.conversation : '';
297
+ const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
244
298
  const conversation = scripted.get(named);
245
299
  if (conversation === undefined) {
246
300
  return {
@@ -253,34 +307,28 @@ export function createMemoryAdapter(options = {}) {
253
307
  const outcome = conversation.outcomes?.[name];
254
308
  if (outcome !== undefined)
255
309
  return outcome;
256
- if (name === 'conversation.send') {
310
+ if (name === 'conversations/send') {
257
311
  const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
258
312
  const answered = operation === null ? undefined : sentTurns.get(operation);
259
313
  if (answered !== undefined)
260
- return { kind: 'action', result: { turn: answered } };
314
+ return { kind: 'action', result: { message_id: answered } };
261
315
  issued += 1;
262
316
  const turn = `turn-${issued}`;
263
- unsealed.set(turn, named);
264
317
  if (operation !== null)
265
318
  sentTurns.set(operation, turn);
266
- return { kind: 'action', result: { turn } };
267
- }
268
- if (name === 'conversation.cancel') {
269
- const turn = typeof input.turn === 'string' ? input.turn : '';
270
- if (sealed.has(turn) || !unsealed.has(turn)) {
271
- return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
272
- }
273
- unsealed.delete(turn);
274
- return { kind: 'action', result: { turn, cancelled: true } };
319
+ return { kind: 'action', result: { message_id: turn } };
275
320
  }
276
- if (name === 'conversation.delete')
321
+ if (name === 'conversations/delete')
277
322
  scripted.delete(named);
278
- return { kind: 'action', result: { conversation: named } };
323
+ return { kind: 'action', result: { conversation_id: named } };
279
324
  }
280
325
  function announceList() {
281
- const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined ? [] : [{ conversation, ...listed }]);
282
- for (const listener of listeners)
283
- listener({ kind: 'list', entries });
326
+ const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
327
+ ? []
328
+ : [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
329
+ for (const listener of listeners) {
330
+ listener({ kind: 'list', entries, whole: true, more: false, cursor: null });
331
+ }
284
332
  }
285
333
  function discovery() {
286
334
  return {
@@ -292,9 +340,42 @@ export function createMemoryAdapter(options = {}) {
292
340
  ...(options.member === undefined ? {} : { member: options.member }),
293
341
  };
294
342
  }
343
+ function discovered() {
344
+ return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
345
+ if (answer.kind === 'discovery')
346
+ for (const room of answer.rooms)
347
+ note(room.locator, room);
348
+ return answer;
349
+ });
350
+ }
351
+ function opened(notify) {
352
+ const opening = ++openings;
353
+ notify({ kind: 'opened' });
354
+ void discovered()
355
+ .catch(() => ({ kind: 'transport-uncertainty' }))
356
+ .then((answer) => {
357
+ if (opening !== openings)
358
+ return;
359
+ if (answer.kind !== 'discovery') {
360
+ openings += 1;
361
+ carried.clear();
362
+ const revoked = answer.kind === 'revoked-authorization';
363
+ notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
364
+ return;
365
+ }
366
+ declaredRooms.clear();
367
+ for (const room of answer.rooms)
368
+ declaredRooms.add(room.locator);
369
+ notify({ kind: 'discovered', discovery: answer });
370
+ });
371
+ }
372
+ function emitAll(event) {
373
+ for (const observer of observers)
374
+ observer(event);
375
+ }
295
376
  return {
296
- ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
297
377
  ...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
378
+ ...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
298
379
  setRooms(next) {
299
380
  rooms = [...next];
300
381
  retain(rooms);
@@ -303,33 +384,37 @@ export function createMemoryAdapter(options = {}) {
303
384
  scriptConversations(next);
304
385
  },
305
386
  open() {
387
+ carried.clear();
306
388
  announceList();
307
- for (const observer of observers)
308
- observer({ kind: 'opened' });
389
+ opened(emitAll);
309
390
  },
310
- close({ revoked = false, lost = !revoked } = {}) {
311
- for (const observer of observers)
312
- observer({ kind: 'closed', revoked, lost });
391
+ close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
392
+ openings += 1;
393
+ carried.clear();
394
+ emitAll({ kind: 'closed', revoked, lost, authorityChanged });
313
395
  },
314
396
  expire(locators) {
315
397
  expiring = [...locators];
316
398
  },
317
- notifyRoomVersion({ locator, roomVersion }) {
318
- for (const observer of observers)
319
- observer({ kind: 'room-version', locator, roomVersion });
399
+ notifyRoomVersion({ locator }) {
400
+ carry(locator);
320
401
  },
321
- notifyAuthorityChanged(scope) {
322
- for (const observer of observers) {
323
- observer(scope === undefined
324
- ? { kind: 'authority-changed' }
325
- : { kind: 'authority-changed', scope });
326
- }
402
+ notifyAuthorityChanged(locators) {
403
+ const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
404
+ const listed = rooms.filter((room) => named.has(room.locator));
405
+ const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
406
+ for (const room of listed)
407
+ declaredRooms.add(room.locator);
408
+ for (const locator of left)
409
+ declaredRooms.delete(locator);
410
+ emitAll({
411
+ kind: 'authority-changed',
412
+ rooms: listed.map(declared),
413
+ left,
414
+ ...(options.member === undefined ? {} : { member: options.member }),
415
+ });
327
416
  },
328
417
  notifyConversation(event) {
329
- if (event.kind === 'accepted-message') {
330
- sealed.add(event.message.turn);
331
- unsealed.delete(event.message.turn);
332
- }
333
418
  for (const listener of listeners)
334
419
  listener(event);
335
420
  },
@@ -338,21 +423,31 @@ export function createMemoryAdapter(options = {}) {
338
423
  observer(mode);
339
424
  },
340
425
  heldRooms() {
341
- return held;
426
+ return [...carried.keys()].sort();
342
427
  },
343
428
  replicatedConversations() {
344
429
  return replicated;
345
430
  },
431
+ heldConversationCursor() {
432
+ return heldCursor;
433
+ },
346
434
  conversations: {
347
435
  replicate(next) {
348
436
  replicated = [...next];
349
437
  },
438
+ hold(cursor) {
439
+ heldCursor = cursor;
440
+ },
350
441
  observe(notify) {
351
442
  listeners.add(notify);
352
443
  return () => {
353
444
  listeners.delete(notify);
354
445
  };
355
446
  },
447
+ history: (request) => Promise.resolve(historiesOf(request)),
448
+ ...(options.agents === undefined
449
+ ? {}
450
+ : { agents: () => Promise.resolve(structuredClone(options.agents)) }),
356
451
  },
357
452
  serviceMode: {
358
453
  observe(notify) {
@@ -364,44 +459,46 @@ export function createMemoryAdapter(options = {}) {
364
459
  },
365
460
  roomStream: {
366
461
  hold(asked) {
367
- held = asked.map((room) => room.locator);
368
- const expired = expiring.filter((locator) => held.includes(locator));
369
- expiring = [];
370
- const moved = asked.flatMap((room) => {
462
+ const named = asked.map((room) => room.locator);
463
+ const unknown = asked.flatMap((room) => {
371
464
  const current = rooms.find((entry) => entry.locator === room.locator);
465
+ const version = room.roomVersion;
372
466
  return current === undefined ||
373
- expired.includes(room.locator) ||
374
- current.roomVersion === room.roomVersion
467
+ (version !== null &&
468
+ (current.roomVersion === version || served.get(room.locator)?.has(version) === true))
375
469
  ? []
376
- : [{ locator: room.locator, roomVersion: current.roomVersion }];
470
+ : [room.locator];
377
471
  });
472
+ const expired = [
473
+ ...new Set([...expiring.filter((locator) => named.includes(locator)), ...unknown]),
474
+ ];
475
+ expiring = expiring.filter((locator) => !named.includes(locator));
378
476
  queueMicrotask(() => {
379
- for (const observer of observers) {
380
- for (const room of moved)
381
- observer({ kind: 'room-version', ...room });
382
- observer({ kind: 'opening', expired });
477
+ for (const room of asked) {
478
+ if (expired.includes(room.locator) || room.roomVersion === null)
479
+ carried.delete(room.locator);
480
+ else {
481
+ carried.set(room.locator, room.roomVersion);
482
+ carry(room.locator);
483
+ }
383
484
  }
485
+ emitAll({ kind: 'caught-up', expired });
384
486
  });
385
487
  },
386
- reopen() {
387
- queueMicrotask(() => {
388
- for (const observer of observers) {
389
- observer({ kind: 'closed', revoked: false, lost: false });
390
- }
391
- });
392
- },
393
- published() { },
394
488
  observe(notify) {
395
489
  observers.add(notify);
396
490
  queueMicrotask(() => {
397
491
  if (!observers.has(notify))
398
492
  return;
399
493
  if (options.unopened === true) {
400
- notify({ kind: 'closed', revoked: false, lost: true });
494
+ notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
401
495
  return;
402
496
  }
403
497
  announceList();
404
- notify({ kind: 'opened' });
498
+ opened((event) => {
499
+ if (observers.has(notify))
500
+ notify(event);
501
+ });
405
502
  });
406
503
  return () => {
407
504
  observers.delete(notify);
@@ -418,12 +515,7 @@ export function createMemoryAdapter(options = {}) {
418
515
  return resolveScript(scripts.authorize, () => ({}), undefined);
419
516
  },
420
517
  async discover(_authorization) {
421
- return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
422
- if (answer.kind === 'discovery')
423
- for (const room of answer.rooms)
424
- note(room.locator, room);
425
- return answer;
426
- });
518
+ return discovered();
427
519
  },
428
520
  reached,
429
521
  follows(locator, roomVersion, next) {
@@ -537,7 +629,7 @@ export function createMemoryAdapter(options = {}) {
537
629
  },
538
630
  async action(_authorization, request) {
539
631
  return resolveScript(scripts.action, () => {
540
- if (request.name.startsWith('conversation.'))
632
+ if (request.name.startsWith('conversations/'))
541
633
  return conversationAction(request);
542
634
  return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
543
635
  }, request).then((answer) => {
@@ -1,6 +1,9 @@
1
1
  import type { AcceptedMessage } from './adapter.js';
2
+ import type { JobMarker } from './job.js';
2
3
  import type { Connection } from './tables.js';
3
4
  export declare const MESSAGE_TABLES: readonly string[];
5
+ export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n asking.text AS asking_text,\n json_extract(asking.message, '$.accepted_at') AS asking_at,\n json_extract(asking.message, '$.source') AS asking_source,\n json_extract(asking.message, '$.sender') AS asking_sender\n FROM chosen\n LEFT JOIN conversation_messages said ON said.id = chosen.said\n LEFT JOIN conversation_messages answer ON answer.id = chosen.answer\n LEFT JOIN conversation_messages opened ON opened.id = chosen.opened\n LEFT JOIN conversation_messages asking ON asking.id = chosen.asking";
6
+ export declare const JOB_MARKERS = "SELECT json_extract(part.value, '$.text') AS said,\n json_extract(message, '$.accepted_at') AS at\n FROM conversation_messages, json_each(message, '$.parts') AS part\n WHERE conversation = ? AND instr(message, '\"marker\":\"job\"') > 0\n AND json_extract(part.value, '$.type') = 'marker'\n AND json_extract(part.value, '$.marker') = 'job'\n ORDER BY position, identity, part.key";
4
7
  export type HeldConversation = {
5
8
  readonly conversation: string;
6
9
  readonly read: string | null | undefined;
@@ -10,6 +13,25 @@ export type MessageWindow = {
10
13
  readonly messages: AcceptedMessage[];
11
14
  readonly more: boolean;
12
15
  };
16
+ export type HeldSource = {
17
+ readonly source: unknown;
18
+ readonly sender: string | null;
19
+ };
20
+ export type HeldRow = {
21
+ readonly conversation: string;
22
+ readonly said: {
23
+ readonly text: string;
24
+ readonly role: string | null;
25
+ readonly at: string | null;
26
+ } | null;
27
+ readonly failure: string | null;
28
+ readonly opened: HeldSource | null;
29
+ readonly asking: (HeldSource & {
30
+ readonly identity: string;
31
+ readonly text: string;
32
+ readonly at: string | null;
33
+ }) | null;
34
+ };
13
35
  export type ConversationWrite = {
14
36
  readonly conversation: string;
15
37
  readonly messages: readonly AcceptedMessage[];
@@ -18,10 +40,12 @@ export type ConversationWrite = {
18
40
  readonly partial: boolean;
19
41
  };
20
42
  };
21
- export declare function heldConversations(connection: Connection): HeldConversation[];
43
+ export declare function heldConversations(connection: Connection, conversations: readonly string[] | null): HeldConversation[];
22
44
  export declare function keptMessages(connection: Connection, { conversation, messages, read }: ConversationWrite): null;
23
- export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null): MessageWindow;
24
- export declare function messageCount(connection: Connection, conversation: string): number;
45
+ export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null, phrase: string | null): MessageWindow;
46
+ export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): number;
47
+ export declare function conversationRows(connection: Connection, conversations: readonly string[]): HeldRow[];
48
+ export declare function jobMarkers(connection: Connection, conversation: string): JobMarker[];
25
49
  export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
26
50
  export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
27
51
  export declare function forgottenMessages(connection: Connection): void;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAE1D,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAM3C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC3E,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAmB5E;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAClD,IAAI,CAoCN;AAYD,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GACvC,aAAa,CAUf;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAMjF;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO/F;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAW9F;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAG9D"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}