a2a-memory 0.8.1 → 0.9.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/dist/adapters/anthropic.d.ts.map +1 -1
- package/dist/adapters/anthropic.js +1 -0
- package/dist/adapters/anthropic.js.map +1 -1
- package/dist/claude/sync.js +6 -6
- package/dist/claude/sync.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +16 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/health.d.ts.map +1 -1
- package/dist/cli/commands/health.js +3 -6
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/proficiency.d.ts +8 -0
- package/dist/cli/commands/proficiency.d.ts.map +1 -0
- package/dist/cli/commands/proficiency.js +142 -0
- package/dist/cli/commands/proficiency.js.map +1 -0
- package/dist/cli/commands/skill.d.ts +8 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +136 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +15 -10
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/team.d.ts.map +1 -1
- package/dist/cli/commands/team.js +0 -2
- package/dist/cli/commands/team.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/manager.d.ts +682 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +77 -2
- package/dist/config/manager.js.map +1 -1
- package/dist/db/database.d.ts +65 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +276 -3
- package/dist/db/database.js.map +1 -1
- package/dist/extraction/extractor.d.ts +4 -0
- package/dist/extraction/extractor.d.ts.map +1 -1
- package/dist/extraction/extractor.js +261 -38
- package/dist/extraction/extractor.js.map +1 -1
- package/dist/extraction/scorer.js +5 -3
- package/dist/extraction/scorer.js.map +1 -1
- package/dist/hooks/post-tool-use.d.ts.map +1 -1
- package/dist/hooks/post-tool-use.js +78 -15
- package/dist/hooks/post-tool-use.js.map +1 -1
- package/dist/hooks/session-end.d.ts.map +1 -1
- package/dist/hooks/session-end.js +103 -4
- package/dist/hooks/session-end.js.map +1 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +132 -36
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/cleanup.d.ts.map +1 -1
- package/dist/lifecycle/cleanup.js +2 -1
- package/dist/lifecycle/cleanup.js.map +1 -1
- package/dist/llm/client.d.ts +22 -0
- package/dist/llm/client.d.ts.map +1 -1
- package/dist/llm/client.js +74 -2
- package/dist/llm/client.js.map +1 -1
- package/dist/proficiency/actr-engine.d.ts +55 -0
- package/dist/proficiency/actr-engine.d.ts.map +1 -0
- package/dist/proficiency/actr-engine.js +106 -0
- package/dist/proficiency/actr-engine.js.map +1 -0
- package/dist/proficiency/detection.d.ts +38 -0
- package/dist/proficiency/detection.d.ts.map +1 -0
- package/dist/proficiency/detection.js +81 -0
- package/dist/proficiency/detection.js.map +1 -0
- package/dist/proficiency/index.d.ts +11 -0
- package/dist/proficiency/index.d.ts.map +1 -0
- package/dist/proficiency/index.js +9 -0
- package/dist/proficiency/index.js.map +1 -0
- package/dist/proficiency/tracker.d.ts +50 -0
- package/dist/proficiency/tracker.d.ts.map +1 -0
- package/dist/proficiency/tracker.js +170 -0
- package/dist/proficiency/tracker.js.map +1 -0
- package/dist/proficiency/types.d.ts +60 -0
- package/dist/proficiency/types.d.ts.map +1 -0
- package/dist/proficiency/types.js +8 -0
- package/dist/proficiency/types.js.map +1 -0
- package/dist/providers/adapters.d.ts +54 -0
- package/dist/providers/adapters.d.ts.map +1 -0
- package/dist/providers/adapters.js +140 -0
- package/dist/providers/adapters.js.map +1 -0
- package/dist/providers/detector.d.ts +17 -0
- package/dist/providers/detector.d.ts.map +1 -0
- package/dist/providers/detector.js +57 -0
- package/dist/providers/detector.js.map +1 -0
- package/dist/search/ranker.d.ts +26 -2
- package/dist/search/ranker.d.ts.map +1 -1
- package/dist/search/ranker.js +121 -46
- package/dist/search/ranker.js.map +1 -1
- package/dist/session/parser.d.ts.map +1 -1
- package/dist/session/parser.js +1 -0
- package/dist/session/parser.js.map +1 -1
- package/dist/skill/evaluator.d.ts +57 -0
- package/dist/skill/evaluator.d.ts.map +1 -0
- package/dist/skill/evaluator.js +373 -0
- package/dist/skill/evaluator.js.map +1 -0
- package/dist/skill/index.d.ts +8 -0
- package/dist/skill/index.d.ts.map +1 -0
- package/dist/skill/index.js +7 -0
- package/dist/skill/index.js.map +1 -0
- package/dist/skill/types.d.ts +34 -0
- package/dist/skill/types.d.ts.map +1 -0
- package/dist/skill/types.js +7 -0
- package/dist/skill/types.js.map +1 -0
- package/dist/sync/client.d.ts +82 -0
- package/dist/sync/client.d.ts.map +1 -1
- package/dist/sync/client.js +75 -1
- package/dist/sync/client.js.map +1 -1
- package/dist/sync/queue.d.ts +1 -0
- package/dist/sync/queue.d.ts.map +1 -1
- package/dist/sync/queue.js +33 -5
- package/dist/sync/queue.js.map +1 -1
- package/dist/sync/synchronizer.js +1 -1
- package/dist/sync/synchronizer.js.map +1 -1
- package/dist/sync/team-synchronizer.d.ts +6 -2
- package/dist/sync/team-synchronizer.d.ts.map +1 -1
- package/dist/sync/team-synchronizer.js +84 -6
- package/dist/sync/team-synchronizer.js.map +1 -1
- package/dist/sync/vector-clock.d.ts +7 -0
- package/dist/sync/vector-clock.d.ts.map +1 -1
- package/dist/sync/vector-clock.js +30 -0
- package/dist/sync/vector-clock.js.map +1 -1
- package/dist/types/index.d.ts +27 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +24 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/keychain.d.ts.map +1 -1
- package/dist/utils/keychain.js +4 -0
- package/dist/utils/keychain.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +12 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACT-R Activation Engine
|
|
3
|
+
*
|
|
4
|
+
* Backend src/core/actr/engine.py 의 TypeScript 포트.
|
|
5
|
+
* Power Law of Practice + Forgetting Curve 기반 활성화 계산.
|
|
6
|
+
*
|
|
7
|
+
* 공식:
|
|
8
|
+
* B_i = ln(sum(t_j^(-d))) + B // Base-level (시간 감쇠)
|
|
9
|
+
* S_i = sum(W_j * S_ji) // Spreading (컨텍스트 연관)
|
|
10
|
+
* P_i = -P * (1 - similarity) // Partial Match (유사도 보정)
|
|
11
|
+
* A_i = B_i + S_i + P_i // Total Activation
|
|
12
|
+
*/
|
|
13
|
+
import type { ACTRConfig, ActivationResult } from './types.js';
|
|
14
|
+
export declare class ACTREngine {
|
|
15
|
+
private config;
|
|
16
|
+
constructor(config: ACTRConfig);
|
|
17
|
+
/**
|
|
18
|
+
* 전체 활성화 계산
|
|
19
|
+
*
|
|
20
|
+
* @param accessTimes - 접근 시간 배열 (현재 시점에서의 경과 초, 양수)
|
|
21
|
+
* @param associations - [{ source, strength }] 연관 소스와 강도
|
|
22
|
+
* @param context - 현재 활성 컨텍스트 소스 집합
|
|
23
|
+
* @param similarity - 유사도 (0.0-1.0, 1.0=완벽 일치)
|
|
24
|
+
* @param memoryId - 식별용 ID
|
|
25
|
+
*/
|
|
26
|
+
computeActivation(accessTimes: number[], associations: Array<{
|
|
27
|
+
source: string;
|
|
28
|
+
strength: number;
|
|
29
|
+
}>, context: Set<string>, similarity: number, memoryId?: string): ActivationResult;
|
|
30
|
+
/**
|
|
31
|
+
* Base-level Activation: B_i = ln(sum(t_j^(-d))) + B
|
|
32
|
+
* Power Law of Practice + Forgetting Curve
|
|
33
|
+
*/
|
|
34
|
+
computeBaseLevel(accessTimes: number[]): number;
|
|
35
|
+
/**
|
|
36
|
+
* Spreading Activation: S_i = sum(W_j * S_ji)
|
|
37
|
+
* Fan Effect: W_j = Smax / fan(j)
|
|
38
|
+
*/
|
|
39
|
+
computeSpreading(associations: Array<{
|
|
40
|
+
source: string;
|
|
41
|
+
strength: number;
|
|
42
|
+
}>, context: Set<string>): number;
|
|
43
|
+
/**
|
|
44
|
+
* Partial Matching: P_i = -P * (1 - similarity)
|
|
45
|
+
*/
|
|
46
|
+
computePartialMatch(similarity: number): number;
|
|
47
|
+
/**
|
|
48
|
+
* Activation을 1-maxLevel 레벨로 변환
|
|
49
|
+
*
|
|
50
|
+
* 정규화: activation [-2, 5] -> [0, 1]
|
|
51
|
+
* 레벨: ceil(normalized * maxLevel), clamp [1, maxLevel]
|
|
52
|
+
*/
|
|
53
|
+
computeLevel(activation: number, maxLevel: number): number;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=actr-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actr-engine.d.ts","sourceRoot":"","sources":["../../src/proficiency/actr-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK/D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAI9B;;;;;;;;OAQG;IACH,iBAAiB,CACf,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EACzD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAW,GACpB,gBAAgB;IAgBnB;;;OAGG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM;IAqB/C;;;OAGG;IACH,gBAAgB,CACd,YAAY,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EACzD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GACnB,MAAM;IAwBT;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAK/C;;;;;OAKG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAM3D"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACT-R Activation Engine
|
|
3
|
+
*
|
|
4
|
+
* Backend src/core/actr/engine.py 의 TypeScript 포트.
|
|
5
|
+
* Power Law of Practice + Forgetting Curve 기반 활성화 계산.
|
|
6
|
+
*
|
|
7
|
+
* 공식:
|
|
8
|
+
* B_i = ln(sum(t_j^(-d))) + B // Base-level (시간 감쇠)
|
|
9
|
+
* S_i = sum(W_j * S_ji) // Spreading (컨텍스트 연관)
|
|
10
|
+
* P_i = -P * (1 - similarity) // Partial Match (유사도 보정)
|
|
11
|
+
* A_i = B_i + S_i + P_i // Total Activation
|
|
12
|
+
*/
|
|
13
|
+
const CLAMP_MIN = 1e-10;
|
|
14
|
+
const CLAMP_MAX = 1e10;
|
|
15
|
+
export class ACTREngine {
|
|
16
|
+
config;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 전체 활성화 계산
|
|
22
|
+
*
|
|
23
|
+
* @param accessTimes - 접근 시간 배열 (현재 시점에서의 경과 초, 양수)
|
|
24
|
+
* @param associations - [{ source, strength }] 연관 소스와 강도
|
|
25
|
+
* @param context - 현재 활성 컨텍스트 소스 집합
|
|
26
|
+
* @param similarity - 유사도 (0.0-1.0, 1.0=완벽 일치)
|
|
27
|
+
* @param memoryId - 식별용 ID
|
|
28
|
+
*/
|
|
29
|
+
computeActivation(accessTimes, associations, context, similarity, memoryId = '') {
|
|
30
|
+
const baseLevel = this.computeBaseLevel(accessTimes);
|
|
31
|
+
const spreading = this.computeSpreading(associations, context);
|
|
32
|
+
const partialMatch = this.computePartialMatch(similarity);
|
|
33
|
+
const total = baseLevel + spreading + partialMatch;
|
|
34
|
+
return {
|
|
35
|
+
memoryId,
|
|
36
|
+
baseLevel,
|
|
37
|
+
spreading,
|
|
38
|
+
partialMatch,
|
|
39
|
+
total,
|
|
40
|
+
shouldRetrieve: total >= this.config.retrievalThreshold,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Base-level Activation: B_i = ln(sum(t_j^(-d))) + B
|
|
45
|
+
* Power Law of Practice + Forgetting Curve
|
|
46
|
+
*/
|
|
47
|
+
computeBaseLevel(accessTimes) {
|
|
48
|
+
if (accessTimes.length === 0) {
|
|
49
|
+
return this.config.baseLevelConstant;
|
|
50
|
+
}
|
|
51
|
+
const d = this.config.decayRate;
|
|
52
|
+
let sum = 0;
|
|
53
|
+
for (const t of accessTimes) {
|
|
54
|
+
// 경과 시간이 0 이하이면 최소값 사용
|
|
55
|
+
const safeT = Math.max(t, CLAMP_MIN);
|
|
56
|
+
sum += Math.pow(safeT, -d);
|
|
57
|
+
}
|
|
58
|
+
// clamp sum to avoid log(0) or extreme values
|
|
59
|
+
sum = Math.max(sum, CLAMP_MIN);
|
|
60
|
+
sum = Math.min(sum, CLAMP_MAX);
|
|
61
|
+
return Math.log(sum) + this.config.baseLevelConstant;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Spreading Activation: S_i = sum(W_j * S_ji)
|
|
65
|
+
* Fan Effect: W_j = Smax / fan(j)
|
|
66
|
+
*/
|
|
67
|
+
computeSpreading(associations, context) {
|
|
68
|
+
if (associations.length === 0 || context.size === 0) {
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
// Fan 계산: 각 source가 연관된 총 수
|
|
72
|
+
const fanCounts = new Map();
|
|
73
|
+
for (const assoc of associations) {
|
|
74
|
+
fanCounts.set(assoc.source, (fanCounts.get(assoc.source) ?? 0) + 1);
|
|
75
|
+
}
|
|
76
|
+
let totalSpreading = 0;
|
|
77
|
+
for (const assoc of associations) {
|
|
78
|
+
if (!context.has(assoc.source))
|
|
79
|
+
continue;
|
|
80
|
+
const fan = fanCounts.get(assoc.source) ?? 1;
|
|
81
|
+
const W_j = this.config.maxAssociativeStrength / (fan * this.config.fanEffectFactor);
|
|
82
|
+
totalSpreading += W_j * assoc.strength;
|
|
83
|
+
}
|
|
84
|
+
return totalSpreading;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Partial Matching: P_i = -P * (1 - similarity)
|
|
88
|
+
*/
|
|
89
|
+
computePartialMatch(similarity) {
|
|
90
|
+
const clampedSim = Math.max(0, Math.min(1, similarity));
|
|
91
|
+
return -this.config.mismatchPenalty * (1 - clampedSim);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Activation을 1-maxLevel 레벨로 변환
|
|
95
|
+
*
|
|
96
|
+
* 정규화: activation [-2, 5] -> [0, 1]
|
|
97
|
+
* 레벨: ceil(normalized * maxLevel), clamp [1, maxLevel]
|
|
98
|
+
*/
|
|
99
|
+
computeLevel(activation, maxLevel) {
|
|
100
|
+
// 정규화: [-2, 5] 범위를 [0, 1]로
|
|
101
|
+
const normalized = Math.max(0, Math.min(1, (activation + 2) / 7));
|
|
102
|
+
const level = Math.ceil(normalized * maxLevel);
|
|
103
|
+
return Math.min(maxLevel, Math.max(1, level));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=actr-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actr-engine.js","sourceRoot":"","sources":["../../src/proficiency/actr-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,MAAM,OAAO,UAAU;IACb,MAAM,CAAa;IAE3B,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACH,iBAAiB,CACf,WAAqB,EACrB,YAAyD,EACzD,OAAoB,EACpB,UAAkB,EAClB,WAAmB,EAAE;QAErB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;QAEnD,OAAO;YACL,QAAQ;YACR,SAAS;YACT,SAAS;YACT,YAAY;YACZ,KAAK;YACL,cAAc,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB;SACxD,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,WAAqB;QACpC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;QACvC,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAChC,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,uBAAuB;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACrC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,8CAA8C;QAC9C,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE/B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACvD,CAAC;IAED;;;OAGG;IACH,gBAAgB,CACd,YAAyD,EACzD,OAAoB;QAEpB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,4BAA4B;QAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,SAAS;YAEzC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACrF,cAAc,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;QACzC,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,UAAkB;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,UAAkB,EAAE,QAAgB;QAC/C,2BAA2B;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-signal skill practice detection.
|
|
3
|
+
*/
|
|
4
|
+
export interface DetectionResult {
|
|
5
|
+
skillMemoryId: string;
|
|
6
|
+
outcome: 'success' | 'partial' | 'failure';
|
|
7
|
+
difficulty: number;
|
|
8
|
+
contextTags: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface SkillInfo {
|
|
11
|
+
id: string;
|
|
12
|
+
content: string;
|
|
13
|
+
tags: string[];
|
|
14
|
+
embedding?: number[];
|
|
15
|
+
}
|
|
16
|
+
export interface SessionMemory {
|
|
17
|
+
content: string;
|
|
18
|
+
tags: string[];
|
|
19
|
+
embedding?: number[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Jaccard similarity between two tag sets
|
|
23
|
+
*/
|
|
24
|
+
export declare function jaccardSimilarity(setA: string[], setB: string[]): number;
|
|
25
|
+
/**
|
|
26
|
+
* Keyword match ratio
|
|
27
|
+
*/
|
|
28
|
+
export declare function keywordMatchRatio(skillContent: string, sessionTexts: string[]): number;
|
|
29
|
+
/**
|
|
30
|
+
* Cosine similarity between two vectors
|
|
31
|
+
*/
|
|
32
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
33
|
+
/**
|
|
34
|
+
* Multi-signal skill practice detection
|
|
35
|
+
* Weights: embedding 0.5 + tag overlap 0.3 + keyword 0.2
|
|
36
|
+
*/
|
|
37
|
+
export declare function detectSkillPractice(skill: SkillInfo, sessionMemories: SessionMemory[]): DetectionResult | null;
|
|
38
|
+
//# sourceMappingURL=detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../src/proficiency/detection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAOxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAYtF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CASjE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE,aAAa,EAAE,GAC/B,eAAe,GAAG,IAAI,CAiCxB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-signal skill practice detection.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Jaccard similarity between two tag sets
|
|
6
|
+
*/
|
|
7
|
+
export function jaccardSimilarity(setA, setB) {
|
|
8
|
+
if (setA.length === 0 && setB.length === 0)
|
|
9
|
+
return 0;
|
|
10
|
+
const a = new Set(setA.map(s => s.toLowerCase()));
|
|
11
|
+
const b = new Set(setB.map(s => s.toLowerCase()));
|
|
12
|
+
const intersection = new Set([...a].filter(x => b.has(x)));
|
|
13
|
+
const union = new Set([...a, ...b]);
|
|
14
|
+
return union.size > 0 ? intersection.size / union.size : 0;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Keyword match ratio
|
|
18
|
+
*/
|
|
19
|
+
export function keywordMatchRatio(skillContent, sessionTexts) {
|
|
20
|
+
if (!skillContent || sessionTexts.length === 0)
|
|
21
|
+
return 0;
|
|
22
|
+
const keywords = skillContent
|
|
23
|
+
.toLowerCase()
|
|
24
|
+
.split(/[\s,.;:!?\-_/\\]+/)
|
|
25
|
+
.filter(w => w.length > 3)
|
|
26
|
+
.slice(0, 10);
|
|
27
|
+
if (keywords.length === 0)
|
|
28
|
+
return 0;
|
|
29
|
+
const sessionText = sessionTexts.join(' ').toLowerCase();
|
|
30
|
+
const matches = keywords.filter(kw => sessionText.includes(kw));
|
|
31
|
+
return matches.length / keywords.length;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Cosine similarity between two vectors
|
|
35
|
+
*/
|
|
36
|
+
export function cosineSimilarity(a, b) {
|
|
37
|
+
if (a.length !== b.length || a.length === 0)
|
|
38
|
+
return 0;
|
|
39
|
+
let dot = 0, normA = 0, normB = 0;
|
|
40
|
+
for (let i = 0; i < a.length; i++) {
|
|
41
|
+
dot += a[i] * b[i];
|
|
42
|
+
normA += a[i] ** 2;
|
|
43
|
+
normB += b[i] ** 2;
|
|
44
|
+
}
|
|
45
|
+
return normA > 0 && normB > 0 ? dot / (Math.sqrt(normA) * Math.sqrt(normB)) : 0;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Multi-signal skill practice detection
|
|
49
|
+
* Weights: embedding 0.5 + tag overlap 0.3 + keyword 0.2
|
|
50
|
+
*/
|
|
51
|
+
export function detectSkillPractice(skill, sessionMemories) {
|
|
52
|
+
if (sessionMemories.length === 0)
|
|
53
|
+
return null;
|
|
54
|
+
// Signal 1: Embedding similarity
|
|
55
|
+
let embeddingSim = 0;
|
|
56
|
+
if (skill.embedding && skill.embedding.length > 0) {
|
|
57
|
+
for (const mem of sessionMemories) {
|
|
58
|
+
if (mem.embedding && mem.embedding.length === skill.embedding.length) {
|
|
59
|
+
const sim = cosineSimilarity(skill.embedding, mem.embedding);
|
|
60
|
+
embeddingSim = Math.max(embeddingSim, sim);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Signal 2: Tag overlap
|
|
65
|
+
const sessionTags = [...new Set(sessionMemories.flatMap(m => m.tags || []))];
|
|
66
|
+
const tagSim = jaccardSimilarity(skill.tags || [], sessionTags);
|
|
67
|
+
// Signal 3: Keyword matching
|
|
68
|
+
const sessionTexts = sessionMemories.map(m => m.content);
|
|
69
|
+
const keywordSim = keywordMatchRatio(skill.content, sessionTexts);
|
|
70
|
+
// Weighted sum
|
|
71
|
+
const score = embeddingSim * 0.5 + tagSim * 0.3 + keywordSim * 0.2;
|
|
72
|
+
if (score < 0.4)
|
|
73
|
+
return null;
|
|
74
|
+
return {
|
|
75
|
+
skillMemoryId: skill.id,
|
|
76
|
+
outcome: score >= 0.7 ? 'success' : score >= 0.5 ? 'partial' : 'failure',
|
|
77
|
+
difficulty: Math.round((1 - score) * 100) / 100,
|
|
78
|
+
contextTags: sessionTags.slice(0, 10),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detection.js","sourceRoot":"","sources":["../../src/proficiency/detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proficiency Module
|
|
3
|
+
*
|
|
4
|
+
* ACT-R 기반 스킬 숙련도 추적 시스템.
|
|
5
|
+
*/
|
|
6
|
+
export { ACTREngine } from './actr-engine.js';
|
|
7
|
+
export { ProficiencyTracker, computePracticalLevel } from './tracker.js';
|
|
8
|
+
export { jaccardSimilarity, keywordMatchRatio, cosineSimilarity, detectSkillPractice, } from './detection.js';
|
|
9
|
+
export type { DetectionResult, SkillInfo, SessionMemory, } from './detection.js';
|
|
10
|
+
export type { ACTRConfig, ActivationResult, ExperienceEvent, ProficiencyRecord, LevelUpdateResult, SimulationScenario, } from './types.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proficiency/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,eAAe,EACf,SAAS,EACT,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proficiency Module
|
|
3
|
+
*
|
|
4
|
+
* ACT-R 기반 스킬 숙련도 추적 시스템.
|
|
5
|
+
*/
|
|
6
|
+
export { ACTREngine } from './actr-engine.js';
|
|
7
|
+
export { ProficiencyTracker, computePracticalLevel } from './tracker.js';
|
|
8
|
+
export { jaccardSimilarity, keywordMatchRatio, cosineSimilarity, detectSkillPractice, } from './detection.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proficiency/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proficiency Tracker
|
|
3
|
+
*
|
|
4
|
+
* 스킬 숙련도를 추적하고 레벨 계산을 수행하는 오케스트레이터.
|
|
5
|
+
*
|
|
6
|
+
* 레벨 공식 (Hybrid):
|
|
7
|
+
* countScore = log2(1 + N) / log2(151) // Power Law of Practice
|
|
8
|
+
* successScore = 0.3 + successRate * 0.7 // 성공률 반영
|
|
9
|
+
* recencyFactor = exp(-daysSince * 0.02) // ACT-R Forgetting Curve
|
|
10
|
+
* difficultyBonus = avgDifficulty * 0.1 // 난이도 보상
|
|
11
|
+
* level = ceil(clamp(countScore * successScore * recencyFactor + difficultyBonus, 0, 1) * maxLevel)
|
|
12
|
+
*
|
|
13
|
+
* ACT-R 순수 활성화 값은 actrActivation 필드에 별도 저장 (분석용).
|
|
14
|
+
*/
|
|
15
|
+
import type { MemoryDatabase } from '../db/database.js';
|
|
16
|
+
import type { ProficiencyConfig } from '../types/index.js';
|
|
17
|
+
import type { ProficiencyRecord, LevelUpdateResult, SimulationScenario } from './types.js';
|
|
18
|
+
export declare class ProficiencyTracker {
|
|
19
|
+
private db;
|
|
20
|
+
private config;
|
|
21
|
+
private engine;
|
|
22
|
+
constructor(db: MemoryDatabase, config: ProficiencyConfig);
|
|
23
|
+
/**
|
|
24
|
+
* 스킬 연습 기록 + 레벨 재계산
|
|
25
|
+
*/
|
|
26
|
+
recordPractice(skillMemoryId: string, outcome: 'success' | 'partial' | 'failure', difficulty: number, contextTags?: string[], sessionId?: string): LevelUpdateResult;
|
|
27
|
+
/**
|
|
28
|
+
* 레벨 재계산 (Hybrid: Power Law + Forgetting Curve)
|
|
29
|
+
*/
|
|
30
|
+
recalculateLevel(proficiencyId: string): LevelUpdateResult;
|
|
31
|
+
/**
|
|
32
|
+
* 숙련도 레코드 보장: 없으면 생성
|
|
33
|
+
*/
|
|
34
|
+
ensureProficiency(skillMemoryId: string): ProficiencyRecord;
|
|
35
|
+
/**
|
|
36
|
+
* 숙련도 목록 조회
|
|
37
|
+
*/
|
|
38
|
+
listProficiencies(projectPath?: string): ProficiencyRecord[];
|
|
39
|
+
/**
|
|
40
|
+
* 시뮬레이션: 이벤트 시퀀스 → 레벨 진행 반환
|
|
41
|
+
*/
|
|
42
|
+
simulate(scenario: SimulationScenario): number[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 실용적 레벨 공식
|
|
46
|
+
*
|
|
47
|
+
* Power Law of Practice (log 성장) + Forgetting Curve (지수 감쇠) + 난이도 보너스
|
|
48
|
+
*/
|
|
49
|
+
export declare function computePracticalLevel(experienceCount: number, successRate: number, daysSinceLastPractice: number, avgDifficulty: number, maxLevel: number): number;
|
|
50
|
+
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/proficiency/tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAMpB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAa;gBAEf,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB;IAMzD;;OAEG;IACH,cAAc,CACZ,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EAC1C,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAM,EAAO,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,iBAAiB;IAgBpB;;OAEG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB;IAwE1D;;OAEG;IACH,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB;IAiB3D;;OAEG;IACH,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAI5D;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,EAAE;CA2BjD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,qBAAqB,EAAE,MAAM,EAC7B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,CAiBR"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proficiency Tracker
|
|
3
|
+
*
|
|
4
|
+
* 스킬 숙련도를 추적하고 레벨 계산을 수행하는 오케스트레이터.
|
|
5
|
+
*
|
|
6
|
+
* 레벨 공식 (Hybrid):
|
|
7
|
+
* countScore = log2(1 + N) / log2(151) // Power Law of Practice
|
|
8
|
+
* successScore = 0.3 + successRate * 0.7 // 성공률 반영
|
|
9
|
+
* recencyFactor = exp(-daysSince * 0.02) // ACT-R Forgetting Curve
|
|
10
|
+
* difficultyBonus = avgDifficulty * 0.1 // 난이도 보상
|
|
11
|
+
* level = ceil(clamp(countScore * successScore * recencyFactor + difficultyBonus, 0, 1) * maxLevel)
|
|
12
|
+
*
|
|
13
|
+
* ACT-R 순수 활성화 값은 actrActivation 필드에 별도 저장 (분석용).
|
|
14
|
+
*/
|
|
15
|
+
import { ACTREngine } from './actr-engine.js';
|
|
16
|
+
// 150 이벤트에서 countScore ≈ 1.0 도달 (Power Law 스케일링)
|
|
17
|
+
const COUNT_SCALE = Math.log2(151);
|
|
18
|
+
export class ProficiencyTracker {
|
|
19
|
+
db;
|
|
20
|
+
config;
|
|
21
|
+
engine;
|
|
22
|
+
constructor(db, config) {
|
|
23
|
+
this.db = db;
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.engine = new ACTREngine(config.actr);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 스킬 연습 기록 + 레벨 재계산
|
|
29
|
+
*/
|
|
30
|
+
recordPractice(skillMemoryId, outcome, difficulty, contextTags = [], sessionId) {
|
|
31
|
+
const proficiency = this.ensureProficiency(skillMemoryId);
|
|
32
|
+
const now = Date.now() / 1000;
|
|
33
|
+
this.db.addExperienceEvent({
|
|
34
|
+
proficiencyId: proficiency.id,
|
|
35
|
+
timestamp: now,
|
|
36
|
+
outcome,
|
|
37
|
+
difficulty: Math.max(0, Math.min(1, difficulty)),
|
|
38
|
+
contextTags,
|
|
39
|
+
sessionId,
|
|
40
|
+
});
|
|
41
|
+
return this.recalculateLevel(proficiency.id);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 레벨 재계산 (Hybrid: Power Law + Forgetting Curve)
|
|
45
|
+
*/
|
|
46
|
+
recalculateLevel(proficiencyId) {
|
|
47
|
+
const proficiency = this.db.getProficiency(proficiencyId);
|
|
48
|
+
if (!proficiency) {
|
|
49
|
+
return { previousLevel: 1, newLevel: 1, activation: 0, experienceCount: 0, levelChanged: false };
|
|
50
|
+
}
|
|
51
|
+
const events = this.db.getExperienceEvents(proficiencyId, { limit: 1000, order: 'desc' });
|
|
52
|
+
if (events.length === 0) {
|
|
53
|
+
return {
|
|
54
|
+
previousLevel: proficiency.level,
|
|
55
|
+
newLevel: 1,
|
|
56
|
+
activation: 0,
|
|
57
|
+
experienceCount: 0,
|
|
58
|
+
levelChanged: proficiency.level !== 1,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const now = Date.now() / 1000;
|
|
62
|
+
// 성공률
|
|
63
|
+
const successCount = events.filter((e) => e.outcome === 'success').length;
|
|
64
|
+
const partialCount = events.filter((e) => e.outcome === 'partial').length;
|
|
65
|
+
const successRate = (successCount + partialCount * 0.5) / events.length;
|
|
66
|
+
// 난이도
|
|
67
|
+
const avgDifficulty = events.reduce((sum, e) => sum + e.difficulty, 0) / events.length;
|
|
68
|
+
// 최근 연습 이후 경과일
|
|
69
|
+
const daysSinceLastPractice = (now - events[0].timestamp) / 86400;
|
|
70
|
+
// ACT-R 활성화 계산 (분석용 저장)
|
|
71
|
+
const accessTimes = events.map((e) => Math.max(now - e.timestamp, 1.0));
|
|
72
|
+
const tagCounts = new Map();
|
|
73
|
+
for (const event of events) {
|
|
74
|
+
for (const tag of event.contextTags) {
|
|
75
|
+
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const associations = Array.from(tagCounts.entries()).map(([tag, count]) => ({
|
|
79
|
+
source: tag,
|
|
80
|
+
strength: Math.min(count / events.length, 1.0),
|
|
81
|
+
}));
|
|
82
|
+
const recentTags = events.slice(0, 5).flatMap((e) => e.contextTags);
|
|
83
|
+
const actrResult = this.engine.computeActivation(accessTimes, associations, new Set(recentTags), successRate, proficiencyId);
|
|
84
|
+
// 레벨 계산 (Hybrid)
|
|
85
|
+
const newLevel = computePracticalLevel(events.length, successRate, daysSinceLastPractice, avgDifficulty, this.config.maxLevel);
|
|
86
|
+
const previousLevel = proficiency.level;
|
|
87
|
+
const activation = actrResult.total + avgDifficulty * 0.2;
|
|
88
|
+
this.db.updateProficiency(proficiencyId, {
|
|
89
|
+
level: newLevel,
|
|
90
|
+
experienceCount: events.length,
|
|
91
|
+
successRate,
|
|
92
|
+
actrActivation: activation,
|
|
93
|
+
lastPracticedAt: new Date().toISOString(),
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
previousLevel,
|
|
97
|
+
newLevel,
|
|
98
|
+
activation,
|
|
99
|
+
experienceCount: events.length,
|
|
100
|
+
levelChanged: previousLevel !== newLevel,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 숙련도 레코드 보장: 없으면 생성
|
|
105
|
+
*/
|
|
106
|
+
ensureProficiency(skillMemoryId) {
|
|
107
|
+
const existing = this.db.getProficiencyBySkill(skillMemoryId);
|
|
108
|
+
if (existing)
|
|
109
|
+
return existing;
|
|
110
|
+
const skillMemory = this.db.getMemory(skillMemoryId);
|
|
111
|
+
const skillName = skillMemory
|
|
112
|
+
? skillMemory.content.split('\n')[0].replace('[Skill] ', '').slice(0, 100)
|
|
113
|
+
: `skill-${skillMemoryId.slice(0, 8)}`;
|
|
114
|
+
const projectPath = skillMemory?.projectPath;
|
|
115
|
+
return this.db.createProficiency({
|
|
116
|
+
skillMemoryId,
|
|
117
|
+
skillName,
|
|
118
|
+
projectPath,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 숙련도 목록 조회
|
|
123
|
+
*/
|
|
124
|
+
listProficiencies(projectPath) {
|
|
125
|
+
return this.db.listProficiencies({ projectPath });
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 시뮬레이션: 이벤트 시퀀스 → 레벨 진행 반환
|
|
129
|
+
*/
|
|
130
|
+
simulate(scenario) {
|
|
131
|
+
const levels = [];
|
|
132
|
+
let successCount = 0;
|
|
133
|
+
let totalDifficulty = 0;
|
|
134
|
+
for (let i = 0; i < scenario.eventCount; i++) {
|
|
135
|
+
const isSuccess = Math.random() < scenario.successRate;
|
|
136
|
+
if (isSuccess)
|
|
137
|
+
successCount++;
|
|
138
|
+
const totalCount = i + 1;
|
|
139
|
+
const successRate = successCount / totalCount;
|
|
140
|
+
const [minD, maxD] = scenario.difficultyRange;
|
|
141
|
+
const difficulty = minD + (maxD - minD) * (i / Math.max(scenario.eventCount - 1, 1));
|
|
142
|
+
totalDifficulty += difficulty;
|
|
143
|
+
const avgDifficulty = totalDifficulty / totalCount;
|
|
144
|
+
// 최근 연습 이후 경과일: 시뮬레이션에서는 0 (방금 연습)
|
|
145
|
+
const daysSinceLastPractice = 0;
|
|
146
|
+
const level = computePracticalLevel(totalCount, successRate, daysSinceLastPractice, avgDifficulty, this.config.maxLevel);
|
|
147
|
+
levels.push(level);
|
|
148
|
+
}
|
|
149
|
+
return levels;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 실용적 레벨 공식
|
|
154
|
+
*
|
|
155
|
+
* Power Law of Practice (log 성장) + Forgetting Curve (지수 감쇠) + 난이도 보너스
|
|
156
|
+
*/
|
|
157
|
+
export function computePracticalLevel(experienceCount, successRate, daysSinceLastPractice, avgDifficulty, maxLevel) {
|
|
158
|
+
// 1. 연습 횟수 (Power Law - 대수적 성장)
|
|
159
|
+
const countScore = Math.min(1.0, Math.log2(1 + experienceCount) / COUNT_SCALE);
|
|
160
|
+
// 2. 성공률 (0% → 0.3, 100% → 1.0)
|
|
161
|
+
const successScore = 0.3 + successRate * 0.7;
|
|
162
|
+
// 3. 망각 곡선 (ACT-R inspired exponential decay)
|
|
163
|
+
const recencyFactor = Math.exp(-Math.max(0, daysSinceLastPractice) * 0.02);
|
|
164
|
+
// 4. 난이도 보너스 (높은 난이도 연습에 보상)
|
|
165
|
+
const difficultyBonus = avgDifficulty * 0.1;
|
|
166
|
+
// 합산
|
|
167
|
+
const combined = Math.max(0, Math.min(1, countScore * successScore * recencyFactor + difficultyBonus));
|
|
168
|
+
return Math.min(maxLevel, Math.max(1, Math.ceil(combined * maxLevel)));
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/proficiency/tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proficiency Types
|
|
3
|
+
*
|
|
4
|
+
* ACT-R 인지 아키텍처 기반 숙련도 추적 타입 정의.
|
|
5
|
+
* Power Law of Practice + Forgetting Curve를 활용한 레벨 1-10 자동 계산.
|
|
6
|
+
*/
|
|
7
|
+
export interface ACTRConfig {
|
|
8
|
+
decayRate: number;
|
|
9
|
+
baseLevelConstant: number;
|
|
10
|
+
maxAssociativeStrength: number;
|
|
11
|
+
fanEffectFactor: number;
|
|
12
|
+
mismatchPenalty: number;
|
|
13
|
+
retrievalThreshold: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ActivationResult {
|
|
16
|
+
memoryId: string;
|
|
17
|
+
baseLevel: number;
|
|
18
|
+
spreading: number;
|
|
19
|
+
partialMatch: number;
|
|
20
|
+
total: number;
|
|
21
|
+
shouldRetrieve: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ExperienceEvent {
|
|
24
|
+
id: string;
|
|
25
|
+
proficiencyId: string;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
outcome: 'success' | 'partial' | 'failure';
|
|
28
|
+
difficulty: number;
|
|
29
|
+
contextTags: string[];
|
|
30
|
+
sessionId?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ProficiencyRecord {
|
|
33
|
+
id: string;
|
|
34
|
+
skillMemoryId: string;
|
|
35
|
+
skillName: string;
|
|
36
|
+
level: number;
|
|
37
|
+
experienceCount: number;
|
|
38
|
+
successRate: number;
|
|
39
|
+
actrActivation: number;
|
|
40
|
+
lastPracticedAt: string;
|
|
41
|
+
createdAt: string;
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
projectPath?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface LevelUpdateResult {
|
|
46
|
+
previousLevel: number;
|
|
47
|
+
newLevel: number;
|
|
48
|
+
activation: number;
|
|
49
|
+
experienceCount: number;
|
|
50
|
+
levelChanged: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface SimulationScenario {
|
|
53
|
+
eventCount: number;
|
|
54
|
+
successRate: number;
|
|
55
|
+
difficultyRange: [number, number];
|
|
56
|
+
timeSpanDays: number;
|
|
57
|
+
expectedMinLevel: number;
|
|
58
|
+
expectedMaxLevel: number;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/proficiency/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/proficiency/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|