@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.
- package/README.md +18 -17
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +299 -0
- package/dist/act-lanes.d.ts +30 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +225 -0
- package/dist/actions.d.ts +26 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +302 -0
- package/dist/adapter.d.ts +110 -112
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +3 -11
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +28 -51
- package/dist/bootstrap.d.ts +15 -18
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +252 -158
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chain.d.ts +2 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/change-set.d.ts +4 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +6 -0
- package/dist/change.d.ts +1 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +4 -2
- package/dist/chat-types.d.ts +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +11 -0
- package/dist/client.d.ts +27 -21
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +36 -17
- package/dist/collection.d.ts +23 -7
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +13 -19
- package/dist/compile.d.ts +8 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +288 -329
- package/dist/connection.d.ts +5 -143
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +109 -5104
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-live.d.ts +143 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +254 -0
- package/dist/conversation-row.d.ts +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +53 -0
- package/dist/conversation.d.ts +65 -48
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +987 -838
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +150 -0
- package/dist/durability.d.ts +19 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +4 -0
- package/dist/entry.d.ts +3 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +19 -9
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +21 -8
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +73 -40
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +34 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -5
- package/dist/install.d.ts +54 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +530 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +277 -0
- package/dist/listing.d.ts +48 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +139 -0
- package/dist/live.d.ts +5 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +64 -23
- package/dist/locks.d.ts +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +32 -0
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +49 -0
- package/dist/media.d.ts +2 -2
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +23 -13
- package/dist/memory.d.ts +17 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +210 -97
- package/dist/messages.d.ts +33 -5
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +104 -36
- package/dist/model.d.ts +2 -11
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -23
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +153 -0
- package/dist/observation.d.ts +4 -3
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +23 -17
- package/dist/opened.d.ts +1 -1
- package/dist/opened.d.ts.map +1 -1
- package/dist/opened.js +5 -5
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +53 -0
- package/dist/outcome.d.ts +7 -4
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +18 -0
- package/dist/overlay.d.ts +6 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +47 -21
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +4 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +13 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +26 -0
- package/dist/preparation.d.ts +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +227 -0
- package/dist/presence.d.ts +52 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +220 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +282 -0
- package/dist/query.d.ts +14 -210
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -505
- package/dist/questions.d.ts +29 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +115 -0
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +450 -0
- package/dist/reach.d.ts +15 -12
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +240 -149
- package/dist/react.d.ts +15 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/readiness.d.ts +4 -19
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +4 -10
- package/dist/reads.d.ts +38 -10
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +163 -85
- package/dist/recovery.d.ts +3 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +57 -1
- package/dist/refresh.d.ts +7 -5
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +35 -7
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +55 -0
- package/dist/replica.d.ts +12 -18
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +64 -34
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +24 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +142 -106
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +217 -0
- package/dist/rows.d.ts +14 -21
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +49 -186
- package/dist/runtime.d.ts +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +42 -84
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +349 -170
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +410 -0
- package/dist/search.d.ts +12 -63
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +9 -52
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -1
- package/dist/shared.d.ts +1 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +13 -105
- package/dist/shown.d.ts +33 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +302 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +28 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +103 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +67 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +164 -0
- package/dist/source.d.ts +54 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +82 -0
- package/dist/status.d.ts +4 -5
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -7
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +34 -0
- package/dist/store/readiness.d.ts +10 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +52 -0
- package/dist/store/records.d.ts +214 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +438 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +120 -171
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +166 -414
- package/dist/stored.d.ts +62 -57
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +317 -239
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +220 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +535 -0
- package/dist/tables.d.ts +126 -65
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +250 -113
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +128 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/validation.d.ts +3 -4
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +42 -100
- package/dist/windows.d.ts +1 -12
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -75
- package/dist/wire.d.ts +65 -9
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +22 -5
- package/package.json +3 -2
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/fulltext.d.ts +0 -27
- package/dist/fulltext.d.ts.map +0 -1
- package/dist/fulltext.js +0 -368
- package/dist/log.d.ts +0 -5
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/words.d.ts +0 -19
- package/dist/words.d.ts.map +0 -1
- 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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
-
...
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
|
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)
|
|
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 = ?', [
|
|
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
|
|
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
|
-
|
|
370
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
437
|
-
count(held
|
|
438
|
-
(parts === 0 || (count(held
|
|
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
|
|
563
|
+
const freed = cleanable(connection);
|
|
455
564
|
unowned(connection);
|
|
456
|
-
return
|
|
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,
|
|
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.
|
|
493
|
-
return
|
|
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
|
|
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
|
|
530
|
-
case 'replica.
|
|
531
|
-
return
|
|
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.
|
|
552
|
-
return
|
|
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
|
|
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
|
-
|
|
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"}
|