@agentshouse/mdruntime 0.1.0-c698c0ebd65bd → 0.1.0-c6bf34fa9e444

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