agentenkit 0.2.3 → 0.4.0
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 +34 -14
- package/dist/adapters/inline.d.ts +19 -5
- package/dist/adapters/inline.d.ts.map +1 -1
- package/dist/adapters/inline.js +87 -14
- package/dist/adapters/inline.js.map +1 -1
- package/dist/adapters/memory.d.ts +65 -3
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +267 -3
- package/dist/adapters/memory.js.map +1 -1
- package/dist/adapters/prisma.d.ts +125 -18
- package/dist/adapters/prisma.d.ts.map +1 -1
- package/dist/adapters/prisma.js +308 -67
- package/dist/adapters/prisma.js.map +1 -1
- package/dist/adapters/qstash.d.ts +15 -2
- package/dist/adapters/qstash.d.ts.map +1 -1
- package/dist/adapters/qstash.js +31 -14
- package/dist/adapters/qstash.js.map +1 -1
- package/dist/adapters/redis.d.ts +40 -4
- package/dist/adapters/redis.d.ts.map +1 -1
- package/dist/adapters/redis.js +265 -20
- package/dist/adapters/redis.js.map +1 -1
- package/dist/adapters/sqlite.d.ts +52 -2
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +342 -35
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/stream-scripts.d.ts +49 -0
- package/dist/adapters/stream-scripts.d.ts.map +1 -0
- package/dist/adapters/stream-scripts.js +150 -0
- package/dist/adapters/stream-scripts.js.map +1 -0
- package/dist/adapters/upstash.d.ts +20 -0
- package/dist/adapters/upstash.d.ts.map +1 -1
- package/dist/adapters/upstash.js +29 -0
- package/dist/adapters/upstash.js.map +1 -1
- package/dist/admin/memory.d.ts +11 -1
- package/dist/admin/memory.d.ts.map +1 -1
- package/dist/admin/memory.js +83 -14
- package/dist/admin/memory.js.map +1 -1
- package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts +5 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.js +11 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.js.map +1 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts +5 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.js +15 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.js.map +1 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts +5 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.js +15 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.js.map +1 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts +5 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.js +12 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.js.map +1 -0
- package/dist/admin/migrations/postgres/index.d.ts.map +1 -1
- package/dist/admin/migrations/postgres/index.js +16 -1
- package/dist/admin/migrations/postgres/index.js.map +1 -1
- package/dist/admin/migrations/runner.d.ts +21 -1
- package/dist/admin/migrations/runner.d.ts.map +1 -1
- package/dist/admin/migrations/runner.js +41 -4
- package/dist/admin/migrations/runner.js.map +1 -1
- package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.js +11 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.js.map +1 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js +15 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js.map +1 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.js +15 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.js.map +1 -0
- package/dist/admin/migrations/sqlite/index.d.ts +2 -2
- package/dist/admin/migrations/sqlite/index.d.ts.map +1 -1
- package/dist/admin/migrations/sqlite/index.js +17 -3
- package/dist/admin/migrations/sqlite/index.js.map +1 -1
- package/dist/admin/postgres.d.ts +14 -4
- package/dist/admin/postgres.d.ts.map +1 -1
- package/dist/admin/postgres.js +131 -36
- package/dist/admin/postgres.js.map +1 -1
- package/dist/admin/shared.d.ts +19 -0
- package/dist/admin/shared.d.ts.map +1 -0
- package/dist/admin/shared.js +28 -0
- package/dist/admin/shared.js.map +1 -0
- package/dist/admin/sqlite.d.ts +9 -1
- package/dist/admin/sqlite.d.ts.map +1 -1
- package/dist/admin/sqlite.js +112 -29
- package/dist/admin/sqlite.js.map +1 -1
- package/dist/core/admin.d.ts +28 -6
- package/dist/core/admin.d.ts.map +1 -1
- package/dist/core/admin.js +92 -23
- package/dist/core/admin.js.map +1 -1
- package/dist/core/agent.d.ts +7 -4
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +15 -11
- package/dist/core/agent.js.map +1 -1
- package/dist/core/agui.d.ts +17 -0
- package/dist/core/agui.d.ts.map +1 -0
- package/dist/core/agui.js +69 -0
- package/dist/core/agui.js.map +1 -0
- package/dist/core/context.d.ts +13 -1
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +70 -19
- package/dist/core/context.js.map +1 -1
- package/dist/core/deleteThread.d.ts.map +1 -1
- package/dist/core/deleteThread.js +33 -4
- package/dist/core/deleteThread.js.map +1 -1
- package/dist/core/engine.d.ts +41 -11
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +855 -352
- package/dist/core/engine.js.map +1 -1
- package/dist/core/follow.d.ts +63 -1
- package/dist/core/follow.d.ts.map +1 -1
- package/dist/core/follow.js +293 -16
- package/dist/core/follow.js.map +1 -1
- package/dist/core/hitl.d.ts +43 -0
- package/dist/core/hitl.d.ts.map +1 -1
- package/dist/core/hitl.js +163 -35
- package/dist/core/hitl.js.map +1 -1
- package/dist/core/keys.d.ts +22 -4
- package/dist/core/keys.d.ts.map +1 -1
- package/dist/core/keys.js +23 -5
- package/dist/core/keys.js.map +1 -1
- package/dist/core/lease.d.ts +46 -0
- package/dist/core/lease.d.ts.map +1 -0
- package/dist/core/lease.js +142 -0
- package/dist/core/lease.js.map +1 -0
- package/dist/core/loop.d.ts +27 -7
- package/dist/core/loop.d.ts.map +1 -1
- package/dist/core/loop.js +140 -55
- package/dist/core/loop.js.map +1 -1
- package/dist/core/messages.d.ts +21 -2
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +61 -2
- package/dist/core/messages.js.map +1 -1
- package/dist/core/prune.d.ts +24 -0
- package/dist/core/prune.d.ts.map +1 -0
- package/dist/core/prune.js +43 -0
- package/dist/core/prune.js.map +1 -0
- package/dist/core/publish.d.ts +38 -10
- package/dist/core/publish.d.ts.map +1 -1
- package/dist/core/publish.js +126 -12
- package/dist/core/publish.js.map +1 -1
- package/dist/core/reclaim.d.ts +8 -1
- package/dist/core/reclaim.d.ts.map +1 -1
- package/dist/core/reclaim.js +149 -18
- package/dist/core/reclaim.js.map +1 -1
- package/dist/core/run.d.ts +7 -3
- package/dist/core/run.d.ts.map +1 -1
- package/dist/core/run.js +95 -35
- package/dist/core/run.js.map +1 -1
- package/dist/core/segment.d.ts +62 -0
- package/dist/core/segment.d.ts.map +1 -0
- package/dist/core/segment.js +318 -0
- package/dist/core/segment.js.map +1 -0
- package/dist/core/settle.d.ts +57 -0
- package/dist/core/settle.d.ts.map +1 -0
- package/dist/core/settle.js +181 -0
- package/dist/core/settle.js.map +1 -0
- package/dist/core/snapshot.d.ts +36 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/core/snapshot.js +87 -0
- package/dist/core/snapshot.js.map +1 -0
- package/dist/core/stop.d.ts +16 -1
- package/dist/core/stop.d.ts.map +1 -1
- package/dist/core/stop.js +69 -15
- package/dist/core/stop.js.map +1 -1
- package/dist/core/stream-events.d.ts +184 -0
- package/dist/core/stream-events.d.ts.map +1 -0
- package/dist/core/stream-events.js +26 -0
- package/dist/core/stream-events.js.map +1 -0
- package/dist/core/stream.d.ts +29 -0
- package/dist/core/stream.d.ts.map +1 -1
- package/dist/core/stream.js +79 -0
- package/dist/core/stream.js.map +1 -1
- package/dist/core/subagent.d.ts +36 -5
- package/dist/core/subagent.d.ts.map +1 -1
- package/dist/core/subagent.js +117 -22
- package/dist/core/subagent.js.map +1 -1
- package/dist/core/types.d.ts +197 -11
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +26 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/usage.d.ts +53 -5
- package/dist/core/usage.d.ts.map +1 -1
- package/dist/core/usage.js +170 -47
- package/dist/core/usage.js.map +1 -1
- package/dist/index.d.ts +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -7
- package/dist/index.js.map +1 -1
- package/dist/ports/admin.d.ts +59 -0
- package/dist/ports/admin.d.ts.map +1 -1
- package/dist/ports/kv.d.ts +17 -0
- package/dist/ports/kv.d.ts.map +1 -1
- package/dist/ports/queue.d.ts +87 -7
- package/dist/ports/queue.d.ts.map +1 -1
- package/dist/ports/queue.js +36 -1
- package/dist/ports/queue.js.map +1 -1
- package/dist/ports/runtime.d.ts +171 -20
- package/dist/ports/runtime.d.ts.map +1 -1
- package/dist/ports/storage.d.ts +26 -5
- package/dist/ports/storage.d.ts.map +1 -1
- package/dist/ports/streams.d.ts +60 -0
- package/dist/ports/streams.d.ts.map +1 -0
- package/dist/ports/streams.js +20 -0
- package/dist/ports/streams.js.map +1 -0
- package/dist/pricing.d.ts +5 -0
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +35 -10
- package/dist/pricing.js.map +1 -1
- package/dist/runtime.d.ts +6 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +144 -46
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
package/dist/adapters/sqlite.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import {
|
|
2
|
+
import { UsageMerger } from '../core/usage.js';
|
|
3
|
+
import { StreamClosedError, StreamGoneError } from '../ports/streams.js';
|
|
4
|
+
import { isStreamEnd } from '../core/stream-events.js';
|
|
5
|
+
import { sleep } from './stream-scripts.js';
|
|
3
6
|
/** Open a SQLite handle with whichever driver the process has: `bun:sqlite`
|
|
4
7
|
* first, then `node:sqlite`. Preferring one and requiring it are different
|
|
5
8
|
* things — a Next.js server runs on Node even inside a Bun workspace, which
|
|
@@ -19,7 +22,7 @@ export async function openSqlite(filename = 'agentic-kit.sqlite') {
|
|
|
19
22
|
const mod = await import(/* webpackIgnore: true */ /* @vite-ignore */ specifier);
|
|
20
23
|
const Ctor = mod.Database ?? mod.DatabaseSync;
|
|
21
24
|
if (Ctor)
|
|
22
|
-
return new Ctor(filename);
|
|
25
|
+
return tuneSqlite(new Ctor(filename));
|
|
23
26
|
}
|
|
24
27
|
catch (err) {
|
|
25
28
|
tried.push(`${specifier}: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -28,6 +31,17 @@ export async function openSqlite(filename = 'agentic-kit.sqlite') {
|
|
|
28
31
|
throw new Error('No SQLite driver available. Run under Bun, or Node 22+ for node:sqlite, ' +
|
|
29
32
|
`or construct the store with your own handle. Tried — ${tried.join('; ')}`);
|
|
30
33
|
}
|
|
34
|
+
/** Set a file up for more than one process (§3.4): WAL lets readers run beside
|
|
35
|
+
* the one writer, and busy_timeout makes a writer wait up to five seconds for
|
|
36
|
+
* the lock rather than fail at once with SQLITE_BUSY. `openSqlite` calls it;
|
|
37
|
+
* call it yourself on a handle you opened some other way. An in-memory
|
|
38
|
+
* database keeps its own journal mode, which is fine. */
|
|
39
|
+
export function tuneSqlite(db) {
|
|
40
|
+
for (const pragma of ['PRAGMA journal_mode=WAL', 'PRAGMA busy_timeout=5000']) {
|
|
41
|
+
db.prepare(pragma).all(); // both answer with a row
|
|
42
|
+
}
|
|
43
|
+
return db;
|
|
44
|
+
}
|
|
31
45
|
// SQLite has no date or JSON type: times are epoch milliseconds so they sort
|
|
32
46
|
// and compare as integers, and structured columns are TEXT holding JSON.
|
|
33
47
|
const json = (v) => (v === undefined ? null : JSON.stringify(v));
|
|
@@ -117,6 +131,50 @@ export class SqliteStorage {
|
|
|
117
131
|
costSource: 'TEXT',
|
|
118
132
|
});
|
|
119
133
|
this.db.prepare('CREATE INDEX IF NOT EXISTS usage_run ON usage(runId, createdAt)').run();
|
|
134
|
+
// The thread's current run, for ThreadTransition's compare-and-set.
|
|
135
|
+
this.addMissing('threads', { runId: 'TEXT' });
|
|
136
|
+
// The run a record entry belongs to.
|
|
137
|
+
this.addMissing('events', { runId: 'TEXT' });
|
|
138
|
+
// One event per seq on a thread: a counter that restarted must fail its
|
|
139
|
+
// write, never land a second event under a seq clients already have. A log
|
|
140
|
+
// from before this check may already hold duplicates; the index is then
|
|
141
|
+
// left off and said so, rather than refusing to start.
|
|
142
|
+
try {
|
|
143
|
+
this.db.prepare('CREATE UNIQUE INDEX IF NOT EXISTS events_thread_seq_unique ON events(threadId, seq)').run();
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
console.warn('event seq uniqueness not enforced: the log already holds duplicate seqs', err);
|
|
147
|
+
}
|
|
148
|
+
// The same for messages: two appends that raced to one seq must not both
|
|
149
|
+
// land, or a turn's order would depend on which row the database returns
|
|
150
|
+
// first.
|
|
151
|
+
try {
|
|
152
|
+
this.db.prepare('CREATE UNIQUE INDEX IF NOT EXISTS messages_thread_seq_unique ON messages(threadId, seq)').run();
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
console.warn('message seq uniqueness not enforced: the table already holds duplicate seqs', err);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Run `fn` in one write transaction. IMMEDIATE takes the write lock up
|
|
159
|
+
* front, so another process waits (busy_timeout) rather than failing half
|
|
160
|
+
* way through. */
|
|
161
|
+
tx(fn) {
|
|
162
|
+
this.write('BEGIN IMMEDIATE');
|
|
163
|
+
try {
|
|
164
|
+
const out = fn();
|
|
165
|
+
this.write('COMMIT');
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
try {
|
|
170
|
+
this.write('ROLLBACK');
|
|
171
|
+
}
|
|
172
|
+
catch { /* already gone */ }
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
changes(res) {
|
|
177
|
+
return Number(res?.changes ?? 0);
|
|
120
178
|
}
|
|
121
179
|
addMissing(table, cols) {
|
|
122
180
|
const have = new Set(this.db.prepare(`PRAGMA table_info(${table})`).all().map((c) => c.name));
|
|
@@ -144,7 +202,7 @@ export class SqliteStorage {
|
|
|
144
202
|
});
|
|
145
203
|
toEvent = (r) => ({
|
|
146
204
|
threadId: r.threadId, seq: r.seq, type: r.type,
|
|
147
|
-
payload: parse(r.payload), createdAt: new Date(r.createdAt),
|
|
205
|
+
payload: parse(r.payload), createdAt: new Date(r.createdAt), ...(r.runId ? { runId: r.runId } : {}),
|
|
148
206
|
});
|
|
149
207
|
threads = {
|
|
150
208
|
get: async (threadId) => {
|
|
@@ -164,22 +222,39 @@ export class SqliteStorage {
|
|
|
164
222
|
this.write('UPDATE threads SET state = ?, updatedAt = ? WHERE id = ?', state, Date.now(), threadId);
|
|
165
223
|
},
|
|
166
224
|
delete: async (threadId) => {
|
|
167
|
-
//
|
|
225
|
+
// One transaction: a thread is gone with everything it owned, or not at
|
|
226
|
+
// all. No FK cascade here: the schema is created by this adapter and the
|
|
168
227
|
// cascade is spelled out, so a caller can read exactly what is removed.
|
|
169
|
-
|
|
170
|
-
this.
|
|
171
|
-
|
|
172
|
-
|
|
228
|
+
this.tx(() => {
|
|
229
|
+
const res = this.db.prepare('DELETE FROM threads WHERE id = ?').run(threadId);
|
|
230
|
+
if (this.changes(res) === 0)
|
|
231
|
+
throw new Error(`Unknown thread ${threadId}`);
|
|
232
|
+
for (const t of ['messages', 'events', 'usage', 'runs']) {
|
|
233
|
+
this.write(`DELETE FROM ${t} WHERE threadId = ?`, threadId);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
},
|
|
237
|
+
transition: async (threadId, tr) => {
|
|
238
|
+
if (tr.from.length === 0)
|
|
239
|
+
return false;
|
|
240
|
+
// One conditional UPDATE, so exactly one caller can win (§3.4): the
|
|
241
|
+
// driver's change count says whether it was this one. A thread with no
|
|
242
|
+
// run recorded yet (from before the column) matches any run.
|
|
243
|
+
const res = this.db
|
|
244
|
+
.prepare(`UPDATE threads SET state = ?, updatedAt = ?, runId = COALESCE(NULLIF(?, ''), runId)
|
|
245
|
+
WHERE id = ? AND (? = '' OR runId IS NULL OR runId = ?)
|
|
246
|
+
AND state IN (${tr.from.map(() => '?').join(', ')})`)
|
|
247
|
+
.run(tr.to, Date.now(), tr.newRunId ?? '', threadId, tr.runId ?? '', tr.runId ?? '', ...tr.from);
|
|
248
|
+
return Number(res?.changes ?? 0) > 0;
|
|
173
249
|
},
|
|
174
250
|
claimState: async (threadId, from, to) => {
|
|
175
251
|
// The §3.4 compare-and-set: one conditional UPDATE, so exactly one
|
|
176
|
-
// caller can win
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
return after?.state === to;
|
|
252
|
+
// caller can win, and the driver's change count says whether it was
|
|
253
|
+
// this one. A read before or after would race another process.
|
|
254
|
+
const res = this.db
|
|
255
|
+
.prepare('UPDATE threads SET state = ?, updatedAt = ? WHERE id = ? AND state = ?')
|
|
256
|
+
.run(to, Date.now(), threadId, from);
|
|
257
|
+
return this.changes(res) > 0;
|
|
183
258
|
},
|
|
184
259
|
};
|
|
185
260
|
messages = {
|
|
@@ -188,8 +263,10 @@ export class SqliteStorage {
|
|
|
188
263
|
const id = randomUUID();
|
|
189
264
|
// An explicit seq keeps insertion order stable: several messages land
|
|
190
265
|
// inside the same millisecond, so createdAt alone cannot order them.
|
|
191
|
-
|
|
192
|
-
|
|
266
|
+
// Taken inside the INSERT, one statement, so another process cannot
|
|
267
|
+
// read the same MAX in between; the unique index backs that up.
|
|
268
|
+
this.write(`INSERT INTO messages (id,threadId,agentId,role,content,createdAt,seq)
|
|
269
|
+
VALUES (?,?,?,?,?,?,(SELECT COALESCE(MAX(seq),0)+1 FROM messages WHERE threadId = ?))`, id, threadId, m.agentId ?? null, m.role, json(m.content), now, threadId);
|
|
193
270
|
return this.toMessage({
|
|
194
271
|
id, threadId, agentId: m.agentId ?? null, role: m.role,
|
|
195
272
|
content: json(m.content), createdAt: now,
|
|
@@ -214,8 +291,36 @@ export class SqliteStorage {
|
|
|
214
291
|
},
|
|
215
292
|
};
|
|
216
293
|
events = {
|
|
294
|
+
// The seq is minted in the insert itself: SQLite runs one writer at a
|
|
295
|
+
// time, so no two appends on a thread read the same MAX.
|
|
217
296
|
append: async (threadId, e) => {
|
|
218
|
-
|
|
297
|
+
const createdAt = e.createdAt ? new Date(e.createdAt).getTime() : Date.now();
|
|
298
|
+
const row = this.all(`INSERT INTO events (id,threadId,seq,type,payload,createdAt,runId)
|
|
299
|
+
SELECT ?,?,COALESCE(MAX(seq),0)+1,?,?,?,? FROM events WHERE threadId = ?
|
|
300
|
+
RETURNING seq`, randomUUID(), threadId, e.type, json(e.payload), createdAt, e.runId ?? null, threadId)[0];
|
|
301
|
+
return {
|
|
302
|
+
threadId, seq: Number(row.seq), type: e.type, payload: e.payload,
|
|
303
|
+
createdAt: new Date(createdAt), ...(e.runId ? { runId: e.runId } : {}),
|
|
304
|
+
};
|
|
305
|
+
},
|
|
306
|
+
list: async (threadId, f = {}) => {
|
|
307
|
+
const where = ['threadId = ?'];
|
|
308
|
+
const args = [threadId];
|
|
309
|
+
if (f.types) {
|
|
310
|
+
where.push(`type IN (${f.types.map(() => '?').join(',') || 'NULL'})`);
|
|
311
|
+
args.push(...f.types);
|
|
312
|
+
}
|
|
313
|
+
if (f.runId !== undefined) {
|
|
314
|
+
where.push('runId = ?');
|
|
315
|
+
args.push(f.runId);
|
|
316
|
+
}
|
|
317
|
+
if (f.after !== undefined) {
|
|
318
|
+
where.push('seq > ?');
|
|
319
|
+
args.push(f.after);
|
|
320
|
+
}
|
|
321
|
+
const limit = f.limit ? ` LIMIT ${Math.floor(f.limit)}` : '';
|
|
322
|
+
return this.all(`SELECT * FROM events WHERE ${where.join(' AND ')} ORDER BY seq${limit}`, ...args)
|
|
323
|
+
.map(this.toEvent);
|
|
219
324
|
},
|
|
220
325
|
listSince: async (threadId, sinceSeq) => this.all('SELECT * FROM events WHERE threadId = ? AND seq > ? ORDER BY seq', threadId, sinceSeq).map(this.toEvent),
|
|
221
326
|
latest: async (threadId, type) => {
|
|
@@ -223,6 +328,23 @@ export class SqliteStorage {
|
|
|
223
328
|
return r ? this.toEvent(r) : null;
|
|
224
329
|
},
|
|
225
330
|
listByType: async (threadId, type) => this.all('SELECT * FROM events WHERE threadId = ? AND type = ? ORDER BY seq', threadId, type).map(this.toEvent),
|
|
331
|
+
prune: async (types, opts) => {
|
|
332
|
+
const counts = {};
|
|
333
|
+
const marks = types.map(() => '?').join(',') || 'NULL';
|
|
334
|
+
if (opts.dryRun) {
|
|
335
|
+
for (const r of this.all(`SELECT type, COUNT(*) AS n FROM events WHERE type IN (${marks}) GROUP BY type`, ...types)) {
|
|
336
|
+
counts[r.type] = Number(r.n);
|
|
337
|
+
}
|
|
338
|
+
return counts;
|
|
339
|
+
}
|
|
340
|
+
const rows = this.all(`SELECT id, type FROM events WHERE type IN (${marks}) LIMIT ?`, ...types, opts.limit);
|
|
341
|
+
if (rows.length === 0)
|
|
342
|
+
return counts;
|
|
343
|
+
this.write(`DELETE FROM events WHERE id IN (${rows.map(() => '?').join(',')})`, ...rows.map((r) => r.id));
|
|
344
|
+
for (const r of rows)
|
|
345
|
+
counts[r.type] = (counts[r.type] ?? 0) + 1;
|
|
346
|
+
return counts;
|
|
347
|
+
},
|
|
226
348
|
};
|
|
227
349
|
usage = {
|
|
228
350
|
record: async (threadId, u) => {
|
|
@@ -235,36 +357,221 @@ export class SqliteStorage {
|
|
|
235
357
|
// per model call (§4), and the bill only ever wants them by agent and
|
|
236
358
|
// model. Summing the groups gives the totals, so the two always agree.
|
|
237
359
|
total: async (threadId, filter = {}) => {
|
|
360
|
+
// Grouped by currency as well, so a group never sums two units; the
|
|
361
|
+
// merge puts one agent's spend on one model back on a single line.
|
|
238
362
|
const rows = this.all(`SELECT COALESCE(agentId,'') AS agentId, COALESCE(agentName,'') AS agentName,
|
|
239
363
|
COALESCE(model,'') AS model, COALESCE(modelId,'') AS modelId,
|
|
240
364
|
COALESCE(SUM(inputTokens),0) AS i, COALESCE(SUM(cachedInputTokens),0) AS cr,
|
|
241
365
|
COALESCE(SUM(cacheWriteInputTokens),0) AS cw, COALESCE(SUM(outputTokens),0) AS o,
|
|
242
366
|
COALESCE(SUM(reasoningTokens),0) AS rt, COALESCE(SUM(totalTokens),0) AS t,
|
|
243
367
|
COUNT(*) AS calls, COALESCE(SUM(estimated),0) AS est,
|
|
244
|
-
COALESCE(SUM(costMicros),0) AS cost,
|
|
368
|
+
COALESCE(SUM(costMicros),0) AS cost, COALESCE(costCurrency,'') AS currency,
|
|
245
369
|
COALESCE(SUM(CASE WHEN costMicros IS NULL THEN 1 ELSE 0 END),0) AS unpriced
|
|
246
370
|
FROM usage WHERE threadId = ?${filter.runId ? ' AND runId = ?' : ''}
|
|
247
|
-
GROUP BY agentId, agentName, model, modelId
|
|
371
|
+
GROUP BY agentId, agentName, model, modelId, costCurrency
|
|
248
372
|
ORDER BY MIN(createdAt)`, ...(filter.runId ? [threadId, filter.runId] : [threadId]));
|
|
249
|
-
const
|
|
373
|
+
const merge = new UsageMerger();
|
|
250
374
|
for (const r of rows) {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
outputTokens: r.o, reasoningTokens: r.rt,
|
|
263
|
-
calls: r.calls, estimated: r.est, costMicros: r.cost,
|
|
375
|
+
merge.add({
|
|
376
|
+
line: {
|
|
377
|
+
agentId: r.agentId || null, agentName: r.agentName || null,
|
|
378
|
+
model: r.model || null, modelId: r.modelId || null,
|
|
379
|
+
inputTokens: r.i, cacheReadInputTokens: r.cr, cacheWriteInputTokens: r.cw,
|
|
380
|
+
outputTokens: r.o, reasoningTokens: r.rt,
|
|
381
|
+
calls: r.calls, estimated: r.est, costMicros: r.cost,
|
|
382
|
+
},
|
|
383
|
+
currency: r.currency,
|
|
384
|
+
totalTokens: r.t,
|
|
385
|
+
unpriced: r.unpriced,
|
|
264
386
|
});
|
|
265
387
|
}
|
|
266
|
-
return
|
|
388
|
+
return merge.totals();
|
|
267
389
|
},
|
|
268
390
|
};
|
|
269
391
|
}
|
|
392
|
+
/** The current time in epoch milliseconds, the form expiresAt is kept in. */
|
|
393
|
+
const NOW_MS = `CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`;
|
|
394
|
+
const STREAMS_SCHEMA = [
|
|
395
|
+
`CREATE TABLE IF NOT EXISTS run_streams (
|
|
396
|
+
id TEXT PRIMARY KEY, "threadId" TEXT NOT NULL, "runId" TEXT NOT NULL,
|
|
397
|
+
closed INTEGER NOT NULL, "endEvent" TEXT, "expiresAt" INTEGER NOT NULL)`,
|
|
398
|
+
`CREATE INDEX IF NOT EXISTS run_streams_expires ON run_streams("expiresAt")`,
|
|
399
|
+
`CREATE INDEX IF NOT EXISTS run_streams_thread ON run_streams("threadId")`,
|
|
400
|
+
`CREATE TABLE IF NOT EXISTS run_stream_events (
|
|
401
|
+
pos INTEGER PRIMARY KEY AUTOINCREMENT, "streamId" TEXT NOT NULL, event TEXT NOT NULL)`,
|
|
402
|
+
`CREATE INDEX IF NOT EXISTS run_stream_events_stream ON run_stream_events("streamId", pos)`,
|
|
403
|
+
];
|
|
404
|
+
/** RunStreams over SQLite: the run_streams and run_stream_events tables, the
|
|
405
|
+
* same ones the Go adapter uses. The offset is the event row's key, which
|
|
406
|
+
* AUTOINCREMENT never reuses. Readers in this process wake on its own
|
|
407
|
+
* appends; one in another process sees them on its next poll. Expired
|
|
408
|
+
* streams are deleted as new ones open, 500 a pass, at most once a minute. */
|
|
409
|
+
export class SqliteRunStreams {
|
|
410
|
+
db;
|
|
411
|
+
opts;
|
|
412
|
+
waiters = new Map();
|
|
413
|
+
swept = 0;
|
|
414
|
+
constructor(db, opts = {}) {
|
|
415
|
+
this.db = db;
|
|
416
|
+
this.opts = opts;
|
|
417
|
+
for (const sql of STREAMS_SCHEMA)
|
|
418
|
+
this.db.prepare(sql).run();
|
|
419
|
+
}
|
|
420
|
+
tx(work) {
|
|
421
|
+
this.db.prepare('BEGIN IMMEDIATE').run();
|
|
422
|
+
try {
|
|
423
|
+
const out = work();
|
|
424
|
+
this.db.prepare('COMMIT').run();
|
|
425
|
+
return out;
|
|
426
|
+
}
|
|
427
|
+
catch (err) {
|
|
428
|
+
this.db.prepare('ROLLBACK').run();
|
|
429
|
+
throw err;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
wake(streamId) {
|
|
433
|
+
const set = this.waiters.get(streamId);
|
|
434
|
+
this.waiters.delete(streamId);
|
|
435
|
+
for (const wake of set ?? [])
|
|
436
|
+
wake();
|
|
437
|
+
}
|
|
438
|
+
/** Registers a wake-up before the reader reads, so an append that lands
|
|
439
|
+
* between the read and the wait still wakes it. */
|
|
440
|
+
arm(streamId) {
|
|
441
|
+
let wake;
|
|
442
|
+
const woken = new Promise((resolve) => { wake = resolve; });
|
|
443
|
+
let set = this.waiters.get(streamId);
|
|
444
|
+
if (!set) {
|
|
445
|
+
set = new Set();
|
|
446
|
+
this.waiters.set(streamId, set);
|
|
447
|
+
}
|
|
448
|
+
set.add(wake);
|
|
449
|
+
const disarm = () => {
|
|
450
|
+
const s = this.waiters.get(streamId);
|
|
451
|
+
s?.delete(wake);
|
|
452
|
+
if (s && s.size === 0)
|
|
453
|
+
this.waiters.delete(streamId);
|
|
454
|
+
};
|
|
455
|
+
return { woken, disarm };
|
|
456
|
+
}
|
|
457
|
+
sweep() {
|
|
458
|
+
if (Date.now() - this.swept < 60_000)
|
|
459
|
+
return;
|
|
460
|
+
this.swept = Date.now();
|
|
461
|
+
const ids = this.db
|
|
462
|
+
.prepare(`SELECT id FROM run_streams WHERE "expiresAt" <= ${NOW_MS} LIMIT 500`)
|
|
463
|
+
.all();
|
|
464
|
+
for (const { id } of ids)
|
|
465
|
+
this.remove(id);
|
|
466
|
+
}
|
|
467
|
+
remove(streamId) {
|
|
468
|
+
this.tx(() => {
|
|
469
|
+
this.db.prepare('DELETE FROM run_stream_events WHERE "streamId" = ?').run(streamId);
|
|
470
|
+
this.db.prepare('DELETE FROM run_streams WHERE id = ?').run(streamId);
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
async open(streamId, meta, ttlMs) {
|
|
474
|
+
this.sweep();
|
|
475
|
+
// A row past its expiry is gone: replace it rather than reopen it.
|
|
476
|
+
this.db.prepare(`DELETE FROM run_streams WHERE id = ? AND "expiresAt" <= ${NOW_MS}`).run(streamId);
|
|
477
|
+
this.db
|
|
478
|
+
.prepare(`INSERT INTO run_streams (id, "threadId", "runId", closed, "expiresAt") VALUES (?, ?, ?, 0, ?)
|
|
479
|
+
ON CONFLICT (id) DO NOTHING`)
|
|
480
|
+
.run(streamId, meta.threadId, meta.runId, Date.now() + ttlMs);
|
|
481
|
+
}
|
|
482
|
+
/** Inside a transaction: whether the stream is live and closed. */
|
|
483
|
+
state(streamId) {
|
|
484
|
+
const row = this.db
|
|
485
|
+
.prepare(`SELECT closed, "expiresAt" > ${NOW_MS} AS live FROM run_streams WHERE id = ?`)
|
|
486
|
+
.all(streamId)[0];
|
|
487
|
+
return { live: !!row?.live, closed: !!row?.closed };
|
|
488
|
+
}
|
|
489
|
+
insert(streamId, events) {
|
|
490
|
+
const stmt = this.db.prepare('INSERT INTO run_stream_events ("streamId", event) VALUES (?, ?) RETURNING pos');
|
|
491
|
+
return events.map((e) => String(stmt.all(streamId, JSON.stringify(e))[0].pos));
|
|
492
|
+
}
|
|
493
|
+
async append(streamId, events) {
|
|
494
|
+
if (events.length === 0)
|
|
495
|
+
return [];
|
|
496
|
+
const offsets = this.tx(() => {
|
|
497
|
+
const { live, closed } = this.state(streamId);
|
|
498
|
+
if (!live)
|
|
499
|
+
throw new StreamGoneError(streamId);
|
|
500
|
+
if (closed)
|
|
501
|
+
throw new StreamClosedError(streamId);
|
|
502
|
+
return this.insert(streamId, events);
|
|
503
|
+
});
|
|
504
|
+
this.wake(streamId);
|
|
505
|
+
return offsets;
|
|
506
|
+
}
|
|
507
|
+
async close(streamId, end, graceMs) {
|
|
508
|
+
this.tx(() => {
|
|
509
|
+
const { live, closed } = this.state(streamId);
|
|
510
|
+
if (!live)
|
|
511
|
+
throw new StreamGoneError(streamId);
|
|
512
|
+
if (closed)
|
|
513
|
+
return;
|
|
514
|
+
this.insert(streamId, [end]);
|
|
515
|
+
this.db
|
|
516
|
+
.prepare('UPDATE run_streams SET closed = 1, "endEvent" = ?, "expiresAt" = ? WHERE id = ?')
|
|
517
|
+
.run(JSON.stringify(end), Date.now() + graceMs, streamId);
|
|
518
|
+
});
|
|
519
|
+
this.wake(streamId);
|
|
520
|
+
}
|
|
521
|
+
async delete(streamId) {
|
|
522
|
+
this.remove(streamId);
|
|
523
|
+
this.wake(streamId);
|
|
524
|
+
}
|
|
525
|
+
page(streamId, after) {
|
|
526
|
+
const row = this.db
|
|
527
|
+
.prepare(`SELECT "threadId", "runId", closed, "endEvent", "expiresAt" > ${NOW_MS} AS live
|
|
528
|
+
FROM run_streams WHERE id = ?`)
|
|
529
|
+
.all(streamId)[0];
|
|
530
|
+
if (!row || !row.live)
|
|
531
|
+
return null;
|
|
532
|
+
const rows = this.db
|
|
533
|
+
.prepare('SELECT pos, event FROM run_stream_events WHERE "streamId" = ? AND pos > ? ORDER BY pos')
|
|
534
|
+
.all(streamId, after ? Number(after) : 0);
|
|
535
|
+
return {
|
|
536
|
+
meta: { threadId: row.threadId, runId: row.runId },
|
|
537
|
+
closed: !!row.closed,
|
|
538
|
+
end: row.closed && row.endEvent ? JSON.parse(row.endEvent) : null,
|
|
539
|
+
items: rows.map((r) => ({ ...JSON.parse(r.event), offset: String(r.pos) })),
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
async *read(streamId, after, signal) {
|
|
543
|
+
let cursor = after;
|
|
544
|
+
for (;;) {
|
|
545
|
+
if (signal?.aborted)
|
|
546
|
+
return;
|
|
547
|
+
const { woken, disarm } = this.arm(streamId);
|
|
548
|
+
const page = this.page(streamId, cursor);
|
|
549
|
+
if (!page) {
|
|
550
|
+
disarm();
|
|
551
|
+
throw new StreamGoneError(streamId);
|
|
552
|
+
}
|
|
553
|
+
if (page.items.length > 0)
|
|
554
|
+
disarm();
|
|
555
|
+
for (const item of page.items) {
|
|
556
|
+
yield item;
|
|
557
|
+
cursor = item.offset;
|
|
558
|
+
if (isStreamEnd(item))
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
if (page.items.length > 0)
|
|
562
|
+
continue;
|
|
563
|
+
// Read from past the end item: nothing more will ever come.
|
|
564
|
+
if (page.closed) {
|
|
565
|
+
disarm();
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
await Promise.race([woken, sleep(this.opts.pollMs ?? 250, signal)]);
|
|
569
|
+
disarm();
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
async snapshot(streamId, after) {
|
|
573
|
+
const page = this.page(streamId, after ?? null);
|
|
574
|
+
return page && { meta: page.meta, items: page.items, end: page.end };
|
|
575
|
+
}
|
|
576
|
+
}
|
|
270
577
|
//# sourceMappingURL=sqlite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAyD,MAAM,qBAAqB,CAAC;AAChI,OAAO,EAAE,WAAW,EAAqD,MAAM,0BAA0B,CAAC;AAC1G,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAmB5C;;;;;;;8EAO8E;AAC9E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAQ,GAAG,oBAAoB;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,SAAS,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,qEAAqE;YACrE,sEAAsE;YACtE,qEAAqE;YACrE,iCAAiC;YACjC,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,YAAY,CAAC;YAC9C,IAAI,IAAI;gBAAE,OAAO,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAe,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,0EAA0E;QACxE,wDAAwD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;AACJ,CAAC;AAGD;;;;0DAI0D;AAC1D,MAAM,UAAU,UAAU,CAAuB,EAAK;IACpD,KAAK,MAAM,MAAM,IAAI,CAAC,yBAAyB,EAAE,0BAA0B,CAAC,EAAE,CAAC;QAC7E,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,yBAAyB;IACrD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,6EAA6E;AAC7E,yEAAyE;AACzE,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAElF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDd,CAAC;AAEF;;+DAE+D;AAC/D,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,EAAc;QAAd,OAAE,GAAF,EAAE,CAAY;QACzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,GAAG;gBAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACtC,CAAC;QACD,sEAAsE;QACtE,uEAAuE;QACvE,qDAAqD;QACrD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACvB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE,4BAA4B;YAClC,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,MAAM;YACf,qBAAqB,EAAE,4BAA4B;YACnD,eAAe,EAAE,4BAA4B;YAC7C,OAAO,EAAE,kCAAkC;YAC3C,SAAS,EAAE,4BAA4B;YACvC,gBAAgB,EAAE,MAAM;YACxB,UAAU,EAAE,SAAS;YACrB,YAAY,EAAE,MAAM;YACpB,UAAU,EAAE,MAAM;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,EAAE,CAAC;QACzF,oEAAoE;QACpE,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,qCAAqC;QACrC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7C,wEAAwE;QACxE,2EAA2E;QAC3E,wEAAwE;QACxE,uDAAuD;QACvD,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qFAAqF,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,yEAAyE,EAAE,GAAG,CAAC,CAAC;QAC/F,CAAC;QACD,yEAAyE;QACzE,yEAAyE;QACzE,SAAS;QACT,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yFAAyF,CAAC,CAAC,GAAG,EAAE,CAAC;QACnH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,6EAA6E,EAAE,GAAG,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED;;uBAEmB;IACX,EAAE,CAAI,EAAW;QACvB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrB,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAC5D,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,GAAY;QAC1B,OAAO,MAAM,CAAE,GAAiD,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;IAClF,CAAC;IAEO,UAAU,CAAC,KAAa,EAAE,IAA4B;QAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,CACjB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACrG,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC;IAEO,GAAG,CAAC,GAAW,EAAE,GAAG,CAAY;QACtC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAU,CAAC;IACjD,CAAC;IACO,GAAG,CAAC,GAAW,EAAE,GAAG,CAAY;QACtC,OAAQ,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC9D,CAAC;IACO,KAAK,CAAC,GAAW,EAAE,GAAG,CAAY;QACxC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;IAEO,QAAQ,GAAG,CAAC,CAAM,EAAa,EAAE,CAAC,CAAC;QACzC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAuB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK;QAC1D,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;KACnE,CAAC,CAAC;IACK,SAAS,GAAG,CAAC,CAAM,EAAc,EAAE,CAAC,CAAC;QAC3C,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;QAC1D,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;KAC1E,CAAC,CAAC;IACK,OAAO,GAAG,CAAC,CAAM,EAAc,EAAE,CAAC,CAAC;QACzC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;QAC9C,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpG,CAAe,CAAC;IACjB,OAAO,GAAG;QACR,GAAG,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,oCAAoC,EAAE,QAAQ,CAAC,CAAC;YACnE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAyB,EAAE,EAAE;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CACR,qFAAqF,EACrF,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,GAAG,EAAE,GAAG,CAC5D,CAAC;YACF,OAAO,IAAI,CAAC,QAAQ,CAAC;gBACnB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG;aAClF,CAAC,CAAC;QACL,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE,CACf,IAAI,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9E,QAAQ,EAAE,KAAK,EAAE,QAAgB,EAAE,KAAqB,EAAE,EAAE;YAC1D,IAAI,CAAC,KAAK,CAAC,0DAA0D,EACnE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;YACjC,wEAAwE;YACxE,yEAAyE;YACzE,wEAAwE;YACxE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;gBACX,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9E,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;gBAC3E,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;oBACxD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAoB,EAAE,EAAE;YAC3D,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,oEAAoE;YACpE,uEAAuE;YACvE,6DAA6D;YAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;iBAChB,OAAO,CACN;;6BAEmB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxD;iBACA,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACnG,OAAO,MAAM,CAAE,GAAiD,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACtF,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,QAAgB,EAAE,IAAoB,EAAE,EAAkB,EAAE,EAAE;YAC/E,mEAAmE;YACnE,oEAAoE;YACpE,+DAA+D;YAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;iBAChB,OAAO,CAAC,wEAAwE,CAAC;iBACjF,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;IAEF,QAAQ,GAAG;QACT,MAAM,EAAE,KAAK,EAAE,QAAgB,EAAE,CAAa,EAAE,EAAE;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,sEAAsE;YACtE,qEAAqE;YACrE,oEAAoE;YACpE,gEAAgE;YAChE,IAAI,CAAC,KAAK,CACR;+FACuF,EACvF,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,CACxE,CAAC;YACF,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;gBACtD,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG;aACzC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,QAAgB,EAAE,IAAkC,EAAE,EAAE;YACnE,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBAC9B,OAAO,IAAI,CAAC,GAAG,CACb,IAAI,CAAC,OAAO,KAAK,IAAI;oBACnB,CAAC,CAAC,4EAA4E;oBAC9E,CAAC,CAAC,wEAAwE,EAC5E,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CACnE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YACD,OAAO,IAAI,CAAC,GAAG,CAAC,wDAAwD,EAAE,QAAQ,CAAC;iBAChF,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,QAAgB,EAAE,SAAiB,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,wDAAwD,EAC9E,SAAS,EAAE,QAAQ,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,yDAAyD,EAC/E,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,sDAAsD,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACzF,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;KACF,CAAC;IAEF,MAAM,GAAG;QACP,sEAAsE;QACtE,yDAAyD;QACzD,MAAM,EAAE,KAAK,EAAE,QAAgB,EAAE,CAAiB,EAAuB,EAAE;YACzE,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB;;uBAEe,EACf,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,QAAQ,CACtF,CAAC,CAAC,CAAoB,CAAC;YACxB,OAAO;gBACL,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO;gBAChE,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvE,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,QAAgB,EAAE,IAAuB,EAAE,EAAE,EAAE;YAC1D,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAc,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;gBACtE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YAC3E,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YACzE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,8BAA8B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC;iBAC/F,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,EAAE,CACtD,IAAI,CAAC,GAAG,CAAC,kEAAkE,EACzE,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QACzC,MAAM,EAAE,KAAK,EAAE,QAAgB,EAAE,IAAY,EAAE,EAAE;YAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAChB,gFAAgF,EAChF,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,QAAgB,EAAE,IAAY,EAAE,EAAE,CACnD,IAAI,CAAC,GAAG,CAAC,mEAAmE,EAC1E,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,KAAK,EAAE,KAAe,EAAE,IAAyC,EAAE,EAAE;YAC1E,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;YACvD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,yDAAyD,KAAK,iBAAiB,EAAE,GAAG,KAAK,CAAuC,EAAE,CAAC;oBAC1J,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,8CAA8C,KAAK,WAAW,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,KAAK,CAAwC,CAAC;YACnJ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,MAAM,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,mCAAmC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1G,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;IAEF,KAAK,GAAG;QACN,MAAM,EAAE,KAAK,EAAE,QAAgB,EAAE,CAAW,EAAE,EAAE;YAC9C,IAAI,CAAC,KAAK,CACR;;;8DAGsD,EACtD,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAC/E,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAClD,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,qBAAqB,EAC9D,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,WAAW,EAChD,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9B,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAC9D,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,EACxE,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;QACJ,CAAC;QACD,0EAA0E;QAC1E,sEAAsE;QACtE,uEAAuE;QACvE,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,SAAsB,EAAE,EAAwB,EAAE;YAChF,oEAAoE;YACpE,mEAAmE;YACnE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB;;;;;;;;wCAQgC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;;iCAE3C,EACzB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAC1D,CAAC;YACF,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,GAAG,CAAC;oBACR,IAAI,EAAE;wBACJ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;wBAC1D,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;wBAClD,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC,EAAE;wBACzE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE;wBACxC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI;qBACrD;oBACD,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,WAAW,EAAE,CAAC,CAAC,CAAC;oBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;CAIH;AAED,6EAA6E;AAC7E,MAAM,MAAM,GAAG,4DAA4D,CAAC;AAE5E,MAAM,cAAc,GAAG;IACrB;;6EAE2E;IAC3E,4EAA4E;IAC5E,0EAA0E;IAC1E;2FACyF;IACzF,2FAA2F;CAC5F,CAAC;AAEF;;;;+EAI+E;AAC/E,MAAM,OAAO,gBAAgB;IAKR;IACA;IALF,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IACtD,KAAK,GAAG,CAAC,CAAC;IAElB,YACmB,EAAc,EACd,OAA4B,EAAE;QAD9B,OAAE,GAAF,EAAE,CAAY;QACd,SAAI,GAAJ,IAAI,CAA0B;QAE/C,KAAK,MAAM,GAAG,IAAI,cAAc;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAC/D,CAAC;IAEO,EAAE,CAAI,IAAa;QACzB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAClC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,QAAgB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,IAAI,EAAE;YAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IAED;wDACoD;IAC5C,GAAG,CAAC,QAAgB;QAC1B,IAAI,IAAiB,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QAC/D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK;QACX,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,MAAM;YAAE,OAAO;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,mDAAmD,MAAM,YAAY,CAAC;aAC9E,GAAG,EAA2B,CAAC;QAClC,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAEO,MAAM,CAAC,QAAgB;QAC7B,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,IAAgB,EAAE,KAAa;QAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,mEAAmE;QACnE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2DAA2D,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnG,IAAI,CAAC,EAAE;aACJ,OAAO,CAAC;4CAC6B,CAAC;aACtC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,mEAAmE;IAC3D,KAAK,CAAC,QAAgB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,gCAAgC,MAAM,wCAAwC,CAAC;aACvF,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAiD,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;IACtD,CAAC;IAEO,MAAM,CAAC,QAAgB,EAAE,MAAqB;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+EAA+E,CAAC,CAAC;QAC9G,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,MAAqB;QAClD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,MAAM;gBAAE,MAAM,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,GAAc,EAAE,OAAe;QAC3D,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACX,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,MAAM;gBAAE,OAAO;YACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,EAAE;iBACJ,OAAO,CAAC,iFAAiF,CAAC;iBAC1F,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAEO,IAAI,CAAC,QAAgB,EAAE,KAAoB;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,iEAAiE,MAAM;8CACxC,CAAC;aACxC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAEL,CAAC;QACd,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,wFAAwF,CAAC;aACjG,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAA0C,CAAC;QACrF,OAAO;YACL,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;YAClD,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;YACpB,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAe,CAAC,CAAC,CAAC,IAAI;YAChF,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAe,CAAC;SAC1F,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CAAC,QAAgB,EAAE,KAAoB,EAAE,MAAoB;QACtE,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,SAAS,CAAC;YACR,IAAI,MAAM,EAAE,OAAO;gBAAE,OAAO;YAC5B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC;gBACT,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,EAAE,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,IAAI,CAAC;gBACX,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBACrB,IAAI,WAAW,CAAC,IAAI,CAAC;oBAAE,OAAO;YAChC,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YACpC,4DAA4D;YAC5D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,KAAqB;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;QAChD,OAAO,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IACvE,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type RunStreams, type StreamMeta, type StreamSnapshot } from '../ports/streams.js';
|
|
2
|
+
import { type StreamEnd, type StreamEvent, type StreamItem } from '../core/stream-events.js';
|
|
3
|
+
/** RunStreams over Redis Streams, shared by the Redis and Upstash adapters.
|
|
4
|
+
* Each stream is two keys in one hash slot: a hash with who it belongs to
|
|
5
|
+
* and whether it is closed, and the Redis Stream itself, one entry per
|
|
6
|
+
* event. The offset is the entry id. Every write is one Lua script, so a
|
|
7
|
+
* close can never slip between an append's check and its XADD. The Go
|
|
8
|
+
* adapters run the same scripts on the same keys. */
|
|
9
|
+
export declare const streamMetaKey: (streamId: string) => string;
|
|
10
|
+
export declare const streamKey: (streamId: string) => string;
|
|
11
|
+
/** KEYS: meta, stream. ARGV: threadId, runId, ttlMs. 1 opened, 0 already open. */
|
|
12
|
+
export declare const STREAM_OPEN_SCRIPT = "if redis.call('EXISTS', KEYS[1]) == 1 then return 0 end\nredis.call('HSET', KEYS[1], 'threadId', ARGV[1], 'runId', ARGV[2], 'closed', '0')\nredis.call('PEXPIRE', KEYS[1], ARGV[3])\nreturn 1";
|
|
13
|
+
/** KEYS: meta, stream. ARGV: one event JSON each. The entry ids, or -1 gone,
|
|
14
|
+
* -2 closed. The stream key takes the meta key's expiry. */
|
|
15
|
+
export declare const STREAM_APPEND_SCRIPT = "local closed = redis.call('HGET', KEYS[1], 'closed')\nif not closed then return -1 end\nif closed == '1' then return -2 end\nlocal ids = {}\nfor i = 1, #ARGV do ids[i] = redis.call('XADD', KEYS[2], '*', 'e', ARGV[i]) end\nlocal ttl = redis.call('PTTL', KEYS[1])\nif ttl > 0 then redis.call('PEXPIRE', KEYS[2], ttl) end\nreturn ids";
|
|
16
|
+
/** KEYS: meta, stream. ARGV: end JSON, graceMs. 1 closed, 0 already closed,
|
|
17
|
+
* -1 gone. */
|
|
18
|
+
export declare const STREAM_CLOSE_SCRIPT = "local closed = redis.call('HGET', KEYS[1], 'closed')\nif not closed then return -1 end\nif closed == '1' then return 0 end\nredis.call('XADD', KEYS[2], '*', 'e', ARGV[1])\nredis.call('HSET', KEYS[1], 'closed', '1', 'end', ARGV[1])\nredis.call('PEXPIRE', KEYS[1], ARGV[2])\nredis.call('PEXPIRE', KEYS[2], ARGV[2])\nreturn 1";
|
|
19
|
+
/** KEYS: meta, stream. ARGV: the XRANGE start ('-', or '(' + an entry id).
|
|
20
|
+
* -1 gone, else { threadId, runId, closed, end JSON or '', entries }. */
|
|
21
|
+
export declare const STREAM_READ_SCRIPT = "local meta = redis.call('HMGET', KEYS[1], 'threadId', 'runId', 'closed', 'end')\nif not meta[1] then return -1 end\nreturn { meta[1], meta[2], meta[3], meta[4] or '', redis.call('XRANGE', KEYS[2], ARGV[1], '+') }";
|
|
22
|
+
/** Runs a script: the one thing the Redis and Upstash clients differ in. */
|
|
23
|
+
export type RunScript = (script: string, keys: string[], args: string[]) => Promise<unknown>;
|
|
24
|
+
/** Waits until the stream may have something after `after`, or `maxMs`
|
|
25
|
+
* passes, or the signal aborts. A wait that returns early without news is
|
|
26
|
+
* harmless: the reader reads again and finds nothing. */
|
|
27
|
+
export type WaitForNews = (key: string, after: string, maxMs: number, signal?: AbortSignal) => Promise<void>;
|
|
28
|
+
/** Compares two entry ids ("<ms>-<seq>"). */
|
|
29
|
+
export declare function compareEntryIds(a: string, b: string): number;
|
|
30
|
+
export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
31
|
+
export declare class ScriptedRunStreams implements RunStreams {
|
|
32
|
+
private readonly run;
|
|
33
|
+
private readonly waitForNews;
|
|
34
|
+
/** The longest a reader waits before reading again, news or not: the
|
|
35
|
+
* floor under a missed wake-up. */
|
|
36
|
+
private readonly pollMs;
|
|
37
|
+
constructor(run: RunScript, waitForNews: WaitForNews,
|
|
38
|
+
/** The longest a reader waits before reading again, news or not: the
|
|
39
|
+
* floor under a missed wake-up. */
|
|
40
|
+
pollMs: number);
|
|
41
|
+
open(streamId: string, meta: StreamMeta, ttlMs: number): Promise<void>;
|
|
42
|
+
append(streamId: string, events: StreamEvent[]): Promise<string[]>;
|
|
43
|
+
private page;
|
|
44
|
+
read(streamId: string, after: string | null, signal?: AbortSignal): AsyncIterable<StreamItem>;
|
|
45
|
+
snapshot(streamId: string, after?: string | null): Promise<StreamSnapshot | null>;
|
|
46
|
+
close(streamId: string, end: StreamEnd, graceMs: number): Promise<void>;
|
|
47
|
+
delete(streamId: string): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=stream-scripts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-scripts.d.ts","sourceRoot":"","sources":["../../src/adapters/stream-scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChI,OAAO,EAAe,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE1G;;;;;sDAKsD;AAEtD,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,WAAmC,CAAC;AAClF,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,WAA8B,CAAC;AAEzE,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,kMAGtB,CAAC;AAEV;6DAC6D;AAC7D,eAAO,MAAM,oBAAoB,+UAOtB,CAAC;AAEZ;eACe;AACf,eAAO,MAAM,mBAAmB,uUAOvB,CAAC;AAEV;0EAC0E;AAC1E,eAAO,MAAM,kBAAkB,yNAEkE,CAAC;AAElG,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE7F;;0DAE0D;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7G,6CAA6C;AAC7C,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrE;AAcD,qBAAa,kBAAmB,YAAW,UAAU;IAEjD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B;wCACoC;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAJN,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,WAAW;IACzC;wCACoC;IACnB,MAAM,EAAE,MAAM;IAG3B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM;IAMtD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE;YAYtC,IAAI;IAcX,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC;IAmB9F,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAMjF,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;IAOvD,MAAM,CAAC,QAAQ,EAAE,MAAM;CAG9B"}
|