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,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RuVectorReasoningAdapter - Integration Bridge for QEReasoningBank and RuVectorPatternStore
|
|
3
|
+
*
|
|
4
|
+
* @module reasoning/RuVectorReasoningAdapter
|
|
5
|
+
* @version 1.0.0
|
|
6
|
+
*
|
|
7
|
+
* @description
|
|
8
|
+
* Bridges QEReasoningBank's TestPattern format to RuVectorPatternStore's interface,
|
|
9
|
+
* providing high-performance vector search with HNSW indexing while maintaining
|
|
10
|
+
* backward compatibility with existing QE workflows.
|
|
11
|
+
*
|
|
12
|
+
* **Performance Characteristics:**
|
|
13
|
+
* - Pattern storage: <10ms with RuVector (vs. <25ms baseline)
|
|
14
|
+
* - Pattern search: <20ms with HNSW (vs. <50ms baseline)
|
|
15
|
+
* - Throughput: 192K QPS (vs. 40K QPS baseline)
|
|
16
|
+
* - Latency: 1.5µs p50, 3.2µs p99
|
|
17
|
+
*
|
|
18
|
+
* **Backend Modes:**
|
|
19
|
+
* - `memory`: In-memory only (original QEReasoningBank behavior)
|
|
20
|
+
* - `ruvector`: High-performance RuVector with HNSW indexing
|
|
21
|
+
* - `hybrid`: Dual storage with sync (best of both worlds)
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Create adapter with RuVector backend
|
|
26
|
+
* const adapter = await createReasoningAdapter({
|
|
27
|
+
* backend: 'ruvector',
|
|
28
|
+
* ruvectorPath: './data/patterns.ruvector',
|
|
29
|
+
* enableMetrics: true
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // Store pattern (automatically syncs to RuVector)
|
|
33
|
+
* await adapter.storePattern(qePattern);
|
|
34
|
+
*
|
|
35
|
+
* // Search using HNSW index (150x faster)
|
|
36
|
+
* const matches = await adapter.searchSimilar(queryEmbedding, {
|
|
37
|
+
* k: 10,
|
|
38
|
+
* framework: 'jest'
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
import { TestPattern as QETestPattern, PatternMatch } from './QEReasoningBank';
|
|
43
|
+
import { TestPattern as RuVectorTestPattern, IPatternStore } from '../core/memory/IPatternStore';
|
|
44
|
+
/**
|
|
45
|
+
* Adapter configuration options
|
|
46
|
+
*/
|
|
47
|
+
export interface ReasoningAdapterConfig {
|
|
48
|
+
/** Backend selection: memory (original), ruvector (high-perf), or hybrid (dual) */
|
|
49
|
+
backend: 'memory' | 'ruvector' | 'hybrid';
|
|
50
|
+
/** Path to RuVector database file */
|
|
51
|
+
ruvectorPath?: string;
|
|
52
|
+
/** Enable performance metrics tracking */
|
|
53
|
+
enableMetrics?: boolean;
|
|
54
|
+
/** Sync interval for hybrid mode (ms) */
|
|
55
|
+
syncInterval?: number;
|
|
56
|
+
/** Embedding dimension (default: 384) */
|
|
57
|
+
dimension?: number;
|
|
58
|
+
/** HNSW configuration for RuVector */
|
|
59
|
+
hnsw?: {
|
|
60
|
+
m?: number;
|
|
61
|
+
efConstruction?: number;
|
|
62
|
+
efSearch?: number;
|
|
63
|
+
};
|
|
64
|
+
/** Auto-persist RuVector to disk */
|
|
65
|
+
autoPersist?: boolean;
|
|
66
|
+
/** Verbose logging */
|
|
67
|
+
verbose?: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Adapter performance metrics
|
|
71
|
+
*/
|
|
72
|
+
export interface AdapterMetrics {
|
|
73
|
+
totalStores: number;
|
|
74
|
+
totalSearches: number;
|
|
75
|
+
avgStoreTime: number;
|
|
76
|
+
avgSearchTime: number;
|
|
77
|
+
cacheHitRate: number;
|
|
78
|
+
ruvectorQPS?: number;
|
|
79
|
+
ruvectorLatencyP50?: number;
|
|
80
|
+
ruvectorLatencyP99?: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* RuVectorReasoningAdapter - Bridges QEReasoningBank to RuVectorPatternStore
|
|
84
|
+
*
|
|
85
|
+
* **Key Features:**
|
|
86
|
+
* - Seamless format conversion between QE and RuVector
|
|
87
|
+
* - 150x faster search with HNSW indexing
|
|
88
|
+
* - Backward compatibility with existing QE workflows
|
|
89
|
+
* - Hybrid mode with automatic synchronization
|
|
90
|
+
* - Performance metrics and monitoring
|
|
91
|
+
*
|
|
92
|
+
* **Usage Patterns:**
|
|
93
|
+
* 1. **Drop-in replacement**: Set backend='ruvector' for instant performance boost
|
|
94
|
+
* 2. **Hybrid mode**: Use both backends for gradual migration
|
|
95
|
+
* 3. **Memory fallback**: Automatically falls back to memory if RuVector unavailable
|
|
96
|
+
*/
|
|
97
|
+
export declare class RuVectorReasoningAdapter {
|
|
98
|
+
private config;
|
|
99
|
+
private ruvectorStore?;
|
|
100
|
+
private vectorSimilarity;
|
|
101
|
+
private syncTimer?;
|
|
102
|
+
private initialized;
|
|
103
|
+
private metrics;
|
|
104
|
+
constructor(config: ReasoningAdapterConfig);
|
|
105
|
+
/**
|
|
106
|
+
* Initialize the adapter and underlying storage
|
|
107
|
+
*/
|
|
108
|
+
initialize(): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Initialize RuVector pattern store
|
|
111
|
+
*/
|
|
112
|
+
private initializeRuVector;
|
|
113
|
+
/**
|
|
114
|
+
* Convert QE TestPattern to RuVector TestPattern format
|
|
115
|
+
*
|
|
116
|
+
* **Mapping:**
|
|
117
|
+
* - QE.category → RuVector.type (unit/integration/e2e/etc.)
|
|
118
|
+
* - QE.framework → RuVector.framework (jest/mocha/etc.)
|
|
119
|
+
* - QE.template + examples → RuVector.content (concatenated)
|
|
120
|
+
* - QE.metadata.tags → RuVector.metadata.tags
|
|
121
|
+
* - Generate embedding from pattern text
|
|
122
|
+
*/
|
|
123
|
+
toRuVectorPattern(pattern: QETestPattern): RuVectorTestPattern;
|
|
124
|
+
/**
|
|
125
|
+
* Convert RuVector TestPattern to QE TestPattern format
|
|
126
|
+
*/
|
|
127
|
+
fromRuVectorPattern(rvPattern: RuVectorTestPattern): QETestPattern;
|
|
128
|
+
/**
|
|
129
|
+
* Store pattern using configured backend
|
|
130
|
+
*
|
|
131
|
+
* **Behavior by mode:**
|
|
132
|
+
* - `memory`: No-op (caller stores in QEReasoningBank)
|
|
133
|
+
* - `ruvector`: Store in RuVector only
|
|
134
|
+
* - `hybrid`: Store in both (async for RuVector)
|
|
135
|
+
*/
|
|
136
|
+
storePattern(pattern: QETestPattern): Promise<void>;
|
|
137
|
+
/**
|
|
138
|
+
* Search for similar patterns using RuVector's HNSW index
|
|
139
|
+
*
|
|
140
|
+
* **Performance:**
|
|
141
|
+
* - RuVector: <20ms with HNSW (150x faster than brute force)
|
|
142
|
+
* - Memory: Falls back to caller's vector search
|
|
143
|
+
*
|
|
144
|
+
* **Options:**
|
|
145
|
+
* - k: Number of results (default: 10)
|
|
146
|
+
* - framework: Filter by framework
|
|
147
|
+
* - domain: Filter by domain
|
|
148
|
+
*/
|
|
149
|
+
searchSimilar(queryEmbedding: number[], options?: {
|
|
150
|
+
k?: number;
|
|
151
|
+
framework?: string;
|
|
152
|
+
domain?: string;
|
|
153
|
+
}): Promise<PatternMatch[]>;
|
|
154
|
+
/**
|
|
155
|
+
* Get pattern by ID from RuVector
|
|
156
|
+
*/
|
|
157
|
+
getPattern(id: string): Promise<QETestPattern | null>;
|
|
158
|
+
/**
|
|
159
|
+
* Get underlying RuVector store for direct access
|
|
160
|
+
*/
|
|
161
|
+
getStore(): IPatternStore | undefined;
|
|
162
|
+
/**
|
|
163
|
+
* Sync in-memory indexes with RuVector (for hybrid mode)
|
|
164
|
+
*
|
|
165
|
+
* In hybrid mode, this pulls all patterns from RuVector and
|
|
166
|
+
* ensures the in-memory indexes are up to date.
|
|
167
|
+
*/
|
|
168
|
+
sync(): Promise<void>;
|
|
169
|
+
/**
|
|
170
|
+
* Shutdown adapter and cleanup resources
|
|
171
|
+
*/
|
|
172
|
+
shutdown(): Promise<void>;
|
|
173
|
+
/**
|
|
174
|
+
* Get adapter performance metrics
|
|
175
|
+
*/
|
|
176
|
+
getMetrics(): AdapterMetrics;
|
|
177
|
+
/**
|
|
178
|
+
* Get current configuration
|
|
179
|
+
*/
|
|
180
|
+
getConfig(): Required<ReasoningAdapterConfig>;
|
|
181
|
+
/**
|
|
182
|
+
* Get backend status
|
|
183
|
+
*/
|
|
184
|
+
getStatus(): {
|
|
185
|
+
initialized: boolean;
|
|
186
|
+
backend: string;
|
|
187
|
+
ruvectorAvailable: boolean;
|
|
188
|
+
patternsStored: number;
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* Start periodic sync for hybrid mode
|
|
192
|
+
*/
|
|
193
|
+
private startPeriodicSync;
|
|
194
|
+
/**
|
|
195
|
+
* Build pattern content from QE template and examples
|
|
196
|
+
*/
|
|
197
|
+
private buildPatternContent;
|
|
198
|
+
/**
|
|
199
|
+
* Get pattern text for embedding generation
|
|
200
|
+
*/
|
|
201
|
+
private getPatternText;
|
|
202
|
+
/**
|
|
203
|
+
* Generate reasoning text for pattern match
|
|
204
|
+
*/
|
|
205
|
+
private generateReasoning;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Create a reasoning adapter with automatic configuration
|
|
209
|
+
*
|
|
210
|
+
* **Backend Selection:**
|
|
211
|
+
* - Checks REASONING_BACKEND env var
|
|
212
|
+
* - Auto-detects RuVector availability
|
|
213
|
+
* - Falls back to memory if RuVector unavailable
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```typescript
|
|
217
|
+
* // Auto-select best backend
|
|
218
|
+
* const adapter = await createReasoningAdapter();
|
|
219
|
+
*
|
|
220
|
+
* // Force RuVector backend
|
|
221
|
+
* const adapter = await createReasoningAdapter({ backend: 'ruvector' });
|
|
222
|
+
*
|
|
223
|
+
* // Hybrid mode with 30-second sync
|
|
224
|
+
* const adapter = await createReasoningAdapter({
|
|
225
|
+
* backend: 'hybrid',
|
|
226
|
+
* syncInterval: 30000
|
|
227
|
+
* });
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
export declare function createReasoningAdapter(config?: Partial<ReasoningAdapterConfig>): Promise<RuVectorReasoningAdapter>;
|
|
231
|
+
export default RuVectorReasoningAdapter;
|
|
232
|
+
//# sourceMappingURL=RuVectorReasoningAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuVectorReasoningAdapter.d.ts","sourceRoot":"","sources":["../../src/reasoning/RuVectorReasoningAdapter.ts"],"names":[],"mappings":"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"}
|