memento-mcp-server 1.11.1 → 1.12.0-a1
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.en.md +21 -6
- package/README.md +38 -7
- package/dist/algorithms/hybrid-search-engine.d.ts +34 -1
- package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -1
- package/dist/algorithms/hybrid-search-engine.js +186 -17
- package/dist/algorithms/hybrid-search-engine.js.map +1 -1
- package/dist/algorithms/search-ranking.d.ts +15 -1
- package/dist/algorithms/search-ranking.d.ts.map +1 -1
- package/dist/algorithms/search-ranking.js +41 -4
- package/dist/algorithms/search-ranking.js.map +1 -1
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/environment.js +4 -0
- package/dist/config/environment.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/ranking-weights-loader.d.ts +37 -0
- package/dist/config/ranking-weights-loader.d.ts.map +1 -0
- package/dist/config/ranking-weights-loader.js +109 -0
- package/dist/config/ranking-weights-loader.js.map +1 -0
- package/dist/constants/relation-constants.d.ts +95 -0
- package/dist/constants/relation-constants.d.ts.map +1 -0
- package/dist/constants/relation-constants.js +95 -0
- package/dist/constants/relation-constants.js.map +1 -0
- package/dist/database/migration/migrations/005-relation-engine-schema.d.ts +65 -0
- package/dist/database/migration/migrations/005-relation-engine-schema.d.ts.map +1 -0
- package/dist/database/migration/migrations/005-relation-engine-schema.js +295 -0
- package/dist/database/migration/migrations/005-relation-engine-schema.js.map +1 -0
- package/dist/database/migration/migrations/005-relation-engine-schema.sql +64 -0
- package/dist/server/routes/admin.routes.d.ts.map +1 -1
- package/dist/server/routes/admin.routes.js +228 -0
- package/dist/server/routes/admin.routes.js.map +1 -1
- package/dist/services/anchor/anchor-interfaces.d.ts +1 -0
- package/dist/services/anchor/anchor-interfaces.d.ts.map +1 -1
- package/dist/services/anchor/anchor-interfaces.js.map +1 -1
- package/dist/services/anchor/anchor-search-service.d.ts +16 -0
- package/dist/services/anchor/anchor-search-service.d.ts.map +1 -1
- package/dist/services/anchor/anchor-search-service.js +136 -17
- package/dist/services/anchor/anchor-search-service.js.map +1 -1
- package/dist/services/batch-scheduler.d.ts +11 -0
- package/dist/services/batch-scheduler.d.ts.map +1 -1
- package/dist/services/batch-scheduler.js +99 -0
- package/dist/services/batch-scheduler.js.map +1 -1
- package/dist/services/llm-based-relation-extractor.d.ts +156 -0
- package/dist/services/llm-based-relation-extractor.d.ts.map +1 -0
- package/dist/services/llm-based-relation-extractor.js +1350 -0
- package/dist/services/llm-based-relation-extractor.js.map +1 -0
- package/dist/services/relation-extractor.d.ts +73 -0
- package/dist/services/relation-extractor.d.ts.map +1 -0
- package/dist/services/relation-extractor.js +231 -0
- package/dist/services/relation-extractor.js.map +1 -0
- package/dist/services/relation-graph.d.ts +275 -0
- package/dist/services/relation-graph.d.ts.map +1 -0
- package/dist/services/relation-graph.js +869 -0
- package/dist/services/relation-graph.js.map +1 -0
- package/dist/services/relation-quality-validator.d.ts +211 -0
- package/dist/services/relation-quality-validator.d.ts.map +1 -0
- package/dist/services/relation-quality-validator.js +415 -0
- package/dist/services/relation-quality-validator.js.map +1 -0
- package/dist/services/rule-based-relation-extractor.d.ts +66 -0
- package/dist/services/rule-based-relation-extractor.d.ts.map +1 -0
- package/dist/services/rule-based-relation-extractor.js +258 -0
- package/dist/services/rule-based-relation-extractor.js.map +1 -0
- package/dist/tools/add-relation-tool.d.ts +34 -0
- package/dist/tools/add-relation-tool.d.ts.map +1 -0
- package/dist/tools/add-relation-tool.js +163 -0
- package/dist/tools/add-relation-tool.js.map +1 -0
- package/dist/tools/extract-relations-tool.d.ts +28 -0
- package/dist/tools/extract-relations-tool.d.ts.map +1 -0
- package/dist/tools/extract-relations-tool.js +159 -0
- package/dist/tools/extract-relations-tool.js.map +1 -0
- package/dist/tools/get-relations-tool.d.ts +34 -0
- package/dist/tools/get-relations-tool.d.ts.map +1 -0
- package/dist/tools/get-relations-tool.js +155 -0
- package/dist/tools/get-relations-tool.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +11 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/remember-tool.d.ts +17 -0
- package/dist/tools/remember-tool.d.ts.map +1 -1
- package/dist/tools/remember-tool.js +195 -26
- package/dist/tools/remember-tool.js.map +1 -1
- package/dist/tools/remove-relation-tool.d.ts +45 -0
- package/dist/tools/remove-relation-tool.d.ts.map +1 -0
- package/dist/tools/remove-relation-tool.js +142 -0
- package/dist/tools/remove-relation-tool.js.map +1 -0
- package/dist/tools/search-local-tool.d.ts.map +1 -1
- package/dist/tools/search-local-tool.js +10 -3
- package/dist/tools/search-local-tool.js.map +1 -1
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/visualize-relations-tool.d.ts +46 -0
- package/dist/tools/visualize-relations-tool.d.ts.map +1 -0
- package/dist/tools/visualize-relations-tool.js +157 -0
- package/dist/tools/visualize-relations-tool.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/relation-graph.d.ts +215 -0
- package/dist/types/relation-graph.d.ts.map +1 -0
- package/dist/types/relation-graph.js +6 -0
- package/dist/types/relation-graph.js.map +1 -0
- package/dist/types/relation.d.ts +112 -0
- package/dist/types/relation.d.ts.map +1 -0
- package/dist/types/relation.js +67 -0
- package/dist/types/relation.js.map +1 -0
- package/dist/utils/cache-key-generator.d.ts +63 -0
- package/dist/utils/cache-key-generator.d.ts.map +1 -0
- package/dist/utils/cache-key-generator.js +76 -0
- package/dist/utils/cache-key-generator.js.map +1 -0
- package/dist/utils/database.d.ts.map +1 -1
- package/dist/utils/database.js +37 -17
- package/dist/utils/database.js.map +1 -1
- package/dist/utils/relation-visualizer.d.ts +81 -0
- package/dist/utils/relation-visualizer.d.ts.map +1 -0
- package/dist/utils/relation-visualizer.js +239 -0
- package/dist/utils/relation-visualizer.js.map +1 -0
- package/dist/utils/type-guards.d.ts +100 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +144 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/package.json +7 -2
- package/scripts/generate-relation-report.ts +481 -0
- package/scripts/weekly-relation-validation.ts +423 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 관계 그래프 시각화 유틸리티
|
|
3
|
+
* 텍스트 기반으로 관계 그래프를 시각화합니다.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 관계 그래프 시각화 유틸리티 클래스
|
|
7
|
+
*/
|
|
8
|
+
export class RelationVisualizer {
|
|
9
|
+
/**
|
|
10
|
+
* 관계 목록을 텍스트로 시각화
|
|
11
|
+
*
|
|
12
|
+
* @param relations 관계 목록
|
|
13
|
+
* @param options 시각화 옵션
|
|
14
|
+
* @returns 시각화된 텍스트
|
|
15
|
+
*/
|
|
16
|
+
static visualizeAsText(relations, options = {}) {
|
|
17
|
+
const { showMemoryIds = true, showConfidence = true, showRelationTypes = true, indent = ' ', arrow = '-->' } = options;
|
|
18
|
+
if (relations.length === 0) {
|
|
19
|
+
return '관계가 없습니다.';
|
|
20
|
+
}
|
|
21
|
+
const lines = [];
|
|
22
|
+
const visited = new Set();
|
|
23
|
+
for (const relation of relations) {
|
|
24
|
+
const key = `${relation.source_id}-${relation.target_id}-${relation.relation_type}`;
|
|
25
|
+
if (visited.has(key)) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
visited.add(key);
|
|
29
|
+
const parts = [];
|
|
30
|
+
// 소스 메모리 ID
|
|
31
|
+
if (showMemoryIds) {
|
|
32
|
+
parts.push(relation.source_id);
|
|
33
|
+
}
|
|
34
|
+
// 화살표 및 관계 유형
|
|
35
|
+
if (showRelationTypes) {
|
|
36
|
+
parts.push(`${arrow}[${relation.relation_type}]`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
parts.push(arrow);
|
|
40
|
+
}
|
|
41
|
+
// 타겟 메모리 ID
|
|
42
|
+
if (showMemoryIds) {
|
|
43
|
+
parts.push(relation.target_id);
|
|
44
|
+
}
|
|
45
|
+
// 신뢰도
|
|
46
|
+
if (showConfidence) {
|
|
47
|
+
parts.push(`(confidence: ${relation.confidence.toFixed(2)})`);
|
|
48
|
+
}
|
|
49
|
+
lines.push(indent + parts.join(' '));
|
|
50
|
+
}
|
|
51
|
+
return lines.join('\n');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 서브그래프를 시각화 (특정 메모리를 중심으로)
|
|
55
|
+
*
|
|
56
|
+
* @param centerMemoryId 중심 메모리 ID
|
|
57
|
+
* @param relations 관계 목록
|
|
58
|
+
* @param options 시각화 옵션
|
|
59
|
+
* @returns 시각화된 텍스트
|
|
60
|
+
*/
|
|
61
|
+
static visualizeSubgraph(centerMemoryId, relations, options = {}) {
|
|
62
|
+
const { maxDepth = 2, minConfidence = 0.0, relationTypes, showMemoryIds = true, showConfidence = true, showRelationTypes = true, indent = ' ', arrow = '-->' } = options;
|
|
63
|
+
// 필터링: 신뢰도 및 관계 유형
|
|
64
|
+
let filteredRelations = relations.filter(r => r.confidence >= minConfidence);
|
|
65
|
+
if (relationTypes && relationTypes.length > 0) {
|
|
66
|
+
filteredRelations = filteredRelations.filter(r => relationTypes.includes(r.relation_type));
|
|
67
|
+
}
|
|
68
|
+
if (filteredRelations.length === 0) {
|
|
69
|
+
return `중심 메모리: ${centerMemoryId}\n관계가 없습니다.`;
|
|
70
|
+
}
|
|
71
|
+
// 그래프 구조 생성 (BFS 방식)
|
|
72
|
+
const graph = new Map();
|
|
73
|
+
const reverseGraph = new Map();
|
|
74
|
+
for (const relation of filteredRelations) {
|
|
75
|
+
// Outgoing 관계
|
|
76
|
+
if (!graph.has(relation.source_id)) {
|
|
77
|
+
graph.set(relation.source_id, []);
|
|
78
|
+
}
|
|
79
|
+
graph.get(relation.source_id).push({
|
|
80
|
+
target: relation.target_id,
|
|
81
|
+
relation
|
|
82
|
+
});
|
|
83
|
+
// Incoming 관계
|
|
84
|
+
if (!reverseGraph.has(relation.target_id)) {
|
|
85
|
+
reverseGraph.set(relation.target_id, []);
|
|
86
|
+
}
|
|
87
|
+
reverseGraph.get(relation.target_id).push({
|
|
88
|
+
source: relation.source_id,
|
|
89
|
+
relation
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// BFS로 서브그래프 탐색
|
|
93
|
+
const visited = new Set();
|
|
94
|
+
const queue = [];
|
|
95
|
+
const result = [];
|
|
96
|
+
queue.push({ memoryId: centerMemoryId, depth: 0, path: [] });
|
|
97
|
+
visited.add(centerMemoryId);
|
|
98
|
+
while (queue.length > 0) {
|
|
99
|
+
const current = queue.shift();
|
|
100
|
+
if (current.depth > 0) {
|
|
101
|
+
// 중심 메모리가 아닌 경우 결과에 추가
|
|
102
|
+
result.push({
|
|
103
|
+
memoryId: current.memoryId,
|
|
104
|
+
depth: current.depth,
|
|
105
|
+
path: current.path,
|
|
106
|
+
relation: null // path에서 관계 정보 추출 가능
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (current.depth >= maxDepth) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Outgoing 관계 탐색
|
|
113
|
+
const outgoing = graph.get(current.memoryId) || [];
|
|
114
|
+
for (const { target, relation } of outgoing) {
|
|
115
|
+
if (!visited.has(target)) {
|
|
116
|
+
visited.add(target);
|
|
117
|
+
queue.push({
|
|
118
|
+
memoryId: target,
|
|
119
|
+
depth: current.depth + 1,
|
|
120
|
+
path: [...current.path, `${current.memoryId}--[${relation.relation_type}]-->${target}`]
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Incoming 관계 탐색
|
|
125
|
+
const incoming = reverseGraph.get(current.memoryId) || [];
|
|
126
|
+
for (const { source, relation } of incoming) {
|
|
127
|
+
if (!visited.has(source)) {
|
|
128
|
+
visited.add(source);
|
|
129
|
+
queue.push({
|
|
130
|
+
memoryId: source,
|
|
131
|
+
depth: current.depth + 1,
|
|
132
|
+
path: [...current.path, `${source}--[${relation.relation_type}]-->${current.memoryId}`]
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// 시각화 텍스트 생성
|
|
138
|
+
const lines = [];
|
|
139
|
+
lines.push(`중심 메모리: ${centerMemoryId}`);
|
|
140
|
+
lines.push('');
|
|
141
|
+
// 깊이별로 그룹화하여 출력
|
|
142
|
+
const depthGroups = new Map();
|
|
143
|
+
for (const item of result) {
|
|
144
|
+
if (!depthGroups.has(item.depth)) {
|
|
145
|
+
depthGroups.set(item.depth, []);
|
|
146
|
+
}
|
|
147
|
+
depthGroups.get(item.depth).push(item);
|
|
148
|
+
}
|
|
149
|
+
// 관계 정보 추출 및 표시
|
|
150
|
+
const relationMap = new Map();
|
|
151
|
+
for (const relation of filteredRelations) {
|
|
152
|
+
const key = `${relation.source_id}-${relation.target_id}-${relation.relation_type}`;
|
|
153
|
+
relationMap.set(key, relation);
|
|
154
|
+
}
|
|
155
|
+
for (let depth = 1; depth <= maxDepth; depth++) {
|
|
156
|
+
const items = depthGroups.get(depth) || [];
|
|
157
|
+
if (items.length === 0) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
lines.push(`[${depth}-hop 관계]`);
|
|
161
|
+
for (const item of items) {
|
|
162
|
+
// path에서 마지막 관계 정보 추출
|
|
163
|
+
const lastPath = item.path[item.path.length - 1];
|
|
164
|
+
if (lastPath) {
|
|
165
|
+
const match = lastPath.match(/^(.+?)--\[(.+?)\]-->(.+?)$/);
|
|
166
|
+
if (match && match[1] && match[2] && match[3]) {
|
|
167
|
+
const [, source, relationType, target] = match;
|
|
168
|
+
const key = `${source}-${target}-${relationType}`;
|
|
169
|
+
const relation = relationMap.get(key);
|
|
170
|
+
const parts = [];
|
|
171
|
+
parts.push(indent.repeat(depth));
|
|
172
|
+
if (showMemoryIds) {
|
|
173
|
+
parts.push(source);
|
|
174
|
+
}
|
|
175
|
+
if (showRelationTypes) {
|
|
176
|
+
parts.push(`${arrow}[${relationType}]`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
parts.push(arrow);
|
|
180
|
+
}
|
|
181
|
+
if (showMemoryIds) {
|
|
182
|
+
parts.push(target);
|
|
183
|
+
}
|
|
184
|
+
if (showConfidence && relation) {
|
|
185
|
+
parts.push(`(confidence: ${relation.confidence.toFixed(2)})`);
|
|
186
|
+
}
|
|
187
|
+
lines.push(parts.join(' '));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
// path 파싱 실패 시 간단히 표시
|
|
191
|
+
lines.push(indent.repeat(depth) + item.memoryId);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
lines.push('');
|
|
196
|
+
}
|
|
197
|
+
if (result.length === 0) {
|
|
198
|
+
lines.push('관계가 없습니다.');
|
|
199
|
+
}
|
|
200
|
+
return lines.join('\n');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 관계 목록을 간단한 텍스트 형식으로 시각화
|
|
204
|
+
*
|
|
205
|
+
* @param relations 관계 목록
|
|
206
|
+
* @returns 시각화된 텍스트
|
|
207
|
+
*/
|
|
208
|
+
static visualizeSimple(relations) {
|
|
209
|
+
if (relations.length === 0) {
|
|
210
|
+
return '관계가 없습니다.';
|
|
211
|
+
}
|
|
212
|
+
const lines = [];
|
|
213
|
+
for (const relation of relations) {
|
|
214
|
+
lines.push(`${relation.source_id} --[${relation.relation_type}]--> ${relation.target_id} (confidence: ${relation.confidence.toFixed(2)})`);
|
|
215
|
+
}
|
|
216
|
+
return lines.join('\n');
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 관계 목록을 JSON 형식으로 시각화
|
|
220
|
+
*
|
|
221
|
+
* @param relations 관계 목록
|
|
222
|
+
* @param pretty JSON 포맷팅 여부 (기본값: true)
|
|
223
|
+
* @returns JSON 문자열
|
|
224
|
+
*/
|
|
225
|
+
static visualizeAsJSON(relations, pretty = true) {
|
|
226
|
+
const data = relations.map(r => ({
|
|
227
|
+
id: r.id,
|
|
228
|
+
source_id: r.source_id,
|
|
229
|
+
target_id: r.target_id,
|
|
230
|
+
relation_type: r.relation_type,
|
|
231
|
+
confidence: r.confidence,
|
|
232
|
+
created_at: r.created_at.toISOString(),
|
|
233
|
+
updated_at: r.updated_at.toISOString(),
|
|
234
|
+
metadata: r.metadata
|
|
235
|
+
}));
|
|
236
|
+
return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=relation-visualizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-visualizer.js","sourceRoot":"","sources":["../../src/utils/relation-visualizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 타입 가드 유틸리티
|
|
3
|
+
* 데이터베이스 조회 결과의 타입 안전성을 보장하기 위한 타입 가드 함수들
|
|
4
|
+
*/
|
|
5
|
+
import type { MemoryType, PrivacyScope, MemoryItem } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* 데이터베이스에서 조회한 메모리 행 타입
|
|
8
|
+
*/
|
|
9
|
+
export interface MemoryRow {
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
content: string;
|
|
13
|
+
importance: number;
|
|
14
|
+
privacy_scope: string;
|
|
15
|
+
created_at: string;
|
|
16
|
+
updated_at?: string;
|
|
17
|
+
last_accessed?: string;
|
|
18
|
+
pinned?: number | boolean;
|
|
19
|
+
tags?: string | null;
|
|
20
|
+
source?: string | null;
|
|
21
|
+
embedding?: string | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 타입 가드: MemoryRow인지 확인
|
|
25
|
+
*
|
|
26
|
+
* @param value 확인할 값
|
|
27
|
+
* @returns MemoryRow 여부
|
|
28
|
+
*/
|
|
29
|
+
export declare function isMemoryRow(value: unknown): value is MemoryRow;
|
|
30
|
+
/**
|
|
31
|
+
* 타입 가드: MemoryType인지 확인
|
|
32
|
+
*
|
|
33
|
+
* @param value 확인할 값
|
|
34
|
+
* @returns MemoryType 여부
|
|
35
|
+
*/
|
|
36
|
+
export declare function isMemoryType(value: string): value is MemoryType;
|
|
37
|
+
/**
|
|
38
|
+
* 타입 가드: PrivacyScope인지 확인
|
|
39
|
+
*
|
|
40
|
+
* @param value 확인할 값
|
|
41
|
+
* @returns PrivacyScope 여부
|
|
42
|
+
*/
|
|
43
|
+
export declare function isPrivacyScope(value: string): value is PrivacyScope;
|
|
44
|
+
/**
|
|
45
|
+
* MemoryRow를 MemoryItem으로 변환
|
|
46
|
+
* 타입 안전성을 보장하며 변환합니다.
|
|
47
|
+
*
|
|
48
|
+
* @param row 데이터베이스 행
|
|
49
|
+
* @returns MemoryItem 또는 null (타입 검증 실패 시)
|
|
50
|
+
*/
|
|
51
|
+
export declare function convertMemoryRowToItem(row: MemoryRow): MemoryItem | null;
|
|
52
|
+
/**
|
|
53
|
+
* 관계 행 타입
|
|
54
|
+
*/
|
|
55
|
+
export interface RelationRow {
|
|
56
|
+
id: number;
|
|
57
|
+
source_id: string;
|
|
58
|
+
target_id: string;
|
|
59
|
+
relation_type: string;
|
|
60
|
+
confidence: number;
|
|
61
|
+
created_at: string;
|
|
62
|
+
updated_at: string;
|
|
63
|
+
metadata: string | null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 타입 가드: RelationRow인지 확인
|
|
67
|
+
*
|
|
68
|
+
* @param value 확인할 값
|
|
69
|
+
* @returns RelationRow 여부
|
|
70
|
+
*/
|
|
71
|
+
export declare function isRelationRow(value: unknown): value is RelationRow;
|
|
72
|
+
/**
|
|
73
|
+
* 기존 관계 행 타입
|
|
74
|
+
*/
|
|
75
|
+
export interface ExistingRelationRow {
|
|
76
|
+
id: number;
|
|
77
|
+
confidence: number;
|
|
78
|
+
metadata: string | null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 타입 가드: ExistingRelationRow인지 확인
|
|
82
|
+
*
|
|
83
|
+
* @param value 확인할 값
|
|
84
|
+
* @returns ExistingRelationRow 여부
|
|
85
|
+
*/
|
|
86
|
+
export declare function isExistingRelationRow(value: unknown): value is ExistingRelationRow;
|
|
87
|
+
/**
|
|
88
|
+
* 메타데이터 행 타입
|
|
89
|
+
*/
|
|
90
|
+
export interface MetadataRow {
|
|
91
|
+
metadata: string | null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 타입 가드: MetadataRow인지 확인
|
|
95
|
+
*
|
|
96
|
+
* @param value 확인할 값
|
|
97
|
+
* @returns MetadataRow 여부
|
|
98
|
+
*/
|
|
99
|
+
export declare function isMetadataRow(value: unknown): value is MetadataRow;
|
|
100
|
+
//# sourceMappingURL=type-guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-guards.d.ts","sourceRoot":"","sources":["../../src/utils/type-guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAa9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI,CAgDxE;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAelE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAUlF;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAMlE"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 타입 가드 유틸리티
|
|
3
|
+
* 데이터베이스 조회 결과의 타입 안전성을 보장하기 위한 타입 가드 함수들
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 타입 가드: MemoryRow인지 확인
|
|
7
|
+
*
|
|
8
|
+
* @param value 확인할 값
|
|
9
|
+
* @returns MemoryRow 여부
|
|
10
|
+
*/
|
|
11
|
+
export function isMemoryRow(value) {
|
|
12
|
+
if (!value || typeof value !== 'object') {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const row = value;
|
|
16
|
+
return (typeof row.id === 'string' &&
|
|
17
|
+
typeof row.type === 'string' &&
|
|
18
|
+
typeof row.content === 'string' &&
|
|
19
|
+
typeof row.importance === 'number' &&
|
|
20
|
+
typeof row.privacy_scope === 'string' &&
|
|
21
|
+
typeof row.created_at === 'string');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 타입 가드: MemoryType인지 확인
|
|
25
|
+
*
|
|
26
|
+
* @param value 확인할 값
|
|
27
|
+
* @returns MemoryType 여부
|
|
28
|
+
*/
|
|
29
|
+
export function isMemoryType(value) {
|
|
30
|
+
return value === 'working' || value === 'episodic' || value === 'semantic' || value === 'procedural';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 타입 가드: PrivacyScope인지 확인
|
|
34
|
+
*
|
|
35
|
+
* @param value 확인할 값
|
|
36
|
+
* @returns PrivacyScope 여부
|
|
37
|
+
*/
|
|
38
|
+
export function isPrivacyScope(value) {
|
|
39
|
+
return value === 'private' || value === 'team' || value === 'public';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* MemoryRow를 MemoryItem으로 변환
|
|
43
|
+
* 타입 안전성을 보장하며 변환합니다.
|
|
44
|
+
*
|
|
45
|
+
* @param row 데이터베이스 행
|
|
46
|
+
* @returns MemoryItem 또는 null (타입 검증 실패 시)
|
|
47
|
+
*/
|
|
48
|
+
export function convertMemoryRowToItem(row) {
|
|
49
|
+
// 타입 검증
|
|
50
|
+
if (!isMemoryType(row.type)) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
if (!isPrivacyScope(row.privacy_scope)) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
// embedding 파싱 (JSON 배열 문자열인 경우)
|
|
57
|
+
let embedding;
|
|
58
|
+
if (row.embedding) {
|
|
59
|
+
try {
|
|
60
|
+
const parsed = JSON.parse(row.embedding);
|
|
61
|
+
if (Array.isArray(parsed) && parsed.every(v => typeof v === 'number')) {
|
|
62
|
+
embedding = parsed;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// 파싱 실패 시 무시
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// tags 파싱 (JSON 배열 문자열인 경우)
|
|
70
|
+
let tags;
|
|
71
|
+
if (row.tags) {
|
|
72
|
+
try {
|
|
73
|
+
const parsed = JSON.parse(row.tags);
|
|
74
|
+
if (Array.isArray(parsed) && parsed.every(v => typeof v === 'string')) {
|
|
75
|
+
tags = parsed;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// 파싱 실패 시 무시
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
id: row.id,
|
|
84
|
+
type: row.type,
|
|
85
|
+
content: row.content,
|
|
86
|
+
importance: row.importance,
|
|
87
|
+
privacy_scope: row.privacy_scope,
|
|
88
|
+
created_at: new Date(row.created_at),
|
|
89
|
+
last_accessed: row.last_accessed ? new Date(row.last_accessed) : undefined,
|
|
90
|
+
pinned: typeof row.pinned === 'boolean' ? row.pinned : Boolean(row.pinned),
|
|
91
|
+
tags,
|
|
92
|
+
source: row.source || undefined,
|
|
93
|
+
embedding
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 타입 가드: RelationRow인지 확인
|
|
98
|
+
*
|
|
99
|
+
* @param value 확인할 값
|
|
100
|
+
* @returns RelationRow 여부
|
|
101
|
+
*/
|
|
102
|
+
export function isRelationRow(value) {
|
|
103
|
+
if (!value || typeof value !== 'object') {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const row = value;
|
|
107
|
+
return (typeof row.id === 'number' &&
|
|
108
|
+
typeof row.source_id === 'string' &&
|
|
109
|
+
typeof row.target_id === 'string' &&
|
|
110
|
+
typeof row.relation_type === 'string' &&
|
|
111
|
+
typeof row.confidence === 'number' &&
|
|
112
|
+
typeof row.created_at === 'string' &&
|
|
113
|
+
typeof row.updated_at === 'string' &&
|
|
114
|
+
(row.metadata === null || typeof row.metadata === 'string'));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 타입 가드: ExistingRelationRow인지 확인
|
|
118
|
+
*
|
|
119
|
+
* @param value 확인할 값
|
|
120
|
+
* @returns ExistingRelationRow 여부
|
|
121
|
+
*/
|
|
122
|
+
export function isExistingRelationRow(value) {
|
|
123
|
+
if (!value || typeof value !== 'object') {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const row = value;
|
|
127
|
+
return (typeof row.id === 'number' &&
|
|
128
|
+
typeof row.confidence === 'number' &&
|
|
129
|
+
(row.metadata === null || typeof row.metadata === 'string'));
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 타입 가드: MetadataRow인지 확인
|
|
133
|
+
*
|
|
134
|
+
* @param value 확인할 값
|
|
135
|
+
* @returns MetadataRow 여부
|
|
136
|
+
*/
|
|
137
|
+
export function isMetadataRow(value) {
|
|
138
|
+
if (!value || typeof value !== 'object') {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
const row = value;
|
|
142
|
+
return row.metadata === null || typeof row.metadata === 'string';
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=type-guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-guards.js","sourceRoot":"","sources":["../../src/utils/type-guards.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.12.0-a1",
|
|
4
4
|
"description": "AI Agent 기억 보조 MCP 서버 - 사람의 기억 구조를 모사한 스토리지+검색+요약+망각 메커니즘",
|
|
5
5
|
"main": "dist/server/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
"db:migrate": "tsx src/database/migrate.ts",
|
|
28
28
|
"db:check-migration": "tsx src/scripts/check-migration-status.ts",
|
|
29
29
|
"db:check-migration:help": "echo 'Usage: npm run db:check-migration [database-path]'",
|
|
30
|
+
"generate-relation-report": "tsx scripts/generate-relation-report.ts",
|
|
31
|
+
"weekly-relation-validation": "tsx scripts/weekly-relation-validation.ts",
|
|
30
32
|
"test:client": "tsx src/test/test-client.ts",
|
|
31
33
|
"test:http-v2": "tsx src/test/test-http-server-v2.ts",
|
|
32
34
|
"test:search": "tsx src/test/test-search.ts",
|
|
@@ -89,6 +91,7 @@
|
|
|
89
91
|
"dependencies": {
|
|
90
92
|
"@google/genai": "^1.21.0",
|
|
91
93
|
"@google/generative-ai": "^0.24.1",
|
|
94
|
+
"@iarna/toml": "^2.2.5",
|
|
92
95
|
"@modelcontextprotocol/sdk": "^1.18.2",
|
|
93
96
|
"@xenova/transformers": "^2.17.2",
|
|
94
97
|
"axios": "^1.12.2",
|
|
@@ -121,8 +124,10 @@
|
|
|
121
124
|
"vitest": "^1.0.0"
|
|
122
125
|
},
|
|
123
126
|
"engines": {
|
|
124
|
-
"node": ">=20.0.0"
|
|
127
|
+
"node": ">=20.0.0",
|
|
128
|
+
"npm": ">=10.0.0"
|
|
125
129
|
},
|
|
130
|
+
"packageManager": "npm@>=10.0.0",
|
|
126
131
|
"repository": {
|
|
127
132
|
"type": "git",
|
|
128
133
|
"url": "git+https://github.com/jee1/memento.git"
|