memento-mcp-server 1.12.0 → 1.13.0-b

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 (119) hide show
  1. package/dist/algorithms/forgetting-algorithm.d.ts +21 -13
  2. package/dist/algorithms/forgetting-algorithm.d.ts.map +1 -1
  3. package/dist/algorithms/forgetting-algorithm.js +32 -24
  4. package/dist/algorithms/forgetting-algorithm.js.map +1 -1
  5. package/dist/algorithms/hybrid-search-engine.d.ts +11 -9
  6. package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -1
  7. package/dist/algorithms/hybrid-search-engine.js +77 -75
  8. package/dist/algorithms/hybrid-search-engine.js.map +1 -1
  9. package/dist/algorithms/search-engine.d.ts +33 -11
  10. package/dist/algorithms/search-engine.d.ts.map +1 -1
  11. package/dist/algorithms/search-engine.js +157 -62
  12. package/dist/algorithms/search-engine.js.map +1 -1
  13. package/dist/algorithms/search-ranking.d.ts +57 -50
  14. package/dist/algorithms/search-ranking.d.ts.map +1 -1
  15. package/dist/algorithms/search-ranking.js +91 -84
  16. package/dist/algorithms/search-ranking.js.map +1 -1
  17. package/dist/algorithms/spaced-repetition.d.ts +18 -13
  18. package/dist/algorithms/spaced-repetition.d.ts.map +1 -1
  19. package/dist/algorithms/spaced-repetition.js +28 -23
  20. package/dist/algorithms/spaced-repetition.js.map +1 -1
  21. package/dist/algorithms/vector-search-engine-migration.d.ts +8 -6
  22. package/dist/algorithms/vector-search-engine-migration.d.ts.map +1 -1
  23. package/dist/algorithms/vector-search-engine-migration.js +13 -11
  24. package/dist/algorithms/vector-search-engine-migration.js.map +1 -1
  25. package/dist/algorithms/vector-search-engine-refactored.d.ts +7 -7
  26. package/dist/algorithms/vector-search-engine-refactored.d.ts.map +1 -1
  27. package/dist/algorithms/vector-search-engine-refactored.js +7 -7
  28. package/dist/algorithms/vector-search-engine-refactored.js.map +1 -1
  29. package/dist/algorithms/vector-search-engine.d.ts +25 -20
  30. package/dist/algorithms/vector-search-engine.d.ts.map +1 -1
  31. package/dist/algorithms/vector-search-engine.js +47 -43
  32. package/dist/algorithms/vector-search-engine.js.map +1 -1
  33. package/dist/config/index.d.ts.map +1 -1
  34. package/dist/config/index.js +4 -1
  35. package/dist/config/index.js.map +1 -1
  36. package/dist/database/init.d.ts.map +1 -1
  37. package/dist/database/init.js +24 -4
  38. package/dist/database/init.js.map +1 -1
  39. package/dist/database/migration/migrations/006-fts5-reflection-notes-migration-status.sql +30 -0
  40. package/dist/database/migration/migrations/006-fts5-reflection-notes.d.ts +113 -0
  41. package/dist/database/migration/migrations/006-fts5-reflection-notes.d.ts.map +1 -0
  42. package/dist/database/migration/migrations/006-fts5-reflection-notes.js +441 -0
  43. package/dist/database/migration/migrations/006-fts5-reflection-notes.js.map +1 -0
  44. package/dist/database/migration/migrations/006-fts5-reflection-notes.sql +26 -0
  45. package/dist/database/schema.sql +11 -9
  46. package/dist/server/bootstrap.d.ts +4 -0
  47. package/dist/server/bootstrap.d.ts.map +1 -1
  48. package/dist/server/bootstrap.js +11 -1
  49. package/dist/server/bootstrap.js.map +1 -1
  50. package/dist/server/context.d.ts.map +1 -1
  51. package/dist/server/context.js +3 -1
  52. package/dist/server/context.js.map +1 -1
  53. package/dist/server/http-server.d.ts.map +1 -1
  54. package/dist/server/http-server.js +2 -1
  55. package/dist/server/http-server.js.map +1 -1
  56. package/dist/server/index.js +3 -1
  57. package/dist/server/index.js.map +1 -1
  58. package/dist/services/async-optimizer.d.ts +2 -1
  59. package/dist/services/async-optimizer.d.ts.map +1 -1
  60. package/dist/services/async-optimizer.js +28 -1
  61. package/dist/services/async-optimizer.js.map +1 -1
  62. package/dist/services/batch-scheduler.d.ts +5 -1
  63. package/dist/services/batch-scheduler.d.ts.map +1 -1
  64. package/dist/services/batch-scheduler.js +13 -1
  65. package/dist/services/batch-scheduler.js.map +1 -1
  66. package/dist/services/cache-service.js +1 -1
  67. package/dist/services/cache-service.js.map +1 -1
  68. package/dist/services/failure-detector.d.ts +120 -0
  69. package/dist/services/failure-detector.d.ts.map +1 -0
  70. package/dist/services/failure-detector.js +370 -0
  71. package/dist/services/failure-detector.js.map +1 -0
  72. package/dist/services/llm-based-relation-extractor.js +1 -1
  73. package/dist/services/llm-based-relation-extractor.js.map +1 -1
  74. package/dist/services/reflexion-worker.d.ts +170 -0
  75. package/dist/services/reflexion-worker.d.ts.map +1 -0
  76. package/dist/services/reflexion-worker.js +636 -0
  77. package/dist/services/reflexion-worker.js.map +1 -0
  78. package/dist/services/relation-graph.d.ts +2 -2
  79. package/dist/services/relation-graph.js +3 -3
  80. package/dist/services/relation-graph.js.map +1 -1
  81. package/dist/tools/base-tool.d.ts +5 -0
  82. package/dist/tools/base-tool.d.ts.map +1 -1
  83. package/dist/tools/base-tool.js +39 -0
  84. package/dist/tools/base-tool.js.map +1 -1
  85. package/dist/tools/recall-tool.d.ts.map +1 -1
  86. package/dist/tools/recall-tool.js +36 -2
  87. package/dist/tools/recall-tool.js.map +1 -1
  88. package/dist/tools/remember-tool.d.ts +24 -0
  89. package/dist/tools/remember-tool.d.ts.map +1 -1
  90. package/dist/tools/remember-tool.js +445 -273
  91. package/dist/tools/remember-tool.js.map +1 -1
  92. package/dist/tools/types.d.ts +5 -1
  93. package/dist/tools/types.d.ts.map +1 -1
  94. package/dist/tools/types.js +1 -1
  95. package/dist/tools/types.js.map +1 -1
  96. package/dist/types/index.d.ts +2 -0
  97. package/dist/types/index.d.ts.map +1 -1
  98. package/dist/types/index.js.map +1 -1
  99. package/dist/utils/database.d.ts.map +1 -1
  100. package/dist/utils/database.js +34 -10
  101. package/dist/utils/database.js.map +1 -1
  102. package/dist/utils/fts5-migration-status.d.ts +72 -0
  103. package/dist/utils/fts5-migration-status.d.ts.map +1 -0
  104. package/dist/utils/fts5-migration-status.js +304 -0
  105. package/dist/utils/fts5-migration-status.js.map +1 -0
  106. package/dist/utils/reflection-notes-merge.d.ts +58 -0
  107. package/dist/utils/reflection-notes-merge.d.ts.map +1 -0
  108. package/dist/utils/reflection-notes-merge.js +227 -0
  109. package/dist/utils/reflection-notes-merge.js.map +1 -0
  110. package/dist/utils/reflection-notes-normalize.d.ts +43 -0
  111. package/dist/utils/reflection-notes-normalize.d.ts.map +1 -0
  112. package/dist/utils/reflection-notes-normalize.js +164 -0
  113. package/dist/utils/reflection-notes-normalize.js.map +1 -0
  114. package/dist/utils/reflection-notes-schema.d.ts +84 -0
  115. package/dist/utils/reflection-notes-schema.d.ts.map +1 -0
  116. package/dist/utils/reflection-notes-schema.js +215 -0
  117. package/dist/utils/reflection-notes-schema.js.map +1 -0
  118. package/package.json +3 -1
  119. package/src/database/schema.sql +11 -9
