@agentshouse/mdruntime 0.1.0-ce41fec66d91b → 0.1.0-ce46f015571d6
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 +10 -10
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +318 -0
- package/dist/act-lanes.d.ts +29 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +177 -0
- package/dist/actions.d.ts +25 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +261 -0
- package/dist/adapter.d.ts +71 -69
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +3 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +21 -56
- 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 +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 +25 -14
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +32 -14
- package/dist/collection.d.ts +23 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +12 -2
- package/dist/compile.d.ts +6 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +240 -315
- package/dist/connection.d.ts +5 -141
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +110 -5057
- 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 +138 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +249 -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 +54 -45
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +930 -899
- 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 +153 -0
- package/dist/durability.d.ts +18 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +2 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +17 -7
- 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 +20 -6
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +61 -30
- 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 +31 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -3
- package/dist/install.d.ts +54 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +539 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +279 -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 +63 -21
- package/dist/locks.d.ts +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +33 -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 +50 -0
- package/dist/media.d.ts +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +4 -4
- package/dist/memory.d.ts +8 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +83 -26
- package/dist/messages.d.ts +24 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +92 -32
- 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 +156 -0
- package/dist/observation.d.ts +2 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +14 -14
- 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 +59 -0
- package/dist/outcome.d.ts +7 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +18 -0
- package/dist/overlay.d.ts +3 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +43 -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 +11 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +21 -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 +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +233 -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 +270 -0
- package/dist/query.d.ts +13 -209
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -505
- package/dist/questions.d.ts +34 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +122 -0
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +455 -0
- package/dist/reach.d.ts +14 -12
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +193 -121
- 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 +0 -3
- package/dist/readiness.d.ts.map +1 -1
- 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 +9 -2
- 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 -16
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +64 -30
- 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 +7 -8
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +100 -103
- 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 +36 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +41 -86
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +239 -116
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +413 -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 -6
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +13 -95
- package/dist/shown.d.ts +32 -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 +21 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +80 -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 +68 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +171 -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 +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 +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 +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +430 -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 +112 -145
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +167 -365
- package/dist/stored.d.ts +59 -33
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +279 -190
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +223 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +540 -0
- package/dist/tables.d.ts +116 -29
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +213 -54
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +8 -5
- 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 +57 -5
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +19 -3
- 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 -370
- package/dist/words.d.ts +0 -19
- package/dist/words.d.ts.map +0 -1
- package/dist/words.js +0 -156
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 { conversationRows, droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
|
|
4
|
+
import { keptRead, READ_TABLES, readsOfOtherBuildsForgotten, storedRead, } from './reads.js';
|
|
5
|
+
import { conversationTallies, roomTallies, } from './tallies.js';
|
|
6
|
+
import { abandon, release, commit, covering, demoted, ended, entries, erase, facts, fenceRooms, folders, heldLocators, heldRoom, heldRooms, offlineMode, opened, overlaid, presentation, rederive, referrers, refreshing, REPLICA_TABLES, resume, stage, typed, stagedLocators, typedWithin, unrefresh, } from './stored.js';
|
|
5
7
|
const STATEMENTS_HELD = 256;
|
|
6
8
|
export function sqliteConnection(engine, database) {
|
|
7
9
|
const decoder = new TextDecoder();
|
|
8
10
|
const held = new Map();
|
|
11
|
+
database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
|
|
12
|
+
arity: 2,
|
|
13
|
+
deterministic: true,
|
|
14
|
+
});
|
|
9
15
|
function prepared(sql) {
|
|
10
16
|
if (sql.includes(';'))
|
|
11
17
|
return null;
|
|
@@ -72,7 +78,7 @@ const TABLES = [
|
|
|
72
78
|
['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
|
|
73
79
|
[
|
|
74
80
|
'authored_pending',
|
|
75
|
-
'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, PRIMARY KEY (locator, id)',
|
|
81
|
+
'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, paths TEXT NOT NULL, moving INTEGER NOT NULL, PRIMARY KEY (locator, id)',
|
|
76
82
|
],
|
|
77
83
|
[
|
|
78
84
|
'authored_room_drafts',
|
|
@@ -89,35 +95,52 @@ export const RUNTIME_TABLES = [
|
|
|
89
95
|
'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
|
|
90
96
|
...REPLICA_TABLES,
|
|
91
97
|
...MESSAGE_TABLES,
|
|
92
|
-
...
|
|
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.files',
|
|
111
132
|
'replica.folders',
|
|
112
133
|
'replica.typedWithin',
|
|
113
|
-
'replica.counts',
|
|
114
|
-
'replica.search',
|
|
115
134
|
'opened.find',
|
|
135
|
+
'opened.held',
|
|
116
136
|
'file.part',
|
|
117
137
|
'conversation.held',
|
|
118
138
|
'conversation.window',
|
|
119
139
|
'conversation.count',
|
|
120
140
|
'conversation.turn',
|
|
141
|
+
'conversation.rows',
|
|
142
|
+
'conversation.tallies',
|
|
143
|
+
'read.stored',
|
|
121
144
|
]);
|
|
122
145
|
const KINDS = new Set([
|
|
123
146
|
...READS,
|
|
@@ -129,14 +152,17 @@ const KINDS = new Set([
|
|
|
129
152
|
'authored.claim',
|
|
130
153
|
'authored.end',
|
|
131
154
|
'replica.stage',
|
|
155
|
+
'replica.resume',
|
|
132
156
|
'replica.refresh',
|
|
133
157
|
'replica.unrefresh',
|
|
134
158
|
'replica.commit',
|
|
135
159
|
'replica.fence',
|
|
136
160
|
'replica.erase',
|
|
137
161
|
'replica.abandon',
|
|
162
|
+
'replica.unfence',
|
|
138
163
|
'replica.release',
|
|
139
164
|
'replica.rederive',
|
|
165
|
+
'replica.demote',
|
|
140
166
|
'replica.fact',
|
|
141
167
|
'replica.present',
|
|
142
168
|
'opened.begin',
|
|
@@ -147,6 +173,8 @@ const KINDS = new Set([
|
|
|
147
173
|
'conversation.keep',
|
|
148
174
|
'conversation.drop',
|
|
149
175
|
'space.probe',
|
|
176
|
+
'read.keep',
|
|
177
|
+
'read.builds',
|
|
150
178
|
]);
|
|
151
179
|
export function isRuntime(request) {
|
|
152
180
|
return KINDS.has(request.kind);
|
|
@@ -219,21 +247,66 @@ function unowned(connection) {
|
|
|
219
247
|
connection.run(UNOWNED_PARTS);
|
|
220
248
|
}
|
|
221
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
|
+
]));
|
|
222
263
|
return {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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'),
|
|
235
286
|
};
|
|
236
287
|
}
|
|
288
|
+
function pendingOf(connection, locator, id) {
|
|
289
|
+
const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
290
|
+
return {
|
|
291
|
+
state: held === undefined ? null : text(held.state),
|
|
292
|
+
room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
function roomDraftRecords(connection, locator, paths) {
|
|
296
|
+
if (locator === null) {
|
|
297
|
+
return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
|
|
298
|
+
}
|
|
299
|
+
if (paths === null) {
|
|
300
|
+
return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ?', [locator]), 'record');
|
|
301
|
+
}
|
|
302
|
+
return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ? AND path IN (SELECT value FROM json_each(?))', [locator, JSON.stringify(paths)]), 'record');
|
|
303
|
+
}
|
|
304
|
+
function chatDraftRecord(connection, conversation) {
|
|
305
|
+
const [held] = connection.rows('SELECT record FROM authored_chat_drafts WHERE conversation = ?', [
|
|
306
|
+
conversation,
|
|
307
|
+
]);
|
|
308
|
+
return held === undefined ? null : text(held.record);
|
|
309
|
+
}
|
|
237
310
|
function heldOrder(connection, locator) {
|
|
238
311
|
const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
|
|
239
312
|
return held === undefined ? [] : JSON.parse(text(held.ids));
|
|
@@ -265,19 +338,26 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
|
|
|
265
338
|
connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
266
339
|
}
|
|
267
340
|
}
|
|
268
|
-
for (const { id, batch, state, files } of added ?? []) {
|
|
269
|
-
if (before.has(id)
|
|
341
|
+
for (const { id, batch, state, files, paths, moving } of added ?? []) {
|
|
342
|
+
if (before.has(id))
|
|
270
343
|
continue;
|
|
271
|
-
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]);
|
|
272
345
|
}
|
|
273
|
-
for (const { id, batch, files } of founded ?? []) {
|
|
346
|
+
for (const { id, batch, files, paths, moving } of founded ?? []) {
|
|
274
347
|
const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
275
348
|
if (held === undefined || !before.has(id))
|
|
276
349
|
continue;
|
|
277
|
-
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
|
+
]);
|
|
278
358
|
}
|
|
279
359
|
}
|
|
280
|
-
async function kept(connection, { writes, files, whole
|
|
360
|
+
async function kept(connection, { writes, files, whole }) {
|
|
281
361
|
const refused = writes.find(({ locator }) => fenced(connection, locator));
|
|
282
362
|
if (refused !== undefined && whole)
|
|
283
363
|
return refused.locator;
|
|
@@ -286,8 +366,6 @@ async function kept(connection, { writes, files, whole, discards }) {
|
|
|
286
366
|
if (!fenced(connection, write.locator))
|
|
287
367
|
keptRows(connection, write);
|
|
288
368
|
}
|
|
289
|
-
for (const locator of discards ?? [])
|
|
290
|
-
roomWork(connection, locator);
|
|
291
369
|
unowned(connection);
|
|
292
370
|
return refused?.locator ?? null;
|
|
293
371
|
}
|
|
@@ -357,11 +435,15 @@ function fence(connection, locators) {
|
|
|
357
435
|
return fenceRooms(connection, locators);
|
|
358
436
|
}
|
|
359
437
|
function erased(connection, { locator, limit }) {
|
|
360
|
-
|
|
361
|
-
|
|
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) {
|
|
362
444
|
connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
|
|
363
445
|
}
|
|
364
|
-
return
|
|
446
|
+
return erased;
|
|
365
447
|
}
|
|
366
448
|
function claim(connection, holder) {
|
|
367
449
|
const held = fact(connection, 'holder');
|
|
@@ -424,9 +506,9 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
424
506
|
if (fetched === null)
|
|
425
507
|
return false;
|
|
426
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]);
|
|
427
|
-
const whole = count(held
|
|
428
|
-
count(held
|
|
429
|
-
(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));
|
|
430
512
|
if (!whole) {
|
|
431
513
|
dropped(connection, key);
|
|
432
514
|
return false;
|
|
@@ -440,16 +522,38 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
440
522
|
unowned(connection);
|
|
441
523
|
return true;
|
|
442
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
|
+
}
|
|
443
539
|
function cleaned(connection) {
|
|
444
540
|
connection.run('DELETE FROM opened_files');
|
|
445
|
-
const
|
|
541
|
+
const freed = cleanable(connection);
|
|
446
542
|
unowned(connection);
|
|
447
|
-
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
|
+
};
|
|
448
552
|
}
|
|
449
553
|
async function committed(connection, { authored, rooms }) {
|
|
450
554
|
const refused = authored === undefined ? null : await kept(connection, authored);
|
|
451
555
|
if (refused !== null && authored?.whole === true) {
|
|
452
|
-
return { fenced: refused,
|
|
556
|
+
return { fenced: refused, changed: {}, indexed: {} };
|
|
453
557
|
}
|
|
454
558
|
return {
|
|
455
559
|
fenced: refused,
|
|
@@ -458,16 +562,42 @@ async function committed(connection, { authored, rooms }) {
|
|
|
458
562
|
}
|
|
459
563
|
export function answerRuntime(connection, request, spool) {
|
|
460
564
|
switch (request.kind) {
|
|
461
|
-
case 'authored.
|
|
462
|
-
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');
|
|
463
589
|
case 'authored.roomDrafts':
|
|
464
|
-
return
|
|
590
|
+
return roomDraftRecords(connection, request.locator, request.paths);
|
|
591
|
+
case 'authored.chatDraft.read':
|
|
592
|
+
return chatDraftRecord(connection, request.conversation);
|
|
465
593
|
case 'authored.chatDrafts':
|
|
466
594
|
return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
|
|
467
595
|
case 'authored.calls':
|
|
468
596
|
return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
|
|
469
597
|
case 'authored.fences':
|
|
470
598
|
return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
|
|
599
|
+
case 'authored.unsent':
|
|
600
|
+
return unsent(connection);
|
|
471
601
|
case 'authored.fact':
|
|
472
602
|
return fact(connection, request.name);
|
|
473
603
|
case 'authored.file':
|
|
@@ -488,28 +618,43 @@ export function answerRuntime(connection, request, spool) {
|
|
|
488
618
|
return end(connection, request.holder);
|
|
489
619
|
case 'replica.open':
|
|
490
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);
|
|
491
640
|
case 'replica.query':
|
|
492
641
|
return answerQuery(connection, request.plan, request.rooms, request.budget);
|
|
642
|
+
case 'replica.tallies':
|
|
643
|
+
return roomTallies(connection, request.totals, request.rooms, request.since);
|
|
493
644
|
case 'replica.entries':
|
|
494
645
|
return entries(connection, request.key, request.view, request.paths);
|
|
495
646
|
case 'replica.typed':
|
|
496
647
|
return typed(connection, request.key, request.view, request.paths);
|
|
497
648
|
case 'replica.referrers':
|
|
498
|
-
return referrers(connection, request.key, request.view, request.targets
|
|
499
|
-
case 'replica.files':
|
|
500
|
-
return files(connection, request.key, request.view, request.after, request.limit);
|
|
649
|
+
return referrers(connection, request.key, request.view, request.targets);
|
|
501
650
|
case 'replica.folders':
|
|
502
|
-
return folders(connection, request.key, request.
|
|
651
|
+
return folders(connection, request.key, request.paths);
|
|
503
652
|
case 'replica.typedWithin':
|
|
504
653
|
return typedWithin(connection, request.key, request.view, request.roots, request.within);
|
|
505
|
-
case 'replica.counts':
|
|
506
|
-
return counts(connection, request.rooms);
|
|
507
|
-
case 'replica.search': {
|
|
508
|
-
const { kind: _kind, ...ask } = request;
|
|
509
|
-
return searched(connection, ask);
|
|
510
|
-
}
|
|
511
654
|
case 'replica.stage':
|
|
512
655
|
return fenced(connection, request.locator) ? null : stage(connection, request);
|
|
656
|
+
case 'replica.resume':
|
|
657
|
+
return fenced(connection, request.locator) ? null : resume(connection, request);
|
|
513
658
|
case 'replica.refresh':
|
|
514
659
|
return refreshing(connection, request);
|
|
515
660
|
case 'replica.unrefresh':
|
|
@@ -522,6 +667,8 @@ export function answerRuntime(connection, request, spool) {
|
|
|
522
667
|
return erased(connection, request);
|
|
523
668
|
case 'replica.abandon':
|
|
524
669
|
return abandon(connection, request.locator);
|
|
670
|
+
case 'replica.unfence':
|
|
671
|
+
return unfenced(connection, request.locators);
|
|
525
672
|
case 'replica.release':
|
|
526
673
|
return release(connection, request.key);
|
|
527
674
|
case 'replica.rederive':
|
|
@@ -550,20 +697,26 @@ export function answerRuntime(connection, request, spool) {
|
|
|
550
697
|
return dropped(connection, request.key);
|
|
551
698
|
case 'opened.clean':
|
|
552
699
|
return cleaned(connection);
|
|
700
|
+
case 'opened.held':
|
|
701
|
+
return openedHeld(connection);
|
|
553
702
|
case 'file.part':
|
|
554
703
|
return filePart(connection, request.key, request.part);
|
|
555
704
|
case 'conversation.held':
|
|
556
|
-
return heldConversations(connection);
|
|
705
|
+
return heldConversations(connection, request.conversations);
|
|
557
706
|
case 'conversation.keep': {
|
|
558
707
|
const { kind: _kind, ...write } = request;
|
|
559
708
|
return keptMessages(connection, write);
|
|
560
709
|
}
|
|
561
710
|
case 'conversation.window':
|
|
562
|
-
return messageWindow(connection, request.conversation, request.limit, request.before);
|
|
711
|
+
return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
|
|
563
712
|
case 'conversation.count':
|
|
564
|
-
return messageCount(connection, request.conversation);
|
|
713
|
+
return messageCount(connection, request.conversation, request.phrase);
|
|
565
714
|
case 'conversation.turn':
|
|
566
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);
|
|
567
720
|
case 'conversation.drop':
|
|
568
721
|
chatDraft(connection, {
|
|
569
722
|
kind: 'authored.chatDraft',
|
|
@@ -574,5 +727,11 @@ export function answerRuntime(connection, request, spool) {
|
|
|
574
727
|
return null;
|
|
575
728
|
case 'space.probe':
|
|
576
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);
|
|
577
736
|
}
|
|
578
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"}
|
package/dist/tallies.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { instantKey, sql } from '@agentshouse/mdmodel';
|
|
2
|
+
import { CHAT_MESSAGE_TYPE, CHAT_TYPE } from './chat-types.js';
|
|
3
|
+
import { answerQuery, VISIBLE, within } from './compile.js';
|
|
4
|
+
import { HOUSE_DIRECTORY } from './figures.js';
|
|
5
|
+
const NONE = { count: 0, size: 0 };
|
|
6
|
+
const { all, fragment, joined } = sql;
|
|
7
|
+
function instant(value) {
|
|
8
|
+
return typeof value === 'string' ? value : null;
|
|
9
|
+
}
|
|
10
|
+
function held(alias, keys) {
|
|
11
|
+
const reserved = within(alias, HOUSE_DIRECTORY);
|
|
12
|
+
return all([
|
|
13
|
+
fragment(`${alias}.key IN (SELECT value FROM json_each(?))`, [JSON.stringify(keys)]),
|
|
14
|
+
fragment(VISIBLE(alias)),
|
|
15
|
+
fragment(`NOT ${reserved.sql}`, reserved.bind),
|
|
16
|
+
]);
|
|
17
|
+
}
|
|
18
|
+
function valued(alias, document, field) {
|
|
19
|
+
return joined([
|
|
20
|
+
fragment(`${alias}.doc = ${document}.id AND `),
|
|
21
|
+
sql.grouped(sql.placed(alias, field, 'exact')),
|
|
22
|
+
fragment(` AND ${alias}.item = -1`),
|
|
23
|
+
], '');
|
|
24
|
+
}
|
|
25
|
+
function inboxed(card) {
|
|
26
|
+
return joined([
|
|
27
|
+
fragment('EXISTS (SELECT 1 FROM replica_values i WHERE '),
|
|
28
|
+
valued('i', card, '/inbox'),
|
|
29
|
+
fragment(" AND i.kind = 'string')"),
|
|
30
|
+
], '');
|
|
31
|
+
}
|
|
32
|
+
function rowsOf(connection, query) {
|
|
33
|
+
return connection.rows(query.sql, query.bind);
|
|
34
|
+
}
|
|
35
|
+
function documentTimes(connection, keys, since) {
|
|
36
|
+
return rowsOf(connection, joined([
|
|
37
|
+
fragment('SELECT d.key AS key, d.created_instant AS created, d.changed_instant AS changed FROM replica_entries d WHERE '),
|
|
38
|
+
held('d', keys),
|
|
39
|
+
fragment(" AND d.binary IS NULL AND COALESCE(d.type, '') NOT IN (?, ?) AND (d.created_instant >= ? OR d.changed_instant >= ?)", [CHAT_TYPE, CHAT_MESSAGE_TYPE, since, since]),
|
|
40
|
+
], ''));
|
|
41
|
+
}
|
|
42
|
+
function chatTimes(connection, keys, since) {
|
|
43
|
+
return rowsOf(connection, joined([
|
|
44
|
+
fragment('SELECT d.key AS key, d.created_instant AS at FROM replica_entries d WHERE '),
|
|
45
|
+
held('d', keys),
|
|
46
|
+
fragment(' AND d.type = ? AND d.created_instant >= ? AND ', [CHAT_TYPE, since]),
|
|
47
|
+
inboxed('d'),
|
|
48
|
+
], ''));
|
|
49
|
+
}
|
|
50
|
+
function messageTimes(connection, keys, since) {
|
|
51
|
+
return rowsOf(connection, joined([
|
|
52
|
+
fragment('SELECT m.key AS key, s.instant AS at FROM replica_entries m JOIN replica_values s ON '),
|
|
53
|
+
valued('s', 'm', '/sent_at'),
|
|
54
|
+
fragment(' AND s.instant >= ? JOIN replica_values r ON ', [since]),
|
|
55
|
+
valued('r', 'm', '/direction'),
|
|
56
|
+
fragment(" AND r.kind = 'string' AND r.value = 'in' WHERE "),
|
|
57
|
+
held('m', keys),
|
|
58
|
+
fragment(` AND m.type = ? AND EXISTS (SELECT 1 FROM replica_entries c WHERE c.key = m.key AND c.type = ? AND ${VISIBLE('c')} AND c.folder = m.folder AND `, [CHAT_MESSAGE_TYPE, CHAT_TYPE]),
|
|
59
|
+
inboxed('c'),
|
|
60
|
+
fragment(')'),
|
|
61
|
+
], ''));
|
|
62
|
+
}
|
|
63
|
+
function byKey(rows, read) {
|
|
64
|
+
const kept = new Map();
|
|
65
|
+
for (const row of rows) {
|
|
66
|
+
const key = Number(row.key);
|
|
67
|
+
const list = kept.get(key) ?? [];
|
|
68
|
+
list.push(read(row));
|
|
69
|
+
kept.set(key, list);
|
|
70
|
+
}
|
|
71
|
+
return kept;
|
|
72
|
+
}
|
|
73
|
+
export function roomTallies(connection, totals, rooms, since) {
|
|
74
|
+
const keys = rooms.map(({ key }) => key);
|
|
75
|
+
const from = instantKey(since);
|
|
76
|
+
const answered = answerQuery(connection, totals, rooms);
|
|
77
|
+
const summed = new Map(('groups' in answered ? answered.groups : []).map((group) => [String(group.key[0]), group]));
|
|
78
|
+
const documents = byKey(documentTimes(connection, keys, from), (row) => [instant(row.created), instant(row.changed)]);
|
|
79
|
+
const chats = byKey(chatTimes(connection, keys, from), (row) => instant(row.at));
|
|
80
|
+
const messages = byKey(messageTimes(connection, keys, from), (row) => instant(row.at));
|
|
81
|
+
return rooms.map(({ locator, key }) => {
|
|
82
|
+
const total = summed.get(locator);
|
|
83
|
+
return {
|
|
84
|
+
key,
|
|
85
|
+
documents: total?.documents ?? NONE,
|
|
86
|
+
files: total?.files ?? NONE,
|
|
87
|
+
documentTimes: documents.get(key) ?? [],
|
|
88
|
+
chatTimes: chats.get(key) ?? [],
|
|
89
|
+
messageTimes: messages.get(key) ?? [],
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const ACCEPTED = "message ->> '$.accepted_at'";
|
|
94
|
+
const NEWER = 'ORDER BY n.position DESC, n.identity DESC LIMIT 1';
|
|
95
|
+
const SAID = `WITH RECURSIVE
|
|
96
|
+
named(conversation) AS (SELECT value FROM json_each(?)),
|
|
97
|
+
walk(conversation, position, identity, at, role) AS (
|
|
98
|
+
SELECT m.conversation, m.position, m.identity, m.${ACCEPTED}, m.message ->> '$.role'
|
|
99
|
+
FROM named JOIN conversation_messages m ON m.id = (
|
|
100
|
+
SELECT n.id FROM conversation_messages n WHERE n.conversation = named.conversation ${NEWER}
|
|
101
|
+
)
|
|
102
|
+
UNION ALL
|
|
103
|
+
SELECT m.conversation, m.position, m.identity, m.${ACCEPTED}, m.message ->> '$.role'
|
|
104
|
+
FROM walk JOIN conversation_messages m ON m.id = (
|
|
105
|
+
SELECT n.id FROM conversation_messages n WHERE n.conversation = walk.conversation
|
|
106
|
+
AND (n.position < walk.position OR (n.position = walk.position AND n.identity < walk.identity))
|
|
107
|
+
${NEWER}
|
|
108
|
+
)
|
|
109
|
+
WHERE julianday(walk.at) >= julianday(?)
|
|
110
|
+
)
|
|
111
|
+
SELECT walk.conversation AS conversation, walk.at AS at
|
|
112
|
+
FROM walk
|
|
113
|
+
WHERE walk.role IN ('user', 'assistant') AND julianday(walk.at) >= julianday(?)`;
|
|
114
|
+
export function conversationTallies(connection, conversations, since) {
|
|
115
|
+
const named = conversations ??
|
|
116
|
+
connection
|
|
117
|
+
.rows('SELECT DISTINCT conversation FROM conversation_messages')
|
|
118
|
+
.map((row) => String(row.conversation));
|
|
119
|
+
const from = instantKey(since);
|
|
120
|
+
const said = new Map();
|
|
121
|
+
for (const row of connection.rows(SAID, [JSON.stringify(named), since, since])) {
|
|
122
|
+
const at = instantKey(row.at);
|
|
123
|
+
if (at === null || at < from)
|
|
124
|
+
continue;
|
|
125
|
+
const conversation = String(row.conversation);
|
|
126
|
+
said.set(conversation, [...(said.get(conversation) ?? []), at]);
|
|
127
|
+
}
|
|
128
|
+
return named.map((conversation) => ({ conversation, said: said.get(conversation) ?? [] }));
|
|
129
|
+
}
|
package/dist/validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,UAAU,EAGhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM5E,KAAK,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,IAAI,GAAG,CACjB,KAAK,EAAE,MAAM,GAAG,IAAI,KACjB,OAAO,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAEtF,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAwBvF,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,UAAU,CAAC,CA6CrB;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1F,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CAChF,CAAC;AAkBF,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,UAAU,CAAC,CAgCrB"}
|
package/dist/validation.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { assess, parse, parseFrontmatter, verdicts, } from '@agentshouse/mdmodel';
|
|
2
|
-
import { selected } from './collection.js';
|
|
2
|
+
import { definitionsAt, selected } from './collection.js';
|
|
3
3
|
import { paced, ROW_WEIGHT, yielded } from './turn.js';
|
|
4
4
|
const NO_TYPES = { types: {} };
|
|
5
5
|
function modelOf(model) {
|
|
6
6
|
return model.status === 'unavailable' ? NO_TYPES : { types: model.types };
|
|
7
7
|
}
|
|
8
|
-
function typedText(
|
|
9
|
-
const read = parse(content);
|
|
8
|
+
function typedText(read) {
|
|
10
9
|
return read.ok && read.document.type !== undefined && read.document.type !== 'any';
|
|
11
10
|
}
|
|
12
11
|
function partVerdict(part) {
|
|
@@ -28,10 +27,14 @@ export async function validatedCollection(walk, lookup, composition) {
|
|
|
28
27
|
if (content === null)
|
|
29
28
|
continue;
|
|
30
29
|
const part = partOf(path);
|
|
31
|
-
|
|
30
|
+
const parsed = parse(content, path, definitionsAt(composition, path));
|
|
31
|
+
if (part.model.status === 'unavailable' && part.unmodeled === null && typedText(parsed)) {
|
|
32
32
|
part.unmodeled = path;
|
|
33
33
|
}
|
|
34
|
-
const assessment = assess(path,
|
|
34
|
+
const assessment = assess(path, parsed, false, modelOf(part.model), {
|
|
35
|
+
anyRoom: true,
|
|
36
|
+
typedPaths: composition.typedPaths,
|
|
37
|
+
});
|
|
35
38
|
assessed.push({ part, assessment });
|
|
36
39
|
await pace(content.length + assessment.targets.length * ROW_WEIGHT);
|
|
37
40
|
}
|