@agentshouse/mdruntime 0.1.0-caee7332d2235 → 0.1.0-caf080a9a9c60

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