agentic-qe 1.8.2 → 1.8.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.
- package/.claude/agents/qe-test-generator.md +580 -0
- package/.claude/agents/subagents/qe-code-reviewer.md +86 -0
- package/.claude/agents/subagents/qe-coverage-gap-analyzer.md +485 -0
- package/.claude/agents/subagents/qe-data-generator.md +86 -0
- package/.claude/agents/subagents/qe-flaky-investigator.md +416 -0
- package/.claude/agents/subagents/qe-integration-tester.md +87 -0
- package/.claude/agents/subagents/qe-performance-validator.md +98 -0
- package/.claude/agents/subagents/qe-security-auditor.md +86 -0
- package/.claude/agents/subagents/qe-test-data-architect-sub.md +553 -0
- package/.claude/agents/subagents/qe-test-implementer.md +229 -15
- package/.claude/agents/subagents/qe-test-refactorer.md +265 -15
- package/.claude/agents/subagents/qe-test-writer.md +180 -20
- package/.claude/skills/cicd-pipeline-qe-orchestrator/README.md +2 -2
- package/.claude/skills/cicd-pipeline-qe-orchestrator/SKILL.md +6 -6
- package/CHANGELOG.md +294 -0
- package/README.md +83 -52
- package/config/constitution.schema.json +423 -0
- package/config/otel-collector.yaml +234 -0
- package/dist/cli/commands/init-claude-md-template.js +3 -3
- package/dist/constitution/index.d.ts +105 -0
- package/dist/constitution/index.d.ts.map +1 -0
- package/dist/constitution/index.js +207 -0
- package/dist/constitution/index.js.map +1 -0
- package/dist/constitution/loader.d.ts +141 -0
- package/dist/constitution/loader.d.ts.map +1 -0
- package/dist/constitution/loader.js +515 -0
- package/dist/constitution/loader.js.map +1 -0
- package/dist/constitution/schema.d.ts +409 -0
- package/dist/constitution/schema.d.ts.map +1 -0
- package/dist/constitution/schema.js +71 -0
- package/dist/constitution/schema.js.map +1 -0
- package/dist/core/hooks/validators/TDDPhaseValidator.d.ts +110 -0
- package/dist/core/hooks/validators/TDDPhaseValidator.d.ts.map +1 -0
- package/dist/core/hooks/validators/TDDPhaseValidator.js +287 -0
- package/dist/core/hooks/validators/TDDPhaseValidator.js.map +1 -0
- package/dist/core/hooks/validators/index.d.ts +3 -1
- package/dist/core/hooks/validators/index.d.ts.map +1 -1
- package/dist/core/hooks/validators/index.js +4 -2
- package/dist/core/hooks/validators/index.js.map +1 -1
- package/dist/core/memory/MemoryManagerFactory.d.ts +77 -0
- package/dist/core/memory/MemoryManagerFactory.d.ts.map +1 -0
- package/dist/core/memory/MemoryManagerFactory.js +270 -0
- package/dist/core/memory/MemoryManagerFactory.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +18 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +96 -11
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts +1 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +12 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/mcp/handlers/memory/memory-backup.js +6 -6
- package/dist/mcp/handlers/memory/memory-backup.js.map +1 -1
- package/dist/mcp/handlers/phase2/Phase2Tools.d.ts.map +1 -1
- package/dist/mcp/handlers/phase2/Phase2Tools.js +4 -2
- package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -38
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
- package/dist/mcp/services/AgentRegistry.js +4 -4
- package/dist/mcp/services/AgentRegistry.js.map +1 -1
- package/dist/persistence/event-store.d.ts +162 -0
- package/dist/persistence/event-store.d.ts.map +1 -0
- package/dist/persistence/event-store.js +315 -0
- package/dist/persistence/event-store.js.map +1 -0
- package/dist/persistence/index.d.ts +145 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +227 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/metrics-aggregator.d.ts +187 -0
- package/dist/persistence/metrics-aggregator.d.ts.map +1 -0
- package/dist/persistence/metrics-aggregator.js +495 -0
- package/dist/persistence/metrics-aggregator.js.map +1 -0
- package/dist/persistence/reasoning-store.d.ts +178 -0
- package/dist/persistence/reasoning-store.d.ts.map +1 -0
- package/dist/persistence/reasoning-store.js +440 -0
- package/dist/persistence/reasoning-store.js.map +1 -0
- package/dist/persistence/schema.d.ts +181 -0
- package/dist/persistence/schema.d.ts.map +1 -0
- package/dist/persistence/schema.js +186 -0
- package/dist/persistence/schema.js.map +1 -0
- package/dist/telemetry/bootstrap.d.ts +67 -0
- package/dist/telemetry/bootstrap.d.ts.map +1 -0
- package/dist/telemetry/bootstrap.js +320 -0
- package/dist/telemetry/bootstrap.js.map +1 -0
- package/dist/telemetry/index.d.ts +16 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +84 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/metrics/agent-metrics.d.ts +109 -0
- package/dist/telemetry/metrics/agent-metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics/agent-metrics.js +213 -0
- package/dist/telemetry/metrics/agent-metrics.js.map +1 -0
- package/dist/telemetry/metrics/index.d.ts +51 -0
- package/dist/telemetry/metrics/index.d.ts.map +1 -0
- package/dist/telemetry/metrics/index.js +100 -0
- package/dist/telemetry/metrics/index.js.map +1 -0
- package/dist/telemetry/metrics/quality-metrics.d.ts +171 -0
- package/dist/telemetry/metrics/quality-metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics/quality-metrics.js +259 -0
- package/dist/telemetry/metrics/quality-metrics.js.map +1 -0
- package/dist/telemetry/metrics/system-metrics.d.ts +129 -0
- package/dist/telemetry/metrics/system-metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics/system-metrics.js +380 -0
- package/dist/telemetry/metrics/system-metrics.js.map +1 -0
- package/dist/telemetry/types.d.ts +195 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +90 -0
- package/dist/telemetry/types.js.map +1 -0
- package/package.json +18 -2
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Metrics aggregator for quality metrics collection and analysis
|
|
4
|
+
* @module persistence/metrics-aggregator
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MetricsAggregator = void 0;
|
|
8
|
+
const uuid_1 = require("uuid");
|
|
9
|
+
const schema_1 = require("./schema");
|
|
10
|
+
/**
|
|
11
|
+
* Period duration in milliseconds
|
|
12
|
+
*/
|
|
13
|
+
const PERIOD_DURATIONS = {
|
|
14
|
+
'1min': 60 * 1000,
|
|
15
|
+
'5min': 5 * 60 * 1000,
|
|
16
|
+
'1hour': 60 * 60 * 1000,
|
|
17
|
+
'1day': 24 * 60 * 60 * 1000,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* MetricsAggregator collects and aggregates quality metrics
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const aggregator = new MetricsAggregator({ dbPath: './data/metrics.db' });
|
|
25
|
+
*
|
|
26
|
+
* // Record a metric
|
|
27
|
+
* aggregator.recordMetric({
|
|
28
|
+
* agent_id: 'test-generator',
|
|
29
|
+
* metric_name: 'test_coverage',
|
|
30
|
+
* metric_value: 85.5,
|
|
31
|
+
* dimensions: { suite: 'unit', language: 'typescript' }
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* // Aggregate by period
|
|
35
|
+
* aggregator.aggregateByPeriod({ period: '1hour' });
|
|
36
|
+
*
|
|
37
|
+
* // Get trends
|
|
38
|
+
* const trends = aggregator.getMetricTrends('test_coverage', '24h');
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
class MetricsAggregator {
|
|
42
|
+
/**
|
|
43
|
+
* Create a new MetricsAggregator instance
|
|
44
|
+
* @param config - Persistence configuration
|
|
45
|
+
*/
|
|
46
|
+
constructor(config = {}) {
|
|
47
|
+
this.config = { ...schema_1.DEFAULT_PERSISTENCE_CONFIG, ...config };
|
|
48
|
+
this.db = (0, schema_1.createDatabase)(this.config);
|
|
49
|
+
this.statements = this.prepareStatements();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Prepare SQL statements for performance
|
|
53
|
+
*/
|
|
54
|
+
prepareStatements() {
|
|
55
|
+
return {
|
|
56
|
+
insertMetric: this.db.prepare(`
|
|
57
|
+
INSERT INTO quality_metrics (id, timestamp, agent_id, metric_name, metric_value, dimensions)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
59
|
+
`),
|
|
60
|
+
insertAggregated: this.db.prepare(`
|
|
61
|
+
INSERT INTO aggregated_metrics (id, period_start, period_end, agent_id, metric_name, count, sum, min, max, avg)
|
|
62
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
63
|
+
`),
|
|
64
|
+
getMetricsByAgent: this.db.prepare(`
|
|
65
|
+
SELECT * FROM quality_metrics
|
|
66
|
+
WHERE agent_id = ?
|
|
67
|
+
ORDER BY timestamp DESC
|
|
68
|
+
LIMIT ? OFFSET ?
|
|
69
|
+
`),
|
|
70
|
+
getMetricsByName: this.db.prepare(`
|
|
71
|
+
SELECT * FROM quality_metrics
|
|
72
|
+
WHERE metric_name = ?
|
|
73
|
+
ORDER BY timestamp DESC
|
|
74
|
+
LIMIT ? OFFSET ?
|
|
75
|
+
`),
|
|
76
|
+
getAggregatedByPeriod: this.db.prepare(`
|
|
77
|
+
SELECT * FROM aggregated_metrics
|
|
78
|
+
WHERE period_start >= ? AND period_end <= ?
|
|
79
|
+
ORDER BY period_start DESC
|
|
80
|
+
`),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Deserialize metric record from database row
|
|
85
|
+
*/
|
|
86
|
+
deserializeMetric(row) {
|
|
87
|
+
return {
|
|
88
|
+
id: row.id,
|
|
89
|
+
timestamp: row.timestamp,
|
|
90
|
+
agent_id: row.agent_id,
|
|
91
|
+
metric_name: row.metric_name,
|
|
92
|
+
metric_value: row.metric_value,
|
|
93
|
+
dimensions: JSON.parse(row.dimensions),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Deserialize aggregated metric from database row
|
|
98
|
+
*/
|
|
99
|
+
deserializeAggregated(row) {
|
|
100
|
+
return {
|
|
101
|
+
id: row.id,
|
|
102
|
+
period_start: row.period_start,
|
|
103
|
+
period_end: row.period_end,
|
|
104
|
+
agent_id: row.agent_id,
|
|
105
|
+
metric_name: row.metric_name,
|
|
106
|
+
count: row.count,
|
|
107
|
+
sum: row.sum,
|
|
108
|
+
min: row.min,
|
|
109
|
+
max: row.max,
|
|
110
|
+
avg: row.avg,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Record a quality metric
|
|
115
|
+
* @param input - Metric recording input
|
|
116
|
+
* @returns Created metric record
|
|
117
|
+
*/
|
|
118
|
+
recordMetric(input) {
|
|
119
|
+
const id = (0, uuid_1.v4)();
|
|
120
|
+
const timestamp = new Date().toISOString();
|
|
121
|
+
const dimensions = JSON.stringify(input.dimensions || {});
|
|
122
|
+
let retries = this.config.maxRetries || 3;
|
|
123
|
+
while (retries > 0) {
|
|
124
|
+
try {
|
|
125
|
+
this.statements.insertMetric.run(id, timestamp, input.agent_id, input.metric_name, input.metric_value, dimensions);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
retries--;
|
|
130
|
+
if (retries === 0) {
|
|
131
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
132
|
+
throw new Error(`Failed to record metric after retries: ${errorMessage}`);
|
|
133
|
+
}
|
|
134
|
+
const start = Date.now();
|
|
135
|
+
while (Date.now() - start < 100) {
|
|
136
|
+
// Busy wait for synchronous retry
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
id,
|
|
142
|
+
timestamp,
|
|
143
|
+
agent_id: input.agent_id,
|
|
144
|
+
metric_name: input.metric_name,
|
|
145
|
+
metric_value: input.metric_value,
|
|
146
|
+
dimensions: input.dimensions || {},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Record multiple metrics in a batch
|
|
151
|
+
* @param inputs - Array of metric inputs
|
|
152
|
+
* @returns Array of created metrics
|
|
153
|
+
*/
|
|
154
|
+
recordMetricsBatch(inputs) {
|
|
155
|
+
const insertMany = this.db.transaction((items) => {
|
|
156
|
+
const results = [];
|
|
157
|
+
for (const input of items) {
|
|
158
|
+
const result = this.recordMetric(input);
|
|
159
|
+
results.push(result);
|
|
160
|
+
}
|
|
161
|
+
return results;
|
|
162
|
+
});
|
|
163
|
+
return insertMany(inputs);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get metrics by agent ID
|
|
167
|
+
* @param agentId - Agent identifier
|
|
168
|
+
* @param options - Query options
|
|
169
|
+
* @returns Array of metrics
|
|
170
|
+
*/
|
|
171
|
+
getMetricsByAgent(agentId, options = {}) {
|
|
172
|
+
const { limit = 100, offset = 0 } = options;
|
|
173
|
+
const rows = this.statements.getMetricsByAgent.all(agentId, limit, offset);
|
|
174
|
+
return rows.map(row => this.deserializeMetric(row));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get metrics by name
|
|
178
|
+
* @param metricName - Metric name
|
|
179
|
+
* @param options - Query options
|
|
180
|
+
* @returns Array of metrics
|
|
181
|
+
*/
|
|
182
|
+
getMetricsByName(metricName, options = {}) {
|
|
183
|
+
const { limit = 100, offset = 0 } = options;
|
|
184
|
+
const rows = this.statements.getMetricsByName.all(metricName, limit, offset);
|
|
185
|
+
return rows.map(row => this.deserializeMetric(row));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get metrics within a time range
|
|
189
|
+
* @param start - Start timestamp
|
|
190
|
+
* @param end - End timestamp
|
|
191
|
+
* @param limit - Maximum results
|
|
192
|
+
* @returns Array of metrics
|
|
193
|
+
*/
|
|
194
|
+
getMetricsByTimeRange(start, end, limit = 1000) {
|
|
195
|
+
const rows = this.db.prepare(`
|
|
196
|
+
SELECT * FROM quality_metrics
|
|
197
|
+
WHERE timestamp >= ? AND timestamp <= ?
|
|
198
|
+
ORDER BY timestamp DESC
|
|
199
|
+
LIMIT ?
|
|
200
|
+
`).all(start, end, limit);
|
|
201
|
+
return rows.map(row => this.deserializeMetric(row));
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Aggregate metrics by period
|
|
205
|
+
* @param config - Aggregation configuration
|
|
206
|
+
* @returns Number of aggregated periods
|
|
207
|
+
*/
|
|
208
|
+
aggregateByPeriod(config) {
|
|
209
|
+
const duration = PERIOD_DURATIONS[config.period];
|
|
210
|
+
const now = new Date();
|
|
211
|
+
// Calculate period boundaries
|
|
212
|
+
const periodStart = new Date(Math.floor(now.getTime() / duration) * duration - duration);
|
|
213
|
+
const periodEnd = new Date(periodStart.getTime() + duration);
|
|
214
|
+
// Build query conditions
|
|
215
|
+
let whereClause = 'WHERE timestamp >= ? AND timestamp < ?';
|
|
216
|
+
const params = [periodStart.toISOString(), periodEnd.toISOString()];
|
|
217
|
+
if (config.agentId) {
|
|
218
|
+
whereClause += ' AND agent_id = ?';
|
|
219
|
+
params.push(config.agentId);
|
|
220
|
+
}
|
|
221
|
+
if (config.metricName) {
|
|
222
|
+
whereClause += ' AND metric_name = ?';
|
|
223
|
+
params.push(config.metricName);
|
|
224
|
+
}
|
|
225
|
+
// Get aggregations grouped by agent and metric
|
|
226
|
+
const aggregations = this.db.prepare(`
|
|
227
|
+
SELECT
|
|
228
|
+
agent_id,
|
|
229
|
+
metric_name,
|
|
230
|
+
COUNT(*) as count,
|
|
231
|
+
SUM(metric_value) as sum,
|
|
232
|
+
MIN(metric_value) as min,
|
|
233
|
+
MAX(metric_value) as max,
|
|
234
|
+
AVG(metric_value) as avg
|
|
235
|
+
FROM quality_metrics
|
|
236
|
+
${whereClause}
|
|
237
|
+
GROUP BY agent_id, metric_name
|
|
238
|
+
`).all(...params);
|
|
239
|
+
// Insert aggregated records
|
|
240
|
+
const insertAggregations = this.db.transaction((aggs) => {
|
|
241
|
+
for (const agg of aggs) {
|
|
242
|
+
this.statements.insertAggregated.run((0, uuid_1.v4)(), periodStart.toISOString(), periodEnd.toISOString(), agg.agent_id, agg.metric_name, agg.count, agg.sum, agg.min, agg.max, agg.avg);
|
|
243
|
+
}
|
|
244
|
+
return aggs.length;
|
|
245
|
+
});
|
|
246
|
+
return insertAggregations(aggregations);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get aggregated metrics for a time period
|
|
250
|
+
* @param start - Period start
|
|
251
|
+
* @param end - Period end
|
|
252
|
+
* @returns Array of aggregated metrics
|
|
253
|
+
*/
|
|
254
|
+
getAggregatedMetrics(start, end) {
|
|
255
|
+
const rows = this.statements.getAggregatedByPeriod.all(start, end);
|
|
256
|
+
return rows.map(row => this.deserializeAggregated(row));
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get metric trends over time
|
|
260
|
+
* @param metricName - Metric to analyze
|
|
261
|
+
* @param timeframe - Timeframe (e.g., '24h', '7d', '30d')
|
|
262
|
+
* @param agentId - Optional agent filter
|
|
263
|
+
* @returns Array of trend data points
|
|
264
|
+
*/
|
|
265
|
+
getMetricTrends(metricName, timeframe, agentId) {
|
|
266
|
+
// Parse timeframe
|
|
267
|
+
const match = timeframe.match(/^(\d+)(h|d|m)$/);
|
|
268
|
+
if (!match) {
|
|
269
|
+
throw new Error(`Invalid timeframe: ${timeframe}`);
|
|
270
|
+
}
|
|
271
|
+
const value = parseInt(match[1], 10);
|
|
272
|
+
const unit = match[2];
|
|
273
|
+
let milliseconds;
|
|
274
|
+
switch (unit) {
|
|
275
|
+
case 'm':
|
|
276
|
+
milliseconds = value * 60 * 1000;
|
|
277
|
+
break;
|
|
278
|
+
case 'h':
|
|
279
|
+
milliseconds = value * 60 * 60 * 1000;
|
|
280
|
+
break;
|
|
281
|
+
case 'd':
|
|
282
|
+
milliseconds = value * 24 * 60 * 60 * 1000;
|
|
283
|
+
break;
|
|
284
|
+
default:
|
|
285
|
+
throw new Error(`Invalid time unit: ${unit}`);
|
|
286
|
+
}
|
|
287
|
+
const end = new Date();
|
|
288
|
+
const start = new Date(end.getTime() - milliseconds);
|
|
289
|
+
// Build query
|
|
290
|
+
let query = `
|
|
291
|
+
SELECT
|
|
292
|
+
strftime('%Y-%m-%dT%H:00:00', timestamp) as hour,
|
|
293
|
+
AVG(metric_value) as value,
|
|
294
|
+
COUNT(*) as count
|
|
295
|
+
FROM quality_metrics
|
|
296
|
+
WHERE metric_name = ? AND timestamp >= ? AND timestamp <= ?
|
|
297
|
+
`;
|
|
298
|
+
const params = [metricName, start.toISOString(), end.toISOString()];
|
|
299
|
+
if (agentId) {
|
|
300
|
+
query += ' AND agent_id = ?';
|
|
301
|
+
params.push(agentId);
|
|
302
|
+
}
|
|
303
|
+
query += ' GROUP BY hour ORDER BY hour ASC';
|
|
304
|
+
const rows = this.db.prepare(query).all(...params);
|
|
305
|
+
return rows.map(row => ({
|
|
306
|
+
timestamp: row.hour,
|
|
307
|
+
value: row.value,
|
|
308
|
+
count: row.count,
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get agent performance summary
|
|
313
|
+
* @param agentId - Agent identifier
|
|
314
|
+
* @param timeframe - Optional timeframe filter
|
|
315
|
+
* @returns Agent performance data
|
|
316
|
+
*/
|
|
317
|
+
getAgentPerformance(agentId, timeframe) {
|
|
318
|
+
let whereClause = 'WHERE agent_id = ?';
|
|
319
|
+
const params = [agentId];
|
|
320
|
+
if (timeframe) {
|
|
321
|
+
const match = timeframe.match(/^(\d+)(h|d|m)$/);
|
|
322
|
+
if (match) {
|
|
323
|
+
const value = parseInt(match[1], 10);
|
|
324
|
+
const unit = match[2];
|
|
325
|
+
let milliseconds;
|
|
326
|
+
switch (unit) {
|
|
327
|
+
case 'm':
|
|
328
|
+
milliseconds = value * 60 * 1000;
|
|
329
|
+
break;
|
|
330
|
+
case 'h':
|
|
331
|
+
milliseconds = value * 60 * 60 * 1000;
|
|
332
|
+
break;
|
|
333
|
+
case 'd':
|
|
334
|
+
milliseconds = value * 24 * 60 * 60 * 1000;
|
|
335
|
+
break;
|
|
336
|
+
default:
|
|
337
|
+
milliseconds = 24 * 60 * 60 * 1000;
|
|
338
|
+
}
|
|
339
|
+
const cutoff = new Date(Date.now() - milliseconds).toISOString();
|
|
340
|
+
whereClause += ' AND timestamp >= ?';
|
|
341
|
+
params.push(cutoff);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Get metric aggregations
|
|
345
|
+
const metricRows = this.db.prepare(`
|
|
346
|
+
SELECT metric_name, AVG(metric_value) as avg_value
|
|
347
|
+
FROM quality_metrics
|
|
348
|
+
${whereClause}
|
|
349
|
+
GROUP BY metric_name
|
|
350
|
+
`).all(...params);
|
|
351
|
+
const metrics = {};
|
|
352
|
+
for (const row of metricRows) {
|
|
353
|
+
metrics[row.metric_name] = row.avg_value;
|
|
354
|
+
}
|
|
355
|
+
// Calculate performance stats
|
|
356
|
+
const totalEvents = this.db.prepare(`
|
|
357
|
+
SELECT COUNT(*) as count
|
|
358
|
+
FROM quality_metrics
|
|
359
|
+
${whereClause}
|
|
360
|
+
`).get(...params);
|
|
361
|
+
// Duration and success rate from specific metrics
|
|
362
|
+
const avgDuration = metrics['duration_ms'] || 0;
|
|
363
|
+
const successRate = metrics['success_rate'] || 1.0;
|
|
364
|
+
return {
|
|
365
|
+
agent_id: agentId,
|
|
366
|
+
total_events: totalEvents.count,
|
|
367
|
+
avg_duration_ms: avgDuration,
|
|
368
|
+
success_rate: successRate,
|
|
369
|
+
metrics,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Get all unique metric names
|
|
374
|
+
* @returns Array of metric names
|
|
375
|
+
*/
|
|
376
|
+
getMetricNames() {
|
|
377
|
+
const rows = this.db.prepare(`
|
|
378
|
+
SELECT DISTINCT metric_name FROM quality_metrics
|
|
379
|
+
ORDER BY metric_name
|
|
380
|
+
`).all();
|
|
381
|
+
return rows.map(row => row.metric_name);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Get metric statistics
|
|
385
|
+
* @param metricName - Metric name
|
|
386
|
+
* @returns Statistics for the metric
|
|
387
|
+
*/
|
|
388
|
+
getMetricStatistics(metricName) {
|
|
389
|
+
const stats = this.db.prepare(`
|
|
390
|
+
SELECT
|
|
391
|
+
COUNT(*) as count,
|
|
392
|
+
MIN(metric_value) as min,
|
|
393
|
+
MAX(metric_value) as max,
|
|
394
|
+
AVG(metric_value) as avg
|
|
395
|
+
FROM quality_metrics
|
|
396
|
+
WHERE metric_name = ?
|
|
397
|
+
`).get(metricName);
|
|
398
|
+
// Calculate standard deviation
|
|
399
|
+
const stddevResult = this.db.prepare(`
|
|
400
|
+
SELECT
|
|
401
|
+
SQRT(AVG((metric_value - ?) * (metric_value - ?))) as stddev
|
|
402
|
+
FROM quality_metrics
|
|
403
|
+
WHERE metric_name = ?
|
|
404
|
+
`).get(stats.avg, stats.avg, metricName);
|
|
405
|
+
// Get percentiles (approximate using order)
|
|
406
|
+
const values = this.db.prepare(`
|
|
407
|
+
SELECT metric_value
|
|
408
|
+
FROM quality_metrics
|
|
409
|
+
WHERE metric_name = ?
|
|
410
|
+
ORDER BY metric_value ASC
|
|
411
|
+
`).all(metricName);
|
|
412
|
+
const getPercentile = (p) => {
|
|
413
|
+
if (values.length === 0)
|
|
414
|
+
return 0;
|
|
415
|
+
const index = Math.floor((p / 100) * values.length);
|
|
416
|
+
return values[Math.min(index, values.length - 1)].metric_value;
|
|
417
|
+
};
|
|
418
|
+
return {
|
|
419
|
+
count: stats.count,
|
|
420
|
+
min: stats.min || 0,
|
|
421
|
+
max: stats.max || 0,
|
|
422
|
+
avg: stats.avg || 0,
|
|
423
|
+
stddev: stddevResult.stddev || 0,
|
|
424
|
+
p50: getPercentile(50),
|
|
425
|
+
p90: getPercentile(90),
|
|
426
|
+
p99: getPercentile(99),
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Compare metric across agents
|
|
431
|
+
* @param metricName - Metric to compare
|
|
432
|
+
* @param limit - Maximum agents to return
|
|
433
|
+
* @returns Agent comparison data
|
|
434
|
+
*/
|
|
435
|
+
compareAgents(metricName, limit = 10) {
|
|
436
|
+
const rows = this.db.prepare(`
|
|
437
|
+
SELECT
|
|
438
|
+
agent_id,
|
|
439
|
+
AVG(metric_value) as avg,
|
|
440
|
+
COUNT(*) as count
|
|
441
|
+
FROM quality_metrics
|
|
442
|
+
WHERE metric_name = ?
|
|
443
|
+
GROUP BY agent_id
|
|
444
|
+
ORDER BY avg DESC
|
|
445
|
+
LIMIT ?
|
|
446
|
+
`).all(metricName, limit);
|
|
447
|
+
return rows;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Delete metrics older than specified date
|
|
451
|
+
* @param olderThan - ISO timestamp cutoff
|
|
452
|
+
* @returns Number of deleted metrics
|
|
453
|
+
*/
|
|
454
|
+
deleteMetricsOlderThan(olderThan) {
|
|
455
|
+
const result = this.db.prepare(`
|
|
456
|
+
DELETE FROM quality_metrics WHERE timestamp < ?
|
|
457
|
+
`).run(olderThan);
|
|
458
|
+
return result.changes;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Delete aggregated metrics older than specified date
|
|
462
|
+
* @param olderThan - ISO timestamp cutoff
|
|
463
|
+
* @returns Number of deleted records
|
|
464
|
+
*/
|
|
465
|
+
deleteAggregatedOlderThan(olderThan) {
|
|
466
|
+
const result = this.db.prepare(`
|
|
467
|
+
DELETE FROM aggregated_metrics WHERE period_end < ?
|
|
468
|
+
`).run(olderThan);
|
|
469
|
+
return result.changes;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Get overall statistics
|
|
473
|
+
* @returns Aggregator statistics
|
|
474
|
+
*/
|
|
475
|
+
getStatistics() {
|
|
476
|
+
const stats = this.db.prepare(`
|
|
477
|
+
SELECT
|
|
478
|
+
(SELECT COUNT(*) FROM quality_metrics) as totalMetrics,
|
|
479
|
+
(SELECT COUNT(*) FROM aggregated_metrics) as totalAggregated,
|
|
480
|
+
(SELECT COUNT(DISTINCT agent_id) FROM quality_metrics) as uniqueAgents,
|
|
481
|
+
(SELECT COUNT(DISTINCT metric_name) FROM quality_metrics) as uniqueMetricNames,
|
|
482
|
+
(SELECT MIN(timestamp) FROM quality_metrics) as oldestMetric,
|
|
483
|
+
(SELECT MAX(timestamp) FROM quality_metrics) as newestMetric
|
|
484
|
+
`).get();
|
|
485
|
+
return stats;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Close database connection
|
|
489
|
+
*/
|
|
490
|
+
close() {
|
|
491
|
+
(0, schema_1.closeDatabase)(this.db);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
exports.MetricsAggregator = MetricsAggregator;
|
|
495
|
+
//# sourceMappingURL=metrics-aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-aggregator.js","sourceRoot":"","sources":["../../src/persistence/metrics-aggregator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Reasoning chain store for capturing agent reasoning processes
|
|
3
|
+
* @module persistence/reasoning-store
|
|
4
|
+
*/
|
|
5
|
+
import { ReasoningChain, ReasoningStep, ReasoningChainWithSteps, StartChainInput, AddStepInput, ChainStatus, ThoughtType, PersistenceConfig } from './schema';
|
|
6
|
+
/**
|
|
7
|
+
* Query options for reasoning chains
|
|
8
|
+
*/
|
|
9
|
+
export interface ChainQueryOptions {
|
|
10
|
+
limit?: number;
|
|
11
|
+
offset?: number;
|
|
12
|
+
status?: ChainStatus;
|
|
13
|
+
includeSteps?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* ReasoningStore captures and persists agent reasoning processes
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const store = new ReasoningStore({ dbPath: './data/reasoning.db' });
|
|
21
|
+
*
|
|
22
|
+
* // Start a reasoning chain
|
|
23
|
+
* const chain = store.startChain({
|
|
24
|
+
* session_id: 'session-123',
|
|
25
|
+
* agent_id: 'test-generator',
|
|
26
|
+
* context: { task: 'Generate unit tests' }
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Add reasoning steps
|
|
30
|
+
* store.addStep({
|
|
31
|
+
* chain_id: chain.id,
|
|
32
|
+
* thought_type: 'observation',
|
|
33
|
+
* content: 'Analyzing source code structure...',
|
|
34
|
+
* confidence: 0.9,
|
|
35
|
+
* token_count: 150
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // Complete the chain
|
|
39
|
+
* store.completeChain(chain.id, 'completed');
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare class ReasoningStore {
|
|
43
|
+
private db;
|
|
44
|
+
private config;
|
|
45
|
+
private statements;
|
|
46
|
+
/**
|
|
47
|
+
* Create a new ReasoningStore instance
|
|
48
|
+
* @param config - Persistence configuration
|
|
49
|
+
*/
|
|
50
|
+
constructor(config?: Partial<PersistenceConfig>);
|
|
51
|
+
/**
|
|
52
|
+
* Prepare SQL statements for performance
|
|
53
|
+
*/
|
|
54
|
+
private prepareStatements;
|
|
55
|
+
/**
|
|
56
|
+
* Deserialize chain record from database row
|
|
57
|
+
*/
|
|
58
|
+
private deserializeChain;
|
|
59
|
+
/**
|
|
60
|
+
* Deserialize step record from database row
|
|
61
|
+
*/
|
|
62
|
+
private deserializeStep;
|
|
63
|
+
/**
|
|
64
|
+
* Start a new reasoning chain
|
|
65
|
+
* @param input - Chain creation input
|
|
66
|
+
* @returns Created chain record
|
|
67
|
+
*/
|
|
68
|
+
startChain(input: StartChainInput): ReasoningChain;
|
|
69
|
+
/**
|
|
70
|
+
* Add a reasoning step to a chain
|
|
71
|
+
* @param input - Step creation input
|
|
72
|
+
* @returns Created step record
|
|
73
|
+
*/
|
|
74
|
+
addStep(input: AddStepInput): ReasoningStep;
|
|
75
|
+
/**
|
|
76
|
+
* Complete a reasoning chain
|
|
77
|
+
* @param chainId - Chain identifier
|
|
78
|
+
* @param status - Final status (completed, failed, abandoned)
|
|
79
|
+
* @returns Updated chain record
|
|
80
|
+
*/
|
|
81
|
+
completeChain(chainId: string, status?: ChainStatus): ReasoningChain | null;
|
|
82
|
+
/**
|
|
83
|
+
* Get chain by ID
|
|
84
|
+
* @param chainId - Chain identifier
|
|
85
|
+
* @returns Chain record or null
|
|
86
|
+
*/
|
|
87
|
+
getChainById(chainId: string): ReasoningChain | null;
|
|
88
|
+
/**
|
|
89
|
+
* Get chain with all steps
|
|
90
|
+
* @param chainId - Chain identifier
|
|
91
|
+
* @returns Chain with steps or null
|
|
92
|
+
*/
|
|
93
|
+
getChainWithSteps(chainId: string): ReasoningChainWithSteps | null;
|
|
94
|
+
/**
|
|
95
|
+
* Get chains by session ID
|
|
96
|
+
* @param sessionId - Session identifier
|
|
97
|
+
* @param options - Query options
|
|
98
|
+
* @returns Array of chains
|
|
99
|
+
*/
|
|
100
|
+
getChainsBySession(sessionId: string, options?: ChainQueryOptions): ReasoningChain[] | ReasoningChainWithSteps[];
|
|
101
|
+
/**
|
|
102
|
+
* Get chains by agent ID
|
|
103
|
+
* @param agentId - Agent identifier
|
|
104
|
+
* @param options - Query options
|
|
105
|
+
* @returns Array of chains
|
|
106
|
+
*/
|
|
107
|
+
getChainsByAgent(agentId: string, options?: ChainQueryOptions): ReasoningChain[];
|
|
108
|
+
/**
|
|
109
|
+
* Get chains by status
|
|
110
|
+
* @param status - Chain status
|
|
111
|
+
* @param limit - Maximum results
|
|
112
|
+
* @returns Array of chains
|
|
113
|
+
*/
|
|
114
|
+
getChainsByStatus(status: ChainStatus, limit?: number): ReasoningChain[];
|
|
115
|
+
/**
|
|
116
|
+
* Get step count for a chain
|
|
117
|
+
* @param chainId - Chain identifier
|
|
118
|
+
* @returns Number of steps
|
|
119
|
+
*/
|
|
120
|
+
getStepCount(chainId: string): number;
|
|
121
|
+
/**
|
|
122
|
+
* Get total token count for a chain
|
|
123
|
+
* @param chainId - Chain identifier
|
|
124
|
+
* @returns Total tokens used
|
|
125
|
+
*/
|
|
126
|
+
getTotalTokens(chainId: string): number;
|
|
127
|
+
/**
|
|
128
|
+
* Get average confidence for a chain
|
|
129
|
+
* @param chainId - Chain identifier
|
|
130
|
+
* @returns Average confidence score
|
|
131
|
+
*/
|
|
132
|
+
getAverageConfidence(chainId: string): number;
|
|
133
|
+
/**
|
|
134
|
+
* Get steps by thought type
|
|
135
|
+
* @param thoughtType - Type of thought
|
|
136
|
+
* @param limit - Maximum results
|
|
137
|
+
* @returns Array of steps
|
|
138
|
+
*/
|
|
139
|
+
getStepsByType(thoughtType: ThoughtType, limit?: number): ReasoningStep[];
|
|
140
|
+
/**
|
|
141
|
+
* Search chains by context
|
|
142
|
+
* @param key - Context key to search
|
|
143
|
+
* @param value - Value to match
|
|
144
|
+
* @param limit - Maximum results
|
|
145
|
+
* @returns Matching chains
|
|
146
|
+
*/
|
|
147
|
+
searchByContext(key: string, value: string, limit?: number): ReasoningChain[];
|
|
148
|
+
/**
|
|
149
|
+
* Get reasoning chain statistics
|
|
150
|
+
* @returns Statistics about stored chains
|
|
151
|
+
*/
|
|
152
|
+
getStatistics(): {
|
|
153
|
+
totalChains: number;
|
|
154
|
+
totalSteps: number;
|
|
155
|
+
completedChains: number;
|
|
156
|
+
failedChains: number;
|
|
157
|
+
avgStepsPerChain: number;
|
|
158
|
+
avgTokensPerChain: number;
|
|
159
|
+
avgConfidence: number;
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Delete completed chains older than specified date
|
|
163
|
+
* @param olderThan - ISO timestamp cutoff
|
|
164
|
+
* @returns Number of deleted chains
|
|
165
|
+
*/
|
|
166
|
+
deleteOldChains(olderThan: string): number;
|
|
167
|
+
/**
|
|
168
|
+
* Export chain as JSON for analysis
|
|
169
|
+
* @param chainId - Chain identifier
|
|
170
|
+
* @returns JSON-serializable chain data
|
|
171
|
+
*/
|
|
172
|
+
exportChain(chainId: string): Record<string, unknown> | null;
|
|
173
|
+
/**
|
|
174
|
+
* Close database connection
|
|
175
|
+
*/
|
|
176
|
+
close(): void;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=reasoning-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-store.d.ts","sourceRoot":"","sources":["../../src/persistence/reasoning-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,cAAc,EACd,aAAa,EACb,uBAAuB,EACvB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,iBAAiB,EAIlB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAUhB;IAEF;;;OAGG;gBACS,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAMnD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsDzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc;IAyClD;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa;IAkD3C;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,WAAyB,GAAG,cAAc,GAAG,IAAI;IAQxF;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAKpD;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI;IAUlE;;;;;OAKG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,cAAc,EAAE,GAAG,uBAAuB,EAAE;IAiBpH;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,cAAc,EAAE;IAOpF;;;;;OAKG;IACH,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,MAAY,GAAG,cAAc,EAAE;IAW7E;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAKrC;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAUvC;;;;OAIG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU7C;;;;;OAKG;IACH,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,GAAE,MAAY,GAAG,aAAa,EAAE;IAW9E;;;;;;OAMG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,cAAc,EAAE;IAYlF;;;OAGG;IACH,aAAa,IAAI;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;KACvB;IAgCD;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAkB1C;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA0B5D;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|