memento-mcp-server 1.14.0-b → 1.15.0-c

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 (81) hide show
  1. package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.d.ts +18 -0
  2. package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.d.ts.map +1 -0
  3. package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.js +346 -0
  4. package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.js.map +1 -0
  5. package/dist/domains/memory/tools/recall-tool.d.ts +177 -0
  6. package/dist/domains/memory/tools/recall-tool.d.ts.map +1 -1
  7. package/dist/domains/memory/tools/recall-tool.js +329 -3
  8. package/dist/domains/memory/tools/recall-tool.js.map +1 -1
  9. package/dist/domains/memory/tools/remember-tool.d.ts.map +1 -1
  10. package/dist/domains/memory/tools/remember-tool.js +182 -1
  11. package/dist/domains/memory/tools/remember-tool.js.map +1 -1
  12. package/dist/infrastructure/database/database/migration/migrations/005-relation-engine-schema.sql +7 -7
  13. package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.d.ts +65 -0
  14. package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.d.ts.map +1 -0
  15. package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.js +250 -0
  16. package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.js.map +1 -0
  17. package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.sql +86 -0
  18. package/dist/infrastructure/logging/triple-extraction-logger.d.ts +92 -0
  19. package/dist/infrastructure/logging/triple-extraction-logger.d.ts.map +1 -0
  20. package/dist/infrastructure/logging/triple-extraction-logger.js +194 -0
  21. package/dist/infrastructure/logging/triple-extraction-logger.js.map +1 -0
  22. package/dist/infrastructure/scheduler/batch-scheduler.d.ts +57 -0
  23. package/dist/infrastructure/scheduler/batch-scheduler.d.ts.map +1 -1
  24. package/dist/infrastructure/scheduler/batch-scheduler.js +220 -0
  25. package/dist/infrastructure/scheduler/batch-scheduler.js.map +1 -1
  26. package/dist/infrastructure/scheduler/jobs/triple-extraction-batch-job.d.ts +194 -0
  27. package/dist/infrastructure/scheduler/jobs/triple-extraction-batch-job.d.ts.map +1 -0
  28. package/dist/infrastructure/scheduler/jobs/triple-extraction-batch-job.js +639 -0
  29. package/dist/infrastructure/scheduler/jobs/triple-extraction-batch-job.js.map +1 -0
  30. package/dist/services/semantic-memory/semantic-memory-statistics.d.ts +64 -0
  31. package/dist/services/semantic-memory/semantic-memory-statistics.d.ts.map +1 -0
  32. package/dist/services/semantic-memory/semantic-memory-statistics.js +113 -0
  33. package/dist/services/semantic-memory/semantic-memory-statistics.js.map +1 -0
  34. package/dist/services/semantic-memory/semantic-memory-update-service.d.ts +257 -0
  35. package/dist/services/semantic-memory/semantic-memory-update-service.d.ts.map +1 -0
  36. package/dist/services/semantic-memory/semantic-memory-update-service.js +696 -0
  37. package/dist/services/semantic-memory/semantic-memory-update-service.js.map +1 -0
  38. package/dist/services/triple-extraction/entity-linker.d.ts +55 -0
  39. package/dist/services/triple-extraction/entity-linker.d.ts.map +1 -0
  40. package/dist/services/triple-extraction/entity-linker.js +154 -0
  41. package/dist/services/triple-extraction/entity-linker.js.map +1 -0
  42. package/dist/services/triple-extraction/predicate-canonicalizer.d.ts +63 -0
  43. package/dist/services/triple-extraction/predicate-canonicalizer.d.ts.map +1 -0
  44. package/dist/services/triple-extraction/predicate-canonicalizer.js +166 -0
  45. package/dist/services/triple-extraction/predicate-canonicalizer.js.map +1 -0
  46. package/dist/services/triple-extraction/triple-extraction-service.d.ts +181 -0
  47. package/dist/services/triple-extraction/triple-extraction-service.d.ts.map +1 -0
  48. package/dist/services/triple-extraction/triple-extraction-service.js +907 -0
  49. package/dist/services/triple-extraction/triple-extraction-service.js.map +1 -0
  50. package/dist/services/triple-extraction/triple-extraction-statistics.d.ts +74 -0
  51. package/dist/services/triple-extraction/triple-extraction-statistics.d.ts.map +1 -0
  52. package/dist/services/triple-extraction/triple-extraction-statistics.js +146 -0
  53. package/dist/services/triple-extraction/triple-extraction-statistics.js.map +1 -0
  54. package/dist/shared/types/index.d.ts +1 -0
  55. package/dist/shared/types/index.d.ts.map +1 -1
  56. package/dist/shared/types/index.js.map +1 -1
  57. package/dist/shared/types/triple-extraction.d.ts +99 -0
  58. package/dist/shared/types/triple-extraction.d.ts.map +1 -0
  59. package/dist/shared/types/triple-extraction.js +6 -0
  60. package/dist/shared/types/triple-extraction.js.map +1 -0
  61. package/dist/shared/utils/pii-masker.d.ts +67 -0
  62. package/dist/shared/utils/pii-masker.d.ts.map +1 -0
  63. package/dist/shared/utils/pii-masker.js +205 -0
  64. package/dist/shared/utils/pii-masker.js.map +1 -0
  65. package/dist/shared/utils/prompt-template-loader.d.ts +42 -0
  66. package/dist/shared/utils/prompt-template-loader.d.ts.map +1 -0
  67. package/dist/shared/utils/prompt-template-loader.js +92 -0
  68. package/dist/shared/utils/prompt-template-loader.js.map +1 -0
  69. package/dist/shared/utils/triple-cache.d.ts +90 -0
  70. package/dist/shared/utils/triple-cache.d.ts.map +1 -0
  71. package/dist/shared/utils/triple-cache.js +124 -0
  72. package/dist/shared/utils/triple-cache.js.map +1 -0
  73. package/dist/tools/index.d.ts +2 -1
  74. package/dist/tools/index.d.ts.map +1 -1
  75. package/dist/tools/index.js +3 -1
  76. package/dist/tools/index.js.map +1 -1
  77. package/dist/tools/types.d.ts +1 -0
  78. package/dist/tools/types.d.ts.map +1 -1
  79. package/dist/tools/types.js +2 -0
  80. package/dist/tools/types.js.map +1 -1
  81. package/package.json +1 -1
