@agentshouse/mdruntime 0.1.0-c2aaa9c0e3ca4 → 0.1.0-c2af3ddcc243b

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