@agentshouse/mdruntime 0.1.0-c44866799613e → 0.1.0-c44d5cc00aee5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/README.md +18 -17
  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 +110 -112
  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 +28 -51
  16. package/dist/bootstrap.d.ts +15 -18
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +252 -158
  19. package/dist/cell.d.ts +6 -0
  20. package/dist/cell.d.ts.map +1 -0
  21. package/dist/cell.js +9 -0
  22. package/dist/chain.d.ts +2 -1
  23. package/dist/chain.d.ts.map +1 -1
  24. package/dist/change-set.d.ts +4 -0
  25. package/dist/change-set.d.ts.map +1 -1
  26. package/dist/change-set.js +6 -0
  27. package/dist/change.d.ts +1 -0
  28. package/dist/change.d.ts.map +1 -1
  29. package/dist/change.js +4 -2
  30. package/dist/chat-types.d.ts +3 -0
  31. package/dist/chat-types.d.ts.map +1 -0
  32. package/dist/chat-types.js +11 -0
  33. package/dist/client.d.ts +27 -21
  34. package/dist/client.d.ts.map +1 -1
  35. package/dist/client.js +36 -17
  36. package/dist/collection.d.ts +23 -7
  37. package/dist/collection.d.ts.map +1 -1
  38. package/dist/collection.js +13 -19
  39. package/dist/compile.d.ts +8 -6
  40. package/dist/compile.d.ts.map +1 -1
  41. package/dist/compile.js +288 -329
  42. package/dist/connection.d.ts +5 -143
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +109 -5104
  45. package/dist/context.d.ts +2 -0
  46. package/dist/context.d.ts.map +1 -0
  47. package/dist/context.js +7 -0
  48. package/dist/conversation-live.d.ts +143 -0
  49. package/dist/conversation-live.d.ts.map +1 -0
  50. package/dist/conversation-live.js +254 -0
  51. package/dist/conversation-row.d.ts +33 -0
  52. package/dist/conversation-row.d.ts.map +1 -0
  53. package/dist/conversation-row.js +53 -0
  54. package/dist/conversation.d.ts +65 -48
  55. package/dist/conversation.d.ts.map +1 -1
  56. package/dist/conversation.js +987 -838
  57. package/dist/declaration.d.ts +10 -0
  58. package/dist/declaration.d.ts.map +1 -0
  59. package/dist/declaration.js +24 -0
  60. package/dist/discovery.d.ts +10 -0
  61. package/dist/discovery.d.ts.map +1 -0
  62. package/dist/discovery.js +150 -0
  63. package/dist/durability.d.ts +19 -1
  64. package/dist/durability.d.ts.map +1 -1
  65. package/dist/durability.js +4 -0
  66. package/dist/entry.d.ts +3 -2
  67. package/dist/entry.d.ts.map +1 -1
  68. package/dist/entry.js +19 -9
  69. package/dist/expectation.d.ts +26 -13
  70. package/dist/expectation.d.ts.map +1 -1
  71. package/dist/expectation.js +72 -19
  72. package/dist/failure.d.ts +3 -0
  73. package/dist/failure.d.ts.map +1 -1
  74. package/dist/failure.js +6 -0
  75. package/dist/figures.d.ts +49 -0
  76. package/dist/figures.d.ts.map +1 -0
  77. package/dist/figures.js +197 -0
  78. package/dist/holdings.d.ts +29 -0
  79. package/dist/holdings.d.ts.map +1 -0
  80. package/dist/holdings.js +95 -0
  81. package/dist/host.d.ts +21 -8
  82. package/dist/host.d.ts.map +1 -1
  83. package/dist/host.js +73 -40
  84. package/dist/identity.d.ts +0 -1
  85. package/dist/identity.d.ts.map +1 -1
  86. package/dist/identity.js +0 -3
  87. package/dist/index.d.ts +34 -12
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +16 -5
  90. package/dist/install.d.ts +54 -0
  91. package/dist/install.d.ts.map +1 -0
  92. package/dist/install.js +530 -0
  93. package/dist/lifecycle.d.ts +7 -0
  94. package/dist/lifecycle.d.ts.map +1 -0
  95. package/dist/lifecycle.js +277 -0
  96. package/dist/listing.d.ts +48 -0
  97. package/dist/listing.d.ts.map +1 -0
  98. package/dist/listing.js +139 -0
  99. package/dist/live.d.ts +5 -4
  100. package/dist/live.d.ts.map +1 -1
  101. package/dist/live.js +64 -23
  102. package/dist/locks.d.ts +7 -0
  103. package/dist/locks.d.ts.map +1 -0
  104. package/dist/locks.js +32 -0
  105. package/dist/lost.d.ts +5 -0
  106. package/dist/lost.d.ts.map +1 -0
  107. package/dist/lost.js +49 -0
  108. package/dist/media.d.ts +2 -2
  109. package/dist/media.d.ts.map +1 -1
  110. package/dist/media.js +23 -13
  111. package/dist/memory.d.ts +17 -7
  112. package/dist/memory.d.ts.map +1 -1
  113. package/dist/memory.js +210 -97
  114. package/dist/messages.d.ts +33 -5
  115. package/dist/messages.d.ts.map +1 -1
  116. package/dist/messages.js +104 -36
  117. package/dist/model.d.ts +2 -11
  118. package/dist/model.d.ts.map +1 -1
  119. package/dist/model.js +0 -23
  120. package/dist/models.d.ts +10 -0
  121. package/dist/models.d.ts.map +1 -0
  122. package/dist/models.js +153 -0
  123. package/dist/observation.d.ts +4 -3
  124. package/dist/observation.d.ts.map +1 -1
  125. package/dist/observation.js +23 -17
  126. package/dist/opened.d.ts +1 -1
  127. package/dist/opened.d.ts.map +1 -1
  128. package/dist/opened.js +5 -5
  129. package/dist/opening.d.ts +4 -0
  130. package/dist/opening.d.ts.map +1 -0
  131. package/dist/opening.js +53 -0
  132. package/dist/outcome.d.ts +7 -4
  133. package/dist/outcome.d.ts.map +1 -1
  134. package/dist/outcome.js +18 -0
  135. package/dist/overlay.d.ts +6 -1
  136. package/dist/overlay.d.ts.map +1 -1
  137. package/dist/overlay.js +47 -21
  138. package/dist/page-metadata.d.ts +8 -0
  139. package/dist/page-metadata.d.ts.map +1 -0
  140. package/dist/page-metadata.js +19 -0
  141. package/dist/parts.d.ts +4 -0
  142. package/dist/parts.d.ts.map +1 -0
  143. package/dist/parts.js +13 -0
  144. package/dist/paths.d.ts +2 -0
  145. package/dist/paths.d.ts.map +1 -1
  146. package/dist/paths.js +26 -0
  147. package/dist/preparation.d.ts +20 -0
  148. package/dist/preparation.d.ts.map +1 -0
  149. package/dist/preparation.js +227 -0
  150. package/dist/presence.d.ts +52 -0
  151. package/dist/presence.d.ts.map +1 -0
  152. package/dist/presence.js +220 -0
  153. package/dist/queries.d.ts +16 -0
  154. package/dist/queries.d.ts.map +1 -0
  155. package/dist/queries.js +282 -0
  156. package/dist/query.d.ts +14 -210
  157. package/dist/query.d.ts.map +1 -1
  158. package/dist/query.js +3 -505
  159. package/dist/questions.d.ts +29 -0
  160. package/dist/questions.d.ts.map +1 -0
  161. package/dist/questions.js +115 -0
  162. package/dist/queue.d.ts +40 -0
  163. package/dist/queue.d.ts.map +1 -0
  164. package/dist/queue.js +450 -0
  165. package/dist/reach.d.ts +15 -12
  166. package/dist/reach.d.ts.map +1 -1
  167. package/dist/reach.js +240 -149
  168. package/dist/react.d.ts +15 -2
  169. package/dist/react.d.ts.map +1 -1
  170. package/dist/react.js +33 -1
  171. package/dist/read.d.ts +7 -0
  172. package/dist/read.d.ts.map +1 -0
  173. package/dist/read.js +17 -0
  174. package/dist/readiness.d.ts +4 -19
  175. package/dist/readiness.d.ts.map +1 -1
  176. package/dist/readiness.js +4 -10
  177. package/dist/reads.d.ts +38 -10
  178. package/dist/reads.d.ts.map +1 -1
  179. package/dist/reads.js +163 -85
  180. package/dist/recovery.d.ts +3 -0
  181. package/dist/recovery.d.ts.map +1 -1
  182. package/dist/recovery.js +57 -1
  183. package/dist/refresh.d.ts +7 -5
  184. package/dist/refresh.d.ts.map +1 -1
  185. package/dist/refresh.js +35 -7
  186. package/dist/refusal.d.ts +5 -0
  187. package/dist/refusal.d.ts.map +1 -0
  188. package/dist/refusal.js +55 -0
  189. package/dist/replica.d.ts +12 -18
  190. package/dist/replica.d.ts.map +1 -1
  191. package/dist/replica.js +64 -34
  192. package/dist/retried.d.ts +30 -0
  193. package/dist/retried.d.ts.map +1 -0
  194. package/dist/retried.js +72 -0
  195. package/dist/room-draft.d.ts +24 -10
  196. package/dist/room-draft.d.ts.map +1 -1
  197. package/dist/room-draft.js +142 -106
  198. package/dist/room-drafts.d.ts +24 -0
  199. package/dist/room-drafts.d.ts.map +1 -0
  200. package/dist/room-drafts.js +217 -0
  201. package/dist/rows.d.ts +14 -21
  202. package/dist/rows.d.ts.map +1 -1
  203. package/dist/rows.js +49 -186
  204. package/dist/runtime.d.ts +34 -0
  205. package/dist/runtime.d.ts.map +1 -0
  206. package/dist/runtime.js +1 -0
  207. package/dist/save.d.ts +42 -84
  208. package/dist/save.d.ts.map +1 -1
  209. package/dist/save.js +349 -170
  210. package/dist/saves.d.ts +32 -0
  211. package/dist/saves.d.ts.map +1 -0
  212. package/dist/saves.js +410 -0
  213. package/dist/search.d.ts +12 -63
  214. package/dist/search.d.ts.map +1 -1
  215. package/dist/search.js +9 -52
  216. package/dist/seed.d.ts +11 -2
  217. package/dist/seed.d.ts.map +1 -1
  218. package/dist/seed.js +71 -1
  219. package/dist/shared.d.ts +1 -7
  220. package/dist/shared.d.ts.map +1 -1
  221. package/dist/shared.js +13 -105
  222. package/dist/shown.d.ts +33 -0
  223. package/dist/shown.d.ts.map +1 -0
  224. package/dist/shown.js +302 -0
  225. package/dist/socket/admission.d.ts +7 -0
  226. package/dist/socket/admission.d.ts.map +1 -0
  227. package/dist/socket/admission.js +39 -0
  228. package/dist/socket/answers.d.ts +6 -0
  229. package/dist/socket/answers.d.ts.map +1 -0
  230. package/dist/socket/answers.js +20 -0
  231. package/dist/socket/lanes.d.ts +28 -0
  232. package/dist/socket/lanes.d.ts.map +1 -0
  233. package/dist/socket/lanes.js +103 -0
  234. package/dist/socket/reads.d.ts +10 -0
  235. package/dist/socket/reads.d.ts.map +1 -0
  236. package/dist/socket/reads.js +31 -0
  237. package/dist/socket/session.d.ts +38 -0
  238. package/dist/socket/session.d.ts.map +1 -0
  239. package/dist/socket/session.js +23 -0
  240. package/dist/socket.d.ts +67 -0
  241. package/dist/socket.d.ts.map +1 -0
  242. package/dist/socket.js +164 -0
  243. package/dist/source.d.ts +54 -0
  244. package/dist/source.d.ts.map +1 -0
  245. package/dist/source.js +82 -0
  246. package/dist/status.d.ts +4 -5
  247. package/dist/status.d.ts.map +1 -1
  248. package/dist/status.js +3 -7
  249. package/dist/store/installs.d.ts +30 -0
  250. package/dist/store/installs.d.ts.map +1 -0
  251. package/dist/store/installs.js +34 -0
  252. package/dist/store/readiness.d.ts +10 -0
  253. package/dist/store/readiness.d.ts.map +1 -0
  254. package/dist/store/readiness.js +52 -0
  255. package/dist/store/records.d.ts +214 -0
  256. package/dist/store/records.d.ts.map +1 -0
  257. package/dist/store/records.js +438 -0
  258. package/dist/store/room-held.d.ts +8 -0
  259. package/dist/store/room-held.d.ts.map +1 -0
  260. package/dist/store/room-held.js +17 -0
  261. package/dist/store/space.d.ts +11 -0
  262. package/dist/store/space.d.ts.map +1 -0
  263. package/dist/store/space.js +41 -0
  264. package/dist/store/watchers.d.ts +17 -0
  265. package/dist/store/watchers.d.ts.map +1 -0
  266. package/dist/store/watchers.js +56 -0
  267. package/dist/store/writes.d.ts +24 -0
  268. package/dist/store/writes.d.ts.map +1 -0
  269. package/dist/store/writes.js +125 -0
  270. package/dist/store.d.ts +120 -171
  271. package/dist/store.d.ts.map +1 -1
  272. package/dist/store.js +166 -414
  273. package/dist/stored.d.ts +62 -57
  274. package/dist/stored.d.ts.map +1 -1
  275. package/dist/stored.js +317 -239
  276. package/dist/surface.d.ts +88 -0
  277. package/dist/surface.d.ts.map +1 -0
  278. package/dist/surface.js +220 -0
  279. package/dist/sync.d.ts +19 -0
  280. package/dist/sync.d.ts.map +1 -0
  281. package/dist/sync.js +535 -0
  282. package/dist/tables.d.ts +126 -65
  283. package/dist/tables.d.ts.map +1 -1
  284. package/dist/tables.js +250 -113
  285. package/dist/tallies.d.ts +18 -0
  286. package/dist/tallies.d.ts.map +1 -0
  287. package/dist/tallies.js +128 -0
  288. package/dist/transfer.d.ts +0 -5
  289. package/dist/transfer.d.ts.map +1 -1
  290. package/dist/validation.d.ts +3 -4
  291. package/dist/validation.d.ts.map +1 -1
  292. package/dist/validation.js +42 -100
  293. package/dist/windows.d.ts +1 -12
  294. package/dist/windows.d.ts.map +1 -1
  295. package/dist/windows.js +2 -75
  296. package/dist/wire.d.ts +65 -9
  297. package/dist/wire.d.ts.map +1 -1
  298. package/dist/wire.js +22 -5
  299. package/package.json +3 -2
  300. package/dist/attempt.d.ts +0 -16
  301. package/dist/attempt.d.ts.map +0 -1
  302. package/dist/attempt.js +0 -70
  303. package/dist/fence.d.ts +0 -6
  304. package/dist/fence.d.ts.map +0 -1
  305. package/dist/fence.js +0 -10
  306. package/dist/fulltext.d.ts +0 -27
  307. package/dist/fulltext.d.ts.map +0 -1
  308. package/dist/fulltext.js +0 -368
  309. package/dist/log.d.ts +0 -5
  310. package/dist/log.d.ts.map +0 -1
  311. package/dist/log.js +0 -14
  312. package/dist/words.d.ts +0 -19
  313. package/dist/words.d.ts.map +0 -1
  314. package/dist/words.js +0 -150
