memento-mcp-server 1.12.0-a → 1.12.0-a2

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,177 @@
1
+ /**
2
+ * 작업 내용을 기억으로 저장하는 스크립트
3
+ */
4
+
5
+ import Database from 'better-sqlite3';
6
+ import { DatabaseUtils } from '../src/utils/database.js';
7
+ import { initializeServices } from '../src/server/bootstrap.js';
8
+ import { executeTool } from '../src/tools/index.js';
9
+ import type { ToolContext } from '../src/tools/types.js';
10
+
11
+ /**
12
+ * ToolContext 생성 헬퍼 함수
13
+ */
14
+ function createToolContext(db: Database.Database, services: Awaited<ReturnType<typeof initializeServices>>): ToolContext {
15
+ return {
16
+ db,
17
+ services: {
18
+ hybridSearchEngine: services.hybridSearchEngine,
19
+ embeddingService: services.embeddingService,
20
+ searchEngine: services.searchEngine,
21
+ forgettingPolicyService: services.forgettingPolicyService,
22
+ performanceMonitor: services.performanceMonitor,
23
+ databaseOptimizer: services.databaseOptimizer,
24
+ errorLoggingService: services.errorLoggingService,
25
+ performanceAlertService: services.performanceAlertService,
26
+ consolidationScoreService: services.consolidationScoreService,
27
+ writeCoalescingManager: services.writeCoalescingManager
28
+ }
29
+ };
30
+ }
31
+
32
+ async function saveWorkMemory() {
33
+ console.log('💾 작업 내용을 기억으로 저장 중...\n');
34
+
35
+ let db: Database.Database | null = null;
36
+
37
+ try {
38
+ // 데이터베이스 초기화 (실제 DB 사용)
39
+ const dbPath = process.env.MEMENTO_DB_PATH || './data/memory.db';
40
+ db = new Database(dbPath);
41
+ DatabaseUtils.initializeDatabase(db);
42
+ console.log(`✅ 데이터베이스 초기화 완료 (${dbPath})\n`);
43
+
44
+ // 서비스 초기화
45
+ console.log('2️⃣ 서비스 초기화');
46
+ const services = await initializeServices(db);
47
+ const context = createToolContext(db, services);
48
+ console.log('✅ 서비스 초기화 완료\n');
49
+
50
+ // Episodic Memory: 작업 완료 기록
51
+ console.log('3️⃣ Episodic Memory 저장 (작업 완료 기록)');
52
+ const episodicResult = await executeTool('remember', {
53
+ content: `작업: 다중 임베딩 provider 검색 지원 기능 구현 완료
54
+ 날짜: 2025-11-16
55
+ 작업 범위: 작업 1.0~6.0 모두 완료
56
+
57
+ 주요 구현 내용:
58
+ - 다중 provider 감지 기능 구현 (detectAllStoredEmbeddingProviders)
59
+ - 병렬 다중 provider 검색 구현 (Promise.allSettled, 타임아웃 처리)
60
+ - 결과 통합 및 정규화 로직 (Min-Max 정규화, 중복 제거, 재랭킹)
61
+ - Provider 필터링 옵션 추가 (recall 도구에 provider_filter 파라미터)
62
+ - 마이그레이션 도구 구현 (migrate-embeddings-tool)
63
+ - 성능 벤치마크 및 회귀 테스트 작성
64
+
65
+ 주요 변경 파일:
66
+ - src/algorithms/hybrid-search-engine.ts (다중 provider 검색 로직)
67
+ - src/tools/recall-tool.ts (provider_filter 옵션)
68
+ - src/tools/migrate-embeddings-tool.ts (마이그레이션 도구)
69
+ - src/test/multi-provider-search-performance-benchmark.ts (성능 벤치마크)
70
+ - src/test/test-single-provider-regression.ts (회귀 테스트)
71
+
72
+ 테스트 결과: 모든 테스트 통과`,
73
+ type: 'episodic',
74
+ tags: ['completed', 'multi-provider-search', 'feature-implementation'],
75
+ importance: 0.9,
76
+ source: 'memento-development'
77
+ }, context);
78
+
79
+ if (episodicResult && episodicResult.content) {
80
+ console.log('✅ Episodic Memory 저장 완료\n');
81
+ } else {
82
+ console.log('⚠️ Episodic Memory 저장 실패\n');
83
+ }
84
+
85
+ // Semantic Memory: 재사용 가능한 지식
86
+ console.log('4️⃣ Semantic Memory 저장 (다중 Provider 검색 아키텍처)');
87
+ const semanticResult = await executeTool('remember', {
88
+ content: `다중 임베딩 provider 환경에서 검색 기능을 구현할 때의 핵심 설계 원칙:
89
+
90
+ 1. Provider 감지: detectAllStoredEmbeddingProviders()로 모든 provider 통계 조회
91
+ 2. 병렬 검색: Promise.allSettled()로 모든 provider 동시 검색, 실패해도 계속 진행
92
+ 3. 타임아웃 처리: 각 provider 2초 hard timeout, 전체 3초 maximum timeout
93
+ 4. 결과 정규화: Provider별 Min-Max 정규화로 점수 범위 통일 (0-1)
94
+ 5. 중복 제거: memory_id 기준으로 최고 점수만 유지
95
+ 6. 재랭킹: 정규화된 점수로 최종 결과 정렬
96
+
97
+ 핵심 구현:
98
+ - HybridSearchEngine.executeVecSearch(): 병렬 검색 및 결과 통합
99
+ - Min-Max 정규화: max_score === min_score edge case 처리 (모두 1.0으로 설정)
100
+ - Provider 필터링: provider_filter 옵션으로 특정 provider만 검색 가능
101
+
102
+ 성능 기준:
103
+ - 단일 provider: 평균 500ms 이하
104
+ - 다중 provider 병렬: 단일 provider의 1.5배 이하 권장
105
+
106
+ 관련 파일:
107
+ - src/algorithms/hybrid-search-engine.ts
108
+ - src/tools/recall-tool.ts
109
+ - src/tools/migrate-embeddings-tool.ts`,
110
+ type: 'semantic',
111
+ tags: ['best-practice', 'knowledge', 'architecture', 'multi-provider'],
112
+ importance: 0.8,
113
+ source: 'memento-development'
114
+ }, context);
115
+
116
+ if (semanticResult && semanticResult.content) {
117
+ console.log('✅ Semantic Memory 저장 완료\n');
118
+ } else {
119
+ console.log('⚠️ Semantic Memory 저장 실패\n');
120
+ }
121
+
122
+ // Procedural Memory: 마이그레이션 도구 사용법
123
+ console.log('5️⃣ Procedural Memory 저장 (마이그레이션 도구 사용 절차)');
124
+ const proceduralResult = await executeTool('remember', {
125
+ content: JSON.stringify({
126
+ task_goal: '기존 기억을 새로운 임베딩 provider로 재임베딩',
127
+ steps: [
128
+ 'migrate_embeddings 도구 호출',
129
+ 'source_provider와 target_provider 지정 (source는 선택적)',
130
+ 'batch_size 설정 (기본 100개)',
131
+ 'dry_run 모드로 먼저 테스트 (dry_run: true)',
132
+ '실제 마이그레이션 실행 (dry_run: false)',
133
+ '결과 확인 (total_count, success_count, failed_count)'
134
+ ],
135
+ reflection_notes: {
136
+ best_practices: [
137
+ 'dry_run으로 먼저 테스트하여 영향 범위 확인',
138
+ 'source_provider와 target_provider가 동일하면 에러 발생',
139
+ '기존 임베딩은 유지되고 새 provider 임베딩이 추가됨',
140
+ '실패한 메모리는 스킵되고 전체 작업은 계속 진행'
141
+ ],
142
+ common_errors: [
143
+ 'source_provider === target_provider: 재임베딩 불필요 에러',
144
+ '임베딩 생성 실패 시 해당 메모리만 스킵'
145
+ ]
146
+ }
147
+ }),
148
+ type: 'procedural',
149
+ tags: ['procedure', 'migration', 'embedding'],
150
+ importance: 0.7,
151
+ source: 'memento-development'
152
+ }, context);
153
+
154
+ if (proceduralResult && proceduralResult.content) {
155
+ console.log('✅ Procedural Memory 저장 완료\n');
156
+ } else {
157
+ console.log('⚠️ Procedural Memory 저장 실패\n');
158
+ }
159
+
160
+ console.log('✅ 모든 기억 저장 완료!\n');
161
+
162
+ } catch (error) {
163
+ console.error('❌ 기억 저장 실패:', error);
164
+ process.exit(1);
165
+ } finally {
166
+ if (db) {
167
+ db.close();
168
+ }
169
+ }
170
+ }
171
+
172
+ // 직접 실행 시
173
+ if (import.meta.url === `file://${process.argv[1]}` || process.argv[1]?.includes('save-work-memory')) {
174
+ saveWorkMemory();
175
+ }
176
+
177
+ export { saveWorkMemory };