memento-mcp-server 1.7.5 → 1.8.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.
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Memory Neighbor Service
3
+ * 벡터 유사도를 기반으로 특정 기억의 이웃 기억을 조회하는 서비스
4
+ */
5
+ import Database from 'better-sqlite3';
6
+ import { DatabaseUtils } from '../utils/database.js';
7
+ /**
8
+ * 메모리를 찾을 수 없을 때 발생하는 에러
9
+ */
10
+ export class MemoryNotFoundError extends Error {
11
+ constructor(memoryId) {
12
+ super(`Memory with ID '${memoryId}' not found`);
13
+ this.name = 'MemoryNotFoundError';
14
+ }
15
+ }
16
+ /**
17
+ * Memory Neighbor Service
18
+ * 벡터 유사도를 기반으로 기억의 이웃을 찾는 서비스
19
+ */
20
+ export class MemoryNeighborService {
21
+ vectorSearchEngine;
22
+ embeddingService;
23
+ db = null;
24
+ /**
25
+ * 생성자
26
+ * @param vectorSearchEngine - 벡터 검색 엔진 인스턴스
27
+ * @param embeddingService - 메모리 임베딩 서비스 인스턴스
28
+ */
29
+ constructor(vectorSearchEngine, embeddingService) {
30
+ if (!vectorSearchEngine) {
31
+ throw new Error('VectorSearchEngine is required');
32
+ }
33
+ if (!embeddingService) {
34
+ throw new Error('MemoryEmbeddingService is required');
35
+ }
36
+ this.vectorSearchEngine = vectorSearchEngine;
37
+ this.embeddingService = embeddingService;
38
+ }
39
+ /**
40
+ * 데이터베이스 설정
41
+ * VectorSearchEngine에도 데이터베이스를 설정합니다.
42
+ * @param db - 데이터베이스 인스턴스
43
+ */
44
+ setDatabase(db) {
45
+ if (!db) {
46
+ throw new Error('Database instance is required');
47
+ }
48
+ this.db = db;
49
+ // VectorSearchEngine에도 데이터베이스 설정 (메서드가 있는 경우)
50
+ if (this.vectorSearchEngine && typeof this.vectorSearchEngine.setDatabase === 'function') {
51
+ this.vectorSearchEngine.setDatabase(db);
52
+ }
53
+ }
54
+ /**
55
+ * 특정 기억의 이웃 기억을 조회
56
+ * @param memoryId - 조회할 기억의 ID
57
+ * @param options - 조회 옵션 (limit, similarity_threshold)
58
+ * @returns 이웃 기억 조회 결과
59
+ * @throws {MemoryNotFoundError} 메모리를 찾을 수 없는 경우
60
+ * @throws {Error} 데이터베이스 오류, 벡터 검색 오류 등
61
+ */
62
+ async getNeighbors(memoryId, options = {}) {
63
+ const startTime = Date.now();
64
+ try {
65
+ // 기본값 설정
66
+ const limit = options.limit ?? 5;
67
+ const similarityThreshold = options.similarity_threshold ?? 0.8;
68
+ // 데이터베이스 확인
69
+ if (!this.db) {
70
+ throw new Error('Database is not set. Call setDatabase() first.');
71
+ }
72
+ // 1.4 - 메모리 ID 검증 로직
73
+ let memory;
74
+ try {
75
+ memory = await DatabaseUtils.get(this.db, 'SELECT id FROM memory_item WHERE id = ?', [memoryId]);
76
+ }
77
+ catch (error) {
78
+ console.error(`❌ 메모리 조회 실패 (${memoryId}):`, error);
79
+ throw new Error(`Failed to query memory: ${error instanceof Error ? error.message : 'Unknown error'}`);
80
+ }
81
+ if (!memory) {
82
+ throw new MemoryNotFoundError(memoryId);
83
+ }
84
+ // 1.5 - 임베딩 조회 로직
85
+ // memory_embedding 테이블에서 해당 기억의 임베딩 조회
86
+ // 가장 최근에 생성된 임베딩을 우선 사용 (여러 제공자가 있을 수 있음)
87
+ let embeddingRecord;
88
+ try {
89
+ embeddingRecord = await DatabaseUtils.get(this.db, `SELECT
90
+ embedding,
91
+ embedding_provider,
92
+ dimensions,
93
+ dim
94
+ FROM memory_embedding
95
+ WHERE memory_id = ?
96
+ ORDER BY created_at DESC
97
+ LIMIT 1`, [memoryId]);
98
+ }
99
+ catch (error) {
100
+ console.error(`❌ 임베딩 조회 실패 (${memoryId}):`, error);
101
+ throw new Error(`Failed to query embedding: ${error instanceof Error ? error.message : 'Unknown error'}`);
102
+ }
103
+ // 1.6 - 임베딩이 없는 경우 처리
104
+ if (!embeddingRecord || !embeddingRecord.embedding) {
105
+ // 임베딩이 없으면 빈 결과 반환 (경고 없이)
106
+ const queryTime = Date.now() - startTime;
107
+ return {
108
+ memory_id: memoryId,
109
+ neighbors: [],
110
+ total_count: 0,
111
+ query_time: queryTime
112
+ };
113
+ }
114
+ // JSON 문자열로 저장된 임베딩을 배열로 파싱
115
+ let queryVector;
116
+ try {
117
+ queryVector = typeof embeddingRecord.embedding === 'string'
118
+ ? JSON.parse(embeddingRecord.embedding)
119
+ : embeddingRecord.embedding;
120
+ if (!Array.isArray(queryVector) || queryVector.length === 0) {
121
+ // 유효하지 않은 임베딩이면 빈 결과 반환
122
+ const queryTime = Date.now() - startTime;
123
+ return {
124
+ memory_id: memoryId,
125
+ neighbors: [],
126
+ total_count: 0,
127
+ query_time: queryTime
128
+ };
129
+ }
130
+ }
131
+ catch (error) {
132
+ // 파싱 실패 시 빈 결과 반환 (경고 없이)
133
+ const queryTime = Date.now() - startTime;
134
+ return {
135
+ memory_id: memoryId,
136
+ neighbors: [],
137
+ total_count: 0,
138
+ query_time: queryTime
139
+ };
140
+ }
141
+ const embeddingProvider = embeddingRecord.embedding_provider || 'tfidf';
142
+ // 1.7 - VectorSearchEngine.search 메서드를 활용하여 유사 기억 검색
143
+ // VectorSearchEngine에 데이터베이스가 설정되어 있는지 확인
144
+ // (initialize 메서드가 있는 경우 호출)
145
+ try {
146
+ if (typeof this.vectorSearchEngine.initialize === 'function') {
147
+ this.vectorSearchEngine.initialize(this.db);
148
+ }
149
+ }
150
+ catch (error) {
151
+ console.error(`❌ VectorSearchEngine 초기화 실패:`, error);
152
+ throw new Error(`Failed to initialize VectorSearchEngine: ${error instanceof Error ? error.message : 'Unknown error'}`);
153
+ }
154
+ // 벡터 검색 실행
155
+ // limit을 더 많이 가져와서 필터링 후 최종 limit 적용
156
+ const searchLimit = limit + 1; // 자기 자신 제외를 위해 +1
157
+ let searchResults;
158
+ try {
159
+ searchResults = await this.vectorSearchEngine.search(queryVector, {
160
+ limit: searchLimit,
161
+ threshold: 0.0, // 임계값은 나중에 필터링에서 적용
162
+ includeContent: true,
163
+ includeMetadata: true
164
+ }, embeddingProvider);
165
+ }
166
+ catch (error) {
167
+ console.error(`❌ 벡터 검색 실패 (${memoryId}):`, error);
168
+ throw new Error(`Failed to search similar memories: ${error instanceof Error ? error.message : 'Unknown error'}`);
169
+ }
170
+ // 1.8 - 결과 필터링: 동일한 memory_id 제외, 유사도 임계값(threshold) 이상만 반환
171
+ const filteredResults = searchResults
172
+ .filter(result => {
173
+ // 동일한 기억 제외
174
+ if (result.memory_id === memoryId) {
175
+ return false;
176
+ }
177
+ // 유사도 임계값 이상만 반환
178
+ return result.similarity >= similarityThreshold;
179
+ })
180
+ .slice(0, limit); // 최종 limit 적용
181
+ // 1.9 - 응답 형식 구성: 이웃 기억 목록, 총 개수, 쿼리 실행 시간 포함
182
+ const neighbors = filteredResults.map(result => ({
183
+ id: result.memory_id,
184
+ content: result.content,
185
+ type: result.type,
186
+ similarity: result.similarity,
187
+ importance: result.importance,
188
+ created_at: result.created_at,
189
+ tags: result.tags
190
+ }));
191
+ const queryTime = Date.now() - startTime;
192
+ return {
193
+ memory_id: memoryId,
194
+ neighbors,
195
+ total_count: neighbors.length,
196
+ query_time: queryTime
197
+ };
198
+ }
199
+ catch (error) {
200
+ // 1.10 - 에러 처리: 예외 상황에 대한 적절한 에러 메시지 및 로깅
201
+ const queryTime = Date.now() - startTime;
202
+ // MemoryNotFoundError는 그대로 전파
203
+ if (error instanceof MemoryNotFoundError) {
204
+ throw error;
205
+ }
206
+ // 기타 에러는 로깅 후 재던지기
207
+ console.error(`❌ 이웃 기억 조회 실패 (${memoryId}):`, error);
208
+ console.error(` 쿼리 시간: ${queryTime}ms`);
209
+ console.error(` 에러 스택:`, error instanceof Error ? error.stack : 'N/A');
210
+ // 사용자 친화적인 에러 메시지로 변환
211
+ if (error instanceof Error) {
212
+ throw new Error(`Failed to get memory neighbors: ${error.message}`);
213
+ }
214
+ throw new Error(`Failed to get memory neighbors: Unknown error`);
215
+ }
216
+ }
217
+ /**
218
+ * 새로 저장된 기억에 대한 인접 기억 목록 갱신
219
+ * PRD 3.1-3.3 요구사항: 새 기억 저장 시 기존 기억들과의 유사도 계산 및 인접 기억 식별
220
+ *
221
+ * @param newMemoryId - 새로 저장된 기억의 ID
222
+ * @param similarityThreshold - 유사도 임계값 (기본값: 0.8)
223
+ * @returns 인접 기억 ID 목록 (유사도가 임계값 이상인 기억들)
224
+ */
225
+ async updateNeighborsForNewMemory(newMemoryId, similarityThreshold = 0.8) {
226
+ if (!this.db) {
227
+ console.warn('⚠️ 데이터베이스가 설정되지 않아 인접 기억 갱신을 건너뜁니다.');
228
+ return [];
229
+ }
230
+ try {
231
+ // 새 기억의 임베딩 조회
232
+ const embeddingRecord = await DatabaseUtils.get(this.db, `SELECT
233
+ embedding,
234
+ embedding_provider,
235
+ dimensions,
236
+ dim
237
+ FROM memory_embedding
238
+ WHERE memory_id = ?
239
+ ORDER BY created_at DESC
240
+ LIMIT 1`, [newMemoryId]);
241
+ // 임베딩이 없으면 빈 배열 반환 (경고 없이)
242
+ if (!embeddingRecord || !embeddingRecord.embedding) {
243
+ return [];
244
+ }
245
+ // JSON 문자열로 저장된 임베딩을 배열로 파싱
246
+ let queryVector;
247
+ try {
248
+ queryVector = typeof embeddingRecord.embedding === 'string'
249
+ ? JSON.parse(embeddingRecord.embedding)
250
+ : embeddingRecord.embedding;
251
+ if (!Array.isArray(queryVector) || queryVector.length === 0) {
252
+ return [];
253
+ }
254
+ }
255
+ catch (error) {
256
+ // 파싱 실패 시 빈 배열 반환
257
+ return [];
258
+ }
259
+ const embeddingProvider = embeddingRecord.embedding_provider || 'tfidf';
260
+ // VectorSearchEngine 초기화
261
+ if (typeof this.vectorSearchEngine.initialize === 'function') {
262
+ this.vectorSearchEngine.initialize(this.db);
263
+ }
264
+ // 기존 모든 기억과의 유사도 계산
265
+ // 충분히 큰 limit을 설정하여 모든 기억을 검색
266
+ const searchResults = await this.vectorSearchEngine.search(queryVector, {
267
+ limit: 10000, // 충분히 큰 값 (실제로는 모든 기억 검색)
268
+ threshold: 0.0, // 임계값은 나중에 필터링에서 적용
269
+ includeContent: false, // 성능 최적화: 내용 불필요
270
+ includeMetadata: false
271
+ }, embeddingProvider);
272
+ // 유사도가 임계값 이상인 기억들을 식별 (자기 자신 제외)
273
+ const neighborIds = searchResults
274
+ .filter(result => {
275
+ // 동일한 기억 제외
276
+ if (result.memory_id === newMemoryId) {
277
+ return false;
278
+ }
279
+ // 유사도 임계값 이상만 반환
280
+ return result.similarity >= similarityThreshold;
281
+ })
282
+ .map(result => result.memory_id);
283
+ // PRD 3.4: 인접 기억 정보를 데이터베이스에 저장 (선택적)
284
+ // 이번 단계에서는 저장하지 않고 계산만 수행
285
+ // 향후 성능 최적화가 필요한 경우 memory_neighbors 테이블 추가 고려
286
+ return neighborIds;
287
+ }
288
+ catch (error) {
289
+ // 에러 발생 시 로깅 후 빈 배열 반환 (메모리 저장은 성공했으므로)
290
+ console.error(`❌ 인접 기억 갱신 실패 (${newMemoryId}):`, error);
291
+ return [];
292
+ }
293
+ }
294
+ }
295
+ //# sourceMappingURL=memory-neighbor-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-neighbor-service.js","sourceRoot":"","sources":["../../src/services/memory-neighbor-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAiCrD;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,QAAgB;QAC1B,KAAK,CAAC,mBAAmB,QAAQ,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IACf,kBAAkB,CAAqB;IACvC,gBAAgB,CAAyB;IAClD,EAAE,GAA6B,IAAI,CAAC;IAE5C;;;;OAIG;IACH,YACE,kBAAsC,EACtC,gBAAwC;QAExC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,EAAqB;QAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,8CAA8C;QAC9C,IAAI,IAAI,CAAC,kBAAkB,IAAI,OAAQ,IAAI,CAAC,kBAA0B,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YACjG,IAAI,CAAC,kBAA0B,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAChB,QAAgB,EAChB,UAAiC,EAAE;QAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,SAAS;YACT,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YACjC,MAAM,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,IAAI,GAAG,CAAC;YAEhE,YAAY;YACZ,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,CAAC;YAED,qBAAqB;YACrB,IAAI,MAAM,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAC9B,IAAI,CAAC,EAAE,EACP,yCAAyC,EACzC,CAAC,QAAQ,CAAC,CACX,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,QAAQ,IAAI,EAAE,KAAK,CAAC,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;YACzG,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;YAED,kBAAkB;YAClB,uCAAuC;YACvC,0CAA0C;YAC1C,IAAI,eAAe,CAAC;YACpB,IAAI,CAAC;gBACH,eAAe,GAAG,MAAM,aAAa,CAAC,GAAG,CACvC,IAAI,CAAC,EAAE,EACP;;;;;;;;kBAQQ,EACR,CAAC,QAAQ,CAAC,CACX,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,QAAQ,IAAI,EAAE,KAAK,CAAC,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;YAC5G,CAAC;YAED,sBAAsB;YACtB,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;gBACnD,2BAA2B;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACzC,OAAO;oBACL,SAAS,EAAE,QAAQ;oBACnB,SAAS,EAAE,EAAE;oBACb,WAAW,EAAE,CAAC;oBACd,UAAU,EAAE,SAAS;iBACtB,CAAC;YACJ,CAAC;YAED,4BAA4B;YAC5B,IAAI,WAAqB,CAAC;YAC1B,IAAI,CAAC;gBACH,WAAW,GAAG,OAAO,eAAe,CAAC,SAAS,KAAK,QAAQ;oBACzD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC;oBACvC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC;gBAE9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5D,wBAAwB;oBACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBACzC,OAAO;wBACL,SAAS,EAAE,QAAQ;wBACnB,SAAS,EAAE,EAAE;wBACb,WAAW,EAAE,CAAC;wBACd,UAAU,EAAE,SAAS;qBACtB,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,0BAA0B;gBAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACzC,OAAO;oBACL,SAAS,EAAE,QAAQ;oBACnB,SAAS,EAAE,EAAE;oBACb,WAAW,EAAE,CAAC;oBACd,UAAU,EAAE,SAAS;iBACtB,CAAC;YACJ,CAAC;YAED,MAAM,iBAAiB,GAAG,eAAe,CAAC,kBAAkB,IAAI,OAAO,CAAC;YAExE,qDAAqD;YACrD,0CAA0C;YAC1C,6BAA6B;YAC7B,IAAI,CAAC;gBACH,IAAI,OAAQ,IAAI,CAAC,kBAA0B,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;oBACrE,IAAI,CAAC,kBAA0B,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,4CAA4C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;YAC1H,CAAC;YAED,WAAW;YACX,qCAAqC;YACrC,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,kBAAkB;YACjD,IAAI,aAAa,CAAC;YAClB,IAAI,CAAC;gBACH,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAClD,WAAW,EACX;oBACE,KAAK,EAAE,WAAW;oBAClB,SAAS,EAAE,GAAG,EAAE,oBAAoB;oBACpC,cAAc,EAAE,IAAI;oBACpB,eAAe,EAAE,IAAI;iBACtB,EACD,iBAAiB,CAClB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,eAAe,QAAQ,IAAI,EAAE,KAAK,CAAC,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;YACpH,CAAC;YAED,4DAA4D;YAC5D,MAAM,eAAe,GAAG,aAAa;iBAClC,MAAM,CAAC,MAAM,CAAC,EAAE;gBACf,YAAY;gBACZ,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,iBAAiB;gBACjB,OAAO,MAAM,CAAC,UAAU,IAAI,mBAAmB,CAAC;YAClD,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc;YAElC,8CAA8C;YAC9C,MAAM,SAAS,GAAqB,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACjE,EAAE,EAAE,MAAM,CAAC,SAAS;gBACpB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC,CAAC;YAEJ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEzC,OAAO;gBACL,SAAS,EAAE,QAAQ;gBACnB,SAAS;gBACT,WAAW,EAAE,SAAS,CAAC,MAAM;gBAC7B,UAAU,EAAE,SAAS;aACtB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0CAA0C;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEzC,8BAA8B;YAC9B,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,mBAAmB;YACnB,OAAO,CAAC,KAAK,CAAC,kBAAkB,QAAQ,IAAI,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,aAAa,SAAS,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAEzE,sBAAsB;YACtB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,2BAA2B,CAC/B,WAAmB,EACnB,sBAA8B,GAAG;QAEjC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACpD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,eAAe;YACf,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,GAAG,CAC7C,IAAI,CAAC,EAAE,EACP;;;;;;;;gBAQQ,EACR,CAAC,WAAW,CAAC,CACd,CAAC;YAEF,2BAA2B;YAC3B,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;gBACnD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,4BAA4B;YAC5B,IAAI,WAAqB,CAAC;YAC1B,IAAI,CAAC;gBACH,WAAW,GAAG,OAAO,eAAe,CAAC,SAAS,KAAK,QAAQ;oBACzD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC;oBACvC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC;gBAE9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5D,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,kBAAkB;gBAClB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,iBAAiB,GAAG,eAAe,CAAC,kBAAkB,IAAI,OAAO,CAAC;YAExE,yBAAyB;YACzB,IAAI,OAAQ,IAAI,CAAC,kBAA0B,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrE,IAAI,CAAC,kBAA0B,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,oBAAoB;YACpB,8BAA8B;YAC9B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CACxD,WAAW,EACX;gBACE,KAAK,EAAE,KAAK,EAAE,0BAA0B;gBACxC,SAAS,EAAE,GAAG,EAAE,oBAAoB;gBACpC,cAAc,EAAE,KAAK,EAAE,iBAAiB;gBACxC,eAAe,EAAE,KAAK;aACvB,EACD,iBAAiB,CAClB,CAAC;YAEF,kCAAkC;YAClC,MAAM,WAAW,GAAG,aAAa;iBAC9B,MAAM,CAAC,MAAM,CAAC,EAAE;gBACf,YAAY;gBACZ,IAAI,MAAM,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;oBACrC,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,iBAAiB;gBACjB,OAAO,MAAM,CAAC,UAAU,IAAI,mBAAmB,CAAC;YAClD,CAAC,CAAC;iBACD,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEnC,sCAAsC;YACtC,0BAA0B;YAC1B,+CAA+C;YAE/C,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wCAAwC;YACxC,OAAO,CAAC,KAAK,CAAC,kBAAkB,WAAW,IAAI,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Get Memory Neighbors Tool - 이웃 기억 조회 도구
3
+ * 벡터 유사도를 기반으로 특정 기억의 이웃 기억을 조회
4
+ */
5
+ import { z } from 'zod';
6
+ import { BaseTool } from './base-tool.js';
7
+ import type { ToolContext, ToolResult } from './types.js';
8
+ declare const GetMemoryNeighborsSchema: z.ZodObject<{
9
+ memory_id: z.ZodString;
10
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
11
+ similarity_threshold: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ limit: number;
14
+ memory_id: string;
15
+ similarity_threshold: number;
16
+ }, {
17
+ memory_id: string;
18
+ limit?: number | undefined;
19
+ similarity_threshold?: number | undefined;
20
+ }>;
21
+ export { GetMemoryNeighborsSchema };
22
+ export declare class GetMemoryNeighborsTool extends BaseTool {
23
+ constructor();
24
+ handle(params: any, context: ToolContext): Promise<ToolResult>;
25
+ }
26
+ //# sourceMappingURL=get-memory-neighbors-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-memory-neighbors-tool.d.ts","sourceRoot":"","sources":["../../src/tools/get-memory-neighbors-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO1D,QAAA,MAAM,wBAAwB;;;;;;;;;;;;EAI5B,CAAC;AAEH,OAAO,EAAE,wBAAwB,EAAE,CAAC;AAEpC,qBAAa,sBAAuB,SAAQ,QAAQ;;IAgC5C,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAwFrE"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Get Memory Neighbors Tool - 이웃 기억 조회 도구
3
+ * 벡터 유사도를 기반으로 특정 기억의 이웃 기억을 조회
4
+ */
5
+ import { z } from 'zod';
6
+ import { BaseTool } from './base-tool.js';
7
+ import { CommonSchemas } from './types.js';
8
+ import { MemoryNeighborService } from '../services/memory-neighbor-service.js';
9
+ import { getVectorSearchEngine } from '../algorithms/vector-search-engine.js';
10
+ import { MemoryEmbeddingService } from '../services/memory-embedding-service.js';
11
+ import { MemoryNotFoundError } from '../services/memory-neighbor-service.js';
12
+ const GetMemoryNeighborsSchema = z.object({
13
+ memory_id: CommonSchemas.MemoryId,
14
+ limit: z.number().min(1).max(50).optional().default(5),
15
+ similarity_threshold: z.number().min(0).max(1).optional().default(0.8),
16
+ });
17
+ export { GetMemoryNeighborsSchema };
18
+ export class GetMemoryNeighborsTool extends BaseTool {
19
+ constructor() {
20
+ super('get_memory_neighbors', '특정 기억과 유사한 이웃 기억을 조회합니다', {
21
+ type: 'object',
22
+ properties: {
23
+ memory_id: {
24
+ type: 'string',
25
+ description: '조회할 기억의 ID'
26
+ },
27
+ limit: {
28
+ type: 'number',
29
+ minimum: 1,
30
+ maximum: 50,
31
+ description: '반환할 이웃 기억의 최대 개수',
32
+ default: 5
33
+ },
34
+ similarity_threshold: {
35
+ type: 'number',
36
+ minimum: 0,
37
+ maximum: 1,
38
+ description: '유사도 임계값 (0.0 ~ 1.0)',
39
+ default: 0.8
40
+ }
41
+ },
42
+ required: ['memory_id']
43
+ });
44
+ }
45
+ async handle(params, context) {
46
+ this.logInfo('Get Memory Neighbors 도구 호출됨', { params });
47
+ try {
48
+ // 파라미터 검증 및 파싱
49
+ const { memory_id, limit, similarity_threshold } = GetMemoryNeighborsSchema.parse(params);
50
+ // 데이터베이스 연결 확인
51
+ this.validateDatabase(context);
52
+ // MemoryNeighborService 인스턴스 생성
53
+ let vectorSearchEngine;
54
+ try {
55
+ vectorSearchEngine = getVectorSearchEngine();
56
+ }
57
+ catch (error) {
58
+ this.logError(error, 'VectorSearchEngine 초기화 실패');
59
+ throw new Error(`벡터 검색 엔진 초기화 실패: ${error instanceof Error ? error.message : 'Unknown error'}`);
60
+ }
61
+ const embeddingService = context.services.embeddingService || new MemoryEmbeddingService();
62
+ let neighborService;
63
+ try {
64
+ neighborService = new MemoryNeighborService(vectorSearchEngine, embeddingService);
65
+ }
66
+ catch (error) {
67
+ this.logError(error, 'MemoryNeighborService 생성 실패');
68
+ throw new Error(`이웃 기억 서비스 생성 실패: ${error instanceof Error ? error.message : 'Unknown error'}`);
69
+ }
70
+ // 데이터베이스 설정
71
+ try {
72
+ neighborService.setDatabase(context.db);
73
+ }
74
+ catch (error) {
75
+ this.logError(error, '데이터베이스 설정 실패');
76
+ throw new Error(`데이터베이스 설정 실패: ${error instanceof Error ? error.message : 'Unknown error'}`);
77
+ }
78
+ // 이웃 기억 조회
79
+ const result = await neighborService.getNeighbors(memory_id, {
80
+ limit,
81
+ similarity_threshold
82
+ });
83
+ this.logInfo('이웃 기억 조회 성공', {
84
+ memory_id: result.memory_id,
85
+ total_count: result.total_count,
86
+ query_time: result.query_time
87
+ });
88
+ return this.createSuccessResult({
89
+ memory_id: result.memory_id,
90
+ neighbors: result.neighbors,
91
+ total_count: result.total_count,
92
+ query_time: result.query_time
93
+ });
94
+ }
95
+ catch (error) {
96
+ this.logError(error, 'Get Memory Neighbors 도구 실행 실패', { params });
97
+ // MemoryNotFoundError는 그대로 전파 (명확한 에러 메시지)
98
+ if (error instanceof MemoryNotFoundError) {
99
+ throw new Error(`메모리를 찾을 수 없습니다: ${error.message}`);
100
+ }
101
+ // Zod 스키마 검증 에러 처리
102
+ if (error instanceof z.ZodError) {
103
+ const errorMessages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');
104
+ throw new Error(`입력 검증 실패: ${errorMessages}`);
105
+ }
106
+ // 사용자 친화적인 에러 메시지 반환
107
+ if (error instanceof Error) {
108
+ if (error.message.includes('validation') || error.message.includes('검증')) {
109
+ throw new Error(`입력 검증 실패: ${error.message}`);
110
+ }
111
+ else if (error.message.includes('database') || error.message.includes('데이터베이스')) {
112
+ throw new Error(`데이터베이스 오류: ${error.message}`);
113
+ }
114
+ else if (error.message.includes('search') || error.message.includes('검색')) {
115
+ throw new Error(`검색 오류: ${error.message}`);
116
+ }
117
+ else if (error.message.includes('not found') || error.message.includes('찾을 수 없습니다')) {
118
+ throw error; // 이미 처리된 에러는 그대로 전파
119
+ }
120
+ }
121
+ throw new Error(`이웃 기억 조회 실패: ${error instanceof Error ? error.message : 'Unknown error'}`);
122
+ }
123
+ }
124
+ }
125
+ //# sourceMappingURL=get-memory-neighbors-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-memory-neighbors-tool.js","sourceRoot":"","sources":["../../src/tools/get-memory-neighbors-tool.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import { ForgetTool } from './forget-tool.js';
9
9
  import { PinTool } from './pin-tool.js';
