@agentshouse/mdruntime 0.1.0-c069136dcb4e8 → 0.1.0-c076b00ebf42a

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 (316) hide show
  1. package/README.md +21 -19
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +299 -0
  5. package/dist/act-lanes.d.ts +30 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +225 -0
  8. package/dist/actions.d.ts +26 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +302 -0
  11. package/dist/adapter.d.ts +108 -85
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +3 -11
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +20 -60
  16. package/dist/bootstrap.d.ts +9 -5
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +204 -85
  19. package/dist/cell.d.ts +6 -0
  20. package/dist/cell.d.ts.map +1 -0
  21. package/dist/cell.js +9 -0
  22. package/dist/chain.d.ts +2 -1
  23. package/dist/chain.d.ts.map +1 -1
  24. package/dist/change-set.d.ts +4 -0
  25. package/dist/change-set.d.ts.map +1 -1
  26. package/dist/change-set.js +6 -0
  27. package/dist/change.d.ts +1 -0
  28. package/dist/change.d.ts.map +1 -1
  29. package/dist/change.js +4 -2
  30. package/dist/chat-types.d.ts +3 -0
  31. package/dist/chat-types.d.ts.map +1 -0
  32. package/dist/chat-types.js +11 -0
  33. package/dist/client.d.ts +29 -22
  34. package/dist/client.d.ts.map +1 -1
  35. package/dist/client.js +36 -20
  36. package/dist/collection.d.ts +26 -4
  37. package/dist/collection.d.ts.map +1 -1
  38. package/dist/collection.js +19 -2
  39. package/dist/compile.d.ts +8 -6
  40. package/dist/compile.d.ts.map +1 -1
  41. package/dist/compile.js +286 -336
  42. package/dist/connection.d.ts +5 -142
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +110 -4970
  45. package/dist/context.d.ts +2 -0
  46. package/dist/context.d.ts.map +1 -0
  47. package/dist/context.js +7 -0
  48. package/dist/conversation-live.d.ts +150 -0
  49. package/dist/conversation-live.d.ts.map +1 -0
  50. package/dist/conversation-live.js +259 -0
  51. package/dist/conversation-row.d.ts +35 -0
  52. package/dist/conversation-row.d.ts.map +1 -0
  53. package/dist/conversation-row.js +55 -0
  54. package/dist/conversation.d.ts +65 -44
  55. package/dist/conversation.d.ts.map +1 -1
  56. package/dist/conversation.js +999 -881
  57. package/dist/declaration.d.ts +10 -0
  58. package/dist/declaration.d.ts.map +1 -0
  59. package/dist/declaration.js +24 -0
  60. package/dist/discovery.d.ts +10 -0
  61. package/dist/discovery.d.ts.map +1 -0
  62. package/dist/discovery.js +150 -0
  63. package/dist/durability.d.ts +19 -0
  64. package/dist/durability.d.ts.map +1 -1
  65. package/dist/durability.js +4 -0
  66. package/dist/entry.d.ts +2 -2
  67. package/dist/entry.d.ts.map +1 -1
  68. package/dist/entry.js +18 -8
  69. package/dist/expectation.d.ts +26 -13
  70. package/dist/expectation.d.ts.map +1 -1
  71. package/dist/expectation.js +72 -19
  72. package/dist/failure.d.ts +3 -0
  73. package/dist/failure.d.ts.map +1 -1
  74. package/dist/failure.js +6 -0
  75. package/dist/figures.d.ts +49 -0
  76. package/dist/figures.d.ts.map +1 -0
  77. package/dist/figures.js +199 -0
  78. package/dist/file.d.ts.map +1 -1
  79. package/dist/file.js +2 -1
  80. package/dist/holdings.d.ts +29 -0
  81. package/dist/holdings.d.ts.map +1 -0
  82. package/dist/holdings.js +95 -0
  83. package/dist/host.d.ts +21 -7
  84. package/dist/host.d.ts.map +1 -1
  85. package/dist/host.js +77 -41
  86. package/dist/identity.d.ts +0 -1
  87. package/dist/identity.d.ts.map +1 -1
  88. package/dist/identity.js +0 -3
  89. package/dist/index.d.ts +34 -12
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +16 -5
  92. package/dist/install.d.ts +60 -0
  93. package/dist/install.d.ts.map +1 -0
  94. package/dist/install.js +537 -0
  95. package/dist/lifecycle.d.ts +7 -0
  96. package/dist/lifecycle.d.ts.map +1 -0
  97. package/dist/lifecycle.js +278 -0
  98. package/dist/listing.d.ts +52 -0
  99. package/dist/listing.d.ts.map +1 -0
  100. package/dist/listing.js +152 -0
  101. package/dist/live.d.ts +9 -6
  102. package/dist/live.d.ts.map +1 -1
  103. package/dist/live.js +118 -36
  104. package/dist/locks.d.ts +7 -0
  105. package/dist/locks.d.ts.map +1 -0
  106. package/dist/locks.js +32 -0
  107. package/dist/lost.d.ts +5 -0
  108. package/dist/lost.d.ts.map +1 -0
  109. package/dist/lost.js +49 -0
  110. package/dist/media.d.ts +1 -1
  111. package/dist/media.d.ts.map +1 -1
  112. package/dist/media.js +10 -13
  113. package/dist/memory.d.ts +15 -6
  114. package/dist/memory.d.ts.map +1 -1
  115. package/dist/memory.js +178 -89
  116. package/dist/messages.d.ts +35 -5
  117. package/dist/messages.d.ts.map +1 -1
  118. package/dist/messages.js +108 -36
  119. package/dist/model.d.ts +2 -10
  120. package/dist/model.d.ts.map +1 -1
  121. package/dist/model.js +0 -14
  122. package/dist/models.d.ts +10 -0
  123. package/dist/models.d.ts.map +1 -0
  124. package/dist/models.js +153 -0
  125. package/dist/observation.d.ts +28 -13
  126. package/dist/observation.d.ts.map +1 -1
  127. package/dist/observation.js +185 -81
  128. package/dist/opened.d.ts +1 -1
  129. package/dist/opened.d.ts.map +1 -1
  130. package/dist/opened.js +5 -5
  131. package/dist/opening.d.ts +4 -0
  132. package/dist/opening.d.ts.map +1 -0
  133. package/dist/opening.js +53 -0
  134. package/dist/outcome.d.ts +11 -1
  135. package/dist/outcome.d.ts.map +1 -1
  136. package/dist/outcome.js +26 -2
  137. package/dist/overlay.d.ts +6 -1
  138. package/dist/overlay.d.ts.map +1 -1
  139. package/dist/overlay.js +47 -21
  140. package/dist/page-metadata.d.ts +8 -0
  141. package/dist/page-metadata.d.ts.map +1 -0
  142. package/dist/page-metadata.js +19 -0
  143. package/dist/parts.d.ts +4 -0
  144. package/dist/parts.d.ts.map +1 -0
  145. package/dist/parts.js +13 -0
  146. package/dist/paths.d.ts +1 -0
  147. package/dist/paths.d.ts.map +1 -1
  148. package/dist/paths.js +22 -0
  149. package/dist/preparation.d.ts +41 -0
  150. package/dist/preparation.d.ts.map +1 -0
  151. package/dist/preparation.js +314 -0
  152. package/dist/presence.d.ts +58 -0
  153. package/dist/presence.d.ts.map +1 -0
  154. package/dist/presence.js +233 -0
  155. package/dist/queries.d.ts +16 -0
  156. package/dist/queries.d.ts.map +1 -0
  157. package/dist/queries.js +308 -0
  158. package/dist/query.d.ts +14 -210
  159. package/dist/query.d.ts.map +1 -1
  160. package/dist/query.js +3 -505
  161. package/dist/questions.d.ts +29 -0
  162. package/dist/questions.d.ts.map +1 -0
  163. package/dist/questions.js +115 -0
  164. package/dist/queue.d.ts +40 -0
  165. package/dist/queue.d.ts.map +1 -0
  166. package/dist/queue.js +450 -0
  167. package/dist/reach.d.ts +16 -15
  168. package/dist/reach.d.ts.map +1 -1
  169. package/dist/reach.js +248 -147
  170. package/dist/react.d.ts +17 -3
  171. package/dist/react.d.ts.map +1 -1
  172. package/dist/react.js +33 -1
  173. package/dist/read.d.ts +7 -0
  174. package/dist/read.d.ts.map +1 -0
  175. package/dist/read.js +17 -0
  176. package/dist/readiness.d.ts +9 -6
  177. package/dist/readiness.d.ts.map +1 -1
  178. package/dist/readiness.js +3 -5
  179. package/dist/reads.d.ts +39 -0
  180. package/dist/reads.d.ts.map +1 -0
  181. package/dist/reads.js +178 -0
  182. package/dist/recovery.d.ts +3 -1
  183. package/dist/recovery.d.ts.map +1 -1
  184. package/dist/recovery.js +38 -8
  185. package/dist/refresh.d.ts +2 -1
  186. package/dist/refresh.d.ts.map +1 -1
  187. package/dist/refresh.js +31 -3
  188. package/dist/refusal.d.ts +5 -0
  189. package/dist/refusal.d.ts.map +1 -0
  190. package/dist/refusal.js +55 -0
  191. package/dist/replica.d.ts +11 -16
  192. package/dist/replica.d.ts.map +1 -1
  193. package/dist/replica.js +64 -30
  194. package/dist/retried.d.ts +30 -0
  195. package/dist/retried.d.ts.map +1 -0
  196. package/dist/retried.js +72 -0
  197. package/dist/room-draft.d.ts +7 -8
  198. package/dist/room-draft.d.ts.map +1 -1
  199. package/dist/room-draft.js +113 -111
  200. package/dist/room-drafts.d.ts +24 -0
  201. package/dist/room-drafts.d.ts.map +1 -0
  202. package/dist/room-drafts.js +217 -0
  203. package/dist/rows.d.ts +16 -22
  204. package/dist/rows.d.ts.map +1 -1
  205. package/dist/rows.js +49 -186
  206. package/dist/runtime.d.ts +34 -0
  207. package/dist/runtime.d.ts.map +1 -0
  208. package/dist/runtime.js +1 -0
  209. package/dist/save.d.ts +42 -86
  210. package/dist/save.d.ts.map +1 -1
  211. package/dist/save.js +344 -174
  212. package/dist/saves.d.ts +32 -0
  213. package/dist/saves.d.ts.map +1 -0
  214. package/dist/saves.js +409 -0
  215. package/dist/search.d.ts +12 -63
  216. package/dist/search.d.ts.map +1 -1
  217. package/dist/search.js +9 -52
  218. package/dist/seed.d.ts +11 -2
  219. package/dist/seed.d.ts.map +1 -1
  220. package/dist/seed.js +71 -1
  221. package/dist/shared.d.ts +1 -6
  222. package/dist/shared.d.ts.map +1 -1
  223. package/dist/shared.js +13 -95
  224. package/dist/shown.d.ts +33 -0
  225. package/dist/shown.d.ts.map +1 -0
  226. package/dist/shown.js +309 -0
  227. package/dist/socket/admission.d.ts +7 -0
  228. package/dist/socket/admission.d.ts.map +1 -0
  229. package/dist/socket/admission.js +39 -0
  230. package/dist/socket/answers.d.ts +6 -0
  231. package/dist/socket/answers.d.ts.map +1 -0
  232. package/dist/socket/answers.js +20 -0
  233. package/dist/socket/lanes.d.ts +28 -0
  234. package/dist/socket/lanes.d.ts.map +1 -0
  235. package/dist/socket/lanes.js +103 -0
  236. package/dist/socket/reads.d.ts +10 -0
  237. package/dist/socket/reads.d.ts.map +1 -0
  238. package/dist/socket/reads.js +31 -0
  239. package/dist/socket/session.d.ts +38 -0
  240. package/dist/socket/session.d.ts.map +1 -0
  241. package/dist/socket/session.js +23 -0
  242. package/dist/socket.d.ts +67 -0
  243. package/dist/socket.d.ts.map +1 -0
  244. package/dist/socket.js +164 -0
  245. package/dist/source.d.ts +54 -0
  246. package/dist/source.d.ts.map +1 -0
  247. package/dist/source.js +82 -0
  248. package/dist/status.d.ts +0 -2
  249. package/dist/status.d.ts.map +1 -1
  250. package/dist/status.js +0 -6
  251. package/dist/store/installs.d.ts +30 -0
  252. package/dist/store/installs.d.ts.map +1 -0
  253. package/dist/store/installs.js +40 -0
  254. package/dist/store/readiness.d.ts +11 -0
  255. package/dist/store/readiness.d.ts.map +1 -0
  256. package/dist/store/readiness.js +68 -0
  257. package/dist/store/records.d.ts +217 -0
  258. package/dist/store/records.d.ts.map +1 -0
  259. package/dist/store/records.js +464 -0
  260. package/dist/store/room-held.d.ts +8 -0
  261. package/dist/store/room-held.d.ts.map +1 -0
  262. package/dist/store/room-held.js +17 -0
  263. package/dist/store/rooms-shown.d.ts +8 -0
  264. package/dist/store/rooms-shown.d.ts.map +1 -0
  265. package/dist/store/rooms-shown.js +13 -0
  266. package/dist/store/space.d.ts +11 -0
  267. package/dist/store/space.d.ts.map +1 -0
  268. package/dist/store/space.js +41 -0
  269. package/dist/store/watchers.d.ts +17 -0
  270. package/dist/store/watchers.d.ts.map +1 -0
  271. package/dist/store/watchers.js +56 -0
  272. package/dist/store/writes.d.ts +24 -0
  273. package/dist/store/writes.d.ts.map +1 -0
  274. package/dist/store/writes.js +125 -0
  275. package/dist/store.d.ts +113 -144
  276. package/dist/store.d.ts.map +1 -1
  277. package/dist/store.js +171 -364
  278. package/dist/stored.d.ts +72 -35
  279. package/dist/stored.d.ts.map +1 -1
  280. package/dist/stored.js +340 -197
  281. package/dist/surface.d.ts +89 -0
  282. package/dist/surface.d.ts.map +1 -0
  283. package/dist/surface.js +222 -0
  284. package/dist/sync.d.ts +19 -0
  285. package/dist/sync.d.ts.map +1 -0
  286. package/dist/sync.js +535 -0
  287. package/dist/tables.d.ts +124 -30
  288. package/dist/tables.d.ts.map +1 -1
  289. package/dist/tables.js +242 -62
  290. package/dist/tallies.d.ts +18 -0
  291. package/dist/tallies.d.ts.map +1 -0
  292. package/dist/tallies.js +128 -0
  293. package/dist/validation.d.ts.map +1 -1
  294. package/dist/validation.js +9 -12
  295. package/dist/windows.d.ts +1 -12
  296. package/dist/windows.d.ts.map +1 -1
  297. package/dist/windows.js +2 -75
  298. package/dist/wire.d.ts +58 -9
  299. package/dist/wire.d.ts.map +1 -1
  300. package/dist/wire.js +21 -5
  301. package/package.json +3 -2
  302. package/dist/attempt.d.ts +0 -16
  303. package/dist/attempt.d.ts.map +0 -1
  304. package/dist/attempt.js +0 -70
  305. package/dist/fence.d.ts +0 -6
  306. package/dist/fence.d.ts.map +0 -1
  307. package/dist/fence.js +0 -10
  308. package/dist/fulltext.d.ts +0 -27
  309. package/dist/fulltext.d.ts.map +0 -1
  310. package/dist/fulltext.js +0 -370
  311. package/dist/log.d.ts +0 -5
  312. package/dist/log.d.ts.map +0 -1
  313. package/dist/log.js +0 -14
  314. package/dist/words.d.ts +0 -19
  315. package/dist/words.d.ts.map +0 -1
  316. package/dist/words.js +0 -156
