@agentshouse/mdruntime 0.1.0-cae97ad2e9142 → 0.1.0-caf080a9a9c60
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 +14 -14
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +318 -0
- package/dist/act-lanes.d.ts +29 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +177 -0
- package/dist/actions.d.ts +25 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +261 -0
- package/dist/adapter.d.ts +126 -107
- 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 +29 -47
- package/dist/bootstrap.d.ts +17 -19
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +266 -135
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chain.d.ts +2 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/change-set.d.ts +4 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +6 -0
- package/dist/change.d.ts +1 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +4 -2
- package/dist/chat-types.d.ts +5 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/client.d.ts +28 -18
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +84 -20
- package/dist/collection.d.ts +28 -7
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +35 -19
- package/dist/compile.d.ts +8 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +289 -332
- package/dist/connection.d.ts +6 -141
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -5012
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-live.d.ts +138 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +249 -0
- package/dist/conversation-row.d.ts +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +53 -0
- package/dist/conversation.d.ts +59 -50
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +938 -832
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +153 -0
- package/dist/durability.d.ts +18 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +3 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +19 -9
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/file.d.ts +2 -11
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +6 -4
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +20 -8
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +70 -40
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +33 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/install.d.ts +54 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +539 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +279 -0
- package/dist/listing.d.ts +48 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +139 -0
- package/dist/live.d.ts +5 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +64 -23
- package/dist/locks.d.ts +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +33 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +50 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +218 -0
- package/dist/memory.d.ts +15 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +251 -98
- package/dist/messages.d.ts +24 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +92 -32
- package/dist/model.d.ts +8 -11
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +5 -22
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +156 -0
- package/dist/observation.d.ts +3 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +15 -15
- package/dist/opened.d.ts +1 -1
- package/dist/opened.d.ts.map +1 -1
- package/dist/opened.js +5 -5
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +59 -0
- package/dist/outcome.d.ts +20 -6
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +34 -2
- package/dist/overlay.d.ts +6 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +47 -21
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +3 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +10 -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 +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +233 -0
- package/dist/presence.d.ts +52 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +220 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +285 -0
- package/dist/query.d.ts +14 -210
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -505
- package/dist/questions.d.ts +29 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +115 -0
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +465 -0
- package/dist/reach.d.ts +15 -12
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +228 -145
- package/dist/react.d.ts +15 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/readiness.d.ts +3 -18
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +4 -10
- package/dist/reads.d.ts +38 -10
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +163 -85
- package/dist/recovery.d.ts +3 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +57 -1
- package/dist/refresh.d.ts +7 -5
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +35 -7
- 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 +13 -19
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +66 -35
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +24 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +142 -106
- 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 +16 -21
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +46 -174
- package/dist/runtime.d.ts +36 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +42 -84
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +349 -170
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +413 -0
- package/dist/search.d.ts +12 -63
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +9 -52
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -1
- package/dist/shared.d.ts +1 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +13 -105
- package/dist/shown.d.ts +32 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +290 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +21 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +80 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +68 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +171 -0
- package/dist/source.d.ts +54 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +82 -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 +34 -0
- package/dist/store/readiness.d.ts +10 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +52 -0
- package/dist/store/records.d.ts +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +430 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +110 -158
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +167 -403
- package/dist/stored.d.ts +65 -59
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +356 -271
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +223 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +540 -0
- package/dist/tables.d.ts +127 -69
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +218 -105
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/validation.d.ts +3 -4
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +42 -100
- package/dist/windows.d.ts +1 -12
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -75
- package/dist/wire.d.ts +63 -11
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +21 -5
- package/package.json +3 -2
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/fulltext.d.ts +0 -27
- package/dist/fulltext.d.ts.map +0 -1
- package/dist/fulltext.js +0 -368
- package/dist/words.d.ts +0 -19
- package/dist/words.d.ts.map +0 -1
- package/dist/words.js +0 -150
package/dist/tables.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
import { sql } from '@agentshouse/mdmodel';
|
|
1
2
|
import { answerQuery } from './compile.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { conversationRows, droppedMessages, forgottenMessages, heldConversations, keptMessages, messageCount, messageWindow, MESSAGE_TABLES, turnArrived, } from './messages.js';
|
|
4
|
+
import { keptRead, READ_TABLES, readsOfOtherBuildsForgotten, storedRead, } from './reads.js';
|
|
5
|
+
import { conversationTallies, roomTallies, } from './tallies.js';
|
|
6
|
+
import { abandon, release, commit, covering, demoted, ended, entries, erase, facts, fenceRooms, folders, heldLocators, heldRoom, heldRooms, offlineMode, opened, overlaid, presentation, rederive, referrers, refreshing, REPLICA_TABLES, resume, stage, typed, stagedLocators, typedWithin, unrefresh, } from './stored.js';
|
|
5
7
|
const STATEMENTS_HELD = 256;
|
|
6
8
|
export function sqliteConnection(engine, database) {
|
|
7
9
|
const decoder = new TextDecoder();
|
|
8
10
|
const held = new Map();
|
|
11
|
+
database.createFunction(sql.HOLDS_PHRASE, sql.holdsPhrase, {
|
|
12
|
+
arity: 2,
|
|
13
|
+
deterministic: true,
|
|
14
|
+
});
|
|
9
15
|
function prepared(sql) {
|
|
10
16
|
if (sql.includes(';'))
|
|
11
17
|
return null;
|
|
@@ -72,7 +78,7 @@ const TABLES = [
|
|
|
72
78
|
['authored_queues', 'locator TEXT PRIMARY KEY, ids TEXT NOT NULL'],
|
|
73
79
|
[
|
|
74
80
|
'authored_pending',
|
|
75
|
-
'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, PRIMARY KEY (locator, id)',
|
|
81
|
+
'locator TEXT NOT NULL, id TEXT NOT NULL, batch TEXT NOT NULL, state TEXT NOT NULL, files TEXT NOT NULL, paths TEXT NOT NULL, moving INTEGER NOT NULL, PRIMARY KEY (locator, id)',
|
|
76
82
|
],
|
|
77
83
|
[
|
|
78
84
|
'authored_room_drafts',
|
|
@@ -89,38 +95,52 @@ export const RUNTIME_TABLES = [
|
|
|
89
95
|
'CREATE INDEX opened_files_name ON opened_files (locator, path, revision)',
|
|
90
96
|
...REPLICA_TABLES,
|
|
91
97
|
...MESSAGE_TABLES,
|
|
92
|
-
...
|
|
98
|
+
...READ_TABLES,
|
|
93
99
|
];
|
|
94
100
|
const OWNERS = ['authored_pending', 'authored_room_drafts', 'authored_calls'];
|
|
95
101
|
const AUTHORED_KEYS = OWNERS.map((table) => `SELECT value FROM ${table}, json_each(${table}.files)`).join(' UNION ');
|
|
96
102
|
const UNOWNED_PARTS = `DELETE FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS} UNION SELECT key FROM opened_files)`;
|
|
103
|
+
const CLEANABLE_BYTES = `SELECT coalesce(sum(length(bytes)), 0) AS bytes FROM file_parts WHERE key NOT IN (${AUTHORED_KEYS})`;
|
|
97
104
|
const READS = new Set([
|
|
98
|
-
'authored.
|
|
105
|
+
'authored.status',
|
|
106
|
+
'authored.moving',
|
|
107
|
+
'authored.pending',
|
|
108
|
+
'authored.batch',
|
|
109
|
+
'authored.order',
|
|
110
|
+
'authored.queued',
|
|
99
111
|
'authored.roomDrafts',
|
|
112
|
+
'authored.chatDraft.read',
|
|
100
113
|
'authored.chatDrafts',
|
|
101
114
|
'authored.calls',
|
|
102
115
|
'authored.fences',
|
|
116
|
+
'authored.unsent',
|
|
103
117
|
'authored.fact',
|
|
104
118
|
'authored.file',
|
|
105
119
|
'replica.open',
|
|
120
|
+
'replica.rooms',
|
|
121
|
+
'replica.room',
|
|
122
|
+
'replica.covering',
|
|
123
|
+
'replica.offline',
|
|
124
|
+
'replica.held',
|
|
125
|
+
'replica.facts',
|
|
126
|
+
'replica.presentation',
|
|
106
127
|
'replica.query',
|
|
128
|
+
'replica.tallies',
|
|
107
129
|
'replica.entries',
|
|
108
130
|
'replica.typed',
|
|
109
131
|
'replica.referrers',
|
|
110
|
-
'replica.
|
|
111
|
-
'replica.files',
|
|
132
|
+
'replica.folders',
|
|
112
133
|
'replica.typedWithin',
|
|
113
|
-
'replica.counts',
|
|
114
|
-
'replica.search',
|
|
115
|
-
'replica.received',
|
|
116
|
-
'replica.receivedParts',
|
|
117
|
-
'replica.transferPart',
|
|
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,19 +152,19 @@ const KINDS = new Set([
|
|
|
132
152
|
'authored.claim',
|
|
133
153
|
'authored.end',
|
|
134
154
|
'replica.stage',
|
|
135
|
-
'replica.
|
|
155
|
+
'replica.resume',
|
|
136
156
|
'replica.refresh',
|
|
137
157
|
'replica.unrefresh',
|
|
138
158
|
'replica.commit',
|
|
139
159
|
'replica.fence',
|
|
140
160
|
'replica.erase',
|
|
141
161
|
'replica.abandon',
|
|
162
|
+
'replica.unfence',
|
|
142
163
|
'replica.release',
|
|
143
164
|
'replica.rederive',
|
|
165
|
+
'replica.demote',
|
|
144
166
|
'replica.fact',
|
|
145
167
|
'replica.present',
|
|
146
|
-
'replica.receive',
|
|
147
|
-
'replica.unreceive',
|
|
148
168
|
'opened.begin',
|
|
149
169
|
'opened.part',
|
|
150
170
|
'opened.keep',
|
|
@@ -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,29 +247,71 @@ 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
|
-
locator: text(row.locator),
|
|
237
|
-
id: text(row.id),
|
|
238
|
-
batch: text(row.batch),
|
|
239
|
-
state: text(row.state),
|
|
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
|
+
}),
|
|
241
271
|
};
|
|
242
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,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
function roomDraftRecords(connection, locator, paths) {
|
|
296
|
+
if (locator === null) {
|
|
297
|
+
return texts(connection.rows('SELECT record FROM authored_room_drafts'), 'record');
|
|
298
|
+
}
|
|
299
|
+
if (paths === null) {
|
|
300
|
+
return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ?', [locator]), 'record');
|
|
301
|
+
}
|
|
302
|
+
return texts(connection.rows('SELECT record FROM authored_room_drafts WHERE locator = ? AND path IN (SELECT value FROM json_each(?))', [locator, JSON.stringify(paths)]), 'record');
|
|
303
|
+
}
|
|
304
|
+
function chatDraftRecord(connection, conversation) {
|
|
305
|
+
const [held] = connection.rows('SELECT record FROM authored_chat_drafts WHERE conversation = ?', [
|
|
306
|
+
conversation,
|
|
307
|
+
]);
|
|
308
|
+
return held === undefined ? null : text(held.record);
|
|
309
|
+
}
|
|
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));
|
|
246
313
|
}
|
|
247
|
-
function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts
|
|
248
|
-
for (const { id, amendment } of amendments ?? []) {
|
|
249
|
-
amended(connection, { kind: 'authored.amend', locator, id, amendment });
|
|
250
|
-
}
|
|
314
|
+
function keptRows(connection, { locator, order, added, founded, roomDrafts, consumedRoomDrafts }) {
|
|
251
315
|
for (const path of consumedRoomDrafts ?? []) {
|
|
252
316
|
connection.run('DELETE FROM authored_room_drafts WHERE locator = ? AND path = ?', [
|
|
253
317
|
locator,
|
|
@@ -274,19 +338,26 @@ function keptRows(connection, { locator, order, added, founded, roomDrafts, cons
|
|
|
274
338
|
connection.run('DELETE FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
275
339
|
}
|
|
276
340
|
}
|
|
277
|
-
for (const { id, batch, state, files } of added ?? []) {
|
|
278
|
-
if (before.has(id)
|
|
341
|
+
for (const { id, batch, state, files, paths, moving } of added ?? []) {
|
|
342
|
+
if (before.has(id))
|
|
279
343
|
continue;
|
|
280
|
-
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]);
|
|
281
345
|
}
|
|
282
|
-
for (const { id, batch, files } of founded ?? []) {
|
|
346
|
+
for (const { id, batch, files, paths, moving } of founded ?? []) {
|
|
283
347
|
const [held] = connection.rows('SELECT files FROM authored_pending WHERE locator = ? AND id = ?', [locator, id]);
|
|
284
348
|
if (held === undefined || !before.has(id))
|
|
285
349
|
continue;
|
|
286
|
-
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
|
+
]);
|
|
287
358
|
}
|
|
288
359
|
}
|
|
289
|
-
async function kept(connection, { writes, files, whole
|
|
360
|
+
async function kept(connection, { writes, files, whole }) {
|
|
290
361
|
const refused = writes.find(({ locator }) => fenced(connection, locator));
|
|
291
362
|
if (refused !== undefined && whole)
|
|
292
363
|
return refused.locator;
|
|
@@ -295,8 +366,6 @@ async function kept(connection, { writes, files, whole, discards }) {
|
|
|
295
366
|
if (!fenced(connection, write.locator))
|
|
296
367
|
keptRows(connection, write);
|
|
297
368
|
}
|
|
298
|
-
for (const locator of discards ?? [])
|
|
299
|
-
roomWork(connection, locator);
|
|
300
369
|
unowned(connection);
|
|
301
370
|
return refused?.locator ?? null;
|
|
302
371
|
}
|
|
@@ -366,11 +435,15 @@ function fence(connection, locators) {
|
|
|
366
435
|
return fenceRooms(connection, locators);
|
|
367
436
|
}
|
|
368
437
|
function erased(connection, { locator, limit }) {
|
|
369
|
-
|
|
370
|
-
|
|
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) {
|
|
371
444
|
connection.run('DELETE FROM authored_fences WHERE locator = ?', [locator]);
|
|
372
445
|
}
|
|
373
|
-
return
|
|
446
|
+
return erased;
|
|
374
447
|
}
|
|
375
448
|
function claim(connection, holder) {
|
|
376
449
|
const held = fact(connection, 'holder');
|
|
@@ -433,9 +506,9 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
433
506
|
if (fetched === null)
|
|
434
507
|
return false;
|
|
435
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]);
|
|
436
|
-
const whole = count(held
|
|
437
|
-
count(held
|
|
438
|
-
(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));
|
|
439
512
|
if (!whole) {
|
|
440
513
|
dropped(connection, key);
|
|
441
514
|
return false;
|
|
@@ -449,56 +522,82 @@ function keptOpened(connection, { key, sha256, byteLength, parts }) {
|
|
|
449
522
|
unowned(connection);
|
|
450
523
|
return true;
|
|
451
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
|
+
}
|
|
452
539
|
function cleaned(connection) {
|
|
453
540
|
connection.run('DELETE FROM opened_files');
|
|
454
|
-
const
|
|
541
|
+
const freed = cleanable(connection);
|
|
455
542
|
unowned(connection);
|
|
456
|
-
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
|
+
};
|
|
457
552
|
}
|
|
458
553
|
async function committed(connection, { authored, rooms }) {
|
|
459
554
|
const refused = authored === undefined ? null : await kept(connection, authored);
|
|
460
555
|
if (refused !== null && authored?.whole === true) {
|
|
461
|
-
return { fenced: refused,
|
|
556
|
+
return { fenced: refused, changed: {}, indexed: {} };
|
|
462
557
|
}
|
|
463
558
|
return {
|
|
464
559
|
fenced: refused,
|
|
465
560
|
...commit(connection, rooms.filter(({ locator }) => !fenced(connection, locator))),
|
|
466
561
|
};
|
|
467
562
|
}
|
|
468
|
-
function receivedParts(connection, key, count) {
|
|
469
|
-
return connection
|
|
470
|
-
.rows('SELECT value FROM replica_received_parts WHERE key = ? AND part < ? ORDER BY part', [
|
|
471
|
-
key,
|
|
472
|
-
count,
|
|
473
|
-
])
|
|
474
|
-
.map((row) => JSON.parse(text(row.value)));
|
|
475
|
-
}
|
|
476
|
-
function receive(connection, { key, head, part }) {
|
|
477
|
-
connection.run('INSERT OR REPLACE INTO replica_received (key, head) VALUES (?, ?)', [key, head]);
|
|
478
|
-
if (part !== undefined) {
|
|
479
|
-
connection.run('INSERT OR REPLACE INTO replica_received_parts (key, part, value) VALUES (?, ?, ?)', [key, part.index, part.value]);
|
|
480
|
-
}
|
|
481
|
-
return null;
|
|
482
|
-
}
|
|
483
|
-
function unreceive(connection, keys) {
|
|
484
|
-
for (const key of keys) {
|
|
485
|
-
connection.run('DELETE FROM replica_received WHERE key = ?', [key]);
|
|
486
|
-
connection.run('DELETE FROM replica_received_parts WHERE key = ?', [key]);
|
|
487
|
-
}
|
|
488
|
-
return null;
|
|
489
|
-
}
|
|
490
563
|
export function answerRuntime(connection, request, spool) {
|
|
491
564
|
switch (request.kind) {
|
|
492
|
-
case 'authored.
|
|
493
|
-
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');
|
|
494
589
|
case 'authored.roomDrafts':
|
|
495
|
-
return
|
|
590
|
+
return roomDraftRecords(connection, request.locator, request.paths);
|
|
591
|
+
case 'authored.chatDraft.read':
|
|
592
|
+
return chatDraftRecord(connection, request.conversation);
|
|
496
593
|
case 'authored.chatDrafts':
|
|
497
594
|
return texts(connection.rows('SELECT record FROM authored_chat_drafts'), 'record');
|
|
498
595
|
case 'authored.calls':
|
|
499
596
|
return texts(connection.rows('SELECT record FROM authored_calls'), 'record');
|
|
500
597
|
case 'authored.fences':
|
|
501
598
|
return texts(connection.rows('SELECT locator FROM authored_fences'), 'locator');
|
|
599
|
+
case 'authored.unsent':
|
|
600
|
+
return unsent(connection);
|
|
502
601
|
case 'authored.fact':
|
|
503
602
|
return fact(connection, request.name);
|
|
504
603
|
case 'authored.file':
|
|
@@ -519,39 +618,43 @@ export function answerRuntime(connection, request, spool) {
|
|
|
519
618
|
return end(connection, request.holder);
|
|
520
619
|
case 'replica.open':
|
|
521
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);
|
|
522
640
|
case 'replica.query':
|
|
523
641
|
return answerQuery(connection, request.plan, request.rooms, request.budget);
|
|
642
|
+
case 'replica.tallies':
|
|
643
|
+
return roomTallies(connection, request.totals, request.rooms, request.since);
|
|
524
644
|
case 'replica.entries':
|
|
525
645
|
return entries(connection, request.key, request.view, request.paths);
|
|
526
646
|
case 'replica.typed':
|
|
527
647
|
return typed(connection, request.key, request.view, request.paths);
|
|
528
648
|
case 'replica.referrers':
|
|
529
|
-
return referrers(connection, request.key, request.view, request.targets
|
|
530
|
-
case 'replica.
|
|
531
|
-
return
|
|
532
|
-
case 'replica.files':
|
|
533
|
-
return files(connection, request.key, request.view, request.after, request.limit);
|
|
649
|
+
return referrers(connection, request.key, request.view, request.targets);
|
|
650
|
+
case 'replica.folders':
|
|
651
|
+
return folders(connection, request.key, request.paths);
|
|
534
652
|
case 'replica.typedWithin':
|
|
535
653
|
return typedWithin(connection, request.key, request.view, request.roots, request.within);
|
|
536
|
-
case 'replica.counts':
|
|
537
|
-
return counts(connection, request.rooms);
|
|
538
|
-
case 'replica.search': {
|
|
539
|
-
const { kind: _kind, ...ask } = request;
|
|
540
|
-
return searched(connection, ask);
|
|
541
|
-
}
|
|
542
|
-
case 'replica.received':
|
|
543
|
-
return connection.rows('SELECT key, head FROM replica_received').map((row) => ({
|
|
544
|
-
key: text(row.key),
|
|
545
|
-
head: JSON.parse(text(row.head)),
|
|
546
|
-
}));
|
|
547
|
-
case 'replica.receivedParts':
|
|
548
|
-
return receivedParts(connection, request.key, request.count);
|
|
549
654
|
case 'replica.stage':
|
|
550
655
|
return fenced(connection, request.locator) ? null : stage(connection, request);
|
|
551
|
-
case 'replica.
|
|
552
|
-
return
|
|
553
|
-
case 'replica.keepPart':
|
|
554
|
-
return fenced(connection, request.locator) ? null : keepPart(connection, request);
|
|
656
|
+
case 'replica.resume':
|
|
657
|
+
return fenced(connection, request.locator) ? null : resume(connection, request);
|
|
555
658
|
case 'replica.refresh':
|
|
556
659
|
return refreshing(connection, request);
|
|
557
660
|
case 'replica.unrefresh':
|
|
@@ -563,11 +666,13 @@ export function answerRuntime(connection, request, spool) {
|
|
|
563
666
|
case 'replica.erase':
|
|
564
667
|
return erased(connection, request);
|
|
565
668
|
case 'replica.abandon':
|
|
566
|
-
return abandon(connection, request.locator
|
|
669
|
+
return abandon(connection, request.locator);
|
|
670
|
+
case 'replica.unfence':
|
|
671
|
+
return unfenced(connection, request.locators);
|
|
567
672
|
case 'replica.release':
|
|
568
673
|
return release(connection, request.key);
|
|
569
674
|
case 'replica.rederive':
|
|
570
|
-
return rederive(connection, request.key, request.
|
|
675
|
+
return rederive(connection, request.key, request.composed, request.bytes, request.ms, request.floor);
|
|
571
676
|
case 'replica.fact':
|
|
572
677
|
connection.run('INSERT OR REPLACE INTO replica_facts (name, value) VALUES (?, ?)', [
|
|
573
678
|
request.name,
|
|
@@ -580,10 +685,6 @@ export function answerRuntime(connection, request, spool) {
|
|
|
580
685
|
request.value,
|
|
581
686
|
]);
|
|
582
687
|
return null;
|
|
583
|
-
case 'replica.receive':
|
|
584
|
-
return receive(connection, request);
|
|
585
|
-
case 'replica.unreceive':
|
|
586
|
-
return unreceive(connection, request.keys);
|
|
587
688
|
case 'opened.find':
|
|
588
689
|
return openedFile(connection, request);
|
|
589
690
|
case 'opened.begin':
|
|
@@ -596,20 +697,26 @@ export function answerRuntime(connection, request, spool) {
|
|
|
596
697
|
return dropped(connection, request.key);
|
|
597
698
|
case 'opened.clean':
|
|
598
699
|
return cleaned(connection);
|
|
700
|
+
case 'opened.held':
|
|
701
|
+
return openedHeld(connection);
|
|
599
702
|
case 'file.part':
|
|
600
703
|
return filePart(connection, request.key, request.part);
|
|
601
704
|
case 'conversation.held':
|
|
602
|
-
return heldConversations(connection);
|
|
705
|
+
return heldConversations(connection, request.conversations);
|
|
603
706
|
case 'conversation.keep': {
|
|
604
707
|
const { kind: _kind, ...write } = request;
|
|
605
708
|
return keptMessages(connection, write);
|
|
606
709
|
}
|
|
607
710
|
case 'conversation.window':
|
|
608
|
-
return messageWindow(connection, request.conversation, request.limit, request.before);
|
|
711
|
+
return messageWindow(connection, request.conversation, request.limit, request.before, request.phrase);
|
|
609
712
|
case 'conversation.count':
|
|
610
|
-
return messageCount(connection, request.conversation);
|
|
713
|
+
return messageCount(connection, request.conversation, request.phrase);
|
|
611
714
|
case 'conversation.turn':
|
|
612
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);
|
|
613
720
|
case 'conversation.drop':
|
|
614
721
|
chatDraft(connection, {
|
|
615
722
|
kind: 'authored.chatDraft',
|
|
@@ -620,5 +727,11 @@ export function answerRuntime(connection, request, spool) {
|
|
|
620
727
|
return null;
|
|
621
728
|
case 'space.probe':
|
|
622
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);
|
|
623
736
|
}
|
|
624
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"}
|