@@ -0,0 +1,636 @@
1
+ /**
2
+ * Reflexion Worker 서비스
3
+ * 실패 이벤트를 처리하여 reflection_notes를 자동 생성하고 저장
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ import { FailureDetector } from './failure-detector.js';
7
+ import { AsyncTaskQueue } from './async-optimizer.js';
8
+ import { mergeReflectionNotes, serializeReflectionNotes } from '../utils/reflection-notes-merge.js';
9
+ import { DatabaseUtils } from '../utils/database.js';
10
+ import Database from 'better-sqlite3';
11
+ import { createHash } from 'crypto';
12
+ /**
13
+ * ReflexionWorker 서비스 클래스
14
+ */
15
+ export class ReflexionWorker {
16
+ failureDetector;
17
+ db;
18
+ eventQueue;
19
+ duplicateWindow = new Map(); // 이벤트 키 -> 타임스탬프
20
+ WINDOW_SIZE_MS = 5 * 60 * 1000; // 5분
21
+ MAX_CONCURRENT = 5; // 최대 동시 실행 수
22
+ MAX_QUEUE_SIZE = 100; // 최대 큐 크기
23
+ MAX_RETRIES = 3; // 최대 재시도 횟수
24
+ RETRY_DELAYS = [1000, 2000, 4000]; // 지수 백오프: 1초, 2초, 4초
25
+ QUEUE_WARNING_THRESHOLD = 50; // 큐 적체 경고 임계값
26
+ MAX_RESTART_ATTEMPTS = 3; // 최대 재시작 횟수
27
+ status = {
28
+ isRunning: false,
29
+ activeWorkers: 0,
30
+ queueSize: 0,
31
+ processedCount: 0,
32
+ failedCount: 0,
33
+ restartCount: 0
34
+ };
35
+ cleanupInterval = null;
36
+ healthCheckInterval = null;
37
+ lastHealthCheck = Date.now();
38
+ constructor(failureDetector, db, eventQueue) {
39
+ this.failureDetector = failureDetector;
40
+ this.db = db;
41
+ // 큐 크기 제한 포함하여 생성
42
+ this.eventQueue = eventQueue || new AsyncTaskQueue(this.MAX_CONCURRENT, this.MAX_QUEUE_SIZE);
43
+ // 중복 윈도우 정리 (1분마다)
44
+ this.cleanupInterval = setInterval(() => {
45
+ this.cleanupDuplicateWindow();
46
+ }, 60 * 1000);
47
+ }
48
+ /**
49
+ * Worker 시작
50
+ */
51
+ async start() {
52
+ if (this.status.isRunning) {
53
+ logger.warn('ReflexionWorker가 이미 실행 중입니다');
54
+ return false;
55
+ }
56
+ try {
57
+ // FailureDetector의 큐에 핸들러 등록
58
+ await this.failureDetector.startQueue();
59
+ // 이벤트 큐 시작
60
+ await this.eventQueue.start();
61
+ // 헬스체크 시작
62
+ this.startHealthCheck();
63
+ this.status.isRunning = true;
64
+ this.lastHealthCheck = Date.now();
65
+ logger.info('ReflexionWorker 시작됨');
66
+ return true;
67
+ }
68
+ catch (error) {
69
+ logger.error('ReflexionWorker 시작 실패', {
70
+ error: error instanceof Error ? error.message : String(error)
71
+ });
72
+ // 시작 실패 시 자동 재시작 시도
73
+ await this.attemptRestart();
74
+ return false;
75
+ }
76
+ }
77
+ /**
78
+ * Worker 중지
79
+ */
80
+ async stop() {
81
+ if (!this.status.isRunning) {
82
+ return false;
83
+ }
84
+ try {
85
+ await this.eventQueue.stop();
86
+ await this.failureDetector.stopQueue();
87
+ if (this.cleanupInterval) {
88
+ clearInterval(this.cleanupInterval);
89
+ this.cleanupInterval = null;
90
+ }
91
+ if (this.healthCheckInterval) {
92
+ clearInterval(this.healthCheckInterval);
93
+ this.healthCheckInterval = null;
94
+ }
95
+ this.status.isRunning = false;
96
+ logger.info('ReflexionWorker 중지됨');
97
+ return true;
98
+ }
99
+ catch (error) {
100
+ logger.error('ReflexionWorker 중지 실패', {
101
+ error: error instanceof Error ? error.message : String(error)
102
+ });
103
+ return false;
104
+ }
105
+ }
106
+ /**
107
+ * 헬스체크 시작
108
+ */
109
+ startHealthCheck() {
110
+ // 30초마다 헬스체크
111
+ this.healthCheckInterval = setInterval(() => {
112
+ this.performHealthCheck();
113
+ }, 30 * 1000);
114
+ }
115
+ /**
116
+ * 헬스체크 수행
117
+ */
118
+ performHealthCheck() {
119
+ try {
120
+ const now = Date.now();
121
+ const queueStats = this.eventQueue.getStats();
122
+ // 큐 적체 확인
123
+ this.checkQueueBacklog();
124
+ // Worker 상태 확인
125
+ if (!this.eventQueue.isRunning() && this.status.isRunning) {
126
+ logger.warn('ReflexionWorker 큐가 중지됨, 재시작 시도', {
127
+ queue_running: this.eventQueue.isRunning(),
128
+ worker_running: this.status.isRunning
129
+ });
130
+ this.attemptRestart();
131
+ }
132
+ this.lastHealthCheck = now;
133
+ }
134
+ catch (error) {
135
+ logger.error('헬스체크 실패', {
136
+ error: error instanceof Error ? error.message : String(error)
137
+ });
138
+ // 헬스체크 실패 시 재시작 시도
139
+ this.attemptRestart();
140
+ }
141
+ }
142
+ /**
143
+ * Worker 재시작 시도
144
+ */
145
+ async attemptRestart() {
146
+ if (this.status.restartCount >= this.MAX_RESTART_ATTEMPTS) {
147
+ logger.error('ReflexionWorker 최대 재시작 횟수 초과', {
148
+ restart_count: this.status.restartCount,
149
+ max_attempts: this.MAX_RESTART_ATTEMPTS
150
+ });
151
+ this.status.isRunning = false;
152
+ return;
153
+ }
154
+ this.status.restartCount++;
155
+ logger.warn('ReflexionWorker 재시작 시도', {
156
+ attempt: this.status.restartCount,
157
+ max_attempts: this.MAX_RESTART_ATTEMPTS
158
+ });
159
+ try {
160
+ // 현재 상태 정리
161
+ await this.eventQueue.stop();
162
+ // 재시작
163
+ await this.eventQueue.start();
164
+ logger.info('ReflexionWorker 재시작 성공', {
165
+ restart_count: this.status.restartCount
166
+ });
167
+ }
168
+ catch (error) {
169
+ logger.error('ReflexionWorker 재시작 실패', {
170
+ error: error instanceof Error ? error.message : String(error),
171
+ restart_count: this.status.restartCount
172
+ });
173
+ // 재시작 실패 시 일정 시간 후 재시도
174
+ setTimeout(() => {
175
+ this.attemptRestart();
176
+ }, 5000); // 5초 후 재시도
177
+ }
178
+ }
179
+ /**
180
+ * auto_reflect 내부 함수
181
+ * 실패 정보를 바탕으로 Reflexion 데이터 생성 및 저장
182
+ */
183
+ async autoReflect(event) {
184
+ try {
185
+ // 중복 감지
186
+ if (this.isDuplicate(event)) {
187
+ logger.debug('중복 이벤트 감지, Reflexion 기록 스킵', {
188
+ event_id: event.id,
189
+ tool: event.tool_name
190
+ });
191
+ return;
192
+ }
193
+ // 중복 윈도우에 추가
194
+ const eventKey = this.generateEventKey(event);
195
+ this.duplicateWindow.set(eventKey, Date.now());
196
+ // Reflexion 데이터 생성
197
+ const reflectionNote = this.generateReflectionNote(event);
198
+ // 동일 task_goal 확인 및 병합
199
+ const taskGoal = event.original_task || this.extractTaskGoal(event);
200
+ if (taskGoal) {
201
+ // 기존 reflection_notes 조회 (id도 함께 조회하여 업데이트에 사용)
202
+ const existingRecord = DatabaseUtils.get(this.db, `SELECT id, reflection_notes FROM memory_item
203
+ WHERE type = 'procedural' AND task_goal = ?
204
+ ORDER BY created_at DESC LIMIT 1`, [taskGoal]);
205
+ let existing;
206
+ if (!existingRecord || !existingRecord.reflection_notes) {
207
+ existing = { type: 'null', value: null };
208
+ }
209
+ else {
210
+ const parsed = this.parseReflectionNotes(existingRecord.reflection_notes);
211
+ existing = parsed.type === 'null' ? { type: 'null', value: null } :
212
+ parsed.type === 'object' ? { type: 'object', value: parsed.value } :
213
+ { type: 'array', value: parsed.value };
214
+ }
215
+ // 반복 실패 패턴 분석
216
+ const patternAnalysis = this.analyzeFailurePattern(existing, event);
217
+ // 반복 실패 경고
218
+ if (patternAnalysis.repeatCount > 1) {
219
+ logger.warn('동일 작업 반복 실패 감지', {
220
+ task_goal: taskGoal,
221
+ repeat_count: patternAnalysis.repeatCount,
222
+ failure_types: patternAnalysis.failureTypes,
223
+ tools: patternAnalysis.tools,
224
+ message: `동일 작업이 ${patternAnalysis.repeatCount}회 실패했습니다. 개선 방안을 검토해야 합니다.`
225
+ });
226
+ }
227
+ // 병합
228
+ const mergeResult = mergeReflectionNotes(existing, reflectionNote);
229
+ const finalReflectionNotes = serializeReflectionNotes(mergeResult.merged);
230
+ // 기존 메모리 업데이트 또는 새로 생성
231
+ if (existingRecord && existingRecord.id) {
232
+ // 기존 메모리 업데이트
233
+ DatabaseUtils.run(this.db, `UPDATE memory_item SET reflection_notes = ? WHERE id = ?`, [finalReflectionNotes, existingRecord.id]);
234
+ logger.info('기존 reflection_notes 업데이트됨', {
235
+ memory_id: existingRecord.id,
236
+ task_goal: taskGoal
237
+ });
238
+ }
239
+ else {
240
+ // 새 메모리 생성 (remember Tool 사용)
241
+ // 여기서는 직접 DB에 삽입하지 않고, remember Tool을 호출하는 것이 더 나을 수 있음
242
+ // 하지만 Phase 2에서는 직접 삽입으로 처리
243
+ const memoryId = `mem_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
244
+ DatabaseUtils.run(this.db, `INSERT INTO memory_item (id, type, content, task_goal, steps, reflection_notes, importance, privacy_scope, created_at)
245
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
246
+ memoryId,
247
+ 'procedural',
248
+ `Reflexion: ${event.tool_name} 실패 기록`,
249
+ taskGoal,
250
+ JSON.stringify([]),
251
+ finalReflectionNotes,
252
+ 0.7,
253
+ 'private',
254
+ new Date().toISOString()
255
+ ]);
256
+ logger.info('새 reflection_notes 생성됨', {
257
+ memory_id: memoryId,
258
+ task_goal: taskGoal
259
+ });
260
+ }
261
+ // 경고 메시지 처리
262
+ if (mergeResult.warnings.length > 0) {
263
+ mergeResult.warnings.forEach(warning => {
264
+ logger.warn('reflection_notes 병합 경고', { warning });
265
+ });
266
+ }
267
+ if (mergeResult.removedCount > 0) {
268
+ logger.warn('reflection_notes 크기 제한으로 인해 항목 제거됨', {
269
+ removed_count: mergeResult.removedCount
270
+ });
271
+ }
272
+ }
273
+ else {
274
+ // task_goal이 없는 경우 새 메모리 생성 (task_goal 없이)
275
+ const memoryId = `mem_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
276
+ DatabaseUtils.run(this.db, `INSERT INTO memory_item (id, type, content, reflection_notes, importance, privacy_scope, created_at)
277
+ VALUES (?, ?, ?, ?, ?, ?, ?)`, [
278
+ memoryId,
279
+ 'procedural',
280
+ `Reflexion: ${event.tool_name} 실패 기록`,
281
+ JSON.stringify(reflectionNote),
282
+ 0.7,
283
+ 'private',
284
+ new Date().toISOString()
285
+ ]);
286
+ logger.info('새 reflection_notes 생성됨 (task_goal 없음)', {
287
+ memory_id: memoryId
288
+ });
289
+ }
290
+ this.status.processedCount++;
291
+ }
292
+ catch (error) {
293
+ this.status.failedCount++;
294
+ logger.error('auto_reflect 실행 실패', {
295
+ error: error instanceof Error ? error.message : String(error),
296
+ event_id: event.id
297
+ });
298
+ throw error;
299
+ }
300
+ }
301
+ /**
302
+ * 중복 감지
303
+ */
304
+ isDuplicate(event) {
305
+ const eventKey = this.generateEventKey(event);
306
+ const timestamp = this.duplicateWindow.get(eventKey);
307
+ if (!timestamp) {
308
+ return false;
309
+ }
310
+ // 슬라이딩 윈도우 내에 있는지 확인
311
+ const now = Date.now();
312
+ if (now - timestamp < this.WINDOW_SIZE_MS) {
313
+ return true;
314
+ }
315
+ // 윈도우를 벗어났으면 제거
316
+ this.duplicateWindow.delete(eventKey);
317
+ return false;
318
+ }
319
+ /**
320
+ * 이벤트 키 생성: SHA256({tool_name}_{error_type}_{error_message_hash})
321
+ */
322
+ generateEventKey(event) {
323
+ const keyString = `${event.tool_name}_${event.error_type}_${event.error_message_hash}`;
324
+ return createHash('sha256').update(keyString).digest('hex');
325
+ }
326
+ /**
327
+ * 중복 윈도우 정리 (만료된 항목 제거)
328
+ */
329
+ cleanupDuplicateWindow() {
330
+ const now = Date.now();
331
+ for (const [key, timestamp] of this.duplicateWindow.entries()) {
332
+ if (now - timestamp >= this.WINDOW_SIZE_MS) {
333
+ this.duplicateWindow.delete(key);
334
+ }
335
+ }
336
+ }
337
+ /**
338
+ * Reflexion 데이터 생성
339
+ */
340
+ generateReflectionNote(event) {
341
+ return {
342
+ failure_type: event.error_type,
343
+ failure_description: event.error_message,
344
+ timestamp: event.timestamp,
345
+ original_task: event.original_task,
346
+ lessons_learned: this.generateLessonsLearned(event),
347
+ suggested_improvements: this.generateSuggestedImprovements(event),
348
+ phase: 'auto' // 자동 생성
349
+ };
350
+ }
351
+ /**
352
+ * 교훈 추출 (템플릿 기반)
353
+ */
354
+ generateLessonsLearned(event) {
355
+ const templates = {
356
+ 'tool_error': `${event.tool_name} 도구 실행 중 오류가 발생했습니다. 에러 유형을 분석하여 재발 방지 방안을 수립해야 합니다.`,
357
+ 'user_feedback': `사용자 피드백을 통해 ${event.tool_name} 도구의 문제점이 확인되었습니다. 사용자 요구사항을 반영하여 개선이 필요합니다.`,
358
+ 'metric_failure': `${event.tool_name} 도구의 성능 지표가 임계값을 초과했습니다. 성능 최적화가 필요합니다.`
359
+ };
360
+ return templates[event.error_type] || `${event.tool_name} 도구 실행 중 문제가 발생했습니다.`;
361
+ }
362
+ /**
363
+ * 개선 방안 제안 (템플릿 기반)
364
+ */
365
+ generateSuggestedImprovements(event) {
366
+ const errorMessage = event.error_message.toLowerCase();
367
+ let suggestions = [];
368
+ if (errorMessage.includes('validation') || errorMessage.includes('검증')) {
369
+ suggestions.push('입력 파라미터 검증 로직을 강화해야 합니다.');
370
+ }
371
+ if (errorMessage.includes('database') || errorMessage.includes('데이터베이스') || errorMessage.includes('sqlite')) {
372
+ suggestions.push('데이터베이스 연결 및 쿼리 최적화가 필요합니다.');
373
+ }
374
+ if (errorMessage.includes('timeout') || errorMessage.includes('타임아웃')) {
375
+ suggestions.push('타임아웃 설정을 조정하고 재시도 로직을 추가해야 합니다.');
376
+ }
377
+ if (event.context?.execution_time_ms && event.context.execution_time_ms > 5000) {
378
+ suggestions.push('실행 시간이 길어 성능 최적화가 필요합니다.');
379
+ }
380
+ if (suggestions.length === 0) {
381
+ suggestions.push('에러 로그를 분석하여 근본 원인을 파악하고 개선 방안을 수립해야 합니다.');
382
+ }
383
+ return suggestions.join(' ');
384
+ }
385
+ /**
386
+ * 반복 실패 패턴 분석
387
+ * 동일 task_goal의 반복 실패 횟수 및 패턴을 분석
388
+ */
389
+ analyzeFailurePattern(existing, currentEvent) {
390
+ let repeatCount = 1; // 현재 실패 포함
391
+ const failureTypes = new Set([currentEvent.error_type]);
392
+ const tools = new Set([currentEvent.tool_name]);
393
+ const errorMessages = [currentEvent.error_message];
394
+ // 기존 reflection_notes 분석
395
+ if (existing.type === 'array') {
396
+ const existingArray = existing.value;
397
+ repeatCount += existingArray.length;
398
+ for (const note of existingArray) {
399
+ if (note.failure_type) {
400
+ failureTypes.add(note.failure_type);
401
+ }
402
+ if (note.tool_name) {
403
+ tools.add(note.tool_name);
404
+ }
405
+ if (note.failure_description) {
406
+ errorMessages.push(note.failure_description);
407
+ }
408
+ }
409
+ }
410
+ else if (existing.type === 'object') {
411
+ repeatCount += 1;
412
+ const note = existing.value;
413
+ if (note.failure_type) {
414
+ failureTypes.add(note.failure_type);
415
+ }
416
+ if (note.tool_name) {
417
+ tools.add(note.tool_name);
418
+ }
419
+ if (note.failure_description) {
420
+ errorMessages.push(note.failure_description);
421
+ }
422
+ }
423
+ return {
424
+ repeatCount,
425
+ failureTypes: Array.from(failureTypes),
426
+ tools: Array.from(tools),
427
+ errorMessages
428
+ };
429
+ }
430
+ /**
431
+ * 작업 목표 추출
432
+ */
433
+ extractTaskGoal(event) {
434
+ if (event.original_task) {
435
+ return event.original_task;
436
+ }
437
+ // context에서 추출 시도
438
+ if (event.context?.params?.task_goal) {
439
+ return event.context.params.task_goal;
440
+ }
441
+ if (event.context?.params?.content) {
442
+ const content = event.context.params.content;
443
+ if (content.length > 200) {
444
+ return content.substring(0, 200) + '...';
445
+ }
446
+ return content;
447
+ }
448
+ return undefined;
449
+ }
450
+ /**
451
+ * reflection_notes 파싱
452
+ */
453
+ parseReflectionNotes(reflectionNotes) {
454
+ if (!reflectionNotes) {
455
+ return { type: 'null', value: null };
456
+ }
457
+ try {
458
+ const parsed = JSON.parse(reflectionNotes);
459
+ if (Array.isArray(parsed)) {
460
+ return { type: 'array', value: parsed };
461
+ }
462
+ else if (typeof parsed === 'object' && parsed !== null) {
463
+ return { type: 'object', value: parsed };
464
+ }
465
+ else {
466
+ return { type: 'null', value: null };
467
+ }
468
+ }
469
+ catch (error) {
470
+ logger.warn('reflection_notes 파싱 실패', {
471
+ error: error instanceof Error ? error.message : String(error)
472
+ });
473
+ return { type: 'null', value: null };
474
+ }
475
+ }
476
+ /**
477
+ * FailureDetector의 큐에 핸들러 등록
478
+ * FailureDetector가 실패 이벤트를 큐에 추가할 때 이 핸들러를 사용하도록 설정
479
+ */
480
+ registerHandler() {
481
+ // FailureDetector의 queueFailureEvent를 래핑하여
482
+ // 큐 크기 제한 및 processFailureEvent를 호출하도록 설정
483
+ // 실제로는 FailureDetector에 직접 등록하는 대신,
484
+ // BaseTool의 handleFailure에서 이 메서드를 호출하도록 수정 필요
485
+ // 또는 FailureDetector에 setHandler 메서드를 추가
486
+ }
487
+ /**
488
+ * 실패 이벤트를 큐에 추가 (큐 크기 제한 포함)
489
+ * FailureDetector의 queueFailureEvent를 대체하는 메서드
490
+ * AsyncTaskQueue가 자동으로 큐 크기 제한을 처리함
491
+ */
492
+ async queueFailureEvent(event) {
493
+ try {
494
+ // 큐에 추가 (processFailureEvent를 핸들러로 사용)
495
+ // AsyncTaskQueue의 addTask에서 자동으로 큐 크기 제한 처리
496
+ const taskId = this.eventQueue.addTask({
497
+ id: event.id,
498
+ type: 'failure_event',
499
+ data: {
500
+ event,
501
+ handler: (evt) => this.processFailureEvent(evt)
502
+ },
503
+ priority: event.priority,
504
+ maxRetries: this.MAX_RETRIES,
505
+ timeout: 30000 // 30초 타임아웃
506
+ });
507
+ if (taskId === false) {
508
+ logger.warn('실패 이벤트 큐 추가 실패 (중복 또는 큐 가득참)', {
509
+ event_id: event.id,
510
+ tool: event.tool_name
511
+ });
512
+ return false;
513
+ }
514
+ // 큐 적체 경고 확인
515
+ this.checkQueueBacklog();
516
+ logger.debug('실패 이벤트 큐에 추가됨', {
517
+ event_id: event.id,
518
+ tool: event.tool_name,
519
+ priority: event.priority,
520
+ queue_size: this.eventQueue.getStats().pending
521
+ });
522
+ return true;
523
+ }
524
+ catch (error) {
525
+ logger.error('실패 이벤트 큐 추가 중 오류 발생', {
526
+ error: error instanceof Error ? error.message : String(error),
527
+ event_id: event.id
528
+ });
529
+ return false;
530
+ }
531
+ }
532
+ /**
533
+ * 가장 오래된 큐 이벤트 제거 (FIFO)
534
+ * AsyncTaskQueue의 큐 크기 제한 기능을 사용하므로 여기서는 더 이상 필요 없음
535
+ * @deprecated AsyncTaskQueue가 자동으로 처리하므로 사용하지 않음
536
+ */
537
+ removeOldestQueuedEvent() {
538
+ // AsyncTaskQueue의 addTask에서 자동으로 큐 크기 제한을 처리하므로
539
+ // 여기서는 더 이상 필요 없음
540
+ return null;
541
+ }
542
+ /**
543
+ * 실패 이벤트 처리 (재시도 및 백오프 포함)
544
+ */
545
+ async processFailureEvent(event) {
546
+ let lastError = null;
547
+ for (let attempt = 0; attempt < this.MAX_RETRIES; attempt++) {
548
+ try {
549
+ await this.autoReflect(event);
550
+ return; // 성공
551
+ }
552
+ catch (error) {
553
+ lastError = error instanceof Error ? error : new Error(String(error));
554
+ if (attempt < this.MAX_RETRIES - 1) {
555
+ const delay = this.RETRY_DELAYS[attempt] || this.RETRY_DELAYS[this.RETRY_DELAYS.length - 1];
556
+ logger.warn('Reflexion 기록 실패, 재시도 예정', {
557
+ attempt: attempt + 1,
558
+ max_retries: this.MAX_RETRIES,
559
+ delay_ms: delay,
560
+ event_id: event.id
561
+ });
562
+ await new Promise(resolve => setTimeout(resolve, delay));
563
+ }
564
+ }
565
+ }
566
+ // 모든 재시도 실패
567
+ logger.error('Reflexion 기록 최종 실패', {
568
+ event_id: event.id,
569
+ error: lastError?.message,
570
+ retry_count: this.MAX_RETRIES
571
+ });
572
+ throw lastError || new Error('Reflexion 기록 실패');
573
+ }
574
+ /**
575
+ * Worker 상태 조회
576
+ */
577
+ getStatus() {
578
+ const queueStats = this.eventQueue.getStats();
579
+ return {
580
+ ...this.status,
581
+ queueSize: queueStats.pending,
582
+ activeWorkers: queueStats.processing
583
+ };
584
+ }
585
+ /**
586
+ * 큐 적체 경고 확인
587
+ */
588
+ checkQueueBacklog() {
589
+ const queueStats = this.eventQueue.getStats();
590
+ if (queueStats.pending > this.QUEUE_WARNING_THRESHOLD) {
591
+ logger.warn('ReflexionWorker 큐 적체 경고', {
592
+ queue_size: queueStats.pending,
593
+ threshold: this.QUEUE_WARNING_THRESHOLD
594
+ });
595
+ }
596
+ }
597
+ /**
598
+ * Reflexion 기록 메트릭 수집
599
+ */
600
+ getReflexionMetrics() {
601
+ const status = this.getStatus();
602
+ const queueStats = this.eventQueue.getStats();
603
+ const total = status.processedCount + status.failedCount;
604
+ const successRate = total > 0 ? status.processedCount / total : 0.0;
605
+ return {
606
+ processedCount: status.processedCount,
607
+ failedCount: status.failedCount,
608
+ successRate,
609
+ averageProcessingTime: queueStats.averageProcessingTime,
610
+ queueSize: status.queueSize,
611
+ activeWorkers: status.activeWorkers,
612
+ restartCount: status.restartCount
613
+ };
614
+ }
615
+ /**
616
+ * 통합 메트릭 수집 (FailureDetector + ReflexionWorker)
617
+ */
618
+ getIntegratedMetrics() {
619
+ const detectionMetrics = this.failureDetector.getDetectionMetrics();
620
+ const reflexionMetrics = this.getReflexionMetrics();
621
+ // 전체 메트릭 계산
622
+ const recall = detectionMetrics.detectionRate; // 재현율 (간단히 감지율로 근사)
623
+ const precision = 1.0; // 정밀도 (모든 감지가 올바르다고 가정, 실제로는 검증 필요)
624
+ const reflexionSuccessRate = reflexionMetrics.successRate;
625
+ return {
626
+ detection: detectionMetrics,
627
+ reflexion: reflexionMetrics,
628
+ overall: {
629
+ recall,
630
+ precision,
631
+ reflexionSuccessRate
632
+ }
633
+ };
634
+ }
635
+ }
636
+ //# sourceMappingURL=reflexion-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflexion-worker.js","sourceRoot":"","sources":["../../src/services/reflexion-worker.ts"],"names":[],"mappings":"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"}