agentic-qe 2.3.3 → 2.3.5
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/CHANGELOG.md +122 -0
- package/README.md +1 -1
- package/dist/agents/ApiContractValidatorAgent.d.ts +5 -0
- package/dist/agents/ApiContractValidatorAgent.d.ts.map +1 -1
- package/dist/agents/ApiContractValidatorAgent.js +41 -0
- package/dist/agents/ApiContractValidatorAgent.js.map +1 -1
- package/dist/agents/BaseAgent.d.ts +10 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +113 -0
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CodeComplexityAnalyzerAgent.d.ts +5 -0
- package/dist/agents/CodeComplexityAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/CodeComplexityAnalyzerAgent.js +47 -0
- package/dist/agents/CodeComplexityAnalyzerAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.d.ts +26 -0
- package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +149 -1
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/DeploymentReadinessAgent.d.ts +5 -0
- package/dist/agents/DeploymentReadinessAgent.d.ts.map +1 -1
- package/dist/agents/DeploymentReadinessAgent.js +41 -0
- package/dist/agents/DeploymentReadinessAgent.js.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.d.ts +5 -0
- package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
- package/dist/agents/FlakyTestHunterAgent.js +40 -0
- package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
- package/dist/agents/FleetCommanderAgent.d.ts +5 -0
- package/dist/agents/FleetCommanderAgent.d.ts.map +1 -1
- package/dist/agents/FleetCommanderAgent.js +51 -0
- package/dist/agents/FleetCommanderAgent.js.map +1 -1
- package/dist/agents/PerformanceTesterAgent.d.ts +5 -0
- package/dist/agents/PerformanceTesterAgent.d.ts.map +1 -1
- package/dist/agents/PerformanceTesterAgent.js +44 -0
- package/dist/agents/PerformanceTesterAgent.js.map +1 -1
- package/dist/agents/ProductionIntelligenceAgent.d.ts +5 -0
- package/dist/agents/ProductionIntelligenceAgent.d.ts.map +1 -1
- package/dist/agents/ProductionIntelligenceAgent.js +46 -0
- package/dist/agents/ProductionIntelligenceAgent.js.map +1 -1
- package/dist/agents/QXPartnerAgent.js +52 -0
- package/dist/agents/QXPartnerAgent.js.map +1 -1
- package/dist/agents/QualityAnalyzerAgent.d.ts +5 -0
- package/dist/agents/QualityAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/QualityAnalyzerAgent.js +45 -0
- package/dist/agents/QualityAnalyzerAgent.js.map +1 -1
- package/dist/agents/QualityGateAgent.d.ts +40 -0
- package/dist/agents/QualityGateAgent.d.ts.map +1 -1
- package/dist/agents/QualityGateAgent.js +227 -1
- package/dist/agents/QualityGateAgent.js.map +1 -1
- package/dist/agents/RegressionRiskAnalyzerAgent.d.ts +5 -0
- package/dist/agents/RegressionRiskAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/RegressionRiskAnalyzerAgent.js +46 -0
- package/dist/agents/RegressionRiskAnalyzerAgent.js.map +1 -1
- package/dist/agents/RequirementsValidatorAgent.d.ts +5 -0
- package/dist/agents/RequirementsValidatorAgent.d.ts.map +1 -1
- package/dist/agents/RequirementsValidatorAgent.js +42 -0
- package/dist/agents/RequirementsValidatorAgent.js.map +1 -1
- package/dist/agents/SecurityScannerAgent.d.ts +5 -0
- package/dist/agents/SecurityScannerAgent.d.ts.map +1 -1
- package/dist/agents/SecurityScannerAgent.js +39 -0
- package/dist/agents/SecurityScannerAgent.js.map +1 -1
- package/dist/agents/TestDataArchitectAgent.d.ts +5 -0
- package/dist/agents/TestDataArchitectAgent.d.ts.map +1 -1
- package/dist/agents/TestDataArchitectAgent.js +46 -0
- package/dist/agents/TestDataArchitectAgent.js.map +1 -1
- package/dist/agents/TestExecutorAgent.d.ts +5 -0
- package/dist/agents/TestExecutorAgent.d.ts.map +1 -1
- package/dist/agents/TestExecutorAgent.js +48 -0
- package/dist/agents/TestExecutorAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +5 -0
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +36 -0
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -1
- package/dist/agents/lifecycle/AgentLifecycleManager.js +5 -2
- package/dist/agents/lifecycle/AgentLifecycleManager.js.map +1 -1
- package/dist/cli/commands/dream/index.d.ts +50 -0
- package/dist/cli/commands/dream/index.d.ts.map +1 -0
- package/dist/cli/commands/dream/index.js +282 -0
- package/dist/cli/commands/dream/index.js.map +1 -0
- package/dist/cli/commands/learn/index.d.ts +31 -5
- package/dist/cli/commands/learn/index.d.ts.map +1 -1
- package/dist/cli/commands/learn/index.js +183 -50
- package/dist/cli/commands/learn/index.js.map +1 -1
- package/dist/cli/commands/transfer/index.d.ts +55 -0
- package/dist/cli/commands/transfer/index.d.ts.map +1 -0
- package/dist/cli/commands/transfer/index.js +317 -0
- package/dist/cli/commands/transfer/index.js.map +1 -0
- package/dist/cli/index.js +224 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +12 -4
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/learning-init.d.ts +39 -0
- package/dist/cli/init/learning-init.d.ts.map +1 -0
- package/dist/cli/init/learning-init.js +239 -0
- package/dist/cli/init/learning-init.js.map +1 -0
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/learning/baselines/BaselineCollector.d.ts +178 -0
- package/dist/learning/baselines/BaselineCollector.d.ts.map +1 -0
- package/dist/learning/baselines/BaselineCollector.js +398 -0
- package/dist/learning/baselines/BaselineCollector.js.map +1 -0
- package/dist/learning/baselines/StandardTaskSuite.d.ts +88 -0
- package/dist/learning/baselines/StandardTaskSuite.d.ts.map +1 -0
- package/dist/learning/baselines/StandardTaskSuite.js +801 -0
- package/dist/learning/baselines/StandardTaskSuite.js.map +1 -0
- package/dist/learning/baselines/index.d.ts +10 -0
- package/dist/learning/baselines/index.d.ts.map +1 -0
- package/dist/learning/baselines/index.js +15 -0
- package/dist/learning/baselines/index.js.map +1 -0
- package/dist/learning/capture/ExecutionRecorder.d.ts +97 -0
- package/dist/learning/capture/ExecutionRecorder.d.ts.map +1 -0
- package/dist/learning/capture/ExecutionRecorder.js +195 -0
- package/dist/learning/capture/ExecutionRecorder.js.map +1 -0
- package/dist/learning/capture/ExperienceCapture.d.ts +177 -0
- package/dist/learning/capture/ExperienceCapture.d.ts.map +1 -0
- package/dist/learning/capture/ExperienceCapture.js +432 -0
- package/dist/learning/capture/ExperienceCapture.js.map +1 -0
- package/dist/learning/capture/ExperienceExtractor.d.ts +219 -0
- package/dist/learning/capture/ExperienceExtractor.d.ts.map +1 -0
- package/dist/learning/capture/ExperienceExtractor.js +536 -0
- package/dist/learning/capture/ExperienceExtractor.js.map +1 -0
- package/dist/learning/capture/ExperienceStore.d.ts +196 -0
- package/dist/learning/capture/ExperienceStore.d.ts.map +1 -0
- package/dist/learning/capture/ExperienceStore.js +453 -0
- package/dist/learning/capture/ExperienceStore.js.map +1 -0
- package/dist/learning/capture/index.d.ts +12 -0
- package/dist/learning/capture/index.d.ts.map +1 -0
- package/dist/learning/capture/index.js +17 -0
- package/dist/learning/capture/index.js.map +1 -0
- package/dist/learning/dashboard/MetricsDashboard.d.ts +63 -0
- package/dist/learning/dashboard/MetricsDashboard.d.ts.map +1 -0
- package/dist/learning/dashboard/MetricsDashboard.js +230 -0
- package/dist/learning/dashboard/MetricsDashboard.js.map +1 -0
- package/dist/learning/dashboard/index.d.ts +7 -0
- package/dist/learning/dashboard/index.d.ts.map +1 -0
- package/dist/learning/dashboard/index.js +23 -0
- package/dist/learning/dashboard/index.js.map +1 -0
- package/dist/learning/dream/ConceptGraph.d.ts +160 -0
- package/dist/learning/dream/ConceptGraph.d.ts.map +1 -0
- package/dist/learning/dream/ConceptGraph.js +445 -0
- package/dist/learning/dream/ConceptGraph.js.map +1 -0
- package/dist/learning/dream/DreamEngine.d.ts +150 -0
- package/dist/learning/dream/DreamEngine.d.ts.map +1 -0
- package/dist/learning/dream/DreamEngine.js +551 -0
- package/dist/learning/dream/DreamEngine.js.map +1 -0
- package/dist/learning/dream/InsightGenerator.d.ts +152 -0
- package/dist/learning/dream/InsightGenerator.d.ts.map +1 -0
- package/dist/learning/dream/InsightGenerator.js +463 -0
- package/dist/learning/dream/InsightGenerator.js.map +1 -0
- package/dist/learning/dream/SpreadingActivation.d.ts +138 -0
- package/dist/learning/dream/SpreadingActivation.d.ts.map +1 -0
- package/dist/learning/dream/SpreadingActivation.js +320 -0
- package/dist/learning/dream/SpreadingActivation.js.map +1 -0
- package/dist/learning/dream/index.d.ts +14 -0
- package/dist/learning/dream/index.d.ts.map +1 -0
- package/dist/learning/dream/index.js +22 -0
- package/dist/learning/dream/index.js.map +1 -0
- package/dist/learning/metrics/AlertManager.d.ts +107 -0
- package/dist/learning/metrics/AlertManager.d.ts.map +1 -0
- package/dist/learning/metrics/AlertManager.js +246 -0
- package/dist/learning/metrics/AlertManager.js.map +1 -0
- package/dist/learning/metrics/LearningMetrics.d.ts +184 -0
- package/dist/learning/metrics/LearningMetrics.d.ts.map +1 -0
- package/dist/learning/metrics/LearningMetrics.js +754 -0
- package/dist/learning/metrics/LearningMetrics.js.map +1 -0
- package/dist/learning/metrics/MetricsCollector.d.ts +108 -0
- package/dist/learning/metrics/MetricsCollector.d.ts.map +1 -0
- package/dist/learning/metrics/MetricsCollector.js +240 -0
- package/dist/learning/metrics/MetricsCollector.js.map +1 -0
- package/dist/learning/metrics/MetricsStore.d.ts +149 -0
- package/dist/learning/metrics/MetricsStore.d.ts.map +1 -0
- package/dist/learning/metrics/MetricsStore.js +502 -0
- package/dist/learning/metrics/MetricsStore.js.map +1 -0
- package/dist/learning/metrics/TrendAnalyzer.d.ts +85 -0
- package/dist/learning/metrics/TrendAnalyzer.d.ts.map +1 -0
- package/dist/learning/metrics/TrendAnalyzer.js +210 -0
- package/dist/learning/metrics/TrendAnalyzer.js.map +1 -0
- package/dist/learning/metrics/index.d.ts +13 -0
- package/dist/learning/metrics/index.d.ts.map +1 -0
- package/dist/learning/metrics/index.js +39 -0
- package/dist/learning/metrics/index.js.map +1 -0
- package/dist/learning/scheduler/IdleDetector.d.ts +126 -0
- package/dist/learning/scheduler/IdleDetector.d.ts.map +1 -0
- package/dist/learning/scheduler/IdleDetector.js +281 -0
- package/dist/learning/scheduler/IdleDetector.js.map +1 -0
- package/dist/learning/scheduler/SleepCycle.d.ts +150 -0
- package/dist/learning/scheduler/SleepCycle.d.ts.map +1 -0
- package/dist/learning/scheduler/SleepCycle.js +506 -0
- package/dist/learning/scheduler/SleepCycle.js.map +1 -0
- package/dist/learning/scheduler/SleepScheduler.d.ts +133 -0
- package/dist/learning/scheduler/SleepScheduler.d.ts.map +1 -0
- package/dist/learning/scheduler/SleepScheduler.js +301 -0
- package/dist/learning/scheduler/SleepScheduler.js.map +1 -0
- package/dist/learning/scheduler/TimeBasedTrigger.d.ts +108 -0
- package/dist/learning/scheduler/TimeBasedTrigger.d.ts.map +1 -0
- package/dist/learning/scheduler/TimeBasedTrigger.js +222 -0
- package/dist/learning/scheduler/TimeBasedTrigger.js.map +1 -0
- package/dist/learning/scheduler/index.d.ts +16 -0
- package/dist/learning/scheduler/index.d.ts.map +1 -0
- package/dist/learning/scheduler/index.js +23 -0
- package/dist/learning/scheduler/index.js.map +1 -0
- package/dist/learning/synthesis/ClusteringEngine.d.ts +122 -0
- package/dist/learning/synthesis/ClusteringEngine.d.ts.map +1 -0
- package/dist/learning/synthesis/ClusteringEngine.js +356 -0
- package/dist/learning/synthesis/ClusteringEngine.js.map +1 -0
- package/dist/learning/synthesis/PatternSynthesis.d.ts +162 -0
- package/dist/learning/synthesis/PatternSynthesis.d.ts.map +1 -0
- package/dist/learning/synthesis/PatternSynthesis.js +479 -0
- package/dist/learning/synthesis/PatternSynthesis.js.map +1 -0
- package/dist/learning/synthesis/index.d.ts +10 -0
- package/dist/learning/synthesis/index.d.ts.map +1 -0
- package/dist/learning/synthesis/index.js +14 -0
- package/dist/learning/synthesis/index.js.map +1 -0
- package/dist/learning/transfer/CompatibilityScorer.d.ts +115 -0
- package/dist/learning/transfer/CompatibilityScorer.d.ts.map +1 -0
- package/dist/learning/transfer/CompatibilityScorer.js +319 -0
- package/dist/learning/transfer/CompatibilityScorer.js.map +1 -0
- package/dist/learning/transfer/TransferProtocol.d.ts +172 -0
- package/dist/learning/transfer/TransferProtocol.d.ts.map +1 -0
- package/dist/learning/transfer/TransferProtocol.js +611 -0
- package/dist/learning/transfer/TransferProtocol.js.map +1 -0
- package/dist/learning/transfer/TransferPrototype.d.ts +93 -0
- package/dist/learning/transfer/TransferPrototype.d.ts.map +1 -0
- package/dist/learning/transfer/TransferPrototype.js +433 -0
- package/dist/learning/transfer/TransferPrototype.js.map +1 -0
- package/dist/learning/transfer/TransferRegistry.d.ts +245 -0
- package/dist/learning/transfer/TransferRegistry.d.ts.map +1 -0
- package/dist/learning/transfer/TransferRegistry.js +410 -0
- package/dist/learning/transfer/TransferRegistry.js.map +1 -0
- package/dist/learning/transfer/TransferValidator.d.ts +140 -0
- package/dist/learning/transfer/TransferValidator.d.ts.map +1 -0
- package/dist/learning/transfer/TransferValidator.js +413 -0
- package/dist/learning/transfer/TransferValidator.js.map +1 -0
- package/dist/learning/transfer/index.d.ts +14 -0
- package/dist/learning/transfer/index.d.ts.map +1 -0
- package/dist/learning/transfer/index.js +22 -0
- package/dist/learning/transfer/index.js.map +1 -0
- package/dist/mcp/handlers/task-orchestrate.d.ts +11 -0
- package/dist/mcp/handlers/task-orchestrate.d.ts.map +1 -1
- package/dist/mcp/handlers/task-orchestrate.js +297 -4
- package/dist/mcp/handlers/task-orchestrate.js.map +1 -1
- package/dist/mcp/handlers/test/test-generate-enhanced.d.ts +26 -2
- package/dist/mcp/handlers/test/test-generate-enhanced.d.ts.map +1 -1
- package/dist/mcp/handlers/test/test-generate-enhanced.js +159 -27
- package/dist/mcp/handlers/test/test-generate-enhanced.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/services/AgentRegistry.d.ts +6 -1
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
- package/dist/mcp/services/AgentRegistry.js +34 -3
- package/dist/mcp/services/AgentRegistry.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,754 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LearningMetrics - Collect and track learning effectiveness metrics
|
|
4
|
+
*
|
|
5
|
+
* Aggregates metrics from patterns, dreams, transfers, and experiences
|
|
6
|
+
* to measure the learning system's effectiveness.
|
|
7
|
+
*
|
|
8
|
+
* Part of the Nightly-Learner Phase 3 implementation.
|
|
9
|
+
*
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
* @module src/learning/metrics/LearningMetrics
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
47
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.LearningMetrics = void 0;
|
|
51
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const Logger_1 = require("../../utils/Logger");
|
|
54
|
+
/**
|
|
55
|
+
* LearningMetrics collects and analyzes learning system effectiveness
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const metrics = new LearningMetrics();
|
|
60
|
+
*
|
|
61
|
+
* // Get current metrics
|
|
62
|
+
* const current = await metrics.getCurrentMetrics();
|
|
63
|
+
* console.log(`Discovery rate: ${current.discoveryRate} patterns/hour`);
|
|
64
|
+
* console.log(`Transfer success: ${(current.transferSuccessRate * 100).toFixed(1)}%`);
|
|
65
|
+
*
|
|
66
|
+
* // Get comprehensive summary with breakdown
|
|
67
|
+
* const summary = await metrics.getMetricsSummary();
|
|
68
|
+
* console.log(`Quality trend: ${summary.trends.qualityTrend > 0 ? 'improving' : 'declining'}`);
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
class LearningMetrics {
|
|
72
|
+
constructor(config) {
|
|
73
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
74
|
+
this.config = {
|
|
75
|
+
dbPath: config?.dbPath || path.join(process.cwd(), '.agentic-qe', 'memory.db'),
|
|
76
|
+
debug: config?.debug ?? false,
|
|
77
|
+
};
|
|
78
|
+
this.db = new better_sqlite3_1.default(this.config.dbPath);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get current learning metrics
|
|
82
|
+
*/
|
|
83
|
+
async getCurrentMetrics(periodHours = 24) {
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
const periodStart = now - periodHours * 60 * 60 * 1000;
|
|
86
|
+
// Discovery metrics
|
|
87
|
+
const discovery = this.calculateDiscoveryMetrics(periodStart, now);
|
|
88
|
+
// Quality metrics
|
|
89
|
+
const quality = this.calculateQualityMetrics();
|
|
90
|
+
// Transfer metrics
|
|
91
|
+
const transfer = this.calculateTransferMetrics();
|
|
92
|
+
// Impact metrics
|
|
93
|
+
const impact = this.calculateImpactMetrics(periodStart, now);
|
|
94
|
+
// System health
|
|
95
|
+
const health = this.calculateSystemHealthMetrics(periodStart, now);
|
|
96
|
+
const metrics = {
|
|
97
|
+
// Discovery
|
|
98
|
+
patternsDiscoveredTotal: discovery.total,
|
|
99
|
+
patternsDiscoveredToday: discovery.today,
|
|
100
|
+
discoveryRate: discovery.rate,
|
|
101
|
+
// Quality
|
|
102
|
+
patternAccuracy: quality.accuracy,
|
|
103
|
+
insightActionability: quality.actionability,
|
|
104
|
+
falsePositiveRate: quality.falsePositiveRate,
|
|
105
|
+
// Transfer
|
|
106
|
+
transferSuccessRate: transfer.successRate,
|
|
107
|
+
adoptionRate: transfer.adoptionRate,
|
|
108
|
+
negativeTransferCount: transfer.negativeTransfers,
|
|
109
|
+
// Impact
|
|
110
|
+
taskTimeReduction: impact.timeReduction,
|
|
111
|
+
coverageImprovement: impact.coverageImprovement,
|
|
112
|
+
bugDetectionImprovement: impact.bugDetectionImprovement,
|
|
113
|
+
// System health
|
|
114
|
+
sleepCycleCompletionRate: health.completionRate,
|
|
115
|
+
avgCycleDuration: health.avgDuration,
|
|
116
|
+
errorRate: health.errorRate,
|
|
117
|
+
// Metadata
|
|
118
|
+
calculatedAt: new Date(),
|
|
119
|
+
periodStart: new Date(periodStart),
|
|
120
|
+
periodEnd: new Date(now),
|
|
121
|
+
};
|
|
122
|
+
return metrics;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get comprehensive metrics summary with breakdown
|
|
126
|
+
*/
|
|
127
|
+
async getMetricsSummary(periodHours = 24) {
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
const periodStart = now - periodHours * 60 * 60 * 1000;
|
|
130
|
+
const metrics = await this.getCurrentMetrics(periodHours);
|
|
131
|
+
const breakdown = {
|
|
132
|
+
discovery: this.getDiscoveryBreakdown(periodStart, now),
|
|
133
|
+
quality: this.getQualityBreakdown(),
|
|
134
|
+
transfer: this.getTransferBreakdown(),
|
|
135
|
+
impact: this.getImpactBreakdown(periodStart, now),
|
|
136
|
+
system: this.getSystemHealthBreakdown(periodStart, now),
|
|
137
|
+
};
|
|
138
|
+
const trends = this.calculateTrends(periodStart, now);
|
|
139
|
+
return {
|
|
140
|
+
metrics,
|
|
141
|
+
breakdown,
|
|
142
|
+
trends,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Calculate discovery metrics
|
|
147
|
+
*/
|
|
148
|
+
calculateDiscoveryMetrics(periodStart, periodEnd) {
|
|
149
|
+
try {
|
|
150
|
+
// Total patterns ever discovered
|
|
151
|
+
const totalRow = this.db.prepare(`
|
|
152
|
+
SELECT COUNT(*) as count FROM patterns
|
|
153
|
+
`).get();
|
|
154
|
+
// Patterns discovered today (last 24 hours)
|
|
155
|
+
const dayStart = periodEnd - 24 * 60 * 60 * 1000;
|
|
156
|
+
const todayRow = this.db.prepare(`
|
|
157
|
+
SELECT COUNT(*) as count FROM patterns
|
|
158
|
+
WHERE created_at >= ?
|
|
159
|
+
`).get(dayStart);
|
|
160
|
+
// Patterns in period
|
|
161
|
+
const periodRow = this.db.prepare(`
|
|
162
|
+
SELECT COUNT(*) as count FROM patterns
|
|
163
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
164
|
+
`).get(periodStart, periodEnd);
|
|
165
|
+
const periodHours = (periodEnd - periodStart) / (1000 * 60 * 60);
|
|
166
|
+
const rate = periodHours > 0 ? periodRow.count / periodHours : 0;
|
|
167
|
+
return {
|
|
168
|
+
total: totalRow?.count || 0,
|
|
169
|
+
today: todayRow?.count || 0,
|
|
170
|
+
rate,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
if (this.config.debug) {
|
|
175
|
+
this.logger.debug('[LearningMetrics] Discovery metrics calculation error', { error });
|
|
176
|
+
}
|
|
177
|
+
return { total: 0, today: 0, rate: 0 };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Calculate quality metrics
|
|
182
|
+
*/
|
|
183
|
+
calculateQualityMetrics() {
|
|
184
|
+
try {
|
|
185
|
+
// Pattern accuracy (avg confidence)
|
|
186
|
+
const confidenceRow = this.db.prepare(`
|
|
187
|
+
SELECT AVG(confidence) as avg FROM patterns
|
|
188
|
+
WHERE confidence IS NOT NULL
|
|
189
|
+
`).get();
|
|
190
|
+
// Insight actionability (insights applied / total insights)
|
|
191
|
+
const insightsRow = this.db.prepare(`
|
|
192
|
+
SELECT
|
|
193
|
+
COUNT(*) as total,
|
|
194
|
+
SUM(CASE WHEN status = 'applied' THEN 1 ELSE 0 END) as applied
|
|
195
|
+
FROM dream_insights
|
|
196
|
+
`).get();
|
|
197
|
+
const actionability = insightsRow?.total > 0
|
|
198
|
+
? (insightsRow.applied || 0) / insightsRow.total
|
|
199
|
+
: 0.5; // Default to neutral
|
|
200
|
+
// False positive rate (low confidence patterns / total)
|
|
201
|
+
const falsePositiveRow = this.db.prepare(`
|
|
202
|
+
SELECT
|
|
203
|
+
COUNT(*) as total,
|
|
204
|
+
SUM(CASE WHEN confidence < 0.5 THEN 1 ELSE 0 END) as low_confidence
|
|
205
|
+
FROM patterns
|
|
206
|
+
WHERE confidence IS NOT NULL
|
|
207
|
+
`).get();
|
|
208
|
+
const falsePositiveRate = falsePositiveRow?.total > 0
|
|
209
|
+
? (falsePositiveRow.low_confidence || 0) / falsePositiveRow.total
|
|
210
|
+
: 0;
|
|
211
|
+
return {
|
|
212
|
+
accuracy: confidenceRow?.avg || 0.7,
|
|
213
|
+
actionability,
|
|
214
|
+
falsePositiveRate,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
if (this.config.debug) {
|
|
219
|
+
this.logger.debug('[LearningMetrics] Quality metrics calculation error', { error });
|
|
220
|
+
}
|
|
221
|
+
return { accuracy: 0.7, actionability: 0.5, falsePositiveRate: 0 };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Calculate transfer metrics
|
|
226
|
+
*/
|
|
227
|
+
calculateTransferMetrics() {
|
|
228
|
+
try {
|
|
229
|
+
// Transfer success rate from registry
|
|
230
|
+
const transferRow = this.db.prepare(`
|
|
231
|
+
SELECT
|
|
232
|
+
COUNT(*) as total,
|
|
233
|
+
SUM(CASE WHEN status = 'active' AND validation_passed = 1 THEN 1 ELSE 0 END) as successful
|
|
234
|
+
FROM transfer_registry
|
|
235
|
+
`).get();
|
|
236
|
+
const successRate = transferRow?.total > 0
|
|
237
|
+
? (transferRow.successful || 0) / transferRow.total
|
|
238
|
+
: 0;
|
|
239
|
+
// Adoption rate (transferred patterns that were actually used)
|
|
240
|
+
// We look for patterns in captured_experiences that were transferred
|
|
241
|
+
const adoptionRow = this.db.prepare(`
|
|
242
|
+
SELECT
|
|
243
|
+
COUNT(DISTINCT tr.pattern_id) as transferred,
|
|
244
|
+
COUNT(DISTINCT ce.id) as used
|
|
245
|
+
FROM transfer_registry tr
|
|
246
|
+
LEFT JOIN captured_experiences ce ON
|
|
247
|
+
JSON_EXTRACT(ce.context, '$.patterns_used') LIKE '%' || tr.pattern_id || '%'
|
|
248
|
+
WHERE tr.status = 'active'
|
|
249
|
+
`).get();
|
|
250
|
+
const adoptionRate = adoptionRow?.transferred > 0
|
|
251
|
+
? (adoptionRow.used || 0) / adoptionRow.transferred
|
|
252
|
+
: 0;
|
|
253
|
+
// Negative transfers (patterns transferred but led to failures)
|
|
254
|
+
const negativeRow = this.db.prepare(`
|
|
255
|
+
SELECT COUNT(DISTINCT tr.id) as count
|
|
256
|
+
FROM transfer_registry tr
|
|
257
|
+
JOIN captured_experiences ce ON
|
|
258
|
+
JSON_EXTRACT(ce.context, '$.patterns_used') LIKE '%' || tr.pattern_id || '%'
|
|
259
|
+
WHERE tr.status = 'active'
|
|
260
|
+
AND JSON_EXTRACT(ce.execution, '$.success') = 0
|
|
261
|
+
`).get();
|
|
262
|
+
return {
|
|
263
|
+
successRate,
|
|
264
|
+
adoptionRate,
|
|
265
|
+
negativeTransfers: negativeRow?.count || 0,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
if (this.config.debug) {
|
|
270
|
+
this.logger.debug('[LearningMetrics] Transfer metrics calculation error', { error });
|
|
271
|
+
}
|
|
272
|
+
return { successRate: 0, adoptionRate: 0, negativeTransfers: 0 };
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Calculate impact metrics
|
|
277
|
+
*/
|
|
278
|
+
calculateImpactMetrics(periodStart, periodEnd) {
|
|
279
|
+
try {
|
|
280
|
+
// Task time reduction (compare executions with/without patterns)
|
|
281
|
+
const timeRow = this.db.prepare(`
|
|
282
|
+
SELECT
|
|
283
|
+
AVG(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) > 0
|
|
284
|
+
THEN JSON_EXTRACT(execution, '$.duration') END) as with_patterns,
|
|
285
|
+
AVG(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) = 0
|
|
286
|
+
THEN JSON_EXTRACT(execution, '$.duration') END) as without_patterns
|
|
287
|
+
FROM captured_experiences
|
|
288
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
289
|
+
AND JSON_EXTRACT(execution, '$.success') = 1
|
|
290
|
+
`).get(periodStart, periodEnd);
|
|
291
|
+
const timeReduction = (timeRow?.without_patterns && timeRow?.with_patterns)
|
|
292
|
+
? ((timeRow.without_patterns - timeRow.with_patterns) / timeRow.without_patterns) * 100
|
|
293
|
+
: 0;
|
|
294
|
+
// Coverage improvement (would need coverage data - placeholder calculation)
|
|
295
|
+
const coverageRow = this.db.prepare(`
|
|
296
|
+
SELECT
|
|
297
|
+
AVG(CASE WHEN created_at < ? THEN JSON_EXTRACT(outcome, '$.coverage') END) as before,
|
|
298
|
+
AVG(CASE WHEN created_at >= ? THEN JSON_EXTRACT(outcome, '$.coverage') END) as after
|
|
299
|
+
FROM captured_experiences
|
|
300
|
+
WHERE JSON_EXTRACT(outcome, '$.coverage') IS NOT NULL
|
|
301
|
+
`).get(periodStart, periodStart);
|
|
302
|
+
const coverageImprovement = (coverageRow?.before && coverageRow?.after)
|
|
303
|
+
? ((coverageRow.after - coverageRow.before) / coverageRow.before) * 100
|
|
304
|
+
: 0;
|
|
305
|
+
// Bug detection improvement (issues found before/after pattern adoption)
|
|
306
|
+
const bugRow = this.db.prepare(`
|
|
307
|
+
SELECT
|
|
308
|
+
SUM(CASE WHEN created_at < ? THEN JSON_EXTRACT(outcome, '$.bugs_found') END) as before,
|
|
309
|
+
SUM(CASE WHEN created_at >= ? THEN JSON_EXTRACT(outcome, '$.bugs_found') END) as after
|
|
310
|
+
FROM captured_experiences
|
|
311
|
+
WHERE JSON_EXTRACT(outcome, '$.bugs_found') IS NOT NULL
|
|
312
|
+
`).get(periodStart, periodStart);
|
|
313
|
+
const bugDetectionImprovement = (bugRow?.before && bugRow?.after && bugRow.before > 0)
|
|
314
|
+
? ((bugRow.after - bugRow.before) / bugRow.before) * 100
|
|
315
|
+
: 0;
|
|
316
|
+
return {
|
|
317
|
+
timeReduction,
|
|
318
|
+
coverageImprovement,
|
|
319
|
+
bugDetectionImprovement,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
if (this.config.debug) {
|
|
324
|
+
this.logger.debug('[LearningMetrics] Impact metrics calculation error', { error });
|
|
325
|
+
}
|
|
326
|
+
return { timeReduction: 0, coverageImprovement: 0, bugDetectionImprovement: 0 };
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Calculate system health metrics
|
|
331
|
+
*/
|
|
332
|
+
calculateSystemHealthMetrics(periodStart, periodEnd) {
|
|
333
|
+
try {
|
|
334
|
+
// Sleep cycle completion rate
|
|
335
|
+
const cycleRow = this.db.prepare(`
|
|
336
|
+
SELECT
|
|
337
|
+
COUNT(*) as total,
|
|
338
|
+
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed
|
|
339
|
+
FROM dream_cycles
|
|
340
|
+
WHERE start_time >= ? AND start_time <= ?
|
|
341
|
+
`).get(periodStart, periodEnd);
|
|
342
|
+
const completionRate = cycleRow?.total > 0
|
|
343
|
+
? (cycleRow.completed || 0) / cycleRow.total
|
|
344
|
+
: 0;
|
|
345
|
+
// Average cycle duration
|
|
346
|
+
const durationRow = this.db.prepare(`
|
|
347
|
+
SELECT AVG(duration) as avg
|
|
348
|
+
FROM dream_cycles
|
|
349
|
+
WHERE status = 'completed'
|
|
350
|
+
AND start_time >= ? AND start_time <= ?
|
|
351
|
+
`).get(periodStart, periodEnd);
|
|
352
|
+
// Error rate (failed executions / total executions)
|
|
353
|
+
const errorRow = this.db.prepare(`
|
|
354
|
+
SELECT
|
|
355
|
+
COUNT(*) as total,
|
|
356
|
+
SUM(CASE WHEN JSON_EXTRACT(execution, '$.success') = 0 THEN 1 ELSE 0 END) as errors
|
|
357
|
+
FROM captured_experiences
|
|
358
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
359
|
+
`).get(periodStart, periodEnd);
|
|
360
|
+
const errorRate = errorRow?.total > 0
|
|
361
|
+
? (errorRow.errors || 0) / errorRow.total
|
|
362
|
+
: 0;
|
|
363
|
+
return {
|
|
364
|
+
completionRate,
|
|
365
|
+
avgDuration: durationRow?.avg || 0,
|
|
366
|
+
errorRate,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
if (this.config.debug) {
|
|
371
|
+
this.logger.debug('[LearningMetrics] System health metrics calculation error', { error });
|
|
372
|
+
}
|
|
373
|
+
return { completionRate: 0, avgDuration: 0, errorRate: 0 };
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Get detailed discovery breakdown
|
|
378
|
+
*/
|
|
379
|
+
getDiscoveryBreakdown(periodStart, periodEnd) {
|
|
380
|
+
try {
|
|
381
|
+
const now = Date.now();
|
|
382
|
+
const dayAgo = now - 24 * 60 * 60 * 1000;
|
|
383
|
+
const weekAgo = now - 7 * 24 * 60 * 60 * 1000;
|
|
384
|
+
const monthAgo = now - 30 * 24 * 60 * 60 * 1000;
|
|
385
|
+
const totalRow = this.db.prepare(`SELECT COUNT(*) as count FROM patterns`).get();
|
|
386
|
+
const todayRow = this.db.prepare(`SELECT COUNT(*) as count FROM patterns WHERE created_at >= ?`).get(dayAgo);
|
|
387
|
+
const weekRow = this.db.prepare(`SELECT COUNT(*) as count FROM patterns WHERE created_at >= ?`).get(weekAgo);
|
|
388
|
+
const monthRow = this.db.prepare(`SELECT COUNT(*) as count FROM patterns WHERE created_at >= ?`).get(monthAgo);
|
|
389
|
+
const avgPerDay = (monthRow?.count || 0) / 30;
|
|
390
|
+
// Average patterns per dream cycle
|
|
391
|
+
const cycleRow = this.db.prepare(`
|
|
392
|
+
SELECT AVG(insights_generated) as avg
|
|
393
|
+
FROM dream_cycles
|
|
394
|
+
WHERE status = 'completed'
|
|
395
|
+
`).get();
|
|
396
|
+
return {
|
|
397
|
+
totalPatterns: totalRow?.count || 0,
|
|
398
|
+
todayPatterns: todayRow?.count || 0,
|
|
399
|
+
weekPatterns: weekRow?.count || 0,
|
|
400
|
+
monthPatterns: monthRow?.count || 0,
|
|
401
|
+
avgPatternsPerDay: avgPerDay,
|
|
402
|
+
avgPatternsPerCycle: cycleRow?.avg || 0,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
return {
|
|
407
|
+
totalPatterns: 0,
|
|
408
|
+
todayPatterns: 0,
|
|
409
|
+
weekPatterns: 0,
|
|
410
|
+
monthPatterns: 0,
|
|
411
|
+
avgPatternsPerDay: 0,
|
|
412
|
+
avgPatternsPerCycle: 0,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Get detailed quality breakdown
|
|
418
|
+
*/
|
|
419
|
+
getQualityBreakdown() {
|
|
420
|
+
try {
|
|
421
|
+
const confidenceRow = this.db.prepare(`
|
|
422
|
+
SELECT
|
|
423
|
+
SUM(CASE WHEN confidence >= 0.8 THEN 1 ELSE 0 END) as high,
|
|
424
|
+
SUM(CASE WHEN confidence >= 0.5 AND confidence < 0.8 THEN 1 ELSE 0 END) as medium,
|
|
425
|
+
SUM(CASE WHEN confidence < 0.5 THEN 1 ELSE 0 END) as low,
|
|
426
|
+
AVG(confidence) as avg
|
|
427
|
+
FROM patterns
|
|
428
|
+
WHERE confidence IS NOT NULL
|
|
429
|
+
`).get();
|
|
430
|
+
const insightRow = this.db.prepare(`
|
|
431
|
+
SELECT
|
|
432
|
+
SUM(CASE WHEN status = 'applied' THEN 1 ELSE 0 END) as applied,
|
|
433
|
+
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
|
|
434
|
+
SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) as rejected
|
|
435
|
+
FROM dream_insights
|
|
436
|
+
`).get();
|
|
437
|
+
return {
|
|
438
|
+
highConfidencePatterns: confidenceRow?.high || 0,
|
|
439
|
+
mediumConfidencePatterns: confidenceRow?.medium || 0,
|
|
440
|
+
lowConfidencePatterns: confidenceRow?.low || 0,
|
|
441
|
+
avgConfidence: confidenceRow?.avg || 0.7,
|
|
442
|
+
insightsApplied: insightRow?.applied || 0,
|
|
443
|
+
insightsPending: insightRow?.pending || 0,
|
|
444
|
+
insightsRejected: insightRow?.rejected || 0,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
catch (error) {
|
|
448
|
+
return {
|
|
449
|
+
highConfidencePatterns: 0,
|
|
450
|
+
mediumConfidencePatterns: 0,
|
|
451
|
+
lowConfidencePatterns: 0,
|
|
452
|
+
avgConfidence: 0.7,
|
|
453
|
+
insightsApplied: 0,
|
|
454
|
+
insightsPending: 0,
|
|
455
|
+
insightsRejected: 0,
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Get detailed transfer breakdown
|
|
461
|
+
*/
|
|
462
|
+
getTransferBreakdown() {
|
|
463
|
+
try {
|
|
464
|
+
const transferRow = this.db.prepare(`
|
|
465
|
+
SELECT
|
|
466
|
+
COUNT(*) as total,
|
|
467
|
+
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as successful,
|
|
468
|
+
AVG(compatibility_score) as avg_score
|
|
469
|
+
FROM transfer_registry
|
|
470
|
+
`).get();
|
|
471
|
+
const pairRows = this.db.prepare(`
|
|
472
|
+
SELECT
|
|
473
|
+
source_agent,
|
|
474
|
+
target_agent,
|
|
475
|
+
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as success,
|
|
476
|
+
SUM(CASE WHEN status != 'active' THEN 1 ELSE 0 END) as fail
|
|
477
|
+
FROM transfer_registry
|
|
478
|
+
GROUP BY source_agent, target_agent
|
|
479
|
+
`).all();
|
|
480
|
+
const transfersByAgentPair = new Map();
|
|
481
|
+
for (const row of pairRows) {
|
|
482
|
+
const key = `${row.source_agent}->${row.target_agent}`;
|
|
483
|
+
transfersByAgentPair.set(key, {
|
|
484
|
+
success: row.success || 0,
|
|
485
|
+
fail: row.fail || 0,
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
// Count patterns used post-transfer
|
|
489
|
+
const usageRow = this.db.prepare(`
|
|
490
|
+
SELECT COUNT(DISTINCT pattern_id) as count
|
|
491
|
+
FROM transfer_registry tr
|
|
492
|
+
WHERE EXISTS (
|
|
493
|
+
SELECT 1 FROM captured_experiences ce
|
|
494
|
+
WHERE JSON_EXTRACT(ce.context, '$.patterns_used') LIKE '%' || tr.pattern_id || '%'
|
|
495
|
+
)
|
|
496
|
+
`).get();
|
|
497
|
+
return {
|
|
498
|
+
totalTransfers: transferRow?.total || 0,
|
|
499
|
+
successfulTransfers: transferRow?.successful || 0,
|
|
500
|
+
failedTransfers: (transferRow?.total || 0) - (transferRow?.successful || 0),
|
|
501
|
+
avgCompatibilityScore: transferRow?.avg_score || 0,
|
|
502
|
+
transfersByAgentPair,
|
|
503
|
+
patternsUsedPostTransfer: usageRow?.count || 0,
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
catch (error) {
|
|
507
|
+
return {
|
|
508
|
+
totalTransfers: 0,
|
|
509
|
+
successfulTransfers: 0,
|
|
510
|
+
failedTransfers: 0,
|
|
511
|
+
avgCompatibilityScore: 0,
|
|
512
|
+
transfersByAgentPair: new Map(),
|
|
513
|
+
patternsUsedPostTransfer: 0,
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Get detailed impact breakdown
|
|
519
|
+
*/
|
|
520
|
+
getImpactBreakdown(periodStart, periodEnd) {
|
|
521
|
+
try {
|
|
522
|
+
const taskRow = this.db.prepare(`
|
|
523
|
+
SELECT
|
|
524
|
+
SUM(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) > 0 THEN 1 ELSE 0 END) as with_patterns,
|
|
525
|
+
SUM(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) = 0 THEN 1 ELSE 0 END) as without_patterns,
|
|
526
|
+
AVG(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) > 0
|
|
527
|
+
THEN JSON_EXTRACT(execution, '$.duration') END) as time_with,
|
|
528
|
+
AVG(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) = 0
|
|
529
|
+
THEN JSON_EXTRACT(execution, '$.duration') END) as time_without
|
|
530
|
+
FROM captured_experiences
|
|
531
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
532
|
+
`).get(periodStart, periodEnd);
|
|
533
|
+
const coverageRow = this.db.prepare(`
|
|
534
|
+
SELECT
|
|
535
|
+
AVG(CASE WHEN created_at < ? THEN JSON_EXTRACT(outcome, '$.coverage') END) as before,
|
|
536
|
+
AVG(CASE WHEN created_at >= ? THEN JSON_EXTRACT(outcome, '$.coverage') END) as after
|
|
537
|
+
FROM captured_experiences
|
|
538
|
+
WHERE JSON_EXTRACT(outcome, '$.coverage') IS NOT NULL
|
|
539
|
+
`).get(periodStart, periodStart);
|
|
540
|
+
const bugRow = this.db.prepare(`
|
|
541
|
+
SELECT
|
|
542
|
+
SUM(CASE WHEN created_at < ? THEN JSON_EXTRACT(outcome, '$.bugs_found') END) as before,
|
|
543
|
+
SUM(CASE WHEN created_at >= ? THEN JSON_EXTRACT(outcome, '$.bugs_found') END) as after
|
|
544
|
+
FROM captured_experiences
|
|
545
|
+
WHERE JSON_EXTRACT(outcome, '$.bugs_found') IS NOT NULL
|
|
546
|
+
`).get(periodStart, periodStart);
|
|
547
|
+
const timeReductionMs = (taskRow?.time_without && taskRow?.time_with)
|
|
548
|
+
? taskRow.time_without - taskRow.time_with
|
|
549
|
+
: 0;
|
|
550
|
+
return {
|
|
551
|
+
tasksWithPatterns: taskRow?.with_patterns || 0,
|
|
552
|
+
tasksWithoutPatterns: taskRow?.without_patterns || 0,
|
|
553
|
+
avgTaskTimeWithPatterns: taskRow?.time_with || 0,
|
|
554
|
+
avgTaskTimeWithoutPatterns: taskRow?.time_without || 0,
|
|
555
|
+
timeReductionMs,
|
|
556
|
+
coverageBefore: coverageRow?.before || 0,
|
|
557
|
+
coverageAfter: coverageRow?.after || 0,
|
|
558
|
+
bugsDetectedBefore: bugRow?.before || 0,
|
|
559
|
+
bugsDetectedAfter: bugRow?.after || 0,
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
catch (error) {
|
|
563
|
+
return {
|
|
564
|
+
tasksWithPatterns: 0,
|
|
565
|
+
tasksWithoutPatterns: 0,
|
|
566
|
+
avgTaskTimeWithPatterns: 0,
|
|
567
|
+
avgTaskTimeWithoutPatterns: 0,
|
|
568
|
+
timeReductionMs: 0,
|
|
569
|
+
coverageBefore: 0,
|
|
570
|
+
coverageAfter: 0,
|
|
571
|
+
bugsDetectedBefore: 0,
|
|
572
|
+
bugsDetectedAfter: 0,
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Get detailed system health breakdown
|
|
578
|
+
*/
|
|
579
|
+
getSystemHealthBreakdown(periodStart, periodEnd) {
|
|
580
|
+
try {
|
|
581
|
+
const cycleRow = this.db.prepare(`
|
|
582
|
+
SELECT
|
|
583
|
+
COUNT(*) as total,
|
|
584
|
+
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
585
|
+
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
586
|
+
SUM(CASE WHEN status = 'interrupted' THEN 1 ELSE 0 END) as interrupted,
|
|
587
|
+
AVG(duration) as avg_duration,
|
|
588
|
+
MIN(duration) as min_duration,
|
|
589
|
+
MAX(duration) as max_duration
|
|
590
|
+
FROM dream_cycles
|
|
591
|
+
WHERE start_time >= ? AND start_time <= ?
|
|
592
|
+
`).get(periodStart, periodEnd);
|
|
593
|
+
const errorRow = this.db.prepare(`
|
|
594
|
+
SELECT COUNT(*) as count
|
|
595
|
+
FROM captured_experiences
|
|
596
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
597
|
+
AND JSON_EXTRACT(execution, '$.success') = 0
|
|
598
|
+
`).get(periodStart, periodEnd);
|
|
599
|
+
// Group errors by type
|
|
600
|
+
const errorTypeRows = this.db.prepare(`
|
|
601
|
+
SELECT
|
|
602
|
+
JSON_EXTRACT(context, '$.errors_encountered[0]') as error_type,
|
|
603
|
+
COUNT(*) as count
|
|
604
|
+
FROM captured_experiences
|
|
605
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
606
|
+
AND JSON_EXTRACT(execution, '$.success') = 0
|
|
607
|
+
GROUP BY error_type
|
|
608
|
+
`).all(periodStart, periodEnd);
|
|
609
|
+
const errorsByType = new Map();
|
|
610
|
+
for (const row of errorTypeRows) {
|
|
611
|
+
if (row.error_type) {
|
|
612
|
+
errorsByType.set(row.error_type, row.count || 0);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
return {
|
|
616
|
+
totalCycles: cycleRow?.total || 0,
|
|
617
|
+
completedCycles: cycleRow?.completed || 0,
|
|
618
|
+
failedCycles: cycleRow?.failed || 0,
|
|
619
|
+
interruptedCycles: cycleRow?.interrupted || 0,
|
|
620
|
+
avgCycleDurationMs: cycleRow?.avg_duration || 0,
|
|
621
|
+
minCycleDurationMs: cycleRow?.min_duration || 0,
|
|
622
|
+
maxCycleDurationMs: cycleRow?.max_duration || 0,
|
|
623
|
+
totalErrors: errorRow?.count || 0,
|
|
624
|
+
errorsByType,
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
catch (error) {
|
|
628
|
+
return {
|
|
629
|
+
totalCycles: 0,
|
|
630
|
+
completedCycles: 0,
|
|
631
|
+
failedCycles: 0,
|
|
632
|
+
interruptedCycles: 0,
|
|
633
|
+
avgCycleDurationMs: 0,
|
|
634
|
+
minCycleDurationMs: 0,
|
|
635
|
+
maxCycleDurationMs: 0,
|
|
636
|
+
totalErrors: 0,
|
|
637
|
+
errorsByType: new Map(),
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Calculate trends over time
|
|
643
|
+
*/
|
|
644
|
+
calculateTrends(periodStart, periodEnd) {
|
|
645
|
+
try {
|
|
646
|
+
const periodDuration = periodEnd - periodStart;
|
|
647
|
+
const midpoint = periodStart + periodDuration / 2;
|
|
648
|
+
// Discovery trend (compare first half vs second half)
|
|
649
|
+
const discoveryFirstHalf = this.db.prepare(`
|
|
650
|
+
SELECT COUNT(*) as count FROM patterns
|
|
651
|
+
WHERE created_at >= ? AND created_at < ?
|
|
652
|
+
`).get(periodStart, midpoint);
|
|
653
|
+
const discoverySecondHalf = this.db.prepare(`
|
|
654
|
+
SELECT COUNT(*) as count FROM patterns
|
|
655
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
656
|
+
`).get(midpoint, periodEnd);
|
|
657
|
+
const discoveryTrend = (discoveryFirstHalf?.count || 0) > 0
|
|
658
|
+
? ((discoverySecondHalf?.count || 0) - (discoveryFirstHalf?.count || 0)) / (discoveryFirstHalf.count || 1)
|
|
659
|
+
: 0;
|
|
660
|
+
// Quality trend (compare average confidence)
|
|
661
|
+
const qualityFirstHalf = this.db.prepare(`
|
|
662
|
+
SELECT AVG(confidence) as avg FROM patterns
|
|
663
|
+
WHERE created_at >= ? AND created_at < ?
|
|
664
|
+
`).get(periodStart, midpoint);
|
|
665
|
+
const qualitySecondHalf = this.db.prepare(`
|
|
666
|
+
SELECT AVG(confidence) as avg FROM patterns
|
|
667
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
668
|
+
`).get(midpoint, periodEnd);
|
|
669
|
+
const qualityTrend = (qualityFirstHalf?.avg || 0) > 0
|
|
670
|
+
? ((qualitySecondHalf?.avg || 0) - (qualityFirstHalf?.avg || 0)) / (qualityFirstHalf.avg || 1)
|
|
671
|
+
: 0;
|
|
672
|
+
// Transfer trend (compare success rates)
|
|
673
|
+
const transferFirstHalf = this.db.prepare(`
|
|
674
|
+
SELECT
|
|
675
|
+
COUNT(*) as total,
|
|
676
|
+
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as successful
|
|
677
|
+
FROM transfer_registry
|
|
678
|
+
WHERE transferred_at >= ? AND transferred_at < ?
|
|
679
|
+
`).get(periodStart, midpoint);
|
|
680
|
+
const transferSecondHalf = this.db.prepare(`
|
|
681
|
+
SELECT
|
|
682
|
+
COUNT(*) as total,
|
|
683
|
+
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as successful
|
|
684
|
+
FROM transfer_registry
|
|
685
|
+
WHERE transferred_at >= ? AND transferred_at <= ?
|
|
686
|
+
`).get(midpoint, periodEnd);
|
|
687
|
+
const transferRateFirst = (transferFirstHalf?.total || 0) > 0
|
|
688
|
+
? (transferFirstHalf.successful || 0) / transferFirstHalf.total
|
|
689
|
+
: 0;
|
|
690
|
+
const transferRateSecond = (transferSecondHalf?.total || 0) > 0
|
|
691
|
+
? (transferSecondHalf.successful || 0) / transferSecondHalf.total
|
|
692
|
+
: 0;
|
|
693
|
+
const transferTrend = transferRateFirst > 0
|
|
694
|
+
? (transferRateSecond - transferRateFirst) / transferRateFirst
|
|
695
|
+
: 0;
|
|
696
|
+
// Impact trend (compare task time reduction)
|
|
697
|
+
const impactFirstHalf = this.db.prepare(`
|
|
698
|
+
SELECT
|
|
699
|
+
AVG(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) > 0
|
|
700
|
+
THEN JSON_EXTRACT(execution, '$.duration') END) as with_patterns,
|
|
701
|
+
AVG(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) = 0
|
|
702
|
+
THEN JSON_EXTRACT(execution, '$.duration') END) as without_patterns
|
|
703
|
+
FROM captured_experiences
|
|
704
|
+
WHERE created_at >= ? AND created_at < ?
|
|
705
|
+
`).get(periodStart, midpoint);
|
|
706
|
+
const impactSecondHalf = this.db.prepare(`
|
|
707
|
+
SELECT
|
|
708
|
+
AVG(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) > 0
|
|
709
|
+
THEN JSON_EXTRACT(execution, '$.duration') END) as with_patterns,
|
|
710
|
+
AVG(CASE WHEN JSON_ARRAY_LENGTH(JSON_EXTRACT(context, '$.patterns_used')) = 0
|
|
711
|
+
THEN JSON_EXTRACT(execution, '$.duration') END) as without_patterns
|
|
712
|
+
FROM captured_experiences
|
|
713
|
+
WHERE created_at >= ? AND created_at <= ?
|
|
714
|
+
`).get(midpoint, periodEnd);
|
|
715
|
+
const reductionFirst = (impactFirstHalf?.without_patterns && impactFirstHalf?.with_patterns)
|
|
716
|
+
? (impactFirstHalf.without_patterns - impactFirstHalf.with_patterns) / impactFirstHalf.without_patterns
|
|
717
|
+
: 0;
|
|
718
|
+
const reductionSecond = (impactSecondHalf?.without_patterns && impactSecondHalf?.with_patterns)
|
|
719
|
+
? (impactSecondHalf.without_patterns - impactSecondHalf.with_patterns) / impactSecondHalf.without_patterns
|
|
720
|
+
: 0;
|
|
721
|
+
const impactTrend = reductionFirst > 0
|
|
722
|
+
? (reductionSecond - reductionFirst) / reductionFirst
|
|
723
|
+
: 0;
|
|
724
|
+
// Normalize trends to -1 to 1 range
|
|
725
|
+
const normalize = (value) => Math.max(-1, Math.min(1, value));
|
|
726
|
+
return {
|
|
727
|
+
discoveryTrend: normalize(discoveryTrend),
|
|
728
|
+
qualityTrend: normalize(qualityTrend),
|
|
729
|
+
transferTrend: normalize(transferTrend),
|
|
730
|
+
impactTrend: normalize(impactTrend),
|
|
731
|
+
};
|
|
732
|
+
}
|
|
733
|
+
catch (error) {
|
|
734
|
+
if (this.config.debug) {
|
|
735
|
+
this.logger.debug('[LearningMetrics] Trend calculation error', { error });
|
|
736
|
+
}
|
|
737
|
+
return {
|
|
738
|
+
discoveryTrend: 0,
|
|
739
|
+
qualityTrend: 0,
|
|
740
|
+
transferTrend: 0,
|
|
741
|
+
impactTrend: 0,
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Close database connection
|
|
747
|
+
*/
|
|
748
|
+
close() {
|
|
749
|
+
this.db.close();
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
exports.LearningMetrics = LearningMetrics;
|
|
753
|
+
exports.default = LearningMetrics;
|
|
754
|
+
//# sourceMappingURL=LearningMetrics.js.map
|