@agentshouse/mdruntime 0.1.0-cb1f56e16291b → 0.1.0-cb3bb3b233fa1

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 (327) hide show
  1. package/README.md +21 -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 +113 -81
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +3 -11
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +20 -60
  16. package/dist/authored.d.ts +88 -0
  17. package/dist/authored.d.ts.map +1 -0
  18. package/dist/authored.js +345 -0
  19. package/dist/bootstrap.d.ts +9 -5
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +204 -85
  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 +2 -1
  26. package/dist/chain.d.ts.map +1 -1
  27. package/dist/change-set.d.ts +4 -0
  28. package/dist/change-set.d.ts.map +1 -1
  29. package/dist/change-set.js +6 -0
  30. package/dist/change.d.ts +5 -0
  31. package/dist/change.d.ts.map +1 -1
  32. package/dist/change.js +7 -2
  33. package/dist/chat-types.d.ts +3 -0
  34. package/dist/chat-types.d.ts.map +1 -0
  35. package/dist/chat-types.js +11 -0
  36. package/dist/client.d.ts +30 -22
  37. package/dist/client.d.ts.map +1 -1
  38. package/dist/client.js +39 -20
  39. package/dist/collection.d.ts +26 -4
  40. package/dist/collection.d.ts.map +1 -1
  41. package/dist/collection.js +19 -2
  42. package/dist/column.d.ts +5 -0
  43. package/dist/column.d.ts.map +1 -0
  44. package/dist/column.js +9 -0
  45. package/dist/compile.d.ts +9 -7
  46. package/dist/compile.d.ts.map +1 -1
  47. package/dist/compile.js +252 -318
  48. package/dist/connection.d.ts +5 -141
  49. package/dist/connection.d.ts.map +1 -1
  50. package/dist/connection.js +111 -5282
  51. package/dist/context.d.ts.map +1 -1
  52. package/dist/context.js +1 -1
  53. package/dist/conversation-live.d.ts +150 -0
  54. package/dist/conversation-live.d.ts.map +1 -0
  55. package/dist/conversation-live.js +259 -0
  56. package/dist/conversation-row.d.ts +40 -0
  57. package/dist/conversation-row.d.ts.map +1 -0
  58. package/dist/conversation-row.js +66 -0
  59. package/dist/conversation.d.ts +62 -43
  60. package/dist/conversation.d.ts.map +1 -1
  61. package/dist/conversation.js +987 -902
  62. package/dist/declaration.d.ts +10 -0
  63. package/dist/declaration.d.ts.map +1 -0
  64. package/dist/declaration.js +24 -0
  65. package/dist/discovery.d.ts +10 -0
  66. package/dist/discovery.d.ts.map +1 -0
  67. package/dist/discovery.js +150 -0
  68. package/dist/durability.d.ts +19 -0
  69. package/dist/durability.d.ts.map +1 -1
  70. package/dist/durability.js +4 -0
  71. package/dist/entry.d.ts +2 -2
  72. package/dist/entry.d.ts.map +1 -1
  73. package/dist/entry.js +18 -9
  74. package/dist/expectation.d.ts +26 -13
  75. package/dist/expectation.d.ts.map +1 -1
  76. package/dist/expectation.js +72 -19
  77. package/dist/failure.d.ts +3 -0
  78. package/dist/failure.d.ts.map +1 -1
  79. package/dist/failure.js +6 -0
  80. package/dist/figures.d.ts +49 -0
  81. package/dist/figures.d.ts.map +1 -0
  82. package/dist/figures.js +199 -0
  83. package/dist/file.d.ts +1 -1
  84. package/dist/file.d.ts.map +1 -1
  85. package/dist/file.js +3 -2
  86. package/dist/holdings.d.ts +29 -0
  87. package/dist/holdings.d.ts.map +1 -0
  88. package/dist/holdings.js +95 -0
  89. package/dist/host.d.ts +20 -4
  90. package/dist/host.d.ts.map +1 -1
  91. package/dist/host.js +72 -28
  92. package/dist/identity.d.ts +0 -1
  93. package/dist/identity.d.ts.map +1 -1
  94. package/dist/identity.js +0 -3
  95. package/dist/index.d.ts +32 -12
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +14 -5
  98. package/dist/install.d.ts +60 -0
  99. package/dist/install.d.ts.map +1 -0
  100. package/dist/install.js +537 -0
  101. package/dist/lifecycle.d.ts +7 -0
  102. package/dist/lifecycle.d.ts.map +1 -0
  103. package/dist/lifecycle.js +282 -0
  104. package/dist/listing.d.ts +52 -0
  105. package/dist/listing.d.ts.map +1 -0
  106. package/dist/listing.js +152 -0
  107. package/dist/live.d.ts +8 -6
  108. package/dist/live.d.ts.map +1 -1
  109. package/dist/live.js +110 -31
  110. package/dist/loaded.d.ts +5 -0
  111. package/dist/loaded.d.ts.map +1 -0
  112. package/dist/loaded.js +40 -0
  113. package/dist/locks.d.ts +7 -0
  114. package/dist/locks.d.ts.map +1 -0
  115. package/dist/locks.js +32 -0
  116. package/dist/lost.d.ts +5 -0
  117. package/dist/lost.d.ts.map +1 -0
  118. package/dist/lost.js +49 -0
  119. package/dist/media.d.ts +6 -1
  120. package/dist/media.d.ts.map +1 -1
  121. package/dist/media.js +68 -17
  122. package/dist/memory.d.ts +11 -3
  123. package/dist/memory.d.ts.map +1 -1
  124. package/dist/memory.js +132 -33
  125. package/dist/messages.d.ts +33 -3
  126. package/dist/messages.d.ts.map +1 -1
  127. package/dist/messages.js +98 -27
  128. package/dist/model.d.ts +2 -10
  129. package/dist/model.d.ts.map +1 -1
  130. package/dist/model.js +0 -14
  131. package/dist/models.d.ts +10 -0
  132. package/dist/models.d.ts.map +1 -0
  133. package/dist/models.js +153 -0
  134. package/dist/observation.d.ts +27 -12
  135. package/dist/observation.d.ts.map +1 -1
  136. package/dist/observation.js +184 -85
  137. package/dist/opened.d.ts +1 -1
  138. package/dist/opened.d.ts.map +1 -1
  139. package/dist/opened.js +5 -5
  140. package/dist/opening.d.ts +4 -0
  141. package/dist/opening.d.ts.map +1 -0
  142. package/dist/opening.js +53 -0
  143. package/dist/outcome.d.ts +17 -2
  144. package/dist/outcome.d.ts.map +1 -1
  145. package/dist/outcome.js +35 -2
  146. package/dist/overlay.d.ts +7 -2
  147. package/dist/overlay.d.ts.map +1 -1
  148. package/dist/overlay.js +48 -24
  149. package/dist/page-metadata.d.ts +8 -0
  150. package/dist/page-metadata.d.ts.map +1 -0
  151. package/dist/page-metadata.js +19 -0
  152. package/dist/parts.d.ts +4 -0
  153. package/dist/parts.d.ts.map +1 -0
  154. package/dist/parts.js +13 -0
  155. package/dist/paths.d.ts +1 -0
  156. package/dist/paths.d.ts.map +1 -1
  157. package/dist/paths.js +22 -0
  158. package/dist/preparation.d.ts +41 -0
  159. package/dist/preparation.d.ts.map +1 -0
  160. package/dist/preparation.js +314 -0
  161. package/dist/presence.d.ts +58 -0
  162. package/dist/presence.d.ts.map +1 -0
  163. package/dist/presence.js +231 -0
  164. package/dist/queries.d.ts +16 -0
  165. package/dist/queries.d.ts.map +1 -0
  166. package/dist/queries.js +308 -0
  167. package/dist/query.d.ts +13 -213
  168. package/dist/query.d.ts.map +1 -1
  169. package/dist/query.js +3 -524
  170. package/dist/questions.d.ts +30 -0
  171. package/dist/questions.d.ts.map +1 -0
  172. package/dist/questions.js +116 -0
  173. package/dist/queue.d.ts +40 -0
  174. package/dist/queue.d.ts.map +1 -0
  175. package/dist/queue.js +480 -0
  176. package/dist/reach.d.ts +10 -10
  177. package/dist/reach.d.ts.map +1 -1
  178. package/dist/reach.js +235 -120
  179. package/dist/react.d.ts +17 -3
  180. package/dist/react.d.ts.map +1 -1
  181. package/dist/react.js +33 -1
  182. package/dist/read.d.ts +7 -0
  183. package/dist/read.d.ts.map +1 -0
  184. package/dist/read.js +17 -0
  185. package/dist/readiness.d.ts +9 -4
  186. package/dist/readiness.d.ts.map +1 -1
  187. package/dist/readiness.js +3 -5
  188. package/dist/reads.d.ts +39 -0
  189. package/dist/reads.d.ts.map +1 -0
  190. package/dist/reads.js +178 -0
  191. package/dist/recovery.d.ts +3 -1
  192. package/dist/recovery.d.ts.map +1 -1
  193. package/dist/recovery.js +38 -8
  194. package/dist/refresh.d.ts +1 -1
  195. package/dist/refresh.d.ts.map +1 -1
  196. package/dist/refresh.js +10 -22
  197. package/dist/refusal.d.ts +5 -0
  198. package/dist/refusal.d.ts.map +1 -0
  199. package/dist/refusal.js +55 -0
  200. package/dist/replica.d.ts +11 -16
  201. package/dist/replica.d.ts.map +1 -1
  202. package/dist/replica.js +66 -35
  203. package/dist/retried.d.ts +30 -0
  204. package/dist/retried.d.ts.map +1 -0
  205. package/dist/retried.js +72 -0
  206. package/dist/room-draft.d.ts +32 -9
  207. package/dist/room-draft.d.ts.map +1 -1
  208. package/dist/room-draft.js +273 -66
  209. package/dist/room-drafts.d.ts +24 -0
  210. package/dist/room-drafts.d.ts.map +1 -0
  211. package/dist/room-drafts.js +220 -0
  212. package/dist/room-list.d.ts +10 -0
  213. package/dist/room-list.d.ts.map +1 -0
  214. package/dist/room-list.js +45 -0
  215. package/dist/rows.d.ts +16 -23
  216. package/dist/rows.d.ts.map +1 -1
  217. package/dist/rows.js +49 -191
  218. package/dist/runtime.d.ts +34 -0
  219. package/dist/runtime.d.ts.map +1 -0
  220. package/dist/runtime.js +1 -0
  221. package/dist/save.d.ts +42 -86
  222. package/dist/save.d.ts.map +1 -1
  223. package/dist/save.js +332 -228
  224. package/dist/saves.d.ts +34 -0
  225. package/dist/saves.d.ts.map +1 -0
  226. package/dist/saves.js +437 -0
  227. package/dist/search.d.ts.map +1 -1
  228. package/dist/search.js +1 -1
  229. package/dist/seed.d.ts +11 -2
  230. package/dist/seed.d.ts.map +1 -1
  231. package/dist/seed.js +71 -1
  232. package/dist/shared.d.ts +1 -6
  233. package/dist/shared.d.ts.map +1 -1
  234. package/dist/shared.js +13 -95
  235. package/dist/shown.d.ts +33 -0
  236. package/dist/shown.d.ts.map +1 -0
  237. package/dist/shown.js +309 -0
  238. package/dist/socket/admission.d.ts +7 -0
  239. package/dist/socket/admission.d.ts.map +1 -0
  240. package/dist/socket/admission.js +39 -0
  241. package/dist/socket/answers.d.ts +6 -0
  242. package/dist/socket/answers.d.ts.map +1 -0
  243. package/dist/socket/answers.js +20 -0
  244. package/dist/socket/lanes.d.ts +28 -0
  245. package/dist/socket/lanes.d.ts.map +1 -0
  246. package/dist/socket/lanes.js +103 -0
  247. package/dist/socket/reads.d.ts +10 -0
  248. package/dist/socket/reads.d.ts.map +1 -0
  249. package/dist/socket/reads.js +31 -0
  250. package/dist/socket/session.d.ts +38 -0
  251. package/dist/socket/session.d.ts.map +1 -0
  252. package/dist/socket/session.js +23 -0
  253. package/dist/socket.d.ts +67 -0
  254. package/dist/socket.d.ts.map +1 -0
  255. package/dist/socket.js +164 -0
  256. package/dist/source.d.ts +59 -0
  257. package/dist/source.d.ts.map +1 -0
  258. package/dist/source.js +93 -0
  259. package/dist/status.d.ts +0 -2
  260. package/dist/status.d.ts.map +1 -1
  261. package/dist/status.js +0 -6
  262. package/dist/store/installs.d.ts +30 -0
  263. package/dist/store/installs.d.ts.map +1 -0
  264. package/dist/store/installs.js +40 -0
  265. package/dist/store/readiness.d.ts +11 -0
  266. package/dist/store/readiness.d.ts.map +1 -0
  267. package/dist/store/readiness.js +68 -0
  268. package/dist/store/records.d.ts +223 -0
  269. package/dist/store/records.d.ts.map +1 -0
  270. package/dist/store/records.js +465 -0
  271. package/dist/store/room-held.d.ts +8 -0
  272. package/dist/store/room-held.d.ts.map +1 -0
  273. package/dist/store/room-held.js +17 -0
  274. package/dist/store/rooms-shown.d.ts +8 -0
  275. package/dist/store/rooms-shown.d.ts.map +1 -0
  276. package/dist/store/rooms-shown.js +13 -0
  277. package/dist/store/space.d.ts +11 -0
  278. package/dist/store/space.d.ts.map +1 -0
  279. package/dist/store/space.js +41 -0
  280. package/dist/store/watchers.d.ts +17 -0
  281. package/dist/store/watchers.d.ts.map +1 -0
  282. package/dist/store/watchers.js +56 -0
  283. package/dist/store/writes.d.ts +24 -0
  284. package/dist/store/writes.d.ts.map +1 -0
  285. package/dist/store/writes.js +125 -0
  286. package/dist/store.d.ts +115 -152
  287. package/dist/store.d.ts.map +1 -1
  288. package/dist/store.js +171 -395
  289. package/dist/stored.d.ts +72 -67
  290. package/dist/stored.d.ts.map +1 -1
  291. package/dist/stored.js +317 -166
  292. package/dist/surface.d.ts +90 -0
  293. package/dist/surface.d.ts.map +1 -0
  294. package/dist/surface.js +225 -0
  295. package/dist/sync.d.ts +19 -0
  296. package/dist/sync.d.ts.map +1 -0
  297. package/dist/sync.js +536 -0
  298. package/dist/tables.d.ts +112 -89
  299. package/dist/tables.d.ts.map +1 -1
  300. package/dist/tables.js +197 -283
  301. package/dist/tallies.d.ts +18 -0
  302. package/dist/tallies.d.ts.map +1 -0
  303. package/dist/tallies.js +128 -0
  304. package/dist/validation.d.ts.map +1 -1
  305. package/dist/validation.js +9 -12
  306. package/dist/windows.d.ts +1 -12
  307. package/dist/windows.d.ts.map +1 -1
  308. package/dist/windows.js +2 -75
  309. package/dist/wire.d.ts +68 -7
  310. package/dist/wire.d.ts.map +1 -1
  311. package/dist/wire.js +23 -4
  312. package/package.json +3 -2
  313. package/dist/attempt.d.ts +0 -16
  314. package/dist/attempt.d.ts.map +0 -1
  315. package/dist/attempt.js +0 -70
  316. package/dist/fence.d.ts +0 -6
  317. package/dist/fence.d.ts.map +0 -1
  318. package/dist/fence.js +0 -10
  319. package/dist/job.d.ts +0 -14
  320. package/dist/job.d.ts.map +0 -1
  321. package/dist/job.js +0 -28
  322. package/dist/log.d.ts +0 -5
  323. package/dist/log.d.ts.map +0 -1
  324. package/dist/log.js +0 -14
  325. package/dist/phrase.d.ts +0 -3
  326. package/dist/phrase.d.ts.map +0 -1
  327. package/dist/phrase.js +0 -8
