agentic-qe 2.3.3 → 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 (162) hide show
  1. package/CHANGELOG.md +97 -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/cli/commands/dream/index.d.ts +50 -0
  8. package/dist/cli/commands/dream/index.d.ts.map +1 -0
  9. package/dist/cli/commands/dream/index.js +282 -0
  10. package/dist/cli/commands/dream/index.js.map +1 -0
  11. package/dist/cli/commands/learn/index.d.ts +31 -5
  12. package/dist/cli/commands/learn/index.d.ts.map +1 -1
  13. package/dist/cli/commands/learn/index.js +183 -50
  14. package/dist/cli/commands/learn/index.js.map +1 -1
  15. package/dist/cli/commands/transfer/index.d.ts +55 -0
  16. package/dist/cli/commands/transfer/index.d.ts.map +1 -0
  17. package/dist/cli/commands/transfer/index.js +317 -0
  18. package/dist/cli/commands/transfer/index.js.map +1 -0
  19. package/dist/cli/index.js +156 -3
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/init/index.d.ts.map +1 -1
  22. package/dist/cli/init/index.js +12 -4
  23. package/dist/cli/init/index.js.map +1 -1
  24. package/dist/cli/init/learning-init.d.ts +39 -0
  25. package/dist/cli/init/learning-init.d.ts.map +1 -0
  26. package/dist/cli/init/learning-init.js +239 -0
  27. package/dist/cli/init/learning-init.js.map +1 -0
  28. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  29. package/dist/learning/baselines/BaselineCollector.d.ts +178 -0
  30. package/dist/learning/baselines/BaselineCollector.d.ts.map +1 -0
  31. package/dist/learning/baselines/BaselineCollector.js +398 -0
  32. package/dist/learning/baselines/BaselineCollector.js.map +1 -0
  33. package/dist/learning/baselines/StandardTaskSuite.d.ts +88 -0
  34. package/dist/learning/baselines/StandardTaskSuite.d.ts.map +1 -0
  35. package/dist/learning/baselines/StandardTaskSuite.js +801 -0
  36. package/dist/learning/baselines/StandardTaskSuite.js.map +1 -0
  37. package/dist/learning/baselines/index.d.ts +10 -0
  38. package/dist/learning/baselines/index.d.ts.map +1 -0
  39. package/dist/learning/baselines/index.js +15 -0
  40. package/dist/learning/baselines/index.js.map +1 -0
  41. package/dist/learning/capture/ExecutionRecorder.d.ts +97 -0
  42. package/dist/learning/capture/ExecutionRecorder.d.ts.map +1 -0
  43. package/dist/learning/capture/ExecutionRecorder.js +195 -0
  44. package/dist/learning/capture/ExecutionRecorder.js.map +1 -0
  45. package/dist/learning/capture/ExperienceCapture.d.ts +177 -0
  46. package/dist/learning/capture/ExperienceCapture.d.ts.map +1 -0
  47. package/dist/learning/capture/ExperienceCapture.js +432 -0
  48. package/dist/learning/capture/ExperienceCapture.js.map +1 -0
  49. package/dist/learning/capture/index.d.ts +12 -0
  50. package/dist/learning/capture/index.d.ts.map +1 -0
  51. package/dist/learning/capture/index.js +17 -0
  52. package/dist/learning/capture/index.js.map +1 -0
  53. package/dist/learning/dashboard/MetricsDashboard.d.ts +63 -0
  54. package/dist/learning/dashboard/MetricsDashboard.d.ts.map +1 -0
  55. package/dist/learning/dashboard/MetricsDashboard.js +230 -0
  56. package/dist/learning/dashboard/MetricsDashboard.js.map +1 -0
  57. package/dist/learning/dashboard/index.d.ts +7 -0
  58. package/dist/learning/dashboard/index.d.ts.map +1 -0
  59. package/dist/learning/dashboard/index.js +23 -0
  60. package/dist/learning/dashboard/index.js.map +1 -0
  61. package/dist/learning/dream/ConceptGraph.d.ts +160 -0
  62. package/dist/learning/dream/ConceptGraph.d.ts.map +1 -0
  63. package/dist/learning/dream/ConceptGraph.js +445 -0
  64. package/dist/learning/dream/ConceptGraph.js.map +1 -0
  65. package/dist/learning/dream/DreamEngine.d.ts +150 -0
  66. package/dist/learning/dream/DreamEngine.d.ts.map +1 -0
  67. package/dist/learning/dream/DreamEngine.js +551 -0
  68. package/dist/learning/dream/DreamEngine.js.map +1 -0
  69. package/dist/learning/dream/InsightGenerator.d.ts +152 -0
  70. package/dist/learning/dream/InsightGenerator.d.ts.map +1 -0
  71. package/dist/learning/dream/InsightGenerator.js +463 -0
  72. package/dist/learning/dream/InsightGenerator.js.map +1 -0
  73. package/dist/learning/dream/SpreadingActivation.d.ts +138 -0
  74. package/dist/learning/dream/SpreadingActivation.d.ts.map +1 -0
  75. package/dist/learning/dream/SpreadingActivation.js +320 -0
  76. package/dist/learning/dream/SpreadingActivation.js.map +1 -0
  77. package/dist/learning/dream/index.d.ts +14 -0
  78. package/dist/learning/dream/index.d.ts.map +1 -0
  79. package/dist/learning/dream/index.js +22 -0
  80. package/dist/learning/dream/index.js.map +1 -0
  81. package/dist/learning/metrics/AlertManager.d.ts +107 -0
  82. package/dist/learning/metrics/AlertManager.d.ts.map +1 -0
  83. package/dist/learning/metrics/AlertManager.js +246 -0
  84. package/dist/learning/metrics/AlertManager.js.map +1 -0
  85. package/dist/learning/metrics/LearningMetrics.d.ts +184 -0
  86. package/dist/learning/metrics/LearningMetrics.d.ts.map +1 -0
  87. package/dist/learning/metrics/LearningMetrics.js +754 -0
  88. package/dist/learning/metrics/LearningMetrics.js.map +1 -0
  89. package/dist/learning/metrics/MetricsCollector.d.ts +108 -0
  90. package/dist/learning/metrics/MetricsCollector.d.ts.map +1 -0
  91. package/dist/learning/metrics/MetricsCollector.js +240 -0
  92. package/dist/learning/metrics/MetricsCollector.js.map +1 -0
  93. package/dist/learning/metrics/MetricsStore.d.ts +149 -0
  94. package/dist/learning/metrics/MetricsStore.d.ts.map +1 -0
  95. package/dist/learning/metrics/MetricsStore.js +502 -0
  96. package/dist/learning/metrics/MetricsStore.js.map +1 -0
  97. package/dist/learning/metrics/TrendAnalyzer.d.ts +85 -0
  98. package/dist/learning/metrics/TrendAnalyzer.d.ts.map +1 -0
  99. package/dist/learning/metrics/TrendAnalyzer.js +210 -0
  100. package/dist/learning/metrics/TrendAnalyzer.js.map +1 -0
  101. package/dist/learning/metrics/index.d.ts +13 -0
  102. package/dist/learning/metrics/index.d.ts.map +1 -0
  103. package/dist/learning/metrics/index.js +39 -0
  104. package/dist/learning/metrics/index.js.map +1 -0
  105. package/dist/learning/scheduler/IdleDetector.d.ts +126 -0
  106. package/dist/learning/scheduler/IdleDetector.d.ts.map +1 -0
  107. package/dist/learning/scheduler/IdleDetector.js +281 -0
  108. package/dist/learning/scheduler/IdleDetector.js.map +1 -0
  109. package/dist/learning/scheduler/SleepCycle.d.ts +150 -0
  110. package/dist/learning/scheduler/SleepCycle.d.ts.map +1 -0
  111. package/dist/learning/scheduler/SleepCycle.js +506 -0
  112. package/dist/learning/scheduler/SleepCycle.js.map +1 -0
  113. package/dist/learning/scheduler/SleepScheduler.d.ts +131 -0
  114. package/dist/learning/scheduler/SleepScheduler.d.ts.map +1 -0
  115. package/dist/learning/scheduler/SleepScheduler.js +299 -0
  116. package/dist/learning/scheduler/SleepScheduler.js.map +1 -0
  117. package/dist/learning/scheduler/TimeBasedTrigger.d.ts +108 -0
  118. package/dist/learning/scheduler/TimeBasedTrigger.d.ts.map +1 -0
  119. package/dist/learning/scheduler/TimeBasedTrigger.js +222 -0
  120. package/dist/learning/scheduler/TimeBasedTrigger.js.map +1 -0
  121. package/dist/learning/scheduler/index.d.ts +16 -0
  122. package/dist/learning/scheduler/index.d.ts.map +1 -0
  123. package/dist/learning/scheduler/index.js +23 -0
  124. package/dist/learning/scheduler/index.js.map +1 -0
  125. package/dist/learning/synthesis/PatternSynthesis.d.ts +162 -0
  126. package/dist/learning/synthesis/PatternSynthesis.d.ts.map +1 -0
  127. package/dist/learning/synthesis/PatternSynthesis.js +479 -0
  128. package/dist/learning/synthesis/PatternSynthesis.js.map +1 -0
  129. package/dist/learning/synthesis/index.d.ts +10 -0
  130. package/dist/learning/synthesis/index.d.ts.map +1 -0
  131. package/dist/learning/synthesis/index.js +14 -0
  132. package/dist/learning/synthesis/index.js.map +1 -0
  133. package/dist/learning/transfer/CompatibilityScorer.d.ts +115 -0
  134. package/dist/learning/transfer/CompatibilityScorer.d.ts.map +1 -0
  135. package/dist/learning/transfer/CompatibilityScorer.js +319 -0
  136. package/dist/learning/transfer/CompatibilityScorer.js.map +1 -0
  137. package/dist/learning/transfer/TransferProtocol.d.ts +172 -0
  138. package/dist/learning/transfer/TransferProtocol.d.ts.map +1 -0
  139. package/dist/learning/transfer/TransferProtocol.js +611 -0
  140. package/dist/learning/transfer/TransferProtocol.js.map +1 -0
  141. package/dist/learning/transfer/TransferPrototype.d.ts +93 -0
  142. package/dist/learning/transfer/TransferPrototype.d.ts.map +1 -0
  143. package/dist/learning/transfer/TransferPrototype.js +433 -0
  144. package/dist/learning/transfer/TransferPrototype.js.map +1 -0
  145. package/dist/learning/transfer/TransferValidator.d.ts +140 -0
  146. package/dist/learning/transfer/TransferValidator.d.ts.map +1 -0
  147. package/dist/learning/transfer/TransferValidator.js +413 -0
  148. package/dist/learning/transfer/TransferValidator.js.map +1 -0
  149. package/dist/learning/transfer/index.d.ts +14 -0
  150. package/dist/learning/transfer/index.d.ts.map +1 -0
  151. package/dist/learning/transfer/index.js +22 -0
  152. package/dist/learning/transfer/index.js.map +1 -0
  153. package/dist/mcp/handlers/test/test-generate-enhanced.d.ts +26 -2
  154. package/dist/mcp/handlers/test/test-generate-enhanced.d.ts.map +1 -1
  155. package/dist/mcp/handlers/test/test-generate-enhanced.js +159 -27
  156. package/dist/mcp/handlers/test/test-generate-enhanced.js.map +1 -1
  157. package/dist/mcp/server-instructions.d.ts +1 -1
  158. package/dist/mcp/server-instructions.js +1 -1
  159. package/dist/mcp/server.d.ts.map +1 -1
  160. package/dist/mcp/server.js +2 -1
  161. package/dist/mcp/server.js.map +1 -1
  162. package/package.json +5 -2