@@ -0,0 +1,205 @@
1
+ /**
2
+ * PII (Personally Identifiable Information) 마스킹 유틸리티
3
+ *
4
+ * 로그 파일에 저장되는 rawLLMOutput에서 민감한 정보를 마스킹합니다.
5
+ *
6
+ * 마스킹 대상:
7
+ * - 이메일 주소
8
+ * - 전화번호
9
+ * - API 키
10
+ * - 비밀번호
11
+ * - 토큰 (Bearer, JWT 등)
12
+ * - 기타 credential 정보
13
+ *
14
+ * 보안 정책:
15
+ * - 모든 민감 정보는 [TYPE] 형식으로 마스킹
16
+ * - 원본 정보는 복구 불가능하도록 완전히 제거
17
+ */
18
+ /**
19
+ * PII 마스킹기
20
+ */
21
+ export class PIIMasker {
22
+ /**
23
+ * 텍스트에서 모든 PII를 마스킹합니다.
24
+ *
25
+ * @param text 원본 텍스트
26
+ * @param options 마스킹 옵션
27
+ * @returns 마스킹 결과
28
+ */
29
+ static mask(text, options = {}) {
30
+ if (!text || typeof text !== 'string') {
31
+ return {
32
+ masked: text || '',
33
+ maskedCount: 0,
34
+ maskedTypes: []
35
+ };
36
+ }
37
+ const usePlaceholder = options.usePlaceholder !== false;
38
+ const types = options.types || ['email', 'phone', 'api_key', 'password', 'token', 'credential'];
39
+ let masked = text;
40
+ const maskedTypes = [];
41
+ let totalMaskedCount = 0;
42
+ // 이메일 주소 마스킹
43
+ if (types.includes('email')) {
44
+ const emailPattern = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g;
45
+ const emailMatches = masked.match(emailPattern);
46
+ if (emailMatches) {
47
+ masked = masked.replace(emailPattern, usePlaceholder ? '[EMAIL]' : '');
48
+ maskedTypes.push('email');
49
+ totalMaskedCount += emailMatches.length;
50
+ }
51
+ }
52
+ // 전화번호 마스킹 (한국 형식 포함)
53
+ if (types.includes('phone')) {
54
+ // 한국 전화번호: 010-1234-5678, 01012345678, +82-10-1234-5678 등
55
+ const koreanPhonePattern = /(\+82[-.\s]?)?0?1[0-9]{1}[-.\s]?[0-9]{3,4}[-.\s]?[0-9]{4}/g;
56
+ const koreanMatches = masked.match(koreanPhonePattern);
57
+ if (koreanMatches) {
58
+ masked = masked.replace(koreanPhonePattern, usePlaceholder ? '[PHONE]' : '');
59
+ if (!maskedTypes.includes('phone')) {
60
+ maskedTypes.push('phone');
61
+ }
62
+ totalMaskedCount += koreanMatches.length;
63
+ }
64
+ // 국제 전화번호: +1-234-567-8900 등
65
+ const internationalPhonePattern = /\+\d{1,3}[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}/g;
66
+ const internationalMatches = masked.match(internationalPhonePattern);
67
+ if (internationalMatches) {
68
+ masked = masked.replace(internationalPhonePattern, usePlaceholder ? '[PHONE]' : '');
69
+ if (!maskedTypes.includes('phone')) {
70
+ maskedTypes.push('phone');
71
+ }
72
+ totalMaskedCount += internationalMatches.length;
73
+ }
74
+ }
75
+ // API 키 마스킹
76
+ if (types.includes('api_key')) {
77
+ // OpenAI API 키: sk-... 또는 sk-proj-...
78
+ const openaiKeyPattern = /sk-[a-zA-Z0-9]{32,}/g;
79
+ const openaiMatches = masked.match(openaiKeyPattern);
80
+ if (openaiMatches) {
81
+ masked = masked.replace(openaiKeyPattern, usePlaceholder ? '[API_KEY]' : '');
82
+ if (!maskedTypes.includes('api_key')) {
83
+ maskedTypes.push('api_key');
84
+ }
85
+ totalMaskedCount += openaiMatches.length;
86
+ }
87
+ // Google API 키: AIza...
88
+ const googleKeyPattern = /AIza[0-9A-Za-z_-]{35}/g;
89
+ const googleMatches = masked.match(googleKeyPattern);
90
+ if (googleMatches) {
91
+ masked = masked.replace(googleKeyPattern, usePlaceholder ? '[API_KEY]' : '');
92
+ if (!maskedTypes.includes('api_key')) {
93
+ maskedTypes.push('api_key');
94
+ }
95
+ totalMaskedCount += googleMatches.length;
96
+ }
97
+ // 일반 API 키 패턴: api_key=..., apikey=... 등
98
+ const generalApiKeyPattern = /\b(api[_-]?key|apikey)[=:]\s*[a-zA-Z0-9_-]{20,}/gi;
99
+ const generalMatches = masked.match(generalApiKeyPattern);
100
+ if (generalMatches) {
101
+ masked = masked.replace(generalApiKeyPattern, (match) => {
102
+ const prefix = match.match(/^[^=:]+[=:]\s*/)?.[0] || '';
103
+ return prefix + (usePlaceholder ? '[API_KEY]' : '');
104
+ });
105
+ if (!maskedTypes.includes('api_key')) {
106
+ maskedTypes.push('api_key');
107
+ }
108
+ totalMaskedCount += generalMatches.length;
109
+ }
110
+ }
111
+ // 비밀번호 마스킹
112
+ if (types.includes('password')) {
113
+ const passwordPattern = /\b(password|pwd|passwd)[=:]\s*[^\s&"']+/gi;
114
+ const passwordMatches = masked.match(passwordPattern);
115
+ if (passwordMatches) {
116
+ masked = masked.replace(passwordPattern, (match) => {
117
+ const prefix = match.match(/^[^=:]+[=:]\s*/)?.[0] || '';
118
+ return prefix + (usePlaceholder ? '[PASSWORD]' : '');
119
+ });
120
+ maskedTypes.push('password');
121
+ totalMaskedCount += passwordMatches.length;
122
+ }
123
+ }
124
+ // 토큰 마스킹 (Bearer, JWT 등)
125
+ if (types.includes('token')) {
126
+ // Bearer 토큰
127
+ const bearerTokenPattern = /\b(bearer|token)[=:]\s*[a-zA-Z0-9._-]{20,}/gi;
128
+ const bearerMatches = masked.match(bearerTokenPattern);
129
+ if (bearerMatches) {
130
+ masked = masked.replace(bearerTokenPattern, (match) => {
131
+ const prefix = match.match(/^[^=:]+[=:]\s*/)?.[0] || '';
132
+ return prefix + (usePlaceholder ? '[TOKEN]' : '');
133
+ });
134
+ maskedTypes.push('token');
135
+ totalMaskedCount += bearerMatches.length;
136
+ }
137
+ // JWT 토큰 (xxx.yyy.zzz 형식)
138
+ const jwtPattern = /\beyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;
139
+ const jwtMatches = masked.match(jwtPattern);
140
+ if (jwtMatches) {
141
+ masked = masked.replace(jwtPattern, usePlaceholder ? '[JWT_TOKEN]' : '');
142
+ if (!maskedTypes.includes('token')) {
143
+ maskedTypes.push('token');
144
+ }
145
+ totalMaskedCount += jwtMatches.length;
146
+ }
147
+ }
148
+ // 기타 credential 정보 마스킹
149
+ if (types.includes('credential')) {
150
+ // secret=..., key=..., token=... 등 (이미 마스킹된 것은 제외)
151
+ const credentialPattern = /\b(secret|key|token|credential)[=:]\s*[a-zA-Z0-9._-]{10,}/gi;
152
+ const credentialMatches = masked.match(credentialPattern);
153
+ if (credentialMatches) {
154
+ // 이미 마스킹된 패턴은 제외 (예: [API_KEY], [TOKEN] 등)
155
+ const filteredMatches = credentialMatches.filter(match => !match.includes('[API_KEY]') &&
156
+ !match.includes('[TOKEN]') &&
157
+ !match.includes('[PASSWORD]'));
158
+ if (filteredMatches.length > 0) {
159
+ masked = masked.replace(credentialPattern, (match) => {
160
+ // 이미 마스킹된 것은 건너뛰기
161
+ if (match.includes('[') && match.includes(']')) {
162
+ return match;
163
+ }
164
+ const prefix = match.match(/^[^=:]+[=:]\s*/)?.[0] || '';
165
+ return prefix + (usePlaceholder ? '[CREDENTIAL]' : '');
166
+ });
167
+ maskedTypes.push('credential');
168
+ totalMaskedCount += filteredMatches.length;
169
+ }
170
+ }
171
+ }
172
+ return {
173
+ masked,
174
+ maskedCount: totalMaskedCount,
175
+ maskedTypes: [...new Set(maskedTypes)] // 중복 제거
176
+ };
177
+ }
178
+ /**
179
+ * 텍스트에 PII가 포함되어 있는지 확인합니다.
180
+ *
181
+ * @param text 확인할 텍스트
182
+ * @returns PII 포함 여부
183
+ */
184
+ static hasPII(text) {
185
+ if (!text || typeof text !== 'string') {
186
+ return false;
187
+ }
188
+ const result = this.mask(text, { usePlaceholder: false });
189
+ return result.maskedCount > 0;
190
+ }
191
+ /**
192
+ * 텍스트에서 마스킹된 PII 타입 목록을 반환합니다.
193
+ *
194
+ * @param text 확인할 텍스트
195
+ * @returns 마스킹된 타입 목록
196
+ */
197
+ static detectPIITypes(text) {
198
+ if (!text || typeof text !== 'string') {
199
+ return [];
200
+ }
201
+ const result = this.mask(text, { usePlaceholder: false });
202
+ return result.maskedTypes;
203
+ }
204
+ }
205
+ //# sourceMappingURL=pii-masker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii-masker.js","sourceRoot":"","sources":["../../../src/shared/utils/pii-masker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 프롬프트 템플릿 로더 유틸리티
3
+ * prompts/ 디렉토리에서 템플릿 파일을 읽고 플레이스홀더를 치환합니다.
4
+ */
5
+ /**
6
+ * 프롬프트 템플릿 로더
7
+ */
8
+ export declare class PromptTemplateLoader {
9
+ /**
10
+ * 템플릿 파일 로드
11
+ *
12
+ * @param templateName 템플릿 파일명 (예: 'triple-extraction')
13
+ * @returns 템플릿 내용
14
+ * @throws 파일이 없거나 읽을 수 없는 경우 에러 발생
15
+ */
16
+ static loadTemplate(templateName: string): string;
17
+ /**
18
+ * 템플릿에 변수 치환
19
+ *
20
+ * @param template 템플릿 문자열
21
+ * @param variables 변수 객체 (예: { observation: '...' })
22
+ * @returns 치환된 템플릿
23
+ */
24
+ static renderTemplate(template: string, variables: Record<string, string>): string;
25
+ /**
26
+ * 템플릿 파일을 로드하고 변수 치환
27
+ *
28
+ * @param templateName 템플릿 파일명
29
+ * @param variables 변수 객체
30
+ * @returns 치환된 프롬프트
31
+ */
32
+ static loadAndRender(templateName: string, variables: Record<string, string>): string;
33
+ /**
34
+ * 캐시 초기화 (테스트용)
35
+ */
36
+ static clearCache(): void;
37
+ /**
38
+ * 템플릿 파일 경로 확인 (테스트용)
39
+ */
40
+ static getTemplatePath(templateName: string): string;
41
+ }
42
+ //# sourceMappingURL=prompt-template-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-template-loader.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/prompt-template-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH;;GAEG;AACH,qBAAa,oBAAoB;IAC/B;;;;;;OAMG;IACH,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAyBjD;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAYlF;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAKrF;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;CAGrD"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * 프롬프트 템플릿 로더 유틸리티
3
+ * prompts/ 디렉토리에서 템플릿 파일을 읽고 플레이스홀더를 치환합니다.
4
+ */
5
+ import { readFileSync } from 'fs';
6
+ import { join, dirname } from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ /**
11
+ * 프로젝트 루트 디렉토리 경로
12
+ * src/shared/utils/에서 prompts/로 가려면 ../../prompts/
13
+ */
14
+ const PROJECT_ROOT = join(__dirname, '../../..');
15
+ const PROMPTS_DIR = join(PROJECT_ROOT, 'prompts');
16
+ /**
17
+ * 템플릿 캐시 (메모리 캐시)
18
+ */
19
+ const templateCache = new Map();
20
+ /**
21
+ * 프롬프트 템플릿 로더
22
+ */
23
+ export class PromptTemplateLoader {
24
+ /**
25
+ * 템플릿 파일 로드
26
+ *
27
+ * @param templateName 템플릿 파일명 (예: 'triple-extraction')
28
+ * @returns 템플릿 내용
29
+ * @throws 파일이 없거나 읽을 수 없는 경우 에러 발생
30
+ */
31
+ static loadTemplate(templateName) {
32
+ // 캐시 확인
33
+ if (templateCache.has(templateName)) {
34
+ return templateCache.get(templateName);
35
+ }
36
+ // 파일 경로 구성
37
+ const templatePath = join(PROMPTS_DIR, `${templateName}.txt`);
38
+ try {
39
+ // 파일 읽기
40
+ const content = readFileSync(templatePath, 'utf-8');
41
+ // 캐시에 저장
42
+ templateCache.set(templateName, content);
43
+ return content;
44
+ }
45
+ catch (error) {
46
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
47
+ throw new Error(`프롬프트 템플릿 파일을 찾을 수 없습니다: ${templatePath}`);
48
+ }
49
+ throw new Error(`프롬프트 템플릿 파일 읽기 실패: ${error instanceof Error ? error.message : String(error)}`);
50
+ }
51
+ }
52
+ /**
53
+ * 템플릿에 변수 치환
54
+ *
55
+ * @param template 템플릿 문자열
56
+ * @param variables 변수 객체 (예: { observation: '...' })
57
+ * @returns 치환된 템플릿
58
+ */
59
+ static renderTemplate(template, variables) {
60
+ let rendered = template;
61
+ // {variable} 형태의 플레이스홀더를 변수 값으로 치환
62
+ for (const [key, value] of Object.entries(variables)) {
63
+ const placeholder = `{${key}}`;
64
+ rendered = rendered.replace(new RegExp(placeholder.replace(/[{}]/g, '\\$&'), 'g'), value);
65
+ }
66
+ return rendered;
67
+ }
68
+ /**
69
+ * 템플릿 파일을 로드하고 변수 치환
70
+ *
71
+ * @param templateName 템플릿 파일명
72
+ * @param variables 변수 객체
73
+ * @returns 치환된 프롬프트
74
+ */
75
+ static loadAndRender(templateName, variables) {
76
+ const template = this.loadTemplate(templateName);
77
+ return this.renderTemplate(template, variables);
78
+ }
79
+ /**
80
+ * 캐시 초기화 (테스트용)
81
+ */
82
+ static clearCache() {
83
+ templateCache.clear();
84
+ }
85
+ /**
86
+ * 템플릿 파일 경로 확인 (테스트용)
87
+ */
88
+ static getTemplatePath(templateName) {
89
+ return join(PROMPTS_DIR, `${templateName}.txt`);
90
+ }
91
+ }
92
+ //# sourceMappingURL=prompt-template-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-template-loader.js","sourceRoot":"","sources":["../../../src/shared/utils/prompt-template-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;GAGG;AACH,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AAElD;;GAEG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAC/B;;;;;;OAMG;IACH,MAAM,CAAC,YAAY,CAAC,YAAoB;QACtC,QAAQ;QACR,IAAI,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,OAAO,aAAa,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC;QAC1C,CAAC;QAED,WAAW;QACX,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,YAAY,MAAM,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,QAAQ;YACR,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAEpD,SAAS;YACT,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzE,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,QAAgB,EAAE,SAAiC;QACvE,IAAI,QAAQ,GAAG,QAAQ,CAAC;QAExB,mCAAmC;QACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,IAAI,GAAG,GAAG,CAAC;YAC/B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5F,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAAC,YAAoB,EAAE,SAAiC;QAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU;QACf,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,YAAoB;QACzC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,YAAY,MAAM,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Triple 추출 결과 캐시 서비스
3
+ *
4
+ * PRD 7.3: 캐싱 (TTL 조정 및 설정 가능)
5
+ * - 동일한 content에 대한 Triple 추출 결과 캐싱
6
+ * - 캐시 키: content의 해시값 (content_hash)
7
+ * - 캐싱 TTL: 6시간 (기본값, 설정 가능)
8
+ * - 캐시 크기: 100개 항목 (설정 가능)
9
+ * - LRU 캐시 활용
10
+ */
11
+ import type { TripleExtractionResult } from '../types/triple-extraction.js';
12
+ /**
13
+ * Triple 추출 결과 캐시 서비스
14
+ */
15
+ export declare class TripleCacheService {
16
+ private cache;
17
+ private readonly defaultTTL;
18
+ private readonly maxSize;
19
+ /**
20
+ * @param maxSize 최대 캐시 크기 (기본값: 100)
21
+ * @param ttl TTL (밀리초, 기본값: 6시간)
22
+ */
23
+ constructor(maxSize?: number, ttl?: number);
24
+ /**
25
+ * 캐시 키 생성 (content_hash 기반)
26
+ *
27
+ * PRD 6.12: 캐시 키 생성 로직 구현
28
+ * - content의 해시값을 사용하여 캐시 키 생성
29
+ * - SHA-256 해시 사용 (충돌 방지)
30
+ *
31
+ * @param content Episodic Memory의 content (observation 텍스트)
32
+ * @returns 캐시 키
33
+ */
34
+ generateCacheKey(content: string): string;
35
+ /**
36
+ * 캐시에서 Triple 추출 결과 가져오기
37
+ *
38
+ * PRD 6.14: TripleExtractionService에 캐싱 통합
39
+ * - 캐시 히트 시 LLM 호출 생략
40
+ *
41
+ * @param content Episodic Memory의 content
42
+ * @returns Triple 추출 결과 또는 null (캐시 미스)
43
+ */
44
+ get(content: string): TripleExtractionResult | null;
45
+ /**
46
+ * 캐시에 Triple 추출 결과 저장
47
+ *
48
+ * PRD 6.14: TripleExtractionService에 캐싱 통합
49
+ * - 성공한 Triple 추출 결과만 캐시에 저장
50
+ *
51
+ * @param content Episodic Memory의 content
52
+ * @param result Triple 추출 결과
53
+ * @param ttl TTL (밀리초, 선택사항, 기본값 사용)
54
+ */
55
+ set(content: string, result: TripleExtractionResult, ttl?: number): void;
56
+ /**
57
+ * 캐시에서 항목 삭제
58
+ *
59
+ * @param content Episodic Memory의 content
60
+ * @returns 삭제 성공 여부
61
+ */
62
+ delete(content: string): boolean;
63
+ /**
64
+ * 캐시 비우기
65
+ */
66
+ clear(): void;
67
+ /**
68
+ * 캐시 통계 반환
69
+ *
70
+ * @returns 캐시 통계
71
+ */
72
+ getStats(): import("../../infrastructure/cache/cache-service.js").CacheStats;
73
+ /**
74
+ * TTL 기반 자동 무효화
75
+ *
76
+ * PRD 6.13: 캐시 TTL 기반 자동 무효화 구현
77
+ * - 만료된 항목 자동 제거
78
+ * - CacheService의 내장 TTL 체크 활용
79
+ *
80
+ * @returns 정리된 항목 수
81
+ */
82
+ cleanup(): number;
83
+ /**
84
+ * 캐시 크기 반환
85
+ *
86
+ * @returns 현재 캐시 크기
87
+ */
88
+ size(): number;
89
+ }
90
+ //# sourceMappingURL=triple-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triple-cache.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/triple-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAG5E;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC;;;OAGG;gBACS,OAAO,GAAE,MAAY,EAAE,GAAG,GAAE,MAA2B;IAMnE;;;;;;;;;OASG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAQzC;;;;;;;;OAQG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI;IAKnD;;;;;;;;;OASG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IASxE;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKhC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACH,QAAQ;IAIR;;;;;;;;OAQG;IACH,OAAO,IAAI,MAAM;IAMjB;;;;OAIG;IACH,IAAI,IAAI,MAAM;CAGf"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Triple 추출 결과 캐시 서비스
3
+ *
4
+ * PRD 7.3: 캐싱 (TTL 조정 및 설정 가능)
5
+ * - 동일한 content에 대한 Triple 추출 결과 캐싱
6
+ * - 캐시 키: content의 해시값 (content_hash)
7
+ * - 캐싱 TTL: 6시간 (기본값, 설정 가능)
8
+ * - 캐시 크기: 100개 항목 (설정 가능)
9
+ * - LRU 캐시 활용
10
+ */
11
+ import { CacheService } from '../../infrastructure/cache/cache-service.js';
12
+ import { createHash } from 'crypto';
13
+ /**
14
+ * Triple 추출 결과 캐시 서비스
15
+ */
16
+ export class TripleCacheService {
17
+ cache;
18
+ defaultTTL;
19
+ maxSize;
20
+ /**
21
+ * @param maxSize 최대 캐시 크기 (기본값: 100)
22
+ * @param ttl TTL (밀리초, 기본값: 6시간)
23
+ */
24
+ constructor(maxSize = 100, ttl = 6 * 60 * 60 * 1000) {
25
+ this.maxSize = maxSize;
26
+ this.defaultTTL = ttl;
27
+ this.cache = new CacheService(maxSize, ttl);
28
+ }
29
+ /**
30
+ * 캐시 키 생성 (content_hash 기반)
31
+ *
32
+ * PRD 6.12: 캐시 키 생성 로직 구현
33
+ * - content의 해시값을 사용하여 캐시 키 생성
34
+ * - SHA-256 해시 사용 (충돌 방지)
35
+ *
36
+ * @param content Episodic Memory의 content (observation 텍스트)
37
+ * @returns 캐시 키
38
+ */
39
+ generateCacheKey(content) {
40
+ // PRD 6.12: content_hash 기반 캐시 키 생성
41
+ // SHA-256 해시 사용하여 충돌 방지
42
+ const hash = createHash('sha256');
43
+ hash.update(content);
44
+ return `triple:${hash.digest('hex')}`;
45
+ }
46
+ /**
47
+ * 캐시에서 Triple 추출 결과 가져오기
48
+ *
49
+ * PRD 6.14: TripleExtractionService에 캐싱 통합
50
+ * - 캐시 히트 시 LLM 호출 생략
51
+ *
52
+ * @param content Episodic Memory의 content
53
+ * @returns Triple 추출 결과 또는 null (캐시 미스)
54
+ */
55
+ get(content) {
56
+ const cacheKey = this.generateCacheKey(content);
57
+ return this.cache.get(cacheKey);
58
+ }
59
+ /**
60
+ * 캐시에 Triple 추출 결과 저장
61
+ *
62
+ * PRD 6.14: TripleExtractionService에 캐싱 통합
63
+ * - 성공한 Triple 추출 결과만 캐시에 저장
64
+ *
65
+ * @param content Episodic Memory의 content
66
+ * @param result Triple 추출 결과
67
+ * @param ttl TTL (밀리초, 선택사항, 기본값 사용)
68
+ */
69
+ set(content, result, ttl) {
70
+ // PRD 7.3: 성공한 Triple 추출 결과만 캐시에 저장
71
+ // 실패한 결과는 캐시하지 않음 (재시도 가능성 고려)
72
+ if (result.triples.length > 0) {
73
+ const cacheKey = this.generateCacheKey(content);
74
+ this.cache.set(cacheKey, result, ttl);
75
+ }
76
+ }
77
+ /**
78
+ * 캐시에서 항목 삭제
79
+ *
80
+ * @param content Episodic Memory의 content
81
+ * @returns 삭제 성공 여부
82
+ */
83
+ delete(content) {
84
+ const cacheKey = this.generateCacheKey(content);
85
+ return this.cache.delete(cacheKey);
86
+ }
87
+ /**
88
+ * 캐시 비우기
89
+ */
90
+ clear() {
91
+ this.cache.clear();
92
+ }
93
+ /**
94
+ * 캐시 통계 반환
95
+ *
96
+ * @returns 캐시 통계
97
+ */
98
+ getStats() {
99
+ return this.cache.getStats();
100
+ }
101
+ /**
102
+ * TTL 기반 자동 무효화
103
+ *
104
+ * PRD 6.13: 캐시 TTL 기반 자동 무효화 구현
105
+ * - 만료된 항목 자동 제거
106
+ * - CacheService의 내장 TTL 체크 활용
107
+ *
108
+ * @returns 정리된 항목 수
109
+ */
110
+ cleanup() {
111
+ // CacheService의 cleanup 메서드 호출
112
+ // TTL이 만료된 항목 자동 제거
113
+ return this.cache.cleanup();
114
+ }
115
+ /**
116
+ * 캐시 크기 반환
117
+ *
118
+ * @returns 현재 캐시 크기
119
+ */
120
+ size() {
121
+ return this.cache.size();
122
+ }
123
+ }
124
+ //# sourceMappingURL=triple-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triple-cache.js","sourceRoot":"","sources":["../../../src/shared/utils/triple-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACrB,KAAK,CAAuC;IACnC,UAAU,CAAS;IACnB,OAAO,CAAS;IAEjC;;;OAGG;IACH,YAAY,UAAkB,GAAG,EAAE,MAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACjE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAyB,OAAO,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED;;;;;;;;;OASG;IACH,gBAAgB,CAAC,OAAe;QAC9B,oCAAoC;QACpC,wBAAwB;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACH,GAAG,CAAC,OAAe;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;OASG;IACH,GAAG,CAAC,OAAe,EAAE,MAA8B,EAAE,GAAY;QAC/D,oCAAoC;QACpC,+BAA+B;QAC/B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,OAAe;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;;;;OAQG;IACH,OAAO;QACL,+BAA+B;QAC/B,oBAAoB;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -16,6 +16,7 @@ import { SearchLocalTool } from '../domains/anchor/tools/search-local-tool.js';
16
16
  import { ClearAnchorTool } from '../domains/anchor/tools/clear-anchor-tool.js';
