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,633 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SessionEnd Hook
|
|
3
|
-
*
|
|
4
|
-
* Claude Code 세션 종료 시 실행됩니다.
|
|
5
|
-
* 세션 전체를 분석하여 요약 메모리를 생성합니다.
|
|
6
|
-
* autoSync 활성화 시 pending 메모리를 원격 서버로 push합니다.
|
|
7
|
-
*/
|
|
8
|
-
import { getSharedDb, closeSharedDb, normalizeHookInput } from './shared.js';
|
|
9
|
-
import { ConfigManager } from '../config/manager.js';
|
|
10
|
-
import { parseSessionFile, findSessionFiles } from '../session/parser.js';
|
|
11
|
-
import { extractMemories, extractMemoriesWithLLM, summarizeSession } from '../extraction/extractor.js';
|
|
12
|
-
import { createHookClient } from './client-factory.js';
|
|
13
|
-
import { SyncQueue } from '../sync/queue.js';
|
|
14
|
-
import { createLogger } from '../utils/logger.js';
|
|
15
|
-
/** autoSync push + 팀 동기화 — 동기화된 항목의 local→remote 매핑 반환 */
|
|
16
|
-
async function syncToRemote(_context, config, db, logger) {
|
|
17
|
-
const allSyncedItems = [];
|
|
18
|
-
// autoSync push (pending 메모리 일괄 전송)
|
|
19
|
-
if (config.autoSync.enabled && config.autoSync.pushOnSessionEnd && config.server.apiKey) {
|
|
20
|
-
try {
|
|
21
|
-
const client = createHookClient(config);
|
|
22
|
-
if (!client)
|
|
23
|
-
throw new Error('sync client not available');
|
|
24
|
-
const queue = new SyncQueue(db, client);
|
|
25
|
-
const flushResult = await queue.flush({ timeoutMs: config.autoSync.timeoutMs });
|
|
26
|
-
if (flushResult.pushed > 0) {
|
|
27
|
-
console.error(`[a2a] Synced ${flushResult.pushed} memories to server`);
|
|
28
|
-
}
|
|
29
|
-
if (flushResult.errors.length > 0) {
|
|
30
|
-
console.error(`[a2a] Sync errors: ${flushResult.errors.join(', ')}`);
|
|
31
|
-
}
|
|
32
|
-
allSyncedItems.push(...flushResult.syncedItems);
|
|
33
|
-
}
|
|
34
|
-
catch (syncErr) {
|
|
35
|
-
logger.warn('Sync push failed', { error: syncErr instanceof Error ? syncErr.message : String(syncErr) });
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
// 팀 동기화 (team 모드)
|
|
39
|
-
if (config.mode === 'team' && config.team && config.server.apiKey) {
|
|
40
|
-
try {
|
|
41
|
-
const { TeamSynchronizer } = await import('../sync/team-synchronizer.js');
|
|
42
|
-
const client = createHookClient(config);
|
|
43
|
-
if (!client)
|
|
44
|
-
throw new Error('team sync client not available');
|
|
45
|
-
const teamSync = new TeamSynchronizer(db, client, config.team.teamPath, config.team.nodeId);
|
|
46
|
-
const teamResult = await teamSync.syncDelta();
|
|
47
|
-
if (teamResult.pushed > 0) {
|
|
48
|
-
console.error(`[a2a] Team synced ${teamResult.pushed} memories`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
catch (teamErr) {
|
|
52
|
-
logger.warn('Team sync failed', { error: teamErr instanceof Error ? teamErr.message : String(teamErr) });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return allSyncedItems;
|
|
56
|
-
}
|
|
57
|
-
export async function handleSessionEnd(context) {
|
|
58
|
-
const config = new ConfigManager().load();
|
|
59
|
-
const logger = createLogger('SessionEnd', config.logging);
|
|
60
|
-
const startTime = performance.now();
|
|
61
|
-
try {
|
|
62
|
-
logger.info('Hook started', { projectPath: context.projectPath });
|
|
63
|
-
// projectPath 필수 검증 — 없으면 아무 작업도 불가
|
|
64
|
-
if (!context.projectPath) {
|
|
65
|
-
logger.warn('No projectPath provided');
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const db = getSharedDb(config.db.path);
|
|
69
|
-
// ── Phase 1: 세션 추출 (실패해도 Phase 2 진행) ──
|
|
70
|
-
const tPhase1Start = performance.now();
|
|
71
|
-
const createdIds = [];
|
|
72
|
-
if (config.sessionSummary.enabled) {
|
|
73
|
-
try {
|
|
74
|
-
await extractSessionMemories(context, config, db, logger, createdIds);
|
|
75
|
-
}
|
|
76
|
-
catch (extractErr) {
|
|
77
|
-
logger.warn('Session extraction failed', { error: extractErr instanceof Error ? extractErr.message : String(extractErr) });
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
logger.info('Session summary disabled');
|
|
82
|
-
}
|
|
83
|
-
const tPhase1End = performance.now();
|
|
84
|
-
// ── Phase 2: 항상 실행 — Sync, Cleanup (세션 추출과 독립) ──
|
|
85
|
-
const tPhase2Start = performance.now();
|
|
86
|
-
// 숙련도 추적 — 로컬 레벨 계산만 (서버 push는 syncToRemote 이후)
|
|
87
|
-
// createdIds.length > 0 게이트 제거: PostToolUse가 세션 중 이미 메모리를 생성했으므로
|
|
88
|
-
// SessionEnd의 createdIds(세션파일 추출분)과 무관하게 proficiency 평가 수행
|
|
89
|
-
let proficiencyEvents = [];
|
|
90
|
-
if (config.proficiency?.enabled) {
|
|
91
|
-
const sessionMemoryIds = createdIds.length > 0
|
|
92
|
-
? createdIds
|
|
93
|
-
: db.listMemories({ limit: 50 }).map(m => m.id);
|
|
94
|
-
proficiencyEvents = await trackProficiencyLocal(context, config, db, logger, sessionMemoryIds);
|
|
95
|
-
}
|
|
96
|
-
// 원격 동기화 (autoSync push + 팀 동기화) — 메모리를 먼저 서버에 전송
|
|
97
|
-
const syncedItems = await syncToRemote(context, config, db, logger);
|
|
98
|
-
// 숙련도 서버 Push — syncToRemote 이후 (FK 제약: skill_memory_id가 서버에 존재해야 함)
|
|
99
|
-
if (proficiencyEvents.length > 0 && config.server?.apiKey && config.server?.url) {
|
|
100
|
-
await pushProficiencyToServer(proficiencyEvents, context, config, logger);
|
|
101
|
-
}
|
|
102
|
-
// 파일 참조 동기화 — 이번 세션에서 synced된 전체 메모리 대상 (remote ID 사용)
|
|
103
|
-
if (syncedItems.length > 0 && config.server?.apiKey && config.server?.url) {
|
|
104
|
-
await syncFileReferences(syncedItems, context, config, db, logger);
|
|
105
|
-
}
|
|
106
|
-
// MCG: 세션 단위 context + co_occurrence/causal 관계 생성
|
|
107
|
-
if (syncedItems.length >= 2 && config.server?.apiKey && config.server?.url) {
|
|
108
|
-
await syncContextAndRelations(syncedItems, context, config, db, logger);
|
|
109
|
-
}
|
|
110
|
-
const tPhase2End = performance.now();
|
|
111
|
-
// 주입 효과 종합 (fire-and-forget)
|
|
112
|
-
try {
|
|
113
|
-
const injection = db.getLatestInjection(context.sessionId);
|
|
114
|
-
if (injection) {
|
|
115
|
-
const hits = db.getInjectionHits(injection.id);
|
|
116
|
-
const effectiveness = injection.totalInjected > 0
|
|
117
|
-
? hits.length / injection.totalInjected
|
|
118
|
-
: 0;
|
|
119
|
-
db.updateInjectionEffectiveness(injection.id, effectiveness, hits.length);
|
|
120
|
-
if (hits.length > 0) {
|
|
121
|
-
logger.info('Injection effectiveness', { effectiveness: effectiveness.toFixed(2), hits: hits.length });
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
// 효과 집계 실패는 비치명적
|
|
127
|
-
}
|
|
128
|
-
// ── Phase 3: 감정 데이터 플러시 + 라이프사이클 정리 ──
|
|
129
|
-
const tPhase3Start = performance.now();
|
|
130
|
-
if (config.emotionTracking?.enabled && config.server?.apiKey) {
|
|
131
|
-
try {
|
|
132
|
-
await flushEmotionBuffer(config, db, logger);
|
|
133
|
-
}
|
|
134
|
-
catch (emotionErr) {
|
|
135
|
-
logger.warn('Emotion sync failed', { error: emotionErr instanceof Error ? emotionErr.message : String(emotionErr) });
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// 라이프사이클 정리 (설정 활성화 시)
|
|
139
|
-
if (config.lifecycle?.cleanupOnSessionEnd) {
|
|
140
|
-
try {
|
|
141
|
-
const { cleanupMemories } = await import('../lifecycle/index.js');
|
|
142
|
-
const cleanupResult = cleanupMemories(db, config.lifecycle);
|
|
143
|
-
if (cleanupResult.total > 0) {
|
|
144
|
-
console.error(`[a2a] Cleaned up ${cleanupResult.total} memories (${cleanupResult.expired} expired, ${cleanupResult.lowQuality} low-quality)`);
|
|
145
|
-
}
|
|
146
|
-
logger.info('Cleanup done', { total: cleanupResult.total });
|
|
147
|
-
}
|
|
148
|
-
catch (cleanupErr) {
|
|
149
|
-
logger.warn('Cleanup failed', { error: cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr) });
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
const tPhase3End = performance.now();
|
|
153
|
-
const totalMs = Math.round(tPhase3End - startTime);
|
|
154
|
-
const extractMs = Math.round(tPhase1End - tPhase1Start);
|
|
155
|
-
const syncMs = Math.round(tPhase2End - tPhase2Start);
|
|
156
|
-
const cleanupMs = Math.round(tPhase3End - tPhase3Start);
|
|
157
|
-
process.stderr.write(`[A2A] SessionEnd completed (total: ${totalMs}ms | extract: ${extractMs}ms, sync: ${syncMs}ms, cleanup: ${cleanupMs}ms)\n`);
|
|
158
|
-
logger.info('Hook completed', { durationMs: totalMs });
|
|
159
|
-
}
|
|
160
|
-
finally {
|
|
161
|
-
logger.flush();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* 세션 파일에서 메모리 추출 (Phase 1 내부)
|
|
166
|
-
*/
|
|
167
|
-
async function extractSessionMemories(context, config, db, logger, createdIds) {
|
|
168
|
-
const sessionFiles = findSessionFiles(context.projectPath);
|
|
169
|
-
if (sessionFiles.length === 0) {
|
|
170
|
-
logger.info('No session files found');
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
const latestSession = sessionFiles
|
|
174
|
-
.sort((a, b) => (b.modifiedAt - a.modifiedAt))[0];
|
|
175
|
-
const messages = parseSessionFile(latestSession.filePath);
|
|
176
|
-
const toolUseCount = messages.filter((m) => Array.isArray(m.message.content) &&
|
|
177
|
-
m.message.content.some((b) => b.type === 'tool_use')).length;
|
|
178
|
-
logger.info('Session analysis', { messages: messages.length, toolUseCount });
|
|
179
|
-
if (toolUseCount < config.sessionSummary.minActions) {
|
|
180
|
-
logger.info('Tool use count below threshold', { toolUseCount, threshold: config.sessionSummary.minActions });
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
// 이미 처리된 세션 확인 — 새 메시지가 있으면 증분 추출
|
|
184
|
-
const existingSession = db.getSession(latestSession.sessionId);
|
|
185
|
-
const previousMessageCount = existingSession?.messageCount ?? 0;
|
|
186
|
-
if (existingSession && messages.length <= previousMessageCount) {
|
|
187
|
-
logger.info('No new messages since last extraction', {
|
|
188
|
-
sessionId: latestSession.sessionId,
|
|
189
|
-
previousCount: previousMessageCount,
|
|
190
|
-
currentCount: messages.length,
|
|
191
|
-
});
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
const messagesToProcess = existingSession
|
|
195
|
-
? messages.slice(previousMessageCount)
|
|
196
|
-
: messages;
|
|
197
|
-
logger.info('Processing messages', {
|
|
198
|
-
total: messages.length,
|
|
199
|
-
new: messagesToProcess.length,
|
|
200
|
-
incremental: !!existingSession,
|
|
201
|
-
});
|
|
202
|
-
// 메모리 추출 (LLM 활성 시 고급 추출)
|
|
203
|
-
let result;
|
|
204
|
-
if (config.llm?.enabled) {
|
|
205
|
-
try {
|
|
206
|
-
const { createLLMClient } = await import('../llm/index.js');
|
|
207
|
-
const llmClient = createLLMClient(config.llm);
|
|
208
|
-
result = await extractMemoriesWithLLM(messagesToProcess, context.projectPath, llmClient);
|
|
209
|
-
const summary = await summarizeSession(messagesToProcess, llmClient);
|
|
210
|
-
if (summary && summary.length > 10) {
|
|
211
|
-
result.memories.push({
|
|
212
|
-
content: summary,
|
|
213
|
-
category: 'learning',
|
|
214
|
-
tier: 'semantic',
|
|
215
|
-
tags: ['session-summary'],
|
|
216
|
-
projectPath: context.projectPath,
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
catch (llmErr) {
|
|
221
|
-
logger.warn('LLM extraction failed, using basic', { error: llmErr instanceof Error ? llmErr.message : String(llmErr) });
|
|
222
|
-
result = extractMemories(messagesToProcess, context.projectPath);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
result = extractMemories(messagesToProcess, context.projectPath);
|
|
227
|
-
}
|
|
228
|
-
logger.info('Memories extracted', { count: result.memories.length });
|
|
229
|
-
// DB에 저장 + sync_status pending 설정
|
|
230
|
-
for (const memory of result.memories) {
|
|
231
|
-
const created = db.createMemory({
|
|
232
|
-
...memory,
|
|
233
|
-
sessionId: latestSession.sessionId,
|
|
234
|
-
});
|
|
235
|
-
db.setSyncStatus(created.id, null, 'pending');
|
|
236
|
-
createdIds.push(created.id);
|
|
237
|
-
if (config.embedding?.enabled && config.embedding.provider === 'local') {
|
|
238
|
-
try {
|
|
239
|
-
const { createEmbeddingProvider } = await import('../embedding/index.js');
|
|
240
|
-
const provider = createEmbeddingProvider(config.embedding, config.llm);
|
|
241
|
-
const emb = await Promise.resolve(provider.embed(created.content));
|
|
242
|
-
if (Array.isArray(emb)) {
|
|
243
|
-
db.saveEmbedding(created.id, emb);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
catch {
|
|
247
|
-
// 임베딩 생성 실패 무시
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
// OpenAI 임베딩 일괄 처리
|
|
252
|
-
if (config.embedding?.enabled && config.embedding.provider === 'openai' && config.llm?.apiKey && createdIds.length > 0) {
|
|
253
|
-
try {
|
|
254
|
-
const { createEmbeddingProvider } = await import('../embedding/index.js');
|
|
255
|
-
const provider = createEmbeddingProvider(config.embedding, config.llm);
|
|
256
|
-
const contents = createdIds.map(id => {
|
|
257
|
-
const mem = db.getMemory(id);
|
|
258
|
-
return mem ? mem.content : '';
|
|
259
|
-
}).filter(Boolean);
|
|
260
|
-
if (contents.length > 0) {
|
|
261
|
-
const embeddings = await Promise.resolve(provider.embedBatch(contents));
|
|
262
|
-
for (let i = 0; i < createdIds.length; i++) {
|
|
263
|
-
if (embeddings[i]) {
|
|
264
|
-
db.saveEmbedding(createdIds[i], embeddings[i]);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
catch {
|
|
270
|
-
// 일괄 임베딩 실패 무시
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
// 세션 기록
|
|
274
|
-
db.saveSession(latestSession.sessionId, context.projectPath, messages.length);
|
|
275
|
-
if (result.memories.length > 0) {
|
|
276
|
-
const mode = existingSession ? ' (incremental)' : '';
|
|
277
|
-
console.error(`[a2a] Session summary${mode}: ${result.memories.length} memories extracted from ${messagesToProcess.length} messages`);
|
|
278
|
-
}
|
|
279
|
-
// 스킬 결정화 평가 (N 세션마다)
|
|
280
|
-
if (config.skillConversion?.enabled) {
|
|
281
|
-
try {
|
|
282
|
-
const sessionCount = db.getSessionCount(context.projectPath);
|
|
283
|
-
if (sessionCount > 0 && sessionCount % config.skillConversion.evaluationInterval === 0) {
|
|
284
|
-
const { SkillEvaluator } = await import('../skill/evaluator.js');
|
|
285
|
-
const evaluator = new SkillEvaluator(db, config);
|
|
286
|
-
// Taxonomy 분류를 위한 A2AClient (선택적)
|
|
287
|
-
const taxonomyClient = createHookClient(config, 10000) ?? undefined; // taxonomy 분류는 빠르게 (10초)
|
|
288
|
-
const evalResult = await evaluator.evaluate(context.projectPath, taxonomyClient);
|
|
289
|
-
if (evalResult.created > 0) {
|
|
290
|
-
console.error(`[a2a] Skill crystallization: ${evalResult.created} new skills created`);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
catch (skillErr) {
|
|
295
|
-
logger.warn('Skill evaluation failed', { error: skillErr instanceof Error ? skillErr.message : String(skillErr) });
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* 숙련도 추적 — 로컬 레벨 계산만 (서버 push 분리)
|
|
301
|
-
* 감지된 이벤트 목록을 반환하여 서버 push에 사용
|
|
302
|
-
*/
|
|
303
|
-
async function trackProficiencyLocal(context, config, db, logger, createdIds) {
|
|
304
|
-
const detectedEvents = [];
|
|
305
|
-
try {
|
|
306
|
-
const { ProficiencyTracker } = await import('../proficiency/tracker.js');
|
|
307
|
-
const { detectSkillPractice } = await import('../proficiency/detection.js');
|
|
308
|
-
const tracker = new ProficiencyTracker(db, config.proficiency);
|
|
309
|
-
const skills = db.listMemories({ category: 'skill', limit: 100 });
|
|
310
|
-
const sessionMemories = createdIds
|
|
311
|
-
.map(id => {
|
|
312
|
-
const mem = db.getMemory(id);
|
|
313
|
-
if (!mem)
|
|
314
|
-
return null;
|
|
315
|
-
const emb = db.getEmbedding(id);
|
|
316
|
-
return {
|
|
317
|
-
content: mem.content,
|
|
318
|
-
tags: mem.tags ?? [],
|
|
319
|
-
embedding: emb ?? undefined,
|
|
320
|
-
};
|
|
321
|
-
})
|
|
322
|
-
.filter((m) => m !== null);
|
|
323
|
-
for (const skill of skills) {
|
|
324
|
-
const skillInfo = {
|
|
325
|
-
id: skill.id,
|
|
326
|
-
content: skill.content,
|
|
327
|
-
tags: skill.tags ?? [],
|
|
328
|
-
embedding: skill.embedding ?? db.getEmbedding(skill.id) ?? undefined,
|
|
329
|
-
};
|
|
330
|
-
const detection = detectSkillPractice(skillInfo, sessionMemories);
|
|
331
|
-
if (!detection)
|
|
332
|
-
continue;
|
|
333
|
-
const levelResult = tracker.recordPractice(skill.id, detection.outcome, detection.difficulty, detection.contextTags, context.sessionId);
|
|
334
|
-
if (levelResult.levelChanged) {
|
|
335
|
-
console.error(`[a2a] Proficiency: "${skill.content.split('\n')[0].slice(0, 50)}" level ${levelResult.previousLevel} → ${levelResult.newLevel}`);
|
|
336
|
-
}
|
|
337
|
-
detectedEvents.push({
|
|
338
|
-
skillMemoryId: skill.id,
|
|
339
|
-
outcome: detection.outcome,
|
|
340
|
-
difficulty: detection.difficulty,
|
|
341
|
-
contextTags: detection.contextTags,
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
catch (profErr) {
|
|
346
|
-
logger.warn('Proficiency tracking failed', { error: profErr instanceof Error ? profErr.message : String(profErr) });
|
|
347
|
-
}
|
|
348
|
-
return detectedEvents;
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* 숙련도 서버 Push — 배치 전송 (syncToRemote 이후 호출)
|
|
352
|
-
* FK 제약: skill_memory_id가 서버 memories 테이블에 존재해야 함
|
|
353
|
-
* → syncToRemote()로 메모리 동기화 완료 후 호출해야 안전
|
|
354
|
-
*/
|
|
355
|
-
async function pushProficiencyToServer(events, context, config, logger) {
|
|
356
|
-
try {
|
|
357
|
-
const pushClient = createHookClient(config);
|
|
358
|
-
if (!pushClient)
|
|
359
|
-
return;
|
|
360
|
-
const connected = await pushClient.testConnection();
|
|
361
|
-
if (!connected)
|
|
362
|
-
return;
|
|
363
|
-
// 배치 전송 (1회 HTTP 호출 — 개별 전송 대비 네트워크 효율)
|
|
364
|
-
await pushClient.postProficiencyEventBatch(events.map(event => ({
|
|
365
|
-
skill_memory_id: event.skillMemoryId,
|
|
366
|
-
outcome: event.outcome,
|
|
367
|
-
difficulty: event.difficulty,
|
|
368
|
-
context_tags: event.contextTags,
|
|
369
|
-
session_id: context.sessionId,
|
|
370
|
-
})));
|
|
371
|
-
logger.info('Proficiency events batch-pushed to server', { count: events.length });
|
|
372
|
-
console.error(`[a2a] Proficiency: ${events.length} event(s) batch-synced to server`);
|
|
373
|
-
}
|
|
374
|
-
catch (err) {
|
|
375
|
-
logger.warn('Proficiency server push failed', { error: err instanceof Error ? err.message : String(err) });
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* 감정 버퍼 플러시 — 버퍼된 프롬프트를 Backend emotion API로 배치 전송
|
|
380
|
-
*/
|
|
381
|
-
async function flushEmotionBuffer(config, db, logger) {
|
|
382
|
-
const messages = db.getUnsentEmotionMessages(config.emotionTracking?.maxPerSession ?? 10);
|
|
383
|
-
if (messages.length === 0)
|
|
384
|
-
return;
|
|
385
|
-
const client = createHookClient(config);
|
|
386
|
-
if (!client)
|
|
387
|
-
return;
|
|
388
|
-
const connected = await client.testConnection();
|
|
389
|
-
if (!connected)
|
|
390
|
-
return;
|
|
391
|
-
const syncedIds = [];
|
|
392
|
-
for (const { id, message } of messages) {
|
|
393
|
-
try {
|
|
394
|
-
await client.analyzeEmotion(message);
|
|
395
|
-
syncedIds.push(id);
|
|
396
|
-
}
|
|
397
|
-
catch {
|
|
398
|
-
// 개별 실패는 무시, 다음 세션에서 재시도
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
if (syncedIds.length > 0) {
|
|
402
|
-
db.markEmotionMessagesSynced(syncedIds);
|
|
403
|
-
db.cleanupSyncedEmotionMessages();
|
|
404
|
-
console.error(`[a2a] Emotion: ${syncedIds.length} prompt(s) analyzed`);
|
|
405
|
-
logger.info('Emotion buffer flushed', { sent: syncedIds.length, total: messages.length });
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
/**
|
|
409
|
-
* 메모리-파일 참조 동기화
|
|
410
|
-
*
|
|
411
|
-
* 이번 세션에서 동기화된 메모리의 content에서 .md 파일 참조를 감지하고,
|
|
412
|
-
* 중복 확인 후 파일을 업로드한 다음 메모리-파일 연결을 생성합니다.
|
|
413
|
-
*
|
|
414
|
-
* 핵심: remote ID를 사용하여 서버의 memory_files FK를 올바르게 연결합니다.
|
|
415
|
-
* fire-and-forget: 실패해도 세션 종료에 영향 없음.
|
|
416
|
-
*/
|
|
417
|
-
async function syncFileReferences(syncedItems, context, config, db, logger) {
|
|
418
|
-
try {
|
|
419
|
-
const client = createHookClient(config);
|
|
420
|
-
if (!client)
|
|
421
|
-
return;
|
|
422
|
-
const { detectMdReferences } = await import('../extraction/file-reference.js');
|
|
423
|
-
const { createHash } = await import('crypto');
|
|
424
|
-
const { readFileSync } = await import('fs');
|
|
425
|
-
const { resolve } = await import('path');
|
|
426
|
-
// 업로드된 파일 hash→fileId 캐시 (같은 세션 내 중복 업로드 방지)
|
|
427
|
-
const uploadedFiles = new Map();
|
|
428
|
-
let linkedCount = 0;
|
|
429
|
-
for (const { localId, remoteId } of syncedItems) {
|
|
430
|
-
const memory = db.getMemory(localId);
|
|
431
|
-
if (!memory)
|
|
432
|
-
continue;
|
|
433
|
-
const refs = detectMdReferences(memory.content, context.projectPath);
|
|
434
|
-
if (refs.length === 0)
|
|
435
|
-
continue;
|
|
436
|
-
for (const refPath of refs) {
|
|
437
|
-
try {
|
|
438
|
-
const fullPath = resolve(context.projectPath, refPath);
|
|
439
|
-
const content = readFileSync(fullPath);
|
|
440
|
-
const hash = createHash('sha256').update(content).digest('hex');
|
|
441
|
-
let fileId = uploadedFiles.get(hash);
|
|
442
|
-
if (!fileId) {
|
|
443
|
-
// 서버에 이미 업로드된 파일인지 확인
|
|
444
|
-
const dup = await client.checkFileDuplicate(hash);
|
|
445
|
-
if (dup.exists && dup.file_id) {
|
|
446
|
-
fileId = dup.file_id;
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
const result = await client.uploadFile(fullPath, {
|
|
450
|
-
category: 'reference',
|
|
451
|
-
tags: ['memory-reference', 'md-document'],
|
|
452
|
-
});
|
|
453
|
-
fileId = result.id;
|
|
454
|
-
}
|
|
455
|
-
uploadedFiles.set(hash, fileId);
|
|
456
|
-
}
|
|
457
|
-
// 메모리-파일 연결 — remote ID 사용!
|
|
458
|
-
await client.createMemoryFileLink(remoteId, fileId, {
|
|
459
|
-
reference_type: 'cited',
|
|
460
|
-
reference_path: refPath,
|
|
461
|
-
});
|
|
462
|
-
linkedCount++;
|
|
463
|
-
}
|
|
464
|
-
catch (err) {
|
|
465
|
-
// 409 Conflict (이미 연결됨)는 정상 — 무시
|
|
466
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
467
|
-
if (!msg.includes('409') && !msg.includes('already exists')) {
|
|
468
|
-
logger.warn('File reference sync failed', { refPath, error: msg });
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
if (linkedCount > 0) {
|
|
474
|
-
console.error(`[a2a] File references: ${linkedCount} link(s) created, ${uploadedFiles.size} file(s) uploaded`);
|
|
475
|
-
}
|
|
476
|
-
logger.info('File references synced', { linked: linkedCount, files: uploadedFiles.size });
|
|
477
|
-
}
|
|
478
|
-
catch (err) {
|
|
479
|
-
logger.warn('syncFileReferences failed', { error: String(err) });
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
/**
|
|
483
|
-
* MCG: 세션 단위 Context + Co-occurrence/Causal 관계 생성
|
|
484
|
-
*
|
|
485
|
-
* syncToRemote 이후 호출 — syncedItems의 remoteId가 서버에 존재해야 함.
|
|
486
|
-
* fire-and-forget: 실패해도 세션 종료에 영향 없음.
|
|
487
|
-
*/
|
|
488
|
-
async function syncContextAndRelations(syncedItems, context, config, db, logger) {
|
|
489
|
-
// 2개 미만이면 관계 생성 의미 없음 (호출 전에 이미 체크하지만 방어 코드)
|
|
490
|
-
if (syncedItems.length < 2)
|
|
491
|
-
return;
|
|
492
|
-
// co_occurrence 쌍 수가 O(n²)이므로 상위 20개만 처리
|
|
493
|
-
const MAX_ITEMS = 20;
|
|
494
|
-
const items = syncedItems.length > MAX_ITEMS ? syncedItems.slice(0, MAX_ITEMS) : syncedItems;
|
|
495
|
-
const client = createHookClient(config);
|
|
496
|
-
if (!client)
|
|
497
|
-
return;
|
|
498
|
-
try {
|
|
499
|
-
// 1. Context 생성 (세션 단위)
|
|
500
|
-
const sessionLabel = context.sessionId?.slice(0, 8) ?? 'unknown';
|
|
501
|
-
const contextResult = await client.createContext({
|
|
502
|
-
topic: `[Session] ${sessionLabel}`,
|
|
503
|
-
summary: `Session with ${syncedItems.length} memories`,
|
|
504
|
-
source_type: 'session',
|
|
505
|
-
source_id: context.sessionId,
|
|
506
|
-
memory_count: syncedItems.length,
|
|
507
|
-
});
|
|
508
|
-
const contextId = contextResult.id;
|
|
509
|
-
// 2. Context Members 연결 (첫 번째 = anchor, 나머지 = member)
|
|
510
|
-
for (let i = 0; i < items.length; i++) {
|
|
511
|
-
try {
|
|
512
|
-
await client.addContextMember(contextId, {
|
|
513
|
-
memory_id: items[i].remoteId,
|
|
514
|
-
role: i === 0 ? 'anchor' : 'member',
|
|
515
|
-
});
|
|
516
|
-
}
|
|
517
|
-
catch (memberErr) {
|
|
518
|
-
// 409 Conflict(이미 존재) 등 개별 실패는 무시하고 계속 진행
|
|
519
|
-
const msg = memberErr instanceof Error ? memberErr.message : String(memberErr);
|
|
520
|
-
if (!msg.includes('409') && !msg.includes('already exists')) {
|
|
521
|
-
logger.warn('MCG addContextMember failed', { remoteId: items[i].remoteId, error: msg });
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
// 3. Co-occurrence 관계 생성 (모든 쌍)
|
|
526
|
-
for (let i = 0; i < items.length; i++) {
|
|
527
|
-
for (let j = i + 1; j < items.length; j++) {
|
|
528
|
-
try {
|
|
529
|
-
await client.createRelation({
|
|
530
|
-
source_id: items[i].remoteId,
|
|
531
|
-
target_id: items[j].remoteId,
|
|
532
|
-
relation_type: 'co_occurrence',
|
|
533
|
-
score: 0.8,
|
|
534
|
-
context_id: contextId,
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
catch (relErr) {
|
|
538
|
-
const msg = relErr instanceof Error ? relErr.message : String(relErr);
|
|
539
|
-
if (!msg.includes('409') && !msg.includes('already exists')) {
|
|
540
|
-
logger.warn('MCG co_occurrence relation failed', { error: msg });
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
// 4. Causal 관계 생성 (decision → code_pattern/convention/error_solution)
|
|
546
|
-
const CAUSAL_SOURCES = new Set(['decision']);
|
|
547
|
-
const CAUSAL_TARGETS = new Set(['code_pattern', 'convention', 'error_solution']);
|
|
548
|
-
const decisionIds = [];
|
|
549
|
-
const derivedIds = [];
|
|
550
|
-
for (const { localId, remoteId } of items) {
|
|
551
|
-
const mem = db.getMemory(localId);
|
|
552
|
-
if (!mem)
|
|
553
|
-
continue;
|
|
554
|
-
if (CAUSAL_SOURCES.has(mem.category))
|
|
555
|
-
decisionIds.push(remoteId);
|
|
556
|
-
else if (CAUSAL_TARGETS.has(mem.category))
|
|
557
|
-
derivedIds.push(remoteId);
|
|
558
|
-
}
|
|
559
|
-
for (const decId of decisionIds) {
|
|
560
|
-
for (const deriveId of derivedIds) {
|
|
561
|
-
try {
|
|
562
|
-
await client.createRelation({
|
|
563
|
-
source_id: decId,
|
|
564
|
-
target_id: deriveId,
|
|
565
|
-
relation_type: 'causal',
|
|
566
|
-
score: 0.7,
|
|
567
|
-
context_id: contextId,
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
catch (causalErr) {
|
|
571
|
-
const msg = causalErr instanceof Error ? causalErr.message : String(causalErr);
|
|
572
|
-
if (!msg.includes('409') && !msg.includes('already exists')) {
|
|
573
|
-
logger.warn('MCG causal relation failed', { error: msg });
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
const causalCount = decisionIds.length * derivedIds.length;
|
|
579
|
-
console.error(`[a2a] MCG: context created (${items.length} members, ${causalCount} causal relations)`);
|
|
580
|
-
logger.info('MCG context and relations synced', {
|
|
581
|
-
contextId,
|
|
582
|
-
members: items.length,
|
|
583
|
-
causalRelations: causalCount,
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
catch (err) {
|
|
587
|
-
// Context 생성 자체 실패 (네트워크 등) — 전체 무시
|
|
588
|
-
logger.warn('MCG syncContextAndRelations failed', { error: String(err) });
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
const HOOK_TIMEOUT_MS = 30_000; // SessionEnd는 추출+동기화+MCG 포함, 넉넉하게 30초
|
|
592
|
-
/**
|
|
593
|
-
* CLI 엔트리포인트
|
|
594
|
-
* 전체 실행에 HOOK_TIMEOUT_MS 안전장치 적용
|
|
595
|
-
*/
|
|
596
|
-
export async function main() {
|
|
597
|
-
// 전체 Hook 실행 안전장치: HOOK_TIMEOUT_MS 초과 시 강제 종료
|
|
598
|
-
const safetyTimer = setTimeout(() => {
|
|
599
|
-
console.error(`[a2a] SessionEnd safety timeout (${HOOK_TIMEOUT_MS}ms) — exiting gracefully`);
|
|
600
|
-
closeSharedDb();
|
|
601
|
-
process.exit(0);
|
|
602
|
-
}, HOOK_TIMEOUT_MS);
|
|
603
|
-
const chunks = [];
|
|
604
|
-
for await (const chunk of process.stdin) {
|
|
605
|
-
chunks.push(chunk);
|
|
606
|
-
}
|
|
607
|
-
const input = Buffer.concat(chunks).toString('utf-8').trim();
|
|
608
|
-
if (!input) {
|
|
609
|
-
clearTimeout(safetyTimer);
|
|
610
|
-
closeSharedDb();
|
|
611
|
-
process.exit(0);
|
|
612
|
-
}
|
|
613
|
-
try {
|
|
614
|
-
const raw = JSON.parse(input);
|
|
615
|
-
const context = normalizeHookInput(raw);
|
|
616
|
-
await handleSessionEnd(context);
|
|
617
|
-
}
|
|
618
|
-
catch (err) {
|
|
619
|
-
console.error('[a2a] SessionEnd error:', err instanceof Error ? err.message : err);
|
|
620
|
-
}
|
|
621
|
-
finally {
|
|
622
|
-
clearTimeout(safetyTimer);
|
|
623
|
-
closeSharedDb();
|
|
624
|
-
process.exit(0);
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
// 직접 실행 시에만 main() 호출
|
|
628
|
-
const isMainModule = process.argv[1]?.endsWith('session-end.js') ||
|
|
629
|
-
process.argv[1]?.endsWith('session-end.ts');
|
|
630
|
-
if (isMainModule) {
|
|
631
|
-
main();
|
|
632
|
-
}
|
|
633
|
-
//# sourceMappingURL=session-end.js.map
|
|
1
|
+
(function(_0x322b1c,_0x362313){function _0x33b5a8(_0x1cf2f0,_0xcaad2f){return _0x4827(_0xcaad2f-0x138,_0x1cf2f0);}const _0x565bad=_0x322b1c();function _0xa0f457(_0x1e1dbd,_0x590cf3){return _0x4827(_0x590cf3- -0x370,_0x1e1dbd);}while(!![]){try{const _0x545cd6=-parseInt(_0xa0f457(-0x2c6,-0x206))/0x1+-parseInt(_0x33b5a8(0x345,0x31f))/0x2*(-parseInt(_0xa0f457(-0x151,-0x12d))/0x3)+-parseInt(_0x33b5a8(0x21f,0x205))/0x4*(parseInt(_0x33b5a8(0x1fd,0x218))/0x5)+-parseInt(_0x33b5a8(0x33d,0x2a5))/0x6*(-parseInt(_0x33b5a8(0x27b,0x2dd))/0x7)+parseInt(_0x33b5a8(0x2ca,0x2d2))/0x8*(-parseInt(_0xa0f457(-0x15c,-0x1f0))/0x9)+-parseInt(_0x33b5a8(0x2f6,0x323))/0xa+parseInt(_0xa0f457(-0x1d1,-0x1ad))/0xb;if(_0x545cd6===_0x362313)break;else _0x565bad['push'](_0x565bad['shift']());}catch(_0x2cea2d){_0x565bad['push'](_0x565bad['shift']());}}}(_0x4775,0x74820));import{getSharedDb,closeSharedDb,normalizeHookInput}from'./shared.js';import{ConfigManager}from'../config/manager.js';import{parseSessionFile,findSessionFiles}from'../session/parser.js';function _0x25c899(_0xe09350,_0x23aba3){return _0x4827(_0x23aba3- -0x140,_0xe09350);}import{extractMemories,extractMemoriesWithLLM,summarizeSession}from'../extraction/extractor.js';import{DedupManager}from'../extraction/dedup-manager.js';import{createHookClient}from'./client-factory.js';import{SyncQueue}from'../sync/queue.js';function _0x3633fd(_0x8908ed,_0x3ed26f){return _0x4827(_0x3ed26f- -0x134,_0x8908ed);}import{createLogger}from'../utils/logger.js';async function syncToRemote(_0x22b6b8,_0x122f7a,_0x125a04,_0x29616f){const _0x3afc5c={'FUWWI':function(_0x2252b2,_0x1f630a){return _0x2252b2 instanceof _0x1f630a;},'LBMly':function(_0x100257,_0x355d6b){return _0x100257(_0x355d6b);},'WmhYl':function(_0x26dc8c,_0x5c30d3){return _0x26dc8c>_0x5c30d3;},'qMmaN':_0xe55d77(0x1,-0x60),'JBazs':_0x359b2e(-0x179,-0x1a9)+_0xe55d77(-0xc1,-0x6c)+_0x359b2e(-0x222,-0x1ad),'XYuCe':_0x359b2e(-0x29f,-0x249)+'client\x20not'+'\x20available','jKnRt':function(_0x2a0097,_0x2ab78a){return _0x2a0097>_0x2ab78a;},'MPXWp':_0x359b2e(-0x179,-0x1cc)+_0x359b2e(-0x163,-0x15a),'zuynx':function(_0x4a2827,_0x37d060){return _0x4a2827 instanceof _0x37d060;}},_0x51390a=[];if(_0x122f7a[_0xe55d77(0x33,-0x44)][_0xe55d77(-0x1ec,-0x10b)]&&_0x122f7a['autoSync'][_0x359b2e(-0x280,-0x2a1)+_0x359b2e(-0x373,-0x307)]&&_0x122f7a[_0xe55d77(0x34,-0x1)][_0x359b2e(-0x33a,-0x291)])try{const _0x5d56ec=_0x3afc5c[_0x359b2e(-0xb3,-0x15d)](createHookClient,_0x122f7a);if(!_0x5d56ec)throw new Error(_0xe55d77(-0x6b,-0xaf)+'t\x20not\x20avai'+_0x359b2e(-0x1b0,-0x1f9));const _0x482536=new SyncQueue(_0x125a04,_0x5d56ec),_0x31479f=await _0x482536['flush']({'timeoutMs':_0x122f7a[_0xe55d77(-0x6b,-0x44)]['timeoutMs']});if(_0x3afc5c[_0x359b2e(-0x17b,-0x241)](_0x31479f[_0x359b2e(-0x25f,-0x208)],0x0)){if(_0x359b2e(-0x149,-0x194)!==_0xe55d77(-0xc,-0xf)){const _0x15afc0=_0x3afc5c[_0x359b2e(-0x2a4,-0x2c7)](_0x14e8e6,_0x5f03dd)?_0x42f75d[_0x359b2e(-0x21b,-0x2ef)]:_0x507882(_0x1cc618);!_0x15afc0['includes'](_0xe55d77(-0x1,-0xd0))&&!_0x15afc0['includes'](_0x359b2e(-0x180,-0x184)+_0xe55d77(-0xac,-0x73))&&_0x45635e[_0x359b2e(-0x1f2,-0x267)]('MCG\x20addCon'+_0x359b2e(-0x218,-0x1bb)+_0xe55d77(-0x164,-0x15f),{'remoteId':_0x5cb525[_0x47f17b][_0x359b2e(-0x266,-0x1b3)],'error':_0x15afc0});}else console['error'](_0x359b2e(-0x219,-0x165)+'ed\x20'+_0x31479f[_0x359b2e(-0x286,-0x208)]+(_0xe55d77(-0xe9,-0xa)+_0x359b2e(-0x1db,-0x1ea)));}_0x31479f[_0x359b2e(-0xa4,-0x146)][_0xe55d77(-0xb4,0x2d)]>0x0&&console['error'](_0xe55d77(-0x8f,0x20)+_0xe55d77(-0xa0,-0x35)+_0x31479f[_0xe55d77(0x7a,0x3f)][_0x359b2e(-0xd3,-0x143)](',\x20')),_0x51390a[_0xe55d77(-0x167,-0xe6)](..._0x31479f[_0x359b2e(-0x166,-0x231)+'s']);}catch(_0x3bb545){_0x29616f['warn']('Sync\x20push\x20'+_0x359b2e(-0xa5,-0x15a),{'error':_0x3bb545 instanceof Error?_0x3bb545[_0xe55d77(-0xe8,-0x16a)]:_0x3afc5c[_0x359b2e(-0xfa,-0x15d)](String,_0x3bb545)});}if(_0x122f7a[_0xe55d77(0xea,0x39)]===_0x3afc5c['qMmaN']&&_0x122f7a[_0xe55d77(-0xb3,-0x60)]&&_0x122f7a['server'][_0x359b2e(-0x302,-0x291)])try{const {TeamSynchronizer:_0x2b9ca1}=await import(_0x3afc5c[_0xe55d77(0x27,-0x21)]),_0x1c92ad=createHookClient(_0x122f7a);if(!_0x1c92ad)throw new Error(_0x3afc5c['XYuCe']);const _0x319b1f=new _0x2b9ca1(_0x125a04,_0x1c92ad,_0x122f7a[_0x359b2e(-0x1f0,-0x1e5)][_0x359b2e(-0x169,-0x189)],_0x122f7a[_0x359b2e(-0x172,-0x1e5)][_0x359b2e(-0x2f9,-0x224)]),_0x1f503b=await _0x319b1f[_0x359b2e(-0x251,-0x2da)]();_0x3afc5c[_0xe55d77(-0x135,-0xed)](_0x1f503b[_0xe55d77(-0x14f,-0x83)],0x0)&&console['error'](_0x359b2e(-0x2cc,-0x21c)+_0xe55d77(0x3c,-0x66)+_0x1f503b[_0x359b2e(-0x178,-0x208)]+_0x359b2e(-0x148,-0x1e3));}catch(_0xd24c04){_0x29616f['warn'](_0x3afc5c[_0x359b2e(-0x152,-0x19a)],{'error':_0x3afc5c['zuynx'](_0xd24c04,Error)?_0xd24c04[_0xe55d77(-0x1e7,-0x16a)]:_0x3afc5c[_0xe55d77(0xe5,0x28)](String,_0xd24c04)});}function _0xe55d77(_0x383c5f,_0xdebbfc){return _0x4827(_0xdebbfc- -0x24e,_0x383c5f);}function _0x359b2e(_0x74948e,_0x2e5c42){return _0x4827(_0x2e5c42- -0x3d3,_0x74948e);}return _0x51390a;}export async function handleSessionEnd(_0x51d7d1){const _0x4a13d3={'rfiZV':function(_0x45ffe7,_0x43b2eb){return _0x45ffe7 instanceof _0x43b2eb;},'OdZIY':function(_0x2281fc,_0x534caa,_0x42cbc9){return _0x2281fc(_0x534caa,_0x42cbc9);},'ZKwSt':function(_0xe1d12b,_0x7b7ba1){return _0xe1d12b===_0x7b7ba1;},'jbNqj':function(_0x38b5cd,_0x3b0924){return _0x38b5cd>_0x3b0924;},'ckcfY':function(_0x1b3ab3,_0x2cc286){return _0x1b3ab3>_0x2cc286;},'kTyzQ':function(_0x2f7b60,_0x1f267a,_0x4e70cf,_0x26445a,_0x56b197,_0x5751f0){return _0x2f7b60(_0x1f267a,_0x4e70cf,_0x26445a,_0x56b197,_0x5751f0);},'uNDRz':'../lifecyc'+'le/injecti'+'on-flush.j'+'s','hwgla':function(_0x2aad0c,_0x39b40d){return _0x2aad0c>_0x39b40d;},'TjRhV':function(_0x1e7175,_0x415897){return _0x1e7175!==_0x415897;},'lKVUO':'URtTe','lApPp':_0x1bba4a(-0x203,-0x173)+_0x51200e(-0xd6,-0x64),'OpLft':function(_0x3b0ef8,_0x2334a7){return _0x3b0ef8(_0x2334a7);},'mpGfv':'../lifecyc'+_0x51200e(0x68,0x50)+'s','yPuXa':function(_0x46ef64,_0x503679,_0x2d0e92){return _0x46ef64(_0x503679,_0x2d0e92);},'iMyMP':_0x1bba4a(-0xde,-0xd2)+_0x51200e(-0x53,-0xa),'nOaJR':function(_0x58d2d2,_0x587e73){return _0x58d2d2!==_0x587e73;},'DHfRH':_0x1bba4a(-0x2f,-0x111),'kxXmL':_0x51200e(-0x96,-0x1d)+_0x51200e(-0x49,-0xb8)+_0x51200e(-0x16a,-0xe6),'ivVZa':function(_0x206f1f,_0x5a7601,_0x4d37b8){return _0x206f1f(_0x5a7601,_0x4d37b8);},'zCFKO':'Consolidat'+_0x1bba4a(-0x16d,-0x1b5),'USHOJ':function(_0x3e3dc7,_0x505bbd){return _0x3e3dc7 instanceof _0x505bbd;},'YbDxc':function(_0x4eb16a,_0x315efd){return _0x4eb16a/_0x315efd;},'aurLv':function(_0x352e3c,_0x4f73a3){return _0x352e3c+_0x4f73a3;},'PZBFt':function(_0x4f133c,_0x10927f){return _0x4f133c+_0x10927f;},'FDTlp':function(_0xf48f07,_0x2b95f1){return _0xf48f07-_0x2b95f1;},'eRtsj':function(_0xdd289b,_0x387cae){return _0xdd289b-_0x387cae;}};function _0x51200e(_0x2015b1,_0x42034b){return _0x4827(_0x42034b- -0x1b4,_0x2015b1);}const _0x1c0e14=new ConfigManager()['load'](),_0x4add70=_0x4a13d3[_0x1bba4a(-0x15c,-0xb2)](createLogger,_0x51200e(-0x55,0x7c),_0x1c0e14[_0x1bba4a(-0xf1,-0x103)]);function _0x1bba4a(_0x58eb30,_0x38026d){return _0x4827(_0x38026d- -0x309,_0x58eb30);}const _0x1ddad7=performance[_0x51200e(-0x26,0x97)]();try{if(_0x4a13d3[_0x1bba4a(-0x226,-0x156)]('FEwse',_0x1bba4a(-0x55,-0x8c))){_0x4add70[_0x1bba4a(-0x7,-0x96)]('Hook\x20start'+'ed',{'projectPath':_0x51d7d1[_0x51200e(-0x1d,-0x8d)+'h']});if(!_0x51d7d1[_0x1bba4a(-0x281,-0x1e2)+'h']){_0x4add70[_0x1bba4a(-0x194,-0x19d)](_0x1bba4a(-0xe1,-0x136)+_0x51200e(0xf5,0x95)+_0x51200e(-0x87,-0x8a));return;}const _0x31c196=getSharedDb(_0x1c0e14['db'][_0x51200e(-0x64,-0x37)]),_0x2be13e=performance['now'](),_0x3c3a5f=[],_0x1fc859={'add':0x0,'update':0x0,'delete':0x0,'noop':0x0};if(_0x1c0e14[_0x1bba4a(-0x1b7,-0xe1)+'mary'][_0x1bba4a(-0x28d,-0x1c6)])try{await extractSessionMemories(_0x51d7d1,_0x1c0e14,_0x31c196,_0x4add70,_0x3c3a5f,_0x1fc859);}catch(_0xd5c46b){_0x4add70[_0x1bba4a(-0x24d,-0x19d)](_0x1bba4a(-0x280,-0x1c0)+_0x1bba4a(-0x184,-0x1f6)+_0x1bba4a(-0x9a,-0x176),{'error':_0x4a13d3[_0x51200e(0x41,-0x3a)](_0xd5c46b,Error)?_0xd5c46b['message']:String(_0xd5c46b)});}else _0x4add70['info'](_0x1bba4a(-0x17e,-0x1ff)+_0x51200e(-0x175,-0xd1)+_0x1bba4a(-0x1d9,-0x221));const _0x10be5b=performance[_0x1bba4a(-0x10e,-0xbe)](),_0x54447e=performance[_0x51200e(0x57,0x97)]();let _0x513512=[];if(_0x1c0e14[_0x51200e(0x71,0x1d)+'y']?.[_0x1bba4a(-0x1c4,-0x1c6)]){const _0x3b942e=_0x4a13d3[_0x51200e(0xd6,0x0)](_0x3c3a5f[_0x1bba4a(0x37,-0x8e)],0x0)?_0x3c3a5f:_0x31c196[_0x1bba4a(-0x174,-0x16d)+'es']({'limit':0x32})[_0x51200e(0x18b,0xb2)](_0x2ec462=>_0x2ec462['id']);_0x513512=await trackProficiencyLocal(_0x51d7d1,_0x1c0e14,_0x31c196,_0x4add70,_0x3b942e);}const _0x45f729=await syncToRemote(_0x51d7d1,_0x1c0e14,_0x31c196,_0x4add70);_0x513512[_0x1bba4a(-0xb5,-0x8e)]>0x0&&_0x1c0e14['server']?.[_0x1bba4a(-0x29b,-0x1c7)]&&_0x1c0e14[_0x51200e(0xa4,0x99)]?.[_0x51200e(-0x33,-0xad)]&&await pushProficiencyToServer(_0x513512,_0x51d7d1,_0x1c0e14,_0x4add70);_0x4a13d3[_0x1bba4a(-0x113,-0x13d)](_0x45f729[_0x51200e(0x10d,0xc7)],0x0)&&_0x1c0e14[_0x51200e(0x58,0x99)]?.['apiKey']&&_0x1c0e14[_0x51200e(0x44,0x99)]?.['url']&&await _0x4a13d3[_0x51200e(0xd7,-0x4)](syncFileReferences,_0x45f729,_0x51d7d1,_0x1c0e14,_0x31c196,_0x4add70);_0x45f729[_0x51200e(0x7a,0xc7)]>=0x2&&_0x1c0e14['server']?.[_0x1bba4a(-0x242,-0x1c7)]&&_0x1c0e14[_0x1bba4a(-0x109,-0xbc)]?.[_0x51200e(-0xaa,-0xad)]&&await _0x4a13d3[_0x1bba4a(-0x158,-0x159)](syncContextAndRelations,_0x45f729,_0x51d7d1,_0x1c0e14,_0x31c196,_0x4add70);const _0x26c115=performance['now'](),{flushInjectionEffectiveness:_0x4270d4}=await import(_0x4a13d3[_0x51200e(0x148,0xb4)]),_0x31f837=_0x4270d4(_0x31c196,_0x51d7d1[_0x51200e(-0x8c,-0xb2)],_0x4add70);_0x4a13d3['hwgla'](_0x31f837['reinforceT'+'argets'][_0x1bba4a(-0x53,-0x8e)],0x0)&&_0x1c0e14[_0x51200e(0x75,0x56)]?.[_0x51200e(-0xd5,-0x71)]&&_0x1c0e14['server']?.[_0x1bba4a(-0x1d0,-0x1c7)]&&await reinforceInjectedMemories(_0x31f837[_0x51200e(0xf9,0x43)+'argets'],_0x31c196,_0x1c0e14,_0x4add70);const _0x39af7d=performance[_0x51200e(-0xd,0x97)]();if(_0x1c0e14[_0x51200e(-0x1e,-0x5a)+_0x51200e(-0x2a,-0x9a)]?.[_0x51200e(-0x83,-0x71)]&&_0x1c0e14[_0x1bba4a(-0xf7,-0xbc)]?.[_0x51200e(-0x15,-0x72)])try{await flushEmotionBuffer(_0x1c0e14,_0x31c196,_0x4add70);}catch(_0x383f5a){_0x4a13d3['TjRhV'](_0x4a13d3[_0x1bba4a(-0x277,-0x205)],_0x51200e(-0xa,0xb8))?_0x4add70[_0x51200e(-0xb7,-0x48)](_0x4a13d3[_0x51200e(0x84,0xc)],{'error':_0x4a13d3[_0x51200e(-0xb2,-0x3a)](_0x383f5a,Error)?_0x383f5a[_0x1bba4a(-0x1d1,-0x225)]:_0x4a13d3['OpLft'](String,_0x383f5a)}):_0x171587['error'](_0x51200e(0xfc,0xba)+'ed\x20'+_0x502602[_0x51200e(-0x49,0x17)]+(_0x51200e(0x42,0x90)+_0x1bba4a(-0x116,-0x120)));}if(_0x1c0e14[_0x1bba4a(-0x130,-0x1cd)]?.[_0x1bba4a(-0x1b2,-0x1fa)+_0x1bba4a(-0x15c,-0xd6)])try{const {cleanupMemories:_0xfdb64}=await import(_0x4a13d3[_0x51200e(0x7e,-0x52)]),_0x585e83=_0x4a13d3[_0x51200e(0xed,0x11)](_0xfdb64,_0x31c196,_0x1c0e14[_0x1bba4a(-0x21d,-0x1cd)]);_0x585e83[_0x51200e(-0x2f,-0x8f)]>0x0&&console[_0x51200e(-0x1e,-0x35)](_0x1bba4a(-0x198,-0x208)+_0x1bba4a(-0x4c,-0xe2)+_0x585e83['total']+(_0x1bba4a(-0x181,-0xc5)+'(')+_0x585e83[_0x1bba4a(-0x15d,-0x1d0)]+_0x51200e(0x149,0xd5)+_0x585e83['lowQuality']+(_0x51200e(-0xc4,-0xa0)+'ty)')),_0x4add70['info'](_0x51200e(0x5c,-0x6d)+'ne',{'total':_0x585e83[_0x51200e(-0x138,-0x8f)]});}catch(_0x265747){_0x4add70['warn'](_0x4a13d3[_0x51200e(0x173,0x9f)],{'error':_0x265747 instanceof Error?_0x265747[_0x51200e(-0x4a,-0xd0)]:String(_0x265747)});}try{if(_0x4a13d3[_0x51200e(-0x3c,-0x75)](_0x1bba4a(-0x18c,-0x111),_0x4a13d3[_0x51200e(0x61,0xcc)])){const _0x53ee22=_0x4a13d3[_0x51200e(-0x61,-0x3a)](_0x5ad631,_0x9d1fa7)?_0x42383a[_0x51200e(-0x96,-0xd0)]:_0x20f6e7(_0x5b0617);!_0x53ee22[_0x51200e(-0x7d,-0x13)]('409')&&!_0x53ee22['includes'](_0x51200e(0x178,0x9b)+_0x1bba4a(-0xf0,-0x12e))&&_0x507937[_0x51200e(0x24,-0x48)](_0x51200e(-0xb6,-0x41)+_0x1bba4a(-0x29e,-0x21c)+_0x51200e(0x167,0xc5),{'refPath':_0x58abf9,'error':_0x53ee22});}else{const {shouldConsolidate:_0x343375,runConsolidation:_0x5f14dc}=await import(_0x4a13d3[_0x51200e(-0xdb,-0xe5)]);if(_0x4a13d3[_0x1bba4a(-0x15f,-0xaf)](_0x343375,_0x31c196,_0x51d7d1[_0x51200e(-0x149,-0x8d)+'h'])){const _0x1af55a=_0x4a13d3[_0x1bba4a(-0xb9,-0xaf)](_0x5f14dc,_0x31c196,_0x51d7d1[_0x1bba4a(-0x199,-0x1e2)+'h']);(_0x1af55a[_0x1bba4a(-0x167,-0x128)]>0x0||_0x1af55a[_0x1bba4a(-0x72,-0x95)]>0x0)&&console[_0x51200e(-0x87,-0x35)]('[a2a]\x20Cons'+_0x1bba4a(-0x150,-0x195)+'\x20'+_0x1af55a[_0x51200e(-0xa9,0x2d)]+_0x51200e(-0x92,-0x38)+_0x1af55a[_0x1bba4a(-0x90,-0x95)]+'\x20conflicts'),_0x4add70['info'](_0x4a13d3['zCFKO'],{'merged':_0x1af55a['merged'],'conflicts':_0x1af55a['conflicts']});}}}catch(_0x37692e){_0x4add70['warn']('Consolidat'+_0x51200e(-0xe8,-0xc9),{'error':_0x4a13d3[_0x1bba4a(-0x40,-0xea)](_0x37692e,Error)?_0x37692e[_0x1bba4a(-0x201,-0x225)]:String(_0x37692e)});}try{const _0x161a10=_0x51d7d1[_0x1bba4a(-0x23b,-0x207)]??_0x51200e(0x7d,-0x30),_0x5b176a=_0x31c196[_0x1bba4a(-0x1e9,-0x16d)+'es']({'projectPath':_0x51d7d1[_0x1bba4a(-0x240,-0x1e2)+'h'],'limit':0x2710}),_0x254eb1=_0x5b176a[_0x1bba4a(-0x3f,-0x8e)],_0x21ec36=_0x4a13d3[_0x1bba4a(-0x13d,-0x16e)](_0x254eb1,0x0)?_0x4a13d3[_0x1bba4a(-0x1ed,-0x227)](_0x5b176a['reduce']((_0x579cae,_0x266ed9)=>_0x579cae+(_0x266ed9[_0x51200e(-0x50,-0x61)+'re']??0x0),0x0),_0x254eb1):0x0,_0x2cdc9a=_0x5b176a[_0x1bba4a(-0x11e,-0x1ec)](_0x47463e=>_0x47463e[_0x51200e(-0x26,-0x99)]==='semantic'&&(_0x47463e[_0x1bba4a(-0x167,-0x1b6)+'re']??0x0)>0.5&&_0x47463e[_0x51200e(0x147,0x7e)+'t']>0xa)[_0x1bba4a(0x4,-0x8e)],_0x1fa94d=_0x4a13d3[_0x51200e(-0x87,-0x4d)](_0x1fc859[_0x51200e(-0x4f,0x1e)]+_0x1fc859['update']+_0x1fc859[_0x51200e(-0x64,0x7b)],_0x1fc859[_0x51200e(-0xd0,-0x1c)]);_0x31c196['saveSessio'+_0x51200e(-0x1d,-0x92)]({'sessionId':_0x161a10,'extractionRate':_0x3c3a5f[_0x1bba4a(-0x102,-0x8e)]/Math[_0x51200e(-0x49,-0x1f)](0x1,_0x3c3a5f[_0x1bba4a(0x1f,-0x8e)]+0x1),'dedupRatio':_0x4a13d3[_0x1bba4a(-0x94,-0x155)](_0x1fa94d,0x0)?_0x4a13d3[_0x51200e(0x4d,0x5)](_0x1fc859[_0x1bba4a(-0x15b,-0x171)],_0x1fc859[_0x51200e(0x174,0xaa)])/_0x1fa94d:0x0,'avgQuality':_0x21ec36,'injectionEffectiveness':0x0,'hotTierCount':_0x2cdc9a,'totalMemories':_0x254eb1});}catch{}const _0x1f470f=performance['now'](),_0x15af38=Math['round'](_0x4a13d3['FDTlp'](_0x1f470f,_0x1ddad7)),_0x53e7ce=Math[_0x1bba4a(-0x1be,-0x15c)](_0x10be5b-_0x2be13e),_0xada649=Math[_0x51200e(0xa7,-0x7)](_0x4a13d3[_0x1bba4a(-0x1ef,-0x1bf)](_0x26c115,_0x54447e)),_0x32bafb=Math[_0x1bba4a(-0x1ac,-0x15c)](_0x4a13d3[_0x51200e(0x77,0xae)](_0x1f470f,_0x39af7d));process[_0x51200e(0x42,0x48)][_0x1bba4a(-0x23c,-0x1ad)]('[A2A]\x20Sess'+_0x1bba4a(-0x159,-0x14d)+_0x51200e(-0x85,-0x27)+_0x1bba4a(-0x11,-0xef)+_0x15af38+(_0x1bba4a(-0x223,-0x228)+_0x51200e(-0x110,-0x62))+_0x53e7ce+'ms,\x20sync:\x20'+_0xada649+('ms,\x20cleanu'+_0x51200e(-0x39,0x24))+_0x32bafb+_0x51200e(-0x7e,-0x65)),_0x4add70[_0x51200e(0x8c,0xbf)](_0x1bba4a(-0x1d,-0x88)+_0x51200e(-0xd0,-0x5d),{'durationMs':_0x15af38});}else _0x1d537a[_0x1bba4a(-0x190,-0x18a)](_0x1bba4a(-0xbf,-0x9b)+_0x1bba4a(-0xf,-0xf0)+_0x4427cc['errors'][_0x51200e(0x9a,0xdc)](',\x20'));}finally{_0x4add70[_0x51200e(0xfd,0x5d)]();}}function _0x4827(_0x237ead,_0x4e48ec){_0x237ead=_0x237ead-0xcc;const _0x4775d5=_0x4775();let _0x4827a9=_0x4775d5[_0x237ead];if(_0x4827['lbftJu']===undefined){var _0x4b9d94=function(_0x38e335){const _0x5a01e0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x177944='',_0x580279='';for(let _0x171587=0x0,_0x502602,_0x15bc8b,_0x4bcf3d=0x0;_0x15bc8b=_0x38e335['charAt'](_0x4bcf3d++);~_0x15bc8b&&(_0x502602=_0x171587%0x4?_0x502602*0x40+_0x15bc8b:_0x15bc8b,_0x171587++%0x4)?_0x177944+=String['fromCharCode'](0xff&_0x502602>>(-0x2*_0x171587&0x6)):0x0){_0x15bc8b=_0x5a01e0['indexOf'](_0x15bc8b);}for(let _0x1d537a=0x0,_0x4427cc=_0x177944['length'];_0x1d537a<_0x4427cc;_0x1d537a++){_0x580279+='%'+('00'+_0x177944['charCodeAt'](_0x1d537a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x580279);};_0x4827['sCPRTF']=_0x4b9d94,_0x4827['wcmSGG']={},_0x4827['lbftJu']=!![];}const _0x41af03=_0x4775d5[0x0],_0x2f4086=_0x237ead+_0x41af03,_0x3bf994=_0x4827['wcmSGG'][_0x2f4086];return!_0x3bf994?(_0x4827a9=_0x4827['sCPRTF'](_0x4827a9),_0x4827['wcmSGG'][_0x2f4086]=_0x4827a9):_0x4827a9=_0x3bf994,_0x4827a9;}async function extractSessionMemories(_0x5bb720,_0x199c67,_0x2384b2,_0xac904a,_0x56a827,_0xd9c8a9){function _0x2bf9f9(_0x1402bb,_0x530bac){return _0x4827(_0x1402bb-0x198,_0x530bac);}const _0x3d3c6b={'zlzab':function(_0x3f292e,_0x18afeb,_0x49bde1){return _0x3f292e(_0x18afeb,_0x49bde1);},'OtqOf':_0x42e751(0x445,0x4f6)+_0x2bf9f9(0x41a,0x3f1),'GnAmN':function(_0x10519f,_0x1b5876,_0xb8bb58){return _0x10519f(_0x1b5876,_0xb8bb58);},'dFeyr':function(_0x4bfa1a,_0x31916b){return _0x4bfa1a(_0x31916b);},'jFagW':function(_0x1c4ead,_0x4a55dd){return _0x1c4ead===_0x4a55dd;},'fRxRu':_0x2bf9f9(0x2f1,0x3a4)+_0x42e751(0x5f8,0x5ff)+'nd','gOWgj':_0x42e751(0x50d,0x588)+_0x42e751(0x562,0x501)+_0x42e751(0x48f,0x44e),'HDYVj':function(_0x2c6895,_0x47f1c6){return _0x2c6895<=_0x47f1c6;},'qXWLc':_0x2bf9f9(0x293,0x284)+_0x42e751(0x4d2,0x4cc)+_0x2bf9f9(0x2c8,0x20e)+'raction','hwqPY':function(_0x1c7558,_0x3ea69d){return _0x1c7558===_0x3ea69d;},'vsIDC':_0x42e751(0x55b,0x5aa),'KGLkc':_0x42e751(0x46e,0x402),'yrdJW':_0x42e751(0x5a3,0x574)+_0x42e751(0x555,0x4dc),'UczsP':function(_0x1c7160,_0x574a10,_0x1ba418,_0x4f19ce){return _0x1c7160(_0x574a10,_0x1ba418,_0x4f19ce);},'ugFtD':'learning','NInBK':_0x42e751(0x59a,0x5c3)+_0x2bf9f9(0x310,0x3c1),'gnZmg':_0x42e751(0x5fa,0x626)+_0x42e751(0x5bd,0x69b)+_0x2bf9f9(0x30e,0x3da)+_0x2bf9f9(0x298,0x239),'yxBAT':function(_0x21142b,_0x251ec2){return _0x21142b instanceof _0x251ec2;},'vlDgr':_0x42e751(0x580,0x61e),'dCKqn':_0x42e751(0x546,0x5e0)+_0x42e751(0x4fa,0x58b)+_0x2bf9f9(0x2cb,0x216),'PnikI':_0x2bf9f9(0x26b,0x2a2),'paTFO':_0x42e751(0x455,0x39a),'tLHop':_0x2bf9f9(0x2af,0x36e),'Muvqp':function(_0x518dd6,_0x252891){return _0x518dd6!==_0x252891;},'padmz':_0x42e751(0x500,0x51f)+_0x2bf9f9(0x39c,0x313)+'s','faqgN':function(_0x296557,_0x6d470a,_0x1b043a){return _0x296557(_0x6d470a,_0x1b043a);},'vZRHf':_0x42e751(0x5e7,0x575),'VeAxE':function(_0x47eecd,_0x315c9b){return _0x47eecd>_0x315c9b;},'RvPRf':function(_0x1f6cfe,_0x1370dc){return _0x1f6cfe+_0x1370dc;},'QgKqC':_0x2bf9f9(0x403,0x3cd),'LLeuQ':'../embeddi'+_0x2bf9f9(0x313,0x379)+'s','HMqIq':function(_0xff3b58,_0x289b53,_0x50f329){return _0xff3b58(_0x289b53,_0x50f329);},'TYyQw':function(_0x54a138,_0x48a10e){return _0x54a138>_0x48a10e;},'TQBwT':function(_0x150cf1,_0x1cdce5){return _0x150cf1<_0x1cdce5;},'qOKfL':'Embeddings'+_0x42e751(0x51f,0x4dd),'Rovbc':function(_0x37fe72,_0x1b9a12){return _0x37fe72>_0x1b9a12;},'xDBwL':_0x42e751(0x45d,0x3a3),'vBhJF':_0x42e751(0x506,0x447)+_0x42e751(0x5c8,0x612)+'s','LMlgH':_0x2bf9f9(0x3e4,0x446)+'uation\x20fai'+_0x2bf9f9(0x392,0x459)};function _0x42e751(_0x5b683c,_0x5d1183){return _0x4827(_0x5b683c-0x369,_0x5d1183);}const _0x392622=_0x3d3c6b['dFeyr'](findSessionFiles,_0x5bb720['projectPat'+'h']);if(_0x3d3c6b[_0x42e751(0x463,0x423)](_0x392622[_0x2bf9f9(0x413,0x4a6)],0x0)){_0xac904a['info'](_0x3d3c6b[_0x42e751(0x4f7,0x566)]);return;}const _0x50e419=_0x392622[_0x2bf9f9(0x3a0,0x483)]((_0x80ff52,_0x4d8fd0)=>_0x4d8fd0[_0x42e751(0x4aa,0x3f3)]-_0x80ff52[_0x42e751(0x4aa,0x3c8)])[0x0],_0x73dd76=parseSessionFile(_0x50e419[_0x42e751(0x5c4,0x52d)]),_0x3c173f=_0x73dd76['filter'](_0x2a3dd1=>Array[_0x42e751(0x59f,0x631)](_0x2a3dd1[_0x42e751(0x44d,0x3cd)][_0x42e751(0x4b5,0x48b)])&&_0x2a3dd1['message'][_0x42e751(0x4b5,0x4e1)]['some'](_0x448815=>_0x448815['type']==='tool_use'))[_0x2bf9f9(0x413,0x3a8)];_0xac904a[_0x42e751(0x5dc,0x651)]('Session\x20an'+_0x2bf9f9(0x28d,0x313),{'messages':_0x73dd76[_0x42e751(0x5e4,0x68d)],'toolUseCount':_0x3c173f});if(_0x3c173f<_0x199c67[_0x2bf9f9(0x3c0,0x414)+'mary']['minActions']){_0xac904a[_0x42e751(0x5dc,0x5e4)](_0x3d3c6b[_0x42e751(0x5aa,0x546)],{'toolUseCount':_0x3c173f,'threshold':_0x199c67['sessionSum'+_0x2bf9f9(0x3d8,0x49f)][_0x2bf9f9(0x2c5,0x292)]});return;}const _0x23d6af=_0x2384b2[_0x2bf9f9(0x3d5,0x3b4)](_0x50e419['sessionId']),_0x57f408=_0x23d6af?.['messageCou'+'nt']??0x0;if(_0x23d6af&&_0x3d3c6b[_0x2bf9f9(0x357,0x27e)](_0x73dd76[_0x2bf9f9(0x413,0x33b)],_0x57f408)){_0xac904a[_0x2bf9f9(0x40b,0x4b5)](_0x3d3c6b['qXWLc'],{'sessionId':_0x50e419[_0x2bf9f9(0x29a,0x289)],'previousCount':_0x57f408,'currentCount':_0x73dd76[_0x42e751(0x5e4,0x68e)]});return;}const _0x502e8f=_0x23d6af?_0x73dd76['slice'](_0x57f408):_0x73dd76;_0xac904a[_0x42e751(0x5dc,0x642)](_0x42e751(0x4da,0x405)+_0x2bf9f9(0x3c1,0x41a),{'total':_0x73dd76['length'],'new':_0x502e8f[_0x42e751(0x5e4,0x5ef)],'incremental':!!_0x23d6af});let _0x3e9d90;if(_0x199c67['llm']?.[_0x42e751(0x4ac,0x4f0)]){if(_0x3d3c6b['hwqPY'](_0x3d3c6b[_0x42e751(0x54f,0x4d8)],_0x3d3c6b[_0x42e751(0x4ec,0x416)]))_0x32cef0['error'](_0x2bf9f9(0x299,0x25e)+'ned\x20up\x20'+_0xca80a0['total']+(_0x42e751(0x5ad,0x53d)+'(')+_0x2d1164[_0x42e751(0x4a2,0x412)]+'\x20expired,\x20'+_0x147d4a[_0x42e751(0x47b,0x40b)]+(_0x42e751(0x47d,0x3cd)+_0x2bf9f9(0x38e,0x32f)));else try{const {createLLMClient:_0x448d72}=await import(_0x3d3c6b[_0x2bf9f9(0x385,0x458)]),_0x5861e6=_0x448d72(_0x199c67[_0x42e751(0x4d9,0x493)]);_0x3e9d90=await _0x3d3c6b[_0x2bf9f9(0x32c,0x3ee)](extractMemoriesWithLLM,_0x502e8f,_0x5bb720[_0x2bf9f9(0x2bf,0x392)+'h'],_0x5861e6);const _0x498722=await _0x3d3c6b[_0x2bf9f9(0x328,0x3e3)](summarizeSession,_0x502e8f,_0x5861e6);_0x498722&&_0x498722[_0x42e751(0x5e4,0x539)]>0xa&&_0x3e9d90[_0x42e751(0x59e,0x62f)]['push']({'content':_0x498722,'category':_0x3d3c6b[_0x2bf9f9(0x3e6,0x3f8)],'tier':_0x42e751(0x5c5,0x54e),'tags':[_0x3d3c6b[_0x2bf9f9(0x30f,0x310)]],'projectPath':_0x5bb720[_0x42e751(0x490,0x4eb)+'h']});}catch(_0x196395){_0xac904a[_0x2bf9f9(0x304,0x304)](_0x3d3c6b[_0x2bf9f9(0x395,0x2fe)],{'error':_0x3d3c6b[_0x42e751(0x55a,0x62d)](_0x196395,Error)?_0x196395[_0x42e751(0x44d,0x4ae)]:String(_0x196395)}),_0x3e9d90=extractMemories(_0x502e8f,_0x5bb720[_0x42e751(0x490,0x492)+'h']);}}else _0x3e9d90=_0x3d3c6b[_0x42e751(0x497,0x431)](extractMemories,_0x502e8f,_0x5bb720[_0x2bf9f9(0x2bf,0x20c)+'h']);_0xac904a[_0x2bf9f9(0x40b,0x3ae)]('Memories\x20e'+'xtracted',{'count':_0x3e9d90['memories'][_0x2bf9f9(0x413,0x3a3)]});const _0x21bff2=new DedupManager(),_0x502fc5=_0x2384b2[_0x2bf9f9(0x334,0x2f2)+'es']({'projectPath':_0x5bb720[_0x42e751(0x490,0x489)+'h'],'limit':0xc8});let _0x59a268={'add':0x0,'update':0x0,'delete':0x0,'noop':0x0};for(const _0x24dfda of _0x3e9d90['memories']){const _0x13f918=_0x21bff2['findCandid'+'ates'](_0x502fc5,_0x24dfda[_0x42e751(0x54e,0x524)],_0x5bb720[_0x2bf9f9(0x2bf,0x1e7)+'h']),_0x132808=_0x21bff2[_0x2bf9f9(0x26c,0x2d2)](_0x24dfda['content'],_0x13f918);let _0x203516;switch(_0x132808[_0x2bf9f9(0x33f,0x365)]){case _0x2bf9f9(0x33e,0x3a8):_0x59a268[_0x2bf9f9(0x330,0x305)]++,_0xac904a[_0x42e751(0x5dc,0x58d)](_0x2bf9f9(0x30d,0x303)+'pped\x20(dupl'+_0x2bf9f9(0x33b,0x3d4),{'similarity':_0x132808['similarity'],'category':_0x24dfda[_0x42e751(0x54e,0x587)]});continue;case _0x3d3c6b[_0x2bf9f9(0x2d3,0x2dc)]:if(_0x132808[_0x42e751(0x507,0x525)+'ry']){const _0x3564a9=_0x21bff2[_0x42e751(0x52a,0x596)+'nt'](_0x132808[_0x2bf9f9(0x336,0x382)+'ry'][_0x2bf9f9(0x2e4,0x31f)],_0x24dfda[_0x42e751(0x4b5,0x483)]);_0x2384b2['updateMemo'+'ry'](_0x132808[_0x2bf9f9(0x336,0x37c)+'ry']['id'],{'content':_0x3564a9,'tags':[...new Set([..._0x132808['targetMemo'+'ry'][_0x42e751(0x5ba,0x547)]||[],..._0x24dfda[_0x42e751(0x5ba,0x535)]||[]])]}),_0x203516=_0x132808[_0x2bf9f9(0x336,0x25c)+'ry']['id'],_0x59a268['update']++,_0xac904a['info'](_0x3d3c6b['dCKqn'],{'memoryId':_0x203516,'similarity':_0x132808[_0x42e751(0x4cf,0x4e1)]});}break;case _0x3d3c6b['PnikI']:{_0x132808[_0x42e751(0x507,0x464)+'ry']&&(_0x2384b2[_0x42e751(0x532,0x54e)+'ry'](_0x132808[_0x2bf9f9(0x336,0x310)+'ry']['id'],{'invalidAt':new Date()['toISOStrin'+'g']()}),_0xac904a[_0x42e751(0x5dc,0x581)](_0x42e751(0x43b,0x468)+_0x42e751(0x5a5,0x555)+_0x42e751(0x548,0x5f3),{'memoryId':_0x132808['targetMemo'+'ry']['id']}));_0x59a268[_0x2bf9f9(0x3c7,0x42f)]++;const _0x1f1d0c=_0x2384b2[_0x42e751(0x4ba,0x4f4)+'ry']({..._0x24dfda,'sessionId':_0x50e419['sessionId']});_0x2384b2[_0x2bf9f9(0x3ab,0x338)+_0x42e751(0x4cc,0x4fa)](_0x1f1d0c['id'],null,_0x2bf9f9(0x2af,0x2f8)),_0x203516=_0x1f1d0c['id'],_0x56a827['push'](_0x1f1d0c['id']);break;}case _0x3d3c6b[_0x2bf9f9(0x42a,0x504)]:default:{const _0x49c260=_0x2384b2[_0x42e751(0x4ba,0x459)+'ry']({..._0x24dfda,'sessionId':_0x50e419[_0x2bf9f9(0x29a,0x1bc)]});_0x2384b2['setSyncSta'+_0x42e751(0x4cc,0x4db)](_0x49c260['id'],null,_0x3d3c6b[_0x2bf9f9(0x341,0x38f)]),_0x203516=_0x49c260['id'],_0x56a827[_0x2bf9f9(0x300,0x2d4)](_0x49c260['id']),_0x59a268['add']++;break;}}if(_0x203516)try{if(_0x3d3c6b['Muvqp'](_0x42e751(0x533,0x5b7),_0x42e751(0x5e1,0x67f))){const {scoreQuality:_0x5cd23f}=await import(_0x3d3c6b[_0x42e751(0x527,0x5d1)]),_0x2b636d=_0x2384b2[_0x42e751(0x553,0x5f2)](_0x203516);if(_0x2b636d){const _0x2f0f98=_0x3d3c6b[_0x42e751(0x46f,0x505)](_0x5cd23f,_0x2b636d,_0x199c67[_0x2bf9f9(0x2d4,0x338)]??{'ttlDays':0x5a,'maxMemories':0x3e8,'cleanupOnSessionEnd':!![],'qualityThreshold':0.3});_0x2384b2[_0x2bf9f9(0x361,0x2e3)+'ry'](_0x203516,{'qualityScore':_0x2f0f98[_0x2bf9f9(0x2b8,0x32a)]});}}else _0x1b6ecd[_0x42e751(0x4e8,0x4a8)]('[a2a]\x20Prof'+_0x42e751(0x4a6,0x461)+_0xb6d0[_0x42e751(0x4b5,0x423)][_0x42e751(0x439,0x3f5)]('\x0a')[0x0][_0x2bf9f9(0x2fc,0x24a)](0x0,0x32)+_0x2bf9f9(0x401,0x486)+_0x4cc08a[_0x2bf9f9(0x3a3,0x486)+'vel']+_0x42e751(0x45b,0x460)+_0x30f58c[_0x2bf9f9(0x2cd,0x308)]);}catch{}}if(_0xd9c8a9){if(_0x42e751(0x4f2,0x534)!==_0x3d3c6b[_0x2bf9f9(0x38b,0x434)])_0xd9c8a9[_0x42e751(0x53b,0x5af)]=_0x59a268['add'],_0xd9c8a9[_0x42e751(0x5c7,0x4e5)]=_0x59a268[_0x42e751(0x5c7,0x667)],_0xd9c8a9[_0x2bf9f9(0x3c7,0x3b7)]=_0x59a268[_0x2bf9f9(0x3c7,0x415)],_0xd9c8a9[_0x2bf9f9(0x330,0x377)]=_0x59a268[_0x42e751(0x501,0x42e)];else{const _0xf6f8c0=_0x3d3c6b[_0x2bf9f9(0x328,0x3bc)](_0x5a04b5,_0x11d2e3,_0x144fa9[_0x2bf9f9(0x2d4,0x2f9)]??{'ttlDays':0x5a,'maxMemories':0x3e8,'cleanupOnSessionEnd':!![],'qualityThreshold':0.3});_0x42f4cd[_0x42e751(0x532,0x5f4)+'ry'](_0xe61020,{'qualityScore':_0xf6f8c0[_0x2bf9f9(0x2b8,0x23c)]});}}if(_0x3d3c6b[_0x2bf9f9(0x297,0x2f7)](_0x3d3c6b['RvPRf'](_0x59a268[_0x2bf9f9(0x330,0x353)]+_0x59a268[_0x42e751(0x5c7,0x60b)],_0x59a268[_0x42e751(0x598,0x562)]),0x0)){if(_0x3d3c6b[_0x2bf9f9(0x292,0x2e1)](_0x2bf9f9(0x3a8,0x388),_0x3d3c6b[_0x2bf9f9(0x3da,0x357)])){const _0x3c0421=_0xf4e337?_0x3d3c6b[_0x42e751(0x460,0x474)]:'';_0x4bd7a8['error'](_0x42e751(0x502,0x5bd)+'ion\x20summar'+'y'+_0x3c0421+':\x20'+_0x5a8a59['memories']['length']+(_0x2bf9f9(0x3dc,0x3ad)+_0x2bf9f9(0x31f,0x2de)+_0x2bf9f9(0x27f,0x1ce))+_0x58880b[_0x42e751(0x5e4,0x6b8)]+_0x2bf9f9(0x3c1,0x483));}else console['error']('[a2a]\x20Dedu'+'p:\x20'+_0x59a268['add']+_0x42e751(0x47e,0x42f)+_0x59a268[_0x2bf9f9(0x3f6,0x4d1)]+'\x20merged,\x20'+_0x59a268[_0x42e751(0x598,0x641)]+(_0x42e751(0x4c9,0x4d1)+'\x20')+_0x59a268[_0x42e751(0x501,0x54e)]+_0x2bf9f9(0x426,0x4ee));}if(_0x199c67[_0x42e751(0x4c1,0x52a)]?.[_0x2bf9f9(0x2db,0x284)]&&_0x56a827[_0x42e751(0x5e4,0x65c)]>0x0)try{const {createEmbeddingProvider:_0x28a8ac}=await import(_0x3d3c6b[_0x42e751(0x57d,0x4ce)]),_0x3e669e=_0x3d3c6b['HMqIq'](_0x28a8ac,_0x199c67[_0x2bf9f9(0x2f0,0x35c)],_0x199c67['llm']),_0x3b0182=_0x56a827[_0x2bf9f9(0x3fe,0x4e1)](_0x55b2aa=>{function _0x2a3cb9(_0x2066f9,_0x2377ea){return _0x42e751(_0x2066f9- -0x54a,_0x2377ea);}function _0x195c09(_0x459487,_0x2b0e56){return _0x42e751(_0x459487- -0x112,_0x2b0e56);}const _0x5c884f=_0x2384b2[_0x2a3cb9(0x9,0x36)](_0x55b2aa);return _0x5c884f?_0x5c884f[_0x2a3cb9(-0x95,-0x8d)]:'';})[_0x2bf9f9(0x2b5,0x299)](Boolean);if(_0x3d3c6b[_0x42e751(0x4af,0x51e)](_0x3b0182[_0x42e751(0x5e4,0x618)],0x0)){if(_0x2bf9f9(0x3b3,0x340)!==_0x2bf9f9(0x3b3,0x37a))_0x5755ae[_0x42e751(0x4d5,0x4b0)](_0x42e751(0x5f4,0x6cf)+_0x42e751(0x523,0x464)+_0x42e751(0x511,0x45c)+_0x42e751(0x563,0x636),{'error':_0x3c7b5c});else{const _0x180386=await Promise[_0x2bf9f9(0x399,0x31c)](_0x3e669e[_0x42e751(0x5da,0x639)](_0x3b0182));for(let _0x2c3378=0x0;_0x3d3c6b['TQBwT'](_0x2c3378,_0x56a827[_0x42e751(0x5e4,0x625)]);_0x2c3378++){_0x180386[_0x2c3378]&&_0x2384b2[_0x2bf9f9(0x2dd,0x201)+'ing'](_0x56a827[_0x2c3378],_0x180386[_0x2c3378]);}_0xac904a['info'](_0x3d3c6b[_0x2bf9f9(0x2e6,0x231)],{'count':_0x3b0182[_0x2bf9f9(0x413,0x4b2)],'provider':_0x199c67['embedding'][_0x42e751(0x51b,0x57a)]});}}}catch(_0x2e8a13){_0xac904a['warn'](_0x42e751(0x531,0x488)+_0x2bf9f9(0x3c6,0x336)+'ed',{'error':_0x3d3c6b[_0x42e751(0x55a,0x573)](_0x2e8a13,Error)?_0x2e8a13[_0x42e751(0x44d,0x48a)]:String(_0x2e8a13)});}_0x2384b2[_0x2bf9f9(0x40d,0x422)+'n'](_0x50e419[_0x42e751(0x46b,0x3d2)],_0x5bb720['projectPat'+'h'],_0x73dd76['length']);if(_0x3d3c6b['Rovbc'](_0x3e9d90[_0x2bf9f9(0x3cd,0x30a)][_0x2bf9f9(0x413,0x474)],0x0)){if(_0x42e751(0x5b9,0x643)===_0x3d3c6b[_0x42e751(0x5bf,0x66c)])_0x4c23fa=_0x3d3c6b[_0x2bf9f9(0x2c6,0x218)](_0x540b79,_0x28f10f,_0x3240d0[_0x2bf9f9(0x2bf,0x35e)+'h']);else{const _0x27ab85=_0x23d6af?_0x3d3c6b[_0x42e751(0x460,0x40c)]:'';console[_0x42e751(0x4e8,0x4f6)](_0x42e751(0x502,0x59a)+_0x2bf9f9(0x3b6,0x42a)+'y'+_0x27ab85+':\x20'+_0x3e9d90[_0x42e751(0x59e,0x5d1)][_0x2bf9f9(0x413,0x3b3)]+(_0x42e751(0x5ad,0x577)+_0x42e751(0x4f0,0x530)+'from\x20')+_0x502e8f[_0x2bf9f9(0x413,0x4ce)]+_0x42e751(0x592,0x53b));}}if(_0x199c67['skillConve'+_0x42e751(0x530,0x562)]?.[_0x2bf9f9(0x2db,0x311)])try{const _0x1ed15a=_0x2384b2[_0x42e751(0x5a6,0x550)+_0x2bf9f9(0x289,0x1e0)](_0x5bb720['projectPat'+'h']);if(_0x1ed15a>0x0&&_0x1ed15a%_0x199c67[_0x2bf9f9(0x2c3,0x2f4)+_0x2bf9f9(0x35f,0x302)]['evaluation'+_0x2bf9f9(0x2e3,0x23d)]===0x0){const {SkillEvaluator:_0x21d8e5}=await import(_0x3d3c6b['vBhJF']),_0x53e6e2=new _0x21d8e5(_0x2384b2,_0x199c67),_0x35cc0b=_0x3d3c6b[_0x42e751(0x569,0x537)](createHookClient,_0x199c67,0x2710)??undefined,_0x3c1776=await _0x53e6e2['evaluate'](_0x5bb720['projectPat'+'h'],_0x35cc0b);_0x3c1776[_0x42e751(0x5d0,0x56b)]>0x0&&console[_0x42e751(0x4e8,0x4ba)](_0x2bf9f9(0x2b4,0x356)+_0x2bf9f9(0x2a6,0x2d7)+'ization:\x20'+_0x3c1776[_0x2bf9f9(0x3ff,0x437)]+(_0x42e751(0x48c,0x4ab)+_0x42e751(0x539,0x5a7)));}}catch(_0x5b862e){_0xac904a['warn'](_0x3d3c6b[_0x42e751(0x54c,0x613)],{'error':_0x5b862e instanceof Error?_0x5b862e[_0x42e751(0x44d,0x4ea)]:String(_0x5b862e)});}}async function trackProficiencyLocal(_0xd7b7e1,_0x45c4a0,_0x16c1b1,_0x893ce7,_0x4796f8){const _0x3f88eb={'SvAWQ':function(_0x3702e4,_0x498914,_0x5ee8b1){return _0x3702e4(_0x498914,_0x5ee8b1);},'kBMuS':_0x4eefef(-0x2a7,-0x1fc)+_0x4eefef(-0xab,-0x7e)+_0x4eefef(-0x29b,-0x215),'nXkIA':function(_0x5799f3,_0x503f2a){return _0x5799f3(_0x503f2a);}},_0x4d7ddd=[];function _0x4eefef(_0x374737,_0x8e0011){return _0x4827(_0x8e0011- -0x304,_0x374737);}function _0x50c121(_0x2673c6,_0x258fce){return _0x4827(_0x258fce-0x130,_0x2673c6);}try{const {ProficiencyTracker:_0x42b16c}=await import(_0x50c121(0x22d,0x306)+'ency/track'+_0x50c121(0x3ba,0x2f2)),{detectSkillPractice:_0x36d8b1}=await import(_0x4eefef(-0x1de,-0x12e)+_0x50c121(0x33e,0x27d)+_0x50c121(0x2ee,0x34c)),_0x557ad2=new _0x42b16c(_0x16c1b1,_0x45c4a0['proficienc'+'y']),_0x156926=_0x16c1b1[_0x50c121(0x1ec,0x2cc)+'es']({'category':_0x50c121(0x3f0,0x375),'limit':0x64}),_0x2187fb=_0x4796f8[_0x4eefef(-0x10e,-0x9e)](_0x4fac1a=>{const _0x338043=_0x16c1b1[_0x3672bb(0x41f,0x393)](_0x4fac1a);if(!_0x338043)return null;function _0x3672bb(_0x3dfcbe,_0x207599){return _0x4eefef(_0x3dfcbe,_0x207599-0x4ad);}const _0x51b99f=_0x16c1b1['getEmbeddi'+'ng'](_0x4fac1a);function _0x27c50a(_0x3febe4,_0x5c9be3){return _0x4eefef(_0x5c9be3,_0x3febe4-0x3ea);}return{'content':_0x338043[_0x27c50a(0x232,0x20a)],'tags':_0x338043[_0x3672bb(0x336,0x3fa)]??[],'embedding':_0x51b99f??undefined};})[_0x4eefef(-0x167,-0x1e7)](_0x3549bc=>_0x3549bc!==null);for(const _0xbb32f1 of _0x156926){const _0x4c5f03={'id':_0xbb32f1['id'],'content':_0xbb32f1['content'],'tags':_0xbb32f1[_0x50c121(0x41e,0x381)]??[],'embedding':_0xbb32f1[_0x50c121(0x2a5,0x288)]??_0x16c1b1[_0x4eefef(-0x202,-0x21b)+'ng'](_0xbb32f1['id'])??undefined},_0x318cec=_0x3f88eb[_0x50c121(0x346,0x2e8)](_0x36d8b1,_0x4c5f03,_0x2187fb);if(!_0x318cec)continue;const _0x1ebd8e=_0x557ad2[_0x50c121(0x381,0x2fe)+'tice'](_0xbb32f1['id'],_0x318cec['outcome'],_0x318cec[_0x50c121(0x3b4,0x309)],_0x318cec[_0x4eefef(-0xdd,-0x1c0)+'s'],_0xd7b7e1[_0x50c121(0x260,0x232)]);_0x1ebd8e['levelChang'+'ed']&&console[_0x4eefef(-0x150,-0x185)](_0x50c121(0x1e5,0x206)+_0x50c121(0x1a7,0x26d)+_0xbb32f1[_0x50c121(0x279,0x27c)][_0x50c121(0x1f5,0x200)]('\x0a')[0x0][_0x50c121(0x262,0x294)](0x0,0x32)+_0x50c121(0x3eb,0x399)+_0x1ebd8e[_0x50c121(0x3f5,0x33b)+_0x50c121(0x33a,0x2e1)]+_0x4eefef(-0x1f2,-0x212)+_0x1ebd8e[_0x4eefef(-0x235,-0x1cf)]),_0x4d7ddd['push']({'skillMemoryId':_0xbb32f1['id'],'outcome':_0x318cec[_0x4eefef(-0x17a,-0x20c)],'difficulty':_0x318cec[_0x4eefef(-0x18b,-0x12b)],'contextTags':_0x318cec[_0x4eefef(-0x19a,-0x1c0)+'s']});}}catch(_0x283408){_0x893ce7['warn'](_0x3f88eb[_0x4eefef(-0x160,-0x8a)],{'error':_0x283408 instanceof Error?_0x283408[_0x50c121(0x139,0x214)]:_0x3f88eb[_0x4eefef(-0xbe,-0x124)](String,_0x283408)});}return _0x4d7ddd;}async function pushProficiencyToServer(_0x38b7d5,_0x50653b,_0x2a769b,_0x3121f2){const _0x46c5b1={'eJMaa':function(_0x470973,_0x592b01){return _0x470973(_0x592b01);},'YXEnH':_0x5b25fa(-0xdc,-0x18b)+_0x324065(0x68,-0x38)+_0x5b25fa(-0x11d,-0x162),'HgNeT':function(_0x5484ba,_0x224351){return _0x5484ba instanceof _0x224351;},'POsfa':function(_0x7e5111,_0x478b9a){return _0x7e5111(_0x478b9a);}};function _0x324065(_0x3714b0,_0x348b3f){return _0x4827(_0x348b3f- -0x2bb,_0x3714b0);}function _0x5b25fa(_0x4fcc43,_0x59a9f1){return _0x4827(_0x59a9f1- -0x293,_0x4fcc43);}try{const _0x27c72e=_0x46c5b1[_0x5b25fa(-0x139,-0x16b)](createHookClient,_0x2a769b);if(!_0x27c72e)return;const _0x5c938a=await _0x27c72e['testConnec'+_0x324065(-0xb0,-0xa5)]();if(!_0x5c938a)return;await _0x27c72e[_0x5b25fa(-0x20a,-0x1b8)+_0x324065(-0x8a,-0x2f)+_0x324065(-0x126,-0xfe)](_0x38b7d5[_0x5b25fa(0x57,-0x2d)](_0x3653bc=>({'skill_memory_id':_0x3653bc[_0x324065(-0x189,-0xec)+_0x324065(-0x9a,-0x33)],'outcome':_0x3653bc[_0x5b25fa(-0x13d,-0x19b)],'difficulty':_0x3653bc['difficulty'],'context_tags':_0x3653bc[_0x324065(-0x243,-0x177)+'s'],'session_id':_0x50653b[_0x324065(-0xea,-0x1b9)]}))),_0x3121f2[_0x324065(-0xbf,-0x48)](_0x324065(-0x1c2,-0x1b3)+_0x324065(-0xc3,-0x10d)+'atch-pushe'+_0x5b25fa(-0xb2,-0x15b)+'r',{'count':_0x38b7d5['length']}),console['error'](_0x324065(-0x1c8,-0x1e5)+'iciency:\x20'+_0x38b7d5['length']+('\x20event(s)\x20'+_0x5b25fa(-0x1ca,-0x1b4)+_0x5b25fa(-0xdf,-0xf)+'er'));}catch(_0x5370ed){_0x3121f2['warn'](_0x46c5b1['YXEnH'],{'error':_0x46c5b1[_0x324065(-0xca,-0x160)](_0x5370ed,Error)?_0x5370ed['message']:_0x46c5b1[_0x5b25fa(-0x159,-0x90)](String,_0x5370ed)});}}async function flushEmotionBuffer(_0x5179c3,_0x2cde8f,_0x6ff7f4){const _0x2ac1ae={'ucVuO':function(_0x264e0f,_0x4476ad){return _0x264e0f===_0x4476ad;},'RvXBS':function(_0x3acb7e,_0x435b1a){return _0x3acb7e(_0x435b1a);},'dosKi':_0x5ce44f(-0x13a,-0x117)+'ffer\x20flush'+'ed'},_0x227602=_0x2cde8f[_0x5ce44f(-0xf1,-0x92)+_0x4a2bac(-0xa7,-0x12f)+_0x5ce44f(0xa1,0x6)](_0x5179c3[_0x5ce44f(-0x6,-0x95)+_0x5ce44f(-0x118,-0xd5)]?.[_0x4a2bac(0xaa,0x9e)+_0x4a2bac(0xd,-0x45)]??0xa);if(_0x2ac1ae[_0x5ce44f(0x1e,0x10)](_0x227602[_0x5ce44f(-0xa,0x8c)],0x0))return;const _0x18d94c=_0x2ac1ae[_0x4a2bac(0xc0,0x175)](createHookClient,_0x5179c3);if(!_0x18d94c)return;function _0x5ce44f(_0x32fae2,_0x30e71b){return _0x4827(_0x30e71b- -0x1ef,_0x32fae2);}const _0x558642=await _0x18d94c['testConnec'+_0x4a2bac(0x9e,0x115)]();if(!_0x558642)return;const _0x339394=[];function _0x4a2bac(_0x2c34db,_0x55b006){return _0x4827(_0x2c34db- -0x178,_0x55b006);}for(const {id:_0x268fc9,message:_0x2977dd}of _0x227602){try{await _0x18d94c['analyzeEmo'+_0x5ce44f(-0xba,0x27)](_0x2977dd),_0x339394['push'](_0x268fc9);}catch{}}_0x339394['length']>0x0&&(_0x2cde8f['markEmotio'+_0x5ce44f(-0x133,-0xb9)+'ynced'](_0x339394),_0x2cde8f[_0x4a2bac(0x8a,0x11e)+'cedEmotion'+_0x4a2bac(0x91,0xe9)](),console[_0x5ce44f(-0x12d,-0x70)](_0x4a2bac(0xe1,0x44)+_0x5ce44f(0xef,0x59)+_0x339394['length']+(_0x5ce44f(-0x39,-0xce)+_0x5ce44f(-0xdf,-0xf1))),_0x6ff7f4[_0x4a2bac(0xfb,0x1bb)](_0x2ac1ae['dosKi'],{'sent':_0x339394[_0x5ce44f(0x5,0x8c)],'total':_0x227602[_0x4a2bac(0x103,0x19c)]}));}async function reinforceInjectedMemories(_0x463dd9,_0x32b831,_0x3b80f1,_0x1268a5){const _0x4502f4={'IzLvg':function(_0x27ce05,_0x415959){return _0x27ce05(_0x415959);},'tgYbL':_0x221ee2(-0x21e,-0x17e)+_0x4b75b5(0x4ea,0x51d)+_0x4b75b5(0x401,0x345)};function _0x4b75b5(_0x5c10e2,_0x3e397c){return _0x4827(_0x5c10e2-0x2cd,_0x3e397c);}if(_0x463dd9[_0x221ee2(-0x182,-0x168)]===0x0)return;const _0x24d09f=_0x4502f4['IzLvg'](createHookClient,_0x3b80f1);if(!_0x24d09f)return;const _0x29e798=_0x463dd9[_0x4b75b5(0x533,0x5c4)](async _0x10e0dd=>{const _0x729982=_0x32b831['getSyncSta'+_0x529c41(0x9d,0xd2)](_0x10e0dd);function _0x4fb0f8(_0x377b60,_0x3b0523){return _0x221ee2(_0x3b0523,_0x377b60-0x93);}function _0x529c41(_0x26790f,_0xeb72dd){return _0x221ee2(_0x26790f,_0xeb72dd-0x352);}const _0x4ee632=_0x729982?.[_0x4fb0f8(-0x130,-0x69)];if(!_0x4ee632)return;await _0x24d09f['reinforceM'+'emoryFeedb'+'ack'](_0x4ee632,!![]);}),_0x5a5346=0x1388;function _0x221ee2(_0x30b68b,_0x1bf09a){return _0x4827(_0x1bf09a- -0x3e3,_0x30b68b);}try{await Promise[_0x4b75b5(0x3fc,0x3a2)]([Promise[_0x4b75b5(0x404,0x3f1)](_0x29e798),new Promise(_0x3fa37c=>setTimeout(_0x3fa37c,_0x5a5346))]),_0x1268a5[_0x221ee2(-0x91,-0x170)](_0x4502f4[_0x4b75b5(0x522,0x4b9)],{'count':_0x463dd9['length']});}catch{}}async function syncFileReferences(_0x4cd918,_0x1df293,_0x2842e5,_0x4312aa,_0x34212b){const _0x446a09={'qnbwO':_0x3e61f1(-0xaa,-0x73)+_0x3e61f1(-0xd1,-0x79)+_0x3e61f1(-0xcc,-0x48),'Pxicc':_0x3e61f1(-0x37,0x84),'NBsuf':function(_0x4db11b,_0x13b745){return _0x4db11b(_0x13b745);},'dZozl':_0x534420(0x1cf,0x1fa),'yNJtw':_0x3e61f1(-0xd7,-0x10f),'euyES':_0x3e61f1(0xd1,0x55)+'t','ghWQv':'cited','BsQQX':function(_0x5d0478,_0x373da4){return _0x5d0478===_0x373da4;},'ySPcq':function(_0x4c66b0,_0x5f55c7){return _0x4c66b0 instanceof _0x5f55c7;},'PIUFG':_0x3e61f1(-0xca,-0x31)+_0x3e61f1(0x51,-0xa)+_0x3e61f1(-0x21,-0xb3)};function _0x534420(_0x176771,_0x43946c){return _0x4827(_0x43946c-0xa4,_0x176771);}function _0x3e61f1(_0x16dd17,_0x1fbb21){return _0x4827(_0x16dd17- -0x1b4,_0x1fbb21);}try{const _0x2780cb=createHookClient(_0x2842e5);if(!_0x2780cb)return;const {detectMdReferences:_0x2d4a76}=await import(_0x3e61f1(-0xa7,-0x10)+_0x534420(0x2f3,0x2c7)+_0x534420(0x120,0x1e2)+'s'),{createHash:_0x3de332}=await import(_0x534420(0x24c,0x17b)),{readFileSync:_0x18104e}=await import('fs'),{resolve:_0x219e10}=await import(_0x446a09[_0x534420(0x327,0x278)]),_0x496745=new Map();let _0x21930a=0x0;for(const {localId:_0x54bff2,remoteId:_0x4cdbb9}of _0x4cd918){const _0x36f7e5=_0x4312aa['getMemory'](_0x54bff2);if(!_0x36f7e5)continue;const _0x35a02b=_0x2d4a76(_0x36f7e5[_0x3e61f1(-0x68,-0xed)],_0x1df293['projectPat'+'h']);if(_0x35a02b[_0x534420(0x3d8,0x31f)]===0x0)continue;for(const _0x2f1371 of _0x35a02b){try{const _0x4f0e7c=_0x219e10(_0x1df293['projectPat'+'h'],_0x2f1371),_0x235334=_0x18104e(_0x4f0e7c),_0x19b7a0=_0x446a09[_0x534420(0x15a,0x194)](_0x3de332,_0x3e61f1(-0x2e,0x44))['update'](_0x235334)[_0x3e61f1(0x5e,0x75)](_0x446a09[_0x3e61f1(-0x74,0x48)]);let _0x108784=_0x496745[_0x3e61f1(0x28,-0x18)](_0x19b7a0);if(!_0x108784){if(_0x534420(0x262,0x192)!==_0x534420(0x275,0x192))_0x5cb835[_0x534420(0x279,0x317)](DLJKje[_0x534420(0x369,0x30e)]);else{const _0x5f1e35=await _0x2780cb[_0x3e61f1(-0x95,-0x6b)+_0x3e61f1(-0x9e,-0xb3)](_0x19b7a0);if(_0x5f1e35[_0x3e61f1(-0xb1,0x30)]&&_0x5f1e35[_0x534420(0x1f9,0x230)])_0x108784=_0x5f1e35[_0x3e61f1(-0x28,0x39)];else{const _0xceb2b5=await _0x2780cb['uploadFile'](_0x4f0e7c,{'category':_0x446a09['yNJtw'],'tags':[_0x534420(0x367,0x304)+_0x534420(0x262,0x305),_0x446a09[_0x3e61f1(0xbc,0x138)]]});_0x108784=_0xceb2b5['id'];}_0x496745[_0x3e61f1(0xc8,0x7f)](_0x19b7a0,_0x108784);}}await _0x2780cb['createMemo'+_0x3e61f1(-0x9b,-0x131)](_0x4cdbb9,_0x108784,{'reference_type':_0x446a09[_0x534420(0x130,0x1bc)],'reference_path':_0x2f1371}),_0x21930a++;}catch(_0x268b6c){if(_0x446a09['BsQQX'](_0x534420(0x1ac,0x22f),_0x3e61f1(-0x29,0x12))){const _0x2b3151=_0x446a09[_0x3e61f1(0x80,0xa7)](_0x268b6c,Error)?_0x268b6c['message']:String(_0x268b6c);!_0x2b3151['includes'](_0x534420(0x24f,0x222))&&!_0x2b3151[_0x3e61f1(-0x13,0x99)](_0x534420(0x2c5,0x2f3)+_0x3e61f1(0x27,0xa4))&&_0x34212b[_0x3e61f1(-0x48,-0x61)]('File\x20refer'+_0x534420(0x20c,0x191)+_0x534420(0x3e6,0x31d),{'refPath':_0x2f1371,'error':_0x2b3151});}else _0x3d2067[_0x3e61f1(-0x35,-0x6e)](_0x534420(0x2e3,0x32e)+_0x534420(0x1c7,0x27c)+_0x4ceffc[_0x3e61f1(0x1e,-0xc4)]+_0x534420(0x271,0x1b9)+_0x441d8c[_0x3e61f1(0xaa,0xa1)]+_0x3e61f1(-0x38,-0xb6)+_0x27dfda[_0x3e61f1(0x7b,0xf2)]+(_0x3e61f1(-0x54,-0xe5)+'\x20')+_0x6e7434[_0x534420(0x265,0x23c)]+_0x534420(0x40c,0x332));}}}_0x21930a>0x0&&console[_0x3e61f1(-0x35,0x8)](_0x534420(0x346,0x2b3)+'\x20reference'+_0x3e61f1(-0x46,-0xee)+_0x21930a+(_0x534420(0x195,0x202)+_0x534420(0x273,0x197))+_0x496745[_0x3e61f1(-0x96,-0x148)]+(_0x3e61f1(0xa9,0x177)+'ploaded')),_0x34212b[_0x3e61f1(0xbf,0xce)]('File\x20refer'+'ences\x20sync'+'ed',{'linked':_0x21930a,'files':_0x496745[_0x534420(0x1e7,0x1c2)]});}catch(_0x51236f){_0x34212b['warn'](_0x446a09[_0x534420(0xda,0x18a)],{'error':_0x446a09[_0x3e61f1(-0xc4,-0x1c)](String,_0x51236f)});}}async function syncContextAndRelations(_0x7c2bcd,_0x145c20,_0x5ee11e,_0x4dca6c,_0x51fb97){const _0x3344e6={'wtLhv':'MCG\x20causal'+_0x2f3bf4(0x409,0x4d1)+_0x255444(0x301,0x31f),'zSktK':function(_0x3bab33,_0x586aaa){return _0x3bab33<_0x586aaa;},'SbagG':function(_0x19e8fe,_0x2f2552){return _0x19e8fe(_0x2f2552);},'fVLCL':_0x2f3bf4(0x4ab,0x533),'JZGMo':function(_0x14191f,_0x1a258b){return _0x14191f===_0x1a258b;},'bSXsj':function(_0x3bc957,_0x25463f){return _0x3bc957(_0x25463f);},'ZNXMw':_0x255444(0x35e,0x27b)+_0x255444(0x33a,0x2be)+'\x20failed','ZLVMf':'co_occurre'+_0x2f3bf4(0x3f7,0x43b),'lOgdp':function(_0x4d77d2,_0x267172){return _0x4d77d2 instanceof _0x267172;},'ybwiX':_0x2f3bf4(0x553,0x5f1)+_0x255444(0x247,0x260)+_0x255444(0x250,0x24e)+_0x255444(0x369,0x2a0),'yfcNe':_0x255444(0x12d,0x20b),'fSTDZ':function(_0x1e93c9,_0x28d068){return _0x1e93c9(_0x28d068);},'QDlMr':_0x255444(0x1bb,0x224),'EOuwW':function(_0x4e4586,_0x346215){return _0x4e4586*_0x346215;},'OAAZJ':_0x255444(0x2aa,0x1ca)+'ntextAndRe'+_0x255444(0x1fd,0x19c)+'iled'};function _0x255444(_0x2ea7ce,_0x3e4792){return _0x4827(_0x3e4792-0xa6,_0x2ea7ce);}if(_0x3344e6[_0x255444(0x13b,0x1d2)](_0x7c2bcd[_0x255444(0x314,0x321)],0x2))return;const _0xca7a9a=0x14,_0x5a8316=_0x7c2bcd[_0x2f3bf4(0x67b,0x5e1)]>_0xca7a9a?_0x7c2bcd[_0x2f3bf4(0x522,0x4ca)](0x0,_0xca7a9a):_0x7c2bcd,_0x492916=_0x3344e6[_0x2f3bf4(0x64a,0x572)](createHookClient,_0x5ee11e);if(!_0x492916)return;function _0x2f3bf4(_0x4e4896,_0x279f01){return _0x4827(_0x279f01-0x366,_0x4e4896);}try{const _0x514e34=_0x145c20[_0x2f3bf4(0x4de,0x468)]?.['slice'](0x0,0x8)??_0x255444(0x276,0x22a),_0x514692=await _0x492916[_0x255444(0x2c2,0x25b)+_0x2f3bf4(0x3d8,0x477)]({'topic':_0x255444(0x23b,0x251)+_0x514e34,'summary':_0x2f3bf4(0x54b,0x4bb)+_0x255444(0x2fa,0x309)+_0x7c2bcd[_0x255444(0x37b,0x321)]+_0x255444(0x289,0x296),'source_type':'session','source_id':_0x145c20[_0x2f3bf4(0x4e4,0x468)],'memory_count':_0x7c2bcd['length']}),_0x449c72=_0x514692['id'];for(let _0x18291b=0x0;_0x18291b<_0x5a8316['length'];_0x18291b++){try{await _0x492916[_0x2f3bf4(0x453,0x46f)+_0x255444(0x250,0x2f8)](_0x449c72,{'memory_id':_0x5a8316[_0x18291b][_0x255444(0x38c,0x2c6)],'role':_0x18291b===0x0?_0x255444(0x198,0x17f):_0x3344e6[_0x2f3bf4(0x54d,0x5d5)]});}catch(_0x2b80d7){if(_0x3344e6['JZGMo'](_0x255444(0x22a,0x1a3),_0x255444(0x2e8,0x261)))_0x40a64c[_0x255444(0x16d,0x212)](_0x3344e6['wtLhv'],{'error':_0x5db5cc});else{const _0x152418=_0x2b80d7 instanceof Error?_0x2b80d7['message']:_0x3344e6['bSXsj'](String,_0x2b80d7);!_0x152418[_0x255444(0x2bd,0x247)](_0x255444(0x2c0,0x224))&&!_0x152418['includes']('already\x20ex'+'ists')&&_0x51fb97[_0x255444(0x1b6,0x212)](_0x3344e6[_0x2f3bf4(0x5a4,0x54a)],{'remoteId':_0x5a8316[_0x18291b][_0x2f3bf4(0x4f1,0x586)],'error':_0x152418});}}}for(let _0x311034=0x0;_0x311034<_0x5a8316[_0x2f3bf4(0x6a4,0x5e1)];_0x311034++){for(let _0x5b527a=_0x311034+0x1;_0x3344e6[_0x2f3bf4(0x536,0x492)](_0x5b527a,_0x5a8316[_0x255444(0x3d3,0x321)]);_0x5b527a++){try{await _0x492916[_0x255444(0x195,0x246)+'tion']({'source_id':_0x5a8316[_0x311034][_0x255444(0x31a,0x2c6)],'target_id':_0x5a8316[_0x5b527a][_0x2f3bf4(0x5ea,0x586)],'relation_type':_0x3344e6[_0x2f3bf4(0x5f2,0x5be)],'score':0.8,'context_id':_0x449c72});}catch(_0x5c7947){const _0x3e2528=_0x3344e6[_0x255444(0x151,0x218)](_0x5c7947,Error)?_0x5c7947[_0x255444(0x1eb,0x18a)]:_0x3344e6[_0x255444(0x32c,0x2b2)](String,_0x5c7947);!_0x3e2528[_0x255444(0x2e0,0x247)]('409')&&!_0x3e2528[_0x255444(0x1b6,0x247)]('already\x20ex'+_0x255444(0x1ea,0x281))&&_0x51fb97[_0x255444(0x1b9,0x212)](_0x3344e6['ybwiX'],{'error':_0x3e2528});}}}const _0x4fb97e=new Set(['decision']),_0x3bf62f=new Set([_0x255444(0x249,0x26c)+'rn',_0x255444(0x359,0x2c7),'error_solu'+'tion']),_0x11d853=[],_0x1a547d=[];for(const {localId:_0x156b7c,remoteId:_0x4d70d9}of _0x5a8316){const _0x199d36=_0x4dca6c[_0x255444(0x1f1,0x290)](_0x156b7c);if(!_0x199d36)continue;if(_0x4fb97e[_0x2f3bf4(0x46b,0x4d5)](_0x199d36[_0x255444(0x24f,0x28b)]))_0x11d853[_0x255444(0x1b0,0x20e)](_0x4d70d9);else{if(_0x3bf62f[_0x2f3bf4(0x47e,0x4d5)](_0x199d36[_0x2f3bf4(0x5f2,0x54b)]))_0x1a547d[_0x255444(0x2bd,0x20e)](_0x4d70d9);}}for(const _0x7a0a4a of _0x11d853){for(const _0x4fb3d5 of _0x1a547d){try{await _0x492916[_0x2f3bf4(0x587,0x506)+'tion']({'source_id':_0x7a0a4a,'target_id':_0x4fb3d5,'relation_type':_0x3344e6[_0x2f3bf4(0x47f,0x4e7)],'score':0.7,'context_id':_0x449c72});}catch(_0x41fdf7){const _0x12f923=_0x3344e6[_0x255444(0x14c,0x218)](_0x41fdf7,Error)?_0x41fdf7[_0x255444(0x134,0x18a)]:_0x3344e6[_0x255444(0x35b,0x2ed)](String,_0x41fdf7);!_0x12f923[_0x255444(0x2a6,0x247)](_0x3344e6[_0x255444(0x25e,0x2e4)])&&!_0x12f923['includes'](_0x2f3bf4(0x64b,0x5b5)+_0x2f3bf4(0x4bf,0x541))&&_0x51fb97['warn'](_0x3344e6['wtLhv'],{'error':_0x12f923});}}}const _0x142803=_0x3344e6['EOuwW'](_0x11d853[_0x255444(0x2fe,0x321)],_0x1a547d[_0x2f3bf4(0x514,0x5e1)]);console[_0x2f3bf4(0x441,0x4e5)](_0x255444(0x34e,0x2cb)+_0x2f3bf4(0x4c2,0x57b)+_0x2f3bf4(0x510,0x573)+_0x5a8316['length']+'\x20members,\x20'+_0x142803+(_0x2f3bf4(0x5b7,0x574)+_0x2f3bf4(0x5e7,0x564))),_0x51fb97[_0x2f3bf4(0x54e,0x5d9)]('MCG\x20contex'+_0x2f3bf4(0x496,0x4df)+'tions\x20sync'+'ed',{'contextId':_0x449c72,'members':_0x5a8316[_0x255444(0x3ac,0x321)],'causalRelations':_0x142803});}catch(_0x57fc1b){_0x51fb97[_0x255444(0x132,0x212)](_0x3344e6[_0x2f3bf4(0x659,0x5ca)],{'error':String(_0x57fc1b)});}}const HOOK_TIMEOUT_MS=0x7530;export async function main(){const _0x1317ce={'dyMLQ':_0x5cf7cd(-0xa3,-0x145)+'tion\x20faile'+_0x5cf7cd(-0x217,-0x260)+_0x1cc4a6(0x2c0,0x212),'CJFBW':function(_0x4ea926,_0x54bc23){return _0x4ea926 instanceof _0x54bc23;},'bdUGB':'Cleanup\x20fa'+'iled','vLLGf':function(_0x4aa754,_0x67dfed,_0x57cefb){return _0x4aa754(_0x67dfed,_0x57cefb);},'OIgIw':function(_0x5a9036,_0x280212){return _0x5a9036===_0x280212;},'hxujQ':'BniQS','PWbop':function(_0x54f4c6){return _0x54f4c6();},'HRXxu':function(_0x87e4ab,_0x10be9b){return _0x87e4ab instanceof _0x10be9b;},'Nquyk':_0x1cc4a6(0x277,0x21d),'UcQuA':function(_0x1767af,_0x3d2ff4){return _0x1767af(_0x3d2ff4);}};function _0x5cf7cd(_0x54212a,_0x572208){return _0x4827(_0x572208- -0x3d6,_0x54212a);}const _0x25bef0=_0x1317ce[_0x1cc4a6(0x2e3,0x2a1)](setTimeout,()=>{function _0x1406e3(_0xfb4306,_0x494ca8){return _0x5cf7cd(_0xfb4306,_0x494ca8-0x7bc);}console['error'](_0x1406e3(0x5ca,0x57f)+_0x1406e3(0x4bc,0x4c0)+_0x4d069e(0x5bd,0x4f4)+_0x1406e3(0x4bf,0x4c4)+HOOK_TIMEOUT_MS+('ms)\x20—\x20exit'+_0x1406e3(0x578,0x5e1)+_0x1406e3(0x618,0x5d5))),closeSharedDb();function _0x4d069e(_0x3ae828,_0x3dee1c){return _0x5cf7cd(_0x3dee1c,_0x3ae828-0x726);}process[_0x1406e3(0x4ff,0x4cb)](0x0);},HOOK_TIMEOUT_MS),_0x18f925=[];for await(const _0x3c5acc of process[_0x1cc4a6(0x321,0x336)]){_0x1317ce[_0x5cf7cd(-0x12a,-0x1ab)](_0x5cf7cd(-0x198,-0x22a),_0x1317ce[_0x1cc4a6(0x28f,0x358)])?_0x18f925['push'](_0x3c5acc):(_0xe49742[_0x5cf7cd(-0x241,-0x26a)](ITZKvk[_0x1cc4a6(0x1c0,0x29a)],{'error':ITZKvk[_0x1cc4a6(0x3f3,0x389)](_0x56bbc8,_0x40912c)?_0x4e5903[_0x1cc4a6(0x28e,0x1f6)]:_0x59ef7f(_0x102e9c)}),_0x34bd25=_0x33714b(_0x5d8b97,_0x3ea8b5[_0x1cc4a6(0x26c,0x239)+'h']));}const _0x5af1ee=Buffer[_0x5cf7cd(-0x21a,-0x1aa)](_0x18f925)[_0x1cc4a6(0x315,0x384)](_0x1cc4a6(0x300,0x23b))['trim']();!_0x5af1ee&&(clearTimeout(_0x25bef0),_0x1317ce[_0x5cf7cd(-0x209,-0x19b)](closeSharedDb),process[_0x5cf7cd(-0x311,-0x2f1)](0x0));function _0x1cc4a6(_0x1f65f6,_0x44938e){return _0x4827(_0x44938e-0x112,_0x1f65f6);}try{const _0x356df5=JSON['parse'](_0x5af1ee),_0x32dc21=normalizeHookInput(_0x356df5);await handleSessionEnd(_0x32dc21);}catch(_0x2c0adb){console[_0x5cf7cd(-0x211,-0x257)](_0x5cf7cd(-0x1f1,-0x23d)+_0x1cc4a6(0x327,0x2e9)+_0x5cf7cd(-0x274,-0x1e2),_0x1317ce[_0x5cf7cd(-0x1fc,-0x157)](_0x2c0adb,Error)?_0x2c0adb['message']:_0x2c0adb);}finally{_0x1317ce['Nquyk']===_0x1cc4a6(0x25c,0x21d)?(_0x1317ce[_0x1cc4a6(0x22c,0x271)](clearTimeout,_0x25bef0),closeSharedDb(),process[_0x1cc4a6(0x1ad,0x1f7)](0x0)):_0x27f96e[_0x5cf7cd(-0x280,-0x26a)](ITZKvk[_0x5cf7cd(-0x2e0,-0x28e)],{'error':_0x15702b instanceof _0x283a02?_0x34bf16[_0x1cc4a6(0x132,0x1f6)]:_0x43ef5b(_0x6f462b)});}}function _0x4775(){const _0x13267=['y2TPBMC','DgLLCG','w2eYyv0Gu2TPBa','zMLSDgvY','C2L6zq','y2HLy2TgAwXLra','B3zLCMfSBa','ihbYB21WDcHZkq','BK1LDhjPy3m','ig5LDYbZA2LSBa','tunhihn5BMndBW','Dg90ywW','ihrOCMvZAg9Sza','ChjVAMvJDfbHDa','zuPnywe','DxrMltG','zgvK','C2TPBgXdB252zq','ELnRDeS','BwLUqwn0Aw9UCW','r25bBu4','CMfJzq','zsbSyxn0igv4Da','DxnOigzHAwXLza','ChvZAe9Uu2vZCW','zwqP','zw50','BMv3tgv2zwW','BK1LC3nHz2vZuW','ywXSu2v0DgXLza','zcb0BYbZzxj2zq','zxHWAxjLza','zc50CW','DMXez3i','BgLMzwn5y2XL','AwnPzw5JEtOGiG','zwzLCMvUy2uUAG','BK9HsLi','zfPVEMW','Bw9KAwzPzwrbDa','yxbPs2v5','zw5HyMXLza','y29UDgv4DfrHzW','C2f2zuvTyMvKza','vfL5uxC','q2XLyw51CcbKBW','yMrvr0i','u2vZC2LVBIbLEa','rKruBha','sw50zxj2ywW','y29UDgvUDa','zw5JEs9KzxrLyW','Cu9lzKW','BxmPcG','BMmGzMfPBgvK','y3jLyxrLtwvTBW','y3q6ia','CxvHBgL0EvnJBW','Aw9UigrVBMu','u2vZC2LVBIb3Aq','Agv4','zxrLza','zw1IzwrKAw5N','tM8GC2vZC2LVBG','zw1VDgLVBLrYyq','sgDozvq','D3jPDgu','z2v0vw5Zzw50rq','igXPBMSOCYKGyW','vwnrDue','ihjLCgXHy2vKla','AKTUuNq','BxbhzNy','DhvZ','C2XPy2u','y2f1C2fS','C2LTAwXHCML0Eq','yxvYthy','ChvZAa','C2fNzxmGC2LUyW','odi3mJK3AKzVBuzT','ihjLBgf0Aw9Uia','D2fYBG','mJK2mtzHEMv1A04','CZOG','AgfZ','BgXT','uhjVy2vZC2LUzW','Be9Nzha','rMLSzsbYzwzLCG','B2XPzgf0Aw9UoG','twvTB3j5ihnRAq','zcWGDxnPBMCGyG','tKLUqKS','Bw1HCNK','DcbHBMqGCMvSyq','CMzPwLy','BMCVAw5KzxGUAG','ig1LCMDLzcWG','Cgf0Aa','nda5','zxjYB3i','nde5mtiXEujJEKXq','EwzJtMu','zw5KC1DPDgG','s0DmA2m','Dw5RBM93BG','Aw9U','C2HHmJu2','zxH0CMfJDgvKia','zhLntfe','shjor3m','DgvHBsbZEw5Jia','rgDftgu','zMLSzv9Pza','CgXLDgvKicH0BW','zLj4uNu','DKXmr2y','EMX6ywi','yxrLzcaOBwvYzW','v21OwwW','ywLSzwq','vwn6C1a','Bwf4','rw1VDgLVBIbZEq','lI4VBgLMzwn5yW','BM9VCa','w2eYyv0Gu2vZCW','mtiWwvDNvgTt','AhDNBge','BgLZDe1LBw9YAq','lI4VC2TPBgWVzq','DgfYz2v0twvTBW','C3LUyYbJBgLLBG','y3jLyxrLuMvSyq','Aw5JBhvKzxm','C3LUy2vKsxrLBq','AwnHDguP','vg9VBcb1C2uGyW','nZu2zK1gswrh','tK9pua','ywn0Aw9U','Bgf0Aw9UigzHAq','DeXiB3a','AwXLza','w1nLC3nPB25Dia','qM5Puvm','CM91BMq','EsbLDMvUDhmGyG','BM9KzuLK','A1r5ELe','DMvS','ChjVDMLKzxi','wKT3u3q','AMjoCwO','y3jLyxrLq29UDa','igDLBMvYyxrLza','w2eYyv0GvgvHBq','u3zbv1e','ufPcrNq','DxjYzw5JzsbYzq','yMT5s0W','Aw9Urw5KignVBq','qMf0y2G','CgfKBxO','serzvMO','BefWuha','BwvYz2vdB250zq','zxiUANm','mJC1mta4mZvis2Hhsxa','zc5QCW','Evb1wge','y29Kzv9Wyxr0zq','CNnPB24','qMf0y2GGzw1Izq','DxbKyxrLtwvTBW','wxznvfO','ChvZAgvK','y2TJzLK','BwvTyMvY','CMvJB3jKuhjHyW','C2TPBgXnzw1VCG','CYbJCMvHDgvK','ChjVzMLJAwvUyW','ywrK','tM8GChjVAMvJDa','uhHPy2m','tunhigfKzenVBG','lI4VChjVzMLJAq','Aw9Urw5KigvYCG','CdOG','zgLMzMLJDwX0Eq','BgfIBgu','Axn0CW','z2v0','twvTB3j5ihvWza','yxjNDG','BgLKyxrLza','BLHRsue','BwvYz2vK','yw0TC3LUy2HYBW','te1Sz0G','wK5ytxC','y2f0zwDVCNK','DNnjrem','ntbXEgvHy0m','ihn5BMnLzca','Dg8GC2vYDMvY','z2v0twvTB3j5','nZy2ntyYmef3AgfdzG','zxGUANm','ExjKsLC','DgvHBq','DwXSEq','ig1LBw9YAwvZ','ExHcqvq','DKTJCgS','DLPssgy','B3i6','ywDLCW','DhKP','CMvPBMzVCMnLva','C0TWy1y','B3vUDcbIzwXVDW','BgvK','Aw5NigDYywnLzG','C3rKzxjY','z25ABwC','Bgf0Aw9UCYK','DwnwDu8','se1Xsxe','CMvZB2X2zq','y2XLyw51Cfn5BG','ue9ZzMe','BguVAw5KzxGUAG','zMvYzw5JzxmGzG','Bg9Nz2LUzW','vgvHBsbZEw5Jia','C29YDa','twvZC2fNzxm','yxv0B1n5BMm','ChjLDMLVDxnmzq','u2jHz0C','CMvHDgvKicG','ignHDxnHBcbYzq','w2eYyv0GrMLSzq','u0LWzum','zMX1C2G','zgLNzxn0','C2v0u3LUy1n0yq','teXLDve','ignVBNrLEhqGyW','DgLVBG','vvbeqvrf','Dgv4De1LBwjLCG','igvYCM9YCZOG','DgfSoIa','uhbSueO','DgLVBI5QCW','zMvLzgjHy2SGCW','Aw9Uihn1Bw1HCG','vvnit0O','CMvTB3rLswq','y29UDMvUDgLVBG','Bwf4ugvYu2vZCW','Aw9Ul2zPBguTCG','C3rKAw4','w2eYyv0GtunhoG','BML6zxiUANm','BMvKihvWia','C2vZC2LVBLn1Bq','ig1LC3nHz2vZ','lI4VC3LUyY90zq','t0LNsxC','y29Uy2f0','sKjHENm','zgrPBMCGzMfPBa','zgvSzxrL','u2vZC2LVBKvUza','C2vZC2LVBI1ZDq','ywnJzxnZq291BG','zxnZAw9Urw5K','Evnqy3e','BwvTB3jPzxm','AxnbCNjHEq','q2XLyw51CcbMyq','uNzyqLm','tvbyv3a','lI4VBgXTl2LUza','ufDIB3a','ihnVzNqTAw52yq','z2v0u2vZC2LVBG','uurStxi','Ew5esK4','BwfYEq','z09xz2O','uwDlCum','mJKZmdf6BeD2sxO','ig1LBw9YAwvZia','C2TPBgW','AhH1ALe','zLnurfO','Aw9UoIa','ugf0AcbWCM92Aq','DgvHBvbHDgG','BM93','u2TPBgWGzxzHBa','C2vYDMvY','DwDgDeq','ywXYzwfKEsbLEa','BvLxrwW','DgfNCW','twvTyMvY','Au15tva','DgLVBIbMywLSzq','DgDzyKW','EercD0W','t2rAsvK','wKXwtwy','w2eYyv0Grw1VDa','AxzwwMe','zMLSzvbHDgG','C2vTyw50Awm','igzPBguOCYKGDq','DxbKyxrL','DMfSDwf0B3iUAG','BwvTB3j5lxjLzG','zxjLBMnL','zvj0C2O','DgGG','t0fbwKO','uMvPBMzVCMnLia','BwfW','y3jLyxrLza','Du5euNO','iIbSzxzLBca','Cw5ID08','EuzHqKy','vKnXzwq','zxr5ihrPBwvVDq','w2eYyv0Gu3LUyW','zLzmq0W','zxv5rvm','zw1IzwrcyxrJAa','Dg9tDhjPBMC','Aw5MBW','y29UzMXPy3rZ','C2f2zvnLC3nPBW','tejnBhK','q0PgqLC','DLbVwxG','zMfPBgvK','A0jnDvm','BgvUz3rO','C2v0','rKv3C2u','qwDXCNK','sfjyEhu','reHMuKG','sg9VAYbJB21WBa','DgfSkq','EsbZzxj2zxiGCa','zwqGDg8GC2vYDG','BwqTzg9JDw1LBG','Esb0CMfJA2LUzW','Bw9Kzq','EuLK','igv4CgLYzwqSia','w2eYyv0GrgvKDq','tunhignVx29JyW','AwvUy3LfDMvUDa','zxjYB3jZ','ihnRAxbWzwq','igzPBgvZigzVDq','AM9PBG','teXnigv4DhjHyW','CgfurK8','Aw9Urw5K','ng5Zru1VsW','zgf0Aw9UlMPZ','A3HyBuW','C3bSAxq','Bw90Aw9UtwvZCW','t2XKig1LBw9YEq','revmrvrf','zgvJAwrL','BMnL','w2eYyv0GuhjVzG','y3j5ChrV','rw1VDgLVBIbIDq','yw5JAg9Y','Aw9Urw5KihnHzG','Cg9ZDfbYB2zPyW','icHPBMnYzw1LBG','CMvMzxjLBMnL','DcaO','yMf0y2GTC3LUyW','mJu0mZe5mhbkA0jcCq','BxmGFcbLEhrYyq','wwjeEgm','Bw1HCNKGzgLZyq','BwvZC2fNzq','zxHPDa','ueLvrKC','zNjVBsa','yMXLza','z2v0rw1IzwrKAq','C3LUy0zPBgvszq','Aw9UigzHAwXLza','qure','zw5JzsbZEw5Jia','yxrcyKi','igzHAwXLza','tKjZDwy','q291BNq','iokgKIa','CMvHDgvKlca','y0rMDLi','ywX5C2LZ','Bgf0Aw9UCYbMyq','t3rXt2y','B3v0y29Tzq','C3LUy0rLBhrH','AKzHz1C','tM8GBMv3ig1LCW','BguVy29UC29SAq','rNrVuuW','igfUywX5EMvK','vMvbEeu','yxnPyW','w2eYyv0Gq2XLyq','C2vZC2LVBKLK','zxHPC3rZ','BeTwvu8','yLvbwfG','zMfXz04','DxjS','uhjVzMLJAwvUyW','ywrKq29UDgv4Da','u2vZC2LVBIbZDq','re9KrwO','rLvxv0K','lI4VzxH0CMfJDa','BcbJCNLZDgfSBa','y2XLyw51Ce9UuW','C2vZC2LVBI1LBG','zxH0','Bg93uxvHBgL0Eq','DhjHy3rPB24GzG','igXVDY1XDwfSAq','igfKzgvKlca','DxbSAwnHDgu','CgvUzgLUzW','z2Hxuxy','CNLgAwXLtgLUAW'];_0x4775=function(){return _0x13267;};return _0x4775();}const isMainModule=process[_0x3633fd(0x126,0xaa)][0x1]?.[_0x3633fd(0x61,0x4e)](_0x25c899(0x0,-0x30)+_0x25c899(0x94,0x84))||process['argv'][0x1]?.[_0x3633fd(0x9e,0x4e)](_0x25c899(-0x2b,-0x30)+_0x25c899(-0x31,-0x6));isMainModule&&main();
|