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,549 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SessionStart Hook
|
|
3
|
-
*
|
|
4
|
-
* Claude Code 세션 시작 시 실행됩니다.
|
|
5
|
-
* Progressive Disclosure: compact 인덱스 모드로 출력합니다.
|
|
6
|
-
* 상세 내용은 CLI `a2a-memory search`로 확인 가능.
|
|
7
|
-
*/
|
|
8
|
-
import { basename } from 'node:path';
|
|
9
|
-
import { getSharedDb, closeSharedDb, normalizeHookInput } from './shared.js';
|
|
10
|
-
import { ConfigManager } from '../config/manager.js';
|
|
11
|
-
import { createHookClient } from './client-factory.js';
|
|
12
|
-
import { MemorySynchronizer } from '../sync/synchronizer.js';
|
|
13
|
-
import { deduplicateByEmbedding } from '../extraction/similarity.js';
|
|
14
|
-
import { HybridRanker } from '../search/ranker.js';
|
|
15
|
-
import { AdaptiveRouter } from '../search/adaptive-router.js';
|
|
16
|
-
import { createLogger } from '../utils/logger.js';
|
|
17
|
-
/**
|
|
18
|
-
* 동일 Parent의 인접 chunk 병합
|
|
19
|
-
* - 같은 Parent에서 2개 이상 Child가 히트되면 → Parent content로 대체
|
|
20
|
-
* - 토큰 버짓 내에서만
|
|
21
|
-
*/
|
|
22
|
-
function mergeParentChunks(selectedMemories, db, maxTokens) {
|
|
23
|
-
// parentId별 그룹화
|
|
24
|
-
const parentGroups = new Map();
|
|
25
|
-
const independent = [];
|
|
26
|
-
for (const item of selectedMemories) {
|
|
27
|
-
if (item.memory.parentId) {
|
|
28
|
-
const group = parentGroups.get(item.memory.parentId) ?? [];
|
|
29
|
-
group.push(item);
|
|
30
|
-
parentGroups.set(item.memory.parentId, group);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
independent.push(item);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const result = [...independent];
|
|
37
|
-
let cumulativeParentTokens = 0;
|
|
38
|
-
const maxParentBudget = maxTokens * 0.5; // Parent 대체에 할당할 최대 토큰
|
|
39
|
-
for (const [parentId, children] of parentGroups) {
|
|
40
|
-
if (children.length >= 2) {
|
|
41
|
-
// 2개 이상 Child → Parent로 대체 시도
|
|
42
|
-
const parent = db.getMemory(parentId);
|
|
43
|
-
if (parent) {
|
|
44
|
-
const parentTokens = Math.ceil(parent.content.length / 4);
|
|
45
|
-
if (cumulativeParentTokens + parentTokens <= maxParentBudget) {
|
|
46
|
-
result.push({ memory: parent, score: Math.max(...children.map(c => c.score)) });
|
|
47
|
-
cumulativeParentTokens += parentTokens;
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// Parent 대체 불가 시 Children 그대로 사용
|
|
53
|
-
result.push(...children);
|
|
54
|
-
}
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* 프로젝트 경로에서 컨텍스트 인식 검색 쿼리 생성
|
|
59
|
-
* 프로젝트명 토큰 + 최근 메모리 태그 결합
|
|
60
|
-
*/
|
|
61
|
-
function buildSearchQuery(projectPath, db) {
|
|
62
|
-
const name = basename(projectPath);
|
|
63
|
-
const baseKeywords = name.split(/[-_.]/).filter((k) => k.length > 1);
|
|
64
|
-
if (!db)
|
|
65
|
-
return baseKeywords.join(' ');
|
|
66
|
-
// 1. 최근 메모리에서 핵심 태그 추출
|
|
67
|
-
const recentMemories = db.listMemories({
|
|
68
|
-
projectPath,
|
|
69
|
-
limit: 10,
|
|
70
|
-
});
|
|
71
|
-
const recentTags = new Set();
|
|
72
|
-
for (const mem of recentMemories) {
|
|
73
|
-
for (const tag of (mem.tags || [])) {
|
|
74
|
-
if (tag.length > 2 && !tag.startsWith('session:') && !tag.startsWith('claude-md')) {
|
|
75
|
-
recentTags.add(tag);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// 2. 최근 메모리 content에서 TF-IDF 스타일 키워드 추출 (새로 추가)
|
|
80
|
-
const STOP_WORDS = new Set([
|
|
81
|
-
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
82
|
-
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
83
|
-
'should', 'may', 'might', 'can', 'shall', 'to', 'of', 'in', 'for',
|
|
84
|
-
'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
|
|
85
|
-
'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'both', 'either',
|
|
86
|
-
'this', 'that', 'these', 'those', 'it', 'its', 'i', 'we', 'you',
|
|
87
|
-
'he', 'she', 'they', 'me', 'him', 'her', 'us', 'them', 'my', 'your',
|
|
88
|
-
'his', 'our', 'their', 'what', 'which', 'who', 'when', 'where', 'how',
|
|
89
|
-
'all', 'each', 'every', 'any', 'few', 'more', 'most', 'some', 'such',
|
|
90
|
-
'no', 'only', 'same', 'than', 'too', 'very', 'just', 'also', 'now',
|
|
91
|
-
]);
|
|
92
|
-
const wordFreq = new Map();
|
|
93
|
-
for (const mem of recentMemories) {
|
|
94
|
-
const words = mem.content
|
|
95
|
-
.toLowerCase()
|
|
96
|
-
.replace(/[^a-z가-힣0-9\s]/g, ' ')
|
|
97
|
-
.split(/\s+/)
|
|
98
|
-
.filter(w => w.length > 2 && !STOP_WORDS.has(w) && !/^\d+$/.test(w));
|
|
99
|
-
for (const w of words) {
|
|
100
|
-
wordFreq.set(w, (wordFreq.get(w) || 0) + 1);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// 빈도 Top 5 키워드 추출 (프로젝트명과 중복 제거)
|
|
104
|
-
const baseSet = new Set(baseKeywords.map(k => k.toLowerCase()));
|
|
105
|
-
const contentKeywords = [...wordFreq.entries()]
|
|
106
|
-
.sort((a, b) => b[1] - a[1])
|
|
107
|
-
.filter(([w]) => !baseSet.has(w))
|
|
108
|
-
.slice(0, 5)
|
|
109
|
-
.map(([w]) => w);
|
|
110
|
-
// 3. 프로젝트명 + 태그 + content 키워드 결합 (최대 10 키워드)
|
|
111
|
-
const allKeywords = [...baseKeywords, ...Array.from(recentTags).slice(0, 3), ...contentKeywords];
|
|
112
|
-
return allKeywords.slice(0, 10).join(' ');
|
|
113
|
-
}
|
|
114
|
-
/** 카테고리 표시 레이블 */
|
|
115
|
-
const CATEGORY_LABELS = {
|
|
116
|
-
error_solution: 'Known Issues & Solutions',
|
|
117
|
-
convention: 'Project Conventions',
|
|
118
|
-
decision: 'Architecture Decisions',
|
|
119
|
-
code_pattern: 'Code Patterns',
|
|
120
|
-
skill: 'Active Skills',
|
|
121
|
-
learning: 'Learnings',
|
|
122
|
-
context: 'Project Context',
|
|
123
|
-
};
|
|
124
|
-
/** 카테고리 출력 우선순위 */
|
|
125
|
-
const CATEGORY_ORDER = ['error_solution', 'convention', 'decision', 'code_pattern', 'skill', 'learning', 'context'];
|
|
126
|
-
/** error_solution 카테고리 상한 */
|
|
127
|
-
const ERROR_SOLUTION_MAX = 3;
|
|
128
|
-
/**
|
|
129
|
-
* 카테고리 다양성을 보장하는 메모리 선택
|
|
130
|
-
* - error_solution 최대 ERROR_SOLUTION_MAX개 (상한)
|
|
131
|
-
* - skill, decision, convention 각 최소 1개 (있으면)
|
|
132
|
-
* - 나머지 슬롯은 점수순
|
|
133
|
-
*/
|
|
134
|
-
function selectWithCategoryDiversity(sortedResults, limit) {
|
|
135
|
-
if (sortedResults.length <= limit)
|
|
136
|
-
return sortedResults;
|
|
137
|
-
const selected = [];
|
|
138
|
-
const used = new Set();
|
|
139
|
-
// 카테고리별 그룹화
|
|
140
|
-
const byCat = new Map();
|
|
141
|
-
for (const item of sortedResults) {
|
|
142
|
-
const cat = item.memory.category;
|
|
143
|
-
if (!byCat.has(cat))
|
|
144
|
-
byCat.set(cat, []);
|
|
145
|
-
byCat.get(cat).push(item);
|
|
146
|
-
}
|
|
147
|
-
// 1. 우선 보장 카테고리: skill, decision, convention 각 최소 1개
|
|
148
|
-
const priorityCategories = ['skill', 'decision', 'convention'];
|
|
149
|
-
for (const cat of priorityCategories) {
|
|
150
|
-
const items = byCat.get(cat);
|
|
151
|
-
if (items && items.length > 0 && selected.length < limit) {
|
|
152
|
-
const pick = items[0]; // 점수 내림차순이므로 첫 번째가 최고
|
|
153
|
-
selected.push(pick);
|
|
154
|
-
used.add(pick.memory.id);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
// 2. error_solution 상한 적용
|
|
158
|
-
const errorItems = byCat.get('error_solution') ?? [];
|
|
159
|
-
let errorCount = 0;
|
|
160
|
-
for (const item of errorItems) {
|
|
161
|
-
if (errorCount >= ERROR_SOLUTION_MAX)
|
|
162
|
-
break;
|
|
163
|
-
if (used.has(item.memory.id))
|
|
164
|
-
continue;
|
|
165
|
-
if (selected.length >= limit)
|
|
166
|
-
break;
|
|
167
|
-
selected.push(item);
|
|
168
|
-
used.add(item.memory.id);
|
|
169
|
-
errorCount++;
|
|
170
|
-
}
|
|
171
|
-
// 3. 나머지 슬롯은 점수순으로 채움
|
|
172
|
-
for (const item of sortedResults) {
|
|
173
|
-
if (selected.length >= limit)
|
|
174
|
-
break;
|
|
175
|
-
if (used.has(item.memory.id))
|
|
176
|
-
continue;
|
|
177
|
-
selected.push(item);
|
|
178
|
-
used.add(item.memory.id);
|
|
179
|
-
}
|
|
180
|
-
// 점수 내림차순 재정렬 (출력 일관성)
|
|
181
|
-
selected.sort((a, b) => b.score - a.score);
|
|
182
|
-
return selected;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* 여러 줄 콘텐츠를 지정 길이로 요약
|
|
186
|
-
*/
|
|
187
|
-
function summarizeMultiline(content, maxLen) {
|
|
188
|
-
const lines = content.split('\n').filter((l) => l.trim());
|
|
189
|
-
let result = '';
|
|
190
|
-
for (const line of lines) {
|
|
191
|
-
if ((result + ' ' + line).length > maxLen)
|
|
192
|
-
break;
|
|
193
|
-
result += (result ? ' ' : '') + line.trim();
|
|
194
|
-
}
|
|
195
|
-
return result || content.slice(0, maxLen) + '…';
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* 구조화된 메모리 출력 포맷 생성
|
|
199
|
-
*/
|
|
200
|
-
function formatMemoryOutput(selectedMemories, teamMemories, _projectPath, proficiencyMap) {
|
|
201
|
-
const lines = ['<!-- A2A Memory Context -->'];
|
|
202
|
-
// 카테고리별 그룹화
|
|
203
|
-
const grouped = new Map();
|
|
204
|
-
for (const m of selectedMemories) {
|
|
205
|
-
const cat = m.memory.category;
|
|
206
|
-
if (!grouped.has(cat))
|
|
207
|
-
grouped.set(cat, []);
|
|
208
|
-
grouped.get(cat).push(m);
|
|
209
|
-
}
|
|
210
|
-
// 우선순위 순서로 출력
|
|
211
|
-
for (const cat of CATEGORY_ORDER) {
|
|
212
|
-
const items = grouped.get(cat);
|
|
213
|
-
if (!items || items.length === 0)
|
|
214
|
-
continue;
|
|
215
|
-
const label = CATEGORY_LABELS[cat] || cat;
|
|
216
|
-
lines.push(`\n### ${label}`);
|
|
217
|
-
for (const { memory } of items) {
|
|
218
|
-
const summary = summarizeMultiline(memory.content, 500);
|
|
219
|
-
// 스킬 카테고리: 숙련도 레벨 표시
|
|
220
|
-
if (cat === 'skill' && proficiencyMap && proficiencyMap.size > 0) {
|
|
221
|
-
// skill_name 매칭: content 첫 줄 또는 태그에서 이름 추출
|
|
222
|
-
const skillName = memory.content.split('\n')[0].slice(0, 50).trim();
|
|
223
|
-
const level = proficiencyMap.get(skillName);
|
|
224
|
-
const levelSuffix = level !== undefined ? ` [Lv.${level}]` : '';
|
|
225
|
-
lines.push(`- ${summary}${levelSuffix}`);
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
lines.push(`- ${summary}`);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
// 팀 메모리
|
|
233
|
-
if (teamMemories.length > 0) {
|
|
234
|
-
lines.push('\n### Team Insights');
|
|
235
|
-
for (const tm of teamMemories) {
|
|
236
|
-
lines.push(`- [${tm.category}] ${summarizeMultiline(tm.content, 150)}`);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
lines.push('');
|
|
240
|
-
lines.push('💡 `a2a-memory search <query>` for details.');
|
|
241
|
-
lines.push('<!-- /A2A Memory Context -->');
|
|
242
|
-
return lines.join('\n');
|
|
243
|
-
}
|
|
244
|
-
/** pull 동기화 로직 (fire-and-forget) */
|
|
245
|
-
async function pullRemoteMemories(config, db) {
|
|
246
|
-
if (!config.autoSync.enabled || !config.autoSync.pullOnSessionStart || !config.server.apiKey)
|
|
247
|
-
return;
|
|
248
|
-
const client = createHookClient(config, 5000); // fire-and-forget이지만 이벤트 루프 유지 방지
|
|
249
|
-
if (!client)
|
|
250
|
-
return;
|
|
251
|
-
if (config.mode === 'team' && config.team) {
|
|
252
|
-
// 팀 모드: TeamSynchronizer로 pull
|
|
253
|
-
try {
|
|
254
|
-
const { TeamSynchronizer } = await import('../sync/team-synchronizer.js');
|
|
255
|
-
const teamSync = new TeamSynchronizer(db, client, config.team.teamPath, config.team.nodeId);
|
|
256
|
-
teamSync.pullFromTeam().catch((err) => {
|
|
257
|
-
console.error('[a2a] Team pull failed (background):', err instanceof Error ? err.message : String(err));
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
catch {
|
|
261
|
-
// TeamSynchronizer 미설치 시 무시
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
const synchronizer = new MemorySynchronizer(db, client);
|
|
266
|
-
synchronizer.pull().catch((err) => {
|
|
267
|
-
console.error('[a2a] Background pull failed, using local cache:', err instanceof Error ? err.message : String(err));
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
/** 메모리 검색 및 필터링 */
|
|
272
|
-
async function fetchRelevantMemories(context, config, db, logger) {
|
|
273
|
-
const limit = config.autoInject.maxMemories;
|
|
274
|
-
// 1차: FTS 검색 (프로젝트명 + 최근 태그 기반)
|
|
275
|
-
const query = buildSearchQuery(context.projectPath, db);
|
|
276
|
-
const ftsResults = query ? db.search({ query, limit }) : [];
|
|
277
|
-
logger.info('FTS search', { count: ftsResults.length, query });
|
|
278
|
-
// AdaptiveRouter로 쿼리 복잡도 분류 (<1ms, 규칙 기반)
|
|
279
|
-
const router = new AdaptiveRouter();
|
|
280
|
-
const routing = router.classify(query);
|
|
281
|
-
logger.debug('Query routing', { complexity: routing.complexity, reason: routing.reason });
|
|
282
|
-
let results;
|
|
283
|
-
// 2차: 벡터 검색 활성 조건 (routing + embedding config 모두 충족)
|
|
284
|
-
if (routing.useVector && config.embedding?.enabled) {
|
|
285
|
-
try {
|
|
286
|
-
const { createEmbeddingProvider } = await import('../embedding/index.js');
|
|
287
|
-
const provider = createEmbeddingProvider(config.embedding, config.llm);
|
|
288
|
-
// 쿼리 임베딩 생성 (동기/비동기 대응)
|
|
289
|
-
const queryText = query || basename(context.projectPath);
|
|
290
|
-
const queryEmbedding = await Promise.resolve(provider.embed(queryText));
|
|
291
|
-
// 벡터 검색
|
|
292
|
-
const vectorResults = db.searchByVector(queryEmbedding, limit);
|
|
293
|
-
// 최근 메모리
|
|
294
|
-
const recentMemories = db.listMemories({ limit, projectPath: context.projectPath });
|
|
295
|
-
// HybridRanker로 통합 (부스트 활성화)
|
|
296
|
-
const ranker = new HybridRanker({
|
|
297
|
-
categoryBoost: true,
|
|
298
|
-
tierBoost: true,
|
|
299
|
-
recencyDecay: true,
|
|
300
|
-
});
|
|
301
|
-
let ranked = ranker.rank(ftsResults, vectorResults, recentMemories);
|
|
302
|
-
// 3차: Reranker 적용 (complex 쿼리 시 top-20 → limit으로 정제)
|
|
303
|
-
if (routing.useReranker) {
|
|
304
|
-
try {
|
|
305
|
-
const { CrossEncoderReranker } = await import('../search/reranker.js');
|
|
306
|
-
const reranker = new CrossEncoderReranker();
|
|
307
|
-
// top-20을 rerank하여 limit개로 줄임
|
|
308
|
-
const candidates = ranked.slice(0, 20);
|
|
309
|
-
ranked = await reranker.rerank(query, candidates, limit);
|
|
310
|
-
logger.debug('Reranking applied', { candidates: candidates.length, output: ranked.length });
|
|
311
|
-
}
|
|
312
|
-
catch {
|
|
313
|
-
// Reranker 실패 시 기존 결과 사용 (graceful degradation)
|
|
314
|
-
logger.debug('Reranker unavailable, using hybrid results');
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
results = ranked.slice(0, limit).map(r => ({
|
|
318
|
-
memory: r.memory,
|
|
319
|
-
score: r.score,
|
|
320
|
-
matchType: 'hybrid',
|
|
321
|
-
}));
|
|
322
|
-
logger.info('Hybrid search', { count: results.length, routing: routing.complexity });
|
|
323
|
-
}
|
|
324
|
-
catch (embErr) {
|
|
325
|
-
// 임베딩 실패 시 FTS 결과만 사용
|
|
326
|
-
logger.warn('Embedding search failed', { error: embErr instanceof Error ? embErr.message : String(embErr) });
|
|
327
|
-
results = ftsResults;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
// 임베딩 비활성 또는 simple 쿼리: FTS 검색 + 벡터 폴백 유지 (하위호환)
|
|
332
|
-
results = ftsResults;
|
|
333
|
-
// FTS 결과 부족 시 벡터 검색 폴백
|
|
334
|
-
if (results.length < limit) {
|
|
335
|
-
try {
|
|
336
|
-
// 최근 메모리에서 임베딩 기반 보충
|
|
337
|
-
const allMemories = db.listMemories({ limit: limit * 2, projectPath: context.projectPath });
|
|
338
|
-
const withEmbedding = allMemories.filter((m) => m.embedding && m.embedding.length > 0);
|
|
339
|
-
if (withEmbedding.length > 0) {
|
|
340
|
-
// 이미 결과에 있는 ID 제외
|
|
341
|
-
const existingIds = new Set(results.map((r) => r.memory.id));
|
|
342
|
-
const additional = withEmbedding
|
|
343
|
-
.filter((m) => !existingIds.has(m.id))
|
|
344
|
-
.slice(0, limit - results.length)
|
|
345
|
-
.map((m) => ({
|
|
346
|
-
memory: m,
|
|
347
|
-
score: 0.5, // 벡터 폴백 기본 점수
|
|
348
|
-
matchType: 'vector',
|
|
349
|
-
}));
|
|
350
|
-
results.push(...additional);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
catch (vecErr) {
|
|
354
|
-
// 벡터 검색 실패 무시
|
|
355
|
-
logger.warn('Vector fallback failed', { error: vecErr instanceof Error ? vecErr.message : String(vecErr) });
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
return { results, query };
|
|
360
|
-
}
|
|
361
|
-
/** 팀 메모리 + proficiency 조회 */
|
|
362
|
-
async function buildSkillInjection(context, config, query, limit, logger) {
|
|
363
|
-
// 팀 메모리 검색 (team 모드, 3초 타임아웃)
|
|
364
|
-
let teamMemoryData = [];
|
|
365
|
-
if (config.mode === 'team' && config.team && config.server.apiKey) {
|
|
366
|
-
try {
|
|
367
|
-
const teamClient = createHookClient(config, 3000); // Hook에서는 짧은 타임아웃
|
|
368
|
-
if (!teamClient)
|
|
369
|
-
throw new Error('team client not available');
|
|
370
|
-
const teamMemories = await teamClient.searchTeamMemories(config.team.teamPath, query, { limit: Math.min(3, limit) });
|
|
371
|
-
teamMemoryData = teamMemories.map((tm) => ({
|
|
372
|
-
category: tm.category,
|
|
373
|
-
content: tm.content,
|
|
374
|
-
}));
|
|
375
|
-
}
|
|
376
|
-
catch (teamErr) {
|
|
377
|
-
// 팀 검색 실패 무시
|
|
378
|
-
logger.warn('Team search failed', { error: teamErr instanceof Error ? teamErr.message : String(teamErr) });
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
// Proficiency Level 표시 (서버에서 pull, 3초 타임아웃)
|
|
382
|
-
let proficiencyMap = new Map();
|
|
383
|
-
if (config.server?.apiKey && config.server?.url) {
|
|
384
|
-
try {
|
|
385
|
-
const profClient = createHookClient(config, 3000); // Hook에서는 짧은 타임아웃 (기본 60초 → 3초)
|
|
386
|
-
const proficiencies = profClient ? await profClient.listProficiencies(context.projectPath) : [];
|
|
387
|
-
if (proficiencies.length > 0) {
|
|
388
|
-
proficiencyMap = new Map(proficiencies.map(p => [p.skill_name, p.level]));
|
|
389
|
-
logger.debug('Fetched proficiency levels from server', { count: proficiencies.length });
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
catch {
|
|
393
|
-
// 서버 연결 실패 또는 타임아웃 시 무시 (Lv. 표시 생략)
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
return { teamMemoryData, proficiencyMap };
|
|
397
|
-
}
|
|
398
|
-
/**
|
|
399
|
-
* sessionId 해시의 마지막 비트로 A/B 그룹을 결정 (50:50).
|
|
400
|
-
* - 'A': 기존 메모리 주입 수행
|
|
401
|
-
* - 'B': 주입 건너뜀 (로깅만)
|
|
402
|
-
*/
|
|
403
|
-
function resolveAbGroup(sessionId) {
|
|
404
|
-
let hash = 0;
|
|
405
|
-
for (let i = 0; i < sessionId.length; i++) {
|
|
406
|
-
hash = (hash * 31 + sessionId.charCodeAt(i)) >>> 0;
|
|
407
|
-
}
|
|
408
|
-
return (hash & 1) === 0 ? 'A' : 'B';
|
|
409
|
-
}
|
|
410
|
-
export async function handleSessionStart(context) {
|
|
411
|
-
const config = new ConfigManager().load();
|
|
412
|
-
const logger = createLogger('SessionStart', config.logging);
|
|
413
|
-
const startTime = performance.now();
|
|
414
|
-
logger.info('Hook started', { projectPath: context.projectPath });
|
|
415
|
-
if (!config.autoInject.enabled) {
|
|
416
|
-
logger.info('Auto-inject disabled');
|
|
417
|
-
logger.flush();
|
|
418
|
-
return '';
|
|
419
|
-
}
|
|
420
|
-
// A/B 테스트: enabled 시 B그룹은 주입 건너뜀
|
|
421
|
-
const abTestEnabled = config.abTest?.enabled === true;
|
|
422
|
-
const abGroup = abTestEnabled ? resolveAbGroup(context.sessionId) : 'A';
|
|
423
|
-
if (abTestEnabled && abGroup === 'B') {
|
|
424
|
-
logger.info('A/B test: group B — skipping injection', { sessionId: context.sessionId });
|
|
425
|
-
// B그룹 로그 기록 (주입 없음 표시)
|
|
426
|
-
try {
|
|
427
|
-
const db = getSharedDb(config.db.path);
|
|
428
|
-
db.recordInjection({
|
|
429
|
-
sessionId: context.sessionId,
|
|
430
|
-
hookType: 'session_start',
|
|
431
|
-
injectedMemoryIds: [],
|
|
432
|
-
injectedKeywords: [],
|
|
433
|
-
totalInjected: 0,
|
|
434
|
-
abGroup: 'B',
|
|
435
|
-
});
|
|
436
|
-
}
|
|
437
|
-
catch {
|
|
438
|
-
// 로그 기록 실패는 비치명적
|
|
439
|
-
}
|
|
440
|
-
logger.flush();
|
|
441
|
-
return '';
|
|
442
|
-
}
|
|
443
|
-
const db = getSharedDb(config.db.path);
|
|
444
|
-
try {
|
|
445
|
-
// Step 1: 백그라운드 pull (fire-and-forget)
|
|
446
|
-
await pullRemoteMemories(config, db);
|
|
447
|
-
// Step 2: 메모리 검색 및 필터링
|
|
448
|
-
const { results, query } = await fetchRelevantMemories(context, config, db, logger);
|
|
449
|
-
if (results.length === 0) {
|
|
450
|
-
logger.info('No memories found');
|
|
451
|
-
logger.flush();
|
|
452
|
-
return '';
|
|
453
|
-
}
|
|
454
|
-
const limit = config.autoInject.maxMemories;
|
|
455
|
-
// 코사인 중복 제거 (임베딩 있을 때)
|
|
456
|
-
const memories = results.map((r) => r.memory);
|
|
457
|
-
const deduped = deduplicateByEmbedding(memories);
|
|
458
|
-
const dedupedIds = new Set(deduped.map((m) => m.id));
|
|
459
|
-
const dedupedResults = results.filter((r) => dedupedIds.has(r.memory.id));
|
|
460
|
-
// 점수 내림차순 정렬
|
|
461
|
-
dedupedResults.sort((a, b) => b.score - a.score);
|
|
462
|
-
// 실제로 출력할 메모리 선택 (카테고리 다양성 보장)
|
|
463
|
-
const selectedMemories = selectWithCategoryDiversity(dedupedResults, limit);
|
|
464
|
-
// Parent-Child 병합 (동일 Parent에서 다수 Child 히트 시 Parent content로 대체)
|
|
465
|
-
const mergedMemories = mergeParentChunks(selectedMemories, db, config.autoInject.maxTokens);
|
|
466
|
-
// 접근 추적: 주입되는 메모리의 access_count 증가
|
|
467
|
-
// skill도 포함 — 순환 강화는 evaluator가 skill을 클러스터링 대상에서 제외하여 방지
|
|
468
|
-
for (const { memory } of mergedMemories) {
|
|
469
|
-
db.recordAccess(memory.id); // 세션 주입 시 접근 기록
|
|
470
|
-
}
|
|
471
|
-
// Step 3: 팀 메모리 + proficiency 조회
|
|
472
|
-
const { teamMemoryData, proficiencyMap } = await buildSkillInjection(context, config, query, limit, logger);
|
|
473
|
-
// 주입 효과 기록 (fire-and-forget, < 5ms)
|
|
474
|
-
try {
|
|
475
|
-
const keywords = mergedMemories.flatMap(({ memory }) => memory.content.toLowerCase().split(/\s+/).filter(w => w.length > 3).slice(0, 5));
|
|
476
|
-
db.recordInjection({
|
|
477
|
-
sessionId: context.sessionId,
|
|
478
|
-
hookType: 'session_start',
|
|
479
|
-
injectedMemoryIds: mergedMemories.map(({ memory }) => memory.id),
|
|
480
|
-
injectedKeywords: [...new Set(keywords)].slice(0, 20),
|
|
481
|
-
totalInjected: mergedMemories.length,
|
|
482
|
-
abGroup: abTestEnabled ? abGroup : undefined,
|
|
483
|
-
});
|
|
484
|
-
}
|
|
485
|
-
catch {
|
|
486
|
-
// 효과 기록 실패는 비치명적
|
|
487
|
-
}
|
|
488
|
-
// 구조화된 포맷으로 출력
|
|
489
|
-
const output = formatMemoryOutput(mergedMemories, teamMemoryData, context.projectPath, proficiencyMap);
|
|
490
|
-
logger.info('Hook completed', {
|
|
491
|
-
durationMs: Math.round(performance.now() - startTime),
|
|
492
|
-
memories: mergedMemories.length,
|
|
493
|
-
});
|
|
494
|
-
logger.flush();
|
|
495
|
-
return output;
|
|
496
|
-
}
|
|
497
|
-
finally {
|
|
498
|
-
// DB는 싱글톤으로 관리 — close하지 않음
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
/** 전체 Hook 안전 타임아웃 (초) */
|
|
502
|
-
const HOOK_TIMEOUT_MS = 10_000;
|
|
503
|
-
/**
|
|
504
|
-
* CLI 엔트리포인트
|
|
505
|
-
* stdin으로 HookContext JSON을 받아 처리
|
|
506
|
-
* 전체 실행에 HOOK_TIMEOUT_MS 안전장치 적용
|
|
507
|
-
*/
|
|
508
|
-
export async function main() {
|
|
509
|
-
const chunks = [];
|
|
510
|
-
for await (const chunk of process.stdin) {
|
|
511
|
-
chunks.push(chunk);
|
|
512
|
-
}
|
|
513
|
-
const input = Buffer.concat(chunks).toString('utf-8').trim();
|
|
514
|
-
if (!input) {
|
|
515
|
-
closeSharedDb();
|
|
516
|
-
process.exit(0);
|
|
517
|
-
}
|
|
518
|
-
// 전체 Hook 실행 안전장치: HOOK_TIMEOUT_MS 초과 시 강제 종료
|
|
519
|
-
// unref()로 이 타이머만으로 이벤트 루프가 유지되지 않게 함
|
|
520
|
-
const safetyTimer = setTimeout(() => {
|
|
521
|
-
console.error(`[a2a] SessionStart safety timeout (${HOOK_TIMEOUT_MS}ms) — exiting gracefully`);
|
|
522
|
-
closeSharedDb();
|
|
523
|
-
process.exit(0);
|
|
524
|
-
}, HOOK_TIMEOUT_MS);
|
|
525
|
-
safetyTimer.unref();
|
|
526
|
-
try {
|
|
527
|
-
const raw = JSON.parse(input);
|
|
528
|
-
const context = normalizeHookInput(raw);
|
|
529
|
-
const output = await handleSessionStart(context);
|
|
530
|
-
if (output) {
|
|
531
|
-
process.stdout.write(output);
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
catch (err) {
|
|
535
|
-
console.error('[a2a] SessionStart error:', err instanceof Error ? err.message : err);
|
|
536
|
-
}
|
|
537
|
-
finally {
|
|
538
|
-
closeSharedDb();
|
|
539
|
-
// fire-and-forget 프로미스가 이벤트 루프를 붙잡고 있을 수 있으므로 명시적 종료
|
|
540
|
-
process.exit(0);
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
// 직접 실행 시에만 main() 호출
|
|
544
|
-
const isMainModule = process.argv[1]?.endsWith('session-start.js') ||
|
|
545
|
-
process.argv[1]?.endsWith('session-start.ts');
|
|
546
|
-
if (isMainModule) {
|
|
547
|
-
main();
|
|
548
|
-
}
|
|
549
|
-
//# sourceMappingURL=session-start.js.map
|
|
1
|
+
(function(_0x3a69f4,_0x53164c){function _0x1c8eb9(_0x19a5c9,_0x2bfad8){return _0x1d39(_0x19a5c9- -0x37f,_0x2bfad8);}const _0x3de837=_0x3a69f4();function _0x23aedf(_0x47e350,_0x37b7a2){return _0x1d39(_0x37b7a2-0x2f6,_0x47e350);}while(!![]){try{const _0x5bdab9=parseInt(_0x23aedf(0x46d,0x4d7))/0x1+-parseInt(_0x23aedf(0x57f,0x4f4))/0x2+-parseInt(_0x1c8eb9(-0x28d,-0x228))/0x3*(parseInt(_0x1c8eb9(-0x287,-0x1e2))/0x4)+-parseInt(_0x23aedf(0x38c,0x423))/0x5+parseInt(_0x23aedf(0x3ae,0x3e5))/0x6*(-parseInt(_0x1c8eb9(-0x2ac,-0x354))/0x7)+-parseInt(_0x23aedf(0x41c,0x3bd))/0x8+parseInt(_0x23aedf(0x3a4,0x3a9))/0x9*(parseInt(_0x23aedf(0x40e,0x439))/0xa);if(_0x5bdab9===_0x53164c)break;else _0x3de837['push'](_0x3de837['shift']());}catch(_0x1c06db){_0x3de837['push'](_0x3de837['shift']());}}}(_0x2efb,0x2913b));import{basename}from'node:path';import{getSharedDb,closeSharedDb,normalizeHookInput}from'./shared.js';import{ConfigManager}from'../config/manager.js';import{createHookClient}from'./client-factory.js';import{MemorySynchronizer}from'../sync/synchronizer.js';import{deduplicateByEmbedding}from'../extraction/similarity.js';import{HybridRanker}from'../search/ranker.js';import{AdaptiveRouter}from'../search/adaptive-router.js';import{createLogger}from'../utils/logger.js';function mergeParentChunks(_0x220ceb,_0x399811,_0x2fe089){const _0x12c9dc={'abZfo':_0x5b6b6b(0x478,0x455)+_0x5b6b6b(0x4f3,0x577),'zWLSN':function(_0x465143,_0x542d76){return _0x465143!==_0x542d76;},'tDsrZ':_0x5b6b6b(0x4b2,0x4fc),'wYjxZ':'ixfxA','pSmwa':_0x5b6b6b(0x4a4,0x45d),'LiNHs':function(_0x52148d,_0x38cc9a){return _0x52148d*_0x38cc9a;},'UhAmP':function(_0x17b8c3,_0x1061b5){return _0x17b8c3<=_0x1061b5;}},_0x3e22ed=new Map(),_0x409d1f=[];for(const _0x4b0d2a of _0x220ceb){if(_0x4b0d2a['memory'][_0x5b6b6b(0x451,0x4f0)]){if(_0x12c9dc[_0x5b6b6b(0x41e,0x4c4)](_0x12c9dc[_0x4e0a51(0x398,0x386)],_0x12c9dc[_0x4e0a51(0x330,0x30d)])){const _0x1b87e7=_0x3e22ed[_0x5b6b6b(0x53e,0x4a0)](_0x4b0d2a[_0x5b6b6b(0x47e,0x406)]['parentId'])??[];_0x1b87e7[_0x5b6b6b(0x515,0x487)](_0x4b0d2a),_0x3e22ed[_0x4e0a51(0x35a,0x34a)](_0x4b0d2a['memory']['parentId'],_0x1b87e7);}else{const _0x157948=_0x4a80e0[_0x4e0a51(0x450,0x3f8)](({memory:_0x57b6cf})=>_0x57b6cf[_0x5b6b6b(0x501,0x4bc)][_0x5b6b6b(0x49f,0x403)+'e']()[_0x4e0a51(0x3e9,0x439)](/\s+/)[_0x4e0a51(0x41f,0x397)](_0x2ed2c8=>_0x2ed2c8[_0x5b6b6b(0x511,0x51f)]>0x3)[_0x4e0a51(0x43e,0x3bd)](0x0,0x5));_0x34f785['recordInje'+'ction']({'sessionId':_0x8671f0['sessionId'],'hookType':_0x12c9dc[_0x5b6b6b(0x45d,0x482)],'injectedMemoryIds':_0x567388['map'](({memory:_0x5f7415})=>_0x5f7415['id']),'injectedKeywords':[...new _0x3a4fb1(_0x157948)][_0x4e0a51(0x43e,0x3b0)](0x0,0x14),'totalInjected':_0x2e7181['length'],'abGroup':_0x2ad229?_0x529b53:_0x141975});}}else{if(_0x12c9dc[_0x5b6b6b(0x519,0x559)]!==_0x12c9dc['pSmwa'])return _0x45482f[_0x4e0a51(0x36c,0x367)](_0x4e0a51(0x38e,0x3a9)+'t\x20disabled'),_0x53b875[_0x4e0a51(0x371,0x380)](),'';else _0x409d1f['push'](_0x4b0d2a);}}const _0x6a03c3=[..._0x409d1f];let _0x1b62f4=0x0;function _0x5b6b6b(_0x1b5d8c,_0x5df6c6){return _0x1d39(_0x1b5d8c-0x34a,_0x5df6c6);}const _0x26d0e2=_0x12c9dc[_0x4e0a51(0x35f,0x3db)](_0x2fe089,0.5);for(const [_0x2d8dd7,_0x13ee33]of _0x3e22ed){if(_0x13ee33[_0x4e0a51(0x414,0x49b)]>=0x2){const _0x946a9b=_0x399811[_0x5b6b6b(0x4fa,0x55a)](_0x2d8dd7);if(_0x946a9b){const _0x36ece0=Math['ceil'](_0x946a9b[_0x5b6b6b(0x501,0x47d)]['length']/0x4);if(_0x12c9dc[_0x4e0a51(0x3bd,0x3bc)](_0x1b62f4+_0x36ece0,_0x26d0e2)){_0x6a03c3['push']({'memory':_0x946a9b,'score':Math[_0x5b6b6b(0x50d,0x4c2)](..._0x13ee33[_0x5b6b6b(0x4b5,0x545)](_0x4872d0=>_0x4872d0['score']))}),_0x1b62f4+=_0x36ece0;continue;}}}_0x6a03c3[_0x4e0a51(0x418,0x476)](..._0x13ee33);}function _0x4e0a51(_0x1ddcea,_0x5047c9){return _0x1d39(_0x1ddcea-0x24d,_0x5047c9);}return _0x6a03c3;}function buildSearchQuery(_0x26e607,_0x20249c){const _0x588f93={'NkEBd':function(_0x46a370,_0x47ea03){return _0x46a370>_0x47ea03;},'Xswyc':_0xef5305(-0xca,-0x7f),'xqAKN':_0x2f1c63(-0x183,-0x12c),'Agckf':_0x2f1c63(-0x120,-0x139),'iBylK':'was','NeLjl':_0x2f1c63(-0x1d2,-0x210),'QvEAk':_0x2f1c63(-0xd2,-0x76),'uOlJa':'have','LmKdG':_0x2f1c63(-0x139,-0x1b4),'zCEjd':_0xef5305(-0x6b,0x3f),'Ufcct':_0xef5305(-0x28,-0x7f),'TEpiK':_0xef5305(0xd,-0x3d),'BiElZ':'should','SmbDt':_0xef5305(-0x95,-0xc0),'cBRBs':_0xef5305(-0x59,-0xcd),'IipQB':_0x2f1c63(-0x1a2,-0x18c),'yRiiq':_0x2f1c63(-0x141,-0x15e),'RciiT':_0x2f1c63(-0x177,-0x17b),'GbeJw':'during','tQhnL':_0xef5305(0x2d,0xd3),'ZaVpZ':_0x2f1c63(-0x187,-0x10c),'LyzKk':_0xef5305(0x5f,-0x8),'BUYel':'that','RtNwQ':'these','ZCfgR':'its','hQYEC':_0x2f1c63(-0x100,-0x103),'VODzy':_0x2f1c63(-0x15b,-0x1e9),'rRyRO':'them','pkjTi':_0xef5305(0x45,-0xc),'jlwTD':_0xef5305(0x6c,0x2a),'KOhYi':_0xef5305(-0xa8,-0xd4),'VMxgJ':_0xef5305(-0x7,0x68),'BlIHP':_0xef5305(0x7,-0xa4),'wjdBj':_0x2f1c63(-0x18e,-0x17f),'rwiOr':_0x2f1c63(-0x176,-0x21f),'YthzN':_0x2f1c63(-0x1b9,-0x123),'urUgS':_0x2f1c63(-0x218,-0x294),'jLXGM':'such','Zetii':'only','eYBIA':'than','SCuiB':_0xef5305(0x2c,-0x50),'McNNt':_0xef5305(-0x2c,-0x72),'LMuiC':function(_0xe1715c,_0x59ba5b){return _0xe1715c+_0x59ba5b;}},_0x2f9da3=basename(_0x26e607),_0x2e8fb0=_0x2f9da3[_0x2f1c63(-0x13e,-0x1b1)](/[-_.]/)[_0x2f1c63(-0x108,-0x15e)](_0x1781a7=>_0x1781a7[_0x2f1c63(-0x113,-0x155)]>0x1);function _0x2f1c63(_0x3a77ec,_0x2f6819){return _0x1d39(_0x3a77ec- -0x2da,_0x2f6819);}function _0xef5305(_0x288eaa,_0x2215cb){return _0x1d39(_0x288eaa- -0x180,_0x2215cb);}if(!_0x20249c)return _0x2e8fb0[_0xef5305(-0xaf,-0xc3)]('\x20');const _0x16dfa0=_0x20249c[_0x2f1c63(-0x1df,-0x287)+'es']({'projectPath':_0x26e607,'limit':0xa}),_0x2b2241=new Set();for(const _0x1e1346 of _0x16dfa0){for(const _0x1c82b7 of _0x1e1346[_0x2f1c63(-0x217,-0x175)]||[]){_0x588f93[_0x2f1c63(-0x15e,-0x1b8)](_0x1c82b7['length'],0x2)&&!_0x1c82b7[_0xef5305(0x3e,0x70)](_0x2f1c63(-0x1c4,-0x17d))&&!_0x1c82b7[_0xef5305(0x3e,0xcc)](_0x588f93['Xswyc'])&&_0x2b2241['add'](_0x1c82b7);}}const _0x4eb1ad=new Set([_0x588f93[_0x2f1c63(-0x133,-0x19f)],'a','an','is',_0x588f93[_0x2f1c63(-0xe0,-0x15b)],_0x588f93[_0x2f1c63(-0x125,-0x195)],_0x588f93[_0x2f1c63(-0x122,-0x1a5)],'be',_0xef5305(-0xc9,-0xd9),_0x588f93[_0xef5305(0xb,0x1d)],_0x588f93[_0xef5305(-0xf,-0x93)],'has',_0x588f93[_0x2f1c63(-0x1fe,-0x16b)],'do',_0x588f93[_0x2f1c63(-0x20f,-0x242)],_0x588f93['Ufcct'],_0x2f1c63(-0xd3,-0x133),_0xef5305(-0x55,-0xb0),_0x588f93[_0xef5305(-0x3a,-0x5c)],_0x588f93[_0x2f1c63(-0x1c0,-0x18c)],'may',_0x588f93[_0x2f1c63(-0x142,-0x1a6)],_0x2f1c63(-0x10e,-0x8d),_0xef5305(-0x47,-0x1c),'to','of','in',_0x2f1c63(-0x107,-0x199),'on',_0x588f93[_0xef5305(0x84,0x94)],'at','by',_0x588f93[_0x2f1c63(-0x214,-0x298)],'as',_0x588f93[_0xef5305(-0x30,0x3b)],_0x588f93['RciiT'],_0x588f93[_0xef5305(-0x23,-0x87)],_0x2f1c63(-0x15a,-0x13c),'but','or',_0x588f93[_0x2f1c63(-0x130,-0x1ad)],_0x2f1c63(-0x151,-0x191),'so',_0x588f93[_0x2f1c63(-0x1e4,-0x243)],_0x2f1c63(-0x1fb,-0x15d),_0xef5305(0x60,0x54),_0x588f93[_0xef5305(-0xc7,-0x147)],_0x588f93[_0x2f1c63(-0x154,-0xd9)],_0x588f93[_0xef5305(-0x6f,-0xe5)],_0xef5305(-0xce,-0x16b),'it',_0x588f93[_0x2f1c63(-0x1a0,-0x217)],'i','we',_0x2f1c63(-0x11b,-0x82),'he',_0xef5305(0x34,0x8c),_0x2f1c63(-0x1b0,-0x153),'me',_0x588f93[_0xef5305(-0x64,-0xac)],_0x588f93[_0x2f1c63(-0x140,-0x16d)],'us',_0x588f93[_0xef5305(0x41,0x51)],'my',_0xef5305(0x2e,-0x54),'his',_0xef5305(0x33,0xaf),_0x2f1c63(-0x1f5,-0x198),_0x2f1c63(-0x1f4,-0x1fe),'which',_0x588f93[_0xef5305(0x73,0x61)],_0x588f93[_0x2f1c63(-0x175,-0x15d)],_0x588f93['KOhYi'],_0x588f93[_0x2f1c63(-0x129,-0x115)],_0x588f93[_0x2f1c63(-0x163,-0x195)],_0x588f93[_0x2f1c63(-0x143,-0xb8)],_0x2f1c63(-0x16e,-0x124),'any',_0x588f93['rwiOr'],_0x588f93['YthzN'],_0x588f93[_0xef5305(0x3,-0x8a)],_0xef5305(0x1b,0x52),_0x588f93['jLXGM'],'no',_0x588f93[_0x2f1c63(-0x171,-0x1a4)],'same',_0x588f93['eYBIA'],'too','very',_0x588f93[_0xef5305(-0x6c,-0x102)],_0x588f93[_0x2f1c63(-0x195,-0x186)],_0xef5305(-0x72,-0x5c)]),_0x3bdad8=new Map();for(const _0x46e81f of _0x16dfa0){const _0xfaa658=_0x46e81f[_0x2f1c63(-0x123,-0x11e)][_0x2f1c63(-0x185,-0xde)+'e']()[_0x2f1c63(-0x198,-0x1b1)](/[^a-z가-힣0-9\s]/g,'\x20')[_0xef5305(0x1c,0xa6)](/\s+/)[_0xef5305(0x52,-0x55)](_0x243e57=>_0x243e57[_0x2f1c63(-0x113,-0xba)]>0x2&&!_0x4eb1ad[_0x2f1c63(-0x15d,-0x175)](_0x243e57)&&!/^\d+$/[_0xef5305(-0x31,0xf)](_0x243e57));for(const _0x5696de of _0xfaa658){_0x3bdad8[_0x2f1c63(-0x1cd,-0x166)](_0x5696de,_0x588f93[_0xef5305(0x32,0x37)](_0x3bdad8[_0x2f1c63(-0xe6,-0x3f)](_0x5696de)||0x0,0x1));}}const _0x520da4=new Set(_0x2e8fb0[_0x2f1c63(-0x16f,-0x1fa)](_0x50f2ff=>_0x50f2ff['toLowerCas'+'e']())),_0x262e63=[..._0x3bdad8['entries']()][_0x2f1c63(-0x1fc,-0x15d)]((_0x3b3208,_0x3527fc)=>_0x3527fc[0x1]-_0x3b3208[0x1])[_0xef5305(0x52,-0x1d)](([_0x42c673])=>!_0x520da4[_0xef5305(-0x3,0xa2)](_0x42c673))['slice'](0x0,0x5)[_0x2f1c63(-0x16f,-0x123)](([_0x1b7289])=>_0x1b7289),_0x386d2b=[..._0x2e8fb0,...Array[_0xef5305(-0x48,-0x1d)](_0x2b2241)[_0x2f1c63(-0xe9,-0xd1)](0x0,0x3),..._0x262e63];return _0x386d2b[_0xef5305(0x71,0x44)](0x0,0xa)[_0xef5305(-0xaf,-0x146)]('\x20');}const CATEGORY_LABELS={'error_solution':_0x2318f2(-0xf4,-0x193)+_0x55c2d6(0x363,0x363)+'ions','convention':_0x55c2d6(0x3d3,0x3ac)+_0x2318f2(-0xa0,-0x11c),'decision':_0x55c2d6(0x2c4,0x2d7)+'re\x20Decisio'+'ns','code_pattern':_0x55c2d6(0x373,0x334)+'rns','skill':_0x55c2d6(0x36f,0x3cd)+_0x2318f2(-0x6d,-0x4b),'learning':_0x55c2d6(0x2e3,0x2da),'context':_0x2318f2(-0x17,-0x99)+_0x55c2d6(0x2e1,0x2b6)},CATEGORY_ORDER=[_0x2318f2(-0x10b,-0x12c)+_0x55c2d6(0x3c1,0x35f),'convention','decision',_0x55c2d6(0x319,0x353)+'rn',_0x2318f2(-0xe6,-0x40),'learning',_0x55c2d6(0x3c0,0x324)],ERROR_SOLUTION_MAX=0x3;function selectWithCategoryDiversity(_0x3c2cdb,_0x1224ef){const _0x3938d6={'RSLhe':function(_0xceb67e,_0x3a6444){return _0xceb67e<=_0x3a6444;},'EhuQA':_0xc97436(-0x1aa,-0x175),'osYor':function(_0x4a4fdd,_0x3df4c3){return _0x4a4fdd<_0x3df4c3;},'Jojnj':function(_0xe2c8df,_0x3e95c5){return _0xe2c8df>=_0x3e95c5;}};if(_0x3938d6['RSLhe'](_0x3c2cdb['length'],_0x1224ef))return _0x3c2cdb;const _0x11d290=[],_0x7daa91=new Set(),_0x492bb0=new Map();for(const _0x47d6f5 of _0x3c2cdb){const _0x112d52=_0x47d6f5[_0xc97436(-0x1ed,-0x143)]['category'];if(!_0x492bb0[_0x5d2f99(-0x39,0x46)](_0x112d52))_0x492bb0['set'](_0x112d52,[]);_0x492bb0['get'](_0x112d52)[_0x5d2f99(0x15,0x30)](_0x47d6f5);}const _0x5b8690=[_0x3938d6[_0x5d2f99(-0xe0,-0xf7)],'decision','convention',_0xc97436(-0x15d,-0x1af)];function _0xc97436(_0x5ba021,_0x13e9b7){return _0x55c2d6(_0x5ba021,_0x13e9b7- -0x452);}for(const _0x3e2065 of _0x5b8690){const _0x5a2e33=_0x492bb0[_0x5d2f99(0x3e,-0x1e)](_0x3e2065);if(_0x5a2e33&&_0x5a2e33[_0xc97436(-0xe9,-0xb0)]>0x0&&_0x3938d6[_0xc97436(-0x1bf,-0x174)](_0x11d290[_0xc97436(-0x12a,-0xb0)],_0x1224ef)){const _0x3e2a92=_0x5a2e33[0x0];_0x11d290[_0x5d2f99(0x15,0x27)](_0x3e2a92),_0x7daa91[_0xc97436(-0x180,-0x1bc)](_0x3e2a92['memory']['id']);}}const _0x29b2f0=_0x492bb0[_0xc97436(-0x109,-0x83)](_0x5d2f99(-0xd9,-0xf0)+_0xc97436(-0x6b,-0xf3))??[];let _0x21e149=0x0;function _0x5d2f99(_0x36a0d7,_0x1d33dd){return _0x55c2d6(_0x1d33dd,_0x36a0d7- -0x391);}for(const _0x4fb6a1 of _0x29b2f0){if(_0x21e149>=ERROR_SOLUTION_MAX)break;if(_0x7daa91[_0xc97436(-0x131,-0xfa)](_0x4fb6a1[_0x5d2f99(-0x82,-0x87)]['id']))continue;if(_0x3938d6[_0x5d2f99(-0xaa,-0x10)](_0x11d290[_0xc97436(-0x4c,-0xb0)],_0x1224ef))break;_0x11d290[_0x5d2f99(0x15,0x59)](_0x4fb6a1),_0x7daa91[_0x5d2f99(-0xfb,-0x7b)](_0x4fb6a1[_0xc97436(-0xc8,-0x143)]['id']),_0x21e149++;}for(const _0x5af84b of _0x3c2cdb){if(_0x11d290[_0xc97436(-0xa0,-0xb0)]>=_0x1224ef)break;if(_0x7daa91['has'](_0x5af84b[_0xc97436(-0xbb,-0x143)]['id']))continue;_0x11d290[_0x5d2f99(0x15,0x80)](_0x5af84b),_0x7daa91['add'](_0x5af84b[_0xc97436(-0x1c6,-0x143)]['id']);}return _0x11d290[_0x5d2f99(-0xd8,-0x83)]((_0x5868a5,_0x24faad)=>_0x24faad[_0xc97436(-0x11d,-0xcf)]-_0x5868a5['score']),_0x11d290;}function summarizeMultiline(_0x53e40c,_0x4fc556){const _0x3ea2d1={'gTzOh':function(_0x35a213,_0x415dba){return _0x35a213+_0x415dba;}};function _0x572486(_0xc9db59,_0x5beb08){return _0x55c2d6(_0x5beb08,_0xc9db59- -0x312);}const _0x1dee1e=_0x53e40c['split']('\x0a')['filter'](_0x2ba02a=>_0x2ba02a['trim']());let _0x3e58f4='';for(const _0x584f55 of _0x1dee1e){if(_0x3ea2d1[_0x27eb22(-0x36,-0x1a)](_0x3e58f4+'\x20',_0x584f55)[_0x572486(0x90,0x3b)]>_0x4fc556)break;_0x3e58f4+=(_0x3e58f4?'\x20':'')+_0x584f55['trim']();}function _0x27eb22(_0x6e5781,_0x167479){return _0x55c2d6(_0x6e5781,_0x167479- -0x383);}return _0x3e58f4||_0x3ea2d1[_0x572486(0x57,0x8e)](_0x53e40c[_0x27eb22(-0x2f,0x49)](0x0,_0x4fc556),'…');}function formatMemoryOutput(_0x166765,_0x43adea,_0x4c6c9b,_0x2a1aa1){const _0x2bc9c4={'PkUll':function(_0x214926){return _0x214926();},'UZNGy':function(_0x5db624,_0x3624af){return _0x5db624===_0x3624af;},'rZvoE':function(_0x2ed947,_0x2e05a6,_0x530269){return _0x2ed947(_0x2e05a6,_0x530269);},'ZRYCe':function(_0x2515c6,_0x33e810){return _0x2515c6===_0x33e810;},'iHewt':'skill','LzGxU':function(_0x38189f,_0x290753){return _0x38189f>_0x290753;},'DZfLG':_0x570045(-0x2a,-0xb3)+_0x570045(-0xb6,-0x10e),'kdsEE':_0x4c416b(0x114,0x136),'zNTPg':'<!--\x20/A2A\x20'+_0x570045(-0xf,-0x25)+_0x570045(-0x13b,-0x9a)},_0x4c654f=[_0x570045(-0x83,-0x1b)+_0x4c416b(-0x5,-0x8b)+_0x570045(-0x84,0x22)],_0x3ebc39=new Map();for(const _0x3f7de2 of _0x166765){const _0x48aa10=_0x3f7de2['memory'][_0x570045(-0x128,-0x1ca)];if(!_0x3ebc39[_0x4c416b(0xa9,0xc8)](_0x48aa10))_0x3ebc39[_0x4c416b(0x39,-0x2c)](_0x48aa10,[]);_0x3ebc39[_0x4c416b(0x120,0x123)](_0x48aa10)[_0x570045(-0x4a,-0x9)](_0x3f7de2);}for(const _0x27c3b8 of CATEGORY_ORDER){const _0x2e9fae=_0x3ebc39[_0x570045(-0x21,0x3b)](_0x27c3b8);if(!_0x2e9fae||_0x2bc9c4['UZNGy'](_0x2e9fae[_0x4c416b(0xf3,0xd7)],0x0))continue;const _0x1c86d5=CATEGORY_LABELS[_0x27c3b8]||_0x27c3b8;_0x4c654f[_0x4c416b(0xf7,0x1a2)]('\x0a###\x20'+_0x1c86d5);for(const {memory:_0x2aa3e2}of _0x2e9fae){const _0x4eaaf4=_0x2bc9c4[_0x570045(-0x114,-0x167)](summarizeMultiline,_0x2aa3e2[_0x570045(-0x5e,-0x1b)],0x1f4);if(_0x2bc9c4[_0x570045(-0x85,-0x103)](_0x27c3b8,_0x2bc9c4[_0x4c416b(0x102,0xe7)])&&_0x2a1aa1&&_0x2a1aa1['size']>0x0){const _0x3034f7=_0x2aa3e2[_0x4c416b(0xe3,0x175)][_0x570045(-0x79,-0xcd)]('\x0a')[0x0][_0x570045(-0x24,-0xa7)](0x0,0x32)[_0x4c416b(0x29,0x8e)](),_0x236aa9=_0x2a1aa1[_0x4c416b(0x120,0x7a)](_0x3034f7),_0x568c47=_0x236aa9!==undefined?_0x4c416b(0x12b,0x14d)+_0x236aa9+']':'';_0x4c654f[_0x4c416b(0xf7,0x89)]('-\x20'+_0x4eaaf4+_0x568c47);}else _0x4c654f[_0x4c416b(0xf7,0x17e)]('-\x20'+_0x4eaaf4);}}if(_0x2bc9c4['LzGxU'](_0x43adea[_0x570045(-0x4e,-0xb)],0x0)){_0x4c654f[_0x570045(-0x4a,-0x79)](_0x2bc9c4[_0x570045(-0xfd,-0x78)]);for(const _0x1c661b of _0x43adea){_0x2bc9c4['kdsEE']!==_0x2bc9c4[_0x570045(-0xf2,-0x64)]?_0x2bc9c4[_0x4c416b(0x5d,-0xa)](_0x5a0b6c):_0x4c654f['push']('-\x20['+_0x1c661b[_0x570045(-0x128,-0xcc)]+']\x20'+summarizeMultiline(_0x1c661b[_0x4c416b(0xe3,0x5d)],0x96));}}function _0x4c416b(_0x258858,_0x1d819d){return _0x55c2d6(_0x1d819d,_0x258858- -0x2af);}_0x4c654f[_0x570045(-0x4a,-0x54)](''),_0x4c654f[_0x4c416b(0xf7,0x15f)](_0x570045(-0x134,-0x190)+_0x570045(-0xfa,-0x6b)+'\x20<query>`\x20'+_0x4c416b(0xc1,0xa5)+'s.'),_0x4c654f[_0x570045(-0x4a,-0xeb)](_0x2bc9c4[_0x4c416b(0x58,0xb5)]);function _0x570045(_0x108b33,_0x5acf16){return _0x55c2d6(_0x5acf16,_0x108b33- -0x3f0);}return _0x4c654f[_0x4c416b(-0x3,-0xa3)]('\x0a');}function _0x2318f2(_0x1c88fe,_0x10a5ad){return _0x1d39(_0x1c88fe- -0x1e8,_0x10a5ad);}async function pullRemoteMemories(_0x108822,_0x3752d5){const _0x5586f9={'eYHTM':function(_0x49cedc,_0x989bd6){return _0x49cedc(_0x989bd6);},'fPrZS':_0x2100ae(0x216,0x1f9)+_0x2100ae(0x291,0x2bd)+_0x2100ae(0x265,0x2cb)+_0x6c1465(-0x1c4,-0x211)+_0x2100ae(0x190,0x13a),'OcIoQ':function(_0x18c699,_0x16ca04){return _0x18c699 instanceof _0x16ca04;},'jFgLI':function(_0x20e95d){return _0x20e95d();},'GCkPZ':function(_0x322c6f,_0x198da1){return _0x322c6f===_0x198da1;},'mMxIP':_0x6c1465(-0x2c3,-0x2f7)+_0x2100ae(0x17a,0x12e)+_0x2100ae(0x229,0x2c8),'nMPGV':function(_0x3b986f,_0x1cb96b){return _0x3b986f!==_0x1cb96b;},'xwjQQ':'aNVJE'};function _0x6c1465(_0x4f49b7,_0x3ce3ab){return _0x55c2d6(_0x3ce3ab,_0x4f49b7- -0x58f);}function _0x2100ae(_0x192e89,_0x964b20){return _0x55c2d6(_0x964b20,_0x192e89- -0x133);}if(!_0x108822[_0x6c1465(-0x22a,-0x188)]['enabled']||!_0x108822[_0x2100ae(0x232,0x1ef)][_0x2100ae(0x1ad,0x153)+_0x2100ae(0x248,0x29a)]||!_0x108822[_0x6c1465(-0x228,-0x2c7)][_0x6c1465(-0x29b,-0x275)])return;const _0x47993f=createHookClient(_0x108822,0x1388);if(!_0x47993f)return;if(_0x5586f9[_0x2100ae(0x1b7,0x173)](_0x108822[_0x2100ae(0x1e7,0x28c)],_0x2100ae(0x160,0x209))&&_0x108822['team'])try{const {TeamSynchronizer:_0x39663a}=await import(_0x5586f9[_0x6c1465(-0x1bb,-0x163)]),_0x395927=new _0x39663a(_0x3752d5,_0x47993f,_0x108822[_0x6c1465(-0x2fc,-0x2d1)]['teamPath'],_0x108822[_0x6c1465(-0x2fc,-0x341)][_0x2100ae(0x1df,0x1f5)]);_0x395927[_0x6c1465(-0x2ef,-0x2d3)+'am']()[_0x6c1465(-0x2ff,-0x292)](_0x1f0f35=>{function _0x3eec40(_0x1921de,_0x1d72a3){return _0x6c1465(_0x1d72a3-0xd5,_0x1921de);}function _0x27ad5a(_0x12663e,_0x4bd231){return _0x6c1465(_0x12663e-0x69f,_0x4bd231);}console['error'](_0x3eec40(-0x10d,-0x1b6)+_0x3eec40(-0x155,-0x1a4)+_0x3eec40(-0x1e5,-0x1aa)+'ound):',_0x1f0f35 instanceof Error?_0x1f0f35[_0x27ad5a(0x4cf,0x471)]:_0x5586f9['eYHTM'](String,_0x1f0f35));});}catch{}else{if(_0x5586f9[_0x6c1465(-0x2bb,-0x27b)](_0x2100ae(0x281,0x281),_0x5586f9[_0x2100ae(0x1b8,0x1b2)])){const _0x3a4dec=new MemorySynchronizer(_0x3752d5,_0x47993f);_0x3a4dec['pull']()[_0x6c1465(-0x2ff,-0x37c)](_0x591953=>{function _0x250ac9(_0x2c1a17,_0x4d0a7f){return _0x6c1465(_0x2c1a17-0x4ee,_0x4d0a7f);}function _0x13e675(_0xa33a81,_0x1ac1c2){return _0x6c1465(_0xa33a81-0x54d,_0x1ac1c2);}console[_0x13e675(0x2ea,0x2af)](_0x5586f9['fPrZS'],_0x5586f9[_0x250ac9(0x2fe,0x2e1)](_0x591953,Error)?_0x591953[_0x13e675(0x37d,0x3ac)]:String(_0x591953));});}else _0x5586f9['jFgLI'](_0x426f6a),_0x337fbf[_0x2100ae(0x283,0x20d)](0x0);}}async function fetchRelevantMemories(_0x394101,_0x160a37,_0x40eaaa,_0x1c2989){const _0x18804a={'Mimla':function(_0x4450c,_0xea6634){return _0x4450c+_0xea6634;},'piWcU':function(_0x31e8f1,_0xde8f01){return _0x31e8f1-_0xde8f01;},'hcZhp':function(_0x36b7d5,_0xd905f8,_0x4d2c2c){return _0x36b7d5(_0xd905f8,_0x4d2c2c);},'jMDbo':function(_0x12c5a4,_0x171cfd){return _0x12c5a4(_0x171cfd);},'krcKN':_0x2581da(0x262,0x2d8)+_0x2581da(0x266,0x299)+'s','NyBwR':'Reranking\x20'+'applied','SBkBQ':_0x46c8ca(0x474,0x4f8)+_0x2581da(0x20a,0x256)+_0x46c8ca(0x575,0x587)+_0x46c8ca(0x491,0x471)+'ts','PoCQC':_0x2581da(0x3ec,0x380)+'rch','uxUyd':function(_0x2498e2,_0x5f26fb){return _0x2498e2!==_0x5f26fb;},'YLYsR':function(_0x551fe9,_0x3ea844){return _0x551fe9<_0x3ea844;},'masmI':_0x46c8ca(0x59c,0x528),'rClRs':function(_0x51fdd1,_0x38540b){return _0x51fdd1*_0x38540b;},'ykinN':function(_0x5bcf4e,_0x321ad5){return _0x5bcf4e>_0x321ad5;}},_0x44e4ae=_0x160a37[_0x2581da(0x2a7,0x31c)][_0x46c8ca(0x48a,0x4cf)+'s'],_0xaa4b91=_0x18804a[_0x46c8ca(0x4c3,0x452)](buildSearchQuery,_0x394101[_0x46c8ca(0x570,0x4f7)+'h'],_0x40eaaa),_0x4536ca=_0xaa4b91?_0x40eaaa[_0x46c8ca(0x4f8,0x59c)]({'query':_0xaa4b91,'limit':_0x44e4ae}):[];function _0x2581da(_0x64593a,_0x48e5f9){return _0x2318f2(_0x48e5f9-0x38a,_0x64593a);}_0x1c2989['info'](_0x46c8ca(0x478,0x51f),{'count':_0x4536ca['length'],'query':_0xaa4b91});const _0x31e1c1=new AdaptiveRouter(),_0x2a9b02=_0x31e1c1[_0x46c8ca(0x5bf,0x568)](_0xaa4b91);_0x1c2989[_0x46c8ca(0x4fe,0x533)](_0x2581da(0x2b0,0x340)+_0x2581da(0x36b,0x2fd),{'complexity':_0x2a9b02[_0x2581da(0x36a,0x335)],'reason':_0x2a9b02[_0x2581da(0x284,0x263)]});function _0x46c8ca(_0x99bf9b,_0x22f5e4){return _0x2318f2(_0x99bf9b-0x5a2,_0x22f5e4);}let _0x1f29ea;if(_0x2a9b02[_0x2581da(0x31d,0x277)]&&_0x160a37['embedding']?.[_0x46c8ca(0x529,0x4af)])try{const {createEmbeddingProvider:_0x228616}=await import(_0x2581da(0x365,0x35e)+'ng/index.j'+'s'),_0x2965a=_0x228616(_0x160a37['embedding'],_0x160a37[_0x46c8ca(0x5bc,0x5df)]),_0x23af6b=_0xaa4b91||_0x18804a[_0x2581da(0x28a,0x2f4)](basename,_0x394101[_0x46c8ca(0x570,0x4f7)+'h']),_0x9da807=await Promise[_0x46c8ca(0x4a1,0x465)](_0x2965a[_0x2581da(0x24a,0x2c4)](_0x23af6b)),_0x27bdd1=_0x40eaaa[_0x46c8ca(0x5b2,0x5ad)+'ctor'](_0x9da807,_0x44e4ae),_0x37e349=_0x40eaaa[_0x2581da(0x320,0x29d)+'es']({'limit':_0x44e4ae,'projectPath':_0x394101[_0x46c8ca(0x570,0x59c)+'h']}),_0x128cb1=new HybridRanker({'categoryBoost':!![],'tierBoost':!![],'recencyDecay':!![]});let _0x2403fe=_0x128cb1[_0x46c8ca(0x4ed,0x4c2)](_0x4536ca,_0x27bdd1,_0x37e349);if(_0x2a9b02['useReranke'+'r'])try{const {CrossEncoderReranker:_0x4b2d39}=await import(_0x18804a[_0x2581da(0x31d,0x345)]),_0x25acc1=new _0x4b2d39(),_0x2f405d=_0x2403fe[_0x2581da(0x307,0x393)](0x0,0x14);_0x2403fe=await _0x25acc1['rerank'](_0xaa4b91,_0x2f405d,_0x44e4ae),_0x1c2989[_0x46c8ca(0x4fe,0x553)](_0x18804a[_0x46c8ca(0x4a8,0x536)],{'candidates':_0x2f405d[_0x2581da(0x37c,0x369)],'output':_0x2403fe[_0x46c8ca(0x581,0x5dc)]});}catch{if(_0x2581da(0x221,0x262)!==_0x46c8ca(0x47a,0x3fa)){const _0xcd98a0=_0x504c2b[_0x2581da(0x3c0,0x359)][_0x2581da(0x347,0x2f7)+'e']()['replace'](/[^a-z가-힣0-9\s]/g,'\x20')[_0x46c8ca(0x556,0x5ff)](/\s+/)['filter'](_0x2fe3df=>_0x2fe3df[_0x46c8ca(0x581,0x569)]>0x2&&!_0x4e69dd[_0x2581da(0x3b6,0x31f)](_0x2fe3df)&&!/^\d+$/[_0x2581da(0x256,0x2f1)](_0x2fe3df));for(const _0x19c74f of _0xcd98a0){_0x5bce85['set'](_0x19c74f,teTRNt[_0x46c8ca(0x4e9,0x479)](_0x33f202[_0x46c8ca(0x5ae,0x5c0)](_0x19c74f)||0x0,0x1));}}else _0x1c2989[_0x2581da(0x24d,0x2e6)](_0x18804a['SBkBQ']);}_0x1f29ea=_0x2403fe[_0x46c8ca(0x5ab,0x50a)](0x0,_0x44e4ae)[_0x2581da(0x2e7,0x30d)](_0x11df0c=>({'memory':_0x11df0c[_0x46c8ca(0x4ee,0x570)],'score':_0x11df0c[_0x2581da(0x2b3,0x34a)],'matchType':_0x46c8ca(0x57c,0x600)})),_0x1c2989[_0x2581da(0x30d,0x2c1)](_0x18804a[_0x2581da(0x283,0x304)],{'count':_0x1f29ea[_0x46c8ca(0x581,0x4e1)],'routing':_0x2a9b02[_0x46c8ca(0x54d,0x5c3)]});}catch(_0x5dfb85){_0x1c2989[_0x2581da(0x37c,0x398)](_0x2581da(0x2b9,0x351)+_0x46c8ca(0x52d,0x4ce)+_0x46c8ca(0x5ba,0x5f3),{'error':_0x5dfb85 instanceof Error?_0x5dfb85[_0x2581da(0x3c6,0x386)]:String(_0x5dfb85)}),_0x1f29ea=_0x4536ca;}else{if(_0x18804a[_0x46c8ca(0x510,0x4b5)](_0x46c8ca(0x47e,0x439),_0x46c8ca(0x47e,0x47d))){const _0x1697f5=_0x2034fb['listMemori'+'es']({'limit':_0x385da9*0x2,'projectPath':_0x3cc799[_0x2581da(0x36c,0x358)+'h']}),_0x534980=_0x1697f5[_0x2581da(0x2fc,0x374)](_0x196c46=>_0x196c46[_0x2581da(0x33b,0x36b)]&&_0x196c46[_0x2581da(0x378,0x36b)]['length']>0x0);if(_0x534980[_0x46c8ca(0x581,0x5de)]>0x0){const _0x28b850=new _0x45d40e(_0x1406a2['map'](_0x1d6e73=>_0x1d6e73[_0x46c8ca(0x4ee,0x4d7)]['id'])),_0x5daa46=_0x534980['filter'](_0x2e00f3=>!_0x28b850['has'](_0x2e00f3['id']))[_0x2581da(0x322,0x393)](0x0,_0x18804a[_0x46c8ca(0x476,0x51f)](_0x2d2c6c,_0x46882f[_0x2581da(0x2c6,0x369)]))['map'](_0xa6b886=>({'memory':_0xa6b886,'score':0.5,'matchType':_0x2581da(0x358,0x303)}));_0x176aef['push'](..._0x5daa46);}}else{_0x1f29ea=_0x4536ca;if(_0x18804a[_0x2581da(0x2d4,0x36f)](_0x1f29ea[_0x46c8ca(0x581,0x4d8)],_0x44e4ae))try{if(_0x18804a['masmI']!=='Kbaah'){const _0x454d20=_0x40eaaa['listMemori'+'es']({'limit':_0x18804a['rClRs'](_0x44e4ae,0x2),'projectPath':_0x394101[_0x2581da(0x2cc,0x358)+'h']}),_0x1002ab=_0x454d20[_0x46c8ca(0x58c,0x506)](_0x1c22f7=>_0x1c22f7[_0x2581da(0x3fa,0x36b)]&&_0x1c22f7[_0x46c8ca(0x583,0x5a8)][_0x46c8ca(0x581,0x54e)]>0x0);if(_0x18804a['ykinN'](_0x1002ab[_0x46c8ca(0x581,0x60b)],0x0)){const _0x1d0a7c=new Set(_0x1f29ea[_0x46c8ca(0x525,0x495)](_0x594cdd=>_0x594cdd[_0x2581da(0x291,0x2d6)]['id'])),_0x1f87f9=_0x1002ab['filter'](_0x39bc1d=>!_0x1d0a7c[_0x2581da(0x2f5,0x31f)](_0x39bc1d['id']))[_0x2581da(0x301,0x393)](0x0,_0x18804a['piWcU'](_0x44e4ae,_0x1f29ea[_0x2581da(0x3ab,0x369)]))[_0x46c8ca(0x525,0x4bb)](_0x136e7d=>({'memory':_0x136e7d,'score':0.5,'matchType':_0x2581da(0x2a0,0x303)}));_0x1f29ea[_0x46c8ca(0x585,0x59c)](..._0x1f87f9);}}else{const _0x530ada=_0x50bf43['memory']['category'];if(!_0x3e0e3e['has'](_0x530ada))_0x16cb12[_0x2581da(0x218,0x2af)](_0x530ada,[]);_0x144b1e[_0x2581da(0x436,0x396)](_0x530ada)[_0x46c8ca(0x585,0x5b6)](_0x59a0ea);}}catch(_0x163446){_0x1c2989['warn'](_0x2581da(0x346,0x314)+'lback\x20fail'+'ed',{'error':_0x163446 instanceof Error?_0x163446[_0x46c8ca(0x59e,0x553)]:String(_0x163446)});}}}return{'results':_0x1f29ea,'query':_0xaa4b91};}async function buildSkillInjection(_0xff8a48,_0x1667cc,_0x42de1d,_0xce5dc3,_0x308ca1){function _0xdede39(_0x11844f,_0x2d28f9){return _0x2318f2(_0x2d28f9-0x562,_0x11844f);}const _0x26bee8={'DJYDO':function(_0x18d7b9,_0x14225b,_0x46b36c){return _0x18d7b9(_0x14225b,_0x46b36c);},'GIzUx':function(_0xbb001,_0x4383bf){return _0xbb001!==_0x4383bf;},'eHPEF':_0xdede39(0x48b,0x4e1),'UQmfD':function(_0x193956,_0xa41d77,_0x9d0c28){return _0x193956(_0xa41d77,_0x9d0c28);},'fbOiC':_0x16d961(0x241,0x1b2)+_0xdede39(0x5e9,0x55f)+_0x16d961(0x30c,0x29f),'wFeQn':function(_0x504390,_0xfb9892){return _0x504390(_0xfb9892);},'bOFsg':function(_0x550d06,_0x134491,_0x3fefed){return _0x550d06(_0x134491,_0x3fefed);}};let _0xe98d05=[];function _0x16d961(_0x29f928,_0x1b8f3d){return _0x2318f2(_0x1b8f3d-0x2a0,_0x29f928);}if(_0x1667cc[_0xdede39(0x4eb,0x4b9)]===_0xdede39(0x46c,0x432)&&_0x1667cc['team']&&_0x1667cc[_0x16d961(0x284,0x244)][_0xdede39(0x53c,0x493)]){if(_0x26bee8[_0x16d961(0x21d,0x1b8)](_0xdede39(0x46d,0x4e1),_0x26bee8[_0x16d961(0x100,0x191)])){const _0x613e05=_0x26bee8[_0x16d961(0x13e,0x185)](_0x18a0c7,_0x39c957,_0x218848[_0xdede39(0x49c,0x520)]??{'ttlDays':0x5a,'maxMemories':0x3e8,'cleanupOnSessionEnd':!![],'qualityThreshold':0.3});_0x198c35[_0x16d961(0x236,0x2b4)+'ry'](_0x2b49f9['id'],{'qualityScore':_0x613e05[_0xdede39(0x562,0x51c)]});}else try{const _0x4cbdc7=_0x26bee8[_0x16d961(0x1ba,0x1dd)](createHookClient,_0x1667cc,0xbb8);if(!_0x4cbdc7)throw new Error(_0x26bee8[_0xdede39(0x5a6,0x577)]);const _0x12f417=await _0x4cbdc7['searchTeam'+_0xdede39(0x43c,0x45e)](_0x1667cc['team'][_0xdede39(0x4c7,0x4e7)],_0x42de1d,{'limit':Math[_0xdede39(0x481,0x4c1)](0x3,_0xce5dc3)});_0xe98d05=_0x12f417['map'](_0xbf88f2=>({'category':_0xbf88f2[_0xdede39(0x4d4,0x467)],'content':_0xbf88f2[_0xdede39(0x57e,0x531)]}));}catch(_0x20b09e){_0x308ca1[_0xdede39(0x5bc,0x570)](_0x16d961(0x21f,0x24e)+_0x16d961(0x246,0x1a4),{'error':_0x20b09e instanceof Error?_0x20b09e[_0x16d961(0x2d6,0x29c)]:_0x26bee8['wFeQn'](String,_0x20b09e)});}}let _0x39703d=new Map();if(_0x1667cc['server']?.[_0x16d961(0x19f,0x1d1)]&&_0x1667cc['server']?.['url'])try{const _0x31d808=_0x26bee8[_0xdede39(0x4a8,0x4c4)](createHookClient,_0x1667cc,0xbb8),_0xfe6933=_0x31d808?await _0x31d808['listProfic'+_0xdede39(0x5d8,0x544)](_0xff8a48['projectPat'+'h']):[];_0xfe6933[_0x16d961(0x249,0x27f)]>0x0&&(_0x39703d=new Map(_0xfe6933[_0x16d961(0x24d,0x223)](_0x43d5d6=>[_0x43d5d6[_0x16d961(0x268,0x21e)],_0x43d5d6[_0x16d961(0x16e,0x1d6)]])),_0x308ca1[_0x16d961(0x24e,0x1fc)]('Fetched\x20pr'+_0x16d961(0x1e1,0x22e)+'levels\x20fro'+_0xdede39(0x4eb,0x463),{'count':_0xfe6933[_0x16d961(0x2d4,0x27f)]}));}catch{}return{'teamMemoryData':_0xe98d05,'proficiencyMap':_0x39703d};}function resolveAbGroup(_0x3cfc51){function _0x360bb7(_0x36968b,_0x4a9dac){return _0x55c2d6(_0x36968b,_0x4a9dac-0x1e);}const _0x1ef215={'dfQjD':function(_0x35b398,_0x3beb27){return _0x35b398<_0x3beb27;},'LIvaU':function(_0x241564,_0x536bd3){return _0x241564*_0x536bd3;}};let _0x5bdc1d=0x0;for(let _0x5599ab=0x0;_0x1ef215['dfQjD'](_0x5599ab,_0x3cfc51[_0xcc3438(-0xf2,-0xd4)]);_0x5599ab++){_0x5bdc1d=_0x1ef215['LIvaU'](_0x5bdc1d,0x1f)+_0x3cfc51[_0x360bb7(0x2ae,0x2c5)](_0x5599ab)>>>0x0;}function _0xcc3438(_0x453b3a,_0x4d1c15){return _0x55c2d6(_0x4d1c15,_0x453b3a- -0x494);}return(_0x5bdc1d&0x1)===0x0?'A':'B';}export async function handleSessionStart(_0x4228cb){const _0x17329b={'LYhVP':_0x3d2850(-0x1aa,-0x116)+_0x3d2850(-0x236,-0x193),'oXXRr':function(_0x117708,_0x5377d,_0x408e6a){return _0x117708(_0x5377d,_0x408e6a);},'PicKl':function(_0x3890ff,_0x4f02bd){return _0x3890ff-_0x4f02bd;},'sLeUM':_0x3d2850(-0x275,-0x255)+_0x3dab94(0x2bf,0x27d)+'jected','eFuAo':_0x3dab94(0x304,0x303)+'rt','ZhQRX':function(_0x32ee36,_0x58a300){return _0x32ee36===_0x58a300;},'mGtvu':_0x3d2850(-0x247,-0x294),'uSwke':_0x3d2850(-0x254,-0x1de)+'t\x20disabled','eJetc':function(_0x9b9263,_0x15f77e){return _0x9b9263(_0x15f77e);},'tXpXp':function(_0x45643b,_0x1ae210){return _0x45643b(_0x1ae210);},'UqqlN':function(_0x2980fc,_0x8e69eb){return _0x2980fc(_0x8e69eb);},'WTKWo':_0x3dab94(0x33a,0x3d1),'xFQad':'learning','JJMTA':function(_0xcdb9fe,_0x257b3e){return _0xcdb9fe>_0x257b3e;},'Gsksz':function(_0x1b72b6,_0xafeaf2,_0xcd07d3){return _0x1b72b6(_0xafeaf2,_0xcd07d3);},'gHyrA':function(_0x4412a6,_0x47382a,_0x50640e,_0x392dc3,_0x2af526,_0x3ba7ae){return _0x4412a6(_0x47382a,_0x50640e,_0x392dc3,_0x2af526,_0x3ba7ae);},'TEnDi':function(_0x16db8c,_0xf194ec){return _0x16db8c!==_0xf194ec;},'uoilN':'raRWu','JXBAm':function(_0x32cec5,_0x38c856,_0xda5886,_0x40201e,_0x5c41d2){return _0x32cec5(_0x38c856,_0xda5886,_0x40201e,_0x5c41d2);},'teZeo':_0x3dab94(0x37e,0x2ef)+'eted','CjrcG':function(_0x4f75f8,_0xac9a1b){return _0x4f75f8-_0xac9a1b;}},_0x49cbbb=new ConfigManager()[_0x3dab94(0x31e,0x3bc)](),_0x35dcfa=createLogger(_0x17329b[_0x3dab94(0x2dc,0x320)],_0x49cbbb['logging']),_0x193920=performance[_0x3d2850(-0x287,-0x2c0)]();function _0x3dab94(_0x27b8f1,_0x56b271){return _0x55c2d6(_0x56b271,_0x27b8f1- -0x4c);}_0x35dcfa[_0x3d2850(-0x276,-0x230)]('Hook\x20start'+'ed',{'projectPath':_0x4228cb[_0x3d2850(-0x1df,-0x277)+'h']});if(!_0x49cbbb[_0x3d2850(-0x21b,-0x19b)][_0x3dab94(0x2fe,0x25f)]){if(_0x17329b['ZhQRX'](_0x17329b[_0x3dab94(0x363,0x2e9)],_0x3d2850(-0x247,-0x2d0)))return _0x35dcfa[_0x3d2850(-0x276,-0x28c)](_0x17329b['uSwke']),_0x35dcfa[_0x3d2850(-0x271,-0x1c6)](),'';else{_0x342067[_0x3d2850(-0x1ca,-0x19f)](QPvFMB[_0x3dab94(0x25d,0x244)]);for(const _0x3b3dbf of _0x1442e0){_0xff89e2['push'](_0x3d2850(-0x1ab,-0x10d)+_0x3b3dbf[_0x3d2850(-0x2a8,-0x2c0)]+']\x20'+QPvFMB[_0x3d2850(-0x221,-0x276)](_0x498571,_0x3b3dbf[_0x3d2850(-0x1de,-0x1d8)],0x96));}}}function _0x3d2850(_0x1dd38e,_0x234585){return _0x55c2d6(_0x234585,_0x1dd38e- -0x570);}const _0x4801fd=_0x17329b[_0x3dab94(0x2ac,0x303)](_0x49cbbb[_0x3dab94(0x367,0x313)]?.[_0x3d2850(-0x226,-0x233)],!![]),_0x589261=_0x4801fd?_0x17329b['eJetc'](resolveAbGroup,_0x4228cb[_0x3d2850(-0x2ab,-0x2e2)]):'A';if(_0x4801fd&&_0x17329b[_0x3dab94(0x2ac,0x34c)](_0x589261,'B')){_0x35dcfa[_0x3dab94(0x2ae,0x275)](_0x3d2850(-0x1cd,-0x1fe)+'group\x20B\x20—\x20'+_0x3d2850(-0x2a0,-0x32f)+'njection',{'sessionId':_0x4228cb[_0x3dab94(0x279,0x2fd)]});try{const _0x378b3b=_0x17329b['tXpXp'](getSharedDb,_0x49cbbb['db'][_0x3dab94(0x32e,0x348)]);_0x378b3b[_0x3d2850(-0x1a8,-0x1ac)+'ction']({'sessionId':_0x4228cb[_0x3dab94(0x279,0x2d2)],'hookType':_0x3d2850(-0x267,-0x262)+_0x3d2850(-0x1ec,-0x199),'injectedMemoryIds':[],'injectedKeywords':[],'totalInjected':0x0,'abGroup':'B'});}catch{}return _0x35dcfa['flush'](),'';}const _0xedc127=getSharedDb(_0x49cbbb['db']['path']);try{if(_0x3d2850(-0x1b9,-0x14e)===_0x3d2850(-0x1b9,-0x224)){await pullRemoteMemories(_0x49cbbb,_0xedc127);const {results:_0x191923,query:_0x495aa1}=await fetchRelevantMemories(_0x4228cb,_0x49cbbb,_0xedc127,_0x35dcfa);if(_0x191923[_0x3dab94(0x356,0x31d)]===0x0)return _0x35dcfa['info'](_0x3d2850(-0x1af,-0x167)+_0x3dab94(0x30d,0x2aa)),_0x35dcfa[_0x3dab94(0x2b3,0x34a)](),'';const _0x11c465=_0x49cbbb['autoInject'][_0x3d2850(-0x2c5,-0x349)+'s'],_0x521484=_0x191923['map'](_0x1dafc=>_0x1dafc[_0x3d2850(-0x261,-0x2f7)]),_0x37020b=_0x17329b['UqqlN'](deduplicateByEmbedding,_0x521484),_0x413d9d=new Set(_0x37020b[_0x3d2850(-0x22a,-0x2c0)](_0x37c17f=>_0x37c17f['id'])),_0x395a32=_0x191923['filter'](_0xff64f2=>_0x413d9d['has'](_0xff64f2[_0x3dab94(0x2c3,0x2f6)]['id'])),_0x5b930c=[_0x17329b['WTKWo'],_0x17329b['xFQad'],_0x3dab94(0x37d,0x2e2)],_0x5b969f=new Set(_0x395a32[_0x3d2850(-0x22a,-0x1fd)](_0x390bd4=>_0x390bd4[_0x3d2850(-0x261,-0x2c9)][_0x3dab94(0x27c,0x2d6)]));for(const _0x73085b of _0x5b930c){if(!_0x5b969f[_0x3dab94(0x30c,0x3ac)](_0x73085b)){const _0x1dc5b3=_0xedc127[_0x3dab94(0x28a,0x279)+'es']({'category':_0x73085b,'projectPath':_0x4228cb[_0x3dab94(0x345,0x37b)+'h'],'limit':0x1});_0x17329b[_0x3d2850(-0x1a0,-0x162)](_0x1dc5b3['length'],0x0)&&(_0x395a32[_0x3d2850(-0x1ca,-0x1f4)]({'memory':_0x1dc5b3[0x0],'score':0.4,'matchType':'fts'}),_0x35dcfa[_0x3dab94(0x2d3,0x2d2)](_0x3dab94(0x2af,0x288)+_0x3d2850(-0x265,-0x2da)+'jected',{'category':_0x73085b}));}}_0x395a32[_0x3dab94(0x26d,0x1cb)]((_0x58c350,_0x1edd0e)=>_0x1edd0e[_0x3d2850(-0x1ed,-0x1b8)]-_0x58c350[_0x3d2850(-0x1ed,-0x1ac)]);const _0x1cd1c7=_0x17329b[_0x3d2850(-0x1cf,-0x1e4)](selectWithCategoryDiversity,_0x395a32,_0x11c465),_0x176273=mergeParentChunks(_0x1cd1c7,_0xedc127,_0x49cbbb[_0x3dab94(0x309,0x330)][_0x3d2850(-0x1dc,-0x234)]);for(const {memory:_0x290351}of _0x176273){_0xedc127[_0x3d2850(-0x1f1,-0x272)+'ss'](_0x290351['id']);}try{const {scoreQuality:_0x133ed6}=await import(_0x3d2850(-0x213,-0x21e)+_0x3d2850(-0x19e,-0x240)+'s');for(const {memory:_0x3156a0}of _0x176273){const _0x431cc6=_0xedc127['getMemory'](_0x3156a0['id']);if(_0x431cc6){const _0x230e1b=_0x133ed6(_0x431cc6,_0x49cbbb['lifecycle']??{'ttlDays':0x5a,'maxMemories':0x3e8,'cleanupOnSessionEnd':!![],'qualityThreshold':0.3});_0xedc127[_0x3dab94(0x38b,0x41e)+'ry'](_0x3156a0['id'],{'qualityScore':_0x230e1b[_0x3dab94(0x331,0x35e)]});}}}catch{}const {teamMemoryData:_0x5e75c7,proficiencyMap:_0x126a69}=await _0x17329b[_0x3d2850(-0x28f,-0x267)](buildSkillInjection,_0x4228cb,_0x49cbbb,_0x495aa1,_0x11c465,_0x35dcfa);try{if(_0x17329b['TEnDi'](_0x3d2850(-0x26f,-0x2c3),_0x17329b[_0x3d2850(-0x1f8,-0x1b1)])){const _0x57ec6a=new _0x775faa(_0x18ee27[_0x3dab94(0x2fa,0x256)](_0xad42ab=>_0xad42ab[_0x3dab94(0x2c3,0x348)]['id'])),_0x17f0b1=_0x18fd8c[_0x3dab94(0x361,0x2d6)](_0x2aadc4=>!_0x57ec6a[_0x3d2850(-0x218,-0x2c1)](_0x2aadc4['id']))['slice'](0x0,QPvFMB[_0x3dab94(0x299,0x2da)](_0xfec1fd,_0x15b5aa[_0x3dab94(0x356,0x2d9)]))[_0x3dab94(0x2fa,0x284)](_0x503b26=>({'memory':_0x503b26,'score':0.5,'matchType':_0x3d2850(-0x234,-0x211)}));_0x184b55[_0x3dab94(0x35a,0x377)](..._0x17f0b1);}else{const _0x4dc8d9=_0x176273[_0x3dab94(0x392,0x32e)](({memory:_0x54545c})=>_0x54545c[_0x3d2850(-0x1de,-0x202)]['toLowerCas'+'e']()['split'](/\s+/)[_0x3d2850(-0x1c3,-0x232)](_0x5988cf=>_0x5988cf[_0x3d2850(-0x1ce,-0x20d)]>0x3)[_0x3d2850(-0x1a4,-0x23d)](0x0,0x5));_0xedc127[_0x3dab94(0x37c,0x303)+_0x3d2850(-0x2b5,-0x2a4)]({'sessionId':_0x4228cb[_0x3d2850(-0x2ab,-0x29c)],'hookType':_0x3d2850(-0x267,-0x206)+_0x3d2850(-0x1ec,-0x16a),'injectedMemoryIds':_0x176273[_0x3d2850(-0x22a,-0x288)](({memory:_0x336b06})=>_0x336b06['id']),'injectedKeywords':[...new Set(_0x4dc8d9)]['slice'](0x0,0x14),'totalInjected':_0x176273[_0x3dab94(0x356,0x3f5)],'abGroup':_0x4801fd?_0x589261:undefined});}}catch{}const _0x14127a=_0x17329b[_0x3d2850(-0x235,-0x1a6)](formatMemoryOutput,_0x176273,_0x5e75c7,_0x4228cb[_0x3d2850(-0x1df,-0x22d)+'h'],_0x126a69);return _0x35dcfa[_0x3d2850(-0x276,-0x22b)](_0x17329b[_0x3d2850(-0x1d5,-0x230)],{'durationMs':Math[_0x3d2850(-0x2d6,-0x35a)](_0x17329b[_0x3dab94(0x29a,0x203)](performance[_0x3d2850(-0x287,-0x217)](),_0x193920)),'memories':_0x176273[_0x3dab94(0x356,0x361)]}),_0x35dcfa[_0x3d2850(-0x271,-0x272)](),_0x14127a;}else{if(!_0x3b2743[_0x3dab94(0x30c,0x28e)](_0x217f8e)){const _0x558b15=_0x4a528d[_0x3dab94(0x28a,0x26e)+'es']({'category':_0x426f1c,'projectPath':_0x2ea08c[_0x3dab94(0x345,0x3c6)+'h'],'limit':0x1});_0x558b15['length']>0x0&&(_0x203bc5[_0x3d2850(-0x1ca,-0x1fd)]({'memory':_0x558b15[0x0],'score':0.4,'matchType':_0x3dab94(0x390,0x2fd)}),_0x57a077['debug'](_0x17329b['sLeUM'],{'category':_0x215225}));}}}finally{}}const HOOK_TIMEOUT_MS=0x2710;export async function main(){const _0x568276={'QezvK':function(_0x36e344,_0x4dd0a1){return _0x36e344!==_0x4dd0a1;},'apWVn':function(_0x3f750a){return _0x3f750a();},'SbdaG':'ERHbB','ISdws':function(_0x56e204,_0x41f524){return _0x56e204(_0x41f524);},'FlGkn':_0x44472c(0x233,0x1fe),'wLSTr':function(_0x133bc8,_0x599543){return _0x133bc8===_0x599543;},'xAGmO':'qQOIi','GFCPn':_0x44472c(0x260,0x2e9)+_0x44472c(0x1f4,0x1b4)+_0x5e2a5a(0x11f,0xaa),'ylIaR':function(_0x16d02b,_0x595d61){return _0x16d02b instanceof _0x595d61;},'uPNBH':function(_0x87c9a8){return _0x87c9a8();}},_0x23eebe=[];for await(const _0x382c07 of process[_0x5e2a5a(0xbb,0x99)]){_0x23eebe[_0x44472c(0x2c1,0x2ec)](_0x382c07);}const _0x22b48a=Buffer['concat'](_0x23eebe)[_0x44472c(0x2c6,0x30d)]('utf-8')[_0x44472c(0x1f3,0x1d0)]();!_0x22b48a&&(_0x568276['apWVn'](closeSharedDb),process[_0x5e2a5a(0x1a0,0x181)](0x0));function _0x5e2a5a(_0x4712a7,_0x18460c){return _0x55c2d6(_0x4712a7,_0x18460c- -0x235);}const _0x28c7fb=setTimeout(()=>{console[_0x423f3a(0x123,0x82)]('[a2a]\x20Sess'+_0x595f58(0x31d,0x2d6)+_0x595f58(0x2da,0x34b)+'out\x20('+HOOK_TIMEOUT_MS+(_0x595f58(0x320,0x377)+'ing\x20gracef'+_0x595f58(0x36a,0x3fc)));function _0x595f58(_0x23f50f,_0x4ee173){return _0x44472c(_0x4ee173-0x123,_0x23f50f);}function _0x423f3a(_0x3909f8,_0x1a6f56){return _0x44472c(_0x1a6f56- -0x1c5,_0x3909f8);}closeSharedDb(),process[_0x423f3a(0x173,0x10c)](0x0);},HOOK_TIMEOUT_MS);function _0x44472c(_0x168c1a,_0x3e4c35){return _0x55c2d6(_0x3e4c35,_0x168c1a- -0xe5);}_0x28c7fb[_0x5e2a5a(0xf5,0x102)]();try{if(_0x44472c(0x2c4,0x308)!==_0x568276[_0x5e2a5a(0x6a,0xbd)]){const _0x3953ab=_0x127020[0x0];_0x4a1006[_0x44472c(0x2c1,0x237)](_0x3953ab),_0x5b1e35[_0x44472c(0x1b1,0x10e)](_0x3953ab['memory']['id']);}else{const _0x12c8a4=JSON[_0x44472c(0x1c0,0x260)](_0x22b48a),_0x1fd22f=_0x568276[_0x5e2a5a(0x18e,0x183)](normalizeHookInput,_0x12c8a4),_0x18ca38=await handleSessionStart(_0x1fd22f);_0x18ca38&&(_0x44472c(0x2cb,0x350)===_0x568276[_0x44472c(0x1e6,0x1b0)]?_0x3ec66d['push']('-\x20'+_0x1c6253):process[_0x5e2a5a(0x236,0x1a1)][_0x44472c(0x1bf,0x12d)](_0x18ca38));}}catch(_0x268f7c){if(_0x568276['wLSTr'](_0x568276[_0x5e2a5a(0x42,0xe6)],_0x44472c(0x232,0x1fb)))console[_0x44472c(0x247,0x24e)](_0x568276['GFCPn'],_0x568276['ylIaR'](_0x268f7c,Error)?_0x268f7c[_0x44472c(0x2da,0x2ac)]:_0x268f7c);else{const _0xc2d0d5=_0x5ea13e[_0x44472c(0x2ad,0x256)][_0x5e2a5a(0x1ea,0x142)]('\x0a')[0x0]['slice'](0x0,0x32)['trim'](),_0xb0c06d=_0xeffbf9['get'](_0xc2d0d5),_0x5c9782=mlmZuN['QezvK'](_0xb0c06d,_0x1c32c3)?_0x5e2a5a(0x1f2,0x1a5)+_0xb0c06d+']':'';_0x84612b['push']('-\x20'+_0x67dd74+_0x5c9782);}}finally{_0x568276[_0x44472c(0x29b,0x2ca)](closeSharedDb),process['exit'](0x0);}}function _0x1d39(_0x345d5f,_0x27237b){_0x345d5f=_0x345d5f-0xb2;const _0x2efb34=_0x2efb();let _0x1d3982=_0x2efb34[_0x345d5f];if(_0x1d39['ffdAXa']===undefined){var _0x1cdada=function(_0x197418){const _0x2f7e37='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x17c60d='',_0x46a46f='';for(let _0x3b0b8d=0x0,_0x3c7989,_0x45be22,_0x32c6e6=0x0;_0x45be22=_0x197418['charAt'](_0x32c6e6++);~_0x45be22&&(_0x3c7989=_0x3b0b8d%0x4?_0x3c7989*0x40+_0x45be22:_0x45be22,_0x3b0b8d++%0x4)?_0x17c60d+=String['fromCharCode'](0xff&_0x3c7989>>(-0x2*_0x3b0b8d&0x6)):0x0){_0x45be22=_0x2f7e37['indexOf'](_0x45be22);}for(let _0x3abb4e=0x0,_0x56b984=_0x17c60d['length'];_0x3abb4e<_0x56b984;_0x3abb4e++){_0x46a46f+='%'+('00'+_0x17c60d['charCodeAt'](_0x3abb4e)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x46a46f);};_0x1d39['xMfsct']=_0x1cdada,_0x1d39['UXhsOT']={},_0x1d39['ffdAXa']=!![];}const _0x2047d9=_0x2efb34[0x0],_0x4d3732=_0x345d5f+_0x2047d9,_0x17f518=_0x1d39['UXhsOT'][_0x4d3732];return!_0x17f518?(_0x1d3982=_0x1d39['xMfsct'](_0x1d3982),_0x1d39['UXhsOT'][_0x4d3732]=_0x1d3982):_0x1d3982=_0x17f518,_0x1d3982;}const isMainModule=process['argv'][0x1]?.[_0x2318f2(-0x11,0x8c)](_0x2318f2(-0xc0,-0xb4)+_0x55c2d6(0x2e8,0x2bd))||process[_0x2318f2(-0x54,0x33)][0x1]?.[_0x55c2d6(0x324,0x3b2)](_0x55c2d6(0x303,0x303)+_0x2318f2(-0x63,-0xe));function _0x55c2d6(_0x326d7f,_0x34512a){return _0x1d39(_0x34512a-0x1db,_0x326d7f);}isMainModule&&main();function _0x2efb(){const _0xddfe00=['uNroD1e','tgLoshm','ywjAzM8','u0n1Aui','zg9LCW','C2vZC2LVBJO','u2jKyuC','rfPMteC','yxbPs2v5','qMLfBfO','B3j5ihnLyxjJAa','Affzrum','wMHruLG','Bgv2zwW','Aw5MBW','uhjPB3jPDhKGyW','Bw9Yzq','zw1Izwq','A2rZruu','zMX1C2G','vvfTzKq','CMfsv3u','D2L0Aa','C2vZC2LVBI1ZDa','w2eYyv0GvgvHBq','DgHLEq','D291Bgq','EK5uugC','mtuXnZm3nuPSBvbrta','C2vZC2LVBL9ZDa','twLTBge','yxrLz29YEsbPBG','ugTvBgW','ywzLDhKGDgLTzq','CMfUAW','BwvTB3j5','zwqGkgjHy2TNCG','lI4VC2vHCMnOlW','BM9KzuLK','zNjVBq','C2HHBgW','wKnMz1i','ihb1BgWGzMfPBa','CvfpswK','DvPQzgy','C2vHCMnO','Bw9Kzq','EefhBu8','qxv0BY1PBMPLyW','CMvWBgfJzq','mJbTt0rqthK','zgvIDwC','twnotNq','vevWAuS','BwLU','BNzLBNrPB25Z','y29UDgv4Da','yK9gC2C','DerZCLO','zwfJAa','zuz1qw8','vKX3y28','DgvZDa','EvjPAxe','zxjYB3i','AK1eyM8','Ewv0','ywXZBW','Dg9mB3DLCKnHCW','DxHvEwq','DgHL','zgLK','q29Kzsbqyxr0zq','uNH6v1y','Aw5N','Dw5Yzwy','r2jLsNC','BxmPiokaLcbLEgL0','sw5ZAwDODhm','sLHcqw0','DMvJDg9Y','ug9duum','DgHYB3vNAa','zMv3','AMX3veq','C2TPBgXFBMfTzq','zxjwthi','z0P4yK8','wMv0AwK','w2eYyv0Gu2vZCW','BwfW','zxzLCNK','DgvHBvbHDgG','w2eYyv0GqMfJAW','zw5HyMXLza','vwHbBva','Du9SsMe','vMvJDg9YigzHBa','C2vHCMnOigzHAq','B1HyuNi','u2vZC2LVBLn0yq','B2zPy2LLBMn5ia','qMXjsfa','y29Kzv9Wyxr0zq','Ag93','yxv0B0LUAMvJDa','BgXZ','tMTfqMq','AgfZ','CYbMB3vUza','AgvY','yw5K','BML6zxiUANm','lI4VBgLMzwn5yW','Dxjvz1m','DgLVBG','yxj0lNrZ','qLvzzwW','ywXS','zxmGjIbtB2X1Da','BM90','yxv0B1n5BMm','uxzfqwS','C2vYDMvY','y291Bgq','z1r6t2G','Bg9Hza','wLjzq2u','zxH0ic0TpG','pceTlsbbmKeGtq','y29TCgXLEgL0Eq','yxjNDG','zM9YigrLDgfPBa','vgvHBsbZzwfYyW','D2PKqMO','u21Irhq','Aw50BW','vK9eENK','C29Tzq','C3bSAxq','Dw9PBe4','uxvLCNKGCM91Da','Cgf0Aa','Aw9Uu3rHCNq','AgfK','B3zLCMfSBa','A3jJs04','CMvJB3jKqwnJzq','DvboqKG','BgLMzwn5y2XL','Ehfbs04','C2nVCMu','yxj0','DffOBKW','y29UDMvUDgLVBG','ANvZDa','BM9Y','Ew91CG','rw1IzwrKAw5Nia','z2v0twvTB3j5','vK14z0O','te11Aum','B3vY','C2HL','Auj5BeS','ChjVAMvJDfbHDa','y29UDgvUDa','tMvmAMW','Bwf4vg9Rzw5Z','yxjL','lcb1C2LUzYbOEq','lI4Vzw1IzwrKAq','BcbMywLSzwqSia','C3rHCNrZv2L0Aa','Ew91','DgvAzw8','CLj5uK8','AhLICMLK','Bwf4','t2njB1e','D2HV','r3nRC3O','BgvUz3rO','qs9cihrLC3q6ia','zw1IzwrKAw5N','AwvUy2LLCW','ChvZAa','y2fU','wuXzC1i','rvjiyKi','CfnTD2e','Dg9tDhjPBMC','uhjVAMvJDcbdBW','zMLSDgvY','zM9Y','BuD0DNu','vKLlyuq','AuHLD3q','zw5KC1DPDgG','ywjuzxn0','zhzUBNK','AgLT','zxHPDa','tuTtAMe','svnKD3m','shLICMLKihnLyq','DgHPCW','zwL0AgvY','mtmZmJCZrxDRC1fR','u3jnwhC','DwXSEq','BwvZC2fNzq','DcbUB3qGyxzHAq','tM8GBwvTB3jPzq','BgfIBgu','uhrKBKe','z3jVDw5Kihb1Ba','lsbB','cImJiYbuzwfTia','D2HLBG','CMvJB3jKsw5Qzq','zgvJAxnPB24','sg9VAYbJB21WBa','DxnPBMCGBg9Jyq','C2XPy2u','qwn0AxzLifnRAq','CgTQvgK','z2v0','sKPnvee','D2fYBG','BguVAw5KzxGUAG','C2vHCMnOqNLwzq','Bu14sva','qwDJA2y','C3rKB3v0','DxbKyxrLtwvTBW','zMjpAum','mJy0ode4BefkqMfS','ifTmDI4','BgvK','zNrZ','BgXT','zMXHDe1HCa','y0jsqNm','y2XHC3nPzNK','twvTB3j5ienVBG','D2LSBa','yMvPBMC','DgHVC2u','ntKZotK5muLzAw9Itq','BMf2ywLSywjSzq','y2f0y2G','y2XHDwrLlw1K','yMvLBG','DgvHBq','thL6s2S','uMvYyw5RzxiGDq','ywrK','CgLxy1u','Aw9Uu3rHCNqGCW','rLrtihnLyxjJAa','CM91BMq','rMLbq0G','CMvHC29U','Bw9ZDa','DgfNCW','CLnJCuS','ChvSBezYB21uzq','swLWuui','mJu5mJCYmhLYCuvTsa','BgvHCM5PBMC','D3jPDgu','CgfYC2u','EKnfAMq','y2HHCKnVzgvbDa','rePzre8','tfLOvLa','zw1VCNKGq29UDa','Bwf4twvTB3jPzq','AM9PBG','yw0TC3LUy2HYBW','mJu5ntzSthDxv0q','ELDmu04','DxnLvMvJDg9Y','rwH1uue','yNjPzcbYzxn1Ba','D2HLCMu','zuHqruy','Dgv4DcaTlt4','BNrLEhq','tg1lzeC','zxjYB3jFC29SDq','C29YDa','yM90Aa','y3rPB24','8j+sOsbGytjHlw1LBq','yxj0lMPZ','D1LQEfO','twvTB3jPzxm','DgHLAxi','D2HHDa','CMvZB2X2zq','BcbJywnOztO','BsbZzxj2zxi','C2vZC2LVBKLK','BwLNAhq','AcbMywLSzwq','y2f0zwDVCNK','tNLcD1i','nte2s25kzwPZ','rMXhA24','lI4VC3LUyY90zq','m2LpsejKrq','C3rKAw4','s25VD24GsxnZDq','C2TPChbPBMCGAq','wMfwCfO','CMvYyw5RzxiUAG','odi0nJmYt05RC1rL','BK1qr1y','DgvHBsbJBgLLBG','BgLZDe1LBw9YAq','qxjJAgL0zwn0Dq','DhjPBq','Aw9Uu3rHCNqGzq','tgvHCM5PBMDZ','r0L6vxG','CLP2B0u','C2TPBgW','B3nzB3i','CNjVCJO','ChvSBe9Uu2vZCW','z0H5CKe','CgfYzw50swq','D2vYzq','AgnAAha','ugLJs2W','q2PYy0C','sM9QBMO','C2v0','BM93','r0nRufO','EhDQuve'];_0x2efb=function(){return _0xddfe00;};return _0x2efb();}
|