a2a-memory 0.11.5 → 0.12.0
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/LICENSE +7 -19
- package/README.md +1 -1
- package/dist/a2a/client.js +1 -252
- package/dist/a2a/discovery.js +1 -115
- package/dist/a2a/index.js +1 -8
- package/dist/a2a/types.js +1 -42
- package/dist/adapters/anthropic.js +1 -117
- package/dist/chunking/chunker.js +1 -163
- package/dist/claude/sync.d.ts +8 -2
- package/dist/claude/sync.js +1 -298
- package/dist/cli/commands/add.js +1 -80
- package/dist/cli/commands/claude-sync.d.ts +3 -3
- package/dist/cli/commands/claude-sync.js +1 -70
- package/dist/cli/commands/cleanup.js +1 -83
- package/dist/cli/commands/config.js +1 -79
- package/dist/cli/commands/edit.js +1 -69
- package/dist/cli/commands/embed.js +1 -92
- package/dist/cli/commands/extract.js +1 -103
- package/dist/cli/commands/health.js +1 -105
- package/dist/cli/commands/list.js +1 -46
- package/dist/cli/commands/migrate-chunks.js +1 -205
- package/dist/cli/commands/migrate-file-refs.js +1 -183
- package/dist/cli/commands/proficiency.js +1 -146
- package/dist/cli/commands/rm.js +1 -64
- package/dist/cli/commands/search.js +1 -90
- package/dist/cli/commands/setup-wizard.js +1 -387
- package/dist/cli/commands/setup.js +1 -170
- package/dist/cli/commands/skill.js +1 -151
- package/dist/cli/commands/status.js +1 -70
- package/dist/cli/commands/sync.js +1 -202
- package/dist/cli/commands/team.js +1 -142
- package/dist/cli/index.js +1 -87
- package/dist/config/manager.js +1 -372
- package/dist/db/database.d.ts +36 -0
- package/dist/db/database.js +1 -1400
- package/dist/embedding/e5-provider.js +1 -147
- package/dist/embedding/index.js +1 -34
- package/dist/embedding/local-provider.js +1 -157
- package/dist/embedding/openai-provider.js +1 -92
- package/dist/embedding/quantization.js +1 -89
- package/dist/extraction/dedup-manager.js +1 -161
- package/dist/extraction/emotion-filter.js +1 -33
- package/dist/extraction/extractor.d.ts +0 -3
- package/dist/extraction/extractor.js +1 -648
- package/dist/extraction/file-reference.js +1 -77
- package/dist/extraction/filter.js +1 -86
- package/dist/extraction/scorer.js +1 -142
- package/dist/extraction/similarity.js +1 -85
- package/dist/hooks/client-factory.js +1 -44
- package/dist/hooks/post-tool-use.js +1 -518
- package/dist/hooks/pre-compact.js +1 -209
- package/dist/hooks/session-end.js +1 -633
- package/dist/hooks/session-start.js +1 -549
- package/dist/hooks/shared.js +1 -110
- package/dist/hooks/stop.d.ts +21 -0
- package/dist/hooks/stop.js +1 -0
- package/dist/hooks/user-prompt-submit.js +1 -316
- package/dist/i18n/index.js +1 -2
- package/dist/i18n/messages.js +1 -150
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -43
- package/dist/lifecycle/cleanup-scheduler.js +1 -137
- package/dist/lifecycle/cleanup.d.ts +1 -0
- package/dist/lifecycle/cleanup.js +1 -116
- package/dist/lifecycle/consolidation.d.ts +22 -0
- package/dist/lifecycle/consolidation.js +1 -0
- package/dist/lifecycle/index.d.ts +2 -0
- package/dist/lifecycle/index.js +1 -13
- package/dist/lifecycle/injection-flush.d.ts +24 -0
- package/dist/lifecycle/injection-flush.js +1 -0
- package/dist/lifecycle/quality-scorer.d.ts +5 -6
- package/dist/lifecycle/quality-scorer.js +1 -46
- package/dist/lifecycle/tiering.js +1 -246
- package/dist/llm/client.js +1 -226
- package/dist/llm/index.js +1 -5
- package/dist/proficiency/actr-engine.js +1 -106
- package/dist/proficiency/detection.js +1 -77
- package/dist/proficiency/index.js +1 -9
- package/dist/proficiency/tracker.js +1 -173
- package/dist/proficiency/types.js +1 -8
- package/dist/providers/adapters.js +1 -140
- package/dist/providers/detector.js +1 -57
- package/dist/search/adaptive-router.js +1 -93
- package/dist/search/index.js +1 -9
- package/dist/search/ranker.js +1 -171
- package/dist/search/reranker.js +1 -155
- package/dist/session/parser.js +1 -130
- package/dist/skill/evaluator.js +1 -509
- package/dist/skill/index.js +1 -7
- package/dist/skill/types.js +1 -7
- package/dist/sync/client.d.ts +7 -0
- package/dist/sync/client.js +1 -597
- package/dist/sync/encryption.js +1 -203
- package/dist/sync/index.js +1 -12
- package/dist/sync/queue.js +1 -214
- package/dist/sync/scheduler.js +1 -140
- package/dist/sync/synchronizer.js +1 -241
- package/dist/sync/team-synchronizer.js +1 -204
- package/dist/sync/vector-clock.js +1 -70
- package/dist/types/index.d.ts +13 -1
- package/dist/types/index.js +1 -132
- package/dist/utils/keychain.js +1 -170
- package/dist/utils/logger.js +1 -128
- package/package.json +15 -10
- package/dist/a2a/client.d.ts.map +0 -1
- package/dist/a2a/client.js.map +0 -1
- package/dist/a2a/discovery.d.ts.map +0 -1
- package/dist/a2a/discovery.js.map +0 -1
- package/dist/a2a/index.d.ts.map +0 -1
- package/dist/a2a/index.js.map +0 -1
- package/dist/a2a/types.d.ts.map +0 -1
- package/dist/a2a/types.js.map +0 -1
- package/dist/adapters/anthropic.d.ts.map +0 -1
- package/dist/adapters/anthropic.js.map +0 -1
- package/dist/chunking/chunker.d.ts.map +0 -1
- package/dist/chunking/chunker.js.map +0 -1
- package/dist/claude/sync.d.ts.map +0 -1
- package/dist/claude/sync.js.map +0 -1
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/claude-sync.d.ts.map +0 -1
- package/dist/cli/commands/claude-sync.js.map +0 -1
- package/dist/cli/commands/cleanup.d.ts.map +0 -1
- package/dist/cli/commands/cleanup.js.map +0 -1
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/edit.d.ts.map +0 -1
- package/dist/cli/commands/edit.js.map +0 -1
- package/dist/cli/commands/embed.d.ts.map +0 -1
- package/dist/cli/commands/embed.js.map +0 -1
- package/dist/cli/commands/extract.d.ts.map +0 -1
- package/dist/cli/commands/extract.js.map +0 -1
- package/dist/cli/commands/health.d.ts.map +0 -1
- package/dist/cli/commands/health.js.map +0 -1
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.js.map +0 -1
- package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
- package/dist/cli/commands/migrate-chunks.js.map +0 -1
- package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
- package/dist/cli/commands/migrate-file-refs.js.map +0 -1
- package/dist/cli/commands/proficiency.d.ts.map +0 -1
- package/dist/cli/commands/proficiency.js.map +0 -1
- package/dist/cli/commands/rm.d.ts.map +0 -1
- package/dist/cli/commands/rm.js.map +0 -1
- package/dist/cli/commands/search.d.ts.map +0 -1
- package/dist/cli/commands/search.js.map +0 -1
- package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
- package/dist/cli/commands/setup-wizard.js.map +0 -1
- package/dist/cli/commands/setup.d.ts.map +0 -1
- package/dist/cli/commands/setup.js.map +0 -1
- package/dist/cli/commands/skill.d.ts.map +0 -1
- package/dist/cli/commands/skill.js.map +0 -1
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/cli/commands/team.d.ts.map +0 -1
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/manager.js.map +0 -1
- package/dist/db/database.d.ts.map +0 -1
- package/dist/db/database.js.map +0 -1
- package/dist/embedding/e5-provider.d.ts.map +0 -1
- package/dist/embedding/e5-provider.js.map +0 -1
- package/dist/embedding/index.d.ts.map +0 -1
- package/dist/embedding/index.js.map +0 -1
- package/dist/embedding/local-provider.d.ts.map +0 -1
- package/dist/embedding/local-provider.js.map +0 -1
- package/dist/embedding/openai-provider.d.ts.map +0 -1
- package/dist/embedding/openai-provider.js.map +0 -1
- package/dist/embedding/quantization.d.ts.map +0 -1
- package/dist/embedding/quantization.js.map +0 -1
- package/dist/extraction/dedup-manager.d.ts.map +0 -1
- package/dist/extraction/dedup-manager.js.map +0 -1
- package/dist/extraction/emotion-filter.d.ts.map +0 -1
- package/dist/extraction/emotion-filter.js.map +0 -1
- package/dist/extraction/extractor.d.ts.map +0 -1
- package/dist/extraction/extractor.js.map +0 -1
- package/dist/extraction/file-reference.d.ts.map +0 -1
- package/dist/extraction/file-reference.js.map +0 -1
- package/dist/extraction/filter.d.ts.map +0 -1
- package/dist/extraction/filter.js.map +0 -1
- package/dist/extraction/scorer.d.ts.map +0 -1
- package/dist/extraction/scorer.js.map +0 -1
- package/dist/extraction/similarity.d.ts.map +0 -1
- package/dist/extraction/similarity.js.map +0 -1
- package/dist/hooks/client-factory.d.ts.map +0 -1
- package/dist/hooks/client-factory.js.map +0 -1
- package/dist/hooks/post-tool-use.d.ts.map +0 -1
- package/dist/hooks/post-tool-use.js.map +0 -1
- package/dist/hooks/pre-compact.d.ts.map +0 -1
- package/dist/hooks/pre-compact.js.map +0 -1
- package/dist/hooks/session-end.d.ts.map +0 -1
- package/dist/hooks/session-end.js.map +0 -1
- package/dist/hooks/session-start.d.ts.map +0 -1
- package/dist/hooks/session-start.js.map +0 -1
- package/dist/hooks/shared.d.ts.map +0 -1
- package/dist/hooks/shared.js.map +0 -1
- package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
- package/dist/hooks/user-prompt-submit.js.map +0 -1
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/index.js.map +0 -1
- package/dist/i18n/messages.d.ts.map +0 -1
- package/dist/i18n/messages.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
- package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
- package/dist/lifecycle/cleanup.d.ts.map +0 -1
- package/dist/lifecycle/cleanup.js.map +0 -1
- package/dist/lifecycle/index.d.ts.map +0 -1
- package/dist/lifecycle/index.js.map +0 -1
- package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
- package/dist/lifecycle/quality-scorer.js.map +0 -1
- package/dist/lifecycle/tiering.d.ts.map +0 -1
- package/dist/lifecycle/tiering.js.map +0 -1
- package/dist/llm/client.d.ts.map +0 -1
- package/dist/llm/client.js.map +0 -1
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/index.js.map +0 -1
- package/dist/proficiency/actr-engine.d.ts.map +0 -1
- package/dist/proficiency/actr-engine.js.map +0 -1
- package/dist/proficiency/detection.d.ts.map +0 -1
- package/dist/proficiency/detection.js.map +0 -1
- package/dist/proficiency/index.d.ts.map +0 -1
- package/dist/proficiency/index.js.map +0 -1
- package/dist/proficiency/tracker.d.ts.map +0 -1
- package/dist/proficiency/tracker.js.map +0 -1
- package/dist/proficiency/types.d.ts.map +0 -1
- package/dist/proficiency/types.js.map +0 -1
- package/dist/providers/adapters.d.ts.map +0 -1
- package/dist/providers/adapters.js.map +0 -1
- package/dist/providers/detector.d.ts.map +0 -1
- package/dist/providers/detector.js.map +0 -1
- package/dist/search/adaptive-router.d.ts.map +0 -1
- package/dist/search/adaptive-router.js.map +0 -1
- package/dist/search/index.d.ts.map +0 -1
- package/dist/search/index.js.map +0 -1
- package/dist/search/ranker.d.ts.map +0 -1
- package/dist/search/ranker.js.map +0 -1
- package/dist/search/reranker.d.ts.map +0 -1
- package/dist/search/reranker.js.map +0 -1
- package/dist/session/parser.d.ts.map +0 -1
- package/dist/session/parser.js.map +0 -1
- package/dist/skill/evaluator.d.ts.map +0 -1
- package/dist/skill/evaluator.js.map +0 -1
- package/dist/skill/index.d.ts.map +0 -1
- package/dist/skill/index.js.map +0 -1
- package/dist/skill/types.d.ts.map +0 -1
- package/dist/skill/types.js.map +0 -1
- package/dist/sync/client.d.ts.map +0 -1
- package/dist/sync/client.js.map +0 -1
- package/dist/sync/encryption.d.ts.map +0 -1
- package/dist/sync/encryption.js.map +0 -1
- package/dist/sync/index.d.ts.map +0 -1
- package/dist/sync/index.js.map +0 -1
- package/dist/sync/queue.d.ts.map +0 -1
- package/dist/sync/queue.js.map +0 -1
- package/dist/sync/scheduler.d.ts.map +0 -1
- package/dist/sync/scheduler.js.map +0 -1
- package/dist/sync/synchronizer.d.ts.map +0 -1
- package/dist/sync/synchronizer.js.map +0 -1
- package/dist/sync/team-synchronizer.d.ts.map +0 -1
- package/dist/sync/team-synchronizer.js.map +0 -1
- package/dist/sync/vector-clock.d.ts.map +0 -1
- package/dist/sync/vector-clock.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/utils/keychain.d.ts.map +0 -1
- package/dist/utils/keychain.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
|
@@ -1,161 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mem0-style 4-Way Memory Deduplication Manager
|
|
3
|
-
*
|
|
4
|
-
* 새 메모리 생성 전 기존 메모리와 비교하여 최적의 동작 결정:
|
|
5
|
-
* - ADD: 유사 메모리 없음 → 새로 생성
|
|
6
|
-
* - UPDATE: 유사도 > 0.8 → 기존 메모리 내용 병합/갱신
|
|
7
|
-
* - DELETE: 새 정보가 기존을 무효화 → 기존 삭제 후 새로 생성
|
|
8
|
-
* - NOOP: 유사도 > 0.95 → 완전 중복, 무시
|
|
9
|
-
*/
|
|
10
|
-
import { cosineSimilarity } from './similarity.js';
|
|
11
|
-
/** 유사도 임계값 */
|
|
12
|
-
const NOOP_THRESHOLD = 0.95; // 거의 동일
|
|
13
|
-
const UPDATE_THRESHOLD = 0.8; // 유사하지만 보충 가능
|
|
14
|
-
const DELETE_THRESHOLD = 0.92; // 무효화 패턴 감지 시 (오탐 방지를 위해 상향)
|
|
15
|
-
/** 단독으로는 무효화 신호가 아닌 키워드 (2개 이상 동시에 있어야 무효화 판정) */
|
|
16
|
-
const WEAK_INVALIDATION_KEYWORDS = [
|
|
17
|
-
'fixed', 'resolved',
|
|
18
|
-
'수정됨', '해결됨',
|
|
19
|
-
];
|
|
20
|
-
/** 단독으로도 무효화 신호인 강한 키워드 */
|
|
21
|
-
const STRONG_INVALIDATION_KEYWORDS = [
|
|
22
|
-
'deprecated', 'obsolete', 'no longer', 'replaced by', 'migrated to',
|
|
23
|
-
'removed', 'deleted', 'workaround no longer needed',
|
|
24
|
-
'더 이상', '대체됨', '삭제됨', '폐기',
|
|
25
|
-
];
|
|
26
|
-
/**
|
|
27
|
-
* 새 콘텐츠가 기존 콘텐츠를 무효화하는지 판단
|
|
28
|
-
* - 강한 키워드: 1개라도 있으면 무효화
|
|
29
|
-
* - 약한 키워드(fixed/resolved 등): 2개 이상 동시 존재해야 무효화
|
|
30
|
-
*/
|
|
31
|
-
function detectInvalidation(newContent, _existingContent) {
|
|
32
|
-
const lowerNew = newContent.toLowerCase();
|
|
33
|
-
// 강한 키워드: 1개만 있어도 무효화
|
|
34
|
-
if (STRONG_INVALIDATION_KEYWORDS.some(kw => lowerNew.includes(kw))) {
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
// 약한 키워드: 2개 이상 동시에 있어야 무효화
|
|
38
|
-
const weakMatches = WEAK_INVALIDATION_KEYWORDS.filter(kw => lowerNew.includes(kw));
|
|
39
|
-
return weakMatches.length >= 2;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* 두 텍스트의 유사도를 계산 (임베딩 없이 텍스트 기반)
|
|
43
|
-
* Jaccard 유사도 + 문자열 포함 관계
|
|
44
|
-
*/
|
|
45
|
-
function textSimilarity(a, b) {
|
|
46
|
-
const wordsA = new Set(a.toLowerCase().split(/\s+/).filter(w => w.length > 2));
|
|
47
|
-
const wordsB = new Set(b.toLowerCase().split(/\s+/).filter(w => w.length > 2));
|
|
48
|
-
if (wordsA.size === 0 || wordsB.size === 0)
|
|
49
|
-
return 0;
|
|
50
|
-
let intersection = 0;
|
|
51
|
-
for (const w of wordsA) {
|
|
52
|
-
if (wordsB.has(w))
|
|
53
|
-
intersection++;
|
|
54
|
-
}
|
|
55
|
-
const union = new Set([...wordsA, ...wordsB]).size;
|
|
56
|
-
return union > 0 ? intersection / union : 0;
|
|
57
|
-
}
|
|
58
|
-
export class DedupManager {
|
|
59
|
-
/**
|
|
60
|
-
* 4-Way 판단: 새 콘텐츠를 기존 메모리와 비교
|
|
61
|
-
*
|
|
62
|
-
* @param newContent 새로 저장할 콘텐츠
|
|
63
|
-
* @param existingMemories 비교 대상 기존 메모리 (동일 프로젝트+카테고리)
|
|
64
|
-
* @param newEmbedding 새 콘텐츠의 임베딩 (있으면 코사인 유사도 사용)
|
|
65
|
-
*/
|
|
66
|
-
decide(newContent, existingMemories, newEmbedding) {
|
|
67
|
-
if (existingMemories.length === 0) {
|
|
68
|
-
return { action: 'ADD', similarity: 0, reason: 'No existing memories to compare' };
|
|
69
|
-
}
|
|
70
|
-
let bestSimilarity = 0;
|
|
71
|
-
let bestMatch;
|
|
72
|
-
for (const mem of existingMemories) {
|
|
73
|
-
let sim;
|
|
74
|
-
// 임베딩이 둘 다 있으면 코사인 유사도, 아니면 텍스트 유사도
|
|
75
|
-
if (newEmbedding && mem.embedding && mem.embedding.length > 0 &&
|
|
76
|
-
newEmbedding.length === mem.embedding.length) {
|
|
77
|
-
sim = cosineSimilarity(newEmbedding, mem.embedding);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
sim = textSimilarity(newContent, mem.content);
|
|
81
|
-
}
|
|
82
|
-
if (sim > bestSimilarity) {
|
|
83
|
-
bestSimilarity = sim;
|
|
84
|
-
bestMatch = mem;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// NOOP: 완전 중복
|
|
88
|
-
if (bestSimilarity >= NOOP_THRESHOLD && bestMatch) {
|
|
89
|
-
return {
|
|
90
|
-
action: 'NOOP',
|
|
91
|
-
targetMemory: bestMatch,
|
|
92
|
-
similarity: bestSimilarity,
|
|
93
|
-
reason: `Near-duplicate (similarity: ${bestSimilarity.toFixed(3)})`,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
// DELETE + ADD: 무효화 패턴 감지
|
|
97
|
-
if (bestSimilarity >= DELETE_THRESHOLD && bestMatch &&
|
|
98
|
-
detectInvalidation(newContent, bestMatch.content)) {
|
|
99
|
-
return {
|
|
100
|
-
action: 'DELETE',
|
|
101
|
-
targetMemory: bestMatch,
|
|
102
|
-
similarity: bestSimilarity,
|
|
103
|
-
reason: `Invalidation detected (similarity: ${bestSimilarity.toFixed(3)})`,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
// UPDATE: 유사하지만 보충 가능
|
|
107
|
-
if (bestSimilarity >= UPDATE_THRESHOLD && bestMatch) {
|
|
108
|
-
return {
|
|
109
|
-
action: 'UPDATE',
|
|
110
|
-
targetMemory: bestMatch,
|
|
111
|
-
similarity: bestSimilarity,
|
|
112
|
-
reason: `Similar content found, merging (similarity: ${bestSimilarity.toFixed(3)})`,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
// ADD: 유사한 메모리 없음
|
|
116
|
-
return {
|
|
117
|
-
action: 'ADD',
|
|
118
|
-
similarity: bestSimilarity,
|
|
119
|
-
reason: bestSimilarity > 0
|
|
120
|
-
? `Best match similarity (${bestSimilarity.toFixed(3)}) below threshold`
|
|
121
|
-
: 'No similar memories found',
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* 두 메모리 콘텐츠를 병합 (UPDATE용)
|
|
126
|
-
* 기존 콘텐츠 + 새 정보 추가
|
|
127
|
-
*/
|
|
128
|
-
mergeContent(existingContent, newContent) {
|
|
129
|
-
// 기존 콘텐츠에 새 내용이 이미 포함되어 있으면 그대로 반환
|
|
130
|
-
if (existingContent.includes(newContent.trim())) {
|
|
131
|
-
return existingContent;
|
|
132
|
-
}
|
|
133
|
-
// 새 내용에서 기존과 중복되지 않는 부분만 추출
|
|
134
|
-
const existingLines = new Set(existingContent.split('\n').map(l => l.trim()).filter(l => l.length > 0));
|
|
135
|
-
const newLines = newContent.split('\n')
|
|
136
|
-
.map(l => l.trim())
|
|
137
|
-
.filter(l => l.length > 0 && !existingLines.has(l));
|
|
138
|
-
if (newLines.length === 0) {
|
|
139
|
-
return existingContent;
|
|
140
|
-
}
|
|
141
|
-
// 기존 + 새 줄 결합 (최대 2000자)
|
|
142
|
-
const merged = existingContent + '\n[Updated] ' + newLines.join('\n');
|
|
143
|
-
return merged.slice(0, 2000);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* 기존 메모리에서 유사한 것들을 찾아 비교 대상 목록 구성
|
|
147
|
-
*/
|
|
148
|
-
findCandidates(memories, category, projectPath, limit = 50) {
|
|
149
|
-
return memories
|
|
150
|
-
.filter(m => {
|
|
151
|
-
if (m.category !== category)
|
|
152
|
-
return false;
|
|
153
|
-
if (projectPath && m.projectPath !== projectPath)
|
|
154
|
-
return false;
|
|
155
|
-
return true;
|
|
156
|
-
})
|
|
157
|
-
.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())
|
|
158
|
-
.slice(0, limit);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=dedup-manager.js.map
|
|
1
|
+
(function(_0x7c967d,_0xef111){function _0x32d16d(_0x4d4c35,_0x1510b4){return _0x3848(_0x4d4c35-0x1ea,_0x1510b4);}const _0x43394b=_0x7c967d();function _0x2f5d89(_0x45a1f3,_0x1b0bff){return _0x3848(_0x45a1f3-0x4,_0x1b0bff);}while(!![]){try{const _0x4bbac2=-parseInt(_0x32d16d(0x2bc,0x2ce))/0x1+-parseInt(_0x2f5d89(0xb5,0xa2))/0x2*(parseInt(_0x2f5d89(0xce,0xc2))/0x3)+-parseInt(_0x32d16d(0x286,0x298))/0x4*(-parseInt(_0x2f5d89(0xbb,0xab))/0x5)+-parseInt(_0x2f5d89(0xca,0xc3))/0x6+parseInt(_0x2f5d89(0xa3,0xa6))/0x7+-parseInt(_0x32d16d(0x2a4,0x292))/0x8+parseInt(_0x32d16d(0x2b1,0x295))/0x9;if(_0x4bbac2===_0xef111)break;else _0x43394b['push'](_0x43394b['shift']());}catch(_0x232507){_0x43394b['push'](_0x43394b['shift']());}}}(_0x2c54,0xbb8a2));import{cosineSimilarity}from'./similarity.js';const NOOP_THRESHOLD=0.95,UPDATE_THRESHOLD=0.8,DELETE_THRESHOLD=0.92;function _0x219220(_0x18ae88,_0x100480){return _0x3848(_0x18ae88-0x2bd,_0x100480);}function _0x2c54(){const _0x1b84d2=['A0PdswO','D2X5EMK','CMvTB3zLza','CLvQweW','tLPvEK8','mtuZmZu1mhjxu0XpAW','AwjgyLa','CMvWBgfJzwqGyG','EuvJA0G','y29UDgvUDa','tMvHCI1KDxbSAq','DxbKyxrLzef0','tM8GzxHPC3rPBG','zcWGBwvYz2LUzW','ihrVignVBxbHCG','zMLSDgvY','CMvZB2X2zwq','C2L6zq','BwfW','64Ya7lk065cO','z2v0vgLTzq','B3rHDve','zw1IzwrKAw5N','tM8GC2LTAwXHCG','BwLNCMf0zwqGDa','C29Tzq','sw52ywXPzgf0Aq','mZa4mtzgrM9Mrgm','zgvWCMvJyxrLza','Aw5JBhvKzxm','mJu5mdKZmvnVrvjuuG','zML4zwq','zM91BMq','ChjVAMvJDfbHDa','C3bSAxq','AgfZ','revmrvrf','B24Gzgv0zwn0zq','vvbeqvrf','BNrLBNqGzM91BG','qMvZDcbTyxrJAa','BgfYAxr5oIa','twryyKC','DhK6ia','ig5LzwrLza','Axr5oIa','wgndwLK','qure','mta4ndG0mgP5ExDUyq','ig1LBw9YAwvZia','sNLluge','ihnPBwLSyxjPDa','zYbTzw1VCMLLCW','BgvUz3rO','ndbjCLbACgq','icHZAw1PBgfYAq','Dg9gAxHLza','ode4mdCXmNnAyM1jqW','C2XPy2u','tK9pua','DhjPBq','y2f0zsaOC2LTAq','Dg9mB3DLCKnHCW','ksbIzwXVDYb0Aa','yxrLCW','B2jZB2XLDgu','sxb1q0C','BwvYz2vdB250zq','zgvSzxrLza','nJG4ody3oenVu3P6AG','ndyXmJK0mdffqML4sMe','ig5VigXVBMDLCG','D29YA2fYB3vUza','nLzyALP3sa','zMLUzenHBMrPza','zgvJAwrL'];_0x2c54=function(){return _0x1b84d2;};return _0x2c54();}function _0x3848(_0x582d46,_0x1a809c){_0x582d46=_0x582d46-0x8c;const _0x2c5422=_0x2c54();let _0x38483f=_0x2c5422[_0x582d46];if(_0x3848['yGWCCX']===undefined){var _0x55a3bb=function(_0x4bc7e8){const _0x2e9d58='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2cb7df='',_0x5e0ed2='';for(let _0xcc95d9=0x0,_0x3d6fbc,_0x2dbf00,_0x32e1ea=0x0;_0x2dbf00=_0x4bc7e8['charAt'](_0x32e1ea++);~_0x2dbf00&&(_0x3d6fbc=_0xcc95d9%0x4?_0x3d6fbc*0x40+_0x2dbf00:_0x2dbf00,_0xcc95d9++%0x4)?_0x2cb7df+=String['fromCharCode'](0xff&_0x3d6fbc>>(-0x2*_0xcc95d9&0x6)):0x0){_0x2dbf00=_0x2e9d58['indexOf'](_0x2dbf00);}for(let _0x411872=0x0,_0x24594d=_0x2cb7df['length'];_0x411872<_0x24594d;_0x411872++){_0x5e0ed2+='%'+('00'+_0x2cb7df['charCodeAt'](_0x411872)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5e0ed2);};_0x3848['pJppGB']=_0x55a3bb,_0x3848['wBWQCO']={},_0x3848['yGWCCX']=!![];}const _0x1f22d9=_0x2c5422[0x0],_0x5448dd=_0x582d46+_0x1f22d9,_0x39784c=_0x3848['wBWQCO'][_0x5448dd];return!_0x39784c?(_0x38483f=_0x3848['pJppGB'](_0x38483f),_0x3848['wBWQCO'][_0x5448dd]=_0x38483f):_0x38483f=_0x39784c,_0x38483f;}const WEAK_INVALIDATION_KEYWORDS=[_0x1d2f3c(-0x22f,-0x247),_0x1d2f3c(-0x255,-0x256),'수정됨','해결됨'];function _0x1d2f3c(_0x527edb,_0x2bfe80){return _0x3848(_0x2bfe80- -0x2e7,_0x527edb);}const STRONG_INVALIDATION_KEYWORDS=[_0x219220(0x35a,0x340),_0x219220(0x37f,0x39a),'no\x20longer',_0x1d2f3c(-0x21a,-0x213)+'y',_0x219220(0x356,0x345)+'o',_0x1d2f3c(-0x1fd,-0x218),_0x1d2f3c(-0x219,-0x222),_0x219220(0x386,0x366)+_0x1d2f3c(-0x245,-0x21f)+_0x1d2f3c(-0x214,-0x23a),'더\x20이상',_0x1d2f3c(-0x279,-0x253),'삭제됨','폐기'];function detectInvalidation(_0x521c3d,_0x50a2aa){function _0x257732(_0x4fd867,_0x26e19c){return _0x219220(_0x26e19c- -0x11,_0x4fd867);}const _0x3da4a4=_0x521c3d[_0x1fe999(-0x5c,-0x38)+'e']();if(STRONG_INVALIDATION_KEYWORDS[_0x1fe999(-0x75,-0x5d)](_0x1cd962=>_0x3da4a4[_0x257732(0x356,0x34a)](_0x1cd962)))return!![];const _0x301f0f=WEAK_INVALIDATION_KEYWORDS['filter'](_0x25170d=>_0x3da4a4[_0x1fe999(-0x4f,-0x59)](_0x25170d));function _0x1fe999(_0x1d5d24,_0x1dcf12){return _0x219220(_0x1dcf12- -0x3b4,_0x1d5d24);}return _0x301f0f[_0x1fe999(-0x3f,-0x41)]>=0x2;}function textSimilarity(_0x26003d,_0x33a64c){const _0xe0fab1={'oflkL':function(_0x5e18c7,_0x315fa3){return _0x5e18c7===_0x315fa3;},'YiXuy':function(_0x3ea032,_0x2a6e1b){return _0x3ea032===_0x2a6e1b;},'NZUzO':function(_0x5d3cbe,_0x3f8cea){return _0x5d3cbe/_0x3f8cea;}};function _0x31f894(_0x3738b7,_0x2ad2cf){return _0x219220(_0x3738b7- -0x2a0,_0x2ad2cf);}const _0x97f85b=new Set(_0x26003d[_0x31f894(0xdc,0xe1)+'e']()['split'](/\s+/)['filter'](_0x24be8d=>_0x24be8d[_0x31f894(0xd3,0xb4)]>0x2)),_0x2a603b=new Set(_0x33a64c[_0x31f894(0xdc,0xc8)+'e']()['split'](/\s+/)[_0x31f894(0xad,0x8b)](_0x399233=>_0x399233[_0x504dac(-0x20a,-0x210)]>0x2));if(_0xe0fab1['oflkL'](_0x97f85b[_0x504dac(-0x22e,-0x252)],0x0)||_0xe0fab1['YiXuy'](_0x2a603b[_0x31f894(0xaf,0xc7)],0x0))return 0x0;function _0x504dac(_0x3f4a2d,_0x1e3292){return _0x219220(_0x3f4a2d- -0x57d,_0x1e3292);}let _0x3d75e0=0x0;for(const _0x21d548 of _0x97f85b){if(_0x2a603b[_0x504dac(-0x21c,-0x1fb)](_0x21d548))_0x3d75e0++;}const _0x5ca60c=new Set([..._0x97f85b,..._0x2a603b])[_0x31f894(0xaf,0xa5)];return _0x5ca60c>0x0?_0xe0fab1[_0x504dac(-0x1ef,-0x20c)](_0x3d75e0,_0x5ca60c):0x0;}export class DedupManager{[_0x1d2f3c(-0x222,-0x21b)](_0xe4294a,_0x1d0aaa,_0x46ed6e){const _0x3a2437={'rUjXL':_0x1d4f27(-0x226,-0x249),'XcCZY':_0x1d4f27(-0x276,-0x26c)+_0x1d4f27(-0x23a,-0x244)+_0x56c553(0x350,0x361)+'e','JyKPa':function(_0x16384c,_0x187365){return _0x16384c===_0x187365;},'wlyzi':_0x1d4f27(-0x252,-0x236),'yEckH':function(_0x50f0d2,_0x1e79b1){return _0x50f0d2>_0x1e79b1;},'MdXbG':function(_0x27cf83,_0x1e1ead,_0x50a483){return _0x27cf83(_0x1e1ead,_0x50a483);},'otauQ':function(_0x3b1184,_0x4cc26b){return _0x3b1184>=_0x4cc26b;},'Zmzer':_0x1d4f27(-0x235,-0x252),'kJCIj':function(_0x2ee5f6,_0x46977d){return _0x2ee5f6>_0x46977d;},'Trcap':_0x56c553(0x357,0x36a)+_0x56c553(0x374,0x384)+_0x56c553(0x368,0x373)};if(_0x1d0aaa[_0x1d4f27(-0x247,-0x243)]===0x0)return{'action':_0x1d4f27(-0x246,-0x249),'similarity':0x0,'reason':_0x1d4f27(-0x27a,-0x26c)+_0x56c553(0x3a9,0x387)+_0x56c553(0x359,0x361)+'e'};let _0x583dcb=0x0;function _0x56c553(_0x567f47,_0x4cf832){return _0x219220(_0x4cf832-0x15,_0x567f47);}function _0x1d4f27(_0x1e6c42,_0x942b3a){return _0x219220(_0x942b3a- -0x5b6,_0x1e6c42);}let _0x3d2c48;for(const _0x5bb6ae of _0x1d0aaa){if(_0x3a2437[_0x1d4f27(-0x243,-0x246)](_0x56c553(0x3a7,0x395),_0x3a2437[_0x1d4f27(-0x24d,-0x22b)])){let _0x5bce58;_0x46ed6e&&_0x5bb6ae[_0x1d4f27(-0x247,-0x262)]&&_0x3a2437[_0x1d4f27(-0x21d,-0x224)](_0x5bb6ae[_0x1d4f27(-0x282,-0x262)][_0x56c553(0x381,0x388)],0x0)&&_0x3a2437[_0x56c553(0x382,0x385)](_0x46ed6e[_0x1d4f27(-0x241,-0x243)],_0x5bb6ae[_0x56c553(0x373,0x369)][_0x56c553(0x363,0x388)])?_0x5bce58=_0x3a2437[_0x56c553(0x384,0x37d)](cosineSimilarity,_0x46ed6e,_0x5bb6ae['embedding']):_0x5bce58=textSimilarity(_0xe4294a,_0x5bb6ae[_0x56c553(0x3ab,0x3a8)]),_0x3a2437[_0x1d4f27(-0x202,-0x224)](_0x5bce58,_0x583dcb)&&(_0x583dcb=_0x5bce58,_0x3d2c48=_0x5bb6ae);}else return{'action':_0x3a2437['rUjXL'],'similarity':0x0,'reason':_0x3a2437[_0x56c553(0x394,0x381)]};}if(_0x3a2437[_0x56c553(0x361,0x368)](_0x583dcb,NOOP_THRESHOLD)&&_0x3d2c48)return{'action':_0x1d4f27(-0x249,-0x23d),'targetMemory':_0x3d2c48,'similarity':_0x583dcb,'reason':_0x1d4f27(-0x23f,-0x222)+_0x1d4f27(-0x215,-0x23b)+_0x56c553(0x39d,0x37c)+_0x583dcb[_0x1d4f27(-0x22c,-0x240)](0x3)+')'};if(_0x583dcb>=DELETE_THRESHOLD&&_0x3d2c48&&_0x3a2437[_0x1d4f27(-0x26c,-0x24e)](detectInvalidation,_0xe4294a,_0x3d2c48[_0x56c553(0x387,0x3a8)]))return{'action':_0x56c553(0x35a,0x377),'targetMemory':_0x3d2c48,'similarity':_0x583dcb,'reason':_0x56c553(0x361,0x36d)+_0x56c553(0x356,0x378)+'d\x20(similar'+_0x56c553(0x38e,0x380)+_0x583dcb[_0x56c553(0x384,0x38b)](0x3)+')'};if(_0x583dcb>=UPDATE_THRESHOLD&&_0x3d2c48)return{'action':_0x3a2437['Zmzer'],'targetMemory':_0x3d2c48,'similarity':_0x583dcb,'reason':'Similar\x20co'+_0x56c553(0x36a,0x37a)+_0x1d4f27(-0x25c,-0x26b)+_0x56c553(0x388,0x38a)+_0x56c553(0x35a,0x37e)+_0x583dcb[_0x1d4f27(-0x24f,-0x240)](0x3)+')'};return{'action':_0x3a2437[_0x56c553(0x382,0x3a2)],'similarity':_0x583dcb,'reason':_0x3a2437[_0x1d4f27(-0x20a,-0x22c)](_0x583dcb,0x0)?_0x56c553(0x376,0x37b)+_0x1d4f27(-0x25a,-0x245)+'y\x20('+_0x583dcb[_0x56c553(0x373,0x38b)](0x3)+(_0x1d4f27(-0x25e,-0x239)+'reshold'):_0x3a2437['Trcap']};}[_0x219220(0x381,0x380)+'nt'](_0x2d10bc,_0x4b65ed){function _0x3c8e90(_0x51ef1a,_0x454f80){return _0x219220(_0x454f80- -0x29,_0x51ef1a);}const _0x5196d1={'xjFKo':'\x0a[Updated]'+'\x20'};function _0x5eb6ce(_0x50fc36,_0x5be7da){return _0x219220(_0x50fc36- -0x20c,_0x5be7da);}if(_0x2d10bc[_0x5eb6ce(0x14f,0x16f)](_0x4b65ed[_0x5eb6ce(0x16e,0x17b)]()))return _0x2d10bc;const _0x6ee21b=new Set(_0x2d10bc[_0x3c8e90(0x32b,0x337)]('\x0a')[_0x5eb6ce(0x144,0x13d)](_0x14ef99=>_0x14ef99[_0x3c8e90(0x331,0x351)]())['filter'](_0x5f0fa8=>_0x5f0fa8[_0x5eb6ce(0x167,0x157)]>0x0)),_0x1147dc=_0x4b65ed[_0x3c8e90(0x32e,0x337)]('\x0a')['map'](_0x180e69=>_0x180e69[_0x3c8e90(0x32d,0x351)]())['filter'](_0x4dae34=>_0x4dae34[_0x3c8e90(0x344,0x34a)]>0x0&&!_0x6ee21b[_0x3c8e90(0x327,0x338)](_0x4dae34));if(_0x1147dc[_0x3c8e90(0x362,0x34a)]===0x0)return _0x2d10bc;const _0x25bf31=_0x2d10bc+_0x5196d1['xjFKo']+_0x1147dc['join']('\x0a');return _0x25bf31[_0x5eb6ce(0x16c,0x14d)](0x0,0x7d0);}[_0x219220(0x388,0x384)+_0x219220(0x37e,0x397)](_0x1abfed,_0x48d450,_0x3cf59f,_0x285988=0x32){const _0x1e8646={'ibFbP':function(_0x29f8bf,_0x2a65b5){return _0x29f8bf!==_0x2a65b5;},'nEvTj':function(_0x57bca4,_0x598dcd){return _0x57bca4!==_0x598dcd;}};function _0x22fd6d(_0x162cd2,_0x39b3c8){return _0x219220(_0x39b3c8- -0x549,_0x162cd2);}function _0x540046(_0x51b41a,_0x46b377){return _0x219220(_0x51b41a- -0x583,_0x46b377);}return _0x1abfed['filter'](_0x34b953=>{function _0x3cde66(_0x3ba34b,_0x1dc8b4){return _0x3848(_0x1dc8b4- -0xcb,_0x3ba34b);}if(_0x1e8646[_0x1cdf3e(-0x92,-0x73)](_0x34b953['category'],_0x48d450))return![];if(_0x3cf59f&&_0x1e8646['nEvTj'](_0x34b953[_0x1cdf3e(-0xc3,-0xdf)+'h'],_0x3cf59f))return![];function _0x1cdf3e(_0x5af6a0,_0x155745){return _0x3848(_0x5af6a0- -0x165,_0x155745);}return!![];})['sort']((_0x11084b,_0x41b5f9)=>new Date(_0x41b5f9['updatedAt'])[_0x540046(-0x231,-0x23d)]()-new Date(_0x11084b[_0x540046(-0x23a,-0x22e)])[_0x22fd6d(-0x1e9,-0x1f7)]())[_0x540046(-0x20b,-0x20d)](0x0,_0x285988);}}
|
|
@@ -1,33 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Emotion Filter
|
|
3
|
-
*
|
|
4
|
-
* 사용자 프롬프트에서 감정적 신호를 감지하는 경량 프리필터.
|
|
5
|
-
* Backend emotion.py의 _detect_mood_rules 키워드와 동기화.
|
|
6
|
-
*/
|
|
7
|
-
const EMOTION_KEYWORDS = [
|
|
8
|
-
// 한국어 긍정
|
|
9
|
-
'기뻐', '행복', '좋아', '최고', '신나', '감사', '고마워', '대박', '완벽', '잘됐',
|
|
10
|
-
// 한국어 부정
|
|
11
|
-
'슬퍼', '우울', '힘들어', '불안', '걱정', '짜증', '답답', '화나', '스트레스', '피곤',
|
|
12
|
-
'지쳐', '힘들', '귀찮', '열받', '짜증나', '실망', '후회', '아쉬', '속상',
|
|
13
|
-
// 한국어 중립/상태
|
|
14
|
-
'집중', '몰입', '바쁘', '여유',
|
|
15
|
-
// 영어
|
|
16
|
-
'happy', 'sad', 'frustrated', 'stressed', 'tired', 'anxious', 'excited',
|
|
17
|
-
'angry', 'overwhelmed', 'confused', 'grateful', 'proud', 'disappointed',
|
|
18
|
-
'worried', 'exhausted', 'motivated', 'bored',
|
|
19
|
-
// 이모티콘/이모지
|
|
20
|
-
'ㅠㅠ', 'ㅜㅜ', 'ㅎㅎ', 'ㅋㅋ',
|
|
21
|
-
];
|
|
22
|
-
/** 최소 프롬프트 길이 (짧은 명령어 필터링) */
|
|
23
|
-
const MIN_PROMPT_LENGTH = 10;
|
|
24
|
-
/**
|
|
25
|
-
* 프롬프트에 감정적 신호가 있는지 검사
|
|
26
|
-
*/
|
|
27
|
-
export function hasEmotionalContent(text) {
|
|
28
|
-
if (text.length < MIN_PROMPT_LENGTH)
|
|
29
|
-
return false;
|
|
30
|
-
const lower = text.toLowerCase();
|
|
31
|
-
return EMOTION_KEYWORDS.some(kw => lower.includes(kw));
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=emotion-filter.js.map
|
|
1
|
+
function _0x1c6400(_0x548ccf,_0x4b04e3){return _0x319b(_0x4b04e3-0x30f,_0x548ccf);}function _0x319b(_0x136a4a,_0x79d4b8){_0x136a4a=_0x136a4a-0x139;const _0x164d2c=_0x164d();let _0x319b6f=_0x164d2c[_0x136a4a];if(_0x319b['uEnijr']===undefined){var _0x4c7ab9=function(_0x105c34){const _0x3ded62='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3dd7a0='',_0x4d9096='';for(let _0x2605de=0x0,_0x4f7997,_0x5915a5,_0x581ffb=0x0;_0x5915a5=_0x105c34['charAt'](_0x581ffb++);~_0x5915a5&&(_0x4f7997=_0x2605de%0x4?_0x4f7997*0x40+_0x5915a5:_0x5915a5,_0x2605de++%0x4)?_0x3dd7a0+=String['fromCharCode'](0xff&_0x4f7997>>(-0x2*_0x2605de&0x6)):0x0){_0x5915a5=_0x3ded62['indexOf'](_0x5915a5);}for(let _0x4e45a1=0x0,_0x148b31=_0x3dd7a0['length'];_0x4e45a1<_0x148b31;_0x4e45a1++){_0x4d9096+='%'+('00'+_0x3dd7a0['charCodeAt'](_0x4e45a1)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4d9096);};_0x319b['CzfVgG']=_0x4c7ab9,_0x319b['LgQuPl']={},_0x319b['uEnijr']=!![];}const _0x24d565=_0x164d2c[0x0],_0x782bb0=_0x136a4a+_0x24d565,_0x5f2e9c=_0x319b['LgQuPl'][_0x782bb0];return!_0x5f2e9c?(_0x319b6f=_0x319b['CzfVgG'](_0x319b6f),_0x319b['LgQuPl'][_0x782bb0]=_0x319b6f):_0x319b6f=_0x5f2e9c,_0x319b6f;}function _0x18df9f(_0x250f33,_0x1b3bd8){return _0x319b(_0x250f33-0x102,_0x1b3bd8);}function _0x164d(){const _0x32de0b=['yw5NCNK','7z6y65oK7jA0','AgfWChK','BgvUz3rO','mtC5mJGZnwDRrfDzvW','C29Tzq','B3zLCNDOzwXTzq','6RoG66Ei7jUm','7kEC7kAD64ky','7iQK7yQ466ci7iQK','zgLZyxbWB2LUDa','odi3mdfnuMjPzNO','C3rYzxnZzwq','zxHJAxrLza','nduYmtKYogTytgrSzq','DgLYzwq','nta4ndG1tuDtzML6','mJC2ntq3nKXQtuXMsG','nhPozKfUEq','ChjVDwq','mJi0ndCZnLr0vwr2tG','C2fK','zNj1C3rYyxrLza','Aw5JBhvKzxm','yw54Aw91CW','y29UzNvZzwq','z3jHDgvMDwW','mtq4mJaXogHVt3HiBW'];_0x164d=function(){return _0x32de0b;};return _0x164d();}(function(_0x7a2d6f,_0x5ab4df){const _0x3402aa=_0x7a2d6f();function _0x46d8c5(_0x1193f7,_0x715dbe){return _0x319b(_0x715dbe-0x3d6,_0x1193f7);}function _0x234940(_0x58f4bd,_0x1394fc){return _0x319b(_0x58f4bd-0x101,_0x1394fc);}while(!![]){try{const _0x5cbf51=parseInt(_0x46d8c5(0x525,0x523))/0x1*(parseInt(_0x234940(0x255,0x25c))/0x2)+-parseInt(_0x46d8c5(0x532,0x528))/0x3+-parseInt(_0x46d8c5(0x507,0x510))/0x4+-parseInt(_0x46d8c5(0x527,0x51c))/0x5+parseInt(_0x234940(0x242,0x246))/0x6+parseInt(_0x234940(0x254,0x259))/0x7+parseInt(_0x234940(0x251,0x259))/0x8;if(_0x5cbf51===_0x5ab4df)break;else _0x3402aa['push'](_0x3402aa['shift']());}catch(_0x58727e){_0x3402aa['push'](_0x3402aa['shift']());}}}(_0x164d,0x4534c));const EMOTION_KEYWORDS=['기뻐','행복','좋아','최고','신나','감사',_0x18df9f(0x24b,0x245),'대박','완벽','잘됐','슬퍼','우울',_0x1c6400(0x44e,0x452),'불안','걱정','짜증','답답','화나',_0x1c6400(0x44d,0x45a),'피곤','지쳐','힘들','귀찮','열받',_0x18df9f(0x24c,0x256),'실망','후회','아쉬','속상','집중','몰입','바쁘','여유',_0x18df9f(0x246,0x247),_0x18df9f(0x23d,0x23d),_0x1c6400(0x444,0x44b),_0x1c6400(0x463,0x45d),_0x18df9f(0x253,0x24f),_0x18df9f(0x240,0x232),_0x18df9f(0x251,0x25b),_0x18df9f(0x244,0x238),_0x1c6400(0x45e,0x457)+'d',_0x1c6400(0x455,0x44e),_0x1c6400(0x44b,0x44f),_0x1c6400(0x445,0x448),_0x1c6400(0x44d,0x45b)+'ed','worried','exhausted','motivated','bored','ㅠㅠ','ㅜㅜ','ㅎㅎ','ㅋㅋ'],MIN_PROMPT_LENGTH=0xa;export function hasEmotionalContent(_0x1d2a2e){const _0x1d3f56={'HjELH':function(_0x1aeac4,_0x4157b9){return _0x1aeac4<_0x4157b9;}};if(_0x1d3f56['HjELH'](_0x1d2a2e[_0x6b2184(-0x6f,-0x6a)],MIN_PROMPT_LENGTH))return![];function _0x45b950(_0x2200fb,_0x1bebe1){return _0x1c6400(_0x2200fb,_0x1bebe1- -0x3f2);}const _0x308062=_0x1d2a2e['toLowerCas'+'e']();function _0x6b2184(_0x24bbb1,_0x565d07){return _0x1c6400(_0x565d07,_0x24bbb1- -0x4c3);}return EMOTION_KEYWORDS[_0x6b2184(-0x6d,-0x77)](_0x27ceaa=>_0x308062[_0x45b950(0x5f,0x5a)](_0x27ceaa));}
|
|
@@ -10,9 +10,6 @@ import type { LLMClient } from '../llm/client.js';
|
|
|
10
10
|
* 메시지가 노이즈인지 판별
|
|
11
11
|
*/
|
|
12
12
|
export declare function isNoiseMessage(text: string): boolean;
|
|
13
|
-
/**
|
|
14
|
-
* 세션 메시지에서 메모리 추출
|
|
15
|
-
*/
|
|
16
13
|
export declare function extractMemories(messages: SessionMessage[], projectPath: string): ExtractionResult;
|
|
17
14
|
/**
|
|
18
15
|
* LLM 기반 분류가 포함된 메모리 추출 (async)
|