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