memento-mcp-server 1.11.0-a1 → 1.11.1-a
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/README.md +7 -0
- package/dist/server/context.d.ts +36 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +45 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/handlers/anchor-map.handler.d.ts +60 -0
- package/dist/server/handlers/anchor-map.handler.d.ts.map +1 -0
- package/dist/server/handlers/anchor-map.handler.js +190 -0
- package/dist/server/handlers/anchor-map.handler.js.map +1 -0
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +41 -1131
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/middleware/error-handler.middleware.d.ts +25 -0
- package/dist/server/middleware/error-handler.middleware.d.ts.map +1 -0
- package/dist/server/middleware/error-handler.middleware.js +97 -0
- package/dist/server/middleware/error-handler.middleware.js.map +1 -0
- package/dist/server/middleware/index.d.ts +8 -0
- package/dist/server/middleware/index.d.ts.map +1 -0
- package/dist/server/middleware/index.js +8 -0
- package/dist/server/middleware/index.js.map +1 -0
- package/dist/server/middleware/service-injector.middleware.d.ts +30 -0
- package/dist/server/middleware/service-injector.middleware.d.ts.map +1 -0
- package/dist/server/middleware/service-injector.middleware.js +20 -0
- package/dist/server/middleware/service-injector.middleware.js.map +1 -0
- package/dist/server/middleware/tool-context.middleware.d.ts +29 -0
- package/dist/server/middleware/tool-context.middleware.d.ts.map +1 -0
- package/dist/server/middleware/tool-context.middleware.js +34 -0
- package/dist/server/middleware/tool-context.middleware.js.map +1 -0
- package/dist/server/routes/admin.routes.d.ts +12 -0
- package/dist/server/routes/admin.routes.d.ts.map +1 -0
- package/dist/server/routes/admin.routes.js +338 -0
- package/dist/server/routes/admin.routes.js.map +1 -0
- package/dist/server/routes/api.routes.d.ts +13 -0
- package/dist/server/routes/api.routes.d.ts.map +1 -0
- package/dist/server/routes/api.routes.js +122 -0
- package/dist/server/routes/api.routes.js.map +1 -0
- package/dist/server/routes/mcp.routes.d.ts +22 -0
- package/dist/server/routes/mcp.routes.d.ts.map +1 -0
- package/dist/server/routes/mcp.routes.js +383 -0
- package/dist/server/routes/mcp.routes.js.map +1 -0
- package/dist/server/routes/tools.routes.d.ts +13 -0
- package/dist/server/routes/tools.routes.d.ts.map +1 -0
- package/dist/server/routes/tools.routes.js +99 -0
- package/dist/server/routes/tools.routes.js.map +1 -0
- package/dist/services/anchor/anchor-cache-service.d.ts +77 -0
- package/dist/services/anchor/anchor-cache-service.d.ts.map +1 -0
- package/dist/services/anchor/anchor-cache-service.js +193 -0
- package/dist/services/anchor/anchor-cache-service.js.map +1 -0
- package/dist/services/anchor/anchor-interfaces.d.ts +143 -0
- package/dist/services/anchor/anchor-interfaces.d.ts.map +1 -0
- package/dist/services/anchor/anchor-interfaces.js +24 -0
- package/dist/services/anchor/anchor-interfaces.js.map +1 -0
- package/dist/services/anchor/anchor-manager.d.ts +71 -0
- package/dist/services/anchor/anchor-manager.d.ts.map +1 -0
- package/dist/services/anchor/anchor-manager.js +205 -0
- package/dist/services/anchor/anchor-manager.js.map +1 -0
- package/dist/services/anchor/anchor-search-service.d.ts +115 -0
- package/dist/services/anchor/anchor-search-service.d.ts.map +1 -0
- package/dist/services/anchor/anchor-search-service.js +799 -0
- package/dist/services/anchor/anchor-search-service.js.map +1 -0
- package/dist/services/anchor/index.d.ts +11 -0
- package/dist/services/anchor/index.d.ts.map +1 -0
- package/dist/services/anchor/index.js +10 -0
- package/dist/services/anchor/index.js.map +1 -0
- package/dist/services/anchor-manager.d.ts +22 -208
- package/dist/services/anchor-manager.d.ts.map +1 -1
- package/dist/services/anchor-manager.js +72 -1088
- package/dist/services/anchor-manager.js.map +1 -1
- package/dist/services/error-logging-service.d.ts +1 -0
- package/dist/services/error-logging-service.d.ts.map +1 -1
- package/dist/services/error-logging-service.js +2 -0
- package/dist/services/error-logging-service.js.map +1 -1
- package/dist/tools/forget-tool.js +1 -1
- package/dist/tools/forget-tool.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin 라우터
|
|
3
|
+
* /admin/* 엔드포인트 처리
|
|
4
|
+
* Phase 1.2: http-server.ts 리팩토링
|
|
5
|
+
*/
|
|
6
|
+
import { Router } from 'express';
|
|
7
|
+
import { getBatchScheduler } from '../../services/batch-scheduler.js';
|
|
8
|
+
import { getPerformanceMonitor } from '../../services/performance-monitor.js';
|
|
9
|
+
import { logger } from '../../utils/logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Admin 라우터 생성
|
|
12
|
+
*/
|
|
13
|
+
export function createAdminRouter(db) {
|
|
14
|
+
const router = Router();
|
|
15
|
+
// 메모리 정리
|
|
16
|
+
router.post('/memory/cleanup', async (req, res) => {
|
|
17
|
+
try {
|
|
18
|
+
if (!db) {
|
|
19
|
+
return res.status(500).json({ error: '데이터베이스가 연결되지 않았습니다' });
|
|
20
|
+
}
|
|
21
|
+
const result = await db.prepare(`
|
|
22
|
+
DELETE FROM memory_item
|
|
23
|
+
WHERE pinned = FALSE
|
|
24
|
+
AND type = 'working'
|
|
25
|
+
AND created_at < datetime('now', '-2 days')
|
|
26
|
+
`).run();
|
|
27
|
+
return res.json({
|
|
28
|
+
message: '메모리 정리 완료',
|
|
29
|
+
deleted_count: result.changes,
|
|
30
|
+
timestamp: new Date().toISOString()
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
logger.error('Memory cleanup failed', {
|
|
35
|
+
error: error instanceof Error ? error.message : String(error)
|
|
36
|
+
});
|
|
37
|
+
return res.status(500).json({
|
|
38
|
+
error: '메모리 정리 실패',
|
|
39
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
// 망각 통계
|
|
44
|
+
router.get('/stats/forgetting', async (req, res) => {
|
|
45
|
+
try {
|
|
46
|
+
if (!db) {
|
|
47
|
+
return res.status(500).json({ error: '데이터베이스가 연결되지 않았습니다' });
|
|
48
|
+
}
|
|
49
|
+
const stats = await db.prepare(`
|
|
50
|
+
SELECT
|
|
51
|
+
type,
|
|
52
|
+
COUNT(*) as total_count,
|
|
53
|
+
COUNT(CASE WHEN pinned = TRUE THEN 1 END) as pinned_count,
|
|
54
|
+
COUNT(CASE WHEN created_at < datetime('now', '-30 days') THEN 1 END) as old_count
|
|
55
|
+
FROM memory_item
|
|
56
|
+
GROUP BY type
|
|
57
|
+
`).all();
|
|
58
|
+
return res.json({
|
|
59
|
+
message: '망각 통계 조회 완료',
|
|
60
|
+
stats,
|
|
61
|
+
timestamp: new Date().toISOString()
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger.error('Forgetting stats retrieval failed', {
|
|
66
|
+
error: error instanceof Error ? error.message : String(error)
|
|
67
|
+
});
|
|
68
|
+
return res.status(500).json({
|
|
69
|
+
error: '망각 통계 조회 실패',
|
|
70
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// 성능 통계
|
|
75
|
+
router.get('/stats/performance', async (req, res) => {
|
|
76
|
+
try {
|
|
77
|
+
if (!db) {
|
|
78
|
+
return res.status(500).json({ error: '데이터베이스가 연결되지 않았습니다' });
|
|
79
|
+
}
|
|
80
|
+
const stats = await db.prepare(`
|
|
81
|
+
SELECT
|
|
82
|
+
COUNT(*) as total_memories,
|
|
83
|
+
COUNT(CASE WHEN type = 'working' THEN 1 END) as working_memories,
|
|
84
|
+
COUNT(CASE WHEN type = 'episodic' THEN 1 END) as episodic_memories,
|
|
85
|
+
COUNT(CASE WHEN type = 'semantic' THEN 1 END) as semantic_memories,
|
|
86
|
+
COUNT(CASE WHEN type = 'procedural' THEN 1 END) as procedural_memories,
|
|
87
|
+
COUNT(CASE WHEN pinned = TRUE THEN 1 END) as pinned_memories
|
|
88
|
+
FROM memory_item
|
|
89
|
+
`).get();
|
|
90
|
+
return res.json({
|
|
91
|
+
message: '성능 통계 조회 완료',
|
|
92
|
+
stats,
|
|
93
|
+
timestamp: new Date().toISOString()
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
logger.error('Performance stats retrieval failed', {
|
|
98
|
+
error: error instanceof Error ? error.message : String(error)
|
|
99
|
+
});
|
|
100
|
+
return res.status(500).json({
|
|
101
|
+
error: '성능 통계 조회 실패',
|
|
102
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// 데이터베이스 최적화
|
|
107
|
+
router.post('/database/optimize', async (req, res) => {
|
|
108
|
+
try {
|
|
109
|
+
if (!db) {
|
|
110
|
+
return res.status(500).json({ error: '데이터베이스가 연결되지 않았습니다' });
|
|
111
|
+
}
|
|
112
|
+
await db.prepare('VACUUM').run();
|
|
113
|
+
await db.prepare('ANALYZE').run();
|
|
114
|
+
return res.json({
|
|
115
|
+
message: '데이터베이스 최적화 완료',
|
|
116
|
+
timestamp: new Date().toISOString()
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
logger.error('Database optimization failed', {
|
|
121
|
+
error: error instanceof Error ? error.message : String(error)
|
|
122
|
+
});
|
|
123
|
+
return res.status(500).json({
|
|
124
|
+
error: '데이터베이스 최적화 실패',
|
|
125
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// 에러 통계
|
|
130
|
+
router.get('/stats/errors', async (req, res) => {
|
|
131
|
+
try {
|
|
132
|
+
res.json({
|
|
133
|
+
message: '에러 통계 조회 완료',
|
|
134
|
+
stats: {
|
|
135
|
+
total_errors: 0,
|
|
136
|
+
recent_errors: [],
|
|
137
|
+
error_types: {}
|
|
138
|
+
},
|
|
139
|
+
timestamp: new Date().toISOString()
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
logger.error('Error stats retrieval failed', {
|
|
144
|
+
error: error instanceof Error ? error.message : String(error)
|
|
145
|
+
});
|
|
146
|
+
res.status(500).json({
|
|
147
|
+
error: '에러 통계 조회 실패',
|
|
148
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// 에러 해결
|
|
153
|
+
router.post('/errors/resolve', async (req, res) => {
|
|
154
|
+
try {
|
|
155
|
+
const { errorId, resolvedBy, reason } = req.body;
|
|
156
|
+
res.json({
|
|
157
|
+
message: '에러 해결 완료',
|
|
158
|
+
errorId,
|
|
159
|
+
resolvedBy,
|
|
160
|
+
reason,
|
|
161
|
+
timestamp: new Date().toISOString()
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
logger.error('Error resolution failed', {
|
|
166
|
+
error: error instanceof Error ? error.message : String(error)
|
|
167
|
+
});
|
|
168
|
+
res.status(500).json({
|
|
169
|
+
error: '에러 해결 실패',
|
|
170
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// 성능 알림
|
|
175
|
+
router.get('/alerts/performance', async (req, res) => {
|
|
176
|
+
try {
|
|
177
|
+
res.json({
|
|
178
|
+
message: '성능 알림 조회 완료',
|
|
179
|
+
alerts: [],
|
|
180
|
+
timestamp: new Date().toISOString()
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
logger.error('Performance alerts retrieval failed', {
|
|
185
|
+
error: error instanceof Error ? error.message : String(error)
|
|
186
|
+
});
|
|
187
|
+
res.status(500).json({
|
|
188
|
+
error: '성능 알림 조회 실패',
|
|
189
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
// 배치 스케줄러 상태
|
|
194
|
+
router.get('/batch/status', async (req, res) => {
|
|
195
|
+
try {
|
|
196
|
+
const batchScheduler = getBatchScheduler();
|
|
197
|
+
const status = batchScheduler.getStatus();
|
|
198
|
+
res.json({
|
|
199
|
+
message: '배치 스케줄러 상태 조회 완료',
|
|
200
|
+
status,
|
|
201
|
+
timestamp: new Date().toISOString()
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
logger.error('Batch scheduler status retrieval failed', {
|
|
206
|
+
error: error instanceof Error ? error.message : String(error)
|
|
207
|
+
});
|
|
208
|
+
res.status(500).json({
|
|
209
|
+
error: '배치 스케줄러 상태 조회 실패',
|
|
210
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
// 배치 작업 실행
|
|
215
|
+
router.post('/batch/run', async (req, res) => {
|
|
216
|
+
try {
|
|
217
|
+
const { jobType } = req.body;
|
|
218
|
+
if (!jobType || !['cleanup', 'monitoring'].includes(jobType)) {
|
|
219
|
+
return res.status(400).json({
|
|
220
|
+
error: 'Invalid job type. Must be "cleanup" or "monitoring"'
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
const batchScheduler = getBatchScheduler();
|
|
224
|
+
const result = await batchScheduler.runJob(jobType);
|
|
225
|
+
return res.json({
|
|
226
|
+
message: `배치 작업 ${jobType} 실행 완료`,
|
|
227
|
+
result,
|
|
228
|
+
timestamp: new Date().toISOString()
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
logger.error('Batch job execution failed', {
|
|
233
|
+
error: error instanceof Error ? error.message : String(error)
|
|
234
|
+
});
|
|
235
|
+
return res.status(500).json({
|
|
236
|
+
error: '배치 작업 실행 실패',
|
|
237
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
// 성능 지표 수집
|
|
242
|
+
router.get('/performance/metrics', async (req, res) => {
|
|
243
|
+
try {
|
|
244
|
+
const monitor = getPerformanceMonitor();
|
|
245
|
+
const metrics = await monitor.collectMetrics();
|
|
246
|
+
res.json({
|
|
247
|
+
message: '성능 지표 수집 완료',
|
|
248
|
+
metrics,
|
|
249
|
+
timestamp: new Date().toISOString()
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
logger.error('Performance metrics collection failed', {
|
|
254
|
+
error: error instanceof Error ? error.message : String(error)
|
|
255
|
+
});
|
|
256
|
+
res.status(500).json({
|
|
257
|
+
error: '성능 지표 수집 실패',
|
|
258
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
// 성능 알림 조회
|
|
263
|
+
router.get('/performance/alerts', async (req, res) => {
|
|
264
|
+
try {
|
|
265
|
+
const monitor = getPerformanceMonitor();
|
|
266
|
+
const alerts = monitor.getActiveAlerts();
|
|
267
|
+
res.json({
|
|
268
|
+
message: '성능 알림 조회 완료',
|
|
269
|
+
alerts,
|
|
270
|
+
count: alerts.length,
|
|
271
|
+
timestamp: new Date().toISOString()
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
logger.error('Performance alerts retrieval failed', {
|
|
276
|
+
error: error instanceof Error ? error.message : String(error)
|
|
277
|
+
});
|
|
278
|
+
res.status(500).json({
|
|
279
|
+
error: '성능 알림 조회 실패',
|
|
280
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
// 성능 요약
|
|
285
|
+
router.get('/performance/summary', async (req, res) => {
|
|
286
|
+
try {
|
|
287
|
+
const monitor = getPerformanceMonitor();
|
|
288
|
+
const summary = monitor.getPerformanceSummary();
|
|
289
|
+
res.json({
|
|
290
|
+
message: '성능 요약 조회 완료',
|
|
291
|
+
summary,
|
|
292
|
+
timestamp: new Date().toISOString()
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
logger.error('Performance summary retrieval failed', {
|
|
297
|
+
error: error instanceof Error ? error.message : String(error)
|
|
298
|
+
});
|
|
299
|
+
res.status(500).json({
|
|
300
|
+
error: '성능 요약 조회 실패',
|
|
301
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
// 성능 알림 해결
|
|
306
|
+
router.post('/performance/alerts/:alertId/resolve', async (req, res) => {
|
|
307
|
+
try {
|
|
308
|
+
const { alertId } = req.params;
|
|
309
|
+
const monitor = getPerformanceMonitor();
|
|
310
|
+
const resolved = monitor.resolveAlert(alertId);
|
|
311
|
+
if (resolved) {
|
|
312
|
+
res.json({
|
|
313
|
+
message: '알림 해결 완료',
|
|
314
|
+
alertId,
|
|
315
|
+
timestamp: new Date().toISOString()
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
res.status(404).json({
|
|
320
|
+
error: '알림을 찾을 수 없습니다',
|
|
321
|
+
alertId
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
logger.error('Performance alert resolution failed', {
|
|
327
|
+
alertId: req.params.alertId,
|
|
328
|
+
error: error instanceof Error ? error.message : String(error)
|
|
329
|
+
});
|
|
330
|
+
res.status(500).json({
|
|
331
|
+
error: '알림 해결 실패',
|
|
332
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
return router;
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=admin.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.routes.js","sourceRoot":"","sources":["../../../src/server/routes/admin.routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 라우터
|
|
3
|
+
* /api/* 엔드포인트 처리
|
|
4
|
+
* Phase 1.2: http-server.ts 리팩토링
|
|
5
|
+
*/
|
|
6
|
+
import { Router } from 'express';
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
import type { ServerServices } from '../bootstrap.js';
|
|
9
|
+
/**
|
|
10
|
+
* API 라우터 생성
|
|
11
|
+
*/
|
|
12
|
+
export declare function createApiRouter(db: Database.Database | null, serverServices: ServerServices | null): Router;
|
|
13
|
+
//# sourceMappingURL=api.routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.routes.d.ts","sourceRoot":"","sources":["../../../src/server/routes/api.routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,EAC5B,cAAc,EAAE,cAAc,GAAG,IAAI,GACpC,MAAM,CA4HR"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 라우터
|
|
3
|
+
* /api/* 엔드포인트 처리
|
|
4
|
+
* Phase 1.2: http-server.ts 리팩토링
|
|
5
|
+
*/
|
|
6
|
+
import { Router } from 'express';
|
|
7
|
+
import { buildAnchorMapData } from '../handlers/anchor-map.handler.js';
|
|
8
|
+
import { MemoryNeighborService, MemoryNotFoundError } from '../../services/memory-neighbor-service.js';
|
|
9
|
+
import { getVectorSearchEngine } from '../../algorithms/vector-search-engine.js';
|
|
10
|
+
import { logger } from '../../utils/logger.js';
|
|
11
|
+
/**
|
|
12
|
+
* API 라우터 생성
|
|
13
|
+
*/
|
|
14
|
+
export function createApiRouter(db, serverServices) {
|
|
15
|
+
const router = Router();
|
|
16
|
+
// Anchor Map 조회
|
|
17
|
+
router.get('/anchors/map', async (req, res) => {
|
|
18
|
+
const agentId = req.query.agent_id || 'default';
|
|
19
|
+
try {
|
|
20
|
+
if (!db || !serverServices) {
|
|
21
|
+
return res.status(500).json({
|
|
22
|
+
error: 'Services not initialized',
|
|
23
|
+
message: '서비스가 초기화되지 않았습니다'
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const anchorManager = serverServices.anchorManager;
|
|
27
|
+
if (!anchorManager) {
|
|
28
|
+
return res.status(500).json({
|
|
29
|
+
error: 'AnchorManager not available',
|
|
30
|
+
message: 'AnchorManager가 사용할 수 없습니다'
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
// Anchor Map 데이터 생성 (핸들러 사용)
|
|
34
|
+
const mapData = await buildAnchorMapData(db, serverServices, agentId);
|
|
35
|
+
return res.json(mapData);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger.error('Anchor Map data retrieval failed', {
|
|
39
|
+
agentId,
|
|
40
|
+
error: error instanceof Error ? error.message : String(error)
|
|
41
|
+
});
|
|
42
|
+
return res.status(500).json({
|
|
43
|
+
error: 'Failed to get anchor map data',
|
|
44
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
45
|
+
agent_id: agentId
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
// 메모리 이웃 조회
|
|
50
|
+
router.get('/memories/:id/neighbors', async (req, res) => {
|
|
51
|
+
const { id } = req.params;
|
|
52
|
+
const limit = req.query.limit ? parseInt(req.query.limit, 10) : 5;
|
|
53
|
+
const similarityThreshold = req.query.similarity_threshold
|
|
54
|
+
? parseFloat(req.query.similarity_threshold)
|
|
55
|
+
: 0.8;
|
|
56
|
+
try {
|
|
57
|
+
if (!db) {
|
|
58
|
+
return res.status(500).json({
|
|
59
|
+
error: 'Database not connected',
|
|
60
|
+
message: '데이터베이스가 연결되지 않았습니다'
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// 파라미터 검증
|
|
64
|
+
if (isNaN(limit) || limit < 1 || limit > 50) {
|
|
65
|
+
return res.status(400).json({
|
|
66
|
+
error: 'Invalid limit parameter',
|
|
67
|
+
message: 'limit은 1-50 사이의 숫자여야 합니다'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (isNaN(similarityThreshold) || similarityThreshold < 0 || similarityThreshold > 1) {
|
|
71
|
+
return res.status(400).json({
|
|
72
|
+
error: 'Invalid similarity_threshold parameter',
|
|
73
|
+
message: 'similarity_threshold는 0-1 사이의 숫자여야 합니다'
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// MemoryNeighborService 사용
|
|
77
|
+
if (!serverServices) {
|
|
78
|
+
return res.status(500).json({
|
|
79
|
+
error: 'Services not initialized',
|
|
80
|
+
message: '서비스가 초기화되지 않았습니다'
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const vectorSearchEngine = getVectorSearchEngine();
|
|
84
|
+
vectorSearchEngine.initialize(db);
|
|
85
|
+
const embeddingService = serverServices.embeddingService;
|
|
86
|
+
const neighborService = new MemoryNeighborService(vectorSearchEngine, embeddingService);
|
|
87
|
+
neighborService.setDatabase(db);
|
|
88
|
+
const result = await neighborService.getNeighbors(id, {
|
|
89
|
+
limit,
|
|
90
|
+
similarity_threshold: similarityThreshold
|
|
91
|
+
});
|
|
92
|
+
return res.json({
|
|
93
|
+
memory_id: id,
|
|
94
|
+
neighbors: result.neighbors,
|
|
95
|
+
count: result.total_count,
|
|
96
|
+
limit,
|
|
97
|
+
similarity_threshold: similarityThreshold,
|
|
98
|
+
timestamp: new Date().toISOString()
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (error instanceof MemoryNotFoundError) {
|
|
103
|
+
return res.status(404).json({
|
|
104
|
+
error: 'Memory not found',
|
|
105
|
+
message: error.message,
|
|
106
|
+
memory_id: id
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
logger.error('Memory neighbors retrieval failed', {
|
|
110
|
+
memoryId: id,
|
|
111
|
+
error: error instanceof Error ? error.message : String(error)
|
|
112
|
+
});
|
|
113
|
+
return res.status(500).json({
|
|
114
|
+
error: 'Failed to get memory neighbors',
|
|
115
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
116
|
+
memory_id: id
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return router;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=api.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.routes.js","sourceRoot":"","sources":["../../../src/server/routes/api.routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 라우터
|
|
3
|
+
* /mcp, /messages 엔드포인트 처리
|
|
4
|
+
* Phase 1.2: http-server.ts 리팩토링
|
|
5
|
+
*/
|
|
6
|
+
import { Router } from 'express';
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
import type { ServerServices } from '../bootstrap.js';
|
|
9
|
+
/**
|
|
10
|
+
* SSE Transport 타입
|
|
11
|
+
*/
|
|
12
|
+
interface SSETransport {
|
|
13
|
+
res: any;
|
|
14
|
+
sessionId: string;
|
|
15
|
+
keepAliveInterval: NodeJS.Timeout;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* MCP 라우터 생성
|
|
19
|
+
*/
|
|
20
|
+
export declare function createMcpRouter(db: Database.Database | null, serverServices: ServerServices | null, transports: Record<string, SSETransport>): Router;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=mcp.routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.routes.d.ts","sourceRoot":"","sources":["../../../src/server/routes/mcp.routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD;;GAEG;AACH,UAAU,YAAY;IACpB,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,EAC5B,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GACvC,MAAM,CAiYR"}
|