memento-mcp-server 1.11.1 → 1.12.0-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 (124) hide show
  1. package/README.en.md +21 -6
  2. package/README.md +38 -7
  3. package/dist/algorithms/hybrid-search-engine.d.ts +34 -1
  4. package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -1
  5. package/dist/algorithms/hybrid-search-engine.js +186 -17
  6. package/dist/algorithms/hybrid-search-engine.js.map +1 -1
  7. package/dist/algorithms/search-ranking.d.ts +15 -1
  8. package/dist/algorithms/search-ranking.d.ts.map +1 -1
  9. package/dist/algorithms/search-ranking.js +41 -4
  10. package/dist/algorithms/search-ranking.js.map +1 -1
  11. package/dist/config/environment.d.ts.map +1 -1
  12. package/dist/config/environment.js +4 -0
  13. package/dist/config/environment.js.map +1 -1
  14. package/dist/config/index.d.ts.map +1 -1
  15. package/dist/config/index.js +6 -0
  16. package/dist/config/index.js.map +1 -1
  17. package/dist/config/ranking-weights-loader.d.ts +37 -0
  18. package/dist/config/ranking-weights-loader.d.ts.map +1 -0
  19. package/dist/config/ranking-weights-loader.js +109 -0
  20. package/dist/config/ranking-weights-loader.js.map +1 -0
  21. package/dist/constants/relation-constants.d.ts +95 -0
  22. package/dist/constants/relation-constants.d.ts.map +1 -0
  23. package/dist/constants/relation-constants.js +95 -0
  24. package/dist/constants/relation-constants.js.map +1 -0
  25. package/dist/database/migration/migrations/005-relation-engine-schema.d.ts +65 -0
  26. package/dist/database/migration/migrations/005-relation-engine-schema.d.ts.map +1 -0
  27. package/dist/database/migration/migrations/005-relation-engine-schema.js +295 -0
  28. package/dist/database/migration/migrations/005-relation-engine-schema.js.map +1 -0
  29. package/dist/database/migration/migrations/005-relation-engine-schema.sql +64 -0
  30. package/dist/services/anchor/anchor-interfaces.d.ts +1 -0
  31. package/dist/services/anchor/anchor-interfaces.d.ts.map +1 -1
  32. package/dist/services/anchor/anchor-interfaces.js.map +1 -1
  33. package/dist/services/anchor/anchor-search-service.d.ts +16 -0
  34. package/dist/services/anchor/anchor-search-service.d.ts.map +1 -1
  35. package/dist/services/anchor/anchor-search-service.js +136 -17
  36. package/dist/services/anchor/anchor-search-service.js.map +1 -1
  37. package/dist/services/batch-scheduler.d.ts +11 -0
  38. package/dist/services/batch-scheduler.d.ts.map +1 -1
  39. package/dist/services/batch-scheduler.js +99 -0
  40. package/dist/services/batch-scheduler.js.map +1 -1
  41. package/dist/services/llm-based-relation-extractor.d.ts +156 -0
  42. package/dist/services/llm-based-relation-extractor.d.ts.map +1 -0
  43. package/dist/services/llm-based-relation-extractor.js +1350 -0
  44. package/dist/services/llm-based-relation-extractor.js.map +1 -0
  45. package/dist/services/relation-extractor.d.ts +73 -0
  46. package/dist/services/relation-extractor.d.ts.map +1 -0
  47. package/dist/services/relation-extractor.js +231 -0
  48. package/dist/services/relation-extractor.js.map +1 -0
  49. package/dist/services/relation-graph.d.ts +275 -0
  50. package/dist/services/relation-graph.d.ts.map +1 -0
  51. package/dist/services/relation-graph.js +869 -0
  52. package/dist/services/relation-graph.js.map +1 -0
  53. package/dist/services/relation-quality-validator.d.ts +211 -0
  54. package/dist/services/relation-quality-validator.d.ts.map +1 -0
  55. package/dist/services/relation-quality-validator.js +415 -0
  56. package/dist/services/relation-quality-validator.js.map +1 -0
  57. package/dist/services/rule-based-relation-extractor.d.ts +66 -0
  58. package/dist/services/rule-based-relation-extractor.d.ts.map +1 -0
  59. package/dist/services/rule-based-relation-extractor.js +258 -0
  60. package/dist/services/rule-based-relation-extractor.js.map +1 -0
  61. package/dist/tools/add-relation-tool.d.ts +34 -0
  62. package/dist/tools/add-relation-tool.d.ts.map +1 -0
  63. package/dist/tools/add-relation-tool.js +163 -0
  64. package/dist/tools/add-relation-tool.js.map +1 -0
  65. package/dist/tools/extract-relations-tool.d.ts +28 -0
  66. package/dist/tools/extract-relations-tool.d.ts.map +1 -0
  67. package/dist/tools/extract-relations-tool.js +159 -0
  68. package/dist/tools/extract-relations-tool.js.map +1 -0
  69. package/dist/tools/get-relations-tool.d.ts +34 -0
  70. package/dist/tools/get-relations-tool.d.ts.map +1 -0
  71. package/dist/tools/get-relations-tool.js +155 -0
  72. package/dist/tools/get-relations-tool.js.map +1 -0
  73. package/dist/tools/index.d.ts +6 -1
  74. package/dist/tools/index.d.ts.map +1 -1
  75. package/dist/tools/index.js +16 -2
  76. package/dist/tools/index.js.map +1 -1
  77. package/dist/tools/remember-tool.d.ts +17 -0
  78. package/dist/tools/remember-tool.d.ts.map +1 -1
  79. package/dist/tools/remember-tool.js +195 -26
  80. package/dist/tools/remember-tool.js.map +1 -1
  81. package/dist/tools/remove-relation-tool.d.ts +45 -0
  82. package/dist/tools/remove-relation-tool.d.ts.map +1 -0
  83. package/dist/tools/remove-relation-tool.js +142 -0
  84. package/dist/tools/remove-relation-tool.js.map +1 -0
  85. package/dist/tools/search-local-tool.d.ts.map +1 -1
  86. package/dist/tools/search-local-tool.js +10 -3
  87. package/dist/tools/search-local-tool.js.map +1 -1
  88. package/dist/tools/types.d.ts +2 -0
  89. package/dist/tools/types.d.ts.map +1 -1
  90. package/dist/tools/types.js.map +1 -1
  91. package/dist/tools/visualize-relations-tool.d.ts +46 -0
  92. package/dist/tools/visualize-relations-tool.d.ts.map +1 -0
  93. package/dist/tools/visualize-relations-tool.js +157 -0
  94. package/dist/tools/visualize-relations-tool.js.map +1 -0
  95. package/dist/types/index.d.ts +8 -0
  96. package/dist/types/index.d.ts.map +1 -1
  97. package/dist/types/index.js +1 -0
  98. package/dist/types/index.js.map +1 -1
  99. package/dist/types/relation-graph.d.ts +215 -0
  100. package/dist/types/relation-graph.d.ts.map +1 -0
  101. package/dist/types/relation-graph.js +6 -0
  102. package/dist/types/relation-graph.js.map +1 -0
  103. package/dist/types/relation.d.ts +112 -0
  104. package/dist/types/relation.d.ts.map +1 -0
  105. package/dist/types/relation.js +67 -0
  106. package/dist/types/relation.js.map +1 -0
  107. package/dist/utils/cache-key-generator.d.ts +63 -0
  108. package/dist/utils/cache-key-generator.d.ts.map +1 -0
  109. package/dist/utils/cache-key-generator.js +76 -0
  110. package/dist/utils/cache-key-generator.js.map +1 -0
  111. package/dist/utils/database.d.ts.map +1 -1
  112. package/dist/utils/database.js +37 -17
  113. package/dist/utils/database.js.map +1 -1
  114. package/dist/utils/relation-visualizer.d.ts +81 -0
  115. package/dist/utils/relation-visualizer.d.ts.map +1 -0
  116. package/dist/utils/relation-visualizer.js +239 -0
  117. package/dist/utils/relation-visualizer.js.map +1 -0
  118. package/dist/utils/type-guards.d.ts +100 -0
  119. package/dist/utils/type-guards.d.ts.map +1 -0
  120. package/dist/utils/type-guards.js +144 -0
  121. package/dist/utils/type-guards.js.map +1 -0
  122. package/package.json +7 -2
  123. package/scripts/generate-relation-report.ts +481 -0
  124. 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":"AAAA;;;GAGG;AAsBH;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAC1B,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAClC,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ;QACrC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CACnC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,YAAY,CAAC;AACvG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAc;IACnD,QAAQ;IACR,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iCAAiC;IACjC,IAAI,SAA+B,CAAC;IACpC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACtE,SAAS,GAAG,MAAM,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,IAA0B,CAAC;IAC/B,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;gBACtE,IAAI,GAAG,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;QACpC,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1E,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1E,IAAI;QACJ,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;QAC/B,SAAS;KACV,CAAC;AACJ,CAAC;AAgBD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAC1B,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACjC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACjC,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ;QACrC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAClC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAClC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAClC,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAC5D,CAAC;AACJ,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAC1B,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;QAClC,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAC5D,CAAC;AACJ,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACnE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memento-mcp-server",
3
- "version": "1.11.1",
3
+ "version": "1.12.0-a",
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"