@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,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedbackCollector - ユーザーフィードバック収集
|
|
3
|
+
*
|
|
4
|
+
* accept/reject/modifyアクションでフィードバックを収集
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-050
|
|
8
|
+
*/
|
|
9
|
+
import { type Result } from '@nahisaho/katashiro-core';
|
|
10
|
+
import type { Feedback, FeedbackAction } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Feedback input for collection
|
|
13
|
+
*/
|
|
14
|
+
export interface FeedbackInput {
|
|
15
|
+
action: FeedbackAction;
|
|
16
|
+
originalContent: string;
|
|
17
|
+
modifiedContent?: string;
|
|
18
|
+
rating?: number;
|
|
19
|
+
context?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Feedback statistics
|
|
23
|
+
*/
|
|
24
|
+
export interface FeedbackStats {
|
|
25
|
+
total: number;
|
|
26
|
+
acceptCount: number;
|
|
27
|
+
rejectCount: number;
|
|
28
|
+
modifyCount: number;
|
|
29
|
+
averageRating: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* FeedbackCollector
|
|
33
|
+
*
|
|
34
|
+
* Collects and manages user feedback for learning
|
|
35
|
+
*/
|
|
36
|
+
export declare class FeedbackCollector {
|
|
37
|
+
private feedbacks;
|
|
38
|
+
private counter;
|
|
39
|
+
/**
|
|
40
|
+
* Collect feedback
|
|
41
|
+
*
|
|
42
|
+
* @param input - Feedback input
|
|
43
|
+
* @returns Collected feedback
|
|
44
|
+
*/
|
|
45
|
+
collect(input: FeedbackInput): Result<Feedback, Error>;
|
|
46
|
+
/**
|
|
47
|
+
* Get all feedback
|
|
48
|
+
*
|
|
49
|
+
* @returns All collected feedback
|
|
50
|
+
*/
|
|
51
|
+
getAll(): Result<Feedback[], Error>;
|
|
52
|
+
/**
|
|
53
|
+
* Get feedback by ID
|
|
54
|
+
*
|
|
55
|
+
* @param id - Feedback ID
|
|
56
|
+
* @returns Feedback or null
|
|
57
|
+
*/
|
|
58
|
+
getById(id: string): Result<Feedback | null, Error>;
|
|
59
|
+
/**
|
|
60
|
+
* Get feedback by action type
|
|
61
|
+
*
|
|
62
|
+
* @param action - Action type
|
|
63
|
+
* @returns Filtered feedback
|
|
64
|
+
*/
|
|
65
|
+
getByAction(action: FeedbackAction): Result<Feedback[], Error>;
|
|
66
|
+
/**
|
|
67
|
+
* Get feedback statistics
|
|
68
|
+
*
|
|
69
|
+
* @returns Statistics
|
|
70
|
+
*/
|
|
71
|
+
getStats(): Result<FeedbackStats, Error>;
|
|
72
|
+
/**
|
|
73
|
+
* Clear all feedback
|
|
74
|
+
*/
|
|
75
|
+
clear(): void;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=feedback-collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-collector.d.ts","sourceRoot":"","sources":["../../src/collector/feedback-collector.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,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,OAAO,CAAK;IAEpB;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC;IAyBtD;;;;OAIG;IACH,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;IAQnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC;IAQnD;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;IAW9D;;;;OAIG;IACH,QAAQ,IAAI,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC;IAkBxC;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FeedbackCollector - ユーザーフィードバック収集
|
|
3
|
+
*
|
|
4
|
+
* accept/reject/modifyアクションでフィードバックを収集
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-050
|
|
8
|
+
*/
|
|
9
|
+
import { ok, err } from '@nahisaho/katashiro-core';
|
|
10
|
+
/**
|
|
11
|
+
* FeedbackCollector
|
|
12
|
+
*
|
|
13
|
+
* Collects and manages user feedback for learning
|
|
14
|
+
*/
|
|
15
|
+
export class FeedbackCollector {
|
|
16
|
+
feedbacks = new Map();
|
|
17
|
+
counter = 0;
|
|
18
|
+
/**
|
|
19
|
+
* Collect feedback
|
|
20
|
+
*
|
|
21
|
+
* @param input - Feedback input
|
|
22
|
+
* @returns Collected feedback
|
|
23
|
+
*/
|
|
24
|
+
collect(input) {
|
|
25
|
+
try {
|
|
26
|
+
// Validate rating if provided
|
|
27
|
+
if (input.rating !== undefined && (input.rating < 1 || input.rating > 5)) {
|
|
28
|
+
return err(new Error('Rating must be between 1 and 5'));
|
|
29
|
+
}
|
|
30
|
+
const id = `FB-${++this.counter}`;
|
|
31
|
+
const feedback = {
|
|
32
|
+
id,
|
|
33
|
+
action: input.action,
|
|
34
|
+
originalContent: input.originalContent,
|
|
35
|
+
modifiedContent: input.modifiedContent,
|
|
36
|
+
rating: input.rating,
|
|
37
|
+
context: input.context,
|
|
38
|
+
createdAt: new Date().toISOString(),
|
|
39
|
+
};
|
|
40
|
+
this.feedbacks.set(id, feedback);
|
|
41
|
+
return ok(feedback);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get all feedback
|
|
49
|
+
*
|
|
50
|
+
* @returns All collected feedback
|
|
51
|
+
*/
|
|
52
|
+
getAll() {
|
|
53
|
+
try {
|
|
54
|
+
return ok(Array.from(this.feedbacks.values()));
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get feedback by ID
|
|
62
|
+
*
|
|
63
|
+
* @param id - Feedback ID
|
|
64
|
+
* @returns Feedback or null
|
|
65
|
+
*/
|
|
66
|
+
getById(id) {
|
|
67
|
+
try {
|
|
68
|
+
return ok(this.feedbacks.get(id) ?? null);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get feedback by action type
|
|
76
|
+
*
|
|
77
|
+
* @param action - Action type
|
|
78
|
+
* @returns Filtered feedback
|
|
79
|
+
*/
|
|
80
|
+
getByAction(action) {
|
|
81
|
+
try {
|
|
82
|
+
const filtered = Array.from(this.feedbacks.values()).filter((f) => f.action === action);
|
|
83
|
+
return ok(filtered);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get feedback statistics
|
|
91
|
+
*
|
|
92
|
+
* @returns Statistics
|
|
93
|
+
*/
|
|
94
|
+
getStats() {
|
|
95
|
+
try {
|
|
96
|
+
const all = Array.from(this.feedbacks.values());
|
|
97
|
+
const withRating = all.filter((f) => f.rating !== undefined);
|
|
98
|
+
const totalRating = withRating.reduce((sum, f) => sum + (f.rating ?? 0), 0);
|
|
99
|
+
return ok({
|
|
100
|
+
total: all.length,
|
|
101
|
+
acceptCount: all.filter((f) => f.action === 'accept').length,
|
|
102
|
+
rejectCount: all.filter((f) => f.action === 'reject').length,
|
|
103
|
+
modifyCount: all.filter((f) => f.action === 'modify').length,
|
|
104
|
+
averageRating: withRating.length > 0 ? totalRating / withRating.length : 0,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Clear all feedback
|
|
113
|
+
*/
|
|
114
|
+
clear() {
|
|
115
|
+
this.feedbacks.clear();
|
|
116
|
+
this.counter = 0;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=feedback-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-collector.js","sourceRoot":"","sources":["../../src/collector/feedback-collector.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/katashiro-feedback
|
|
3
|
+
* フィードバック学習パッケージ
|
|
4
|
+
*
|
|
5
|
+
* @requirement REQ-UX-003
|
|
6
|
+
* @design DES-KATASHIRO-001 §3.2
|
|
7
|
+
*/
|
|
8
|
+
export { FeedbackCollector } from './collector/feedback-collector.js';
|
|
9
|
+
export type { FeedbackInput, FeedbackStats } from './collector/feedback-collector.js';
|
|
10
|
+
export { FeedbackStorage } from './storage/feedback-storage.js';
|
|
11
|
+
export type { ListOptions, FeedbackExport } from './storage/feedback-storage.js';
|
|
12
|
+
export { LearningEngine } from './learning/learning-engine.js';
|
|
13
|
+
export type { LearningResult, PatternQueryOptions, SuggestionOptions, LearningStats, } from './learning/learning-engine.js';
|
|
14
|
+
export { PatternDetector } from './patterns/pattern-detector.js';
|
|
15
|
+
export type { DetectionResult, ContextPatterns, AnalysisResult, } from './patterns/pattern-detector.js';
|
|
16
|
+
export { AdaptiveRecommender } from './recommender/adaptive-recommender.js';
|
|
17
|
+
export type { RecommendOptions, RecommenderStats } from './recommender/adaptive-recommender.js';
|
|
18
|
+
export type { IFeedbackCollector, IPatternExtractor, } from './interfaces.js';
|
|
19
|
+
export type { Feedback, FeedbackAction, Pattern, PatternType, } from './types.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGtF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGjF,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,GACd,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,YAAY,EACV,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAGhG,YAAY,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACV,QAAQ,EACR,cAAc,EACd,OAAO,EACP,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/katashiro-feedback
|
|
3
|
+
* フィードバック学習パッケージ
|
|
4
|
+
*
|
|
5
|
+
* @requirement REQ-UX-003
|
|
6
|
+
* @design DES-KATASHIRO-001 §3.2
|
|
7
|
+
*/
|
|
8
|
+
// Collector
|
|
9
|
+
export { FeedbackCollector } from './collector/feedback-collector.js';
|
|
10
|
+
// Storage
|
|
11
|
+
export { FeedbackStorage } from './storage/feedback-storage.js';
|
|
12
|
+
// Learning
|
|
13
|
+
export { LearningEngine } from './learning/learning-engine.js';
|
|
14
|
+
// Patterns
|
|
15
|
+
export { PatternDetector } from './patterns/pattern-detector.js';
|
|
16
|
+
// Recommender
|
|
17
|
+
export { AdaptiveRecommender } from './recommender/adaptive-recommender.js';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAGtE,UAAU;AACV,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAQ/D,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAOjE,cAAc;AACd,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedbackインターフェース定義
|
|
3
|
+
*/
|
|
4
|
+
import type { Result, ID } from '@nahisaho/katashiro-core';
|
|
5
|
+
import type { Feedback, FeedbackAction, Pattern } from './types.js';
|
|
6
|
+
export interface IFeedbackCollector {
|
|
7
|
+
record(feedback: Feedback): Promise<Result<void, Error>>;
|
|
8
|
+
get(id: ID): Promise<Result<Feedback | null, Error>>;
|
|
9
|
+
list(filter?: {
|
|
10
|
+
action?: FeedbackAction;
|
|
11
|
+
}): Promise<Result<Feedback[], Error>>;
|
|
12
|
+
export(format: 'json' | 'jsonl'): Promise<Result<string, Error>>;
|
|
13
|
+
}
|
|
14
|
+
export interface IPatternExtractor {
|
|
15
|
+
extract(feedbacks: Feedback[]): Promise<Result<Pattern[], Error>>;
|
|
16
|
+
getPatterns(): Promise<Result<Pattern[], Error>>;
|
|
17
|
+
applyPattern(patternId: ID, context: unknown): Promise<Result<unknown, Error>>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACzD,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAClE,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,YAAY,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;CAChF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LearningEngine - フィードバックからの学習
|
|
3
|
+
*
|
|
4
|
+
* フィードバックデータからパターンを学習し推論を改善
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-052
|
|
8
|
+
*/
|
|
9
|
+
import { type Result } from '@nahisaho/katashiro-core';
|
|
10
|
+
import type { Feedback, Pattern, PatternType } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Learning result
|
|
13
|
+
*/
|
|
14
|
+
export interface LearningResult {
|
|
15
|
+
patternsLearned: number;
|
|
16
|
+
feedbacksProcessed: number;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Pattern query options
|
|
21
|
+
*/
|
|
22
|
+
export interface PatternQueryOptions {
|
|
23
|
+
type?: PatternType;
|
|
24
|
+
minConfidence?: number;
|
|
25
|
+
limit?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Suggestion options
|
|
29
|
+
*/
|
|
30
|
+
export interface SuggestionOptions {
|
|
31
|
+
context: string;
|
|
32
|
+
limit?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Learning statistics
|
|
36
|
+
*/
|
|
37
|
+
export interface LearningStats {
|
|
38
|
+
totalPatterns: number;
|
|
39
|
+
totalFeedbackProcessed: number;
|
|
40
|
+
patternsByType: Record<PatternType, number>;
|
|
41
|
+
averageConfidence: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* LearningEngine
|
|
45
|
+
*
|
|
46
|
+
* Learns patterns from user feedback
|
|
47
|
+
*/
|
|
48
|
+
export declare class LearningEngine {
|
|
49
|
+
private patterns;
|
|
50
|
+
private feedbackProcessed;
|
|
51
|
+
private patternCounter;
|
|
52
|
+
/**
|
|
53
|
+
* Learn from feedback
|
|
54
|
+
*
|
|
55
|
+
* @param feedbacks - Feedbacks to learn from
|
|
56
|
+
* @returns Learning result
|
|
57
|
+
*/
|
|
58
|
+
learn(feedbacks: Feedback[]): Result<LearningResult, Error>;
|
|
59
|
+
/**
|
|
60
|
+
* Get learned patterns
|
|
61
|
+
*
|
|
62
|
+
* @param options - Query options
|
|
63
|
+
* @returns Patterns
|
|
64
|
+
*/
|
|
65
|
+
getPatterns(options?: PatternQueryOptions): Result<Pattern[], Error>;
|
|
66
|
+
/**
|
|
67
|
+
* Suggest patterns for context
|
|
68
|
+
*
|
|
69
|
+
* @param options - Suggestion options
|
|
70
|
+
* @returns Suggested patterns
|
|
71
|
+
*/
|
|
72
|
+
suggest(options: SuggestionOptions): Result<Pattern[], Error>;
|
|
73
|
+
/**
|
|
74
|
+
* Get learning statistics
|
|
75
|
+
*
|
|
76
|
+
* @returns Statistics
|
|
77
|
+
*/
|
|
78
|
+
getStats(): Result<LearningStats, Error>;
|
|
79
|
+
/**
|
|
80
|
+
* Extract pattern from feedback
|
|
81
|
+
*/
|
|
82
|
+
private extractPattern;
|
|
83
|
+
/**
|
|
84
|
+
* Find similar existing pattern
|
|
85
|
+
*/
|
|
86
|
+
private findSimilarPattern;
|
|
87
|
+
/**
|
|
88
|
+
* Update existing pattern with new feedback
|
|
89
|
+
*/
|
|
90
|
+
private updatePattern;
|
|
91
|
+
/**
|
|
92
|
+
* Clear learned patterns
|
|
93
|
+
*/
|
|
94
|
+
clear(): void;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=learning-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-engine.d.ts","sourceRoot":"","sources":["../../src/learning/learning-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAK;IAE3B;;;;;OAKG;IACH,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC;IAgC3D;;;;;OAKG;IACH,WAAW,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC;IAyBxE;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC;IAiB7D;;;;OAIG;IACH,QAAQ,IAAI,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC;IA0BxC;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LearningEngine - フィードバックからの学習
|
|
3
|
+
*
|
|
4
|
+
* フィードバックデータからパターンを学習し推論を改善
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-052
|
|
8
|
+
*/
|
|
9
|
+
import { ok, err } from '@nahisaho/katashiro-core';
|
|
10
|
+
/**
|
|
11
|
+
* LearningEngine
|
|
12
|
+
*
|
|
13
|
+
* Learns patterns from user feedback
|
|
14
|
+
*/
|
|
15
|
+
export class LearningEngine {
|
|
16
|
+
patterns = new Map();
|
|
17
|
+
feedbackProcessed = 0;
|
|
18
|
+
patternCounter = 0;
|
|
19
|
+
/**
|
|
20
|
+
* Learn from feedback
|
|
21
|
+
*
|
|
22
|
+
* @param feedbacks - Feedbacks to learn from
|
|
23
|
+
* @returns Learning result
|
|
24
|
+
*/
|
|
25
|
+
learn(feedbacks) {
|
|
26
|
+
try {
|
|
27
|
+
let patternsLearned = 0;
|
|
28
|
+
for (const feedback of feedbacks) {
|
|
29
|
+
this.feedbackProcessed++;
|
|
30
|
+
// Extract pattern based on action type
|
|
31
|
+
const pattern = this.extractPattern(feedback);
|
|
32
|
+
if (pattern) {
|
|
33
|
+
const existingPattern = this.findSimilarPattern(pattern);
|
|
34
|
+
if (existingPattern) {
|
|
35
|
+
// Update existing pattern
|
|
36
|
+
this.updatePattern(existingPattern, feedback);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Add new pattern
|
|
40
|
+
this.patterns.set(pattern.id, pattern);
|
|
41
|
+
patternsLearned++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return ok({
|
|
46
|
+
patternsLearned,
|
|
47
|
+
feedbacksProcessed: feedbacks.length,
|
|
48
|
+
timestamp: new Date().toISOString(),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get learned patterns
|
|
57
|
+
*
|
|
58
|
+
* @param options - Query options
|
|
59
|
+
* @returns Patterns
|
|
60
|
+
*/
|
|
61
|
+
getPatterns(options = {}) {
|
|
62
|
+
try {
|
|
63
|
+
let patterns = Array.from(this.patterns.values());
|
|
64
|
+
// Filter by type
|
|
65
|
+
if (options.type) {
|
|
66
|
+
patterns = patterns.filter((p) => p.type === options.type);
|
|
67
|
+
}
|
|
68
|
+
// Filter by confidence
|
|
69
|
+
if (options.minConfidence !== undefined) {
|
|
70
|
+
patterns = patterns.filter((p) => p.confidence >= options.minConfidence);
|
|
71
|
+
}
|
|
72
|
+
// Apply limit
|
|
73
|
+
if (options.limit) {
|
|
74
|
+
patterns = patterns.slice(0, options.limit);
|
|
75
|
+
}
|
|
76
|
+
return ok(patterns);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Suggest patterns for context
|
|
84
|
+
*
|
|
85
|
+
* @param options - Suggestion options
|
|
86
|
+
* @returns Suggested patterns
|
|
87
|
+
*/
|
|
88
|
+
suggest(options) {
|
|
89
|
+
try {
|
|
90
|
+
let patterns = Array.from(this.patterns.values());
|
|
91
|
+
// Sort by confidence
|
|
92
|
+
patterns.sort((a, b) => b.confidence - a.confidence);
|
|
93
|
+
// Apply limit
|
|
94
|
+
const limit = options.limit ?? 10;
|
|
95
|
+
patterns = patterns.slice(0, limit);
|
|
96
|
+
return ok(patterns);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get learning statistics
|
|
104
|
+
*
|
|
105
|
+
* @returns Statistics
|
|
106
|
+
*/
|
|
107
|
+
getStats() {
|
|
108
|
+
try {
|
|
109
|
+
const patterns = Array.from(this.patterns.values());
|
|
110
|
+
const patternsByType = {
|
|
111
|
+
success: 0,
|
|
112
|
+
error: 0,
|
|
113
|
+
modification: 0,
|
|
114
|
+
};
|
|
115
|
+
let totalConfidence = 0;
|
|
116
|
+
for (const pattern of patterns) {
|
|
117
|
+
patternsByType[pattern.type]++;
|
|
118
|
+
totalConfidence += pattern.confidence;
|
|
119
|
+
}
|
|
120
|
+
return ok({
|
|
121
|
+
totalPatterns: patterns.length,
|
|
122
|
+
totalFeedbackProcessed: this.feedbackProcessed,
|
|
123
|
+
patternsByType,
|
|
124
|
+
averageConfidence: patterns.length > 0 ? totalConfidence / patterns.length : 0,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return err(error instanceof Error ? error : new Error(String(error)));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Extract pattern from feedback
|
|
133
|
+
*/
|
|
134
|
+
extractPattern(feedback) {
|
|
135
|
+
const type = feedback.action === 'accept'
|
|
136
|
+
? 'success'
|
|
137
|
+
: feedback.action === 'reject'
|
|
138
|
+
? 'error'
|
|
139
|
+
: 'modification';
|
|
140
|
+
const id = `PAT-${++this.patternCounter}`;
|
|
141
|
+
const now = new Date().toISOString();
|
|
142
|
+
return {
|
|
143
|
+
id,
|
|
144
|
+
type,
|
|
145
|
+
name: `Pattern from ${feedback.id}`,
|
|
146
|
+
description: `Extracted from ${feedback.action} feedback`,
|
|
147
|
+
confidence: 0.5, // Initial confidence
|
|
148
|
+
occurrences: 1,
|
|
149
|
+
template: feedback.originalContent,
|
|
150
|
+
createdAt: now,
|
|
151
|
+
updatedAt: now,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Find similar existing pattern
|
|
156
|
+
*/
|
|
157
|
+
findSimilarPattern(newPattern) {
|
|
158
|
+
for (const pattern of this.patterns.values()) {
|
|
159
|
+
if (pattern.type === newPattern.type &&
|
|
160
|
+
pattern.template === newPattern.template) {
|
|
161
|
+
return pattern;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Update existing pattern with new feedback
|
|
168
|
+
*/
|
|
169
|
+
updatePattern(pattern, _feedback) {
|
|
170
|
+
const updated = {
|
|
171
|
+
...pattern,
|
|
172
|
+
occurrences: pattern.occurrences + 1,
|
|
173
|
+
confidence: Math.min(pattern.confidence + 0.1, 1.0),
|
|
174
|
+
updatedAt: new Date().toISOString(),
|
|
175
|
+
};
|
|
176
|
+
this.patterns.set(pattern.id, updated);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Clear learned patterns
|
|
180
|
+
*/
|
|
181
|
+
clear() {
|
|
182
|
+
this.patterns.clear();
|
|
183
|
+
this.feedbackProcessed = 0;
|
|
184
|
+
this.patternCounter = 0;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=learning-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-engine.js","sourceRoot":"","sources":["../../src/learning/learning-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatternDetector - パターン検出
|
|
3
|
+
*
|
|
4
|
+
* フィードバックからコードパターンを検出・分類
|
|
5
|
+
*
|
|
6
|
+
* @module @nahisaho/katashiro-feedback
|
|
7
|
+
* @task TSK-053
|
|
8
|
+
*/
|
|
9
|
+
import { type Result } from '@nahisaho/katashiro-core';
|
|
10
|
+
import type { Feedback, Pattern } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Detection result
|
|
13
|
+
*/
|
|
14
|
+
export interface DetectionResult {
|
|
15
|
+
patterns: Pattern[];
|
|
16
|
+
feedbackAnalyzed: number;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Context-grouped patterns
|
|
21
|
+
*/
|
|
22
|
+
export interface ContextPatterns {
|
|
23
|
+
[context: string]: Pattern[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Analysis result
|
|
27
|
+
*/
|
|
28
|
+
export interface AnalysisResult {
|
|
29
|
+
totalFeedback: number;
|
|
30
|
+
acceptRate: number;
|
|
31
|
+
rejectRate: number;
|
|
32
|
+
modifyRate: number;
|
|
33
|
+
topPatterns: Pattern[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* PatternDetector
|
|
37
|
+
*
|
|
38
|
+
* Detects patterns from feedback data
|
|
39
|
+
*/
|
|
40
|
+
export declare class PatternDetector {
|
|
41
|
+
private patternCounter;
|
|
42
|
+
/**
|
|
43
|
+
* Detect patterns from feedback
|
|
44
|
+
*
|
|
45
|
+
* @param feedbacks - Feedbacks to analyze
|
|
46
|
+
* @returns Detection result
|
|
47
|
+
*/
|
|
48
|
+
detect(feedbacks: Feedback[]): Result<DetectionResult, Error>;
|
|
49
|
+
/**
|
|
50
|
+
* Detect patterns grouped by context
|
|
51
|
+
*
|
|
52
|
+
* @param feedbacks - Feedbacks to analyze
|
|
53
|
+
* @returns Context-grouped patterns
|
|
54
|
+
*/
|
|
55
|
+
detectByContext(feedbacks: Feedback[]): Result<ContextPatterns, Error>;
|
|
56
|
+
/**
|
|
57
|
+
* Analyze feedback patterns
|
|
58
|
+
*
|
|
59
|
+
* @param feedbacks - Feedbacks to analyze
|
|
60
|
+
* @returns Analysis result
|
|
61
|
+
*/
|
|
62
|
+
analyze(feedbacks: Feedback[]): Result<AnalysisResult, Error>;
|
|
63
|
+
/**
|
|
64
|
+
* Calculate similarity between two contents
|
|
65
|
+
*
|
|
66
|
+
* @param content1 - First content
|
|
67
|
+
* @param content2 - Second content
|
|
68
|
+
* @returns Similarity score (0-1)
|
|
69
|
+
*/
|
|
70
|
+
getSimilarity(content1: string, content2: string): Result<number, Error>;
|
|
71
|
+
/**
|
|
72
|
+
* Group feedbacks by content similarity
|
|
73
|
+
*/
|
|
74
|
+
private groupByContent;
|
|
75
|
+
/**
|
|
76
|
+
* Normalize content for comparison
|
|
77
|
+
*/
|
|
78
|
+
private normalizeContent;
|
|
79
|
+
/**
|
|
80
|
+
* Tokenize content
|
|
81
|
+
*/
|
|
82
|
+
private tokenize;
|
|
83
|
+
/**
|
|
84
|
+
* Create pattern from group of feedbacks
|
|
85
|
+
*/
|
|
86
|
+
private createPatternFromGroup;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=pattern-detector.d.ts.map
|