@agentshouse/mdruntime 0.1.0-c8ca66ac9e99d → 0.1.0-c8e865ef64c82

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