@agentshouse/mdruntime 0.1.0-cee9c8aa4cd86 → 0.1.0-cef76ea952695
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 +19 -17
- package/dist/acceptance.d.ts +6 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +385 -0
- package/dist/actions.d.ts +20 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +251 -0
- package/dist/adapter.d.ts +111 -109
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +5 -11
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +36 -47
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +22 -10
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +303 -123
- 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.d.ts +1 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +4 -2
- package/dist/chat-types.d.ts +5 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/client.d.ts +30 -14
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +61 -10
- package/dist/collection.d.ts +7 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +24 -19
- package/dist/compile.d.ts +6 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +290 -297
- package/dist/connection.d.ts +6 -142
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +105 -4827
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/{chat/context.js → context.js} +1 -4
- package/dist/conversation-live.d.ts +135 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +247 -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 +42 -46
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +901 -815
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +175 -0
- package/dist/durability.d.ts +15 -4
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +3 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +18 -8
- package/dist/expectation.d.ts +4 -2
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +33 -11
- package/dist/failure.d.ts +1 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +3 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/file.d.ts +2 -11
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +6 -4
- 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 +4 -6
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +59 -38
- 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 +30 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/install.d.ts +56 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +556 -0
- package/dist/job.d.ts +5 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +7 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +270 -0
- package/dist/listing.d.ts +53 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +176 -0
- package/dist/live.d.ts +5 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +63 -21
- package/dist/locks.d.ts +9 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +62 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +61 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +218 -0
- package/dist/memory.d.ts +13 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +219 -102
- package/dist/messages.d.ts +24 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +89 -31
- package/dist/model.d.ts +8 -10
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -18
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +197 -0
- package/dist/observation.d.ts +3 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +15 -15
- package/dist/opened.js +3 -3
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +60 -0
- package/dist/outcome.d.ts +17 -7
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +19 -5
- package/dist/overlay.d.ts +1 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +12 -1
- package/dist/parts.d.ts +11 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +21 -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 +233 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +272 -0
- package/dist/query.d.ts +19 -206
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -494
- package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
- package/dist/questions.d.ts.map +1 -0
- package/dist/{chat/questions.js → questions.js} +13 -2
- package/dist/reach.d.ts +20 -13
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +204 -135
- package/dist/react.d.ts +14 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +10 -1
- package/dist/{chat/read.d.ts → read.d.ts} +2 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/{chat/read.js → read.js} +4 -0
- package/dist/readiness.d.ts +12 -16
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +2 -8
- package/dist/reads.d.ts +36 -10
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +159 -83
- package/dist/recovery.d.ts +1 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +35 -1
- package/dist/refresh.d.ts +10 -4
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +92 -30
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +57 -0
- package/dist/replica.d.ts +11 -10
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +56 -23
- package/dist/room-draft.d.ts +22 -7
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +134 -54
- 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 +18 -16
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +45 -153
- package/dist/runtime.d.ts +43 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +7 -1
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +46 -27
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1005 -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 +31 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +290 -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 +20 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +77 -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/rooms.d.ts +44 -0
- package/dist/socket/rooms.d.ts.map +1 -0
- package/dist/socket/rooms.js +90 -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 +70 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +175 -0
- package/dist/source.d.ts +61 -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/fences.d.ts +16 -0
- package/dist/store/fences.d.ts.map +1 -0
- package/dist/store/fences.js +26 -0
- 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 +210 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +428 -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 +105 -149
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +143 -390
- package/dist/stored.d.ts +67 -49
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +358 -253
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +224 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +532 -0
- package/dist/tables.d.ts +140 -60
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +268 -101
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -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 +22 -10
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +9 -3
- package/package.json +12 -18
- package/AGENTS.md +0 -320
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/earlier.d.ts +0 -10
- package/dist/chat/earlier.d.ts.map +0 -1
- package/dist/chat/earlier.js +0 -54
- package/dist/chat/house.d.ts +0 -25
- package/dist/chat/house.d.ts.map +0 -1
- package/dist/chat/house.js +0 -38
- package/dist/chat/input.d.ts +0 -11
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -92
- package/dist/chat/kit.d.ts +0 -61
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -28
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -103
- package/dist/chat/markdown.d.ts +0 -21
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -246
- package/dist/chat/message.d.ts +0 -7
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -254
- package/dist/chat/messages.d.ts +0 -35
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -210
- package/dist/chat/name.d.ts +0 -7
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -12
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -19
- package/dist/chat/overlay.d.ts +0 -32
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -103
- package/dist/chat/parts.d.ts +0 -58
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -120
- package/dist/chat/pieces.d.ts +0 -62
- package/dist/chat/pieces.d.ts.map +0 -1
- package/dist/chat/pieces.js +0 -1110
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -70
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -635
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -69
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/ready.d.ts +0 -37
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -93
- package/dist/chat/room-file.d.ts +0 -8
- package/dist/chat/room-file.d.ts.map +0 -1
- package/dist/chat/room-file.js +0 -72
- package/dist/chat/steady.d.ts +0 -3
- package/dist/chat/steady.d.ts.map +0 -1
- package/dist/chat/steady.js +0 -26
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -307
- package/dist/chat.d.ts +0 -15
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- 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/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,15 +1,65 @@
|
|
|
1
|
+
import { sql } from '@agentshouse/mdmodel';
|
|
1
2
|
import { answerQuery } from './compile.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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';
|
|
7
|
+
const STATEMENTS_HELD = 256;
|
|
5
8
|
export function sqliteConnection(engine, database) {
|
|
6
9
|
const decoder = new TextDecoder();
|
|
10
|
+
const held = new Map();
|
|
11
|
+
database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
|
|
12
|
+
arity: 2,
|
|
13
|
+
deterministic: true,
|
|
14
|
+
});
|
|
15
|
+
function prepared(sql) {
|
|
16
|
+
if (sql.includes(';'))
|
|
17
|
+
return null;
|
|
18
|
+
const found = held.get(sql);
|
|
19
|
+
held.delete(sql);
|
|
20
|
+
const statement = found ?? database.prepare(sql);
|
|
21
|
+
held.set(sql, statement);
|
|
22
|
+
if (held.size > STATEMENTS_HELD) {
|
|
23
|
+
const [oldest, evicted] = held.entries().next().value;
|
|
24
|
+
held.delete(oldest);
|
|
25
|
+
evicted.finalize();
|
|
26
|
+
}
|
|
27
|
+
return statement;
|
|
28
|
+
}
|
|
29
|
+
function stepped(statement, bind, each) {
|
|
30
|
+
try {
|
|
31
|
+
if (bind.length > 0 && statement.parameterCount > 0)
|
|
32
|
+
statement.bind(bind);
|
|
33
|
+
while (statement.step())
|
|
34
|
+
each();
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
statement.resetNoThrow(true);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
7
40
|
return {
|
|
8
41
|
run(sql, bind = []) {
|
|
9
|
-
|
|
42
|
+
const statement = prepared(sql);
|
|
43
|
+
if (statement === null)
|
|
44
|
+
database.exec({ sql, bind });
|
|
45
|
+
else
|
|
46
|
+
stepped(statement, bind, () => { });
|
|
10
47
|
},
|
|
11
48
|
rows(sql, bind = []) {
|
|
12
|
-
|
|
49
|
+
const statement = prepared(sql);
|
|
50
|
+
if (statement === null) {
|
|
51
|
+
return database.exec({ sql, bind, rowMode: 'object', returnValue: 'resultRows' });
|
|
52
|
+
}
|
|
53
|
+
const names = statement.getColumnNames([]);
|
|
54
|
+
const rows = [];
|
|
55
|
+
stepped(statement, bind, () => {
|
|
56
|
+
const values = statement.get([]);
|
|
57
|
+
const row = Object.create(null);
|
|
58
|
+
for (const [index, name] of names.entries())
|
|
59
|
+
row[name] = values[index] ?? null;
|
|
60
|
+
rows.push(row);
|
|
61
|
+
});
|
|
62
|
+
return rows;
|
|
13
63
|
},
|
|
14
64
|
collate(name, compare) {
|
|
15
65
|
const answered = engine.capi.sqlite3_create_collation_v2(database.pointer, name, engine.capi.SQLITE_UTF8, 0, (_argument, leftLength, left, rightLength, right) => {
|
|
@@ -22,12 +72,13 @@ export function sqliteConnection(engine, database) {
|
|
|
22
72
|
};
|
|
23
73
|
}
|
|
24
74
|
export const FILE_PART_BYTES = 1_048_576;
|
|
75
|
+
const PROBE_BYTES = 4 * FILE_PART_BYTES;
|
|
25
76
|
const TABLES = [
|
|
26
77
|
['authored_facts', 'name TEXT PRIMARY KEY, value TEXT NOT NULL'],
|
|
27
78
|
['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
|
|
28
79
|
[
|
|
29
80
|
'authored_pending',
|
|
30
|
-
'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)',
|
|
31
82
|
],
|
|
32
83
|
[
|
|
33
84
|
'authored_room_drafts',
|
|
@@ -44,37 +95,52 @@ export const RUNTIME_TABLES = [
|
|
|
44
95
|
'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
|
|
45
96
|
...REPLICA_TABLES,
|
|
46
97
|
...MESSAGE_TABLES,
|
|
47
|
-
...
|
|
98
|
+
...READ_TABLES,
|
|
48
99
|
];
|
|
49
100
|
const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
|
|
50
101
|
const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
|
|
51
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})`;
|
|
52
104
|
const READS = new Set([
|
|
53
|
-
'authored.
|
|
105
|
+
'authored.status',
|
|
106
|
+
'authored.moving',
|
|
107
|
+
'authored.pending',
|
|
108
|
+
'authored.batch',
|
|
109
|
+
'authored.order',
|
|
110
|
+
'authored.queued',
|
|
54
111
|
'authored.roomDrafts',
|
|
112
|
+
'authored.chatDraft.read',
|
|
55
113
|
'authored.chatDrafts',
|
|
56
114
|
'authored.calls',
|
|
57
115
|
'authored.fences',
|
|
116
|
+
'authored.unsent',
|
|
58
117
|
'authored.fact',
|
|
59
118
|
'authored.file',
|
|
60
119
|
'replica.open',
|
|
120
|
+
'replica.rooms',
|
|
121
|
+
'replica.room',
|
|
122
|
+
'replica.covering',
|
|
123
|
+
'replica.offline',
|
|
124
|
+
'replica.held',
|
|
125
|
+
'replica.facts',
|
|
126
|
+
'replica.presentation',
|
|
61
127
|
'replica.query',
|
|
128
|
+
'replica.tallies',
|
|
62
129
|
'replica.entries',
|
|
63
130
|
'replica.typed',
|
|
64
131
|
'replica.referrers',
|
|
65
|
-
'replica.
|
|
66
|
-
'replica.files',
|
|
132
|
+
'replica.folders',
|
|
67
133
|
'replica.typedWithin',
|
|
68
|
-
'replica.counts',
|
|
69
|
-
'replica.search',
|
|
70
|
-
'replica.received',
|
|
71
|
-
'replica.receivedParts',
|
|
72
134
|
'opened.find',
|
|
135
|
+
'opened.held',
|
|
73
136
|
'file.part',
|
|
74
137
|
'conversation.held',
|
|
75
138
|
'conversation.window',
|
|
76
139
|
'conversation.count',
|
|
77
140
|
'conversation.turn',
|
|
141
|
+
'conversation.rows',
|
|
142
|
+
'conversation.tallies',
|
|
143
|
+
'read.stored',
|
|
78
144
|
]);
|
|
79
145
|
const KINDS = new Set([
|
|
80
146
|
...READS,
|
|
@@ -86,18 +152,19 @@ const KINDS = new Set([
|
|
|
86
152
|
'authored.claim',
|
|
87
153
|
'authored.end',
|
|
88
154
|
'replica.stage',
|
|
155
|
+
'replica.resume',
|
|
89
156
|
'replica.refresh',
|
|
90
157
|
'replica.unrefresh',
|
|
91
158
|
'replica.commit',
|
|
92
159
|
'replica.fence',
|
|
93
160
|
'replica.erase',
|
|
94
161
|
'replica.abandon',
|
|
162
|
+
'replica.unfence',
|
|
95
163
|
'replica.release',
|
|
96
164
|
'replica.rederive',
|
|
165
|
+
'replica.demote',
|
|
97
166
|
'replica.fact',
|
|
98
167
|
'replica.present',
|
|
99
|
-
'replica.receive',
|
|
100
|
-
'replica.unreceive',
|
|
101
168
|
'opened.begin',
|
|
102
169
|
'opened.part',
|
|
103
170
|
'opened.keep',
|
|
@@ -105,6 +172,9 @@ const KINDS = new Set([
|
|
|
105
172
|
'opened.clean',
|
|
106
173
|
'conversation.keep',
|
|
107
174
|
'conversation.drop',
|
|
175
|
+
'space.probe',
|
|
176
|
+
'read.keep',
|
|
177
|
+
'read.builds',
|
|
108
178
|
]);
|
|
109
179
|
export function isRuntime(request) {
|
|
110
180
|
return KINDS.has(request.kind);
|
|
@@ -177,29 +247,71 @@ function unowned(connection) {
|
|
|
177
247
|
connection.run(UNOWNED_PARTS);
|
|
178
248
|
}
|
|
179
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
|
+
]));
|
|
263
|
+
return {
|
|
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
|
+
}),
|
|
271
|
+
};
|
|
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]);
|
|
180
290
|
return {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
ids: JSON.parse(text(row.ids)),
|
|
184
|
-
})),
|
|
185
|
-
pending: connection
|
|
186
|
-
.rows('SELECT locator, id, batch, state FROM authored_pending')
|
|
187
|
-
.map((row) => ({
|
|
188
|
-
locator: text(row.locator),
|
|
189
|
-
id: text(row.id),
|
|
190
|
-
batch: text(row.batch),
|
|
191
|
-
state: text(row.state),
|
|
192
|
-
})),
|
|
291
|
+
state: held === undefined ? null : text(held.state),
|
|
292
|
+
room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
|
|
193
293
|
};
|
|
194
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
|
+
}
|
|
195
310
|
function heldOrder(connection, locator) {
|
|
196
311
|
const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
|
|
197
312
|
return held === undefined ? [] : JSON.parse(text(held.ids));
|
|
198
313
|
}
|
|
199
|
-
function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts
|
|
200
|
-
for (const { id, amendment } of amendments ?? []) {
|
|
201
|
-
amended(connection, { kind: 'authored.amend', locator, id, amendment });
|
|
202
|
-
}
|
|
314
|
+
function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts }) {
|
|
203
315
|
for (const path of consumedRoomDrafts ?? []) {
|
|
204
316
|
connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
|
|
205
317
|
locator,
|
|
@@ -226,19 +338,26 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
|
|
|
226
338
|
connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
227
339
|
}
|
|
228
340
|
}
|
|
229
|
-
for (const { id, batch, state, files } of added ?? []) {
|
|
230
|
-
if (before.has(id)
|
|
341
|
+
for (const { id, batch, state, files, paths, moving } of added ?? []) {
|
|
342
|
+
if (before.has(id))
|
|
231
343
|
continue;
|
|
232
|
-
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]);
|
|
233
345
|
}
|
|
234
|
-
for (const { id, batch, files } of founded ?? []) {
|
|
346
|
+
for (const { id, batch, files, paths, moving } of founded ?? []) {
|
|
235
347
|
const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
236
348
|
if (held === undefined || !before.has(id))
|
|
237
349
|
continue;
|
|
238
|
-
connection.run('UPDATE authored_pending SET batch = ?, files = ? WHERE locator = ? AND 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
|
+
]);
|
|
239
358
|
}
|
|
240
359
|
}
|
|
241
|
-
async function kept(connection, { writes, files, whole
|
|
360
|
+
async function kept(connection, { writes, files, whole }) {
|
|
242
361
|
const refused = writes.find(({ locator }) => fenced(connection, locator));
|
|
243
362
|
if (refused !== undefined && whole)
|
|
244
363
|
return refused.locator;
|
|
@@ -247,8 +366,6 @@ async function kept(connection, { writes, files, whole, discards }) {
|
|
|
247
366
|
if (!fenced(connection, write.locator))
|
|
248
367
|
keptRows(connection, write);
|
|
249
368
|
}
|
|
250
|
-
for (const locator of discards ?? [])
|
|
251
|
-
roomWork(connection, locator);
|
|
252
369
|
unowned(connection);
|
|
253
370
|
return refused?.locator ?? null;
|
|
254
371
|
}
|
|
@@ -318,11 +435,15 @@ function fence(connection, locators) {
|
|
|
318
435
|
return fenceRooms(connection, locators);
|
|
319
436
|
}
|
|
320
437
|
function erased(connection, { locator, limit }) {
|
|
321
|
-
|
|
322
|
-
|
|
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) {
|
|
323
444
|
connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
|
|
324
445
|
}
|
|
325
|
-
return
|
|
446
|
+
return erased;
|
|
326
447
|
}
|
|
327
448
|
function claim(connection, holder) {
|
|
328
449
|
const held = fact(connection, 'holder');
|
|
@@ -385,9 +506,9 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
385
506
|
if (fetched === null)
|
|
386
507
|
return false;
|
|
387
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]);
|
|
388
|
-
const whole = count(held
|
|
389
|
-
count(held
|
|
390
|
-
(parts === 0 || (count(held
|
|
509
|
+
const whole = count(held.parts) === parts &&
|
|
510
|
+
count(held.bytes) === byteLength &&
|
|
511
|
+
(parts === 0 || (count(held.first) === 0 && count(held.last) === parts - 1));
|
|
391
512
|
if (!whole) {
|
|
392
513
|
dropped(connection, key);
|
|
393
514
|
return false;
|
|
@@ -401,56 +522,82 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
401
522
|
unowned(connection);
|
|
402
523
|
return true;
|
|
403
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
|
+
}
|
|
404
539
|
function cleaned(connection) {
|
|
405
540
|
connection.run('DELETE FROM opened_files');
|
|
406
|
-
const
|
|
541
|
+
const freed = cleanable(connection);
|
|
407
542
|
unowned(connection);
|
|
408
|
-
return
|
|
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
|
+
};
|
|
409
552
|
}
|
|
410
553
|
async function committed(connection, { authored, rooms }) {
|
|
411
554
|
const refused = authored === undefined ? null : await kept(connection, authored);
|
|
412
555
|
if (refused !== null && authored?.whole === true) {
|
|
413
|
-
return { fenced: refused,
|
|
556
|
+
return { fenced: refused, changed: {}, indexed: {} };
|
|
414
557
|
}
|
|
415
558
|
return {
|
|
416
559
|
fenced: refused,
|
|
417
560
|
...commit(connection, rooms.filter(({ locator }) => !fenced(connection, locator))),
|
|
418
561
|
};
|
|
419
562
|
}
|
|
420
|
-
function receivedParts(connection, key, count) {
|
|
421
|
-
return connection
|
|
422
|
-
.rows('SELECT value FROM replica_received_parts WHERE key = ? AND part < ? ORDER BY part', [
|
|
423
|
-
key,
|
|
424
|
-
count,
|
|
425
|
-
])
|
|
426
|
-
.map((row) => JSON.parse(text(row.value)));
|
|
427
|
-
}
|
|
428
|
-
function receive(connection, { key, head, part }) {
|
|
429
|
-
connection.run('INSERT OR REPLACE INTO replica_received (key, head) VALUES (?, ?)', [key, head]);
|
|
430
|
-
if (part !== undefined) {
|
|
431
|
-
connection.run('INSERT OR REPLACE INTO replica_received_parts (key, part, value) VALUES (?, ?, ?)', [key, part.index, part.value]);
|
|
432
|
-
}
|
|
433
|
-
return null;
|
|
434
|
-
}
|
|
435
|
-
function unreceive(connection, keys) {
|
|
436
|
-
for (const key of keys) {
|
|
437
|
-
connection.run('DELETE FROM replica_received WHERE key = ?', [key]);
|
|
438
|
-
connection.run('DELETE FROM replica_received_parts WHERE key = ?', [key]);
|
|
439
|
-
}
|
|
440
|
-
return null;
|
|
441
|
-
}
|
|
442
563
|
export function answerRuntime(connection, request, spool) {
|
|
443
564
|
switch (request.kind) {
|
|
444
|
-
case 'authored.
|
|
445
|
-
return
|
|
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');
|
|
446
589
|
case 'authored.roomDrafts':
|
|
447
|
-
return
|
|
590
|
+
return roomDraftRecords(connection, request.locator, request.paths);
|
|
591
|
+
case 'authored.chatDraft.read':
|
|
592
|
+
return chatDraftRecord(connection, request.conversation);
|
|
448
593
|
case 'authored.chatDrafts':
|
|
449
594
|
return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
|
|
450
595
|
case 'authored.calls':
|
|
451
596
|
return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
|
|
452
597
|
case 'authored.fences':
|
|
453
598
|
return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
|
|
599
|
+
case 'authored.unsent':
|
|
600
|
+
return unsent(connection);
|
|
454
601
|
case 'authored.fact':
|
|
455
602
|
return fact(connection, request.name);
|
|
456
603
|
case 'authored.file':
|
|
@@ -471,35 +618,43 @@ export function answerRuntime(connection, request, spool) {
|
|
|
471
618
|
return end(connection, request.holder);
|
|
472
619
|
case 'replica.open':
|
|
473
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);
|
|
474
640
|
case 'replica.query':
|
|
475
641
|
return answerQuery(connection, request.plan, request.rooms, request.budget);
|
|
642
|
+
case 'replica.tallies':
|
|
643
|
+
return roomTallies(connection, request.totals, request.rooms, request.since);
|
|
476
644
|
case 'replica.entries':
|
|
477
645
|
return entries(connection, request.key, request.view, request.paths);
|
|
478
646
|
case 'replica.typed':
|
|
479
647
|
return typed(connection, request.key, request.view, request.paths);
|
|
480
648
|
case 'replica.referrers':
|
|
481
|
-
return referrers(connection, request.key, request.view, request.targets
|
|
482
|
-
case 'replica.
|
|
483
|
-
return
|
|
484
|
-
case 'replica.files':
|
|
485
|
-
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);
|
|
486
652
|
case 'replica.typedWithin':
|
|
487
653
|
return typedWithin(connection, request.key, request.view, request.roots, request.within);
|
|
488
|
-
case 'replica.counts':
|
|
489
|
-
return counts(connection, request.rooms);
|
|
490
|
-
case 'replica.search': {
|
|
491
|
-
const { kind: _kind, ...ask } = request;
|
|
492
|
-
return searched(connection, ask);
|
|
493
|
-
}
|
|
494
|
-
case 'replica.received':
|
|
495
|
-
return connection.rows('SELECT key, head FROM replica_received').map((row) => ({
|
|
496
|
-
key: text(row.key),
|
|
497
|
-
head: JSON.parse(text(row.head)),
|
|
498
|
-
}));
|
|
499
|
-
case 'replica.receivedParts':
|
|
500
|
-
return receivedParts(connection, request.key, request.count);
|
|
501
654
|
case 'replica.stage':
|
|
502
655
|
return fenced(connection, request.locator) ? null : stage(connection, request);
|
|
656
|
+
case 'replica.resume':
|
|
657
|
+
return fenced(connection, request.locator) ? null : resume(connection, request);
|
|
503
658
|
case 'replica.refresh':
|
|
504
659
|
return refreshing(connection, request);
|
|
505
660
|
case 'replica.unrefresh':
|
|
@@ -511,11 +666,13 @@ export function answerRuntime(connection, request, spool) {
|
|
|
511
666
|
case 'replica.erase':
|
|
512
667
|
return erased(connection, request);
|
|
513
668
|
case 'replica.abandon':
|
|
514
|
-
return abandon(connection, request.locator
|
|
669
|
+
return abandon(connection, request.locator);
|
|
670
|
+
case 'replica.unfence':
|
|
671
|
+
return unfenced(connection, request.locators);
|
|
515
672
|
case 'replica.release':
|
|
516
673
|
return release(connection, request.key);
|
|
517
674
|
case 'replica.rederive':
|
|
518
|
-
return rederive(connection, request.key, request.
|
|
675
|
+
return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
|
|
519
676
|
case 'replica.fact':
|
|
520
677
|
connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
|
|
521
678
|
request.name,
|
|
@@ -528,10 +685,6 @@ export function answerRuntime(connection, request, spool) {
|
|
|
528
685
|
request.value,
|
|
529
686
|
]);
|
|
530
687
|
return null;
|
|
531
|
-
case 'replica.receive':
|
|
532
|
-
return receive(connection, request);
|
|
533
|
-
case 'replica.unreceive':
|
|
534
|
-
return unreceive(connection, request.keys);
|
|
535
688
|
case 'opened.find':
|
|
536
689
|
return openedFile(connection, request);
|
|
537
690
|
case 'opened.begin':
|
|
@@ -544,20 +697,26 @@ export function answerRuntime(connection, request, spool) {
|
|
|
544
697
|
return dropped(connection, request.key);
|
|
545
698
|
case 'opened.clean':
|
|
546
699
|
return cleaned(connection);
|
|
700
|
+
case 'opened.held':
|
|
701
|
+
return openedHeld(connection);
|
|
547
702
|
case 'file.part':
|
|
548
703
|
return filePart(connection, request.key, request.part);
|
|
549
704
|
case 'conversation.held':
|
|
550
|
-
return heldConversations(connection);
|
|
705
|
+
return heldConversations(connection, request.conversations);
|
|
551
706
|
case 'conversation.keep': {
|
|
552
707
|
const { kind: _kind, ...write } = request;
|
|
553
708
|
return keptMessages(connection, write);
|
|
554
709
|
}
|
|
555
710
|
case 'conversation.window':
|
|
556
|
-
return messageWindow(connection, request.conversation, request.limit, request.before);
|
|
711
|
+
return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
|
|
557
712
|
case 'conversation.count':
|
|
558
|
-
return messageCount(connection, request.conversation);
|
|
713
|
+
return messageCount(connection, request.conversation, request.phrase);
|
|
559
714
|
case 'conversation.turn':
|
|
560
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);
|
|
561
720
|
case 'conversation.drop':
|
|
562
721
|
chatDraft(connection, {
|
|
563
722
|
kind: 'authored.chatDraft',
|
|
@@ -566,5 +725,13 @@ export function answerRuntime(connection, request, spool) {
|
|
|
566
725
|
});
|
|
567
726
|
droppedMessages(connection, request.conversations);
|
|
568
727
|
return null;
|
|
728
|
+
case 'space.probe':
|
|
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);
|
|
569
736
|
}
|
|
570
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"}
|