17
17
  import { RestoreAnchorsTool } from '../domains/anchor/tools/restore-anchors-tool.js';
18
18
  import { MigrateEmbeddingsTool } from './migrate-embeddings-tool.js';
19
+ import { ConvertEpisodicToSemanticTool } from '../domains/memory/tools/convert-episodic-to-semantic-tool.js';
19
20
  /**
20
21
  * MCP 클라이언트용 도구 레지스트리 생성 및 등록
21
22
  */
@@ -36,5 +37,5 @@ export declare function getAllTools(): import("./types.js").ToolDefinition[];
36
37
  * 도구 실행
37
38
  */
38
39
  export declare function executeTool(name: string, params: any, context: any): Promise<import("./types.js").ToolResult>;
39
- export { RememberTool, RecallTool, ForgetTool, PinTool, UnpinTool, MemoryInjectionPrompt, GetMemoryNeighborsTool, SetAnchorTool, GetAnchorTool, SearchLocalTool, ClearAnchorTool, RestoreAnchorsTool, MigrateEmbeddingsTool, };
40
+ export { RememberTool, RecallTool, ForgetTool, PinTool, UnpinTool, MemoryInjectionPrompt, GetMemoryNeighborsTool, SetAnchorTool, GetAnchorTool, SearchLocalTool, ClearAnchorTool, RestoreAnchorsTool, MigrateEmbeddingsTool, ConvertEpisodicToSemanticTool, };
40
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AA4BrE;;GAEG;AACH,eAAO,MAAM,YAAY,cAAqB,CAAC;AAK/C;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,mDAEnC;AAED;;GAEG;AACH,wBAAgB,WAAW,0CAE1B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,4CAExE;AAGD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,sBAAsB,EAEtB,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,qBAAqB,GAEtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8DAA8D,CAAC;AA6B7G;;GAEG;AACH,eAAO,MAAM,YAAY,cAAqB,CAAC;AAK/C;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,mDAEnC;AAED;;GAEG;AACH,wBAAgB,WAAW,0CAE1B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,4CAExE;AAGD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,sBAAsB,EAEtB,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,6BAA6B,GAE9B,CAAC"}
@@ -16,6 +16,7 @@ import { SearchLocalTool } from '../domains/anchor/tools/search-local-tool.js';
16
16
  import { ClearAnchorTool } from '../domains/anchor/tools/clear-anchor-tool.js';
