@agentshouse/mdruntime 0.1.0-c8e110144a30a → 0.1.0-c8f07dbee1c62

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