a2a-memory 0.1.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/cli/commands/config.d.ts +6 -0
  4. package/dist/cli/commands/config.d.ts.map +1 -0
  5. package/dist/cli/commands/config.js +56 -0
  6. package/dist/cli/commands/config.js.map +1 -0
  7. package/dist/cli/commands/extract.d.ts +8 -0
  8. package/dist/cli/commands/extract.d.ts.map +1 -0
  9. package/dist/cli/commands/extract.js +103 -0
  10. package/dist/cli/commands/extract.js.map +1 -0
  11. package/dist/cli/commands/list.d.ts +6 -0
  12. package/dist/cli/commands/list.d.ts.map +1 -0
  13. package/dist/cli/commands/list.js +44 -0
  14. package/dist/cli/commands/list.js.map +1 -0
  15. package/dist/cli/commands/search.d.ts +6 -0
  16. package/dist/cli/commands/search.d.ts.map +1 -0
  17. package/dist/cli/commands/search.js +45 -0
  18. package/dist/cli/commands/search.js.map +1 -0
  19. package/dist/cli/commands/setup.d.ts +8 -0
  20. package/dist/cli/commands/setup.d.ts.map +1 -0
  21. package/dist/cli/commands/setup.js +132 -0
  22. package/dist/cli/commands/setup.js.map +1 -0
  23. package/dist/cli/commands/status.d.ts +6 -0
  24. package/dist/cli/commands/status.d.ts.map +1 -0
  25. package/dist/cli/commands/status.js +70 -0
  26. package/dist/cli/commands/status.js.map +1 -0
  27. package/dist/cli/commands/sync.d.ts +6 -0
  28. package/dist/cli/commands/sync.d.ts.map +1 -0
  29. package/dist/cli/commands/sync.js +142 -0
  30. package/dist/cli/commands/sync.js.map +1 -0
  31. package/dist/cli/index.d.ts +14 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +34 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/config/manager.d.ts +18 -0
  36. package/dist/config/manager.d.ts.map +1 -0
  37. package/dist/config/manager.js +95 -0
  38. package/dist/config/manager.js.map +1 -0
  39. package/dist/db/database.d.ts +55 -0
  40. package/dist/db/database.d.ts.map +1 -0
  41. package/dist/db/database.js +414 -0
  42. package/dist/db/database.js.map +1 -0
  43. package/dist/extraction/extractor.d.ts +12 -0
  44. package/dist/extraction/extractor.d.ts.map +1 -0
  45. package/dist/extraction/extractor.js +265 -0
  46. package/dist/extraction/extractor.js.map +1 -0
  47. package/dist/extraction/filter.d.ts +19 -0
  48. package/dist/extraction/filter.d.ts.map +1 -0
  49. package/dist/extraction/filter.js +60 -0
  50. package/dist/extraction/filter.js.map +1 -0
  51. package/dist/extraction/scorer.d.ts +18 -0
  52. package/dist/extraction/scorer.d.ts.map +1 -0
  53. package/dist/extraction/scorer.js +107 -0
  54. package/dist/extraction/scorer.js.map +1 -0
  55. package/dist/hooks/post-tool-use.d.ts +14 -0
  56. package/dist/hooks/post-tool-use.d.ts.map +1 -0
  57. package/dist/hooks/post-tool-use.js +144 -0
  58. package/dist/hooks/post-tool-use.js.map +1 -0
  59. package/dist/hooks/session-end.d.ts +13 -0
  60. package/dist/hooks/session-end.d.ts.map +1 -0
  61. package/dist/hooks/session-end.js +85 -0
  62. package/dist/hooks/session-end.js.map +1 -0
  63. package/dist/hooks/session-start.d.ts +15 -0
  64. package/dist/hooks/session-start.d.ts.map +1 -0
  65. package/dist/hooks/session-start.js +77 -0
  66. package/dist/hooks/session-start.js.map +1 -0
  67. package/dist/index.d.ts +17 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +18 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/session/parser.d.ts +30 -0
  72. package/dist/session/parser.d.ts.map +1 -0
  73. package/dist/session/parser.js +129 -0
  74. package/dist/session/parser.js.map +1 -0
  75. package/dist/sync/client.d.ts +72 -0
  76. package/dist/sync/client.d.ts.map +1 -0
  77. package/dist/sync/client.js +138 -0
  78. package/dist/sync/client.js.map +1 -0
  79. package/dist/sync/index.d.ts +8 -0
  80. package/dist/sync/index.d.ts.map +1 -0
  81. package/dist/sync/index.js +6 -0
  82. package/dist/sync/index.js.map +1 -0
  83. package/dist/sync/synchronizer.d.ts +39 -0
  84. package/dist/sync/synchronizer.d.ts.map +1 -0
  85. package/dist/sync/synchronizer.js +169 -0
  86. package/dist/sync/synchronizer.js.map +1 -0
  87. package/dist/types/index.d.ts +140 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +48 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/package.json +53 -0
