@agentshouse/mdruntime 0.1.0-cd3ee807e46ae → 0.1.0-cd507e16e5fc0

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