a2a-memory 0.11.5 → 0.11.6
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.js +1 -298
- package/dist/cli/commands/add.js +1 -80
- 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.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.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/user-prompt-submit.js +1 -316
- package/dist/i18n/index.js +1 -2
- package/dist/i18n/messages.js +1 -150
- package/dist/index.js +1 -43
- package/dist/lifecycle/cleanup-scheduler.js +1 -137
- package/dist/lifecycle/cleanup.js +1 -116
- package/dist/lifecycle/index.js +1 -13
- 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.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 +1 -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 +14 -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(_0x22651b,_0x3cb62b){const _0x16bc03=_0x22651b();function _0x2b7d45(_0x534021,_0x44ac63){return _0x5aa4(_0x44ac63- -0xf0,_0x534021);}function _0x41ddee(_0x212140,_0x4f85e3){return _0x5aa4(_0x212140-0x63,_0x4f85e3);}while(!![]){try{const _0x1e322a=parseInt(_0x41ddee(0x2fc,0x2f7))/0x1*(parseInt(_0x2b7d45(0x1eb,0x199))/0x2)+-parseInt(_0x2b7d45(0x186,0x167))/0x3+-parseInt(_0x41ddee(0x2f4,0x249))/0x4+parseInt(_0x2b7d45(0x76,0x142))/0x5+parseInt(_0x2b7d45(0x45,0x106))/0x6*(parseInt(_0x41ddee(0x1f1,0x161))/0x7)+parseInt(_0x2b7d45(0x61,0x131))/0x8+-parseInt(_0x41ddee(0x29b,0x2ba))/0x9*(parseInt(_0x2b7d45(0x178,0xa9))/0xa);if(_0x1e322a===_0x3cb62b)break;else _0x16bc03['push'](_0x16bc03['shift']());}catch(_0x4c52c6){_0x16bc03['push'](_0x16bc03['shift']());}}}(_0x385a,0x70932));import{getSharedDb,closeSharedDb,normalizeHookInput}from'./shared.js';import{ConfigManager}from'../config/manager.js';import{parseSessionFile,findSessionFiles}from'../session/parser.js';import{extractMemories,extractMemoriesWithLLM,summarizeSession}from'../extraction/extractor.js';import{createHookClient}from'./client-factory.js';function _0x3bb2fe(_0x1db3e1,_0x264f56){return _0x5aa4(_0x1db3e1-0xd9,_0x264f56);}import{SyncQueue}from'../sync/queue.js';import{createLogger}from'../utils/logger.js';async function syncToRemote(_0x21da43,_0x42bff3,_0x4f23a,_0x2e3959){const _0x10ff0b={'dJnai':_0x7fa440(0x170,0x1fc)+_0x3560e0(0x1db,0x1ad)+_0x3560e0(0x17c,0xcc),'nSDue':function(_0x1722aa,_0x2017d2){return _0x1722aa(_0x2017d2);},'IDHwf':'session-su'+_0x3560e0(0xc0,0x185),'EuWZS':_0x7fa440(0x20a,0x19d)+_0x7fa440(0x2dc,0x32b)+_0x7fa440(0x28f,0x24a),'zDuDf':function(_0x286a6e,_0x22e3d9){return _0x286a6e>_0x22e3d9;},'DDljk':function(_0x18edc1,_0x89162d){return _0x18edc1>_0x89162d;},'aQXnM':_0x7fa440(0x281,0x1ed),'PwXoq':_0x7fa440(0x180,0xb2),'xSFLo':function(_0x14a56e,_0x4f282c){return _0x14a56e instanceof _0x4f282c;},'CQJcp':function(_0x233a51,_0x1e050e){return _0x233a51===_0x1e050e;},'hhUos':_0x3560e0(0x125,0x1eb),'EdFRd':_0x7fa440(0x22d,0x281),'VXvno':function(_0x2bb9bc,_0x51ffba){return _0x2bb9bc(_0x51ffba);},'DvNox':_0x3560e0(0x178,0x218)+_0x7fa440(0x1c5,0x23d)+'\x20available','JkdBe':_0x7fa440(0x1d4,0x162)+'failed'},_0x2aedec=[];if(_0x42bff3[_0x3560e0(0xad,0x34)][_0x7fa440(0x2d5,0x22d)]&&_0x42bff3[_0x7fa440(0x18b,0x16b)][_0x3560e0(0x1de,0x222)+_0x7fa440(0x268,0x197)]&&_0x42bff3['server'][_0x7fa440(0x2d9,0x2a6)])try{const _0x214f80=createHookClient(_0x42bff3);if(!_0x214f80)throw new Error(_0x10ff0b[_0x3560e0(0x111,0x112)]);const _0x487875=new SyncQueue(_0x4f23a,_0x214f80),_0xa858fa=await _0x487875[_0x7fa440(0x1ad,0x173)]({'timeoutMs':_0x42bff3[_0x3560e0(0xad,0x7)][_0x3560e0(0x130,0xf1)]});_0x10ff0b['zDuDf'](_0xa858fa[_0x7fa440(0x166,0xcd)],0x0)&&console[_0x3560e0(0x10f,0x144)](_0x7fa440(0x2d8,0x2e7)+_0x3560e0(0x121,0x5c)+_0xa858fa[_0x7fa440(0x166,0xd2)]+(_0x7fa440(0x206,0x1ac)+_0x7fa440(0x246,0x2ac))),_0x10ff0b[_0x7fa440(0x258,0x2b2)](_0xa858fa[_0x3560e0(0x152,0x81)][_0x7fa440(0x173,0xcf)],0x0)&&(_0x10ff0b[_0x3560e0(0x1f9,0x26d)]!==_0x10ff0b[_0x7fa440(0x1be,0x160)]?console['error'](_0x3560e0(0x1fa,0x28d)+_0x7fa440(0x1cd,0x15b)+_0xa858fa[_0x3560e0(0x152,0xfe)][_0x7fa440(0x17a,0x159)](',\x20')):_0x12a5fb[_0x7fa440(0x1c3,0x1dd)](_0x10ff0b['dJnai'],{'error':_0x71daee instanceof _0x55cf11?_0x234608[_0x3560e0(0xa3,0x105)]:_0x10ff0b[_0x3560e0(0x1a0,0x18d)](_0x232324,_0x181da2)})),_0x2aedec[_0x7fa440(0x299,0x2a1)](..._0xa858fa['syncedItem'+'s']);}catch(_0x2306a2){_0x2e3959[_0x3560e0(0xe5,0x19b)]('Sync\x20push\x20'+'failed',{'error':_0x10ff0b[_0x7fa440(0x2d3,0x2aa)](_0x2306a2,Error)?_0x2306a2[_0x7fa440(0x181,0x21e)]:_0x10ff0b[_0x7fa440(0x27e,0x27d)](String,_0x2306a2)});}if(_0x10ff0b[_0x7fa440(0x2ce,0x362)](_0x42bff3['mode'],_0x3560e0(0x14e,0x91))&&_0x42bff3['team']&&_0x42bff3[_0x3560e0(0x1c6,0x149)]['apiKey']){if(_0x10ff0b[_0x3560e0(0x1f0,0x1fe)](_0x10ff0b['hhUos'],_0x10ff0b['EdFRd']))_0x56e83b[_0x7fa440(0x2e8,0x326)][_0x3560e0(0x1bb,0x255)]({'content':_0xf9d13b,'category':'learning','tier':_0x3560e0(0xe3,0x13a),'tags':[_0x10ff0b['IDHwf']],'projectPath':_0x583901[_0x7fa440(0x1ba,0x23a)+'h']});else try{const {TeamSynchronizer:_0x23c926}=await import('../sync/te'+_0x7fa440(0x1ac,0x1aa)+_0x3560e0(0x204,0x14e)),_0x2cebc6=_0x10ff0b[_0x3560e0(0x124,0x10c)](createHookClient,_0x42bff3);if(!_0x2cebc6)throw new Error(_0x10ff0b[_0x7fa440(0x2f2,0x336)]);const _0x411b10=new _0x23c926(_0x4f23a,_0x2cebc6,_0x42bff3[_0x7fa440(0x22c,0x1db)][_0x7fa440(0x190,0x212)],_0x42bff3[_0x3560e0(0x14e,0xd4)][_0x7fa440(0x1fe,0x1ff)]),_0x90d32b=await _0x411b10[_0x7fa440(0x156,0xd9)]();_0x90d32b[_0x7fa440(0x166,0x130)]>0x0&&console[_0x3560e0(0x10f,0x5f)](_0x3560e0(0xbc,0xe4)+_0x7fa440(0x21d,0x2f0)+_0x90d32b[_0x3560e0(0x88,-0x14)]+'\x20memories');}catch(_0xbe4648){_0x2e3959[_0x3560e0(0xe5,0x24)](_0x10ff0b[_0x7fa440(0x244,0x301)],{'error':_0xbe4648 instanceof Error?_0xbe4648['message']:String(_0xbe4648)});}}function _0x3560e0(_0x4e448e,_0x44fbe0){return _0x5aa4(_0x4e448e- -0x7b,_0x44fbe0);}function _0x7fa440(_0x4bf264,_0x37fb96){return _0x5aa4(_0x4bf264-0x63,_0x37fb96);}return _0x2aedec;}export async function handleSessionEnd(_0x56beb0){const _0x3ea9f2={'fXIVg':function(_0x5a50b8,_0x113dd8){return _0x5a50b8??_0x113dd8;},'sOwZL':_0x536e55(0x4f,0x46)+_0x1deae3(0x50e,0x51e)+'d,\x20using\x20b'+_0x536e55(-0x7a,0x11),'bADiQ':function(_0x221783,_0x54fbd9){return _0x221783 instanceof _0x54fbd9;},'YZCQg':function(_0x4c03d5,_0x2e1623,_0x4429d2){return _0x4c03d5(_0x2e1623,_0x4429d2);},'vIsft':'Emotion\x20bu'+'ffer\x20flush'+'ed','rWMrL':function(_0xdbfb1e,_0x5d0531){return _0xdbfb1e instanceof _0x5d0531;},'AobOV':_0x1deae3(0x60f,0x577),'pmKYG':function(_0x14786f,_0x180989){return _0x14786f!==_0x180989;},'gzkIo':_0x536e55(-0x6e,0x34)+_0x1deae3(0x57c,0x64b)+_0x536e55(-0x64,0x6b),'ZMuIb':function(_0x51a2a0,_0x5c39d9){return _0x51a2a0(_0x5c39d9);},'NDRzL':_0x536e55(0x11b,0x55),'OjTdX':_0x536e55(0x117,0x9e),'kCUEA':function(_0x3e2768,_0x51df19){return _0x3e2768>_0x51df19;},'weVBz':function(_0x2434eb,_0x5edf5a,_0x445fca,_0x4129c5,_0x1c04b6){return _0x2434eb(_0x5edf5a,_0x445fca,_0x4129c5,_0x1c04b6);},'COvqq':function(_0x2f76fc,_0x4259e4){return _0x2f76fc>=_0x4259e4;},'aiAPW':function(_0x5490c0,_0x5f866,_0x45015d,_0x51fccb,_0x4bd5fe,_0x567dc8){return _0x5490c0(_0x5f866,_0x45015d,_0x51fccb,_0x4bd5fe,_0x567dc8);},'FAtTU':function(_0x401f4e,_0x553b39){return _0x401f4e/_0x553b39;},'ciXcm':function(_0x112c60,_0x45568c){return _0x112c60>_0x45568c;},'csazg':function(_0xcd6260,_0x28bdce,_0x490040,_0xebf663){return _0xcd6260(_0x28bdce,_0x490040,_0xebf663);},'hixFJ':_0x1deae3(0x575,0x4b9)+_0x536e55(-0xc4,-0x34),'PWyEI':function(_0x5a832b,_0xbb4180,_0x556f78){return _0x5a832b(_0xbb4180,_0x556f78);},'OuzZX':function(_0x4267e3,_0x2177e7){return _0x4267e3>_0x2177e7;},'fKpmj':_0x536e55(-0x70,0x35),'QdOhk':function(_0x3d16ce,_0x1bc44d){return _0x3d16ce===_0x1bc44d;},'nZnHi':_0x536e55(-0x3c,-0xc4),'xUvXt':_0x1deae3(0x601,0x597)+_0x536e55(-0x35,0x3a),'LEgJk':function(_0xb43ab5,_0x55749a){return _0xb43ab5-_0x55749a;},'OaJZR':function(_0x1a07ce,_0x3f0656){return _0x1a07ce-_0x3f0656;}},_0x1e0c8f=new ConfigManager()['load']();function _0x1deae3(_0x1b3ced,_0x2c5526){return _0x5aa4(_0x1b3ced-0x3a1,_0x2c5526);}const _0x59cb0f=_0x3ea9f2[_0x536e55(-0x8c,-0x94)](createLogger,_0x3ea9f2[_0x1deae3(0x54e,0x5e2)],_0x1e0c8f[_0x1deae3(0x5e5,0x6b2)]),_0x3b7a83=performance[_0x1deae3(0x4fa,0x502)]();function _0x536e55(_0xf0511d,_0xddb37c){return _0x5aa4(_0xddb37c- -0x1c4,_0xf0511d);}try{_0x59cb0f['info'](_0x1deae3(0x5c4,0x55a)+'ed',{'projectPath':_0x56beb0['projectPat'+'h']});if(!_0x56beb0[_0x536e55(-0xa5,-0x6d)+'h']){_0x59cb0f[_0x536e55(-0x118,-0x64)](_0x1deae3(0x583,0x5e2)+_0x1deae3(0x4ef,0x5b5)+'ded');return;}const _0x3c56dd=getSharedDb(_0x1e0c8f['db'][_0x1deae3(0x502,0x4a7)]),_0x168a9d=performance['now'](),_0x48a764=[];if(_0x1e0c8f[_0x536e55(-0x69,0x24)+_0x536e55(0x4,-0x90)][_0x536e55(-0x19,0xae)]){if(_0x3ea9f2[_0x1deae3(0x5b2,0x551)](_0x1deae3(0x547,0x5e4),_0x1deae3(0x547,0x5b9))){const _0x2e0280=_0x21b682[_0x1deae3(0x5ad,0x591)](_0x5e22c8);if(!_0x2e0280)return null;const _0xd127a0=_0x10c522[_0x1deae3(0x5b5,0x5ff)+'ng'](_0x14b56c);return{'content':_0x2e0280[_0x536e55(-0x145,-0xaa)],'tags':_0x2e0280[_0x536e55(0x3e,-0x4f)]??[],'embedding':_0x3ea9f2[_0x536e55(0x1e,-0x58)](_0xd127a0,_0xf151da)};}else try{await extractSessionMemories(_0x56beb0,_0x1e0c8f,_0x3c56dd,_0x59cb0f,_0x48a764);}catch(_0x5350d3){_0x59cb0f[_0x536e55(-0x10e,-0x64)](_0x3ea9f2[_0x1deae3(0x54f,0x597)],{'error':_0x3ea9f2[_0x536e55(0x133,0xbf)](_0x5350d3,Error)?_0x5350d3[_0x536e55(-0x166,-0xa6)]:_0x3ea9f2[_0x536e55(0x9f,0x73)](String,_0x5350d3)});}}else _0x59cb0f['info']('Session\x20su'+_0x1deae3(0x56c,0x4d8)+'bled');const _0x2f00f9=performance[_0x536e55(-0xcb,-0x6b)](),_0x48f846=performance[_0x1deae3(0x4fa,0x589)]();let _0x3792c0=[];if(_0x1e0c8f['proficienc'+'y']?.[_0x1deae3(0x613,0x6a9)]){if(_0x3ea9f2[_0x1deae3(0x638,0x6ff)]!==_0x3ea9f2['OjTdX']){const _0x4a06ba=_0x3ea9f2[_0x536e55(-0xfc,-0x32)](_0x48a764[_0x1deae3(0x4b1,0x3e8)],0x0)?_0x48a764:_0x3c56dd['listMemori'+'es']({'limit':0x32})[_0x1deae3(0x52a,0x544)](_0x30d3b0=>_0x30d3b0['id']);_0x3792c0=await trackProficiencyLocal(_0x56beb0,_0x1e0c8f,_0x3c56dd,_0x59cb0f,_0x4a06ba);}else _0x564fd1[_0x1deae3(0x501,0x45a)](_0x3ea9f2[_0x536e55(-0x145,-0x82)],{'error':_0x3ea9f2[_0x1deae3(0x4ac,0x45c)](_0x58f3f2,_0xad1505)?_0x46aba4['message']:_0x200e1d(_0xd1da76)}),_0x1e83fe=_0x3ea9f2[_0x1deae3(0x4d1,0x4fc)](_0x4a858d,_0x59629f,_0x5e9b91['projectPat'+'h']);}const _0x2acd61=await _0x3ea9f2[_0x536e55(0x19,0x13)](syncToRemote,_0x56beb0,_0x1e0c8f,_0x3c56dd,_0x59cb0f);_0x3ea9f2[_0x1deae3(0x533,0x53e)](_0x3792c0[_0x1deae3(0x4b1,0x480)],0x0)&&_0x1e0c8f[_0x1deae3(0x5e2,0x57e)]?.['apiKey']&&_0x1e0c8f[_0x1deae3(0x5e2,0x57e)]?.[_0x1deae3(0x5b6,0x612)]&&await pushProficiencyToServer(_0x3792c0,_0x56beb0,_0x1e0c8f,_0x59cb0f);_0x2acd61[_0x536e55(-0x71,-0xb4)]>0x0&&_0x1e0c8f[_0x1deae3(0x5e2,0x5b6)]?.[_0x1deae3(0x617,0x62c)]&&_0x1e0c8f[_0x536e55(0x33,0x7d)]?.[_0x1deae3(0x5b6,0x676)]&&await syncFileReferences(_0x2acd61,_0x56beb0,_0x1e0c8f,_0x3c56dd,_0x59cb0f);_0x3ea9f2[_0x1deae3(0x5c1,0x5fe)](_0x2acd61[_0x536e55(-0x154,-0xb4)],0x2)&&_0x1e0c8f[_0x536e55(0x17,0x7d)]?.[_0x536e55(0x173,0xb2)]&&_0x1e0c8f[_0x1deae3(0x5e2,0x62b)]?.[_0x536e55(0x1c,0x51)]&&await _0x3ea9f2[_0x536e55(0x126,0x7a)](syncContextAndRelations,_0x2acd61,_0x56beb0,_0x1e0c8f,_0x3c56dd,_0x59cb0f);const _0x4f2cf8=performance[_0x536e55(0x44,-0x6b)]();try{const _0x54255f=_0x3c56dd[_0x1deae3(0x51c,0x4f3)+_0x536e55(-0x13a,-0x95)](_0x56beb0[_0x1deae3(0x555,0x539)]);if(_0x54255f){const _0x100788=_0x3c56dd['getInjecti'+_0x1deae3(0x4df,0x5b3)](_0x54255f['id']),_0x287617=_0x3ea9f2['kCUEA'](_0x54255f[_0x1deae3(0x551,0x556)+_0x536e55(-0x25,0x2e)],0x0)?_0x3ea9f2[_0x1deae3(0x4cf,0x4e6)](_0x100788[_0x1deae3(0x4b1,0x3ff)],_0x54255f[_0x536e55(0x19,-0x14)+_0x1deae3(0x593,0x59b)]):0x0;_0x3c56dd[_0x536e55(0x8c,0x21)+_0x1deae3(0x4a3,0x51a)+_0x536e55(-0x6,0x4f)](_0x54255f['id'],_0x287617,_0x100788[_0x1deae3(0x4b1,0x40b)]),_0x3ea9f2['ciXcm'](_0x100788[_0x536e55(-0x115,-0xb4)],0x0)&&_0x59cb0f[_0x1deae3(0x536,0x58d)](_0x1deae3(0x5b8,0x4f8)+_0x1deae3(0x628,0x68b)+_0x1deae3(0x4db,0x501),{'effectiveness':_0x287617[_0x1deae3(0x511,0x5a2)](0x2),'hits':_0x100788[_0x1deae3(0x4b1,0x566)]});}}catch{}const _0x137ecb=performance[_0x1deae3(0x4fa,0x506)]();if(_0x1e0c8f[_0x1deae3(0x4b2,0x401)+_0x1deae3(0x57b,0x647)]?.['enabled']&&_0x1e0c8f[_0x1deae3(0x5e2,0x5e2)]?.[_0x1deae3(0x617,0x57b)]){if(_0x1deae3(0x496,0x441)!==_0x1deae3(0x543,0x595))try{await _0x3ea9f2['csazg'](flushEmotionBuffer,_0x1e0c8f,_0x3c56dd,_0x59cb0f);}catch(_0x4298f2){_0x59cb0f[_0x1deae3(0x501,0x43a)](_0x3ea9f2['hixFJ'],{'error':_0x4298f2 instanceof Error?_0x4298f2[_0x536e55(-0xf2,-0xa6)]:_0x3ea9f2['ZMuIb'](String,_0x4298f2)});}else{_0x2e3875[_0x536e55(-0x13,-0x2f)]('No\x20session'+'\x20files\x20fou'+'nd');return;}}if(_0x1e0c8f['lifecycle']?.['cleanupOnS'+_0x1deae3(0x58a,0x551)]){if(_0x1deae3(0x53f,0x4b6)!==_0x1deae3(0x56f,0x527))try{const {cleanupMemories:_0x4752d1}=await import(_0x1deae3(0x62e,0x624)+'le/index.j'+'s'),_0x1be212=_0x3ea9f2[_0x536e55(0x5b,0x94)](_0x4752d1,_0x3c56dd,_0x1e0c8f[_0x536e55(0x9c,0x7e)]);_0x3ea9f2[_0x1deae3(0x4f6,0x475)](_0x1be212[_0x536e55(0x1f,0xe)],0x0)&&(_0x3ea9f2[_0x1deae3(0x525,0x4e5)]!=='svthY'?console[_0x1deae3(0x52b,0x4a1)]('[a2a]\x20Clea'+_0x536e55(0x63,0x65)+_0x1be212[_0x1deae3(0x573,0x634)]+('\x20memories\x20'+'(')+_0x1be212[_0x1deae3(0x607,0x69d)]+_0x1deae3(0x5db,0x507)+_0x1be212[_0x1deae3(0x4dd,0x4db)]+(_0x1deae3(0x631,0x649)+'ty)')):(_0x353686['markEmotio'+_0x536e55(0x14,-0xbc)+'ynced'](_0x4c176),_0x2f5938[_0x1deae3(0x568,0x4ba)+_0x1deae3(0x61d,0x6ee)+'Messages'](),_0x1e9a18[_0x1deae3(0x52b,0x4a9)](_0x1deae3(0x4c6,0x533)+_0x536e55(0x90,0x59)+_0x1ad36f[_0x536e55(-0x17,-0xb4)]+(_0x536e55(-0x14b,-0xc9)+'\x20analyzed')),_0x4eb9a4[_0x536e55(-0xd7,-0x2f)](_0x3ea9f2[_0x1deae3(0x634,0x6ef)],{'sent':_0x4bbef8[_0x536e55(-0x119,-0xb4)],'total':_0x2522f6[_0x1deae3(0x4b1,0x473)]}))),_0x59cb0f[_0x536e55(-0x6f,-0x2f)](_0x1deae3(0x532,0x5a0)+'ne',{'total':_0x1be212[_0x1deae3(0x573,0x625)]});}catch(_0x3611ca){_0x3ea9f2[_0x536e55(-0x3a,-0x1f)](_0x536e55(-0xe9,-0xc4),_0x3ea9f2[_0x1deae3(0x523,0x46b)])?_0x59cb0f['warn'](_0x3ea9f2[_0x1deae3(0x5d2,0x55f)],{'error':_0x3ea9f2[_0x536e55(0x62,0xbf)](_0x3611ca,Error)?_0x3611ca[_0x536e55(-0x58,-0xa6)]:String(_0x3611ca)}):_0x3402e2[_0x1deae3(0x52b,0x4c5)]('[a2a]\x20Sess'+_0x1deae3(0x614,0x651)+_0x536e55(-0x9d,-0x2d),_0x3ea9f2[_0x1deae3(0x624,0x6e4)](_0x1147d8,_0x784eb2)?_0x219e9a[_0x536e55(-0x100,-0xa6)]:_0x573f75);}else _0x4b7343[_0x536e55(-0x2d,-0x3a)](_0x536e55(-0xfe,-0x2a)+'iciency:\x20\x22'+_0x229a6e[_0x1deae3(0x4bb,0x567)]['split']('\x0a')[0x0]['slice'](0x0,0x32)+'\x22\x20level\x20'+_0xb82f82[_0x536e55(-0xb6,-0x8c)+_0x536e55(0x31,0x69)]+_0x536e55(0x8a,0xc0)+_0x2aa1a5['newLevel']);}const _0x995a11=performance[_0x536e55(-0x61,-0x6b)](),_0xc516f8=Math['round'](_0x3ea9f2[_0x1deae3(0x5ae,0x5c9)](_0x995a11,_0x3b7a83)),_0x9138cb=Math[_0x536e55(0x86,0xa8)](_0x2f00f9-_0x168a9d),_0x58442f=Math[_0x1deae3(0x60d,0x68c)](_0x3ea9f2['OaJZR'](_0x4f2cf8,_0x48f846)),_0x8afeaf=Math[_0x1deae3(0x60d,0x56f)](_0x995a11-_0x137ecb);process['stderr'][_0x536e55(0x25,-0x73)](_0x1deae3(0x49e,0x3d6)+'ionEnd\x20com'+_0x536e55(-0x22,0x22)+_0x1deae3(0x507,0x595)+_0xc516f8+(_0x536e55(0x151,0xd6)+_0x536e55(-0x88,0x0))+_0x9138cb+'ms,\x20sync:\x20'+_0x58442f+(_0x536e55(0xde,0xd0)+_0x1deae3(0x59b,0x5ed))+_0x8afeaf+_0x536e55(0xe8,0xd2)),_0x59cb0f[_0x536e55(-0x62,-0x2f)](_0x1deae3(0x58b,0x646)+'eted',{'durationMs':_0xc516f8});}finally{_0x59cb0f[_0x536e55(-0x15,-0x7a)]();}}async function extractSessionMemories(_0x54d8ff,_0x5e5500,_0x40692e,_0x1e3635,_0x21a37e){const _0x83f829={'Zcnvn':function(_0x127326,_0x3eb6fd){return _0x127326(_0x3eb6fd);},'TplYq':'already\x20ex'+_0x17413d(0x45f,0x3fc),'rGdpE':'No\x20session'+_0x126eaf(0x73,0xc8)+'nd','sSVOY':_0x17413d(0x44e,0x432)+_0x126eaf(0x1ec,0x1b5),'Ojnxt':_0x17413d(0x390,0x314)+_0x126eaf(0x115,0x71)+_0x17413d(0x45d,0x45d),'MVuJw':_0x126eaf(0x1d7,0x127)+_0x17413d(0x312,0x350)+'e\x20last\x20ext'+_0x17413d(0x3f5,0x387),'LfDSi':_0x126eaf(0x98,0x45)+_0x17413d(0x428,0x3ca),'PLrhT':_0x17413d(0x349,0x3d0)+_0x126eaf(0x23,0x83),'WQwQX':function(_0x26bda4,_0x111adf,_0x359eaf,_0x1c61be){return _0x26bda4(_0x111adf,_0x359eaf,_0x1c61be);},'NKANj':function(_0x29eef5,_0x2ae045){return _0x29eef5>_0x2ae045;},'deMdp':function(_0x2d8f95,_0x3f0a48){return _0x2d8f95!==_0x3f0a48;},'qezRp':_0x17413d(0x398,0x3dc),'ypMXX':_0x126eaf(0xa8,0x57),'SkbIU':_0x126eaf(0x1aa,0x145)+_0x126eaf(0xcc,0xa8)+_0x126eaf(0x1cd,0x185)+_0x17413d(0x35d,0x3e0),'VhgRD':function(_0x4b3b8b,_0x258d7f){return _0x4b3b8b instanceof _0x258d7f;},'gpDHP':_0x17413d(0x3fb,0x458),'UEgbA':function(_0x51069b,_0x1116dd){return _0x51069b===_0x1116dd;},'UYXJD':_0x126eaf(-0x19,0x51),'LzjBL':_0x17413d(0x4b7,0x44e),'vBBSQ':function(_0x46763c,_0x3acbff){return _0x46763c>_0x3acbff;},'fTmjO':'\x20(incremen'+_0x17413d(0x3bc,0x453),'EQnPC':function(_0x2e8bc0,_0xed7a61){return _0x2e8bc0%_0xed7a61;},'MpaRT':_0x126eaf(0x1e7,0x1bb)+_0x17413d(0x3ba,0x411)+'s','kZHLj':function(_0x2e441d,_0x55e4f5,_0x3de5b4){return _0x2e441d(_0x55e4f5,_0x3de5b4);}},_0x47b2e8=findSessionFiles(_0x54d8ff[_0x17413d(0x29e,0x362)+'h']);if(_0x47b2e8[_0x126eaf(0xa8,0x4b)]===0x0){_0x1e3635[_0x17413d(0x431,0x3a0)](_0x83f829[_0x17413d(0x32f,0x304)]);return;}const _0x37d04a=_0x47b2e8['sort']((_0x2c2107,_0x3ec638)=>_0x3ec638[_0x126eaf(0x39,0x103)]-_0x2c2107[_0x126eaf(0x1aa,0x103)])[0x0],_0x983d32=_0x83f829[_0x17413d(0x397,0x35d)](parseSessionFile,_0x37d04a[_0x126eaf(0x93,0xaf)]),_0x1b3828=_0x983d32['filter'](_0x482ab0=>Array[_0x126eaf(0x14f,0x12a)](_0x482ab0[_0x17413d(0x27d,0x329)][_0x126eaf(0x48,0x55)])&&_0x482ab0[_0x17413d(0x3bc,0x329)][_0x126eaf(-0x36,0x55)][_0x17413d(0x394,0x3a3)](_0x5053a6=>_0x5053a6[_0x17413d(0x2e1,0x37a)]===_0x126eaf(0x27,0x54)))[_0x126eaf(0x46,0x4b)];_0x1e3635[_0x17413d(0x3d7,0x3a0)](_0x83f829[_0x17413d(0x373,0x3d7)],{'messages':_0x983d32['length'],'toolUseCount':_0x1b3828});if(_0x1b3828<_0x5e5500['sessionSum'+'mary'][_0x126eaf(0x1ff,0x13b)]){_0x1e3635[_0x17413d(0x38c,0x3a0)](_0x83f829[_0x17413d(0x39b,0x466)],{'toolUseCount':_0x1b3828,'threshold':_0x5e5500['sessionSum'+_0x126eaf(0x16,0x6f)][_0x17413d(0x41e,0x40b)]});return;}function _0x126eaf(_0x379e6d,_0x164652){return _0x5aa4(_0x164652- -0xc5,_0x379e6d);}const _0x220a2e=_0x40692e[_0x17413d(0x2ed,0x335)](_0x37d04a[_0x126eaf(0x189,0xef)]),_0x2c3c22=_0x220a2e?.[_0x17413d(0x50c,0x497)+'nt']??0x0;if(_0x220a2e&&_0x983d32['length']<=_0x2c3c22){_0x1e3635[_0x17413d(0x413,0x3a0)](_0x83f829[_0x17413d(0x3a2,0x439)],{'sessionId':_0x37d04a[_0x17413d(0x425,0x3bf)],'previousCount':_0x2c3c22,'currentCount':_0x983d32[_0x126eaf(0xc,0x4b)]});return;}const _0x3499eb=_0x220a2e?_0x983d32[_0x126eaf(0xe4,0xf0)](_0x2c3c22):_0x983d32;_0x1e3635[_0x126eaf(0x65,0xd0)](_0x83f829['LfDSi'],{'total':_0x983d32[_0x126eaf(0x2d,0x4b)],'new':_0x3499eb[_0x126eaf(0xec,0x4b)],'incremental':!!_0x220a2e});let _0x7cd4df;if(_0x5e5500[_0x126eaf(0xc5,0x86)]?.[_0x17413d(0x4ec,0x47d)])try{const {createLLMClient:_0x2e642b}=await import(_0x83f829[_0x126eaf(0x2c,0x7e)]),_0x37b3f2=_0x2e642b(_0x5e5500[_0x17413d(0x2aa,0x356)]);_0x7cd4df=await _0x83f829[_0x17413d(0x392,0x3e8)](extractMemoriesWithLLM,_0x3499eb,_0x54d8ff[_0x17413d(0x2ff,0x362)+'h'],_0x37b3f2);const _0x4f598c=await summarizeSession(_0x3499eb,_0x37b3f2);if(_0x4f598c&&_0x83f829[_0x126eaf(0x25b,0x1b2)](_0x4f598c[_0x126eaf(-0x6c,0x4b)],0xa)){if(_0x83f829[_0x17413d(0x3a6,0x3ce)](_0x83f829[_0x126eaf(0x84,0xb8)],'xWMFD')){const _0x5a280b=_0x45ddb7 instanceof _0x361825?_0x35a0ad['message']:_0x83f829['Zcnvn'](_0x4385ae,_0x174a54);!_0x5a280b[_0x17413d(0x3b8,0x46a)]('409')&&!_0x5a280b[_0x126eaf(0x252,0x19a)](_0x83f829['TplYq'])&&_0x9dfda[_0x126eaf(-0x1,0x9b)](_0x17413d(0x253,0x312)+_0x17413d(0x4c7,0x42d)+_0x17413d(0x30d,0x3c2),{'remoteId':_0x574733[_0x21cda7][_0x17413d(0x3e9,0x32f)],'error':_0x5a280b});}else _0x7cd4df['memories'][_0x126eaf(0x1c9,0x171)]({'content':_0x4f598c,'category':_0x83f829[_0x17413d(0x3e1,0x450)],'tier':_0x126eaf(0x165,0x99),'tags':['session-su'+_0x126eaf(0x7,0x76)],'projectPath':_0x54d8ff[_0x126eaf(0xd4,0x92)+'h']});}}catch(_0x5b1436){_0x1e3635['warn'](_0x83f829[_0x17413d(0x474,0x40c)],{'error':_0x83f829['VhgRD'](_0x5b1436,Error)?_0x5b1436[_0x17413d(0x3a0,0x329)]:String(_0x5b1436)}),_0x7cd4df=extractMemories(_0x3499eb,_0x54d8ff['projectPat'+'h']);}else _0x7cd4df=extractMemories(_0x3499eb,_0x54d8ff[_0x126eaf(0x9c,0x92)+'h']);_0x1e3635[_0x126eaf(0x64,0xd0)](_0x126eaf(0x15b,0x97)+_0x17413d(0x483,0x412),{'count':_0x7cd4df['memories'][_0x126eaf(0x1a,0x4b)]});function _0x17413d(_0x1b166f,_0x4b846f){return _0x5aa4(_0x4b846f-0x20b,_0x1b166f);}for(const _0x1f4d19 of _0x7cd4df['memories']){const _0x32593e=_0x40692e['createMemo'+'ry']({..._0x1f4d19,'sessionId':_0x37d04a['sessionId']});_0x40692e['setSyncSta'+'tus'](_0x32593e['id'],null,_0x83f829[_0x17413d(0x45d,0x406)]),_0x21a37e[_0x126eaf(0x243,0x171)](_0x32593e['id']);if(_0x5e5500[_0x126eaf(-0x21,0x88)]?.[_0x17413d(0x3f1,0x47d)]&&_0x83f829[_0x126eaf(0x1b8,0x1c9)](_0x5e5500[_0x126eaf(0x38,0x88)]['provider'],_0x83f829[_0x17413d(0x4f7,0x467)]))try{const {createEmbeddingProvider:_0x593e41}=await import(_0x126eaf(0x199,0x18b)+_0x126eaf(0x206,0x1c5)+'s'),_0x507b71=_0x593e41(_0x5e5500[_0x17413d(0x2b4,0x358)],_0x5e5500[_0x126eaf(0x156,0x86)]),_0x25911c=await Promise['resolve'](_0x507b71[_0x126eaf(0x1b,0x7c)](_0x32593e[_0x126eaf(0xf8,0x55)]));Array[_0x17413d(0x33f,0x3fa)](_0x25911c)&&_0x40692e[_0x17413d(0x322,0x3b4)+_0x17413d(0x3d8,0x393)](_0x32593e['id'],_0x25911c);}catch{}}if(_0x5e5500[_0x17413d(0x3a7,0x358)]?.[_0x17413d(0x4d3,0x47d)]&&_0x5e5500['embedding'][_0x126eaf(0xe8,0x1a0)]===_0x83f829[_0x17413d(0x4ad,0x3f2)]&&_0x5e5500[_0x17413d(0x3a6,0x356)]?.[_0x17413d(0x47b,0x481)]&&_0x21a37e[_0x126eaf(-0x7c,0x4b)]>0x0)try{const {createEmbeddingProvider:_0x4841a6}=await import(_0x126eaf(0x145,0x18b)+'ng/index.j'+'s'),_0x27dc4d=_0x4841a6(_0x5e5500[_0x17413d(0x2ea,0x358)],_0x5e5500['llm']),_0x26a1dc=_0x21a37e[_0x17413d(0x2ce,0x394)](_0x30affd=>{const _0x5d1350=_0x40692e[_0x4e1e1e(-0xac,-0x53)](_0x30affd);function _0x4e1e1e(_0x2114b2,_0x65a9e4){return _0x126eaf(_0x65a9e4,_0x2114b2- -0x1f3);}function _0xb75095(_0x207398,_0x218bf0){return _0x126eaf(_0x218bf0,_0x207398-0xaa);}return _0x5d1350?_0x5d1350[_0x4e1e1e(-0x19e,-0x188)]:'';})[_0x126eaf(0x106,0xf6)](Boolean);if(_0x26a1dc[_0x126eaf(0x5c,0x4b)]>0x0){const _0x2b8a27=await Promise['resolve'](_0x27dc4d[_0x126eaf(0xf2,0x11f)](_0x26a1dc));for(let _0x4aed09=0x0;_0x4aed09<_0x21a37e[_0x126eaf(0x25,0x4b)];_0x4aed09++){_0x2b8a27[_0x4aed09]&&_0x40692e[_0x17413d(0x47c,0x3b4)+_0x126eaf(0x136,0xc3)](_0x21a37e[_0x4aed09],_0x2b8a27[_0x4aed09]);}}}catch{}_0x40692e[_0x17413d(0x4f3,0x46f)+'n'](_0x37d04a[_0x17413d(0x440,0x3bf)],_0x54d8ff[_0x126eaf(-0x37,0x92)+'h'],_0x983d32[_0x17413d(0x2bc,0x31b)]);if(_0x83f829[_0x17413d(0x336,0x3bc)](_0x7cd4df[_0x17413d(0x508,0x490)][_0x126eaf(-0x1d,0x4b)],0x0)){const _0x594298=_0x220a2e?_0x83f829[_0x126eaf(0x189,0x137)]:'';console[_0x17413d(0x406,0x395)](_0x126eaf(0x5d,0xba)+'ion\x20summar'+'y'+_0x594298+':\x20'+_0x7cd4df[_0x126eaf(0x15c,0x1c0)]['length']+(_0x126eaf(0xbe,0xde)+'extracted\x20'+_0x126eaf(0x61,0x10b))+_0x3499eb[_0x126eaf(0xa2,0x4b)]+_0x17413d(0x38f,0x3ca));}if(_0x5e5500[_0x17413d(0x326,0x39f)+_0x17413d(0x321,0x334)]?.['enabled'])try{const _0x4daf39=_0x40692e['getSession'+_0x126eaf(0x17d,0x11b)](_0x54d8ff[_0x126eaf(0x99,0x92)+'h']);if(_0x4daf39>0x0&&_0x83f829[_0x126eaf(0x86,0xb4)](_0x4daf39,_0x5e5500['skillConve'+_0x126eaf(-0x9,0x64)][_0x17413d(0x38b,0x392)+_0x126eaf(0xe5,0xa3)])===0x0){const {SkillEvaluator:_0x14ea0f}=await import(_0x83f829['MpaRT']),_0x478aed=new _0x14ea0f(_0x40692e,_0x5e5500),_0xf5d1f5=_0x83f829[_0x17413d(0x4d1,0x41b)](createHookClient,_0x5e5500,0x2710)??undefined,_0x4163a2=await _0x478aed['evaluate'](_0x54d8ff[_0x126eaf(0xdd,0x92)+'h'],_0xf5d1f5);_0x83f829[_0x126eaf(0x266,0x1b2)](_0x4163a2[_0x126eaf(0x1d1,0x1a8)],0x0)&&console[_0x17413d(0x2c6,0x395)](_0x17413d(0x4b6,0x44a)+_0x17413d(0x35c,0x3ba)+_0x17413d(0x380,0x326)+_0x4163a2[_0x17413d(0x3e5,0x478)]+(_0x126eaf(0x1a3,0x189)+_0x17413d(0x32d,0x32c)));}}catch(_0x54c2e5){_0x1e3635[_0x17413d(0x3ca,0x36b)](_0x126eaf(0xc2,0x18a)+_0x126eaf(0xdd,0x1a2)+_0x126eaf(0xe6,0x113),{'error':_0x54c2e5 instanceof Error?_0x54c2e5['message']:_0x83f829[_0x17413d(0x384,0x35d)](String,_0x54c2e5)});}}function _0x385a(){const _0x4fb0ef=['DwXSEq','D2vwqNO','BgvK','EuvVtMW','y2TPBMC','DhjHy3rPB24GzG','Dg9tDhjPBMC','v1f3uvG','Aw9Ul2zPBguTCG','AfvWCuG','q291BNq','sMTKqMu','tM8GChjVAMvJDa','Dg8GC2vYDMvY','zw1IzwrcyxrJAa','DxbKyxrLsw5Qzq','CgXLDgvKicH0BW','thPQqKW','C2vZC2LVBLn1Bq','zxnZAw9Urw5K','sg9VAYbJB21WBa','vLn6rfe','tM8GBMv3ig1LCW','yMvZs2G','y2HLy2TgAwXLra','AxnbCNjHEq','veTozNG','Axn0CW','DgvK','DgvHBsbZEw5Jia','t2rHC2u','rerSAMS','odm0mdm2t0firhfd','DxnOigzHAwXLza','u2vZC2LVBIbLEa','AKfUrLq','CdOG','z3besfa','zLrTAK8','rw1VDgLVBIbIDq','AwXLza','C2v0','BwLUqwn0Aw9UCW','u2TIsvu','Bwf4ugvYu2vZCW','DcbHBMqGCMvSyq','AwvUy3LfDMvUDa','Aw9Urw5K','DMfSDwf0B3iUAG','EhrYywn0zwq','uuzwweu','z3D0tLi','teXnigv4DhjHyW','Aw9U','z2v0twvTB3j5','tevNsMS','z3bYEMS','zxHPC3rZ','A1PitgO','Cg1lwuC','u3LUyYbWDxnOia','DgL2zw5LC3m','z2v0rw1IzwrKAq','DxjS','DgvZDenVBM5LyW','sw5Qzwn0Aw9Uia','C3bSAxq','AuvMzwG','v2fnwKW','BLneDwu','D2rmtxi','Aw9UoIa','EhDOrKW','Bw90Aw9UtwvZCW','q092Cxe','mtKZmteYsKDHwMrH','Dgv4De1LBwjLCG','sg9VAYbZDgfYDa','t0rHDum','y29UDgv4DfrHzW','BMv3tgv2zwW','u2vZC2LVBIbHBG','t1L0ALm','BMvKihvWia','DxbSAwnHDgu','DgLJzq','BgfIBgu','DMvS','tvz1sNC','ywLSzwq','yw5HBhL6zuvTBW','Efv2whq','mJuYndm2mev5DhzTta','t1Doq3e','CMvHDgvKlca','zw5KC1DPDgG','ChvZAa','wK11swi','ndC3uKP4wMPU','zw5JEs9KzxrLyW','igv4CgLYzwqSia','Cg9ZDfbYB2zPyW','y29Uy2f0','zc50CW','ywLbufC','w2eYyv0Gu2TPBa','BgLZDe1LBw9YAq','C2vYDMvY','BgLMzwn5y2XL','B3bLBMfP','Bg9Nz2LUzW','ExbnwfG','DcaO','Aw5NigDYywnLzG','DgfSkq','BwPAv3K','zcWGDxnPBMCGyG','y3jvz00','ihjLzMvYzw5Jzq','CgvUzgLUzW','ig5LDYbZA2LSBa','u2TPBgWGzxzHBa','lI4Vzw1IzwrKAq','ywXYzwfKEsbLEa','ihrOCMvZAg9Sza','ywrKq29UDgv4Da','zMLSzv9Pza','qMf0y2G','EsbZzxj2zxiGCa','odGYndi5q3PhB1L1','ufD5ruK','ChvZAe9Uu2vZCW','tevPsM0','t2PUEhq','vvLysKq','y2f0zwDVCNK','zxH0','Aw5JBhvKzxm','q2XLyw51CcbMyq','ignVBNrLEhqGyW','qNjdCK8','yxjNDG','C2f2zvnLC3nPBW','ChjVDMLKzxi','zxHWAxjLza','Dwf0Aw9UigzHAq','sKjOyNm','zwqGDg8GC2vYDG','zwzLCMvUy2uUAG','q1fky3a','CM91BMq','y3jLyxrLza','u2vZC2LVBKvUza','B3v0y29Tzq','Efngtg8','uLn2r0e','zw5HyMXLza','Aw9Urw5KigvYCG','yvfyBK0','w2eYyv0Gu3LUyW','yxbPs2v5','tKTbtMO','BNrKsLK','DcbUB3qGyxzHAq','ywX5C2LZ','y3jLyxrLuMvSyq','y2vKrw1VDgLVBG','iIbSzxzLBca','u2vZC2LVBIb3Aq','BML6zxiUANm','lI4VC2TPBgWVzq','igfUywX5EMvK','yMf0y2GTC3LUyW','CLDnCKW','iokgKIa','BwvTB3jPzxm','sM9jrfC','zwzMzwn0AxzLBG','ignHDxnHBcbYzq','ndzkzNjxrgm','BMCVAw5KzxGUAG','zxHPDa','BwvZC2fNzunVDq','lI4VBgLMzwn5yW','vuvNyKe','rhzoB3G','igXVDY1XDwfSAq','mJeWnJu5mMjxC2r0Bq','DgLVBI5QCW','DKLZzNq','BxmSignSzwfUDq','sxneuxm','BxmPcG','tKrsEKW','C2L6zq','mJuYn3HhvLziwa','BxmGFcbLEhrYyq','C3LUy0rLBhrH','v3HAyxu','se1hrfG','w2eYyv0GrMLSzq','zgvJAxnPB24','y3jLyxrLtwvTBW','CKDKCeu','Ew5Jzwq','ihbYB21WDcHZkq','Aw9Urw5KihnHzG','w0eYqv0Gu2vZCW','igv2zw50khmPia','C2TPBgXnzw1VCG','qLHPB1C','zxjYB3jFC29SDq','y3rPB25fzMzLyW','ChvZAgvK','DxjYzw5JzsbYzq','CMvJB3jKuhjHyW','CMvMzxjLBMnL','tunhigfKzenVBG','BK1LC3nHz2vZuW','vg9VBcb1C2uGyW','uhjVy2vZC2LUzW','yKfeAve','yvPYBe8','uhjVzMLJAwvUyW','AhnQu1O','Dw5RBM93BG','BgvUz3rO','zw1VDgLVBLrYyq','rgX4vwC','tunhignVx29JyW','BKfbrwq','DgLVBG','Bg9JywW','AM9PBG','rNjkzu0','Dg9VBf91C2u','y29UDgvUDa','AxPHDgLVBJOG','BgvHCM5PBMC','uwD0wvi','BwvZC2fNzq','sLrzDfi','ig1LBw9YAwvZ','CYbJCMvHDgvK','igXPBMSOCYKGyW','zxr5ihrPBwvVDq','CMvTB3rLswq','w2eYyv0Grw1VDa','C3rKAw4','CeH6CKW','yxv0B1n5BMm','CNnPB24','z2v0u2vZC2LVBG','wMztuNG','y29Kzv9Wyxr0zq','DgvHBvbHDgG','rKf0vfu','BMPLy3rPB24','wvPduwC','DxrMltG','zw5JEs90CMfJAW','zc5QCW','BwfYEq','qMPnBwK','B3vUDcbIzwXVDW','w2eYyv0GvgvHBq','ChjLDMLVDxnmzq','D0joz2y','zxnZ','Bw1HCNK','Bg93uxvHBgL0Eq','BhD4wg4','B25iAxrZ','yw5JAg9Y','BwqTzg9JDw1LBG','zw1Izwq','C093wKW','ueXYAfq','C2vZC2LVBI1LBG','C2fNzxmGC2LUyW','DxbKyxrL','EMfOvLO','zxGUANm','yw0TC3LUy2HYBW','zMX1C2G','BgXT','y29UDMvUDgLVBG','zw1IzwrKAw5N','ugf0AcbWCM92Aq','Bgf0Aw9UCYbMyq','C2vZC2LVBG','D3jPDgu','wMnUDM4','C2HHmJu2','Avzyq2e','t3v6wLG','Agv4','ChjVAMvJDfbHDa','rMLSzsbYzwzLCG','BM93','igzPBguOCYKGDq','uhDyB3e','twvTB3jPzxmGzq','ig1LBwjLCNmSia','C2vTyw50Awm','zw5JzxmGC3LUyW','D2fYBG','Cgf0Aa','y2XPzw50ig5VDa','C2TPBgW','nda5','zMvYzw5JzxmGzG','DgfSoIa','EeXyqui','sw50zxj2ywW','yxrJAc1WDxnOzq','igvYCM9YCZOG','BwfYA0vTB3rPBW','zLHjvMC','DgLVBIbMywLSzq','z2v0vw5Zzw50rq','DhLWzq','Dg9gAxHLza','vgvHBsbZEw5Jia','w1nLC3nPB25Dia','DxbSB2fKrMLSzq','zMLSzvbHDgG','DgfNCW','y2f1C2fS','CgXVywrLza','y3j5ChrV','rvfUuem','EwnwAe0','z2v0tgf0zxn0sq','CMfJDgLVBG','Cwv6uNa','zw5JzsbZEw5Jia','w2eYyv0Gu2vZCW','yuDLq08','zxiUANm','BLPUsgK','twvTyMvY','zKTWBwO','BwvTyMvY','lI4VChjVzMLJAq','zxzHBhvHDgLVBG','Aw5N','BwfW','zxjYB3i','ChjVzMLJAwvUyW','rxvxwLm','igzPBgvZigzVDq','mZvIwgrxwuy','twvZC2fNzxm','BMmGzMfPBgvK','q2XLyw51CcbKBW','A0nvrue','zhPktfe','C2TPBgXdB252zq','Aw5MBW','EuLK','B3i6','C29Tzq','ntbNrLjfC0C','w2eYyv0GuhjVzG','BM9KzuLK','zwqG','Au5wzuW','vNDeufa','vLH2BM8','DwTQyMW','DgGG','B3jkCxi','ig1LBw9YAwvZia','zMfPBgvK','uwrpAgS','ALLxrwG','C3LUyYbJBgLLBG','lI4VzxH0CMfJDa','C2f2zuvTyMvKza','AwnPzw5JEtOG','DgLTzw91De1Z','y3jLyxrLq29UDa','qw9It1y','z3PRsw8','BcbJCNLZDgfSBa','Dg90ywXjBMPLyW','DKjcu1e','y2L0zwq','AgfZ','C2vZC2LVBKLK','C2XPy2u','ALzcuNm','igzHAwXLza','Bgv2zwXdAgfUzW','z2v0','ihn5BMnLzca','zMLSDgvY','qKvuDwG','wwzmuLO','CenfuwG','ig1LC3nHz2vZ','tunhihn5BMndBW','BMnL','zgLMzMLJDwX0Eq','zgvnzha','y3q6ia','lI4VBgXTl2LUza','uNzgwK8','y2XLyw51Cfn5BG','Bw9KAwzPzwrbDa','DgvHBq','ve5LuhC','Bw1HCNKGzgLZyq','C1nwt1K','zxjYB3jZ','z1HVqMi','s3btsg4','zNjVBsa','EfDnrKq','Dg90ywW','AuLjzu4','rw1VDgLVBIbZEq','yxnPyW'];_0x385a=function(){return _0x4fb0ef;};return _0x385a();}function _0x5aa4(_0x4e64d8,_0x561284){_0x4e64d8=_0x4e64d8-0xf3;const _0x385a6c=_0x385a();let _0x5aa4a9=_0x385a6c[_0x4e64d8];if(_0x5aa4['XpgFLM']===undefined){var _0x266f68=function(_0x40e648){const _0x3072f7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x32a65b='',_0x51e31d='';for(let _0xbd8d03=0x0,_0x3fba8d,_0x1a8443,_0x1e4277=0x0;_0x1a8443=_0x40e648['charAt'](_0x1e4277++);~_0x1a8443&&(_0x3fba8d=_0xbd8d03%0x4?_0x3fba8d*0x40+_0x1a8443:_0x1a8443,_0xbd8d03++%0x4)?_0x32a65b+=String['fromCharCode'](0xff&_0x3fba8d>>(-0x2*_0xbd8d03&0x6)):0x0){_0x1a8443=_0x3072f7['indexOf'](_0x1a8443);}for(let _0x1754a9=0x0,_0x2febfe=_0x32a65b['length'];_0x1754a9<_0x2febfe;_0x1754a9++){_0x51e31d+='%'+('00'+_0x32a65b['charCodeAt'](_0x1754a9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x51e31d);};_0x5aa4['XZczsH']=_0x266f68,_0x5aa4['tJlqjZ']={},_0x5aa4['XpgFLM']=!![];}const _0x5c096d=_0x385a6c[0x0],_0x2143f5=_0x4e64d8+_0x5c096d,_0x393051=_0x5aa4['tJlqjZ'][_0x2143f5];return!_0x393051?(_0x5aa4a9=_0x5aa4['XZczsH'](_0x5aa4a9),_0x5aa4['tJlqjZ'][_0x2143f5]=_0x5aa4a9):_0x5aa4a9=_0x393051,_0x5aa4a9;}function _0x4d1c93(_0x165dac,_0x50b5fd){return _0x5aa4(_0x50b5fd- -0x3c6,_0x165dac);}async function trackProficiencyLocal(_0x65999a,_0x108479,_0x29c2be,_0x4239ea,_0x1bbc24){const _0xd79b44={'hsjSZ':function(_0x5a4217,_0x52e197){return _0x5a4217??_0x52e197;},'ngedO':'../profici'+_0x2dfdcd(0x72,0x100)+_0x2dfdcd(0xc1,0x179),'ODauC':_0x1ba06e(0x329,0x2fc)+_0x2dfdcd(0x179,0x126)+_0x2dfdcd(0x1d2,0x249),'WaMZL':_0x1ba06e(0x306,0x3c9),'uOtJK':_0x2dfdcd(0x4d,0x78)+'y\x20tracking'+'\x20failed','hUpqH':function(_0x3b18ee,_0x513f62){return _0x3b18ee instanceof _0x513f62;}},_0x4eba2b=[];function _0x1ba06e(_0x38e962,_0x446b80){return _0x5aa4(_0x38e962-0x1a3,_0x446b80);}function _0x2dfdcd(_0x5f0243,_0x5493bd){return _0x5aa4(_0x5f0243- -0xc0,_0x5493bd);}try{const {ProficiencyTracker:_0x463f23}=await import(_0xd79b44['ngedO']),{detectSkillPractice:_0x5b8b59}=await import(_0xd79b44[_0x2dfdcd(0x164,0x188)]),_0x4f8356=new _0x463f23(_0x29c2be,_0x108479[_0x2dfdcd(0xcb,0x1f)+'y']),_0x46e1c7=_0x29c2be[_0x2dfdcd(0x180,0x128)+'es']({'category':_0xd79b44[_0x1ba06e(0x3bd,0x3ab)],'limit':0x64}),_0x1a8fc9=_0x1bbc24[_0x2dfdcd(0xc9,0xba)](_0x7128f4=>{function _0x4eaace(_0x3668a4,_0x51d1d2){return _0x2dfdcd(_0x51d1d2- -0x126,_0x3668a4);}function _0xca31c9(_0x339668,_0x1a3089){return _0x2dfdcd(_0x1a3089-0x2e4,_0x339668);}const _0x5d09e3=_0x29c2be[_0x4eaace(-0x47,0x26)](_0x7128f4);if(!_0x5d09e3)return null;const _0x5ef5d7=_0x29c2be[_0x4eaace(0x10,0x2e)+'ng'](_0x7128f4);return{'content':_0x5d09e3[_0xca31c9(0x28c,0x33e)],'tags':_0x5d09e3[_0x4eaace(0x4b,-0x71)]??[],'embedding':_0xd79b44[_0x4eaace(-0x4a,-0xd8)](_0x5ef5d7,undefined)};})[_0x1ba06e(0x35e,0x2d9)](_0x148490=>_0x148490!==null);for(const _0x215af1 of _0x46e1c7){const _0x3efce0={'id':_0x215af1['id'],'content':_0x215af1[_0x2dfdcd(0x5a,-0x52)],'tags':_0x215af1[_0x2dfdcd(0xb5,0x174)]??[],'embedding':_0x215af1[_0x2dfdcd(0x8d,0xd0)]??_0x29c2be[_0x1ba06e(0x3b7,0x424)+'ng'](_0x215af1['id'])??undefined},_0x34aacb=_0x5b8b59(_0x3efce0,_0x1a8fc9);if(!_0x34aacb)continue;const _0x2f24e0=_0x4f8356[_0x1ba06e(0x2a8,0x1fa)+_0x2dfdcd(0x16b,0x1b4)](_0x215af1['id'],_0x34aacb[_0x1ba06e(0x412,0x4b1)],_0x34aacb[_0x1ba06e(0x365,0x357)],_0x34aacb[_0x2dfdcd(0x165,0x130)+'s'],_0x65999a[_0x2dfdcd(0xf4,0x82)]);_0x2f24e0[_0x1ba06e(0x35b,0x35d)+'ed']&&console[_0x1ba06e(0x32d,0x2f5)](_0x1ba06e(0x33d,0x2c8)+'iciency:\x20\x22'+_0x215af1['content'][_0x2dfdcd(0x158,0x15c)]('\x0a')[0x0][_0x2dfdcd(0xf5,0x10a)](0x0,0x32)+_0x2dfdcd(0x1bd,0x175)+_0x2f24e0[_0x1ba06e(0x2db,0x386)+_0x2dfdcd(0x16d,0xe6)]+_0x2dfdcd(0x1c4,0x207)+_0x2f24e0[_0x2dfdcd(0x166,0xa7)]),_0x4eba2b[_0x1ba06e(0x3d9,0x35c)]({'skillMemoryId':_0x215af1['id'],'outcome':_0x34aacb[_0x2dfdcd(0x1af,0x1a8)],'difficulty':_0x34aacb[_0x1ba06e(0x365,0x338)],'contextTags':_0x34aacb[_0x1ba06e(0x3c8,0x3ff)+'s']});}}catch(_0xe1407e){_0x4239ea[_0x2dfdcd(0xa0,0x14b)](_0xd79b44['uOtJK'],{'error':_0xd79b44[_0x1ba06e(0x382,0x408)](_0xe1407e,Error)?_0xe1407e[_0x2dfdcd(0x5e,0xe1)]:String(_0xe1407e)});}return _0x4eba2b;}async function pushProficiencyToServer(_0x44803c,_0x5290c5,_0x48b5ea,_0x4bc374){function _0x500fc9(_0x4912d1,_0x27e21d){return _0x5aa4(_0x4912d1- -0x61,_0x27e21d);}const _0x605831={'QFVXE':function(_0x2c7d4d,_0x26c2e1){return _0x2c7d4d instanceof _0x26c2e1;}};function _0x3296e3(_0x5e334b,_0x290c19){return _0x5aa4(_0x290c19- -0x2d,_0x5e334b);}try{const _0x270411=createHookClient(_0x48b5ea);if(!_0x270411)return;const _0x52bfbb=await _0x270411[_0x3296e3(0x1f3,0x1e9)+_0x3296e3(0x1a5,0xe8)]();if(!_0x52bfbb)return;await _0x270411[_0x500fc9(0x1da,0x279)+_0x3296e3(0x223,0x1d7)+_0x3296e3(0x22f,0x228)](_0x44803c[_0x500fc9(0x128,0xcf)](_0x55c0a1=>({'skill_memory_id':_0x55c0a1[_0x3296e3(0x185,0xd2)+_0x500fc9(0x135,0xbb)],'outcome':_0x55c0a1[_0x500fc9(0x20e,0x1df)],'difficulty':_0x55c0a1[_0x3296e3(0x173,0x195)],'context_tags':_0x55c0a1[_0x3296e3(0x1bf,0x1f8)+'s'],'session_id':_0x5290c5[_0x3296e3(0x1aa,0x187)]}))),_0x4bc374[_0x3296e3(0x1f0,0x168)](_0x500fc9(0xac,0x57)+'y\x20events\x20b'+_0x3296e3(0x1b6,0x13c)+'d\x20to\x20serve'+'r',{'count':_0x44803c[_0x500fc9(0xaf,0x8c)]}),console['error'](_0x3296e3(0xb9,0x16d)+_0x500fc9(0x149,0xdc)+_0x44803c[_0x3296e3(0x48,0xe3)]+(_0x500fc9(0x9d,0x82)+_0x500fc9(0x221,0x280)+_0x500fc9(0x208,0x1c8)+'er'));}catch(_0x333f00){_0x4bc374[_0x3296e3(0x146,0x133)](_0x3296e3(0x1e,0xe0)+_0x500fc9(0x1f5,0x25d)+_0x3296e3(0x180,0x1ca),{'error':_0x605831[_0x3296e3(0x15a,0x1db)](_0x333f00,Error)?_0x333f00[_0x500fc9(0xbd,0x69)]:String(_0x333f00)});}}async function flushEmotionBuffer(_0x3ac2b7,_0x53b8ce,_0x317bf8){const _0x428c8d={'XJXiZ':_0x24ad34(-0x1b1,-0x22f),'yEoNl':'File\x20refer'+_0x24ad34(-0x197,-0xd4)+'failed','WxZau':function(_0x1a3c55,_0x2e5772){return _0x1a3c55>_0x2e5772;},'JTYtR':_0x49341c(0x4b6,0x468),'jVBRs':_0x24ad34(-0x195,-0xf8)},_0x25a934=_0x53b8ce[_0x49341c(0x373,0x341)+_0x49341c(0x41f,0x3f2)+'ages'](_0x3ac2b7[_0x49341c(0x356,0x2e4)+_0x49341c(0x452,0x3ad)]?.[_0x24ad34(-0x113,-0x1d2)+_0x24ad34(-0x10a,-0x90)]??0xa);function _0x49341c(_0x3c2dfa,_0x1ab57c){return _0x5aa4(_0x1ab57c-0x1d3,_0x3c2dfa);}if(_0x25a934[_0x49341c(0x234,0x2e3)]===0x0)return;const _0x5575fa=createHookClient(_0x3ac2b7);function _0x24ad34(_0x271a00,_0x573b14){return _0x5aa4(_0x271a00- -0x315,_0x573b14);}if(!_0x5575fa)return;const _0x55dd15=await _0x5575fa['testConnec'+'tion']();if(!_0x55dd15)return;const _0x37fed1=[];for(const {id:_0x206a3e,message:_0x3c7e0a}of _0x25a934){try{await _0x5575fa[_0x49341c(0x421,0x403)+_0x24ad34(-0x200,-0x260)](_0x3c7e0a),_0x37fed1['push'](_0x206a3e);}catch{}}if(_0x428c8d[_0x24ad34(-0x221,-0x1b7)](_0x37fed1['length'],0x0)){if(_0x428c8d[_0x49341c(0x2ff,0x2f2)]!==_0x428c8d[_0x49341c(0x2db,0x389)])_0x53b8ce[_0x49341c(0x3cd,0x33e)+'nMessagesS'+_0x24ad34(-0x21b,-0x17d)](_0x37fed1),_0x53b8ce[_0x24ad34(-0x14e,-0xed)+_0x49341c(0x39a,0x44f)+_0x49341c(0x322,0x362)](),console['error'](_0x49341c(0x35f,0x2f8)+'ion:\x20'+_0x37fed1[_0x24ad34(-0x205,-0x141)]+('\x20prompt(s)'+_0x49341c(0x3b4,0x454))),_0x317bf8['info'](_0x24ad34(-0x118,-0x196)+'ffer\x20flush'+'ed',{'sent':_0x37fed1[_0x49341c(0x2e4,0x2e3)],'total':_0x25a934[_0x49341c(0x32a,0x2e3)]});else{const _0x3879a3=_0x484e5a instanceof _0x1a18a0?_0x2afed8[_0x24ad34(-0x1f7,-0x2ad)]:_0x33ced4(_0x283ba2);!_0x3879a3[_0x49341c(0x372,0x432)](_0x428c8d['XJXiZ'])&&!_0x3879a3['includes'](_0x24ad34(-0xc4,-0x32)+_0x49341c(0x403,0x3c4))&&_0x39491f[_0x24ad34(-0x1b5,-0x13a)](_0x428c8d[_0x49341c(0x3e6,0x3ac)],{'refPath':_0x55f37b,'error':_0x3879a3});}}}async function syncFileReferences(_0x154ea2,_0x242be7,_0x49af76,_0x12da65,_0x28b286){function _0xfa75bd(_0x2774a2,_0x4c1709){return _0x5aa4(_0x4c1709-0x21a,_0x2774a2);}function _0x206563(_0x5b3681,_0x37d617){return _0x5aa4(_0x5b3681- -0x2d0,_0x37d617);}const _0x54ff38={'iNVeL':_0xfa75bd(0x316,0x3c2)+_0x206563(-0xf2,-0x53)+_0xfa75bd(0x537,0x484)+'s','paBju':_0xfa75bd(0x3c3,0x37b),'mfSUb':function(_0x1fcffa,_0x4a0e77,_0x3d8a23){return _0x1fcffa(_0x4a0e77,_0x3d8a23);},'xLXAB':function(_0x460a2d,_0xbdeb76){return _0x460a2d===_0xbdeb76;},'BjMmi':function(_0x32df32,_0x487223){return _0x32df32(_0x487223);},'LEiJm':function(_0x3e337f,_0x523b26){return _0x3e337f(_0x523b26);},'nAAEd':_0xfa75bd(0x3e7,0x370),'cnEpV':function(_0x172bac,_0x469e58){return _0x172bac===_0x469e58;},'pHzrL':_0x206563(-0x1ca,-0x1b4),'ycVhM':_0xfa75bd(0x447,0x48b),'mjZWy':function(_0x3cb358,_0x44322b){return _0x3cb358(_0x44322b);},'gwtNR':'409','OWNCq':_0xfa75bd(0x2fb,0x372)+_0x206563(-0x171,-0xdf)+'ed','BETuh':'syncFileRe'+_0xfa75bd(0x33f,0x37f)+_0x206563(-0xa1,-0x155),'wdLMr':function(_0x30d231,_0x32371f){return _0x30d231(_0x32371f);}};try{const _0x2ff141=createHookClient(_0x49af76);if(!_0x2ff141)return;const {detectMdReferences:_0x397021}=await import(_0x54ff38[_0x206563(-0x133,-0x117)]),{createHash:_0x21b523}=await import(_0x206563(-0x158,-0xac)),{readFileSync:_0x3ddfb8}=await import('fs'),{resolve:_0x5cedcd}=await import(_0x54ff38['paBju']),_0x4fb621=new Map();let _0x31ba53=0x0;for(const {localId:_0x49535b,remoteId:_0x277230}of _0x154ea2){const _0x5abe6e=_0x12da65['getMemory'](_0x49535b);if(!_0x5abe6e)continue;const _0x10976c=_0x54ff38['mfSUb'](_0x397021,_0x5abe6e[_0x206563(-0x1b6,-0x10e)],_0x242be7[_0x206563(-0x179,-0x246)+'h']);if(_0x54ff38[_0xfa75bd(0x357,0x381)](_0x10976c[_0xfa75bd(0x390,0x32a)],0x0))continue;for(const _0x5b3e94 of _0x10976c){try{const _0x608508=_0x5cedcd(_0x242be7[_0xfa75bd(0x2ad,0x371)+'h'],_0x5b3e94),_0x2a3814=_0x54ff38[_0xfa75bd(0x3d4,0x34f)](_0x3ddfb8,_0x608508),_0x29a3d1=_0x54ff38[_0xfa75bd(0x432,0x474)](_0x21b523,_0x206563(-0x17d,-0x1d3))[_0x206563(-0x18a,-0x1d8)](_0x2a3814)['digest'](_0x54ff38[_0x206563(-0x1bc,-0x257)]);let _0x264033=_0x4fb621[_0xfa75bd(0x386,0x3d3)](_0x29a3d1);if(!_0x264033){const _0x4b75b8=await _0x2ff141[_0x206563(-0xe2,-0xac)+_0x206563(-0xa6,-0x20)](_0x29a3d1);if(_0x4b75b8[_0x206563(-0xc1,-0x188)]&&_0x4b75b8[_0x206563(-0x7c,-0xa2)])_0x264033=_0x4b75b8[_0xfa75bd(0x442,0x46e)];else{if(_0x54ff38['cnEpV']('gprzk',_0x206563(-0xc2,-0x190))){const _0x4149d1=await _0x2ff141[_0xfa75bd(0x311,0x38d)](_0x608508,{'category':_0x54ff38[_0x206563(-0x1a9,-0x248)],'tags':['memory-ref'+'erence',_0x206563(-0x190,-0x1d9)+'t']});_0x264033=_0x4149d1['id'];}else _0xa463b3();}_0x4fb621[_0xfa75bd(0x4a1,0x419)](_0x29a3d1,_0x264033);}await _0x2ff141[_0x206563(-0x1d8,-0x1cb)+'ryFileLink'](_0x277230,_0x264033,{'reference_type':_0x206563(-0x11e,-0xd0),'reference_path':_0x5b3e94}),_0x31ba53++;}catch(_0x2f7324){if(_0x54ff38[_0xfa75bd(0x355,0x394)]!==_0x54ff38[_0xfa75bd(0x36f,0x394)])_0x17ebe3[_0x206563(-0x146,-0x11e)](_0xfa75bd(0x2fa,0x351)+_0x206563(-0x116,-0x183)+_0x433f6b[_0x206563(-0x1cd,-0x11a)]+'\x20memories');else{const _0x2d68a9=_0x2f7324 instanceof Error?_0x2f7324['message']:_0x54ff38[_0x206563(-0x87,-0x124)](String,_0x2f7324);!_0x2d68a9[_0x206563(-0x71,-0x7a)](_0x54ff38[_0xfa75bd(0x431,0x423)])&&!_0x2d68a9[_0x206563(-0x71,-0xcc)](_0xfa75bd(0x53f,0x46b)+_0xfa75bd(0x356,0x40b))&&_0x28b286['warn'](_0x206563(-0x178,-0xbc)+'ence\x20sync\x20'+'failed',{'refPath':_0x5b3e94,'error':_0x2d68a9});}}}}_0x31ba53>0x0&&console['error'](_0x206563(-0x1da,-0x126)+_0x206563(-0x84,0xd)+'s:\x20'+_0x31ba53+(_0x206563(-0x1ae,-0xde)+_0x206563(-0x9c,-0x126))+_0x4fb621[_0x206563(-0x38,0x92)]+(_0xfa75bd(0x350,0x374)+_0x206563(-0x159,-0xb9))),_0x28b286[_0xfa75bd(0x38a,0x3af)](_0x54ff38[_0xfa75bd(0x431,0x44d)],{'linked':_0x31ba53,'files':_0x4fb621['size']});}catch(_0x4e41dc){_0x28b286[_0xfa75bd(0x42a,0x37a)](_0x54ff38[_0x206563(-0x114,-0x187)],{'error':_0x54ff38[_0xfa75bd(0x456,0x436)](String,_0x4e41dc)});}}async function syncContextAndRelations(_0x58b838,_0x4e3867,_0x468d82,_0x304dea,_0x51aaf7){function _0x3c5d22(_0x2f82e3,_0x306c13){return _0x5aa4(_0x2f82e3-0x2cc,_0x306c13);}const _0x17f141={'lwxXn':function(_0x58ea9b,_0x4399fe){return _0x58ea9b<_0x4399fe;},'DlKou':function(_0x948286,_0x56152d){return _0x948286>_0x56152d;},'iVXCa':_0x1e1abf(-0x2d4,-0x23d),'RvFZO':_0x1e1abf(-0x293,-0x2e7),'VSzDQ':function(_0x5956b0,_0x1034a6){return _0x5956b0!==_0x1034a6;},'besKh':_0x3c5d22(0x405,0x42a),'iIIeN':_0x3c5d22(0x451,0x454),'mCBMw':function(_0x1e8772,_0x101d74){return _0x1e8772 instanceof _0x101d74;},'pCEQh':function(_0x7e86ac,_0x405792){return _0x7e86ac(_0x405792);},'TKNfx':'already\x20ex'+_0x3c5d22(0x4bd,0x494),'dzJLQ':_0x3c5d22(0x4f4,0x5c8),'zahVZ':_0x3c5d22(0x3f7,0x340),'tpdjp':'co_occurre'+_0x1e1abf(-0x222,-0x1a6),'aZrlO':_0x3c5d22(0x3c3,0x30b),'KpSHn':_0x3c5d22(0x3f8,0x47c)+'rn','JBhbs':_0x3c5d22(0x3cd,0x485)+_0x3c5d22(0x3e1,0x407),'Odase':_0x1e1abf(-0x26d,-0x1d3),'YfLRZ':'409','vSQTD':'MCG\x20causal'+'\x20relation\x20'+'failed','JoIDW':function(_0x4df7bf,_0x138434){return _0x4df7bf*_0x138434;},'crUgM':'MCG\x20contex'+_0x1e1abf(-0x1e0,-0x136)+'tions\x20sync'+'ed','ntdJY':_0x1e1abf(-0x223,-0x2ef)+'ntextAndRe'+_0x1e1abf(-0x294,-0x361)+'iled'};function _0x1e1abf(_0x1ec4d8,_0x451a5f){return _0x5aa4(_0x1ec4d8- -0x3e3,_0x451a5f);}if(_0x17f141[_0x1e1abf(-0x2a6,-0x27a)](_0x58b838[_0x1e1abf(-0x2d3,-0x276)],0x2))return;const _0x1106bb=0x14,_0x5f103f=_0x17f141['DlKou'](_0x58b838[_0x1e1abf(-0x2d3,-0x37b)],_0x1106bb)?_0x58b838[_0x3c5d22(0x481,0x3ca)](0x0,_0x1106bb):_0x58b838,_0x54b4ff=createHookClient(_0x468d82);if(!_0x54b4ff)return;try{const _0x1b0408=_0x4e3867[_0x1e1abf(-0x22f,-0x22a)]?.['slice'](0x0,0x8)??_0x17f141[_0x1e1abf(-0x28f,-0x260)],_0x4f29fd=await _0x54b4ff[_0x1e1abf(-0x237,-0x1df)+_0x1e1abf(-0x185,-0x1d9)]({'topic':_0x3c5d22(0x43e,0x394)+_0x1b0408,'summary':_0x1e1abf(-0x165,-0x14c)+_0x3c5d22(0x46d,0x528)+_0x58b838[_0x3c5d22(0x3dc,0x316)]+_0x1e1abf(-0x2c3,-0x343),'source_type':_0x17f141[_0x1e1abf(-0x21d,-0x2aa)],'source_id':_0x4e3867[_0x1e1abf(-0x22f,-0x2fb)],'memory_count':_0x58b838[_0x3c5d22(0x3dc,0x478)]}),_0x1b2e9f=_0x4f29fd['id'];for(let _0x2bb2bb=0x0;_0x2bb2bb<_0x5f103f[_0x1e1abf(-0x2d3,-0x393)];_0x2bb2bb++){if(_0x17f141[_0x1e1abf(-0x1f8,-0x2aa)]('rsSHD',_0x17f141[_0x3c5d22(0x4b9,0x42c)]))try{await _0x54b4ff[_0x3c5d22(0x51f,0x4bc)+_0x3c5d22(0x44f,0x4e5)](_0x1b2e9f,{'memory_id':_0x5f103f[_0x2bb2bb][_0x1e1abf(-0x2bf,-0x27d)],'role':_0x2bb2bb===0x0?_0x3c5d22(0x40b,0x4a9):_0x17f141[_0x3c5d22(0x49f,0x4bf)]});}catch(_0x2546b5){const _0x5573a4=_0x17f141['mCBMw'](_0x2546b5,Error)?_0x2546b5[_0x1e1abf(-0x2c5,-0x1f3)]:_0x17f141[_0x1e1abf(-0x225,-0x171)](String,_0x2546b5);!_0x5573a4[_0x1e1abf(-0x184,-0xe2)](_0x3c5d22(0x430,0x373))&&!_0x5573a4[_0x3c5d22(0x52b,0x497)](_0x17f141[_0x3c5d22(0x4bc,0x4a0)])&&_0x51aaf7[_0x1e1abf(-0x283,-0x325)](_0x3c5d22(0x3d3,0x45c)+_0x3c5d22(0x4ee,0x5a6)+_0x3c5d22(0x483,0x425),{'remoteId':_0x5f103f[_0x2bb2bb]['remoteId'],'error':_0x5573a4});}else _0xbd8d03[_0x3c5d22(0x456,0x3ef)]('[a2a]\x20Sync'+_0x1e1abf(-0x247,-0x20a)+_0x3fba8d[_0x1e1abf(-0x2e0,-0x2f3)]+('\x20memories\x20'+_0x3c5d22(0x4af,0x549)));}for(let _0x35f32c=0x0;_0x35f32c<_0x5f103f['length'];_0x35f32c++){for(let _0x2506b1=_0x35f32c+0x1;_0x17f141[_0x3c5d22(0x409,0x411)](_0x2506b1,_0x5f103f['length']);_0x2506b1++){if(_0x17f141[_0x3c5d22(0x4b7,0x51d)](_0x17f141[_0x1e1abf(-0x250,-0x296)],'RZzbf'))try{_0x17f141[_0x1e1abf(-0x1f8,-0x246)](_0x17f141[_0x1e1abf(-0x29c,-0x353)],_0x17f141[_0x1e1abf(-0x29c,-0x22b)])?_0x5be479[_0x3c5d22(0x475,0x48e)+_0x1e1abf(-0x25b,-0x28f)](_0x3f39e4[_0x3915f5],_0x3dfafa[_0x386d69]):await _0x54b4ff[_0x3c5d22(0x547,0x5ec)+_0x3c5d22(0x3e1,0x347)]({'source_id':_0x5f103f[_0x35f32c][_0x1e1abf(-0x2bf,-0x2e1)],'target_id':_0x5f103f[_0x2506b1][_0x3c5d22(0x3f0,0x413)],'relation_type':_0x17f141['tpdjp'],'score':0.8,'context_id':_0x1b2e9f});}catch(_0x108820){const _0x318a0f=_0x108820 instanceof Error?_0x108820[_0x3c5d22(0x3ea,0x37a)]:String(_0x108820);!_0x318a0f[_0x1e1abf(-0x184,-0x1a3)](_0x1e1abf(-0x27f,-0x1dd))&&!_0x318a0f[_0x3c5d22(0x52b,0x5f2)](_0x17f141[_0x1e1abf(-0x1f3,-0x169)])&&_0x51aaf7[_0x1e1abf(-0x283,-0x1e6)](_0x1e1abf(-0x2d0,-0x23e)+_0x1e1abf(-0x2df,-0x372)+'lation\x20fai'+_0x1e1abf(-0x20b,-0x1c7),{'error':_0x318a0f});}else _0x4e98c3[_0x3c5d22(0x42c,0x3e7)](_0x3c5d22(0x4de,0x4af)+_0x3c5d22(0x470,0x480),{'error':_0x58a54d instanceof _0x57a274?_0x20cdb1[_0x1e1abf(-0x2c5,-0x2aa)]:_0x21d14f(_0x12156d)});}}const _0x5b2792=new Set([_0x17f141[_0x1e1abf(-0x2d7,-0x225)]]),_0x3072dd=new Set([_0x17f141[_0x3c5d22(0x49b,0x4d9)],_0x1e1abf(-0x297,-0x340),_0x17f141[_0x3c5d22(0x534,0x577)]]),_0x595df8=[],_0x3b7015=[];for(const {localId:_0x2b05d4,remoteId:_0x122dfb}of _0x5f103f){const _0x5c5a80=_0x304dea[_0x1e1abf(-0x1d7,-0x21f)](_0x2b05d4);if(!_0x5c5a80)continue;if(_0x5b2792[_0x1e1abf(-0x230,-0x201)](_0x5c5a80[_0x3c5d22(0x529,0x5db)]))_0x595df8[_0x1e1abf(-0x1ad,-0x266)](_0x122dfb);else{if(_0x3072dd['has'](_0x5c5a80['category']))_0x3b7015[_0x3c5d22(0x502,0x451)](_0x122dfb);}}for(const _0x54b783 of _0x595df8){for(const _0x1ace88 of _0x3b7015){try{await _0x54b4ff[_0x1e1abf(-0x168,-0x152)+'tion']({'source_id':_0x54b783,'target_id':_0x1ace88,'relation_type':_0x17f141[_0x3c5d22(0x4c0,0x414)],'score':0.7,'context_id':_0x1b2e9f});}catch(_0x358f5a){const _0x16fb13=_0x358f5a instanceof Error?_0x358f5a[_0x3c5d22(0x3ea,0x39e)]:String(_0x358f5a);!_0x16fb13['includes'](_0x17f141[_0x1e1abf(-0x226,-0x199)])&&!_0x16fb13['includes'](_0x17f141[_0x1e1abf(-0x1f3,-0x1c7)])&&_0x51aaf7[_0x1e1abf(-0x283,-0x25f)](_0x17f141['vSQTD'],{'error':_0x16fb13});}}}const _0x3e7094=_0x17f141[_0x1e1abf(-0x15d,-0x179)](_0x595df8[_0x1e1abf(-0x2d3,-0x268)],_0x3b7015[_0x3c5d22(0x3dc,0x408)]);console['error']('[a2a]\x20MCG:'+_0x1e1abf(-0x182,-0xef)+'reated\x20('+_0x5f103f[_0x3c5d22(0x3dc,0x434)]+_0x1e1abf(-0x286,-0x2cc)+_0x3e7094+(_0x3c5d22(0x554,0x574)+'lations)')),_0x51aaf7[_0x3c5d22(0x461,0x3c2)](_0x17f141[_0x3c5d22(0x517,0x4e7)],{'contextId':_0x1b2e9f,'members':_0x5f103f[_0x1e1abf(-0x2d3,-0x2c0)],'causalRelations':_0x3e7094});}catch(_0x1d3c22){_0x51aaf7[_0x1e1abf(-0x283,-0x330)](_0x17f141[_0x3c5d22(0x544,0x54e)],{'error':_0x17f141[_0x3c5d22(0x48a,0x4a0)](String,_0x1d3c22)});}}const HOOK_TIMEOUT_MS=0x7530;export async function main(){function _0x4647a2(_0x16b1cc,_0x3701d2){return _0x5aa4(_0x16b1cc-0x1d3,_0x3701d2);}const _0x10f5af={'RFJKe':function(_0x49c3b2,_0x2931f9,_0x5b89c3){return _0x49c3b2(_0x2931f9,_0x5b89c3);},'GFosK':_0x4647a2(0x304,0x3a4),'RZKaO':function(_0x2b0ecd){return _0x2b0ecd();},'FrJeM':function(_0x432afa,_0x1fb3e3){return _0x432afa(_0x1fb3e3);},'DlxUg':_0x428fde(-0x20f,-0x140)+_0x4647a2(0x446,0x3ee)+_0x4647a2(0x36a,0x3d8),'HqJry':function(_0x551208,_0x4a8fcb){return _0x551208 instanceof _0x4a8fcb;}},_0x17a1db=_0x10f5af['RFJKe'](setTimeout,()=>{function _0x428e75(_0x172ac6,_0x125377){return _0x428fde(_0x172ac6,_0x125377-0x443);}console[_0x57a04e(0x195,0x19f)]('[a2a]\x20Sess'+_0x57a04e(0x146,0x111)+_0x428e75(0x301,0x2a7)+_0x57a04e(0x1f0,0x25b)+HOOK_TIMEOUT_MS+('ms)\x20—\x20exit'+_0x428e75(0x45b,0x3cb)+_0x57a04e(0x292,0x1eb))),closeSharedDb();function _0x57a04e(_0x12f8ab,_0x395de0){return _0x428fde(_0x12f8ab,_0x395de0-0x2d4);}process[_0x428e75(0x37a,0x40f)](0x0);},HOOK_TIMEOUT_MS),_0xdb826=[];for await(const _0x1ff904 of process[_0x4647a2(0x2f9,0x2d7)]){_0xdb826['push'](_0x1ff904);}function _0x428fde(_0x5ac3c9,_0x21f3c3){return _0x5aa4(_0x21f3c3- -0x2bf,_0x5ac3c9);}const _0x50ffcd=Buffer[_0x4647a2(0x40f,0x4c7)](_0xdb826)[_0x428fde(-0x78,-0xe3)](_0x10f5af['GFosK'])['trim']();!_0x50ffcd&&(clearTimeout(_0x17a1db),_0x10f5af['RZKaO'](closeSharedDb),process[_0x4647a2(0x45e,0x458)](0x0));try{const _0x204d46=JSON['parse'](_0x50ffcd),_0x248281=_0x10f5af[_0x428fde(-0x1fb,-0x1a7)](normalizeHookInput,_0x204d46);await handleSessionEnd(_0x248281);}catch(_0x26d18b){console[_0x4647a2(0x35d,0x33d)](_0x10f5af[_0x4647a2(0x2e5,0x343)],_0x10f5af['HqJry'](_0x26d18b,Error)?_0x26d18b[_0x4647a2(0x2f1,0x3ac)]:_0x26d18b);}finally{_0x10f5af[_0x4647a2(0x2eb,0x22c)](clearTimeout,_0x17a1db),closeSharedDb(),process['exit'](0x0);}}const isMainModule=process[_0x3bb2fe(0x33c,0x3ae)][0x1]?.[_0x4d1c93(-0x189,-0x191)]('session-en'+_0x4d1c93(-0x1cf,-0x293))||process['argv'][0x1]?.[_0x4d1c93(-0x246,-0x191)](_0x3bb2fe(0x21d,0x2d8)+_0x4d1c93(-0x243,-0x189));isMainModule&&main();
|