package/dist/tables.js CHANGED
@@ -1,12 +1,20 @@
1
+ import { sql } from '@agentshouse/mdmodel';
1
2
  import { answerQuery } from './compile.js';
2
- import { droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
3
- import { HOLDS_PHRASE, holdsPhrase } from './phrase.js';
4
- import { abandon, release, commit, counts, ended, entries, erase, fenceRooms, files, folders, holdTexts, opened, rederive, referrers, refreshing, remembered, REPLICA_TABLES, stage, typed, typedWithin, unholdTexts, unrefresh, wanted, } from './stored.js';
3
+ import { amended, authoredLocators, authoredPart, call, callRecords, chatDraft, chatDraftConversations, chatDraftRecord, chatDraftRecords, chatDraftsDropped, claim, fact, fenced, fencedWork, fences, FILE_PART_BYTES, authoredEmptied, heldOrder, kept, moving, pendingBatch, pendingState, queuedLocators, queueOf, queues, remember, roomDraft, roomDraftRecords, spooled, unfenced, unsent, unsentStatus, } from './authored.js';
4
+ import { count, text, texts } from './column.js';
5
+ import { conversationFacts, conversationRows, forgottenConversations, heldConversations, keptFact, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
6
+ import { keptRead, READ_TABLES, readsOfOtherBuildsForgotten, storedRead, } from './reads.js';
7
+ import { conversationTallies, roomTallies, } from './tallies.js';
8
+ 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';
9
+ export { authoredEmptied, authoredTable, FILE_PART_BYTES, formatted, heldTables, } from './authored.js';
5
10
  const STATEMENTS_HELD = 256;
6
11
  export function sqliteConnection(engine, database) {
7
12
  const decoder = new TextDecoder();
8
13
  const held = new Map();
9
- database.createFunction(HOLDS_PHRASE, holdsPhrase, { arity: 2, deterministic: true });
14
+ database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
15
+ arity: 2,
16
+ deterministic: true,
17
+ });
10
18
  function prepared(sql) {
11
19
  if (sql.includes(';'))
12
20
  return null;
@@ -66,58 +74,58 @@ export function sqliteConnection(engine, database) {
66
74
  },
67
75
  };
68
76
  }
