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,183 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Migrate-File-Refs Command
|
|
3
|
-
*
|
|
4
|
-
* 기존 메모리의 .md 파일 참조를 감지하고 원격 Storage에 업로드 + 연결합니다.
|
|
5
|
-
*
|
|
6
|
-
* 동작:
|
|
7
|
-
* 1. 로컬 DB에서 synced 상태인 메모리 전체 스캔
|
|
8
|
-
* 2. content에서 .md 파일 참조 감지
|
|
9
|
-
* 3. 파일 해시 기반 중복 확인
|
|
10
|
-
* 4. 미업로드 파일 → Storage 업로드
|
|
11
|
-
* 5. memory_files 연결 생성 (remote ID 사용)
|
|
12
|
-
*/
|
|
13
|
-
import { Command } from 'commander';
|
|
14
|
-
import chalk from 'chalk';
|
|
15
|
-
import { createHash } from 'node:crypto';
|
|
16
|
-
import { readFileSync } from 'node:fs';
|
|
17
|
-
import { resolve } from 'node:path';
|
|
18
|
-
import { ConfigManager } from '../../config/manager.js';
|
|
19
|
-
import { MemoryDatabase } from '../../db/database.js';
|
|
20
|
-
import { A2AClient } from '../../sync/client.js';
|
|
21
|
-
import { detectMdReferences } from '../../extraction/file-reference.js';
|
|
22
|
-
export function migrateFileRefsCommand() {
|
|
23
|
-
const cmd = new Command('migrate-file-refs');
|
|
24
|
-
cmd
|
|
25
|
-
.description('기존 메모리의 .md 파일 참조를 원격 Storage에 업로드하고 연결합니다')
|
|
26
|
-
.option('--dry-run', '실제 업로드 없이 감지된 참조만 표시', false)
|
|
27
|
-
.option('--limit <number>', '처리할 최대 메모리 수', '10000')
|
|
28
|
-
.option('--project <path>', '프로젝트 경로 (파일 참조 해석 기준)')
|
|
29
|
-
.action(async (options) => {
|
|
30
|
-
const config = new ConfigManager().load();
|
|
31
|
-
if (!config.server?.apiKey || !config.server?.url) {
|
|
32
|
-
console.error(chalk.red('✗ 서버 설정이 필요합니다 (server.url, server.apiKey)'));
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
35
|
-
const projectPath = options.project || process.cwd();
|
|
36
|
-
const limit = parseInt(options.limit, 10);
|
|
37
|
-
console.log(chalk.blue('📂 메모리-파일 참조 마이그레이션'));
|
|
38
|
-
console.log(` 프로젝트: ${projectPath}`);
|
|
39
|
-
console.log(` 최대 처리: ${limit}`);
|
|
40
|
-
console.log(` 모드: ${options.dryRun ? 'DRY RUN' : 'LIVE'}`);
|
|
41
|
-
console.log();
|
|
42
|
-
const db = new MemoryDatabase(config.db.path);
|
|
43
|
-
const client = new A2AClient({
|
|
44
|
-
baseUrl: config.server.url,
|
|
45
|
-
apiKey: config.server.apiKey,
|
|
46
|
-
timeout: 30000,
|
|
47
|
-
});
|
|
48
|
-
// 연결 테스트
|
|
49
|
-
const connected = await client.testConnection();
|
|
50
|
-
if (!connected) {
|
|
51
|
-
console.error(chalk.red('✗ 서버 연결 실패'));
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
54
|
-
// 전체 메모리 스캔 (synced 상태만)
|
|
55
|
-
const allMemories = db.listMemories({ limit });
|
|
56
|
-
console.log(`📊 전체 메모리: ${allMemories.length}개`);
|
|
57
|
-
// 카테고리 우선순위 (높을수록 먼저 처리)
|
|
58
|
-
const CATEGORY_PRIORITY = {
|
|
59
|
-
skill: 10,
|
|
60
|
-
project_knowledge: 9,
|
|
61
|
-
decision: 8,
|
|
62
|
-
convention: 7,
|
|
63
|
-
learning: 6,
|
|
64
|
-
error_solution: 5,
|
|
65
|
-
code_pattern: 4,
|
|
66
|
-
context: 3,
|
|
67
|
-
};
|
|
68
|
-
// 파일 참조가 있는 메모리 필터링
|
|
69
|
-
const memoriesWithRefs = [];
|
|
70
|
-
let skippedNoRemote = 0;
|
|
71
|
-
for (const memory of allMemories) {
|
|
72
|
-
const syncStatus = db.getSyncStatus(memory.id);
|
|
73
|
-
if (!syncStatus?.remoteId) {
|
|
74
|
-
const refs = detectMdReferences(memory.content, projectPath);
|
|
75
|
-
if (refs.length > 0)
|
|
76
|
-
skippedNoRemote++;
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
const refs = detectMdReferences(memory.content, projectPath);
|
|
80
|
-
if (refs.length > 0) {
|
|
81
|
-
memoriesWithRefs.push({
|
|
82
|
-
memory,
|
|
83
|
-
remoteId: syncStatus.remoteId,
|
|
84
|
-
refs,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
console.log(`🔗 .md 참조 포함 메모리: ${memoriesWithRefs.length}개 (미동기화 스킵: ${skippedNoRemote}개)`);
|
|
89
|
-
// 카테고리별 정렬 (우선순위 높은 것부터)
|
|
90
|
-
memoriesWithRefs.sort((a, b) => {
|
|
91
|
-
const pa = CATEGORY_PRIORITY[a.memory.category] ?? 0;
|
|
92
|
-
const pb = CATEGORY_PRIORITY[b.memory.category] ?? 0;
|
|
93
|
-
return pb - pa;
|
|
94
|
-
});
|
|
95
|
-
// 카테고리별 통계
|
|
96
|
-
const catStats = new Map();
|
|
97
|
-
for (const { memory } of memoriesWithRefs) {
|
|
98
|
-
catStats.set(memory.category, (catStats.get(memory.category) ?? 0) + 1);
|
|
99
|
-
}
|
|
100
|
-
console.log(`📊 카테고리별: ${[...catStats.entries()].sort((a, b) => (CATEGORY_PRIORITY[b[0]] ?? 0) - (CATEGORY_PRIORITY[a[0]] ?? 0)).map(([k, v]) => `${k}(${v})`).join(', ')}`);
|
|
101
|
-
// 고유 파일 수집
|
|
102
|
-
const uniqueFiles = new Set();
|
|
103
|
-
for (const { refs } of memoriesWithRefs) {
|
|
104
|
-
for (const ref of refs)
|
|
105
|
-
uniqueFiles.add(ref);
|
|
106
|
-
}
|
|
107
|
-
console.log(`📄 고유 .md 파일: ${uniqueFiles.size}개`);
|
|
108
|
-
console.log();
|
|
109
|
-
if (memoriesWithRefs.length === 0) {
|
|
110
|
-
console.log(chalk.green('✓ 처리할 참조가 없습니다.'));
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
// 파일별 상세 출력 (상위 20개만)
|
|
114
|
-
const fileRefCounts = [...uniqueFiles].map(f => ({
|
|
115
|
-
path: f,
|
|
116
|
-
count: memoriesWithRefs.filter(m => m.refs.includes(f)).length,
|
|
117
|
-
})).sort((a, b) => b.count - a.count);
|
|
118
|
-
for (const { path: filePath, count } of fileRefCounts.slice(0, 20)) {
|
|
119
|
-
console.log(` ${chalk.cyan(filePath)} — ${count}개 메모리에서 참조`);
|
|
120
|
-
}
|
|
121
|
-
if (fileRefCounts.length > 20) {
|
|
122
|
-
console.log(` ... 외 ${fileRefCounts.length - 20}개`);
|
|
123
|
-
}
|
|
124
|
-
console.log();
|
|
125
|
-
if (options.dryRun) {
|
|
126
|
-
console.log(chalk.yellow('🔍 DRY RUN 완료. --dry-run 없이 실행하면 실제 업로드됩니다.'));
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
// 실제 업로드 + 연결
|
|
130
|
-
const uploadedFiles = new Map(); // hash → fileId
|
|
131
|
-
let linkedCount = 0;
|
|
132
|
-
let errorCount = 0;
|
|
133
|
-
for (const { remoteId, refs } of memoriesWithRefs) {
|
|
134
|
-
for (const refPath of refs) {
|
|
135
|
-
try {
|
|
136
|
-
const fullPath = resolve(projectPath, refPath);
|
|
137
|
-
const content = readFileSync(fullPath);
|
|
138
|
-
const hash = createHash('sha256').update(content).digest('hex');
|
|
139
|
-
let fileId = uploadedFiles.get(hash);
|
|
140
|
-
if (!fileId) {
|
|
141
|
-
const dup = await client.checkFileDuplicate(hash);
|
|
142
|
-
if (dup.exists && dup.file_id) {
|
|
143
|
-
fileId = dup.file_id;
|
|
144
|
-
console.log(` ${chalk.gray('↩')} ${refPath} — 이미 업로드됨`);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
const result = await client.uploadFile(fullPath, {
|
|
148
|
-
category: 'reference',
|
|
149
|
-
tags: ['memory-reference', 'md-document'],
|
|
150
|
-
});
|
|
151
|
-
fileId = result.id;
|
|
152
|
-
console.log(` ${chalk.green('↑')} ${refPath} — 업로드 완료`);
|
|
153
|
-
}
|
|
154
|
-
uploadedFiles.set(hash, fileId);
|
|
155
|
-
}
|
|
156
|
-
await client.createMemoryFileLink(remoteId, fileId, {
|
|
157
|
-
reference_type: 'cited',
|
|
158
|
-
reference_path: refPath,
|
|
159
|
-
});
|
|
160
|
-
linkedCount++;
|
|
161
|
-
}
|
|
162
|
-
catch (err) {
|
|
163
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
164
|
-
// 409 Conflict는 정상 (이미 연결됨)
|
|
165
|
-
if (msg.includes('409') || msg.includes('already exists')) {
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
errorCount++;
|
|
169
|
-
console.error(` ${chalk.red('✗')} ${refPath}: ${msg}`);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
console.log();
|
|
174
|
-
console.log(chalk.green(`✓ 마이그레이션 완료`));
|
|
175
|
-
console.log(` 업로드된 파일: ${uploadedFiles.size}개`);
|
|
176
|
-
console.log(` 생성된 연결: ${linkedCount}개`);
|
|
177
|
-
if (errorCount > 0) {
|
|
178
|
-
console.log(` ${chalk.red(`에러: ${errorCount}건`)}`);
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
return cmd;
|
|
182
|
-
}
|
|
183
|
-
//# sourceMappingURL=migrate-file-refs.js.map
|
|
1
|
+
(function(_0x4bce11,_0x148bc1){function _0x5d8141(_0x422044,_0x4e7a04){return _0x4c56(_0x4e7a04-0xb1,_0x422044);}const _0x2d2213=_0x4bce11();function _0x4de53e(_0xe6dc21,_0x18b773){return _0x4c56(_0x18b773- -0x303,_0xe6dc21);}while(!![]){try{const _0x2b47f0=parseInt(_0x4de53e(-0x214,-0x24a))/0x1+parseInt(_0x4de53e(-0x25b,-0x24b))/0x2+-parseInt(_0x5d8141(0x162,0x177))/0x3*(-parseInt(_0x5d8141(0x1e9,0x1bb))/0x4)+parseInt(_0x4de53e(-0x21f,-0x1e8))/0x5*(parseInt(_0x5d8141(0x173,0x19c))/0x6)+parseInt(_0x4de53e(-0x223,-0x23b))/0x7*(-parseInt(_0x4de53e(-0x1ea,-0x223))/0x8)+-parseInt(_0x4de53e(-0x1dd,-0x1dd))/0x9*(-parseInt(_0x5d8141(0x1bf,0x1a4))/0xa)+-parseInt(_0x4de53e(-0x25d,-0x220))/0xb;if(_0x2b47f0===_0x148bc1)break;else _0x2d2213['push'](_0x2d2213['shift']());}catch(_0xd6cc1f){_0x2d2213['push'](_0x2d2213['shift']());}}}(_0x3e9c,0x9e620));import{Command}from'commander';function _0x3e9c(){const _0x39949a=['CMvMCW','iokaLca','DNzzyKK','ls1WCM9Qzwn0ia','s1nlzxq','mtaWmda','zLnXAgu','CNvUioYxHUYDTcdSI6tTLONTLzG','BwvZC2fNzq','q2TJyuG','CMvK','ChjVAMvJDa','y0jiBLq','DNzKzuC','CNLgAwXLtgLUAW','zcdTJiZSNBWG7lc47kgW66w8ioYBKa','zxiUDxjSlcbZzq','teLwrq','CxrZyxC','DxbSB2fKrMLSzq','nda5','zxHPDa','ndbODg9uze0','BM5vqLm','icdSL4xROzZRK5ZRKjWG7yYm7j28oG','odKWntq5C0LkCxn3','7lky66AS7zwGioY1NoUmGcdRQztRQQJRPQW','tfz6t0q','DgvZDenVBM5LyW','icdSTzZRJiaG7lky66ASoIa','C2L6zq','CMvMzxjLBMnL','6RIW7kg0ioUPLoUQQoUMRoYDMcaUBq','nKPIBvjZAq','C2vYDMvY','Agv4','z3jHEq','ioYxHEUHNoUtNo2vMoQZOcdSL7dQSRdTLAK','y2L0zwq','Axn0CW','BwqTzg9JDw1LBG','mJC3nJm3meD3AxHhwq','8j+uJsbeuLKGuLvoia','DxbKyxrL','BgLTAxq','z2v0u3LUy1n0yq','4PYtioUNIoYDToQ3UoUGIoYDToYfMcdSMyq','7jEq65+SoIa','7zwOioUPLoUQQoUMRdOG','C2v0','zgLNzxn0','y2f0zwDVCNK','Bg9N','DhvZ','7jEg7iQ164Ui64UKlG','6Rcq7kEa65cCioYWUoYHSoUNJcdTKzZSI5W','rfjzifjvtG','8j+tIIdSUBtTHyZQS6dRPQZRS4q6ia','6RcCioUPLoUQQoUMRoYxKoYeNcdSSlJSOBa','EMLLshO','CNzLCI5HCgLlzq','r2LIuKy','uK5Mt0m','BgLZDe1LBw9YAq','nJHcy2f6B1m','z2v0','iokaLcdSL4xROzZRK5WG7jMe66om','Aw5JBhvKzxm','DxbSAwnHDgu','BwfW','y3jLyxrLtwvTBW','zhj5uNvU','z3jLzw4','ywn0Aw9U','uvzZuxe','8j+uLYaUBwqG7lc47kgWio2pRa','Dw1Izxi+','zxHPC3rZ','zw50CMLLCW','BwvTB3j5lxjLzG','ANnUufG','ndy5nZKWsuXnBwLe','4PYxioYeNoUYHcdSHktSOjxSNBqG7zwe','7j28oIa','7iUK7kcCioYxHEUHNoUtNcdSL4BSNBqG','yMX1zq','CMvTB3rLswq','4PYtioYYMoUMRo2vOcdSSlJSOBdQSiaG','7jMe66omlIaTlwrYEs0','y29UDgvUDa','y291BNq','A0D3B0u','ovvlyKrWDG','Bg9Hza','zMLSzv9Pza','BwLNCMf0zs1MAq','ywL5s3G','yxbPs2v5','y3LHBG','zxjYB3i','zMLSDgvY','DxjS','ChvZAa','BgvUz3rO','icaUlI4G7jM4ia','B3b0Aw9U','BwvTB3j5','7jQu7zwP64Ui64UKicHZzxj2','Cgf0Aa','mJu4nZC0y0X5DM9e','ntGZotu1thHZzxfQ','7kgWioUNIoYDToQ3UoUGIoYDToYfMa','y3DK','AM9PBG','8j+tGIdRQztRQQJRPQWT7yYm7j28ioYWUa','ywXYzwfKEsbLEa','uwXmtfq','icdTLitROzZSOj3TIRG6ia','icdSG53SHlhRKjWG7jEW6RkWoIa','iokaLcdSNBtRR7GG7jEf66gC65oC65cO','4PYxioYeNoUYHcdSL7dQSRaG7iUK7yYO','DgLVBG','rNzZEMe','mtuWnJi3yNbWqLrQ','C29YDa','mty5mJmXm2XAz1LKra','zxjLBMnL'];_0x3e9c=function(){return _0x39949a;};return _0x3e9c();}import _0x598074 from'chalk';import{createHash}from'node:crypto';import{readFileSync}from'node:fs';import{resolve}from'node:path';import{ConfigManager}from'../../config/manager.js';function _0x4c56(_0x7d84ec,_0x2f8b01){_0x7d84ec=_0x7d84ec-0xac;const _0x3e9cf9=_0x3e9c();let _0x4c56bc=_0x3e9cf9[_0x7d84ec];if(_0x4c56['sVoQGR']===undefined){var _0x56b941=function(_0x1947ca){const _0x29f25b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5d4f1a='',_0x20cebb='';for(let _0x4f50f3=0x0,_0x3b0e01,_0x58198d,_0x1fc51f=0x0;_0x58198d=_0x1947ca['charAt'](_0x1fc51f++);~_0x58198d&&(_0x3b0e01=_0x4f50f3%0x4?_0x3b0e01*0x40+_0x58198d:_0x58198d,_0x4f50f3++%0x4)?_0x5d4f1a+=String['fromCharCode'](0xff&_0x3b0e01>>(-0x2*_0x4f50f3&0x6)):0x0){_0x58198d=_0x29f25b['indexOf'](_0x58198d);}for(let _0x385086=0x0,_0x4bca3e=_0x5d4f1a['length'];_0x385086<_0x4bca3e;_0x385086++){_0x20cebb+='%'+('00'+_0x5d4f1a['charCodeAt'](_0x385086)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x20cebb);};_0x4c56['mcZjnf']=_0x56b941,_0x4c56['pfFzug']={},_0x4c56['sVoQGR']=!![];}const _0x296658=_0x3e9cf9[0x0],_0x4363c9=_0x7d84ec+_0x296658,_0x33e7db=_0x4c56['pfFzug'][_0x4363c9];return!_0x33e7db?(_0x4c56bc=_0x4c56['mcZjnf'](_0x4c56bc),_0x4c56['pfFzug'][_0x4363c9]=_0x4c56bc):_0x4c56bc=_0x33e7db,_0x4c56bc;}import{MemoryDatabase}from'../../db/database.js';import{A2AClient}from'../../sync/client.js';import{detectMdReferences}from'../../extraction/file-reference.js';export function migrateFileRefsCommand(){const _0x33f9ed={'vvdeG':function(_0x345c82,_0x77d3c0,_0x6caca6){return _0x345c82(_0x77d3c0,_0x6caca6);},'fSqhe':_0x5f174d(-0x214,-0x1e3)+_0x368037(-0x2a5,-0x27f),'LVzOD':_0x5f174d(-0x1cf,-0x1a8),'QVsQq':_0x368037(-0x284,-0x26a),'zieHz':function(_0xf37497,_0x1221c9){return _0xf37497!==_0x1221c9;},'ggDjo':_0x5f174d(-0x1b7,-0x1b0),'rmHkc':function(_0x54be30,_0x5b36d5,_0x1722aa){return _0x54be30(_0x5b36d5,_0x1722aa);},'KSKet':function(_0x2e6008,_0x54b22f){return _0x2e6008!==_0x54b22f;},'yGnVi':function(_0x48b144,_0x2f0812){return _0x48b144+_0x2f0812;},'vvYbI':function(_0x14e651,_0x4535df){return _0x14e651>_0x4535df;},'IPKeN':_0x5f174d(-0x1dd,-0x1cd)+_0x5f174d(-0x1af,-0x18a)+_0x5f174d(-0x200,-0x1d8)+'면\x20실제\x20업로드됩니'+'다.','qtsaw':function(_0x3b0eee,_0x506d25,_0x45bf2d){return _0x3b0eee(_0x506d25,_0x45bf2d);},'QlLLT':function(_0x1e9df0,_0x719a76){return _0x1e9df0(_0x719a76);},'gUwak':'sha256','cBHnT':_0x368037(-0x246,-0x21e)+_0x5f174d(-0x208,-0x1e5),'GibRF':function(_0x365893,_0x101cc8){return _0x365893 instanceof _0x101cc8;},'RNfOC':_0x5f174d(-0x1a8,-0x1d2)+'le-refs','aiyKx':'--dry-run','nnUBS':'--limit\x20<n'+_0x5f174d(-0x1bb,-0x18f),'CkcaH':_0x368037(-0x290,-0x278),'Fvsza':_0x368037(-0x292,-0x2a3)+'<path>'};function _0x5f174d(_0x4699e6,_0x118f13){return _0x4c56(_0x4699e6- -0x2d1,_0x118f13);}function _0x368037(_0x4f92b6,_0x5965fa){return _0x4c56(_0x4f92b6- -0x35f,_0x5965fa);}const _0x2f5858=new Command(_0x33f9ed[_0x5f174d(-0x1c9,-0x19c)]);return _0x2f5858['descriptio'+'n'](_0x368037(-0x275,-0x2ae)+_0x368037(-0x286,-0x29a)+'격\x20Storage에'+_0x368037(-0x270,-0x283)+'니다')['option'](_0x33f9ed[_0x368037(-0x235,-0x266)],_0x368037(-0x241,-0x22c)+_0x368037(-0x25e,-0x295),![])[_0x5f174d(-0x21d,-0x230)](_0x33f9ed[_0x5f174d(-0x1f0,-0x1fa)],_0x368037(-0x27b,-0x23d)+'\x20수',_0x33f9ed[_0x5f174d(-0x1fe,-0x1d8)])[_0x368037(-0x2ab,-0x2c8)](_0x33f9ed[_0x5f174d(-0x20c,-0x202)],'프로젝트\x20경로\x20(파'+'일\x20참조\x20해석\x20기준'+')')[_0x368037(-0x24c,-0x276)](async _0x5e9042=>{const _0x39d523=new ConfigManager()[_0x3438fb(0x2f,0x28)]();(!_0x39d523['server']?.['apiKey']||!_0x39d523['server']?.['url'])&&(console[_0x3438fb(-0x4a,-0x86)](_0x598074[_0x7b6183(0x2f5,0x300)](_0x3438fb(0x24,0x6)+_0x3438fb(-0x42,-0x57)+_0x3438fb(-0x1e,-0x18)+_0x7b6183(0x327,0x311)+'y)')),process['exit'](0x1));const _0x9ad0bf=_0x5e9042[_0x7b6183(0x2f6,0x2ec)]||process[_0x7b6183(0x2dc,0x2ec)](),_0x3f59f6=_0x33f9ed[_0x7b6183(0x2f8,0x334)](parseInt,_0x5e9042[_0x3438fb(-0x2,0xa)],0xa);console[_0x7b6183(0x31f,0x308)](_0x598074[_0x7b6183(0x340,0x355)](_0x33f9ed[_0x7b6183(0x2f1,0x2c0)])),console[_0x7b6183(0x31f,0x32f)](_0x7b6183(0x2e1,0x2c7)+_0x9ad0bf),console[_0x3438fb(0x6,0x18)](_0x7b6183(0x308,0x327)+_0x3f59f6),console[_0x3438fb(0x6,-0xa)]('\x20\x20모드:\x20'+(_0x5e9042[_0x3438fb(0x19,0x12)]?_0x33f9ed[_0x7b6183(0x306,0x32a)]:_0x33f9ed[_0x3438fb(0x1c,-0x1d)])),console[_0x3438fb(0x6,0x30)]();const _0x310c5e=new MemoryDatabase(_0x39d523['db'][_0x7b6183(0x2d8,0x2bc)]),_0x218ad6=new A2AClient({'baseUrl':_0x39d523[_0x3438fb(-0xc,0x24)][_0x7b6183(0x2d1,0x2b2)],'apiKey':_0x39d523[_0x3438fb(-0xc,0x1f)][_0x3438fb(-0x4c,-0x3e)],'timeout':0x7530}),_0xceddc2=await _0x218ad6[_0x3438fb(-0x12,0x0)+_0x7b6183(0x2e5,0x2de)]();if(!_0xceddc2){if(_0x33f9ed[_0x3438fb(0xd,0x4d)](_0x33f9ed['ggDjo'],_0x7b6183(0x33b,0x316))){_0x119676[_0x7b6183(0x31f,0x2f2)](_0x48cad7[_0x7b6183(0x333,0x320)](_0x7b6183(0x342,0x328)+'없습니다.'));return;}else console[_0x3438fb(-0x4a,-0x6f)](_0x598074[_0x7b6183(0x2f5,0x317)](_0x3438fb(-0x35,-0x5))),process[_0x7b6183(0x300,0x2da)](0x1);}const _0xbcf535=_0x310c5e[_0x7b6183(0x32a,0x308)+'es']({'limit':_0x3f59f6});console[_0x3438fb(0x6,-0xf)]('📊\x20전체\x20메모리:\x20'+_0xbcf535['length']+'개');function _0x7b6183(_0x1fa0e3,_0x2eac98){return _0x368037(_0x1fa0e3-0x580,_0x2eac98);}const _0x34fd94={'skill':0xa,'project_knowledge':0x9,'decision':0x8,'convention':0x7,'learning':0x6,'error_solution':0x5,'code_pattern':0x4,'context':0x3},_0xad8624=[];let _0x3eaa35=0x0;for(const _0x2538c4 of _0xbcf535){const _0x4e4609=_0x310c5e[_0x7b6183(0x318,0x31a)+_0x3438fb(0x7,0x1a)](_0x2538c4['id']);if(!_0x4e4609?.['remoteId']){const _0x39f380=_0x33f9ed['rmHkc'](detectMdReferences,_0x2538c4[_0x3438fb(0x2b,-0x8)],_0x9ad0bf);if(_0x39f380[_0x7b6183(0x2d3,0x2ca)]>0x0)_0x3eaa35++;continue;}const _0x37cc80=_0x33f9ed[_0x3438fb(-0x21,-0x11)](detectMdReferences,_0x2538c4[_0x7b6183(0x344,0x344)],_0x9ad0bf);_0x37cc80[_0x3438fb(-0x46,-0x33)]>0x0&&(_0x33f9ed[_0x7b6183(0x2ef,0x312)](_0x3438fb(0x2d,0x68),_0x3438fb(0x2d,0x1d))?_0x5c1681[_0x3438fb(-0x47,-0x57)]({'memory':_0x2a2586,'remoteId':_0x140560[_0x7b6183(0x341,0x310)],'refs':_0x456ab6}):_0xad8624['push']({'memory':_0x2538c4,'remoteId':_0x4e4609['remoteId'],'refs':_0x37cc80}));}console[_0x7b6183(0x31f,0x336)](_0x7b6183(0x336,0x301)+_0x3438fb(0x2,0x9)+_0xad8624['length']+('개\x20(미동기화\x20스킵'+':\x20')+_0x3eaa35+'개)'),_0xad8624[_0x7b6183(0x2e8,0x2ab)]((_0x4f75cc,_0x336676)=>{function _0x2d7435(_0x283548,_0x291d90){return _0x3438fb(_0x283548- -0x2e4,_0x291d90);}const _0x4b1288=_0x34fd94[_0x4f75cc[_0x2d7435(-0x327,-0x2fc)][_0x3fa09c(0x2a,0x2)]]??0x0,_0x36ea65=_0x34fd94[_0x336676[_0x2d7435(-0x327,-0x2ed)]['category']]??0x0;function _0x3fa09c(_0xc8ac57,_0x25acea){return _0x3438fb(_0x25acea- -0x3,_0xc8ac57);}return _0x36ea65-_0x4b1288;});const _0x20cb26=new Map();for(const {memory:_0x289332}of _0xad8624){_0x20cb26['set'](_0x289332[_0x7b6183(0x31e,0x2ee)],_0x33f9ed['yGnVi'](_0x20cb26[_0x3438fb(0x13,0x4f)](_0x289332[_0x7b6183(0x31e,0x2ed)])??0x0,0x1));}console[_0x3438fb(0x6,-0x21)](_0x7b6183(0x324,0x329)+[..._0x20cb26[_0x3438fb(0x20,0x3f)]()][_0x3438fb(-0x31,-0x26)]((_0x41f0d5,_0x83f6ae)=>(_0x34fd94[_0x83f6ae[0x0]]??0x0)-(_0x34fd94[_0x41f0d5[0x0]]??0x0))[_0x7b6183(0x330,0x31c)](([_0x334f60,_0x5e0bfd])=>_0x334f60+'('+_0x5e0bfd+')')[_0x7b6183(0x2dd,0x2d6)](',\x20'));const _0x19e5af=new Set();for(const {refs:_0x5654e4}of _0xad8624){for(const _0x27aee2 of _0x5654e4)_0x19e5af['add'](_0x27aee2);}console['log']('📄\x20고유\x20.md\x20파'+_0x3438fb(0x25,-0x14)+_0x19e5af[_0x3438fb(-0x10,0x8)]+'개'),console[_0x3438fb(0x6,-0x17)]();if(_0xad8624['length']===0x0){console[_0x7b6183(0x31f,0x322)](_0x598074[_0x3438fb(0x1a,0x58)](_0x7b6183(0x342,0x347)+_0x3438fb(0x8,0x43)));return;}const _0x3b676a=[..._0x19e5af][_0x7b6183(0x330,0x33a)](_0x4ade18=>({'path':_0x4ade18,'count':_0xad8624[_0x3438fb(-0x49,-0x2b)](_0x3c5203=>_0x3c5203[_0x3438fb(-0x2e,-0x5d)][_0x3438fb(0x15,0x1e)](_0x4ade18))['length']}))['sort']((_0x5c882c,_0x192b17)=>_0x192b17['count']-_0x5c882c[_0x7b6183(0x345,0x354)]);function _0x3438fb(_0x108790,_0x3b8163){return _0x368037(_0x108790-0x267,_0x3b8163);}for(const {path:_0x3cffd3,count:_0x1f8e3e}of _0x3b676a['slice'](0x0,0x14)){console[_0x3438fb(0x6,0x40)]('\x20\x20'+_0x598074[_0x7b6183(0x2ce,0x2ca)](_0x3cffd3)+_0x7b6183(0x2ec,0x2ea)+_0x1f8e3e+_0x3438fb(0xc,-0x29));}_0x33f9ed[_0x3438fb(-0x2c,-0x4a)](_0x3b676a[_0x7b6183(0x2d3,0x2f0)],0x14)&&console[_0x3438fb(0x6,-0x2a)](_0x7b6183(0x2d4,0x310)+(_0x3b676a[_0x7b6183(0x2d3,0x2c1)]-0x14)+'개');console[_0x3438fb(0x6,-0x31)]();if(_0x5e9042[_0x7b6183(0x332,0x339)]){console[_0x3438fb(0x6,0x44)](_0x598074['yellow'](_0x33f9ed['IPKeN']));return;}const _0x434c5e=new Map();let _0x4d6e52=0x0,_0x232814=0x0;for(const {remoteId:_0x2a06dd,refs:_0x123b31}of _0xad8624){for(const _0x4a0e6f of _0x123b31){try{const _0x185b3c=_0x33f9ed[_0x7b6183(0x2fd,0x33a)](resolve,_0x9ad0bf,_0x4a0e6f),_0x26d6d4=readFileSync(_0x185b3c),_0x2a1bd4=_0x33f9ed[_0x3438fb(-0x39,-0x9)](createHash,_0x33f9ed['gUwak'])[_0x3438fb(-0x3,-0x40)](_0x26d6d4)[_0x7b6183(0x31d,0x2f7)](_0x7b6183(0x30e,0x2ea));let _0x346d54=_0x434c5e[_0x3438fb(0x13,0x44)](_0x2a1bd4);if(!_0x346d54){const _0xc213c0=await _0x218ad6['checkFileD'+_0x7b6183(0x32f,0x305)](_0x2a1bd4);if(_0xc213c0[_0x3438fb(0x1f,-0xe)]&&_0xc213c0[_0x7b6183(0x349,0x371)])_0x346d54=_0xc213c0[_0x3438fb(0x30,0xb)],console[_0x3438fb(0x6,-0x18)]('\x20\x20'+_0x598074[_0x3438fb(-0xa,0x30)]('↩')+'\x20'+_0x4a0e6f+_0x7b6183(0x2e3,0x2af));else{const _0x19c14d=await _0x218ad6[_0x7b6183(0x2fe,0x33e)](_0x185b3c,{'category':_0x7b6183(0x30a,0x319),'tags':[_0x33f9ed[_0x7b6183(0x2f7,0x2d9)],_0x7b6183(0x313,0x341)+'t']});_0x346d54=_0x19c14d['id'],console[_0x3438fb(0x6,0x13)]('\x20\x20'+_0x598074['green']('↑')+'\x20'+_0x4a0e6f+_0x3438fb(0x14,0x30));}_0x434c5e[_0x3438fb(0x3,0x37)](_0x2a1bd4,_0x346d54);}await _0x218ad6[_0x7b6183(0x331,0x338)+_0x7b6183(0x2f9,0x313)](_0x2a06dd,_0x346d54,{'reference_type':_0x3438fb(-0x8,-0x47),'reference_path':_0x4a0e6f}),_0x4d6e52++;}catch(_0x5158cb){const _0x38316e=_0x33f9ed[_0x3438fb(0xf,0x1a)](_0x5158cb,Error)?_0x5158cb[_0x3438fb(-0x26,-0x9)]:String(_0x5158cb);if(_0x38316e['includes'](_0x3438fb(-0x1a,-0x4c))||_0x38316e[_0x7b6183(0x32e,0x2fb)](_0x7b6183(0x2df,0x2fe)+_0x7b6183(0x312,0x2e0)))continue;_0x232814++,console[_0x3438fb(-0x4a,-0xc)]('\x20\x20'+_0x598074[_0x7b6183(0x2f5,0x2bc)]('✗')+'\x20'+_0x4a0e6f+':\x20'+_0x38316e);}}}console[_0x3438fb(0x6,-0x1f)](),console['log'](_0x598074['green'](_0x3438fb(0x0,-0x1c)+'료')),console[_0x3438fb(0x6,-0x10)](_0x3438fb(-0x16,0xb)+'\x20'+_0x434c5e[_0x3438fb(-0x10,-0x2d)]+'개'),console[_0x3438fb(0x6,0xd)](_0x3438fb(-0x37,-0x71)+_0x4d6e52+'개'),_0x232814>0x0&&console['log']('\x20\x20'+_0x598074[_0x3438fb(-0x24,-0x5c)](_0x3438fb(0x1,0x30)+_0x232814+'건'));}),_0x2f5858;}
|
|
@@ -1,146 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Proficiency Command
|
|
3
|
-
*
|
|
4
|
-
* 스킬 숙련도 관리 (목록, 상세 조회, 시뮬레이션).
|
|
5
|
-
*/
|
|
6
|
-
import { Command } from 'commander';
|
|
7
|
-
import chalk from 'chalk';
|
|
8
|
-
import ora from 'ora';
|
|
9
|
-
import { ConfigManager } from '../../config/manager.js';
|
|
10
|
-
import { MemoryDatabase } from '../../db/database.js';
|
|
11
|
-
import { ProficiencyTracker } from '../../proficiency/tracker.js';
|
|
12
|
-
export function proficiencyCommand() {
|
|
13
|
-
const cmd = new Command('proficiency')
|
|
14
|
-
.description('Manage skill proficiency tracking');
|
|
15
|
-
// a2a-memory proficiency list
|
|
16
|
-
cmd.command('list')
|
|
17
|
-
.description('List proficiency records')
|
|
18
|
-
.option('-p, --project <path>', 'Filter by project path')
|
|
19
|
-
.action((options) => {
|
|
20
|
-
const config = new ConfigManager().load();
|
|
21
|
-
const db = new MemoryDatabase(config.db.path);
|
|
22
|
-
try {
|
|
23
|
-
db.initialize();
|
|
24
|
-
const records = db.listProficiencies({ projectPath: options.project });
|
|
25
|
-
if (records.length === 0) {
|
|
26
|
-
console.log(chalk.dim('No proficiency records found. Enable proficiency tracking first.'));
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
console.log(chalk.cyan(`\nProficiency Records (${records.length}):\n`));
|
|
30
|
-
for (const rec of records) {
|
|
31
|
-
const levelBar = '█'.repeat(rec.level) + '░'.repeat(10 - rec.level);
|
|
32
|
-
const levelColor = rec.level >= 7 ? chalk.green : rec.level >= 4 ? chalk.yellow : chalk.red;
|
|
33
|
-
console.log(` ${chalk.bold(rec.id.slice(0, 8))} ${rec.skillName.slice(0, 50)}`);
|
|
34
|
-
console.log(` Level: ${levelColor(`${rec.level}/10`)} ${chalk.dim(levelBar)}`);
|
|
35
|
-
console.log(chalk.dim(` XP: ${rec.experienceCount} Success: ${(rec.successRate * 100).toFixed(0)}% Activation: ${rec.actrActivation.toFixed(2)}`));
|
|
36
|
-
console.log('');
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
console.error(chalk.red('Error listing proficiency:'), error);
|
|
41
|
-
// TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
finally {
|
|
45
|
-
db.close();
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
// a2a-memory proficiency inspect <id>
|
|
49
|
-
cmd.command('inspect <id>')
|
|
50
|
-
.description('Inspect proficiency record with experience events')
|
|
51
|
-
.action((id) => {
|
|
52
|
-
const config = new ConfigManager().load();
|
|
53
|
-
const db = new MemoryDatabase(config.db.path);
|
|
54
|
-
try {
|
|
55
|
-
db.initialize();
|
|
56
|
-
// prefix 매치
|
|
57
|
-
const records = db.listProficiencies();
|
|
58
|
-
const target = records.find((r) => r.id === id || r.id.startsWith(id));
|
|
59
|
-
if (!target) {
|
|
60
|
-
console.log(chalk.red(`Proficiency record not found: ${id}`));
|
|
61
|
-
// TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
|
|
62
|
-
process.exit(1);
|
|
63
|
-
}
|
|
64
|
-
console.log(chalk.cyan('\nProficiency Record:\n'));
|
|
65
|
-
console.log(` ID: ${target.id}`);
|
|
66
|
-
console.log(` Skill: ${target.skillName}`);
|
|
67
|
-
console.log(` Skill ID: ${target.skillMemoryId}`);
|
|
68
|
-
console.log(` Level: ${target.level}/${config.proficiency?.maxLevel ?? 10}`);
|
|
69
|
-
console.log(` XP Count: ${target.experienceCount}`);
|
|
70
|
-
console.log(` Success: ${(target.successRate * 100).toFixed(1)}%`);
|
|
71
|
-
console.log(` Activation: ${target.actrActivation.toFixed(4)}`);
|
|
72
|
-
console.log(` Last: ${target.lastPracticedAt}`);
|
|
73
|
-
console.log(` Project: ${target.projectPath ?? '(none)'}`);
|
|
74
|
-
// 최근 이벤트
|
|
75
|
-
const events = db.getExperienceEvents(target.id, { limit: 10, order: 'desc' });
|
|
76
|
-
if (events.length > 0) {
|
|
77
|
-
console.log(chalk.cyan('\n Recent Events:\n'));
|
|
78
|
-
for (const event of events) {
|
|
79
|
-
const outcomeColor = event.outcome === 'success' ? chalk.green : event.outcome === 'partial' ? chalk.yellow : chalk.red;
|
|
80
|
-
const date = new Date(event.timestamp * 1000).toLocaleString();
|
|
81
|
-
console.log(` ${chalk.dim(date)} ${outcomeColor(event.outcome.padEnd(7))} d=${event.difficulty.toFixed(2)} ${chalk.dim(event.contextTags.join(', '))}`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
console.error(chalk.red('Error inspecting proficiency:'), error);
|
|
87
|
-
// TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
|
|
88
|
-
process.exit(1);
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
db.close();
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
// a2a-memory proficiency simulate
|
|
95
|
-
cmd.command('simulate')
|
|
96
|
-
.description('Run proficiency simulation (PoC validation)')
|
|
97
|
-
.option('-n, --events <count>', 'Number of events', '120')
|
|
98
|
-
.option('-s, --success <rate>', 'Success rate (0-1)', '0.8')
|
|
99
|
-
.option('-d, --days <days>', 'Time span in days', '60')
|
|
100
|
-
.action((options) => {
|
|
101
|
-
const config = new ConfigManager().load();
|
|
102
|
-
const profConfig = config.proficiency ?? {
|
|
103
|
-
enabled: false,
|
|
104
|
-
actr: { decayRate: 0.5, baseLevelConstant: 0.0, maxAssociativeStrength: 2.0,
|
|
105
|
-
fanEffectFactor: 1.0, mismatchPenalty: 1.0, retrievalThreshold: 0.0 },
|
|
106
|
-
levelFormula: 'activation',
|
|
107
|
-
maxLevel: 10,
|
|
108
|
-
};
|
|
109
|
-
const db = new MemoryDatabase(config.db.path);
|
|
110
|
-
try {
|
|
111
|
-
db.initialize();
|
|
112
|
-
const spinner = ora('Running simulation...').start();
|
|
113
|
-
const tracker = new ProficiencyTracker(db, profConfig);
|
|
114
|
-
const levels = tracker.simulate({
|
|
115
|
-
eventCount: parseInt(options.events),
|
|
116
|
-
successRate: parseFloat(options.success),
|
|
117
|
-
difficultyRange: [0.3, 0.7],
|
|
118
|
-
timeSpanDays: parseInt(options.days),
|
|
119
|
-
expectedMinLevel: 1,
|
|
120
|
-
expectedMaxLevel: 10,
|
|
121
|
-
});
|
|
122
|
-
spinner.succeed(chalk.green('Simulation complete'));
|
|
123
|
-
// 레벨 진행 표시
|
|
124
|
-
console.log(chalk.cyan('\nLevel Progression:\n'));
|
|
125
|
-
const step = Math.max(1, Math.floor(levels.length / 20));
|
|
126
|
-
for (let i = 0; i < levels.length; i += step) {
|
|
127
|
-
const pct = ((i / levels.length) * 100).toFixed(0).padStart(3);
|
|
128
|
-
const bar = '█'.repeat(levels[i]) + '░'.repeat(10 - levels[i]);
|
|
129
|
-
console.log(` ${pct}% Level ${levels[i].toString().padStart(2)} ${chalk.dim(bar)}`);
|
|
130
|
-
}
|
|
131
|
-
const finalLevel = levels[levels.length - 1] ?? 1;
|
|
132
|
-
console.log(chalk.cyan(`\n Final Level: ${finalLevel}/10`));
|
|
133
|
-
console.log(chalk.dim(` Events: ${levels.length} Peak: ${Math.max(...levels)}`));
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
console.error(chalk.red('Simulation error:'), error);
|
|
137
|
-
// TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
|
|
138
|
-
process.exit(1);
|
|
139
|
-
}
|
|
140
|
-
finally {
|
|
141
|
-
db.close();
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
return cmd;
|
|
145
|
-
}
|
|
146
|
-
//# sourceMappingURL=proficiency.js.map
|
|
1
|
+
function _0x3068(_0x50d0cf,_0x45f60f){_0x50d0cf=_0x50d0cf-0x75;const _0x4f11d6=_0x4f11();let _0x3068f3=_0x4f11d6[_0x50d0cf];if(_0x3068['XMopot']===undefined){var _0x102f2c=function(_0x852b1f){const _0x19875e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x164b77='',_0x49ed67='';for(let _0x5059d1=0x0,_0x563b6d,_0x5bd929,_0x7cfd7f=0x0;_0x5bd929=_0x852b1f['charAt'](_0x7cfd7f++);~_0x5bd929&&(_0x563b6d=_0x5059d1%0x4?_0x563b6d*0x40+_0x5bd929:_0x5bd929,_0x5059d1++%0x4)?_0x164b77+=String['fromCharCode'](0xff&_0x563b6d>>(-0x2*_0x5059d1&0x6)):0x0){_0x5bd929=_0x19875e['indexOf'](_0x5bd929);}for(let _0x52be04=0x0,_0x2b5b77=_0x164b77['length'];_0x52be04<_0x2b5b77;_0x52be04++){_0x49ed67+='%'+('00'+_0x164b77['charCodeAt'](_0x52be04)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x49ed67);};_0x3068['RXwXXX']=_0x102f2c,_0x3068['LiXCNu']={},_0x3068['XMopot']=!![];}const _0x2fdbd8=_0x4f11d6[0x0],_0x11ffdc=_0x50d0cf+_0x2fdbd8,_0x1f592c=_0x3068['LiXCNu'][_0x11ffdc];return!_0x1f592c?(_0x3068f3=_0x3068['RXwXXX'](_0x3068f3),_0x3068['LiXCNu'][_0x11ffdc]=_0x3068f3):_0x3068f3=_0x1f592c,_0x3068f3;}(function(_0x3ae983,_0xbba75b){function _0x4c7980(_0x50fb5e,_0xf92e21){return _0x3068(_0x50fb5e- -0x235,_0xf92e21);}const _0x4e3d0b=_0x3ae983();function _0x562e35(_0x38e9ed,_0x22dd4a){return _0x3068(_0x38e9ed-0x393,_0x22dd4a);}while(!![]){try{const _0x2ecf0b=-parseInt(_0x562e35(0x468,0x467))/0x1*(-parseInt(_0x562e35(0x490,0x44c))/0x2)+parseInt(_0x562e35(0x42a,0x440))/0x3+-parseInt(_0x4c7980(-0x18e,-0x161))/0x4*(parseInt(_0x4c7980(-0x190,-0x1aa))/0x5)+-parseInt(_0x562e35(0x48d,0x4a8))/0x6*(-parseInt(_0x562e35(0x47b,0x4a1))/0x7)+-parseInt(_0x562e35(0x413,0x429))/0x8*(-parseInt(_0x562e35(0x416,0x44e))/0x9)+parseInt(_0x4c7980(-0x1a6,-0x186))/0xa+-parseInt(_0x562e35(0x444,0x43b))/0xb;if(_0x2ecf0b===_0xbba75b)break;else _0x4e3d0b['push'](_0x4e3d0b['shift']());}catch(_0x3b2045){_0x4e3d0b['push'](_0x4e3d0b['shift']());}}}(_0x4f11,0xf364c));import{Command}from'commander';import _0x498ef5 from'chalk';import _0x24f7fe from'ora';import{ConfigManager}from'../../config/manager.js';import{MemoryDatabase}from'../../db/database.js';import{ProficiencyTracker}from'../../proficiency/tracker.js';export function proficiencyCommand(){const _0x2417e0={'IiHpg':function(_0x2742a7,_0x156126){return _0x2742a7+_0x156126;},'qKMfz':'Error\x20list'+_0x5c3537(-0x22a,-0x27a)+_0x3acb30(0x4f9,0x4b2),'THhbK':_0x5c3537(-0x1f9,-0x1bd),'NngdX':function(_0xd559e6,_0x31a1d0){return _0xd559e6*_0x31a1d0;},'PWWgL':_0x3acb30(0x449,0x474),'WZpYN':'success','vYLLH':function(_0x3cc739,_0x10b94f){return _0x3cc739===_0x10b94f;},'qYMps':function(_0x5845b2,_0x46e1bd){return _0x5845b2(_0x46e1bd);},'jBKHU':_0x5c3537(-0x24f,-0x20f),'qAfAB':_0x5c3537(-0x1e1,-0x1e0),'eUjmE':_0x3acb30(0x487,0x465)+_0x3acb30(0x50e,0x4d6),'VbJYh':function(_0x430a4f,_0x1704ef){return _0x430a4f/_0x1704ef;},'WhJzH':function(_0x292ef2,_0x52f493){return _0x292ef2<_0x52f493;},'MDXXk':function(_0x49a61e,_0xcc6beb){return _0x49a61e===_0xcc6beb;},'VvVBe':function(_0x443aff,_0x50a9d4){return _0x443aff-_0x50a9d4;},'QQSWi':_0x5c3537(-0x211,-0x248)+'\x20error:','QQCqd':_0x3acb30(0x433,0x46d)+'y','kvCig':_0x3acb30(0x49f,0x4ab)+_0x5c3537(-0x1f6,-0x21f)+'ency\x20track'+'ing','iAePZ':_0x5c3537(-0x1ec,-0x201)+'d>','aHxvN':_0x3acb30(0x413,0x45e)+_0x3acb30(0x523,0x4d2)+_0x5c3537(-0x1d8,-0x1e6)+_0x3acb30(0x4cb,0x4ca)+_0x3acb30(0x452,0x485),'kdLAl':_0x3acb30(0x518,0x4e0)+_0x3acb30(0x466,0x44f)+_0x5c3537(-0x216,-0x1e4)+_0x5c3537(-0x1dd,-0x1bb)+_0x3acb30(0x439,0x478),'DIYcF':_0x5c3537(-0x1bd,-0x1f6)+'events','OAHKN':_0x5c3537(-0x1cf,-0x1ed),'xZWtL':'-s,\x20--succ'+'ess\x20<rate>','CxOpj':_0x5c3537(-0x203,-0x1f5)};function _0x3acb30(_0x111788,_0x22dc2d){return _0x3068(_0x22dc2d-0x3d7,_0x111788);}const _0x361280=new Command(_0x2417e0['QQCqd'])[_0x3acb30(0x464,0x477)+'n'](_0x2417e0[_0x5c3537(-0x218,-0x206)]);function _0x5c3537(_0x290fd6,_0x5e1700){return _0x3068(_0x290fd6- -0x2c8,_0x5e1700);}return _0x361280[_0x3acb30(0x503,0x4e3)](_0x5c3537(-0x1cc,-0x1bb))['descriptio'+'n']('List\x20profi'+_0x3acb30(0x47e,0x4a3)+_0x3acb30(0x4b2,0x464))[_0x3acb30(0x4a6,0x45d)](_0x3acb30(0x485,0x4d5)+_0x3acb30(0x4a9,0x47f),_0x3acb30(0x513,0x4c6)+_0x5c3537(-0x1d6,-0x188)+'th')[_0x5c3537(-0x247,-0x245)](_0x3d64c0=>{const _0x1d11b6=new ConfigManager()[_0x250f97(0x215,0x222)]();function _0x250f97(_0x3cb0e0,_0x57d027){return _0x5c3537(_0x57d027-0x3f3,_0x3cb0e0);}const _0x5bf186=new MemoryDatabase(_0x1d11b6['db'][_0x5400a7(0x48c,0x451)]);function _0x5400a7(_0x45ffa2,_0x2de4db){return _0x5c3537(_0x2de4db-0x67a,_0x45ffa2);}try{_0x5bf186[_0x250f97(0x1c1,0x1f3)]();const _0x17215e=_0x5bf186[_0x5400a7(0x49a,0x461)+_0x5400a7(0x46f,0x492)]({'projectPath':_0x3d64c0['project']});if(_0x17215e['length']===0x0){console[_0x250f97(0x184,0x1c3)](_0x498ef5[_0x250f97(0x21e,0x214)](_0x250f97(0x27e,0x238)+_0x250f97(0x1c6,0x1a7)+_0x5400a7(0x4e4,0x494)+_0x5400a7(0x4cb,0x48a)+'ficiency\x20t'+_0x5400a7(0x3da,0x428)+_0x5400a7(0x484,0x446)));return;}console['log'](_0x498ef5[_0x5400a7(0x4ac,0x4b6)](_0x5400a7(0x429,0x43c)+_0x5400a7(0x421,0x46c)+'\x20('+_0x17215e[_0x5400a7(0x40a,0x442)]+_0x5400a7(0x48b,0x468)));for(const _0x5a2ee0 of _0x17215e){const _0x598a98=_0x2417e0['IiHpg']('█'['repeat'](_0x5a2ee0[_0x250f97(0x20c,0x1c6)]),'░'[_0x250f97(0x240,0x233)](0xa-_0x5a2ee0['level'])),_0x3e4619=_0x5a2ee0[_0x5400a7(0x46c,0x44d)]>=0x7?_0x498ef5[_0x5400a7(0x491,0x443)]:_0x5a2ee0['level']>=0x4?_0x498ef5['yellow']:_0x498ef5[_0x250f97(0x1e7,0x1ed)];console[_0x5400a7(0x423,0x44a)]('\x20\x20'+_0x498ef5['bold'](_0x5a2ee0['id']['slice'](0x0,0x8))+'\x20\x20'+_0x5a2ee0[_0x250f97(0x26c,0x23c)]['slice'](0x0,0x32)),console['log'](_0x250f97(0x239,0x220)+'\x20'+_0x3e4619(_0x5a2ee0[_0x250f97(0x183,0x1c6)]+'/10')+'\x20'+_0x498ef5[_0x5400a7(0x488,0x49b)](_0x598a98)),console[_0x5400a7(0x487,0x44a)](_0x498ef5[_0x5400a7(0x453,0x49b)](_0x250f97(0x1b0,0x1de)+_0x5a2ee0[_0x5400a7(0x47f,0x43a)+_0x5400a7(0x4c9,0x4b9)]+(_0x5400a7(0x49d,0x4c7)+'\x20')+(_0x5a2ee0[_0x250f97(0x1eb,0x1ef)+'e']*0x64)[_0x250f97(0x1ca,0x1f1)](0x0)+(_0x250f97(0x239,0x1e8)+'ion:\x20')+_0x5a2ee0[_0x250f97(0x1eb,0x1ee)+_0x250f97(0x1d6,0x1ce)][_0x5400a7(0x4a8,0x478)](0x2))),console[_0x250f97(0x172,0x1c3)]('');}}catch(_0x6059c4){console[_0x5400a7(0x487,0x49e)](_0x498ef5[_0x250f97(0x1c1,0x1ed)](_0x2417e0[_0x5400a7(0x427,0x42d)]),_0x6059c4),process['exit'](0x1);}finally{_0x5bf186[_0x250f97(0x242,0x23b)]();}}),_0x361280['command'](_0x2417e0[_0x3acb30(0x4d3,0x4bc)])[_0x3acb30(0x430,0x477)+'n'](_0x2417e0[_0x3acb30(0x48e,0x4d7)])[_0x3acb30(0x44c,0x458)](_0xe014a8=>{function _0x1cab62(_0x4e704a,_0xdf5c56){return _0x3acb30(_0xdf5c56,_0x4e704a- -0x455);}function _0xc89417(_0x256b2e,_0xe5993d){return _0x3acb30(_0x256b2e,_0xe5993d- -0x1a7);}if(_0xc89417(0x314,0x2ff)===_0x2417e0[_0xc89417(0x2cd,0x2c2)]){const _0x2f6196=new ConfigManager()[_0x1cab62(0x79,0xbc)](),_0x410971=new MemoryDatabase(_0x2f6196['db'][_0xc89417(0x290,0x2cf)]);try{_0x410971['initialize']();const _0x57bf7e=_0x410971[_0x1cab62(0x31,0x69)+'iencies'](),_0x11f652=_0x57bf7e[_0xc89417(0x303,0x344)](_0x22eb9d=>_0x22eb9d['id']===_0xe014a8||_0x22eb9d['id'][_0x1cab62(0x3e,0x3e)](_0xe014a8));!_0x11f652&&(console[_0xc89417(0x2b7,0x2c8)](_0x498ef5['red'](_0x1cab62(0x2f,0x7)+_0x1cab62(0x4f,0x3b)+_0x1cab62(0x66,0x61)+_0xe014a8)),process[_0x1cab62(0x6,0x16)](0x1));console[_0xc89417(0x2d2,0x2c8)](_0x498ef5[_0x1cab62(0x86,0x98)]('\x0aProficien'+_0x1cab62(0x49,0x96)+'\x0a')),console['log'](_0xc89417(0x34c,0x343)+_0x1cab62(0x43,0x7f)+_0x11f652['id']),console[_0x1cab62(0x1a,0x2)](_0xc89417(0x2ff,0x33e)+_0xc89417(0x341,0x2f1)+_0x11f652[_0xc89417(0x323,0x341)]),console[_0xc89417(0x28e,0x2c8)](_0xc89417(0x2e4,0x2d2)+_0xc89417(0x309,0x2b9)+_0x11f652[_0xc89417(0x2ca,0x316)+_0x1cab62(0x8c,0xa2)]),console['log']('\x20\x20Level:\x20\x20'+_0x1cab62(0x43,0x0)+_0x11f652[_0xc89417(0x282,0x2cb)]+'/'+(_0x2f6196[_0xc89417(0x2a7,0x2c6)+'y']?.['maxLevel']??0xa)),console[_0xc89417(0x2e9,0x2c8)]('\x20\x20XP\x20Count'+_0xc89417(0x291,0x2b9)+_0x11f652[_0x1cab62(0xa,0x35)+_0x1cab62(0x89,0xd1)]),console[_0xc89417(0x27b,0x2c8)](_0xc89417(0x38d,0x345)+_0xc89417(0x33e,0x2f1)+_0x2417e0[_0xc89417(0x2b7,0x2c9)](_0x11f652[_0xc89417(0x2f7,0x2f4)+'e'],0x64)[_0x1cab62(0x48,0x6)](0x1)+'%'),console['log'](_0x1cab62(0x87,0x84)+_0x1cab62(0xe,-0x41)+_0x11f652[_0xc89417(0x336,0x2f3)+'tion'][_0xc89417(0x2c4,0x2f6)](0x4)),console[_0xc89417(0x2c8,0x2c8)](_0xc89417(0x341,0x2fa)+'\x20\x20\x20\x20'+_0x11f652['lastPracti'+'cedAt']),console[_0x1cab62(0x1a,0x3d)](_0x1cab62(0x88,0x9f)+'\x20\x20\x20\x20'+(_0x11f652[_0xc89417(0x263,0x2aa)+'h']??_0x2417e0[_0x1cab62(0x7a,0xb1)]));const _0x232af6=_0x410971[_0xc89417(0x2c0,0x2b5)+_0x1cab62(0x37,0x72)](_0x11f652['id'],{'limit':0xa,'order':_0x1cab62(0x41,0x60)});if(_0x232af6['length']>0x0){console[_0xc89417(0x317,0x2c8)](_0x498ef5[_0x1cab62(0x86,0xb9)]('\x0a\x20\x20Recent\x20'+'Events:\x0a'));for(const _0x3f87fe of _0x232af6){const _0x467732=_0x3f87fe[_0x1cab62(0x42,0x58)]===_0x2417e0['WZpYN']?_0x498ef5[_0x1cab62(0x13,0x4)]:_0x2417e0[_0xc89417(0x330,0x2e9)](_0x3f87fe[_0xc89417(0x2cd,0x2f0)],_0x1cab62(0x5c,0x12))?_0x498ef5[_0xc89417(0x2d8,0x2d9)]:_0x498ef5[_0x1cab62(0x44,0x8d)],_0x46043e=new Date(_0x3f87fe['timestamp']*0x3e8)[_0xc89417(0x304,0x2ee)+_0x1cab62(0x53,0x4f)]();console['log']('\x20\x20\x20\x20'+_0x498ef5[_0xc89417(0x34f,0x319)](_0x46043e)+'\x20\x20'+_0x2417e0[_0xc89417(0x2ce,0x31d)](_0x467732,_0x3f87fe[_0xc89417(0x312,0x2f0)]['padEnd'](0x7))+_0xc89417(0x287,0x2b2)+_0x3f87fe['difficulty'][_0xc89417(0x2c7,0x2f6)](0x2)+'\x20\x20'+_0x498ef5[_0xc89417(0x2fa,0x319)](_0x3f87fe[_0x1cab62(0x85,0xc7)+'s']['join'](',\x20')));}}}catch(_0x1c411b){console['error'](_0x498ef5[_0xc89417(0x30b,0x2f2)](_0x1cab62(0x2d,0x2e)+_0x1cab62(0x1,0x4b)+_0xc89417(0x2eb,0x2e8)),_0x1c411b),process[_0x1cab62(0x6,-0x14)](0x1);}finally{_0x410971[_0x1cab62(0x92,0x85)]();}}else _0x26d70c[_0x1cab62(0x6e,0xa1)](_0x576d1f['red'](_0x2417e0['qKMfz']),_0x106944),_0xabbd9c[_0x1cab62(0x6,-0x41)](0x1);}),_0x361280[_0x3acb30(0x525,0x4e3)](_0x5c3537(-0x224,-0x202))[_0x3acb30(0x481,0x477)+'n'](_0x2417e0[_0x5c3537(-0x1da,-0x19d)])[_0x5c3537(-0x242,-0x205)](_0x3acb30(0x4ef,0x4b0)+_0x3acb30(0x498,0x471),_0x2417e0['DIYcF'],_0x2417e0[_0x3acb30(0x495,0x4ba)])['option'](_0x2417e0[_0x5c3537(-0x1ff,-0x1d4)],_0x3acb30(0x490,0x4c1)+_0x3acb30(0x4e8,0x4d9),_0x2417e0[_0x3acb30(0x433,0x483)])[_0x3acb30(0x4ac,0x45d)](_0x3acb30(0x4d2,0x4aa)+_0x3acb30(0x4b0,0x4b8),_0x5c3537(-0x1f8,-0x1ef)+_0x5c3537(-0x23d,-0x282),'60')[_0x3acb30(0x430,0x458)](_0x4fa590=>{const _0x19c0b0={'sPgch':'Error\x20insp'+_0x2a1c90(0x114,0x136)+_0x476555(-0x119,-0x149)},_0x2ac550=new ConfigManager()['load'](),_0x37336b=_0x2ac550['proficienc'+'y']??{'enabled':![],'actr':{'decayRate':0.5,'baseLevelConstant':0x0,'maxAssociativeStrength':0x2,'fanEffectFactor':0x1,'mismatchPenalty':0x1,'retrievalThreshold':0x0},'levelFormula':_0x2417e0[_0x476555(-0x14d,-0x183)],'maxLevel':0xa},_0x1bd808=new MemoryDatabase(_0x2ac550['db'][_0x2a1c90(0x15b,0x156)]);function _0x2a1c90(_0x51cefe,_0x3b85cb){return _0x5c3537(_0x3b85cb-0x37f,_0x51cefe);}function _0x476555(_0x36762a,_0x3ad81f){return _0x5c3537(_0x3ad81f-0xc7,_0x36762a);}try{if(_0x2417e0[_0x476555(-0x190,-0x148)](_0x2417e0['qAfAB'],_0x2a1c90(0x1c2,0x1ab)))_0x1e9f32['close']();else{_0x1bd808[_0x476555(-0x105,-0x139)]();const _0x4f7df1=_0x2417e0[_0x2a1c90(0x1a2,0x1a4)](_0x24f7fe,'Running\x20si'+_0x476555(-0x142,-0x146)+'.')[_0x476555(-0x136,-0xf2)](),_0x4f94fb=new ProficiencyTracker(_0x1bd808,_0x37336b),_0x54474d=_0x4f94fb['simulate']({'eventCount':parseInt(_0x4fa590['events']),'successRate':_0x2417e0['qYMps'](parseFloat,_0x4fa590['success']),'difficultyRange':[0.3,0.7],'timeSpanDays':parseInt(_0x4fa590[_0x476555(-0x1b5,-0x165)]),'expectedMinLevel':0x1,'expectedMaxLevel':0xa});_0x4f7df1[_0x2a1c90(0x1d0,0x18d)](_0x498ef5[_0x476555(-0x161,-0x170)](_0x2a1c90(0x142,0x16e)+_0x476555(-0x19a,-0x16e))),console[_0x476555(-0x14f,-0x169)](_0x498ef5['cyan'](_0x2417e0[_0x476555(-0xef,-0x124)]));const _0x534612=Math[_0x476555(-0xec,-0x133)](0x1,Math[_0x476555(-0x15b,-0x157)](_0x2417e0[_0x2a1c90(0x180,0x15d)](_0x54474d[_0x2a1c90(0x152,0x147)],0x14)));for(let _0x2d59c2=0x0;_0x2417e0[_0x2a1c90(0x188,0x18e)](_0x2d59c2,_0x54474d[_0x476555(-0x15c,-0x171)]);_0x2d59c2+=_0x534612){if(_0x2417e0[_0x476555(-0x147,-0x16c)](_0x476555(-0x151,-0x110),_0x476555(-0x165,-0x184)))_0x4f508f[_0x476555(-0x145,-0x115)](_0x2b4713['red'](CtbSPP['sPgch']),_0x446cab),_0x5f2009[_0x2a1c90(0xec,0x13b)](0x1);else{const _0x23b4ba=_0x2417e0[_0x476555(-0x125,-0x168)](_0x2d59c2/_0x54474d[_0x476555(-0x19e,-0x171)],0x64)['toFixed'](0x0)[_0x2a1c90(0x1c3,0x196)](0x3),_0x5d06d6=_0x2417e0[_0x476555(-0xf6,-0x100)]('█'[_0x2a1c90(0x19f,0x1bf)](_0x54474d[_0x2d59c2]),'░'[_0x2a1c90(0x17b,0x1bf)](0xa-_0x54474d[_0x2d59c2]));console['log']('\x20\x20'+_0x23b4ba+_0x476555(-0x14c,-0x14d)+_0x54474d[_0x2d59c2][_0x2a1c90(0x20a,0x1c9)]()[_0x2a1c90(0x184,0x196)](0x2)+'\x20'+_0x498ef5['dim'](_0x5d06d6));}}const _0x5df998=_0x54474d[_0x2417e0[_0x476555(-0x14b,-0x10b)](_0x54474d[_0x2a1c90(0x18b,0x147)],0x1)]??0x1;console[_0x476555(-0x1a1,-0x169)](_0x498ef5[_0x476555(-0x149,-0xfd)]('\x0a\x20\x20Final\x20L'+_0x2a1c90(0x15f,0x12e)+_0x5df998+_0x2a1c90(0x1cc,0x182))),console['log'](_0x498ef5['dim'](_0x2a1c90(0x1a3,0x195)+_0x54474d[_0x2a1c90(0x112,0x147)]+_0x476555(-0x14c,-0x18c)+Math[_0x2a1c90(0x17e,0x185)](..._0x54474d)));}}catch(_0x106d29){console[_0x476555(-0xdd,-0x115)](_0x498ef5[_0x2a1c90(0x1c8,0x179)](_0x2417e0['QQSWi']),_0x106d29),process[_0x476555(-0x188,-0x17d)](0x1);}finally{_0x1bd808['close']();}}),_0x361280;}function _0x4f11(){const _0x38d954=['C3vJy2vZC1jHDa','mc44','Dg9gAxHLza','y3KGuMvJB3jKoG','Aw5PDgLHBgL6zq','EfPxDeW','icbmyxn0oIaGia','lZeW','y2LLBMn5ihjLyW','EsbYzwnVCMqGBG','Bwf4','CeP0tNG','vgLTzsbZCgfUia','CMLUzW','BgWGChjVzMLJAq','lwqSic0Tzgf5CW','twfUywDLihnRAq','nJL5BfPhv2u','C3vJy2vLza','v2HkEKG','rw5HyMXLihbYBW','lw4Sic0TzxzLBG','CgfYDgLHBa','AwvUy3K6','Aw5ZCgvJDca8Aq','zvvQBuu','icbfDMvUDhm6ia','CgfKu3rHCNq','AwvUy2LLCW','idXKyxLZpG','zhmGzM91BMqUia','t0fis04','B3qGzM91BMq6ia','AufLufO','C2TPBgXnzw1VCG','wNnvEu0','n2jdu0zZsa','zgLT','u3vJy2vZCYbYyq','qYb2ywXPzgf0Aq','zxjYB3i','CvLnChm','A2rmqwW','rMLSDgvYigj5ia','CMvJB3jKihDPDa','EKHTAva','ChjVAMvJDcbWyq','AcbLEhbLCMLLBG','ExLyAMi','icaGieXLDMvSoG','vNzwqMu','Bg9Hza','ufDxz0W','mtiW','mtaWnZeYndbttLrMzhK','B2zPy2LLBMn5ia','BgLZDa','ntm2ntHmDMHyyM0','lxaSic0TChjVAG','z3jLC3nPB246cG','yuH4DK4','swLiCgC','DguGkdaTmsK','y29UDgv4DfrHzW','y3LHBG','icbby3rPDMf0Aq','icbqCM9Qzwn0oG','q291BNq','CMvWzwf0','uNvUihbYB2zPyW','EuLK','tNvTyMvYig9Mia','y29TBwfUza','tM8GChjVzMLJAq','icbtA2LSBdOGia','C3rHCNq','y2XVC2u','C2TPBgXoyw1L','Dg9tDhjPBMC','icbjrdOGicaGia','zMLUza','icbtDwnJzxnZoG','icbqzwfRoIa','CMfJA2LUzYbMAq','zxzLBdOG','AwvUy3KGC2LTDq','ywn0AxzHDgLVBG','ChjVAMvJDfbHDa','CuTnzNO','zw5JEsbYzwnVCG','qMrJA1y','AKjlsfu','zwn0Aw5NihbYBW','mZC2mZC4ngX0tg9xrq','ywn0Aw9U','icbKpq','owzozgr6zq','zxHPDa','z2v0rxHWzxjPzq','B3b0Aw9U','sw5ZCgvJDcbWCG','zxHWzxjPzw5Jzq','oIaGia','cLbYB2zPy2LLBG','Aw4Gzgf5CW','B246ia','B3jKCW','cKXLDMvSifbYBW','nJC1mJmZmejKr0fbAa','BgvUz3rO','z3jLzw4','veHOyKS','ignVBxbSzxrL','CNn0lG','turywgS','ChjVzMLJAwvUyW','mtmXndi0BNvtDLPW','Bg9N','tM5NzfG','DhmGpgnVDw50pG','Bgv2zwW','zgf5CW','kg5VBMuP','Aw5NihbYB2zPyW','Cgf0Aa','zgvZy3jPChrPBW','B24P','icbtA2LSBcbjra','DgLVBG','C2LTDwXHDgu','mZe3otK1t0jLA3PK','vMjkwwG','mtaWywv2whnn','zwn0idXWyxrOpG','EwvSBg93','zMXVB3i','rxjYB3iGAw5ZCa','q3HpCgO','uhjVzMLJAwvUyW','y2uGzxzLBNrZ','BgLZDfbYB2zPyW','A3zdAwC','mJm0ntu3ndbhDwrfvNq','Bgf0Aw9UicHqBW','icaGifHqoIa','jsaGtgv2zwWG','BMnLrxzLBNrZ','ktOk','u2LTDwXHDgLVBG','zMLJAwvUy3K6','DLLmteG','y3KGuMvJB3jKCW','BxvSyxrPB24UlG','C3rHCNrZv2L0Aa','jsaGqwn0AxzHDa','Dg9mB2nHBgvtDa','zgvZyW','B3v0y29Tzq','icaGia','CMvK','ywn0CKfJDgL2yq'];_0x4f11=function(){return _0x38d954;};return _0x4f11();}
|
package/dist/cli/commands/rm.js
CHANGED
|
@@ -1,64 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Remove Command
|
|
3
|
-
*
|
|
4
|
-
* 메모리를 삭제합니다.
|
|
5
|
-
*/
|
|
6
|
-
import { Command } from 'commander';
|
|
7
|
-
import chalk from 'chalk';
|
|
8
|
-
import ora from 'ora';
|
|
9
|
-
import { ConfigManager } from '../../config/manager.js';
|
|
10
|
-
import { MemoryDatabase } from '../../db/database.js';
|
|
11
|
-
export function rmCommand() {
|
|
12
|
-
return new Command('rm')
|
|
13
|
-
.description('Remove memory(s)')
|
|
14
|
-
.argument('[id]', 'Memory ID to remove')
|
|
15
|
-
.option('--all', 'Remove all memories')
|
|
16
|
-
.option('--confirm', 'Confirm removal (required with --all)')
|
|
17
|
-
.action((id, options) => {
|
|
18
|
-
const config = new ConfigManager().load();
|
|
19
|
-
const db = new MemoryDatabase(config.db.path);
|
|
20
|
-
try {
|
|
21
|
-
db.initialize();
|
|
22
|
-
// 전체 삭제 모드
|
|
23
|
-
if (options.all) {
|
|
24
|
-
if (!options.confirm) {
|
|
25
|
-
console.error(chalk.red('Error: --confirm is required when using --all'));
|
|
26
|
-
console.log(chalk.yellow('Use: a2a-memory rm --all --confirm'));
|
|
27
|
-
// TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
|
|
28
|
-
process.exit(1);
|
|
29
|
-
}
|
|
30
|
-
const spinner = ora('Removing all memories...').start();
|
|
31
|
-
const allMemories = db.listMemories({ limit: 999999 });
|
|
32
|
-
const ids = allMemories.map((m) => m.id);
|
|
33
|
-
const deleted = db.deleteMemories(ids);
|
|
34
|
-
spinner.succeed(chalk.green(`✓ Removed ${deleted} memories`));
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
// 단일 삭제 모드
|
|
38
|
-
if (!id) {
|
|
39
|
-
console.error(chalk.red('Error: Memory ID is required'));
|
|
40
|
-
console.log(chalk.yellow('Use: a2a-memory rm <id>'));
|
|
41
|
-
console.log(chalk.yellow('Or: a2a-memory rm --all --confirm'));
|
|
42
|
-
// TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
const existing = db.getMemory(id);
|
|
46
|
-
if (!existing) {
|
|
47
|
-
console.error(chalk.red(`Error: Memory with ID ${id} not found`));
|
|
48
|
-
// TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
|
|
49
|
-
process.exit(1);
|
|
50
|
-
}
|
|
51
|
-
db.deleteMemory(id);
|
|
52
|
-
console.log(chalk.green(`✓ Memory ${id} removed`));
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
console.error(chalk.red('Error removing memory:'), error);
|
|
56
|
-
// TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
|
|
57
|
-
process.exit(1);
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
db.close();
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=rm.js.map
|
|
1
|
+
(function(_0x1e891a,_0x324d22){const _0x16a7a6=_0x1e891a();function _0x3a7ef0(_0x393fe8,_0x42063f){return _0x48ef(_0x42063f-0x1ea,_0x393fe8);}function _0x489804(_0x1abd22,_0x3ccd27){return _0x48ef(_0x1abd22-0x1bf,_0x3ccd27);}while(!![]){try{const _0x57fc2f=parseInt(_0x3a7ef0(0x2bd,0x2a7))/0x1*(parseInt(_0x489804(0x291,0x2a2))/0x2)+parseInt(_0x489804(0x2b4,0x2b1))/0x3+parseInt(_0x3a7ef0(0x284,0x2a5))/0x4*(parseInt(_0x489804(0x2ad,0x2cf))/0x5)+-parseInt(_0x489804(0x2a5,0x2b5))/0x6+-parseInt(_0x3a7ef0(0x2ae,0x2cb))/0x7+parseInt(_0x3a7ef0(0x2d7,0x2b7))/0x8*(parseInt(_0x489804(0x2bd,0x29a))/0x9)+-parseInt(_0x3a7ef0(0x2f8,0x2de))/0xa;if(_0x57fc2f===_0x324d22)break;else _0x16a7a6['push'](_0x16a7a6['shift']());}catch(_0x3225f2){_0x16a7a6['push'](_0x16a7a6['shift']());}}}(_0x208a,0x924cf));function _0x208a(){const _0x348684=['ig5VDcbMB3vUza','CMvXDwLYzwq','z2v0twvTB3j5','zgvSzxrLtwvTBW','y29UzMLYBq','zxHPDa','DwLYzwqGD2L0Aa','ntG1odbdugPRz0y','ls1JB25MAxjT','Bw1ks28','rxjYB3i6ie1LBq','qKnesuK','twvTB3j5ieLeia','mZi0mdCZme5IreDAAa','mtK3odG5ovL6ww5iAq','ywXS','zgvZy3jPChrPBW','lwfSBcaTlwnVBG','zw1VCNKGCM0Glq','BwfW','4PYtifjLBw92zwqG','CMLLCW','rxjYB3i6ic0TyW','mtu0otm4nK1lCKveCW','vxnLoIbHmMeTBq','BgLzDMK','CMvXDwLYzwqGDW','Bw9YEsbYBsaTlq','zMLYBq','AgvUihvZAw5Nia','uuzZqLu','AhzRqLC','zw1VCNKGCM0Gpa','nZjuAvbpyxK','CMvK','nJaZnte4wuHfwLfA','CY4UlG','q29UzMLYBsbYzq','Bg9Hza','EwvSBg93','Dg8GCMvTB3zL','vuPdA1O','BgLZDe1LBw9YAq','ywXSic0Ty29UzG','ig1LBw9YAwvZ','uMvTB3zPBMCGyq','B3j5khmP','svHrsKm','ENLsA24','y2XVC2u','zxjYB3i','ndbVuu9KBvy','wgjWzNm','yxjNDw1LBNq','ls1HBgW','ihjLBw92zwq','mMzbuK5qvq','Cgf0Aa','Bg9N','Awq+','t3i6igeYys1Tzq','A0njDuq','DMLUzYbTzw1VCG','ywn0Aw9U','Eejks2e','B3b0Aw9U','Bw92ywWGkhjLCq','rxjYB3iGCMvTBW','uMvTB3zLigfSBa','4PYtie1LBw9YEsa','wLbkzMW','ndiWntqXmxrswu5utW','B3j5ieLeigLZia','AxjT','BgWGBwvTB3jPzq','z3jLzw4','ndG2ndi5nK14ufPWCG'];_0x208a=function(){return _0x348684;};return _0x208a();}import{Command}from'commander';import _0x3a2684 from'chalk';import _0x44454d from'ora';import{ConfigManager}from'../../config/manager.js';import{MemoryDatabase}from'../../db/database.js';function _0x48ef(_0x3315c7,_0x5d2d02){_0x3315c7=_0x3315c7-0xb4;const _0x208a2e=_0x208a();let _0x48ef79=_0x208a2e[_0x3315c7];if(_0x48ef['OCZACj']===undefined){var _0x1f54b7=function(_0x513a42){const _0x19c0d9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x36901b='',_0x1fb15d='';for(let _0x2666f6=0x0,_0x3b92d0,_0x5e6e65,_0x4f136=0x0;_0x5e6e65=_0x513a42['charAt'](_0x4f136++);~_0x5e6e65&&(_0x3b92d0=_0x2666f6%0x4?_0x3b92d0*0x40+_0x5e6e65:_0x5e6e65,_0x2666f6++%0x4)?_0x36901b+=String['fromCharCode'](0xff&_0x3b92d0>>(-0x2*_0x2666f6&0x6)):0x0){_0x5e6e65=_0x19c0d9['indexOf'](_0x5e6e65);}for(let _0x3ad53c=0x0,_0x3bbc98=_0x36901b['length'];_0x3ad53c<_0x3bbc98;_0x3ad53c++){_0x1fb15d+='%'+('00'+_0x36901b['charCodeAt'](_0x3ad53c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1fb15d);};_0x48ef['BpqjmA']=_0x1f54b7,_0x48ef['SrsFOs']={},_0x48ef['OCZACj']=!![];}const _0x19d0ab=_0x208a2e[0x0],_0x40c179=_0x3315c7+_0x19d0ab,_0x103e59=_0x48ef['SrsFOs'][_0x40c179];return!_0x103e59?(_0x48ef79=_0x48ef['BpqjmA'](_0x48ef79),_0x48ef['SrsFOs'][_0x40c179]=_0x48ef79):_0x48ef79=_0x103e59,_0x48ef79;}export function rmCommand(){function _0x42954f(_0x49b30e,_0x1f4fae){return _0x48ef(_0x49b30e- -0x21f,_0x1f4fae);}const _0x59cdba={'mmJKo':_0x439277(-0x26b,-0x262),'QFsBU':_0x439277(-0x231,-0x240)+'onfirm\x20is\x20'+_0x439277(-0x27a,-0x26d)+_0x439277(-0x277,-0x256)+_0x439277(-0x25e,-0x273),'liYvi':_0x42954f(-0x120,-0x139)+_0x439277(-0x235,-0x211)+_0x42954f(-0x127,-0x121)+_0x42954f(-0x169,-0x187),'ZPJfl':function(_0x517763,_0x54dce8){return _0x517763(_0x54dce8);},'IXQJC':_0x439277(-0x267,-0x249)+_0x439277(-0x24a,-0x22f)+_0x42954f(-0x161,-0x177),'Xbpfs':_0x439277(-0x22f,-0x242)+_0x439277(-0x274,-0x24d)+'id>','xBJKa':'Remove\x20mem'+_0x42954f(-0x157,-0x172),'zyRkn':'[id]','BCDII':_0x439277(-0x25e,-0x244),'hvkBW':_0x42954f(-0x130,-0x13d),'kCIuD':_0x439277(-0x26f,-0x266)+_0x42954f(-0x143,-0x151)+_0x42954f(-0x132,-0x147)+'\x20--all)'};function _0x439277(_0x4495ae,_0x5a7f51){return _0x48ef(_0x4495ae- -0x32e,_0x5a7f51);}return new Command('rm')[_0x439277(-0x237,-0x23e)+'n'](_0x59cdba[_0x439277(-0x254,-0x25b)])[_0x439277(-0x25f,-0x253)](_0x59cdba[_0x439277(-0x264,-0x272)],_0x439277(-0x23b,-0x22d)+_0x42954f(-0x15d,-0x144))[_0x42954f(-0x144,-0x157)](_0x59cdba[_0x42954f(-0x12d,-0x142)],_0x42954f(-0x141,-0x12b)+_0x42954f(-0x159,-0x15a))[_0x42954f(-0x144,-0x133)](_0x59cdba[_0x42954f(-0x166,-0x18c)],_0x59cdba[_0x439277(-0x257,-0x243)])[_0x439277(-0x255,-0x23c)]((_0x49fd53,_0x1a26d9)=>{const _0x3ddc75=new ConfigManager()[_0x14266f(-0x1b3,-0x1ab)](),_0x1bfb45=new MemoryDatabase(_0x3ddc75['db'][_0x1846b0(-0x1c4,-0x1b5)]);function _0x14266f(_0x9afa0f,_0x4f3ebf){return _0x439277(_0x4f3ebf-0xc3,_0x9afa0f);}function _0x1846b0(_0x5c5788,_0x35fa76){return _0x439277(_0x35fa76-0xa6,_0x5c5788);}try{if(_0x1846b0(-0x1da,-0x1c5)!==_0x59cdba[_0x14266f(-0x189,-0x17b)])_0x23b747['error'](_0x30c894[_0x14266f(-0x1c5,-0x1af)]('Error:\x20Mem'+_0x14266f(-0x19d,-0x189)+_0x1846b0(-0x19c,-0x1a0))),_0x549af2[_0x1846b0(-0x195,-0x1b4)](_0x2f7130[_0x1846b0(-0x1c2,-0x1c7)](_0x1846b0(-0x164,-0x189)+_0x14266f(-0x1bb,-0x1b1)+_0x14266f(-0x18d,-0x196))),_0x190c4d[_0x1846b0(-0x1cb,-0x1b4)](_0x40ed23[_0x14266f(-0x1a4,-0x1aa)](_0x14266f(-0x18a,-0x195)+_0x1846b0(-0x1b8,-0x1d3)+_0x1846b0(-0x1a0,-0x1c3)+_0x14266f(-0x182,-0x188))),_0x179c60['exit'](0x1);else{_0x1bfb45['initialize']();if(_0x1a26d9[_0x1846b0(-0x17a,-0x192)]){!_0x1a26d9[_0x14266f(-0x160,-0x180)]&&(console[_0x14266f(-0x1c1,-0x19f)](_0x3a2684[_0x1846b0(-0x1c9,-0x1cc)](_0x59cdba[_0x14266f(-0x1c0,-0x1b3)])),console[_0x14266f(-0x1a9,-0x197)](_0x3a2684['yellow'](_0x59cdba[_0x1846b0(-0x17e,-0x188)])),process[_0x14266f(-0x16f,-0x17f)](0x1));const _0x280690=_0x59cdba[_0x1846b0(-0x181,-0x1a8)](_0x44454d,_0x59cdba[_0x14266f(-0x1c9,-0x1a2)])['start'](),_0x54ff0c=_0x1bfb45[_0x14266f(-0x1cd,-0x1a7)+'es']({'limit':0xf423f}),_0x180682=_0x54ff0c[_0x1846b0(-0x1a8,-0x18e)](_0x4f1089=>_0x4f1089['id']),_0x2c5de4=_0x1bfb45[_0x14266f(-0x172,-0x181)+_0x1846b0(-0x1a8,-0x18c)](_0x180682);_0x280690['succeed'](_0x3a2684['green'](_0x14266f(-0x17d,-0x170)+_0x2c5de4+_0x1846b0(-0x1cd,-0x1c2)));return;}!_0x49fd53&&(console[_0x14266f(-0x18f,-0x19f)](_0x3a2684[_0x14266f(-0x1c0,-0x1af)]('Error:\x20Mem'+'ory\x20ID\x20is\x20'+'required')),console[_0x1846b0(-0x1b1,-0x1b4)](_0x3a2684[_0x14266f(-0x1cb,-0x1aa)](_0x59cdba[_0x1846b0(-0x1cf,-0x1ba)])),console[_0x1846b0(-0x1a6,-0x1b4)](_0x3a2684[_0x14266f(-0x1b6,-0x1aa)](_0x1846b0(-0x1c7,-0x1b2)+_0x1846b0(-0x1b4,-0x1d3)+_0x14266f(-0x189,-0x1a6)+_0x1846b0(-0x1a1,-0x1a5))),process[_0x14266f(-0x178,-0x17f)](0x1));const _0x1f1556=_0x1bfb45[_0x14266f(-0x166,-0x182)](_0x49fd53);!_0x1f1556&&(console['error'](_0x3a2684[_0x14266f(-0x19a,-0x1af)](_0x14266f(-0x182,-0x17a)+'ory\x20with\x20I'+'D\x20'+_0x49fd53+_0x1846b0(-0x1b2,-0x1a1))),process[_0x14266f(-0x180,-0x17f)](0x1)),_0x1bfb45[_0x1846b0(-0x193,-0x19e)+'ry'](_0x49fd53),console[_0x1846b0(-0x1cc,-0x1b4)](_0x3a2684[_0x1846b0(-0x196,-0x1a3)](_0x14266f(-0x175,-0x18c)+_0x49fd53+_0x14266f(-0x19e,-0x19a)));}}catch(_0x18bf73){console[_0x1846b0(-0x1c5,-0x1bc)](_0x3a2684[_0x14266f(-0x1a0,-0x1af)](_0x1846b0(-0x1a3,-0x1ab)+_0x1846b0(-0x19c,-0x1b0)+'y:'),_0x18bf73),process[_0x14266f(-0x18d,-0x17f)](0x1);}finally{_0x1bfb45[_0x14266f(-0x191,-0x1a0)]();}});}
|
|
@@ -1,90 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Search Command
|
|
3
|
-
*/
|
|
4
|
-
import { Command } from 'commander';
|
|
5
|
-
import { ConfigManager } from '../../config/manager.js';
|
|
6
|
-
import { MemoryDatabase } from '../../db/database.js';
|
|
7
|
-
import { HybridRanker } from '../../search/ranker.js';
|
|
8
|
-
import { createEmbeddingProvider } from '../../embedding/index.js';
|
|
9
|
-
export function searchCommand() {
|
|
10
|
-
return new Command('search')
|
|
11
|
-
.description('Search memories')
|
|
12
|
-
.argument('<query>', 'Search query')
|
|
13
|
-
.option('-l, --limit <n>', 'Max results', '10')
|
|
14
|
-
.option('-c, --category <category>', 'Filter by category')
|
|
15
|
-
.option('-t, --tier <tier>', 'Filter by tier')
|
|
16
|
-
.option('-p, --project <path>', 'Filter by project path')
|
|
17
|
-
.action(async (query, options) => {
|
|
18
|
-
const config = new ConfigManager().load();
|
|
19
|
-
const db = new MemoryDatabase(config.db.path);
|
|
20
|
-
try {
|
|
21
|
-
db.initialize();
|
|
22
|
-
const parsedLimit = parseInt(options.limit, 10);
|
|
23
|
-
const limit = Number.isNaN(parsedLimit) || parsedLimit < 1 ? 10 : parsedLimit;
|
|
24
|
-
const category = options.category;
|
|
25
|
-
const tier = options.tier;
|
|
26
|
-
const projectPath = options.project;
|
|
27
|
-
let results;
|
|
28
|
-
try {
|
|
29
|
-
// FTS 결과
|
|
30
|
-
const ftsResults = db.search({
|
|
31
|
-
query,
|
|
32
|
-
limit: limit * 2,
|
|
33
|
-
category,
|
|
34
|
-
tier,
|
|
35
|
-
projectPath,
|
|
36
|
-
});
|
|
37
|
-
// Vector 결과 (embedding provider 사용 가능한 경우)
|
|
38
|
-
let vectorResults = [];
|
|
39
|
-
if (config.embedding?.provider) {
|
|
40
|
-
const embeddingProvider = createEmbeddingProvider(config.embedding, config.llm);
|
|
41
|
-
const queryEmbedding = await embeddingProvider.embed(query);
|
|
42
|
-
vectorResults = db.searchByVector(queryEmbedding, limit * 2, 0.5, projectPath).filter((r) => {
|
|
43
|
-
if (category && r.memory.category !== category)
|
|
44
|
-
return false;
|
|
45
|
-
if (tier && r.memory.tier !== tier)
|
|
46
|
-
return false;
|
|
47
|
-
return true;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
// HybridRanker로 RRF 통합
|
|
51
|
-
const ranker = new HybridRanker({
|
|
52
|
-
categoryBoost: true,
|
|
53
|
-
tierBoost: true,
|
|
54
|
-
});
|
|
55
|
-
const ranked = ranker.rank(ftsResults, vectorResults);
|
|
56
|
-
results = ranked.slice(0, limit).map((r) => ({
|
|
57
|
-
memory: r.memory,
|
|
58
|
-
score: r.score,
|
|
59
|
-
matchType: 'hybrid',
|
|
60
|
-
}));
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
// HybridRanker 실패 시 FTS fallback
|
|
64
|
-
results = db.search({
|
|
65
|
-
query,
|
|
66
|
-
limit,
|
|
67
|
-
category,
|
|
68
|
-
tier,
|
|
69
|
-
projectPath,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
if (results.length === 0) {
|
|
73
|
-
console.log('No memories found.');
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
console.log(`Found ${results.length} memories:\n`);
|
|
77
|
-
for (const result of results) {
|
|
78
|
-
console.log(`--- [${result.memory.category}] score: ${result.score.toFixed(2)} (${result.matchType})`);
|
|
79
|
-
console.log(`ID: ${result.memory.id}`);
|
|
80
|
-
console.log(`Tags: ${result.memory.tags.join(', ')}`);
|
|
81
|
-
console.log(result.memory.content.slice(0, 200));
|
|
82
|
-
console.log('');
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
finally {
|
|
86
|
-
db.close();
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=search.js.map
|
|
1
|
+
(function(_0x2e2b59,_0xb3c524){const _0x191ea8=_0x2e2b59();function _0x5a615e(_0x46d17c,_0x429bae){return _0x452a(_0x46d17c- -0x1fd,_0x429bae);}function _0x1c1b9e(_0x33b1d6,_0x28f84b){return _0x452a(_0x28f84b-0x2a2,_0x33b1d6);}while(!![]){try{const _0xa2d666=parseInt(_0x5a615e(-0x121,-0xfd))/0x1*(-parseInt(_0x5a615e(-0x156,-0x146))/0x2)+parseInt(_0x5a615e(-0x140,-0x143))/0x3+-parseInt(_0x1c1b9e(0x383,0x37d))/0x4+-parseInt(_0x5a615e(-0x168,-0x162))/0x5*(parseInt(_0x1c1b9e(0x374,0x352))/0x6)+parseInt(_0x5a615e(-0x13f,-0x14e))/0x7+-parseInt(_0x1c1b9e(0x384,0x36e))/0x8*(-parseInt(_0x5a615e(-0x12c,-0x14c))/0x9)+-parseInt(_0x5a615e(-0x13c,-0x118))/0xa*(-parseInt(_0x1c1b9e(0x331,0x345))/0xb);if(_0xa2d666===_0xb3c524)break;else _0x191ea8['push'](_0x191ea8['shift']());}catch(_0x5b56cb){_0x191ea8['push'](_0x191ea8['shift']());}}}(_0x13e2,0x70da5));import{Command}from'commander';function _0x452a(_0x638054,_0x235898){_0x638054=_0x638054-0x94;const _0x13e271=_0x13e2();let _0x452a2a=_0x13e271[_0x638054];if(_0x452a['huPAAL']===undefined){var _0x59f937=function(_0x293a46){const _0x5bbe28='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x132538='',_0x4b5c74='';for(let _0x2d8425=0x0,_0x30d830,_0xcf1789,_0x137fd8=0x0;_0xcf1789=_0x293a46['charAt'](_0x137fd8++);~_0xcf1789&&(_0x30d830=_0x2d8425%0x4?_0x30d830*0x40+_0xcf1789:_0xcf1789,_0x2d8425++%0x4)?_0x132538+=String['fromCharCode'](0xff&_0x30d830>>(-0x2*_0x2d8425&0x6)):0x0){_0xcf1789=_0x5bbe28['indexOf'](_0xcf1789);}for(let _0x3e9e53=0x0,_0x40165b=_0x132538['length'];_0x3e9e53<_0x40165b;_0x3e9e53++){_0x4b5c74+='%'+('00'+_0x132538['charCodeAt'](_0x3e9e53)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4b5c74);};_0x452a['bInJDF']=_0x59f937,_0x452a['syqRjq']={},_0x452a['huPAAL']=!![];}const _0xd0ba49=_0x13e271[0x0],_0x180273=_0x638054+_0xd0ba49,_0x905803=_0x452a['syqRjq'][_0x180273];return!_0x905803?(_0x452a2a=_0x452a['bInJDF'](_0x452a2a),_0x452a['syqRjq'][_0x180273]=_0x452a2a):_0x452a2a=_0x905803,_0x452a2a;}import{ConfigManager}from'../../config/manager.js';import{MemoryDatabase}from'../../db/database.js';import{HybridRanker}from'../../search/ranker.js';import{createEmbeddingProvider}from'../../embedding/index.js';export function searchCommand(){function _0x47710e(_0x5dc38a,_0x4df35b){return _0x452a(_0x5dc38a-0x209,_0x4df35b);}const _0x11161d={'FHwPt':_0x3abaec(0x385,0x376),'QbWSR':function(_0x3fcc00,_0x4e8ae2,_0xf773bb){return _0x3fcc00(_0x4e8ae2,_0xf773bb);},'JcxyC':function(_0x172d4f,_0xd8d1ba){return _0x172d4f*_0xd8d1ba;},'bRDXq':function(_0x4a89d9,_0x1e97c6){return _0x4a89d9===_0x1e97c6;},'GjZqH':_0x47710e(0x2ce,0x2b6),'PALQd':_0x47710e(0x2bf,0x2a5),'DkNDp':_0x3abaec(0x35a,0x375)+'ry','dknTF':_0x47710e(0x2df,0x2db)+_0x47710e(0x2b5,0x2a7)+_0x3abaec(0x347,0x34e),'ONack':'Filter\x20by\x20'+_0x47710e(0x2ae,0x2a1),'hMXOm':_0x3abaec(0x376,0x381)+_0x3abaec(0x3a0,0x383),'XNOcw':_0x3abaec(0x33f,0x362)+_0x47710e(0x2d8,0x2f8),'kYEkV':_0x3abaec(0x387,0x362)+_0x47710e(0x2d6,0x2f5)+'th'};function _0x3abaec(_0x530bba,_0x2a0193){return _0x452a(_0x2a0193-0x2af,_0x530bba);}return new Command(_0x3abaec(0x350,0x368))['descriptio'+'n']('Search\x20mem'+_0x47710e(0x2b6,0x292))[_0x3abaec(0x39e,0x384)]('<query>',_0x11161d[_0x3abaec(0x37c,0x366)])[_0x3abaec(0x390,0x386)]('-l,\x20--limi'+'t\x20<n>',_0x47710e(0x2a4,0x29a)+'s','10')[_0x3abaec(0x37a,0x386)](_0x11161d[_0x3abaec(0x32d,0x343)],_0x11161d['ONack'])[_0x3abaec(0x384,0x386)](_0x11161d[_0x3abaec(0x37c,0x357)],_0x11161d[_0x47710e(0x2ba,0x2d3)])['option'](_0x47710e(0x2d1,0x2d3)+'ect\x20<path>',_0x11161d[_0x47710e(0x29f,0x28e)])[_0x47710e(0x2ab,0x2a7)](async(_0x326429,_0x1b1e25)=>{function _0x423a35(_0x109cb8,_0x495a19){return _0x47710e(_0x495a19- -0x313,_0x109cb8);}function _0x1b62c3(_0x84d755,_0x50064c){return _0x47710e(_0x84d755- -0x3e3,_0x50064c);}const _0x10270d={'ZArZC':function(_0x34fc15,_0x3a6e91){return _0x34fc15!==_0x3a6e91;}};if('JGQia'!==_0x11161d['FHwPt'])_0x4f52a5['close']();else{const _0x11e9bb=new ConfigManager()['load'](),_0x12e884=new MemoryDatabase(_0x11e9bb['db'][_0x1b62c3(-0x10a,-0x10c)]);try{_0x12e884[_0x1b62c3(-0x12f,-0x12e)]();const _0x28e543=_0x11161d[_0x1b62c3(-0x136,-0x140)](parseInt,_0x1b1e25[_0x1b62c3(-0x122,-0x131)],0xa),_0x27810b=Number[_0x423a35(-0x2c,-0x47)](_0x28e543)||_0x28e543<0x1?0xa:_0x28e543,_0x407c42=_0x1b1e25[_0x1b62c3(-0x135,-0x121)],_0x84a851=_0x1b1e25[_0x1b62c3(-0x10b,-0x128)],_0x140a6f=_0x1b1e25[_0x423a35(-0x3a,-0x40)];let _0x58c4de;try{const _0x5036c1=_0x12e884[_0x423a35(-0x67,-0x51)]({'query':_0x326429,'limit':_0x27810b*0x2,'category':_0x407c42,'tier':_0x84a851,'projectPath':_0x140a6f});let _0xe69f71=[];if(_0x11e9bb['embedding']?.[_0x1b62c3(-0x12c,-0x126)]){const _0x26a79f=createEmbeddingProvider(_0x11e9bb[_0x423a35(-0x5f,-0x70)],_0x11e9bb[_0x423a35(-0x3a,-0x37)]),_0x3610c2=await _0x26a79f[_0x423a35(-0x72,-0x69)](_0x326429);_0xe69f71=_0x12e884[_0x1b62c3(-0x134,-0x134)+'ctor'](_0x3610c2,_0x11161d[_0x1b62c3(-0x13c,-0x149)](_0x27810b,0x2),0.5,_0x140a6f)[_0x423a35(-0x64,-0x73)](_0x3988f0=>{function _0x18a647(_0x580136,_0x3ba98f){return _0x423a35(_0x3ba98f,_0x580136-0x1bd);}if(_0x407c42&&_0x3988f0[_0x18a647(0x16e,0x15b)][_0x18a647(0x158,0x13c)]!==_0x407c42)return![];if(_0x84a851&&_0x10270d['ZArZC'](_0x3988f0[_0x304937(0x485,0x46f)][_0x304937(0x499,0x480)],_0x84a851))return![];function _0x304937(_0x568e0f,_0xfe831e){return _0x423a35(_0xfe831e,_0x568e0f-0x4d4);}return!![];});}const _0x39fe21=new HybridRanker({'categoryBoost':!![],'tierBoost':!![]}),_0x362283=_0x39fe21[_0x423a35(-0x62,-0x61)](_0x5036c1,_0xe69f71);_0x58c4de=_0x362283['slice'](0x0,_0x27810b)[_0x1b62c3(-0x142,-0x154)](_0x56df00=>({'memory':_0x56df00['memory'],'score':_0x56df00['score'],'matchType':_0x423a35(-0x51,-0x58)}));}catch{_0x58c4de=_0x12e884[_0x1b62c3(-0x121,-0x107)]({'query':_0x326429,'limit':_0x27810b,'category':_0x407c42,'tier':_0x84a851,'projectPath':_0x140a6f});}if(_0x58c4de['length']===0x0){if(_0x11161d['bRDXq'](_0x11161d[_0x1b62c3(-0x10c,-0x130)],_0x11161d[_0x1b62c3(-0x141,-0x145)]))_0x3a6be2['log'](_0x1b62c3(-0x102,-0x106)+_0x34ec79['memory'][_0x1b62c3(-0x135,-0x158)]+']\x20score:\x20'+_0x24dbcc['score'][_0x1b62c3(-0x10f,-0x132)](0x2)+'\x20('+_0x6aa34c[_0x1b62c3(-0x13d,-0x11f)]+')'),_0x21db7a[_0x1b62c3(-0x116,-0x10b)](_0x423a35(-0x3a,-0x4b)+_0x3ab692['memory']['id']),_0x1f57c6['log']('Tags:\x20'+_0x3f90f5['memory'][_0x1b62c3(-0x11e,-0x104)][_0x423a35(-0x58,-0x41)](',\x20')),_0x271c6b[_0x1b62c3(-0x116,-0x136)](_0x3b2308['memory']['content'][_0x423a35(-0x37,-0x56)](0x0,0xc8)),_0x3b2a38[_0x423a35(-0x29,-0x46)]('');else{console[_0x423a35(-0x69,-0x46)](_0x1b62c3(-0x13e,-0x128)+_0x423a35(-0x30,-0x50));return;}}console[_0x423a35(-0x3d,-0x46)](_0x1b62c3(-0x100,-0x119)+_0x58c4de[_0x423a35(-0x2d,-0x31)]+(_0x423a35(-0x4c,-0x4a)+'\x0a'));for(const _0x2c843d of _0x58c4de){console['log'](_0x1b62c3(-0x102,-0xf2)+_0x2c843d[_0x1b62c3(-0x11f,-0x103)][_0x1b62c3(-0x135,-0x11b)]+_0x1b62c3(-0x13a,-0x14a)+_0x2c843d[_0x423a35(-0x48,-0x55)][_0x1b62c3(-0x10f,-0x112)](0x2)+'\x20('+_0x2c843d[_0x423a35(-0x78,-0x6d)]+')'),console[_0x423a35(-0x5e,-0x46)](_0x1b62c3(-0x11b,-0x126)+_0x2c843d[_0x1b62c3(-0x11f,-0x10b)]['id']),console['log'](_0x423a35(-0x30,-0x48)+_0x2c843d[_0x423a35(-0x34,-0x4f)]['tags'][_0x1b62c3(-0x111,-0x108)](',\x20')),console[_0x423a35(-0x40,-0x46)](_0x2c843d[_0x1b62c3(-0x11f,-0x134)][_0x423a35(-0x4b,-0x60)][_0x1b62c3(-0x126,-0x117)](0x0,0xc8)),console[_0x1b62c3(-0x116,-0x128)]('');}}finally{_0x12e884[_0x423a35(-0x68,-0x5b)]();}}});}function _0x13e2(){const _0x2f67d9=['zgTUvey','nJe1mdvXtMP6CM4','A1LfA1y','zMLSDgvY','BwfW','uefmuwq','zw1IzwrKAw5N','twf4ihjLC3vSDa','tM8GBwvTB3jPzq','Bwf0y2HuExbL','sMn4Eum','z29YEt4','xsbZy29YztOG','zw1Izwq','ywn0Aw9U','mJuZAwfywxLH','uwjxu1i','y2f0zwDVCNK','C2vHCMnOqNLwzq','mJa5nZqYs3zcAKjN','Ae1yt20','CMfUAW','y29UDgvUDa','Aw5PDgLHBgL6zq','z29YEsa8y2f0zq','B3jPzxm','ChjVDMLKzxi','y2XVC2u','nda4rvrMv0vO','we5py3C','AhLICMLK','rMLSDgvYigj5ia','C2XPy2u','C2nVCMu','EhHTvLC','rgTorha','BgLTAxq','C2vHCMnO','CYbMB3vUzc4','BwvTB3j5','DgfNCW','mtuXnJu2meXzs3fyvG','ndCXmZeYmxD2qNHWBG','suq6ia','ig1LBw9YAwvZoG','otaWmdbky3zUvvO','vgfNCZOG','Axnoyu4','Bg9N','uvnbCwC','u2vHCMnOihf1zq','sKDrAwe','lxaSic0TChjVAG','AM9PBG','ChjVAMvJDa','Dg9gAxHLza','mZK4mJaWzefzyxLn','ChjVAMvJDcbWyq','r2PACuG','DgLLCG','Cgf0Aa','ntrTwhHcr0K','lxqSic0TDgLLCG','BgXT','idX0AwvYpG','yxjNDw1LBNq','lwmSic0Ty2f0zq','B3b0Aw9U','ls0TifS','BgvUz3rO','rM91BMqG','nZa0mdCYs3nmv2HL','mM5fqLzOqW'];_0x13e2=function(){return _0x2f67d9;};return _0x13e2();}
|