memento-mcp-server 1.13.1 → 1.14.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.
- package/dist/database/migration/migrations/007-procedural-memory-enhancement.sql +66 -0
- package/dist/database/schema.sql +9 -2
- package/dist/domains/memory/tools/recall-tool.d.ts +13 -0
- package/dist/domains/memory/tools/recall-tool.d.ts.map +1 -1
- package/dist/domains/memory/tools/recall-tool.js +160 -12
- package/dist/domains/memory/tools/recall-tool.js.map +1 -1
- package/dist/domains/memory/tools/remember-tool.d.ts +10 -0
- package/dist/domains/memory/tools/remember-tool.d.ts.map +1 -1
- package/dist/domains/memory/tools/remember-tool.js +264 -35
- package/dist/domains/memory/tools/remember-tool.js.map +1 -1
- package/dist/domains/relation/services/relation-quality-validator.d.ts.map +1 -1
- package/dist/domains/relation/services/relation-quality-validator.js +15 -10
- package/dist/domains/relation/services/relation-quality-validator.js.map +1 -1
- package/dist/domains/relation/services/rule-based-relation-extractor.d.ts.map +1 -1
- package/dist/domains/relation/services/rule-based-relation-extractor.js +18 -0
- package/dist/domains/relation/services/rule-based-relation-extractor.js.map +1 -1
- package/dist/domains/relation/tools/add-relation-tool.d.ts +3 -3
- package/dist/domains/relation/tools/add-relation-tool.js +2 -2
- package/dist/domains/relation/tools/add-relation-tool.js.map +1 -1
- package/dist/domains/relation/tools/get-relations-tool.d.ts +3 -3
- package/dist/domains/relation/tools/get-relations-tool.js +2 -2
- package/dist/domains/relation/tools/get-relations-tool.js.map +1 -1
- package/dist/domains/search/algorithms/hybrid-search-engine.d.ts +20 -0
- package/dist/domains/search/algorithms/hybrid-search-engine.d.ts.map +1 -1
- package/dist/domains/search/algorithms/hybrid-search-engine.js +168 -5
- package/dist/domains/search/algorithms/hybrid-search-engine.js.map +1 -1
- package/dist/domains/search/algorithms/search-engine.d.ts.map +1 -1
- package/dist/domains/search/algorithms/search-engine.js +37 -17
- package/dist/domains/search/algorithms/search-engine.js.map +1 -1
- package/dist/domains/search/algorithms/search-ranking.d.ts +15 -2
- package/dist/domains/search/algorithms/search-ranking.d.ts.map +1 -1
- package/dist/domains/search/algorithms/search-ranking.js +46 -15
- package/dist/domains/search/algorithms/search-ranking.js.map +1 -1
- package/dist/domains/search/repositories/vector-search.repository.d.ts.map +1 -1
- package/dist/domains/search/repositories/vector-search.repository.js +180 -89
- package/dist/domains/search/repositories/vector-search.repository.js.map +1 -1
- package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.d.ts +63 -0
- package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.d.ts.map +1 -0
- package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.js +257 -0
- package/dist/infrastructure/database/database/migration/migrations/007-procedural-memory-enhancement.js.map +1 -0
- package/dist/infrastructure/reflexion-worker.d.ts +18 -0
- package/dist/infrastructure/reflexion-worker.d.ts.map +1 -1
- package/dist/infrastructure/reflexion-worker.js +216 -0
- package/dist/infrastructure/reflexion-worker.js.map +1 -1
- package/dist/infrastructure/scheduler/batch-scheduler.d.ts +51 -8
- package/dist/infrastructure/scheduler/batch-scheduler.d.ts.map +1 -1
- package/dist/infrastructure/scheduler/batch-scheduler.js +299 -205
- package/dist/infrastructure/scheduler/batch-scheduler.js.map +1 -1
- package/dist/infrastructure/scheduler/file-logger.d.ts +82 -0
- package/dist/infrastructure/scheduler/file-logger.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/file-logger.js +133 -0
- package/dist/infrastructure/scheduler/file-logger.js.map +1 -0
- package/dist/infrastructure/scheduler/health-checker.d.ts +54 -0
- package/dist/infrastructure/scheduler/health-checker.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/health-checker.js +96 -0
- package/dist/infrastructure/scheduler/health-checker.js.map +1 -0
- package/dist/infrastructure/scheduler/job-queue.d.ts +85 -0
- package/dist/infrastructure/scheduler/job-queue.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/job-queue.js +125 -0
- package/dist/infrastructure/scheduler/job-queue.js.map +1 -0
- package/dist/infrastructure/scheduler/relation-validator-executor.d.ts +37 -0
- package/dist/infrastructure/scheduler/relation-validator-executor.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/relation-validator-executor.js +120 -0
- package/dist/infrastructure/scheduler/relation-validator-executor.js.map +1 -0
- package/dist/infrastructure/scheduler/retry-manager.d.ts +62 -0
- package/dist/infrastructure/scheduler/retry-manager.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/retry-manager.js +91 -0
- package/dist/infrastructure/scheduler/retry-manager.js.map +1 -0
- package/dist/npm-client/utils.d.ts.map +1 -1
- package/dist/npm-client/utils.js +2 -1
- package/dist/npm-client/utils.js.map +1 -1
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +15 -17
- package/dist/server/http-server.js.map +1 -1
- package/dist/services/anchor-manager.d.ts.map +1 -1
- package/dist/services/anchor-manager.js.map +1 -1
- package/dist/shared/types/index.d.ts +36 -0
- package/dist/shared/types/index.d.ts.map +1 -1
- package/dist/shared/types/index.js.map +1 -1
- package/dist/shared/types/relation.d.ts +1 -1
- package/dist/shared/types/relation.d.ts.map +1 -1
- package/dist/shared/types/relation.js +7 -4
- package/dist/shared/types/relation.js.map +1 -1
- package/dist/shared/utils/database.d.ts.map +1 -1
- package/dist/shared/utils/database.js +9 -2
- package/dist/shared/utils/database.js.map +1 -1
- package/dist/shared/utils/procedural-memory-extractor.d.ts +108 -0
- package/dist/shared/utils/procedural-memory-extractor.d.ts.map +1 -0
- package/dist/shared/utils/procedural-memory-extractor.js +581 -0
- package/dist/shared/utils/procedural-memory-extractor.js.map +1 -0
- package/dist/shared/utils/relation-type-converter.d.ts +52 -0
- package/dist/shared/utils/relation-type-converter.d.ts.map +1 -0
- package/dist/shared/utils/relation-type-converter.js +106 -0
- package/dist/shared/utils/relation-type-converter.js.map +1 -0
- package/dist/shared/utils/type-param-validator.d.ts +31 -0
- package/dist/shared/utils/type-param-validator.d.ts.map +1 -1
- package/dist/shared/utils/type-param-validator.js +90 -2
- package/dist/shared/utils/type-param-validator.js.map +1 -1
- package/dist/tools/base-tool.d.ts.map +1 -1
- package/dist/tools/types.d.ts +4 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/workers/consolidation-score-worker.d.ts.map +1 -1
- package/dist/workers/consolidation-score-worker.js +0 -2
- package/dist/workers/consolidation-score-worker.js.map +1 -1
- package/package.json +3 -3
- package/scripts/auto-setup.js +1 -1
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procedural Memory Extractor 유틸리티
|
|
3
|
+
* reflection_notes에서 procedural memory 필드 추출 및 변환
|
|
4
|
+
*
|
|
5
|
+
* 이 유틸리티는 reflexion-worker에서 생성된 reflection_notes를
|
|
6
|
+
* procedural memory 형식(workflow_name, skill_name, steps, trigger_conditions)으로 변환합니다.
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from './logger.js';
|
|
9
|
+
import Database from 'better-sqlite3';
|
|
10
|
+
import { DatabaseUtils } from './database.js';
|
|
11
|
+
/**
|
|
12
|
+
* 유사도 임계값 설정
|
|
13
|
+
*/
|
|
14
|
+
const SIMILARITY_THRESHOLD = 0.7; // 70% 이상 유사하면 병합
|
|
15
|
+
const HIGH_SIMILARITY_THRESHOLD = 0.9; // 90% 이상이면 replace 모드
|
|
16
|
+
/**
|
|
17
|
+
* reflection_notes에서 workflow_name 추출
|
|
18
|
+
*
|
|
19
|
+
* 추출 전략:
|
|
20
|
+
* 1. original_task에서 워크플로우 이름 추출
|
|
21
|
+
* 2. tool_name을 기반으로 워크플로우 이름 추출
|
|
22
|
+
* 3. failure_description에서 키워드 추출
|
|
23
|
+
*/
|
|
24
|
+
export function extractWorkflowName(reflectionNotes, event) {
|
|
25
|
+
try {
|
|
26
|
+
// 1. original_task에서 추출
|
|
27
|
+
if (reflectionNotes?.original_task) {
|
|
28
|
+
const task = reflectionNotes.original_task;
|
|
29
|
+
// 타입 안전성 체크: 문자열이 아니면 건너뜀
|
|
30
|
+
if (typeof task !== 'string') {
|
|
31
|
+
logger.warn('original_task가 문자열이 아님', {
|
|
32
|
+
type: typeof task,
|
|
33
|
+
value: task
|
|
34
|
+
});
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
// "데이터 마이그레이션", "스키마 업데이트" 등의 패턴 추출
|
|
38
|
+
const workflowPatterns = [
|
|
39
|
+
/(?:데이터|스키마|마이그레이션|업데이트|생성|삭제|수정|변경)/,
|
|
40
|
+
/(?:migration|update|create|delete|modify|change|schema|database)/i
|
|
41
|
+
];
|
|
42
|
+
for (const pattern of workflowPatterns) {
|
|
43
|
+
if (pattern.test(task)) {
|
|
44
|
+
// 첫 번째 매칭된 키워드를 기반으로 워크플로우 이름 생성
|
|
45
|
+
const match = task.match(/([가-힣a-zA-Z\s]+(?:마이그레이션|업데이트|생성|삭제|수정|변경|migration|update|create|delete|modify|change))/i);
|
|
46
|
+
if (match && match[1]) {
|
|
47
|
+
return match[1].trim();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// original_task 자체를 워크플로우 이름으로 사용 (200자 제한)
|
|
52
|
+
if (task.length <= 200) {
|
|
53
|
+
return task.trim();
|
|
54
|
+
}
|
|
55
|
+
return task.substring(0, 200).trim() + '...';
|
|
56
|
+
}
|
|
57
|
+
// 2. event의 tool_name 기반 추출
|
|
58
|
+
if (event?.tool_name) {
|
|
59
|
+
const toolName = event.tool_name;
|
|
60
|
+
// 타입 안전성 체크: 문자열이 아니면 건너뜀
|
|
61
|
+
if (typeof toolName !== 'string') {
|
|
62
|
+
logger.warn('event.tool_name이 문자열이 아님', {
|
|
63
|
+
type: typeof toolName,
|
|
64
|
+
value: toolName
|
|
65
|
+
});
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
// tool_name을 기반으로 워크플로우 이름 생성
|
|
69
|
+
// 예: "remember-tool" -> "기억 저장", "recall-tool" -> "기억 조회"
|
|
70
|
+
const toolToWorkflow = {
|
|
71
|
+
'remember': '기억 저장',
|
|
72
|
+
'recall': '기억 조회',
|
|
73
|
+
'forget': '기억 삭제',
|
|
74
|
+
'pin': '기억 고정',
|
|
75
|
+
'unpin': '기억 고정 해제',
|
|
76
|
+
'search': '기억 검색',
|
|
77
|
+
'migrate': '데이터 마이그레이션',
|
|
78
|
+
'backup': '데이터 백업',
|
|
79
|
+
'restore': '데이터 복원'
|
|
80
|
+
};
|
|
81
|
+
for (const [key, value] of Object.entries(toolToWorkflow)) {
|
|
82
|
+
if (toolName.toLowerCase().includes(key)) {
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// 기본값: tool_name을 워크플로우 이름으로 사용
|
|
87
|
+
return toolName;
|
|
88
|
+
}
|
|
89
|
+
// 3. failure_description에서 키워드 추출
|
|
90
|
+
if (reflectionNotes?.failure_description) {
|
|
91
|
+
const desc = reflectionNotes.failure_description;
|
|
92
|
+
// 타입 안전성 체크: 문자열이 아니면 건너뜀
|
|
93
|
+
if (typeof desc !== 'string') {
|
|
94
|
+
logger.warn('failure_description이 문자열이 아님', {
|
|
95
|
+
type: typeof desc,
|
|
96
|
+
value: desc
|
|
97
|
+
});
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
const keywords = ['마이그레이션', '업데이트', '생성', '삭제', '수정', '변경'];
|
|
101
|
+
for (const keyword of keywords) {
|
|
102
|
+
if (desc.includes(keyword)) {
|
|
103
|
+
return `데이터 ${keyword}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger.warn('workflow_name 추출 실패', {
|
|
111
|
+
error: error instanceof Error ? error.message : String(error)
|
|
112
|
+
});
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* reflection_notes에서 skill_name 추출
|
|
118
|
+
*
|
|
119
|
+
* 추출 전략:
|
|
120
|
+
* 1. tool_name을 skill_name으로 사용
|
|
121
|
+
* 2. failure_type 기반 추출
|
|
122
|
+
* 3. suggested_improvements에서 스킬 추출
|
|
123
|
+
*/
|
|
124
|
+
export function extractSkillName(reflectionNotes, event) {
|
|
125
|
+
try {
|
|
126
|
+
// 1. tool_name을 skill_name으로 사용
|
|
127
|
+
if (event?.tool_name) {
|
|
128
|
+
// 타입 안전성 체크
|
|
129
|
+
if (typeof event.tool_name !== 'string') {
|
|
130
|
+
logger.warn('event.tool_name이 문자열이 아님', {
|
|
131
|
+
type: typeof event.tool_name,
|
|
132
|
+
value: event.tool_name
|
|
133
|
+
});
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
return event.tool_name;
|
|
137
|
+
}
|
|
138
|
+
// 2. failure_type 기반 추출
|
|
139
|
+
if (reflectionNotes?.failure_type) {
|
|
140
|
+
const failureType = reflectionNotes.failure_type;
|
|
141
|
+
// 타입 안전성 체크: 문자열이 아니면 건너뜀
|
|
142
|
+
if (typeof failureType !== 'string') {
|
|
143
|
+
logger.warn('failure_type이 문자열이 아님', {
|
|
144
|
+
type: typeof failureType,
|
|
145
|
+
value: failureType
|
|
146
|
+
});
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
const typeToSkill = {
|
|
150
|
+
'tool_error': '도구 실행',
|
|
151
|
+
'user_feedback': '사용자 피드백 처리',
|
|
152
|
+
'metric_failure': '성능 모니터링'
|
|
153
|
+
};
|
|
154
|
+
return typeToSkill[failureType] || failureType;
|
|
155
|
+
}
|
|
156
|
+
// 3. suggested_improvements에서 스킬 추출
|
|
157
|
+
if (reflectionNotes?.suggested_improvements) {
|
|
158
|
+
const improvements = reflectionNotes.suggested_improvements;
|
|
159
|
+
// 타입 안전성 체크: 문자열이 아니면 건너뜀
|
|
160
|
+
if (typeof improvements !== 'string') {
|
|
161
|
+
logger.warn('suggested_improvements가 문자열이 아님', {
|
|
162
|
+
type: typeof improvements,
|
|
163
|
+
value: improvements
|
|
164
|
+
});
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
const skillKeywords = ['검증', '최적화', '처리', '관리', '모니터링'];
|
|
168
|
+
for (const keyword of skillKeywords) {
|
|
169
|
+
if (improvements.includes(keyword)) {
|
|
170
|
+
return `${keyword} 스킬`;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
logger.warn('skill_name 추출 실패', {
|
|
178
|
+
error: error instanceof Error ? error.message : String(error)
|
|
179
|
+
});
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* reflection_notes에서 steps 추출
|
|
185
|
+
*
|
|
186
|
+
* 추출 전략:
|
|
187
|
+
* 1. suggested_improvements를 steps로 변환
|
|
188
|
+
* 2. lessons_learned를 steps로 변환
|
|
189
|
+
* 3. failure_description에서 단계 추출
|
|
190
|
+
*/
|
|
191
|
+
export function extractSteps(reflectionNotes) {
|
|
192
|
+
try {
|
|
193
|
+
const steps = [];
|
|
194
|
+
// 1. suggested_improvements를 steps로 변환
|
|
195
|
+
if (reflectionNotes?.suggested_improvements) {
|
|
196
|
+
const improvements = reflectionNotes.suggested_improvements;
|
|
197
|
+
// 타입 안전성 체크: 문자열이 아니면 건너뜀
|
|
198
|
+
if (typeof improvements === 'string') {
|
|
199
|
+
// 문장 단위로 분리
|
|
200
|
+
const sentences = improvements.split(/[.!?]\s+/).filter((s) => s.trim().length > 0);
|
|
201
|
+
steps.push(...sentences.map((s) => s.trim()));
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
logger.warn('suggested_improvements가 문자열이 아님', {
|
|
205
|
+
type: typeof improvements,
|
|
206
|
+
value: improvements
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// 2. lessons_learned를 steps로 변환
|
|
211
|
+
if (reflectionNotes?.lessons_learned) {
|
|
212
|
+
const lessons = reflectionNotes.lessons_learned;
|
|
213
|
+
// 타입 안전성 체크: 문자열이 아니면 건너뜀
|
|
214
|
+
if (typeof lessons === 'string') {
|
|
215
|
+
const sentences = lessons.split(/[.!?]\s+/).filter((s) => s.trim().length > 0);
|
|
216
|
+
steps.push(...sentences.map((s) => s.trim()));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
logger.warn('lessons_learned가 문자열이 아님', {
|
|
220
|
+
type: typeof lessons,
|
|
221
|
+
value: lessons
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// 3. failure_description에서 단계 추출 (선택적)
|
|
226
|
+
if (reflectionNotes?.failure_description && steps.length === 0) {
|
|
227
|
+
const desc = reflectionNotes.failure_description;
|
|
228
|
+
// 타입 안전성 체크: 문자열이 아니면 건너뜀
|
|
229
|
+
if (typeof desc === 'string') {
|
|
230
|
+
// "단계", "절차", "순서" 등의 키워드가 있으면 추출
|
|
231
|
+
if (desc.includes('단계') || desc.includes('절차') || desc.includes('순서')) {
|
|
232
|
+
steps.push(desc);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
logger.warn('failure_description이 문자열이 아님', {
|
|
237
|
+
type: typeof desc,
|
|
238
|
+
value: desc
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// steps가 비어있으면 기본값 생성
|
|
243
|
+
if (steps.length === 0) {
|
|
244
|
+
steps.push('에러 로그 분석');
|
|
245
|
+
steps.push('근본 원인 파악');
|
|
246
|
+
steps.push('개선 방안 수립');
|
|
247
|
+
steps.push('재시도 또는 대안 실행');
|
|
248
|
+
}
|
|
249
|
+
// JSON 배열 문자열로 변환
|
|
250
|
+
return JSON.stringify(steps);
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
logger.warn('steps 추출 실패', {
|
|
254
|
+
error: error instanceof Error ? error.message : String(error)
|
|
255
|
+
});
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* 실패 이벤트 정보 기반 trigger_conditions 자동 생성
|
|
261
|
+
*
|
|
262
|
+
* 생성 전략:
|
|
263
|
+
* 1. error_type 기반 조건 생성
|
|
264
|
+
* 2. tool_name 기반 조건 생성
|
|
265
|
+
* 3. error_message 키워드 기반 조건 생성
|
|
266
|
+
* 4. context 정보 기반 조건 생성
|
|
267
|
+
*/
|
|
268
|
+
export function generateTriggerConditions(reflectionNotes, event) {
|
|
269
|
+
try {
|
|
270
|
+
const conditions = {};
|
|
271
|
+
// 1. error_type 기반 조건
|
|
272
|
+
if (reflectionNotes?.failure_type) {
|
|
273
|
+
const failureType = reflectionNotes.failure_type;
|
|
274
|
+
// 타입 안전성 체크
|
|
275
|
+
if (typeof failureType === 'string') {
|
|
276
|
+
conditions.error_type = failureType;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
else if (event?.error_type) {
|
|
280
|
+
// 타입 안전성 체크
|
|
281
|
+
if (typeof event.error_type === 'string') {
|
|
282
|
+
conditions.error_type = event.error_type;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// 2. tool_name 기반 조건
|
|
286
|
+
if (event?.tool_name) {
|
|
287
|
+
// 타입 안전성 체크
|
|
288
|
+
if (typeof event.tool_name === 'string') {
|
|
289
|
+
conditions.tool_name = event.tool_name;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// 3. error_message 키워드 기반 조건
|
|
293
|
+
const errorMessage = (typeof reflectionNotes?.failure_description === 'string' ? reflectionNotes.failure_description : '') ||
|
|
294
|
+
(typeof event?.error_message === 'string' ? event.error_message : '') ||
|
|
295
|
+
'';
|
|
296
|
+
const keywords = [];
|
|
297
|
+
// 에러 메시지에서 중요한 키워드 추출 (문자열인 경우에만)
|
|
298
|
+
if (typeof errorMessage === 'string' && errorMessage.length > 0) {
|
|
299
|
+
const importantKeywords = [
|
|
300
|
+
'validation', '검증', 'database', '데이터베이스', 'sqlite',
|
|
301
|
+
'timeout', '타임아웃', 'permission', '권한', 'not found', '찾을 수 없음'
|
|
302
|
+
];
|
|
303
|
+
for (const keyword of importantKeywords) {
|
|
304
|
+
if (errorMessage.toLowerCase().includes(keyword.toLowerCase())) {
|
|
305
|
+
keywords.push(keyword);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (keywords.length > 0) {
|
|
310
|
+
conditions.error_keywords = keywords;
|
|
311
|
+
}
|
|
312
|
+
// 4. context 정보 기반 조건
|
|
313
|
+
if (event?.context) {
|
|
314
|
+
const context = event.context;
|
|
315
|
+
// execution_time_ms가 임계값을 초과한 경우
|
|
316
|
+
if (context.execution_time_ms && context.execution_time_ms > 5000) {
|
|
317
|
+
conditions.slow_execution = true;
|
|
318
|
+
conditions.min_execution_time_ms = context.execution_time_ms;
|
|
319
|
+
}
|
|
320
|
+
// params 정보가 있는 경우
|
|
321
|
+
if (context.params) {
|
|
322
|
+
// 중요한 파라미터만 추출 (예: type, workflow_name 등)
|
|
323
|
+
const importantParams = ['type', 'workflow_name', 'skill_name'];
|
|
324
|
+
for (const param of importantParams) {
|
|
325
|
+
if (context.params[param]) {
|
|
326
|
+
conditions[`param_${param}`] = context.params[param];
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// 5. timestamp 기반 조건 (선택적)
|
|
332
|
+
if (reflectionNotes?.timestamp) {
|
|
333
|
+
conditions.timestamp_pattern = new Date(reflectionNotes.timestamp).toISOString().split('T')[0]; // 날짜만
|
|
334
|
+
}
|
|
335
|
+
// 조건이 비어있으면 기본 조건 생성
|
|
336
|
+
if (Object.keys(conditions).length === 0) {
|
|
337
|
+
conditions.event = 'failure_detected';
|
|
338
|
+
if (event?.tool_name) {
|
|
339
|
+
conditions.tool = event.tool_name;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// JSON 객체 문자열로 변환
|
|
343
|
+
return JSON.stringify(conditions);
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
logger.warn('trigger_conditions 생성 실패', {
|
|
347
|
+
error: error instanceof Error ? error.message : String(error)
|
|
348
|
+
});
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* reflection_notes에서 모든 procedural memory 필드 추출
|
|
354
|
+
*/
|
|
355
|
+
export function extractProceduralMemory(reflectionNotes, event) {
|
|
356
|
+
const workflowName = extractWorkflowName(reflectionNotes, event);
|
|
357
|
+
const skillName = extractSkillName(reflectionNotes, event);
|
|
358
|
+
const steps = extractSteps(reflectionNotes);
|
|
359
|
+
const triggerConditions = generateTriggerConditions(reflectionNotes, event);
|
|
360
|
+
// task_goal 추출 (타입 안전성 체크)
|
|
361
|
+
const taskGoal = (typeof reflectionNotes?.original_task === 'string' ? reflectionNotes.original_task : undefined) ||
|
|
362
|
+
(typeof event?.original_task === 'string' ? event.original_task : undefined);
|
|
363
|
+
return {
|
|
364
|
+
workflow_name: workflowName,
|
|
365
|
+
skill_name: skillName,
|
|
366
|
+
steps,
|
|
367
|
+
trigger_conditions: triggerConditions,
|
|
368
|
+
task_goal: taskGoal
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* 기존 procedural memory와의 유사도 계산
|
|
373
|
+
*
|
|
374
|
+
* 유사도 계산 전략:
|
|
375
|
+
* 1. workflow_name 일치 여부
|
|
376
|
+
* 2. skill_name 일치 여부
|
|
377
|
+
* 3. task_goal 유사도 (문자열 유사도)
|
|
378
|
+
* 4. steps 유사도 (JSON 배열 비교)
|
|
379
|
+
*/
|
|
380
|
+
export function calculateSimilarity(extracted, existing) {
|
|
381
|
+
let similarity = 0;
|
|
382
|
+
let weightSum = 0;
|
|
383
|
+
// 1. workflow_name 일치 (가중치: 0.3)
|
|
384
|
+
if (extracted.workflow_name && existing.workflow_name) {
|
|
385
|
+
const weight = 0.3;
|
|
386
|
+
weightSum += weight;
|
|
387
|
+
if (extracted.workflow_name === existing.workflow_name) {
|
|
388
|
+
similarity += weight;
|
|
389
|
+
}
|
|
390
|
+
else if (extracted.workflow_name.toLowerCase().includes(existing.workflow_name.toLowerCase()) ||
|
|
391
|
+
existing.workflow_name.toLowerCase().includes(extracted.workflow_name.toLowerCase())) {
|
|
392
|
+
similarity += weight * 0.7; // 부분 일치
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// 2. skill_name 일치 (가중치: 0.3)
|
|
396
|
+
if (extracted.skill_name && existing.skill_name) {
|
|
397
|
+
const weight = 0.3;
|
|
398
|
+
weightSum += weight;
|
|
399
|
+
if (extracted.skill_name === existing.skill_name) {
|
|
400
|
+
similarity += weight;
|
|
401
|
+
}
|
|
402
|
+
else if (extracted.skill_name.toLowerCase().includes(existing.skill_name.toLowerCase()) ||
|
|
403
|
+
existing.skill_name.toLowerCase().includes(extracted.skill_name.toLowerCase())) {
|
|
404
|
+
similarity += weight * 0.7; // 부분 일치
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// 3. task_goal 유사도 (가중치: 0.2)
|
|
408
|
+
if (extracted.task_goal && existing.task_goal) {
|
|
409
|
+
const weight = 0.2;
|
|
410
|
+
weightSum += weight;
|
|
411
|
+
// 간단한 문자열 유사도 (공통 단어 비율)
|
|
412
|
+
const extractedWords = extracted.task_goal.toLowerCase().split(/\s+/);
|
|
413
|
+
const existingWords = existing.task_goal.toLowerCase().split(/\s+/);
|
|
414
|
+
const commonWords = extractedWords.filter(w => existingWords.includes(w));
|
|
415
|
+
const similarityRatio = commonWords.length / Math.max(extractedWords.length, existingWords.length);
|
|
416
|
+
similarity += weight * similarityRatio;
|
|
417
|
+
}
|
|
418
|
+
// 4. steps 유사도 (가중치: 0.2)
|
|
419
|
+
if (extracted.steps && existing.steps) {
|
|
420
|
+
const weight = 0.2;
|
|
421
|
+
weightSum += weight;
|
|
422
|
+
try {
|
|
423
|
+
const extractedSteps = JSON.parse(extracted.steps);
|
|
424
|
+
const existingSteps = JSON.parse(existing.steps);
|
|
425
|
+
// 공통 steps 비율
|
|
426
|
+
const commonSteps = extractedSteps.filter(s => existingSteps.some(es => es.toLowerCase().includes(s.toLowerCase()) ||
|
|
427
|
+
s.toLowerCase().includes(es.toLowerCase())));
|
|
428
|
+
const similarityRatio = commonSteps.length / Math.max(extractedSteps.length, existingSteps.length);
|
|
429
|
+
similarity += weight * similarityRatio;
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
// JSON 파싱 실패 시 0점
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// 가중치 합으로 정규화
|
|
436
|
+
return weightSum > 0 ? similarity / weightSum : 0;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* 유사도 기반 병합 결정
|
|
440
|
+
*
|
|
441
|
+
* 결정 전략:
|
|
442
|
+
* 1. 유사도가 SIMILARITY_THRESHOLD 이상이면 병합
|
|
443
|
+
* 2. 유사도가 HIGH_SIMILARITY_THRESHOLD 이상이면 replace 모드
|
|
444
|
+
* 3. 그 외에는 incremental 모드
|
|
445
|
+
* 4. 유사도가 임계값 미만이면 새로 생성 (versioned 모드)
|
|
446
|
+
*/
|
|
447
|
+
export async function determineMergeStrategy(db, extracted) {
|
|
448
|
+
try {
|
|
449
|
+
// 기존 procedural memory 검색
|
|
450
|
+
// workflow_name과 skill_name이 모두 제공된 경우: 둘 다 일치해야 병합 (AND 조건)
|
|
451
|
+
// 하나만 제공된 경우: 그 하나만 일치하면 됨
|
|
452
|
+
// 모두 없으면 병합하지 않음
|
|
453
|
+
const searchConditions = [];
|
|
454
|
+
const params = [];
|
|
455
|
+
if (extracted.workflow_name) {
|
|
456
|
+
searchConditions.push('workflow_name = ?');
|
|
457
|
+
params.push(extracted.workflow_name);
|
|
458
|
+
}
|
|
459
|
+
if (extracted.skill_name) {
|
|
460
|
+
searchConditions.push('skill_name = ?');
|
|
461
|
+
params.push(extracted.skill_name);
|
|
462
|
+
}
|
|
463
|
+
if (searchConditions.length === 0) {
|
|
464
|
+
// workflow_name과 skill_name이 모두 없으면 병합하지 않음
|
|
465
|
+
return {
|
|
466
|
+
shouldMerge: false,
|
|
467
|
+
similarity: 0,
|
|
468
|
+
updateMode: 'versioned'
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
// 1단계: 완전 일치 검색 (엄격한 조건)
|
|
472
|
+
// workflow_name과 skill_name이 모두 제공된 경우 AND 조건 사용
|
|
473
|
+
// 하나만 제공된 경우 그 하나만 사용
|
|
474
|
+
const conditionOperator = extracted.workflow_name && extracted.skill_name ? 'AND' : '';
|
|
475
|
+
let query = `
|
|
476
|
+
SELECT id, workflow_name, skill_name, task_goal, steps
|
|
477
|
+
FROM memory_item
|
|
478
|
+
WHERE type = 'procedural'
|
|
479
|
+
AND ${searchConditions.join(` ${conditionOperator} `)}
|
|
480
|
+
ORDER BY created_at DESC
|
|
481
|
+
LIMIT 10
|
|
482
|
+
`;
|
|
483
|
+
let existingMemories = DatabaseUtils.all(db, query, params);
|
|
484
|
+
// 2단계: 완전 일치가 없으면 유사도 기반 검색 (대소문자 무시, 부분 일치)
|
|
485
|
+
// workflow_name과 skill_name이 모두 존재하면 AND 조건을 유지한 후, 그래도 없으면 OR 조건으로 느슨한 검색
|
|
486
|
+
if (existingMemories.length === 0) {
|
|
487
|
+
const fallbackConditions = [];
|
|
488
|
+
const fallbackParams = [];
|
|
489
|
+
if (extracted.workflow_name) {
|
|
490
|
+
// LOWER를 사용하여 대소문자 무시, LIKE를 사용하여 부분 일치 허용
|
|
491
|
+
fallbackConditions.push('LOWER(workflow_name) LIKE LOWER(?)');
|
|
492
|
+
fallbackParams.push(`%${extracted.workflow_name}%`);
|
|
493
|
+
}
|
|
494
|
+
if (extracted.skill_name) {
|
|
495
|
+
fallbackConditions.push('LOWER(skill_name) LIKE LOWER(?)');
|
|
496
|
+
fallbackParams.push(`%${extracted.skill_name}%`);
|
|
497
|
+
}
|
|
498
|
+
if (fallbackConditions.length > 0) {
|
|
499
|
+
// 2-1단계: workflow_name과 skill_name이 모두 있으면 AND 조건으로 LIKE 검색
|
|
500
|
+
if (extracted.workflow_name && extracted.skill_name) {
|
|
501
|
+
query = `
|
|
502
|
+
SELECT id, workflow_name, skill_name, task_goal, steps
|
|
503
|
+
FROM memory_item
|
|
504
|
+
WHERE type = 'procedural'
|
|
505
|
+
AND ${fallbackConditions.join(' AND ')}
|
|
506
|
+
ORDER BY created_at DESC
|
|
507
|
+
LIMIT 20
|
|
508
|
+
`;
|
|
509
|
+
existingMemories = DatabaseUtils.all(db, query, fallbackParams);
|
|
510
|
+
}
|
|
511
|
+
// 2-2단계: AND 조건으로도 없으면 OR 조건으로 느슨한 검색
|
|
512
|
+
if (existingMemories.length === 0 && extracted.workflow_name && extracted.skill_name) {
|
|
513
|
+
query = `
|
|
514
|
+
SELECT id, workflow_name, skill_name, task_goal, steps
|
|
515
|
+
FROM memory_item
|
|
516
|
+
WHERE type = 'procedural'
|
|
517
|
+
AND (${fallbackConditions.join(' OR ')})
|
|
518
|
+
ORDER BY created_at DESC
|
|
519
|
+
LIMIT 20
|
|
520
|
+
`;
|
|
521
|
+
existingMemories = DatabaseUtils.all(db, query, fallbackParams);
|
|
522
|
+
}
|
|
523
|
+
else if (existingMemories.length === 0) {
|
|
524
|
+
// workflow_name 또는 skill_name 중 하나만 있는 경우
|
|
525
|
+
query = `
|
|
526
|
+
SELECT id, workflow_name, skill_name, task_goal, steps
|
|
527
|
+
FROM memory_item
|
|
528
|
+
WHERE type = 'procedural'
|
|
529
|
+
AND ${fallbackConditions.join(' OR ')}
|
|
530
|
+
ORDER BY created_at DESC
|
|
531
|
+
LIMIT 20
|
|
532
|
+
`;
|
|
533
|
+
existingMemories = DatabaseUtils.all(db, query, fallbackParams);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
if (existingMemories.length === 0) {
|
|
538
|
+
return {
|
|
539
|
+
shouldMerge: false,
|
|
540
|
+
similarity: 0,
|
|
541
|
+
updateMode: 'versioned'
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
// 각 기존 메모리와 유사도 계산
|
|
545
|
+
let maxSimilarity = 0;
|
|
546
|
+
let bestMatch;
|
|
547
|
+
for (const existing of existingMemories) {
|
|
548
|
+
const similarity = calculateSimilarity(extracted, existing);
|
|
549
|
+
if (similarity > maxSimilarity) {
|
|
550
|
+
maxSimilarity = similarity;
|
|
551
|
+
bestMatch = existing;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
// 병합 결정
|
|
555
|
+
if (maxSimilarity >= SIMILARITY_THRESHOLD) {
|
|
556
|
+
const updateMode = maxSimilarity >= HIGH_SIMILARITY_THRESHOLD ? 'replace' : 'incremental';
|
|
557
|
+
return {
|
|
558
|
+
shouldMerge: true,
|
|
559
|
+
similarity: maxSimilarity,
|
|
560
|
+
existingMemoryId: bestMatch?.id,
|
|
561
|
+
updateMode
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
return {
|
|
565
|
+
shouldMerge: false,
|
|
566
|
+
similarity: maxSimilarity,
|
|
567
|
+
updateMode: 'versioned'
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
catch (error) {
|
|
571
|
+
logger.error('병합 전략 결정 실패', {
|
|
572
|
+
error: error instanceof Error ? error.message : String(error)
|
|
573
|
+
});
|
|
574
|
+
return {
|
|
575
|
+
shouldMerge: false,
|
|
576
|
+
similarity: 0,
|
|
577
|
+
updateMode: 'versioned'
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
//# sourceMappingURL=procedural-memory-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procedural-memory-extractor.js","sourceRoot":"","sources":["../../../src/shared/utils/procedural-memory-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relation Type 변환 유틸리티
|
|
3
|
+
*
|
|
4
|
+
* memory_link 테이블의 relation_type (소문자 스네이크 케이스)와
|
|
5
|
+
* TypeScript RelationType (대문자 스네이크 케이스) 간의 변환을 처리합니다.
|
|
6
|
+
*
|
|
7
|
+
* Procedural Memory Enhancement (v7.0)
|
|
8
|
+
*/
|
|
9
|
+
import type { RelationType } from '../types/relation.js';
|
|
10
|
+
/**
|
|
11
|
+
* TypeScript RelationType을 DB relation_type 값으로 변환
|
|
12
|
+
*
|
|
13
|
+
* @param relationType - TypeScript RelationType (예: 'VERSION_OF')
|
|
14
|
+
* @returns DB relation_type 값 (예: 'version_of')
|
|
15
|
+
* @throws {Error} 매핑되지 않은 RelationType인 경우
|
|
16
|
+
*/
|
|
17
|
+
export declare function toDbRelationType(relationType: RelationType): string;
|
|
18
|
+
/**
|
|
19
|
+
* DB relation_type 값을 TypeScript RelationType으로 변환
|
|
20
|
+
*
|
|
21
|
+
* @param dbValue - DB relation_type 값 (예: 'version_of')
|
|
22
|
+
* @returns TypeScript RelationType (예: 'VERSION_OF') 또는 null (매핑되지 않은 경우)
|
|
23
|
+
*
|
|
24
|
+
* @remarks
|
|
25
|
+
* 'duplicates'는 DB에는 존재하지만 TypeScript enum에 대응값이 없으므로 null을 반환합니다.
|
|
26
|
+
* 이는 005 마이그레이션에서 제거된 관계 유형입니다.
|
|
27
|
+
*/
|
|
28
|
+
export declare function fromDbRelationType(dbValue: string): RelationType | null;
|
|
29
|
+
/**
|
|
30
|
+
* DB relation_type 값이 유효한지 확인
|
|
31
|
+
*
|
|
32
|
+
* @param dbValue - 확인할 DB relation_type 값
|
|
33
|
+
* @returns 유효한 경우 true, 그렇지 않으면 false
|
|
34
|
+
*/
|
|
35
|
+
export declare function isValidDbRelationType(dbValue: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* TypeScript RelationType이 memory_link 테이블에서 지원되는지 확인
|
|
38
|
+
*
|
|
39
|
+
* @param relationType - 확인할 RelationType
|
|
40
|
+
* @returns memory_link에서 지원되는 경우 true, 그렇지 않으면 false
|
|
41
|
+
*
|
|
42
|
+
* @remarks
|
|
43
|
+
* memory_link 테이블은 다음 relation_type만 지원합니다:
|
|
44
|
+
* - 'version_of' (VERSION_OF)
|
|
45
|
+
* - 'cause_of' (CAUSES)
|
|
46
|
+
* - 'derived_from' (DEPENDS_ON)
|
|
47
|
+
* - 'contradicts' (CONTRASTS_WITH)
|
|
48
|
+
*
|
|
49
|
+
* memory_relation 테이블은 모든 RelationType을 지원합니다.
|
|
50
|
+
*/
|
|
51
|
+
export declare function isMemoryLinkSupported(relationType: RelationType): boolean;
|
|
52
|
+
//# sourceMappingURL=relation-type-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-type-converter.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/relation-type-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAoCzD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,CAQnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAUvE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO9D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAGzE"}
|