@agentshouse/mdruntime 0.1.0-c8e110144a30a → 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 -2412
  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 -57
  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 -20
  332. package/dist/chat/list.d.ts.map +0 -1
  333. package/dist/chat/list.js +0 -59
  334. package/dist/chat/markdown.d.ts +0 -19
  335. package/dist/chat/markdown.d.ts.map +0 -1
  336. package/dist/chat/markdown.js +0 -187
  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/tables.js ADDED
@@ -0,0 +1,761 @@
1
+ import { sql } from '@agentshouse/mdmodel';
2
+ import { answerQuery } from './compile.js';
3
+ import { conversationFacts, conversationRows, forgottenConversations, heldConversations, keptFact, 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, tablesOf, typedWithin, unrefresh, } from './stored.js';
7
+ const STATEMENTS_HELD = 256;
8
+ export function sqliteConnection(engine, database) {
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
+ }
40
+ return {
41
+ run(sql, bind = []) {
42
+ const statement = prepared(sql);
43
+ if (statement === null)
44
+ database.exec({ sql, bind });
45
+ else
46
+ stepped(statement, bind, () => { });
47
+ },
48
+ rows(sql, bind = []) {
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;
63
+ },
64
+ collate(name, compare) {
65
+ const answered = engine.capi.sqlite3_create_collation_v2(database.pointer, name, engine.capi.SQLITE_UTF8, 0, (_argument, leftLength, left, rightLength, right) => {
66
+ const heap = engine.wasm.heap8u();
67
+ return Math.sign(compare(decoder.decode(heap.subarray(left, left + leftLength)), decoder.decode(heap.subarray(right, right + rightLength))));
68
+ }, 0);
69
+ if (answered !== 0)
70
+ throw new Error(`the database refused the collation ${name}`);
71
+ },
72
+ };
73
+ }
74
+ export const FILE_PART_BYTES = 1_048_576;
75
+ const PROBE_BYTES = 4 * FILE_PART_BYTES;
76
+ const TABLES = [
77
+ ['authored_facts', 'name TEXT PRIMARY KEY, value TEXT NOT NULL'],
78
+ ['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
79
+ [
80
+ 'authored_pending',
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)',
82
+ ],
83
+ [
84
+ 'authored_room_drafts',
85
+ 'locator TEXT NOT NULL, path TEXT NOT NULL, record TEXT NOT NULL, files TEXT NOT NULL, PRIMARY KEY (locator, path)',
86
+ ],
87
+ ['authored_chat_drafts', 'conversation TEXT PRIMARY KEY, record TEXT NOT NULL'],
88
+ ['authored_calls', 'operation TEXT PRIMARY KEY, record TEXT NOT NULL, files TEXT NOT NULL'],
89
+ ['authored_fences', 'locator TEXT PRIMARY KEY'],
90
+ ];
91
+ export const RUNTIME_TABLES = [
92
+ ...TABLES.map(([name, columns]) => `CREATE TABLE ${name} (${columns}) WITHOUT ROWID`),
93
+ 'CREATE TABLE file_parts (key TEXT NOT NULL, part INTEGER NOT NULL, bytes BLOB NOT NULL, PRIMARY KEY (key, part))',
94
+ 'CREATE TABLE opened_files (key TEXT PRIMARY KEY, locator TEXT NOT NULL, path TEXT NOT NULL, revision TEXT NOT NULL, media_type TEXT NOT NULL, sha256 TEXT, byte_length INTEGER) WITHOUT ROWID',
95
+ 'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
96
+ ...REPLICA_TABLES,
97
+ ...MESSAGE_TABLES,
98
+ ...READ_TABLES,
99
+ ];
100
+ const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
101
+ const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
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})`;
104
+ const READS = new Set([
105
+ 'authored.status',
106
+ 'authored.moving',
107
+ 'authored.pending',
108
+ 'authored.batch',
109
+ 'authored.order',
110
+ 'authored.queued',
111
+ 'authored.roomDrafts',
112
+ 'authored.chatDraft.read',
113
+ 'authored.chatDrafts',
114
+ 'authored.calls',
115
+ 'authored.fences',
116
+ 'authored.unsent',
117
+ 'authored.fact',
118
+ 'authored.file',
119
+ 'replica.open',
120
+ 'replica.rooms',
121
+ 'replica.room',
122
+ 'replica.covering',
123
+ 'replica.offline',
124
+ 'replica.held',
125
+ 'replica.facts',
126
+ 'replica.presentation',
127
+ 'replica.query',
128
+ 'replica.tallies',
129
+ 'replica.entries',
130
+ 'replica.typed',
131
+ 'replica.referrers',
132
+ 'replica.folders',
133
+ 'replica.typedWithin',
134
+ 'opened.find',
135
+ 'opened.held',
136
+ 'file.part',
137
+ 'conversation.held',
138
+ 'conversation.window',
139
+ 'conversation.count',
140
+ 'conversation.turn',
141
+ 'conversation.rows',
142
+ 'conversation.tallies',
143
+ 'conversation.facts',
144
+ 'conversation.stored',
145
+ 'read.stored',
146
+ ]);
147
+ const KINDS = new Set([
148
+ ...READS,
149
+ 'authored.amend',
150
+ 'authored.roomDraft',
151
+ 'authored.chatDraft',
152
+ 'authored.call',
153
+ 'authored.remember',
154
+ 'authored.claim',
155
+ 'authored.end',
156
+ 'replica.stage',
157
+ 'replica.resume',
158
+ 'replica.refresh',
159
+ 'replica.unrefresh',
160
+ 'replica.commit',
161
+ 'replica.fence',
162
+ 'replica.erase',
163
+ 'replica.abandon',
164
+ 'replica.unfence',
165
+ 'replica.release',
166
+ 'replica.rederive',
167
+ 'replica.demote',
168
+ 'replica.fact',
169
+ 'replica.present',
170
+ 'opened.begin',
171
+ 'opened.part',
172
+ 'opened.keep',
173
+ 'opened.drop',
174
+ 'opened.clean',
175
+ 'conversation.keep',
176
+ 'conversation.fact',
177
+ 'conversation.drop',
178
+ 'space.probe',
179
+ 'read.keep',
180
+ 'read.builds',
181
+ ]);
182
+ export function isRuntime(request) {
183
+ return KINDS.has(request.kind);
184
+ }
185
+ export function readsRuntime(request) {
186
+ return READS.has(request.kind);
187
+ }
188
+ function text(value) {
189
+ return typeof value === 'string' ? value : String(value);
190
+ }
191
+ function texts(rows, column) {
192
+ return rows.map((row) => text(row[column]));
193
+ }
194
+ function owned(files) {
195
+ return JSON.stringify([...new Set(files)]);
196
+ }
197
+ function fact(connection, name) {
198
+ const [held] = connection.rows('SELECT value FROM authored_facts WHERE name = ?', [name]);
199
+ return held === undefined ? null : text(held.value);
200
+ }
201
+ function remember(connection, name, value) {
202
+ connection.run('INSERT OR REPLACE INTO authored_facts (name, value) VALUES (?, ?)', [
203
+ name,
204
+ value,
205
+ ]);
206
+ return null;
207
+ }
208
+ function fenced(connection, locator) {
209
+ return connection.rows('SELECT 1 FROM authored_fences WHERE locator = ?', [locator]).length > 0;
210
+ }
211
+ function stored(connection, key) {
212
+ return connection.rows('SELECT 1 FROM file_parts WHERE key = ? LIMIT 1', [key]).length > 0;
213
+ }
214
+ function storedPart(connection, key, part, bytes) {
215
+ connection.run('INSERT INTO file_parts (key, part, bytes) VALUES (?, ?, ?)', [key, part, bytes]);
216
+ }
217
+ async function storedFiles(connection, files) {
218
+ for (const { key, blob } of files) {
219
+ if (stored(connection, key))
220
+ continue;
221
+ for (let at = 0, part = 0; at < blob.size; at += FILE_PART_BYTES, part += 1) {
222
+ const bytes = new Uint8Array(await blob.slice(at, at + FILE_PART_BYTES).arrayBuffer());
223
+ storedPart(connection, key, part, bytes);
224
+ }
225
+ }
226
+ }
227
+ function filePart(connection, key, part) {
228
+ const [held] = connection.rows('SELECT bytes FROM file_parts WHERE key = ? AND part = ?', [
229
+ key,
230
+ part,
231
+ ]);
232
+ return held?.bytes instanceof Uint8Array ? held.bytes : null;
233
+ }
234
+ function* fileParts(connection, key) {
235
+ for (let part = 0;; part += 1) {
236
+ const bytes = filePart(connection, key, part);
237
+ if (bytes === null)
238
+ return;
239
+ yield bytes;
240
+ }
241
+ }
242
+ async function spooled(connection, spool, { key, type }) {
243
+ for (const held of [...spool.held()]) {
244
+ if (held !== key && !stored(connection, held))
245
+ await spool.drop(held);
246
+ }
247
+ return spool.spool(key, type, fileParts(connection, key));
248
+ }
249
+ function unowned(connection) {
250
+ connection.run(UNOWNED_PARTS);
251
+ }
252
+ function queued(connection) {
253
+ return connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
254
+ locator: text(row.locator),
255
+ ids: JSON.parse(text(row.ids)),
256
+ }));
257
+ }
258
+ function heldWork(connection, locator) {
259
+ const room = heldRoom(connection, locator);
260
+ const pending = new Map(connection
261
+ .rows('SELECT id, batch, state FROM authored_pending WHERE locator = ?', [locator])
262
+ .map((row) => [
263
+ text(row.id),
264
+ { id: text(row.id), batch: text(row.batch), state: text(row.state) },
265
+ ]));
266
+ return {
267
+ room: room === null ? null : { ...room, overlaid: overlaid(connection, room.key) },
268
+ queue: heldOrder(connection, locator).map((id) => {
269
+ const held = pending.get(id);
270
+ if (held === undefined)
271
+ throw new Error(`Missing Pending Change ${locator}/${id}`);
272
+ return held;
273
+ }),
274
+ };
275
+ }
276
+ function status(connection) {
277
+ const [completed] = connection.rows("SELECT value FROM replica_facts WHERE name = 'lastCompleted'");
278
+ return {
279
+ queued: texts(connection.rows('SELECT locator FROM authored_queues'), 'locator'),
280
+ lastCompleted: completed === undefined ? null : text(completed.value),
281
+ changes: connection
282
+ .rows('SELECT p.locator, c.value AS path FROM authored_pending p, json_each(p.paths) c')
283
+ .map((row) => ({ locator: text(row.locator), path: text(row.path) })),
284
+ resets: connection
285
+ .rows(`SELECT locator, json_extract(state, '$.submission.reset') AS reset FROM authored_pending
286
+ WHERE json_extract(state, '$.submission.state') = 'reset'`)
287
+ .map((row) => ({ locator: text(row.locator), reset: text(row.reset) })),
288
+ returned: texts(connection.rows(`SELECT record FROM authored_room_drafts WHERE json_type(record, '$.returned') = 'object'`), 'record'),
289
+ };
290
+ }
291
+ function pendingOf(connection, locator, id) {
292
+ const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
293
+ return {
294
+ state: held === undefined ? null : text(held.state),
295
+ room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
296
+ };
297
+ }
298
+ function roomDraftRecords(connection, locator, paths) {
299
+ if (locator === null) {
300
+ return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
301
+ }
302
+ if (paths === null) {
303
+ return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ?', [locator]), 'record');
304
+ }
305
+ 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');
306
+ }
307
+ function chatDraftRecord(connection, conversation) {
308
+ const [held] = connection.rows('SELECT record FROM authored_chat_drafts WHERE conversation = ?', [
309
+ conversation,
310
+ ]);
311
+ return held === undefined ? null : text(held.record);
312
+ }
313
+ function heldOrder(connection, locator) {
314
+ const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
315
+ return held === undefined ? [] : JSON.parse(text(held.ids));
316
+ }
317
+ function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts }) {
318
+ for (const path of consumedRoomDrafts ?? []) {
319
+ connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
320
+ locator,
321
+ path,
322
+ ]);
323
+ }
324
+ for (const { path, record, files } of roomDrafts ?? []) {
325
+ connection.run('INSERT OR REPLACE INTO authored_room_drafts (locator, path, record, files) VALUES (?, ?, ?, ?)', [locator, path, record, owned(files)]);
326
+ }
327
+ if (order === undefined)
328
+ return;
329
+ const before = new Set(heldOrder(connection, locator));
330
+ const after = new Set(order);
331
+ if (after.size === 0)
332
+ connection.run('DELETE FROM authored_queues WHERE locator = ?', [locator]);
333
+ else {
334
+ connection.run('INSERT OR REPLACE INTO authored_queues (locator, ids) VALUES (?, ?)', [
335
+ locator,
336
+ JSON.stringify([...after]),
337
+ ]);
338
+ }
339
+ for (const id of before) {
340
+ if (!after.has(id)) {
341
+ connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
342
+ }
343
+ }
344
+ for (const { id, batch, state, files, paths, moving } of added ?? []) {
345
+ if (before.has(id))
346
+ continue;
347
+ 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]);
348
+ }
349
+ for (const { id, batch, files, paths, moving } of founded ?? []) {
350
+ const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
351
+ if (held === undefined || !before.has(id))
352
+ continue;
353
+ connection.run('UPDATE authored_pending SET batch = ?, files = ?, paths = ?, moving = ? WHERE locator = ? AND id = ?', [
354
+ batch,
355
+ owned([...JSON.parse(text(held.files)), ...files]),
356
+ JSON.stringify(paths),
357
+ moving ? 1 : 0,
358
+ locator,
359
+ id,
360
+ ]);
361
+ }
362
+ }
363
+ async function kept(connection, { writes, files, whole }) {
364
+ const refused = writes.find(({ locator }) => fenced(connection, locator));
365
+ if (refused !== undefined && whole)
366
+ return refused.locator;
367
+ await storedFiles(connection, files);
368
+ for (const write of writes) {
369
+ if (!fenced(connection, write.locator))
370
+ keptRows(connection, write);
371
+ }
372
+ unowned(connection);
373
+ return refused?.locator ?? null;
374
+ }
375
+ function amended(connection, { locator, id, amendment }) {
376
+ if (fenced(connection, locator))
377
+ return null;
378
+ const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
379
+ if (held === undefined)
380
+ return null;
381
+ connection.run('UPDATE authored_pending SET state = ? WHERE locator = ? AND id = ?', [
382
+ JSON.stringify({
383
+ ...JSON.parse(text(held.state)),
384
+ ...JSON.parse(amendment),
385
+ }),
386
+ locator,
387
+ id,
388
+ ]);
389
+ return null;
390
+ }
391
+ async function roomDraft(connection, { locator, path, kept: draft, files }) {
392
+ if (fenced(connection, locator))
393
+ return locator;
394
+ await storedFiles(connection, files);
395
+ if (draft === null) {
396
+ connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
397
+ locator,
398
+ path,
399
+ ]);
400
+ }
401
+ else {
402
+ connection.run('INSERT OR REPLACE INTO authored_room_drafts (locator, path, record, files) VALUES (?, ?, ?, ?)', [locator, path, draft.record, owned(draft.files)]);
403
+ }
404
+ unowned(connection);
405
+ return null;
406
+ }
407
+ function conversationTables() {
408
+ return [...tablesOf(MESSAGE_TABLES), 'authored_chat_drafts'];
409
+ }
410
+ function storedConversations(connection, conversations) {
411
+ const named = conversations === null ? '' : ' WHERE conversation IN (SELECT value FROM json_each(?))';
412
+ const bound = conversations === null ? [] : [JSON.stringify(conversations)];
413
+ return [
414
+ ...new Set(conversationTables().flatMap((table) => texts(connection.rows(`SELECT DISTINCT conversation FROM ${table}${named}`, bound), 'conversation'))),
415
+ ];
416
+ }
417
+ function droppedConversations(connection, conversations) {
418
+ const held = storedConversations(connection, conversations);
419
+ for (const table of conversationTables()) {
420
+ connection.run(`DELETE FROM ${table} WHERE conversation IN (SELECT value FROM json_each(?))`, [
421
+ JSON.stringify(conversations),
422
+ ]);
423
+ }
424
+ return held;
425
+ }
426
+ function chatDraft(connection, { kept: drafts, dropped }) {
427
+ for (const conversation of dropped) {
428
+ connection.run('DELETE FROM authored_chat_drafts WHERE conversation = ?', [conversation]);
429
+ }
430
+ for (const { conversation, record } of drafts) {
431
+ connection.run('INSERT OR REPLACE INTO authored_chat_drafts (conversation, record) VALUES (?, ?)', [conversation, record]);
432
+ }
433
+ return null;
434
+ }
435
+ async function call(connection, { operation, kept: held, files }) {
436
+ await storedFiles(connection, files);
437
+ if (held === null)
438
+ connection.run('DELETE FROM authored_calls WHERE operation = ?', [operation]);
439
+ else {
440
+ connection.run('INSERT OR REPLACE INTO authored_calls (operation, record, files) VALUES (?, ?, ?)', [operation, held.record, owned(held.files)]);
441
+ }
442
+ unowned(connection);
443
+ return null;
444
+ }
445
+ function roomWork(connection, locator) {
446
+ connection.run('DELETE FROM authored_queues WHERE locator = ?', [locator]);
447
+ connection.run('DELETE FROM authored_pending WHERE locator = ?', [locator]);
448
+ }
449
+ function fence(connection, locators) {
450
+ for (const locator of locators) {
451
+ connection.run('INSERT OR REPLACE INTO authored_fences (locator) VALUES (?)', [locator]);
452
+ roomWork(connection, locator);
453
+ connection.run('DELETE FROM authored_room_drafts WHERE locator = ?', [locator]);
454
+ connection.run('DELETE FROM opened_files WHERE locator = ?', [locator]);
455
+ }
456
+ unowned(connection);
457
+ return fenceRooms(connection, locators);
458
+ }
459
+ function erased(connection, { locator, limit }) {
460
+ return erase(connection, locator, limit);
461
+ }
462
+ function unfenced(connection, locators) {
463
+ const erased = locators.filter((locator) => connection.rows('SELECT 1 FROM replica_erasing WHERE locator = ? LIMIT 1', [locator])
464
+ .length === 0);
465
+ for (const locator of erased) {
466
+ connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
467
+ }
468
+ return erased;
469
+ }
470
+ function claim(connection, holder) {
471
+ const held = fact(connection, 'holder');
472
+ if (held !== null)
473
+ return held === holder;
474
+ remember(connection, 'holder', holder);
475
+ return true;
476
+ }
477
+ function end(connection, holder) {
478
+ ended(connection);
479
+ forgottenConversations(connection);
480
+ if (holder !== null && claim(connection, holder))
481
+ return true;
482
+ for (const [table] of TABLES)
483
+ connection.run(`DELETE FROM ${table}`);
484
+ connection.run('DELETE FROM opened_files');
485
+ connection.run('DELETE FROM file_parts');
486
+ return false;
487
+ }
488
+ function count(value) {
489
+ return typeof value === 'bigint' ? Number(value) : typeof value === 'number' ? value : 0;
490
+ }
491
+ function openedFile(connection, { locator, path, revision }) {
492
+ const [held] = connection.rows('SELECT key, media_type, byte_length FROM opened_files WHERE locator = ? AND path = ? AND revision = ? AND byte_length IS NOT NULL', [locator, path, revision]);
493
+ return held === undefined
494
+ ? null
495
+ : {
496
+ key: text(held.key),
497
+ byteLength: count(held.byte_length),
498
+ mediaType: text(held.media_type),
499
+ };
500
+ }
501
+ function opening(connection, { key, locator, path, revision, mediaType }) {
502
+ if (fenced(connection, locator))
503
+ return false;
504
+ connection.run('DELETE FROM opened_files WHERE locator = ? AND path = ? AND revision = ? AND byte_length IS NULL', [locator, path, revision]);
505
+ unowned(connection);
506
+ connection.run('INSERT INTO opened_files (key, locator, path, revision, media_type) VALUES (?, ?, ?, ?, ?)', [key, locator, path, revision, mediaType]);
507
+ return true;
508
+ }
509
+ function fetching(connection, key) {
510
+ const [held] = connection.rows('SELECT locator, path, revision FROM opened_files WHERE key = ? AND byte_length IS NULL', [key]);
511
+ return held === undefined
512
+ ? null
513
+ : { locator: text(held.locator), path: text(held.path), revision: text(held.revision) };
514
+ }
515
+ function openedPart(connection, { key, part, bytes }) {
516
+ if (fetching(connection, key) === null)
517
+ return false;
518
+ storedPart(connection, key, part, bytes);
519
+ return true;
520
+ }
521
+ function dropped(connection, key) {
522
+ connection.run('DELETE FROM opened_files WHERE key = ?', [key]);
523
+ connection.run('DELETE FROM file_parts WHERE key = ?', [key]);
524
+ return null;
525
+ }
526
+ function keptOpened(connection, { key, sha256, byteLength, parts }) {
527
+ const fetched = fetching(connection, key);
528
+ if (fetched === null)
529
+ return false;
530
+ 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]);
531
+ const whole = count(held.parts) === parts &&
532
+ count(held.bytes) === byteLength &&
533
+ (parts === 0 || (count(held.first) === 0 && count(held.last) === parts - 1));
534
+ if (!whole) {
535
+ dropped(connection, key);
536
+ return false;
537
+ }
538
+ connection.run('UPDATE opened_files SET sha256 = ?, byte_length = ? WHERE key = ?', [
539
+ sha256,
540
+ byteLength,
541
+ key,
542
+ ]);
543
+ connection.run('DELETE FROM opened_files WHERE locator = ? AND path = ? AND revision = ? AND key <> ?', [fetched.locator, fetched.path, fetched.revision, key]);
544
+ unowned(connection);
545
+ return true;
546
+ }
547
+ const UNSENT = [
548
+ ['pending-change', 'authored_pending'],
549
+ ['call', 'authored_calls'],
550
+ ['room-draft', 'authored_room_drafts'],
551
+ ['chat-draft', 'authored_chat_drafts'],
552
+ ];
553
+ function unsent(connection) {
554
+ const [held] = connection.rows(`SELECT ${UNSENT.map(([kind, table]) => `(SELECT count(*) FROM ${table}) AS "${kind}"`).join(', ')}`);
555
+ return UNSENT.map(([kind]) => ({ kind, count: count(held[kind]) })).filter((work) => work.count > 0);
556
+ }
557
+ function cleanable(connection) {
558
+ const [held] = connection.rows(CLEANABLE_BYTES);
559
+ return count(held.bytes);
560
+ }
561
+ function cleaned(connection) {
562
+ connection.run('DELETE FROM opened_files');
563
+ const freed = cleanable(connection);
564
+ unowned(connection);
565
+ return freed;
566
+ }
567
+ function openedHeld(connection) {
568
+ return {
569
+ rooms: connection
570
+ .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')
571
+ .map((row) => ({ room: text(row.locator), count: count(row.files), size: count(row.bytes) })),
572
+ cleanable: cleanable(connection),
573
+ };
574
+ }
575
+ async function committed(connection, { authored, rooms }) {
576
+ const refused = authored === undefined ? null : await kept(connection, authored);
577
+ if (refused !== null && authored?.whole === true) {
578
+ return { fenced: refused, changed: {}, indexed: {} };
579
+ }
580
+ return {
581
+ fenced: refused,
582
+ ...commit(connection, rooms.filter(({ locator }) => !fenced(connection, locator))),
583
+ };
584
+ }
585
+ export function answerRuntime(connection, request, spool) {
586
+ switch (request.kind) {
587
+ case 'authored.status':
588
+ return status(connection);
589
+ case 'authored.moving':
590
+ return {
591
+ queues: queued(connection),
592
+ pending: connection
593
+ .rows('SELECT locator, id, batch, state FROM authored_pending WHERE moving = 1 ORDER BY locator')
594
+ .map((row) => ({
595
+ locator: text(row.locator),
596
+ id: text(row.id),
597
+ batch: text(row.batch),
598
+ state: text(row.state),
599
+ })),
600
+ };
601
+ case 'authored.pending':
602
+ return pendingOf(connection, request.locator, request.id);
603
+ case 'authored.batch': {
604
+ const [held] = connection.rows('SELECT batch FROM authored_pending WHERE locator = ? AND id = ?', [request.locator, request.id]);
605
+ return held === undefined ? null : text(held.batch);
606
+ }
607
+ case 'authored.order':
608
+ return heldOrder(connection, request.locator);
609
+ case 'authored.queued':
610
+ return texts(connection.rows('SELECT locator FROM authored_queues'), 'locator');
611
+ case 'authored.roomDrafts':
612
+ return roomDraftRecords(connection, request.locator, request.paths);
613
+ case 'authored.chatDraft.read':
614
+ return chatDraftRecord(connection, request.conversation);
615
+ case 'authored.chatDrafts':
616
+ return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
617
+ case 'authored.calls':
618
+ return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
619
+ case 'authored.fences':
620
+ return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
621
+ case 'authored.unsent':
622
+ return unsent(connection);
623
+ case 'authored.fact':
624
+ return fact(connection, request.name);
625
+ case 'authored.file':
626
+ return spooled(connection, spool, request);
627
+ case 'authored.amend':
628
+ return amended(connection, request);
629
+ case 'authored.roomDraft':
630
+ return roomDraft(connection, request);
631
+ case 'authored.chatDraft':
632
+ return chatDraft(connection, request);
633
+ case 'authored.call':
634
+ return call(connection, request);
635
+ case 'authored.remember':
636
+ return remember(connection, request.name, request.value);
637
+ case 'authored.claim':
638
+ return claim(connection, request.holder);
639
+ case 'authored.end':
640
+ return end(connection, request.holder);
641
+ case 'replica.open':
642
+ return opened(connection);
643
+ case 'replica.rooms':
644
+ return heldRooms(connection, request.locators);
645
+ case 'replica.room':
646
+ return heldWork(connection, request.locator);
647
+ case 'replica.covering':
648
+ return {
649
+ rooms: covering(connection),
650
+ queues: queued(connection),
651
+ };
652
+ case 'replica.offline':
653
+ return offlineMode(connection, request.locator);
654
+ case 'replica.held':
655
+ return { held: heldLocators(connection), staged: stagedLocators(connection) };
656
+ case 'replica.demote':
657
+ return demoted(connection);
658
+ case 'replica.facts':
659
+ return facts(connection);
660
+ case 'replica.presentation':
661
+ return presentation(connection, request.app);
662
+ case 'replica.query':
663
+ return answerQuery(connection, request.plan, request.rooms, request.budget);
664
+ case 'replica.tallies':
665
+ return roomTallies(connection, request.totals, request.rooms, request.since);
666
+ case 'replica.entries':
667
+ return entries(connection, request.key, request.view, request.paths);
668
+ case 'replica.typed':
669
+ return typed(connection, request.key, request.view, request.paths);
670
+ case 'replica.referrers':
671
+ return referrers(connection, request.key, request.view, request.targets);
672
+ case 'replica.folders':
673
+ return folders(connection, request.key, request.paths);
674
+ case 'replica.typedWithin':
675
+ return typedWithin(connection, request.key, request.view, request.roots, request.within);
676
+ case 'replica.stage':
677
+ return fenced(connection, request.locator) ? null : stage(connection, request);
678
+ case 'replica.resume':
679
+ return fenced(connection, request.locator) ? null : resume(connection, request);
680
+ case 'replica.refresh':
681
+ return refreshing(connection, request);
682
+ case 'replica.unrefresh':
683
+ return unrefresh(connection, request.key);
684
+ case 'replica.commit':
685
+ return committed(connection, request);
686
+ case 'replica.fence':
687
+ return fence(connection, request.locators);
688
+ case 'replica.erase':
689
+ return erased(connection, request);
690
+ case 'replica.abandon':
691
+ return abandon(connection, request.locator);
692
+ case 'replica.unfence':
693
+ return unfenced(connection, request.locators);
694
+ case 'replica.release':
695
+ return release(connection, request.key);
696
+ case 'replica.rederive':
697
+ return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
698
+ case 'replica.fact':
699
+ connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
700
+ request.name,
701
+ request.value,
702
+ ]);
703
+ return null;
704
+ case 'replica.present':
705
+ connection.run('INSERT OR REPLACE INTO replica_presentation (app, value) VALUES (?, ?)', [
706
+ request.app,
707
+ request.value,
708
+ ]);
709
+ return null;
710
+ case 'opened.find':
711
+ return openedFile(connection, request);
712
+ case 'opened.begin':
713
+ return opening(connection, request);
714
+ case 'opened.part':
715
+ return openedPart(connection, request);
716
+ case 'opened.keep':
717
+ return keptOpened(connection, request);
718
+ case 'opened.drop':
719
+ return dropped(connection, request.key);
720
+ case 'opened.clean':
721
+ return cleaned(connection);
722
+ case 'opened.held':
723
+ return openedHeld(connection);
724
+ case 'file.part':
725
+ return filePart(connection, request.key, request.part);
726
+ case 'conversation.held':
727
+ return heldConversations(connection, request.conversations);
728
+ case 'conversation.keep': {
729
+ const { kind: _kind, ...write } = request;
730
+ return keptMessages(connection, write);
731
+ }
732
+ case 'conversation.window':
733
+ return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
734
+ case 'conversation.count':
735
+ return messageCount(connection, request.conversation, request.phrase);
736
+ case 'conversation.turn':
737
+ return turnArrived(connection, request.conversation, request.turn);
738
+ case 'conversation.rows':
739
+ return conversationRows(connection, request.conversations);
740
+ case 'conversation.tallies':
741
+ return conversationTallies(connection, request.conversations, request.since);
742
+ case 'conversation.facts':
743
+ return conversationFacts(connection);
744
+ case 'conversation.fact': {
745
+ const { kind: _kind, ...fact } = request;
746
+ return keptFact(connection, fact);
747
+ }
748
+ case 'conversation.stored':
749
+ return storedConversations(connection, null);
750
+ case 'conversation.drop':
751
+ return droppedConversations(connection, request.conversations);
752
+ case 'space.probe':
753
+ return spool.probe(PROBE_BYTES).then(() => null);
754
+ case 'read.stored':
755
+ return storedRead(connection, request);
756
+ case 'read.keep':
757
+ return keptRead(connection, request, request.answer);
758
+ case 'read.builds':
759
+ return readsOfOtherBuildsForgotten(connection, request.build);
760
+ }
761
+ }