10
10
  import { UnpinTool } from './unpin-tool.js';
11
11
  import { MemoryInjectionPrompt } from './memory-injection-prompt.js';
12
+ import { GetMemoryNeighborsTool } from './get-memory-neighbors-tool.js';
12
13
  /**
13
14
  * MCP 클라이언트용 도구 레지스트리 생성 및 등록
14
15
  */
@@ -29,5 +30,5 @@ export declare function getAllTools(): import("./types.js").ToolDefinition[];
29
30
  * 도구 실행
30
31
  */
31
32
  export declare function executeTool(name: string, params: any, context: any): Promise<import("./types.js").ToolResult>;
32
- export { RememberTool, RecallTool, ForgetTool, PinTool, UnpinTool, MemoryInjectionPrompt, };
33
+ export { RememberTool, RecallTool, ForgetTool, PinTool, UnpinTool, MemoryInjectionPrompt, GetMemoryNeighborsTool, };
33
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAcrE;;GAEG;AACH,eAAO,MAAM,YAAY,cAAqB,CAAC;AAK/C;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,mDAEnC;AAED;;GAEG;AACH,wBAAgB,WAAW,0CAE1B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,4CAExE;AAGD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,GACtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAexE;;GAEG;AACH,eAAO,MAAM,YAAY,cAAqB,CAAC;AAK/C;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,mDAEnC;AAED;;GAEG;AACH,wBAAgB,WAAW,0CAE1B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,4CAExE;AAGD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,sBAAsB,GACvB,CAAC"}
@@ -9,8 +9,9 @@ import { ForgetTool } from './forget-tool.js';
9
9
  import { PinTool } from './pin-tool.js';
