@claude-flow/plugin-test-intelligence 3.0.0-alpha.1
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/README.md +409 -0
- package/dist/bridges/index.d.ts +8 -0
- package/dist/bridges/index.d.ts.map +1 -0
- package/dist/bridges/index.js +8 -0
- package/dist/bridges/index.js.map +1 -0
- package/dist/bridges/learning-bridge.d.ts +65 -0
- package/dist/bridges/learning-bridge.d.ts.map +1 -0
- package/dist/bridges/learning-bridge.js +368 -0
- package/dist/bridges/learning-bridge.js.map +1 -0
- package/dist/bridges/sona-bridge.d.ts +95 -0
- package/dist/bridges/sona-bridge.d.ts.map +1 -0
- package/dist/bridges/sona-bridge.js +432 -0
- package/dist/bridges/sona-bridge.js.map +1 -0
- package/dist/index.d.ts +113 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-tools.d.ts +18 -0
- package/dist/mcp-tools.d.ts.map +1 -0
- package/dist/mcp-tools.js +681 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/types.d.ts +429 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +131 -0
- package/dist/types.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learning Bridge for Test Intelligence
|
|
3
|
+
*
|
|
4
|
+
* Provides RL-based test selection and prioritization using
|
|
5
|
+
* ruvector-learning-wasm for Q-Learning, PPO, and Decision Transformer.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default learning configuration
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_LEARNING_CONFIG = {
|
|
11
|
+
algorithm: 'ppo',
|
|
12
|
+
learningRate: 0.001,
|
|
13
|
+
gamma: 0.99,
|
|
14
|
+
batchSize: 64,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Learning Bridge Implementation for Test Intelligence
|
|
18
|
+
*
|
|
19
|
+
* Uses reinforcement learning to optimize test selection based on:
|
|
20
|
+
* - Historical test execution patterns
|
|
21
|
+
* - Code change characteristics
|
|
22
|
+
* - Test failure correlations
|
|
23
|
+
*/
|
|
24
|
+
export class TestLearningBridge {
|
|
25
|
+
name = 'test-intelligence-learning';
|
|
26
|
+
version = '0.1.0';
|
|
27
|
+
status = 'unloaded';
|
|
28
|
+
config;
|
|
29
|
+
replayBuffer = [];
|
|
30
|
+
policyWeights;
|
|
31
|
+
testEmbeddings = new Map();
|
|
32
|
+
fileTestMapping = new Map();
|
|
33
|
+
constructor(config) {
|
|
34
|
+
this.config = { ...DEFAULT_LEARNING_CONFIG, ...config };
|
|
35
|
+
this.policyWeights = new Float32Array(1024).fill(0);
|
|
36
|
+
}
|
|
37
|
+
async init() {
|
|
38
|
+
if (this.status === 'ready')
|
|
39
|
+
return;
|
|
40
|
+
if (this.status === 'loading')
|
|
41
|
+
return;
|
|
42
|
+
this.status = 'loading';
|
|
43
|
+
try {
|
|
44
|
+
// Try to load WASM module
|
|
45
|
+
// Dynamic import of optional WASM module - use string literal to avoid type error
|
|
46
|
+
const modulePath = '@claude-flow/ruvector-upstream';
|
|
47
|
+
const wasmModule = await import(/* @vite-ignore */ modulePath).catch(() => null);
|
|
48
|
+
if (wasmModule) {
|
|
49
|
+
// Initialize with WASM module
|
|
50
|
+
this.status = 'ready';
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Use mock implementation
|
|
54
|
+
this.initializeMockWeights();
|
|
55
|
+
this.status = 'ready';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
this.status = 'error';
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async destroy() {
|
|
64
|
+
this.replayBuffer = [];
|
|
65
|
+
this.testEmbeddings.clear();
|
|
66
|
+
this.fileTestMapping.clear();
|
|
67
|
+
this.status = 'unloaded';
|
|
68
|
+
}
|
|
69
|
+
isReady() {
|
|
70
|
+
return this.status === 'ready';
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Train on test execution history
|
|
74
|
+
*
|
|
75
|
+
* Uses temporal difference learning to update the test selection policy
|
|
76
|
+
* based on historical outcomes.
|
|
77
|
+
*/
|
|
78
|
+
async trainOnHistory(history, config) {
|
|
79
|
+
if (!this.isReady()) {
|
|
80
|
+
throw new Error('Learning bridge not initialized');
|
|
81
|
+
}
|
|
82
|
+
const mergedConfig = { ...this.config, ...config };
|
|
83
|
+
let totalLoss = 0;
|
|
84
|
+
// Build file-to-test mapping
|
|
85
|
+
for (const entry of history) {
|
|
86
|
+
this.testEmbeddings.set(entry.testId, this.computeTestEmbedding(entry));
|
|
87
|
+
for (const file of entry.affectedFiles) {
|
|
88
|
+
if (!this.fileTestMapping.has(file)) {
|
|
89
|
+
this.fileTestMapping.set(file, new Set());
|
|
90
|
+
}
|
|
91
|
+
this.fileTestMapping.get(file).add(entry.testId);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Create experiences from history
|
|
95
|
+
const experiences = this.createExperiencesFromHistory(history);
|
|
96
|
+
// Train using TD learning
|
|
97
|
+
for (const exp of experiences) {
|
|
98
|
+
const tdError = this.computeTDError(exp, mergedConfig.gamma);
|
|
99
|
+
this.updatePolicyWeights(exp.state, exp.action, tdError, mergedConfig.learningRate);
|
|
100
|
+
totalLoss += Math.abs(tdError);
|
|
101
|
+
}
|
|
102
|
+
return totalLoss / Math.max(1, experiences.length);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Predict which tests are likely to fail given code changes
|
|
106
|
+
*
|
|
107
|
+
* Uses the learned policy to rank tests by failure probability.
|
|
108
|
+
*/
|
|
109
|
+
async predictFailingTests(changes, topK) {
|
|
110
|
+
if (!this.isReady()) {
|
|
111
|
+
throw new Error('Learning bridge not initialized');
|
|
112
|
+
}
|
|
113
|
+
const predictions = [];
|
|
114
|
+
// Get affected tests from file mapping
|
|
115
|
+
const affectedTestIds = new Set();
|
|
116
|
+
for (const change of changes) {
|
|
117
|
+
const tests = this.fileTestMapping.get(change.file);
|
|
118
|
+
if (tests) {
|
|
119
|
+
for (const testId of tests) {
|
|
120
|
+
affectedTestIds.add(testId);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Score each affected test
|
|
125
|
+
for (const testId of affectedTestIds) {
|
|
126
|
+
const embedding = this.testEmbeddings.get(testId);
|
|
127
|
+
if (!embedding)
|
|
128
|
+
continue;
|
|
129
|
+
const changeEmbedding = this.computeChangeEmbedding(changes);
|
|
130
|
+
const combinedState = this.combineEmbeddings(embedding, changeEmbedding);
|
|
131
|
+
const qValues = this.computeQValues(combinedState);
|
|
132
|
+
const failureProbability = this.sigmoid(qValues[1]); // Action 1 = test will fail
|
|
133
|
+
predictions.push({
|
|
134
|
+
testId,
|
|
135
|
+
failureProbability,
|
|
136
|
+
confidence: Math.abs(qValues[1] - qValues[0]) / (Math.abs(qValues[1]) + Math.abs(qValues[0]) + 1e-8),
|
|
137
|
+
reason: this.generateReason(changes, failureProbability),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// Sort by failure probability and return top K
|
|
141
|
+
predictions.sort((a, b) => b.failureProbability - a.failureProbability);
|
|
142
|
+
return predictions.slice(0, topK);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Update policy with feedback from actual test results
|
|
146
|
+
*/
|
|
147
|
+
async updatePolicyWithFeedback(feedback) {
|
|
148
|
+
if (!this.isReady()) {
|
|
149
|
+
throw new Error('Learning bridge not initialized');
|
|
150
|
+
}
|
|
151
|
+
// Create experience from feedback
|
|
152
|
+
for (const prediction of feedback.predictions) {
|
|
153
|
+
const actualResult = feedback.actualResults.find(r => r.testId === prediction.testId);
|
|
154
|
+
if (!actualResult)
|
|
155
|
+
continue;
|
|
156
|
+
const embedding = this.testEmbeddings.get(prediction.testId);
|
|
157
|
+
if (!embedding)
|
|
158
|
+
continue;
|
|
159
|
+
const reward = this.computeReward(prediction, actualResult);
|
|
160
|
+
const action = prediction.failureProbability > 0.5 ? 1 : 0;
|
|
161
|
+
const experience = {
|
|
162
|
+
state: new Float32Array(embedding),
|
|
163
|
+
action,
|
|
164
|
+
reward,
|
|
165
|
+
nextState: new Float32Array(embedding),
|
|
166
|
+
done: true,
|
|
167
|
+
};
|
|
168
|
+
this.replayBuffer.push(experience);
|
|
169
|
+
// Keep buffer size manageable
|
|
170
|
+
if (this.replayBuffer.length > 10000) {
|
|
171
|
+
this.replayBuffer.shift();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Batch update from replay buffer
|
|
175
|
+
if (this.replayBuffer.length >= this.config.batchSize) {
|
|
176
|
+
await this.batchUpdate();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Private Methods
|
|
181
|
+
// ============================================================================
|
|
182
|
+
initializeMockWeights() {
|
|
183
|
+
// Xavier initialization
|
|
184
|
+
const scale = Math.sqrt(2.0 / (this.policyWeights.length + 2));
|
|
185
|
+
for (let i = 0; i < this.policyWeights.length; i++) {
|
|
186
|
+
this.policyWeights[i] = (Math.random() - 0.5) * 2 * scale;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
computeTestEmbedding(entry) {
|
|
190
|
+
const embedding = new Float32Array(64);
|
|
191
|
+
// Encode test characteristics
|
|
192
|
+
embedding[0] = entry.failureRate;
|
|
193
|
+
embedding[1] = Math.min(entry.avgDuration / 60000, 1); // Normalize to 1 minute
|
|
194
|
+
embedding[2] = entry.affectedFiles.length / 100;
|
|
195
|
+
embedding[3] = entry.results.length > 0 ? 1 : 0;
|
|
196
|
+
// Encode recent history pattern
|
|
197
|
+
const recentResults = entry.results.slice(-10);
|
|
198
|
+
for (let i = 0; i < Math.min(10, recentResults.length); i++) {
|
|
199
|
+
embedding[4 + i] = recentResults[i].status === 'failed' ? 1 : 0;
|
|
200
|
+
embedding[14 + i] = recentResults[i].status === 'flaky' ? 1 : 0;
|
|
201
|
+
}
|
|
202
|
+
// Hash test name to embedding dimensions
|
|
203
|
+
const nameHash = this.hashString(entry.testId);
|
|
204
|
+
for (let i = 24; i < 64; i++) {
|
|
205
|
+
embedding[i] = ((nameHash >> (i % 32)) & 1) * 0.5;
|
|
206
|
+
}
|
|
207
|
+
return embedding;
|
|
208
|
+
}
|
|
209
|
+
computeChangeEmbedding(changes) {
|
|
210
|
+
const embedding = new Float32Array(64);
|
|
211
|
+
// Aggregate change statistics
|
|
212
|
+
let totalAdded = 0;
|
|
213
|
+
let totalRemoved = 0;
|
|
214
|
+
let numModified = 0;
|
|
215
|
+
let numAdded = 0;
|
|
216
|
+
let numDeleted = 0;
|
|
217
|
+
for (const change of changes) {
|
|
218
|
+
totalAdded += change.linesAdded;
|
|
219
|
+
totalRemoved += change.linesRemoved;
|
|
220
|
+
switch (change.type) {
|
|
221
|
+
case 'modified':
|
|
222
|
+
numModified++;
|
|
223
|
+
break;
|
|
224
|
+
case 'added':
|
|
225
|
+
numAdded++;
|
|
226
|
+
break;
|
|
227
|
+
case 'deleted':
|
|
228
|
+
numDeleted++;
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
embedding[0] = Math.min(totalAdded / 1000, 1);
|
|
233
|
+
embedding[1] = Math.min(totalRemoved / 1000, 1);
|
|
234
|
+
embedding[2] = Math.min(numModified / 50, 1);
|
|
235
|
+
embedding[3] = Math.min(numAdded / 20, 1);
|
|
236
|
+
embedding[4] = Math.min(numDeleted / 20, 1);
|
|
237
|
+
embedding[5] = changes.length / 100;
|
|
238
|
+
// Encode file patterns
|
|
239
|
+
for (let i = 0; i < Math.min(changes.length, 20); i++) {
|
|
240
|
+
const fileHash = this.hashString(changes[i].file);
|
|
241
|
+
embedding[10 + i * 2] = ((fileHash >> 8) & 0xFF) / 255;
|
|
242
|
+
embedding[11 + i * 2] = (fileHash & 0xFF) / 255;
|
|
243
|
+
}
|
|
244
|
+
return embedding;
|
|
245
|
+
}
|
|
246
|
+
combineEmbeddings(a, b) {
|
|
247
|
+
const combined = new Float32Array(a.length + b.length);
|
|
248
|
+
combined.set(a, 0);
|
|
249
|
+
combined.set(b, a.length);
|
|
250
|
+
return combined;
|
|
251
|
+
}
|
|
252
|
+
computeQValues(state) {
|
|
253
|
+
const numActions = 2; // 0 = won't fail, 1 = will fail
|
|
254
|
+
const qValues = new Float32Array(numActions);
|
|
255
|
+
for (let a = 0; a < numActions; a++) {
|
|
256
|
+
let value = 0;
|
|
257
|
+
for (let i = 0; i < Math.min(state.length, this.policyWeights.length / 2); i++) {
|
|
258
|
+
value += state[i] * this.policyWeights[a * 512 + i];
|
|
259
|
+
}
|
|
260
|
+
qValues[a] = value;
|
|
261
|
+
}
|
|
262
|
+
return qValues;
|
|
263
|
+
}
|
|
264
|
+
createExperiencesFromHistory(history) {
|
|
265
|
+
const experiences = [];
|
|
266
|
+
for (const entry of history) {
|
|
267
|
+
const embedding = this.testEmbeddings.get(entry.testId);
|
|
268
|
+
if (!embedding || entry.results.length < 2)
|
|
269
|
+
continue;
|
|
270
|
+
// Create sequential experiences from test results
|
|
271
|
+
for (let i = 0; i < entry.results.length - 1; i++) {
|
|
272
|
+
const currentResult = entry.results[i];
|
|
273
|
+
const nextResult = entry.results[i + 1];
|
|
274
|
+
const state = new Float32Array(embedding);
|
|
275
|
+
state[60] = currentResult.status === 'failed' ? 1 : 0;
|
|
276
|
+
state[61] = currentResult.status === 'flaky' ? 1 : 0;
|
|
277
|
+
const nextState = new Float32Array(embedding);
|
|
278
|
+
nextState[60] = nextResult.status === 'failed' ? 1 : 0;
|
|
279
|
+
nextState[61] = nextResult.status === 'flaky' ? 1 : 0;
|
|
280
|
+
const action = currentResult.status === 'failed' || currentResult.status === 'flaky' ? 1 : 0;
|
|
281
|
+
const reward = this.computeHistoricalReward(currentResult, nextResult);
|
|
282
|
+
experiences.push({
|
|
283
|
+
state,
|
|
284
|
+
action,
|
|
285
|
+
reward,
|
|
286
|
+
nextState,
|
|
287
|
+
done: i === entry.results.length - 2,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return experiences;
|
|
292
|
+
}
|
|
293
|
+
computeTDError(exp, gamma) {
|
|
294
|
+
const currentQ = this.computeQValues(exp.state)[exp.action];
|
|
295
|
+
const nextQ = exp.done ? 0 : Math.max(...this.computeQValues(exp.nextState));
|
|
296
|
+
return exp.reward + gamma * nextQ - currentQ;
|
|
297
|
+
}
|
|
298
|
+
updatePolicyWeights(state, action, tdError, lr) {
|
|
299
|
+
// Update weights using TD learning
|
|
300
|
+
for (let i = 0; i < Math.min(state.length, 512); i++) {
|
|
301
|
+
this.policyWeights[action * 512 + i] += lr * tdError * state[i];
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
async batchUpdate() {
|
|
305
|
+
// Sample batch from replay buffer
|
|
306
|
+
const batchSize = Math.min(this.config.batchSize, this.replayBuffer.length);
|
|
307
|
+
const batch = [];
|
|
308
|
+
for (let i = 0; i < batchSize; i++) {
|
|
309
|
+
const idx = Math.floor(Math.random() * this.replayBuffer.length);
|
|
310
|
+
batch.push(this.replayBuffer[idx]);
|
|
311
|
+
}
|
|
312
|
+
// Update policy weights with batch
|
|
313
|
+
for (const exp of batch) {
|
|
314
|
+
const tdError = this.computeTDError(exp, this.config.gamma);
|
|
315
|
+
this.updatePolicyWeights(exp.state, exp.action, tdError, this.config.learningRate);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
computeReward(prediction, actual) {
|
|
319
|
+
const predictedFail = prediction.failureProbability > 0.5;
|
|
320
|
+
const actualFail = actual.status === 'failed' || actual.status === 'flaky';
|
|
321
|
+
if (predictedFail && actualFail)
|
|
322
|
+
return 1.0; // True positive
|
|
323
|
+
if (!predictedFail && !actualFail)
|
|
324
|
+
return 0.5; // True negative
|
|
325
|
+
if (predictedFail && !actualFail)
|
|
326
|
+
return -0.3; // False positive
|
|
327
|
+
return -1.0; // False negative (missed failure)
|
|
328
|
+
}
|
|
329
|
+
computeHistoricalReward(current, next) {
|
|
330
|
+
const currentFail = current.status === 'failed' || current.status === 'flaky';
|
|
331
|
+
const nextFail = next.status === 'failed' || next.status === 'flaky';
|
|
332
|
+
if (currentFail && nextFail)
|
|
333
|
+
return -0.5; // Persistent failure
|
|
334
|
+
if (currentFail && !nextFail)
|
|
335
|
+
return 0.5; // Fixed
|
|
336
|
+
if (!currentFail && nextFail)
|
|
337
|
+
return -1.0; // New failure
|
|
338
|
+
return 0.1; // Stable pass
|
|
339
|
+
}
|
|
340
|
+
generateReason(changes, probability) {
|
|
341
|
+
if (probability > 0.8) {
|
|
342
|
+
return `High failure probability due to significant changes in ${changes.length} file(s)`;
|
|
343
|
+
}
|
|
344
|
+
if (probability > 0.5) {
|
|
345
|
+
return `Moderate failure risk based on historical correlations`;
|
|
346
|
+
}
|
|
347
|
+
return `Low failure probability, included for coverage`;
|
|
348
|
+
}
|
|
349
|
+
sigmoid(x) {
|
|
350
|
+
return 1 / (1 + Math.exp(-x));
|
|
351
|
+
}
|
|
352
|
+
hashString(str) {
|
|
353
|
+
let hash = 0;
|
|
354
|
+
for (let i = 0; i < str.length; i++) {
|
|
355
|
+
const char = str.charCodeAt(i);
|
|
356
|
+
hash = ((hash << 5) - hash) + char;
|
|
357
|
+
hash = hash & hash;
|
|
358
|
+
}
|
|
359
|
+
return Math.abs(hash);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Create a new learning bridge instance
|
|
364
|
+
*/
|
|
365
|
+
export function createTestLearningBridge(config) {
|
|
366
|
+
return new TestLearningBridge(config);
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=learning-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-bridge.js","sourceRoot":"","sources":["../../src/bridges/learning-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SONA Bridge for Test Intelligence
|
|
3
|
+
*
|
|
4
|
+
* Provides pattern learning and continuous adaptation for test intelligence
|
|
5
|
+
* using SONA (Self-Optimizing Neural Architecture) with LoRA fine-tuning
|
|
6
|
+
* and EWC++ memory preservation.
|
|
7
|
+
*/
|
|
8
|
+
import type { SonaBridgeInterface, TestExecutionPattern } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* SONA configuration for test intelligence
|
|
11
|
+
*/
|
|
12
|
+
interface SonaConfig {
|
|
13
|
+
mode: 'real-time' | 'balanced' | 'research' | 'edge' | 'batch';
|
|
14
|
+
loraRank: number;
|
|
15
|
+
learningRate: number;
|
|
16
|
+
ewcLambda: number;
|
|
17
|
+
batchSize: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* SONA Bridge Implementation for Test Intelligence
|
|
21
|
+
*
|
|
22
|
+
* Provides continuous learning capabilities for test pattern recognition:
|
|
23
|
+
* - Pattern storage and retrieval using HNSW-indexed embeddings
|
|
24
|
+
* - LoRA-based fine-tuning for domain adaptation
|
|
25
|
+
* - EWC++ for preventing catastrophic forgetting
|
|
26
|
+
*/
|
|
27
|
+
export declare class TestSonaBridge implements SonaBridgeInterface {
|
|
28
|
+
readonly name = "test-intelligence-sona";
|
|
29
|
+
readonly version = "0.1.0";
|
|
30
|
+
private status;
|
|
31
|
+
private config;
|
|
32
|
+
private patterns;
|
|
33
|
+
private patternEmbeddings;
|
|
34
|
+
private loraWeights;
|
|
35
|
+
private ewcState;
|
|
36
|
+
private patternIndex;
|
|
37
|
+
constructor(config?: Partial<SonaConfig>);
|
|
38
|
+
init(): Promise<void>;
|
|
39
|
+
destroy(): Promise<void>;
|
|
40
|
+
isReady(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Learn from test execution patterns
|
|
43
|
+
*
|
|
44
|
+
* Uses SONA's continuous learning to extract and store patterns
|
|
45
|
+
* from successful test selections.
|
|
46
|
+
*/
|
|
47
|
+
learnPatterns(patterns: TestExecutionPattern[]): Promise<number>;
|
|
48
|
+
/**
|
|
49
|
+
* Find similar patterns to a query embedding
|
|
50
|
+
*
|
|
51
|
+
* Uses approximate nearest neighbor search to find patterns
|
|
52
|
+
* with similar characteristics.
|
|
53
|
+
*/
|
|
54
|
+
findSimilarPatterns(query: Float32Array, k: number): Promise<TestExecutionPattern[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Store a single pattern
|
|
57
|
+
*/
|
|
58
|
+
storePattern(pattern: TestExecutionPattern): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Get current operating mode
|
|
61
|
+
*/
|
|
62
|
+
getMode(): SonaConfig['mode'];
|
|
63
|
+
/**
|
|
64
|
+
* Set operating mode
|
|
65
|
+
*/
|
|
66
|
+
setMode(mode: SonaConfig['mode']): void;
|
|
67
|
+
/**
|
|
68
|
+
* Get pattern count
|
|
69
|
+
*/
|
|
70
|
+
getPatternCount(): number;
|
|
71
|
+
/**
|
|
72
|
+
* Predict test selection based on learned patterns
|
|
73
|
+
*/
|
|
74
|
+
predictSelection(codeChanges: string[], availableTests: string[]): {
|
|
75
|
+
tests: string[];
|
|
76
|
+
confidence: number;
|
|
77
|
+
};
|
|
78
|
+
private initializeMockLoRA;
|
|
79
|
+
private generatePatternId;
|
|
80
|
+
private hashArray;
|
|
81
|
+
private computePatternGradients;
|
|
82
|
+
private updateLoRA;
|
|
83
|
+
private updateEWCState;
|
|
84
|
+
private applyLoRA;
|
|
85
|
+
private cosineSimilarity;
|
|
86
|
+
private createQueryEmbedding;
|
|
87
|
+
private findSimilarPatternsSync;
|
|
88
|
+
private hashString;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a new SONA bridge instance
|
|
92
|
+
*/
|
|
93
|
+
export declare function createTestSonaBridge(config?: Partial<SonaConfig>): TestSonaBridge;
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=sona-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sona-bridge.d.ts","sourceRoot":"","sources":["../../src/bridges/sona-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAOrB;;GAEG;AACH,UAAU,UAAU;IAClB,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgCD;;;;;;;GAOG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IACxD,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,OAAO,WAAW;IAE3B,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAkC;gBAE1C,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAelC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,OAAO,IAAI,OAAO;IAIlB;;;;;OAKG;IACG,aAAa,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCtE;;;;;OAKG;IACG,mBAAmB,CACvB,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAuClC;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAahE;;OAEG;IACH,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC;IAI7B;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI;IAIvC;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,gBAAgB,CACd,WAAW,EAAE,MAAM,EAAE,EACrB,cAAc,EAAE,MAAM,EAAE,GACvB;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IA4C1C,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,UAAU;IA2ClB,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,SAAS;IAyCjB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,UAAU;CASnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,cAAc,CAEjF"}
|