agentic-qe 2.3.2 → 2.3.4

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.
Files changed (283) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/README.md +1 -1
  3. package/dist/agents/BaseAgent.d.ts +10 -0
  4. package/dist/agents/BaseAgent.d.ts.map +1 -1
  5. package/dist/agents/BaseAgent.js +113 -0
  6. package/dist/agents/BaseAgent.js.map +1 -1
  7. package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
  8. package/dist/agents/CoverageAnalyzerAgent.js +53 -27
  9. package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
  10. package/dist/agents/FlakyTestHunterAgent.d.ts +5 -0
  11. package/dist/agents/FlakyTestHunterAgent.d.ts.map +1 -1
  12. package/dist/agents/FlakyTestHunterAgent.js +20 -5
  13. package/dist/agents/FlakyTestHunterAgent.js.map +1 -1
  14. package/dist/agents/QualityGateAgent.js +44 -6
  15. package/dist/agents/QualityGateAgent.js.map +1 -1
  16. package/dist/cli/commands/dream/index.d.ts +50 -0
  17. package/dist/cli/commands/dream/index.d.ts.map +1 -0
  18. package/dist/cli/commands/dream/index.js +282 -0
  19. package/dist/cli/commands/dream/index.js.map +1 -0
  20. package/dist/cli/commands/learn/index.d.ts +31 -5
  21. package/dist/cli/commands/learn/index.d.ts.map +1 -1
  22. package/dist/cli/commands/learn/index.js +183 -50
  23. package/dist/cli/commands/learn/index.js.map +1 -1
  24. package/dist/cli/commands/transfer/index.d.ts +55 -0
  25. package/dist/cli/commands/transfer/index.d.ts.map +1 -0
  26. package/dist/cli/commands/transfer/index.js +317 -0
  27. package/dist/cli/commands/transfer/index.js.map +1 -0
  28. package/dist/cli/index.js +156 -3
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/init/database-init.js +5 -0
  31. package/dist/cli/init/database-init.js.map +1 -1
  32. package/dist/cli/init/index.d.ts.map +1 -1
  33. package/dist/cli/init/index.js +12 -4
  34. package/dist/cli/init/index.js.map +1 -1
  35. package/dist/cli/init/learning-init.d.ts +39 -0
  36. package/dist/cli/init/learning-init.d.ts.map +1 -0
  37. package/dist/cli/init/learning-init.js +239 -0
  38. package/dist/cli/init/learning-init.js.map +1 -0
  39. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  40. package/dist/learning/PerformanceTracker.d.ts +9 -0
  41. package/dist/learning/PerformanceTracker.d.ts.map +1 -1
  42. package/dist/learning/PerformanceTracker.js +26 -2
  43. package/dist/learning/PerformanceTracker.js.map +1 -1
  44. package/dist/learning/baselines/BaselineCollector.d.ts +178 -0
  45. package/dist/learning/baselines/BaselineCollector.d.ts.map +1 -0
  46. package/dist/learning/baselines/BaselineCollector.js +398 -0
  47. package/dist/learning/baselines/BaselineCollector.js.map +1 -0
  48. package/dist/learning/baselines/StandardTaskSuite.d.ts +88 -0
  49. package/dist/learning/baselines/StandardTaskSuite.d.ts.map +1 -0
  50. package/dist/learning/baselines/StandardTaskSuite.js +801 -0
  51. package/dist/learning/baselines/StandardTaskSuite.js.map +1 -0
  52. package/dist/learning/baselines/index.d.ts +10 -0
  53. package/dist/learning/baselines/index.d.ts.map +1 -0
  54. package/dist/learning/baselines/index.js +15 -0
  55. package/dist/learning/baselines/index.js.map +1 -0
  56. package/dist/learning/capture/ExecutionRecorder.d.ts +97 -0
  57. package/dist/learning/capture/ExecutionRecorder.d.ts.map +1 -0
  58. package/dist/learning/capture/ExecutionRecorder.js +195 -0
  59. package/dist/learning/capture/ExecutionRecorder.js.map +1 -0
  60. package/dist/learning/capture/ExperienceCapture.d.ts +177 -0
  61. package/dist/learning/capture/ExperienceCapture.d.ts.map +1 -0
  62. package/dist/learning/capture/ExperienceCapture.js +432 -0
  63. package/dist/learning/capture/ExperienceCapture.js.map +1 -0
  64. package/dist/learning/capture/index.d.ts +12 -0
  65. package/dist/learning/capture/index.d.ts.map +1 -0
  66. package/dist/learning/capture/index.js +17 -0
  67. package/dist/learning/capture/index.js.map +1 -0
  68. package/dist/learning/dashboard/MetricsDashboard.d.ts +63 -0
  69. package/dist/learning/dashboard/MetricsDashboard.d.ts.map +1 -0
  70. package/dist/learning/dashboard/MetricsDashboard.js +230 -0
  71. package/dist/learning/dashboard/MetricsDashboard.js.map +1 -0
  72. package/dist/learning/dashboard/index.d.ts +7 -0
  73. package/dist/learning/dashboard/index.d.ts.map +1 -0
  74. package/dist/learning/dashboard/index.js +23 -0
  75. package/dist/learning/dashboard/index.js.map +1 -0
  76. package/dist/learning/dream/ConceptGraph.d.ts +160 -0
  77. package/dist/learning/dream/ConceptGraph.d.ts.map +1 -0
  78. package/dist/learning/dream/ConceptGraph.js +445 -0
  79. package/dist/learning/dream/ConceptGraph.js.map +1 -0
  80. package/dist/learning/dream/DreamEngine.d.ts +150 -0
  81. package/dist/learning/dream/DreamEngine.d.ts.map +1 -0
  82. package/dist/learning/dream/DreamEngine.js +551 -0
  83. package/dist/learning/dream/DreamEngine.js.map +1 -0
  84. package/dist/learning/dream/InsightGenerator.d.ts +152 -0
  85. package/dist/learning/dream/InsightGenerator.d.ts.map +1 -0
  86. package/dist/learning/dream/InsightGenerator.js +463 -0
  87. package/dist/learning/dream/InsightGenerator.js.map +1 -0
  88. package/dist/learning/dream/SpreadingActivation.d.ts +138 -0
  89. package/dist/learning/dream/SpreadingActivation.d.ts.map +1 -0
  90. package/dist/learning/dream/SpreadingActivation.js +320 -0
  91. package/dist/learning/dream/SpreadingActivation.js.map +1 -0
  92. package/dist/learning/dream/index.d.ts +14 -0
  93. package/dist/learning/dream/index.d.ts.map +1 -0
  94. package/dist/learning/dream/index.js +22 -0
  95. package/dist/learning/dream/index.js.map +1 -0
  96. package/dist/learning/metrics/AlertManager.d.ts +107 -0
  97. package/dist/learning/metrics/AlertManager.d.ts.map +1 -0
  98. package/dist/learning/metrics/AlertManager.js +246 -0
  99. package/dist/learning/metrics/AlertManager.js.map +1 -0
  100. package/dist/learning/metrics/LearningMetrics.d.ts +184 -0
  101. package/dist/learning/metrics/LearningMetrics.d.ts.map +1 -0
  102. package/dist/learning/metrics/LearningMetrics.js +754 -0
  103. package/dist/learning/metrics/LearningMetrics.js.map +1 -0
  104. package/dist/learning/metrics/MetricsCollector.d.ts +108 -0
  105. package/dist/learning/metrics/MetricsCollector.d.ts.map +1 -0
  106. package/dist/learning/metrics/MetricsCollector.js +240 -0
  107. package/dist/learning/metrics/MetricsCollector.js.map +1 -0
  108. package/dist/learning/metrics/MetricsStore.d.ts +149 -0
  109. package/dist/learning/metrics/MetricsStore.d.ts.map +1 -0
  110. package/dist/learning/metrics/MetricsStore.js +502 -0
  111. package/dist/learning/metrics/MetricsStore.js.map +1 -0
  112. package/dist/learning/metrics/TrendAnalyzer.d.ts +85 -0
  113. package/dist/learning/metrics/TrendAnalyzer.d.ts.map +1 -0
  114. package/dist/learning/metrics/TrendAnalyzer.js +210 -0
  115. package/dist/learning/metrics/TrendAnalyzer.js.map +1 -0
  116. package/dist/learning/metrics/index.d.ts +13 -0
  117. package/dist/learning/metrics/index.d.ts.map +1 -0
  118. package/dist/learning/metrics/index.js +39 -0
  119. package/dist/learning/metrics/index.js.map +1 -0
  120. package/dist/learning/scheduler/IdleDetector.d.ts +126 -0
  121. package/dist/learning/scheduler/IdleDetector.d.ts.map +1 -0
  122. package/dist/learning/scheduler/IdleDetector.js +281 -0
  123. package/dist/learning/scheduler/IdleDetector.js.map +1 -0
  124. package/dist/learning/scheduler/SleepCycle.d.ts +150 -0
  125. package/dist/learning/scheduler/SleepCycle.d.ts.map +1 -0
  126. package/dist/learning/scheduler/SleepCycle.js +506 -0
  127. package/dist/learning/scheduler/SleepCycle.js.map +1 -0
  128. package/dist/learning/scheduler/SleepScheduler.d.ts +131 -0
  129. package/dist/learning/scheduler/SleepScheduler.d.ts.map +1 -0
  130. package/dist/learning/scheduler/SleepScheduler.js +299 -0
  131. package/dist/learning/scheduler/SleepScheduler.js.map +1 -0
  132. package/dist/learning/scheduler/TimeBasedTrigger.d.ts +108 -0
  133. package/dist/learning/scheduler/TimeBasedTrigger.d.ts.map +1 -0
  134. package/dist/learning/scheduler/TimeBasedTrigger.js +222 -0
  135. package/dist/learning/scheduler/TimeBasedTrigger.js.map +1 -0
  136. package/dist/learning/scheduler/index.d.ts +16 -0
  137. package/dist/learning/scheduler/index.d.ts.map +1 -0
  138. package/dist/learning/scheduler/index.js +23 -0
  139. package/dist/learning/scheduler/index.js.map +1 -0
  140. package/dist/learning/synthesis/PatternSynthesis.d.ts +162 -0
  141. package/dist/learning/synthesis/PatternSynthesis.d.ts.map +1 -0
  142. package/dist/learning/synthesis/PatternSynthesis.js +479 -0
  143. package/dist/learning/synthesis/PatternSynthesis.js.map +1 -0
  144. package/dist/learning/synthesis/index.d.ts +10 -0
  145. package/dist/learning/synthesis/index.d.ts.map +1 -0
  146. package/dist/learning/synthesis/index.js +14 -0
  147. package/dist/learning/synthesis/index.js.map +1 -0
  148. package/dist/learning/transfer/CompatibilityScorer.d.ts +115 -0
  149. package/dist/learning/transfer/CompatibilityScorer.d.ts.map +1 -0
  150. package/dist/learning/transfer/CompatibilityScorer.js +319 -0
  151. package/dist/learning/transfer/CompatibilityScorer.js.map +1 -0
  152. package/dist/learning/transfer/TransferProtocol.d.ts +172 -0
  153. package/dist/learning/transfer/TransferProtocol.d.ts.map +1 -0
  154. package/dist/learning/transfer/TransferProtocol.js +611 -0
  155. package/dist/learning/transfer/TransferProtocol.js.map +1 -0
  156. package/dist/learning/transfer/TransferPrototype.d.ts +93 -0
  157. package/dist/learning/transfer/TransferPrototype.d.ts.map +1 -0
  158. package/dist/learning/transfer/TransferPrototype.js +433 -0
  159. package/dist/learning/transfer/TransferPrototype.js.map +1 -0
  160. package/dist/learning/transfer/TransferValidator.d.ts +140 -0
  161. package/dist/learning/transfer/TransferValidator.d.ts.map +1 -0
  162. package/dist/learning/transfer/TransferValidator.js +413 -0
  163. package/dist/learning/transfer/TransferValidator.js.map +1 -0
  164. package/dist/learning/transfer/index.d.ts +14 -0
  165. package/dist/learning/transfer/index.d.ts.map +1 -0
  166. package/dist/learning/transfer/index.js +22 -0
  167. package/dist/learning/transfer/index.js.map +1 -0
  168. package/dist/mcp/handlers/test/test-generate-enhanced.d.ts +26 -2
  169. package/dist/mcp/handlers/test/test-generate-enhanced.d.ts.map +1 -1
  170. package/dist/mcp/handlers/test/test-generate-enhanced.js +159 -27
  171. package/dist/mcp/handlers/test/test-generate-enhanced.js.map +1 -1
  172. package/dist/mcp/server-instructions.d.ts +1 -1
  173. package/dist/mcp/server-instructions.js +1 -1
  174. package/dist/mcp/server.d.ts.map +1 -1
  175. package/dist/mcp/server.js +2 -1
  176. package/dist/mcp/server.js.map +1 -1
  177. package/package.json +7 -2
  178. package/scripts/README.md +352 -0
  179. package/scripts/hooks/capture-task-learning.js +191 -0
  180. package/scripts/hooks/emit-task-complete.sh +35 -0
  181. package/scripts/hooks/emit-task-spawn.sh +27 -0
  182. package/.claude/agents/failing-agent.json +0 -9
  183. package/.claude/agents/test-agent.json +0 -9
  184. package/dist/App.d.ts +0 -5
  185. package/dist/App.d.ts.map +0 -1
  186. package/dist/App.js +0 -15
  187. package/dist/App.js.map +0 -1
  188. package/dist/cli/init/utils.d.ts +0 -183
  189. package/dist/cli/init/utils.d.ts.map +0 -1
  190. package/dist/cli/init/utils.js +0 -354
  191. package/dist/cli/init/utils.js.map +0 -1
  192. package/dist/components/Dashboard/Dashboard.d.ts +0 -4
  193. package/dist/components/Dashboard/Dashboard.d.ts.map +0 -1
  194. package/dist/components/Dashboard/Dashboard.js +0 -148
  195. package/dist/components/Dashboard/Dashboard.js.map +0 -1
  196. package/dist/components/Dashboard/DashboardHeader.d.ts +0 -4
  197. package/dist/components/Dashboard/DashboardHeader.d.ts.map +0 -1
  198. package/dist/components/Dashboard/DashboardHeader.js +0 -138
  199. package/dist/components/Dashboard/DashboardHeader.js.map +0 -1
  200. package/dist/contexts/DashboardContext.d.ts +0 -41
  201. package/dist/contexts/DashboardContext.d.ts.map +0 -1
  202. package/dist/contexts/DashboardContext.js +0 -187
  203. package/dist/contexts/DashboardContext.js.map +0 -1
  204. package/dist/core/transport/QUICTransport.d.ts +0 -320
  205. package/dist/core/transport/QUICTransport.d.ts.map +0 -1
  206. package/dist/core/transport/QUICTransport.js +0 -711
  207. package/dist/core/transport/QUICTransport.js.map +0 -1
  208. package/dist/learning/LearningPersistenceAdapter.d.ts +0 -84
  209. package/dist/learning/LearningPersistenceAdapter.d.ts.map +0 -1
  210. package/dist/learning/LearningPersistenceAdapter.js +0 -202
  211. package/dist/learning/LearningPersistenceAdapter.js.map +0 -1
  212. package/dist/learning/algorithms/QLearning.d.ts +0 -68
  213. package/dist/learning/algorithms/QLearning.d.ts.map +0 -1
  214. package/dist/learning/algorithms/QLearning.js +0 -116
  215. package/dist/learning/algorithms/QLearning.js.map +0 -1
  216. package/dist/mcp/handlers/advanced/requirements-generate-bdd.d.ts +0 -7
  217. package/dist/mcp/handlers/advanced/requirements-generate-bdd.d.ts.map +0 -1
  218. package/dist/mcp/handlers/advanced/requirements-generate-bdd.js +0 -267
  219. package/dist/mcp/handlers/advanced/requirements-generate-bdd.js.map +0 -1
  220. package/dist/mcp/handlers/advanced/requirements-validate.d.ts +0 -7
  221. package/dist/mcp/handlers/advanced/requirements-validate.d.ts.map +0 -1
  222. package/dist/mcp/handlers/advanced/requirements-validate.js +0 -175
  223. package/dist/mcp/handlers/advanced/requirements-validate.js.map +0 -1
  224. package/dist/mcp/handlers/analysis/performance-benchmark-run-handler.d.ts +0 -15
  225. package/dist/mcp/handlers/analysis/performance-benchmark-run-handler.d.ts.map +0 -1
  226. package/dist/mcp/handlers/analysis/performance-benchmark-run-handler.js +0 -43
  227. package/dist/mcp/handlers/analysis/performance-benchmark-run-handler.js.map +0 -1
  228. package/dist/mcp/handlers/analysis/performanceBenchmarkRun.d.ts +0 -58
  229. package/dist/mcp/handlers/analysis/performanceBenchmarkRun.d.ts.map +0 -1
  230. package/dist/mcp/handlers/analysis/performanceBenchmarkRun.js +0 -188
  231. package/dist/mcp/handlers/analysis/performanceBenchmarkRun.js.map +0 -1
  232. package/dist/mcp/handlers/optimize-tests.d.ts +0 -219
  233. package/dist/mcp/handlers/optimize-tests.d.ts.map +0 -1
  234. package/dist/mcp/handlers/optimize-tests.js +0 -533
  235. package/dist/mcp/handlers/optimize-tests.js.map +0 -1
  236. package/dist/mcp/handlers/predict-defects.d.ts +0 -194
  237. package/dist/mcp/handlers/predict-defects.d.ts.map +0 -1
  238. package/dist/mcp/handlers/predict-defects.js +0 -722
  239. package/dist/mcp/handlers/predict-defects.js.map +0 -1
  240. package/dist/mcp/handlers/prediction/regression-risk-analyze.d.ts +0 -199
  241. package/dist/mcp/handlers/prediction/regression-risk-analyze.d.ts.map +0 -1
  242. package/dist/mcp/handlers/prediction/regression-risk-analyze.js +0 -471
  243. package/dist/mcp/handlers/prediction/regression-risk-analyze.js.map +0 -1
  244. package/dist/mcp/handlers/quality/quality-decision-make.d.ts +0 -104
  245. package/dist/mcp/handlers/quality/quality-decision-make.d.ts.map +0 -1
  246. package/dist/mcp/handlers/quality/quality-decision-make.js +0 -408
  247. package/dist/mcp/handlers/quality/quality-decision-make.js.map +0 -1
  248. package/dist/mcp/handlers/quality/quality-gate-execute.d.ts +0 -160
  249. package/dist/mcp/handlers/quality/quality-gate-execute.d.ts.map +0 -1
  250. package/dist/mcp/handlers/quality/quality-gate-execute.js +0 -412
  251. package/dist/mcp/handlers/quality/quality-gate-execute.js.map +0 -1
  252. package/dist/mcp/handlers/quality/quality-policy-check.d.ts +0 -163
  253. package/dist/mcp/handlers/quality/quality-policy-check.d.ts.map +0 -1
  254. package/dist/mcp/handlers/quality/quality-policy-check.js +0 -455
  255. package/dist/mcp/handlers/quality/quality-policy-check.js.map +0 -1
  256. package/dist/mcp/handlers/quality/quality-risk-assess.d.ts +0 -123
  257. package/dist/mcp/handlers/quality/quality-risk-assess.d.ts.map +0 -1
  258. package/dist/mcp/handlers/quality/quality-risk-assess.js +0 -522
  259. package/dist/mcp/handlers/quality/quality-risk-assess.js.map +0 -1
  260. package/dist/mcp/handlers/quality/quality-validate-metrics.d.ts +0 -117
  261. package/dist/mcp/handlers/quality/quality-validate-metrics.d.ts.map +0 -1
  262. package/dist/mcp/handlers/quality/quality-validate-metrics.js +0 -288
  263. package/dist/mcp/handlers/quality/quality-validate-metrics.js.map +0 -1
  264. package/dist/mcp/handlers/quality-analyze.d.ts +0 -279
  265. package/dist/mcp/handlers/quality-analyze.d.ts.map +0 -1
  266. package/dist/mcp/handlers/quality-analyze.js +0 -720
  267. package/dist/mcp/handlers/quality-analyze.js.map +0 -1
  268. package/dist/mcp/handlers/security/check-authz.d.ts +0 -152
  269. package/dist/mcp/handlers/security/check-authz.d.ts.map +0 -1
  270. package/dist/mcp/handlers/security/check-authz.js +0 -434
  271. package/dist/mcp/handlers/security/check-authz.js.map +0 -1
  272. package/dist/mcp/handlers/security/scan-dependencies.d.ts +0 -148
  273. package/dist/mcp/handlers/security/scan-dependencies.d.ts.map +0 -1
  274. package/dist/mcp/handlers/security/scan-dependencies.js +0 -354
  275. package/dist/mcp/handlers/security/scan-dependencies.js.map +0 -1
  276. package/dist/mcp/handlers/security/validate-auth.d.ts +0 -128
  277. package/dist/mcp/handlers/security/validate-auth.d.ts.map +0 -1
  278. package/dist/mcp/handlers/security/validate-auth.js +0 -294
  279. package/dist/mcp/handlers/security/validate-auth.js.map +0 -1
  280. package/dist/mcp/handlers/test-generate.d.ts +0 -107
  281. package/dist/mcp/handlers/test-generate.d.ts.map +0 -1
  282. package/dist/mcp/handlers/test-generate.js +0 -454
  283. package/dist/mcp/handlers/test-generate.js.map +0 -1
@@ -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