agentic-qe 1.9.3 → 1.9.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/CHANGELOG.md +54 -0
- package/README.md +30 -5
- package/config/.env.otel.example +25 -0
- package/config/OTEL-QUICK-REFERENCE.md +137 -0
- package/config/README-OTEL.md +222 -0
- package/config/alerting-rules.yml +518 -0
- package/config/docker-compose.otel.yml +187 -0
- package/config/grafana/dashboards/agentic-qe-overview.json +286 -0
- package/config/grafana/provisioning/dashboards/dashboards.yml +19 -0
- package/config/grafana/provisioning/datasources/datasources.yml +53 -0
- package/config/otel-collector-config.yaml.example +145 -0
- package/config/prometheus.yml.example +106 -0
- package/dist/alerting/AlertManager.d.ts +120 -0
- package/dist/alerting/AlertManager.d.ts.map +1 -0
- package/dist/alerting/AlertManager.js +345 -0
- package/dist/alerting/AlertManager.js.map +1 -0
- package/dist/alerting/FeedbackRouter.d.ts +98 -0
- package/dist/alerting/FeedbackRouter.d.ts.map +1 -0
- package/dist/alerting/FeedbackRouter.js +331 -0
- package/dist/alerting/FeedbackRouter.js.map +1 -0
- package/dist/alerting/StrategyApplicator.d.ts +120 -0
- package/dist/alerting/StrategyApplicator.d.ts.map +1 -0
- package/dist/alerting/StrategyApplicator.js +299 -0
- package/dist/alerting/StrategyApplicator.js.map +1 -0
- package/dist/alerting/index.d.ts +68 -0
- package/dist/alerting/index.d.ts.map +1 -0
- package/dist/alerting/index.js +112 -0
- package/dist/alerting/index.js.map +1 -0
- package/dist/alerting/types.d.ts +118 -0
- package/dist/alerting/types.d.ts.map +1 -0
- package/dist/alerting/types.js +11 -0
- package/dist/alerting/types.js.map +1 -0
- package/dist/cli/init/claude-config.d.ts.map +1 -1
- package/dist/cli/init/claude-config.js +12 -7
- package/dist/cli/init/claude-config.js.map +1 -1
- package/dist/core/memory/IPatternStore.d.ts +209 -0
- package/dist/core/memory/IPatternStore.d.ts.map +1 -0
- package/dist/core/memory/IPatternStore.js +15 -0
- package/dist/core/memory/IPatternStore.js.map +1 -0
- package/dist/core/memory/MigrationTools.d.ts +192 -0
- package/dist/core/memory/MigrationTools.d.ts.map +1 -0
- package/dist/core/memory/MigrationTools.js +615 -0
- package/dist/core/memory/MigrationTools.js.map +1 -0
- package/dist/core/memory/NeuralEnhancement.d.ts +154 -0
- package/dist/core/memory/NeuralEnhancement.d.ts.map +1 -0
- package/dist/core/memory/NeuralEnhancement.js +598 -0
- package/dist/core/memory/NeuralEnhancement.js.map +1 -0
- package/dist/core/memory/PatternStoreFactory.d.ts +143 -0
- package/dist/core/memory/PatternStoreFactory.d.ts.map +1 -0
- package/dist/core/memory/PatternStoreFactory.js +370 -0
- package/dist/core/memory/PatternStoreFactory.js.map +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts +1 -0
- package/dist/core/memory/RealAgentDBAdapter.d.ts.map +1 -1
- package/dist/core/memory/RealAgentDBAdapter.js +28 -20
- package/dist/core/memory/RealAgentDBAdapter.js.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +198 -0
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -0
- package/dist/core/memory/RuVectorPatternStore.js +605 -0
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -0
- package/dist/core/memory/SelfHealingMonitor.d.ts +186 -0
- package/dist/core/memory/SelfHealingMonitor.d.ts.map +1 -0
- package/dist/core/memory/SelfHealingMonitor.js +451 -0
- package/dist/core/memory/SelfHealingMonitor.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +62 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +97 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts +11 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +36 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/reasoning/RuVectorReasoningAdapter.d.ts +232 -0
- package/dist/reasoning/RuVectorReasoningAdapter.d.ts.map +1 -0
- package/dist/reasoning/RuVectorReasoningAdapter.js +585 -0
- package/dist/reasoning/RuVectorReasoningAdapter.js.map +1 -0
- package/dist/reasoning/index.d.ts +2 -0
- package/dist/reasoning/index.d.ts.map +1 -1
- package/dist/reasoning/index.js +6 -1
- package/dist/reasoning/index.js.map +1 -1
- package/dist/reporting/ResultAggregator.d.ts +107 -0
- package/dist/reporting/ResultAggregator.d.ts.map +1 -0
- package/dist/reporting/ResultAggregator.js +435 -0
- package/dist/reporting/ResultAggregator.js.map +1 -0
- package/dist/reporting/index.d.ts +48 -0
- package/dist/reporting/index.d.ts.map +1 -0
- package/dist/reporting/index.js +154 -0
- package/dist/reporting/index.js.map +1 -0
- package/dist/reporting/reporters/ControlLoopReporter.d.ts +128 -0
- package/dist/reporting/reporters/ControlLoopReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/ControlLoopReporter.js +417 -0
- package/dist/reporting/reporters/ControlLoopReporter.js.map +1 -0
- package/dist/reporting/reporters/HumanReadableReporter.d.ts +140 -0
- package/dist/reporting/reporters/HumanReadableReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/HumanReadableReporter.js +524 -0
- package/dist/reporting/reporters/HumanReadableReporter.js.map +1 -0
- package/dist/reporting/reporters/JSONReporter.d.ts +193 -0
- package/dist/reporting/reporters/JSONReporter.d.ts.map +1 -0
- package/dist/reporting/reporters/JSONReporter.js +324 -0
- package/dist/reporting/reporters/JSONReporter.js.map +1 -0
- package/dist/reporting/reporters/index.d.ts +14 -0
- package/dist/reporting/reporters/index.d.ts.map +1 -0
- package/dist/reporting/reporters/index.js +19 -0
- package/dist/reporting/reporters/index.js.map +1 -0
- package/dist/reporting/types.d.ts +427 -0
- package/dist/reporting/types.d.ts.map +1 -0
- package/dist/reporting/types.js +12 -0
- package/dist/reporting/types.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelfHealingMonitor - Automatic Performance Monitoring and Recovery for RuVector
|
|
3
|
+
*
|
|
4
|
+
* Based on ruv's AgentDB v2 architecture:
|
|
5
|
+
* - Performance degradation detection (<5% over 30 days target)
|
|
6
|
+
* - Automatic index rebalancing when performance drops
|
|
7
|
+
* - Health monitoring dashboard data
|
|
8
|
+
* - Adaptive HNSW parameter tuning
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Rolling baseline calculation for accurate degradation detection
|
|
12
|
+
* - Gradual HNSW parameter adjustment (M, efSearch)
|
|
13
|
+
* - Index compaction when fragmentation detected
|
|
14
|
+
* - Automatic cache invalidation on performance issues
|
|
15
|
+
* - Event-based notifications for monitoring systems
|
|
16
|
+
*
|
|
17
|
+
* @module core/memory/SelfHealingMonitor
|
|
18
|
+
* @version 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
import type { IPatternStore } from './IPatternStore';
|
|
21
|
+
/**
|
|
22
|
+
* Health metrics snapshot
|
|
23
|
+
*/
|
|
24
|
+
export interface HealthMetrics {
|
|
25
|
+
qps: number;
|
|
26
|
+
p50Latency: number;
|
|
27
|
+
p99Latency: number;
|
|
28
|
+
memoryUsage: number;
|
|
29
|
+
indexSize: number;
|
|
30
|
+
lastOptimization: number;
|
|
31
|
+
degradationPercent: number;
|
|
32
|
+
timestamp: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Monitor configuration
|
|
36
|
+
*/
|
|
37
|
+
export interface MonitorConfig {
|
|
38
|
+
checkIntervalMs?: number;
|
|
39
|
+
degradationThreshold?: number;
|
|
40
|
+
autoHeal?: boolean;
|
|
41
|
+
baselineWindow?: number;
|
|
42
|
+
enableAdaptiveTuning?: boolean;
|
|
43
|
+
maxHealingActions?: number;
|
|
44
|
+
minTimeBetweenHeals?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Healing action record
|
|
48
|
+
*/
|
|
49
|
+
export interface HealingAction {
|
|
50
|
+
type: 'reindex' | 'compact' | 'tune_hnsw' | 'clear_cache';
|
|
51
|
+
reason: string;
|
|
52
|
+
timestamp: number;
|
|
53
|
+
success: boolean;
|
|
54
|
+
metricsAfter?: HealthMetrics;
|
|
55
|
+
error?: string;
|
|
56
|
+
parameters?: Record<string, any>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Event callback type
|
|
60
|
+
*/
|
|
61
|
+
type EventCallback = (data: any) => void;
|
|
62
|
+
/**
|
|
63
|
+
* Event types
|
|
64
|
+
*/
|
|
65
|
+
type MonitorEvent = 'degradation' | 'healed' | 'error' | 'metrics_updated';
|
|
66
|
+
/**
|
|
67
|
+
* Self-healing monitor for RuVector pattern store
|
|
68
|
+
*
|
|
69
|
+
* Continuously monitors performance and automatically applies healing actions
|
|
70
|
+
* when degradation is detected.
|
|
71
|
+
*/
|
|
72
|
+
export declare class SelfHealingMonitor {
|
|
73
|
+
private store;
|
|
74
|
+
private config;
|
|
75
|
+
private intervalId?;
|
|
76
|
+
private running;
|
|
77
|
+
private metricsHistory;
|
|
78
|
+
private baselineMetrics?;
|
|
79
|
+
private lastHealthCheck;
|
|
80
|
+
private queryCount;
|
|
81
|
+
private queryTimings;
|
|
82
|
+
private healingHistory;
|
|
83
|
+
private lastHealingTime;
|
|
84
|
+
private currentHNSWParams;
|
|
85
|
+
private eventListeners;
|
|
86
|
+
/**
|
|
87
|
+
* Create a new self-healing monitor
|
|
88
|
+
*/
|
|
89
|
+
constructor(store: IPatternStore, config?: MonitorConfig);
|
|
90
|
+
/**
|
|
91
|
+
* Start continuous monitoring
|
|
92
|
+
*/
|
|
93
|
+
start(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Stop monitoring
|
|
96
|
+
*/
|
|
97
|
+
stop(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Get current health metrics
|
|
100
|
+
*/
|
|
101
|
+
getHealth(): HealthMetrics;
|
|
102
|
+
/**
|
|
103
|
+
* Get healing history
|
|
104
|
+
*/
|
|
105
|
+
getHealingHistory(): HealingAction[];
|
|
106
|
+
/**
|
|
107
|
+
* Manual healing trigger
|
|
108
|
+
*/
|
|
109
|
+
heal(force?: boolean): Promise<HealingAction | null>;
|
|
110
|
+
/**
|
|
111
|
+
* Event listener registration
|
|
112
|
+
*/
|
|
113
|
+
on(event: MonitorEvent, callback: EventCallback): void;
|
|
114
|
+
/**
|
|
115
|
+
* Event listener removal
|
|
116
|
+
*/
|
|
117
|
+
off(event: MonitorEvent, callback: EventCallback): void;
|
|
118
|
+
/**
|
|
119
|
+
* Export metrics for dashboard
|
|
120
|
+
*/
|
|
121
|
+
exportMetrics(): {
|
|
122
|
+
current: HealthMetrics;
|
|
123
|
+
history: HealthMetrics[];
|
|
124
|
+
actions: HealingAction[];
|
|
125
|
+
baseline?: HealthMetrics;
|
|
126
|
+
config: Required<MonitorConfig>;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Record query for QPS calculation
|
|
130
|
+
*/
|
|
131
|
+
recordQuery(latencyUs: number): void;
|
|
132
|
+
/**
|
|
133
|
+
* Perform periodic health check
|
|
134
|
+
*/
|
|
135
|
+
private performHealthCheck;
|
|
136
|
+
/**
|
|
137
|
+
* Collect current metrics from pattern store
|
|
138
|
+
*/
|
|
139
|
+
private collectMetrics;
|
|
140
|
+
/**
|
|
141
|
+
* Calculate percentile from sorted array
|
|
142
|
+
*/
|
|
143
|
+
private getPercentile;
|
|
144
|
+
/**
|
|
145
|
+
* Get timestamp of last optimization
|
|
146
|
+
*/
|
|
147
|
+
private getLastOptimizationTime;
|
|
148
|
+
/**
|
|
149
|
+
* Calculate degradation percentage compared to baseline
|
|
150
|
+
*/
|
|
151
|
+
private calculateDegradation;
|
|
152
|
+
/**
|
|
153
|
+
* Update baseline metrics
|
|
154
|
+
*/
|
|
155
|
+
private updateBaseline;
|
|
156
|
+
/**
|
|
157
|
+
* Determine best healing action based on metrics
|
|
158
|
+
*/
|
|
159
|
+
private determineHealingAction;
|
|
160
|
+
/**
|
|
161
|
+
* Apply healing action
|
|
162
|
+
*/
|
|
163
|
+
private applyHealingAction;
|
|
164
|
+
/**
|
|
165
|
+
* Adaptively tune HNSW parameters
|
|
166
|
+
*/
|
|
167
|
+
private tuneHNSWParameters;
|
|
168
|
+
/**
|
|
169
|
+
* Record healing action
|
|
170
|
+
*/
|
|
171
|
+
private recordHealingAction;
|
|
172
|
+
/**
|
|
173
|
+
* Emit event to listeners
|
|
174
|
+
*/
|
|
175
|
+
private emit;
|
|
176
|
+
/**
|
|
177
|
+
* Create empty metrics object
|
|
178
|
+
*/
|
|
179
|
+
private createEmptyMetrics;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Create a self-healing monitor with default configuration
|
|
183
|
+
*/
|
|
184
|
+
export declare function createSelfHealingMonitor(store: IPatternStore, config?: MonitorConfig): SelfHealingMonitor;
|
|
185
|
+
export {};
|
|
186
|
+
//# sourceMappingURL=SelfHealingMonitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelfHealingMonitor.d.ts","sourceRoot":"","sources":["../../../src/core/memory/SelfHealingMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SelfHealingMonitor - Automatic Performance Monitoring and Recovery for RuVector
|
|
4
|
+
*
|
|
5
|
+
* Based on ruv's AgentDB v2 architecture:
|
|
6
|
+
* - Performance degradation detection (<5% over 30 days target)
|
|
7
|
+
* - Automatic index rebalancing when performance drops
|
|
8
|
+
* - Health monitoring dashboard data
|
|
9
|
+
* - Adaptive HNSW parameter tuning
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Rolling baseline calculation for accurate degradation detection
|
|
13
|
+
* - Gradual HNSW parameter adjustment (M, efSearch)
|
|
14
|
+
* - Index compaction when fragmentation detected
|
|
15
|
+
* - Automatic cache invalidation on performance issues
|
|
16
|
+
* - Event-based notifications for monitoring systems
|
|
17
|
+
*
|
|
18
|
+
* @module core/memory/SelfHealingMonitor
|
|
19
|
+
* @version 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.SelfHealingMonitor = void 0;
|
|
23
|
+
exports.createSelfHealingMonitor = createSelfHealingMonitor;
|
|
24
|
+
/**
|
|
25
|
+
* Self-healing monitor for RuVector pattern store
|
|
26
|
+
*
|
|
27
|
+
* Continuously monitors performance and automatically applies healing actions
|
|
28
|
+
* when degradation is detected.
|
|
29
|
+
*/
|
|
30
|
+
class SelfHealingMonitor {
|
|
31
|
+
/**
|
|
32
|
+
* Create a new self-healing monitor
|
|
33
|
+
*/
|
|
34
|
+
constructor(store, config) {
|
|
35
|
+
this.running = false;
|
|
36
|
+
// Metrics tracking
|
|
37
|
+
this.metricsHistory = [];
|
|
38
|
+
this.lastHealthCheck = 0;
|
|
39
|
+
this.queryCount = 0;
|
|
40
|
+
this.queryTimings = [];
|
|
41
|
+
// Healing tracking
|
|
42
|
+
this.healingHistory = [];
|
|
43
|
+
this.lastHealingTime = 0;
|
|
44
|
+
this.currentHNSWParams = {
|
|
45
|
+
m: 16,
|
|
46
|
+
efConstruction: 200,
|
|
47
|
+
efSearch: 100,
|
|
48
|
+
};
|
|
49
|
+
// Event listeners
|
|
50
|
+
this.eventListeners = new Map();
|
|
51
|
+
this.store = store;
|
|
52
|
+
this.config = {
|
|
53
|
+
checkIntervalMs: config?.checkIntervalMs ?? 60000,
|
|
54
|
+
degradationThreshold: config?.degradationThreshold ?? 0.05,
|
|
55
|
+
autoHeal: config?.autoHeal ?? true,
|
|
56
|
+
baselineWindow: config?.baselineWindow ?? 100,
|
|
57
|
+
enableAdaptiveTuning: config?.enableAdaptiveTuning ?? true,
|
|
58
|
+
maxHealingActions: config?.maxHealingActions ?? 100,
|
|
59
|
+
minTimeBetweenHeals: config?.minTimeBetweenHeals ?? 300000,
|
|
60
|
+
};
|
|
61
|
+
// Initialize event listener maps
|
|
62
|
+
['degradation', 'healed', 'error', 'metrics_updated'].forEach((event) => {
|
|
63
|
+
this.eventListeners.set(event, new Set());
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Start continuous monitoring
|
|
68
|
+
*/
|
|
69
|
+
start() {
|
|
70
|
+
if (this.running) {
|
|
71
|
+
console.warn('SelfHealingMonitor is already running');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.running = true;
|
|
75
|
+
console.log(`SelfHealingMonitor started (interval: ${this.config.checkIntervalMs}ms, threshold: ${this.config.degradationThreshold * 100}%)`);
|
|
76
|
+
// Initial health check
|
|
77
|
+
this.performHealthCheck().catch((error) => {
|
|
78
|
+
this.emit('error', { message: 'Initial health check failed', error });
|
|
79
|
+
});
|
|
80
|
+
// Schedule periodic checks
|
|
81
|
+
this.intervalId = setInterval(() => {
|
|
82
|
+
this.performHealthCheck().catch((error) => {
|
|
83
|
+
this.emit('error', { message: 'Health check failed', error });
|
|
84
|
+
});
|
|
85
|
+
}, this.config.checkIntervalMs);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Stop monitoring
|
|
89
|
+
*/
|
|
90
|
+
stop() {
|
|
91
|
+
if (!this.running) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (this.intervalId) {
|
|
95
|
+
clearInterval(this.intervalId);
|
|
96
|
+
this.intervalId = undefined;
|
|
97
|
+
}
|
|
98
|
+
this.running = false;
|
|
99
|
+
console.log('SelfHealingMonitor stopped');
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get current health metrics
|
|
103
|
+
*/
|
|
104
|
+
getHealth() {
|
|
105
|
+
if (this.metricsHistory.length === 0) {
|
|
106
|
+
return this.createEmptyMetrics();
|
|
107
|
+
}
|
|
108
|
+
return this.metricsHistory[this.metricsHistory.length - 1];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get healing history
|
|
112
|
+
*/
|
|
113
|
+
getHealingHistory() {
|
|
114
|
+
return [...this.healingHistory];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Manual healing trigger
|
|
118
|
+
*/
|
|
119
|
+
async heal(force = false) {
|
|
120
|
+
const currentMetrics = await this.collectMetrics();
|
|
121
|
+
const degradation = this.calculateDegradation(currentMetrics);
|
|
122
|
+
// Check if healing is needed
|
|
123
|
+
if (!force) {
|
|
124
|
+
if (degradation < this.config.degradationThreshold) {
|
|
125
|
+
console.log('No healing needed: performance within threshold');
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
// Check minimum time between heals
|
|
129
|
+
const timeSinceLastHeal = Date.now() - this.lastHealingTime;
|
|
130
|
+
if (timeSinceLastHeal < this.config.minTimeBetweenHeals) {
|
|
131
|
+
console.log(`Skipping heal: ${Math.round((this.config.minTimeBetweenHeals - timeSinceLastHeal) / 1000)}s until next allowed heal`);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Determine best healing action
|
|
136
|
+
const action = this.determineHealingAction(currentMetrics, degradation);
|
|
137
|
+
console.log(`Applying healing action: ${action.type} (reason: ${action.reason})`);
|
|
138
|
+
try {
|
|
139
|
+
await this.applyHealingAction(action);
|
|
140
|
+
action.success = true;
|
|
141
|
+
// Collect metrics after healing
|
|
142
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
143
|
+
action.metricsAfter = await this.collectMetrics();
|
|
144
|
+
this.lastHealingTime = Date.now();
|
|
145
|
+
this.recordHealingAction(action);
|
|
146
|
+
this.emit('healed', action);
|
|
147
|
+
return action;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
action.success = false;
|
|
151
|
+
action.error = error instanceof Error ? error.message : String(error);
|
|
152
|
+
this.recordHealingAction(action);
|
|
153
|
+
this.emit('error', { message: 'Healing action failed', action, error });
|
|
154
|
+
return action;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Event listener registration
|
|
159
|
+
*/
|
|
160
|
+
on(event, callback) {
|
|
161
|
+
const listeners = this.eventListeners.get(event);
|
|
162
|
+
if (listeners) {
|
|
163
|
+
listeners.add(callback);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Event listener removal
|
|
168
|
+
*/
|
|
169
|
+
off(event, callback) {
|
|
170
|
+
const listeners = this.eventListeners.get(event);
|
|
171
|
+
if (listeners) {
|
|
172
|
+
listeners.delete(callback);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Export metrics for dashboard
|
|
177
|
+
*/
|
|
178
|
+
exportMetrics() {
|
|
179
|
+
return {
|
|
180
|
+
current: this.getHealth(),
|
|
181
|
+
history: [...this.metricsHistory],
|
|
182
|
+
actions: this.getHealingHistory(),
|
|
183
|
+
baseline: this.baselineMetrics,
|
|
184
|
+
config: this.config,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Record query for QPS calculation
|
|
189
|
+
*/
|
|
190
|
+
recordQuery(latencyUs) {
|
|
191
|
+
this.queryCount++;
|
|
192
|
+
this.queryTimings.push(latencyUs);
|
|
193
|
+
// Keep only recent timings (last 1000 queries)
|
|
194
|
+
if (this.queryTimings.length > 1000) {
|
|
195
|
+
this.queryTimings.shift();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// --- Private Methods ---
|
|
199
|
+
/**
|
|
200
|
+
* Perform periodic health check
|
|
201
|
+
*/
|
|
202
|
+
async performHealthCheck() {
|
|
203
|
+
const metrics = await this.collectMetrics();
|
|
204
|
+
// Calculate degradation
|
|
205
|
+
metrics.degradationPercent = this.calculateDegradation(metrics);
|
|
206
|
+
// Store metrics
|
|
207
|
+
this.metricsHistory.push(metrics);
|
|
208
|
+
if (this.metricsHistory.length > 1000) {
|
|
209
|
+
this.metricsHistory.shift();
|
|
210
|
+
}
|
|
211
|
+
// Update baseline if needed
|
|
212
|
+
this.updateBaseline(metrics);
|
|
213
|
+
this.lastHealthCheck = Date.now();
|
|
214
|
+
this.emit('metrics_updated', metrics);
|
|
215
|
+
// Check for degradation and auto-heal
|
|
216
|
+
if (this.config.autoHeal &&
|
|
217
|
+
metrics.degradationPercent >= this.config.degradationThreshold) {
|
|
218
|
+
const timeSinceLastHeal = Date.now() - this.lastHealingTime;
|
|
219
|
+
if (timeSinceLastHeal >= this.config.minTimeBetweenHeals) {
|
|
220
|
+
this.emit('degradation', {
|
|
221
|
+
metrics,
|
|
222
|
+
degradation: metrics.degradationPercent,
|
|
223
|
+
threshold: this.config.degradationThreshold,
|
|
224
|
+
});
|
|
225
|
+
await this.heal(false);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Collect current metrics from pattern store
|
|
231
|
+
*/
|
|
232
|
+
async collectMetrics() {
|
|
233
|
+
const stats = await this.store.getStats();
|
|
234
|
+
// Calculate QPS
|
|
235
|
+
const now = Date.now();
|
|
236
|
+
const timeSinceLastCheck = this.lastHealthCheck
|
|
237
|
+
? (now - this.lastHealthCheck) / 1000
|
|
238
|
+
: 1;
|
|
239
|
+
const qps = timeSinceLastCheck > 0 ? this.queryCount / timeSinceLastCheck : 0;
|
|
240
|
+
// Calculate latency percentiles
|
|
241
|
+
const sortedTimings = [...this.queryTimings].sort((a, b) => a - b);
|
|
242
|
+
const p50 = this.getPercentile(sortedTimings, 0.5);
|
|
243
|
+
const p99 = this.getPercentile(sortedTimings, 0.99);
|
|
244
|
+
// Reset query tracking
|
|
245
|
+
this.queryCount = 0;
|
|
246
|
+
const metrics = {
|
|
247
|
+
qps: Math.round(qps * 100) / 100,
|
|
248
|
+
p50Latency: Math.round(p50),
|
|
249
|
+
p99Latency: Math.round(p99),
|
|
250
|
+
memoryUsage: stats.memoryUsage ?? 0,
|
|
251
|
+
indexSize: stats.count,
|
|
252
|
+
lastOptimization: this.getLastOptimizationTime(),
|
|
253
|
+
degradationPercent: 0, // Will be calculated
|
|
254
|
+
timestamp: now,
|
|
255
|
+
};
|
|
256
|
+
return metrics;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Calculate percentile from sorted array
|
|
260
|
+
*/
|
|
261
|
+
getPercentile(sortedValues, percentile) {
|
|
262
|
+
if (sortedValues.length === 0)
|
|
263
|
+
return 0;
|
|
264
|
+
const index = Math.ceil(sortedValues.length * percentile) - 1;
|
|
265
|
+
return sortedValues[Math.max(0, index)];
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Get timestamp of last optimization
|
|
269
|
+
*/
|
|
270
|
+
getLastOptimizationTime() {
|
|
271
|
+
const optimizationActions = this.healingHistory.filter((action) => action.type === 'reindex' || action.type === 'compact' || action.type === 'tune_hnsw');
|
|
272
|
+
if (optimizationActions.length === 0)
|
|
273
|
+
return 0;
|
|
274
|
+
return optimizationActions[optimizationActions.length - 1].timestamp;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Calculate degradation percentage compared to baseline
|
|
278
|
+
*/
|
|
279
|
+
calculateDegradation(current) {
|
|
280
|
+
if (!this.baselineMetrics) {
|
|
281
|
+
return 0;
|
|
282
|
+
}
|
|
283
|
+
// Primary metric: p99 latency degradation
|
|
284
|
+
const latencyDegradation = this.baselineMetrics.p99Latency > 0
|
|
285
|
+
? (current.p99Latency - this.baselineMetrics.p99Latency) /
|
|
286
|
+
this.baselineMetrics.p99Latency
|
|
287
|
+
: 0;
|
|
288
|
+
// Secondary metric: QPS degradation (inverse - lower QPS is worse)
|
|
289
|
+
const qpsDegradation = this.baselineMetrics.qps > 0
|
|
290
|
+
? (this.baselineMetrics.qps - current.qps) / this.baselineMetrics.qps
|
|
291
|
+
: 0;
|
|
292
|
+
// Weighted average (70% latency, 30% QPS)
|
|
293
|
+
const degradation = latencyDegradation * 0.7 + qpsDegradation * 0.3;
|
|
294
|
+
return Math.max(0, degradation);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Update baseline metrics
|
|
298
|
+
*/
|
|
299
|
+
updateBaseline(current) {
|
|
300
|
+
// Wait until we have enough samples
|
|
301
|
+
if (this.metricsHistory.length < this.config.baselineWindow) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
// Use median of recent samples as baseline
|
|
305
|
+
const recentMetrics = this.metricsHistory.slice(-this.config.baselineWindow);
|
|
306
|
+
const medianP99 = this.getPercentile(recentMetrics.map((m) => m.p99Latency).sort((a, b) => a - b), 0.5);
|
|
307
|
+
const medianQPS = this.getPercentile(recentMetrics.map((m) => m.qps).sort((a, b) => a - b), 0.5);
|
|
308
|
+
this.baselineMetrics = {
|
|
309
|
+
...current,
|
|
310
|
+
p99Latency: medianP99,
|
|
311
|
+
qps: medianQPS,
|
|
312
|
+
degradationPercent: 0,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Determine best healing action based on metrics
|
|
317
|
+
*/
|
|
318
|
+
determineHealingAction(metrics, degradation) {
|
|
319
|
+
const now = Date.now();
|
|
320
|
+
// High latency -> tune HNSW parameters
|
|
321
|
+
if (this.config.enableAdaptiveTuning &&
|
|
322
|
+
this.baselineMetrics &&
|
|
323
|
+
metrics.p99Latency > this.baselineMetrics.p99Latency * 1.5) {
|
|
324
|
+
return {
|
|
325
|
+
type: 'tune_hnsw',
|
|
326
|
+
reason: `p99 latency ${Math.round(metrics.p99Latency)}µs exceeds baseline by 50%`,
|
|
327
|
+
timestamp: now,
|
|
328
|
+
success: false,
|
|
329
|
+
parameters: { ...this.currentHNSWParams },
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
// Low QPS -> clear cache
|
|
333
|
+
if (this.baselineMetrics &&
|
|
334
|
+
metrics.qps < this.baselineMetrics.qps * 0.7) {
|
|
335
|
+
return {
|
|
336
|
+
type: 'clear_cache',
|
|
337
|
+
reason: `QPS ${metrics.qps} is 30% below baseline`,
|
|
338
|
+
timestamp: now,
|
|
339
|
+
success: false,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
// Large index without recent optimization -> compact
|
|
343
|
+
const daysSinceOptimization = metrics.lastOptimization
|
|
344
|
+
? (now - metrics.lastOptimization) / (1000 * 60 * 60 * 24)
|
|
345
|
+
: Infinity;
|
|
346
|
+
if (metrics.indexSize > 10000 && daysSinceOptimization > 7) {
|
|
347
|
+
return {
|
|
348
|
+
type: 'compact',
|
|
349
|
+
reason: `Index size ${metrics.indexSize} with ${Math.round(daysSinceOptimization)} days since last optimization`,
|
|
350
|
+
timestamp: now,
|
|
351
|
+
success: false,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
// Default: reindex
|
|
355
|
+
return {
|
|
356
|
+
type: 'reindex',
|
|
357
|
+
reason: `Performance degradation ${Math.round(degradation * 100)}% exceeds threshold`,
|
|
358
|
+
timestamp: now,
|
|
359
|
+
success: false,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Apply healing action
|
|
364
|
+
*/
|
|
365
|
+
async applyHealingAction(action) {
|
|
366
|
+
switch (action.type) {
|
|
367
|
+
case 'reindex':
|
|
368
|
+
await this.store.buildIndex();
|
|
369
|
+
break;
|
|
370
|
+
case 'compact':
|
|
371
|
+
await this.store.optimize();
|
|
372
|
+
break;
|
|
373
|
+
case 'tune_hnsw':
|
|
374
|
+
await this.tuneHNSWParameters();
|
|
375
|
+
await this.store.buildIndex();
|
|
376
|
+
break;
|
|
377
|
+
case 'clear_cache':
|
|
378
|
+
// Clear internal cache
|
|
379
|
+
this.queryTimings = [];
|
|
380
|
+
this.queryCount = 0;
|
|
381
|
+
break;
|
|
382
|
+
default:
|
|
383
|
+
throw new Error(`Unknown healing action type: ${action.type}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Adaptively tune HNSW parameters
|
|
388
|
+
*/
|
|
389
|
+
async tuneHNSWParameters() {
|
|
390
|
+
const current = this.getHealth();
|
|
391
|
+
// Increase efSearch for better recall at cost of speed
|
|
392
|
+
if (current.p99Latency < 1000) {
|
|
393
|
+
// Still fast, can increase
|
|
394
|
+
this.currentHNSWParams.efSearch = Math.min(this.currentHNSWParams.efSearch + 50, 500);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
// Too slow, decrease
|
|
398
|
+
this.currentHNSWParams.efSearch = Math.max(this.currentHNSWParams.efSearch - 50, 50);
|
|
399
|
+
}
|
|
400
|
+
console.log(`Tuned HNSW parameters: efSearch=${this.currentHNSWParams.efSearch}`);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Record healing action
|
|
404
|
+
*/
|
|
405
|
+
recordHealingAction(action) {
|
|
406
|
+
this.healingHistory.push(action);
|
|
407
|
+
// Trim history
|
|
408
|
+
if (this.healingHistory.length > this.config.maxHealingActions) {
|
|
409
|
+
this.healingHistory.shift();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Emit event to listeners
|
|
414
|
+
*/
|
|
415
|
+
emit(event, data) {
|
|
416
|
+
const listeners = this.eventListeners.get(event);
|
|
417
|
+
if (listeners) {
|
|
418
|
+
listeners.forEach((callback) => {
|
|
419
|
+
try {
|
|
420
|
+
callback(data);
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
console.error(`Error in ${event} event listener:`, error);
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Create empty metrics object
|
|
430
|
+
*/
|
|
431
|
+
createEmptyMetrics() {
|
|
432
|
+
return {
|
|
433
|
+
qps: 0,
|
|
434
|
+
p50Latency: 0,
|
|
435
|
+
p99Latency: 0,
|
|
436
|
+
memoryUsage: 0,
|
|
437
|
+
indexSize: 0,
|
|
438
|
+
lastOptimization: 0,
|
|
439
|
+
degradationPercent: 0,
|
|
440
|
+
timestamp: Date.now(),
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
exports.SelfHealingMonitor = SelfHealingMonitor;
|
|
445
|
+
/**
|
|
446
|
+
* Create a self-healing monitor with default configuration
|
|
447
|
+
*/
|
|
448
|
+
function createSelfHealingMonitor(store, config) {
|
|
449
|
+
return new SelfHealingMonitor(store, config);
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=SelfHealingMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelfHealingMonitor.js","sourceRoot":"","sources":["../../../src/core/memory/SelfHealingMonitor.ts"],"names":[],"mappings":"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"}
|