package/dist/memory.js CHANGED
@@ -1,3 +1,7 @@
1
+ import { definitionAt, documentFacts, parse } from '@agentshouse/mdmodel';
2
+ import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
3
+ import { selected } from './collection.js';
4
+ import { declaredType } from './outcome.js';
1
5
  import { sameChange } from './overlay.js';
2
6
  const ATTACHMENTS = 'attachments';
3
7
  function lastName(path) {
@@ -5,7 +9,6 @@ function lastName(path) {
5
9
  }
6
10
  const FIXTURE_RETENTION = {
7
11
  history: { kind: 'duration', seconds: 1 },
8
- outcome: 604_800,
9
12
  refreshHorizon: 1,
10
13
  };
11
14
  function declaredRetention(value) {
@@ -52,15 +55,17 @@ export function createMemoryAdapter(options = {}) {
52
55
  const listeners = new Set();
53
56
  const modeObservers = new Set();
54
57
  const scripted = new Map();
55
- const unsealed = new Map();
56
- const sealed = new Set();
57
- const sentTurns = new Map();
58
+ const repeats = new Map();
58
59
  const historyPageSize = options.historyPageSize;
59
60
  const attached = new Map();
60
61
  const linked = new WeakMap();
61
62
  const carried = new Map();
62
63
  let expiring = [];
64
+ let openings = 0;
65
+ const declaredRooms = new Set();
63
66
  let replicated = [];
67
+ let heldCursor = null;
68
+ let agents = structuredClone(options.agents ?? []);
64
69
  let issued = 0;
65
70
  function scriptConversations(entries) {
66
71
  scripted.clear();
@@ -101,8 +106,40 @@ export function createMemoryAdapter(options = {}) {
101
106
  return path;
102
107
  }
103
108
  }
109
+ const saved = new WeakMap();
110
+ const roomTypes = options.roomTypes ?? NO_ROOM_TYPES;
111
+ function factsAt(room, path, content) {
112
+ const types = selected({ selection: room.typedSelection ?? null }, path)
113
+ ? roomTypes.types
114
+ : schemaTypes(room.model?.kind === 'model' ? room.model.snapshot.schema : null, roomTypes);
115
+ let held = saved.get(types);
116
+ if (held === undefined) {
117
+ held = new Map();
118
+ saved.set(types, held);
119
+ }
120
+ const key = `${path}\u0000${content}`;
121
+ if (!held.has(key)) {
122
+ const facts = documentFacts(path, parse(content, path, definitionAt({ types }, path, options.typedPaths)), {
123
+ types,
124
+ });
125
+ held.set(key, facts === null ? null : JSON.parse(JSON.stringify(facts)));
126
+ }
127
+ return held.get(key);
128
+ }
129
+ function factsIn(room, paths) {
130
+ const facts = {};
131
+ for (const path of paths) {
132
+ const content = room.documents?.[path];
133
+ const held = room.facts?.[path] ?? (content === undefined ? null : factsAt(room, path, content));
134
+ if (held !== null)
135
+ facts[path] = held;
136
+ }
137
+ return facts;
138
+ }
104
139
  function retain(entries) {
105
140
  for (const room of entries) {
141
+ for (const [path, content] of Object.entries(room.documents ?? {}))
142
+ factsAt(room, path, content);
106
143
  note(room.locator, room);
107
144
  const versions = served.get(room.locator) ?? new Map();
108
145
  versions.set(room.roomVersion, room);
@@ -118,8 +155,9 @@ export function createMemoryAdapter(options = {}) {
118
155
  roomVersion: room.roomVersion,
119
156
  operations: room.operations,
120
157
  replica: room.replica,
121
- ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
158
+ typedSelection: room.typedSelection ?? null,
122
159
  providerOwnedPaths: room.providerOwnedPaths,
160
+ authoredPaths: room.authoredPaths ?? ['**'],
123
161
  };
124
162
  }
125
163
  function page(room, after) {
@@ -135,10 +173,14 @@ export function createMemoryAdapter(options = {}) {
135
173
  roomVersion: room.roomVersion,
136
174
  ...(opening ? { models: modelsOf(room) } : {}),
137
175
  documents: named(room.documents ?? {}, taken),
176
+ facts: factsIn(room, taken),
138
177
  revisions: named(room.revisions ?? {}, [...taken, ...targets]),
139
178
  ...(room.fileIds === undefined
140
179
  ? {}
141
180
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
181
+ ...(room.created === undefined
182
+ ? {}
183
+ : { created: named(room.created, [...taken, ...targets]) }),
142
184
  changes: named(room.changes ?? {}, [...taken, ...targets]),
143
185
  binaryFiles: named(room.binaryFiles ?? {}, targets),
144
186
  ...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
@@ -162,6 +204,7 @@ export function createMemoryAdapter(options = {}) {
162
204
  const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
163
205
  const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
164
206
  room.fileIds?.[path] !== from.fileIds?.[path] ||
207
+ room.created?.[path] !== from.created?.[path] ||
165
208
  !sameChange(room.changes?.[path], from.changes?.[path]);
166
209
  const changed = Object.keys(current)
167
210
  .filter((path) => current[path] !== previous[path] || headMoved(path))
@@ -182,10 +225,14 @@ export function createMemoryAdapter(options = {}) {
182
225
  roomVersion: room.roomVersion,
183
226
  ...(models === undefined ? {} : { models }),
184
227
  documents: named(current, taken),
228
+ facts: factsIn(room, taken),
185
229
  revisions: named(room.revisions ?? {}, [...taken, ...targets]),
186
230
  ...(room.fileIds === undefined
187
231
  ? {}
188
232
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
233
+ ...(room.created === undefined
234
+ ? {}
235
+ : { created: named(room.created, [...taken, ...targets]) }),
189
236
  changes: named(room.changes ?? {}, [...taken, ...targets]),
190
237
  binaryFiles: named(room.binaryFiles ?? {}, targets),
191
238
  ...(opening ? foldersMoved(room, from) : {}),
@@ -220,28 +267,23 @@ export function createMemoryAdapter(options = {}) {
220
267
  }
221
268
  function pageOf(conversation, after) {
222
269
  const messages = conversation.messages ?? [];
223
- const first = typeof after === 'string' ? messages.findIndex((message) => message.position > after) : 0;
270
+ const first = typeof after === 'string' ? messages.findIndex((message) => message.change > after) : 0;
224
271
  const from = first === -1 ? messages.length : first;
225
272
  const page = messages.slice(from, from + (historyPageSize ?? messages.length));
226
273
  const last = page.at(-1);
227
274
  return {
228
275
  conversation: conversation.conversation,
229
276
  messages: page,
230
- ...(last !== undefined && from + page.length < messages.length
231
- ? { next: last.position }
232
- : {}),
277
+ ...(last !== undefined && from + page.length < messages.length ? { next: last.change } : {}),
233
278
  };
234
279
  }
235
- function historiesOf(input) {
236
- const asked = input?.conversations;
237
- if (!Array.isArray(asked))
238
- return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
280
+ function historiesOf(request) {
239
281
  const histories = [];
240
- for (const entry of asked) {
241
- const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
282
+ for (const entry of request.conversations) {
283
+ const conversation = scripted.get(entry.conversation);
242
284
  if (conversation === undefined)
243
285
  continue;
244
- const outcome = conversation.outcomes?.['conversation.history'];
286
+ const outcome = conversation.outcomes?.history;
245
287
  if (outcome !== undefined)
246
288
  return outcome;
247
289
  histories.push(pageOf(conversation, entry.after));
@@ -252,15 +294,22 @@ export function createMemoryAdapter(options = {}) {
252
294
  function conversationAction(request) {
253
295
  const name = request.name;
254
296
  const input = (request.input ?? {});
255
- if (name === 'conversation.history')
256
- return historiesOf(request.input);
257
- if (name === 'conversation.create') {
297
+ const operation = typeof input.operation_id === 'string' ? `${name}\u0000${input.operation_id}` : null;
298
+ const first = (answer) => {
299
+ if (operation !== null)
300
+ repeats.set(operation, answer);
301
+ return answer;
302
+ };
303
+ const repeated = operation === null ? undefined : repeats.get(operation);
304
+ if (name === 'conversations/create') {
305
+ if (repeated !== undefined)
306
+ return repeated;
258
307
  issued += 1;
259
308
  const conversation = `conversation-${issued}`;
260
309
  scripted.set(conversation, { conversation });
261
- return { kind: 'action', result: { conversation } };
310
+ return first({ kind: 'action', result: { conversation_id: conversation } });
262
311
  }
263
- const named = typeof input.conversation === 'string' ? input.conversation : '';
312
+ const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
264
313
  const conversation = scripted.get(named);
265
314
  if (conversation === undefined) {
266
315
  return {
@@ -273,36 +322,41 @@ export function createMemoryAdapter(options = {}) {
273
322
  const outcome = conversation.outcomes?.[name];
274
323
  if (outcome !== undefined)
275
324
  return outcome;
276
- if (name === 'conversation.send') {
277
- const operation = typeof input.operation_id === 'string' ? input.operation_id : null;
278
- const answered = operation === null ? undefined : sentTurns.get(operation);
279
- if (answered !== undefined)
280
- return { kind: 'action', result: { turn: answered } };
325
+ if (name === 'conversations/send') {
326
+ if (repeated !== undefined)
327
+ return repeated;
281
328
  issued += 1;
282
- const turn = `turn-${issued}`;
283
- unsealed.set(turn, named);
284
- if (operation !== null)
285
- sentTurns.set(operation, turn);
286
- return { kind: 'action', result: { turn } };
329
+ return first({ kind: 'action', result: { message_id: `turn-${issued}` } });
287
330
  }
288
- if (name === 'conversation.cancel') {
289
- const turn = typeof input.turn === 'string' ? input.turn : '';
290
- if (sealed.has(turn) || !unsealed.has(turn)) {
291
- return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
292
- }
293
- unsealed.delete(turn);
294
- return { kind: 'action', result: { turn, cancelled: true } };
295
- }
296
- if (name === 'conversation.delete')
331
+ if (name === 'conversations/delete')
297
332
  scripted.delete(named);
298
- return { kind: 'action', result: { conversation: named } };
333
+ return { kind: 'action', result: { conversation_id: named } };
334
+ }
335
+ function decided(request) {
336
+ const { request: asked, message, decision, } = (request.input ?? {});
337
+ return {
338
+ kind: 'action',
339
+ result: {
340
+ request: asked,
341
+ ...(message === undefined ? {} : { message }),
342
+ state: decision === 'approve' ? 'started' : 'declined',
343
+ },
344
+ };
299
345
  }
300
346
  function announceList() {
301
347
  const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
302
348
  ? []
303
- : [{ conversation, ...listed, newest: messages.at(-1)?.position ?? null }]);
304
- for (const listener of listeners)
305
- listener({ kind: 'list', entries });
349
+ : [{ conversation, ...listed, newest: messages.at(-1)?.change ?? null }]);
350
+ for (const listener of listeners) {
351
+ listener({
352
+ kind: 'list',
353
+ agents: structuredClone(agents),
354
+ entries,
355
+ whole: true,
356
+ more: false,
357
+ cursor: null,
358
+ });
359
+ }
306
360
  }
307
361
  function discovery() {
308
362
  return {
@@ -314,9 +368,42 @@ export function createMemoryAdapter(options = {}) {
314
368
  ...(options.member === undefined ? {} : { member: options.member }),
315
369
  };
316
370
  }
371
+ function discovered() {
372
+ return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
373
+ if (answer.kind === 'discovery')
374
+ for (const room of answer.rooms)
375
+ note(room.locator, room);
376
+ return answer;
377
+ });
378
+ }
379
+ function opened(notify) {
380
+ const opening = ++openings;
381
+ notify({ kind: 'opened' });
382
+ void discovered()
383
+ .catch(() => ({ kind: 'transport-uncertainty' }))
384
+ .then((answer) => {
385
+ if (opening !== openings)
386
+ return;
387
+ if (answer.kind !== 'discovery') {
388
+ openings += 1;
389
+ carried.clear();
390
+ const revoked = answer.kind === 'revoked-authorization';
391
+ notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
392
+ return;
393
+ }
394
+ declaredRooms.clear();
395
+ for (const room of answer.rooms)
396
+ declaredRooms.add(room.locator);
397
+ notify({ kind: 'discovered', discovery: answer });
398
+ });
399
+ }
400
+ function emitAll(event) {
401
+ for (const observer of observers)
402
+ observer(event);
403
+ }
317
404
  return {
318
- ...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
319
405
  ...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
406
+ ...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
320
407
  setRooms(next) {
321
408
  rooms = [...next];
322
409
  retain(rooms);
@@ -324,16 +411,18 @@ export function createMemoryAdapter(options = {}) {
324
411
  setConversations(next) {
325
412
  scriptConversations(next);
326
413
  },
414
+ setAgents(next) {
415
+ agents = structuredClone(next);
416
+ },
327
417
  open() {
328
418
  carried.clear();
329
419
  announceList();
330
- for (const observer of observers)
331
- observer({ kind: 'opened' });
420
+ opened(emitAll);
332
421
  },
333
- close({ revoked = false, lost = !revoked } = {}) {
422
+ close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
423
+ openings += 1;
334
424
  carried.clear();
335
- for (const observer of observers)
336
- observer({ kind: 'closed', revoked, lost });
425
+ emitAll({ kind: 'closed', revoked, lost, authorityChanged });
337
426
  },
338
427
  expire(locators) {
339
428
  expiring = [...locators];
@@ -341,18 +430,22 @@ export function createMemoryAdapter(options = {}) {
341
430
  notifyRoomVersion({ locator }) {
342
431
  carry(locator);
343
432
  },
344
- notifyAuthorityChanged(scope) {
345
- for (const observer of observers) {
346
- observer(scope === undefined
347
- ? { kind: 'authority-changed' }
348
- : { kind: 'authority-changed', scope });
349
- }
433
+ notifyAuthorityChanged(locators) {
434
+ const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
435
+ const listed = rooms.filter((room) => named.has(room.locator));
436
+ const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
437
+ for (const room of listed)
438
+ declaredRooms.add(room.locator);
439
+ for (const locator of left)
440
+ declaredRooms.delete(locator);
441
+ emitAll({
442
+ kind: 'authority-changed',
443
+ rooms: listed.map(declared),
444
+ left,
445
+ ...(options.member === undefined ? {} : { member: options.member }),
446
+ });
350
447
  },
351
448
  notifyConversation(event) {
352
- if (event.kind === 'accepted-message') {
353
- sealed.add(event.message.turn);
354
- unsealed.delete(event.message.turn);
355
- }
356
449
  for (const listener of listeners)
357
450
  listener(event);
358
451
  },
@@ -366,19 +459,23 @@ export function createMemoryAdapter(options = {}) {
366
459
  replicatedConversations() {
367
460
  return replicated;
368
461
  },
462
+ heldConversationCursor() {
463
+ return heldCursor;
464
+ },
369
465
  conversations: {
370
466
  replicate(next) {
371
467
  replicated = [...next];
372
468
  },
469
+ hold(cursor) {
470
+ heldCursor = cursor;
471
+ },
373
472
  observe(notify) {
374
473
  listeners.add(notify);
375
474
  return () => {
376
475
  listeners.delete(notify);
377
476
  };
378
477
  },
379
- ...(options.agents === undefined
380
- ? {}
381
- : { agents: () => Promise.resolve(structuredClone(options.agents)) }),
478
+ history: (request) => Promise.resolve(historiesOf(request)),
382
479
  },
383
480
  serviceMode: {
384
481
  observe(notify) {
@@ -393,9 +490,10 @@ export function createMemoryAdapter(options = {}) {
393
490
  const named = asked.map((room) => room.locator);
394
491
  const unknown = asked.flatMap((room) => {
395
492
  const current = rooms.find((entry) => entry.locator === room.locator);
493
+ const version = room.roomVersion;
396
494
  return current === undefined ||
397
- current.roomVersion === room.roomVersion ||
398
- served.get(room.locator)?.has(room.roomVersion) === true
495
+ (version !== null &&
496
+ (current.roomVersion === version || served.get(room.locator)?.has(version) === true))
399
497
  ? []
400
498
  : [room.locator];
401
499
  });
@@ -405,23 +503,14 @@ export function createMemoryAdapter(options = {}) {
405
503
  expiring = expiring.filter((locator) => !named.includes(locator));
406
504
  queueMicrotask(() => {
407
505
  for (const room of asked) {
408
- if (expired.includes(room.locator))
506
+ if (expired.includes(room.locator) || room.roomVersion === null)
409
507
  carried.delete(room.locator);
410
508
  else {
411
509
  carried.set(room.locator, room.roomVersion);
412
510
  carry(room.locator);
413
511
  }
414
512
  }
415
- for (const observer of observers)
416
- observer({ kind: 'opening', expired });
417
- });
418
- },
419
- reopen() {
420
- queueMicrotask(() => {
421
- carried.clear();
422
- for (const observer of observers) {
423
- observer({ kind: 'closed', revoked: false, lost: false });
424
- }
513
+ emitAll({ kind: 'caught-up', expired });
425
514
  });
426
515
  },
427
516
  observe(notify) {
@@ -430,11 +519,14 @@ export function createMemoryAdapter(options = {}) {
430
519
  if (!observers.has(notify))
431
520
  return;
432
521
  if (options.unopened === true) {
433
- notify({ kind: 'closed', revoked: false, lost: true });
522
+ notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
434
523
  return;
435
524
  }
436
525
  announceList();
437
- notify({ kind: 'opened' });
526
+ opened((event) => {
527
+ if (observers.has(notify))
528
+ notify(event);
529
+ });
438
530
  });
439
531
  return () => {
440
532
  observers.delete(notify);
@@ -451,12 +543,7 @@ export function createMemoryAdapter(options = {}) {
451
543
  return resolveScript(scripts.authorize, () => ({}), undefined);
452
544
  },
453
545
  async discover(_authorization) {
454
- return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
455
- if (answer.kind === 'discovery')
456
- for (const room of answer.rooms)
457
- note(room.locator, room);
458
- return answer;
459
- });
546
+ return discovered();
460
547
  },
461
548
  reached,
462
549
  follows(locator, roomVersion, next) {
@@ -540,8 +627,8 @@ export function createMemoryAdapter(options = {}) {
540
627
  return { kind: 'room-not-readable', locator: request.locator };
541
628
  const blob = heldBlob(room, request.path);
542
629
  return blob === undefined
543
- ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
544
- : { kind: 'binary', body: blob.stream(), mediaType: blob.type };
630
+ ? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
631
+ : { kind: 'binary', body: blob.stream(), mediaType: declaredType(blob) };
545
632
  }, request);
546
633
  },
547
634
  async link(_authorization, request) {
@@ -551,11 +638,11 @@ export function createMemoryAdapter(options = {}) {
551
638
  return { kind: 'room-not-readable', locator: request.locator };
552
639
  const blob = heldBlob(room, request.path);
553
640
  if (blob === undefined) {
554
- return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
641
+ return { kind: 'rejected', code: 'not_found', fields: {}, retryable: false };
555
642
  }
556
643
  const url = linked.get(blob) ?? URL.createObjectURL(blob);
557
644
  linked.set(blob, url);
558
- return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
645
+ return { kind: 'link', url, name: lastName(request.path), mediaType: declaredType(blob) };
559
646
  }, request);
560
647
  },
561
648
  async attach(_authorization, request) {
@@ -570,8 +657,10 @@ export function createMemoryAdapter(options = {}) {
570
657
  },
571
658
  async action(_authorization, request) {
572
659
  return resolveScript(scripts.action, () => {
573
- if (request.name.startsWith('conversation.'))
660
+ if (request.name.startsWith('conversations/'))
574
661
  return conversationAction(request);
662
+ if (request.name === 'agent-functions/decide')
663
+ return decided(request);
575
664
  return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
576
665
  }, request).then((answer) => {
577
666
  if (answer.kind === 'action' && answer.at !== undefined)
@@ -1,6 +1,7 @@
1
1
  import type { AcceptedMessage } from './adapter.js';
2
2
  import type { Connection } from './tables.js';
3
3
  export declare const MESSAGE_TABLES: readonly string[];
4
+ 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 answer.turn AS answered,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n (SELECT value FROM conversation_facts WHERE conversation = chosen.conversation AND name = 'openedTurn') AS opened_turn,\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";
4
5
  export type HeldConversation = {
5
6
  readonly conversation: string;
6
7
  readonly read: string | null | undefined;
@@ -10,6 +11,33 @@ export type MessageWindow = {
10
11
  readonly messages: AcceptedMessage[];
11
12
  readonly more: boolean;
12
13
  };
14
+ export type HeldSource = {
15
+ readonly source: unknown;
16
+ readonly sender: string | null;
17
+ };
18
+ export type HeldRow = {
19
+ readonly conversation: string;
20
+ readonly said: {
21
+ readonly text: string;
22
+ readonly role: string | null;
23
+ readonly at: string | null;
24
+ } | null;
25
+ readonly answered: string | null;
26
+ readonly openedTurn: string | 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
+ };
35
+ export type ConversationFact = 'openedTurn' | 'dismissedSuggestion';
36
+ export type HeldFact = {
37
+ readonly conversation: string;
38
+ readonly name: ConversationFact;
39
+ readonly value: string;
40
+ };
13
41
  export type ConversationWrite = {
14
42
  readonly conversation: string;
15
43
  readonly messages: readonly AcceptedMessage[];
@@ -18,11 +46,13 @@ export type ConversationWrite = {
18
46
  readonly partial: boolean;
19
47
  };
20
48
  };
21
- export declare function heldConversations(connection: Connection): HeldConversation[];
49
+ export declare function heldConversations(connection: Connection, conversations: readonly string[] | null): HeldConversation[];
22
50
  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;
51
+ export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null, phrase: string | null): MessageWindow;
52
+ export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): number;
53
+ export declare function conversationRows(connection: Connection, conversations: readonly string[]): HeldRow[];
25
54
  export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
26
- export declare function droppedMessages(connection: Connection, conversations: readonly string[]): void;
27
- export declare function forgottenMessages(connection: Connection): void;
55
+ export declare function conversationFacts(connection: Connection): HeldFact[];
56
+ export declare function keptFact(connection: Connection, { conversation, name, value }: HeldFact): null;
57
+ export declare function forgottenConversations(connection: Connection): void;
28
58
  //# sourceMappingURL=messages.d.ts.map
@@ -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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"}