69
- export const FILE_PART_BYTES = 1_048_576;
70
77
  const PROBE_BYTES = 4 * FILE_PART_BYTES;
71
- const TABLES = [
72
- ['authored_facts', 'name TEXT PRIMARY KEY, value TEXT NOT NULL'],
73
- ['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
74
- [
75
- 'authored_pending',
76
- 'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, PRIMARY KEY (locator, id)',
77
- ],
78
- [
79
- 'authored_room_drafts',
80
- 'locator TEXT NOT NULL, path TEXT NOT NULL, record TEXT NOT NULL, files TEXT NOT NULL, PRIMARY KEY (locator, path)',
81
- ],
82
- ['authored_chat_drafts', 'conversation TEXT PRIMARY KEY, record TEXT NOT NULL'],
83
- ['authored_calls', 'operation TEXT PRIMARY KEY, record TEXT NOT NULL, files TEXT NOT NULL'],
84
- ['authored_fences', 'locator TEXT PRIMARY KEY'],
85
- ];
86
78
  export const RUNTIME_TABLES = [
87
- ...TABLES.map(([name, columns]) => `CREATE TABLE ${name} (${columns}) WITHOUT ROWID`),
88
- 'CREATE TABLE file_parts (key TEXT NOT NULL, part INTEGER NOT NULL, bytes BLOB NOT NULL, PRIMARY KEY (key, part))',
89
79
  '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',
90
80
  'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
81
+ 'CREATE TABLE opened_parts (key TEXT NOT NULL, part INTEGER NOT NULL, bytes BLOB NOT NULL, PRIMARY KEY (key, part))',
91
82
  ...REPLICA_TABLES,
92
83
  ...MESSAGE_TABLES,
84
+ ...READ_TABLES,
93
85
  ];
94
- const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
95
- const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
96
- const UNOWNED_PARTS = `DELETE FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS} UNION SELECT key FROM opened_files)`;
86
+ const UNOPENED_PARTS = 'DELETE FROM opened_parts WHERE key NOT IN (SELECT key FROM opened_files)';
97
87
  const READS = new Set([
98
- 'authored.queues',
88
+ 'authored.status',
89
+ 'authored.moving',
90
+ 'authored.pending',
91
+ 'authored.batch',
92
+ 'authored.order',
93
+ 'authored.queued',
99
94
  'authored.roomDrafts',
95
+ 'authored.chatDraft.read',
100
96
  'authored.chatDrafts',
101
97
  'authored.calls',
102
98
  'authored.fences',
99
+ 'authored.unsent',
103
100
  'authored.fact',
104
101
  'authored.file',
105
102
  'replica.open',
103
+ 'replica.rooms',
104
+ 'replica.room',
105
+ 'replica.covering',
106
+ 'replica.offline',
107
+ 'replica.held',
108
+ 'replica.facts',
109
+ 'replica.presentation',
106
110
  'replica.query',
111
+ 'replica.tallies',
107
112
  'replica.entries',
108
113
  'replica.typed',
109
114
  'replica.referrers',
110
- 'replica.files',
111
115
  'replica.folders',
112
116
  'replica.typedWithin',
113
- 'replica.counts',
114
- 'replica.wanted',
115
117
  'opened.find',
118
+ 'opened.held',
116
119
  'file.part',
117
120
  'conversation.held',
118
121
  'conversation.window',
119
122
  'conversation.count',
120
123
  'conversation.turn',
124
+ 'conversation.rows',
125
+ 'conversation.tallies',
126
+ 'conversation.facts',
127
+ 'conversation.stored',
128
+ 'read.stored',
121
129
  ]);
122
130
  const KINDS = new Set([
123
131
  ...READS,
@@ -129,17 +137,17 @@ const KINDS = new Set([
129
137
  'authored.claim',
130
138
  'authored.end',
131
139
  'replica.stage',
140
+ 'replica.resume',
132
141
  'replica.refresh',
133
142
  'replica.unrefresh',
134
143
  'replica.commit',
135
144
  'replica.fence',
136
145
  'replica.erase',
137
146
  'replica.abandon',
147
+ 'replica.unfence',
138
148
  'replica.release',
139
149
  'replica.rederive',
140
- 'replica.hold',
141
- 'replica.remember',
142
- 'replica.unhold',
150
+ 'replica.demote',
143
151
  'replica.fact',
144
152
  'replica.present',
145
153
  'opened.begin',
@@ -148,8 +156,11 @@ const KINDS = new Set([
148
156
  'opened.drop',
149
157
  'opened.clean',
150
158
  'conversation.keep',
159
+ 'conversation.fact',
151
160
  'conversation.drop',
152
161
  'space.probe',
162
+ 'read.keep',
163
+ 'read.builds',
153
164
  ]);
154
165
  export function isRuntime(request) {
155
166
  return KINDS.has(request.kind);
@@ -157,236 +168,75 @@ export function isRuntime(request) {
157
168
  export function readsRuntime(request) {
158
169
  return READS.has(request.kind);
159
170
  }
160
- function text(value) {
161
- return typeof value === 'string' ? value : String(value);
162
- }
163
- function texts(rows, column) {
164
- return rows.map((row) => text(row[column]));
165
- }
166
- function owned(files) {
167
- return JSON.stringify([...new Set(files)]);
168
- }
169
- function fact(connection, name) {
170
- const [held] = connection.rows('SELECT value FROM authored_facts WHERE name = ?', [name]);
171
- return held === undefined ? null : text(held.value);
172
- }
173
- function remember(connection, name, value) {
174
- connection.run('INSERT OR REPLACE INTO authored_facts (name, value) VALUES (?, ?)', [
175
- name,
176
- value,
177
- ]);
178
- return null;
179
- }
180
- function fenced(connection, locator) {
181
- return connection.rows('SELECT 1 FROM authored_fences WHERE locator = ?', [locator]).length > 0;
182
- }
183
- function stored(connection, key) {
184
- return connection.rows('SELECT 1 FROM file_parts WHERE key = ? LIMIT 1', [key]).length > 0;
185
- }
186
- function storedPart(connection, key, part, bytes) {
187
- connection.run('INSERT INTO file_parts (key, part, bytes) VALUES (?, ?, ?)', [key, part, bytes]);
188
- }
189
- async function storedFiles(connection, files) {
190
- for (const { key, blob } of files) {
191
- if (stored(connection, key))
192
- continue;
193
- for (let at = 0, part = 0; at < blob.size; at += FILE_PART_BYTES, part += 1) {
194
- const bytes = new Uint8Array(await blob.slice(at, at + FILE_PART_BYTES).arrayBuffer());
195
- storedPart(connection, key, part, bytes);
196
- }
197
- }
198
- }
199
- function filePart(connection, key, part) {
200
- const [held] = connection.rows('SELECT bytes FROM file_parts WHERE key = ? AND part = ?', [
201
- key,
202
- part,
203
- ]);
204
- return held?.bytes instanceof Uint8Array ? held.bytes : null;
205
- }
206
- function* fileParts(connection, key) {
207
- for (let part = 0;; part += 1) {
208
- const bytes = filePart(connection, key, part);
209
- if (bytes === null)
210
- return;
211
- yield bytes;
212
- }
213
- }
214
- async function spooled(connection, spool, { key, type }) {
215
- for (const held of [...spool.held()]) {
216
- if (held !== key && !stored(connection, held))
217
- await spool.drop(held);
218
- }
219
- return spool.spool(key, type, fileParts(connection, key));
220
- }
221
- function unowned(connection) {
222
- connection.run(UNOWNED_PARTS);
223
- }
224
- function queued(connection) {
171
+ function heldWork(connection, locator) {
172
+ const room = heldRoom(connection, locator);
225
173
  return {
226
- queues: connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
227
- locator: text(row.locator),
228
- ids: JSON.parse(text(row.ids)),
229
- })),
230
- pending: connection
231
- .rows('SELECT locator, id, batch, state FROM authored_pending')
232
- .map((row) => ({
233
- locator: text(row.locator),
234
- id: text(row.id),
235
- batch: text(row.batch),
236
- state: text(row.state),
237
- })),
174
+ room: room === null ? null : { ...room, overlaid: overlaid(connection, room.key) },
175
+ queue: queueOf(connection, locator),
238
176
  };
239
177
  }
240
- function heldOrder(connection, locator) {
241
- const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
242
- return held === undefined ? [] : JSON.parse(text(held.ids));
243
- }
244
- function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts }) {
245
- for (const path of consumedRoomDrafts ?? []) {
246
- connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
247
- locator,
248
- path,
249
- ]);
250
- }
251
- for (const { path, record, files } of roomDrafts ?? []) {
252
- connection.run('INSERT OR REPLACE INTO authored_room_drafts (locator, path, record, files) VALUES (?, ?, ?, ?)', [locator, path, record, owned(files)]);
253
- }
254
- if (order === undefined)
255
- return;
256
- const before = new Set(heldOrder(connection, locator));
257
- const after = new Set(order);
258
- if (after.size === 0)
259
- connection.run('DELETE FROM authored_queues WHERE locator = ?', [locator]);
260
- else {
261
- connection.run('INSERT OR REPLACE INTO authored_queues (locator, ids) VALUES (?, ?)', [
262
- locator,
263
- JSON.stringify([...after]),
264
- ]);
265
- }
266
- for (const id of before) {
267
- if (!after.has(id)) {
268
- connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
269
- }
270
- }
271
- for (const { id, batch, state, files } of added ?? []) {
272
- if (before.has(id) || !after.has(id))
273
- continue;
274
- connection.run('INSERT OR REPLACE INTO authored_pending (locator, id, batch, state, files) VALUES (?, ?, ?, ?, ?)', [locator, id, batch, state, owned(files)]);
275
- }
276
- for (const { id, batch, files } of founded ?? []) {
277
- const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
278
- if (held === undefined || !before.has(id))
279
- continue;
280
- connection.run('UPDATE authored_pending SET batch = ?, files = ? WHERE locator = ? AND id = ?', [batch, owned([...JSON.parse(text(held.files)), ...files]), locator, id]);
281
- }
282
- }
283
- async function kept(connection, { writes, files, whole, discards }) {
284
- const refused = writes.find(({ locator }) => fenced(connection, locator));
285
- if (refused !== undefined && whole)
286
- return refused.locator;
287
- await storedFiles(connection, files);
288
- for (const write of writes) {
289
- if (!fenced(connection, write.locator))
290
- keptRows(connection, write);
291
- }
292
- for (const locator of discards ?? [])
293
- roomWork(connection, locator);
294
- unowned(connection);
295
- return refused?.locator ?? null;
178
+ function status(connection) {
179
+ return {
180
+ ...unsentStatus(connection),
181
+ lastCompleted: facts(connection, ['lastCompleted']).lastCompleted ?? null,
182
+ };
296
183
  }
297
- function amended(connection, { locator, id, amendment }) {
298
- if (fenced(connection, locator))
299
- return null;
300
- const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
301
- if (held === undefined)
302
- return null;
303
- connection.run('UPDATE authored_pending SET state = ? WHERE locator = ? AND id = ?', [
304
- JSON.stringify({
305
- ...JSON.parse(text(held.state)),
306
- ...JSON.parse(amendment),
307
- }),
308
- locator,
309
- id,
310
- ]);
311
- return null;
184
+ function pendingOf(connection, locator, id) {
185
+ return {
186
+ state: pendingState(connection, locator, id),
187
+ room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
188
+ };
312
189
  }
313
- async function roomDraft(connection, { locator, path, kept: draft, files }) {
314
- if (fenced(connection, locator))
315
- return locator;
316
- await storedFiles(connection, files);
317
- if (draft === null) {
318
- connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
319
- locator,
320
- path,
190
+ function storedConversations(connection, conversations) {
191
+ const named = conversations === null ? '' : ' WHERE conversation IN (SELECT value FROM json_each(?))';
192
+ const bound = conversations === null ? [] : [JSON.stringify(conversations)];
193
+ return [
194
+ ...new Set([
195
+ ...tablesOf(MESSAGE_TABLES).flatMap((table) => texts(connection.rows(`SELECT DISTINCT conversation FROM ${table}${named}`, bound), 'conversation')),
196
+ ...chatDraftConversations(connection, conversations),
197
+ ]),
198
+ ];
199
+ }
200
+ function droppedConversations(connection, conversations) {
201
+ const held = storedConversations(connection, conversations);
202
+ for (const table of tablesOf(MESSAGE_TABLES)) {
203
+ connection.run(`DELETE FROM ${table} WHERE conversation IN (SELECT value FROM json_each(?))`, [
204
+ JSON.stringify(conversations),
321
205
  ]);
322
206
  }
323
- else {
324
- connection.run('INSERT OR REPLACE INTO authored_room_drafts (locator, path, record, files) VALUES (?, ?, ?, ?)', [locator, path, draft.record, owned(draft.files)]);
325
- }
326
- unowned(connection);
327
- return null;
328
- }
329
- function chatDraft(connection, { kept: drafts, dropped }) {
330
- for (const conversation of dropped) {
331
- connection.run('DELETE FROM authored_chat_drafts WHERE conversation = ?', [conversation]);
332
- }
333
- for (const { conversation, record } of drafts) {
334
- connection.run('INSERT OR REPLACE INTO authored_chat_drafts (conversation, record) VALUES (?, ?)', [conversation, record]);
335
- }
336
- return null;
337
- }
338
- async function call(connection, { operation, kept: held, files }) {
339
- await storedFiles(connection, files);
340
- if (held === null)
341
- connection.run('DELETE FROM authored_calls WHERE operation = ?', [operation]);
342
- else {
343
- connection.run('INSERT OR REPLACE INTO authored_calls (operation, record, files) VALUES (?, ?, ?)', [operation, held.record, owned(held.files)]);
344
- }
345
- unowned(connection);
346
- return null;
207
+ chatDraftsDropped(connection, conversations);
208
+ return held;
347
209
  }
348
- function roomWork(connection, locator) {
349
- connection.run('DELETE FROM authored_queues WHERE locator = ?', [locator]);
350
- connection.run('DELETE FROM authored_pending WHERE locator = ?', [locator]);
210
+ function unopened(connection) {
211
+ connection.run(UNOPENED_PARTS);
351
212
  }
352
213
  function fence(connection, locators) {
214
+ fencedWork(connection, locators);
353
215
  for (const locator of locators) {
354
- connection.run('INSERT OR REPLACE INTO authored_fences (locator) VALUES (?)', [locator]);
355
- roomWork(connection, locator);
356
- connection.run('DELETE FROM authored_room_drafts WHERE locator = ?', [locator]);
357
216
  connection.run('DELETE FROM opened_files WHERE locator = ?', [locator]);
358
217
  }
359
- unowned(connection);
218
+ unopened(connection);
360
219
  return fenceRooms(connection, locators);
361
220
  }
362
221
  function erased(connection, { locator, limit }) {
363
- const done = erase(connection, locator, limit);
364
- if (locator !== null && !done.remaining) {
365
- connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
366
- }
367
- return done;
222
+ return erase(connection, locator, limit);
368
223
  }
369
- function claim(connection, holder) {
370
- const held = fact(connection, 'holder');
371
- if (held !== null)
372
- return held === holder;
373
- remember(connection, 'holder', holder);
374
- return true;
224
+ function unfencedRooms(connection, locators) {
225
+ const erased = locators.filter((locator) => connection.rows('SELECT 1 FROM replica_erasing WHERE locator = ? LIMIT 1', [locator])
226
+ .length === 0);
227
+ unfenced(connection, erased);
228
+ return erased;
375
229
  }
376
230
  function end(connection, holder) {
377
231
  ended(connection);
378
- forgottenMessages(connection);
232
+ forgottenConversations(connection);
379
233
  if (holder !== null && claim(connection, holder))
380
234
  return true;
381
- for (const [table] of TABLES)
382
- connection.run(`DELETE FROM ${table}`);
235
+ authoredEmptied(connection);
383
236
  connection.run('DELETE FROM opened_files');
384
- connection.run('DELETE FROM file_parts');
237
+ connection.run('DELETE FROM opened_parts');
385
238
  return false;
386
239
  }
387
- function count(value) {
388
- return typeof value === 'bigint' ? Number(value) : typeof value === 'number' ? value : 0;
389
- }
390
240
  function openedFile(connection, { locator, path, revision }) {
391
241
  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]);
392
242
  return held === undefined
@@ -401,7 +251,7 @@ function opening(connection, { key, locator, path, revision, mediaType }) {
401
251
  if (fenced(connection, locator))
402
252
  return false;
403
253
  connection.run('DELETE FROM opened_files WHERE locator = ? AND path = ? AND revision = ? AND byte_length IS NULL', [locator, path, revision]);
404
- unowned(connection);
254
+ unopened(connection);
405
255
  connection.run('INSERT INTO opened_files (key, locator, path, revision, media_type) VALUES (?, ?, ?, ?, ?)', [key, locator, path, revision, mediaType]);
406
256
  return true;
407
257
  }
@@ -414,22 +264,26 @@ function fetching(connection, key) {
414
264
  function openedPart(connection, { key, part, bytes }) {
415
265
  if (fetching(connection, key) === null)
416
266
  return false;
417
- storedPart(connection, key, part, bytes);
267
+ connection.run('INSERT INTO opened_parts (key, part, bytes) VALUES (?, ?, ?)', [
268
+ key,
269
+ part,
270
+ bytes,
271
+ ]);
418
272
  return true;
419
273
  }
420
274
  function dropped(connection, key) {
421
275
  connection.run('DELETE FROM opened_files WHERE key = ?', [key]);
422
- connection.run('DELETE FROM file_parts WHERE key = ?', [key]);
276
+ connection.run('DELETE FROM opened_parts WHERE key = ?', [key]);
423
277
  return null;
424
278
  }
425
279
  function keptOpened(connection, { key, sha256, byteLength, parts }) {
426
280
  const fetched = fetching(connection, key);
427
281
  if (fetched === null)
428
282
  return false;
429
- 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]);
430
- const whole = count(held?.parts) === parts &&
431
- count(held?.bytes) === byteLength &&
432
- (parts === 0 || (count(held?.first) === 0 && count(held?.last) === parts - 1));
283
+ const [held] = connection.rows('SELECT count(*) AS parts, min(part) AS first, max(part) AS last, coalesce(sum(length(bytes)), 0) AS bytes FROM opened_parts WHERE key = ?', [key]);
284
+ const whole = count(held.parts) === parts &&
285
+ count(held.bytes) === byteLength &&
286
+ (parts === 0 || (count(held.first) === 0 && count(held.last) === parts - 1));
433
287
  if (!whole) {
434
288
  dropped(connection, key);
435
289
  return false;
@@ -440,19 +294,38 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
440
294
  key,
441
295
  ]);
442
296
  connection.run('DELETE FROM opened_files WHERE locator = ? AND path = ? AND revision = ? AND key <> ?', [fetched.locator, fetched.path, fetched.revision, key]);
443
- unowned(connection);
297
+ unopened(connection);
444
298
  return true;
445
299
  }
300
+ function heldPart(connection, key, part) {
301
+ const [held] = connection.rows('SELECT bytes FROM opened_parts WHERE key = ? AND part = ?', [
302
+ key,
303
+ part,
304
+ ]);
305
+ return held?.bytes instanceof Uint8Array ? held.bytes : authoredPart(connection, key, part);
306
+ }
307
+ function cleanable(connection) {
308
+ const [held] = connection.rows('SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM opened_parts');
309
+ return count(held.bytes);
310
+ }
446
311
  function cleaned(connection) {
447
312
  connection.run('DELETE FROM opened_files');
448
- const [freed] = connection.rows(`SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS})`);
449
- unowned(connection);
450
- return count(freed?.bytes);
313
+ const freed = cleanable(connection);
314
+ unopened(connection);
315
+ return freed;
316
+ }
317
+ function openedHeld(connection) {
318
+ return {
319
+ rooms: connection
320
+ .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')
321
+ .map((row) => ({ room: text(row.locator), count: count(row.files), size: count(row.bytes) })),
322
+ cleanable: cleanable(connection),
323
+ };
451
324
  }
452
325
  async function committed(connection, { authored, rooms }) {
453
326
  const refused = authored === undefined ? null : await kept(connection, authored);
454
327
  if (refused !== null && authored?.whole === true) {
455
- return { fenced: refused, counts: {}, changed: {}, indexed: {} };
328
+ return { fenced: refused, changed: {}, indexed: {} };
456
329
  }
457
330
  return {
458
331
  fenced: refused,
@@ -461,28 +334,42 @@ async function committed(connection, { authored, rooms }) {
461
334
  }
462
335
  export function answerRuntime(connection, request, spool) {
463
336
  switch (request.kind) {
464
- case 'authored.queues':
465
- return queued(connection);
337
+ case 'authored.status':
338
+ return status(connection);
339
+ case 'authored.moving':
340
+ return moving(connection);
341
+ case 'authored.pending':
342
+ return pendingOf(connection, request.locator, request.id);
343
+ case 'authored.batch':
344
+ return pendingBatch(connection, request.locator, request.id);
345
+ case 'authored.order':
346
+ return heldOrder(connection, request.locator);
347
+ case 'authored.queued':
348
+ return queuedLocators(connection);
466
349
  case 'authored.roomDrafts':
467
- return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
350
+ return roomDraftRecords(connection, request.locator, request.paths);
351
+ case 'authored.chatDraft.read':
352
+ return chatDraftRecord(connection, request.conversation);
468
353
  case 'authored.chatDrafts':
469
- return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
354
+ return chatDraftRecords(connection);
470
355
  case 'authored.calls':
471
- return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
356
+ return callRecords(connection);
472
357
  case 'authored.fences':
473
- return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
358
+ return fences(connection);
359
+ case 'authored.unsent':
360
+ return unsent(connection);
474
361
  case 'authored.fact':
475
362
  return fact(connection, request.name);
476
363
  case 'authored.file':
477
- return spooled(connection, spool, request);
364
+ return spooled(connection, spool, request.key, request.type);
478
365
  case 'authored.amend':
479
- return amended(connection, request);
366
+ return amended(connection, request.locator, request.id, request.amendment);
480
367
  case 'authored.roomDraft':
481
- return roomDraft(connection, request);
368
+ return roomDraft(connection, request.locator, request.path, request.kept, request.files);
482
369
  case 'authored.chatDraft':
483
- return chatDraft(connection, request);
370
+ return chatDraft(connection, request.kept, request.dropped);
484
371
  case 'authored.call':
485
- return call(connection, request);
372
+ return call(connection, request.operation, request.kept, request.files);
486
373
  case 'authored.remember':
487
374
  return remember(connection, request.name, request.value);
488
375
  case 'authored.claim':
@@ -491,24 +378,43 @@ export function answerRuntime(connection, request, spool) {
491
378
  return end(connection, request.holder);
492
379
  case 'replica.open':
493
380
  return opened(connection);
381
+ case 'replica.rooms':
382
+ return heldRooms(connection, request.locators);
383
+ case 'replica.room':
384
+ return heldWork(connection, request.locator);
385
+ case 'replica.covering':
386
+ return { ...covering(connection, request.since), queues: queues(connection) };
387
+ case 'replica.offline':
388
+ return offlineMode(connection, request.locator);
389
+ case 'replica.held':
390
+ return {
391
+ held: [...new Set([...heldLocators(connection), ...authoredLocators(connection)])],
392
+ staged: stagedLocators(connection),
393
+ };
394
+ case 'replica.demote':
395
+ return demoted(connection);
396
+ case 'replica.facts':
397
+ return facts(connection, request.names);
398
+ case 'replica.presentation':
399
+ return presentation(connection, request.app);
494
400
  case 'replica.query':
495
401
  return answerQuery(connection, request.plan, request.rooms, request.budget);
402
+ case 'replica.tallies':
403
+ return roomTallies(connection, request.totals, request.rooms, request.since);
496
404
  case 'replica.entries':
497
405
  return entries(connection, request.key, request.view, request.paths);
498
406
  case 'replica.typed':
499
407
  return typed(connection, request.key, request.view, request.paths);
500
408
  case 'replica.referrers':
501
- return referrers(connection, request.key, request.view, request.targets, request.kinds);
502
- case 'replica.files':
503
- return files(connection, request.key, request.view, request.after, request.limit);
409
+ return referrers(connection, request.key, request.view, request.targets);
504
410
  case 'replica.folders':
505
- return folders(connection, request.key, request.view, request.paths);
411
+ return folders(connection, request.key, request.paths);
506
412
  case 'replica.typedWithin':
507
413
  return typedWithin(connection, request.key, request.view, request.roots, request.within);
508
- case 'replica.counts':
509
- return counts(connection, request.rooms);
510
414
  case 'replica.stage':
511
415
  return fenced(connection, request.locator) ? null : stage(connection, request);
416
+ case 'replica.resume':
417
+ return fenced(connection, request.locator) ? null : resume(connection, request);
512
418
  case 'replica.refresh':
513
419
  return refreshing(connection, request);
514
420
  case 'replica.unrefresh':
@@ -521,18 +427,12 @@ export function answerRuntime(connection, request, spool) {
521
427
  return erased(connection, request);
522
428
  case 'replica.abandon':
523
429
  return abandon(connection, request.locator);
430
+ case 'replica.unfence':
431
+ return unfencedRooms(connection, request.locators);
524
432
  case 'replica.release':
525
433
  return release(connection, request.key);
526
434
  case 'replica.rederive':
527
435
  return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
528
- case 'replica.hold':
529
- return holdTexts(connection, request);
530
- case 'replica.unhold':
531
- return unholdTexts(connection, request);
532
- case 'replica.wanted':
533
- return wanted(connection, request);
534
- case 'replica.remember':
535
- return remembered(connection, request);
536
436
  case 'replica.fact':
537
437
  connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
538
438
  request.name,
@@ -557,10 +457,12 @@ export function answerRuntime(connection, request, spool) {
557
457
  return dropped(connection, request.key);
558
458
  case 'opened.clean':
559
459
  return cleaned(connection);
460
+ case 'opened.held':
461
+ return openedHeld(connection);
560
462
  case 'file.part':
561
- return filePart(connection, request.key, request.part);
463
+ return heldPart(connection, request.key, request.part);
562
464
  case 'conversation.held':
563
- return heldConversations(connection);
465
+ return heldConversations(connection, request.conversations);
564
466
  case 'conversation.keep': {
565
467
  const { kind: _kind, ...write } = request;
566
468
  return keptMessages(connection, write);
@@ -571,15 +473,27 @@ export function answerRuntime(connection, request, spool) {
571
473
  return messageCount(connection, request.conversation, request.phrase);
572
474
  case 'conversation.turn':
573
475
  return turnArrived(connection, request.conversation, request.turn);
476
+ case 'conversation.rows':
477
+ return conversationRows(connection, request.conversations);
478
+ case 'conversation.tallies':
479
+ return conversationTallies(connection, request.conversations, request.since);
480
+ case 'conversation.facts':
481
+ return conversationFacts(connection);
482
+ case 'conversation.fact': {
483
+ const { kind: _kind, ...fact } = request;
484
+ return keptFact(connection, fact);
485
+ }
486
+ case 'conversation.stored':
487
+ return storedConversations(connection, null);
574
488
  case 'conversation.drop':
575
- chatDraft(connection, {
576
- kind: 'authored.chatDraft',
577
- kept: [],
578
- dropped: request.conversations,
579
- });
580
- droppedMessages(connection, request.conversations);
581
- return null;
489
+ return droppedConversations(connection, request.conversations);
582
490
  case 'space.probe':
583
491
  return spool.probe(PROBE_BYTES).then(() => null);
492
+ case 'read.stored':
493
+ return storedRead(connection, request);
494
+ case 'read.keep':
495
+ return keptRead(connection, request, request.answer);
496
+ case 'read.builds':
497
+ return readsOfOtherBuildsForgotten(connection, request.build);
584
498
  }
585
499
  }