@agentshouse/mdruntime 0.1.0-cb2e390ee7b89 → 0.1.0-cb8a03985803b

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