@agentshouse/mdruntime 0.1.0-c4478f1a5ac2a → 0.1.0-c44d5cc00aee5

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