10
10
  import { UnpinTool } from './unpin-tool.js';
11
11
  import { MemoryInjectionPrompt } from './memory-injection-prompt.js';
12
+ import { GetMemoryNeighborsTool } from './get-memory-neighbors-tool.js';
12
13
  /**
13
- * 핵심 도구 인스턴스 생성 (6개)
14
+ * 핵심 도구 인스턴스 생성 (7개)
14
15
  */
15
16
  const coreTools = [
16
17
  new RememberTool(),
@@ -19,6 +20,7 @@ const coreTools = [
19
20
  new PinTool(),
20
21
  new UnpinTool(),
21
22
  new MemoryInjectionPrompt(),
23
+ new GetMemoryNeighborsTool(),
22
24
  ];
23
25
  /**
24
26
  * MCP 클라이언트용 도구 레지스트리 생성 및 등록
@@ -51,5 +53,5 @@ export async function executeTool(name, params, context) {
51
53
  return await toolRegistry.execute(name, params, context);
52
54
  }
53
55
  // 핵심 도구들만 export
54
- export { RememberTool, RecallTool, ForgetTool, PinTool, UnpinTool, MemoryInjectionPrompt, };
56
+ export { RememberTool, RecallTool, ForgetTool, PinTool, UnpinTool, MemoryInjectionPrompt, GetMemoryNeighborsTool, };
55
57
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;GAEG;AACH,MAAM,SAAS,GAAG;IAChB,IAAI,YAAY,EAAE;IAClB,IAAI,UAAU,EAAE;IAChB,IAAI,UAAU,EAAE;IAChB,IAAI,OAAO,EAAE;IACb,IAAI,SAAS,EAAE;IACf,IAAI,qBAAqB,EAAE;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AAE/C,aAAa;AACb,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAW,EAAE,OAAY;IACvE,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,iBAAiB;AACjB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,GACtB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE;;GAEG;AACH,MAAM,SAAS,GAAG;IAChB,IAAI,YAAY,EAAE;IAClB,IAAI,UAAU,EAAE;IAChB,IAAI,UAAU,EAAE;IAChB,IAAI,OAAO,EAAE;IACb,IAAI,SAAS,EAAE;IACf,IAAI,qBAAqB,EAAE;IAC3B,IAAI,sBAAsB,EAAE;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AAE/C,aAAa;AACb,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAW,EAAE,OAAY;IACvE,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,iBAAiB;AACjB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,sBAAsB,GACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"remember-tool.d.ts","sourceRoot":"","sources":["../../src/tools/remember-tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAa1D,qBAAa,YAAa,SAAQ,QAAQ;;IAwClC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAoDrE"}
1
+ {"version":3,"file":"remember-tool.d.ts","sourceRoot":"","sources":["../../src/tools/remember-tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAgB1D,qBAAa,YAAa,SAAQ,QAAQ;;IAwClC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAmIrE"}