a2a-memory 0.11.5 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -19
- package/README.md +1 -1
- package/dist/a2a/client.js +1 -252
- package/dist/a2a/discovery.js +1 -115
- package/dist/a2a/index.js +1 -8
- package/dist/a2a/types.js +1 -42
- package/dist/adapters/anthropic.js +1 -117
- package/dist/chunking/chunker.js +1 -163
- package/dist/claude/sync.d.ts +8 -2
- package/dist/claude/sync.js +1 -298
- package/dist/cli/commands/add.js +1 -80
- package/dist/cli/commands/claude-sync.d.ts +3 -3
- package/dist/cli/commands/claude-sync.js +1 -70
- package/dist/cli/commands/cleanup.js +1 -83
- package/dist/cli/commands/config.js +1 -79
- package/dist/cli/commands/edit.js +1 -69
- package/dist/cli/commands/embed.js +1 -92
- package/dist/cli/commands/extract.js +1 -103
- package/dist/cli/commands/health.js +1 -105
- package/dist/cli/commands/list.js +1 -46
- package/dist/cli/commands/migrate-chunks.js +1 -205
- package/dist/cli/commands/migrate-file-refs.js +1 -183
- package/dist/cli/commands/proficiency.js +1 -146
- package/dist/cli/commands/rm.js +1 -64
- package/dist/cli/commands/search.js +1 -90
- package/dist/cli/commands/setup-wizard.js +1 -387
- package/dist/cli/commands/setup.js +1 -170
- package/dist/cli/commands/skill.js +1 -151
- package/dist/cli/commands/status.js +1 -70
- package/dist/cli/commands/sync.js +1 -202
- package/dist/cli/commands/team.js +1 -142
- package/dist/cli/index.js +1 -87
- package/dist/config/manager.js +1 -372
- package/dist/db/database.d.ts +36 -0
- package/dist/db/database.js +1 -1400
- package/dist/embedding/e5-provider.js +1 -147
- package/dist/embedding/index.js +1 -34
- package/dist/embedding/local-provider.js +1 -157
- package/dist/embedding/openai-provider.js +1 -92
- package/dist/embedding/quantization.js +1 -89
- package/dist/extraction/dedup-manager.js +1 -161
- package/dist/extraction/emotion-filter.js +1 -33
- package/dist/extraction/extractor.d.ts +0 -3
- package/dist/extraction/extractor.js +1 -648
- package/dist/extraction/file-reference.js +1 -77
- package/dist/extraction/filter.js +1 -86
- package/dist/extraction/scorer.js +1 -142
- package/dist/extraction/similarity.js +1 -85
- package/dist/hooks/client-factory.js +1 -44
- package/dist/hooks/post-tool-use.js +1 -518
- package/dist/hooks/pre-compact.js +1 -209
- package/dist/hooks/session-end.js +1 -633
- package/dist/hooks/session-start.js +1 -549
- package/dist/hooks/shared.js +1 -110
- package/dist/hooks/stop.d.ts +21 -0
- package/dist/hooks/stop.js +1 -0
- package/dist/hooks/user-prompt-submit.js +1 -316
- package/dist/i18n/index.js +1 -2
- package/dist/i18n/messages.js +1 -150
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -43
- package/dist/lifecycle/cleanup-scheduler.js +1 -137
- package/dist/lifecycle/cleanup.d.ts +1 -0
- package/dist/lifecycle/cleanup.js +1 -116
- package/dist/lifecycle/consolidation.d.ts +22 -0
- package/dist/lifecycle/consolidation.js +1 -0
- package/dist/lifecycle/index.d.ts +2 -0
- package/dist/lifecycle/index.js +1 -13
- package/dist/lifecycle/injection-flush.d.ts +24 -0
- package/dist/lifecycle/injection-flush.js +1 -0
- package/dist/lifecycle/quality-scorer.d.ts +5 -6
- package/dist/lifecycle/quality-scorer.js +1 -46
- package/dist/lifecycle/tiering.js +1 -246
- package/dist/llm/client.js +1 -226
- package/dist/llm/index.js +1 -5
- package/dist/proficiency/actr-engine.js +1 -106
- package/dist/proficiency/detection.js +1 -77
- package/dist/proficiency/index.js +1 -9
- package/dist/proficiency/tracker.js +1 -173
- package/dist/proficiency/types.js +1 -8
- package/dist/providers/adapters.js +1 -140
- package/dist/providers/detector.js +1 -57
- package/dist/search/adaptive-router.js +1 -93
- package/dist/search/index.js +1 -9
- package/dist/search/ranker.js +1 -171
- package/dist/search/reranker.js +1 -155
- package/dist/session/parser.js +1 -130
- package/dist/skill/evaluator.js +1 -509
- package/dist/skill/index.js +1 -7
- package/dist/skill/types.js +1 -7
- package/dist/sync/client.d.ts +7 -0
- package/dist/sync/client.js +1 -597
- package/dist/sync/encryption.js +1 -203
- package/dist/sync/index.js +1 -12
- package/dist/sync/queue.js +1 -214
- package/dist/sync/scheduler.js +1 -140
- package/dist/sync/synchronizer.js +1 -241
- package/dist/sync/team-synchronizer.js +1 -204
- package/dist/sync/vector-clock.js +1 -70
- package/dist/types/index.d.ts +13 -1
- package/dist/types/index.js +1 -132
- package/dist/utils/keychain.js +1 -170
- package/dist/utils/logger.js +1 -128
- package/package.json +15 -10
- package/dist/a2a/client.d.ts.map +0 -1
- package/dist/a2a/client.js.map +0 -1
- package/dist/a2a/discovery.d.ts.map +0 -1
- package/dist/a2a/discovery.js.map +0 -1
- package/dist/a2a/index.d.ts.map +0 -1
- package/dist/a2a/index.js.map +0 -1
- package/dist/a2a/types.d.ts.map +0 -1
- package/dist/a2a/types.js.map +0 -1
- package/dist/adapters/anthropic.d.ts.map +0 -1
- package/dist/adapters/anthropic.js.map +0 -1
- package/dist/chunking/chunker.d.ts.map +0 -1
- package/dist/chunking/chunker.js.map +0 -1
- package/dist/claude/sync.d.ts.map +0 -1
- package/dist/claude/sync.js.map +0 -1
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/claude-sync.d.ts.map +0 -1
- package/dist/cli/commands/claude-sync.js.map +0 -1
- package/dist/cli/commands/cleanup.d.ts.map +0 -1
- package/dist/cli/commands/cleanup.js.map +0 -1
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/edit.d.ts.map +0 -1
- package/dist/cli/commands/edit.js.map +0 -1
- package/dist/cli/commands/embed.d.ts.map +0 -1
- package/dist/cli/commands/embed.js.map +0 -1
- package/dist/cli/commands/extract.d.ts.map +0 -1
- package/dist/cli/commands/extract.js.map +0 -1
- package/dist/cli/commands/health.d.ts.map +0 -1
- package/dist/cli/commands/health.js.map +0 -1
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.js.map +0 -1
- package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
- package/dist/cli/commands/migrate-chunks.js.map +0 -1
- package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
- package/dist/cli/commands/migrate-file-refs.js.map +0 -1
- package/dist/cli/commands/proficiency.d.ts.map +0 -1
- package/dist/cli/commands/proficiency.js.map +0 -1
- package/dist/cli/commands/rm.d.ts.map +0 -1
- package/dist/cli/commands/rm.js.map +0 -1
- package/dist/cli/commands/search.d.ts.map +0 -1
- package/dist/cli/commands/search.js.map +0 -1
- package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
- package/dist/cli/commands/setup-wizard.js.map +0 -1
- package/dist/cli/commands/setup.d.ts.map +0 -1
- package/dist/cli/commands/setup.js.map +0 -1
- package/dist/cli/commands/skill.d.ts.map +0 -1
- package/dist/cli/commands/skill.js.map +0 -1
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/cli/commands/team.d.ts.map +0 -1
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/manager.js.map +0 -1
- package/dist/db/database.d.ts.map +0 -1
- package/dist/db/database.js.map +0 -1
- package/dist/embedding/e5-provider.d.ts.map +0 -1
- package/dist/embedding/e5-provider.js.map +0 -1
- package/dist/embedding/index.d.ts.map +0 -1
- package/dist/embedding/index.js.map +0 -1
- package/dist/embedding/local-provider.d.ts.map +0 -1
- package/dist/embedding/local-provider.js.map +0 -1
- package/dist/embedding/openai-provider.d.ts.map +0 -1
- package/dist/embedding/openai-provider.js.map +0 -1
- package/dist/embedding/quantization.d.ts.map +0 -1
- package/dist/embedding/quantization.js.map +0 -1
- package/dist/extraction/dedup-manager.d.ts.map +0 -1
- package/dist/extraction/dedup-manager.js.map +0 -1
- package/dist/extraction/emotion-filter.d.ts.map +0 -1
- package/dist/extraction/emotion-filter.js.map +0 -1
- package/dist/extraction/extractor.d.ts.map +0 -1
- package/dist/extraction/extractor.js.map +0 -1
- package/dist/extraction/file-reference.d.ts.map +0 -1
- package/dist/extraction/file-reference.js.map +0 -1
- package/dist/extraction/filter.d.ts.map +0 -1
- package/dist/extraction/filter.js.map +0 -1
- package/dist/extraction/scorer.d.ts.map +0 -1
- package/dist/extraction/scorer.js.map +0 -1
- package/dist/extraction/similarity.d.ts.map +0 -1
- package/dist/extraction/similarity.js.map +0 -1
- package/dist/hooks/client-factory.d.ts.map +0 -1
- package/dist/hooks/client-factory.js.map +0 -1
- package/dist/hooks/post-tool-use.d.ts.map +0 -1
- package/dist/hooks/post-tool-use.js.map +0 -1
- package/dist/hooks/pre-compact.d.ts.map +0 -1
- package/dist/hooks/pre-compact.js.map +0 -1
- package/dist/hooks/session-end.d.ts.map +0 -1
- package/dist/hooks/session-end.js.map +0 -1
- package/dist/hooks/session-start.d.ts.map +0 -1
- package/dist/hooks/session-start.js.map +0 -1
- package/dist/hooks/shared.d.ts.map +0 -1
- package/dist/hooks/shared.js.map +0 -1
- package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
- package/dist/hooks/user-prompt-submit.js.map +0 -1
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/index.js.map +0 -1
- package/dist/i18n/messages.d.ts.map +0 -1
- package/dist/i18n/messages.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
- package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
- package/dist/lifecycle/cleanup.d.ts.map +0 -1
- package/dist/lifecycle/cleanup.js.map +0 -1
- package/dist/lifecycle/index.d.ts.map +0 -1
- package/dist/lifecycle/index.js.map +0 -1
- package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
- package/dist/lifecycle/quality-scorer.js.map +0 -1
- package/dist/lifecycle/tiering.d.ts.map +0 -1
- package/dist/lifecycle/tiering.js.map +0 -1
- package/dist/llm/client.d.ts.map +0 -1
- package/dist/llm/client.js.map +0 -1
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/index.js.map +0 -1
- package/dist/proficiency/actr-engine.d.ts.map +0 -1
- package/dist/proficiency/actr-engine.js.map +0 -1
- package/dist/proficiency/detection.d.ts.map +0 -1
- package/dist/proficiency/detection.js.map +0 -1
- package/dist/proficiency/index.d.ts.map +0 -1
- package/dist/proficiency/index.js.map +0 -1
- package/dist/proficiency/tracker.d.ts.map +0 -1
- package/dist/proficiency/tracker.js.map +0 -1
- package/dist/proficiency/types.d.ts.map +0 -1
- package/dist/proficiency/types.js.map +0 -1
- package/dist/providers/adapters.d.ts.map +0 -1
- package/dist/providers/adapters.js.map +0 -1
- package/dist/providers/detector.d.ts.map +0 -1
- package/dist/providers/detector.js.map +0 -1
- package/dist/search/adaptive-router.d.ts.map +0 -1
- package/dist/search/adaptive-router.js.map +0 -1
- package/dist/search/index.d.ts.map +0 -1
- package/dist/search/index.js.map +0 -1
- package/dist/search/ranker.d.ts.map +0 -1
- package/dist/search/ranker.js.map +0 -1
- package/dist/search/reranker.d.ts.map +0 -1
- package/dist/search/reranker.js.map +0 -1
- package/dist/session/parser.d.ts.map +0 -1
- package/dist/session/parser.js.map +0 -1
- package/dist/skill/evaluator.d.ts.map +0 -1
- package/dist/skill/evaluator.js.map +0 -1
- package/dist/skill/index.d.ts.map +0 -1
- package/dist/skill/index.js.map +0 -1
- package/dist/skill/types.d.ts.map +0 -1
- package/dist/skill/types.js.map +0 -1
- package/dist/sync/client.d.ts.map +0 -1
- package/dist/sync/client.js.map +0 -1
- package/dist/sync/encryption.d.ts.map +0 -1
- package/dist/sync/encryption.js.map +0 -1
- package/dist/sync/index.d.ts.map +0 -1
- package/dist/sync/index.js.map +0 -1
- package/dist/sync/queue.d.ts.map +0 -1
- package/dist/sync/queue.js.map +0 -1
- package/dist/sync/scheduler.d.ts.map +0 -1
- package/dist/sync/scheduler.js.map +0 -1
- package/dist/sync/synchronizer.d.ts.map +0 -1
- package/dist/sync/synchronizer.js.map +0 -1
- package/dist/sync/team-synchronizer.d.ts.map +0 -1
- package/dist/sync/team-synchronizer.js.map +0 -1
- package/dist/sync/vector-clock.d.ts.map +0 -1
- package/dist/sync/vector-clock.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/utils/keychain.d.ts.map +0 -1
- package/dist/utils/keychain.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
package/dist/skill/evaluator.js
CHANGED
|
@@ -1,509 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill Evaluator
|
|
3
|
-
*
|
|
4
|
-
* ACT-R Knowledge Compilation 이론 기반으로, 반복적으로 사용되는 메모리 패턴을
|
|
5
|
-
* 자동으로 스킬(절차적 지식)로 결정화하는 엔진.
|
|
6
|
-
*
|
|
7
|
-
* 파이프라인:
|
|
8
|
-
* 1. 대상 메모리 수집 (임베딩 있는 메모리)
|
|
9
|
-
* 2. Greedy Agglomerative 클러스터링
|
|
10
|
-
* 3. 5조건 AND 평가
|
|
11
|
-
* 4. LLM 검증 (옵션)
|
|
12
|
-
* 5. N:1 압축하여 skill 메모리 생성
|
|
13
|
-
*/
|
|
14
|
-
import { randomUUID } from 'node:crypto';
|
|
15
|
-
import { cosineSimilarity } from '../extraction/similarity.js';
|
|
16
|
-
export class SkillEvaluator {
|
|
17
|
-
db;
|
|
18
|
-
config;
|
|
19
|
-
constructor(db, config) {
|
|
20
|
-
this.db = db;
|
|
21
|
-
this.config = config;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* 메인 평가 파이프라인
|
|
25
|
-
*/
|
|
26
|
-
async evaluate(projectPath, client) {
|
|
27
|
-
const skillConfig = this.config.skillConversion;
|
|
28
|
-
if (!skillConfig?.enabled) {
|
|
29
|
-
return { candidates: [], created: 0, skipped: 0, errors: [] };
|
|
30
|
-
}
|
|
31
|
-
const errors = [];
|
|
32
|
-
const candidates = [];
|
|
33
|
-
let created = 0;
|
|
34
|
-
let skipped = 0;
|
|
35
|
-
try {
|
|
36
|
-
// 1. 대상 메모리 수집 (skill 카테고리 제외, 임베딩 있는 것만)
|
|
37
|
-
// limit 500: O(N²) 클러스터링이 Hook에서 실행되므로 성능 제한
|
|
38
|
-
const allMemories = this.db.listMemories({
|
|
39
|
-
limit: 500,
|
|
40
|
-
projectPath,
|
|
41
|
-
});
|
|
42
|
-
const targetMemories = allMemories.filter((m) => m.category !== 'skill' && m.embedding && m.embedding.length > 0);
|
|
43
|
-
if (targetMemories.length < skillConfig.minRepetitions) {
|
|
44
|
-
return { candidates, created, skipped: targetMemories.length, errors };
|
|
45
|
-
}
|
|
46
|
-
// 2. 클러스터링 (O(N²) 알고리즘이므로 입력 크기를 제한)
|
|
47
|
-
// 적응형 윈도우: 최근 70% + 전체 랜덤 30% — 오래된 패턴도 반영
|
|
48
|
-
const MAX_CLUSTER_INPUT = 300;
|
|
49
|
-
let clusterInput;
|
|
50
|
-
if (targetMemories.length > MAX_CLUSTER_INPUT) {
|
|
51
|
-
const sorted = [...targetMemories].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
52
|
-
const recentCount = Math.floor(MAX_CLUSTER_INPUT * 0.7);
|
|
53
|
-
const randomCount = MAX_CLUSTER_INPUT - recentCount;
|
|
54
|
-
const recent = sorted.slice(0, recentCount);
|
|
55
|
-
const recentIds = new Set(recent.map((m) => m.id));
|
|
56
|
-
const remaining = sorted.slice(recentCount).filter((m) => !recentIds.has(m.id));
|
|
57
|
-
const randomSample = [];
|
|
58
|
-
for (let i = remaining.length - 1; i > 0 && randomSample.length < randomCount; i--) {
|
|
59
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
60
|
-
[remaining[i], remaining[j]] = [remaining[j], remaining[i]];
|
|
61
|
-
randomSample.push(remaining[i]);
|
|
62
|
-
}
|
|
63
|
-
clusterInput = [...recent, ...randomSample];
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
clusterInput = targetMemories;
|
|
67
|
-
}
|
|
68
|
-
const clusters = this.clusterMemories(clusterInput, skillConfig.similarityThreshold);
|
|
69
|
-
// 3. 현재 스킬 수 확인
|
|
70
|
-
const currentSkills = allMemories.filter((m) => m.category === 'skill');
|
|
71
|
-
let availableSlots = skillConfig.maxSkills - currentSkills.length;
|
|
72
|
-
// 4. 각 클러스터 평가
|
|
73
|
-
for (const cluster of clusters) {
|
|
74
|
-
if (availableSlots <= 0)
|
|
75
|
-
break;
|
|
76
|
-
const candidate = this.evaluateCluster(cluster, skillConfig.minRepetitions, skillConfig.minConfidence);
|
|
77
|
-
if (!candidate) {
|
|
78
|
-
skipped += cluster.length;
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
// 중복 스킬 확인: 이미 동일한 sourceMemoryIds로 만들어진 스킬이 있는지
|
|
82
|
-
const isDuplicate = this.isDuplicateSkill(candidate, currentSkills);
|
|
83
|
-
if (isDuplicate) {
|
|
84
|
-
skipped += cluster.length;
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
candidates.push(candidate);
|
|
88
|
-
// 5. LLM 검증 (옵션)
|
|
89
|
-
if (skillConfig.llmValidation && this.config.llm?.enabled) {
|
|
90
|
-
try {
|
|
91
|
-
const valid = await this.validateWithLLM(candidate);
|
|
92
|
-
if (!valid) {
|
|
93
|
-
skipped += cluster.length;
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
catch (llmErr) {
|
|
98
|
-
// LLM 실패 시 규칙 기반만으로 진행
|
|
99
|
-
errors.push(`LLM validation failed: ${llmErr instanceof Error ? llmErr.message : String(llmErr)}`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// 6. 스킬 메모리 생성
|
|
103
|
-
try {
|
|
104
|
-
await this.compressToSkill(candidate, client);
|
|
105
|
-
created++;
|
|
106
|
-
availableSlots--;
|
|
107
|
-
}
|
|
108
|
-
catch (createErr) {
|
|
109
|
-
errors.push(`Skill creation failed: ${createErr instanceof Error ? createErr.message : String(createErr)}`);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
catch (err) {
|
|
114
|
-
errors.push(`Evaluation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
115
|
-
}
|
|
116
|
-
return { candidates, created, skipped, errors };
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Greedy Agglomerative 클러스터링
|
|
120
|
-
* 코사인 유사도 ≥ threshold인 메모리들을 같은 클러스터로 그룹화
|
|
121
|
-
*/
|
|
122
|
-
clusterMemories(memories, threshold) {
|
|
123
|
-
const assigned = new Set();
|
|
124
|
-
const clusters = [];
|
|
125
|
-
for (const memory of memories) {
|
|
126
|
-
if (assigned.has(memory.id))
|
|
127
|
-
continue;
|
|
128
|
-
if (!memory.embedding)
|
|
129
|
-
continue;
|
|
130
|
-
const cluster = [memory];
|
|
131
|
-
assigned.add(memory.id);
|
|
132
|
-
for (const other of memories) {
|
|
133
|
-
if (assigned.has(other.id))
|
|
134
|
-
continue;
|
|
135
|
-
if (!other.embedding)
|
|
136
|
-
continue;
|
|
137
|
-
const similarity = cosineSimilarity(memory.embedding, other.embedding);
|
|
138
|
-
if (similarity >= threshold) {
|
|
139
|
-
cluster.push(other);
|
|
140
|
-
assigned.add(other.id);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
clusters.push(cluster);
|
|
144
|
-
}
|
|
145
|
-
return clusters;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* 3-AND + 2-Optional 평가 (기존 5-AND에서 완화)
|
|
149
|
-
* 필수(AND): 1. 반복 횟수, 2. 평균 유사도(0.75), 3. 기본 신뢰도(0.5)
|
|
150
|
-
* 보너스(Optional): 4. 다중 세션(×1.2), 5. 일관된 카테고리(×1.1)
|
|
151
|
-
*/
|
|
152
|
-
evaluateCluster(cluster, minRepetitions, _minConfidence) {
|
|
153
|
-
const effectiveMinConfidence = 0.5; // 완화된 최소 신뢰도 — 과도한 필터링 방지, 실험적으로 결정
|
|
154
|
-
// 필수 조건 1: 최소 반복 횟수
|
|
155
|
-
if (cluster.length < minRepetitions)
|
|
156
|
-
return null;
|
|
157
|
-
// 필수 조건 2: 평균 코사인 유사도 임계값 0.75
|
|
158
|
-
// 근거: 0.85는 오탐 감소이나 recall 급락, 0.65는 노이즈 급증 — 0.75가 F1 최대화 지점 (실험치)
|
|
159
|
-
const avgSimilarity = this.computeAverageSimilarity(cluster);
|
|
160
|
-
if (avgSimilarity < 0.75)
|
|
161
|
-
return null;
|
|
162
|
-
// 필수 조건 3: 기본 신뢰도 계산
|
|
163
|
-
let confidence = avgSimilarity;
|
|
164
|
-
// Optional 조건 4: 다중 세션 출현 (보너스 ×1.2)
|
|
165
|
-
// 근거: 단일 세션 집중 패턴은 일시적 작업일 가능성 높음 — 복수 세션 재현성이 스킬 증거
|
|
166
|
-
const sessionIds = new Set(cluster.map((m) => m.sessionId).filter(Boolean));
|
|
167
|
-
if (sessionIds.size >= 2) {
|
|
168
|
-
confidence *= 1.2;
|
|
169
|
-
}
|
|
170
|
-
// Optional 조건 5: 일관된 카테고리 (보너스 ×1.1)
|
|
171
|
-
// 근거: 동일 카테고리 집중은 전문화 신호 — 카테고리 혼합 클러스터보다 스킬화 가치 높음
|
|
172
|
-
const categoryCounts = new Map();
|
|
173
|
-
for (const m of cluster) {
|
|
174
|
-
categoryCounts.set(m.category, (categoryCounts.get(m.category) ?? 0) + 1);
|
|
175
|
-
}
|
|
176
|
-
let majorityCategory = cluster[0].category;
|
|
177
|
-
let maxCount = 0;
|
|
178
|
-
for (const [cat, count] of categoryCounts) {
|
|
179
|
-
if (count > maxCount) {
|
|
180
|
-
maxCount = count;
|
|
181
|
-
majorityCategory = cat;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
if (maxCount / cluster.length >= 0.5) {
|
|
185
|
-
confidence *= 1.1;
|
|
186
|
-
}
|
|
187
|
-
// 최종 신뢰도 체크 (cap at 1.0)
|
|
188
|
-
confidence = Math.min(confidence, 1.0);
|
|
189
|
-
if (confidence < effectiveMinConfidence)
|
|
190
|
-
return null;
|
|
191
|
-
// 패턴 요약: centroid에 가장 가까운 content를 대표로 선택
|
|
192
|
-
let pattern;
|
|
193
|
-
const embeddedMemories = cluster.filter(m => m.embedding && m.embedding.length > 0);
|
|
194
|
-
if (embeddedMemories.length >= 2) {
|
|
195
|
-
// 평균 임베딩(centroid) 계산
|
|
196
|
-
const dim = embeddedMemories[0].embedding.length;
|
|
197
|
-
const centroid = new Array(dim).fill(0);
|
|
198
|
-
for (const m of embeddedMemories) {
|
|
199
|
-
for (let i = 0; i < dim; i++) {
|
|
200
|
-
centroid[i] += m.embedding[i] / embeddedMemories.length;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// centroid에 가장 가까운 메모리 선택
|
|
204
|
-
let bestIdx = 0;
|
|
205
|
-
let bestSim = -1;
|
|
206
|
-
for (let i = 0; i < embeddedMemories.length; i++) {
|
|
207
|
-
const sim = cosineSimilarity(centroid, embeddedMemories[i].embedding);
|
|
208
|
-
if (sim > bestSim) {
|
|
209
|
-
bestSim = sim;
|
|
210
|
-
bestIdx = i;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
pattern = embeddedMemories[bestIdx].content.slice(0, 500);
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
// 임베딩 없거나 1개뿐이면 가장 긴 content 선택 (정보 최대 보존)
|
|
217
|
-
const sorted = [...cluster].sort((a, b) => b.content.length - a.content.length);
|
|
218
|
-
pattern = sorted[0].content.slice(0, 500);
|
|
219
|
-
}
|
|
220
|
-
// 태그 통합 (빈도 ≥ 2인 태그만)
|
|
221
|
-
const tagCounts = new Map();
|
|
222
|
-
for (const m of cluster) {
|
|
223
|
-
for (const tag of m.tags) {
|
|
224
|
-
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
const tags = Array.from(tagCounts.entries())
|
|
228
|
-
.filter(([, count]) => count >= 2)
|
|
229
|
-
.map(([tag]) => tag);
|
|
230
|
-
return {
|
|
231
|
-
clusterId: randomUUID(),
|
|
232
|
-
sourceMemories: cluster,
|
|
233
|
-
category: majorityCategory,
|
|
234
|
-
confidence,
|
|
235
|
-
pattern,
|
|
236
|
-
tags: [...tags, 'skill', 'crystallized'],
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* LLM으로 스킬 유효성 검증
|
|
241
|
-
*/
|
|
242
|
-
async validateWithLLM(candidate) {
|
|
243
|
-
try {
|
|
244
|
-
const { createLLMClient } = await import('../llm/index.js');
|
|
245
|
-
const client = createLLMClient(this.config.llm);
|
|
246
|
-
const prompt = [
|
|
247
|
-
'Determine if these similar memories represent a reusable skill/pattern.',
|
|
248
|
-
'Respond with JSON: {"valid": true/false, "confidence": 0.0-1.0}',
|
|
249
|
-
'',
|
|
250
|
-
`Category: ${candidate.category}`,
|
|
251
|
-
`Pattern: ${candidate.pattern}`,
|
|
252
|
-
`Source count: ${candidate.sourceMemories.length}`,
|
|
253
|
-
'',
|
|
254
|
-
'Sample memories:',
|
|
255
|
-
...candidate.sourceMemories.slice(0, 3).map((m, i) => `${i + 1}. ${m.content.slice(0, 200)}`),
|
|
256
|
-
].join('\n');
|
|
257
|
-
const result = await client.complete(prompt);
|
|
258
|
-
const parsed = JSON.parse(result);
|
|
259
|
-
return parsed.valid === true && (parsed.confidence ?? 0) >= (this.config.skillConversion?.minConfidence ?? 0.7);
|
|
260
|
-
}
|
|
261
|
-
catch (error) {
|
|
262
|
-
// LLM 검증 실패 시 안전 측으로 (결정화 보류)
|
|
263
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
264
|
-
if (msg.includes('timeout') || msg.includes('ECONNREFUSED') || msg.includes('fetch failed')) {
|
|
265
|
-
// 네트워크 오류: 결정화 보류 (다음 세션에 재시도)
|
|
266
|
-
return false;
|
|
267
|
-
}
|
|
268
|
-
// 파싱/검증 오류: 결정화 거부
|
|
269
|
-
return false;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* N:1 압축하여 skill 메모리 생성
|
|
274
|
-
*/
|
|
275
|
-
async compressToSkill(candidate, client) {
|
|
276
|
-
const now = new Date().toISOString();
|
|
277
|
-
const reviewDueAt = new Date(Date.now() + (this.config.skillConversion?.reviewCycleDays ?? 90) * 24 * 60 * 60 * 1000).toISOString();
|
|
278
|
-
// 압축된 content 생성
|
|
279
|
-
const content = this.buildSkillContent(candidate);
|
|
280
|
-
// Taxonomy 분류 (서버 연결 시 선택적)
|
|
281
|
-
let taxonomyResult = null;
|
|
282
|
-
if (client) {
|
|
283
|
-
try {
|
|
284
|
-
taxonomyResult = await client.classifyContent({
|
|
285
|
-
content: candidate.pattern,
|
|
286
|
-
tags: candidate.tags.filter(t => !t.startsWith('meta:') && t !== 'skill' && t !== 'crystallized'),
|
|
287
|
-
category: candidate.category,
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
catch {
|
|
291
|
-
// Taxonomy 분류 실패해도 스킬 생성은 계속
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
// 메타데이터를 tags에 인코딩 (JSON tag)
|
|
295
|
-
const metadata = {
|
|
296
|
-
sourceMemoryIds: candidate.sourceMemories.map((m) => m.id),
|
|
297
|
-
crystallizedAt: now,
|
|
298
|
-
confidence: candidate.confidence,
|
|
299
|
-
reviewDueAt,
|
|
300
|
-
activationCount: 0,
|
|
301
|
-
// Taxonomy fields (available when server provides classification)
|
|
302
|
-
...(taxonomyResult && {
|
|
303
|
-
taxonomyDomain: taxonomyResult.domain,
|
|
304
|
-
taxonomySkillId: taxonomyResult.skill_id ?? undefined,
|
|
305
|
-
taxonomyNature: taxonomyResult.nature ?? undefined,
|
|
306
|
-
taxonomyStability: taxonomyResult.stability ?? undefined,
|
|
307
|
-
taxonomyConfidence: taxonomyResult.confidence,
|
|
308
|
-
}),
|
|
309
|
-
};
|
|
310
|
-
const metadataTag = `meta:${Buffer.from(JSON.stringify(metadata)).toString('base64')}`;
|
|
311
|
-
// Taxonomy 태그 추가 (있는 경우)
|
|
312
|
-
const taxonomyTags = [];
|
|
313
|
-
if (taxonomyResult) {
|
|
314
|
-
taxonomyTags.push(`taxonomy:${taxonomyResult.domain}`);
|
|
315
|
-
if (taxonomyResult.skill_id) {
|
|
316
|
-
taxonomyTags.push(`taxonomy:${taxonomyResult.skill_id}`);
|
|
317
|
-
}
|
|
318
|
-
if (taxonomyResult.nature) {
|
|
319
|
-
taxonomyTags.push(`nature:${taxonomyResult.nature}`);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
const memory = this.db.createMemory({
|
|
323
|
-
content,
|
|
324
|
-
category: 'skill',
|
|
325
|
-
tier: 'semantic',
|
|
326
|
-
tags: [...candidate.tags, ...taxonomyTags, metadataTag],
|
|
327
|
-
projectPath: candidate.sourceMemories[0]?.projectPath,
|
|
328
|
-
});
|
|
329
|
-
// 소스 메모리의 임베딩 평균을 스킬 임베딩으로 사용
|
|
330
|
-
const embeddings = candidate.sourceMemories
|
|
331
|
-
.map((m) => m.embedding)
|
|
332
|
-
.filter((e) => !!e && e.length > 0);
|
|
333
|
-
if (embeddings.length > 0) {
|
|
334
|
-
const avgEmbedding = this.averageEmbeddings(embeddings);
|
|
335
|
-
this.db.saveEmbedding(memory.id, avgEmbedding);
|
|
336
|
-
}
|
|
337
|
-
return memory;
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* 90일 주기 재평가: 비활성 스킬 강등
|
|
341
|
-
*/
|
|
342
|
-
reviewSkills() {
|
|
343
|
-
const now = new Date();
|
|
344
|
-
let reviewed = 0;
|
|
345
|
-
let demoted = 0;
|
|
346
|
-
let renewed = 0;
|
|
347
|
-
const skillMemories = this.db.listMemories({ category: 'skill', limit: 1000 });
|
|
348
|
-
for (const skill of skillMemories) {
|
|
349
|
-
reviewed++;
|
|
350
|
-
const metadata = this.extractMetadata(skill);
|
|
351
|
-
if (!metadata)
|
|
352
|
-
continue;
|
|
353
|
-
const reviewDue = new Date(metadata.reviewDueAt);
|
|
354
|
-
if (now < reviewDue)
|
|
355
|
-
continue;
|
|
356
|
-
// 활성도 확인: accessCount가 낮으면 강등
|
|
357
|
-
if (skill.accessCount < 2) {
|
|
358
|
-
// 강등: skill → 원래 카테고리의 learning으로 전환
|
|
359
|
-
this.db.updateMemory(skill.id, {
|
|
360
|
-
category: 'learning',
|
|
361
|
-
tags: skill.tags.filter((t) => !t.startsWith('meta:') && t !== 'skill' && t !== 'crystallized'),
|
|
362
|
-
});
|
|
363
|
-
demoted++;
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
// 갱신: reviewDueAt 연장
|
|
367
|
-
const newReviewDueAt = new Date(Date.now() + (this.config.skillConversion?.reviewCycleDays ?? 90) * 24 * 60 * 60 * 1000).toISOString();
|
|
368
|
-
const newMetadata = {
|
|
369
|
-
...metadata,
|
|
370
|
-
reviewDueAt: newReviewDueAt,
|
|
371
|
-
activationCount: skill.accessCount,
|
|
372
|
-
lastActivatedAt: skill.lastAccessedAt,
|
|
373
|
-
};
|
|
374
|
-
const newMetaTag = `meta:${Buffer.from(JSON.stringify(newMetadata)).toString('base64')}`;
|
|
375
|
-
const updatedTags = skill.tags.filter((t) => !t.startsWith('meta:'));
|
|
376
|
-
updatedTags.push(newMetaTag);
|
|
377
|
-
this.db.updateMemory(skill.id, { tags: updatedTags });
|
|
378
|
-
renewed++;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
return { reviewed, demoted, renewed };
|
|
382
|
-
}
|
|
383
|
-
// ============================
|
|
384
|
-
// Private helpers
|
|
385
|
-
// ============================
|
|
386
|
-
computeAverageSimilarity(cluster) {
|
|
387
|
-
if (cluster.length < 2)
|
|
388
|
-
return 1.0;
|
|
389
|
-
let totalSim = 0;
|
|
390
|
-
let pairs = 0;
|
|
391
|
-
for (let i = 0; i < cluster.length; i++) {
|
|
392
|
-
for (let j = i + 1; j < cluster.length; j++) {
|
|
393
|
-
if (cluster[i].embedding && cluster[j].embedding) {
|
|
394
|
-
totalSim += cosineSimilarity(cluster[i].embedding, cluster[j].embedding);
|
|
395
|
-
pairs++;
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
return pairs > 0 ? totalSim / pairs : 0;
|
|
400
|
-
}
|
|
401
|
-
isDuplicateSkill(candidate, existingSkills) {
|
|
402
|
-
const sourceIds = new Set(candidate.sourceMemories.map((m) => m.id));
|
|
403
|
-
for (const skill of existingSkills) {
|
|
404
|
-
const metadata = this.extractMetadata(skill);
|
|
405
|
-
if (!metadata)
|
|
406
|
-
continue;
|
|
407
|
-
const existingIds = new Set(metadata.sourceMemoryIds);
|
|
408
|
-
const overlap = [...sourceIds].filter((id) => existingIds.has(id)).length;
|
|
409
|
-
const overlapRatio = overlap / Math.max(sourceIds.size, existingIds.size);
|
|
410
|
-
// 70% 이상 중복이면 동일 스킬로 간주
|
|
411
|
-
if (overlapRatio >= 0.7)
|
|
412
|
-
return true;
|
|
413
|
-
}
|
|
414
|
-
return false;
|
|
415
|
-
}
|
|
416
|
-
buildSkillContent(candidate) {
|
|
417
|
-
const lines = [];
|
|
418
|
-
lines.push(`[Skill] ${candidate.pattern}`);
|
|
419
|
-
lines.push('');
|
|
420
|
-
lines.push(`Category: ${candidate.category}`);
|
|
421
|
-
lines.push(`Sources: ${candidate.sourceMemories.length} memories`);
|
|
422
|
-
lines.push(`Confidence: ${(candidate.confidence * 100).toFixed(0)}%`);
|
|
423
|
-
if (candidate.sourceMemories.length > 1) {
|
|
424
|
-
lines.push('');
|
|
425
|
-
lines.push('Key patterns:');
|
|
426
|
-
// 상위 3개 소스의 핵심 내용
|
|
427
|
-
for (const m of candidate.sourceMemories.slice(0, 3)) {
|
|
428
|
-
const summary = m.content.split('\n')[0].slice(0, 150);
|
|
429
|
-
lines.push(`- ${summary}`);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
return lines.join('\n');
|
|
433
|
-
}
|
|
434
|
-
extractMetadata(skill) {
|
|
435
|
-
const metaTag = skill.tags.find((t) => t.startsWith('meta:'));
|
|
436
|
-
if (!metaTag)
|
|
437
|
-
return null;
|
|
438
|
-
try {
|
|
439
|
-
const json = Buffer.from(metaTag.slice(5), 'base64').toString('utf-8');
|
|
440
|
-
return JSON.parse(json);
|
|
441
|
-
}
|
|
442
|
-
catch {
|
|
443
|
-
return null;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
averageEmbeddings(embeddings) {
|
|
447
|
-
if (embeddings.length === 0)
|
|
448
|
-
return [];
|
|
449
|
-
const dim = embeddings[0].length;
|
|
450
|
-
const avg = new Array(dim).fill(0);
|
|
451
|
-
for (const emb of embeddings) {
|
|
452
|
-
for (let i = 0; i < dim; i++) {
|
|
453
|
-
avg[i] += emb[i];
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
for (let i = 0; i < dim; i++) {
|
|
457
|
-
avg[i] /= embeddings.length;
|
|
458
|
-
}
|
|
459
|
-
return avg;
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* 스킬 자동 갱신: 새 메모리가 기존 스킬과 유사하면 소스에 추가
|
|
463
|
-
*
|
|
464
|
-
* PostToolUse에서 새 메모리 생성 후 호출.
|
|
465
|
-
* 유사도 > 0.8인 스킬이 있으면 sourceMemoryIds에 추가하고 content 재생성.
|
|
466
|
-
*/
|
|
467
|
-
absorbIntoSkill(newMemory) {
|
|
468
|
-
if (!newMemory.embedding || newMemory.category === 'skill') {
|
|
469
|
-
return { absorbed: false };
|
|
470
|
-
}
|
|
471
|
-
const skills = this.db.listMemories({ limit: 200 }).filter(m => m.category === 'skill');
|
|
472
|
-
for (const skill of skills) {
|
|
473
|
-
if (!skill.embedding)
|
|
474
|
-
continue;
|
|
475
|
-
const similarity = cosineSimilarity(newMemory.embedding, skill.embedding);
|
|
476
|
-
if (similarity < 0.8)
|
|
477
|
-
continue;
|
|
478
|
-
// 유사한 스킬 발견 — 소스에 추가
|
|
479
|
-
const metadata = this.extractMetadata(skill);
|
|
480
|
-
if (!metadata)
|
|
481
|
-
continue;
|
|
482
|
-
// 이미 소스에 포함되어 있으면 스킵
|
|
483
|
-
if (metadata.sourceMemoryIds.includes(newMemory.id)) {
|
|
484
|
-
return { absorbed: false };
|
|
485
|
-
}
|
|
486
|
-
// sourceMemoryIds에 추가
|
|
487
|
-
metadata.sourceMemoryIds.push(newMemory.id);
|
|
488
|
-
metadata.activationCount = (metadata.activationCount || 0) + 1;
|
|
489
|
-
metadata.lastActivatedAt = new Date().toISOString();
|
|
490
|
-
// 메타데이터 태그 재생성
|
|
491
|
-
const metaTag = `meta:${Buffer.from(JSON.stringify(metadata)).toString('base64')}`;
|
|
492
|
-
const otherTags = skill.tags.filter(t => !t.startsWith('meta:'));
|
|
493
|
-
// 스킬 content에 새 메모리 요약 추가 (최대 5개 패턴)
|
|
494
|
-
const newLine = `- ${newMemory.content.split('\n')[0].slice(0, 150)}`;
|
|
495
|
-
let updatedContent = skill.content;
|
|
496
|
-
const patternLines = updatedContent.split('\n').filter(l => l.startsWith('- '));
|
|
497
|
-
if (patternLines.length < 5) {
|
|
498
|
-
updatedContent = updatedContent.trimEnd() + '\n' + newLine;
|
|
499
|
-
}
|
|
500
|
-
this.db.updateMemory(skill.id, {
|
|
501
|
-
content: updatedContent,
|
|
502
|
-
tags: [...otherTags, metaTag],
|
|
503
|
-
});
|
|
504
|
-
return { absorbed: true, skillId: skill.id };
|
|
505
|
-
}
|
|
506
|
-
return { absorbed: false };
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
//# sourceMappingURL=evaluator.js.map
|
|
1
|
+
(function(_0x482a7c,_0x2b595e){function _0x27dced(_0x3e5780,_0x4795d7){return _0x2e92(_0x3e5780-0x1bb,_0x4795d7);}function _0x403ff3(_0x8c09e8,_0x2af2f6){return _0x2e92(_0x2af2f6-0x33,_0x8c09e8);}const _0x28914a=_0x482a7c();while(!![]){try{const _0x59ddca=-parseInt(_0x27dced(0x370,0x3cd))/0x1+-parseInt(_0x27dced(0x2d0,0x2f2))/0x2+parseInt(_0x27dced(0x37a,0x3ce))/0x3+-parseInt(_0x403ff3(0x175,0x14d))/0x4+-parseInt(_0x27dced(0x311,0x339))/0x5+-parseInt(_0x403ff3(0x19a,0x196))/0x6+parseInt(_0x403ff3(0x142,0x18b))/0x7;if(_0x59ddca===_0x2b595e)break;else _0x28914a['push'](_0x28914a['shift']());}catch(_0xef74e1){_0x28914a['push'](_0x28914a['shift']());}}}(_0x16b9,0x658be));function _0x16b9(){const _0x3a10f2=['CM5Sq0i','q3LkD1m','tfnuyNa','vgjICfC','BgWVCgf0DgvYBG','C2TPBgXFAwq','BgvHCM5PBMC','zdOG','rxzHBhvHDgLVBG','DvjpsKO','DMfSAwq','BNm6','wLf6v0G','se9eAeK','ig1LBw9YAwvZ','C2L6zq','DvHkzhi','DxrMltG','DvnHqKm','C2TPBgXdB252zq','CgfYC2u','zw9Tshi','EvjWsuq','y2f0zwDVCNK','BMf0DxjLoG','zMXVB3i','Bwf4','C3rYAw5NAwz5','BgXTvMfSAwrHDa','BMf0DxjL','zxzHBhvHDgvdBa','w1nRAwXSxsa','senduNK','CMv2Awv3u2TPBa','D1vZwvu','DMfSAwrHDgvxAq','zMLUza','zvnRAwXS','Aw1PBgfYig1LBq','DLrIzNy','ywn0AxzHDgLVBG','mJaWotmXmhfpq3PetG','runptK5sruzvuW','otKZmJa5n0fHDgP0ta','CNnPB24','z21Awhu','q291BNq','D3z5Ag4','BgfZDefJDgL2yq','y2XeAey','AwyGDgHLC2uGCW','vu5oCLm','DgToueG','C3rHCNrZv2L0Aa','odi4nZGWuM5Swhrv','uwvvCNi','yxPRyNO','ChvZAa','tMPqAeK','zw1IzwrKAw5N','r2XtEuK','Aw9UCW','AMvwAwS','q0P0quu','B2rIDfe','ENHTwNu','DgvKqxq','y1LYy1C','zwrKAw5NCW','BwLU','CMv2Awv3q3LJBa','yxj4q0K','DgGGsLnptJOGEW','EfD6uK8','u2TPBgW','zg9TywLU','s0XssgS','zMLSBa','Cgf0DgvYBG','thHVuNG','DgLTzw91Da','uNzlvNu','Aw5N','Aw9U','BwvZC2fNzq','Bwv0ytO','ywrK','y29UzMLN','BgPNBhu','t2Xvu1q','y3jLyxrLtwvTBW','Dgf4B25VBxK6','BgfZDefJy2vZCW','BM9Nu3a','icjJB25MAwrLBG','CNvLl2zHBhnLla','AvnJv2G','DxbKyxrLzef0','zwrbDa','C2vTyw50Awm','zurHExm','ywnJzxnZq291BG','yNjhCfq','iNzHBgLKiJOGDa','DgHmte0','y29TChjLC3nuBW','z2v0vgLTzq','ruH2Afa','y1j2zKG','CMv2Awv3rhvLqq','CMLLCW','seTOEMC','Afnwswq','y2XHC3nPzNLdBW','q2f0zwDVCNK6ia','C2f2zuvTyMvKza','zxGUANm','BgLZDe1LBw9YAq','sgLKAfa','shr4DLG','C2LTAwXHCML0Eq','rengAMy','q25PvMy','z2v0','C291CMnLtwvTBW','u291CMnLCZOG','zw5HyMXLza','Dg9tDhjPBMC','u09OzNq','C2TPBgW','zw50CMLLCW','yMfZzty0','BwLUq29UzMLKzq','CMfUzg9T','Dg9gAxHLza','qxz6thq','mZa4ntyYy3fzzuz5','u2fTCgXLig1LBq','ywjZB3jIsw50BW','rKvsufO','BfDqtLq','AezgrK4','BwfW','D3D3Efy','C2XPy2u','y29TCgXLDgu','nJG2nJe2v29JsM5b','zxH0CMfJDe1LDa','zNjVBq','y2X1C3rLCK1LBq','zxzHBhvHDgu','rhHRDum','D1D0zLy','BwLUuMvWzxrPDa','C2vZC2LVBKLK','ruPRuha','Dxn0zxi','DxbKyxrLtwvTBW','ugf0DgvYBJOG','CNLjzhm','AxneDxbSAwnHDa','CK1xvfK','BNq6ia','y3j5C3rHBgXPEG','BM93','tMz6AgS','Aw5JBhvKzxm','AM9PBG','rLHKA1G','vxzWAue','B3jPzxm6','vhb3v3G','BgXT','BefmC3G','Dg9ju09tDhjPBG','zMv0y2GGzMfPBa','y29UzMLKzw5Jzq','lJb9','rgv0zxjTAw5Lia','zuvOy2i','u2TPBgWGy3jLyq','DgfNCW','CMfNzvnPBwLSyq','BgvUz3rO','zxnLBNqGysbYzq','CvvYAM4','yxzLCMfNzuvTyG','mJi4nJqWAfDIt0TR','C2v0','uvzIzw4','uMvZCg9Uzcb3Aq','B1ftuMm','mta3ntC0mfLwA01nEG','igzHAwXLzdOG','ywrHDge','AgfZ','C3bSAxq','y29UDgvUDa','yunADfK','B3jPzxm','y2uIoIaWlJaTmq','renYA04','DgLVBIbMywLSzq','lI4VBgXTl2LUza','y29TChv0zuf2zq','tvrdqu0','zMLSDgvY','BuHxCuq','AevVzg0','CffXte4','B2jgA0K'];_0x16b9=function(){return _0x3a10f2;};return _0x16b9();}function _0x4cbf0f(_0x402ad6,_0x1a041b){return _0x2e92(_0x1a041b- -0xcc,_0x402ad6);}import{randomUUID}from'node:crypto';function _0x2e92(_0x12786a,_0x4db40e){_0x12786a=_0x12786a-0x108;const _0x16b9b0=_0x16b9();let _0x2e92f1=_0x16b9b0[_0x12786a];if(_0x2e92['uOODjx']===undefined){var _0x252893=function(_0x5129a1){const _0x5bd17e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xee85e6='',_0x51f0b8='';for(let _0x10dec8=0x0,_0x2a0bed,_0x430246,_0x4ead68=0x0;_0x430246=_0x5129a1['charAt'](_0x4ead68++);~_0x430246&&(_0x2a0bed=_0x10dec8%0x4?_0x2a0bed*0x40+_0x430246:_0x430246,_0x10dec8++%0x4)?_0xee85e6+=String['fromCharCode'](0xff&_0x2a0bed>>(-0x2*_0x10dec8&0x6)):0x0){_0x430246=_0x5bd17e['indexOf'](_0x430246);}for(let _0x13aab5=0x0,_0x3b5102=_0xee85e6['length'];_0x13aab5<_0x3b5102;_0x13aab5++){_0x51f0b8+='%'+('00'+_0xee85e6['charCodeAt'](_0x13aab5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x51f0b8);};_0x2e92['mGdsLy']=_0x252893,_0x2e92['pKypIK']={},_0x2e92['uOODjx']=!![];}const _0x243314=_0x16b9b0[0x0],_0x1c413d=_0x12786a+_0x243314,_0x3e7a07=_0x2e92['pKypIK'][_0x1c413d];return!_0x3e7a07?(_0x2e92f1=_0x2e92['mGdsLy'](_0x2e92f1),_0x2e92['pKypIK'][_0x1c413d]=_0x2e92f1):_0x2e92f1=_0x3e7a07,_0x2e92f1;}import{cosineSimilarity}from'../extraction/similarity.js';function _0x272f8f(_0x3880a5,_0x20b674){return _0x2e92(_0x20b674- -0x378,_0x3880a5);}export class SkillEvaluator{['db'];[_0x4cbf0f(0x113,0xb8)];constructor(_0x4ec9b7,_0x3490f2){this['db']=_0x4ec9b7;function _0xa846ae(_0x3b6ac1,_0x1df897){return _0x4cbf0f(_0x1df897,_0x3b6ac1-0x32);}this[_0xa846ae(0xea,0x117)]=_0x3490f2;}async[_0x4cbf0f(0x153,0xf7)](_0x3d4d4b,_0x505895){function _0x36193d(_0x2e7249,_0x29459f){return _0x272f8f(_0x29459f,_0x2e7249-0x5d);}const _0x57d79f={'oCazp':_0x342c21(-0x1c3,-0x228),'ljglu':_0x342c21(-0x235,-0x203),'QVben':function(_0x4fc852,_0x15e001){return _0x4fc852>_0x15e001;},'Nfzhk':function(_0x27b589,_0x4d2153){return _0x27b589<_0x4d2153;},'CniVf':function(_0x4535a3,_0x526355){return _0x4535a3+_0x526355;},'wvyhn':function(_0x4fda74,_0x3a0459){return _0x4fda74-_0x3a0459;},'PzEkO':function(_0x46f5d5,_0x24d8c8){return _0x46f5d5!==_0x24d8c8;},'ZQzWH':function(_0x2ba64d,_0xbab14e){return _0x2ba64d instanceof _0xbab14e;},'jTUUM':function(_0xb89a10,_0x38d463){return _0xb89a10(_0x38d463);}},_0x552911=this['config'][_0x36193d(-0x1db,-0x17a)+_0x36193d(-0x1c2,-0x1bb)];function _0x342c21(_0x3c3208,_0x59277c){return _0x272f8f(_0x59277c,_0x3c3208-0x5);}if(!_0x552911?.['enabled'])return{'candidates':[],'created':0x0,'skipped':0x0,'errors':[]};const _0x55046d=[],_0x260b00=[];let _0x4882f2=0x0,_0x14aa5a=0x0;try{const _0x80f96f=this['db'][_0x342c21(-0x1d1,-0x1bb)+'es']({'limit':0x1f4,'projectPath':_0x3d4d4b}),_0x1766bd=_0x80f96f['filter'](_0x4e17b5=>_0x4e17b5[_0x36193d(-0x1d7,-0x1ad)]!=='skill'&&_0x4e17b5[_0x342c21(-0x20b,-0x255)]&&_0x4e17b5['embedding'][_0x342c21(-0x262,-0x288)]>0x0);if(_0x1766bd[_0x342c21(-0x262,-0x239)]<_0x552911[_0x36193d(-0x155,-0x122)+'ions'])return{'candidates':_0x260b00,'created':_0x4882f2,'skipped':_0x1766bd[_0x342c21(-0x262,-0x2ac)],'errors':_0x55046d};const _0x296dfd=0x12c;let _0x2b0f6c;if(_0x1766bd['length']>_0x296dfd){const _0x20888d=[..._0x1766bd]['sort']((_0xd84935,_0x36110)=>new Date(_0x36110[_0x36193d(-0x18d,-0x183)])[_0x342c21(-0x1dc,-0x1b9)]()-new Date(_0xd84935[_0x342c21(-0x1e5,-0x1b0)])[_0x342c21(-0x1dc,-0x190)]()),_0x26ce56=Math[_0x342c21(-0x22d,-0x295)](_0x296dfd*0.7),_0x4886db=_0x296dfd-_0x26ce56,_0x3be3b6=_0x20888d[_0x342c21(-0x1b6,-0x15f)](0x0,_0x26ce56),_0x527fd6=new Set(_0x3be3b6['map'](_0xe3757d=>_0xe3757d['id'])),_0x2f6318=_0x20888d['slice'](_0x26ce56)[_0x36193d(-0x1f3,-0x249)](_0x3a0263=>!_0x527fd6[_0x342c21(-0x256,-0x240)](_0x3a0263['id'])),_0x51a4e9=[];for(let _0x127c8e=_0x2f6318[_0x36193d(-0x20a,-0x203)]-0x1;_0x57d79f[_0x36193d(-0x204,-0x224)](_0x127c8e,0x0)&&_0x57d79f[_0x342c21(-0x1a1,-0x1ea)](_0x51a4e9[_0x36193d(-0x20a,-0x1c1)],_0x4886db);_0x127c8e--){const _0x118217=Math[_0x36193d(-0x1d5,-0x1cf)](Math[_0x36193d(-0x169,-0x1a8)]()*_0x57d79f[_0x36193d(-0x174,-0x117)](_0x127c8e,0x1));[_0x2f6318[_0x127c8e],_0x2f6318[_0x118217]]=[_0x2f6318[_0x118217],_0x2f6318[_0x127c8e]],_0x51a4e9['push'](_0x2f6318[_0x127c8e]);}_0x2b0f6c=[..._0x3be3b6,..._0x51a4e9];}else _0x2b0f6c=_0x1766bd;const _0x5ccd98=this[_0x36193d(-0x159,-0x1b1)+_0x342c21(-0x252,-0x237)](_0x2b0f6c,_0x552911[_0x36193d(-0x176,-0x1a3)+'Threshold']),_0x41c9c3=_0x80f96f[_0x36193d(-0x1f3,-0x244)](_0x1285da=>_0x1285da[_0x342c21(-0x22f,-0x243)]===_0x36193d(-0x16d,-0x152));let _0x5b98a3=_0x57d79f[_0x342c21(-0x217,-0x246)](_0x552911['maxSkills'],_0x41c9c3['length']);for(const _0x45849b of _0x5ccd98){if(_0x5b98a3<=0x0)break;const _0x3676b5=this[_0x36193d(-0x1d0,-0x16b)+_0x36193d(-0x152,-0x1b9)](_0x45849b,_0x552911[_0x36193d(-0x155,-0x126)+_0x36193d(-0x1b1,-0x1d9)],_0x552911[_0x342c21(-0x1c2,-0x208)+'nce']);if(!_0x3676b5){_0x14aa5a+=_0x45849b['length'];continue;}const _0x2e11c2=this[_0x342c21(-0x1a6,-0x1b3)+_0x36193d(-0x1c9,-0x217)](_0x3676b5,_0x41c9c3);if(_0x2e11c2){_0x14aa5a+=_0x45849b[_0x342c21(-0x262,-0x2bf)];continue;}_0x260b00[_0x36193d(-0x1b5,-0x1ee)](_0x3676b5);if(_0x552911[_0x342c21(-0x22a,-0x27d)+_0x36193d(-0x19b,-0x161)]&&this[_0x342c21(-0x1ef,-0x1ea)][_0x342c21(-0x19a,-0x1f5)]?.[_0x342c21(-0x1c8,-0x21c)]){if(_0x57d79f['PzEkO'](_0x36193d(-0x19f,-0x196),'nEAZD'))try{const _0x31ef74=await this[_0x342c21(-0x223,-0x26b)+'thLLM'](_0x3676b5);if(!_0x31ef74){_0x14aa5a+=_0x45849b[_0x36193d(-0x20a,-0x1af)];continue;}}catch(_0x2ee2ca){_0x55046d[_0x342c21(-0x20d,-0x1c6)]('LLM\x20valida'+_0x36193d(-0x1f7,-0x1bf)+_0x342c21(-0x23f,-0x1e8)+(_0x2ee2ca instanceof Error?_0x2ee2ca[_0x36193d(-0x19a,-0x15d)]:String(_0x2ee2ca)));}else this['db']=_0x10dec8,this[_0x342c21(-0x1ef,-0x1fc)]=_0x2a0bed;}try{if('DCFjf'===_0x342c21(-0x1cd,-0x1af))await this[_0x36193d(-0x185,-0x125)+_0x342c21(-0x1fc,-0x1e3)](_0x3676b5,_0x505895),_0x4882f2++,_0x5b98a3--;else{const _0x172065=_0x2e4c26[_0x342c21(-0x1b2,-0x1f4)](_0x344fb0[_0x342c21(-0x1b6,-0x157)](0x5),_0x57d79f['oCazp'])['toString'](_0x57d79f[_0x342c21(-0x1ee,-0x1b3)]);return _0x1a250d[_0x342c21(-0x232,-0x220)](_0x172065);}}catch(_0x529285){if(_0x342c21(-0x19d,-0x1de)!==_0x36193d(-0x1b7,-0x1d4))_0x55046d[_0x342c21(-0x20d,-0x1c1)](_0x342c21(-0x265,-0x2bf)+_0x342c21(-0x24f,-0x23c)+_0x36193d(-0x1e7,-0x18c)+(_0x57d79f[_0x36193d(-0x1e2,-0x22f)](_0x529285,Error)?_0x529285[_0x342c21(-0x1f2,-0x1f0)]:String(_0x529285)));else for(let _0x3b3f8a=_0x73cef6+0x1;_0x3b3f8a<_0x4530e8[_0x342c21(-0x262,-0x2c5)];_0x3b3f8a++){_0x3847a3[_0x53a26c][_0x36193d(-0x1b3,-0x21b)]&&_0x4af1e4[_0x3b3f8a][_0x342c21(-0x20b,-0x233)]&&(_0x460ab7+=_0x427629(_0x4642ca[_0x51627b]['embedding'],_0x3cce16[_0x3b3f8a]['embedding']),_0x948286++);}}}}catch(_0x4d7616){_0x55046d['push'](_0x342c21(-0x23e,-0x22a)+_0x342c21(-0x258,-0x2c1)+(_0x4d7616 instanceof Error?_0x4d7616[_0x36193d(-0x19a,-0x13d)]:_0x57d79f['jTUUM'](String,_0x4d7616)));}return{'candidates':_0x260b00,'created':_0x4882f2,'skipped':_0x14aa5a,'errors':_0x55046d};}[_0x272f8f(-0x178,-0x1b6)+_0x272f8f(-0x22b,-0x257)](_0x492f28,_0x4df0e7){const _0x9cd5d9={'lWPNT':_0x3c4bee(0x439,0x488),'nogSp':function(_0xcdaea0,_0x5085e2){return _0xcdaea0>=_0x5085e2;},'SNReC':_0x31115b(-0x28c,-0x238)},_0x3e636c=new Set();function _0x3c4bee(_0x3b2bd2,_0xd9ff5a){return _0x272f8f(_0xd9ff5a,_0x3b2bd2-0x64c);}function _0x31115b(_0x4b16c0,_0x436a61){return _0x272f8f(_0x4b16c0,_0x436a61- -0x5c);}const _0x2113ab=[];for(const _0x3f0865 of _0x492f28){if(_0x3e636c[_0x31115b(-0x2c6,-0x2b7)](_0x3f0865['id']))continue;if(!_0x3f0865[_0x31115b(-0x290,-0x26c)])continue;const _0x2e41d9=[_0x3f0865];_0x3e636c[_0x3c4bee(0x457,0x49b)](_0x3f0865['id']);for(const _0x1ea300 of _0x492f28){if(_0x9cd5d9[_0x31115b(-0x236,-0x21b)]!==_0x3c4bee(0x439,0x41d))_0x4fc0e7[_0x31115b(-0x248,-0x26e)]('Evaluation'+_0x31115b(-0x2f7,-0x2b9)+(_0x1783cb instanceof _0x3b14bd?_0x51723f[_0x31115b(-0x28b,-0x253)]:_0x519a87(_0x1ec6a6)));else{if(_0x3e636c[_0x3c4bee(0x3f1,0x3fd)](_0x1ea300['id']))continue;if(!_0x1ea300[_0x31115b(-0x208,-0x26c)])continue;const _0x102f5f=cosineSimilarity(_0x3f0865[_0x3c4bee(0x43c,0x440)],_0x1ea300[_0x31115b(-0x24d,-0x26c)]);_0x9cd5d9[_0x3c4bee(0x45e,0x406)](_0x102f5f,_0x4df0e7)&&('hSDbG'===_0x9cd5d9['SNReC']?(this['db']['updateMemo'+'ry'](_0x3bc6c8['id'],{'category':_0x31115b(-0x2a7,-0x2a1),'tags':_0x462d4a[_0x3c4bee(0x3e3,0x406)][_0x31115b(-0x2d3,-0x2ac)](_0x417659=>!_0x417659[_0x3c4bee(0x436,0x479)]('meta:')&&_0x417659!=='skill'&&_0x417659!==_0x3c4bee(0x4a4,0x484)+'ed')}),_0x2973de++):(_0x2e41d9[_0x3c4bee(0x43a,0x41c)](_0x1ea300),_0x3e636c['add'](_0x1ea300['id'])));}}_0x2113ab[_0x3c4bee(0x43a,0x3fc)](_0x2e41d9);}return _0x2113ab;}[_0x272f8f(-0x288,-0x22d)+'uster'](_0x41f0fe,_0x2d39b5,_0x37ed88){const _0x48a8d1={'KpOJS':function(_0x4e2679,_0x5aebf3){return _0x4e2679>=_0x5aebf3;},'uSaBC':function(_0xd92e0e,_0x36303f){return _0xd92e0e+_0x36303f;},'wWtfV':function(_0x5d284d,_0xea76ae){return _0x5d284d!==_0xea76ae;},'iScWh':function(_0x49084c,_0x437e60){return _0x49084c>_0x437e60;},'tvsRB':function(_0xf62bb0,_0x393039){return _0xf62bb0<_0x393039;},'obFkI':function(_0x4cac46,_0x23a770){return _0x4cac46<_0x23a770;},'cbxws':_0x17ff17(-0x15b,-0x1c2),'hFFFN':_0x17ff17(-0x15f,-0x164),'rMWTY':function(_0x1f660b){return _0x1f660b();}};function _0x17ff17(_0x54c026,_0x3693e4){return _0x272f8f(_0x3693e4,_0x54c026-0xf0);}const _0x154a35=0.5;if(_0x41f0fe[_0xa29ed7(-0x1c4,-0x22c)]<_0x2d39b5)return null;const _0x4ef8e6=this['computeAve'+_0xa29ed7(-0x24c,-0x22d)+'rity'](_0x41f0fe);if(_0x4ef8e6<0.75)return null;let _0x2351d3=_0x4ef8e6;const _0x37d2ce=new Set(_0x41f0fe[_0xa29ed7(-0x169,-0x182)](_0x50eef9=>_0x50eef9[_0xa29ed7(-0x1ad,-0x176)])['filter'](Boolean));_0x48a8d1['KpOJS'](_0x37d2ce[_0x17ff17(-0x14c,-0x1aa)],0x2)&&(_0x2351d3*=1.2);const _0x23973a=new Map();for(const _0x4dee07 of _0x41f0fe){_0x23973a[_0x17ff17(-0x172,-0x1d8)](_0x4dee07['category'],_0x48a8d1[_0x17ff17(-0x149,-0x19b)](_0x23973a[_0x17ff17(-0xe0,-0x9f)](_0x4dee07[_0xa29ed7(-0x1b6,-0x1f9)])??0x0,0x1));}let _0x5f0ece=_0x41f0fe[0x0][_0xa29ed7(-0x205,-0x1f9)],_0x2328ba=0x0;for(const [_0x46dcc8,_0x2b7819]of _0x23973a){if(_0x48a8d1[_0xa29ed7(-0x166,-0x178)](_0xa29ed7(-0x19a,-0x1a5),_0x17ff17(-0xf0,-0x112)))return{'candidates':_0x1e053d,'created':_0x4ea878,'skipped':_0x46ec9f[_0xa29ed7(-0x258,-0x22c)],'errors':_0x5ec4bb};else _0x48a8d1[_0xa29ed7(-0x196,-0x1b0)](_0x2b7819,_0x2328ba)&&(_0x2328ba=_0x2b7819,_0x5f0ece=_0x46dcc8);}_0x2328ba/_0x41f0fe[_0x17ff17(-0x177,-0x112)]>=0.5&&(_0x2351d3*=1.1);_0x2351d3=Math[_0xa29ed7(-0x19c,-0x1cb)](_0x2351d3,0x1);if(_0x48a8d1['tvsRB'](_0x2351d3,_0x154a35))return null;let _0xb8bb40;const _0x5c1cfb=_0x41f0fe[_0x17ff17(-0x160,-0x11c)](_0x599728=>_0x599728['embedding']&&_0x599728[_0xa29ed7(-0x238,-0x1d5)]['length']>0x0);if(_0x48a8d1['KpOJS'](_0x5c1cfb[_0x17ff17(-0x177,-0x193)],0x2)){const _0x205b77=_0x5c1cfb[0x0][_0xa29ed7(-0x199,-0x1d5)][_0x17ff17(-0x177,-0x163)],_0xc7ffee=new Array(_0x205b77)[_0x17ff17(-0x10e,-0x178)](0x0);for(const _0x496119 of _0x5c1cfb){for(let _0x1f223a=0x0;_0x48a8d1[_0x17ff17(-0x15c,-0x1c4)](_0x1f223a,_0x205b77);_0x1f223a++){_0xc7ffee[_0x1f223a]+=_0x496119[_0x17ff17(-0x120,-0x11b)][_0x1f223a]/_0x5c1cfb[_0x17ff17(-0x177,-0x134)];}}let _0x31e9d4=0x0,_0x37c85c=-0x1;for(let _0x30e4f7=0x0;_0x30e4f7<_0x5c1cfb[_0xa29ed7(-0x1e6,-0x22c)];_0x30e4f7++){const _0x47e533=cosineSimilarity(_0xc7ffee,_0x5c1cfb[_0x30e4f7][_0xa29ed7(-0x223,-0x1d5)]);_0x48a8d1[_0x17ff17(-0xfb,-0xb2)](_0x47e533,_0x37c85c)&&(_0x37c85c=_0x47e533,_0x31e9d4=_0x30e4f7);}_0xb8bb40=_0x5c1cfb[_0x31e9d4][_0x17ff17(-0x169,-0x1d0)][_0xa29ed7(-0x125,-0x180)](0x0,0x1f4);}else{if(_0x48a8d1['cbxws']!==_0xa29ed7(-0x227,-0x1fb)){const _0x2384bc=[..._0x41f0fe]['sort']((_0x78c9cb,_0x1af723)=>_0x1af723[_0x17ff17(-0x169,-0x123)]['length']-_0x78c9cb['content']['length']);_0xb8bb40=_0x2384bc[0x0][_0xa29ed7(-0x1b9,-0x21e)][_0x17ff17(-0xcb,-0xef)](0x0,0x1f4);}else return{'candidates':[],'created':0x0,'skipped':0x0,'errors':[]};}const _0x500efd=new Map();for(const _0x38bde1 of _0x41f0fe){if(_0x48a8d1['wWtfV'](_0x17ff17(-0x175,-0x151),_0x48a8d1[_0xa29ed7(-0x192,-0x183)]))for(const _0x48c653 of _0x38bde1['tags']){_0x500efd[_0x17ff17(-0x172,-0x1a9)](_0x48c653,(_0x500efd[_0xa29ed7(-0x1d2,-0x195)](_0x48c653)??0x0)+0x1);}else _0x1484bf[_0x2c94de]/=_0x13b098['length'];}function _0xa29ed7(_0x313e18,_0x46bcfb){return _0x272f8f(_0x313e18,_0x46bcfb-0x3b);}const _0x34bf5b=Array[_0xa29ed7(-0x13d,-0x17c)](_0x500efd[_0xa29ed7(-0x19f,-0x18e)]())[_0x17ff17(-0x160,-0x15b)](([,_0xbc2f7])=>_0xbc2f7>=0x2)[_0x17ff17(-0xcd,-0x9a)](([_0x4c3ca0])=>_0x4c3ca0);return{'clusterId':_0x48a8d1[_0xa29ed7(-0x1c2,-0x16f)](randomUUID),'sourceMemories':_0x41f0fe,'category':_0x5f0ece,'confidence':_0x2351d3,'pattern':_0xb8bb40,'tags':[..._0x34bf5b,_0xa29ed7(-0x187,-0x18f),_0xa29ed7(-0x15e,-0x16d)+'ed']};}async[_0x272f8f(-0x223,-0x228)+_0x4cbf0f(0x7e,0xc9)](_0x56baa3){function _0x2031d5(_0x2dcc14,_0x18cdae){return _0x272f8f(_0x18cdae,_0x2dcc14-0x195);}function _0x3b78f6(_0x5a104a,_0x19acac){return _0x272f8f(_0x5a104a,_0x19acac-0x15e);}const _0x44ec8c={'KLRHk':_0x3b78f6(-0x119,-0xf5)+_0x3b78f6(-0x81,-0x79),'clDhF':_0x2031d5(-0x2d,-0x87)+_0x3b78f6(-0x2a,-0x43),'HidhP':function(_0x44ac1c,_0xbdc4e3){return _0x44ac1c>=_0xbdc4e3;},'yRpID':function(_0x527316,_0x3395d5){return _0x527316(_0x3395d5);},'oQSRc':_0x3b78f6(-0xe6,-0x9d),'wNtLP':_0x3b78f6(-0x88,-0xc3)+'ED','brGpT':_0x2031d5(-0xda,-0x84)+'ed'};try{const {createLLMClient:_0xf0c868}=await import(_0x44ec8c[_0x2031d5(-0x6a,-0x27)]),_0x2b1094=_0xf0c868(this['config'][_0x3b78f6(-0x54,-0x41)]),_0x122b49=[_0x2031d5(-0xd7,-0xca)+_0x2031d5(-0x84,-0x8e)+_0x2031d5(-0x90,-0xa6)+'ories\x20repr'+_0x2031d5(-0xd1,-0x11b)+'usable\x20ski'+_0x2031d5(-0xb2,-0x9f)+'.',_0x3b78f6(-0x120,-0x102)+_0x2031d5(-0x6e,-0x1e)+_0x2031d5(-0x4f,-0x2a)+_0x2031d5(-0x57,-0x9f)+_0x3b78f6(-0xb0,-0x8f)+_0x3b78f6(-0x93,-0xf8)+_0x3b78f6(-0x15d,-0x10f),'','Category:\x20'+_0x56baa3[_0x3b78f6(-0xde,-0xd6)],_0x3b78f6(-0x4f,-0x4f)+_0x56baa3[_0x2031d5(-0x68,-0xcd)],'Source\x20cou'+_0x2031d5(-0x14,0x31)+_0x56baa3[_0x2031d5(-0x3a,-0x93)+_0x3b78f6(-0x51,-0x7f)]['length'],'',_0x44ec8c[_0x2031d5(-0x85,-0xec)],..._0x56baa3[_0x2031d5(-0x3a,0x8)+_0x2031d5(-0x48,-0xe)][_0x2031d5(-0x26,0x18)](0x0,0x3)['map']((_0x5227a6,_0x1d6790)=>_0x1d6790+0x1+'.\x20'+_0x5227a6[_0x3b78f6(-0xaa,-0xfb)][_0x2031d5(-0x26,-0x21)](0x0,0xc8))][_0x3b78f6(-0x61,-0x46)]('\x0a'),_0x263cf9=await _0x2b1094[_0x3b78f6(-0x59,-0x5c)](_0x122b49),_0x51a3f4=JSON[_0x2031d5(-0xa2,-0x5a)](_0x263cf9);return _0x51a3f4[_0x3b78f6(-0x10c,-0xe3)]===!![]&&_0x44ec8c[_0x3b78f6(-0xa8,-0x77)](_0x51a3f4[_0x2031d5(-0xd9,-0xf1)]??0x0,this[_0x2031d5(-0x5f,-0x72)][_0x2031d5(-0xa3,-0x3b)+_0x2031d5(-0x8a,-0x77)]?.[_0x3b78f6(-0xa2,-0x69)+'nce']??0.7);}catch(_0x2c5103){const _0x47791e=_0x2c5103 instanceof Error?_0x2c5103[_0x3b78f6(-0x52,-0x99)]:_0x44ec8c[_0x3b78f6(-0x6f,-0xd7)](String,_0x2c5103);if(_0x47791e[_0x3b78f6(-0x61,-0x47)](_0x44ec8c[_0x3b78f6(-0xa5,-0x101)])||_0x47791e[_0x2031d5(-0x10,-0x14)](_0x44ec8c['wNtLP'])||_0x47791e[_0x2031d5(-0x10,-0x2e)](_0x44ec8c[_0x2031d5(-0x50,-0x4c)]))return![];return![];}}async[_0x272f8f(-0x20e,-0x1e2)+'Skill'](_0x1f3427,_0x3a2a7f){const _0x1135f6={'ahYCr':function(_0x43506a,_0x6104c6){return _0x43506a*_0x6104c6;},'arxCI':function(_0x586e4c,_0x52ad5e){return _0x586e4c*_0x52ad5e;},'XMdxr':function(_0x1396f1,_0x53b59e){return _0x1396f1*_0x53b59e;},'pQqLN':_0x262861(0x1f6,0x247),'LSTbp':function(_0x374188,_0x5b70c0){return _0x374188&&_0x5b70c0;},'zxmZu':_0x16bd55(-0x53,-0x31),'gmZXu':_0x16bd55(-0xd3,-0x7e),'jeVik':_0x262861(0x23c,0x291),'UNNrS':_0x262861(0x2c3,0x265),'GlSyI':_0x262861(0x2a1,0x288),'hEodm':function(_0x4ca7d7,_0x7b0014){return _0x4ca7d7>_0x7b0014;}},_0x1987c9=new Date()[_0x262861(0x1d2,0x200)+'g'](),_0x512122=new Date(Date['now']()+_0x1135f6['ahYCr'](_0x1135f6[_0x262861(0x214,0x26c)](_0x1135f6['XMdxr'](this['config'][_0x16bd55(-0xc3,-0xf2)+_0x262861(0x276,0x251)]?.[_0x16bd55(-0x90,-0x7e)+_0x262861(0x273,0x289)]??0x5a,0x18)*0x3c,0x3c),0x3e8))[_0x16bd55(-0xfb,-0x124)+'g'](),_0xd38fa4=this['buildSkill'+'Content'](_0x1f3427);let _0x47c4d5=null;if(_0x3a2a7f)try{_0x1135f6[_0x262861(0x284,0x223)]!==_0x1135f6['pQqLN']?(_0x3b079a=_0x232335,_0x5e5529=_0xd39b45):_0x47c4d5=await _0x3a2a7f[_0x262861(0x254,0x296)+'ntent']({'content':_0x1f3427[_0x16bd55(-0x88,-0x80)],'tags':_0x1f3427['tags'][_0x262861(0x209,0x220)](_0x7e3ce8=>!_0x7e3ce8[_0x262861(0x2be,0x25a)](_0x16bd55(-0x81,-0xa4))&&_0x7e3ce8!==_0x262861(0x2a6,0x2a6)&&_0x7e3ce8!=='crystalliz'+'ed'),'category':_0x1f3427[_0x262861(0x2a5,0x23c)]});}catch{}const _0x363892={'sourceMemoryIds':_0x1f3427[_0x16bd55(-0x5a,0x10)+_0x16bd55(-0x68,-0xc6)]['map'](_0x56d875=>_0x56d875['id']),'crystallizedAt':_0x1987c9,'confidence':_0x1f3427['confidence'],'reviewDueAt':_0x512122,'activationCount':0x0,..._0x1135f6[_0x16bd55(-0xd4,-0xdb)](_0x47c4d5,{'taxonomyDomain':_0x47c4d5[_0x262861(0x2d6,0x270)],'taxonomySkillId':_0x47c4d5[_0x262861(0x20b,0x22a)]??undefined,'taxonomyNature':_0x47c4d5[_0x262861(0x222,0x242)]??undefined,'taxonomyStability':_0x47c4d5['stability']??undefined,'taxonomyConfidence':_0x47c4d5[_0x262861(0x238,0x202)]})};function _0x16bd55(_0x408c32,_0x323964){return _0x272f8f(_0x323964,_0x408c32-0x175);}const _0x376691=_0x262861(0x2c7,0x27a)+Buffer[_0x16bd55(-0x42,-0x4a)](JSON[_0x262861(0x20f,0x240)](_0x363892))['toString'](_0x1135f6[_0x16bd55(-0x95,-0xd7)]),_0x4d4fdc=[];if(_0x47c4d5){if(_0x1135f6[_0x262861(0x213,0x252)]===_0x1135f6[_0x262861(0x2c8,0x263)])return{'absorbed':![]};else _0x4d4fdc['push'](_0x16bd55(-0x7b,-0x25)+_0x47c4d5['domain']),_0x47c4d5[_0x16bd55(-0xd1,-0x8b)]&&_0x4d4fdc[_0x262861(0x2c4,0x25e)](_0x262861(0x25a,0x280)+_0x47c4d5['skill_id']),_0x47c4d5[_0x16bd55(-0xb9,-0x51)]&&(_0x262861(0x2ee,0x2d2)===_0x1135f6[_0x16bd55(-0xa3,-0x8e)]?(_0x59dd7a=_0x4e992a,_0x3112d9=_0x2f7dc4):_0x4d4fdc[_0x262861(0x278,0x25e)](_0x262861(0x24f,0x23d)+_0x47c4d5[_0x262861(0x250,0x242)]));}function _0x262861(_0x4392ec,_0x4d389f){return _0x272f8f(_0x4392ec,_0x4d389f-0x470);}const _0xecdde9=this['db'][_0x262861(0x285,0x27f)+'ry']({'content':_0xd38fa4,'category':_0x262861(0x2fb,0x2a6),'tier':_0x1135f6[_0x16bd55(-0x9a,-0xa6)],'tags':[..._0x1f3427[_0x262861(0x200,0x207)],..._0x4d4fdc,_0x376691],'projectPath':_0x1f3427['sourceMemo'+'ries'][0x0]?.['projectPat'+'h']}),_0x445d15=_0x1f3427[_0x16bd55(-0x5a,-0xa8)+_0x262861(0x29b,0x293)]['map'](_0x2f4143=>_0x2f4143[_0x16bd55(-0x9b,-0xca)])[_0x262861(0x1e8,0x220)](_0x4e89e4=>!!_0x4e89e4&&_0x4e89e4[_0x16bd55(-0xf2,-0xe6)]>0x0);if(_0x1135f6[_0x16bd55(-0xd9,-0xe6)](_0x445d15[_0x262861(0x1c3,0x209)],0x0)){const _0x20785a=this[_0x262861(0x1b6,0x20c)+_0x262861(0x27b,0x269)](_0x445d15);this['db'][_0x16bd55(-0x63,-0x63)+_0x16bd55(-0x84,-0x2d)](_0xecdde9['id'],_0x20785a);}return _0xecdde9;}[_0x4cbf0f(0x96,0x82)+'ls'](){const _0x59547a={'FXdkX':_0x5a7d51(0x569,0x504),'wwwxV':function(_0x425043,_0x5d4fba){return _0x425043<_0x5d4fba;},'RvKVu':function(_0x482432,_0x5770b1){return _0x482432<_0x5770b1;},'SOhft':function(_0x348ea6,_0x39de59){return _0x348ea6+_0x39de59;},'jsnvX':function(_0x352e9e,_0x3b47bb){return _0x352e9e*_0x3b47bb;},'DxkuC':function(_0x5863f3,_0x4bf37f){return _0x5863f3*_0x4bf37f;},'AvzLt':_0xa78ecd(0x1ea,0x248)},_0x553c5d=new Date();let _0x18b6ec=0x0,_0x5c8f28=0x0,_0x24788a=0x0;function _0x5a7d51(_0x26cb68,_0x2a1b1b){return _0x272f8f(_0x2a1b1b,_0x26cb68-0x733);}const _0x519b99=this['db']['listMemori'+'es']({'category':_0x59547a[_0x5a7d51(0x590,0x5a5)],'limit':0x3e8});function _0xa78ecd(_0x3e4365,_0x3870fe){return _0x272f8f(_0x3870fe,_0x3e4365-0x3b2);}for(const _0x448d17 of _0x519b99){_0x18b6ec++;const _0x43486f=this[_0x5a7d51(0x57b,0x51a)+_0x5a7d51(0x4d7,0x4ef)](_0x448d17);if(!_0x43486f)continue;const _0xddf1ce=new Date(_0x43486f[_0x5a7d51(0x555,0x53e)+'t']);if(_0x59547a[_0xa78ecd(0x1f6,0x227)](_0x553c5d,_0xddf1ce))continue;if(_0x59547a[_0x5a7d51(0x539,0x51a)](_0x448d17['accessCoun'+'t'],0x2))this['db'][_0xa78ecd(0x204,0x24a)+'ry'](_0x448d17['id'],{'category':_0x5a7d51(0x4ee,0x493),'tags':_0x448d17[_0x5a7d51(0x4ca,0x504)]['filter'](_0x4ee6bb=>!_0x4ee6bb[_0xa78ecd(0x19c,0x195)](_0x5a7d51(0x53d,0x4f5))&&_0x4ee6bb!=='skill'&&_0x4ee6bb!==_0x5a7d51(0x58b,0x579)+'ed')}),_0x5c8f28++;else{const _0x1b06fc=new Date(_0x59547a[_0xa78ecd(0x1e7,0x1bf)](Date[_0x5a7d51(0x58c,0x570)](),_0x59547a['jsnvX'](_0x59547a[_0x5a7d51(0x57f,0x56c)]((this[_0x5a7d51(0x53f,0x57f)][_0x5a7d51(0x4fb,0x527)+_0x5a7d51(0x514,0x52e)]?.[_0x5a7d51(0x52e,0x53a)+_0x5a7d51(0x54c,0x560)]??0x5a)*0x18,0x3c),0x3c)*0x3e8))['toISOStrin'+'g'](),_0x362520={..._0x43486f,'reviewDueAt':_0x1b06fc,'activationCount':_0x448d17[_0xa78ecd(0x1cc,0x1f5)+'t'],'lastActivatedAt':_0x448d17['lastAccess'+_0xa78ecd(0x1c9,0x211)]},_0x152f95=_0x5a7d51(0x53d,0x55b)+Buffer[_0x5a7d51(0x57c,0x591)](JSON[_0xa78ecd(0x182,0x1d4)](_0x362520))[_0xa78ecd(0x1e6,0x23f)](_0x59547a[_0xa78ecd(0x1ee,0x18d)]),_0x1bd89a=_0x448d17[_0xa78ecd(0x149,0x179)][_0xa78ecd(0x162,0x14d)](_0x25f2c7=>!_0x25f2c7['startsWith'](_0x5a7d51(0x53d,0x4e1)));_0x1bd89a[_0x5a7d51(0x521,0x53c)](_0x152f95),this['db']['updateMemo'+'ry'](_0x448d17['id'],{'tags':_0x1bd89a}),_0x24788a++;}}return{'reviewed':_0x18b6ec,'demoted':_0x5c8f28,'renewed':_0x24788a};}[_0x272f8f(-0x24a,-0x252)+_0x272f8f(-0x251,-0x268)+'rity'](_0x259dda){const _0x22dcbb={'aCZtY':function(_0x1ddb0b,_0x56f1d3){return _0x1ddb0b<_0x56f1d3;},'sVoGV':function(_0x424246,_0x1b7c64,_0x44fd12){return _0x424246(_0x1b7c64,_0x44fd12);}};if(_0x22dcbb[_0xe8a3f6(-0x79,-0x66)](_0x259dda[_0x477e08(0x2d7,0x2df)],0x2))return 0x1;let _0x4b8c1c=0x0;function _0xe8a3f6(_0x21c053,_0x3849f2){return _0x4cbf0f(_0x21c053,_0x3849f2- -0xba);}let _0x3019e4=0x0;function _0x477e08(_0x8cd5f5,_0x5a27bb){return _0x4cbf0f(_0x5a27bb,_0x8cd5f5-0x292);}for(let _0x49da1e=0x0;_0x49da1e<_0x259dda[_0x477e08(0x2d7,0x33a)];_0x49da1e++){for(let _0x4c94f0=_0x49da1e+0x1;_0x22dcbb[_0xe8a3f6(-0xba,-0x66)](_0x4c94f0,_0x259dda['length']);_0x4c94f0++){_0x259dda[_0x49da1e][_0x477e08(0x32e,0x391)]&&_0x259dda[_0x4c94f0][_0x477e08(0x32e,0x31e)]&&(_0x4b8c1c+=_0x22dcbb['sVoGV'](cosineSimilarity,_0x259dda[_0x49da1e][_0xe8a3f6(-0x50,-0x1e)],_0x259dda[_0x4c94f0][_0x477e08(0x32e,0x2fb)]),_0x3019e4++);}}return _0x3019e4>0x0?_0x4b8c1c/_0x3019e4:0x0;}[_0x272f8f(-0x195,-0x1ab)+_0x272f8f(-0x1c4,-0x226)](_0x250728,_0x44c781){const _0x215fc9={'xWzRO':function(_0x2b0c85,_0xf29c8b){return _0x2b0c85/_0xf29c8b;}},_0x409f8a=new Set(_0x250728[_0x2088ba(0x1e2,0x246)+_0x2088ba(0x1db,0x238)]['map'](_0x16c0ec=>_0x16c0ec['id']));function _0x2a1a72(_0xbed3bf,_0x23de4d){return _0x4cbf0f(_0x23de4d,_0xbed3bf-0x100);}for(const _0x3209c2 of _0x44c781){const _0x1df134=this['extractMet'+_0x2088ba(0x1ec,0x1b9)](_0x3209c2);if(!_0x1df134)continue;const _0xf017f6=new Set(_0x1df134[_0x2a1a72(0x1dd,0x1ab)+_0x2a1a72(0x200,0x264)]),_0x6193cd=[..._0x409f8a][_0x2a1a72(0x15c,0x1b2)](_0x553ca2=>_0xf017f6[_0x2088ba(0x21f,0x1ba)](_0x553ca2))[_0x2088ba(0x1a0,0x1ae)],_0x356b05=_0x215fc9[_0x2088ba(0x243,0x213)](_0x6193cd,Math[_0x2088ba(0x187,0x1e4)](_0x409f8a[_0x2a1a72(0x170,0x117)],_0xf017f6[_0x2a1a72(0x170,0x181)]));if(_0x356b05>=0.7)return!![];}function _0x2088ba(_0x28b8ec,_0x3dc880){return _0x4cbf0f(_0x28b8ec,_0x3dc880-0x169);}return![];}['buildSkill'+'Content'](_0x135ed0){const _0x394cf4={'HODhI':function(_0xac008,_0x376f62){return _0xac008*_0x376f62;},'TpwWx':function(_0x2b3abf,_0x3d8fa9){return _0x2b3abf*_0x3d8fa9;},'NZBtU':function(_0x724e42,_0x3f5d04){return _0x724e42>_0x3f5d04;},'cYrcW':'Key\x20patter'+_0x545633(0x31c,0x34a),'eEhcb':function(_0x1828ba,_0x105a68){return _0x1828ba===_0x105a68;},'FERPZ':_0x52afb4(0x1ae,0x155),'HCCRy':_0x52afb4(0xcc,0x12a)};function _0x52afb4(_0x438c94,_0x15e2fe){return _0x4cbf0f(_0x438c94,_0x15e2fe-0xc0);}const _0x12ee78=[];_0x12ee78[_0x545633(0x34a,0x3a1)](_0x52afb4(0x172,0x140)+_0x135ed0['pattern']);function _0x545633(_0x1632b4,_0x54d518){return _0x4cbf0f(_0x54d518,_0x1632b4-0x2b0);}_0x12ee78[_0x545633(0x34a,0x315)](''),_0x12ee78[_0x545633(0x34a,0x35a)](_0x545633(0x383,0x346)+_0x135ed0[_0x545633(0x328,0x342)]),_0x12ee78[_0x52afb4(0x184,0x15a)](_0x545633(0x38e,0x332)+_0x135ed0[_0x545633(0x38d,0x373)+_0x545633(0x37f,0x337)][_0x52afb4(0x116,0x105)]+_0x545633(0x31f,0x2e3)),_0x12ee78[_0x52afb4(0x11f,0x15a)]('Confidence'+':\x20'+_0x394cf4[_0x52afb4(0x22f,0x1cc)](_0x135ed0[_0x52afb4(0xf2,0xfe)],0x64)['toFixed'](0x0)+'%');if(_0x394cf4['NZBtU'](_0x135ed0['sourceMemo'+_0x52afb4(0x185,0x18f)][_0x52afb4(0x13e,0x105)],0x1)){_0x12ee78[_0x52afb4(0x11c,0x15a)](''),_0x12ee78[_0x52afb4(0x113,0x15a)](_0x394cf4[_0x545633(0x354,0x32e)]);for(const _0x13028b of _0x135ed0[_0x52afb4(0x19f,0x19d)+_0x545633(0x37f,0x34b)][_0x545633(0x3a1,0x342)](0x0,0x3)){if(_0x394cf4[_0x545633(0x2f1,0x2eb)](_0x394cf4[_0x545633(0x39c,0x405)],_0x394cf4[_0x52afb4(0x135,0x141)])){const _0x13ab22=[];_0x13ab22[_0x545633(0x34a,0x33e)](_0x52afb4(0xf4,0x140)+_0x5e8276[_0x52afb4(0x19c,0x16f)]),_0x13ab22[_0x545633(0x34a,0x35a)](''),_0x13ab22[_0x52afb4(0x17e,0x15a)](_0x52afb4(0x1d6,0x193)+_0x14b5b2[_0x52afb4(0x101,0x138)]),_0x13ab22[_0x52afb4(0xfc,0x15a)](_0x52afb4(0x16e,0x19e)+_0x24c0df[_0x545633(0x38d,0x3cb)+_0x545633(0x37f,0x316)][_0x52afb4(0x167,0x105)]+'\x20memories'),_0x13ab22[_0x545633(0x34a,0x37a)]('Confidence'+':\x20'+_0x394cf4[_0x545633(0x31e,0x2bc)](_0x23668c[_0x52afb4(0xd1,0xfe)],0x64)[_0x545633(0x397,0x377)](0x0)+'%');if(_0x564429[_0x52afb4(0x16d,0x19d)+'ries'][_0x52afb4(0x15c,0x105)]>0x1){_0x13ab22['push'](''),_0x13ab22[_0x52afb4(0x118,0x15a)]('Key\x20patter'+_0x52afb4(0x18a,0x12c));for(const _0x4c2d31 of _0x3e2b56[_0x52afb4(0x1ec,0x19d)+'ries'][_0x545633(0x3a1,0x340)](0x0,0x3)){const _0x48cd02=_0x4c2d31[_0x545633(0x303,0x2e6)][_0x545633(0x302,0x29d)]('\x0a')[0x0]['slice'](0x0,0x96);_0x13ab22[_0x52afb4(0x128,0x15a)]('-\x20'+_0x48cd02);}}return _0x13ab22[_0x52afb4(0x163,0x1c8)]('\x0a');}else{const _0x5a83f3=_0x13028b[_0x52afb4(0x123,0x113)][_0x52afb4(0xb2,0x112)]('\x0a')[0x0][_0x52afb4(0x1df,0x1b1)](0x0,0x96);_0x12ee78[_0x52afb4(0x158,0x15a)]('-\x20'+_0x5a83f3);}}}return _0x12ee78[_0x52afb4(0x16e,0x1c8)]('\x0a');}[_0x4cbf0f(0xfd,0xf4)+_0x4cbf0f(0x6f,0x50)](_0xcf4eac){function _0x29ed66(_0x38562c,_0xcebc30){return _0x4cbf0f(_0x38562c,_0xcebc30-0x3ab);}const _0x3d1c11={'DCrkN':_0x54758a(0x2fa,0x360)},_0x216a57=_0xcf4eac[_0x29ed66(0x442,0x3ee)][_0x29ed66(0x414,0x430)](_0x235212=>_0x235212[_0x29ed66(0x49f,0x441)](_0x29ed66(0x411,0x461)));if(!_0x216a57)return null;function _0x54758a(_0x439028,_0x12deec){return _0x4cbf0f(_0x439028,_0x12deec-0x2ee);}try{const _0x3817a3=Buffer[_0x29ed66(0x4d9,0x4a0)](_0x216a57['slice'](0x5),_0x29ed66(0x492,0x48f))[_0x54758a(0x37f,0x3ce)](_0x3d1c11[_0x54758a(0x324,0x345)]);return JSON['parse'](_0x3817a3);}catch{return null;}}[_0x4cbf0f(0x88,0x48)+_0x4cbf0f(0x88,0xa5)](_0x3b7f87){const _0x4ccf5e={'EJkPp':function(_0x1774ed,_0x5c76f9){return _0x1774ed/_0x5c76f9;},'HtxvX':function(_0x49c964,_0x35dc53){return _0x49c964!==_0x35dc53;},'mDdPi':_0x1e5c49(-0xb5,-0xd2)};if(_0x3b7f87['length']===0x0)return[];const _0x430eb3=_0x3b7f87[0x0][_0x2be8ec(-0x177,-0x1b1)],_0x53437d=new Array(_0x430eb3)[_0x1e5c49(-0xd8,-0xc4)](0x0);for(const _0x5174fb of _0x3b7f87){for(let _0x21df3a=0x0;_0x21df3a<_0x430eb3;_0x21df3a++){_0x53437d[_0x21df3a]+=_0x5174fb[_0x21df3a];}}function _0x1e5c49(_0x3c0cd6,_0x4ebb88){return _0x4cbf0f(_0x4ebb88,_0x3c0cd6- -0x186);}function _0x2be8ec(_0x1577b0,_0x533455){return _0x4cbf0f(_0x533455,_0x1577b0- -0x1bc);}for(let _0x5b0c3e=0x0;_0x5b0c3e<_0x430eb3;_0x5b0c3e++){_0x4ccf5e[_0x1e5c49(-0xae,-0x6b)](_0x4ccf5e['mDdPi'],_0x1e5c49(-0xb5,-0xf3))?_0x592c34[_0x416d42]+=lPeJIY[_0x1e5c49(-0x8a,-0x94)](_0x1b68bd[_0x1e5c49(-0xea,-0xfd)][_0x3cfc12],_0x1bf07a['length']):_0x53437d[_0x5b0c3e]/=_0x3b7f87[_0x1e5c49(-0x141,-0x1a4)];}return _0x53437d;}[_0x272f8f(-0x222,-0x1c1)+_0x4cbf0f(0x7e,0xab)](_0x1cd9c0){const _0x142e59={'NjPhI':function(_0x13834a,_0x41b74b){return _0x13834a+_0x41b74b;},'vTbfv':function(_0x34ef37,_0x174b8b){return _0x34ef37*_0x174b8b;},'MTCAM':function(_0x2de363,_0x41853b){return _0x2de363*_0x41853b;},'YJAPU':function(_0x3f737b,_0x55feb2){return _0x3f737b*_0x55feb2;},'kUkpg':function(_0x3306fb,_0x4d1970,_0x1e5d55){return _0x3306fb(_0x4d1970,_0x1e5d55);},'IIMxY':function(_0x1ed0bb,_0x4b8aac){return _0x1ed0bb===_0x4b8aac;},'uXJdr':_0x2e2e9e(0x398,0x38c),'EyCRH':function(_0x319f6e,_0x2ea25b){return _0x319f6e<_0x2ea25b;},'KmXUt':function(_0x34f1da,_0x29bda7){return _0x34f1da+_0x29bda7;},'CJtAE':function(_0xaf4ff,_0x44a6e6){return _0xaf4ff+_0x44a6e6;}};if(!_0x1cd9c0[_0x497efd(0x1f7,0x21c)]||_0x1cd9c0[_0x497efd(0x1d3,0x1a4)]===_0x497efd(0x23d,0x290))return{'absorbed':![]};const _0x451257=this['db'][_0x497efd(0x231,0x1df)+'es']({'limit':0xc8})['filter'](_0x4543f6=>_0x4543f6[_0x497efd(0x1d3,0x1e4)]===_0x497efd(0x23d,0x252));for(const _0x10e173 of _0x451257){if(!_0x10e173[_0x497efd(0x1f7,0x1b8)])continue;const _0x498e6d=_0x142e59['kUkpg'](cosineSimilarity,_0x1cd9c0['embedding'],_0x10e173[_0x2e2e9e(0x3d2,0x416)]);if(_0x498e6d<0.8)continue;const _0x10ae13=this['extractMet'+'adata'](_0x10e173);if(!_0x10ae13)continue;if(_0x10ae13['sourceMemo'+_0x497efd(0x25b,0x1fb)]['includes'](_0x1cd9c0['id'])){if(_0x142e59['IIMxY'](_0x142e59[_0x497efd(0x1cc,0x17e)],_0x497efd(0x215,0x21c))){const _0x39c65d=new _0x3f2a07(FaIDLW[_0x2e2e9e(0x3d1,0x3fe)](_0x2bbe6c[_0x497efd(0x260,0x233)](),FaIDLW[_0x2e2e9e(0x3be,0x389)](FaIDLW[_0x497efd(0x1b6,0x16c)](FaIDLW['YJAPU'](this['config']['skillConve'+_0x497efd(0x1e8,0x1bc)]?.['reviewCycl'+_0x2e2e9e(0x3fb,0x42b)]??0x5a,0x18)*0x3c,0x3c),0x3e8)))['toISOStrin'+'g'](),_0x5e1069={..._0x310b8b,'reviewDueAt':_0x39c65d,'activationCount':_0x5246e1[_0x497efd(0x221,0x259)+'t'],'lastActivatedAt':_0x579ca2[_0x497efd(0x218,0x1f2)+_0x2e2e9e(0x3f9,0x3a0)]},_0x47ecfa=_0x2e2e9e(0x3ec,0x391)+_0x1dca45[_0x2e2e9e(0x42b,0x41a)](_0x54a924[_0x497efd(0x1d7,0x1a2)](_0x5e1069))[_0x2e2e9e(0x416,0x45d)]('base64'),_0x412fee=_0x2d4cd7['tags']['filter'](_0xfb2ecb=>!_0xfb2ecb['startsWith'](_0x2e2e9e(0x3ec,0x3a8)));_0x412fee[_0x2e2e9e(0x3d0,0x413)](_0x47ecfa),this['db'][_0x2e2e9e(0x434,0x46b)+'ry'](_0x572a94['id'],{'tags':_0x412fee}),_0x10671b++;}else return{'absorbed':![]};}_0x10ae13[_0x497efd(0x238,0x293)+_0x497efd(0x25b,0x29c)]['push'](_0x1cd9c0['id']),_0x10ae13[_0x2e2e9e(0x3bf,0x3da)+_0x497efd(0x1ea,0x242)]=_0x142e59[_0x2e2e9e(0x3d1,0x3cb)](_0x10ae13[_0x2e2e9e(0x3bf,0x386)+_0x497efd(0x1ea,0x210)]||0x0,0x1),_0x10ae13[_0x497efd(0x1ec,0x1a4)+_0x497efd(0x1fe,0x1c4)]=new Date()['toISOStrin'+'g']();const _0x3897a9='meta:'+Buffer[_0x2e2e9e(0x42b,0x417)](JSON[_0x2e2e9e(0x3b2,0x34e)](_0x10ae13))[_0x497efd(0x23b,0x260)](_0x2e2e9e(0x41a,0x3ed)),_0x32c874=_0x10e173[_0x497efd(0x19e,0x1c8)][_0x2e2e9e(0x392,0x332)](_0xfa211c=>!_0xfa211c[_0x497efd(0x1f1,0x18f)](_0x497efd(0x211,0x262))),_0x40d94d='-\x20'+_0x1cd9c0[_0x497efd(0x1ae,0x214)]['split']('\x0a')[0x0]['slice'](0x0,0x96);let _0xc6d7e3=_0x10e173[_0x497efd(0x1ae,0x1ef)];const _0x2fb0fe=_0xc6d7e3[_0x2e2e9e(0x388,0x3ca)]('\x0a')[_0x2e2e9e(0x392,0x3a6)](_0x51cfeb=>_0x51cfeb[_0x497efd(0x1f1,0x248)]('-\x20'));return _0x142e59['EyCRH'](_0x2fb0fe[_0x2e2e9e(0x37b,0x38e)],0x5)&&(_0xc6d7e3=_0x142e59['KmXUt'](_0x142e59[_0x497efd(0x1fb,0x1e7)](_0xc6d7e3['trimEnd'](),'\x0a'),_0x40d94d)),this['db'][_0x2e2e9e(0x434,0x48f)+'ry'](_0x10e173['id'],{'content':_0xc6d7e3,'tags':[..._0x32c874,_0x3897a9]}),{'absorbed':!![],'skillId':_0x10e173['id']};}function _0x497efd(_0x3b589d,_0x515fca){return _0x4cbf0f(_0x515fca,_0x3b589d-0x15b);}function _0x2e2e9e(_0x173cc2,_0x416309){return _0x4cbf0f(_0x416309,_0x173cc2-0x336);}return{'absorbed':![]};}}
|
package/dist/skill/index.js
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Skill Crystallization Module
|
|
3
|
-
*
|
|
4
|
-
* ACT-R Knowledge Compilation 기반 스킬 결정화 시스템.
|
|
5
|
-
*/
|
|
6
|
-
export { SkillEvaluator } from './evaluator.js';
|
|
7
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
function _0x447d(_0x5df948,_0x45490d){_0x5df948=_0x5df948-0xc0;var _0x17ee3d=_0x17ee();var _0x447dc8=_0x17ee3d[_0x5df948];if(_0x447d['HvXSnk']===undefined){var _0x2fbdd6=function(_0x914049){var _0xaa1e26='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4ed6c5='',_0x64d24e='';for(var _0x479e23=0x0,_0x545b2b,_0x2f67c1,_0x1e6364=0x0;_0x2f67c1=_0x914049['charAt'](_0x1e6364++);~_0x2f67c1&&(_0x545b2b=_0x479e23%0x4?_0x545b2b*0x40+_0x2f67c1:_0x2f67c1,_0x479e23++%0x4)?_0x4ed6c5+=String['fromCharCode'](0xff&_0x545b2b>>(-0x2*_0x479e23&0x6)):0x0){_0x2f67c1=_0xaa1e26['indexOf'](_0x2f67c1);}for(var _0x20661b=0x0,_0xc9671a=_0x4ed6c5['length'];_0x20661b<_0xc9671a;_0x20661b++){_0x64d24e+='%'+('00'+_0x4ed6c5['charCodeAt'](_0x20661b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x64d24e);};_0x447d['tWjkbq']=_0x2fbdd6,_0x447d['EjbabD']={},_0x447d['HvXSnk']=!![];}var _0x53658a=_0x17ee3d[0x0],_0x1f7a77=_0x5df948+_0x53658a,_0x53b150=_0x447d['EjbabD'][_0x1f7a77];return!_0x53b150?(_0x447dc8=_0x447d['tWjkbq'](_0x447dc8),_0x447d['EjbabD'][_0x1f7a77]=_0x447dc8):_0x447dc8=_0x53b150,_0x447dc8;}(function(_0x22c1d6,_0x4d56cc){function _0x2f7a46(_0x509acb,_0x4879f9){return _0x447d(_0x509acb- -0x146,_0x4879f9);}function _0x1bf72e(_0x3c5c0e,_0x576ea1){return _0x447d(_0x3c5c0e-0x143,_0x576ea1);}var _0x453642=_0x22c1d6();while(!![]){try{var _0x596ef3=-parseInt(_0x1bf72e(0x20a,0x206))/0x1+parseInt(_0x1bf72e(0x208,0x205))/0x2*(parseInt(_0x2f7a46(-0x83,-0x84))/0x3)+-parseInt(_0x1bf72e(0x205,0x203))/0x4*(-parseInt(_0x1bf72e(0x20b,0x20f))/0x5)+-parseInt(_0x2f7a46(-0x7c,-0x7b))/0x6+-parseInt(_0x2f7a46(-0x82,-0x88))/0x7+-parseInt(_0x1bf72e(0x204,0x208))/0x8*(parseInt(_0x1bf72e(0x203,0x200))/0x9)+parseInt(_0x2f7a46(-0x7d,-0x82))/0xa*(parseInt(_0x2f7a46(-0x80,-0x7e))/0xb);if(_0x596ef3===_0x4d56cc)break;else _0x453642['push'](_0x453642['shift']());}catch(_0x51b841){_0x453642['push'](_0x453642['shift']());}}}(_0x17ee,0x23bef));export{SkillEvaluator}from'./evaluator.js';function _0x17ee(){var _0x5429b6=['mJu0mtG4BwPkB0Tb','mtbbvgHLrgq','mJeYmJbXzhDIq2i','mta0mZrAz1nTte4','mJqXndDoy3fcqvi','mJGWshjOzgTI','nduWnda0vvLxt3zk','mtq2oty3rwzurgPN','mtK2odu2ofD4vKf6Aa','nMrfz3nUCa','mJeWmwDqtMHRAa'];_0x17ee=function(){return _0x5429b6;};return _0x17ee();}
|
package/dist/skill/types.js
CHANGED
package/dist/sync/client.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export interface RemoteMemory {
|
|
|
24
24
|
parent_id?: string;
|
|
25
25
|
chunk_index?: number;
|
|
26
26
|
chunk_total?: number;
|
|
27
|
+
quality_score?: number;
|
|
27
28
|
}
|
|
28
29
|
export declare class A2AClient {
|
|
29
30
|
private config;
|
|
@@ -162,6 +163,12 @@ export declare class A2AClient {
|
|
|
162
163
|
* 메모리 강화 (access_count 증가)
|
|
163
164
|
*/
|
|
164
165
|
reinforceMemory(id: string): Promise<RemoteMemory>;
|
|
166
|
+
/**
|
|
167
|
+
* 메모리 피드백 강화 — fire-and-forget용
|
|
168
|
+
* injection effectiveness > 0.3인 메모리에 대해 성공/실패 피드백 전송
|
|
169
|
+
* 에러 시 로그만 남기고 throw하지 않음
|
|
170
|
+
*/
|
|
171
|
+
reinforceMemoryFeedback(remoteId: string, success: boolean): Promise<void>;
|
|
165
172
|
/**
|
|
166
173
|
* 메모리 승격 (semantic tier로 고정)
|
|
167
174
|
* NOTE: 서버는 target_tier 파라미터를 무시하고 항상 semantic으로 승격합니다.
|