agentic-qe 1.0.4 → 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 +690 -134
- 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 +34 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +875 -42
- 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/commands/routing/index.d.ts +95 -0
- package/dist/cli/commands/routing/index.d.ts.map +1 -0
- package/dist/cli/commands/routing/index.js +399 -0
- package/dist/cli/commands/routing/index.js.map +1 -0
- package/dist/cli/index.js +455 -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/core/routing/AdaptiveModelRouter.d.ts +86 -0
- package/dist/core/routing/AdaptiveModelRouter.d.ts.map +1 -0
- package/dist/core/routing/AdaptiveModelRouter.js +264 -0
- package/dist/core/routing/AdaptiveModelRouter.js.map +1 -0
- package/dist/core/routing/ComplexityAnalyzer.d.ts +49 -0
- package/dist/core/routing/ComplexityAnalyzer.d.ts.map +1 -0
- package/dist/core/routing/ComplexityAnalyzer.js +182 -0
- package/dist/core/routing/ComplexityAnalyzer.js.map +1 -0
- package/dist/core/routing/CostTracker.d.ts +55 -0
- package/dist/core/routing/CostTracker.d.ts.map +1 -0
- package/dist/core/routing/CostTracker.js +210 -0
- package/dist/core/routing/CostTracker.js.map +1 -0
- package/dist/core/routing/FleetManagerIntegration.d.ts +68 -0
- package/dist/core/routing/FleetManagerIntegration.d.ts.map +1 -0
- package/dist/core/routing/FleetManagerIntegration.js +170 -0
- package/dist/core/routing/FleetManagerIntegration.js.map +1 -0
- package/dist/core/routing/ModelRules.d.ts +38 -0
- package/dist/core/routing/ModelRules.d.ts.map +1 -0
- package/dist/core/routing/ModelRules.js +170 -0
- package/dist/core/routing/ModelRules.js.map +1 -0
- package/dist/core/routing/QETask.d.ts +12 -0
- package/dist/core/routing/QETask.d.ts.map +1 -0
- package/dist/core/routing/QETask.js +21 -0
- package/dist/core/routing/QETask.js.map +1 -0
- package/dist/core/routing/index.d.ts +19 -0
- package/dist/core/routing/index.d.ts.map +1 -0
- package/dist/core/routing/index.js +50 -0
- package/dist/core/routing/index.js.map +1 -0
- package/dist/core/routing/types.d.ts +136 -0
- package/dist/core/routing/types.d.ts.map +1 -0
- package/dist/core/routing/types.js +28 -0
- package/dist/core/routing/types.js.map +1 -0
- 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 +171 -9
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/streaming/CoverageAnalyzeStreamHandler.d.ts +112 -0
- package/dist/mcp/streaming/CoverageAnalyzeStreamHandler.d.ts.map +1 -0
- package/dist/mcp/streaming/CoverageAnalyzeStreamHandler.js +341 -0
- package/dist/mcp/streaming/CoverageAnalyzeStreamHandler.js.map +1 -0
- package/dist/mcp/streaming/StreamingMCPTool.d.ts +80 -0
- package/dist/mcp/streaming/StreamingMCPTool.d.ts.map +1 -0
- package/dist/mcp/streaming/StreamingMCPTool.js +276 -0
- package/dist/mcp/streaming/StreamingMCPTool.js.map +1 -0
- package/dist/mcp/streaming/TestExecuteStreamHandler.d.ts +73 -0
- package/dist/mcp/streaming/TestExecuteStreamHandler.d.ts.map +1 -0
- package/dist/mcp/streaming/TestExecuteStreamHandler.js +436 -0
- package/dist/mcp/streaming/TestExecuteStreamHandler.js.map +1 -0
- package/dist/mcp/streaming/index.d.ts +14 -0
- package/dist/mcp/streaming/index.d.ts.map +1 -0
- package/dist/mcp/streaming/index.js +30 -0
- package/dist/mcp/streaming/index.js.map +1 -0
- package/dist/mcp/streaming/types.d.ts +117 -0
- package/dist/mcp/streaming/types.d.ts.map +1 -0
- package/dist/mcp/streaming/types.js +88 -0
- package/dist/mcp/streaming/types.js.map +1 -0
- package/dist/mcp/tools.d.ts +18 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +123 -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 +20 -1
- 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,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LearningAgent - Phase 2 (Milestone 2.2)
|
|
4
|
+
*
|
|
5
|
+
* Example agent with integrated learning capabilities.
|
|
6
|
+
* Demonstrates how to use LearningEngine, PerformanceTracker, and ImprovementLoop.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LearningAgent = void 0;
|
|
10
|
+
const BaseAgent_1 = require("./BaseAgent");
|
|
11
|
+
const LearningEngine_1 = require("../learning/LearningEngine");
|
|
12
|
+
const PerformanceTracker_1 = require("../learning/PerformanceTracker");
|
|
13
|
+
const ImprovementLoop_1 = require("../learning/ImprovementLoop");
|
|
14
|
+
/**
|
|
15
|
+
* LearningAgent - Agent with reinforcement learning capabilities
|
|
16
|
+
*/
|
|
17
|
+
class LearningAgent extends BaseAgent_1.BaseAgent {
|
|
18
|
+
constructor(config) {
|
|
19
|
+
super(config);
|
|
20
|
+
this.learningEnabled = config.learningEnabled !== false; // default: enabled
|
|
21
|
+
// Initialize learning components
|
|
22
|
+
// Note: BaseAgent uses MemoryStore interface, but Phase 2 learning components
|
|
23
|
+
// expect SwarmMemoryManager. This works because BaseAgent's memoryStore
|
|
24
|
+
// is actually a SwarmMemoryManager instance at runtime.
|
|
25
|
+
this.learningEngine = new LearningEngine_1.LearningEngine(this.agentId.id, this.memoryStore, {
|
|
26
|
+
enabled: this.learningEnabled,
|
|
27
|
+
learningRate: config.learningRate
|
|
28
|
+
});
|
|
29
|
+
this.performanceTracker = new PerformanceTracker_1.PerformanceTracker(this.agentId.id, this.memoryStore);
|
|
30
|
+
this.improvementLoop = new ImprovementLoop_1.ImprovementLoop(this.agentId.id, this.memoryStore, this.learningEngine, this.performanceTracker);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initialize agent with learning components
|
|
34
|
+
*/
|
|
35
|
+
async initializeComponents() {
|
|
36
|
+
if (!this.learningEnabled) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Initialize learning components
|
|
40
|
+
await this.learningEngine.initialize();
|
|
41
|
+
await this.performanceTracker.initialize();
|
|
42
|
+
await this.improvementLoop.initialize();
|
|
43
|
+
// Start improvement loop (runs every hour by default)
|
|
44
|
+
await this.improvementLoop.start();
|
|
45
|
+
this.emitEvent('learning.initialized', {
|
|
46
|
+
agentId: this.agentId,
|
|
47
|
+
enabled: this.learningEnabled
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Post-task hook with learning integration
|
|
52
|
+
*/
|
|
53
|
+
async onPostTask(data) {
|
|
54
|
+
// Call parent implementation
|
|
55
|
+
await super.onPostTask(data);
|
|
56
|
+
if (!this.learningEnabled) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
// Learn from task execution
|
|
61
|
+
const learning = await this.learningEngine.learnFromExecution(data.assignment.task, data.result, await this.getUserFeedback(data.assignment.id));
|
|
62
|
+
// Record performance snapshot
|
|
63
|
+
await this.recordPerformance(data);
|
|
64
|
+
// Apply improvements if learned
|
|
65
|
+
if (learning.improved) {
|
|
66
|
+
await this.applyLearning(learning);
|
|
67
|
+
}
|
|
68
|
+
// Emit learning event
|
|
69
|
+
this.emitEvent('learning.completed', {
|
|
70
|
+
agentId: this.agentId,
|
|
71
|
+
taskId: data.assignment.id,
|
|
72
|
+
improvement: learning.improvementRate,
|
|
73
|
+
patterns: learning.patterns.length
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error('Learning failed:', error);
|
|
78
|
+
// Don't throw - allow task to complete even if learning fails
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Record performance metrics
|
|
83
|
+
*/
|
|
84
|
+
async recordPerformance(data) {
|
|
85
|
+
const executionTime = data.result.executionTime || 0;
|
|
86
|
+
const success = data.result.success !== false;
|
|
87
|
+
await this.performanceTracker.recordSnapshot({
|
|
88
|
+
metrics: {
|
|
89
|
+
tasksCompleted: this.performanceMetrics.tasksCompleted,
|
|
90
|
+
successRate: success ? 1.0 : 0.0,
|
|
91
|
+
averageExecutionTime: executionTime,
|
|
92
|
+
errorRate: success ? 0.0 : 1.0,
|
|
93
|
+
userSatisfaction: data.result.userRating || 0.8,
|
|
94
|
+
resourceEfficiency: data.result.resourceEfficiency || 0.7
|
|
95
|
+
},
|
|
96
|
+
trends: []
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Apply learned improvements
|
|
101
|
+
*/
|
|
102
|
+
async applyLearning(learning) {
|
|
103
|
+
// Store learned patterns in agent memory
|
|
104
|
+
for (const pattern of learning.patterns) {
|
|
105
|
+
await this.storeMemory(`learned-pattern:${pattern.id}`, pattern);
|
|
106
|
+
}
|
|
107
|
+
// Emit improvement event
|
|
108
|
+
this.emitEvent('learning.improved', {
|
|
109
|
+
agentId: this.agentId,
|
|
110
|
+
improvementRate: learning.improvementRate,
|
|
111
|
+
patterns: learning.patterns
|
|
112
|
+
}, 'high');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get user feedback (stub - implement based on your system)
|
|
116
|
+
*/
|
|
117
|
+
async getUserFeedback(taskId) {
|
|
118
|
+
// In a real system, this would fetch actual user feedback
|
|
119
|
+
// For now, return undefined to use only system-calculated rewards
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get learning status
|
|
124
|
+
*/
|
|
125
|
+
async getLearningStatus() {
|
|
126
|
+
const improvement = await this.performanceTracker.calculateImprovement();
|
|
127
|
+
return {
|
|
128
|
+
enabled: this.learningEnabled,
|
|
129
|
+
totalExperiences: this.learningEngine.getTotalExperiences(),
|
|
130
|
+
patterns: this.learningEngine.getPatterns().length,
|
|
131
|
+
improvement,
|
|
132
|
+
activeTests: this.improvementLoop.getActiveTests().length
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get performance report
|
|
137
|
+
*/
|
|
138
|
+
async getPerformanceReport() {
|
|
139
|
+
return await this.performanceTracker.generateReport();
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Enable/disable learning
|
|
143
|
+
*/
|
|
144
|
+
setLearningEnabled(enabled) {
|
|
145
|
+
this.learningEnabled = enabled;
|
|
146
|
+
this.learningEngine.setEnabled(enabled);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create A/B test for strategy comparison
|
|
150
|
+
*/
|
|
151
|
+
async createABTest(name, strategies, sampleSize = 100) {
|
|
152
|
+
return await this.improvementLoop.createABTest(name, strategies, sampleSize);
|
|
153
|
+
}
|
|
154
|
+
// ============================================================================
|
|
155
|
+
// Abstract Methods Implementation
|
|
156
|
+
// ============================================================================
|
|
157
|
+
async performTask(task) {
|
|
158
|
+
// Default implementation - override in subclasses
|
|
159
|
+
return {
|
|
160
|
+
success: true,
|
|
161
|
+
result: 'Task completed',
|
|
162
|
+
executionTime: Date.now()
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async loadKnowledge() {
|
|
166
|
+
// Load agent-specific knowledge
|
|
167
|
+
// Override in subclasses
|
|
168
|
+
}
|
|
169
|
+
async cleanup() {
|
|
170
|
+
// Stop improvement loop
|
|
171
|
+
if (this.improvementLoop) {
|
|
172
|
+
await this.improvementLoop.stop();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.LearningAgent = LearningAgent;
|
|
177
|
+
//# sourceMappingURL=LearningAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LearningAgent.js","sourceRoot":"","sources":["../../src/agents/LearningAgent.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,2CAAyD;AACzD,+DAA4D;AAC5D,uEAAoE;AACpE,iEAA8D;AAa9D;;GAEG;AACH,MAAa,aAAc,SAAQ,qBAAS;IAM1C,YAAY,MAA2B;QACrC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,mBAAmB;QAE5E,iCAAiC;QACjC,8EAA8E;QAC9E,wEAAwE;QACxE,wDAAwD;QACxD,IAAI,CAAC,cAAc,GAAG,IAAI,+BAAc,CACtC,IAAI,CAAC,OAAO,CAAC,EAAE,EACf,IAAI,CAAC,WAA4C,EACjD;YACE,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CACF,CAAC;QAEF,IAAI,CAAC,kBAAkB,GAAG,IAAI,uCAAkB,CAC9C,IAAI,CAAC,OAAO,CAAC,EAAE,EACf,IAAI,CAAC,WAA4C,CAClD,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,IAAI,iCAAe,CACxC,IAAI,CAAC,OAAO,CAAC,EAAE,EACf,IAAI,CAAC,WAA4C,EACjD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,kBAAkB,CACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,oBAAoB;QAClC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,iCAAiC;QACjC,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;QAExC,sDAAsD;QACtD,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAEnC,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE;YACrC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,eAAe;SAC9B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,UAAU,CAAC,IAAkB;QAC3C,6BAA6B;QAC7B,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAC3D,IAAI,CAAC,UAAU,CAAC,IAAI,EACpB,IAAI,CAAC,MAAM,EACX,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAC/C,CAAC;YAEF,8BAA8B;YAC9B,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEnC,gCAAgC;YAChC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YAED,sBAAsB;YACtB,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC1B,WAAW,EAAE,QAAQ,CAAC,eAAe;gBACrC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACzC,8DAA8D;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,IAAkB;QAChD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;QAE9C,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC;YAC3C,OAAO,EAAE;gBACP,cAAc,EAAE,IAAI,CAAC,kBAAkB,CAAC,cAAc;gBACtD,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;gBAChC,oBAAoB,EAAE,aAAa;gBACnC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;gBAC9B,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG;gBAC/C,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,GAAG;aAC1D;YACD,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,QAAa;QACvC,yCAAyC;QACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACnE,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,EAAE,MAAM,CAAC,CAAC;IACb,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,MAAc;QAC1C,0DAA0D;QAC1D,kEAAkE;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB;QAO5B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,CAAC;QAEzE,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE;YAC3D,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,MAAM;YAClD,WAAW;YACX,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC,MAAM;SAC1D,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,oBAAoB;QAC/B,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,OAAgB;QACxC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CACvB,IAAY,EACZ,UAA2C,EAC3C,aAAqB,GAAG;QAExB,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC/E,CAAC;IAED,+EAA+E;IAC/E,kCAAkC;IAClC,+EAA+E;IAErE,KAAK,CAAC,WAAW,CAAC,IAAY;QACtC,kDAAkD;QAClD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gBAAgB;YACxB,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;SAC1B,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,aAAa;QAC3B,gCAAgC;QAChC,yBAAyB;IAC3B,CAAC;IAES,KAAK,CAAC,OAAO;QACrB,wBAAwB;QACxB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AAxND,sCAwNC"}
|
|
@@ -3,13 +3,20 @@
|
|
|
3
3
|
* Implements the algorithm from SPARC Phase 2 Pseudocode Section 2.1
|
|
4
4
|
*/
|
|
5
5
|
import { BaseAgent, BaseAgentConfig } from './BaseAgent';
|
|
6
|
-
import { QETask, TestSuite, TestType } from '../types';
|
|
6
|
+
import { QETask, TestSuite, TestType, PostTaskData } from '../types';
|
|
7
|
+
import { PatternMatch } from '../reasoning/QEReasoningBank';
|
|
7
8
|
interface Logger {
|
|
8
9
|
info(message: string, ...args: any[]): void;
|
|
9
10
|
warn(message: string, ...args: any[]): void;
|
|
10
11
|
error(message: string, ...args: any[]): void;
|
|
11
12
|
debug(message: string, ...args: any[]): void;
|
|
12
13
|
}
|
|
14
|
+
export interface TestGeneratorConfig extends BaseAgentConfig {
|
|
15
|
+
enablePatterns?: boolean;
|
|
16
|
+
enableLearning?: boolean;
|
|
17
|
+
minPatternConfidence?: number;
|
|
18
|
+
patternMatchTimeout?: number;
|
|
19
|
+
}
|
|
13
20
|
export interface TestGenerationRequest {
|
|
14
21
|
sourceCode: {
|
|
15
22
|
ast: any;
|
|
@@ -43,12 +50,20 @@ export interface TestGenerationResult {
|
|
|
43
50
|
testsGenerated: number;
|
|
44
51
|
coverageProjection: number;
|
|
45
52
|
optimizationRatio: number;
|
|
53
|
+
patternsUsed?: number;
|
|
54
|
+
patternHitRate?: number;
|
|
55
|
+
patternMatchTime?: number;
|
|
46
56
|
};
|
|
47
57
|
quality: {
|
|
48
58
|
diversityScore: number;
|
|
49
59
|
riskCoverage: number;
|
|
50
60
|
edgeCasesCovered: number;
|
|
51
61
|
};
|
|
62
|
+
patterns?: {
|
|
63
|
+
matched: PatternMatch[];
|
|
64
|
+
applied: string[];
|
|
65
|
+
savings: number;
|
|
66
|
+
};
|
|
52
67
|
}
|
|
53
68
|
export declare class TestGeneratorAgent extends BaseAgent {
|
|
54
69
|
protected readonly logger: Logger;
|
|
@@ -56,7 +71,11 @@ export declare class TestGeneratorAgent extends BaseAgent {
|
|
|
56
71
|
private consciousnessEngine;
|
|
57
72
|
private psychoSymbolicReasoner;
|
|
58
73
|
private sublinearCore;
|
|
59
|
-
|
|
74
|
+
private reasoningBank?;
|
|
75
|
+
private learningEngine?;
|
|
76
|
+
private performanceTracker?;
|
|
77
|
+
private readonly patternConfig;
|
|
78
|
+
constructor(config: TestGeneratorConfig);
|
|
60
79
|
protected initializeComponents(): Promise<void>;
|
|
61
80
|
protected performTask(task: QETask): Promise<TestGenerationResult>;
|
|
62
81
|
protected loadKnowledge(): Promise<void>;
|
|
@@ -64,6 +83,7 @@ export declare class TestGeneratorAgent extends BaseAgent {
|
|
|
64
83
|
/**
|
|
65
84
|
* Generate tests using AI analysis and sublinear optimization
|
|
66
85
|
* Based on SPARC Phase 2 Algorithm: GenerateTestsWithAI
|
|
86
|
+
* Enhanced with pattern-based generation for 20%+ performance improvement
|
|
67
87
|
*/
|
|
68
88
|
private generateTestsWithAI;
|
|
69
89
|
private analyzeCodeWithConsciousness;
|
|
@@ -104,6 +124,26 @@ export declare class TestGeneratorAgent extends BaseAgent {
|
|
|
104
124
|
private calculateRiskMitigation;
|
|
105
125
|
private storeGenerationResults;
|
|
106
126
|
private saveGenerationState;
|
|
127
|
+
/**
|
|
128
|
+
* Extract code signature for pattern matching
|
|
129
|
+
* Converts source code metadata into ReasoningBank-compatible signature
|
|
130
|
+
*/
|
|
131
|
+
private extractCodeSignature;
|
|
132
|
+
/**
|
|
133
|
+
* Find applicable test patterns from ReasoningBank
|
|
134
|
+
* Target: <50ms p95 latency
|
|
135
|
+
*/
|
|
136
|
+
private findApplicablePatterns;
|
|
137
|
+
/**
|
|
138
|
+
* Apply pattern template to generate test code
|
|
139
|
+
* Accelerates test generation by reusing proven patterns
|
|
140
|
+
*/
|
|
141
|
+
private applyPatternTemplate;
|
|
142
|
+
/**
|
|
143
|
+
* Override onPostTask to integrate learning from test generation
|
|
144
|
+
* Records performance metrics and learns from outcomes
|
|
145
|
+
*/
|
|
146
|
+
protected onPostTask(data: PostTaskData): Promise<void>;
|
|
107
147
|
}
|
|
108
148
|
export {};
|
|
109
149
|
//# sourceMappingURL=TestGeneratorAgent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestGeneratorAgent.d.ts","sourceRoot":"","sources":["../../src/agents/TestGeneratorAgent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,MAAM,EACN,SAAS,EAET,QAAQ,
|
|
1
|
+
{"version":3,"file":"TestGeneratorAgent.d.ts","sourceRoot":"","sources":["../../src/agents/TestGeneratorAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.TestGeneratorAgent = void 0;
|
|
8
8
|
const BaseAgent_1 = require("./BaseAgent");
|
|
9
9
|
const types_1 = require("../types");
|
|
10
|
+
const QEReasoningBank_1 = require("../reasoning/QEReasoningBank");
|
|
11
|
+
const LearningEngine_1 = require("../learning/LearningEngine");
|
|
12
|
+
const PerformanceTracker_1 = require("../learning/PerformanceTracker");
|
|
10
13
|
// Simple console logger implementation
|
|
11
14
|
class ConsoleLogger {
|
|
12
15
|
info(message, ...args) {
|
|
@@ -26,6 +29,26 @@ class TestGeneratorAgent extends BaseAgent_1.BaseAgent {
|
|
|
26
29
|
constructor(config) {
|
|
27
30
|
super(config);
|
|
28
31
|
this.logger = new ConsoleLogger();
|
|
32
|
+
// Initialize pattern configuration with defaults
|
|
33
|
+
this.patternConfig = {
|
|
34
|
+
enabled: config.enablePatterns !== false,
|
|
35
|
+
minConfidence: config.minPatternConfidence || 0.85,
|
|
36
|
+
matchTimeout: config.patternMatchTimeout || 50,
|
|
37
|
+
learningEnabled: config.enableLearning !== false
|
|
38
|
+
};
|
|
39
|
+
// Initialize pattern-based components
|
|
40
|
+
if (this.patternConfig.enabled) {
|
|
41
|
+
this.reasoningBank = new QEReasoningBank_1.QEReasoningBank();
|
|
42
|
+
this.logger.info('[TestGeneratorAgent] Pattern-based generation enabled');
|
|
43
|
+
}
|
|
44
|
+
// Initialize learning components
|
|
45
|
+
if (this.patternConfig.learningEnabled) {
|
|
46
|
+
// Cast memoryStore to SwarmMemoryManager for learning integration
|
|
47
|
+
const swarmMemory = this.memoryStore;
|
|
48
|
+
this.learningEngine = new LearningEngine_1.LearningEngine(this.agentId.id, swarmMemory);
|
|
49
|
+
this.performanceTracker = new PerformanceTracker_1.PerformanceTracker(this.agentId.id, swarmMemory);
|
|
50
|
+
this.logger.info('[TestGeneratorAgent] Learning system enabled');
|
|
51
|
+
}
|
|
29
52
|
}
|
|
30
53
|
// ============================================================================
|
|
31
54
|
// BaseAgent Implementation
|
|
@@ -36,7 +59,17 @@ class TestGeneratorAgent extends BaseAgent_1.BaseAgent {
|
|
|
36
59
|
this.consciousnessEngine = await this.createConsciousnessEngine();
|
|
37
60
|
this.psychoSymbolicReasoner = await this.createPsychoSymbolicReasoner();
|
|
38
61
|
this.sublinearCore = await this.createSublinearCore();
|
|
62
|
+
// Initialize learning components
|
|
63
|
+
if (this.learningEngine) {
|
|
64
|
+
await this.learningEngine.initialize();
|
|
65
|
+
this.logger.info('[TestGeneratorAgent] LearningEngine initialized');
|
|
66
|
+
}
|
|
67
|
+
if (this.performanceTracker) {
|
|
68
|
+
await this.performanceTracker.initialize();
|
|
69
|
+
this.logger.info('[TestGeneratorAgent] PerformanceTracker initialized');
|
|
70
|
+
}
|
|
39
71
|
await this.storeMemory('initialized', true);
|
|
72
|
+
await this.storeMemory('pattern-config', this.patternConfig);
|
|
40
73
|
}
|
|
41
74
|
async performTask(task) {
|
|
42
75
|
const request = task.requirements;
|
|
@@ -64,49 +97,92 @@ class TestGeneratorAgent extends BaseAgent_1.BaseAgent {
|
|
|
64
97
|
/**
|
|
65
98
|
* Generate tests using AI analysis and sublinear optimization
|
|
66
99
|
* Based on SPARC Phase 2 Algorithm: GenerateTestsWithAI
|
|
100
|
+
* Enhanced with pattern-based generation for 20%+ performance improvement
|
|
67
101
|
*/
|
|
68
102
|
async generateTestsWithAI(request) {
|
|
69
103
|
const startTime = Date.now();
|
|
104
|
+
let patternMatchTime = 0;
|
|
105
|
+
let patternsUsed = 0;
|
|
106
|
+
let patternMatches = [];
|
|
107
|
+
let appliedPatterns = [];
|
|
70
108
|
try {
|
|
71
109
|
// Phase 1: Code Analysis using Consciousness Framework
|
|
72
110
|
const codeAnalysis = await this.analyzeCodeWithConsciousness(request.sourceCode);
|
|
73
111
|
const complexityMetrics = request.sourceCode.complexityMetrics;
|
|
74
112
|
const riskFactors = await this.identifyRiskFactors(codeAnalysis, complexityMetrics);
|
|
75
|
-
// Phase 2: Pattern
|
|
113
|
+
// Phase 2: Pattern-Based Generation (NEW - Phase 2 Integration)
|
|
114
|
+
let applicablePatterns = [];
|
|
115
|
+
if (this.reasoningBank && this.patternConfig.enabled) {
|
|
116
|
+
const patternStart = Date.now();
|
|
117
|
+
// Extract code signature for pattern matching
|
|
118
|
+
const codeSignature = await this.extractCodeSignature(request.sourceCode);
|
|
119
|
+
// Find applicable patterns from ReasoningBank
|
|
120
|
+
applicablePatterns = await this.findApplicablePatterns(codeSignature, request.framework);
|
|
121
|
+
patternMatchTime = Date.now() - patternStart;
|
|
122
|
+
patternMatches = applicablePatterns;
|
|
123
|
+
this.logger.info(`[TestGeneratorAgent] Found ${applicablePatterns.length} applicable patterns in ${patternMatchTime}ms`);
|
|
124
|
+
}
|
|
125
|
+
// Phase 3: Pattern Recognition (enhanced with ReasoningBank patterns)
|
|
76
126
|
const patterns = await this.recognizePatterns(request.sourceCode);
|
|
77
|
-
// Phase
|
|
127
|
+
// Phase 4: Test Strategy Selection using Psycho-Symbolic Reasoning
|
|
78
128
|
const testStrategy = await this.selectTestStrategy(patterns, complexityMetrics, riskFactors, request.coverage);
|
|
79
|
-
// Phase
|
|
80
|
-
const testCandidates = await this.generateTestCandidatesSublinear(request.sourceCode, request.framework, request.constraints
|
|
81
|
-
|
|
129
|
+
// Phase 5: Sublinear Test Case Generation (with pattern templates)
|
|
130
|
+
const testCandidates = await this.generateTestCandidatesSublinear(request.sourceCode, request.framework, request.constraints, applicablePatterns // Pass patterns for template-based generation
|
|
131
|
+
);
|
|
132
|
+
// Phase 6: Test Case Optimization using Sublinear Matrix Solving
|
|
82
133
|
const optimalTestSet = await this.optimizeTestSelection(testCandidates, request.coverage);
|
|
83
|
-
// Phase
|
|
84
|
-
const unitTests = await this.generateUnitTests(request.sourceCode, optimalTestSet.unitTestVectors);
|
|
134
|
+
// Phase 7: Generate Specific Test Types (with pattern acceleration)
|
|
135
|
+
const unitTests = await this.generateUnitTests(request.sourceCode, optimalTestSet.unitTestVectors, applicablePatterns);
|
|
85
136
|
const integrationTests = await this.generateIntegrationTests(request.sourceCode, optimalTestSet.integrationVectors);
|
|
86
137
|
const edgeCaseTests = await this.generateEdgeCaseTests(riskFactors, optimalTestSet.edgeCaseVectors);
|
|
87
|
-
//
|
|
138
|
+
// Count patterns actually used
|
|
139
|
+
patternsUsed = applicablePatterns.filter(p => p.applicability > 0.7).length;
|
|
140
|
+
appliedPatterns = applicablePatterns
|
|
141
|
+
.filter(p => p.applicability > 0.7)
|
|
142
|
+
.map(p => p.pattern.id);
|
|
143
|
+
// Phase 8: Test Suite Assembly
|
|
88
144
|
const testSuite = await this.assembleTestSuite(unitTests, integrationTests, edgeCaseTests, testStrategy, request.coverage);
|
|
89
|
-
// Phase
|
|
145
|
+
// Phase 9: Validate Test Suite Quality
|
|
90
146
|
const qualityScore = await this.validateTestSuiteQuality(testSuite);
|
|
91
147
|
let finalTestSuite = testSuite;
|
|
92
148
|
if (qualityScore.overall < 0.8) {
|
|
93
149
|
finalTestSuite = await this.refineTestSuite(testSuite, qualityScore);
|
|
94
150
|
}
|
|
95
151
|
const generationTime = Date.now() - startTime;
|
|
152
|
+
const patternHitRate = testSuite.tests.length > 0
|
|
153
|
+
? patternsUsed / testSuite.tests.length
|
|
154
|
+
: 0;
|
|
155
|
+
// Calculate time savings from pattern usage (estimated 30% faster per pattern-based test)
|
|
156
|
+
const patternSavings = patternsUsed * 100; // Approximate 100ms saved per pattern-based test
|
|
96
157
|
// Store results for learning
|
|
97
158
|
await this.storeGenerationResults(request, finalTestSuite, generationTime);
|
|
159
|
+
// Update pattern metrics in ReasoningBank
|
|
160
|
+
if (this.reasoningBank && applicablePatterns.length > 0) {
|
|
161
|
+
for (const match of applicablePatterns) {
|
|
162
|
+
const wasUsed = appliedPatterns.includes(match.pattern.id);
|
|
163
|
+
await this.reasoningBank.updatePatternMetrics(match.pattern.id, wasUsed);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
98
166
|
return {
|
|
99
167
|
testSuite: finalTestSuite,
|
|
100
168
|
generationMetrics: {
|
|
101
169
|
generationTime,
|
|
102
170
|
testsGenerated: finalTestSuite.tests.length,
|
|
103
171
|
coverageProjection: finalTestSuite.metadata.coverageProjection || 0,
|
|
104
|
-
optimizationRatio: finalTestSuite.metadata.optimizationMetrics?.optimizationRatio || 1.0
|
|
172
|
+
optimizationRatio: finalTestSuite.metadata.optimizationMetrics?.optimizationRatio || 1.0,
|
|
173
|
+
patternsUsed,
|
|
174
|
+
patternHitRate,
|
|
175
|
+
patternMatchTime
|
|
105
176
|
},
|
|
106
177
|
quality: {
|
|
107
178
|
diversityScore: qualityScore.diversity,
|
|
108
179
|
riskCoverage: qualityScore.riskCoverage,
|
|
109
180
|
edgeCasesCovered: qualityScore.edgeCases
|
|
181
|
+
},
|
|
182
|
+
patterns: {
|
|
183
|
+
matched: patternMatches,
|
|
184
|
+
applied: appliedPatterns,
|
|
185
|
+
savings: patternSavings
|
|
110
186
|
}
|
|
111
187
|
};
|
|
112
188
|
}
|
|
@@ -155,7 +231,7 @@ class TestGeneratorAgent extends BaseAgent_1.BaseAgent {
|
|
|
155
231
|
// ============================================================================
|
|
156
232
|
// Sublinear Test Generation
|
|
157
233
|
// ============================================================================
|
|
158
|
-
async generateTestCandidatesSublinear(sourceCode, framework, constraints) {
|
|
234
|
+
async generateTestCandidatesSublinear(sourceCode, framework, constraints, applicablePatterns = []) {
|
|
159
235
|
const testCandidates = [];
|
|
160
236
|
// Generate test vectors using Johnson-Lindenstrauss dimension reduction
|
|
161
237
|
const testVectors = await this.generateTestVectors(sourceCode.complexityMetrics.functionCount * 10);
|
|
@@ -211,15 +287,25 @@ class TestGeneratorAgent extends BaseAgent_1.BaseAgent {
|
|
|
211
287
|
// ============================================================================
|
|
212
288
|
// Test Type Generation
|
|
213
289
|
// ============================================================================
|
|
214
|
-
async generateUnitTests(sourceCode, vectors) {
|
|
290
|
+
async generateUnitTests(sourceCode, vectors, applicablePatterns = []) {
|
|
215
291
|
const unitTests = [];
|
|
216
292
|
const functions = await this.extractFunctions(sourceCode);
|
|
217
293
|
for (const func of functions) {
|
|
218
294
|
const complexity = await this.calculateCyclomaticComplexity(func);
|
|
219
295
|
const testCount = Math.min(complexity * 2, 10);
|
|
296
|
+
// Check if we have applicable patterns for this function
|
|
297
|
+
const funcPatterns = applicablePatterns.filter(p => p.applicability > this.patternConfig.minConfidence &&
|
|
298
|
+
p.pattern.category === 'unit');
|
|
220
299
|
for (let i = 0; i < testCount && i < vectors.length; i++) {
|
|
221
300
|
const parameters = await this.generateParametersFromVector(vectors[i], func.parameters);
|
|
222
301
|
const expectedResult = await this.predictExpectedResult(func, parameters);
|
|
302
|
+
// Use pattern template if available
|
|
303
|
+
let testCode = '';
|
|
304
|
+
if (funcPatterns.length > 0 && i < funcPatterns.length) {
|
|
305
|
+
const pattern = funcPatterns[i];
|
|
306
|
+
testCode = this.applyPatternTemplate(pattern.pattern, func, parameters, expectedResult);
|
|
307
|
+
this.logger.debug(`[TestGeneratorAgent] Using pattern ${pattern.pattern.name} for ${func.name}`);
|
|
308
|
+
}
|
|
223
309
|
const test = {
|
|
224
310
|
id: this.generateTestId(),
|
|
225
311
|
name: `test_${func.name}_${i}`,
|
|
@@ -229,7 +315,8 @@ class TestGeneratorAgent extends BaseAgent_1.BaseAgent {
|
|
|
229
315
|
`${func.name}(${parameters.map((p) => p.value).join(', ')}) === ${JSON.stringify(expectedResult)}`
|
|
230
316
|
],
|
|
231
317
|
expectedResult,
|
|
232
|
-
estimatedDuration: this.estimateTestDuration(func, parameters)
|
|
318
|
+
estimatedDuration: this.estimateTestDuration(func, parameters),
|
|
319
|
+
code: testCode || undefined
|
|
233
320
|
};
|
|
234
321
|
unitTests.push(test);
|
|
235
322
|
}
|
|
@@ -445,6 +532,138 @@ class TestGeneratorAgent extends BaseAgent_1.BaseAgent {
|
|
|
445
532
|
agentId: this.agentId.id
|
|
446
533
|
});
|
|
447
534
|
}
|
|
535
|
+
// ============================================================================
|
|
536
|
+
// Pattern-Based Generation Methods (Phase 2 Integration)
|
|
537
|
+
// ============================================================================
|
|
538
|
+
/**
|
|
539
|
+
* Extract code signature for pattern matching
|
|
540
|
+
* Converts source code metadata into ReasoningBank-compatible signature
|
|
541
|
+
*/
|
|
542
|
+
async extractCodeSignature(sourceCode) {
|
|
543
|
+
const files = sourceCode.files || [];
|
|
544
|
+
const metrics = sourceCode.complexityMetrics || {};
|
|
545
|
+
// Extract function signatures from code
|
|
546
|
+
const functions = await this.extractFunctions(sourceCode);
|
|
547
|
+
const codeSignature = {
|
|
548
|
+
functionName: functions.length > 0 ? functions[0].name : undefined,
|
|
549
|
+
parameters: functions.length > 0
|
|
550
|
+
? functions[0].parameters.map((p) => ({
|
|
551
|
+
name: p.name || 'param',
|
|
552
|
+
type: p.type || 'any',
|
|
553
|
+
optional: p.optional || false
|
|
554
|
+
}))
|
|
555
|
+
: [],
|
|
556
|
+
returnType: 'any',
|
|
557
|
+
imports: files.map((f) => ({
|
|
558
|
+
module: f.path,
|
|
559
|
+
identifiers: []
|
|
560
|
+
})),
|
|
561
|
+
dependencies: [],
|
|
562
|
+
complexity: {
|
|
563
|
+
cyclomaticComplexity: metrics.cyclomaticComplexity || 1,
|
|
564
|
+
cognitiveComplexity: metrics.cognitiveComplexity || 1,
|
|
565
|
+
linesOfCode: metrics.linesOfCode,
|
|
566
|
+
branchCount: metrics.cyclomaticComplexity
|
|
567
|
+
},
|
|
568
|
+
testStructure: {
|
|
569
|
+
describeBlocks: 1,
|
|
570
|
+
itBlocks: Math.max(1, metrics.functionCount || 1),
|
|
571
|
+
hooks: ['beforeEach', 'afterEach']
|
|
572
|
+
}
|
|
573
|
+
};
|
|
574
|
+
return codeSignature;
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Find applicable test patterns from ReasoningBank
|
|
578
|
+
* Target: <50ms p95 latency
|
|
579
|
+
*/
|
|
580
|
+
async findApplicablePatterns(codeSignature, framework) {
|
|
581
|
+
if (!this.reasoningBank) {
|
|
582
|
+
return [];
|
|
583
|
+
}
|
|
584
|
+
const startTime = Date.now();
|
|
585
|
+
try {
|
|
586
|
+
// Query ReasoningBank for matching patterns
|
|
587
|
+
const matches = await this.reasoningBank.findMatchingPatterns({
|
|
588
|
+
codeType: 'test',
|
|
589
|
+
framework: framework,
|
|
590
|
+
language: 'typescript',
|
|
591
|
+
keywords: [
|
|
592
|
+
codeSignature.functionName || 'function',
|
|
593
|
+
'unit-test',
|
|
594
|
+
'jest'
|
|
595
|
+
]
|
|
596
|
+
}, 10 // Limit to top 10 matches
|
|
597
|
+
);
|
|
598
|
+
const elapsed = Date.now() - startTime;
|
|
599
|
+
// Filter by confidence threshold
|
|
600
|
+
const filteredMatches = matches.filter(m => m.confidence >= this.patternConfig.minConfidence);
|
|
601
|
+
this.logger.debug(`[TestGeneratorAgent] Pattern matching completed in ${elapsed}ms, ` +
|
|
602
|
+
`found ${filteredMatches.length}/${matches.length} high-confidence matches`);
|
|
603
|
+
// Warn if matching is too slow (>50ms target)
|
|
604
|
+
if (elapsed > this.patternConfig.matchTimeout) {
|
|
605
|
+
this.logger.warn(`[TestGeneratorAgent] Pattern matching exceeded target (${elapsed}ms > ${this.patternConfig.matchTimeout}ms)`);
|
|
606
|
+
}
|
|
607
|
+
return filteredMatches;
|
|
608
|
+
}
|
|
609
|
+
catch (error) {
|
|
610
|
+
this.logger.error('[TestGeneratorAgent] Pattern matching failed:', error);
|
|
611
|
+
return [];
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Apply pattern template to generate test code
|
|
616
|
+
* Accelerates test generation by reusing proven patterns
|
|
617
|
+
*/
|
|
618
|
+
applyPatternTemplate(pattern, func, parameters, expectedResult) {
|
|
619
|
+
// Use the pattern's template to generate test code
|
|
620
|
+
let testCode = pattern.template;
|
|
621
|
+
// Replace placeholders with actual values
|
|
622
|
+
testCode = testCode
|
|
623
|
+
.replace(/\{\{functionName\}\}/g, func.name)
|
|
624
|
+
.replace(/\{\{parameters\}\}/g, parameters.map(p => p.value).join(', '))
|
|
625
|
+
.replace(/\{\{expectedResult\}\}/g, JSON.stringify(expectedResult));
|
|
626
|
+
return testCode;
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Override onPostTask to integrate learning from test generation
|
|
630
|
+
* Records performance metrics and learns from outcomes
|
|
631
|
+
*/
|
|
632
|
+
async onPostTask(data) {
|
|
633
|
+
await super.onPostTask(data);
|
|
634
|
+
// Only learn if learning is enabled and result is successful
|
|
635
|
+
if (!this.learningEngine || !data.result || !data.result.success) {
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
try {
|
|
639
|
+
// Learn in background to avoid blocking task completion
|
|
640
|
+
this.learningEngine.learnFromExecution(data.assignment.task, data.result).catch(error => {
|
|
641
|
+
this.logger.warn('[TestGeneratorAgent] Learning failed:', error);
|
|
642
|
+
});
|
|
643
|
+
// Record performance snapshot
|
|
644
|
+
if (this.performanceTracker && data.result.generationMetrics) {
|
|
645
|
+
const metrics = data.result.generationMetrics;
|
|
646
|
+
await this.performanceTracker.recordSnapshot({
|
|
647
|
+
metrics: {
|
|
648
|
+
tasksCompleted: 1,
|
|
649
|
+
successRate: data.result.success ? 1.0 : 0.0,
|
|
650
|
+
averageExecutionTime: metrics.generationTime || 0,
|
|
651
|
+
errorRate: data.result.success ? 0.0 : 1.0,
|
|
652
|
+
userSatisfaction: data.result.quality?.diversityScore || 0.8,
|
|
653
|
+
resourceEfficiency: 1.0 - (metrics.optimizationRatio || 0.5)
|
|
654
|
+
},
|
|
655
|
+
trends: [] // Empty trends array for new snapshot
|
|
656
|
+
});
|
|
657
|
+
this.logger.info(`[TestGeneratorAgent] Recorded performance: ` +
|
|
658
|
+
`${metrics.testsGenerated} tests in ${metrics.generationTime}ms, ` +
|
|
659
|
+
`${metrics.patternsUsed || 0} patterns used (${((metrics.patternHitRate || 0) * 100).toFixed(1)}% hit rate)`);
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
catch (error) {
|
|
663
|
+
this.logger.error('[TestGeneratorAgent] Post-task learning failed:', error);
|
|
664
|
+
// Don't throw - learning failures shouldn't break task completion
|
|
665
|
+
}
|
|
666
|
+
}
|
|
448
667
|
}
|
|
449
668
|
exports.TestGeneratorAgent = TestGeneratorAgent;
|
|
450
669
|
//# sourceMappingURL=TestGeneratorAgent.js.map
|