@agentshouse/mdruntime 0.1.0-cee9c8aa4cd86 → 0.1.0-cef76ea952695

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 (376) hide show
  1. package/README.md +19 -17
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +385 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +251 -0
  8. package/dist/adapter.d.ts +111 -109
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +5 -11
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +36 -47
  13. package/dist/binary.d.ts +0 -5
  14. package/dist/binary.d.ts.map +1 -1
  15. package/dist/binary.js +1 -1
  16. package/dist/bootstrap.d.ts +22 -10
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +303 -123
  19. package/dist/cell.d.ts +6 -0
  20. package/dist/cell.d.ts.map +1 -0
  21. package/dist/cell.js +9 -0
  22. package/dist/chain.d.ts +2 -1
  23. package/dist/chain.d.ts.map +1 -1
  24. package/dist/change.d.ts +1 -0
  25. package/dist/change.d.ts.map +1 -1
  26. package/dist/change.js +4 -2
  27. package/dist/chat-types.d.ts +5 -0
  28. package/dist/chat-types.d.ts.map +1 -0
  29. package/dist/chat-types.js +13 -0
  30. package/dist/client.d.ts +30 -14
  31. package/dist/client.d.ts.map +1 -1
  32. package/dist/client.js +61 -10
  33. package/dist/collection.d.ts +7 -4
  34. package/dist/collection.d.ts.map +1 -1
  35. package/dist/collection.js +24 -19
  36. package/dist/compile.d.ts +6 -6
  37. package/dist/compile.d.ts.map +1 -1
  38. package/dist/compile.js +290 -297
  39. package/dist/connection.d.ts +6 -142
  40. package/dist/connection.d.ts.map +1 -1
  41. package/dist/connection.js +105 -4827
  42. package/dist/context.d.ts +2 -0
  43. package/dist/context.d.ts.map +1 -0
  44. package/dist/{chat/context.js → context.js} +1 -4
  45. package/dist/conversation-live.d.ts +135 -0
  46. package/dist/conversation-live.d.ts.map +1 -0
  47. package/dist/conversation-live.js +247 -0
  48. package/dist/conversation-row.d.ts +33 -0
  49. package/dist/conversation-row.d.ts.map +1 -0
  50. package/dist/conversation-row.js +53 -0
  51. package/dist/conversation.d.ts +42 -46
  52. package/dist/conversation.d.ts.map +1 -1
  53. package/dist/conversation.js +901 -815
  54. package/dist/discovery.d.ts +10 -0
  55. package/dist/discovery.d.ts.map +1 -0
  56. package/dist/discovery.js +175 -0
  57. package/dist/durability.d.ts +15 -4
  58. package/dist/durability.d.ts.map +1 -1
  59. package/dist/durability.js +5 -0
  60. package/dist/entry.d.ts +3 -2
  61. package/dist/entry.d.ts.map +1 -1
  62. package/dist/entry.js +18 -8
  63. package/dist/expectation.d.ts +4 -2
  64. package/dist/expectation.d.ts.map +1 -1
  65. package/dist/expectation.js +33 -11
  66. package/dist/failure.d.ts +1 -0
  67. package/dist/failure.d.ts.map +1 -1
  68. package/dist/failure.js +3 -0
  69. package/dist/figures.d.ts +49 -0
  70. package/dist/figures.d.ts.map +1 -0
  71. package/dist/figures.js +197 -0
  72. package/dist/file.d.ts +2 -11
  73. package/dist/file.d.ts.map +1 -1
  74. package/dist/file.js +6 -4
  75. package/dist/holdings.d.ts +29 -0
  76. package/dist/holdings.d.ts.map +1 -0
  77. package/dist/holdings.js +95 -0
  78. package/dist/host.d.ts +4 -6
  79. package/dist/host.d.ts.map +1 -1
  80. package/dist/host.js +59 -38
  81. package/dist/identity.d.ts +0 -1
  82. package/dist/identity.d.ts.map +1 -1
  83. package/dist/identity.js +0 -3
  84. package/dist/index.d.ts +30 -13
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +10 -3
  87. package/dist/install.d.ts +56 -0
  88. package/dist/install.d.ts.map +1 -0
  89. package/dist/install.js +556 -0
  90. package/dist/job.d.ts +5 -0
  91. package/dist/job.d.ts.map +1 -0
  92. package/dist/job.js +7 -0
  93. package/dist/lifecycle.d.ts +7 -0
  94. package/dist/lifecycle.d.ts.map +1 -0
  95. package/dist/lifecycle.js +270 -0
  96. package/dist/listing.d.ts +53 -0
  97. package/dist/listing.d.ts.map +1 -0
  98. package/dist/listing.js +176 -0
  99. package/dist/live.d.ts +5 -4
  100. package/dist/live.d.ts.map +1 -1
  101. package/dist/live.js +63 -21
  102. package/dist/locks.d.ts +9 -0
  103. package/dist/locks.d.ts.map +1 -0
  104. package/dist/locks.js +62 -0
  105. package/dist/log.d.ts +1 -0
  106. package/dist/log.d.ts.map +1 -1
  107. package/dist/lost.d.ts +5 -0
  108. package/dist/lost.d.ts.map +1 -0
  109. package/dist/lost.js +61 -0
  110. package/dist/media.d.ts +8 -0
  111. package/dist/media.d.ts.map +1 -0
  112. package/dist/media.js +218 -0
  113. package/dist/memory.d.ts +13 -6
  114. package/dist/memory.d.ts.map +1 -1
  115. package/dist/memory.js +219 -102
  116. package/dist/messages.d.ts +24 -3
  117. package/dist/messages.d.ts.map +1 -1
  118. package/dist/messages.js +89 -31
  119. package/dist/model.d.ts +8 -10
  120. package/dist/model.d.ts.map +1 -1
  121. package/dist/model.js +6 -18
  122. package/dist/models.d.ts +14 -0
  123. package/dist/models.d.ts.map +1 -0
  124. package/dist/models.js +197 -0
  125. package/dist/observation.d.ts +3 -2
  126. package/dist/observation.d.ts.map +1 -1
  127. package/dist/observation.js +15 -15
  128. package/dist/opened.js +3 -3
  129. package/dist/opening.d.ts +4 -0
  130. package/dist/opening.d.ts.map +1 -0
  131. package/dist/opening.js +60 -0
  132. package/dist/outcome.d.ts +17 -7
  133. package/dist/outcome.d.ts.map +1 -1
  134. package/dist/outcome.js +19 -5
  135. package/dist/overlay.d.ts +1 -0
  136. package/dist/overlay.d.ts.map +1 -1
  137. package/dist/overlay.js +12 -1
  138. package/dist/parts.d.ts +11 -0
  139. package/dist/parts.d.ts.map +1 -0
  140. package/dist/parts.js +21 -0
  141. package/dist/paths.d.ts +2 -0
  142. package/dist/paths.d.ts.map +1 -1
  143. package/dist/paths.js +26 -0
  144. package/dist/preparation.d.ts +20 -0
  145. package/dist/preparation.d.ts.map +1 -0
  146. package/dist/preparation.js +233 -0
  147. package/dist/queries.d.ts +16 -0
  148. package/dist/queries.d.ts.map +1 -0
  149. package/dist/queries.js +272 -0
  150. package/dist/query.d.ts +19 -206
  151. package/dist/query.d.ts.map +1 -1
  152. package/dist/query.js +3 -494
  153. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  154. package/dist/questions.d.ts.map +1 -0
  155. package/dist/{chat/questions.js → questions.js} +13 -2
  156. package/dist/reach.d.ts +20 -13
  157. package/dist/reach.d.ts.map +1 -1
  158. package/dist/reach.js +204 -135
  159. package/dist/react.d.ts +14 -2
  160. package/dist/react.d.ts.map +1 -1
  161. package/dist/react.js +10 -1
  162. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  163. package/dist/read.d.ts.map +1 -0
  164. package/dist/{chat/read.js → read.js} +4 -0
  165. package/dist/readiness.d.ts +12 -16
  166. package/dist/readiness.d.ts.map +1 -1
  167. package/dist/readiness.js +2 -8
  168. package/dist/reads.d.ts +36 -10
  169. package/dist/reads.d.ts.map +1 -1
  170. package/dist/reads.js +159 -83
  171. package/dist/recovery.d.ts +1 -0
  172. package/dist/recovery.d.ts.map +1 -1
  173. package/dist/recovery.js +35 -1
  174. package/dist/refresh.d.ts +10 -4
  175. package/dist/refresh.d.ts.map +1 -1
  176. package/dist/refresh.js +92 -30
  177. package/dist/refusal.d.ts +5 -0
  178. package/dist/refusal.d.ts.map +1 -0
  179. package/dist/refusal.js +57 -0
  180. package/dist/replica.d.ts +11 -10
  181. package/dist/replica.d.ts.map +1 -1
  182. package/dist/replica.js +56 -23
  183. package/dist/room-draft.d.ts +22 -7
  184. package/dist/room-draft.d.ts.map +1 -1
  185. package/dist/room-draft.js +134 -54
  186. package/dist/room-drafts.d.ts +24 -0
  187. package/dist/room-drafts.d.ts.map +1 -0
  188. package/dist/room-drafts.js +217 -0
  189. package/dist/rows.d.ts +18 -16
  190. package/dist/rows.d.ts.map +1 -1
  191. package/dist/rows.js +45 -153
  192. package/dist/runtime.d.ts +43 -0
  193. package/dist/runtime.d.ts.map +1 -0
  194. package/dist/runtime.js +1 -0
  195. package/dist/save.d.ts +7 -1
  196. package/dist/save.d.ts.map +1 -1
  197. package/dist/save.js +46 -27
  198. package/dist/saves.d.ts +70 -0
  199. package/dist/saves.d.ts.map +1 -0
  200. package/dist/saves.js +1005 -0
  201. package/dist/search.d.ts +12 -63
  202. package/dist/search.d.ts.map +1 -1
  203. package/dist/search.js +9 -52
  204. package/dist/seed.d.ts +11 -2
  205. package/dist/seed.d.ts.map +1 -1
  206. package/dist/seed.js +71 -1
  207. package/dist/shared.d.ts +1 -7
  208. package/dist/shared.d.ts.map +1 -1
  209. package/dist/shared.js +13 -105
  210. package/dist/shown.d.ts +31 -0
  211. package/dist/shown.d.ts.map +1 -0
  212. package/dist/shown.js +290 -0
  213. package/dist/socket/admission.d.ts +7 -0
  214. package/dist/socket/admission.d.ts.map +1 -0
  215. package/dist/socket/admission.js +39 -0
  216. package/dist/socket/answers.d.ts +6 -0
  217. package/dist/socket/answers.d.ts.map +1 -0
  218. package/dist/socket/answers.js +20 -0
  219. package/dist/socket/lanes.d.ts +20 -0
  220. package/dist/socket/lanes.d.ts.map +1 -0
  221. package/dist/socket/lanes.js +77 -0
  222. package/dist/socket/reads.d.ts +10 -0
  223. package/dist/socket/reads.d.ts.map +1 -0
  224. package/dist/socket/reads.js +31 -0
  225. package/dist/socket/rooms.d.ts +44 -0
  226. package/dist/socket/rooms.d.ts.map +1 -0
  227. package/dist/socket/rooms.js +90 -0
  228. package/dist/socket/session.d.ts +38 -0
  229. package/dist/socket/session.d.ts.map +1 -0
  230. package/dist/socket/session.js +23 -0
  231. package/dist/socket.d.ts +70 -0
  232. package/dist/socket.d.ts.map +1 -0
  233. package/dist/socket.js +175 -0
  234. package/dist/source.d.ts +61 -0
  235. package/dist/source.d.ts.map +1 -0
  236. package/dist/source.js +82 -0
  237. package/dist/status.d.ts +4 -5
  238. package/dist/status.d.ts.map +1 -1
  239. package/dist/status.js +3 -7
  240. package/dist/store/fences.d.ts +16 -0
  241. package/dist/store/fences.d.ts.map +1 -0
  242. package/dist/store/fences.js +26 -0
  243. package/dist/store/installs.d.ts +30 -0
  244. package/dist/store/installs.d.ts.map +1 -0
  245. package/dist/store/installs.js +34 -0
  246. package/dist/store/readiness.d.ts +10 -0
  247. package/dist/store/readiness.d.ts.map +1 -0
  248. package/dist/store/readiness.js +52 -0
  249. package/dist/store/records.d.ts +210 -0
  250. package/dist/store/records.d.ts.map +1 -0
  251. package/dist/store/records.js +428 -0
  252. package/dist/store/room-held.d.ts +8 -0
  253. package/dist/store/room-held.d.ts.map +1 -0
  254. package/dist/store/room-held.js +17 -0
  255. package/dist/store/space.d.ts +11 -0
  256. package/dist/store/space.d.ts.map +1 -0
  257. package/dist/store/space.js +41 -0
  258. package/dist/store/watchers.d.ts +17 -0
  259. package/dist/store/watchers.d.ts.map +1 -0
  260. package/dist/store/watchers.js +56 -0
  261. package/dist/store/writes.d.ts +24 -0
  262. package/dist/store/writes.d.ts.map +1 -0
  263. package/dist/store/writes.js +125 -0
  264. package/dist/store.d.ts +105 -149
  265. package/dist/store.d.ts.map +1 -1
  266. package/dist/store.js +143 -390
  267. package/dist/stored.d.ts +67 -49
  268. package/dist/stored.d.ts.map +1 -1
  269. package/dist/stored.js +358 -253
  270. package/dist/surface.d.ts +88 -0
  271. package/dist/surface.d.ts.map +1 -0
  272. package/dist/surface.js +224 -0
  273. package/dist/sync.d.ts +19 -0
  274. package/dist/sync.d.ts.map +1 -0
  275. package/dist/sync.js +532 -0
  276. package/dist/tables.d.ts +140 -60
  277. package/dist/tables.d.ts.map +1 -1
  278. package/dist/tables.js +268 -101
  279. package/dist/tallies.d.ts +18 -0
  280. package/dist/tallies.d.ts.map +1 -0
  281. package/dist/tallies.js +129 -0
  282. package/dist/transfer.d.ts +0 -5
  283. package/dist/transfer.d.ts.map +1 -1
  284. package/dist/validation.d.ts +3 -4
  285. package/dist/validation.d.ts.map +1 -1
  286. package/dist/validation.js +42 -100
  287. package/dist/windows.d.ts +1 -12
  288. package/dist/windows.d.ts.map +1 -1
  289. package/dist/windows.js +2 -75
  290. package/dist/wire.d.ts +22 -10
  291. package/dist/wire.d.ts.map +1 -1
  292. package/dist/wire.js +9 -3
  293. package/package.json +12 -18
  294. package/AGENTS.md +0 -320
  295. package/dist/chat/acts.d.ts +0 -33
  296. package/dist/chat/acts.d.ts.map +0 -1
  297. package/dist/chat/acts.js +0 -36
  298. package/dist/chat/context.d.ts +0 -3
  299. package/dist/chat/context.d.ts.map +0 -1
  300. package/dist/chat/earlier.d.ts +0 -10
  301. package/dist/chat/earlier.d.ts.map +0 -1
  302. package/dist/chat/earlier.js +0 -54
  303. package/dist/chat/house.d.ts +0 -25
  304. package/dist/chat/house.d.ts.map +0 -1
  305. package/dist/chat/house.js +0 -38
  306. package/dist/chat/input.d.ts +0 -11
  307. package/dist/chat/input.d.ts.map +0 -1
  308. package/dist/chat/input.js +0 -92
  309. package/dist/chat/kit.d.ts +0 -61
  310. package/dist/chat/kit.d.ts.map +0 -1
  311. package/dist/chat/kit.js +0 -123
  312. package/dist/chat/lasting.d.ts +0 -6
  313. package/dist/chat/lasting.d.ts.map +0 -1
  314. package/dist/chat/lasting.js +0 -19
  315. package/dist/chat/list.d.ts +0 -28
  316. package/dist/chat/list.d.ts.map +0 -1
  317. package/dist/chat/list.js +0 -103
  318. package/dist/chat/markdown.d.ts +0 -21
  319. package/dist/chat/markdown.d.ts.map +0 -1
  320. package/dist/chat/markdown.js +0 -246
  321. package/dist/chat/message.d.ts +0 -7
  322. package/dist/chat/message.d.ts.map +0 -1
  323. package/dist/chat/message.js +0 -254
  324. package/dist/chat/messages.d.ts +0 -35
  325. package/dist/chat/messages.d.ts.map +0 -1
  326. package/dist/chat/messages.js +0 -210
  327. package/dist/chat/name.d.ts +0 -7
  328. package/dist/chat/name.d.ts.map +0 -1
  329. package/dist/chat/name.js +0 -37
  330. package/dist/chat/opened.d.ts +0 -12
  331. package/dist/chat/opened.d.ts.map +0 -1
  332. package/dist/chat/opened.js +0 -19
  333. package/dist/chat/overlay.d.ts +0 -32
  334. package/dist/chat/overlay.d.ts.map +0 -1
  335. package/dist/chat/overlay.js +0 -103
  336. package/dist/chat/parts.d.ts +0 -58
  337. package/dist/chat/parts.d.ts.map +0 -1
  338. package/dist/chat/parts.js +0 -120
  339. package/dist/chat/pieces.d.ts +0 -62
  340. package/dist/chat/pieces.d.ts.map +0 -1
  341. package/dist/chat/pieces.js +0 -1110
  342. package/dist/chat/process.d.ts +0 -20
  343. package/dist/chat/process.d.ts.map +0 -1
  344. package/dist/chat/process.js +0 -32
  345. package/dist/chat/provider.d.ts +0 -70
  346. package/dist/chat/provider.d.ts.map +0 -1
  347. package/dist/chat/provider.js +0 -635
  348. package/dist/chat/question.d.ts +0 -9
  349. package/dist/chat/question.d.ts.map +0 -1
  350. package/dist/chat/question.js +0 -69
  351. package/dist/chat/questions.d.ts.map +0 -1
  352. package/dist/chat/read.d.ts.map +0 -1
  353. package/dist/chat/ready.d.ts +0 -37
  354. package/dist/chat/ready.d.ts.map +0 -1
  355. package/dist/chat/ready.js +0 -93
  356. package/dist/chat/room-file.d.ts +0 -8
  357. package/dist/chat/room-file.d.ts.map +0 -1
  358. package/dist/chat/room-file.js +0 -72
  359. package/dist/chat/steady.d.ts +0 -3
  360. package/dist/chat/steady.d.ts.map +0 -1
  361. package/dist/chat/steady.js +0 -26
  362. package/dist/chat/style.d.ts +0 -4
  363. package/dist/chat/style.d.ts.map +0 -1
  364. package/dist/chat/style.js +0 -307
  365. package/dist/chat.d.ts +0 -15
  366. package/dist/chat.d.ts.map +0 -1
  367. package/dist/chat.js +0 -8
  368. package/dist/fence.d.ts +0 -6
  369. package/dist/fence.d.ts.map +0 -1
  370. package/dist/fence.js +0 -10
  371. package/dist/fulltext.d.ts +0 -27
  372. package/dist/fulltext.d.ts.map +0 -1
  373. package/dist/fulltext.js +0 -368
  374. package/dist/words.d.ts +0 -19
  375. package/dist/words.d.ts.map +0 -1
  376. package/dist/words.js +0 -150
