@agentshouse/mdruntime 0.1.0-cae97ad2e9142 → 0.1.0-caf080a9a9c60

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