@lemoncat7/dsh-partner 0.1.0-alpha.21 → 1.0.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.
Files changed (49) hide show
  1. package/README.md +4 -3
  2. package/lib/agent-runtime.d.ts +9 -4
  3. package/lib/agent-runtime.d.ts.map +1 -1
  4. package/lib/agent-runtime.js +56 -14
  5. package/lib/agent-runtime.js.map +1 -1
  6. package/lib/api.d.ts +4 -2
  7. package/lib/api.d.ts.map +1 -1
  8. package/lib/api.js +38 -7
  9. package/lib/api.js.map +1 -1
  10. package/lib/client-api.d.ts +52 -7
  11. package/lib/client-api.d.ts.map +1 -1
  12. package/lib/client-api.js.map +1 -1
  13. package/lib/client.d.ts.map +1 -1
  14. package/lib/client.js +863 -108
  15. package/lib/client.js.map +2 -2
  16. package/lib/daily-review.d.ts +26 -0
  17. package/lib/daily-review.d.ts.map +1 -0
  18. package/lib/daily-review.js +86 -0
  19. package/lib/daily-review.js.map +1 -0
  20. package/lib/domain.d.ts +6 -2
  21. package/lib/domain.d.ts.map +1 -1
  22. package/lib/domain.js +14 -6
  23. package/lib/domain.js.map +1 -1
  24. package/lib/heartbeat.d.ts +1 -3
  25. package/lib/heartbeat.d.ts.map +1 -1
  26. package/lib/heartbeat.js +1 -7
  27. package/lib/heartbeat.js.map +1 -1
  28. package/lib/index.d.ts.map +1 -1
  29. package/lib/index.js +18 -7
  30. package/lib/index.js.map +1 -1
  31. package/lib/memory-domain.d.ts +85 -0
  32. package/lib/memory-domain.d.ts.map +1 -0
  33. package/lib/memory-domain.js +2 -0
  34. package/lib/memory-domain.js.map +1 -0
  35. package/lib/memory-reflection.d.ts +22 -0
  36. package/lib/memory-reflection.d.ts.map +1 -0
  37. package/lib/memory-reflection.js +158 -0
  38. package/lib/memory-reflection.js.map +1 -0
  39. package/lib/memory-store.d.ts +50 -0
  40. package/lib/memory-store.d.ts.map +1 -0
  41. package/lib/memory-store.js +519 -0
  42. package/lib/memory-store.js.map +1 -0
  43. package/lib/store.js +29 -2
  44. package/lib/store.js.map +1 -1
  45. package/package.json +1 -1
  46. package/lib/journal.d.ts +0 -23
  47. package/lib/journal.d.ts.map +0 -1
  48. package/lib/journal.js +0 -93
  49. package/lib/journal.js.map +0 -1
