@agentshouse/mdruntime 0.1.0-cd50a4607cb7d → 0.1.0-cd574a610e9c8
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 +24 -19
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +299 -0
- package/dist/act-lanes.d.ts +30 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +225 -0
- package/dist/actions.d.ts +26 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +302 -0
- package/dist/adapter.d.ts +226 -117
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +6 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +35 -41
- package/dist/authored.d.ts +88 -0
- package/dist/authored.d.ts.map +1 -0
- package/dist/authored.js +345 -0
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +31 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +309 -109
- 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 +12 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +13 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +17 -88
- package/dist/change.d.ts +36 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +17 -3
- package/dist/chat-types.d.ts +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +11 -0
- package/dist/client.d.ts +45 -25
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +132 -27
- package/dist/collection.d.ts +32 -21
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +53 -288
- package/dist/column.d.ts +5 -0
- package/dist/column.d.ts.map +1 -0
- package/dist/column.js +9 -0
- package/dist/compile.d.ts +18 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +723 -0
- package/dist/connection.d.ts +7 -118
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -2975
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/{chat/context.js → context.js} +2 -5
- package/dist/conversation-live.d.ts +150 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +259 -0
- package/dist/conversation-row.d.ts +40 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +66 -0
- package/dist/conversation.d.ts +85 -48
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1095 -688
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +150 -0
- package/dist/durability.d.ts +23 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +9 -0
- package/dist/entry.d.ts +5 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +33 -28
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +199 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +8 -122
- 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 +27 -4
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +177 -27
- package/dist/identity.d.ts +0 -2
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -6
- package/dist/index.d.ts +41 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -3
- package/dist/install.d.ts +60 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +537 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +282 -0
- package/dist/listing.d.ts +52 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +152 -0
- package/dist/live.d.ts +25 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +206 -0
- package/dist/loaded.d.ts +5 -0
- package/dist/loaded.d.ts.map +1 -0
- package/dist/loaded.js +40 -0
- package/dist/locks.d.ts +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +32 -0
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +49 -0
- package/dist/media.d.ts +13 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +269 -0
- package/dist/memory.d.ts +25 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +320 -110
- package/dist/messages.d.ts +58 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +160 -0
- package/dist/model.d.ts +11 -13
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -24
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +153 -0
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +40 -10
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +233 -39
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +53 -0
- package/dist/outcome.d.ts +62 -9
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +72 -0
- package/dist/overlay.d.ts +9 -6
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +129 -166
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +4 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +13 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +26 -0
- package/dist/preparation.d.ts +41 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +314 -0
- package/dist/presence.d.ts +58 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +231 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +308 -0
- package/dist/query.d.ts +27 -186
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -464
- package/dist/{chat/questions.d.ts → questions.d.ts} +6 -7
- package/dist/questions.d.ts.map +1 -0
- package/dist/{chat/questions.js → questions.js} +12 -7
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +480 -0
- package/dist/reach.d.ts +20 -7
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +360 -98
- package/dist/react.d.ts +22 -5
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +40 -18
- package/dist/{chat/read.d.ts → read.d.ts} +2 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/{chat/read.js → read.js} +4 -0
- package/dist/readiness.d.ts +55 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +25 -0
- 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 +5 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +65 -8
- package/dist/refresh.d.ts +17 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +145 -54
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +55 -0
- package/dist/replica.d.ts +50 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +340 -191
- 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 +66 -12
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +416 -122
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +220 -0
- package/dist/room-list.d.ts +10 -0
- package/dist/room-list.d.ts.map +1 -0
- package/dist/room-list.js +45 -0
- package/dist/rows.d.ts +32 -29
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -118
- package/dist/runtime.d.ts +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +43 -48
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +751 -303
- package/dist/saves.d.ts +34 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +437 -0
- package/dist/search.d.ts +15 -77
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -186
- package/dist/seed.d.ts +25 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +145 -0
- package/dist/shared.d.ts +6 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +75 -104
- package/dist/shown.d.ts +33 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +309 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +28 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +103 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +67 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +164 -0
- package/dist/source.d.ts +59 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +93 -0
- package/dist/status.d.ts +4 -5
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -7
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +40 -0
- package/dist/store/readiness.d.ts +11 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +68 -0
- package/dist/store/records.d.ts +223 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +465 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/rooms-shown.d.ts +8 -0
- package/dist/store/rooms-shown.d.ts.map +1 -0
- package/dist/store/rooms-shown.js +13 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +114 -141
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +163 -687
- package/dist/stored.d.ts +167 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +700 -0
- package/dist/surface.d.ts +90 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +225 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +536 -0
- package/dist/tables.d.ts +376 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +499 -0
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +128 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +5 -3
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +51 -21
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +98 -0
- package/dist/windows.d.ts +11 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +16 -0
- package/dist/wire.d.ts +230 -36
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +77 -33
- package/package.json +19 -19
- package/AGENTS.md +0 -296
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -60
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -26
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -62
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -620
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/ready.d.ts +0 -33
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/log.d.ts +0 -5
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/read-side.d.ts +0 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -639
package/dist/tables.js
ADDED
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import { sql } from '@agentshouse/mdmodel';
|
|
2
|
+
import { answerQuery } from './compile.js';
|
|
3
|
+
import { amended, authoredLocators, authoredPart, call, callRecords, chatDraft, chatDraftConversations, chatDraftRecord, chatDraftRecords, chatDraftsDropped, claim, fact, fenced, fencedWork, fences, FILE_PART_BYTES, authoredEmptied, heldOrder, kept, moving, pendingBatch, pendingState, queuedLocators, queueOf, queues, remember, roomDraft, roomDraftRecords, spooled, unfenced, unsent, unsentStatus, } from './authored.js';
|
|
4
|
+
import { count, text, texts } from './column.js';
|
|
5
|
+
import { conversationFacts, conversationRows, forgottenConversations, heldConversations, keptFact, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
|
|
6
|
+
import { keptRead, READ_TABLES, readsOfOtherBuildsForgotten, storedRead, } from './reads.js';
|
|
7
|
+
import { conversationTallies, roomTallies, } from './tallies.js';
|
|
8
|
+
import { abandon, release, commit, covering, demoted, ended, entries, erase, facts, fenceRooms, folders, heldLocators, heldRoom, heldRooms, offlineMode, opened, overlaid, presentation, rederive, referrers, refreshing, REPLICA_TABLES, resume, stage, typed, stagedLocators, tablesOf, typedWithin, unrefresh, } from './stored.js';
|
|
9
|
+
export { authoredEmptied, authoredTable, FILE_PART_BYTES, formatted, heldTables, } from './authored.js';
|
|
10
|
+
const STATEMENTS_HELD = 256;
|
|
11
|
+
export function sqliteConnection(engine, database) {
|
|
12
|
+
const decoder = new TextDecoder();
|
|
13
|
+
const held = new Map();
|
|
14
|
+
database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
|
|
15
|
+
arity: 2,
|
|
16
|
+
deterministic: true,
|
|
17
|
+
});
|
|
18
|
+
function prepared(sql) {
|
|
19
|
+
if (sql.includes(';'))
|
|
20
|
+
return null;
|
|
21
|
+
const found = held.get(sql);
|
|
22
|
+
held.delete(sql);
|
|
23
|
+
const statement = found ?? database.prepare(sql);
|
|
24
|
+
held.set(sql, statement);
|
|
25
|
+
if (held.size > STATEMENTS_HELD) {
|
|
26
|
+
const [oldest, evicted] = held.entries().next().value;
|
|
27
|
+
held.delete(oldest);
|
|
28
|
+
evicted.finalize();
|
|
29
|
+
}
|
|
30
|
+
return statement;
|
|
31
|
+
}
|
|
32
|
+
function stepped(statement, bind, each) {
|
|
33
|
+
try {
|
|
34
|
+
if (bind.length > 0 && statement.parameterCount > 0)
|
|
35
|
+
statement.bind(bind);
|
|
36
|
+
while (statement.step())
|
|
37
|
+
each();
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
statement.resetNoThrow(true);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
run(sql, bind = []) {
|
|
45
|
+
const statement = prepared(sql);
|
|
46
|
+
if (statement === null)
|
|
47
|
+
database.exec({ sql, bind });
|
|
48
|
+
else
|
|
49
|
+
stepped(statement, bind, () => { });
|
|
50
|
+
},
|
|
51
|
+
rows(sql, bind = []) {
|
|
52
|
+
const statement = prepared(sql);
|
|
53
|
+
if (statement === null) {
|
|
54
|
+
return database.exec({ sql, bind, rowMode: 'object', returnValue: 'resultRows' });
|
|
55
|
+
}
|
|
56
|
+
const names = statement.getColumnNames([]);
|
|
57
|
+
const rows = [];
|
|
58
|
+
stepped(statement, bind, () => {
|
|
59
|
+
const values = statement.get([]);
|
|
60
|
+
const row = Object.create(null);
|
|
61
|
+
for (const [index, name] of names.entries())
|
|
62
|
+
row[name] = values[index] ?? null;
|
|
63
|
+
rows.push(row);
|
|
64
|
+
});
|
|
65
|
+
return rows;
|
|
66
|
+
},
|
|
67
|
+
collate(name, compare) {
|
|
68
|
+
const answered = engine.capi.sqlite3_create_collation_v2(database.pointer, name, engine.capi.SQLITE_UTF8, 0, (_argument, leftLength, left, rightLength, right) => {
|
|
69
|
+
const heap = engine.wasm.heap8u();
|
|
70
|
+
return Math.sign(compare(decoder.decode(heap.subarray(left, left + leftLength)), decoder.decode(heap.subarray(right, right + rightLength))));
|
|
71
|
+
}, 0);
|
|
72
|
+
if (answered !== 0)
|
|
73
|
+
throw new Error(`the database refused the collation ${name}`);
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const PROBE_BYTES = 4 * FILE_PART_BYTES;
|
|
78
|
+
export const RUNTIME_TABLES = [
|
|
79
|
+
'CREATE TABLE opened_files (key TEXT PRIMARY KEY, locator TEXT NOT NULL, path TEXT NOT NULL, revision TEXT NOT NULL, media_type TEXT NOT NULL, sha256 TEXT, byte_length INTEGER) WITHOUT ROWID',
|
|
80
|
+
'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
|
|
81
|
+
'CREATE TABLE opened_parts (key TEXT NOT NULL, part INTEGER NOT NULL, bytes BLOB NOT NULL, PRIMARY KEY (key, part))',
|
|
82
|
+
...REPLICA_TABLES,
|
|
83
|
+
...MESSAGE_TABLES,
|
|
84
|
+
...READ_TABLES,
|
|
85
|
+
];
|
|
86
|
+
const UNOPENED_PARTS = 'DELETE FROM opened_parts WHERE key NOT IN (SELECT key FROM opened_files)';
|
|
87
|
+
const READS = new Set([
|
|
88
|
+
'authored.status',
|
|
89
|
+
'authored.moving',
|
|
90
|
+
'authored.pending',
|
|
91
|
+
'authored.batch',
|
|
92
|
+
'authored.order',
|
|
93
|
+
'authored.queued',
|
|
94
|
+
'authored.roomDrafts',
|
|
95
|
+
'authored.chatDraft.read',
|
|
96
|
+
'authored.chatDrafts',
|
|
97
|
+
'authored.calls',
|
|
98
|
+
'authored.fences',
|
|
99
|
+
'authored.unsent',
|
|
100
|
+
'authored.fact',
|
|
101
|
+
'authored.file',
|
|
102
|
+
'replica.open',
|
|
103
|
+
'replica.rooms',
|
|
104
|
+
'replica.room',
|
|
105
|
+
'replica.covering',
|
|
106
|
+
'replica.offline',
|
|
107
|
+
'replica.held',
|
|
108
|
+
'replica.facts',
|
|
109
|
+
'replica.presentation',
|
|
110
|
+
'replica.query',
|
|
111
|
+
'replica.tallies',
|
|
112
|
+
'replica.entries',
|
|
113
|
+
'replica.typed',
|
|
114
|
+
'replica.referrers',
|
|
115
|
+
'replica.folders',
|
|
116
|
+
'replica.typedWithin',
|
|
117
|
+
'opened.find',
|
|
118
|
+
'opened.held',
|
|
119
|
+
'file.part',
|
|
120
|
+
'conversation.held',
|
|
121
|
+
'conversation.window',
|
|
122
|
+
'conversation.count',
|
|
123
|
+
'conversation.turn',
|
|
124
|
+
'conversation.rows',
|
|
125
|
+
'conversation.tallies',
|
|
126
|
+
'conversation.facts',
|
|
127
|
+
'conversation.stored',
|
|
128
|
+
'read.stored',
|
|
129
|
+
]);
|
|
130
|
+
const KINDS = new Set([
|
|
131
|
+
...READS,
|
|
132
|
+
'authored.amend',
|
|
133
|
+
'authored.roomDraft',
|
|
134
|
+
'authored.chatDraft',
|
|
135
|
+
'authored.call',
|
|
136
|
+
'authored.remember',
|
|
137
|
+
'authored.claim',
|
|
138
|
+
'authored.end',
|
|
139
|
+
'replica.stage',
|
|
140
|
+
'replica.resume',
|
|
141
|
+
'replica.refresh',
|
|
142
|
+
'replica.unrefresh',
|
|
143
|
+
'replica.commit',
|
|
144
|
+
'replica.fence',
|
|
145
|
+
'replica.erase',
|
|
146
|
+
'replica.abandon',
|
|
147
|
+
'replica.unfence',
|
|
148
|
+
'replica.release',
|
|
149
|
+
'replica.rederive',
|
|
150
|
+
'replica.demote',
|
|
151
|
+
'replica.fact',
|
|
152
|
+
'replica.present',
|
|
153
|
+
'opened.begin',
|
|
154
|
+
'opened.part',
|
|
155
|
+
'opened.keep',
|
|
156
|
+
'opened.drop',
|
|
157
|
+
'opened.clean',
|
|
158
|
+
'conversation.keep',
|
|
159
|
+
'conversation.fact',
|
|
160
|
+
'conversation.drop',
|
|
161
|
+
'space.probe',
|
|
162
|
+
'read.keep',
|
|
163
|
+
'read.builds',
|
|
164
|
+
]);
|
|
165
|
+
export function isRuntime(request) {
|
|
166
|
+
return KINDS.has(request.kind);
|
|
167
|
+
}
|
|
168
|
+
export function readsRuntime(request) {
|
|
169
|
+
return READS.has(request.kind);
|
|
170
|
+
}
|
|
171
|
+
function heldWork(connection, locator) {
|
|
172
|
+
const room = heldRoom(connection, locator);
|
|
173
|
+
return {
|
|
174
|
+
room: room === null ? null : { ...room, overlaid: overlaid(connection, room.key) },
|
|
175
|
+
queue: queueOf(connection, locator),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function status(connection) {
|
|
179
|
+
return {
|
|
180
|
+
...unsentStatus(connection),
|
|
181
|
+
lastCompleted: facts(connection, ['lastCompleted']).lastCompleted ?? null,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function pendingOf(connection, locator, id) {
|
|
185
|
+
return {
|
|
186
|
+
state: pendingState(connection, locator, id),
|
|
187
|
+
room: connection.rows('SELECT 1 FROM replica_rooms WHERE locator = ?', [locator]).length > 0,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function storedConversations(connection, conversations) {
|
|
191
|
+
const named = conversations === null ? '' : ' WHERE conversation IN (SELECT value FROM json_each(?))';
|
|
192
|
+
const bound = conversations === null ? [] : [JSON.stringify(conversations)];
|
|
193
|
+
return [
|
|
194
|
+
...new Set([
|
|
195
|
+
...tablesOf(MESSAGE_TABLES).flatMap((table) => texts(connection.rows(`SELECT DISTINCT conversation FROM ${table}${named}`, bound), 'conversation')),
|
|
196
|
+
...chatDraftConversations(connection, conversations),
|
|
197
|
+
]),
|
|
198
|
+
];
|
|
199
|
+
}
|
|
200
|
+
function droppedConversations(connection, conversations) {
|
|
201
|
+
const held = storedConversations(connection, conversations);
|
|
202
|
+
for (const table of tablesOf(MESSAGE_TABLES)) {
|
|
203
|
+
connection.run(`DELETE FROM ${table} WHERE conversation IN (SELECT value FROM json_each(?))`, [
|
|
204
|
+
JSON.stringify(conversations),
|
|
205
|
+
]);
|
|
206
|
+
}
|
|
207
|
+
chatDraftsDropped(connection, conversations);
|
|
208
|
+
return held;
|
|
209
|
+
}
|
|
210
|
+
function unopened(connection) {
|
|
211
|
+
connection.run(UNOPENED_PARTS);
|
|
212
|
+
}
|
|
213
|
+
function fence(connection, locators) {
|
|
214
|
+
fencedWork(connection, locators);
|
|
215
|
+
for (const locator of locators) {
|
|
216
|
+
connection.run('DELETE FROM opened_files WHERE locator = ?', [locator]);
|
|
217
|
+
}
|
|
218
|
+
unopened(connection);
|
|
219
|
+
return fenceRooms(connection, locators);
|
|
220
|
+
}
|
|
221
|
+
function erased(connection, { locator, limit }) {
|
|
222
|
+
return erase(connection, locator, limit);
|
|
223
|
+
}
|
|
224
|
+
function unfencedRooms(connection, locators) {
|
|
225
|
+
const erased = locators.filter((locator) => connection.rows('SELECT 1 FROM replica_erasing WHERE locator = ? LIMIT 1', [locator])
|
|
226
|
+
.length === 0);
|
|
227
|
+
unfenced(connection, erased);
|
|
228
|
+
return erased;
|
|
229
|
+
}
|
|
230
|
+
function end(connection, holder) {
|
|
231
|
+
ended(connection);
|
|
232
|
+
forgottenConversations(connection);
|
|
233
|
+
if (holder !== null && claim(connection, holder))
|
|
234
|
+
return true;
|
|
235
|
+
authoredEmptied(connection);
|
|
236
|
+
connection.run('DELETE FROM opened_files');
|
|
237
|
+
connection.run('DELETE FROM opened_parts');
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
function openedFile(connection, { locator, path, revision }) {
|
|
241
|
+
const [held] = connection.rows('SELECT key, media_type, byte_length FROM opened_files WHERE locator = ? AND path = ? AND revision = ? AND byte_length IS NOT NULL', [locator, path, revision]);
|
|
242
|
+
return held === undefined
|
|
243
|
+
? null
|
|
244
|
+
: {
|
|
245
|
+
key: text(held.key),
|
|
246
|
+
byteLength: count(held.byte_length),
|
|
247
|
+
mediaType: text(held.media_type),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function opening(connection, { key, locator, path, revision, mediaType }) {
|
|
251
|
+
if (fenced(connection, locator))
|
|
252
|
+
return false;
|
|
253
|
+
connection.run('DELETE FROM opened_files WHERE locator = ? AND path = ? AND revision = ? AND byte_length IS NULL', [locator, path, revision]);
|
|
254
|
+
unopened(connection);
|
|
255
|
+
connection.run('INSERT INTO opened_files (key, locator, path, revision, media_type) VALUES (?, ?, ?, ?, ?)', [key, locator, path, revision, mediaType]);
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
function fetching(connection, key) {
|
|
259
|
+
const [held] = connection.rows('SELECT locator, path, revision FROM opened_files WHERE key = ? AND byte_length IS NULL', [key]);
|
|
260
|
+
return held === undefined
|
|
261
|
+
? null
|
|
262
|
+
: { locator: text(held.locator), path: text(held.path), revision: text(held.revision) };
|
|
263
|
+
}
|
|
264
|
+
function openedPart(connection, { key, part, bytes }) {
|
|
265
|
+
if (fetching(connection, key) === null)
|
|
266
|
+
return false;
|
|
267
|
+
connection.run('INSERT INTO opened_parts (key, part, bytes) VALUES (?, ?, ?)', [
|
|
268
|
+
key,
|
|
269
|
+
part,
|
|
270
|
+
bytes,
|
|
271
|
+
]);
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
function dropped(connection, key) {
|
|
275
|
+
connection.run('DELETE FROM opened_files WHERE key = ?', [key]);
|
|
276
|
+
connection.run('DELETE FROM opened_parts WHERE key = ?', [key]);
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
280
|
+
const fetched = fetching(connection, key);
|
|
281
|
+
if (fetched === null)
|
|
282
|
+
return false;
|
|
283
|
+
const [held] = connection.rows('SELECT count(*) AS parts, min(part) AS first, max(part) AS last, coalesce(sum(length(bytes)), 0) AS bytes FROM opened_parts WHERE key = ?', [key]);
|
|
284
|
+
const whole = count(held.parts) === parts &&
|
|
285
|
+
count(held.bytes) === byteLength &&
|
|
286
|
+
(parts === 0 || (count(held.first) === 0 && count(held.last) === parts - 1));
|
|
287
|
+
if (!whole) {
|
|
288
|
+
dropped(connection, key);
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
connection.run('UPDATE opened_files SET sha256 = ?, byte_length = ? WHERE key = ?', [
|
|
292
|
+
sha256,
|
|
293
|
+
byteLength,
|
|
294
|
+
key,
|
|
295
|
+
]);
|
|
296
|
+
connection.run('DELETE FROM opened_files WHERE locator = ? AND path = ? AND revision = ? AND key <> ?', [fetched.locator, fetched.path, fetched.revision, key]);
|
|
297
|
+
unopened(connection);
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
function heldPart(connection, key, part) {
|
|
301
|
+
const [held] = connection.rows('SELECT bytes FROM opened_parts WHERE key = ? AND part = ?', [
|
|
302
|
+
key,
|
|
303
|
+
part,
|
|
304
|
+
]);
|
|
305
|
+
return held?.bytes instanceof Uint8Array ? held.bytes : authoredPart(connection, key, part);
|
|
306
|
+
}
|
|
307
|
+
function cleanable(connection) {
|
|
308
|
+
const [held] = connection.rows('SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM opened_parts');
|
|
309
|
+
return count(held.bytes);
|
|
310
|
+
}
|
|
311
|
+
function cleaned(connection) {
|
|
312
|
+
connection.run('DELETE FROM opened_files');
|
|
313
|
+
const freed = cleanable(connection);
|
|
314
|
+
unopened(connection);
|
|
315
|
+
return freed;
|
|
316
|
+
}
|
|
317
|
+
function openedHeld(connection) {
|
|
318
|
+
return {
|
|
319
|
+
rooms: connection
|
|
320
|
+
.rows('SELECT locator, count(*) AS files, sum(byte_length) AS bytes FROM opened_files WHERE byte_length IS NOT NULL GROUP BY locator ORDER BY locator')
|
|
321
|
+
.map((row) => ({ room: text(row.locator), count: count(row.files), size: count(row.bytes) })),
|
|
322
|
+
cleanable: cleanable(connection),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
async function committed(connection, { authored, rooms }) {
|
|
326
|
+
const refused = authored === undefined ? null : await kept(connection, authored);
|
|
327
|
+
if (refused !== null && authored?.whole === true) {
|
|
328
|
+
return { fenced: refused, changed: {}, indexed: {} };
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
fenced: refused,
|
|
332
|
+
...commit(connection, rooms.filter(({ locator }) => !fenced(connection, locator))),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
export function answerRuntime(connection, request, spool) {
|
|
336
|
+
switch (request.kind) {
|
|
337
|
+
case 'authored.status':
|
|
338
|
+
return status(connection);
|
|
339
|
+
case 'authored.moving':
|
|
340
|
+
return moving(connection);
|
|
341
|
+
case 'authored.pending':
|
|
342
|
+
return pendingOf(connection, request.locator, request.id);
|
|
343
|
+
case 'authored.batch':
|
|
344
|
+
return pendingBatch(connection, request.locator, request.id);
|
|
345
|
+
case 'authored.order':
|
|
346
|
+
return heldOrder(connection, request.locator);
|
|
347
|
+
case 'authored.queued':
|
|
348
|
+
return queuedLocators(connection);
|
|
349
|
+
case 'authored.roomDrafts':
|
|
350
|
+
return roomDraftRecords(connection, request.locator, request.paths);
|
|
351
|
+
case 'authored.chatDraft.read':
|
|
352
|
+
return chatDraftRecord(connection, request.conversation);
|
|
353
|
+
case 'authored.chatDrafts':
|
|
354
|
+
return chatDraftRecords(connection);
|
|
355
|
+
case 'authored.calls':
|
|
356
|
+
return callRecords(connection);
|
|
357
|
+
case 'authored.fences':
|
|
358
|
+
return fences(connection);
|
|
359
|
+
case 'authored.unsent':
|
|
360
|
+
return unsent(connection);
|
|
361
|
+
case 'authored.fact':
|
|
362
|
+
return fact(connection, request.name);
|
|
363
|
+
case 'authored.file':
|
|
364
|
+
return spooled(connection, spool, request.key, request.type);
|
|
365
|
+
case 'authored.amend':
|
|
366
|
+
return amended(connection, request.locator, request.id, request.amendment);
|
|
367
|
+
case 'authored.roomDraft':
|
|
368
|
+
return roomDraft(connection, request.locator, request.path, request.kept, request.files);
|
|
369
|
+
case 'authored.chatDraft':
|
|
370
|
+
return chatDraft(connection, request.kept, request.dropped);
|
|
371
|
+
case 'authored.call':
|
|
372
|
+
return call(connection, request.operation, request.kept, request.files);
|
|
373
|
+
case 'authored.remember':
|
|
374
|
+
return remember(connection, request.name, request.value);
|
|
375
|
+
case 'authored.claim':
|
|
376
|
+
return claim(connection, request.holder);
|
|
377
|
+
case 'authored.end':
|
|
378
|
+
return end(connection, request.holder);
|
|
379
|
+
case 'replica.open':
|
|
380
|
+
return opened(connection);
|
|
381
|
+
case 'replica.rooms':
|
|
382
|
+
return heldRooms(connection, request.locators);
|
|
383
|
+
case 'replica.room':
|
|
384
|
+
return heldWork(connection, request.locator);
|
|
385
|
+
case 'replica.covering':
|
|
386
|
+
return { ...covering(connection, request.since), queues: queues(connection) };
|
|
387
|
+
case 'replica.offline':
|
|
388
|
+
return offlineMode(connection, request.locator);
|
|
389
|
+
case 'replica.held':
|
|
390
|
+
return {
|
|
391
|
+
held: [...new Set([...heldLocators(connection), ...authoredLocators(connection)])],
|
|
392
|
+
staged: stagedLocators(connection),
|
|
393
|
+
};
|
|
394
|
+
case 'replica.demote':
|
|
395
|
+
return demoted(connection);
|
|
396
|
+
case 'replica.facts':
|
|
397
|
+
return facts(connection, request.names);
|
|
398
|
+
case 'replica.presentation':
|
|
399
|
+
return presentation(connection, request.app);
|
|
400
|
+
case 'replica.query':
|
|
401
|
+
return answerQuery(connection, request.plan, request.rooms, request.budget);
|
|
402
|
+
case 'replica.tallies':
|
|
403
|
+
return roomTallies(connection, request.totals, request.rooms, request.since);
|
|
404
|
+
case 'replica.entries':
|
|
405
|
+
return entries(connection, request.key, request.view, request.paths);
|
|
406
|
+
case 'replica.typed':
|
|
407
|
+
return typed(connection, request.key, request.view, request.paths);
|
|
408
|
+
case 'replica.referrers':
|
|
409
|
+
return referrers(connection, request.key, request.view, request.targets);
|
|
410
|
+
case 'replica.folders':
|
|
411
|
+
return folders(connection, request.key, request.paths);
|
|
412
|
+
case 'replica.typedWithin':
|
|
413
|
+
return typedWithin(connection, request.key, request.view, request.roots, request.within);
|
|
414
|
+
case 'replica.stage':
|
|
415
|
+
return fenced(connection, request.locator) ? null : stage(connection, request);
|
|
416
|
+
case 'replica.resume':
|
|
417
|
+
return fenced(connection, request.locator) ? null : resume(connection, request);
|
|
418
|
+
case 'replica.refresh':
|
|
419
|
+
return refreshing(connection, request);
|
|
420
|
+
case 'replica.unrefresh':
|
|
421
|
+
return unrefresh(connection, request.key);
|
|
422
|
+
case 'replica.commit':
|
|
423
|
+
return committed(connection, request);
|
|
424
|
+
case 'replica.fence':
|
|
425
|
+
return fence(connection, request.locators);
|
|
426
|
+
case 'replica.erase':
|
|
427
|
+
return erased(connection, request);
|
|
428
|
+
case 'replica.abandon':
|
|
429
|
+
return abandon(connection, request.locator);
|
|
430
|
+
case 'replica.unfence':
|
|
431
|
+
return unfencedRooms(connection, request.locators);
|
|
432
|
+
case 'replica.release':
|
|
433
|
+
return release(connection, request.key);
|
|
434
|
+
case 'replica.rederive':
|
|
435
|
+
return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
|
|
436
|
+
case 'replica.fact':
|
|
437
|
+
connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
|
|
438
|
+
request.name,
|
|
439
|
+
request.value,
|
|
440
|
+
]);
|
|
441
|
+
return null;
|
|
442
|
+
case 'replica.present':
|
|
443
|
+
connection.run('INSERT OR REPLACE INTO replica_presentation (app, value) VALUES (?, ?)', [
|
|
444
|
+
request.app,
|
|
445
|
+
request.value,
|
|
446
|
+
]);
|
|
447
|
+
return null;
|
|
448
|
+
case 'opened.find':
|
|
449
|
+
return openedFile(connection, request);
|
|
450
|
+
case 'opened.begin':
|
|
451
|
+
return opening(connection, request);
|
|
452
|
+
case 'opened.part':
|
|
453
|
+
return openedPart(connection, request);
|
|
454
|
+
case 'opened.keep':
|
|
455
|
+
return keptOpened(connection, request);
|
|
456
|
+
case 'opened.drop':
|
|
457
|
+
return dropped(connection, request.key);
|
|
458
|
+
case 'opened.clean':
|
|
459
|
+
return cleaned(connection);
|
|
460
|
+
case 'opened.held':
|
|
461
|
+
return openedHeld(connection);
|
|
462
|
+
case 'file.part':
|
|
463
|
+
return heldPart(connection, request.key, request.part);
|
|
464
|
+
case 'conversation.held':
|
|
465
|
+
return heldConversations(connection, request.conversations);
|
|
466
|
+
case 'conversation.keep': {
|
|
467
|
+
const { kind: _kind, ...write } = request;
|
|
468
|
+
return keptMessages(connection, write);
|
|
469
|
+
}
|
|
470
|
+
case 'conversation.window':
|
|
471
|
+
return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
|
|
472
|
+
case 'conversation.count':
|
|
473
|
+
return messageCount(connection, request.conversation, request.phrase);
|
|
474
|
+
case 'conversation.turn':
|
|
475
|
+
return turnArrived(connection, request.conversation, request.turn);
|
|
476
|
+
case 'conversation.rows':
|
|
477
|
+
return conversationRows(connection, request.conversations);
|
|
478
|
+
case 'conversation.tallies':
|
|
479
|
+
return conversationTallies(connection, request.conversations, request.since);
|
|
480
|
+
case 'conversation.facts':
|
|
481
|
+
return conversationFacts(connection);
|
|
482
|
+
case 'conversation.fact': {
|
|
483
|
+
const { kind: _kind, ...fact } = request;
|
|
484
|
+
return keptFact(connection, fact);
|
|
485
|
+
}
|
|
486
|
+
case 'conversation.stored':
|
|
487
|
+
return storedConversations(connection, null);
|
|
488
|
+
case 'conversation.drop':
|
|
489
|
+
return droppedConversations(connection, request.conversations);
|
|
490
|
+
case 'space.probe':
|
|
491
|
+
return spool.probe(PROBE_BYTES).then(() => null);
|
|
492
|
+
case 'read.stored':
|
|
493
|
+
return storedRead(connection, request);
|
|
494
|
+
case 'read.keep':
|
|
495
|
+
return keptRead(connection, request, request.answer);
|
|
496
|
+
case 'read.builds':
|
|
497
|
+
return readsOfOtherBuildsForgotten(connection, request.build);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
@@ -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":"AACA,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,128 @@
|
|
|
1
|
+
import { CHAT_MESSAGE_TYPE, CHAT_TYPE, instantKey, sql } from '@agentshouse/mdmodel';
|
|
2
|
+
import { answerQuery, VISIBLE, within } from './compile.js';
|
|
3
|
+
import { HOUSE_DIRECTORY } from './figures.js';
|
|
4
|
+
const NONE = { count: 0, size: 0 };
|
|
5
|
+
const { all, fragment, joined } = sql;
|
|
6
|
+
function instant(value) {
|
|
7
|
+
return typeof value === 'string' ? value : null;
|
|
8
|
+
}
|
|
9
|
+
function held(alias, keys) {
|
|
10
|
+
const reserved = within(alias, HOUSE_DIRECTORY);
|
|
11
|
+
return all([
|
|
12
|
+
fragment(`${alias}.key IN (SELECT value FROM json_each(?))`, [JSON.stringify(keys)]),
|
|
13
|
+
fragment(VISIBLE(alias)),
|
|
14
|
+
fragment(`NOT ${reserved.sql}`, reserved.bind),
|
|
15
|
+
]);
|
|
16
|
+
}
|
|
17
|
+
function valued(alias, document, field) {
|
|
18
|
+
return joined([
|
|
19
|
+
fragment(`${alias}.doc = ${document}.id AND `),
|
|
20
|
+
sql.grouped(sql.placed(alias, field, 'exact')),
|
|
21
|
+
fragment(` AND ${alias}.item = -1`),
|
|
22
|
+
], '');
|
|
23
|
+
}
|
|
24
|
+
function inboxed(card) {
|
|
25
|
+
return joined([
|
|
26
|
+
fragment('EXISTS (SELECT 1 FROM replica_values i WHERE '),
|
|
27
|
+
valued('i', card, '/inbox'),
|
|
28
|
+
fragment(" AND i.kind = 'string')"),
|
|
29
|
+
], '');
|
|
30
|
+
}
|
|
31
|
+
function rowsOf(connection, query) {
|
|
32
|
+
return connection.rows(query.sql, query.bind);
|
|
33
|
+
}
|
|
34
|
+
function documentTimes(connection, keys, since) {
|
|
35
|
+
return rowsOf(connection, joined([
|
|
36
|
+
fragment('SELECT d.key AS key, d.created_instant AS created, d.changed_instant AS changed FROM replica_entries d WHERE '),
|
|
37
|
+
held('d', keys),
|
|
38
|
+
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]),
|
|
39
|
+
], ''));
|
|
40
|
+
}
|
|
41
|
+
function chatTimes(connection, keys, since) {
|
|
42
|
+
return rowsOf(connection, joined([
|
|
43
|
+
fragment('SELECT d.key AS key, d.created_instant AS at FROM replica_entries d WHERE '),
|
|
44
|
+
held('d', keys),
|
|
45
|
+
fragment(' AND d.type = ? AND d.created_instant >= ? AND ', [CHAT_TYPE, since]),
|
|
46
|
+
inboxed('d'),
|
|
47
|
+
], ''));
|
|
48
|
+
}
|
|
49
|
+
function messageTimes(connection, keys, since) {
|
|
50
|
+
return rowsOf(connection, joined([
|
|
51
|
+
fragment('SELECT m.key AS key, s.instant AS at FROM replica_entries m JOIN replica_values s ON '),
|
|
52
|
+
valued('s', 'm', '/sent_at'),
|
|
53
|
+
fragment(' AND s.instant >= ? JOIN replica_values r ON ', [since]),
|
|
54
|
+
valued('r', 'm', '/direction'),
|
|
55
|
+
fragment(" AND r.kind = 'string' AND r.value = 'in' WHERE "),
|
|
56
|
+
held('m', keys),
|
|
57
|
+
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]),
|
|
58
|
+
inboxed('c'),
|
|
59
|
+
fragment(')'),
|
|
60
|
+
], ''));
|
|
61
|
+
}
|
|
62
|
+
function byKey(rows, read) {
|
|
63
|
+
const kept = new Map();
|
|
64
|
+
for (const row of rows) {
|
|
65
|
+
const key = Number(row.key);
|
|
66
|
+
const list = kept.get(key) ?? [];
|
|
67
|
+
list.push(read(row));
|
|
68
|
+
kept.set(key, list);
|
|
69
|
+
}
|
|
70
|
+
return kept;
|
|
71
|
+
}
|
|
72
|
+
export function roomTallies(connection, totals, rooms, since) {
|
|
73
|
+
const keys = rooms.map(({ key }) => key);
|
|
74
|
+
const from = instantKey(since);
|
|
75
|
+
const answered = answerQuery(connection, totals, rooms);
|
|
76
|
+
const summed = new Map(('groups' in answered ? answered.groups : []).map((group) => [String(group.key[0]), group]));
|
|
77
|
+
const documents = byKey(documentTimes(connection, keys, from), (row) => [instant(row.created), instant(row.changed)]);
|
|
78
|
+
const chats = byKey(chatTimes(connection, keys, from), (row) => instant(row.at));
|
|
79
|
+
const messages = byKey(messageTimes(connection, keys, from), (row) => instant(row.at));
|
|
80
|
+
return rooms.map(({ locator, key }) => {
|
|
81
|
+
const total = summed.get(locator);
|
|
82
|
+
return {
|
|
83
|
+
key,
|
|
84
|
+
documents: total?.documents ?? NONE,
|
|
85
|
+
files: total?.files ?? NONE,
|
|
86
|
+
documentTimes: documents.get(key) ?? [],
|
|
87
|
+
chatTimes: chats.get(key) ?? [],
|
|
88
|
+
messageTimes: messages.get(key) ?? [],
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const ACCEPTED = "message ->> '$.accepted_at'";
|
|
93
|
+
const NEWER = 'ORDER BY n.position DESC, n.identity DESC LIMIT 1';
|
|
94
|
+
const SAID = `WITH RECURSIVE
|
|
95
|
+
named(conversation) AS (SELECT value FROM json_each(?)),
|
|
96
|
+
walk(conversation, position, identity, at, role) AS (
|
|
97
|
+
SELECT m.conversation, m.position, m.identity, m.${ACCEPTED}, m.message ->> '$.role'
|
|
98
|
+
FROM named JOIN conversation_messages m ON m.id = (
|
|
99
|
+
SELECT n.id FROM conversation_messages n WHERE n.conversation = named.conversation ${NEWER}
|
|
100
|
+
)
|
|
101
|
+
UNION ALL
|
|
102
|
+
SELECT m.conversation, m.position, m.identity, m.${ACCEPTED}, m.message ->> '$.role'
|
|
103
|
+
FROM walk JOIN conversation_messages m ON m.id = (
|
|
104
|
+
SELECT n.id FROM conversation_messages n WHERE n.conversation = walk.conversation
|
|
105
|
+
AND (n.position < walk.position OR (n.position = walk.position AND n.identity < walk.identity))
|
|
106
|
+
${NEWER}
|
|
107
|
+
)
|
|
108
|
+
WHERE julianday(walk.at) >= julianday(?)
|
|
109
|
+
)
|
|
110
|
+
SELECT walk.conversation AS conversation, walk.at AS at
|
|
111
|
+
FROM walk
|
|
112
|
+
WHERE walk.role IN ('user', 'assistant') AND julianday(walk.at) >= julianday(?)`;
|
|
113
|
+
export function conversationTallies(connection, conversations, since) {
|
|
114
|
+
const named = conversations ??
|
|
115
|
+
connection
|
|
116
|
+
.rows('SELECT DISTINCT conversation FROM conversation_messages')
|
|
117
|
+
.map((row) => String(row.conversation));
|
|
118
|
+
const from = instantKey(since);
|
|
119
|
+
const said = new Map();
|
|
120
|
+
for (const row of connection.rows(SAID, [JSON.stringify(named), since, since])) {
|
|
121
|
+
const at = instantKey(row.at);
|
|
122
|
+
if (at === null || at < from)
|
|
123
|
+
continue;
|
|
124
|
+
const conversation = String(row.conversation);
|
|
125
|
+
said.set(conversation, [...(said.get(conversation) ?? []), at]);
|
|
126
|
+
}
|
|
127
|
+
return named.map((conversation) => ({ conversation, said: said.get(conversation) ?? [] }));
|
|
128
|
+
}
|
package/dist/transfer.d.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import type { Refusal } from '@agentshouse/mdmodel';
|
|
2
1
|
export type Unconfirmed = {
|
|
3
2
|
kind: 'unconfirmed';
|
|
4
3
|
};
|
|
5
|
-
export type Refused = {
|
|
6
|
-
kind: 'refused';
|
|
7
|
-
refusal: Refusal;
|
|
8
|
-
};
|
|
9
4
|
export declare const unconfirmed: Unconfirmed;
|
|
10
5
|
//# sourceMappingURL=transfer.d.ts.map
|
package/dist/transfer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAElD,eAAO,MAAM,WAAW,EAAE,WAAqC,CAAC"}
|
package/dist/turn.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export declare function yielded(): Promise<void>;
|
|
2
2
|
export declare const ROW_WEIGHT = 256;
|
|
3
3
|
export type Later<T> = T | Promise<T>;
|
|
4
|
-
export declare function after<T, R>(value: Later<T>, next: (value: T) => R): Later<R>;
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
4
|
+
export declare function after<T, R>(value: Later<T>, next: (value: T) => Later<R>): Later<R>;
|
|
5
|
+
export declare function paced(): (weight: number) => Later<void>;
|
|
6
|
+
export declare function inUnits<T>(items: Iterable<T>, each: (item: T) => number, ended?: () => void, paused?: () => Promise<void>): Later<void>;
|
|
7
|
+
export declare function finished<R>(steps: Generator<number, R, void>): R;
|
|
8
|
+
export declare function stepped<R>(steps: Generator<number, R, void>): Later<R>;
|
|
7
9
|
//# sourceMappingURL=turn.d.ts.map
|