agentic-qe 1.0.5 → 1.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/.claude/agents/qe-quality-analyzer.md +405 -0
- package/CHANGELOG.md +109 -0
- package/CONTRIBUTING.md +51 -0
- package/README.md +669 -162
- package/bin/aqe +90 -938
- package/dist/adapters/MemoryStoreAdapter.d.ts.map +1 -1
- package/dist/adapters/MemoryStoreAdapter.js +6 -0
- package/dist/adapters/MemoryStoreAdapter.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.d.ts +58 -3
- package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +316 -48
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.d.ts +48 -4
- package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.js +217 -10
- package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
- package/dist/agents/LearningAgent.d.ts +75 -0
- package/dist/agents/LearningAgent.d.ts.map +1 -0
- package/dist/agents/LearningAgent.js +177 -0
- package/dist/agents/LearningAgent.js.map +1 -0
- package/dist/agents/TestGeneratorAgent.d.ts +42 -2
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +232 -13
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/cli/commands/improve/index.d.ts +70 -0
- package/dist/cli/commands/improve/index.d.ts.map +1 -0
- package/dist/cli/commands/improve/index.js +530 -0
- package/dist/cli/commands/improve/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +33 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +656 -39
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learn/index.d.ts +68 -0
- package/dist/cli/commands/learn/index.d.ts.map +1 -0
- package/dist/cli/commands/learn/index.js +431 -0
- package/dist/cli/commands/learn/index.js.map +1 -0
- package/dist/cli/commands/patterns/index.d.ts +75 -0
- package/dist/cli/commands/patterns/index.d.ts.map +1 -0
- package/dist/cli/commands/patterns/index.js +502 -0
- package/dist/cli/commands/patterns/index.js.map +1 -0
- package/dist/cli/index.js +367 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +5 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +7 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/learning/FlakyFixRecommendations.d.ts +40 -0
- package/dist/learning/FlakyFixRecommendations.d.ts.map +1 -0
- package/dist/learning/FlakyFixRecommendations.js +247 -0
- package/dist/learning/FlakyFixRecommendations.js.map +1 -0
- package/dist/learning/FlakyPredictionModel.d.ts +57 -0
- package/dist/learning/FlakyPredictionModel.d.ts.map +1 -0
- package/dist/learning/FlakyPredictionModel.js +289 -0
- package/dist/learning/FlakyPredictionModel.js.map +1 -0
- package/dist/learning/FlakyTestDetector.d.ts +46 -0
- package/dist/learning/FlakyTestDetector.d.ts.map +1 -0
- package/dist/learning/FlakyTestDetector.js +215 -0
- package/dist/learning/FlakyTestDetector.js.map +1 -0
- package/dist/learning/ImprovementLoop.d.ts +119 -0
- package/dist/learning/ImprovementLoop.d.ts.map +1 -0
- package/dist/learning/ImprovementLoop.js +353 -0
- package/dist/learning/ImprovementLoop.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +144 -0
- package/dist/learning/LearningEngine.d.ts.map +1 -0
- package/dist/learning/LearningEngine.js +531 -0
- package/dist/learning/LearningEngine.js.map +1 -0
- package/dist/learning/PerformanceTracker.d.ts +118 -0
- package/dist/learning/PerformanceTracker.d.ts.map +1 -0
- package/dist/learning/PerformanceTracker.js +376 -0
- package/dist/learning/PerformanceTracker.js.map +1 -0
- package/dist/learning/StatisticalAnalysis.d.ts +47 -0
- package/dist/learning/StatisticalAnalysis.d.ts.map +1 -0
- package/dist/learning/StatisticalAnalysis.js +170 -0
- package/dist/learning/StatisticalAnalysis.js.map +1 -0
- package/dist/learning/SwarmIntegration.d.ts +107 -0
- package/dist/learning/SwarmIntegration.d.ts.map +1 -0
- package/dist/learning/SwarmIntegration.js +191 -0
- package/dist/learning/SwarmIntegration.js.map +1 -0
- package/dist/learning/index.d.ts +10 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +16 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/types.d.ts +288 -0
- package/dist/learning/types.d.ts.map +1 -0
- package/dist/learning/types.js +9 -0
- package/dist/learning/types.js.map +1 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.d.ts +175 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.d.ts.map +1 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.js +693 -0
- package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +94 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +15 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +17 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/reasoning/CodeSignatureGenerator.d.ts +98 -0
- package/dist/reasoning/CodeSignatureGenerator.d.ts.map +1 -0
- package/dist/reasoning/CodeSignatureGenerator.js +427 -0
- package/dist/reasoning/CodeSignatureGenerator.js.map +1 -0
- package/dist/reasoning/PatternClassifier.d.ts +98 -0
- package/dist/reasoning/PatternClassifier.d.ts.map +1 -0
- package/dist/reasoning/PatternClassifier.js +345 -0
- package/dist/reasoning/PatternClassifier.js.map +1 -0
- package/dist/reasoning/PatternExtractor.d.ts +131 -0
- package/dist/reasoning/PatternExtractor.d.ts.map +1 -0
- package/dist/reasoning/PatternExtractor.js +539 -0
- package/dist/reasoning/PatternExtractor.js.map +1 -0
- package/dist/reasoning/PatternMemoryIntegration.d.ts +102 -0
- package/dist/reasoning/PatternMemoryIntegration.d.ts.map +1 -0
- package/dist/reasoning/PatternMemoryIntegration.js +336 -0
- package/dist/reasoning/PatternMemoryIntegration.js.map +1 -0
- package/dist/reasoning/QEReasoningBank.d.ts +121 -0
- package/dist/reasoning/QEReasoningBank.d.ts.map +1 -0
- package/dist/reasoning/QEReasoningBank.js +235 -0
- package/dist/reasoning/QEReasoningBank.js.map +1 -0
- package/dist/reasoning/TestTemplateCreator.d.ts +95 -0
- package/dist/reasoning/TestTemplateCreator.d.ts.map +1 -0
- package/dist/reasoning/TestTemplateCreator.js +535 -0
- package/dist/reasoning/TestTemplateCreator.js.map +1 -0
- package/dist/reasoning/index.d.ts +10 -0
- package/dist/reasoning/index.d.ts.map +1 -0
- package/dist/reasoning/index.js +31 -0
- package/dist/reasoning/index.js.map +1 -0
- package/dist/reasoning/types.d.ts +717 -0
- package/dist/reasoning/types.d.ts.map +1 -0
- package/dist/reasoning/types.js +57 -0
- package/dist/reasoning/types.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/pattern.types.d.ts +364 -0
- package/dist/types/pattern.types.d.ts.map +1 -0
- package/dist/types/pattern.types.js +60 -0
- package/dist/types/pattern.types.js.map +1 -0
- package/package.json +25 -3
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ImprovementLoop - Phase 2 (Milestone 2.2)
|
|
3
|
+
*
|
|
4
|
+
* Implements continuous improvement loop with pattern recognition,
|
|
5
|
+
* strategy optimization, and A/B testing framework.
|
|
6
|
+
*/
|
|
7
|
+
import { SwarmMemoryManager } from '../core/memory/SwarmMemoryManager';
|
|
8
|
+
import { LearningEngine } from './LearningEngine';
|
|
9
|
+
import { PerformanceTracker } from './PerformanceTracker';
|
|
10
|
+
import { ABTest } from './types';
|
|
11
|
+
/**
|
|
12
|
+
* Improvement strategy
|
|
13
|
+
*/
|
|
14
|
+
interface ImprovementStrategy {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
config: any;
|
|
19
|
+
successRate?: number;
|
|
20
|
+
avgImprovement?: number;
|
|
21
|
+
usageCount: number;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* ImprovementLoop - Continuous learning and optimization
|
|
26
|
+
*/
|
|
27
|
+
export declare class ImprovementLoop {
|
|
28
|
+
private readonly logger;
|
|
29
|
+
private readonly memoryStore;
|
|
30
|
+
private readonly learningEngine;
|
|
31
|
+
private readonly performanceTracker;
|
|
32
|
+
private readonly agentId;
|
|
33
|
+
private strategies;
|
|
34
|
+
private activeTests;
|
|
35
|
+
private loopInterval?;
|
|
36
|
+
private isRunning;
|
|
37
|
+
constructor(agentId: string, memoryStore: SwarmMemoryManager, learningEngine: LearningEngine, performanceTracker: PerformanceTracker);
|
|
38
|
+
/**
|
|
39
|
+
* Initialize the improvement loop
|
|
40
|
+
*/
|
|
41
|
+
initialize(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Start the continuous improvement loop
|
|
44
|
+
*/
|
|
45
|
+
start(intervalMs?: number): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Stop the improvement loop
|
|
48
|
+
*/
|
|
49
|
+
stop(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Run a single improvement cycle
|
|
52
|
+
*/
|
|
53
|
+
runImprovementCycle(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Create A/B test for strategy comparison
|
|
56
|
+
*/
|
|
57
|
+
createABTest(name: string, strategies: {
|
|
58
|
+
name: string;
|
|
59
|
+
config: any;
|
|
60
|
+
}[], sampleSize?: number): Promise<string>;
|
|
61
|
+
/**
|
|
62
|
+
* Record A/B test result
|
|
63
|
+
*/
|
|
64
|
+
recordTestResult(testId: string, strategyName: string, success: boolean, executionTime: number): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Complete A/B test and determine winner
|
|
67
|
+
*/
|
|
68
|
+
private completeABTest;
|
|
69
|
+
/**
|
|
70
|
+
* Analyze failure patterns and suggest mitigations
|
|
71
|
+
*/
|
|
72
|
+
private analyzeFailurePatterns;
|
|
73
|
+
/**
|
|
74
|
+
* Suggest mitigation for failure pattern
|
|
75
|
+
*/
|
|
76
|
+
private suggestMitigation;
|
|
77
|
+
/**
|
|
78
|
+
* Discover optimization opportunities
|
|
79
|
+
*/
|
|
80
|
+
private discoverOptimizations;
|
|
81
|
+
/**
|
|
82
|
+
* Update active A/B tests
|
|
83
|
+
*/
|
|
84
|
+
private updateActiveTests;
|
|
85
|
+
/**
|
|
86
|
+
* Apply best strategies based on learning
|
|
87
|
+
*/
|
|
88
|
+
private applyBestStrategies;
|
|
89
|
+
/**
|
|
90
|
+
* Apply a strategy
|
|
91
|
+
*/
|
|
92
|
+
private applyStrategy;
|
|
93
|
+
/**
|
|
94
|
+
* Register default improvement strategies
|
|
95
|
+
*/
|
|
96
|
+
private registerDefaultStrategies;
|
|
97
|
+
/**
|
|
98
|
+
* Load strategies from memory
|
|
99
|
+
*/
|
|
100
|
+
private loadStrategies;
|
|
101
|
+
/**
|
|
102
|
+
* Store cycle results
|
|
103
|
+
*/
|
|
104
|
+
private storeCycleResults;
|
|
105
|
+
/**
|
|
106
|
+
* Get active A/B tests
|
|
107
|
+
*/
|
|
108
|
+
getActiveTests(): ABTest[];
|
|
109
|
+
/**
|
|
110
|
+
* Get all strategies
|
|
111
|
+
*/
|
|
112
|
+
getStrategies(): ImprovementStrategy[];
|
|
113
|
+
/**
|
|
114
|
+
* Check if loop is running
|
|
115
|
+
*/
|
|
116
|
+
isActive(): boolean;
|
|
117
|
+
}
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=ImprovementLoop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImprovementLoop.d.ts","sourceRoot":"","sources":["../../src/learning/ImprovementLoop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAA0C,MAAM,SAAS,CAAC;AAEzE;;GAEG;AACH,UAAU,mBAAmB;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,SAAS,CAAkB;gBAGjC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,kBAAkB,EAC/B,cAAc,EAAE,cAAc,EAC9B,kBAAkB,EAAE,kBAAkB;IAWxC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC;;OAEG;IACG,KAAK,CAAC,UAAU,GAAE,MAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC1C;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAE,EAAE,EAC3C,UAAU,GAAE,MAAY,GACvB,OAAO,CAAC,MAAM,CAAC;IA6BlB;;OAEG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IA8BhB;;OAEG;YACW,cAAc;IAqC5B;;OAEG;YACW,sBAAsB;IAqBpC;;OAEG;YACW,iBAAiB;IAiB/B;;OAEG;YACW,qBAAqB;IAsBnC;;OAEG;YACW,iBAAiB;IAU/B;;OAEG;YACW,mBAAmB;IAWjC;;OAEG;YACW,aAAa;IAoB3B;;OAEG;YACW,yBAAyB;IAwCvC;;OAEG;YACW,cAAc;IAkB5B;;OAEG;YACW,iBAAiB;IAQ/B;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAI1B;;OAEG;IACH,aAAa,IAAI,mBAAmB,EAAE;IAItC;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ImprovementLoop - Phase 2 (Milestone 2.2)
|
|
4
|
+
*
|
|
5
|
+
* Implements continuous improvement loop with pattern recognition,
|
|
6
|
+
* strategy optimization, and A/B testing framework.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ImprovementLoop = void 0;
|
|
10
|
+
const uuid_1 = require("uuid");
|
|
11
|
+
const Logger_1 = require("../utils/Logger");
|
|
12
|
+
/**
|
|
13
|
+
* ImprovementLoop - Continuous learning and optimization
|
|
14
|
+
*/
|
|
15
|
+
class ImprovementLoop {
|
|
16
|
+
constructor(agentId, memoryStore, learningEngine, performanceTracker) {
|
|
17
|
+
this.isRunning = false;
|
|
18
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
19
|
+
this.agentId = agentId;
|
|
20
|
+
this.memoryStore = memoryStore;
|
|
21
|
+
this.learningEngine = learningEngine;
|
|
22
|
+
this.performanceTracker = performanceTracker;
|
|
23
|
+
this.strategies = new Map();
|
|
24
|
+
this.activeTests = new Map();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Initialize the improvement loop
|
|
28
|
+
*/
|
|
29
|
+
async initialize() {
|
|
30
|
+
this.logger.info(`Initializing ImprovementLoop for agent ${this.agentId}`);
|
|
31
|
+
// Load existing strategies
|
|
32
|
+
await this.loadStrategies();
|
|
33
|
+
// Register default strategies
|
|
34
|
+
await this.registerDefaultStrategies();
|
|
35
|
+
this.logger.info('ImprovementLoop initialized successfully');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Start the continuous improvement loop
|
|
39
|
+
*/
|
|
40
|
+
async start(intervalMs = 3600000) {
|
|
41
|
+
if (this.isRunning) {
|
|
42
|
+
this.logger.warn('ImprovementLoop already running');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.isRunning = true;
|
|
46
|
+
this.logger.info(`Starting ImprovementLoop with ${intervalMs}ms interval`);
|
|
47
|
+
// Run immediately
|
|
48
|
+
await this.runImprovementCycle();
|
|
49
|
+
// Schedule periodic runs
|
|
50
|
+
this.loopInterval = setInterval(async () => {
|
|
51
|
+
await this.runImprovementCycle();
|
|
52
|
+
}, intervalMs);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Stop the improvement loop
|
|
56
|
+
*/
|
|
57
|
+
async stop() {
|
|
58
|
+
if (!this.isRunning) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.isRunning = false;
|
|
62
|
+
if (this.loopInterval) {
|
|
63
|
+
clearInterval(this.loopInterval);
|
|
64
|
+
this.loopInterval = undefined;
|
|
65
|
+
}
|
|
66
|
+
this.logger.info('ImprovementLoop stopped');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Run a single improvement cycle
|
|
70
|
+
*/
|
|
71
|
+
async runImprovementCycle() {
|
|
72
|
+
this.logger.info('Running improvement cycle...');
|
|
73
|
+
try {
|
|
74
|
+
// 1. Analyze current performance
|
|
75
|
+
const improvement = await this.performanceTracker.calculateImprovement();
|
|
76
|
+
this.logger.debug(`Current improvement: ${improvement.improvementRate.toFixed(2)}%`);
|
|
77
|
+
// 2. Identify failure patterns
|
|
78
|
+
const failurePatterns = this.learningEngine.getFailurePatterns();
|
|
79
|
+
await this.analyzeFailurePatterns(failurePatterns);
|
|
80
|
+
// 3. Discover optimization opportunities
|
|
81
|
+
const opportunities = await this.discoverOptimizations();
|
|
82
|
+
this.logger.debug(`Found ${opportunities.length} optimization opportunities`);
|
|
83
|
+
// 4. Run active A/B tests
|
|
84
|
+
await this.updateActiveTests();
|
|
85
|
+
// 5. Apply best strategies
|
|
86
|
+
await this.applyBestStrategies();
|
|
87
|
+
// 6. Store cycle results
|
|
88
|
+
await this.storeCycleResults({
|
|
89
|
+
timestamp: new Date(),
|
|
90
|
+
improvement,
|
|
91
|
+
failurePatterns: failurePatterns.length,
|
|
92
|
+
opportunities: opportunities.length,
|
|
93
|
+
activeTests: this.activeTests.size
|
|
94
|
+
});
|
|
95
|
+
this.logger.info('Improvement cycle completed successfully');
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
this.logger.error('Error in improvement cycle:', error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create A/B test for strategy comparison
|
|
103
|
+
*/
|
|
104
|
+
async createABTest(name, strategies, sampleSize = 100) {
|
|
105
|
+
const test = {
|
|
106
|
+
id: (0, uuid_1.v4)(),
|
|
107
|
+
name,
|
|
108
|
+
strategies,
|
|
109
|
+
sampleSize,
|
|
110
|
+
results: strategies.map(s => ({
|
|
111
|
+
strategy: s.name,
|
|
112
|
+
successRate: 0,
|
|
113
|
+
averageTime: 0,
|
|
114
|
+
sampleCount: 0
|
|
115
|
+
})),
|
|
116
|
+
status: 'running',
|
|
117
|
+
startedAt: new Date()
|
|
118
|
+
};
|
|
119
|
+
this.activeTests.set(test.id, test);
|
|
120
|
+
await this.memoryStore.store(`phase2/learning/${this.agentId}/abtests/${test.id}`, test, { partition: 'learning' });
|
|
121
|
+
this.logger.info(`Created A/B test: ${name} (${test.id})`);
|
|
122
|
+
return test.id;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Record A/B test result
|
|
126
|
+
*/
|
|
127
|
+
async recordTestResult(testId, strategyName, success, executionTime) {
|
|
128
|
+
const test = this.activeTests.get(testId);
|
|
129
|
+
if (!test) {
|
|
130
|
+
throw new Error(`A/B test not found: ${testId}`);
|
|
131
|
+
}
|
|
132
|
+
const result = test.results.find(r => r.strategy === strategyName);
|
|
133
|
+
if (!result) {
|
|
134
|
+
throw new Error(`Strategy not found in test: ${strategyName}`);
|
|
135
|
+
}
|
|
136
|
+
// Update result statistics
|
|
137
|
+
result.sampleCount++;
|
|
138
|
+
result.successRate = ((result.successRate * (result.sampleCount - 1)) + (success ? 1 : 0)) / result.sampleCount;
|
|
139
|
+
result.averageTime = ((result.averageTime * (result.sampleCount - 1)) + executionTime) / result.sampleCount;
|
|
140
|
+
// Check if test is complete
|
|
141
|
+
const totalSamples = test.results.reduce((sum, r) => sum + r.sampleCount, 0);
|
|
142
|
+
if (totalSamples >= test.sampleSize) {
|
|
143
|
+
await this.completeABTest(testId);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Update test in memory
|
|
147
|
+
await this.memoryStore.store(`phase2/learning/${this.agentId}/abtests/${testId}`, test, { partition: 'learning' });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Complete A/B test and determine winner
|
|
152
|
+
*/
|
|
153
|
+
async completeABTest(testId) {
|
|
154
|
+
const test = this.activeTests.get(testId);
|
|
155
|
+
if (!test) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Find best performing strategy
|
|
159
|
+
let bestResult = test.results[0];
|
|
160
|
+
for (const result of test.results) {
|
|
161
|
+
const bestScore = bestResult.successRate * 0.7 + (1 - bestResult.averageTime / 60000) * 0.3;
|
|
162
|
+
const currentScore = result.successRate * 0.7 + (1 - result.averageTime / 60000) * 0.3;
|
|
163
|
+
if (currentScore > bestScore) {
|
|
164
|
+
bestResult = result;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
test.winner = bestResult.strategy;
|
|
168
|
+
test.status = 'completed';
|
|
169
|
+
test.completedAt = new Date();
|
|
170
|
+
// Store completed test
|
|
171
|
+
await this.memoryStore.store(`phase2/learning/${this.agentId}/abtests/${testId}`, test, { partition: 'learning' });
|
|
172
|
+
// Remove from active tests
|
|
173
|
+
this.activeTests.delete(testId);
|
|
174
|
+
this.logger.info(`A/B test completed: ${test.name}, winner: ${test.winner}`);
|
|
175
|
+
// Apply winning strategy
|
|
176
|
+
await this.applyStrategy(test.winner);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Analyze failure patterns and suggest mitigations
|
|
180
|
+
*/
|
|
181
|
+
async analyzeFailurePatterns(patterns) {
|
|
182
|
+
const highFrequencyPatterns = patterns.filter(p => p.frequency > 5 && p.confidence > 0.7);
|
|
183
|
+
for (const pattern of highFrequencyPatterns) {
|
|
184
|
+
// Suggest mitigation if not already present
|
|
185
|
+
if (!pattern.mitigation) {
|
|
186
|
+
const mitigation = await this.suggestMitigation(pattern);
|
|
187
|
+
pattern.mitigation = mitigation;
|
|
188
|
+
this.logger.info(`Suggested mitigation for pattern ${pattern.pattern}: ${mitigation}`);
|
|
189
|
+
// Store updated pattern
|
|
190
|
+
await this.memoryStore.store(`phase2/learning/${this.agentId}/failure-patterns/${pattern.id}`, pattern, { partition: 'learning' });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Suggest mitigation for failure pattern
|
|
196
|
+
*/
|
|
197
|
+
async suggestMitigation(pattern) {
|
|
198
|
+
// Simple rule-based mitigation suggestions
|
|
199
|
+
const patternType = pattern.pattern.split(':')[0];
|
|
200
|
+
const mitigations = {
|
|
201
|
+
'timeout': 'Increase timeout threshold or implement progress checkpointing',
|
|
202
|
+
'memory': 'Implement memory pooling and garbage collection optimization',
|
|
203
|
+
'validation': 'Add input validation and sanitization before processing',
|
|
204
|
+
'network': 'Implement retry logic with exponential backoff',
|
|
205
|
+
'parsing': 'Add robust error handling for malformed input',
|
|
206
|
+
'permission': 'Implement proper permission checking before operations',
|
|
207
|
+
'default': 'Add comprehensive error handling and fallback mechanisms'
|
|
208
|
+
};
|
|
209
|
+
return mitigations[patternType] || mitigations['default'];
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Discover optimization opportunities
|
|
213
|
+
*/
|
|
214
|
+
async discoverOptimizations() {
|
|
215
|
+
const opportunities = [];
|
|
216
|
+
// Get learned patterns
|
|
217
|
+
const patterns = this.learningEngine.getPatterns();
|
|
218
|
+
// Find underutilized high-confidence patterns
|
|
219
|
+
for (const pattern of patterns) {
|
|
220
|
+
if (pattern.confidence > 0.8 && pattern.usageCount < 10) {
|
|
221
|
+
opportunities.push({
|
|
222
|
+
strategy: pattern.pattern,
|
|
223
|
+
confidence: pattern.confidence,
|
|
224
|
+
expectedImprovement: pattern.successRate * 20, // estimate 20% of success rate
|
|
225
|
+
reasoning: `High-confidence pattern (${pattern.confidence.toFixed(2)}) with low usage`,
|
|
226
|
+
alternatives: []
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return opportunities;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Update active A/B tests
|
|
234
|
+
*/
|
|
235
|
+
async updateActiveTests() {
|
|
236
|
+
for (const [testId, test] of this.activeTests.entries()) {
|
|
237
|
+
const totalSamples = test.results.reduce((sum, r) => sum + r.sampleCount, 0);
|
|
238
|
+
if (totalSamples >= test.sampleSize) {
|
|
239
|
+
await this.completeABTest(testId);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Apply best strategies based on learning
|
|
245
|
+
*/
|
|
246
|
+
async applyBestStrategies() {
|
|
247
|
+
const patterns = this.learningEngine.getPatterns()
|
|
248
|
+
.filter(p => p.confidence > 0.9 && p.successRate > 0.8)
|
|
249
|
+
.slice(0, 3);
|
|
250
|
+
for (const pattern of patterns) {
|
|
251
|
+
const strategyName = pattern.pattern.split(':')[1] || 'default';
|
|
252
|
+
await this.applyStrategy(strategyName);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Apply a strategy
|
|
257
|
+
*/
|
|
258
|
+
async applyStrategy(strategyName) {
|
|
259
|
+
const strategy = this.strategies.get(strategyName);
|
|
260
|
+
if (!strategy) {
|
|
261
|
+
this.logger.warn(`Strategy not found: ${strategyName}`);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
strategy.usageCount++;
|
|
265
|
+
// Store strategy application
|
|
266
|
+
await this.memoryStore.storeEvent({
|
|
267
|
+
type: 'strategy:applied',
|
|
268
|
+
payload: { strategy: strategyName, config: strategy.config },
|
|
269
|
+
source: this.agentId,
|
|
270
|
+
timestamp: Date.now()
|
|
271
|
+
});
|
|
272
|
+
this.logger.info(`Applied strategy: ${strategyName}`);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Register default improvement strategies
|
|
276
|
+
*/
|
|
277
|
+
async registerDefaultStrategies() {
|
|
278
|
+
const defaultStrategies = [
|
|
279
|
+
{
|
|
280
|
+
id: (0, uuid_1.v4)(),
|
|
281
|
+
name: 'parallel-execution',
|
|
282
|
+
description: 'Execute tasks in parallel when possible',
|
|
283
|
+
config: { parallelization: 0.8 },
|
|
284
|
+
usageCount: 0,
|
|
285
|
+
createdAt: new Date()
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
id: (0, uuid_1.v4)(),
|
|
289
|
+
name: 'adaptive-retry',
|
|
290
|
+
description: 'Use adaptive retry policy with exponential backoff',
|
|
291
|
+
config: { retryPolicy: 'exponential', maxRetries: 3 },
|
|
292
|
+
usageCount: 0,
|
|
293
|
+
createdAt: new Date()
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
id: (0, uuid_1.v4)(),
|
|
297
|
+
name: 'resource-optimization',
|
|
298
|
+
description: 'Optimize resource allocation based on task complexity',
|
|
299
|
+
config: { adaptive: true },
|
|
300
|
+
usageCount: 0,
|
|
301
|
+
createdAt: new Date()
|
|
302
|
+
}
|
|
303
|
+
];
|
|
304
|
+
for (const strategy of defaultStrategies) {
|
|
305
|
+
this.strategies.set(strategy.name, strategy);
|
|
306
|
+
await this.memoryStore.store(`phase2/learning/${this.agentId}/strategies/${strategy.name}`, strategy, { partition: 'learning' });
|
|
307
|
+
}
|
|
308
|
+
this.logger.info(`Registered ${defaultStrategies.length} default strategies`);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Load strategies from memory
|
|
312
|
+
*/
|
|
313
|
+
async loadStrategies() {
|
|
314
|
+
try {
|
|
315
|
+
const entries = await this.memoryStore.query(`phase2/learning/${this.agentId}/strategies/%`, { partition: 'learning' });
|
|
316
|
+
for (const entry of entries) {
|
|
317
|
+
const strategy = entry.value;
|
|
318
|
+
this.strategies.set(strategy.name, strategy);
|
|
319
|
+
}
|
|
320
|
+
this.logger.info(`Loaded ${this.strategies.size} strategies`);
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
this.logger.warn('No previous strategies found');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Store cycle results
|
|
328
|
+
*/
|
|
329
|
+
async storeCycleResults(results) {
|
|
330
|
+
await this.memoryStore.store(`phase2/learning/${this.agentId}/cycles/${results.timestamp.getTime()}`, results, { partition: 'learning', ttl: 2592000 } // 30 days
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Get active A/B tests
|
|
335
|
+
*/
|
|
336
|
+
getActiveTests() {
|
|
337
|
+
return Array.from(this.activeTests.values());
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get all strategies
|
|
341
|
+
*/
|
|
342
|
+
getStrategies() {
|
|
343
|
+
return Array.from(this.strategies.values());
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Check if loop is running
|
|
347
|
+
*/
|
|
348
|
+
isActive() {
|
|
349
|
+
return this.isRunning;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
exports.ImprovementLoop = ImprovementLoop;
|
|
353
|
+
//# sourceMappingURL=ImprovementLoop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImprovementLoop.js","sourceRoot":"","sources":["../../src/learning/ImprovementLoop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LearningEngine - Phase 2 (Milestone 2.2)
|
|
3
|
+
*
|
|
4
|
+
* Implements reinforcement learning for agent performance improvement.
|
|
5
|
+
* Uses Q-learning algorithm to optimize task execution strategies.
|
|
6
|
+
*/
|
|
7
|
+
import { SwarmMemoryManager } from '../core/memory/SwarmMemoryManager';
|
|
8
|
+
import { LearningConfig, TaskState, LearningFeedback, LearningOutcome, LearnedPattern, FailurePattern, StrategyRecommendation } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* LearningEngine - Reinforcement learning for agents
|
|
11
|
+
*/
|
|
12
|
+
export declare class LearningEngine {
|
|
13
|
+
private readonly logger;
|
|
14
|
+
private readonly memoryStore;
|
|
15
|
+
private readonly agentId;
|
|
16
|
+
private config;
|
|
17
|
+
private qTable;
|
|
18
|
+
private experiences;
|
|
19
|
+
private patterns;
|
|
20
|
+
private failurePatterns;
|
|
21
|
+
private taskCount;
|
|
22
|
+
constructor(agentId: string, memoryStore: SwarmMemoryManager, config?: Partial<LearningConfig>);
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the learning engine
|
|
25
|
+
*/
|
|
26
|
+
initialize(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Learn from a task execution
|
|
29
|
+
*/
|
|
30
|
+
learnFromExecution(task: any, result: any, feedback?: LearningFeedback): Promise<LearningOutcome>;
|
|
31
|
+
/**
|
|
32
|
+
* Recommend best strategy for a given state
|
|
33
|
+
*/
|
|
34
|
+
recommendStrategy(state: TaskState): Promise<StrategyRecommendation>;
|
|
35
|
+
/**
|
|
36
|
+
* Get learned patterns
|
|
37
|
+
*/
|
|
38
|
+
getPatterns(): LearnedPattern[];
|
|
39
|
+
/**
|
|
40
|
+
* Get failure patterns
|
|
41
|
+
*/
|
|
42
|
+
getFailurePatterns(): FailurePattern[];
|
|
43
|
+
/**
|
|
44
|
+
* Extract features from state for learning
|
|
45
|
+
*/
|
|
46
|
+
private extractFeatures;
|
|
47
|
+
/**
|
|
48
|
+
* Encode state to string key for Q-table
|
|
49
|
+
*/
|
|
50
|
+
private encodeState;
|
|
51
|
+
/**
|
|
52
|
+
* Encode action to string key
|
|
53
|
+
*/
|
|
54
|
+
private encodeAction;
|
|
55
|
+
/**
|
|
56
|
+
* Extract experience from task execution
|
|
57
|
+
*/
|
|
58
|
+
private extractExperience;
|
|
59
|
+
/**
|
|
60
|
+
* Calculate reward from execution result and feedback
|
|
61
|
+
*/
|
|
62
|
+
private calculateReward;
|
|
63
|
+
/**
|
|
64
|
+
* Update Q-table with new experience (Q-learning algorithm)
|
|
65
|
+
*/
|
|
66
|
+
private updateQTable;
|
|
67
|
+
/**
|
|
68
|
+
* Perform batch update on experiences
|
|
69
|
+
*/
|
|
70
|
+
private performBatchUpdate;
|
|
71
|
+
/**
|
|
72
|
+
* Update learned patterns
|
|
73
|
+
*/
|
|
74
|
+
private updatePatterns;
|
|
75
|
+
/**
|
|
76
|
+
* Detect failure patterns
|
|
77
|
+
*/
|
|
78
|
+
private detectFailurePattern;
|
|
79
|
+
/**
|
|
80
|
+
* Calculate improvement over time
|
|
81
|
+
*/
|
|
82
|
+
private calculateImprovement;
|
|
83
|
+
/**
|
|
84
|
+
* Create learning outcome
|
|
85
|
+
*/
|
|
86
|
+
private createOutcome;
|
|
87
|
+
/**
|
|
88
|
+
* Estimate task complexity
|
|
89
|
+
*/
|
|
90
|
+
private estimateComplexity;
|
|
91
|
+
/**
|
|
92
|
+
* Convert Q-value to confidence score
|
|
93
|
+
*/
|
|
94
|
+
private valueToConfidence;
|
|
95
|
+
/**
|
|
96
|
+
* Decay exploration rate
|
|
97
|
+
*/
|
|
98
|
+
private decayExploration;
|
|
99
|
+
/**
|
|
100
|
+
* Save learning state to memory
|
|
101
|
+
*/
|
|
102
|
+
private saveState;
|
|
103
|
+
/**
|
|
104
|
+
* Load learning state from memory
|
|
105
|
+
*/
|
|
106
|
+
private loadState;
|
|
107
|
+
/**
|
|
108
|
+
* Serialize Q-table for storage
|
|
109
|
+
*/
|
|
110
|
+
private serializeQTable;
|
|
111
|
+
/**
|
|
112
|
+
* Deserialize Q-table from storage
|
|
113
|
+
*/
|
|
114
|
+
private deserializeQTable;
|
|
115
|
+
/**
|
|
116
|
+
* Calculate state size in bytes
|
|
117
|
+
*/
|
|
118
|
+
private calculateStateSize;
|
|
119
|
+
/**
|
|
120
|
+
* Get current performance metrics
|
|
121
|
+
*/
|
|
122
|
+
private getCurrentPerformance;
|
|
123
|
+
/**
|
|
124
|
+
* Emit learning event
|
|
125
|
+
*/
|
|
126
|
+
private emitLearningEvent;
|
|
127
|
+
/**
|
|
128
|
+
* Get current exploration rate
|
|
129
|
+
*/
|
|
130
|
+
getExplorationRate(): number;
|
|
131
|
+
/**
|
|
132
|
+
* Get total experiences
|
|
133
|
+
*/
|
|
134
|
+
getTotalExperiences(): number;
|
|
135
|
+
/**
|
|
136
|
+
* Enable/disable learning
|
|
137
|
+
*/
|
|
138
|
+
setEnabled(enabled: boolean): void;
|
|
139
|
+
/**
|
|
140
|
+
* Check if learning is enabled
|
|
141
|
+
*/
|
|
142
|
+
isEnabled(): boolean;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=LearningEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LearningEngine.d.ts","sourceRoot":"","sources":["../../src/learning/LearningEngine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,cAAc,EAEd,SAAS,EAET,gBAAgB,EAChB,eAAe,EACf,cAAc,EAEd,cAAc,EACd,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AAiBjB;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,SAAS,CAAS;gBAGxB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,kBAAkB,EAC/B,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAatC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACG,kBAAkB,CACtB,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,GAAG,EACX,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,eAAe,CAAC;IAqD3B;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoD1E;;OAEG;IACH,WAAW,IAAI,cAAc,EAAE;IAK/B;;OAEG;IACH,kBAAkB,IAAI,cAAc,EAAE;IAKtC;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyCzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;YACW,YAAY;IA4B1B;;OAEG;YACW,kBAAkB;IAgBhC;;OAEG;YACW,cAAc;IAoC5B;;OAEG;YACW,oBAAoB;IAoBlC;;OAEG;YACW,oBAAoB;IAwBlC;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;YACW,SAAS;IA6BvB;;OAEG;YACW,SAAS;IAmBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;YACW,qBAAqB;IAiBnC;;OAEG;YACW,iBAAiB;IAiB/B;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB"}
|