17
17
  import { RestoreAnchorsTool } from '../domains/anchor/tools/restore-anchors-tool.js';
18
18
  import { MigrateEmbeddingsTool } from './migrate-embeddings-tool.js';
19
+ import { ConvertEpisodicToSemanticTool } from '../domains/memory/tools/convert-episodic-to-semantic-tool.js';
19
20
  // 관계 엔진 도구들은 HTTP API로만 제공 (MCP에서 제거)
20
21
  // 관계 추출은 remember 도구에서 자동으로 수행됨
21
22
  /**
@@ -37,6 +38,7 @@ const coreTools = [
37
38
  new ClearAnchorTool(),
38
39
  new RestoreAnchorsTool(),
39
40
  new MigrateEmbeddingsTool(),
41
+ new ConvertEpisodicToSemanticTool(), // AriGraph Pipeline 수동 변환 도구
40
42
  // 관계 엔진 도구들은 제거됨 (HTTP API로만 제공)
41
43
  // - extract_relations: remember에서 자동 실행
42
44
  // - get_relations, add_relation, remove_relation, visualize_relations: HTTP API로 제공
@@ -74,7 +76,7 @@ export async function executeTool(name, params, context) {
74
76
  // 핵심 도구들만 export
75
77
  export { RememberTool, RecallTool, ForgetTool, PinTool, UnpinTool, MemoryInjectionPrompt, GetMemoryNeighborsTool,
76
78
  // 앵커 시스템 도구들
77
- SetAnchorTool, GetAnchorTool, SearchLocalTool, ClearAnchorTool, RestoreAnchorsTool, MigrateEmbeddingsTool,
79
+ SetAnchorTool, GetAnchorTool, SearchLocalTool, ClearAnchorTool, RestoreAnchorsTool, MigrateEmbeddingsTool, ConvertEpisodicToSemanticTool,
78
80
  // 관계 엔진 도구들은 HTTP API로만 제공되므로 export하지 않음
79
81
  };
80
82
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,sCAAsC;AACtC,gCAAgC;AAEhC;;;GAGG;AACH,MAAM,SAAS,GAAG;IAChB,IAAI,YAAY,EAAE,EAAS,gBAAgB;IAC3C,IAAI,UAAU,EAAE;IAChB,IAAI,UAAU,EAAE;IAChB,IAAI,OAAO,EAAE;IACb,IAAI,SAAS,EAAE;IACf,IAAI,qBAAqB,EAAE;IAC3B,IAAI,sBAAsB,EAAE;IAC5B,aAAa;IACb,IAAI,aAAa,EAAE;IACnB,IAAI,aAAa,EAAE;IACnB,IAAI,eAAe,EAAE;IACrB,IAAI,eAAe,EAAE;IACrB,IAAI,kBAAkB,EAAE;IACxB,IAAI,qBAAqB,EAAE;IAC3B,iCAAiC;IACjC,wCAAwC;IACxC,oFAAoF;CACrF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AAE/C,aAAa;AACb,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAW,EAAE,OAAY;IACvE,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,iBAAiB;AACjB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,sBAAsB;AACtB,aAAa;AACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,qBAAqB;AACrB,0CAA0C;EAC3C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8DAA8D,CAAC;AAC7G,sCAAsC;AACtC,gCAAgC;AAEhC;;;GAGG;AACH,MAAM,SAAS,GAAG;IAChB,IAAI,YAAY,EAAE,EAAS,gBAAgB;IAC3C,IAAI,UAAU,EAAE;IAChB,IAAI,UAAU,EAAE;IAChB,IAAI,OAAO,EAAE;IACb,IAAI,SAAS,EAAE;IACf,IAAI,qBAAqB,EAAE;IAC3B,IAAI,sBAAsB,EAAE;IAC5B,aAAa;IACb,IAAI,aAAa,EAAE;IACnB,IAAI,aAAa,EAAE;IACnB,IAAI,eAAe,EAAE;IACrB,IAAI,eAAe,EAAE;IACrB,IAAI,kBAAkB,EAAE;IACxB,IAAI,qBAAqB,EAAE;IAC3B,IAAI,6BAA6B,EAAE,EAAE,6BAA6B;IAClE,iCAAiC;IACjC,wCAAwC;IACxC,oFAAoF;CACrF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AAE/C,aAAa;AACb,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAW,EAAE,OAAY;IACvE,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,iBAAiB;AACjB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,qBAAqB,EACrB,sBAAsB;AACtB,aAAa;AACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,6BAA6B;AAC7B,0CAA0C;EAC3C,CAAC"}
@@ -91,5 +91,6 @@ export declare const CommonSchemas: {
91
91
  SkillName: z.ZodOptional<z.ZodString>;
92
92
  TriggerConditions: z.ZodOptional<z.ZodString>;
93
93
  UpdateMode: z.ZodOptional<z.ZodEnum<["replace", "incremental", "versioned"]>>;
94
+ EnableTripleExtraction: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
94
95
  };
95
96
  //# sourceMappingURL=types.d.ts.map