@nahisaho/katashiro-feedback 0.1.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/collector/feedback-collector.d.ts +77 -0
- package/dist/collector/feedback-collector.d.ts.map +1 -0
- package/dist/collector/feedback-collector.js +119 -0
- package/dist/collector/feedback-collector.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +19 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +5 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/learning/learning-engine.d.ts +96 -0
- package/dist/learning/learning-engine.d.ts.map +1 -0
- package/dist/learning/learning-engine.js +187 -0
- package/dist/learning/learning-engine.js.map +1 -0
- package/dist/patterns/pattern-detector.d.ts +88 -0
- package/dist/patterns/pattern-detector.d.ts.map +1 -0
- package/dist/patterns/pattern-detector.js +211 -0
- package/dist/patterns/pattern-detector.js.map +1 -0
- package/dist/recommender/adaptive-recommender.d.ts +84 -0
- package/dist/recommender/adaptive-recommender.d.ts.map +1 -0
- package/dist/recommender/adaptive-recommender.js +155 -0
- package/dist/recommender/adaptive-recommender.js.map +1 -0
- package/dist/storage/feedback-storage.d.ts +87 -0
- package/dist/storage/feedback-storage.d.ts.map +1 -0
- package/dist/storage/feedback-storage.js +143 -0
- package/dist/storage/feedback-storage.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-detector.d.ts","sourceRoot":"","sources":["../../src/patterns/pattern-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,EAAE,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAK;IAE3B;;;;;OAKG;IACH,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC;IAuB7D;;;;;OAKG;IACH,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC;IA+BtE;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC;IAmC7D;;;;;;OAMG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAsBxE;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAMhB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAmC/B"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatternDetector - パターン検出
|
|
3
|
+
*
|
|
4
|
+
* フィードバックからコードパターンを検出・分類
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-053
|
|
8
|
+
*/
|
|
9
|
+
import { ok, err } from '@nahisaho/katashiro-core';
|
|
10
|
+
/**
|
|
11
|
+
* PatternDetector
|
|
12
|
+
*
|
|
13
|
+
* Detects patterns from feedback data
|
|
14
|
+
*/
|
|
15
|
+
export class PatternDetector {
|
|
16
|
+
patternCounter = 0;
|
|
17
|
+
/**
|
|
18
|
+
* Detect patterns from feedback
|
|
19
|
+
*
|
|
20
|
+
* @param feedbacks - Feedbacks to analyze
|
|
21
|
+
* @returns Detection result
|
|
22
|
+
*/
|
|
23
|
+
detect(feedbacks) {
|
|
24
|
+
try {
|
|
25
|
+
const patterns = [];
|
|
26
|
+
const contentGroups = this.groupByContent(feedbacks);
|
|
27
|
+
for (const [_key, group] of contentGroups) {
|
|
28
|
+
if (group.length >= 2) {
|
|
29
|
+
// Multiple similar feedbacks - likely a pattern
|
|
30
|
+
const pattern = this.createPatternFromGroup(group);
|
|
31
|
+
patterns.push(pattern);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return ok({
|
|
35
|
+
patterns,
|
|
36
|
+
feedbackAnalyzed: feedbacks.length,
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Detect patterns grouped by context
|
|
46
|
+
*
|
|
47
|
+
* @param feedbacks - Feedbacks to analyze
|
|
48
|
+
* @returns Context-grouped patterns
|
|
49
|
+
*/
|
|
50
|
+
detectByContext(feedbacks) {
|
|
51
|
+
try {
|
|
52
|
+
const contextGroups = new Map();
|
|
53
|
+
// Group by context
|
|
54
|
+
for (const feedback of feedbacks) {
|
|
55
|
+
const contextKey = feedback.context
|
|
56
|
+
? JSON.stringify(feedback.context)
|
|
57
|
+
: 'default';
|
|
58
|
+
if (!contextGroups.has(contextKey)) {
|
|
59
|
+
contextGroups.set(contextKey, []);
|
|
60
|
+
}
|
|
61
|
+
contextGroups.get(contextKey).push(feedback);
|
|
62
|
+
}
|
|
63
|
+
// Detect patterns for each context
|
|
64
|
+
const result = {};
|
|
65
|
+
for (const [context, group] of contextGroups) {
|
|
66
|
+
const detected = this.detect(group);
|
|
67
|
+
if (detected._tag === 'Ok') {
|
|
68
|
+
result[context] = detected.value.patterns;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return ok(result);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Analyze feedback patterns
|
|
79
|
+
*
|
|
80
|
+
* @param feedbacks - Feedbacks to analyze
|
|
81
|
+
* @returns Analysis result
|
|
82
|
+
*/
|
|
83
|
+
analyze(feedbacks) {
|
|
84
|
+
try {
|
|
85
|
+
const total = feedbacks.length;
|
|
86
|
+
if (total === 0) {
|
|
87
|
+
return ok({
|
|
88
|
+
totalFeedback: 0,
|
|
89
|
+
acceptRate: 0,
|
|
90
|
+
rejectRate: 0,
|
|
91
|
+
modifyRate: 0,
|
|
92
|
+
topPatterns: [],
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const acceptCount = feedbacks.filter((f) => f.action === 'accept').length;
|
|
96
|
+
const rejectCount = feedbacks.filter((f) => f.action === 'reject').length;
|
|
97
|
+
const modifyCount = feedbacks.filter((f) => f.action === 'modify').length;
|
|
98
|
+
// Get top patterns
|
|
99
|
+
const detectResult = this.detect(feedbacks);
|
|
100
|
+
const topPatterns = detectResult._tag === 'Ok'
|
|
101
|
+
? detectResult.value.patterns.slice(0, 5)
|
|
102
|
+
: [];
|
|
103
|
+
return ok({
|
|
104
|
+
totalFeedback: total,
|
|
105
|
+
acceptRate: acceptCount / total,
|
|
106
|
+
rejectRate: rejectCount / total,
|
|
107
|
+
modifyRate: modifyCount / total,
|
|
108
|
+
topPatterns,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Calculate similarity between two contents
|
|
117
|
+
*
|
|
118
|
+
* @param content1 - First content
|
|
119
|
+
* @param content2 - Second content
|
|
120
|
+
* @returns Similarity score (0-1)
|
|
121
|
+
*/
|
|
122
|
+
getSimilarity(content1, content2) {
|
|
123
|
+
try {
|
|
124
|
+
// Simple token-based similarity
|
|
125
|
+
const tokens1 = this.tokenize(content1);
|
|
126
|
+
const tokens2 = this.tokenize(content2);
|
|
127
|
+
const set1 = new Set(tokens1);
|
|
128
|
+
const set2 = new Set(tokens2);
|
|
129
|
+
const intersection = new Set([...set1].filter((t) => set2.has(t)));
|
|
130
|
+
const union = new Set([...set1, ...set2]);
|
|
131
|
+
const similarity = union.size > 0
|
|
132
|
+
? intersection.size / union.size
|
|
133
|
+
: 0;
|
|
134
|
+
return ok(similarity);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Group feedbacks by content similarity
|
|
142
|
+
*/
|
|
143
|
+
groupByContent(feedbacks) {
|
|
144
|
+
const groups = new Map();
|
|
145
|
+
for (const feedback of feedbacks) {
|
|
146
|
+
// Normalize content for grouping
|
|
147
|
+
const normalizedKey = this.normalizeContent(feedback.originalContent);
|
|
148
|
+
if (!groups.has(normalizedKey)) {
|
|
149
|
+
groups.set(normalizedKey, []);
|
|
150
|
+
}
|
|
151
|
+
groups.get(normalizedKey).push(feedback);
|
|
152
|
+
}
|
|
153
|
+
return groups;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Normalize content for comparison
|
|
157
|
+
*/
|
|
158
|
+
normalizeContent(content) {
|
|
159
|
+
// Remove whitespace variations and normalize
|
|
160
|
+
return content
|
|
161
|
+
.replace(/\s+/g, ' ')
|
|
162
|
+
.replace(/\b(var|let|const)\b/g, 'VAR')
|
|
163
|
+
.replace(/\b[a-z_][a-z0-9_]*\b/gi, 'ID')
|
|
164
|
+
.trim();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Tokenize content
|
|
168
|
+
*/
|
|
169
|
+
tokenize(content) {
|
|
170
|
+
return content
|
|
171
|
+
.split(/[\s{}()[\];,.<>:=+\-*/!?&|^~]+/)
|
|
172
|
+
.filter((t) => t.length > 0);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create pattern from group of feedbacks
|
|
176
|
+
*/
|
|
177
|
+
createPatternFromGroup(group) {
|
|
178
|
+
const id = `PAT-${++this.patternCounter}`;
|
|
179
|
+
const now = new Date().toISOString();
|
|
180
|
+
// Determine type by most common action
|
|
181
|
+
const actions = group.map((f) => f.action);
|
|
182
|
+
const acceptCount = actions.filter((a) => a === 'accept').length;
|
|
183
|
+
const rejectCount = actions.filter((a) => a === 'reject').length;
|
|
184
|
+
const modifyCount = actions.filter((a) => a === 'modify').length;
|
|
185
|
+
let type;
|
|
186
|
+
if (acceptCount >= rejectCount && acceptCount >= modifyCount) {
|
|
187
|
+
type = 'success';
|
|
188
|
+
}
|
|
189
|
+
else if (rejectCount > acceptCount && rejectCount > modifyCount) {
|
|
190
|
+
type = 'error';
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
type = 'modification';
|
|
194
|
+
}
|
|
195
|
+
// Calculate confidence based on consistency
|
|
196
|
+
const maxCount = Math.max(acceptCount, rejectCount, modifyCount);
|
|
197
|
+
const confidence = maxCount / group.length;
|
|
198
|
+
return {
|
|
199
|
+
id,
|
|
200
|
+
type,
|
|
201
|
+
name: `Detected pattern ${id}`,
|
|
202
|
+
description: `Pattern detected from ${group.length} similar feedbacks`,
|
|
203
|
+
confidence,
|
|
204
|
+
occurrences: group.length,
|
|
205
|
+
template: group[0]?.originalContent,
|
|
206
|
+
createdAt: now,
|
|
207
|
+
updatedAt: now,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=pattern-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-detector.js","sourceRoot":"","sources":["../../src/patterns/pattern-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdaptiveRecommender - 適応的推奨
|
|
3
|
+
*
|
|
4
|
+
* パターンの使用履歴から学習し推奨を改善
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-054
|
|
8
|
+
*/
|
|
9
|
+
import { type Result } from '@nahisaho/katashiro-core';
|
|
10
|
+
import type { Pattern, PatternType } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Recommendation options
|
|
13
|
+
*/
|
|
14
|
+
export interface RecommendOptions {
|
|
15
|
+
query: string;
|
|
16
|
+
type?: PatternType;
|
|
17
|
+
limit?: number;
|
|
18
|
+
minConfidence?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Recommender statistics
|
|
22
|
+
*/
|
|
23
|
+
export interface RecommenderStats {
|
|
24
|
+
totalPatterns: number;
|
|
25
|
+
totalUsages: number;
|
|
26
|
+
averageConfidence: number;
|
|
27
|
+
topPatterns: Pattern[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* AdaptiveRecommender
|
|
31
|
+
*
|
|
32
|
+
* Recommends patterns based on usage and learning
|
|
33
|
+
*/
|
|
34
|
+
export declare class AdaptiveRecommender {
|
|
35
|
+
private patterns;
|
|
36
|
+
private usageCount;
|
|
37
|
+
/**
|
|
38
|
+
* Add pattern to recommender
|
|
39
|
+
*
|
|
40
|
+
* @param pattern - Pattern to add
|
|
41
|
+
* @returns Result
|
|
42
|
+
*/
|
|
43
|
+
addPattern(pattern: Pattern): Result<void, Error>;
|
|
44
|
+
/**
|
|
45
|
+
* Recommend patterns based on options
|
|
46
|
+
*
|
|
47
|
+
* @param options - Recommendation options
|
|
48
|
+
* @returns Recommended patterns
|
|
49
|
+
*/
|
|
50
|
+
recommend(options: RecommendOptions): Result<Pattern[], Error>;
|
|
51
|
+
/**
|
|
52
|
+
* Record pattern usage
|
|
53
|
+
*
|
|
54
|
+
* @param patternId - Pattern ID
|
|
55
|
+
* @param success - Whether usage was successful
|
|
56
|
+
* @returns Result
|
|
57
|
+
*/
|
|
58
|
+
recordUsage(patternId: string, success: boolean): Result<void, Error>;
|
|
59
|
+
/**
|
|
60
|
+
* Get pattern by ID
|
|
61
|
+
*
|
|
62
|
+
* @param patternId - Pattern ID
|
|
63
|
+
* @returns Pattern or null
|
|
64
|
+
*/
|
|
65
|
+
getPattern(patternId: string): Result<Pattern | null, Error>;
|
|
66
|
+
/**
|
|
67
|
+
* Get recommender statistics
|
|
68
|
+
*
|
|
69
|
+
* @returns Statistics
|
|
70
|
+
*/
|
|
71
|
+
getStats(): Result<RecommenderStats, Error>;
|
|
72
|
+
/**
|
|
73
|
+
* Remove pattern
|
|
74
|
+
*
|
|
75
|
+
* @param patternId - Pattern ID
|
|
76
|
+
* @returns Whether removed
|
|
77
|
+
*/
|
|
78
|
+
removePattern(patternId: string): Result<boolean, Error>;
|
|
79
|
+
/**
|
|
80
|
+
* Clear all patterns
|
|
81
|
+
*/
|
|
82
|
+
clear(): void;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=adaptive-recommender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptive-recommender.d.ts","sourceRoot":"","sources":["../../src/recommender/adaptive-recommender.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,OAAO,EAAE,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,UAAU,CAAK;IAEvB;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IASjD;;;;;OAKG;IACH,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC;IA+B9D;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IA2BrE;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,KAAK,CAAC;IAQ5D;;;;OAIG;IACH,QAAQ,IAAI,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC;IAqB3C;;;;;OAKG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;IAQxD;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdaptiveRecommender - 適応的推奨
|
|
3
|
+
*
|
|
4
|
+
* パターンの使用履歴から学習し推奨を改善
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-054
|
|
8
|
+
*/
|
|
9
|
+
import { ok, err } from '@nahisaho/katashiro-core';
|
|
10
|
+
/**
|
|
11
|
+
* AdaptiveRecommender
|
|
12
|
+
*
|
|
13
|
+
* Recommends patterns based on usage and learning
|
|
14
|
+
*/
|
|
15
|
+
export class AdaptiveRecommender {
|
|
16
|
+
patterns = new Map();
|
|
17
|
+
usageCount = 0;
|
|
18
|
+
/**
|
|
19
|
+
* Add pattern to recommender
|
|
20
|
+
*
|
|
21
|
+
* @param pattern - Pattern to add
|
|
22
|
+
* @returns Result
|
|
23
|
+
*/
|
|
24
|
+
addPattern(pattern) {
|
|
25
|
+
try {
|
|
26
|
+
this.patterns.set(pattern.id, pattern);
|
|
27
|
+
return ok(undefined);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Recommend patterns based on options
|
|
35
|
+
*
|
|
36
|
+
* @param options - Recommendation options
|
|
37
|
+
* @returns Recommended patterns
|
|
38
|
+
*/
|
|
39
|
+
recommend(options) {
|
|
40
|
+
try {
|
|
41
|
+
let patterns = Array.from(this.patterns.values());
|
|
42
|
+
// Filter by type
|
|
43
|
+
if (options.type) {
|
|
44
|
+
patterns = patterns.filter((p) => p.type === options.type);
|
|
45
|
+
}
|
|
46
|
+
// Filter by minimum confidence
|
|
47
|
+
if (options.minConfidence !== undefined) {
|
|
48
|
+
patterns = patterns.filter((p) => p.confidence >= options.minConfidence);
|
|
49
|
+
}
|
|
50
|
+
// Sort by score (confidence * occurrences)
|
|
51
|
+
patterns.sort((a, b) => {
|
|
52
|
+
const scoreA = a.confidence * Math.log(a.occurrences + 1);
|
|
53
|
+
const scoreB = b.confidence * Math.log(b.occurrences + 1);
|
|
54
|
+
return scoreB - scoreA;
|
|
55
|
+
});
|
|
56
|
+
// Apply limit
|
|
57
|
+
const limit = options.limit ?? 10;
|
|
58
|
+
patterns = patterns.slice(0, limit);
|
|
59
|
+
return ok(patterns);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Record pattern usage
|
|
67
|
+
*
|
|
68
|
+
* @param patternId - Pattern ID
|
|
69
|
+
* @param success - Whether usage was successful
|
|
70
|
+
* @returns Result
|
|
71
|
+
*/
|
|
72
|
+
recordUsage(patternId, success) {
|
|
73
|
+
try {
|
|
74
|
+
const pattern = this.patterns.get(patternId);
|
|
75
|
+
if (!pattern) {
|
|
76
|
+
return err(new Error(`Pattern not found: ${patternId}`));
|
|
77
|
+
}
|
|
78
|
+
this.usageCount++;
|
|
79
|
+
// Adjust confidence based on success/failure
|
|
80
|
+
const adjustment = success ? 0.05 : -0.05;
|
|
81
|
+
const newConfidence = Math.max(0, Math.min(1, pattern.confidence + adjustment));
|
|
82
|
+
const updated = {
|
|
83
|
+
...pattern,
|
|
84
|
+
confidence: newConfidence,
|
|
85
|
+
occurrences: pattern.occurrences + 1,
|
|
86
|
+
updatedAt: new Date().toISOString(),
|
|
87
|
+
};
|
|
88
|
+
this.patterns.set(patternId, updated);
|
|
89
|
+
return ok(undefined);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get pattern by ID
|
|
97
|
+
*
|
|
98
|
+
* @param patternId - Pattern ID
|
|
99
|
+
* @returns Pattern or null
|
|
100
|
+
*/
|
|
101
|
+
getPattern(patternId) {
|
|
102
|
+
try {
|
|
103
|
+
return ok(this.patterns.get(patternId) ?? null);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get recommender statistics
|
|
111
|
+
*
|
|
112
|
+
* @returns Statistics
|
|
113
|
+
*/
|
|
114
|
+
getStats() {
|
|
115
|
+
try {
|
|
116
|
+
const patterns = Array.from(this.patterns.values());
|
|
117
|
+
const totalConfidence = patterns.reduce((sum, p) => sum + p.confidence, 0);
|
|
118
|
+
// Get top patterns
|
|
119
|
+
const topPatterns = [...patterns]
|
|
120
|
+
.sort((a, b) => b.occurrences - a.occurrences)
|
|
121
|
+
.slice(0, 5);
|
|
122
|
+
return ok({
|
|
123
|
+
totalPatterns: patterns.length,
|
|
124
|
+
totalUsages: this.usageCount,
|
|
125
|
+
averageConfidence: patterns.length > 0 ? totalConfidence / patterns.length : 0,
|
|
126
|
+
topPatterns,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Remove pattern
|
|
135
|
+
*
|
|
136
|
+
* @param patternId - Pattern ID
|
|
137
|
+
* @returns Whether removed
|
|
138
|
+
*/
|
|
139
|
+
removePattern(patternId) {
|
|
140
|
+
try {
|
|
141
|
+
return ok(this.patterns.delete(patternId));
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Clear all patterns
|
|
149
|
+
*/
|
|
150
|
+
clear() {
|
|
151
|
+
this.patterns.clear();
|
|
152
|
+
this.usageCount = 0;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=adaptive-recommender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptive-recommender.js","sourceRoot":"","sources":["../../src/recommender/adaptive-recommender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedbackStorage - フィードバックの永続化
|
|
3
|
+
*
|
|
4
|
+
* フィードバックの保存・読み込み・エクスポート
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-051
|
|
8
|
+
*/
|
|
9
|
+
import { type Result } from '@nahisaho/katashiro-core';
|
|
10
|
+
import type { Feedback, FeedbackAction } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* List options
|
|
13
|
+
*/
|
|
14
|
+
export interface ListOptions {
|
|
15
|
+
offset?: number;
|
|
16
|
+
limit?: number;
|
|
17
|
+
action?: FeedbackAction;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Export format
|
|
21
|
+
*/
|
|
22
|
+
export interface FeedbackExport {
|
|
23
|
+
version: string;
|
|
24
|
+
feedbacks: Feedback[];
|
|
25
|
+
exportedAt: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* FeedbackStorage
|
|
29
|
+
*
|
|
30
|
+
* Manages feedback persistence
|
|
31
|
+
*/
|
|
32
|
+
export declare class FeedbackStorage {
|
|
33
|
+
private feedbacks;
|
|
34
|
+
private readonly version;
|
|
35
|
+
/**
|
|
36
|
+
* Save feedback
|
|
37
|
+
*
|
|
38
|
+
* @param feedback - Feedback to save
|
|
39
|
+
* @returns Saved feedback
|
|
40
|
+
*/
|
|
41
|
+
save(feedback: Feedback): Result<Feedback, Error>;
|
|
42
|
+
/**
|
|
43
|
+
* Load feedback by ID
|
|
44
|
+
*
|
|
45
|
+
* @param id - Feedback ID
|
|
46
|
+
* @returns Feedback or null
|
|
47
|
+
*/
|
|
48
|
+
load(id: string): Result<Feedback | null, Error>;
|
|
49
|
+
/**
|
|
50
|
+
* Delete feedback
|
|
51
|
+
*
|
|
52
|
+
* @param id - Feedback ID
|
|
53
|
+
* @returns Whether deleted
|
|
54
|
+
*/
|
|
55
|
+
delete(id: string): Result<boolean, Error>;
|
|
56
|
+
/**
|
|
57
|
+
* List feedback with options
|
|
58
|
+
*
|
|
59
|
+
* @param options - List options
|
|
60
|
+
* @returns Feedback list
|
|
61
|
+
*/
|
|
62
|
+
list(options?: ListOptions): Result<Feedback[], Error>;
|
|
63
|
+
/**
|
|
64
|
+
* Export to JSON
|
|
65
|
+
*
|
|
66
|
+
* @returns JSON string
|
|
67
|
+
*/
|
|
68
|
+
exportToJSON(): Result<string, Error>;
|
|
69
|
+
/**
|
|
70
|
+
* Import from JSON
|
|
71
|
+
*
|
|
72
|
+
* @param json - JSON string
|
|
73
|
+
* @returns Number of imported feedbacks
|
|
74
|
+
*/
|
|
75
|
+
importFromJSON(json: string): Result<number, Error>;
|
|
76
|
+
/**
|
|
77
|
+
* Get total count
|
|
78
|
+
*
|
|
79
|
+
* @returns Count
|
|
80
|
+
*/
|
|
81
|
+
count(): Result<number, Error>;
|
|
82
|
+
/**
|
|
83
|
+
* Clear all feedback
|
|
84
|
+
*/
|
|
85
|
+
clear(): void;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=feedback-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-storage.d.ts","sourceRoot":"","sources":["../../src/storage/feedback-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IAEnC;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC;IASjD;;;;;OAKG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC;IAQhD;;;;;OAKG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;IAQ1C;;;;;OAKG;IACH,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;IAoB1D;;;;OAIG;IACH,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAarC;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAkBnD;;;;OAIG;IACH,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAQ9B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|