agentic-qe 2.1.1 → 2.2.0
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 +213 -0
- package/README.md +37 -11
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +5 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/core/MemoryManager.d.ts.map +1 -1
- package/dist/core/MemoryManager.js +4 -0
- package/dist/core/MemoryManager.js.map +1 -1
- package/dist/core/di/AgentDependencies.d.ts +127 -0
- package/dist/core/di/AgentDependencies.d.ts.map +1 -0
- package/dist/core/di/AgentDependencies.js +251 -0
- package/dist/core/di/AgentDependencies.js.map +1 -0
- package/dist/core/di/DIContainer.d.ts +149 -0
- package/dist/core/di/DIContainer.d.ts.map +1 -0
- package/dist/core/di/DIContainer.js +333 -0
- package/dist/core/di/DIContainer.js.map +1 -0
- package/dist/core/di/index.d.ts +11 -0
- package/dist/core/di/index.d.ts.map +1 -0
- package/dist/core/di/index.js +22 -0
- package/dist/core/di/index.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +11 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +5 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.js +43 -1
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -1
- package/dist/learning/ExperienceSharingProtocol.d.ts +243 -0
- package/dist/learning/ExperienceSharingProtocol.d.ts.map +1 -0
- package/dist/learning/ExperienceSharingProtocol.js +538 -0
- package/dist/learning/ExperienceSharingProtocol.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +101 -1
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +330 -3
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/QLearning.d.ts +38 -125
- package/dist/learning/QLearning.d.ts.map +1 -1
- package/dist/learning/QLearning.js +46 -267
- package/dist/learning/QLearning.js.map +1 -1
- package/dist/learning/QLearningLegacy.d.ts +154 -0
- package/dist/learning/QLearningLegacy.d.ts.map +1 -0
- package/dist/learning/QLearningLegacy.js +337 -0
- package/dist/learning/QLearningLegacy.js.map +1 -0
- package/dist/learning/algorithms/AbstractRLLearner.d.ts +162 -0
- package/dist/learning/algorithms/AbstractRLLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/AbstractRLLearner.js +300 -0
- package/dist/learning/algorithms/AbstractRLLearner.js.map +1 -0
- package/dist/learning/algorithms/ActorCriticLearner.d.ts +201 -0
- package/dist/learning/algorithms/ActorCriticLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/ActorCriticLearner.js +447 -0
- package/dist/learning/algorithms/ActorCriticLearner.js.map +1 -0
- package/dist/learning/algorithms/PPOLearner.d.ts +207 -0
- package/dist/learning/algorithms/PPOLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/PPOLearner.js +490 -0
- package/dist/learning/algorithms/PPOLearner.js.map +1 -0
- package/dist/learning/algorithms/QLearning.d.ts +68 -0
- package/dist/learning/algorithms/QLearning.d.ts.map +1 -0
- package/dist/learning/algorithms/QLearning.js +116 -0
- package/dist/learning/algorithms/QLearning.js.map +1 -0
- package/dist/learning/algorithms/SARSALearner.d.ts +107 -0
- package/dist/learning/algorithms/SARSALearner.d.ts.map +1 -0
- package/dist/learning/algorithms/SARSALearner.js +252 -0
- package/dist/learning/algorithms/SARSALearner.js.map +1 -0
- package/dist/learning/algorithms/index.d.ts +29 -0
- package/dist/learning/algorithms/index.d.ts.map +1 -0
- package/dist/learning/algorithms/index.js +44 -0
- package/dist/learning/algorithms/index.js.map +1 -0
- package/dist/learning/index.d.ts +3 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +15 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/types.d.ts +2 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/mcp/handlers/advanced/index.d.ts +3 -2
- package/dist/mcp/handlers/advanced/index.d.ts.map +1 -1
- package/dist/mcp/handlers/advanced/index.js +4 -5
- package/dist/mcp/handlers/advanced/index.js.map +1 -1
- package/dist/mcp/handlers/analysis/coverageAnalyzeSublinear.d.ts +1 -0
- package/dist/mcp/handlers/analysis/coverageAnalyzeSublinear.d.ts.map +1 -1
- package/dist/mcp/handlers/analysis/coverageAnalyzeSublinear.js +3 -0
- package/dist/mcp/handlers/analysis/coverageAnalyzeSublinear.js.map +1 -1
- package/dist/mcp/handlers/analysis/coverageGapsDetect.d.ts +1 -0
- package/dist/mcp/handlers/analysis/coverageGapsDetect.d.ts.map +1 -1
- package/dist/mcp/handlers/analysis/coverageGapsDetect.js +3 -0
- package/dist/mcp/handlers/analysis/coverageGapsDetect.js.map +1 -1
- package/dist/mcp/handlers/analysis/index.d.ts +0 -2
- package/dist/mcp/handlers/analysis/index.d.ts.map +1 -1
- package/dist/mcp/handlers/analysis/index.js +2 -3
- package/dist/mcp/handlers/analysis/index.js.map +1 -1
- package/dist/mcp/handlers/analysis/performanceMonitorRealtime.d.ts +1 -0
- package/dist/mcp/handlers/analysis/performanceMonitorRealtime.d.ts.map +1 -1
- package/dist/mcp/handlers/analysis/performanceMonitorRealtime.js +3 -0
- package/dist/mcp/handlers/analysis/performanceMonitorRealtime.js.map +1 -1
- package/dist/mcp/handlers/prediction/flaky-test-detect.d.ts.map +1 -1
- package/dist/mcp/handlers/prediction/flaky-test-detect.js +2 -0
- package/dist/mcp/handlers/prediction/flaky-test-detect.js.map +1 -1
- package/dist/mcp/handlers/prediction/index.d.ts +0 -2
- package/dist/mcp/handlers/prediction/index.d.ts.map +1 -1
- package/dist/mcp/handlers/prediction/index.js +2 -3
- package/dist/mcp/handlers/prediction/index.js.map +1 -1
- package/dist/mcp/handlers/security/index.d.ts +0 -30
- package/dist/mcp/handlers/security/index.d.ts.map +1 -1
- package/dist/mcp/handlers/security/index.js +5 -31
- package/dist/mcp/handlers/security/index.js.map +1 -1
- package/dist/mcp/lazy-loader.d.ts +156 -0
- package/dist/mcp/lazy-loader.d.ts.map +1 -0
- package/dist/mcp/lazy-loader.js +327 -0
- package/dist/mcp/lazy-loader.js.map +1 -0
- package/dist/mcp/server-instructions.d.ts +18 -0
- package/dist/mcp/server-instructions.d.ts.map +1 -0
- package/dist/mcp/server-instructions.js +133 -0
- package/dist/mcp/server-instructions.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +236 -49
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-categories.d.ts +105 -0
- package/dist/mcp/tool-categories.d.ts.map +1 -0
- package/dist/mcp/tool-categories.js +463 -0
- package/dist/mcp/tool-categories.js.map +1 -0
- package/dist/mcp/tools.d.ts +3 -19
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +260 -647
- package/dist/mcp/tools.js.map +1 -1
- package/dist/memory/DistributedPatternLibrary.d.ts +159 -0
- package/dist/memory/DistributedPatternLibrary.d.ts.map +1 -0
- package/dist/memory/DistributedPatternLibrary.js +370 -0
- package/dist/memory/DistributedPatternLibrary.js.map +1 -0
- package/dist/memory/PatternQualityScorer.d.ts +169 -0
- package/dist/memory/PatternQualityScorer.d.ts.map +1 -0
- package/dist/memory/PatternQualityScorer.js +327 -0
- package/dist/memory/PatternQualityScorer.js.map +1 -0
- package/dist/memory/PatternReplicationService.d.ts +187 -0
- package/dist/memory/PatternReplicationService.d.ts.map +1 -0
- package/dist/memory/PatternReplicationService.js +392 -0
- package/dist/memory/PatternReplicationService.js.map +1 -0
- package/dist/providers/ClaudeProvider.d.ts +98 -0
- package/dist/providers/ClaudeProvider.d.ts.map +1 -0
- package/dist/providers/ClaudeProvider.js +418 -0
- package/dist/providers/ClaudeProvider.js.map +1 -0
- package/dist/providers/ILLMProvider.d.ts +287 -0
- package/dist/providers/ILLMProvider.d.ts.map +1 -0
- package/dist/providers/ILLMProvider.js +33 -0
- package/dist/providers/ILLMProvider.js.map +1 -0
- package/dist/providers/LLMProviderFactory.d.ts +154 -0
- package/dist/providers/LLMProviderFactory.d.ts.map +1 -0
- package/dist/providers/LLMProviderFactory.js +426 -0
- package/dist/providers/LLMProviderFactory.js.map +1 -0
- package/dist/providers/RuvllmProvider.d.ts +107 -0
- package/dist/providers/RuvllmProvider.d.ts.map +1 -0
- package/dist/providers/RuvllmProvider.js +417 -0
- package/dist/providers/RuvllmProvider.js.map +1 -0
- package/dist/providers/index.d.ts +31 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +69 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/utils/IntervalRegistry.d.ts +110 -0
- package/dist/utils/IntervalRegistry.d.ts.map +1 -0
- package/dist/utils/IntervalRegistry.js +190 -0
- package/dist/utils/IntervalRegistry.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -1
- package/dist/utils/index.js.map +1 -1
- package/docs/reference/agents.md +33 -0
- package/docs/reference/usage.md +60 -0
- package/package.json +2 -2
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RuvllmProvider - Local LLM Inference via ruvllm
|
|
4
|
+
*
|
|
5
|
+
* Provides local LLM inference for cost-effective operations on capable hardware.
|
|
6
|
+
* Uses ruvllm for fast local inference with support for various open models.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Zero cloud costs for local inference
|
|
10
|
+
* - Low latency for local operations
|
|
11
|
+
* - Privacy-preserving (no data leaves the machine)
|
|
12
|
+
* - Streaming support
|
|
13
|
+
* - Model hot-swapping
|
|
14
|
+
*
|
|
15
|
+
* @module providers/RuvllmProvider
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.RuvllmProvider = void 0;
|
|
20
|
+
const child_process_1 = require("child_process");
|
|
21
|
+
const ILLMProvider_1 = require("./ILLMProvider");
|
|
22
|
+
const Logger_1 = require("../utils/Logger");
|
|
23
|
+
/**
|
|
24
|
+
* RuvllmProvider - Local LLM inference implementation of ILLMProvider
|
|
25
|
+
*
|
|
26
|
+
* This provider enables local LLM inference using ruvllm, providing
|
|
27
|
+
* cost-free, low-latency inference for development and privacy-sensitive tasks.
|
|
28
|
+
*/
|
|
29
|
+
class RuvllmProvider {
|
|
30
|
+
constructor(config = {}) {
|
|
31
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
32
|
+
this.config = {
|
|
33
|
+
name: config.name || 'ruvllm',
|
|
34
|
+
debug: config.debug ?? false,
|
|
35
|
+
timeout: config.timeout ?? 120000, // Longer timeout for local inference
|
|
36
|
+
maxRetries: config.maxRetries ?? 2,
|
|
37
|
+
ruvllmPath: config.ruvllmPath || 'npx',
|
|
38
|
+
port: config.port ?? 8080,
|
|
39
|
+
defaultModel: config.defaultModel || 'llama-3.2-3b-instruct',
|
|
40
|
+
gpuLayers: config.gpuLayers ?? -1,
|
|
41
|
+
contextSize: config.contextSize ?? 4096,
|
|
42
|
+
threads: config.threads ?? 4,
|
|
43
|
+
defaultTemperature: config.defaultTemperature ?? 0.7,
|
|
44
|
+
enableEmbeddings: config.enableEmbeddings ?? false
|
|
45
|
+
};
|
|
46
|
+
this.isInitialized = false;
|
|
47
|
+
this.baseUrl = `http://localhost:${this.config.port}`;
|
|
48
|
+
this.requestCount = 0;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Initialize the ruvllm provider
|
|
52
|
+
*/
|
|
53
|
+
async initialize() {
|
|
54
|
+
if (this.isInitialized) {
|
|
55
|
+
this.logger.warn('RuvllmProvider already initialized');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
// Check if server is already running
|
|
60
|
+
const isRunning = await this.checkServerHealth();
|
|
61
|
+
if (isRunning) {
|
|
62
|
+
this.isInitialized = true;
|
|
63
|
+
this.logger.info('Connected to existing ruvllm server');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Start ruvllm server
|
|
67
|
+
await this.startServer();
|
|
68
|
+
this.isInitialized = true;
|
|
69
|
+
this.logger.info('RuvllmProvider initialized', {
|
|
70
|
+
model: this.config.defaultModel,
|
|
71
|
+
port: this.config.port,
|
|
72
|
+
gpuLayers: this.config.gpuLayers
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new ILLMProvider_1.LLMProviderError(`Failed to initialize ruvllm: ${error.message}`, 'ruvllm', 'INIT_ERROR', false, error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Complete a prompt using local inference
|
|
81
|
+
*/
|
|
82
|
+
async complete(options) {
|
|
83
|
+
this.ensureInitialized();
|
|
84
|
+
const startTime = Date.now();
|
|
85
|
+
try {
|
|
86
|
+
// Build request body
|
|
87
|
+
const requestBody = {
|
|
88
|
+
model: options.model || this.config.defaultModel,
|
|
89
|
+
messages: options.messages.map(m => ({
|
|
90
|
+
role: m.role,
|
|
91
|
+
content: typeof m.content === 'string' ? m.content : m.content.map(c => c.text || '').join('')
|
|
92
|
+
})),
|
|
93
|
+
max_tokens: options.maxTokens || 2048,
|
|
94
|
+
temperature: options.temperature ?? this.config.defaultTemperature,
|
|
95
|
+
stream: false
|
|
96
|
+
};
|
|
97
|
+
// Add system message if provided
|
|
98
|
+
if (options.system && options.system.length > 0) {
|
|
99
|
+
const systemContent = options.system.map(s => s.text).join('\n');
|
|
100
|
+
requestBody.messages = [
|
|
101
|
+
{ role: 'system', content: systemContent },
|
|
102
|
+
...requestBody.messages
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
|
|
106
|
+
method: 'POST',
|
|
107
|
+
headers: { 'Content-Type': 'application/json' },
|
|
108
|
+
body: JSON.stringify(requestBody),
|
|
109
|
+
signal: AbortSignal.timeout(this.config.timeout)
|
|
110
|
+
});
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
throw new Error(`Server returned ${response.status}: ${await response.text()}`);
|
|
113
|
+
}
|
|
114
|
+
const data = await response.json();
|
|
115
|
+
this.requestCount++;
|
|
116
|
+
// Map to standard response format
|
|
117
|
+
const result = {
|
|
118
|
+
content: [{
|
|
119
|
+
type: 'text',
|
|
120
|
+
text: data.choices?.[0]?.message?.content || ''
|
|
121
|
+
}],
|
|
122
|
+
usage: {
|
|
123
|
+
input_tokens: data.usage?.prompt_tokens || 0,
|
|
124
|
+
output_tokens: data.usage?.completion_tokens || 0
|
|
125
|
+
},
|
|
126
|
+
model: data.model || this.config.defaultModel,
|
|
127
|
+
stop_reason: this.mapStopReason(data.choices?.[0]?.finish_reason),
|
|
128
|
+
id: data.id || `ruvllm-${Date.now()}`,
|
|
129
|
+
metadata: {
|
|
130
|
+
latency: Date.now() - startTime,
|
|
131
|
+
cost: 0 // Local inference is free
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
this.logger.debug('Ruvllm completion successful', {
|
|
135
|
+
model: result.model,
|
|
136
|
+
inputTokens: result.usage.input_tokens,
|
|
137
|
+
outputTokens: result.usage.output_tokens,
|
|
138
|
+
latency: result.metadata?.latency
|
|
139
|
+
});
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
throw new ILLMProvider_1.LLMProviderError(`Ruvllm completion failed: ${error.message}`, 'ruvllm', 'INFERENCE_ERROR', true, error);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Stream a completion
|
|
148
|
+
*/
|
|
149
|
+
async *streamComplete(options) {
|
|
150
|
+
this.ensureInitialized();
|
|
151
|
+
try {
|
|
152
|
+
const requestBody = {
|
|
153
|
+
model: options.model || this.config.defaultModel,
|
|
154
|
+
messages: options.messages.map(m => ({
|
|
155
|
+
role: m.role,
|
|
156
|
+
content: typeof m.content === 'string' ? m.content : m.content.map(c => c.text || '').join('')
|
|
157
|
+
})),
|
|
158
|
+
max_tokens: options.maxTokens || 2048,
|
|
159
|
+
temperature: options.temperature ?? this.config.defaultTemperature,
|
|
160
|
+
stream: true
|
|
161
|
+
};
|
|
162
|
+
if (options.system && options.system.length > 0) {
|
|
163
|
+
const systemContent = options.system.map(s => s.text).join('\n');
|
|
164
|
+
requestBody.messages = [
|
|
165
|
+
{ role: 'system', content: systemContent },
|
|
166
|
+
...requestBody.messages
|
|
167
|
+
];
|
|
168
|
+
}
|
|
169
|
+
const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
headers: { 'Content-Type': 'application/json' },
|
|
172
|
+
body: JSON.stringify(requestBody)
|
|
173
|
+
});
|
|
174
|
+
if (!response.ok) {
|
|
175
|
+
throw new Error(`Server returned ${response.status}`);
|
|
176
|
+
}
|
|
177
|
+
const reader = response.body?.getReader();
|
|
178
|
+
if (!reader) {
|
|
179
|
+
throw new Error('No response body');
|
|
180
|
+
}
|
|
181
|
+
const decoder = new TextDecoder();
|
|
182
|
+
let buffer = '';
|
|
183
|
+
yield { type: 'message_start' };
|
|
184
|
+
yield { type: 'content_block_start', content_block: { type: 'text', text: '' } };
|
|
185
|
+
while (true) {
|
|
186
|
+
const { done, value } = await reader.read();
|
|
187
|
+
if (done)
|
|
188
|
+
break;
|
|
189
|
+
buffer += decoder.decode(value, { stream: true });
|
|
190
|
+
const lines = buffer.split('\n');
|
|
191
|
+
buffer = lines.pop() || '';
|
|
192
|
+
for (const line of lines) {
|
|
193
|
+
if (line.startsWith('data: ')) {
|
|
194
|
+
const data = line.slice(6);
|
|
195
|
+
if (data === '[DONE]')
|
|
196
|
+
continue;
|
|
197
|
+
try {
|
|
198
|
+
const parsed = JSON.parse(data);
|
|
199
|
+
const content = parsed.choices?.[0]?.delta?.content;
|
|
200
|
+
if (content) {
|
|
201
|
+
yield {
|
|
202
|
+
type: 'content_block_delta',
|
|
203
|
+
delta: { type: 'text_delta', text: content }
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Skip invalid JSON
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
yield { type: 'content_block_stop' };
|
|
214
|
+
yield { type: 'message_stop' };
|
|
215
|
+
this.requestCount++;
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
throw new ILLMProvider_1.LLMProviderError(`Ruvllm stream failed: ${error.message}`, 'ruvllm', 'STREAM_ERROR', true, error);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Generate embeddings
|
|
223
|
+
*/
|
|
224
|
+
async embed(options) {
|
|
225
|
+
this.ensureInitialized();
|
|
226
|
+
if (!this.config.enableEmbeddings) {
|
|
227
|
+
throw new ILLMProvider_1.LLMProviderError('Embeddings not enabled. Set enableEmbeddings: true in config.', 'ruvllm', 'UNSUPPORTED', false);
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
const response = await fetch(`${this.baseUrl}/v1/embeddings`, {
|
|
231
|
+
method: 'POST',
|
|
232
|
+
headers: { 'Content-Type': 'application/json' },
|
|
233
|
+
body: JSON.stringify({
|
|
234
|
+
model: options.model || 'embedding',
|
|
235
|
+
input: options.text
|
|
236
|
+
})
|
|
237
|
+
});
|
|
238
|
+
if (!response.ok) {
|
|
239
|
+
throw new Error(`Server returned ${response.status}`);
|
|
240
|
+
}
|
|
241
|
+
const data = await response.json();
|
|
242
|
+
return {
|
|
243
|
+
embedding: data.data?.[0]?.embedding || [],
|
|
244
|
+
model: data.model || 'embedding',
|
|
245
|
+
tokens: data.usage?.total_tokens || 0
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
throw new ILLMProvider_1.LLMProviderError(`Embedding generation failed: ${error.message}`, 'ruvllm', 'EMBEDDING_ERROR', true, error);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Count tokens in text
|
|
254
|
+
*/
|
|
255
|
+
async countTokens(options) {
|
|
256
|
+
// Approximate token count (ruvllm doesn't have a direct endpoint)
|
|
257
|
+
// Most models use ~4 characters per token
|
|
258
|
+
return Math.ceil(options.text.length / 4);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Health check
|
|
262
|
+
*/
|
|
263
|
+
async healthCheck() {
|
|
264
|
+
const startTime = Date.now();
|
|
265
|
+
try {
|
|
266
|
+
const isHealthy = await this.checkServerHealth();
|
|
267
|
+
return {
|
|
268
|
+
healthy: isHealthy,
|
|
269
|
+
latency: Date.now() - startTime,
|
|
270
|
+
timestamp: new Date(),
|
|
271
|
+
metadata: {
|
|
272
|
+
model: this.config.defaultModel,
|
|
273
|
+
port: this.config.port,
|
|
274
|
+
requestCount: this.requestCount
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
return {
|
|
280
|
+
healthy: false,
|
|
281
|
+
error: error.message,
|
|
282
|
+
timestamp: new Date()
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get provider metadata
|
|
288
|
+
*/
|
|
289
|
+
getMetadata() {
|
|
290
|
+
return {
|
|
291
|
+
name: 'ruvllm',
|
|
292
|
+
version: '1.0.0',
|
|
293
|
+
models: [
|
|
294
|
+
'llama-3.2-3b-instruct',
|
|
295
|
+
'llama-3.2-1b-instruct',
|
|
296
|
+
'llama-3.1-8b-instruct',
|
|
297
|
+
'phi-3-mini',
|
|
298
|
+
'mistral-7b-instruct',
|
|
299
|
+
'qwen2-7b-instruct'
|
|
300
|
+
],
|
|
301
|
+
capabilities: {
|
|
302
|
+
streaming: true,
|
|
303
|
+
caching: false,
|
|
304
|
+
embeddings: this.config.enableEmbeddings,
|
|
305
|
+
vision: false
|
|
306
|
+
},
|
|
307
|
+
costs: {
|
|
308
|
+
inputPerMillion: 0, // Free for local inference
|
|
309
|
+
outputPerMillion: 0
|
|
310
|
+
},
|
|
311
|
+
location: 'local'
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Shutdown the provider
|
|
316
|
+
*/
|
|
317
|
+
async shutdown() {
|
|
318
|
+
if (this.serverProcess) {
|
|
319
|
+
this.serverProcess.kill();
|
|
320
|
+
this.serverProcess = undefined;
|
|
321
|
+
}
|
|
322
|
+
this.isInitialized = false;
|
|
323
|
+
this.logger.info('RuvllmProvider shutdown', {
|
|
324
|
+
requestCount: this.requestCount
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Track cost (always 0 for local inference)
|
|
329
|
+
*/
|
|
330
|
+
trackCost(usage) {
|
|
331
|
+
return 0; // Local inference is free
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Start the ruvllm server
|
|
335
|
+
*/
|
|
336
|
+
async startServer() {
|
|
337
|
+
return new Promise((resolve, reject) => {
|
|
338
|
+
const args = [
|
|
339
|
+
'ruvllm',
|
|
340
|
+
'serve',
|
|
341
|
+
'--model', this.config.defaultModel,
|
|
342
|
+
'--port', String(this.config.port),
|
|
343
|
+
'--gpu-layers', String(this.config.gpuLayers),
|
|
344
|
+
'--context-size', String(this.config.contextSize),
|
|
345
|
+
'--threads', String(this.config.threads)
|
|
346
|
+
];
|
|
347
|
+
if (this.config.ruvllmPath === 'npx') {
|
|
348
|
+
this.serverProcess = (0, child_process_1.spawn)('npx', args, {
|
|
349
|
+
stdio: this.config.debug ? 'inherit' : 'pipe'
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
this.serverProcess = (0, child_process_1.spawn)(this.config.ruvllmPath, args.slice(1), {
|
|
354
|
+
stdio: this.config.debug ? 'inherit' : 'pipe'
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
this.serverProcess.on('error', (error) => {
|
|
358
|
+
reject(new Error(`Failed to start ruvllm: ${error.message}`));
|
|
359
|
+
});
|
|
360
|
+
// Wait for server to be ready
|
|
361
|
+
const checkInterval = setInterval(async () => {
|
|
362
|
+
try {
|
|
363
|
+
const isReady = await this.checkServerHealth();
|
|
364
|
+
if (isReady) {
|
|
365
|
+
clearInterval(checkInterval);
|
|
366
|
+
resolve();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// Server not ready yet
|
|
371
|
+
}
|
|
372
|
+
}, 500);
|
|
373
|
+
// Timeout after 60 seconds
|
|
374
|
+
setTimeout(() => {
|
|
375
|
+
clearInterval(checkInterval);
|
|
376
|
+
reject(new Error('Timeout waiting for ruvllm server to start'));
|
|
377
|
+
}, 60000);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Check if server is healthy
|
|
382
|
+
*/
|
|
383
|
+
async checkServerHealth() {
|
|
384
|
+
try {
|
|
385
|
+
const response = await fetch(`${this.baseUrl}/health`, {
|
|
386
|
+
signal: AbortSignal.timeout(5000)
|
|
387
|
+
});
|
|
388
|
+
return response.ok;
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Ensure provider is initialized
|
|
396
|
+
*/
|
|
397
|
+
ensureInitialized() {
|
|
398
|
+
if (!this.isInitialized) {
|
|
399
|
+
throw new ILLMProvider_1.LLMProviderError('RuvllmProvider not initialized. Call initialize() first.', 'ruvllm', 'NOT_INITIALIZED', false);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Map finish reason to standard stop reason
|
|
404
|
+
*/
|
|
405
|
+
mapStopReason(reason) {
|
|
406
|
+
switch (reason) {
|
|
407
|
+
case 'length':
|
|
408
|
+
return 'max_tokens';
|
|
409
|
+
case 'stop':
|
|
410
|
+
return 'stop_sequence';
|
|
411
|
+
default:
|
|
412
|
+
return 'end_turn';
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
exports.RuvllmProvider = RuvllmProvider;
|
|
417
|
+
//# sourceMappingURL=RuvllmProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuvllmProvider.js","sourceRoot":"","sources":["../../src/providers/RuvllmProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Providers - Unified LLM Provider Layer
|
|
3
|
+
*
|
|
4
|
+
* This module provides a unified interface for multiple LLM providers:
|
|
5
|
+
* - ClaudeProvider: Anthropic Claude API
|
|
6
|
+
* - RuvllmProvider: Local LLM inference via ruvllm
|
|
7
|
+
* - LLMProviderFactory: Factory for provider creation and hybrid routing
|
|
8
|
+
*
|
|
9
|
+
* @module providers
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export { ILLMProvider, LLMProviderConfig, LLMCompletionOptions, LLMCompletionResponse, LLMStreamEvent, LLMEmbeddingOptions, LLMEmbeddingResponse, LLMTokenCountOptions, LLMHealthStatus, LLMProviderMetadata, LLMMessageParam, LLMTextBlockParam, LLMProviderError, isLLMProviderError } from './ILLMProvider';
|
|
13
|
+
export { ClaudeProvider, ClaudeProviderConfig } from './ClaudeProvider';
|
|
14
|
+
export { RuvllmProvider, RuvllmProviderConfig } from './RuvllmProvider';
|
|
15
|
+
export { LLMProviderFactory, LLMProviderFactoryConfig, ProviderType, ProviderSelectionCriteria, ProviderUsageStats, getGlobalLLMFactory, setGlobalLLMFactory } from './LLMProviderFactory';
|
|
16
|
+
import type { ILLMProvider } from './ILLMProvider';
|
|
17
|
+
/**
|
|
18
|
+
* Create a default LLM provider based on environment
|
|
19
|
+
*
|
|
20
|
+
* Uses Claude if ANTHROPIC_API_KEY is set, otherwise attempts ruvllm
|
|
21
|
+
*/
|
|
22
|
+
export declare function createDefaultProvider(): Promise<ILLMProvider>;
|
|
23
|
+
/**
|
|
24
|
+
* Create a hybrid provider that routes between local and cloud
|
|
25
|
+
*/
|
|
26
|
+
export declare function createHybridProvider(config?: {
|
|
27
|
+
preferLocal?: boolean;
|
|
28
|
+
claudeConfig?: any;
|
|
29
|
+
ruvllmConfig?: any;
|
|
30
|
+
}): Promise<ILLMProvider>;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxE,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,YAAY,CAAC,CAkBnE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,CAAC,EAAE;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB,GAAG,OAAO,CAAC,YAAY,CAAC,CAWxB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM Providers - Unified LLM Provider Layer
|
|
4
|
+
*
|
|
5
|
+
* This module provides a unified interface for multiple LLM providers:
|
|
6
|
+
* - ClaudeProvider: Anthropic Claude API
|
|
7
|
+
* - RuvllmProvider: Local LLM inference via ruvllm
|
|
8
|
+
* - LLMProviderFactory: Factory for provider creation and hybrid routing
|
|
9
|
+
*
|
|
10
|
+
* @module providers
|
|
11
|
+
* @version 1.0.0
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.setGlobalLLMFactory = exports.getGlobalLLMFactory = exports.LLMProviderFactory = exports.RuvllmProvider = exports.ClaudeProvider = exports.isLLMProviderError = exports.LLMProviderError = void 0;
|
|
15
|
+
exports.createDefaultProvider = createDefaultProvider;
|
|
16
|
+
exports.createHybridProvider = createHybridProvider;
|
|
17
|
+
// Core interface and types
|
|
18
|
+
var ILLMProvider_1 = require("./ILLMProvider");
|
|
19
|
+
Object.defineProperty(exports, "LLMProviderError", { enumerable: true, get: function () { return ILLMProvider_1.LLMProviderError; } });
|
|
20
|
+
Object.defineProperty(exports, "isLLMProviderError", { enumerable: true, get: function () { return ILLMProvider_1.isLLMProviderError; } });
|
|
21
|
+
// Provider implementations
|
|
22
|
+
var ClaudeProvider_1 = require("./ClaudeProvider");
|
|
23
|
+
Object.defineProperty(exports, "ClaudeProvider", { enumerable: true, get: function () { return ClaudeProvider_1.ClaudeProvider; } });
|
|
24
|
+
var RuvllmProvider_1 = require("./RuvllmProvider");
|
|
25
|
+
Object.defineProperty(exports, "RuvllmProvider", { enumerable: true, get: function () { return RuvllmProvider_1.RuvllmProvider; } });
|
|
26
|
+
// Factory and utilities
|
|
27
|
+
var LLMProviderFactory_1 = require("./LLMProviderFactory");
|
|
28
|
+
Object.defineProperty(exports, "LLMProviderFactory", { enumerable: true, get: function () { return LLMProviderFactory_1.LLMProviderFactory; } });
|
|
29
|
+
Object.defineProperty(exports, "getGlobalLLMFactory", { enumerable: true, get: function () { return LLMProviderFactory_1.getGlobalLLMFactory; } });
|
|
30
|
+
Object.defineProperty(exports, "setGlobalLLMFactory", { enumerable: true, get: function () { return LLMProviderFactory_1.setGlobalLLMFactory; } });
|
|
31
|
+
const ClaudeProvider_2 = require("./ClaudeProvider");
|
|
32
|
+
const RuvllmProvider_2 = require("./RuvllmProvider");
|
|
33
|
+
const LLMProviderFactory_2 = require("./LLMProviderFactory");
|
|
34
|
+
/**
|
|
35
|
+
* Create a default LLM provider based on environment
|
|
36
|
+
*
|
|
37
|
+
* Uses Claude if ANTHROPIC_API_KEY is set, otherwise attempts ruvllm
|
|
38
|
+
*/
|
|
39
|
+
async function createDefaultProvider() {
|
|
40
|
+
// Try Claude first (most common use case)
|
|
41
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
42
|
+
const provider = new ClaudeProvider_2.ClaudeProvider();
|
|
43
|
+
await provider.initialize();
|
|
44
|
+
return provider;
|
|
45
|
+
}
|
|
46
|
+
// Fall back to local ruvllm
|
|
47
|
+
const provider = new RuvllmProvider_2.RuvllmProvider();
|
|
48
|
+
try {
|
|
49
|
+
await provider.initialize();
|
|
50
|
+
return provider;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
throw new Error('No LLM provider available. Set ANTHROPIC_API_KEY for Claude or ensure ruvllm is installed.');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create a hybrid provider that routes between local and cloud
|
|
58
|
+
*/
|
|
59
|
+
async function createHybridProvider(config) {
|
|
60
|
+
const factory = new LLMProviderFactory_2.LLMProviderFactory({
|
|
61
|
+
claude: config?.claudeConfig,
|
|
62
|
+
ruvllm: config?.ruvllmConfig,
|
|
63
|
+
defaultProvider: config?.preferLocal ? 'ruvllm' : 'claude',
|
|
64
|
+
enableFallback: true
|
|
65
|
+
});
|
|
66
|
+
await factory.initialize();
|
|
67
|
+
return factory.createHybridRouter();
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AA6CH,sDAkBC;AAKD,oDAeC;AAjFD,2BAA2B;AAC3B,+CAewB;AAFtB,gHAAA,gBAAgB,OAAA;AAChB,kHAAA,kBAAkB,OAAA;AAGpB,2BAA2B;AAC3B,mDAAwE;AAA/D,gHAAA,cAAc,OAAA;AACvB,mDAAwE;AAA/D,gHAAA,cAAc,OAAA;AAEvB,wBAAwB;AACxB,2DAQ8B;AAP5B,wHAAA,kBAAkB,OAAA;AAKlB,yHAAA,mBAAmB,OAAA;AACnB,yHAAA,mBAAmB,OAAA;AAIrB,qDAAkD;AAClD,qDAAkD;AAClD,6DAA0D;AAE1D;;;;GAIG;AACI,KAAK,UAAU,qBAAqB;IACzC,0CAA0C;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,+BAAc,EAAE,CAAC;QACtC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,IAAI,+BAAc,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,oBAAoB,CAAC,MAI1C;IACC,MAAM,OAAO,GAAG,IAAI,uCAAkB,CAAC;QACrC,MAAM,EAAE,MAAM,EAAE,YAAY;QAC5B,MAAM,EAAE,MAAM,EAAE,YAAY;QAC5B,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QAC1D,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE3B,OAAO,OAAO,CAAC,kBAAkB,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Interval Registry for Memory Leak Prevention
|
|
3
|
+
*
|
|
4
|
+
* Provides a centralized registry for tracking intervals that need cleanup.
|
|
5
|
+
* This is especially important for:
|
|
6
|
+
* - Module-level intervals that persist across tests
|
|
7
|
+
* - Intervals in singleton instances
|
|
8
|
+
* - Cleanup during graceful shutdown
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { IntervalRegistry } from './utils/IntervalRegistry';
|
|
13
|
+
*
|
|
14
|
+
* // Register an interval for cleanup
|
|
15
|
+
* const intervalId = setInterval(fn, 1000);
|
|
16
|
+
* IntervalRegistry.register('my-feature', intervalId);
|
|
17
|
+
*
|
|
18
|
+
* // Register with shutdown callback
|
|
19
|
+
* IntervalRegistry.registerWithShutdown('my-feature', {
|
|
20
|
+
* interval: intervalId,
|
|
21
|
+
* shutdown: async () => { ... }
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Cleanup specific feature
|
|
25
|
+
* await IntervalRegistry.shutdown('my-feature');
|
|
26
|
+
*
|
|
27
|
+
* // Cleanup all (for tests or process exit)
|
|
28
|
+
* await IntervalRegistry.shutdownAll();
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @module utils/IntervalRegistry
|
|
32
|
+
*/
|
|
33
|
+
export interface RegisteredInterval {
|
|
34
|
+
interval: NodeJS.Timeout;
|
|
35
|
+
shutdown?: () => Promise<void> | void;
|
|
36
|
+
registeredAt: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Global registry for tracking intervals that need cleanup
|
|
40
|
+
*/
|
|
41
|
+
declare class IntervalRegistryClass {
|
|
42
|
+
private registry;
|
|
43
|
+
private shutdownCallbacks;
|
|
44
|
+
/**
|
|
45
|
+
* Register an interval for later cleanup
|
|
46
|
+
*
|
|
47
|
+
* @param feature - Feature/module name for grouping
|
|
48
|
+
* @param interval - The interval handle from setInterval
|
|
49
|
+
*/
|
|
50
|
+
register(feature: string, interval: NodeJS.Timeout): void;
|
|
51
|
+
/**
|
|
52
|
+
* Register an interval with a custom shutdown callback
|
|
53
|
+
*
|
|
54
|
+
* @param feature - Feature/module name for grouping
|
|
55
|
+
* @param config - Interval and optional shutdown callback
|
|
56
|
+
*/
|
|
57
|
+
registerWithShutdown(feature: string, config: {
|
|
58
|
+
interval: NodeJS.Timeout;
|
|
59
|
+
shutdown?: () => Promise<void> | void;
|
|
60
|
+
}): void;
|
|
61
|
+
/**
|
|
62
|
+
* Register a shutdown callback for a feature
|
|
63
|
+
* This is called even if no intervals are registered
|
|
64
|
+
*
|
|
65
|
+
* @param feature - Feature/module name
|
|
66
|
+
* @param callback - Shutdown callback
|
|
67
|
+
*/
|
|
68
|
+
registerShutdownCallback(feature: string, callback: () => Promise<void> | void): void;
|
|
69
|
+
/**
|
|
70
|
+
* Unregister a specific interval
|
|
71
|
+
*
|
|
72
|
+
* @param feature - Feature name
|
|
73
|
+
* @param interval - The interval to unregister
|
|
74
|
+
*/
|
|
75
|
+
unregister(feature: string, interval: NodeJS.Timeout): void;
|
|
76
|
+
/**
|
|
77
|
+
* Shutdown all intervals for a specific feature
|
|
78
|
+
*
|
|
79
|
+
* @param feature - Feature name to shutdown
|
|
80
|
+
*/
|
|
81
|
+
shutdown(feature: string): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Shutdown all registered intervals
|
|
84
|
+
* Typically called during test teardown or process exit
|
|
85
|
+
*/
|
|
86
|
+
shutdownAll(): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Get statistics about registered intervals
|
|
89
|
+
*/
|
|
90
|
+
getStats(): {
|
|
91
|
+
totalIntervals: number;
|
|
92
|
+
features: string[];
|
|
93
|
+
byFeature: Record<string, number>;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Clear all registrations without calling shutdown
|
|
97
|
+
* Use with caution - primarily for testing
|
|
98
|
+
*/
|
|
99
|
+
clear(): void;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Singleton instance of the interval registry
|
|
103
|
+
*/
|
|
104
|
+
export declare const IntervalRegistry: IntervalRegistryClass;
|
|
105
|
+
/**
|
|
106
|
+
* Export shutdown functions for chaos handlers and other modules
|
|
107
|
+
*/
|
|
108
|
+
export { shutdown as shutdownChaosLatency } from '../mcp/handlers/chaos/chaos-inject-latency';
|
|
109
|
+
export { shutdown as shutdownChaosFailure } from '../mcp/handlers/chaos/chaos-inject-failure';
|
|
110
|
+
//# sourceMappingURL=IntervalRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntervalRegistry.d.ts","sourceRoot":"","sources":["../../src/utils/IntervalRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,cAAM,qBAAqB;IACzB,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,iBAAiB,CAAsD;IAE/E;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI;IAWzD;;;;;OAKG;IACH,oBAAoB,CAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;KAAE,GAC1E,IAAI;IAYP;;;;;;OAMG;IACH,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAIrF;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI;IAY3D;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B9C;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBlC;;OAEG;IACH,QAAQ,IAAI;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC;IAgBD;;;OAGG;IACH,KAAK,IAAI,IAAI;CASd;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,uBAA8B,CAAC;AAE5D;;GAEG;AACH,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,4CAA4C,CAAC"}
|