memento-mcp-server 1.7.4 → 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.
- package/INSTALL.md +29 -1
- package/README.md +2 -0
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +66 -1
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +86 -1
- package/dist/server/index.js.map +1 -1
- package/dist/services/cache-service.d.ts.map +1 -1
- package/dist/services/cache-service.js +5 -2
- package/dist/services/cache-service.js.map +1 -1
- package/dist/services/memory-neighbor-service.d.ts +81 -0
- package/dist/services/memory-neighbor-service.d.ts.map +1 -0
- package/dist/services/memory-neighbor-service.js +295 -0
- package/dist/services/memory-neighbor-service.js.map +1 -0
- package/dist/tools/get-memory-neighbors-tool.d.ts +26 -0
- package/dist/tools/get-memory-neighbors-tool.d.ts.map +1 -0
- package/dist/tools/get-memory-neighbors-tool.js +125 -0
- package/dist/tools/get-memory-neighbors-tool.js.map +1 -0
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/remember-tool.d.ts.map +1 -1
- package/dist/tools/remember-tool.js +89 -12
- package/dist/tools/remember-tool.js.map +1 -1
- package/package.json +2 -1
- package/scripts/auto-setup.js +73 -0
|
@@ -5,6 +5,9 @@ import { z } from 'zod';
|
|
|
5
5
|
import { BaseTool } from './base-tool.js';
|
|
6
6
|
import { CommonSchemas } from './types.js';
|
|
7
7
|
import { DatabaseUtils } from '../utils/database.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';
|
|
8
11
|
const RememberSchema = z.object({
|
|
9
12
|
content: CommonSchemas.Content,
|
|
10
13
|
type: CommonSchemas.MemoryType.default('episodic'),
|
|
@@ -63,20 +66,94 @@ export class RememberTool extends BaseTool {
|
|
|
63
66
|
`, [id, type, content, importance, privacy_scope,
|
|
64
67
|
tags ? JSON.stringify(tags) : null, source]);
|
|
65
68
|
});
|
|
66
|
-
// 메모리 저장 완료 후 임베딩 생성 (비동기, 실패해도 메모리 저장은 성공)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
// 메모리 저장 완료 후 임베딩 생성 및 인접 기억 갱신 (비동기, 실패해도 메모리 저장은 성공)
|
|
70
|
+
// 데이터베이스 참조를 미리 저장하여 비동기 콜백에서 안전하게 사용
|
|
71
|
+
const dbRef = context.db;
|
|
72
|
+
const embeddingServiceRef = context.services.embeddingService;
|
|
73
|
+
if (embeddingServiceRef?.isAvailable() && dbRef) {
|
|
74
|
+
// 비동기 작업을 별도로 실행 (fire-and-forget 패턴)
|
|
75
|
+
// 메모리 저장 응답은 즉시 반환하고, 임베딩/인접 기억 갱신은 백그라운드에서 처리
|
|
76
|
+
(async () => {
|
|
77
|
+
try {
|
|
78
|
+
// 트랜잭션이 완전히 커밋되도록 짧은 지연
|
|
79
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
80
|
+
// 데이터베이스 연결이 여전히 유효한지 확인 (간단한 쿼리로 테스트)
|
|
81
|
+
// DatabaseUtils.get은 동기 함수이지만, 비동기 컨텍스트에서 안전하게 실행하기 위해 Promise로 감싸서 await
|
|
82
|
+
try {
|
|
83
|
+
await new Promise((resolve, reject) => {
|
|
84
|
+
try {
|
|
85
|
+
DatabaseUtils.get(dbRef, 'SELECT 1');
|
|
86
|
+
resolve();
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
reject(error);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
74
92
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
93
|
+
catch (dbError) {
|
|
94
|
+
this.logWarning('데이터베이스 연결이 유효하지 않아 임베딩 생성을 건너뜁니다', {
|
|
95
|
+
memory_id: id,
|
|
96
|
+
error: dbError instanceof Error ? dbError.message : String(dbError)
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// 임베딩 생성
|
|
101
|
+
const embeddingResult = await embeddingServiceRef.createAndStoreEmbedding(dbRef, id, content, type);
|
|
102
|
+
if (embeddingResult) {
|
|
103
|
+
// PRD 3.1-3.3: 인접 기억 갱신
|
|
104
|
+
try {
|
|
105
|
+
// 데이터베이스 연결 재확인
|
|
106
|
+
// DatabaseUtils.get은 동기 함수이지만, 비동기 컨텍스트에서 안전하게 실행하기 위해 Promise로 감싸서 await
|
|
107
|
+
try {
|
|
108
|
+
await new Promise((resolve, reject) => {
|
|
109
|
+
try {
|
|
110
|
+
DatabaseUtils.get(dbRef, 'SELECT 1');
|
|
111
|
+
resolve();
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
reject(error);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (dbError) {
|
|
119
|
+
this.logWarning('데이터베이스 연결이 유효하지 않아 인접 기억 갱신을 건너뜁니다', {
|
|
120
|
+
memory_id: id,
|
|
121
|
+
error: dbError instanceof Error ? dbError.message : String(dbError)
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const vectorSearchEngine = getVectorSearchEngine();
|
|
126
|
+
const neighborService = new MemoryNeighborService(vectorSearchEngine, embeddingServiceRef);
|
|
127
|
+
neighborService.setDatabase(dbRef);
|
|
128
|
+
// 인접 기억 갱신 (기본 유사도 임계값: 0.8)
|
|
129
|
+
const neighborIds = await neighborService.updateNeighborsForNewMemory(id, 0.8);
|
|
130
|
+
if (neighborIds.length > 0) {
|
|
131
|
+
this.logInfo('인접 기억 갱신 완료', {
|
|
132
|
+
memory_id: id,
|
|
133
|
+
neighbor_count: neighborIds.length
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
// 인접 기억 갱신 실패해도 메모리 저장은 성공했으므로 경고만 출력
|
|
139
|
+
this.logWarning(`인접 기억 갱신 실패 (${id})`, {
|
|
140
|
+
error: error instanceof Error ? error.message : String(error)
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
// 임베딩 생성 실패해도 메모리 저장은 성공했으므로 경고만 출력
|
|
147
|
+
this.logWarning(`임베딩 생성 실패 (${id})`, {
|
|
148
|
+
error: error instanceof Error ? error.message : String(error)
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
})().catch((error) => {
|
|
152
|
+
// 예상치 못한 에러 처리
|
|
153
|
+
this.logWarning(`백그라운드 작업 실패 (${id})`, {
|
|
154
|
+
error: error instanceof Error ? error.message : String(error)
|
|
78
155
|
});
|
|
79
|
-
}
|
|
156
|
+
});
|
|
80
157
|
}
|
|
81
158
|
return this.createSuccessResult({
|
|
82
159
|
memory_id: id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remember-tool.js","sourceRoot":"","sources":["../../src/tools/remember-tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"remember-tool.js","sourceRoot":"","sources":["../../src/tools/remember-tool.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memento-mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "AI Agent 기억 보조 MCP 서버 - 사람의 기억 구조를 모사한 스토리지+검색+요약+망각 메커니즘",
|
|
5
5
|
"main": "dist/server/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"test:docker": "node test-docker.js",
|
|
50
50
|
"setup": "node scripts/auto-setup.js",
|
|
51
51
|
"postinstall": "node scripts/auto-setup.js",
|
|
52
|
+
"rebuild-native": "npm rebuild better-sqlite3 sqlite-vec",
|
|
52
53
|
"prepublishOnly": "npm run build && npm run verify-bin",
|
|
53
54
|
"verify-bin": "node scripts/verify-bin.js",
|
|
54
55
|
"quick-start": "npm install && npm run setup && npm run dev",
|
package/scripts/auto-setup.js
CHANGED
|
@@ -113,6 +113,70 @@ async function initializeDatabase() {
|
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
async function rebuildNativeModules() {
|
|
117
|
+
try {
|
|
118
|
+
logStep('네이티브 모듈', 'better-sqlite3 및 sqlite-vec 재빌드 시도 중...');
|
|
119
|
+
|
|
120
|
+
const nodeModulesPath = path.join(projectRoot, 'node_modules');
|
|
121
|
+
if (!fs.existsSync(nodeModulesPath)) {
|
|
122
|
+
logWarning('node_modules가 없습니다. 먼저 npm install이 실행됩니다.');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// 네이티브 모듈이 제대로 작동하는지 확인 (동적 import 사용)
|
|
127
|
+
try {
|
|
128
|
+
const betterSqlite3Path = path.join(nodeModulesPath, 'better-sqlite3');
|
|
129
|
+
if (fs.existsSync(betterSqlite3Path)) {
|
|
130
|
+
// 모듈 존재 확인만 (실제 로드는 나중에)
|
|
131
|
+
logSuccess('better-sqlite3 모듈 확인됨');
|
|
132
|
+
} else {
|
|
133
|
+
throw new Error('better-sqlite3 not found');
|
|
134
|
+
}
|
|
135
|
+
} catch (error) {
|
|
136
|
+
logWarning('better-sqlite3 모듈을 찾을 수 없거나 빌드가 필요합니다.');
|
|
137
|
+
logStep('재빌드', 'better-sqlite3 재빌드 중...');
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
execSync('npm rebuild better-sqlite3', {
|
|
141
|
+
cwd: projectRoot,
|
|
142
|
+
stdio: 'inherit'
|
|
143
|
+
});
|
|
144
|
+
logSuccess('better-sqlite3 재빌드 완료');
|
|
145
|
+
} catch (rebuildError) {
|
|
146
|
+
logWarning(`better-sqlite3 재빌드 실패: ${rebuildError.message}`);
|
|
147
|
+
logWarning('수동으로 실행하세요: npm rebuild better-sqlite3');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// sqlite-vec도 확인 (선택적)
|
|
152
|
+
try {
|
|
153
|
+
const sqliteVecPath = path.join(nodeModulesPath, 'sqlite-vec');
|
|
154
|
+
if (fs.existsSync(sqliteVecPath)) {
|
|
155
|
+
logSuccess('sqlite-vec 모듈 확인됨');
|
|
156
|
+
} else {
|
|
157
|
+
throw new Error('sqlite-vec not found');
|
|
158
|
+
}
|
|
159
|
+
} catch (error) {
|
|
160
|
+
logWarning('sqlite-vec 모듈을 찾을 수 없거나 빌드가 필요합니다.');
|
|
161
|
+
logStep('재빌드', 'sqlite-vec 재빌드 시도 중...');
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
execSync('npm rebuild sqlite-vec', {
|
|
165
|
+
cwd: projectRoot,
|
|
166
|
+
stdio: 'inherit'
|
|
167
|
+
});
|
|
168
|
+
logSuccess('sqlite-vec 재빌드 완료');
|
|
169
|
+
} catch (rebuildError) {
|
|
170
|
+
logWarning(`sqlite-vec 재빌드 실패: ${rebuildError.message}`);
|
|
171
|
+
logWarning('sqlite-vec는 선택적 의존성입니다. 벡터 검색 기능이 제한될 수 있습니다.');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} catch (error) {
|
|
175
|
+
logWarning(`네이티브 모듈 재빌드 중 오류: ${error.message}`);
|
|
176
|
+
logWarning('수동으로 실행하세요: npm rebuild better-sqlite3 sqlite-vec');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
116
180
|
async function checkDependencies() {
|
|
117
181
|
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
118
182
|
const nodeModulesPath = path.join(projectRoot, 'node_modules');
|
|
@@ -210,6 +274,15 @@ async function main() {
|
|
|
210
274
|
try {
|
|
211
275
|
log('🚀 Memento MCP Server 자동 설정을 시작합니다...', 'bright');
|
|
212
276
|
|
|
277
|
+
// npx를 통해 실행되는 경우 네이티브 모듈 재빌드 먼저 시도
|
|
278
|
+
const isNpx = process.env.npm_config_user_config === undefined ||
|
|
279
|
+
process.env.npm_execpath?.includes('npx') ||
|
|
280
|
+
process.env.npm_lifecycle_event === 'postinstall';
|
|
281
|
+
|
|
282
|
+
if (isNpx) {
|
|
283
|
+
await rebuildNativeModules();
|
|
284
|
+
}
|
|
285
|
+
|
|
213
286
|
await checkNodeVersion();
|
|
214
287
|
await checkDependencies();
|
|
215
288
|
await createDataDirectory();
|