@@ -0,0 +1,519 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { appendFile, mkdir, readFile, readdir, rename, rm } from 'node:fs/promises';
3
+ import { dirname, join } from 'node:path';
4
+ import { DatabaseSync } from 'node:sqlite';
5
+ export class PartnerMemoryStore {
6
+ root;
7
+ timeZone;
8
+ writes = new Map();
9
+ constructor(root, timeZone = 'Asia/Shanghai') {
10
+ this.root = root;
11
+ this.timeZone = timeZone;
12
+ }
13
+ day(at) { return localDay(at, this.timeZone); }
14
+ async archive(turn) {
15
+ const directory = this.scopeDirectory(turn.companionId, turn.scopeId);
16
+ const path = join(directory, 'conversations', `${localDay(turn.at, this.timeZone)}.jsonl`);
17
+ await this.serial(path, async () => {
18
+ await mkdir(join(directory, 'conversations'), { recursive: true, mode: 0o700 });
19
+ await appendFile(path, `${JSON.stringify(turn)}\n`, { encoding: 'utf8', mode: 0o600 });
20
+ });
21
+ }
22
+ async consolidate(turn, result) {
23
+ await this.serial(this.databasePath(turn.companionId), async () => {
24
+ const database = await this.open(turn.companionId);
25
+ try {
26
+ database.exec('BEGIN IMMEDIATE');
27
+ const existing = this.memoriesForScope(database, turn.companionId, turn.scopeId);
28
+ for (const memory of mergeMemories(existing, result.memories, turn))
29
+ this.upsertMemory(database, memory);
30
+ const date = localDay(turn.at, this.timeZone);
31
+ const previous = database.prepare('SELECT turn_count FROM daily_reflections WHERE scope_id = ? AND date = ?').get(turn.scopeId, date);
32
+ database.prepare(`INSERT INTO daily_reflections
33
+ (date, companion_id, scope_id, summary, events_json, open_tasks_json, completed_tasks_json, learnings_json, updated_at, turn_count)
34
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
35
+ ON CONFLICT(scope_id, date) DO UPDATE SET summary=excluded.summary, events_json=excluded.events_json,
36
+ open_tasks_json=excluded.open_tasks_json, completed_tasks_json=excluded.completed_tasks_json,
37
+ learnings_json=excluded.learnings_json, updated_at=excluded.updated_at, turn_count=excluded.turn_count`).run(date, turn.companionId, turn.scopeId, compact(result.daily.summary, 1200), json(strings(result.daily.events, 20, 240)), json(strings(result.daily.openTasks, 20, 240)), json(strings(result.daily.completedTasks, 20, 240)), json(strings(result.daily.learnings, 20, 240)), Date.now(), number(previous?.turn_count) + 1);
38
+ database.exec('COMMIT');
39
+ }
40
+ catch (error) {
41
+ rollback(database);
42
+ throw error;
43
+ }
44
+ finally {
45
+ database.close();
46
+ }
47
+ });
48
+ }
49
+ async recall(companionId, scopeId, query, limit = 12) {
50
+ const database = await this.open(companionId);
51
+ try {
52
+ const now = Date.now();
53
+ const rows = database.prepare(`SELECT * FROM memories
54
+ WHERE scope_id = ? AND status = 'active' AND (expires_at IS NULL OR expires_at > ?)
55
+ ORDER BY updated_at DESC`).all(scopeId, now);
56
+ const terms = tokenize(query);
57
+ return rows.map(memoryFromRow).map(item => ({ item, score: recallScore(item, terms, now) }))
58
+ .sort((a, b) => b.score - a.score || b.item.updatedAt - a.item.updatedAt)
59
+ .slice(0, limit).map(entry => entry.item);
60
+ }
61
+ finally {
62
+ database.close();
63
+ }
64
+ }
65
+ async recentMemories(companionId, limit = 100) {
66
+ const database = await this.open(companionId);
67
+ try {
68
+ return database.prepare('SELECT * FROM memories ORDER BY updated_at DESC LIMIT ?').all(limit).map(memoryFromRow);
69
+ }
70
+ finally {
71
+ database.close();
72
+ }
73
+ }
74
+ async updateMemory(companionId, memoryId, subject, content) {
75
+ return this.serialValue(this.databasePath(companionId), async () => {
76
+ const database = await this.open(companionId);
77
+ try {
78
+ const result = database.prepare(`UPDATE memories SET subject = ?, content = ?, updated_at = ?, confidence = 1, locked = 1
79
+ WHERE companion_id = ? AND id = ?`).run(compact(subject, 120), compact(content, 800), Date.now(), companionId, memoryId);
80
+ if (result.changes === 0)
81
+ throw new Error('memory was not found');
82
+ return memoryFromRow(database.prepare('SELECT * FROM memories WHERE id = ?').get(memoryId));
83
+ }
84
+ finally {
85
+ database.close();
86
+ }
87
+ });
88
+ }
89
+ async deleteMemory(companionId, memoryId) {
90
+ await this.serial(this.databasePath(companionId), async () => {
91
+ const database = await this.open(companionId);
92
+ try {
93
+ const result = database.prepare('DELETE FROM memories WHERE companion_id = ? AND id = ?').run(companionId, memoryId);
94
+ if (result.changes === 0)
95
+ throw new Error('memory was not found');
96
+ }
97
+ finally {
98
+ database.close();
99
+ }
100
+ });
101
+ }
102
+ async recentReflections(companionId, limit = 30) {
103
+ const database = await this.open(companionId);
104
+ try {
105
+ return database.prepare('SELECT * FROM daily_reflections ORDER BY updated_at DESC LIMIT ?').all(limit).map(reflectionFromRow);
106
+ }
107
+ finally {
108
+ database.close();
109
+ }
110
+ }
111
+ async recentReflectionsForScope(companionId, scopeId, limit = 30) {
112
+ const database = await this.open(companionId);
113
+ try {
114
+ return database.prepare('SELECT * FROM daily_reflections WHERE scope_id = ? ORDER BY date DESC LIMIT ?').all(scopeId, limit).map(reflectionFromRow);
115
+ }
116
+ finally {
117
+ database.close();
118
+ }
119
+ }
120
+ async pendingDailyReviews(companionId, date, now = Date.now()) {
121
+ const database = await this.open(companionId);
122
+ try {
123
+ return database.prepare(`SELECT companion_id, scope_id, date, review_attempts FROM daily_reflections
124
+ WHERE companion_id = ? AND date <= ? AND reviewed_at IS NULL AND next_review_at <= ?
125
+ ORDER BY date, updated_at LIMIT 20`).all(companionId, date, now).map(row => ({
126
+ companionId: string(row.companion_id), scopeId: string(row.scope_id), date: string(row.date), attempts: number(row.review_attempts),
127
+ }));
128
+ }
129
+ finally {
130
+ database.close();
131
+ }
132
+ }
133
+ async dailyReviewContext(target) {
134
+ const database = await this.open(target.companionId);
135
+ let reflection;
136
+ let memories;
137
+ try {
138
+ const row = database.prepare('SELECT * FROM daily_reflections WHERE scope_id = ? AND date = ?').get(target.scopeId, target.date);
139
+ if (!row)
140
+ throw new Error('daily reflection was not found');
141
+ reflection = reflectionFromRow(row);
142
+ memories = this.memoriesForScope(database, target.companionId, target.scopeId).filter(item => item.status === 'active');
143
+ }
144
+ finally {
145
+ database.close();
146
+ }
147
+ const path = join(this.scopeDirectory(target.companionId, target.scopeId), 'conversations', `${target.date}.jsonl`);
148
+ const turns = (await readFile(path, 'utf8').catch(error => missing(error) ? '' : Promise.reject(error))).split('\n').filter(Boolean).flatMap(line => {
149
+ try {
150
+ return [JSON.parse(line)];
151
+ }
152
+ catch {
153
+ return [];
154
+ }
155
+ });
156
+ return { reflection, memories, turns };
157
+ }
158
+ async completeDailyReview(target, result) {
159
+ await this.serial(this.databasePath(target.companionId), async () => {
160
+ const database = await this.open(target.companionId);
161
+ try {
162
+ database.exec('BEGIN IMMEDIATE');
163
+ const existing = this.memoriesForScope(database, target.companionId, target.scopeId);
164
+ const at = Date.now();
165
+ const synthetic = { id: `daily-review-${target.date}`, companionId: target.companionId, scopeId: target.scopeId, sessionId: 'daily-review', at, user: `每日终审 ${target.date}`, assistant: result.daily.summary };
166
+ const merged = mergeMemories(existing, result.memories, synthetic);
167
+ for (const memory of merged)
168
+ this.upsertMemory(database, memory);
169
+ database.prepare(`UPDATE daily_reflections SET summary=?, events_json=?, open_tasks_json=?, completed_tasks_json=?,
170
+ learnings_json=?, updated_at=?, reviewed_at=?, review_attempts=0, review_error=NULL, next_review_at=0
171
+ WHERE scope_id=? AND date=?`).run(compact(result.daily.summary, 1200), json(strings(result.daily.events, 20, 240)), json(strings(result.daily.openTasks, 20, 240)), json(strings(result.daily.completedTasks, 20, 240)), json(strings(result.daily.learnings, 20, 240)), at, at, target.scopeId, target.date);
172
+ const bySubject = new Map(merged.filter(item => item.status === 'active').map(item => [normalize(item.subject), item]));
173
+ database.prepare('DELETE FROM memory_relations WHERE companion_id=? AND scope_id=?').run(target.companionId, target.scopeId);
174
+ const insert = database.prepare(`INSERT INTO memory_relations
175
+ (id, companion_id, scope_id, source_memory_id, target_memory_id, kind, label, confidence, updated_at)
176
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);
177
+ for (const relation of result.relations.slice(0, 80)) {
178
+ const source = bySubject.get(normalize(relation.sourceSubject));
179
+ const destination = bySubject.get(normalize(relation.targetSubject));
180
+ if (!source || !destination || source.id === destination.id)
181
+ continue;
182
+ insert.run(`relation-${randomUUID()}`, target.companionId, target.scopeId, source.id, destination.id, relation.kind, compact(relation.label, 120), bounded(relation.confidence), at);
183
+ }
184
+ database.exec('COMMIT');
185
+ }
186
+ catch (error) {
187
+ rollback(database);
188
+ throw error;
189
+ }
190
+ finally {
191
+ database.close();
192
+ }
193
+ });
194
+ }
195
+ async failDailyReview(target, error) {
196
+ const database = await this.open(target.companionId);
197
+ try {
198
+ const attempts = target.attempts + 1;
199
+ database.prepare(`UPDATE daily_reflections SET review_attempts=?, review_error=?, next_review_at=? WHERE scope_id=? AND date=?`).run(attempts, compact(error, 500), Date.now() + Math.min(21_600_000, 60_000 * 2 ** Math.min(attempts, 8)), target.scopeId, target.date);
200
+ }
201
+ finally {
202
+ database.close();
203
+ }
204
+ }
205
+ async relations(companionId, limit = 500) {
206
+ const database = await this.open(companionId);
207
+ try {
208
+ const relations = database.prepare('SELECT * FROM memory_relations WHERE companion_id=? ORDER BY confidence DESC, updated_at DESC LIMIT ?').all(companionId, limit).map(relationFromRow);
209
+ const ids = [...new Set(relations.flatMap(item => [item.sourceMemoryId, item.targetMemoryId]))];
210
+ const memories = ids.length === 0 ? [] : database.prepare(`SELECT * FROM memories WHERE id IN (${ids.map(() => '?').join(',')})`).all(...ids).map(memoryFromRow);
211
+ return { memories, relations };
212
+ }
213
+ finally {
214
+ database.close();
215
+ }
216
+ }
217
+ async clear(companionId) {
218
+ await rm(this.memoryRoot(companionId), { recursive: true, force: true });
219
+ }
220
+ async migrateLegacy(companionId) {
221
+ const journalCount = await this.migrateJournal(companionId);
222
+ const jsonCount = await this.migrateJson(companionId);
223
+ return journalCount + jsonCount;
224
+ }
225
+ async prune(companionId, retentionDays) {
226
+ if (retentionDays === 0)
227
+ return;
228
+ const cutoff = Date.now() - retentionDays * 86_400_000;
229
+ const scopes = await this.scopeDirectories(companionId);
230
+ await Promise.all(scopes.map(directory => this.serial(directory, async () => {
231
+ const target = join(directory, 'conversations');
232
+ const files = await readdir(target).catch(error => missing(error) ? [] : Promise.reject(error));
233
+ await Promise.all(files.filter(file => /^\d{4}-\d{2}-\d{2}\.jsonl$/.test(file) && Date.parse(file.slice(0, 10)) < cutoff).map(file => rm(join(target, file), { force: true })));
234
+ })));
235
+ await this.serial(this.databasePath(companionId), async () => {
236
+ const database = await this.open(companionId);
237
+ try {
238
+ database.exec('BEGIN IMMEDIATE');
239
+ database.prepare('DELETE FROM daily_reflections WHERE companion_id = ? AND updated_at < ?').run(companionId, cutoff);
240
+ database.prepare('DELETE FROM memories WHERE companion_id = ? AND updated_at < ?').run(companionId, cutoff);
241
+ database.exec('COMMIT');
242
+ }
243
+ catch (error) {
244
+ rollback(database);
245
+ throw error;
246
+ }
247
+ finally {
248
+ database.close();
249
+ }
250
+ });
251
+ }
252
+ async open(companionId) {
253
+ await mkdir(this.memoryRoot(companionId), { recursive: true, mode: 0o700 });
254
+ const database = new DatabaseSync(this.databasePath(companionId));
255
+ database.exec(`PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000;
256
+ CREATE TABLE IF NOT EXISTS memories (
257
+ id TEXT PRIMARY KEY, companion_id TEXT NOT NULL, scope_id TEXT NOT NULL, kind TEXT NOT NULL,
258
+ subject TEXT NOT NULL, content TEXT NOT NULL, status TEXT NOT NULL, confidence REAL NOT NULL,
259
+ importance REAL NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL,
260
+ expires_at INTEGER, locked INTEGER NOT NULL DEFAULT 0, evidence_json TEXT NOT NULL
261
+ );
262
+ CREATE INDEX IF NOT EXISTS memories_scope_status_updated ON memories(scope_id, status, updated_at DESC);
263
+ CREATE INDEX IF NOT EXISTS memories_companion_kind_updated ON memories(companion_id, kind, updated_at DESC);
264
+ CREATE TABLE IF NOT EXISTS daily_reflections (
265
+ date TEXT NOT NULL, companion_id TEXT NOT NULL, scope_id TEXT NOT NULL, summary TEXT NOT NULL,
266
+ events_json TEXT NOT NULL, open_tasks_json TEXT NOT NULL, completed_tasks_json TEXT NOT NULL,
267
+ learnings_json TEXT NOT NULL, updated_at INTEGER NOT NULL, turn_count INTEGER NOT NULL,
268
+ PRIMARY KEY(scope_id, date)
269
+ );
270
+ CREATE INDEX IF NOT EXISTS reflections_companion_updated ON daily_reflections(companion_id, updated_at DESC);
271
+ CREATE TABLE IF NOT EXISTS memory_relations (
272
+ id TEXT PRIMARY KEY, companion_id TEXT NOT NULL, scope_id TEXT NOT NULL, source_memory_id TEXT NOT NULL,
273
+ target_memory_id TEXT NOT NULL, kind TEXT NOT NULL, label TEXT NOT NULL, confidence REAL NOT NULL, updated_at INTEGER NOT NULL,
274
+ FOREIGN KEY(source_memory_id) REFERENCES memories(id) ON DELETE CASCADE,
275
+ FOREIGN KEY(target_memory_id) REFERENCES memories(id) ON DELETE CASCADE
276
+ );
277
+ CREATE INDEX IF NOT EXISTS relations_companion_scope ON memory_relations(companion_id, scope_id, updated_at DESC);
278
+ PRAGMA user_version = 1;`);
279
+ ensureColumn(database, 'daily_reflections', 'reviewed_at', 'INTEGER');
280
+ ensureColumn(database, 'daily_reflections', 'review_attempts', 'INTEGER NOT NULL DEFAULT 0');
281
+ ensureColumn(database, 'daily_reflections', 'review_error', 'TEXT');
282
+ ensureColumn(database, 'daily_reflections', 'next_review_at', 'INTEGER NOT NULL DEFAULT 0');
283
+ return database;
284
+ }
285
+ memoriesForScope(database, companionId, scopeId) {
286
+ return database.prepare('SELECT * FROM memories WHERE companion_id = ? AND scope_id = ?').all(companionId, scopeId).map(memoryFromRow);
287
+ }
288
+ upsertMemory(database, memory) {
289
+ database.prepare(`INSERT INTO memories
290
+ (id, companion_id, scope_id, kind, subject, content, status, confidence, importance, created_at, updated_at, expires_at, locked, evidence_json)
291
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
292
+ ON CONFLICT(id) DO UPDATE SET kind=excluded.kind, subject=excluded.subject, content=excluded.content,
293
+ status=excluded.status, confidence=excluded.confidence, importance=excluded.importance, updated_at=excluded.updated_at,
294
+ expires_at=excluded.expires_at, locked=excluded.locked, evidence_json=excluded.evidence_json`).run(memory.id, memory.companionId, memory.scopeId, memory.kind, memory.subject, memory.content, memory.status, memory.confidence, memory.importance, memory.createdAt, memory.updatedAt, memory.expiresAt ?? null, memory.locked ? 1 : 0, json(memory.evidence));
295
+ }
296
+ async migrateJson(companionId) {
297
+ const scopes = await this.scopeDirectories(companionId);
298
+ if (scopes.length === 0)
299
+ return 0;
300
+ const database = await this.open(companionId);
301
+ const migratedFiles = [];
302
+ let migrated = 0;
303
+ try {
304
+ database.exec('BEGIN IMMEDIATE');
305
+ for (const directory of scopes) {
306
+ const scopeHash = directory.split('/').at(-1) ?? 'unknown';
307
+ const documentPath = join(directory, 'memories.json');
308
+ const document = await readJson(documentPath);
309
+ if (document) {
310
+ for (const memory of document.memories) {
311
+ this.upsertMemory(database, memory);
312
+ migrated += 1;
313
+ }
314
+ migratedFiles.push({ source: documentPath, target: join(this.memoryRoot(companionId), 'legacy-json', scopeHash, 'memories.json') });
315
+ }
316
+ const diaryDirectory = join(directory, 'diary');
317
+ const files = await readdir(diaryDirectory).catch(error => missing(error) ? [] : Promise.reject(error));
318
+ for (const file of files.filter(item => /^\d{4}-\d{2}-\d{2}\.json$/.test(item))) {
319
+ const source = join(diaryDirectory, file);
320
+ const reflection = await readJson(source);
321
+ if (!reflection)
322
+ continue;
323
+ this.upsertReflection(database, reflection);
324
+ migrated += 1;
325
+ migratedFiles.push({ source, target: join(this.memoryRoot(companionId), 'legacy-json', scopeHash, 'diary', file) });
326
+ }
327
+ }
328
+ database.exec('COMMIT');
329
+ }
330
+ catch (error) {
331
+ rollback(database);
332
+ throw error;
333
+ }
334
+ finally {
335
+ database.close();
336
+ }
337
+ for (const file of migratedFiles)
338
+ await archiveMigratedFile(file.source, file.target);
339
+ return migrated;
340
+ }
341
+ upsertReflection(database, reflection) {
342
+ database.prepare(`INSERT INTO daily_reflections
343
+ (date, companion_id, scope_id, summary, events_json, open_tasks_json, completed_tasks_json, learnings_json, updated_at, turn_count)
344
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
345
+ ON CONFLICT(scope_id, date) DO UPDATE SET summary=excluded.summary, events_json=excluded.events_json,
346
+ open_tasks_json=excluded.open_tasks_json, completed_tasks_json=excluded.completed_tasks_json,
347
+ learnings_json=excluded.learnings_json, updated_at=excluded.updated_at, turn_count=excluded.turn_count`).run(reflection.date, reflection.companionId, reflection.scopeId, reflection.summary, json(reflection.events), json(reflection.openTasks), json(reflection.completedTasks), json(reflection.learnings), reflection.updatedAt, reflection.turnCount);
348
+ }
349
+ async migrateJournal(companionId) {
350
+ const legacy = join(this.memoryRoot(companionId), 'journal');
351
+ const scopes = await readdir(legacy, { withFileTypes: true }).catch(error => missing(error) ? [] : Promise.reject(error));
352
+ let migrated = 0;
353
+ for (const scope of scopes.filter(item => item.isDirectory())) {
354
+ const directory = join(legacy, scope.name);
355
+ const files = await readdir(directory).catch(() => []);
356
+ for (const file of files.filter(item => /^\d{4}-\d{2}-\d{2}\.jsonl$/.test(item))) {
357
+ const lines = (await readFile(join(directory, file), 'utf8')).split('\n').filter(Boolean);
358
+ for (const line of lines) {
359
+ try {
360
+ const item = JSON.parse(line);
361
+ if (!item.scopeId || !item.at || !item.summary || !item.outcome)
362
+ continue;
363
+ await this.archive({ id: item.id ?? `legacy-${randomUUID()}`, companionId, scopeId: item.scopeId, sessionId: 'legacy-journal', at: item.at, user: item.summary, assistant: item.outcome });
364
+ migrated += 1;
365
+ }
366
+ catch { /* Preserve invalid legacy lines for manual recovery. */ }
367
+ }
368
+ }
369
+ }
370
+ if (migrated > 0)
371
+ await rename(legacy, join(this.memoryRoot(companionId), 'legacy-journal'));
372
+ return migrated;
373
+ }
374
+ async scopeDirectories(companionId) {
375
+ const root = join(this.memoryRoot(companionId), 'scopes');
376
+ const entries = await readdir(root, { withFileTypes: true }).catch(error => missing(error) ? [] : Promise.reject(error));
377
+ return entries.filter(item => item.isDirectory()).map(item => join(root, item.name));
378
+ }
379
+ memoryRoot(companionId) { return join(this.root, 'partners', companionId, 'memory'); }
380
+ databasePath(companionId) { return join(this.memoryRoot(companionId), 'memory.sqlite'); }
381
+ scopeDirectory(companionId, scopeId) { return join(this.memoryRoot(companionId), 'scopes', createHash('sha256').update(scopeId).digest('hex').slice(0, 24)); }
382
+ async serial(key, task) { await this.serialValue(key, task); }
383
+ async serialValue(key, task) {
384
+ const previous = this.writes.get(key) ?? Promise.resolve();
385
+ let value;
386
+ const current = previous.catch(() => { }).then(async () => { value = await task(); });
387
+ this.writes.set(key, current);
388
+ try {
389
+ await current;
390
+ return value;
391
+ }
392
+ finally {
393
+ if (this.writes.get(key) === current)
394
+ this.writes.delete(key);
395
+ }
396
+ }
397
+ }
398
+ function mergeMemories(existing, candidates, turn) {
399
+ const memories = existing.map(item => ({ ...item, evidence: [...item.evidence] }));
400
+ for (const candidate of candidates.slice(0, 12)) {
401
+ const match = memories.find(item => item.kind === candidate.kind && normalize(item.subject) === normalize(candidate.subject) && item.status !== 'superseded');
402
+ if (candidate.operation === 'remove') {
403
+ if (match) {
404
+ match.status = 'superseded';
405
+ match.updatedAt = turn.at;
406
+ }
407
+ ;
408
+ continue;
409
+ }
410
+ if (candidate.operation === 'complete') {
411
+ if (match) {
412
+ match.status = 'completed';
413
+ match.updatedAt = turn.at;
414
+ }
415
+ ;
416
+ continue;
417
+ }
418
+ const evidence = { turnId: turn.id, at: turn.at, excerpt: compact(turn.user, 300) };
419
+ if (match) {
420
+ if (!match.locked)
421
+ match.content = compact(candidate.content, 800);
422
+ match.confidence = Math.max(match.confidence, bounded(candidate.confidence));
423
+ match.importance = Math.max(match.importance, bounded(candidate.importance));
424
+ match.updatedAt = turn.at;
425
+ match.status = 'active';
426
+ match.evidence = [...match.evidence.filter(item => item.turnId !== turn.id), evidence].slice(-8);
427
+ if (candidate.expiresInDays)
428
+ match.expiresAt = turn.at + candidate.expiresInDays * 86_400_000;
429
+ }
430
+ else
431
+ memories.push({
432
+ id: `memory-${randomUUID()}`, companionId: turn.companionId, scopeId: turn.scopeId, kind: candidate.kind,
433
+ subject: compact(candidate.subject, 120), content: compact(candidate.content, 800), status: 'active',
434
+ confidence: bounded(candidate.confidence), importance: bounded(candidate.importance), createdAt: turn.at, updatedAt: turn.at,
435
+ ...(candidate.expiresInDays ? { expiresAt: turn.at + candidate.expiresInDays * 86_400_000 } : {}), evidence: [evidence],
436
+ });
437
+ }
438
+ return memories;
439
+ }
440
+ function memoryFromRow(row) {
441
+ return {
442
+ id: string(row.id), companionId: string(row.companion_id), scopeId: string(row.scope_id), kind: string(row.kind),
443
+ subject: string(row.subject), content: string(row.content), status: string(row.status),
444
+ confidence: number(row.confidence), importance: number(row.importance), createdAt: number(row.created_at), updatedAt: number(row.updated_at),
445
+ ...(row.expires_at === null ? {} : { expiresAt: number(row.expires_at) }), ...(number(row.locked) === 1 ? { locked: true } : {}),
446
+ evidence: parseJson(row.evidence_json, []),
447
+ };
448
+ }
449
+ function reflectionFromRow(row) {
450
+ return {
451
+ date: string(row.date), companionId: string(row.companion_id), scopeId: string(row.scope_id), summary: string(row.summary),
452
+ events: parseJson(row.events_json, []), openTasks: parseJson(row.open_tasks_json, []),
453
+ completedTasks: parseJson(row.completed_tasks_json, []), learnings: parseJson(row.learnings_json, []),
454
+ updatedAt: number(row.updated_at), turnCount: number(row.turn_count),
455
+ };
456
+ }
457
+ function relationFromRow(row) {
458
+ return {
459
+ id: string(row.id), companionId: string(row.companion_id), scopeId: string(row.scope_id),
460
+ sourceMemoryId: string(row.source_memory_id), targetMemoryId: string(row.target_memory_id),
461
+ kind: string(row.kind), label: string(row.label), confidence: number(row.confidence), updatedAt: number(row.updated_at),
462
+ };
463
+ }
464
+ function recallScore(memory, terms, now) {
465
+ const haystack = normalize(`${memory.subject} ${memory.content}`);
466
+ const lexical = terms.length === 0 ? 0 : terms.filter(term => haystack.includes(term)).length / terms.length;
467
+ const recency = Math.max(0, 1 - (now - memory.updatedAt) / (180 * 86_400_000));
468
+ return lexical * 0.5 + memory.importance * 0.22 + memory.confidence * 0.18 + recency * 0.1;
469
+ }
470
+ function rollback(database) { try {
471
+ database.exec('ROLLBACK');
472
+ }
473
+ catch { /* No active transaction. */ } }
474
+ function ensureColumn(database, table, column, definition) {
475
+ const columns = database.prepare(`PRAGMA table_info(${table})`).all();
476
+ if (!columns.some(item => item.name === column))
477
+ database.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
478
+ }
479
+ function tokenize(value) { return [...new Set(normalize(value).match(/[\p{L}\p{N}]{2,}/gu) ?? [])].slice(0, 40); }
480
+ function normalize(value) { return value.toLocaleLowerCase().replace(/\s+/g, ''); }
481
+ function bounded(value) { return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0.5; }
482
+ function strings(value, limit, max) { return [...new Set(value.map(item => compact(item, max)).filter(Boolean))].slice(0, limit); }
483
+ function compact(value, max) { const text = value.replace(/\s+/g, ' ').trim(); return text.length <= max ? text : `${text.slice(0, max - 1)}…`; }
484
+ function string(value) { return typeof value === 'string' ? value : String(value ?? ''); }
485
+ function number(value) { return typeof value === 'bigint' ? Number(value) : typeof value === 'number' ? value : Number(value ?? 0); }
486
+ function json(value) { return JSON.stringify(value); }
487
+ function parseJson(value, fallback) { try {
488
+ return JSON.parse(string(value));
489
+ }
490
+ catch {
491
+ return fallback;
492
+ } }
493
+ export function localMemoryDay(value, timeZone = 'Asia/Shanghai') { return localDay(value, timeZone); }
494
+ function localDay(value, timeZone) {
495
+ const parts = new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit' }).formatToParts(value);
496
+ const part = (type) => parts.find(item => item.type === type)?.value ?? '';
497
+ return `${part('year')}-${part('month')}-${part('day')}`;
498
+ }
499
+ function missing(error) { return error.code === 'ENOENT'; }
500
+ async function readJson(path) { try {
501
+ return JSON.parse(await readFile(path, 'utf8'));
502
+ }
503
+ catch (error) {
504
+ if (missing(error))
505
+ return undefined;
506
+ throw error;
507
+ } }
508
+ async function archiveMigratedFile(source, target) {
509
+ await mkdir(dirname(target), { recursive: true, mode: 0o700 });
510
+ try {
511
+ await rename(source, target);
512
+ }
513
+ catch (error) {
514
+ if (error.code !== 'EEXIST')
515
+ throw error;
516
+ await rm(source, { force: true });
517
+ }
518
+ }
519
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACnF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C,MAAM,OAAO,kBAAkB;IAGA;IAA+B;IAF3C,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAA;IAE1D,YAA6B,IAAY,EAAmB,WAAW,eAAe;QAAzD,SAAI,GAAJ,IAAI,CAAQ;QAAmB,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAE1F,GAAG,CAAC,EAAU,IAAY,OAAO,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA,CAAC,CAAC;IAE9D,KAAK,CAAC,OAAO,CAAC,IAAsB;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC1F,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YAC/E,MAAM,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACxF,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAsB,EAAE,MAA4B;QACpE,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAClD,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;gBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;gBAChF,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;oBAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBACxG,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAuB,CAAA;gBAC3J,QAAQ,CAAC,OAAO,CAAC;;;;;iHAKwF,CAAC,CAAC,GAAG,CAC5G,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EACtH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EACnG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,CAC7F,CAAA;gBACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAAC,MAAM,KAAK,CAAA;YAAC,CAAC;oBAAS,CAAC;gBAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YAAC,CAAC;QAClF,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,OAAe,EAAE,KAAa,EAAE,KAAK,GAAG,EAAE;QAC1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;;iCAEH,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAa,CAAA;YAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;iBACzF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;iBACxE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7C,CAAC;gBAAS,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,KAAK,GAAG,GAAG;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC;YAAC,OAAQ,QAAQ,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAAC,CAAC;gBAC9H,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,QAAgB,EAAE,OAAe,EAAE,OAAe;QACxF,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC7C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;4CACI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;gBAC1H,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;gBACjE,OAAO,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAW,CAAC,CAAA;YACvG,CAAC;oBAAS,CAAC;gBAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YAAC,CAAC;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,QAAgB;QACtD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC7C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;gBACpH,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;YACnE,CAAC;oBAAS,CAAC;gBAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YAAC,CAAC;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAAmB,EAAE,KAAK,GAAG,EAAE;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC;YAAC,OAAQ,QAAQ,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAAC,CAAC;gBAC3I,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,WAAmB,EAAE,OAAe,EAAE,KAAK,GAAG,EAAE;QAC9E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC;YAAC,OAAQ,QAAQ,CAAC,OAAO,CAAC,+EAA+E,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAAC,CAAC;gBACjK,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,IAAY,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC3E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC;YACH,OAAQ,QAAQ,CAAC,OAAO,CAAC;;2CAEY,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,CAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1F,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;aACpI,CAAC,CAAC,CAAA;QACL,CAAC;gBAAS,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAyB;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACpD,IAAI,UAA2B,CAAA;QAC/B,IAAI,QAAyB,CAAA;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAuB,CAAA;YACtJ,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;YAC3D,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;YACnC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;QACzH,CAAC;gBAAS,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,IAAI,QAAQ,CAAC,CAAA;QACnH,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAClJ,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,EAAE,CAAA;YAAC,CAAC;QAC3E,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAyB,EAAE,MAAyB;QAC5E,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACpD,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;gBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;gBACpF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBACrB,MAAM,SAAS,GAAqB,EAAE,EAAE,EAAE,gBAAgB,MAAM,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;gBAChO,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;gBAClE,KAAK,MAAM,MAAM,IAAI,MAAM;oBAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAChE,QAAQ,CAAC,OAAO,CAAC;;sCAEa,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAClH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EACnG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;gBACtF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;gBACvH,QAAQ,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC5H,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;;6CAEK,CAAC,CAAA;gBACtC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACrD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;oBAAC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAA;oBACrI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE;wBAAE,SAAQ;oBACrE,MAAM,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,EAClG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAA;gBAClF,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAAC,MAAM,KAAK,CAAA;YAAC,CAAC;oBAAS,CAAC;gBAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YAAC,CAAC;QAClF,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAyB,EAAE,KAAa;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACpD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAA;YACpC,QAAQ,CAAC,OAAO,CAAC,8GAA8G,CAAC,CAAC,GAAG,CAClI,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QACvI,CAAC;gBAAS,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,WAAmB,EAAE,KAAK,GAAG,GAAG;QAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC;YACH,MAAM,SAAS,GAAI,QAAQ,CAAC,OAAO,CAAC,uGAAuG,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAc,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;YACtM,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/F,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,QAAQ,CAAC,OAAO,CAAC,uCAAuC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YAC9K,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;QAChC,CAAC;gBAAS,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB;QAC7B,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAmB;QACrC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;QAC3D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;QACrD,OAAO,YAAY,GAAG,SAAS,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,aAAqB;QACpD,IAAI,aAAa,KAAK,CAAC;YAAE,OAAM;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,UAAU,CAAA;QACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACvD,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;YAC/C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAC/F,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACjL,CAAC,CAAC,CAAC,CAAC,CAAA;QACJ,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC7C,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;gBAChC,QAAQ,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;gBACpH,QAAQ,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;gBAC3G,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAAC,MAAM,KAAK,CAAA;YAAC,CAAC;oBAAS,CAAC;gBAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YAAC,CAAC;QAClF,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,WAAmB;QACpC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3E,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAA;QACjE,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;+BAuBa,CAAC,CAAA;QAC5B,YAAY,CAAC,QAAQ,EAAE,mBAAmB,EAAE,aAAa,EAAE,SAAS,CAAC,CAAA;QACrE,YAAY,CAAC,QAAQ,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,4BAA4B,CAAC,CAAA;QAC5F,YAAY,CAAC,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,CAAC,CAAA;QACnE,YAAY,CAAC,QAAQ,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,4BAA4B,CAAC,CAAA;QAC3F,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,gBAAgB,CAAC,QAAsB,EAAE,WAAmB,EAAE,OAAe;QACnF,OAAQ,QAAQ,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACtJ,CAAC;IAEO,YAAY,CAAC,QAAsB,EAAE,MAAqB;QAChE,QAAQ,CAAC,OAAO,CAAC;;;;;mGAK8E,CAAC,CAAC,GAAG,CAClG,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EACzG,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAClG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAC7C,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,WAAmB;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAA;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7C,MAAM,aAAa,GAA8C,EAAE,CAAA;QACnE,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAChC,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAA;gBAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;gBACrD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAiB,YAAY,CAAC,CAAA;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACb,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;wBAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBAAC,QAAQ,IAAI,CAAC,CAAA;oBAAC,CAAC;oBAC9F,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,CAAA;gBACrI,CAAC;gBACD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;gBAC/C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBACvG,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBAChF,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;oBACzC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAkB,MAAM,CAAC,CAAA;oBAC1D,IAAI,CAAC,UAAU;wBAAE,SAAQ;oBACzB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;oBAC3C,QAAQ,IAAI,CAAC,CAAA;oBACb,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;gBACrH,CAAC;YACH,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAAC,MAAM,KAAK,CAAA;QAAC,CAAC;gBAAS,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;QAChF,KAAK,MAAM,IAAI,IAAI,aAAa;YAAE,MAAM,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACrF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,gBAAgB,CAAC,QAAsB,EAAE,UAA2B;QAC1E,QAAQ,CAAC,OAAO,CAAC;;;;;6GAKwF,CAAC,CAAC,GAAG,CAC5G,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EACxG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CACpI,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,WAAmB;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACzH,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC1C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;YACtD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACjF,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBACzF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuF,CAAA;wBACnH,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;4BAAE,SAAQ;wBACzE,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;wBAC1L,QAAQ,IAAI,CAAC,CAAA;oBACf,CAAC;oBAAC,MAAM,CAAC,CAAC,wDAAwD,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,GAAG,CAAC;YAAE,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAA;QAC5F,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACxH,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACtF,CAAC;IAEO,UAAU,CAAC,WAAmB,IAAY,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA,CAAC,CAAC;IACrG,YAAY,CAAC,WAAmB,IAAY,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,CAAA,CAAC,CAAC;IACxG,cAAc,CAAC,WAAmB,EAAE,OAAe,IAAY,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC;IAErL,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,IAAyB,IAAmB,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC;IACzG,KAAK,CAAC,WAAW,CAAI,GAAW,EAAE,IAAsB;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1D,IAAI,KAAS,CAAA;QACb,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,GAAG,KAAK,GAAG,MAAM,IAAI,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;QACnF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC7B,IAAI,CAAC;YAAC,MAAM,OAAO,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;gBAAS,CAAC;YAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAAC,CAAC;IAC/G,CAAC;CACF;AAED,SAAS,aAAa,CAAC,QAAyB,EAAE,UAA6B,EAAE,IAAsB;IACrG,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;IAClF,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,CAAA;QAC7J,IAAI,SAAS,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAAC,IAAI,KAAK,EAAE,CAAC;gBAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC;gBAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAA;YAAC,CAAC;YAAA,CAAC;YAAC,SAAQ;QAAC,CAAC;QACzH,IAAI,SAAS,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAAC,IAAI,KAAK,EAAE,CAAC;gBAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;gBAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAA;YAAC,CAAC;YAAA,CAAC;YAAC,SAAQ;QAAC,CAAC;QAC1H,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAA;QACnF,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YAClE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAA;YAC1J,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;YAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;YAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACpJ,IAAI,SAAS,CAAC,aAAa;gBAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAA;QAC/F,CAAC;;YAAM,QAAQ,CAAC,IAAI,CAAC;gBACnB,EAAE,EAAE,UAAU,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI;gBACxG,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ;gBACpG,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE;gBAC5H,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC;aACxH,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAe;QAC9H,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAiB;QACtG,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QAC5I,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChI,QAAQ,EAAE,SAAS,CAAmB,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;KAC7D,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1H,MAAM,EAAE,SAAS,CAAW,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAW,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;QACzG,cAAc,EAAE,SAAS,CAAW,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAW,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;QACzH,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KACrE,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACxF,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC1F,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAuB,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KAC9I,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAqB,EAAE,KAAe,EAAE,GAAW;IACtE,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IACjE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAC5G,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAA;IAC9E,OAAO,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAA;AAC5F,CAAC;AAED,SAAS,QAAQ,CAAC,QAAsB,IAAU,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AAAC,CAAC;AAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;AAC5H,SAAS,YAAY,CAAC,QAAsB,EAAE,KAAa,EAAE,MAAc,EAAE,UAAkB;IAC7F,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC,GAAG,EAAc,CAAA;IACjF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,KAAK,eAAe,MAAM,IAAI,UAAU,EAAE,CAAC,CAAA;AAC3H,CAAC;AACD,SAAS,QAAQ,CAAC,KAAa,IAAc,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC;AACnI,SAAS,SAAS,CAAC,KAAa,IAAY,OAAO,KAAK,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC;AAClG,SAAS,OAAO,CAAC,KAAa,IAAY,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA,CAAC,CAAC;AACjH,SAAS,OAAO,CAAC,KAAe,EAAE,KAAa,EAAE,GAAW,IAAc,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC;AACtK,SAAS,OAAO,CAAC,KAAa,EAAE,GAAW,IAAY,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA,CAAC,CAAC;AACxK,SAAS,MAAM,CAAC,KAAc,IAAY,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;AAC1G,SAAS,MAAM,CAAC,KAAc,IAAY,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA,CAAC,CAAC;AACrJ,SAAS,IAAI,CAAC,KAAc,IAAY,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;AACtE,SAAS,SAAS,CAAI,KAAc,EAAE,QAAW,IAAO,IAAI,CAAC;IAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAM,CAAA;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,QAAQ,CAAA;AAAC,CAAC,CAAC,CAAC;AACjI,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,QAAQ,GAAG,eAAe,IAAY,OAAO,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA,CAAC,CAAC;AACtH,SAAS,QAAQ,CAAC,KAAa,EAAE,QAAgB;IAC/C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IACpI,MAAM,IAAI,GAAG,CAAC,IAAkC,EAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAA;IAChH,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;AAC1D,CAAC;AACD,SAAS,OAAO,CAAC,KAAc,IAAa,OAAQ,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAA,CAAC,CAAC;AACvG,KAAK,UAAU,QAAQ,CAAI,IAAY,IAA4B,IAAI,CAAC;IAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAA;AAAC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAAC,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAAC,MAAM,KAAK,CAAA;AAAC,CAAC,CAAC,CAAC;AACrM,KAAK,UAAU,mBAAmB,CAAC,MAAc,EAAE,MAAc;IAC/D,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9D,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAAC,CAAC;IACpC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAAC,CAAC;AAC1H,CAAC"}
package/lib/store.js CHANGED
@@ -83,7 +83,7 @@ export class PartnerStore {
83
83
  }
84
84
  }
85
85
  function emptyState() {
86
- return { schemaVersion: 4, companions: [createDefaultCompanion()], channels: [], pairings: [], sessions: [], recentReceipts: [], heartbeatStates: [] };
86
+ return { schemaVersion: 7, companions: [createDefaultCompanion()], channels: [], pairings: [], sessions: [], recentReceipts: [], heartbeatStates: [] };
87
87
  }
88
88
  function parseState(value) {
89
89
  if (typeof value === 'object' && value !== null && !Array.isArray(value) && value.schemaVersion === 1) {
@@ -135,6 +135,33 @@ function parseState(value) {
135
135
  }) : legacy.companions,
136
136
  };
137
137
  }
138
+ if (typeof value === 'object' && value !== null && !Array.isArray(value) && value.schemaVersion === 4) {
139
+ const legacy = value;
140
+ value = {
141
+ ...legacy,
142
+ schemaVersion: 5,
143
+ companions: Array.isArray(legacy.companions) ? legacy.companions.map(item => {
144
+ const companion = item;
145
+ const automation = companion.automation;
146
+ const { journal, ...rest } = automation ?? {};
147
+ return { ...companion, automation: { ...rest, memory: journal ?? structuredClone(DEFAULT_AUTOMATION.memory) } };
148
+ }) : legacy.companions,
149
+ };
150
+ }
151
+ if (typeof value === 'object' && value !== null && !Array.isArray(value) && value.schemaVersion === 5) {
152
+ value = { ...value, schemaVersion: 6 };
153
+ }
154
+ if (typeof value === 'object' && value !== null && !Array.isArray(value) && value.schemaVersion === 6) {
155
+ const legacy = value;
156
+ value = {
157
+ ...legacy, schemaVersion: 7,
158
+ companions: Array.isArray(legacy.companions) ? legacy.companions.map(item => {
159
+ const companion = item;
160
+ const automation = companion.automation;
161
+ return { ...companion, automation: { ...automation, memory: { ...automation.memory, dailyReviewEnabled: true, dailyReviewHour: 2 } } };
162
+ }) : legacy.companions,
163
+ };
164
+ }
138
165
  validateState(value);
139
166
  return value;
140
167
  }
@@ -142,7 +169,7 @@ function validateState(value) {
142
169
  if (typeof value !== 'object' || value === null || Array.isArray(value))
143
170
  throw new Error('partner state must be an object');
144
171
  const state = value;
145
- if (state.schemaVersion !== 4)
172
+ if (state.schemaVersion !== 7)
146
173
  throw new Error('unsupported partner state schema');
147
174
  for (const key of ['companions', 'channels', 'pairings', 'sessions', 'recentReceipts', 'heartbeatStates']) {
148
175
  if (!Array.isArray(state[key]))