@agentshouse/mdruntime 0.1.0-cd9e28a590f84 → 0.1.0-cdded6c080913
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 +1 -1
- package/dist/acceptance.d.ts +6 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +389 -0
- package/dist/actions.d.ts +20 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +250 -0
- package/dist/adapter.d.ts +23 -25
- 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 +8 -4
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +209 -78
- 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/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 +17 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/collection.d.ts +2 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/compile.d.ts +7 -7
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +229 -301
- package/dist/connection.d.ts +5 -141
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +98 -5279
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -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 +16 -6
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +366 -216
- 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 -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 -8
- package/dist/figures.d.ts +48 -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 +2 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +22 -15
- 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 +19 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/install.d.ts +56 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +560 -0
- package/dist/job.d.ts +33 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +54 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +267 -0
- package/dist/listing.d.ts +53 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +175 -0
- package/dist/live.d.ts +5 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +62 -20
- package/dist/locks.d.ts +9 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +61 -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/memory.d.ts +4 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +43 -4
- package/dist/messages.d.ts +25 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +84 -5
- package/dist/model.d.ts +2 -9
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -9
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +193 -0
- package/dist/observation.d.ts +2 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +7 -2
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +56 -0
- package/dist/outcome.d.ts +4 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +3 -0
- package/dist/overlay.d.ts +1 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +11 -0
- package/dist/parts.d.ts +59 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +118 -0
- package/dist/preparation.d.ts +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +226 -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 +13 -212
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -524
- package/dist/questions.d.ts +34 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +122 -0
- package/dist/reach.d.ts +12 -10
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +165 -109
- package/dist/react.d.ts +9 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/reads.d.ts +36 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +150 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +9 -1
- package/dist/refresh.d.ts +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +8 -20
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +56 -0
- package/dist/replica.d.ts +8 -8
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +50 -18
- package/dist/room-draft.d.ts +2 -2
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +216 -0
- package/dist/rows.d.ts +14 -22
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +48 -189
- package/dist/runtime.d.ts +42 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +11 -8
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1004 -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 -0
- package/dist/shown.d.ts +31 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +294 -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 +43 -0
- package/dist/socket/rooms.d.ts.map +1 -0
- package/dist/socket/rooms.js +90 -0
- package/dist/socket/session.d.ts +39 -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 +81 -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/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 +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +408 -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 +43 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +57 -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 +107 -153
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +143 -396
- package/dist/stored.d.ts +58 -64
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +244 -156
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +222 -0
- package/dist/sync.d.ts +20 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +531 -0
- package/dist/tables.d.ts +110 -48
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +209 -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 +7 -4
- 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 +16 -1
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +6 -0
- package/package.json +2 -2
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- 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,17 @@
|
|
|
1
|
+
import { sql } from '@agentshouse/mdmodel';
|
|
1
2
|
import { answerQuery } from './compile.js';
|
|
2
|
-
import { droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { conversationRows, droppedMessages, forgottenMessages, heldConversations, jobMarkers, 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();
|
|
9
|
-
database.createFunction(HOLDS_PHRASE, holdsPhrase, {
|
|
11
|
+
database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
|
|
12
|
+
arity: 2,
|
|
13
|
+
deterministic: true,
|
|
14
|
+
});
|
|
10
15
|
function prepared(sql) {
|
|
11
16
|
if (sql.includes(';'))
|
|
12
17
|
return null;
|
|
@@ -73,7 +78,7 @@ const TABLES = [
|
|
|
73
78
|
['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
|
|
74
79
|
[
|
|
75
80
|
'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)',
|
|
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)',
|
|
77
82
|
],
|
|
78
83
|
[
|
|
79
84
|
'authored_room_drafts',
|
|
@@ -90,34 +95,53 @@ export const RUNTIME_TABLES = [
|
|
|
90
95
|
'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
|
|
91
96
|
...REPLICA_TABLES,
|
|
92
97
|
...MESSAGE_TABLES,
|
|
98
|
+
...READ_TABLES,
|
|
93
99
|
];
|
|
94
100
|
const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
|
|
95
101
|
const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
|
|
96
102
|
const UNOWNED_PARTS = `DELETE FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS} UNION SELECT key FROM opened_files)`;
|
|
103
|
+
const CLEANABLE_BYTES = `SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS})`;
|
|
97
104
|
const READS = new Set([
|
|
98
|
-
'authored.
|
|
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.wanted',
|
|
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.jobs',
|
|
143
|
+
'conversation.tallies',
|
|
144
|
+
'read.stored',
|
|
121
145
|
]);
|
|
122
146
|
const KINDS = new Set([
|
|
123
147
|
...READS,
|
|
@@ -129,17 +153,17 @@ const KINDS = new Set([
|
|
|
129
153
|
'authored.claim',
|
|
130
154
|
'authored.end',
|
|
131
155
|
'replica.stage',
|
|
156
|
+
'replica.resume',
|
|
132
157
|
'replica.refresh',
|
|
133
158
|
'replica.unrefresh',
|
|
134
159
|
'replica.commit',
|
|
135
160
|
'replica.fence',
|
|
136
161
|
'replica.erase',
|
|
137
162
|
'replica.abandon',
|
|
163
|
+
'replica.unfence',
|
|
138
164
|
'replica.release',
|
|
139
165
|
'replica.rederive',
|
|
140
|
-
'replica.
|
|
141
|
-
'replica.remember',
|
|
142
|
-
'replica.unhold',
|
|
166
|
+
'replica.demote',
|
|
143
167
|
'replica.fact',
|
|
144
168
|
'replica.present',
|
|
145
169
|
'opened.begin',
|
|
@@ -150,6 +174,8 @@ const KINDS = new Set([
|
|
|
150
174
|
'conversation.keep',
|
|
151
175
|
'conversation.drop',
|
|
152
176
|
'space.probe',
|
|
177
|
+
'read.keep',
|
|
178
|
+
'read.builds',
|
|
153
179
|
]);
|
|
154
180
|
export function isRuntime(request) {
|
|
155
181
|
return KINDS.has(request.kind);
|
|
@@ -222,21 +248,66 @@ function unowned(connection) {
|
|
|
222
248
|
connection.run(UNOWNED_PARTS);
|
|
223
249
|
}
|
|
224
250
|
function queued(connection) {
|
|
251
|
+
return connection.rows('SELECT locator, ids FROM authored_queues').map((row) => ({
|
|
252
|
+
locator: text(row.locator),
|
|
253
|
+
ids: JSON.parse(text(row.ids)),
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
function heldWork(connection, locator) {
|
|
257
|
+
const room = heldRoom(connection, locator);
|
|
258
|
+
const pending = new Map(connection
|
|
259
|
+
.rows('SELECT id, batch, state FROM authored_pending WHERE locator = ?', [locator])
|
|
260
|
+
.map((row) => [
|
|
261
|
+
text(row.id),
|
|
262
|
+
{ id: text(row.id), batch: text(row.batch), state: text(row.state) },
|
|
263
|
+
]));
|
|
225
264
|
return {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
265
|
+
room: room === null ? null : { ...room, overlaid: overlaid(connection, room.key) },
|
|
266
|
+
queue: heldOrder(connection, locator).map((id) => {
|
|
267
|
+
const held = pending.get(id);
|
|
268
|
+
if (held === undefined)
|
|
269
|
+
throw new Error(`Missing Pending Change ${locator}/${id}`);
|
|
270
|
+
return held;
|
|
271
|
+
}),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function status(connection) {
|
|
275
|
+
const [completed] = connection.rows("SELECT value FROM replica_facts WHERE name = 'lastCompleted'");
|
|
276
|
+
return {
|
|
277
|
+
queued: texts(connection.rows('SELECT locator FROM authored_queues'), 'locator'),
|
|
278
|
+
lastCompleted: completed === undefined ? null : text(completed.value),
|
|
279
|
+
changes: connection
|
|
280
|
+
.rows('SELECT p.locator, c.value AS path FROM authored_pending p, json_each(p.paths) c')
|
|
281
|
+
.map((row) => ({ locator: text(row.locator), path: text(row.path) })),
|
|
282
|
+
resets: connection
|
|
283
|
+
.rows(`SELECT locator, json_extract(state, '$.submission.reset') AS reset FROM authored_pending
|
|
284
|
+
WHERE json_extract(state, '$.submission.state') = 'reset'`)
|
|
285
|
+
.map((row) => ({ locator: text(row.locator), reset: text(row.reset) })),
|
|
286
|
+
returned: texts(connection.rows(`SELECT record FROM authored_room_drafts WHERE json_type(record, '$.returned') = 'object'`), 'record'),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
function pendingOf(connection, locator, id) {
|
|
290
|
+
const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
291
|
+
return {
|
|
292
|
+
state: held === undefined ? null : text(held.state),
|
|
293
|
+
room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
|
|
238
294
|
};
|
|
239
295
|
}
|
|
296
|
+
function roomDraftRecords(connection, locator, paths) {
|
|
297
|
+
if (locator === null) {
|
|
298
|
+
return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
|
|
299
|
+
}
|
|
300
|
+
if (paths === null) {
|
|
301
|
+
return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ?', [locator]), 'record');
|
|
302
|
+
}
|
|
303
|
+
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');
|
|
304
|
+
}
|
|
305
|
+
function chatDraftRecord(connection, conversation) {
|
|
306
|
+
const [held] = connection.rows('SELECT record FROM authored_chat_drafts WHERE conversation = ?', [
|
|
307
|
+
conversation,
|
|
308
|
+
]);
|
|
309
|
+
return held === undefined ? null : text(held.record);
|
|
310
|
+
}
|
|
240
311
|
function heldOrder(connection, locator) {
|
|
241
312
|
const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
|
|
242
313
|
return held === undefined ? [] : JSON.parse(text(held.ids));
|
|
@@ -268,19 +339,26 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
|
|
|
268
339
|
connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
269
340
|
}
|
|
270
341
|
}
|
|
271
|
-
for (const { id, batch, state, files } of added ?? []) {
|
|
342
|
+
for (const { id, batch, state, files, paths, moving } of added ?? []) {
|
|
272
343
|
if (before.has(id) || !after.has(id))
|
|
273
344
|
continue;
|
|
274
|
-
connection.run('INSERT OR REPLACE INTO authored_pending (locator, id, batch, state, files) VALUES (?, ?, ?, ?, ?)', [locator, id, batch, state, owned(files)]);
|
|
345
|
+
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]);
|
|
275
346
|
}
|
|
276
|
-
for (const { id, batch, files } of founded ?? []) {
|
|
347
|
+
for (const { id, batch, files, paths, moving } of founded ?? []) {
|
|
277
348
|
const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
278
349
|
if (held === undefined || !before.has(id))
|
|
279
350
|
continue;
|
|
280
|
-
connection.run('UPDATE authored_pending SET batch = ?, files = ? WHERE locator = ? AND id = ?', [
|
|
351
|
+
connection.run('UPDATE authored_pending SET batch = ?, files = ?, paths = ?, moving = ? WHERE locator = ? AND id = ?', [
|
|
352
|
+
batch,
|
|
353
|
+
owned([...JSON.parse(text(held.files)), ...files]),
|
|
354
|
+
JSON.stringify(paths),
|
|
355
|
+
moving ? 1 : 0,
|
|
356
|
+
locator,
|
|
357
|
+
id,
|
|
358
|
+
]);
|
|
281
359
|
}
|
|
282
360
|
}
|
|
283
|
-
async function kept(connection, { writes, files, whole
|
|
361
|
+
async function kept(connection, { writes, files, whole }) {
|
|
284
362
|
const refused = writes.find(({ locator }) => fenced(connection, locator));
|
|
285
363
|
if (refused !== undefined && whole)
|
|
286
364
|
return refused.locator;
|
|
@@ -289,8 +367,6 @@ async function kept(connection, { writes, files, whole, discards }) {
|
|
|
289
367
|
if (!fenced(connection, write.locator))
|
|
290
368
|
keptRows(connection, write);
|
|
291
369
|
}
|
|
292
|
-
for (const locator of discards ?? [])
|
|
293
|
-
roomWork(connection, locator);
|
|
294
370
|
unowned(connection);
|
|
295
371
|
return refused?.locator ?? null;
|
|
296
372
|
}
|
|
@@ -360,11 +436,15 @@ function fence(connection, locators) {
|
|
|
360
436
|
return fenceRooms(connection, locators);
|
|
361
437
|
}
|
|
362
438
|
function erased(connection, { locator, limit }) {
|
|
363
|
-
|
|
364
|
-
|
|
439
|
+
return erase(connection, locator, limit);
|
|
440
|
+
}
|
|
441
|
+
function unfenced(connection, locators) {
|
|
442
|
+
const erased = locators.filter((locator) => connection.rows('SELECT 1 FROM replica_erasing WHERE locator = ? LIMIT 1', [locator])
|
|
443
|
+
.length === 0);
|
|
444
|
+
for (const locator of erased) {
|
|
365
445
|
connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
|
|
366
446
|
}
|
|
367
|
-
return
|
|
447
|
+
return erased;
|
|
368
448
|
}
|
|
369
449
|
function claim(connection, holder) {
|
|
370
450
|
const held = fact(connection, 'holder');
|
|
@@ -443,16 +523,38 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
443
523
|
unowned(connection);
|
|
444
524
|
return true;
|
|
445
525
|
}
|
|
526
|
+
const UNSENT = [
|
|
527
|
+
['pending-change', 'authored_pending'],
|
|
528
|
+
['call', 'authored_calls'],
|
|
529
|
+
['room-draft', 'authored_room_drafts'],
|
|
530
|
+
['chat-draft', 'authored_chat_drafts'],
|
|
531
|
+
];
|
|
532
|
+
function unsent(connection) {
|
|
533
|
+
const [held] = connection.rows(`SELECT ${UNSENT.map(([kind, table]) => `(SELECT count(*) FROM ${table}) AS "${kind}"`).join(', ')}`);
|
|
534
|
+
return UNSENT.map(([kind]) => ({ kind, count: count(held?.[kind]) })).filter((work) => work.count > 0);
|
|
535
|
+
}
|
|
536
|
+
function cleanable(connection) {
|
|
537
|
+
const [held] = connection.rows(CLEANABLE_BYTES);
|
|
538
|
+
return count(held?.bytes);
|
|
539
|
+
}
|
|
446
540
|
function cleaned(connection) {
|
|
447
541
|
connection.run('DELETE FROM opened_files');
|
|
448
|
-
const
|
|
542
|
+
const freed = cleanable(connection);
|
|
449
543
|
unowned(connection);
|
|
450
|
-
return
|
|
544
|
+
return freed;
|
|
545
|
+
}
|
|
546
|
+
function openedHeld(connection) {
|
|
547
|
+
return {
|
|
548
|
+
rooms: connection
|
|
549
|
+
.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')
|
|
550
|
+
.map((row) => ({ room: text(row.locator), count: count(row.files), size: count(row.bytes) })),
|
|
551
|
+
cleanable: cleanable(connection),
|
|
552
|
+
};
|
|
451
553
|
}
|
|
452
554
|
async function committed(connection, { authored, rooms }) {
|
|
453
555
|
const refused = authored === undefined ? null : await kept(connection, authored);
|
|
454
556
|
if (refused !== null && authored?.whole === true) {
|
|
455
|
-
return { fenced: refused,
|
|
557
|
+
return { fenced: refused, changed: {}, indexed: {} };
|
|
456
558
|
}
|
|
457
559
|
return {
|
|
458
560
|
fenced: refused,
|
|
@@ -461,16 +563,42 @@ async function committed(connection, { authored, rooms }) {
|
|
|
461
563
|
}
|
|
462
564
|
export function answerRuntime(connection, request, spool) {
|
|
463
565
|
switch (request.kind) {
|
|
464
|
-
case 'authored.
|
|
465
|
-
return
|
|
566
|
+
case 'authored.status':
|
|
567
|
+
return status(connection);
|
|
568
|
+
case 'authored.moving':
|
|
569
|
+
return {
|
|
570
|
+
queues: queued(connection),
|
|
571
|
+
pending: connection
|
|
572
|
+
.rows('SELECT locator, id, batch, state FROM authored_pending WHERE moving = 1 ORDER BY locator')
|
|
573
|
+
.map((row) => ({
|
|
574
|
+
locator: text(row.locator),
|
|
575
|
+
id: text(row.id),
|
|
576
|
+
batch: text(row.batch),
|
|
577
|
+
state: text(row.state),
|
|
578
|
+
})),
|
|
579
|
+
};
|
|
580
|
+
case 'authored.pending':
|
|
581
|
+
return pendingOf(connection, request.locator, request.id);
|
|
582
|
+
case 'authored.batch': {
|
|
583
|
+
const [held] = connection.rows('SELECT batch FROM authored_pending WHERE locator = ? AND id = ?', [request.locator, request.id]);
|
|
584
|
+
return held === undefined ? null : text(held.batch);
|
|
585
|
+
}
|
|
586
|
+
case 'authored.order':
|
|
587
|
+
return heldOrder(connection, request.locator);
|
|
588
|
+
case 'authored.queued':
|
|
589
|
+
return texts(connection.rows('SELECT locator FROM authored_queues'), 'locator');
|
|
466
590
|
case 'authored.roomDrafts':
|
|
467
|
-
return
|
|
591
|
+
return roomDraftRecords(connection, request.locator, request.paths);
|
|
592
|
+
case 'authored.chatDraft.read':
|
|
593
|
+
return chatDraftRecord(connection, request.conversation);
|
|
468
594
|
case 'authored.chatDrafts':
|
|
469
595
|
return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
|
|
470
596
|
case 'authored.calls':
|
|
471
597
|
return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
|
|
472
598
|
case 'authored.fences':
|
|
473
599
|
return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
|
|
600
|
+
case 'authored.unsent':
|
|
601
|
+
return unsent(connection);
|
|
474
602
|
case 'authored.fact':
|
|
475
603
|
return fact(connection, request.name);
|
|
476
604
|
case 'authored.file':
|
|
@@ -491,24 +619,43 @@ export function answerRuntime(connection, request, spool) {
|
|
|
491
619
|
return end(connection, request.holder);
|
|
492
620
|
case 'replica.open':
|
|
493
621
|
return opened(connection);
|
|
622
|
+
case 'replica.rooms':
|
|
623
|
+
return heldRooms(connection, request.locators);
|
|
624
|
+
case 'replica.room':
|
|
625
|
+
return heldWork(connection, request.locator);
|
|
626
|
+
case 'replica.covering':
|
|
627
|
+
return {
|
|
628
|
+
rooms: covering(connection),
|
|
629
|
+
queues: queued(connection),
|
|
630
|
+
};
|
|
631
|
+
case 'replica.offline':
|
|
632
|
+
return offlineMode(connection, request.locator);
|
|
633
|
+
case 'replica.held':
|
|
634
|
+
return { held: heldLocators(connection), staged: stagedLocators(connection) };
|
|
635
|
+
case 'replica.demote':
|
|
636
|
+
return demoted(connection);
|
|
637
|
+
case 'replica.facts':
|
|
638
|
+
return facts(connection);
|
|
639
|
+
case 'replica.presentation':
|
|
640
|
+
return presentation(connection, request.app);
|
|
494
641
|
case 'replica.query':
|
|
495
642
|
return answerQuery(connection, request.plan, request.rooms, request.budget);
|
|
643
|
+
case 'replica.tallies':
|
|
644
|
+
return roomTallies(connection, request.totals, request.rooms, request.since);
|
|
496
645
|
case 'replica.entries':
|
|
497
646
|
return entries(connection, request.key, request.view, request.paths);
|
|
498
647
|
case 'replica.typed':
|
|
499
648
|
return typed(connection, request.key, request.view, request.paths);
|
|
500
649
|
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);
|
|
650
|
+
return referrers(connection, request.key, request.view, request.targets);
|
|
504
651
|
case 'replica.folders':
|
|
505
652
|
return folders(connection, request.key, request.view, request.paths);
|
|
506
653
|
case 'replica.typedWithin':
|
|
507
654
|
return typedWithin(connection, request.key, request.view, request.roots, request.within);
|
|
508
|
-
case 'replica.counts':
|
|
509
|
-
return counts(connection, request.rooms);
|
|
510
655
|
case 'replica.stage':
|
|
511
656
|
return fenced(connection, request.locator) ? null : stage(connection, request);
|
|
657
|
+
case 'replica.resume':
|
|
658
|
+
return fenced(connection, request.locator) ? null : resume(connection, request);
|
|
512
659
|
case 'replica.refresh':
|
|
513
660
|
return refreshing(connection, request);
|
|
514
661
|
case 'replica.unrefresh':
|
|
@@ -521,18 +668,12 @@ export function answerRuntime(connection, request, spool) {
|
|
|
521
668
|
return erased(connection, request);
|
|
522
669
|
case 'replica.abandon':
|
|
523
670
|
return abandon(connection, request.locator);
|
|
671
|
+
case 'replica.unfence':
|
|
672
|
+
return unfenced(connection, request.locators);
|
|
524
673
|
case 'replica.release':
|
|
525
674
|
return release(connection, request.key);
|
|
526
675
|
case 'replica.rederive':
|
|
527
676
|
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
677
|
case 'replica.fact':
|
|
537
678
|
connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
|
|
538
679
|
request.name,
|
|
@@ -557,10 +698,12 @@ export function answerRuntime(connection, request, spool) {
|
|
|
557
698
|
return dropped(connection, request.key);
|
|
558
699
|
case 'opened.clean':
|
|
559
700
|
return cleaned(connection);
|
|
701
|
+
case 'opened.held':
|
|
702
|
+
return openedHeld(connection);
|
|
560
703
|
case 'file.part':
|
|
561
704
|
return filePart(connection, request.key, request.part);
|
|
562
705
|
case 'conversation.held':
|
|
563
|
-
return heldConversations(connection);
|
|
706
|
+
return heldConversations(connection, request.conversations);
|
|
564
707
|
case 'conversation.keep': {
|
|
565
708
|
const { kind: _kind, ...write } = request;
|
|
566
709
|
return keptMessages(connection, write);
|
|
@@ -571,6 +714,12 @@ export function answerRuntime(connection, request, spool) {
|
|
|
571
714
|
return messageCount(connection, request.conversation, request.phrase);
|
|
572
715
|
case 'conversation.turn':
|
|
573
716
|
return turnArrived(connection, request.conversation, request.turn);
|
|
717
|
+
case 'conversation.rows':
|
|
718
|
+
return conversationRows(connection, request.conversations);
|
|
719
|
+
case 'conversation.jobs':
|
|
720
|
+
return jobMarkers(connection, request.conversation);
|
|
721
|
+
case 'conversation.tallies':
|
|
722
|
+
return conversationTallies(connection, request.conversations, request.since);
|
|
574
723
|
case 'conversation.drop':
|
|
575
724
|
chatDraft(connection, {
|
|
576
725
|
kind: 'authored.chatDraft',
|
|
@@ -581,5 +730,11 @@ export function answerRuntime(connection, request, spool) {
|
|
|
581
730
|
return null;
|
|
582
731
|
case 'space.probe':
|
|
583
732
|
return spool.probe(PROBE_BYTES).then(() => null);
|
|
733
|
+
case 'read.stored':
|
|
734
|
+
return storedRead(connection, request);
|
|
735
|
+
case 'read.keep':
|
|
736
|
+
return keptRead(connection, request, request.answer);
|
|
737
|
+
case 'read.builds':
|
|
738
|
+
return readsOfOtherBuildsForgotten(connection, request.build);
|
|
584
739
|
}
|
|
585
740
|
}
|
|
@@ -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(id, conversation, position, identity, at) AS (
|
|
98
|
+
SELECT m.id, m.conversation, m.position, m.identity, m.${ACCEPTED}
|
|
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.id, m.conversation, m.position, m.identity, m.${ACCEPTED}
|
|
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 JOIN conversation_messages m ON m.id = walk.id
|
|
113
|
+
WHERE m.message ->> '$.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,EAAY,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM7D,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
|
@@ -5,8 +5,7 @@ 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);
|
|
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
|
}
|
package/dist/windows.d.ts
CHANGED
|
@@ -1,22 +1,11 @@
|
|
|
1
1
|
export declare const MAXIMUM_WINDOW = 1000;
|
|
2
|
-
export declare const FROM_START
|
|
2
|
+
export declare const FROM_START: string;
|
|
3
3
|
export declare function capped(limit: number | null | undefined): number;
|
|
4
|
-
export type Ordering = {
|
|
5
|
-
readonly direction: 'asc' | 'desc';
|
|
6
|
-
readonly nulls: 'first' | 'last';
|
|
7
|
-
readonly stringSort: 'lexical' | 'locale';
|
|
8
|
-
readonly locale: string | undefined;
|
|
9
|
-
readonly localeOptions: Intl.CollatorOptions | undefined;
|
|
10
|
-
};
|
|
11
4
|
interface Placed {
|
|
12
5
|
readonly position: string;
|
|
13
6
|
readonly identity: string;
|
|
14
7
|
}
|
|
15
8
|
export declare function messageOrder(left: Placed, right: Placed): number;
|
|
16
9
|
export declare function precedes(message: Placed, before: readonly [string, string] | null): boolean;
|
|
17
|
-
export declare function byCodePoint(left: string, right: string): number;
|
|
18
|
-
export declare function compared(left: unknown, right: unknown, ordering: Ordering): number;
|
|
19
|
-
export declare function cursorOf(values: readonly unknown[]): string;
|
|
20
|
-
export declare function decodedCursor(text: string): readonly unknown[] | null;
|
|
21
10
|
export {};
|
|
22
11
|
//# sourceMappingURL=windows.d.ts.map
|