@agentshouse/mdruntime 0.1.0-cef5833f6c689 → 0.1.0-cef76ea952695
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/dist/acceptance.d.ts +6 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +385 -0
- package/dist/actions.d.ts +20 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +251 -0
- package/dist/adapter.d.ts +28 -55
- 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 +207 -76
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -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 +18 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +7 -2
- package/dist/compile.d.ts +5 -0
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +202 -80
- package/dist/connection.d.ts +5 -141
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +103 -5175
- package/dist/conversation-live.d.ts +135 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +247 -0
- package/dist/conversation-row.d.ts +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +53 -0
- package/dist/conversation.d.ts +30 -37
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +853 -864
- 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.map +1 -1
- package/dist/entry.js +4 -3
- package/dist/expectation.d.ts +4 -2
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +33 -11
- package/dist/failure.d.ts +1 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +3 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +11 -4
- package/dist/index.d.ts +20 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/install.d.ts +56 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +556 -0
- package/dist/job.d.ts +1 -10
- package/dist/job.d.ts.map +1 -1
- package/dist/job.js +2 -23
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +270 -0
- package/dist/listing.d.ts +53 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +176 -0
- package/dist/live.d.ts +4 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +54 -16
- package/dist/locks.d.ts +9 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +62 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +61 -0
- package/dist/media.d.ts +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +3 -3
- package/dist/memory.d.ts +3 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +45 -5
- package/dist/messages.d.ts +22 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +75 -16
- package/dist/model.d.ts +1 -7
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -6
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +197 -0
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +12 -17
- package/dist/opened.js +3 -3
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +60 -0
- package/dist/outcome.d.ts +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 +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/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +272 -0
- package/dist/query.d.ts +10 -2
- package/dist/query.d.ts.map +1 -1
- 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 +8 -6
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +160 -101
- package/dist/react.d.ts +11 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +10 -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 -1
- package/dist/readiness.d.ts.map +1 -1
- package/dist/reads.d.ts +37 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +174 -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 +57 -0
- package/dist/replica.d.ts +7 -7
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +51 -19
- package/dist/room-draft.d.ts +1 -3
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +3 -3
- 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 -5
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +50 -58
- package/dist/runtime.d.ts +43 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +5 -1
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +34 -21
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1005 -0
- 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 +31 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +290 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +20 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +77 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/rooms.d.ts +44 -0
- package/dist/socket/rooms.d.ts.map +1 -0
- package/dist/socket/rooms.js +90 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +70 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +175 -0
- package/dist/source.d.ts +61 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +82 -0
- package/dist/status.d.ts +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 +210 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +428 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +107 -152
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +143 -394
- package/dist/stored.d.ts +59 -65
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +255 -149
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +224 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +532 -0
- package/dist/tables.d.ts +110 -50
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +205 -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 +4 -4
- package/dist/wire.d.ts +16 -1
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +6 -0
- package/package.json +3 -2
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
package/dist/tables.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { sql } from '@agentshouse/mdmodel';
|
|
2
2
|
import { answerQuery } from './compile.js';
|
|
3
|
-
import { droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
|
|
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();
|
|
@@ -76,7 +78,7 @@ const TABLES = [
|
|
|
76
78
|
['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
|
|
77
79
|
[
|
|
78
80
|
'authored_pending',
|
|
79
|
-
'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)',
|
|
80
82
|
],
|
|
81
83
|
[
|
|
82
84
|
'authored_room_drafts',
|
|
@@ -93,34 +95,52 @@ export const RUNTIME_TABLES = [
|
|
|
93
95
|
'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
|
|
94
96
|
...REPLICA_TABLES,
|
|
95
97
|
...MESSAGE_TABLES,
|
|
98
|
+
...READ_TABLES,
|
|
96
99
|
];
|
|
97
100
|
const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
|
|
98
101
|
const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
|
|
99
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})`;
|
|
100
104
|
const READS = new Set([
|
|
101
|
-
'authored.
|
|
105
|
+
'authored.status',
|
|
106
|
+
'authored.moving',
|
|
107
|
+
'authored.pending',
|
|
108
|
+
'authored.batch',
|
|
109
|
+
'authored.order',
|
|
110
|
+
'authored.queued',
|
|
102
111
|
'authored.roomDrafts',
|
|
112
|
+
'authored.chatDraft.read',
|
|
103
113
|
'authored.chatDrafts',
|
|
104
114
|
'authored.calls',
|
|
105
115
|
'authored.fences',
|
|
116
|
+
'authored.unsent',
|
|
106
117
|
'authored.fact',
|
|
107
118
|
'authored.file',
|
|
108
119
|
'replica.open',
|
|
120
|
+
'replica.rooms',
|
|
121
|
+
'replica.room',
|
|
122
|
+
'replica.covering',
|
|
123
|
+
'replica.offline',
|
|
124
|
+
'replica.held',
|
|
125
|
+
'replica.facts',
|
|
126
|
+
'replica.presentation',
|
|
109
127
|
'replica.query',
|
|
128
|
+
'replica.tallies',
|
|
110
129
|
'replica.entries',
|
|
111
130
|
'replica.typed',
|
|
112
131
|
'replica.referrers',
|
|
113
|
-
'replica.files',
|
|
114
132
|
'replica.folders',
|
|
115
133
|
'replica.typedWithin',
|
|
116
|
-
'replica.counts',
|
|
117
|
-
'replica.wanted',
|
|
118
134
|
'opened.find',
|
|
135
|
+
'opened.held',
|
|
119
136
|
'file.part',
|
|
120
137
|
'conversation.held',
|
|
121
138
|
'conversation.window',
|
|
122
139
|
'conversation.count',
|
|
123
140
|
'conversation.turn',
|
|
141
|
+
'conversation.rows',
|
|
142
|
+
'conversation.tallies',
|
|
143
|
+
'read.stored',
|
|
124
144
|
]);
|
|
125
145
|
const KINDS = new Set([
|
|
126
146
|
...READS,
|
|
@@ -132,17 +152,17 @@ const KINDS = new Set([
|
|
|
132
152
|
'authored.claim',
|
|
133
153
|
'authored.end',
|
|
134
154
|
'replica.stage',
|
|
155
|
+
'replica.resume',
|
|
135
156
|
'replica.refresh',
|
|
136
157
|
'replica.unrefresh',
|
|
137
158
|
'replica.commit',
|
|
138
159
|
'replica.fence',
|
|
139
160
|
'replica.erase',
|
|
140
161
|
'replica.abandon',
|
|
162
|
+
'replica.unfence',
|
|
141
163
|
'replica.release',
|
|
142
164
|
'replica.rederive',
|
|
143
|
-
'replica.
|
|
144
|
-
'replica.remember',
|
|
145
|
-
'replica.unhold',
|
|
165
|
+
'replica.demote',
|
|
146
166
|
'replica.fact',
|
|
147
167
|
'replica.present',
|
|
148
168
|
'opened.begin',
|
|
@@ -153,6 +173,8 @@ const KINDS = new Set([
|
|
|
153
173
|
'conversation.keep',
|
|
154
174
|
'conversation.drop',
|
|
155
175
|
'space.probe',
|
|
176
|
+
'read.keep',
|
|
177
|
+
'read.builds',
|
|
156
178
|
]);
|
|
157
179
|
export function isRuntime(request) {
|
|
158
180
|
return KINDS.has(request.kind);
|
|
@@ -225,21 +247,66 @@ function unowned(connection) {
|
|
|
225
247
|
connection.run(UNOWNED_PARTS);
|
|
226
248
|
}
|
|
227
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
|
+
]));
|
|
228
263
|
return {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
264
|
+
room: room === null ? null : { ...room, overlaid: overlaid(connection, room.key) },
|
|
265
|
+
queue: heldOrder(connection, locator).map((id) => {
|
|
266
|
+
const held = pending.get(id);
|
|
267
|
+
if (held === undefined)
|
|
268
|
+
throw new Error(`Missing Pending Change ${locator}/${id}`);
|
|
269
|
+
return held;
|
|
270
|
+
}),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function status(connection) {
|
|
274
|
+
const [completed] = connection.rows("SELECT value FROM replica_facts WHERE name = 'lastCompleted'");
|
|
275
|
+
return {
|
|
276
|
+
queued: texts(connection.rows('SELECT locator FROM authored_queues'), 'locator'),
|
|
277
|
+
lastCompleted: completed === undefined ? null : text(completed.value),
|
|
278
|
+
changes: connection
|
|
279
|
+
.rows('SELECT p.locator, c.value AS path FROM authored_pending p, json_each(p.paths) c')
|
|
280
|
+
.map((row) => ({ locator: text(row.locator), path: text(row.path) })),
|
|
281
|
+
resets: connection
|
|
282
|
+
.rows(`SELECT locator, json_extract(state, '$.submission.reset') AS reset FROM authored_pending
|
|
283
|
+
WHERE json_extract(state, '$.submission.state') = 'reset'`)
|
|
284
|
+
.map((row) => ({ locator: text(row.locator), reset: text(row.reset) })),
|
|
285
|
+
returned: texts(connection.rows(`SELECT record FROM authored_room_drafts WHERE json_type(record, '$.returned') = 'object'`), 'record'),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function pendingOf(connection, locator, id) {
|
|
289
|
+
const [held] = connection.rows('SELECT state FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
290
|
+
return {
|
|
291
|
+
state: held === undefined ? null : text(held.state),
|
|
292
|
+
room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
|
|
241
293
|
};
|
|
242
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
|
+
}
|
|
243
310
|
function heldOrder(connection, locator) {
|
|
244
311
|
const [held] = connection.rows('SELECT ids FROM authored_queues WHERE locator = ?', [locator]);
|
|
245
312
|
return held === undefined ? [] : JSON.parse(text(held.ids));
|
|
@@ -271,16 +338,23 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
|
|
|
271
338
|
connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
272
339
|
}
|
|
273
340
|
}
|
|
274
|
-
for (const { id, batch, state, files } of added ?? []) {
|
|
275
|
-
if (before.has(id)
|
|
341
|
+
for (const { id, batch, state, files, paths, moving } of added ?? []) {
|
|
342
|
+
if (before.has(id))
|
|
276
343
|
continue;
|
|
277
|
-
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]);
|
|
278
345
|
}
|
|
279
|
-
for (const { id, batch, files } of founded ?? []) {
|
|
346
|
+
for (const { id, batch, files, paths, moving } of founded ?? []) {
|
|
280
347
|
const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
281
348
|
if (held === undefined || !before.has(id))
|
|
282
349
|
continue;
|
|
283
|
-
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
|
+
]);
|
|
284
358
|
}
|
|
285
359
|
}
|
|
286
360
|
async function kept(connection, { writes, files, whole }) {
|
|
@@ -361,11 +435,15 @@ function fence(connection, locators) {
|
|
|
361
435
|
return fenceRooms(connection, locators);
|
|
362
436
|
}
|
|
363
437
|
function erased(connection, { locator, limit }) {
|
|
364
|
-
|
|
365
|
-
|
|
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) {
|
|
366
444
|
connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
|
|
367
445
|
}
|
|
368
|
-
return
|
|
446
|
+
return erased;
|
|
369
447
|
}
|
|
370
448
|
function claim(connection, holder) {
|
|
371
449
|
const held = fact(connection, 'holder');
|
|
@@ -428,9 +506,9 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
428
506
|
if (fetched === null)
|
|
429
507
|
return false;
|
|
430
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]);
|
|
431
|
-
const whole = count(held
|
|
432
|
-
count(held
|
|
433
|
-
(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));
|
|
434
512
|
if (!whole) {
|
|
435
513
|
dropped(connection, key);
|
|
436
514
|
return false;
|
|
@@ -444,16 +522,38 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
444
522
|
unowned(connection);
|
|
445
523
|
return true;
|
|
446
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
|
+
}
|
|
447
539
|
function cleaned(connection) {
|
|
448
540
|
connection.run('DELETE FROM opened_files');
|
|
449
|
-
const
|
|
541
|
+
const freed = cleanable(connection);
|
|
450
542
|
unowned(connection);
|
|
451
|
-
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
|
+
};
|
|
452
552
|
}
|
|
453
553
|
async function committed(connection, { authored, rooms }) {
|
|
454
554
|
const refused = authored === undefined ? null : await kept(connection, authored);
|
|
455
555
|
if (refused !== null && authored?.whole === true) {
|
|
456
|
-
return { fenced: refused,
|
|
556
|
+
return { fenced: refused, changed: {}, indexed: {} };
|
|
457
557
|
}
|
|
458
558
|
return {
|
|
459
559
|
fenced: refused,
|
|
@@ -462,16 +562,42 @@ async function committed(connection, { authored, rooms }) {
|
|
|
462
562
|
}
|
|
463
563
|
export function answerRuntime(connection, request, spool) {
|
|
464
564
|
switch (request.kind) {
|
|
465
|
-
case 'authored.
|
|
466
|
-
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');
|
|
467
589
|
case 'authored.roomDrafts':
|
|
468
|
-
return
|
|
590
|
+
return roomDraftRecords(connection, request.locator, request.paths);
|
|
591
|
+
case 'authored.chatDraft.read':
|
|
592
|
+
return chatDraftRecord(connection, request.conversation);
|
|
469
593
|
case 'authored.chatDrafts':
|
|
470
594
|
return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
|
|
471
595
|
case 'authored.calls':
|
|
472
596
|
return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
|
|
473
597
|
case 'authored.fences':
|
|
474
598
|
return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
|
|
599
|
+
case 'authored.unsent':
|
|
600
|
+
return unsent(connection);
|
|
475
601
|
case 'authored.fact':
|
|
476
602
|
return fact(connection, request.name);
|
|
477
603
|
case 'authored.file':
|
|
@@ -492,24 +618,43 @@ export function answerRuntime(connection, request, spool) {
|
|
|
492
618
|
return end(connection, request.holder);
|
|
493
619
|
case 'replica.open':
|
|
494
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);
|
|
495
640
|
case 'replica.query':
|
|
496
641
|
return answerQuery(connection, request.plan, request.rooms, request.budget);
|
|
642
|
+
case 'replica.tallies':
|
|
643
|
+
return roomTallies(connection, request.totals, request.rooms, request.since);
|
|
497
644
|
case 'replica.entries':
|
|
498
645
|
return entries(connection, request.key, request.view, request.paths);
|
|
499
646
|
case 'replica.typed':
|
|
500
647
|
return typed(connection, request.key, request.view, request.paths);
|
|
501
648
|
case 'replica.referrers':
|
|
502
|
-
return referrers(connection, request.key, request.view, request.targets
|
|
503
|
-
case 'replica.files':
|
|
504
|
-
return files(connection, request.key, request.view, request.after, request.limit);
|
|
649
|
+
return referrers(connection, request.key, request.view, request.targets);
|
|
505
650
|
case 'replica.folders':
|
|
506
|
-
return folders(connection, request.key, request.
|
|
651
|
+
return folders(connection, request.key, request.paths);
|
|
507
652
|
case 'replica.typedWithin':
|
|
508
653
|
return typedWithin(connection, request.key, request.view, request.roots, request.within);
|
|
509
|
-
case 'replica.counts':
|
|
510
|
-
return counts(connection, request.rooms);
|
|
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,18 +667,12 @@ 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':
|
|
528
675
|
return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
|
|
529
|
-
case 'replica.hold':
|
|
530
|
-
return holdTexts(connection, request);
|
|
531
|
-
case 'replica.unhold':
|
|
532
|
-
return unholdTexts(connection, request);
|
|
533
|
-
case 'replica.wanted':
|
|
534
|
-
return wanted(connection, request);
|
|
535
|
-
case 'replica.remember':
|
|
536
|
-
return remembered(connection, request);
|
|
537
676
|
case 'replica.fact':
|
|
538
677
|
connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
|
|
539
678
|
request.name,
|
|
@@ -558,10 +697,12 @@ export function answerRuntime(connection, request, spool) {
|
|
|
558
697
|
return dropped(connection, request.key);
|
|
559
698
|
case 'opened.clean':
|
|
560
699
|
return cleaned(connection);
|
|
700
|
+
case 'opened.held':
|
|
701
|
+
return openedHeld(connection);
|
|
561
702
|
case 'file.part':
|
|
562
703
|
return filePart(connection, request.key, request.part);
|
|
563
704
|
case 'conversation.held':
|
|
564
|
-
return heldConversations(connection);
|
|
705
|
+
return heldConversations(connection, request.conversations);
|
|
565
706
|
case 'conversation.keep': {
|
|
566
707
|
const { kind: _kind, ...write } = request;
|
|
567
708
|
return keptMessages(connection, write);
|
|
@@ -572,6 +713,10 @@ export function answerRuntime(connection, request, spool) {
|
|
|
572
713
|
return messageCount(connection, request.conversation, request.phrase);
|
|
573
714
|
case 'conversation.turn':
|
|
574
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);
|
|
575
720
|
case 'conversation.drop':
|
|
576
721
|
chatDraft(connection, {
|
|
577
722
|
kind: 'authored.chatDraft',
|
|
@@ -582,5 +727,11 @@ export function answerRuntime(connection, request, spool) {
|
|
|
582
727
|
return null;
|
|
583
728
|
case 'space.probe':
|
|
584
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);
|
|
585
736
|
}
|
|
586
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,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,11 @@ 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
35
|
anyRoom: true,
|
|
36
36
|
typedPaths: composition.typedPaths,
|
|
37
37
|
});
|
package/dist/wire.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ConnectionRefusal } from './
|
|
1
|
+
import type { ConnectionRefusal } from './socket.js';
|
|
2
2
|
import type { Described } from './failure.js';
|
|
3
3
|
export type RuntimePort = {
|
|
4
4
|
postMessage(message: unknown): void;
|
|
@@ -82,6 +82,18 @@ declare const MEMBERS: {
|
|
|
82
82
|
readonly reach: 'whole';
|
|
83
83
|
readonly effect: 'write';
|
|
84
84
|
};
|
|
85
|
+
readonly unsent: {
|
|
86
|
+
readonly reach: 'whole';
|
|
87
|
+
readonly effect: 'read';
|
|
88
|
+
};
|
|
89
|
+
readonly reset: {
|
|
90
|
+
readonly reach: 'whole';
|
|
91
|
+
readonly effect: 'write';
|
|
92
|
+
};
|
|
93
|
+
readonly readAgain: {
|
|
94
|
+
readonly reach: 'whole';
|
|
95
|
+
readonly effect: 'read';
|
|
96
|
+
};
|
|
85
97
|
readonly persistence: {
|
|
86
98
|
readonly reach: 'runtime';
|
|
87
99
|
readonly effect: 'read';
|
|
@@ -184,6 +196,9 @@ declare const TOPICS: {
|
|
|
184
196
|
readonly conversation: 'within';
|
|
185
197
|
readonly conversations: 'within';
|
|
186
198
|
readonly agents: 'within';
|
|
199
|
+
readonly figures: 'whole';
|
|
200
|
+
readonly holdings: 'whole';
|
|
201
|
+
readonly read: 'whole';
|
|
187
202
|
};
|
|
188
203
|
export declare const WIRE: {
|
|
189
204
|
readonly members: Readonly<Record<string, WireCall>>;
|