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.
Files changed (75) hide show
  1. package/README.md +7 -0
  2. package/dist/server/context.d.ts +36 -0
  3. package/dist/server/context.d.ts.map +1 -0
  4. package/dist/server/context.js +45 -0
  5. package/dist/server/context.js.map +1 -0
  6. package/dist/server/handlers/anchor-map.handler.d.ts +60 -0
  7. package/dist/server/handlers/anchor-map.handler.d.ts.map +1 -0
  8. package/dist/server/handlers/anchor-map.handler.js +190 -0
  9. package/dist/server/handlers/anchor-map.handler.js.map +1 -0
  10. package/dist/server/http-server.d.ts.map +1 -1
  11. package/dist/server/http-server.js +41 -1131
  12. package/dist/server/http-server.js.map +1 -1
  13. package/dist/server/middleware/error-handler.middleware.d.ts +25 -0
  14. package/dist/server/middleware/error-handler.middleware.d.ts.map +1 -0
  15. package/dist/server/middleware/error-handler.middleware.js +97 -0
  16. package/dist/server/middleware/error-handler.middleware.js.map +1 -0
  17. package/dist/server/middleware/index.d.ts +8 -0
  18. package/dist/server/middleware/index.d.ts.map +1 -0
  19. package/dist/server/middleware/index.js +8 -0
  20. package/dist/server/middleware/index.js.map +1 -0
  21. package/dist/server/middleware/service-injector.middleware.d.ts +30 -0
  22. package/dist/server/middleware/service-injector.middleware.d.ts.map +1 -0
  23. package/dist/server/middleware/service-injector.middleware.js +20 -0
  24. package/dist/server/middleware/service-injector.middleware.js.map +1 -0
  25. package/dist/server/middleware/tool-context.middleware.d.ts +29 -0
  26. package/dist/server/middleware/tool-context.middleware.d.ts.map +1 -0
  27. package/dist/server/middleware/tool-context.middleware.js +34 -0
  28. package/dist/server/middleware/tool-context.middleware.js.map +1 -0
  29. package/dist/server/routes/admin.routes.d.ts +12 -0
  30. package/dist/server/routes/admin.routes.d.ts.map +1 -0
  31. package/dist/server/routes/admin.routes.js +338 -0
  32. package/dist/server/routes/admin.routes.js.map +1 -0
  33. package/dist/server/routes/api.routes.d.ts +13 -0
  34. package/dist/server/routes/api.routes.d.ts.map +1 -0
  35. package/dist/server/routes/api.routes.js +122 -0
  36. package/dist/server/routes/api.routes.js.map +1 -0
  37. package/dist/server/routes/mcp.routes.d.ts +22 -0
  38. package/dist/server/routes/mcp.routes.d.ts.map +1 -0
  39. package/dist/server/routes/mcp.routes.js +383 -0
  40. package/dist/server/routes/mcp.routes.js.map +1 -0
  41. package/dist/server/routes/tools.routes.d.ts +13 -0
  42. package/dist/server/routes/tools.routes.d.ts.map +1 -0
  43. package/dist/server/routes/tools.routes.js +99 -0
  44. package/dist/server/routes/tools.routes.js.map +1 -0
  45. package/dist/services/anchor/anchor-cache-service.d.ts +77 -0
  46. package/dist/services/anchor/anchor-cache-service.d.ts.map +1 -0
  47. package/dist/services/anchor/anchor-cache-service.js +193 -0
  48. package/dist/services/anchor/anchor-cache-service.js.map +1 -0
  49. package/dist/services/anchor/anchor-interfaces.d.ts +143 -0
  50. package/dist/services/anchor/anchor-interfaces.d.ts.map +1 -0
  51. package/dist/services/anchor/anchor-interfaces.js +24 -0
  52. package/dist/services/anchor/anchor-interfaces.js.map +1 -0
  53. package/dist/services/anchor/anchor-manager.d.ts +71 -0
  54. package/dist/services/anchor/anchor-manager.d.ts.map +1 -0
  55. package/dist/services/anchor/anchor-manager.js +205 -0
  56. package/dist/services/anchor/anchor-manager.js.map +1 -0
  57. package/dist/services/anchor/anchor-search-service.d.ts +115 -0
  58. package/dist/services/anchor/anchor-search-service.d.ts.map +1 -0
  59. package/dist/services/anchor/anchor-search-service.js +799 -0
  60. package/dist/services/anchor/anchor-search-service.js.map +1 -0
  61. package/dist/services/anchor/index.d.ts +11 -0
  62. package/dist/services/anchor/index.d.ts.map +1 -0
  63. package/dist/services/anchor/index.js +10 -0
  64. package/dist/services/anchor/index.js.map +1 -0
  65. package/dist/services/anchor-manager.d.ts +22 -208
  66. package/dist/services/anchor-manager.d.ts.map +1 -1
  67. package/dist/services/anchor-manager.js +72 -1088
  68. package/dist/services/anchor-manager.js.map +1 -1
  69. package/dist/services/error-logging-service.d.ts +1 -0
  70. package/dist/services/error-logging-service.d.ts.map +1 -1
  71. package/dist/services/error-logging-service.js +2 -0
  72. package/dist/services/error-logging-service.js.map +1 -1
  73. package/dist/tools/forget-tool.js +1 -1
  74. package/dist/tools/forget-tool.js.map +1 -1
  75. 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"}