@agentshouse/mdruntime 0.1.0-c698c0ebd65bd → 0.1.0-c6b1e70f2da66

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