@@ -0,0 +1,414 @@
1
+ /**
2
+ * Memory Database
3
+ *
4
+ * SQLite 기반 로컬 메모리 저장소.
5
+ * better-sqlite3 (동기 API) 사용.
6
+ */
7
+ import Database from 'better-sqlite3';
8
+ import { randomUUID } from 'node:crypto';
9
+ import { existsSync, mkdirSync, statSync } from 'node:fs';
10
+ import { dirname } from 'node:path';
11
+ import { homedir } from 'node:os';
12
+ const DEFAULT_DB_PATH = '~/.a2a/memory.db';
13
+ function resolvePath(p) {
14
+ if (p.startsWith('~')) {
15
+ return p.replace('~', homedir());
16
+ }
17
+ return p;
18
+ }
19
+ export class MemoryDatabase {
20
+ db;
21
+ dbPath;
22
+ constructor(dbPath = DEFAULT_DB_PATH) {
23
+ this.dbPath = resolvePath(dbPath);
24
+ const dir = dirname(this.dbPath);
25
+ if (!existsSync(dir)) {
26
+ mkdirSync(dir, { recursive: true });
27
+ }
28
+ this.db = new Database(this.dbPath);
29
+ this.db.pragma('journal_mode = WAL');
30
+ this.db.pragma('foreign_keys = ON');
31
+ }
32
+ initialize() {
33
+ this.db.exec(`
34
+ CREATE TABLE IF NOT EXISTS memories (
35
+ id TEXT PRIMARY KEY,
36
+ content TEXT NOT NULL,
37
+ category TEXT NOT NULL,
38
+ tier TEXT NOT NULL,
39
+ embedding BLOB,
40
+ project_path TEXT,
41
+ session_id TEXT,
42
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
43
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
44
+ access_count INTEGER NOT NULL DEFAULT 0,
45
+ last_accessed_at TEXT
46
+ );
47
+
48
+ CREATE TABLE IF NOT EXISTS memory_tags (
49
+ memory_id TEXT NOT NULL,
50
+ tag TEXT NOT NULL,
51
+ PRIMARY KEY (memory_id, tag),
52
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
53
+ );
54
+
55
+ CREATE TABLE IF NOT EXISTS sessions (
56
+ session_id TEXT PRIMARY KEY,
57
+ project_path TEXT NOT NULL,
58
+ message_count INTEGER NOT NULL DEFAULT 0,
59
+ processed_at TEXT NOT NULL DEFAULT (datetime('now'))
60
+ );
61
+
62
+ CREATE TABLE IF NOT EXISTS sync_status (
63
+ memory_id TEXT PRIMARY KEY,
64
+ remote_id TEXT,
65
+ synced_at TEXT,
66
+ sync_state TEXT NOT NULL DEFAULT 'pending',
67
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
68
+ );
69
+
70
+ CREATE INDEX IF NOT EXISTS idx_memories_category ON memories(category);
71
+ CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier);
72
+ CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project_path);
73
+ CREATE INDEX IF NOT EXISTS idx_memories_session ON memories(session_id);
74
+ CREATE INDEX IF NOT EXISTS idx_memory_tags_tag ON memory_tags(tag);
75
+ CREATE INDEX IF NOT EXISTS idx_sync_state ON sync_status(sync_state);
76
+ `);
77
+ // FTS5 테이블 (별도 exec — 이미 존재하면 무시)
78
+ try {
79
+ this.db.exec(`
80
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(
81
+ content,
82
+ tokenize='unicode61'
83
+ );
84
+ `);
85
+ }
86
+ catch {
87
+ // FTS5 테이블이 이미 존재하면 무시
88
+ }
89
+ }
90
+ // ============================
91
+ // CRUD
92
+ // ============================
93
+ createMemory(input) {
94
+ const id = randomUUID();
95
+ const now = new Date().toISOString();
96
+ const stmt = this.db.prepare(`
97
+ INSERT INTO memories (id, content, category, tier, project_path, session_id, created_at, updated_at)
98
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
99
+ `);
100
+ stmt.run(id, input.content, input.category, input.tier, input.projectPath ?? null, input.sessionId ?? null, now, now);
101
+ // 태그 삽입
102
+ const tags = input.tags ?? [];
103
+ if (tags.length > 0) {
104
+ const tagStmt = this.db.prepare('INSERT INTO memory_tags (memory_id, tag) VALUES (?, ?)');
105
+ for (const tag of tags) {
106
+ tagStmt.run(id, tag);
107
+ }
108
+ }
109
+ // FTS 삽입
110
+ this.db.prepare('INSERT INTO memory_fts (rowid, content) VALUES (?, ?)').run(this.getRowId(id), input.content);
111
+ return {
112
+ id,
113
+ content: input.content,
114
+ category: input.category,
115
+ tier: input.tier,
116
+ tags,
117
+ projectPath: input.projectPath,
118
+ sessionId: input.sessionId,
119
+ createdAt: now,
120
+ updatedAt: now,
121
+ accessCount: 0,
122
+ };
123
+ }
124
+ getMemory(id) {
125
+ const exists = this.db.prepare('SELECT id FROM memories WHERE id = ?').get(id);
126
+ if (!exists)
127
+ return null;
128
+ // access_count 업데이트
129
+ this.db.prepare('UPDATE memories SET access_count = access_count + 1, last_accessed_at = datetime(\'now\') WHERE id = ?').run(id);
130
+ // 업데이트 후 다시 조회
131
+ const row = this.db.prepare('SELECT * FROM memories WHERE id = ?').get(id);
132
+ return this.rowToMemory(row);
133
+ }
134
+ updateMemory(id, updates) {
135
+ const existing = this.db.prepare('SELECT * FROM memories WHERE id = ?').get(id);
136
+ if (!existing)
137
+ return null;
138
+ const fields = ['updated_at = datetime(\'now\')'];
139
+ const values = [];
140
+ if (updates.content !== undefined) {
141
+ fields.push('content = ?');
142
+ values.push(updates.content);
143
+ }
144
+ if (updates.category !== undefined) {
145
+ fields.push('category = ?');
146
+ values.push(updates.category);
147
+ }
148
+ if (updates.tier !== undefined) {
149
+ fields.push('tier = ?');
150
+ values.push(updates.tier);
151
+ }
152
+ if (updates.projectPath !== undefined) {
153
+ fields.push('project_path = ?');
154
+ values.push(updates.projectPath);
155
+ }
156
+ if (updates.sessionId !== undefined) {
157
+ fields.push('session_id = ?');
158
+ values.push(updates.sessionId);
159
+ }
160
+ values.push(id);
161
+ this.db.prepare(`UPDATE memories SET ${fields.join(', ')} WHERE id = ?`).run(...values);
162
+ // 태그 업데이트
163
+ if (updates.tags !== undefined) {
164
+ this.db.prepare('DELETE FROM memory_tags WHERE memory_id = ?').run(id);
165
+ const tagStmt = this.db.prepare('INSERT INTO memory_tags (memory_id, tag) VALUES (?, ?)');
166
+ for (const tag of updates.tags) {
167
+ tagStmt.run(id, tag);
168
+ }
169
+ }
170
+ // FTS 업데이트
171
+ if (updates.content !== undefined) {
172
+ const rowId = this.getRowId(id);
173
+ if (rowId !== null) {
174
+ this.db.prepare('UPDATE memory_fts SET content = ? WHERE rowid = ?').run(updates.content, rowId);
175
+ }
176
+ }
177
+ return this.getMemory(id);
178
+ }
179
+ deleteMemory(id) {
180
+ const rowId = this.getRowId(id);
181
+ if (rowId !== null) {
182
+ this.db.prepare('DELETE FROM memory_fts WHERE rowid = ?').run(rowId);
183
+ }
184
+ const result = this.db.prepare('DELETE FROM memories WHERE id = ?').run(id);
185
+ return result.changes > 0;
186
+ }
187
+ listMemories(options) {
188
+ const conditions = [];
189
+ const values = [];
190
+ if (options?.category) {
191
+ conditions.push('category = ?');
192
+ values.push(options.category);
193
+ }
194
+ if (options?.tier) {
195
+ conditions.push('tier = ?');
196
+ values.push(options.tier);
197
+ }
198
+ if (options?.projectPath) {
199
+ conditions.push('project_path = ?');
200
+ values.push(options.projectPath);
201
+ }
202
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
203
+ const limit = options?.limit ?? 50;
204
+ const offset = options?.offset ?? 0;
205
+ const rows = this.db.prepare(`SELECT * FROM memories ${where} ORDER BY updated_at DESC LIMIT ? OFFSET ?`).all(...values, limit, offset);
206
+ return rows.map((row) => this.rowToMemory(row));
207
+ }
208
+ // ============================
209
+ // Search
210
+ // ============================
211
+ searchByFTS(query, limit = 10) {
212
+ const rows = this.db.prepare(`
213
+ SELECT m.*, fts.rank
214
+ FROM memory_fts fts
215
+ JOIN memories m ON m.rowid = fts.rowid
216
+ WHERE memory_fts MATCH ?
217
+ ORDER BY fts.rank
218
+ LIMIT ?
219
+ `).all(query, limit);
220
+ return rows.map((row) => ({
221
+ memory: this.rowToMemory(row),
222
+ score: Math.min(1, Math.max(0, 1 + row.rank / 10)),
223
+ matchType: 'fts',
224
+ }));
225
+ }
226
+ searchByVector(embedding, limit = 10, minScore = 0.5) {
227
+ const rows = this.db.prepare('SELECT * FROM memories WHERE embedding IS NOT NULL').all();
228
+ const scored = rows
229
+ .map((row) => {
230
+ const stored = bufferToFloat32Array(row.embedding);
231
+ const similarity = cosineSimilarity(embedding, Array.from(stored));
232
+ return { row, similarity };
233
+ })
234
+ .filter((item) => item.similarity >= minScore)
235
+ .sort((a, b) => b.similarity - a.similarity)
236
+ .slice(0, limit);
237
+ return scored.map((item) => ({
238
+ memory: this.rowToMemory(item.row),
239
+ score: item.similarity,
240
+ matchType: 'vector',
241
+ }));
242
+ }
243
+ search(options) {
244
+ const limit = options.limit ?? 10;
245
+ const results = [];
246
+ // FTS 검색
247
+ try {
248
+ const ftsResults = this.searchByFTS(options.query, limit);
249
+ results.push(...ftsResults);
250
+ }
251
+ catch {
252
+ // FTS 쿼리 실패 시 무시
253
+ }
254
+ // 카테고리/티어/프로젝트 필터 적용
255
+ const filtered = results.filter((r) => {
256
+ if (options.category && r.memory.category !== options.category)
257
+ return false;
258
+ if (options.tier && r.memory.tier !== options.tier)
259
+ return false;
260
+ if (options.projectPath && r.memory.projectPath !== options.projectPath)
261
+ return false;
262
+ if (options.minScore && r.score < options.minScore)
263
+ return false;
264
+ return true;
265
+ });
266
+ // 중복 제거 (id 기준)
267
+ const seen = new Set();
268
+ return filtered.filter((r) => {
269
+ if (seen.has(r.memory.id))
270
+ return false;
271
+ seen.add(r.memory.id);
272
+ return true;
273
+ }).slice(0, limit);
274
+ }
275
+ // ============================
276
+ // Session
277
+ // ============================
278
+ saveSession(sessionId, projectPath, messageCount) {
279
+ this.db.prepare(`
280
+ INSERT OR REPLACE INTO sessions (session_id, project_path, message_count, processed_at)
281
+ VALUES (?, ?, ?, datetime('now'))
282
+ `).run(sessionId, projectPath, messageCount);
283
+ }
284
+ getSession(sessionId) {
285
+ const row = this.db.prepare('SELECT * FROM sessions WHERE session_id = ?').get(sessionId);
286
+ if (!row)
287
+ return null;
288
+ return {
289
+ sessionId: row.session_id,
290
+ projectPath: row.project_path,
291
+ messageCount: row.message_count,
292
+ processedAt: row.processed_at,
293
+ };
294
+ }
295
+ // ============================
296
+ // Utility
297
+ // ============================
298
+ getStats() {
299
+ const totalMemories = this.db.prepare('SELECT COUNT(*) as count FROM memories').get().count;
300
+ const totalSessions = this.db.prepare('SELECT COUNT(*) as count FROM sessions').get().count;
301
+ let dbSizeBytes = 0;
302
+ try {
303
+ dbSizeBytes = statSync(this.dbPath).size;
304
+ }
305
+ catch {
306
+ // ignore
307
+ }
308
+ const categoryRows = this.db.prepare('SELECT category, COUNT(*) as count FROM memories GROUP BY category').all();
309
+ const categoryCounts = {};
310
+ for (const row of categoryRows) {
311
+ categoryCounts[row.category] = row.count;
312
+ }
313
+ return { totalMemories, totalSessions, dbSizeBytes, categoryCounts };
314
+ }
315
+ vacuum() {
316
+ this.db.exec('VACUUM');
317
+ }
318
+ close() {
319
+ this.db.close();
320
+ }
321
+ // ============================
322
+ // Sync
323
+ // ============================
324
+ setSyncStatus(memoryId, remoteId, state) {
325
+ const now = new Date().toISOString();
326
+ this.db.prepare(`
327
+ INSERT OR REPLACE INTO sync_status (memory_id, remote_id, synced_at, sync_state)
328
+ VALUES (?, ?, ?, ?)
329
+ `).run(memoryId, remoteId, now, state);
330
+ }
331
+ getSyncStatus(memoryId) {
332
+ const row = this.db.prepare('SELECT remote_id, synced_at, sync_state FROM sync_status WHERE memory_id = ?').get(memoryId);
333
+ if (!row)
334
+ return null;
335
+ return {
336
+ remoteId: row.remote_id,
337
+ syncedAt: row.synced_at,
338
+ syncState: row.sync_state,
339
+ };
340
+ }
341
+ getPendingSyncMemories() {
342
+ const rows = this.db.prepare(`
343
+ SELECT m.*
344
+ FROM memories m
345
+ LEFT JOIN sync_status s ON m.id = s.memory_id
346
+ WHERE s.sync_state = 'pending' OR s.sync_state IS NULL
347
+ `).all();
348
+ return rows.map((row) => this.rowToMemory(row));
349
+ }
350
+ findMemoryByRemoteId(remoteId) {
351
+ const row = this.db.prepare(`
352
+ SELECT m.*
353
+ FROM memories m
354
+ JOIN sync_status s ON m.id = s.memory_id
355
+ WHERE s.remote_id = ?
356
+ `).get(remoteId);
357
+ if (!row)
358
+ return null;
359
+ return this.rowToMemory(row);
360
+ }
361
+ getSyncedMemoryCount() {
362
+ const row = this.db.prepare("SELECT COUNT(*) as count FROM sync_status WHERE sync_state = 'synced'").get();
363
+ return row.count;
364
+ }
365
+ getLastSyncedAt() {
366
+ const row = this.db.prepare("SELECT MAX(synced_at) as last_synced FROM sync_status WHERE sync_state = 'synced'").get();
367
+ return row.last_synced;
368
+ }
369
+ // ============================
370
+ // Private helpers
371
+ // ============================
372
+ getRowId(id) {
373
+ const row = this.db.prepare('SELECT rowid FROM memories WHERE id = ?').get(id);
374
+ return row?.rowid ?? null;
375
+ }
376
+ rowToMemory(row) {
377
+ const tags = this.db.prepare('SELECT tag FROM memory_tags WHERE memory_id = ?').all(row.id);
378
+ return {
379
+ id: row.id,
380
+ content: row.content,
381
+ category: row.category,
382
+ tier: row.tier,
383
+ tags: tags.map((t) => t.tag),
384
+ embedding: row.embedding ? Array.from(bufferToFloat32Array(row.embedding)) : undefined,
385
+ projectPath: row.project_path ?? undefined,
386
+ sessionId: row.session_id ?? undefined,
387
+ createdAt: row.created_at,
388
+ updatedAt: row.updated_at,
389
+ accessCount: row.access_count,
390
+ lastAccessedAt: row.last_accessed_at ?? undefined,
391
+ };
392
+ }
393
+ }
394
+ function cosineSimilarity(a, b) {
395
+ if (a.length !== b.length || a.length === 0)
396
+ return 0;
397
+ let dotProduct = 0;
398
+ let normA = 0;
399
+ let normB = 0;
400
+ for (let i = 0; i < a.length; i++) {
401
+ dotProduct += a[i] * b[i];
402
+ normA += a[i] * a[i];
403
+ normB += b[i] * b[i];
404
+ }
405
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
406
+ if (denominator === 0)
407
+ return 0;
408
+ return dotProduct / denominator;
409
+ }
410
+ function bufferToFloat32Array(buf) {
411
+ const arrayBuffer = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
412
+ return new Float32Array(arrayBuffer);
413
+ }
414
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUlC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,OAAO,cAAc;IACjB,EAAE,CAAoB;IACtB,MAAM,CAAS;IAEvB,YAAY,SAAiB,eAAe;QAC1C,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;IAED,UAAU;QACR,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2CZ,CAAC,CAAC;QAEH,kCAAkC;QAClC,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;OAKZ,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,OAAO;IACP,+BAA+B;IAE/B,YAAY,CAAC,KAAwB;QACnC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAEtH,QAAQ;QACR,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC;YAC1F,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,SAAS;QACT,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAC1E,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EACjB,KAAK,CAAC,OAAO,CACd,CAAC;QAEF,OAAO;YACL,EAAE;YACF,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI;YACJ,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,CAAC;SACf,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,oBAAoB;QACpB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wGAAwG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElI,eAAe;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAc,CAAC;QACxF,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,OAAmC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,EAAE,CAA0B,CAAC;QACzG,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,MAAM,GAAa,CAAC,gCAAgC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QAExF,UAAU;QACV,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC;YAC1F,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,YAAY,CAAC,OAMZ;QACC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;QAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,0BAA0B,KAAK,4CAA4C,CAC5E,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,CAAgB,CAAC;QAE/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,+BAA+B;IAC/B,SAAS;IACT,+BAA+B;IAE/B,WAAW,CAAC,KAAa,EAAE,QAAgB,EAAE;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;KAO5B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAqC,CAAC;QAEzD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YAClD,SAAS,EAAE,KAAc;SAC1B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,cAAc,CACZ,SAAmB,EACnB,QAAgB,EAAE,EAClB,WAAmB,GAAG;QAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,oDAAoD,CACrD,CAAC,GAAG,EAAiB,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI;aAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACX,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,SAAU,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACnE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QAC7B,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC;aAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;aAC3C,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEnB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,SAAS,EAAE,QAAiB;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM,CAAC,OAA4B;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,SAAS;QACT,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QAED,qBAAqB;QACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC7E,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACjE,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAC;YACtF,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,+BAA+B;IAC/B,UAAU;IACV,+BAA+B;IAE/B,WAAW,CAAC,SAAiB,EAAE,WAAmB,EAAE,YAAoB;QACtE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,SAAS,CAA2B,CAAC;QACpH,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,WAAW,EAAE,GAAG,CAAC,YAAY;SAC9B,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,UAAU;IACV,+BAA+B;IAE/B,QAAQ;QAMN,MAAM,aAAa,GAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;QACnH,MAAM,aAAa,GAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;QAEnH,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAClC,oEAAoE,CACrE,CAAC,GAAG,EAA2C,CAAC;QAEjD,MAAM,cAAc,GAA2B,EAAE,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC3C,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IACvE,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,OAAO;IACP,+BAA+B;IAE/B,aAAa,CACX,QAAgB,EAChB,QAAuB,EACvB,KAAwC;QAExC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,aAAa,CAAC,QAAgB;QAK5B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,8EAA8E,CAC/E,CAAC,GAAG,CAAC,QAAQ,CAAoF,CAAC;QAEnG,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC;IACJ,CAAC;IAED,sBAAsB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC,GAAG,EAAiB,CAAC;QAExB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,oBAAoB,CAAC,QAAgB;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK3B,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA0B,CAAC;QAE1C,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,oBAAoB;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,uEAAuE,CACxE,CAAC,GAAG,EAAuB,CAAC;QAE7B,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,eAAe;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,mFAAmF,CACpF,CAAC,GAAG,EAAoC,CAAC;QAE1C,OAAO,GAAG,CAAC,WAAW,CAAC;IACzB,CAAC;IAED,+BAA+B;IAC/B,kBAAkB;IAClB,+BAA+B;IAEvB,QAAQ,CAAC,EAAU;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAkC,CAAC;QAChH,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC;IAC5B,CAAC;IAEO,WAAW,CAAC,GAAc;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAsB,CAAC;QAEjH,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,QAA0B;YACxC,IAAI,EAAE,GAAG,CAAC,IAAkB;YAC5B,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5B,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YACtF,WAAW,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;YAC1C,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS;YACtC,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,cAAc,EAAE,GAAG,CAAC,gBAAgB,IAAI,SAAS;SAClD,CAAC;IACJ,CAAC;CACF;AA2BD,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,WAAW,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,UAAU,GAAG,WAAW,CAAC;AAClC,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IACtF,OAAO,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Memory Extractor
3
+ *
4
+ * 세션 메시지에서 의미 있는 메모리를 추출합니다.
5
+ * 카테고리: error_solution, code_pattern, decision, context, preference
6
+ */
7
+ import type { SessionMessage, ExtractionResult } from '../types/index.js';
8
+ /**
9
+ * 세션 메시지에서 메모리 추출
10
+ */
11
+ export declare function extractMemories(messages: SessionMessage[], projectPath: string): ExtractionResult;
12
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/extraction/extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EAGd,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AAyB3B;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,EAAE,MAAM,GAClB,gBAAgB,CAyDlB"}