package/dist/tables.js CHANGED
@@ -1,15 +1,65 @@
1
+ import { sql } from '@agentshouse/mdmodel';
1
2
  import { answerQuery } from './compile.js';
2
- import { searched, SEARCH_TABLES } from './fulltext.js';
3
- import { droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
4
- import { abandon, release, commit, counts, ended, entries, erase, fenceRooms, files, opened, rederive, referrers, refreshing, REPLICA_TABLES, stage, typed, typedWithin, unrefresh, walk, } from './stored.js';
3
+ import { conversationRows, droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
4
+ import { keptRead, READ_TABLES, readsOfOtherBuildsForgotten, storedRead, } from './reads.js';
5
+ import { conversationTallies, roomTallies, } from './tallies.js';
6
+ import { abandon, release, commit, covering, demoted, ended, entries, erase, facts, fenceRooms, folders, heldLocators, heldRoom, heldRooms, offlineMode, opened, overlaid, presentation, rederive, referrers, refreshing, REPLICA_TABLES, resume, stage, typed, stagedLocators, typedWithin, unrefresh, } from './stored.js';
7
+ const STATEMENTS_HELD = 256;
5
8
  export function sqliteConnection(engine, database) {
6
9
  const decoder = new TextDecoder();
10
+ const held = new Map();
11
+ database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
12
+ arity: 2,
13
+ deterministic: true,
14
+ });
15
+ function prepared(sql) {
16
+ if (sql.includes(';'))
17
+ return null;
18
+ const found = held.get(sql);
19
+ held.delete(sql);
20
+ const statement = found ?? database.prepare(sql);
21
+ held.set(sql, statement);
22
+ if (held.size > STATEMENTS_HELD) {
23
+ const [oldest, evicted] = held.entries().next().value;
24
+ held.delete(oldest);
25
+ evicted.finalize();
26
+ }
27
+ return statement;
28
+ }
29
+ function stepped(statement, bind, each) {
30
+ try {
31
+ if (bind.length > 0 && statement.parameterCount > 0)
32
+ statement.bind(bind);
33
+ while (statement.step())
34
+ each();
35
+ }
36
+ finally {
37
+ statement.resetNoThrow(true);
38
+ }
39
+ }
7
40
  return {
8
41
  run(sql, bind = []) {
9
- database.exec({ sql, bind });
42
+ const statement = prepared(sql);
43
+ if (statement === null)
44
+ database.exec({ sql, bind });
45
+ else
46
+ stepped(statement, bind, () => { });
10
47
  },
11
48
  rows(sql, bind = []) {
12
- return database.exec({ sql, bind, rowMode: 'object', returnValue: 'resultRows' });
49
+ const statement = prepared(sql);
50
+ if (statement === null) {
51
+ return database.exec({ sql, bind, rowMode: 'object', returnValue: 'resultRows' });
52
+ }
53
+ const names = statement.getColumnNames([]);
54
+ const rows = [];
55
+ stepped(statement, bind, () => {
56
+ const values = statement.get([]);
57
+ const row = Object.create(null);
58
+ for (const [index, name] of names.entries())
59
+ row[name] = values[index] ?? null;
60
+ rows.push(row);
61
+ });
62
+ return rows;
13
63
  },
14
64
  collate(name, compare) {
15
65
  const answered = engine.capi.sqlite3_create_collation_v2(database.pointer, name, engine.capi.SQLITE_UTF8, 0, (_argument, leftLength, left, rightLength, right) => {
@@ -22,12 +72,13 @@ export function sqliteConnection(engine, database) {
22
72
  };
23
73
  }
24
74
  export const FILE_PART_BYTES = 1_048_576;
75
+ const PROBE_BYTES = 4 * FILE_PART_BYTES;
25
76
  const TABLES = [
26
77
  ['authored_facts', 'name TEXT PRIMARY KEY, value TEXT NOT NULL'],
27
78
  ['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
28
79
  [
29
80
  'authored_pending',
30
- 'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, PRIMARY KEY (locator, id)',
81
+ 'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, paths TEXT NOT NULL, moving INTEGER NOT NULL, PRIMARY KEY (locator, id)',
31
82
  ],
32
83
  [
33
84
  'authored_room_drafts',
@@ -44,37 +95,52 @@ export const RUNTIME_TABLES = [
44
95
  'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
45
96
  ...REPLICA_TABLES,
46
97
  ...MESSAGE_TABLES,
47
- ...SEARCH_TABLES,
98
+ ...READ_TABLES,
48
99
  ];
49
100
  const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
50
101
  const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
51
102
  const UNOWNED_PARTS = `DELETE FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS} UNION SELECT key FROM opened_files)`;
103
+ const CLEANABLE_BYTES = `SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS})`;
52
104
  const READS = new Set([
53
- 'authored.queues',
105
+ 'authored.status',
106
+ 'authored.moving',
107
+ 'authored.pending',
108
+ 'authored.batch',
109
+ 'authored.order',
110
+ 'authored.queued',
54
111
  'authored.roomDrafts',
112
+ 'authored.chatDraft.read',
55
113
  'authored.chatDrafts',
56
114
  'authored.calls',
57
115
  'authored.fences',
116
+ 'authored.unsent',
58
117
  'authored.fact',
59
118
  'authored.file',
60
119
  'replica.open',
120
+ 'replica.rooms',
121
+ 'replica.room',
122
+ 'replica.covering',
123
+ 'replica.offline',
124
+ 'replica.held',
125
+ 'replica.facts',
126
+ 'replica.presentation',
61
127
  'replica.query',
128
+ 'replica.tallies',
62
129
  'replica.entries',
63
130
  'replica.typed',
64
131
  'replica.referrers',
65
- 'replica.walk',
66
- 'replica.files',
132
+ 'replica.folders',
67
133
  'replica.typedWithin',
68
- 'replica.counts',
69
- 'replica.search',
70
- 'replica.received',
71
- 'replica.receivedParts',
72
134
  'opened.find',
135
+ 'opened.held',
73
136
  'file.part',
74
137
  'conversation.held',
75
138
  'conversation.window',
76
139
  'conversation.count',
77
140
  'conversation.turn',
141
+ 'conversation.rows',
142
+ 'conversation.tallies',
143
+ 'read.stored',
78
144
  ]);
79
145
  const KINDS = new Set([
80
146
  ...READS,
@@ -86,18 +152,19 @@ const KINDS = new Set([
86
152
  'authored.claim',
87
153
  'authored.end',
88
154
  'replica.stage',
155
+ 'replica.resume',
89
156
  'replica.refresh',
90
157
  'replica.unrefresh',
91
158
  'replica.commit',
92
159
  'replica.fence',
93
160
  'replica.erase',
94
161
  'replica.abandon',
162
+ 'replica.unfence',
95
163
  'replica.release',
96
164
  'replica.rederive',
165
+ 'replica.demote',
97
166
  'replica.fact',
98
167
  'replica.present',
99
- 'replica.receive',
100
- 'replica.unreceive',
101
168
  'opened.begin',
102
169
  'opened.part',
103
170
  'opened.keep',
@@ -105,6 +172,9 @@ const KINDS = new Set([
105
172
  'opened.clean',
106
173
  'conversation.keep',
107
174
  'conversation.drop',
175
+ 'space.probe',
176
+ 'read.keep',
177
+ 'read.builds',
108
178
  ]);
109
179
  export function isRuntime(request) {
110
180
  return KINDS.has(request.kind);
@@ -177,29 +247,71 @@ function unowned(connection) {
177
247
  connection.run(UNOWNED_PARTS);
178
248
  }
179
249
  function queued(connection) {
250
+ return connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
251
+ locator: text(row.locator),
252
+ ids: JSON.parse(text(row.ids)),
253
+ }));
254
+ }
255
+ function heldWork(connection, locator) {
256
+ const room = heldRoom(connection, locator);
257
+ const pending = new Map(connection
258
+ .rows('SELECT id, batch, state FROM authored_pending WHERE locator = ?', [locator])
259
+ .map((row) => [
260
+ text(row.id),
261
+ { id: text(row.id), batch: text(row.batch), state: text(row.state) },
262
+ ]));
263
+ return {
264
+ room: room === null ? null : { ...room, overlaid: overlaid(connection, room.key) },
265
+ queue: heldOrder(connection, locator).map((id) => {
266
+ const held = pending.get(id);
267
+ if (held === undefined)
268
+ throw new Error(`Missing Pending Change ${locator}/${id}`);
269
+ return held;
270
+ }),
271
+ };
272
+ }
273
+ function status(connection) {
274
+ const [completed] = connection.rows("SELECT value FROM replica_facts WHERE name = 'lastCompleted'");
275
+ return {
276
+ queued: texts(connection.rows('SELECT locator FROM authored_queues'), 'locator'),
277
+ lastCompleted: completed === undefined ? null : text(completed.value),
278
+ changes: connection
279
+ .rows('SELECT p.locator, c.value AS path FROM authored_pending p, json_each(p.paths) c')
280
+ .map((row) => ({ locator: text(row.locator), path: text(row.path) })),
281
+ resets: connection
282
+ .rows(`SELECT locator, json_extract(state, '$.submission.reset') AS reset FROM authored_pending
283
+ WHERE json_extract(state, '$.submission.state') = 'reset'`)
284
+ .map((row) => ({ locator: text(row.locator), reset: text(row.reset) })),
285
+ returned: texts(connection.rows(`SELECT record FROM authored_room_drafts WHERE json_type(record, '$.returned') = 'object'`), 'record'),
286
+ };
287
+ }
288
+ function pendingOf(connection, locator, id) {
289
+ const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
180
290
  return {
181
- queues: connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
182
- locator: text(row.locator),
183
- ids: JSON.parse(text(row.ids)),
184
- })),
185
- pending: connection
186
- .rows('SELECT locator, id, batch, state FROM authored_pending')
187
- .map((row) => ({
188
- locator: text(row.locator),
189
- id: text(row.id),
190
- batch: text(row.batch),
191
- state: text(row.state),
192
- })),
291
+ state: held === undefined ? null : text(held.state),
292
+ room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
193
293
  };
194
294
  }
295
+ function roomDraftRecords(connection, locator, paths) {
296
+ if (locator === null) {
297
+ return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
298
+ }
299
+ if (paths === null) {
300
+ return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ?', [locator]), 'record');
301
+ }
302
+ return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ? AND path IN (SELECT value FROM json_each(?))', [locator, JSON.stringify(paths)]), 'record');
303
+ }
304
+ function chatDraftRecord(connection, conversation) {
305
+ const [held] = connection.rows('SELECT record FROM authored_chat_drafts WHERE conversation = ?', [
306
+ conversation,
307
+ ]);
308
+ return held === undefined ? null : text(held.record);
309
+ }
195
310
  function heldOrder(connection, locator) {
196
311
  const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
197
312
  return held === undefined ? [] : JSON.parse(text(held.ids));
198
313
  }
199
- function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts, amendments }) {
200
- for (const { id, amendment } of amendments ?? []) {
201
- amended(connection, { kind: 'authored.amend', locator, id, amendment });
202
- }
314
+ function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts }) {
203
315
  for (const path of consumedRoomDrafts ?? []) {
204
316
  connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
205
317
  locator,
@@ -226,19 +338,26 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
226
338
  connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
227
339
  }
228
340
  }
229
- for (const { id, batch, state, files } of added ?? []) {
230
- if (before.has(id) || !after.has(id))
341
+ for (const { id, batch, state, files, paths, moving } of added ?? []) {
342
+ if (before.has(id))
231
343
  continue;
232
- connection.run('INSERT OR REPLACE INTO authored_pending (locator, id, batch, state, files) VALUES (?, ?, ?, ?, ?)', [locator, id, batch, state, owned(files)]);
344
+ connection.run('INSERT OR REPLACE INTO authored_pending (locator, id, batch, state, files, paths, moving) VALUES (?, ?, ?, ?, ?, ?, ?)', [locator, id, batch, state, owned(files), JSON.stringify(paths), moving ? 1 : 0]);
233
345
  }
234
- for (const { id, batch, files } of founded ?? []) {
346
+ for (const { id, batch, files, paths, moving } of founded ?? []) {
235
347
  const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
236
348
  if (held === undefined || !before.has(id))
237
349
  continue;
238
- connection.run('UPDATE authored_pending SET batch = ?, files = ? WHERE locator = ? AND id = ?', [batch, owned([...JSON.parse(text(held.files)), ...files]), locator, id]);
350
+ connection.run('UPDATE authored_pending SET batch = ?, files = ?, paths = ?, moving = ? WHERE locator = ? AND id = ?', [
351
+ batch,
352
+ owned([...JSON.parse(text(held.files)), ...files]),
353
+ JSON.stringify(paths),
354
+ moving ? 1 : 0,
355
+ locator,
356
+ id,
357
+ ]);
239
358
  }
240
359
  }
241
- async function kept(connection, { writes, files, whole, discards }) {
360
+ async function kept(connection, { writes, files, whole }) {
242
361
  const refused = writes.find(({ locator }) => fenced(connection, locator));
243
362
  if (refused !== undefined && whole)
244
363
  return refused.locator;
@@ -247,8 +366,6 @@ async function kept(connection, { writes, files, whole, discards }) {
247
366
  if (!fenced(connection, write.locator))
248
367
  keptRows(connection, write);
249
368
  }
250
- for (const locator of discards ?? [])
251
- roomWork(connection, locator);
252
369
  unowned(connection);
253
370
  return refused?.locator ?? null;
254
371
  }
@@ -318,11 +435,15 @@ function fence(connection, locators) {
318
435
  return fenceRooms(connection, locators);
319
436
  }
320
437
  function erased(connection, { locator, limit }) {
321
- const done = erase(connection, locator, limit);
322
- if (locator !== null && !done.remaining) {
438
+ return erase(connection, locator, limit);
439
+ }
440
+ function unfenced(connection, locators) {
441
+ const erased = locators.filter((locator) => connection.rows('SELECT 1 FROM replica_erasing WHERE locator = ? LIMIT 1', [locator])
442
+ .length === 0);
443
+ for (const locator of erased) {
323
444
  connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
324
445
  }
325
- return done;
446
+ return erased;
326
447
  }
327
448
  function claim(connection, holder) {
328
449
  const held = fact(connection, 'holder');
@@ -385,9 +506,9 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
385
506
  if (fetched === null)
386
507
  return false;
387
508
  const [held] = connection.rows('SELECT count(*) AS parts, min(part) AS first, max(part) AS last, coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key = ?', [key]);
388
- const whole = count(held?.parts) === parts &&
389
- count(held?.bytes) === byteLength &&
390
- (parts === 0 || (count(held?.first) === 0 && count(held?.last) === parts - 1));
509
+ const whole = count(held.parts) === parts &&
510
+ count(held.bytes) === byteLength &&
511
+ (parts === 0 || (count(held.first) === 0 && count(held.last) === parts - 1));
391
512
  if (!whole) {
392
513
  dropped(connection, key);
393
514
  return false;
@@ -401,56 +522,82 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
401
522
  unowned(connection);
402
523
  return true;
403
524
  }
525
+ const UNSENT = [
526
+ ['pending-change', 'authored_pending'],
527
+ ['call', 'authored_calls'],
528
+ ['room-draft', 'authored_room_drafts'],
529
+ ['chat-draft', 'authored_chat_drafts'],
530
+ ];
531
+ function unsent(connection) {
532
+ const [held] = connection.rows(`SELECT ${UNSENT.map(([kind, table]) => `(SELECT count(*) FROM ${table}) AS "${kind}"`).join(', ')}`);
533
+ return UNSENT.map(([kind]) => ({ kind, count: count(held[kind]) })).filter((work) => work.count > 0);
534
+ }
535
+ function cleanable(connection) {
536
+ const [held] = connection.rows(CLEANABLE_BYTES);
537
+ return count(held.bytes);
538
+ }
404
539
  function cleaned(connection) {
405
540
  connection.run('DELETE FROM opened_files');
406
- const [freed] = connection.rows(`SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS})`);
541
+ const freed = cleanable(connection);
407
542
  unowned(connection);
408
- return count(freed?.bytes);
543
+ return freed;
544
+ }
545
+ function openedHeld(connection) {
546
+ return {
547
+ rooms: connection
548
+ .rows('SELECT locator, count(*) AS files, sum(byte_length) AS bytes FROM opened_files WHERE byte_length IS NOT NULL GROUP BY locator ORDER BY locator')
549
+ .map((row) => ({ room: text(row.locator), count: count(row.files), size: count(row.bytes) })),
550
+ cleanable: cleanable(connection),
551
+ };
409
552
  }
410
553
  async function committed(connection, { authored, rooms }) {
411
554
  const refused = authored === undefined ? null : await kept(connection, authored);
412
555
  if (refused !== null && authored?.whole === true) {
413
- return { fenced: refused, counts: {}, changed: {}, prepared: {} };
556
+ return { fenced: refused, changed: {}, indexed: {} };
414
557
  }
415
558
  return {
416
559
  fenced: refused,
417
560
  ...commit(connection, rooms.filter(({ locator }) => !fenced(connection, locator))),
418
561
  };
419
562
  }
420
- function receivedParts(connection, key, count) {
421
- return connection
422
- .rows('SELECT value FROM replica_received_parts WHERE key = ? AND part < ? ORDER BY part', [
423
- key,
424
- count,
425
- ])
426
- .map((row) => JSON.parse(text(row.value)));
427
- }
428
- function receive(connection, { key, head, part }) {
429
- connection.run('INSERT OR REPLACE INTO replica_received (key, head) VALUES (?, ?)', [key, head]);
430
- if (part !== undefined) {
431
- connection.run('INSERT OR REPLACE INTO replica_received_parts (key, part, value) VALUES (?, ?, ?)', [key, part.index, part.value]);
432
- }
433
- return null;
434
- }
435
- function unreceive(connection, keys) {
436
- for (const key of keys) {
437
- connection.run('DELETE FROM replica_received WHERE key = ?', [key]);
438
- connection.run('DELETE FROM replica_received_parts WHERE key = ?', [key]);
439
- }
440
- return null;
441
- }
442
563
  export function answerRuntime(connection, request, spool) {
443
564
  switch (request.kind) {
444
- case 'authored.queues':
445
- return queued(connection);
565
+ case 'authored.status':
566
+ return status(connection);
567
+ case 'authored.moving':
568
+ return {
569
+ queues: queued(connection),
570
+ pending: connection
571
+ .rows('SELECT locator, id, batch, state FROM authored_pending WHERE moving = 1 ORDER BY locator')
572
+ .map((row) => ({
573
+ locator: text(row.locator),
574
+ id: text(row.id),
575
+ batch: text(row.batch),
576
+ state: text(row.state),
577
+ })),
578
+ };
579
+ case 'authored.pending':
580
+ return pendingOf(connection, request.locator, request.id);
581
+ case 'authored.batch': {
582
+ const [held] = connection.rows('SELECT batch FROM authored_pending WHERE locator = ? AND id = ?', [request.locator, request.id]);
583
+ return held === undefined ? null : text(held.batch);
584
+ }
585
+ case 'authored.order':
586
+ return heldOrder(connection, request.locator);
587
+ case 'authored.queued':
588
+ return texts(connection.rows('SELECT locator FROM authored_queues'), 'locator');
446
589
  case 'authored.roomDrafts':
447
- return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
590
+ return roomDraftRecords(connection, request.locator, request.paths);
591
+ case 'authored.chatDraft.read':
592
+ return chatDraftRecord(connection, request.conversation);
448
593
  case 'authored.chatDrafts':
449
594
  return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
450
595
  case 'authored.calls':
451
596
  return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
452
597
  case 'authored.fences':
453
598
  return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
599
+ case 'authored.unsent':
600
+ return unsent(connection);
454
601
  case 'authored.fact':
455
602
  return fact(connection, request.name);
456
603
  case 'authored.file':
@@ -471,35 +618,43 @@ export function answerRuntime(connection, request, spool) {
471
618
  return end(connection, request.holder);
472
619
  case 'replica.open':
473
620
  return opened(connection);
621
+ case 'replica.rooms':
622
+ return heldRooms(connection, request.locators);
623
+ case 'replica.room':
624
+ return heldWork(connection, request.locator);
625
+ case 'replica.covering':
626
+ return {
627
+ rooms: covering(connection),
628
+ queues: queued(connection),
629
+ };
630
+ case 'replica.offline':
631
+ return offlineMode(connection, request.locator);
632
+ case 'replica.held':
633
+ return { held: heldLocators(connection), staged: stagedLocators(connection) };
634
+ case 'replica.demote':
635
+ return demoted(connection);
636
+ case 'replica.facts':
637
+ return facts(connection);
638
+ case 'replica.presentation':
639
+ return presentation(connection, request.app);
474
640
  case 'replica.query':
475
641
  return answerQuery(connection, request.plan, request.rooms, request.budget);
642
+ case 'replica.tallies':
643
+ return roomTallies(connection, request.totals, request.rooms, request.since);
476
644
  case 'replica.entries':
477
645
  return entries(connection, request.key, request.view, request.paths);
478
646
  case 'replica.typed':
479
647
  return typed(connection, request.key, request.view, request.paths);
480
648
  case 'replica.referrers':
481
- return referrers(connection, request.key, request.view, request.targets, request.kinds);
482
- case 'replica.walk':
483
- return walk(connection, request.key, request.view, request.after, request.bytes);
484
- case 'replica.files':
485
- return files(connection, request.key, request.view, request.after, request.limit);
649
+ return referrers(connection, request.key, request.view, request.targets);
650
+ case 'replica.folders':
651
+ return folders(connection, request.key, request.paths);
486
652
  case 'replica.typedWithin':
487
653
  return typedWithin(connection, request.key, request.view, request.roots, request.within);
488
- case 'replica.counts':
489
- return counts(connection, request.rooms);
490
- case 'replica.search': {
491
- const { kind: _kind, ...ask } = request;
492
- return searched(connection, ask);
493
- }
494
- case 'replica.received':
495
- return connection.rows('SELECT key, head FROM replica_received').map((row) => ({
496
- key: text(row.key),
497
- head: JSON.parse(text(row.head)),
498
- }));
499
- case 'replica.receivedParts':
500
- return receivedParts(connection, request.key, request.count);
501
654
  case 'replica.stage':
502
655
  return fenced(connection, request.locator) ? null : stage(connection, request);
656
+ case 'replica.resume':
657
+ return fenced(connection, request.locator) ? null : resume(connection, request);
503
658
  case 'replica.refresh':
504
659
  return refreshing(connection, request);
505
660
  case 'replica.unrefresh':
@@ -511,11 +666,13 @@ export function answerRuntime(connection, request, spool) {
511
666
  case 'replica.erase':
512
667
  return erased(connection, request);
513
668
  case 'replica.abandon':
514
- return abandon(connection, request.locator, request.kept);
669
+ return abandon(connection, request.locator);
670
+ case 'replica.unfence':
671
+ return unfenced(connection, request.locators);
515
672
  case 'replica.release':
516
673
  return release(connection, request.key);
517
674
  case 'replica.rederive':
518
- return rederive(connection, request.key, request.limit);
675
+ return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
519
676
  case 'replica.fact':
520
677
  connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
521
678
  request.name,
@@ -528,10 +685,6 @@ export function answerRuntime(connection, request, spool) {
528
685
  request.value,
529
686
  ]);
530
687
  return null;
531
- case 'replica.receive':
532
- return receive(connection, request);
533
- case 'replica.unreceive':
534
- return unreceive(connection, request.keys);
535
688
  case 'opened.find':
536
689
  return openedFile(connection, request);
537
690
  case 'opened.begin':
@@ -544,20 +697,26 @@ export function answerRuntime(connection, request, spool) {
544
697
  return dropped(connection, request.key);
545
698
  case 'opened.clean':
546
699
  return cleaned(connection);
700
+ case 'opened.held':
701
+ return openedHeld(connection);
547
702
  case 'file.part':
548
703
  return filePart(connection, request.key, request.part);
549
704
  case 'conversation.held':
550
- return heldConversations(connection);
705
+ return heldConversations(connection, request.conversations);
551
706
  case 'conversation.keep': {
552
707
  const { kind: _kind, ...write } = request;
553
708
  return keptMessages(connection, write);
554
709
  }
555
710
  case 'conversation.window':
556
- return messageWindow(connection, request.conversation, request.limit, request.before);
711
+ return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
557
712
  case 'conversation.count':
558
- return messageCount(connection, request.conversation);
713
+ return messageCount(connection, request.conversation, request.phrase);
559
714
  case 'conversation.turn':
560
715
  return turnArrived(connection, request.conversation, request.turn);
716
+ case 'conversation.rows':
717
+ return conversationRows(connection, request.conversations);
718
+ case 'conversation.tallies':
719
+ return conversationTallies(connection, request.conversations, request.since);
561
720
  case 'conversation.drop':
562
721
  chatDraft(connection, {
563
722
  kind: 'authored.chatDraft',
@@ -566,5 +725,13 @@ export function answerRuntime(connection, request, spool) {
566
725
  });
567
726
  droppedMessages(connection, request.conversations);
568
727
  return null;
728
+ case 'space.probe':
729
+ return spool.probe(PROBE_BYTES).then(() => null);
730
+ case 'read.stored':
731
+ return storedRead(connection, request);
732
+ case 'read.keep':
733
+ return keptRead(connection, request, request.answer);
734
+ case 'read.builds':
735
+ return readsOfOtherBuildsForgotten(connection, request.build);
569
736
  }
570
737
  }
@@ -0,0 +1,18 @@
1
+ import { type QueryRoom } from './compile.js';
2
+ import type { GroupTotal, Plan } from './query.js';
3
+ import type { Connection } from './tables.js';
4
+ export type RoomTally = {
5
+ readonly key: number;
6
+ readonly documents: GroupTotal;
7
+ readonly files: GroupTotal;
8
+ readonly documentTimes: readonly (readonly [string | null, string | null])[];
9
+ readonly chatTimes: readonly string[];
10
+ readonly messageTimes: readonly string[];
11
+ };
12
+ export type ConversationTally = {
13
+ readonly conversation: string;
14
+ readonly said: readonly string[];
15
+ };
16
+ export declare function roomTallies(connection: Connection, totals: Plan, rooms: readonly QueryRoom[], since: string): RoomTally[];
17
+ export declare function conversationTallies(connection: Connection, conversations: readonly string[] | null, since: string): ConversationTally[];
18
+ //# sourceMappingURL=tallies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tallies.d.ts","sourceRoot":"","sources":["../src/tallies.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAI1D,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;IAC7E,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAmHpG,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,KAAK,EAAE,MAAM,GACZ,SAAS,EAAE,CAwBb;AA0BD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,EACvC,KAAK,EAAE,MAAM,GACZ,iBAAiB,EAAE,CAerB"}