@@ -0,0 +1,502 @@
1
+ "use strict";
2
+ /**
3
+ * MetricsStore - Persist metrics to database for historical analysis
4
+ *
5
+ * Stores metric snapshots over time and provides queries for
6
+ * historical analysis, trend detection, and reporting.
7
+ *
8
+ * Part of the Nightly-Learner Phase 3 implementation.
9
+ *
10
+ * @version 1.0.0
11
+ * @module src/learning/metrics/MetricsStore
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.MetricsStore = 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
+ const SecureRandom_1 = require("../../utils/SecureRandom");
55
+ const LearningMetrics_1 = require("./LearningMetrics");
56
+ /**
57
+ * MetricsStore persists and queries learning metrics over time
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * const store = new MetricsStore({ autoSnapshotInterval: 1 });
62
+ *
63
+ * // Capture current metrics
64
+ * await store.captureSnapshot();
65
+ *
66
+ * // Query historical metrics
67
+ * const history = await store.getHistory({
68
+ * startTime: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), // Last 7 days
69
+ * limit: 100,
70
+ * });
71
+ *
72
+ * // Get rolling averages
73
+ * const rolling = await store.getRollingAverage('discoveryRate', 24); // 24-hour window
74
+ *
75
+ * // Analyze trends
76
+ * const trends = await store.getTrends(['discoveryRate', 'transferSuccessRate']);
77
+ * ```
78
+ */
79
+ class MetricsStore {
80
+ constructor(config) {
81
+ this.logger = Logger_1.Logger.getInstance();
82
+ this.config = {
83
+ dbPath: config?.dbPath || path.join(process.cwd(), '.agentic-qe', 'memory.db'),
84
+ autoSnapshotInterval: config?.autoSnapshotInterval ?? 1, // 1 hour
85
+ retentionDays: config?.retentionDays ?? 90,
86
+ debug: config?.debug ?? false,
87
+ };
88
+ this.db = new better_sqlite3_1.default(this.config.dbPath);
89
+ this.collector = new LearningMetrics_1.LearningMetrics({ dbPath: this.config.dbPath, debug: this.config.debug });
90
+ this.initializeSchema();
91
+ if (this.config.autoSnapshotInterval > 0) {
92
+ this.startAutoSnapshot();
93
+ }
94
+ }
95
+ /**
96
+ * Initialize database schema
97
+ */
98
+ initializeSchema() {
99
+ this.db.exec(`
100
+ CREATE TABLE IF NOT EXISTS metrics_snapshots (
101
+ id TEXT PRIMARY KEY,
102
+ snapshot_time INTEGER NOT NULL,
103
+ period_hours INTEGER NOT NULL,
104
+
105
+ -- Discovery metrics
106
+ patterns_discovered_total INTEGER NOT NULL,
107
+ patterns_discovered_today INTEGER NOT NULL,
108
+ discovery_rate REAL NOT NULL,
109
+
110
+ -- Quality metrics
111
+ pattern_accuracy REAL NOT NULL,
112
+ insight_actionability REAL NOT NULL,
113
+ false_positive_rate REAL NOT NULL,
114
+
115
+ -- Transfer metrics
116
+ transfer_success_rate REAL NOT NULL,
117
+ adoption_rate REAL NOT NULL,
118
+ negative_transfer_count INTEGER NOT NULL,
119
+
120
+ -- Impact metrics
121
+ task_time_reduction REAL NOT NULL,
122
+ coverage_improvement REAL NOT NULL,
123
+ bug_detection_improvement REAL NOT NULL,
124
+
125
+ -- System health
126
+ sleep_cycle_completion_rate REAL NOT NULL,
127
+ avg_cycle_duration REAL NOT NULL,
128
+ error_rate REAL NOT NULL,
129
+
130
+ -- Metadata
131
+ calculated_at INTEGER NOT NULL,
132
+ period_start INTEGER NOT NULL,
133
+ period_end INTEGER NOT NULL,
134
+ created_at INTEGER NOT NULL
135
+ );
136
+
137
+ CREATE INDEX IF NOT EXISTS idx_metrics_snapshot_time ON metrics_snapshots(snapshot_time);
138
+ CREATE INDEX IF NOT EXISTS idx_metrics_calculated_at ON metrics_snapshots(calculated_at);
139
+ CREATE INDEX IF NOT EXISTS idx_metrics_period ON metrics_snapshots(period_start, period_end);
140
+ `);
141
+ }
142
+ /**
143
+ * Start auto-snapshot timer
144
+ */
145
+ startAutoSnapshot() {
146
+ const intervalMs = this.config.autoSnapshotInterval * 60 * 60 * 1000;
147
+ this.autoSnapshotTimer = setInterval(async () => {
148
+ try {
149
+ await this.captureSnapshot();
150
+ await this.cleanupOldSnapshots();
151
+ }
152
+ catch (error) {
153
+ this.logger.error('[MetricsStore] Auto-snapshot failed', { error });
154
+ }
155
+ }, intervalMs);
156
+ this.logger.info('[MetricsStore] Auto-snapshot enabled', {
157
+ interval: this.config.autoSnapshotInterval + 'h',
158
+ });
159
+ }
160
+ /**
161
+ * Stop auto-snapshot timer
162
+ */
163
+ stopAutoSnapshot() {
164
+ if (this.autoSnapshotTimer) {
165
+ clearInterval(this.autoSnapshotTimer);
166
+ this.autoSnapshotTimer = undefined;
167
+ this.logger.info('[MetricsStore] Auto-snapshot disabled');
168
+ }
169
+ }
170
+ /**
171
+ * Capture a metrics snapshot
172
+ */
173
+ async captureSnapshot(periodHours = 24) {
174
+ const metrics = await this.collector.getCurrentMetrics(periodHours);
175
+ const id = `snapshot-${Date.now()}-${SecureRandom_1.SecureRandom.randomString(8, 'alphanumeric')}`;
176
+ const snapshotTime = new Date();
177
+ // Store snapshot
178
+ this.db.prepare(`
179
+ INSERT INTO metrics_snapshots (
180
+ id, snapshot_time, period_hours,
181
+ patterns_discovered_total, patterns_discovered_today, discovery_rate,
182
+ pattern_accuracy, insight_actionability, false_positive_rate,
183
+ transfer_success_rate, adoption_rate, negative_transfer_count,
184
+ task_time_reduction, coverage_improvement, bug_detection_improvement,
185
+ sleep_cycle_completion_rate, avg_cycle_duration, error_rate,
186
+ calculated_at, period_start, period_end, created_at
187
+ ) VALUES (
188
+ ?, ?, ?,
189
+ ?, ?, ?,
190
+ ?, ?, ?,
191
+ ?, ?, ?,
192
+ ?, ?, ?,
193
+ ?, ?, ?,
194
+ ?, ?, ?, ?
195
+ )
196
+ `).run(id, snapshotTime.getTime(), periodHours, metrics.patternsDiscoveredTotal, metrics.patternsDiscoveredToday, metrics.discoveryRate, metrics.patternAccuracy, metrics.insightActionability, metrics.falsePositiveRate, metrics.transferSuccessRate, metrics.adoptionRate, metrics.negativeTransferCount, metrics.taskTimeReduction, metrics.coverageImprovement, metrics.bugDetectionImprovement, metrics.sleepCycleCompletionRate, metrics.avgCycleDuration, metrics.errorRate, metrics.calculatedAt.getTime(), metrics.periodStart.getTime(), metrics.periodEnd.getTime(), Date.now());
197
+ if (this.config.debug) {
198
+ this.logger.debug('[MetricsStore] Snapshot captured', {
199
+ id,
200
+ discoveryRate: metrics.discoveryRate,
201
+ transferSuccessRate: metrics.transferSuccessRate,
202
+ });
203
+ }
204
+ return {
205
+ id,
206
+ metrics,
207
+ snapshotTime,
208
+ periodHours,
209
+ };
210
+ }
211
+ /**
212
+ * Get historical snapshots
213
+ */
214
+ async getHistory(query) {
215
+ const { startTime, endTime, limit = 100, orderBy = 'desc' } = query || {};
216
+ let sql = 'SELECT * FROM metrics_snapshots WHERE 1=1';
217
+ const params = [];
218
+ if (startTime) {
219
+ sql += ' AND snapshot_time >= ?';
220
+ params.push(startTime.getTime());
221
+ }
222
+ if (endTime) {
223
+ sql += ' AND snapshot_time <= ?';
224
+ params.push(endTime.getTime());
225
+ }
226
+ sql += ` ORDER BY snapshot_time ${orderBy.toUpperCase()} LIMIT ?`;
227
+ params.push(limit);
228
+ const rows = this.db.prepare(sql).all(...params);
229
+ return rows.map(row => this.rowToSnapshot(row));
230
+ }
231
+ /**
232
+ * Get latest snapshot
233
+ */
234
+ async getLatest() {
235
+ const row = this.db.prepare(`
236
+ SELECT * FROM metrics_snapshots
237
+ ORDER BY snapshot_time DESC
238
+ LIMIT 1
239
+ `).get();
240
+ return row ? this.rowToSnapshot(row) : null;
241
+ }
242
+ /**
243
+ * Get rolling average for a metric
244
+ */
245
+ async getRollingAverage(metricName, windowHours) {
246
+ const columnName = this.metricNameToColumn(metricName);
247
+ const windowMs = windowHours * 60 * 60 * 1000;
248
+ const now = Date.now();
249
+ // Get snapshots in window
250
+ const rows = this.db.prepare(`
251
+ SELECT snapshot_time, ${columnName} as value
252
+ FROM metrics_snapshots
253
+ WHERE snapshot_time >= ?
254
+ ORDER BY snapshot_time ASC
255
+ `).all(now - windowMs);
256
+ if (rows.length === 0)
257
+ return [];
258
+ // Calculate rolling average
259
+ const values = [];
260
+ for (let i = 0; i < rows.length; i++) {
261
+ const windowStart = rows[i].snapshot_time - windowMs;
262
+ const windowData = rows.filter(r => r.snapshot_time >= windowStart && r.snapshot_time <= rows[i].snapshot_time);
263
+ const avg = windowData.reduce((sum, r) => sum + (r.value || 0), 0) / windowData.length;
264
+ values.push(avg);
265
+ }
266
+ return values;
267
+ }
268
+ /**
269
+ * Get aggregated statistics for metrics
270
+ */
271
+ async getAggregations(metricNames, query) {
272
+ const { startTime, endTime } = query || {};
273
+ const result = new Map();
274
+ for (const metricName of metricNames) {
275
+ const columnName = this.metricNameToColumn(metricName);
276
+ let sql = `
277
+ SELECT
278
+ AVG(${columnName}) as avg,
279
+ MIN(${columnName}) as min,
280
+ MAX(${columnName}) as max,
281
+ COUNT(*) as count
282
+ FROM metrics_snapshots
283
+ WHERE 1=1
284
+ `;
285
+ const params = [];
286
+ if (startTime) {
287
+ sql += ' AND snapshot_time >= ?';
288
+ params.push(startTime.getTime());
289
+ }
290
+ if (endTime) {
291
+ sql += ' AND snapshot_time <= ?';
292
+ params.push(endTime.getTime());
293
+ }
294
+ const row = this.db.prepare(sql).get(...params);
295
+ // Calculate standard deviation
296
+ let stdDev = 0;
297
+ if (row.count > 1) {
298
+ let varianceSql = `
299
+ SELECT
300
+ SUM((${columnName} - ?) * (${columnName} - ?)) / (COUNT(*) - 1) as variance
301
+ FROM metrics_snapshots
302
+ WHERE 1=1
303
+ `;
304
+ const varianceParams = [row.avg, row.avg];
305
+ if (startTime) {
306
+ varianceSql += ' AND snapshot_time >= ?';
307
+ varianceParams.push(startTime.getTime());
308
+ }
309
+ if (endTime) {
310
+ varianceSql += ' AND snapshot_time <= ?';
311
+ varianceParams.push(endTime.getTime());
312
+ }
313
+ const varianceRow = this.db.prepare(varianceSql).get(...varianceParams);
314
+ stdDev = Math.sqrt(varianceRow?.variance || 0);
315
+ }
316
+ // Calculate trend (linear regression slope)
317
+ const trend = await this.calculateTrend(columnName, query);
318
+ result.set(metricName, {
319
+ metric: metricName,
320
+ avg: row.avg || 0,
321
+ min: row.min || 0,
322
+ max: row.max || 0,
323
+ stdDev,
324
+ count: row.count || 0,
325
+ trend,
326
+ });
327
+ }
328
+ return result;
329
+ }
330
+ /**
331
+ * Calculate trend using linear regression
332
+ */
333
+ async calculateTrend(columnName, query) {
334
+ const { startTime, endTime } = query || {};
335
+ let sql = `
336
+ SELECT snapshot_time, ${columnName} as value
337
+ FROM metrics_snapshots
338
+ WHERE 1=1
339
+ `;
340
+ const params = [];
341
+ if (startTime) {
342
+ sql += ' AND snapshot_time >= ?';
343
+ params.push(startTime.getTime());
344
+ }
345
+ if (endTime) {
346
+ sql += ' AND snapshot_time <= ?';
347
+ params.push(endTime.getTime());
348
+ }
349
+ sql += ' ORDER BY snapshot_time ASC';
350
+ const rows = this.db.prepare(sql).all(...params);
351
+ if (rows.length < 2)
352
+ return 0;
353
+ // Simple linear regression: y = mx + b, we return m (slope)
354
+ const n = rows.length;
355
+ let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;
356
+ for (let i = 0; i < n; i++) {
357
+ const x = i; // Use index as x to normalize
358
+ const y = rows[i].value || 0;
359
+ sumX += x;
360
+ sumY += y;
361
+ sumXY += x * y;
362
+ sumX2 += x * x;
363
+ }
364
+ const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
365
+ return isFinite(slope) ? slope : 0;
366
+ }
367
+ /**
368
+ * Get trends for multiple metrics
369
+ */
370
+ async getTrends(metricNames, query) {
371
+ const trends = new Map();
372
+ for (const metricName of metricNames) {
373
+ const columnName = this.metricNameToColumn(metricName);
374
+ const trend = await this.calculateTrend(columnName, query);
375
+ trends.set(metricName, trend);
376
+ }
377
+ return trends;
378
+ }
379
+ /**
380
+ * Get metric comparison between two time periods
381
+ */
382
+ async compareMetrics(metricNames, period1Start, period1End, period2Start, period2End) {
383
+ const result = new Map();
384
+ for (const metricName of metricNames) {
385
+ const columnName = this.metricNameToColumn(metricName);
386
+ const period1Row = this.db.prepare(`
387
+ SELECT AVG(${columnName}) as avg
388
+ FROM metrics_snapshots
389
+ WHERE snapshot_time >= ? AND snapshot_time <= ?
390
+ `).get(period1Start.getTime(), period1End.getTime());
391
+ const period2Row = this.db.prepare(`
392
+ SELECT AVG(${columnName}) as avg
393
+ FROM metrics_snapshots
394
+ WHERE snapshot_time >= ? AND snapshot_time <= ?
395
+ `).get(period2Start.getTime(), period2End.getTime());
396
+ const period1Avg = period1Row?.avg || 0;
397
+ const period2Avg = period2Row?.avg || 0;
398
+ const change = period2Avg - period1Avg;
399
+ const changePercent = period1Avg > 0 ? (change / period1Avg) * 100 : 0;
400
+ result.set(metricName, {
401
+ period1: period1Avg,
402
+ period2: period2Avg,
403
+ change,
404
+ changePercent,
405
+ });
406
+ }
407
+ return result;
408
+ }
409
+ /**
410
+ * Clean up old snapshots based on retention policy
411
+ */
412
+ async cleanupOldSnapshots() {
413
+ if (this.config.retentionDays === 0)
414
+ return 0;
415
+ const cutoffTime = Date.now() - this.config.retentionDays * 24 * 60 * 60 * 1000;
416
+ const result = this.db.prepare(`
417
+ DELETE FROM metrics_snapshots
418
+ WHERE snapshot_time < ?
419
+ `).run(cutoffTime);
420
+ const deleted = result.changes;
421
+ if (deleted > 0) {
422
+ this.logger.info('[MetricsStore] Cleaned up old snapshots', {
423
+ deleted,
424
+ retentionDays: this.config.retentionDays,
425
+ });
426
+ }
427
+ return deleted;
428
+ }
429
+ /**
430
+ * Get snapshot count
431
+ */
432
+ getSnapshotCount(query) {
433
+ const { startTime, endTime } = query || {};
434
+ let sql = 'SELECT COUNT(*) as count FROM metrics_snapshots WHERE 1=1';
435
+ const params = [];
436
+ if (startTime) {
437
+ sql += ' AND snapshot_time >= ?';
438
+ params.push(startTime.getTime());
439
+ }
440
+ if (endTime) {
441
+ sql += ' AND snapshot_time <= ?';
442
+ params.push(endTime.getTime());
443
+ }
444
+ const row = this.db.prepare(sql).get(...params);
445
+ return row?.count || 0;
446
+ }
447
+ /**
448
+ * Export metrics to JSON
449
+ */
450
+ async exportMetrics(query) {
451
+ return this.getHistory(query);
452
+ }
453
+ /**
454
+ * Convert database row to MetricsSnapshot
455
+ */
456
+ rowToSnapshot(row) {
457
+ const metrics = {
458
+ patternsDiscoveredTotal: row.patterns_discovered_total,
459
+ patternsDiscoveredToday: row.patterns_discovered_today,
460
+ discoveryRate: row.discovery_rate,
461
+ patternAccuracy: row.pattern_accuracy,
462
+ insightActionability: row.insight_actionability,
463
+ falsePositiveRate: row.false_positive_rate,
464
+ transferSuccessRate: row.transfer_success_rate,
465
+ adoptionRate: row.adoption_rate,
466
+ negativeTransferCount: row.negative_transfer_count,
467
+ taskTimeReduction: row.task_time_reduction,
468
+ coverageImprovement: row.coverage_improvement,
469
+ bugDetectionImprovement: row.bug_detection_improvement,
470
+ sleepCycleCompletionRate: row.sleep_cycle_completion_rate,
471
+ avgCycleDuration: row.avg_cycle_duration,
472
+ errorRate: row.error_rate,
473
+ calculatedAt: new Date(row.calculated_at),
474
+ periodStart: new Date(row.period_start),
475
+ periodEnd: new Date(row.period_end),
476
+ };
477
+ return {
478
+ id: row.id,
479
+ metrics,
480
+ snapshotTime: new Date(row.snapshot_time),
481
+ periodHours: row.period_hours,
482
+ };
483
+ }
484
+ /**
485
+ * Convert metric name to database column name
486
+ */
487
+ metricNameToColumn(metricName) {
488
+ // Convert camelCase to snake_case
489
+ return metricName.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
490
+ }
491
+ /**
492
+ * Close database connection and stop auto-snapshot
493
+ */
494
+ close() {
495
+ this.stopAutoSnapshot();
496
+ this.collector.close();
497
+ this.db.close();
498
+ }
499
+ }
500
+ exports.MetricsStore = MetricsStore;
501
+ exports.default = MetricsStore;
502
+ //# sourceMappingURL=MetricsStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsStore.js","sourceRoot":"","sources":["../../../src/learning/metrics/MetricsStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * TrendAnalyzer - Phase 3 Trend Analysis
3
+ *
4
+ * Analyzes metric trends over time and provides forecasting.
5
+ * Detects improving, stable, or declining trends.
6
+ */
7
+ import { MetricsCollector, AggregatedMetrics } from './MetricsCollector';
8
+ /**
9
+ * Trend direction
10
+ */
11
+ export declare enum TrendDirection {
12
+ IMPROVING = "improving",
13
+ STABLE = "stable",
14
+ DECLINING = "declining"
15
+ }
16
+ /**
17
+ * Trend analysis result
18
+ */
19
+ export interface TrendAnalysis {
20
+ metric: string;
21
+ direction: TrendDirection;
22
+ changePercentage: number;
23
+ forecast: number;
24
+ confidence: number;
25
+ dataPoints: number;
26
+ }
27
+ /**
28
+ * Time period for trend analysis
29
+ */
30
+ export declare enum TrendPeriod {
31
+ DAILY = "daily",
32
+ WEEKLY = "weekly",
33
+ MONTHLY = "monthly"
34
+ }
35
+ /**
36
+ * TrendAnalyzer - Analyzes metric trends
37
+ */
38
+ export declare class TrendAnalyzer {
39
+ private readonly logger;
40
+ private readonly metricsCollector;
41
+ constructor(metricsCollector: MetricsCollector);
42
+ /**
43
+ * Analyze trend for a specific metric
44
+ */
45
+ analyzeTrend(metricName: string, days?: number): Promise<TrendAnalysis>;
46
+ /**
47
+ * Analyze all key metrics
48
+ */
49
+ analyzeAllTrends(period?: TrendPeriod): Promise<TrendAnalysis[]>;
50
+ /**
51
+ * Get trend summary for all categories
52
+ */
53
+ getTrendSummary(metrics: AggregatedMetrics): Promise<{
54
+ discovery: TrendDirection;
55
+ quality: TrendDirection;
56
+ transfer: TrendDirection;
57
+ impact: TrendDirection;
58
+ system: TrendDirection;
59
+ }>;
60
+ /**
61
+ * Linear regression for trend analysis
62
+ */
63
+ private linearRegression;
64
+ /**
65
+ * Determine trend direction from slope
66
+ */
67
+ private determineTrendDirection;
68
+ /**
69
+ * Calculate confidence using R² (coefficient of determination)
70
+ */
71
+ private calculateConfidence;
72
+ /**
73
+ * Convert period to days
74
+ */
75
+ private periodToDays;
76
+ /**
77
+ * Get visual indicator for trend
78
+ */
79
+ static getTrendIndicator(direction: TrendDirection): string;
80
+ /**
81
+ * Generate sparkline from metric history
82
+ */
83
+ static generateSparkline(values: number[], width?: number): string;
84
+ }
85
+ //# sourceMappingURL=TrendAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrendAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/learning/metrics/TrendAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAe,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEtF;;GAEG;AACH,oBAAY,cAAc;IACxB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,cAAc,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAExC,gBAAgB,EAAE,gBAAgB;IAK9C;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IA2CjF;;OAEG;IACG,gBAAgB,CAAC,MAAM,GAAE,WAAgC,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAqB1F;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC;QACzD,SAAS,EAAE,cAAc,CAAC;QAC1B,OAAO,EAAE,cAAc,CAAC;QACxB,QAAQ,EAAE,cAAc,CAAC;QACzB,MAAM,EAAE,cAAc,CAAC;QACvB,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC;IAiBF;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM;IAW3D;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM;CAsBvE"}