package/dist/tables.js CHANGED
@@ -1,11 +1,17 @@
1
+ import { sql } from '@agentshouse/mdmodel';
1
2
  import { answerQuery } from './compile.js';
2
- import { searched, SEARCH_TABLES } from './fulltext.js';
3
- import { droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
4
- import { abandon, release, commit, counts, ended, entries, erase, fenceRooms, files, opened, rederive, referrers, refreshing, REPLICA_TABLES, keepParts, stage, transferPart, typed, typedWithin, unrefresh, walk, } from './stored.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';
5
7
  const STATEMENTS_HELD = 256;
6
8
  export function sqliteConnection(engine, database) {
7
9
  const decoder = new TextDecoder();
8
10
  const held = new Map();
11
+ database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
12
+ arity: 2,
13
+ deterministic: true,
14
+ });
9
15
  function prepared(sql) {
10
16
  if (sql.includes(';'))
11
17
  return null;
@@ -72,7 +78,7 @@ const TABLES = [
72
78
  ['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
73
79
  [
74
80
  'authored_pending',
75
- 'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, PRIMARY KEY (locator, id)',
81
+ 'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, paths TEXT NOT NULL, moving INTEGER NOT NULL, PRIMARY KEY (locator, id)',
76
82
  ],
77
83
  [
78
84
  'authored_room_drafts',
@@ -89,38 +95,54 @@ export const RUNTIME_TABLES = [
89
95
  'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
90
96
  ...REPLICA_TABLES,
91
97
  ...MESSAGE_TABLES,
92
- ...SEARCH_TABLES,
98
+ ...READ_TABLES,
93
99
  ];
94
100
  const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
95
101
  const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
96
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})`;
97
104
  const READS = new Set([
98
- 'authored.queues',
105
+ 'authored.status',
106
+ 'authored.moving',
107
+ 'authored.pending',
108
+ 'authored.batch',
109
+ 'authored.order',
110
+ 'authored.queued',
99
111
  'authored.roomDrafts',
112
+ 'authored.chatDraft.read',
100
113
  'authored.chatDrafts',
101
114
  'authored.calls',
102
115
  'authored.fences',
116
+ 'authored.unsent',
103
117
  'authored.fact',
104
118
  'authored.file',
105
119
  'replica.open',
120
+ 'replica.rooms',
121
+ 'replica.room',
122
+ 'replica.covering',
123
+ 'replica.offline',
124
+ 'replica.held',
125
+ 'replica.facts',
126
+ 'replica.presentation',
106
127
  'replica.query',
128
+ 'replica.tallies',
107
129
  'replica.entries',
108
130
  'replica.typed',
109
131
  'replica.referrers',
110
- 'replica.walk',
111
- 'replica.files',
132
+ 'replica.folders',
112
133
  'replica.typedWithin',
113
- 'replica.counts',
114
- 'replica.search',
115
- 'replica.received',
116
- 'replica.receivedParts',
117
- 'replica.transferPart',
118
134
  'opened.find',
135
+ 'opened.held',
119
136
  'file.part',
120
137
  'conversation.held',
121
138
  'conversation.window',
122
139
  'conversation.count',
123
140
  'conversation.turn',
141
+ 'conversation.rows',
142
+ 'conversation.tallies',
143
+ 'conversation.facts',
144
+ 'conversation.stored',
145
+ 'read.stored',
124
146
  ]);
125
147
  const KINDS = new Set([
126
148
  ...READS,
@@ -132,27 +154,30 @@ const KINDS = new Set([
132
154
  'authored.claim',
133
155
  'authored.end',
134
156
  'replica.stage',
135
- 'replica.keepParts',
157
+ 'replica.resume',
136
158
  'replica.refresh',
137
159
  'replica.unrefresh',
138
160
  'replica.commit',
139
161
  'replica.fence',
140
162
  'replica.erase',
141
163
  'replica.abandon',
164
+ 'replica.unfence',
142
165
  'replica.release',
143
166
  'replica.rederive',
167
+ 'replica.demote',
144
168
  'replica.fact',
145
169
  'replica.present',
146
- 'replica.receive',
147
- 'replica.unreceive',
148
170
  'opened.begin',
149
171
  'opened.part',
150
172
  'opened.keep',
151
173
  'opened.drop',
152
174
  'opened.clean',
153
175
  'conversation.keep',
176
+ 'conversation.fact',
154
177
  'conversation.drop',
155
178
  'space.probe',
179
+ 'read.keep',
180
+ 'read.builds',
156
181
  ]);
157
182
  export function isRuntime(request) {
158
183
  return KINDS.has(request.kind);
@@ -225,29 +250,71 @@ function unowned(connection) {
225
250
  connection.run(UNOWNED_PARTS);
226
251
  }
227
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
+ ]));
228
266
  return {
229
- queues: connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
230
- locator: text(row.locator),
231
- ids: JSON.parse(text(row.ids)),
232
- })),
233
- pending: connection
234
- .rows('SELECT locator, id, batch, state FROM authored_pending')
235
- .map((row) => ({
236
- locator: text(row.locator),
237
- id: text(row.id),
238
- batch: text(row.batch),
239
- state: text(row.state),
240
- })),
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,
241
296
  };
242
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
+ }
243
313
  function heldOrder(connection, locator) {
244
314
  const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
245
315
  return held === undefined ? [] : JSON.parse(text(held.ids));
246
316
  }
247
- function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts, amendments }) {
248
- for (const { id, amendment } of amendments ?? []) {
249
- amended(connection, { kind: 'authored.amend', locator, id, amendment });
250
- }
317
+ function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts }) {
251
318
  for (const path of consumedRoomDrafts ?? []) {
252
319
  connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
253
320
  locator,
@@ -274,19 +341,26 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
274
341
  connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
275
342
  }
276
343
  }
277
- for (const { id, batch, state, files } of added ?? []) {
278
- if (before.has(id) || !after.has(id))
344
+ for (const { id, batch, state, files, paths, moving } of added ?? []) {
345
+ if (before.has(id))
279
346
  continue;
280
- connection.run('INSERT OR REPLACE INTO authored_pending (locator, id, batch, state, files) VALUES (?, ?, ?, ?, ?)', [locator, id, batch, state, owned(files)]);
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]);
281
348
  }
282
- for (const { id, batch, files } of founded ?? []) {
349
+ for (const { id, batch, files, paths, moving } of founded ?? []) {
283
350
  const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
284
351
  if (held === undefined || !before.has(id))
285
352
  continue;
286
- connection.run('UPDATE authored_pending SET batch = ?, files = ? WHERE locator = ? AND id = ?', [batch, owned([...JSON.parse(text(held.files)), ...files]), locator, id]);
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
+ ]);
287
361
  }
288
362
  }
289
- async function kept(connection, { writes, files, whole, discards }) {
363
+ async function kept(connection, { writes, files, whole }) {
290
364
  const refused = writes.find(({ locator }) => fenced(connection, locator));
291
365
  if (refused !== undefined && whole)
292
366
  return refused.locator;
@@ -295,8 +369,6 @@ async function kept(connection, { writes, files, whole, discards }) {
295
369
  if (!fenced(connection, write.locator))
296
370
  keptRows(connection, write);
297
371
  }
298
- for (const locator of discards ?? [])
299
- roomWork(connection, locator);
300
372
  unowned(connection);
301
373
  return refused?.locator ?? null;
302
374
  }
@@ -332,6 +404,25 @@ async function roomDraft(connection, { locator, path, kept: draft, files }) {
332
404
  unowned(connection);
333
405
  return null;
334
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
+ }
335
426
  function chatDraft(connection, { kept: drafts, dropped }) {
336
427
  for (const conversation of dropped) {
337
428
  connection.run('DELETE FROM authored_chat_drafts WHERE conversation = ?', [conversation]);
@@ -366,11 +457,15 @@ function fence(connection, locators) {
366
457
  return fenceRooms(connection, locators);
367
458
  }
368
459
  function erased(connection, { locator, limit }) {
369
- const done = erase(connection, locator, limit);
370
- if (locator !== null && !done.remaining) {
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) {
371
466
  connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
372
467
  }
373
- return done;
468
+ return erased;
374
469
  }
375
470
  function claim(connection, holder) {
376
471
  const held = fact(connection, 'holder');
@@ -381,7 +476,7 @@ function claim(connection, holder) {
381
476
  }
382
477
  function end(connection, holder) {
383
478
  ended(connection);
384
- forgottenMessages(connection);
479
+ forgottenConversations(connection);
385
480
  if (holder !== null && claim(connection, holder))
386
481
  return true;
387
482
  for (const [table] of TABLES)
@@ -433,9 +528,9 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
433
528
  if (fetched === null)
434
529
  return false;
435
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]);
436
- const whole = count(held?.parts) === parts &&
437
- count(held?.bytes) === byteLength &&
438
- (parts === 0 || (count(held?.first) === 0 && count(held?.last) === parts - 1));
531
+ const whole = count(held.parts) === parts &&
532
+ count(held.bytes) === byteLength &&
533
+ (parts === 0 || (count(held.first) === 0 && count(held.last) === parts - 1));
439
534
  if (!whole) {
440
535
  dropped(connection, key);
441
536
  return false;
@@ -449,56 +544,82 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
449
544
  unowned(connection);
450
545
  return true;
451
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
+ }
452
561
  function cleaned(connection) {
453
562
  connection.run('DELETE FROM opened_files');
454
- const [freed] = connection.rows(`SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS})`);
563
+ const freed = cleanable(connection);
455
564
  unowned(connection);
456
- return count(freed?.bytes);
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
+ };
457
574
  }
458
575
  async function committed(connection, { authored, rooms }) {
459
576
  const refused = authored === undefined ? null : await kept(connection, authored);
460
577
  if (refused !== null && authored?.whole === true) {
461
- return { fenced: refused, counts: {}, changed: {}, indexed: {} };
578
+ return { fenced: refused, changed: {}, indexed: {} };
462
579
  }
463
580
  return {
464
581
  fenced: refused,
465
582
  ...commit(connection, rooms.filter(({ locator }) => !fenced(connection, locator))),
466
583
  };
467
584
  }
468
- function receivedParts(connection, key, count) {
469
- return connection
470
- .rows('SELECT value FROM replica_received_parts WHERE key = ? AND part < ? ORDER BY part', [
471
- key,
472
- count,
473
- ])
474
- .map((row) => JSON.parse(text(row.value)));
475
- }
476
- function receive(connection, { key, head, part }) {
477
- connection.run('INSERT OR REPLACE INTO replica_received (key, head) VALUES (?, ?)', [key, head]);
478
- if (part !== undefined) {
479
- connection.run('INSERT OR REPLACE INTO replica_received_parts (key, part, value) VALUES (?, ?, ?)', [key, part.index, part.value]);
480
- }
481
- return null;
482
- }
483
- function unreceive(connection, keys) {
484
- for (const key of keys) {
485
- connection.run('DELETE FROM replica_received WHERE key = ?', [key]);
486
- connection.run('DELETE FROM replica_received_parts WHERE key = ?', [key]);
487
- }
488
- return null;
489
- }
490
585
  export function answerRuntime(connection, request, spool) {
491
586
  switch (request.kind) {
492
- case 'authored.queues':
493
- return queued(connection);
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');
494
611
  case 'authored.roomDrafts':
495
- return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
612
+ return roomDraftRecords(connection, request.locator, request.paths);
613
+ case 'authored.chatDraft.read':
614
+ return chatDraftRecord(connection, request.conversation);
496
615
  case 'authored.chatDrafts':
497
616
  return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
498
617
  case 'authored.calls':
499
618
  return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
500
619
  case 'authored.fences':
501
620
  return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
621
+ case 'authored.unsent':
622
+ return unsent(connection);
502
623
  case 'authored.fact':
503
624
  return fact(connection, request.name);
504
625
  case 'authored.file':
@@ -519,39 +640,43 @@ export function answerRuntime(connection, request, spool) {
519
640
  return end(connection, request.holder);
520
641
  case 'replica.open':
521
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);
522
662
  case 'replica.query':
523
663
  return answerQuery(connection, request.plan, request.rooms, request.budget);
664
+ case 'replica.tallies':
665
+ return roomTallies(connection, request.totals, request.rooms, request.since);
524
666
  case 'replica.entries':
525
667
  return entries(connection, request.key, request.view, request.paths);
526
668
  case 'replica.typed':
527
669
  return typed(connection, request.key, request.view, request.paths);
528
670
  case 'replica.referrers':
529
- return referrers(connection, request.key, request.view, request.targets, request.kinds);
530
- case 'replica.walk':
531
- return walk(connection, request.key, request.view, request.after, request.bytes);
532
- case 'replica.files':
533
- return files(connection, request.key, request.view, request.after, request.limit);
671
+ return referrers(connection, request.key, request.view, request.targets);
672
+ case 'replica.folders':
673
+ return folders(connection, request.key, request.paths);
534
674
  case 'replica.typedWithin':
535
675
  return typedWithin(connection, request.key, request.view, request.roots, request.within);
536
- case 'replica.counts':
537
- return counts(connection, request.rooms);
538
- case 'replica.search': {
539
- const { kind: _kind, ...ask } = request;
540
- return searched(connection, ask);
541
- }
542
- case 'replica.received':
543
- return connection.rows('SELECT key, head FROM replica_received').map((row) => ({
544
- key: text(row.key),
545
- head: JSON.parse(text(row.head)),
546
- }));
547
- case 'replica.receivedParts':
548
- return receivedParts(connection, request.key, request.count);
549
676
  case 'replica.stage':
550
677
  return fenced(connection, request.locator) ? null : stage(connection, request);
551
- case 'replica.transferPart':
552
- return transferPart(connection, request.locator, request.token);
553
- case 'replica.keepParts':
554
- return keepParts(connection, request.parts.filter(({ locator }) => !fenced(connection, locator)));
678
+ case 'replica.resume':
679
+ return fenced(connection, request.locator) ? null : resume(connection, request);
555
680
  case 'replica.refresh':
556
681
  return refreshing(connection, request);
557
682
  case 'replica.unrefresh':
@@ -563,11 +688,13 @@ export function answerRuntime(connection, request, spool) {
563
688
  case 'replica.erase':
564
689
  return erased(connection, request);
565
690
  case 'replica.abandon':
566
- return abandon(connection, request.locator, request.kept);
691
+ return abandon(connection, request.locator);
692
+ case 'replica.unfence':
693
+ return unfenced(connection, request.locators);
567
694
  case 'replica.release':
568
695
  return release(connection, request.key);
569
696
  case 'replica.rederive':
570
- return rederive(connection, request.key, request.composed, request.bytes);
697
+ return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
571
698
  case 'replica.fact':
572
699
  connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
573
700
  request.name,
@@ -580,10 +707,6 @@ export function answerRuntime(connection, request, spool) {
580
707
  request.value,
581
708
  ]);
582
709
  return null;
583
- case 'replica.receive':
584
- return receive(connection, request);
585
- case 'replica.unreceive':
586
- return unreceive(connection, request.keys);
587
710
  case 'opened.find':
588
711
  return openedFile(connection, request);
589
712
  case 'opened.begin':
@@ -596,29 +719,43 @@ export function answerRuntime(connection, request, spool) {
596
719
  return dropped(connection, request.key);
597
720
  case 'opened.clean':
598
721
  return cleaned(connection);
722
+ case 'opened.held':
723
+ return openedHeld(connection);
599
724
  case 'file.part':
600
725
  return filePart(connection, request.key, request.part);
601
726
  case 'conversation.held':
602
- return heldConversations(connection);
727
+ return heldConversations(connection, request.conversations);
603
728
  case 'conversation.keep': {
604
729
  const { kind: _kind, ...write } = request;
605
730
  return keptMessages(connection, write);
606
731
  }
607
732
  case 'conversation.window':
608
- return messageWindow(connection, request.conversation, request.limit, request.before);
733
+ return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
609
734
  case 'conversation.count':
610
- return messageCount(connection, request.conversation);
735
+ return messageCount(connection, request.conversation, request.phrase);
611
736
  case 'conversation.turn':
612
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);
613
750
  case 'conversation.drop':
614
- chatDraft(connection, {
615
- kind: 'authored.chatDraft',
616
- kept: [],
617
- dropped: request.conversations,
618
- });
619
- droppedMessages(connection, request.conversations);
620
- return null;
751
+ return droppedConversations(connection, request.conversations);
621
752
  case 'space.probe':
622
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);
623
760
  }
624
761
  }
@@ -0,0 +1,18 @@
1
+ import { type QueryRoom } from './compile.js';
2
+ import type { GroupTotal, Plan } from './query.js';
3
+ import type { Connection } from './tables.js';
4
+ export type RoomTally = {
5
+ readonly key: number;
6
+ readonly documents: GroupTotal;
7
+ readonly files: GroupTotal;
8
+ readonly documentTimes: readonly (readonly [string | null, string | null])[];
9
+ readonly chatTimes: readonly string[];
10
+ readonly messageTimes: readonly string[];
11
+ };
12
+ export type ConversationTally = {
13
+ readonly conversation: string;
14
+ readonly said: readonly string[];
15
+ };
16
+ export declare function roomTallies(connection: Connection, totals: Plan, rooms: readonly QueryRoom[], since: string): RoomTally[];
17
+ export declare function conversationTallies(connection: Connection, conversations: readonly string[] | null, since: string): ConversationTally[];
18
+ //# sourceMappingURL=tallies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tallies.d.ts","sourceRoot":"","sources":["../src/tallies.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAI1D,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;IAC7E,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAmHpG,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,KAAK,EAAE,MAAM,GACZ,SAAS,EAAE,CAwBb;AA0BD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,EACvC,KAAK,EAAE,MAAM,GACZ,iBAAiB,EAAE,CAerB"}