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.
- package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.d.ts +18 -0
- package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.d.ts.map +1 -0
- package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.js +346 -0
- package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.js.map +1 -0
- package/dist/domains/memory/tools/recall-tool.d.ts +177 -0
- package/dist/domains/memory/tools/recall-tool.d.ts.map +1 -1
- package/dist/domains/memory/tools/recall-tool.js +329 -3
- package/dist/domains/memory/tools/recall-tool.js.map +1 -1
- package/dist/domains/memory/tools/remember-tool.d.ts.map +1 -1
- package/dist/domains/memory/tools/remember-tool.js +182 -1
- package/dist/domains/memory/tools/remember-tool.js.map +1 -1
- package/dist/infrastructure/database/database/migration/migrations/005-relation-engine-schema.sql +7 -7
- package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.d.ts +65 -0
- package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.d.ts.map +1 -0
- package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.js +250 -0
- package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.js.map +1 -0
- package/dist/infrastructure/database/database/migration/migrations/008-arigraph-schema-expansion.sql +86 -0
- package/dist/infrastructure/logging/triple-extraction-logger.d.ts +92 -0
- package/dist/infrastructure/logging/triple-extraction-logger.d.ts.map +1 -0
- package/dist/infrastructure/logging/triple-extraction-logger.js +194 -0
- package/dist/infrastructure/logging/triple-extraction-logger.js.map +1 -0
- package/dist/infrastructure/scheduler/batch-scheduler.d.ts +57 -0
- package/dist/infrastructure/scheduler/batch-scheduler.d.ts.map +1 -1
- package/dist/infrastructure/scheduler/batch-scheduler.js +220 -0
- package/dist/infrastructure/scheduler/batch-scheduler.js.map +1 -1
- package/dist/infrastructure/scheduler/jobs/triple-extraction-batch-job.d.ts +194 -0
- package/dist/infrastructure/scheduler/jobs/triple-extraction-batch-job.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/jobs/triple-extraction-batch-job.js +639 -0
- package/dist/infrastructure/scheduler/jobs/triple-extraction-batch-job.js.map +1 -0
- package/dist/services/semantic-memory/semantic-memory-statistics.d.ts +64 -0
- package/dist/services/semantic-memory/semantic-memory-statistics.d.ts.map +1 -0
- package/dist/services/semantic-memory/semantic-memory-statistics.js +113 -0
- package/dist/services/semantic-memory/semantic-memory-statistics.js.map +1 -0
- package/dist/services/semantic-memory/semantic-memory-update-service.d.ts +257 -0
- package/dist/services/semantic-memory/semantic-memory-update-service.d.ts.map +1 -0
- package/dist/services/semantic-memory/semantic-memory-update-service.js +696 -0
- package/dist/services/semantic-memory/semantic-memory-update-service.js.map +1 -0
- package/dist/services/triple-extraction/entity-linker.d.ts +55 -0
- package/dist/services/triple-extraction/entity-linker.d.ts.map +1 -0
- package/dist/services/triple-extraction/entity-linker.js +154 -0
- package/dist/services/triple-extraction/entity-linker.js.map +1 -0
- package/dist/services/triple-extraction/predicate-canonicalizer.d.ts +63 -0
- package/dist/services/triple-extraction/predicate-canonicalizer.d.ts.map +1 -0
- package/dist/services/triple-extraction/predicate-canonicalizer.js +166 -0
- package/dist/services/triple-extraction/predicate-canonicalizer.js.map +1 -0
- package/dist/services/triple-extraction/triple-extraction-service.d.ts +181 -0
- package/dist/services/triple-extraction/triple-extraction-service.d.ts.map +1 -0
- package/dist/services/triple-extraction/triple-extraction-service.js +907 -0
- package/dist/services/triple-extraction/triple-extraction-service.js.map +1 -0
- package/dist/services/triple-extraction/triple-extraction-statistics.d.ts +74 -0
- package/dist/services/triple-extraction/triple-extraction-statistics.d.ts.map +1 -0
- package/dist/services/triple-extraction/triple-extraction-statistics.js +146 -0
- package/dist/services/triple-extraction/triple-extraction-statistics.js.map +1 -0
- package/dist/shared/types/index.d.ts +1 -0
- package/dist/shared/types/index.d.ts.map +1 -1
- package/dist/shared/types/index.js.map +1 -1
- package/dist/shared/types/triple-extraction.d.ts +99 -0
- package/dist/shared/types/triple-extraction.d.ts.map +1 -0
- package/dist/shared/types/triple-extraction.js +6 -0
- package/dist/shared/types/triple-extraction.js.map +1 -0
- package/dist/shared/utils/pii-masker.d.ts +67 -0
- package/dist/shared/utils/pii-masker.d.ts.map +1 -0
- package/dist/shared/utils/pii-masker.js +205 -0
- package/dist/shared/utils/pii-masker.js.map +1 -0
- package/dist/shared/utils/prompt-template-loader.d.ts +42 -0
- package/dist/shared/utils/prompt-template-loader.d.ts.map +1 -0
- package/dist/shared/utils/prompt-template-loader.js +92 -0
- package/dist/shared/utils/prompt-template-loader.js.map +1 -0
- package/dist/shared/utils/triple-cache.d.ts +90 -0
- package/dist/shared/utils/triple-cache.d.ts.map +1 -0
- package/dist/shared/utils/triple-cache.js +124 -0
- package/dist/shared/utils/triple-cache.js.map +1 -0
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +1 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Episodic to Semantic Tool - Episodic Memory를 Semantic Memory로 변환하는 도구
|
|
3
|
+
*
|
|
4
|
+
* AriGraph Pipeline의 수동 변환 기능을 제공합니다.
|
|
5
|
+
* 기존 Episodic Memory에 대해 Triple 추출 및 Semantic Memory 생성을 수행합니다.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseTool } from '../../../tools/base-tool.js';
|
|
8
|
+
import type { ToolContext, ToolResult } from '../../../tools/types.js';
|
|
9
|
+
export declare class ConvertEpisodicToSemanticTool extends BaseTool {
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Given: memory_id 또는 필터 조건
|
|
13
|
+
* When: convert_episodic_to_semantic 호출
|
|
14
|
+
* Then: Triple 추출 및 Semantic Memory 생성 결과 반환
|
|
15
|
+
*/
|
|
16
|
+
handle(params: any, context: ToolContext): Promise<ToolResult>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=convert-episodic-to-semantic-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-episodic-to-semantic-tool.d.ts","sourceRoot":"","sources":["../../../../src/domains/memory/tools/convert-episodic-to-semantic-tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAkBvE,qBAAa,6BAA8B,SAAQ,QAAQ;;IAmCzD;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAuVrE"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Episodic to Semantic Tool - Episodic Memory를 Semantic Memory로 변환하는 도구
|
|
3
|
+
*
|
|
4
|
+
* AriGraph Pipeline의 수동 변환 기능을 제공합니다.
|
|
5
|
+
* 기존 Episodic Memory에 대해 Triple 추출 및 Semantic Memory 생성을 수행합니다.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { BaseTool } from '../../../tools/base-tool.js';
|
|
9
|
+
import { DatabaseUtils } from '../../../shared/utils/database.js';
|
|
10
|
+
import { TripleExtractionService } from '../../../services/triple-extraction/triple-extraction-service.js';
|
|
11
|
+
import { SemanticMemoryUpdateService } from '../../../services/semantic-memory/semantic-memory-update-service.js';
|
|
12
|
+
import { logger } from '../../../shared/utils/logger.js';
|
|
13
|
+
import { UnifiedEmbeddingService } from '../../../domains/embedding/services/unified-embedding-service.js';
|
|
14
|
+
/**
|
|
15
|
+
* Convert Episodic to Semantic 스키마
|
|
16
|
+
*/
|
|
17
|
+
const ConvertEpisodicToSemanticSchema = z.object({
|
|
18
|
+
memory_id: z.string().optional(), // 단일 Episodic Memory ID (선택)
|
|
19
|
+
// 필터 조건 (memory_id가 없을 때 사용)
|
|
20
|
+
skip_converted: z.boolean().default(true).optional(), // 이미 변환된 항목 건너뛰기 (기본값: true)
|
|
21
|
+
retry_failed: z.boolean().default(false).optional(), // 실패한 항목 재시도 (기본값: false)
|
|
22
|
+
limit: z.number().min(1).max(100).default(10).optional(), // 배치 처리 시 최대 개수 (기본값: 10)
|
|
23
|
+
});
|
|
24
|
+
export class ConvertEpisodicToSemanticTool extends BaseTool {
|
|
25
|
+
constructor() {
|
|
26
|
+
super('convert_episodic_to_semantic', '기존 Episodic Memory를 Semantic Memory로 변환합니다. Triple 추출 및 Semantic Memory 생성을 수행합니다.', {
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: {
|
|
29
|
+
memory_id: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: '변환할 Episodic Memory ID (단일 변환 시 사용, 선택)'
|
|
32
|
+
},
|
|
33
|
+
skip_converted: {
|
|
34
|
+
type: 'boolean',
|
|
35
|
+
description: '이미 변환된 항목 건너뛰기 여부 (기본값: true)',
|
|
36
|
+
default: true
|
|
37
|
+
},
|
|
38
|
+
retry_failed: {
|
|
39
|
+
type: 'boolean',
|
|
40
|
+
description: '실패한 항목 재시도 여부 (기본값: false)',
|
|
41
|
+
default: false
|
|
42
|
+
},
|
|
43
|
+
limit: {
|
|
44
|
+
type: 'number',
|
|
45
|
+
minimum: 1,
|
|
46
|
+
maximum: 100,
|
|
47
|
+
description: '배치 처리 시 최대 개수 (기본값: 10)',
|
|
48
|
+
default: 10
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
required: [] // memory_id 또는 필터 조건 중 하나는 필수
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Given: memory_id 또는 필터 조건
|
|
56
|
+
* When: convert_episodic_to_semantic 호출
|
|
57
|
+
* Then: Triple 추출 및 Semantic Memory 생성 결과 반환
|
|
58
|
+
*/
|
|
59
|
+
async handle(params, context) {
|
|
60
|
+
try {
|
|
61
|
+
const { memory_id, skip_converted = true, retry_failed = false, limit = 10 } = ConvertEpisodicToSemanticSchema.parse(params);
|
|
62
|
+
const db = context.db;
|
|
63
|
+
if (!db) {
|
|
64
|
+
return this.createErrorResult('DATABASE_NOT_AVAILABLE', '데이터베이스가 사용 가능하지 않습니다');
|
|
65
|
+
}
|
|
66
|
+
// PRD 5.9: 수동 변환 로직 구현
|
|
67
|
+
// 선택된 Episodic Memory에 대해 Triple 추출 및 Semantic Memory 생성
|
|
68
|
+
let episodicMemories = [];
|
|
69
|
+
if (memory_id) {
|
|
70
|
+
// 단일 Episodic Memory 변환
|
|
71
|
+
// skip_converted 옵션 확인
|
|
72
|
+
let memory;
|
|
73
|
+
// 먼저 메모리 존재 여부 확인
|
|
74
|
+
const memoryExists = DatabaseUtils.get(db, `
|
|
75
|
+
SELECT id, triple_extracted, triple_extracted_status FROM memory_item
|
|
76
|
+
WHERE id = ? AND type = 'episodic'
|
|
77
|
+
`, [memory_id]);
|
|
78
|
+
if (!memoryExists) {
|
|
79
|
+
// 메모리가 존재하지 않는 경우
|
|
80
|
+
return this.createErrorResult('MEMORY_NOT_FOUND', `Episodic Memory를 찾을 수 없습니다: ${memory_id}`);
|
|
81
|
+
}
|
|
82
|
+
// skip_converted=true이고 이미 변환된 경우 skipped로 처리
|
|
83
|
+
if (skip_converted && memoryExists.triple_extracted === 1 && memoryExists.triple_extracted_status === 'success') {
|
|
84
|
+
return this.createSuccessResult({
|
|
85
|
+
total: 1,
|
|
86
|
+
success: 0,
|
|
87
|
+
failed: 0,
|
|
88
|
+
skipped: 1,
|
|
89
|
+
semantic_memory_ids: []
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// skip_converted=true인 경우: 이미 변환된 항목은 조회하지 않음
|
|
93
|
+
if (skip_converted) {
|
|
94
|
+
memory = DatabaseUtils.get(db, `
|
|
95
|
+
SELECT id, content, importance, triple_extracted, triple_extracted_status FROM memory_item
|
|
96
|
+
WHERE id = ? AND type = 'episodic'
|
|
97
|
+
AND (triple_extracted IS NULL OR triple_extracted = 0)
|
|
98
|
+
`, [memory_id]);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
memory = DatabaseUtils.get(db, `
|
|
102
|
+
SELECT id, content, importance, triple_extracted, triple_extracted_status FROM memory_item
|
|
103
|
+
WHERE id = ? AND type = 'episodic'
|
|
104
|
+
`, [memory_id]);
|
|
105
|
+
}
|
|
106
|
+
if (!memory) {
|
|
107
|
+
// skip_converted=true이고 이미 변환된 경우 (위에서 처리했지만 이중 검증)
|
|
108
|
+
if (skip_converted) {
|
|
109
|
+
return this.createSuccessResult({
|
|
110
|
+
total: 1,
|
|
111
|
+
success: 0,
|
|
112
|
+
failed: 0,
|
|
113
|
+
skipped: 1,
|
|
114
|
+
semantic_memory_ids: []
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// 이 경우는 발생하지 않아야 하지만 안전을 위해
|
|
118
|
+
return this.createErrorResult('MEMORY_NOT_FOUND', `Episodic Memory를 찾을 수 없습니다: ${memory_id}`);
|
|
119
|
+
}
|
|
120
|
+
episodicMemories = [{ id: memory.id, content: memory.content, importance: memory.importance }];
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// PRD 5.10: 배치 처리 지원 - 필터 조건에 따라 Episodic Memory 조회
|
|
124
|
+
// PRD 5.11: 변환 상태 추적 로직 (이미 변환된 항목 건너뛰기, 실패한 항목 재시도 옵션)
|
|
125
|
+
// WHERE 조건 구성
|
|
126
|
+
const conditions = ["type = 'episodic'"];
|
|
127
|
+
const params = [];
|
|
128
|
+
// skip_converted=true인 경우: 이미 변환된 항목 건너뛰기
|
|
129
|
+
// triple_extracted IS NULL (미처리) 또는 triple_extracted = 0 (실패)
|
|
130
|
+
if (skip_converted) {
|
|
131
|
+
conditions.push("(triple_extracted IS NULL OR triple_extracted = 0)");
|
|
132
|
+
}
|
|
133
|
+
// retry_failed 옵션에 따른 조건 추가
|
|
134
|
+
if (retry_failed) {
|
|
135
|
+
// 실패한 항목 재시도: triple_extracted_status='failed' 포함
|
|
136
|
+
// skip_converted와 함께 사용 시 실패한 항목만 재시도
|
|
137
|
+
if (skip_converted) {
|
|
138
|
+
conditions.push("triple_extracted_status = 'failed'");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// retry_failed=false인 경우: 실패한 항목 제외
|
|
143
|
+
conditions.push("(triple_extracted_status IS NULL OR triple_extracted_status != 'failed')");
|
|
144
|
+
}
|
|
145
|
+
// 포기된 항목은 제외 (수동 재시도 필요)
|
|
146
|
+
conditions.push("(triple_extracted_status IS NULL OR triple_extracted_status != 'abandoned')");
|
|
147
|
+
// 쿼리 실행
|
|
148
|
+
const query = `
|
|
149
|
+
SELECT id, content, importance FROM memory_item
|
|
150
|
+
WHERE ${conditions.join(' AND ')}
|
|
151
|
+
ORDER BY created_at ASC
|
|
152
|
+
LIMIT ?
|
|
153
|
+
`;
|
|
154
|
+
params.push(limit);
|
|
155
|
+
episodicMemories = DatabaseUtils.all(db, query, params);
|
|
156
|
+
if (episodicMemories.length === 0) {
|
|
157
|
+
return this.createSuccessResult({
|
|
158
|
+
total: 0,
|
|
159
|
+
success: 0,
|
|
160
|
+
failed: 0,
|
|
161
|
+
skipped: 0,
|
|
162
|
+
semantic_memory_ids: [],
|
|
163
|
+
message: '변환할 Episodic Memory가 없습니다.'
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// 변환 결과 추적
|
|
168
|
+
const results = {
|
|
169
|
+
total: episodicMemories.length,
|
|
170
|
+
success: 0,
|
|
171
|
+
failed: 0,
|
|
172
|
+
skipped: 0,
|
|
173
|
+
semantic_memory_ids: []
|
|
174
|
+
};
|
|
175
|
+
// 각 Episodic Memory에 대해 Triple 추출 및 Semantic Memory 생성
|
|
176
|
+
for (const episodicMemory of episodicMemories) {
|
|
177
|
+
try {
|
|
178
|
+
// PRD 5.11: 변환 상태 추적 로직
|
|
179
|
+
// 이미 변환된 항목 건너뛰기 (skip_converted=true인 경우 쿼리에서 이미 필터링됨)
|
|
180
|
+
// 하지만 안전을 위해 한 번 더 확인
|
|
181
|
+
if (skip_converted) {
|
|
182
|
+
const existing = DatabaseUtils.get(db, `
|
|
183
|
+
SELECT triple_extracted, triple_extracted_status FROM memory_item WHERE id = ?
|
|
184
|
+
`, [episodicMemory.id]);
|
|
185
|
+
if (existing?.triple_extracted === true && existing?.triple_extracted_status === 'success') {
|
|
186
|
+
results.skipped++;
|
|
187
|
+
logger.info('이미 변환된 Episodic Memory 건너뛰기', {
|
|
188
|
+
episodic_memory_id: episodicMemory.id
|
|
189
|
+
});
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Triple 추출 서비스 초기화
|
|
194
|
+
const tripleExtractionService = new TripleExtractionService();
|
|
195
|
+
// Triple 추출
|
|
196
|
+
const extractionResult = await tripleExtractionService.extractTriples(episodicMemory.content, {}, episodicMemory.id);
|
|
197
|
+
// Triple이 추출된 경우 Semantic Memory 생성/업데이트
|
|
198
|
+
if (extractionResult.triples.length > 0) {
|
|
199
|
+
const embeddingService = context.services.embeddingService || new UnifiedEmbeddingService();
|
|
200
|
+
const semanticMemoryUpdateService = new SemanticMemoryUpdateService(db, embeddingService, context.services.relationGraph);
|
|
201
|
+
const updateResult = await semanticMemoryUpdateService.updateSemanticMemory(extractionResult, {
|
|
202
|
+
episodicMemoryId: episodicMemory.id,
|
|
203
|
+
episodicImportance: episodicMemory.importance || 0.5
|
|
204
|
+
});
|
|
205
|
+
// PRD 5.5, 5.5a, 5.6: Triple 추출 성공 시 상태 업데이트
|
|
206
|
+
const confidenceValues = [];
|
|
207
|
+
try {
|
|
208
|
+
const relations = DatabaseUtils.all(db, `
|
|
209
|
+
SELECT confidence FROM memory_relation
|
|
210
|
+
WHERE source_id = ? AND relation_type = 'extracted_from'
|
|
211
|
+
`, [episodicMemory.id]);
|
|
212
|
+
for (const rel of relations) {
|
|
213
|
+
if (rel.confidence !== null && rel.confidence !== undefined) {
|
|
214
|
+
confidenceValues.push(rel.confidence);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
logger.warn('Confidence 수집 실패', {
|
|
220
|
+
memory_id: episodicMemory.id,
|
|
221
|
+
error: err instanceof Error ? err.message : String(err)
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
const confidenceAvg = confidenceValues.length > 0
|
|
225
|
+
? confidenceValues.reduce((sum, c) => sum + c, 0) / confidenceValues.length
|
|
226
|
+
: null;
|
|
227
|
+
const metadata = {
|
|
228
|
+
triple_count: extractionResult.triples.length,
|
|
229
|
+
...(confidenceAvg !== null && { confidence_avg: confidenceAvg }),
|
|
230
|
+
extracted_at: new Date().toISOString()
|
|
231
|
+
};
|
|
232
|
+
await DatabaseUtils.run(db, `
|
|
233
|
+
UPDATE memory_item SET
|
|
234
|
+
triple_extracted = ?,
|
|
235
|
+
triple_extracted_status = ?,
|
|
236
|
+
triple_extraction_metadata = ?
|
|
237
|
+
WHERE id = ?
|
|
238
|
+
`, [
|
|
239
|
+
1, // SQLite에서는 boolean을 INTEGER로 변환
|
|
240
|
+
'success',
|
|
241
|
+
JSON.stringify(metadata),
|
|
242
|
+
episodicMemory.id
|
|
243
|
+
]);
|
|
244
|
+
results.success++;
|
|
245
|
+
results.semantic_memory_ids.push(...updateResult.semanticMemoryIds);
|
|
246
|
+
logger.info('Episodic Memory 변환 성공', {
|
|
247
|
+
episodic_memory_id: episodicMemory.id,
|
|
248
|
+
triple_count: extractionResult.triples.length,
|
|
249
|
+
semantic_memory_count: updateResult.semanticMemoryIds.length,
|
|
250
|
+
confidence_avg: confidenceAvg
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
// Triple 추출 실패 시 상태 업데이트
|
|
255
|
+
const failureReason = extractionResult.extractionInfo.failureReason || 'no_triple';
|
|
256
|
+
let retryCount = 0;
|
|
257
|
+
try {
|
|
258
|
+
const existing = DatabaseUtils.get(db, `
|
|
259
|
+
SELECT triple_extraction_metadata FROM memory_item WHERE id = ?
|
|
260
|
+
`, [episodicMemory.id]);
|
|
261
|
+
if (existing?.triple_extraction_metadata) {
|
|
262
|
+
const existingMeta = JSON.parse(existing.triple_extraction_metadata);
|
|
263
|
+
retryCount = (existingMeta.retry_count || 0) + 1;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
retryCount = 1;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
retryCount = 1;
|
|
271
|
+
}
|
|
272
|
+
const metadata = {
|
|
273
|
+
failureReason,
|
|
274
|
+
retry_count: retryCount,
|
|
275
|
+
last_attempt: new Date().toISOString()
|
|
276
|
+
};
|
|
277
|
+
await DatabaseUtils.run(db, `
|
|
278
|
+
UPDATE memory_item SET
|
|
279
|
+
triple_extracted = ?,
|
|
280
|
+
triple_extracted_status = ?,
|
|
281
|
+
triple_extraction_metadata = ?
|
|
282
|
+
WHERE id = ?
|
|
283
|
+
`, [
|
|
284
|
+
0, // SQLite에서는 boolean을 INTEGER로 변환
|
|
285
|
+
'failed',
|
|
286
|
+
JSON.stringify(metadata),
|
|
287
|
+
episodicMemory.id
|
|
288
|
+
]);
|
|
289
|
+
results.failed++;
|
|
290
|
+
logger.warn('Episodic Memory 변환 실패', {
|
|
291
|
+
episodic_memory_id: episodicMemory.id,
|
|
292
|
+
failure_reason: failureReason,
|
|
293
|
+
retry_count: retryCount
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
results.failed++;
|
|
299
|
+
// 에러 발생 시에도 상태 업데이트 (PRD 5.5, 5.5a, 5.6)
|
|
300
|
+
try {
|
|
301
|
+
await DatabaseUtils.run(db, `
|
|
302
|
+
UPDATE memory_item SET
|
|
303
|
+
triple_extracted = ?,
|
|
304
|
+
triple_extracted_status = ?,
|
|
305
|
+
triple_extraction_metadata = ?
|
|
306
|
+
WHERE id = ?
|
|
307
|
+
`, [
|
|
308
|
+
0, // SQLite에서는 boolean을 INTEGER로 변환
|
|
309
|
+
'failed',
|
|
310
|
+
JSON.stringify({
|
|
311
|
+
failureReason: 'conversion_error',
|
|
312
|
+
error: error instanceof Error ? error.message : String(error),
|
|
313
|
+
last_attempt: new Date().toISOString()
|
|
314
|
+
}),
|
|
315
|
+
episodicMemory.id
|
|
316
|
+
]);
|
|
317
|
+
}
|
|
318
|
+
catch (updateError) {
|
|
319
|
+
logger.warn('상태 업데이트 실패', {
|
|
320
|
+
episodic_memory_id: episodicMemory.id,
|
|
321
|
+
error: updateError instanceof Error ? updateError.message : String(updateError)
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
logger.error('Episodic Memory 변환 중 에러 발생', {
|
|
325
|
+
episodic_memory_id: episodicMemory.id,
|
|
326
|
+
error: error instanceof Error ? error.message : String(error)
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return this.createSuccessResult({
|
|
331
|
+
total: results.total,
|
|
332
|
+
success: results.success,
|
|
333
|
+
failed: results.failed,
|
|
334
|
+
skipped: results.skipped,
|
|
335
|
+
semantic_memory_ids: results.semantic_memory_ids
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
logger.error('ConvertEpisodicToSemanticTool: 에러 발생', {
|
|
340
|
+
error: error instanceof Error ? error.message : String(error)
|
|
341
|
+
});
|
|
342
|
+
return this.createErrorResult('CONVERSION_ERROR', error instanceof Error ? error.message : String(error));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=convert-episodic-to-semantic-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-episodic-to-semantic-tool.js","sourceRoot":"","sources":["../../../../src/domains/memory/tools/convert-episodic-to-semantic-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,161 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { BaseTool } from '../../../tools/base-tool.js';
|
|
6
6
|
import type { ToolContext, ToolResult } from '../../../tools/types.js';
|
|
7
|
+
/**
|
|
8
|
+
* 앵커 설정 메타데이터 타입
|
|
9
|
+
*/
|
|
10
|
+
export interface AnchorSetMetadata {
|
|
11
|
+
memory_id: string;
|
|
12
|
+
slot: 'A';
|
|
13
|
+
agent_id: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 이웃 기억 항목 타입
|
|
17
|
+
*/
|
|
18
|
+
export interface NeighborMemoryItem {
|
|
19
|
+
id: string;
|
|
20
|
+
content: string;
|
|
21
|
+
similarity: number;
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Recall 응답 항목 타입 (neighbors 필드 포함)
|
|
26
|
+
*
|
|
27
|
+
* @property neighbors - 이웃 기억 배열 (optional)
|
|
28
|
+
* - include_neighbors=true이고 상위 neighbors_limit개 결과에만 포함됨
|
|
29
|
+
* - neighbors_limit보다 많은 결과는 neighbors 필드가 없음 (undefined)
|
|
30
|
+
* - 이웃 기억 조회 실패 시 빈 배열 []로 설정됨
|
|
31
|
+
*/
|
|
32
|
+
export interface RecallResultItem {
|
|
33
|
+
memory_id: string;
|
|
34
|
+
id?: string;
|
|
35
|
+
content: string;
|
|
36
|
+
type: string;
|
|
37
|
+
importance: number;
|
|
38
|
+
created_at: string;
|
|
39
|
+
final_score: number;
|
|
40
|
+
neighbors?: NeighborMemoryItem[];
|
|
41
|
+
[key: string]: any;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Recall 응답 메타데이터 타입
|
|
45
|
+
*
|
|
46
|
+
* @property anchor_set - 앵커 설정 정보 (auto_set_anchor=true일 때만 설정)
|
|
47
|
+
* - 성공 시: {memory_id, slot: "A", agent_id} 객체
|
|
48
|
+
* - 실패/건너뜀/비활성화 시: null
|
|
49
|
+
* @property anchor_set_error - 앵커 설정 실패 여부 (optional)
|
|
50
|
+
* - anchor_set=null이고 anchor_set_error=true: 앵커 설정 실패
|
|
51
|
+
* @property anchor_set_skipped - 앵커 설정 건너뜀 여부 (optional)
|
|
52
|
+
* - anchor_set=null이고 anchor_set_skipped=true: 앵커 설정 건너뜀 (pinned 앵커 보호 등)
|
|
53
|
+
* @property anchor_set_skipped_reason - 앵커 설정 건너뜀 사유 (optional)
|
|
54
|
+
* - "pinned_anchor_protected": 슬롯 A에 pinned 앵커가 있어서 보호됨
|
|
55
|
+
*/
|
|
56
|
+
export interface RecallResponseMetadata {
|
|
57
|
+
anchor_set: AnchorSetMetadata | null;
|
|
58
|
+
anchor_set_error?: boolean;
|
|
59
|
+
anchor_set_skipped?: boolean;
|
|
60
|
+
anchor_set_skipped_reason?: string;
|
|
61
|
+
[key: string]: any;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Recall 응답 타입
|
|
65
|
+
*
|
|
66
|
+
* @example 앵커 설정 성공 + 이웃 기억 포함
|
|
67
|
+
* ```json
|
|
68
|
+
* {
|
|
69
|
+
* "items": [
|
|
70
|
+
* {
|
|
71
|
+
* "memory_id": "mem_12345",
|
|
72
|
+
* "content": "검색 결과 내용",
|
|
73
|
+
* "type": "episodic",
|
|
74
|
+
* "importance": 0.8,
|
|
75
|
+
* "created_at": "2024-01-01T00:00:00Z",
|
|
76
|
+
* "final_score": 0.95,
|
|
77
|
+
* "neighbors": [
|
|
78
|
+
* {
|
|
79
|
+
* "id": "mem_67890",
|
|
80
|
+
* "content": "관련 기억 내용",
|
|
81
|
+
* "similarity": 0.85
|
|
82
|
+
* }
|
|
83
|
+
* ]
|
|
84
|
+
* },
|
|
85
|
+
* {
|
|
86
|
+
* "memory_id": "mem_11111",
|
|
87
|
+
* "content": "두 번째 결과",
|
|
88
|
+
* "neighbors": []
|
|
89
|
+
* },
|
|
90
|
+
* {
|
|
91
|
+
* "memory_id": "mem_22222",
|
|
92
|
+
* "content": "세 번째 결과 (neighbors_limit 초과로 neighbors 필드 없음)"
|
|
93
|
+
* }
|
|
94
|
+
* ],
|
|
95
|
+
* "total_count": 3,
|
|
96
|
+
* "query_time": 150,
|
|
97
|
+
* "search_type": "hybrid",
|
|
98
|
+
* "metadata": {
|
|
99
|
+
* "anchor_set": {
|
|
100
|
+
* "memory_id": "mem_12345",
|
|
101
|
+
* "slot": "A",
|
|
102
|
+
* "agent_id": "default"
|
|
103
|
+
* }
|
|
104
|
+
* }
|
|
105
|
+
* }
|
|
106
|
+
* ```
|
|
107
|
+
*
|
|
108
|
+
* @example 앵커 설정 실패
|
|
109
|
+
* ```json
|
|
110
|
+
* {
|
|
111
|
+
* "items": [...],
|
|
112
|
+
* "metadata": {
|
|
113
|
+
* "anchor_set": null,
|
|
114
|
+
* "anchor_set_error": true
|
|
115
|
+
* }
|
|
116
|
+
* }
|
|
117
|
+
* ```
|
|
118
|
+
*
|
|
119
|
+
* @example 앵커 설정 건너뜀 (pinned 앵커 보호)
|
|
120
|
+
* ```json
|
|
121
|
+
* {
|
|
122
|
+
* "items": [...],
|
|
123
|
+
* "metadata": {
|
|
124
|
+
* "anchor_set": null,
|
|
125
|
+
* "anchor_set_skipped": true,
|
|
126
|
+
* "anchor_set_skipped_reason": "pinned_anchor_protected"
|
|
127
|
+
* }
|
|
128
|
+
* }
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* @example 앵커 설정 비활성화
|
|
132
|
+
* ```json
|
|
133
|
+
* {
|
|
134
|
+
* "items": [...],
|
|
135
|
+
* "metadata": {
|
|
136
|
+
* "anchor_set": null
|
|
137
|
+
* }
|
|
138
|
+
* }
|
|
139
|
+
* ```
|
|
140
|
+
*
|
|
141
|
+
* @example 이웃 기억 미포함 (include_neighbors=false)
|
|
142
|
+
* ```json
|
|
143
|
+
* {
|
|
144
|
+
* "items": [
|
|
145
|
+
* {
|
|
146
|
+
* "memory_id": "mem_12345",
|
|
147
|
+
* "content": "검색 결과",
|
|
148
|
+
* "neighbors": undefined // neighbors 필드 없음
|
|
149
|
+
* }
|
|
150
|
+
* ]
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export interface RecallResponse {
|
|
155
|
+
items: RecallResultItem[];
|
|
156
|
+
total_count: number;
|
|
157
|
+
query_time: number;
|
|
158
|
+
search_type: string;
|
|
159
|
+
metadata?: RecallResponseMetadata;
|
|
160
|
+
[key: string]: any;
|
|
161
|
+
}
|
|
7
162
|
export declare class RecallTool extends BaseTool {
|
|
8
163
|
constructor();
|
|
9
164
|
handle(params: any, context: ToolContext): Promise<ToolResult>;
|
|
@@ -28,6 +183,28 @@ export declare class RecallTool extends BaseTool {
|
|
|
28
183
|
* 적용된 필터 정보 반환
|
|
29
184
|
*/
|
|
30
185
|
private getAppliedFilters;
|
|
186
|
+
/**
|
|
187
|
+
* 자동 앵커 설정 처리
|
|
188
|
+
* 가장 관련성 높은 기억(첫 번째 결과)을 슬롯 A에 앵커로 설정
|
|
189
|
+
*
|
|
190
|
+
* @param searchItems - 검색 결과 항목 배열
|
|
191
|
+
* @param agentId - 에이전트 ID
|
|
192
|
+
* @param context - 도구 컨텍스트
|
|
193
|
+
* @returns 앵커 설정 결과 (성공/실패/건너뜀 상태 포함)
|
|
194
|
+
*/
|
|
195
|
+
private handleAutoSetAnchor;
|
|
196
|
+
/**
|
|
197
|
+
* 자동 이웃 기억 포함 처리
|
|
198
|
+
* 검색 결과의 상위 항목에 대해 이웃 기억을 자동으로 포함
|
|
199
|
+
*
|
|
200
|
+
* @param searchItems - 검색 결과 항목 배열
|
|
201
|
+
* @param neighborsLimit - 이웃 기억을 포함할 상위 결과의 개수
|
|
202
|
+
* @param neighborsPerItem - 각 검색 결과 항목당 조회할 이웃 기억의 최대 개수
|
|
203
|
+
* @param neighborsSimilarityThreshold - 이웃 기억 조회 시 유사도 임계값
|
|
204
|
+
* @param context - 도구 컨텍스트
|
|
205
|
+
* @returns 각 검색 결과 항목에 대한 이웃 기억 배열 (순서 보존)
|
|
206
|
+
*/
|
|
207
|
+
private handleIncludeNeighbors;
|
|
31
208
|
/**
|
|
32
209
|
* 검색 쿼리 검증
|
|
33
210
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall-tool.d.ts","sourceRoot":"","sources":["../../../../src/domains/memory/tools/recall-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"recall-tool.d.ts","sourceRoot":"","sources":["../../../../src/domains/memory/tools/recall-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAkBvE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAiED,qBAAa,UAAW,SAAQ,QAAQ;;IAiKhC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAsbpE;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,yBAAyB;IA6EjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuF5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;;;;;;;OAQG;YACW,mBAAmB;IA4JjC;;;;;;;;;;OAUG;YACW,sBAAsB;IAmIpC;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyBvB;;;;;;;;;OASG;YACW,gCAAgC;CAuH/C"}
|