@agentshouse/mdruntime 0.1.0-cae97ad2e9142 → 0.1.0-caf080a9a9c60

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