@dcyfr/ai 1.0.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 +91 -0
- package/LICENSE +21 -0
- package/README.md +210 -0
- package/bin/cli.js +249 -0
- package/bin/dcyfr-ai.js +376 -0
- package/config/default.json +123 -0
- package/config/default.yaml +161 -0
- package/config/minimal.yaml +16 -0
- package/dist/ai/config/loader.d.ts +91 -0
- package/dist/ai/config/loader.d.ts.map +1 -0
- package/dist/ai/config/loader.js +259 -0
- package/dist/ai/config/loader.js.map +1 -0
- package/dist/ai/config/schema.d.ts +854 -0
- package/dist/ai/config/schema.d.ts.map +1 -0
- package/dist/ai/config/schema.js +260 -0
- package/dist/ai/config/schema.js.map +1 -0
- package/dist/ai/core/provider-registry.d.ts +115 -0
- package/dist/ai/core/provider-registry.d.ts.map +1 -0
- package/dist/ai/core/provider-registry.js +360 -0
- package/dist/ai/core/provider-registry.js.map +1 -0
- package/dist/ai/core/telemetry-engine.d.ts +114 -0
- package/dist/ai/core/telemetry-engine.d.ts.map +1 -0
- package/dist/ai/core/telemetry-engine.js +390 -0
- package/dist/ai/core/telemetry-engine.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +21 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/plugins/plugin-loader.d.ts +132 -0
- package/dist/ai/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/ai/plugins/plugin-loader.js +316 -0
- package/dist/ai/plugins/plugin-loader.js.map +1 -0
- package/dist/ai/types/index.d.ts +179 -0
- package/dist/ai/types/index.d.ts.map +1 -0
- package/dist/ai/types/index.js +11 -0
- package/dist/ai/types/index.js.map +1 -0
- package/dist/ai/types/telemetry.d.ts +117 -0
- package/dist/ai/types/telemetry.d.ts.map +1 -0
- package/dist/ai/types/telemetry.js +6 -0
- package/dist/ai/types/telemetry.js.map +1 -0
- package/dist/ai/utils/storage.d.ts +37 -0
- package/dist/ai/utils/storage.d.ts.map +1 -0
- package/dist/ai/utils/storage.js +129 -0
- package/dist/ai/utils/storage.js.map +1 -0
- package/dist/ai/validation/validation-framework.d.ts +112 -0
- package/dist/ai/validation/validation-framework.d.ts.map +1 -0
- package/dist/ai/validation/validation-framework.js +221 -0
- package/dist/ai/validation/validation-framework.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Registry & Fallback Manager
|
|
3
|
+
*
|
|
4
|
+
* Automatically detects rate limits and failures in primary providers and falls back to
|
|
5
|
+
* secondary providers with session state preservation.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Rate limit detection
|
|
9
|
+
* - Automatic session state save/restore
|
|
10
|
+
* - Provider health monitoring
|
|
11
|
+
* - Configurable fallback chain
|
|
12
|
+
* - Context preservation across providers
|
|
13
|
+
*
|
|
14
|
+
* @module @dcyfr/ai/core/provider-registry
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { ProviderRegistry } from '@dcyfr/ai/core/provider-registry';
|
|
18
|
+
*
|
|
19
|
+
* const registry = new ProviderRegistry({
|
|
20
|
+
* primaryProvider: 'claude',
|
|
21
|
+
* fallbackChain: ['groq', 'ollama'],
|
|
22
|
+
* autoReturn: true,
|
|
23
|
+
* healthCheckInterval: 60000,
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* const result = await registry.executeWithFallback(task, async (provider) => {
|
|
27
|
+
* // Your execution logic
|
|
28
|
+
* return { data: 'result' };
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Rate limit error
|
|
34
|
+
*/
|
|
35
|
+
export class RateLimitError extends Error {
|
|
36
|
+
provider;
|
|
37
|
+
retryAfter;
|
|
38
|
+
constructor(message, provider, retryAfter) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.provider = provider;
|
|
41
|
+
this.retryAfter = retryAfter;
|
|
42
|
+
this.name = 'RateLimitError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Provider unavailable error
|
|
47
|
+
*/
|
|
48
|
+
export class ProviderUnavailableError extends Error {
|
|
49
|
+
provider;
|
|
50
|
+
constructor(message, provider) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.provider = provider;
|
|
53
|
+
this.name = 'ProviderUnavailableError';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Provider Registry - manages multiple AI providers with automatic fallback
|
|
58
|
+
*/
|
|
59
|
+
export class ProviderRegistry {
|
|
60
|
+
config;
|
|
61
|
+
providerConfigs;
|
|
62
|
+
healthStatus;
|
|
63
|
+
currentProvider;
|
|
64
|
+
healthCheckTimer;
|
|
65
|
+
constructor(config) {
|
|
66
|
+
this.config = config;
|
|
67
|
+
this.currentProvider = config.primaryProvider;
|
|
68
|
+
this.providerConfigs = new Map();
|
|
69
|
+
this.healthStatus = new Map();
|
|
70
|
+
// Initialize default provider configurations
|
|
71
|
+
this.initializeProviderConfigs();
|
|
72
|
+
// Start health monitoring if auto-return enabled
|
|
73
|
+
if (config.autoReturn) {
|
|
74
|
+
this.startHealthMonitoring();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
initializeProviderConfigs() {
|
|
78
|
+
const defaultConfigs = [
|
|
79
|
+
{
|
|
80
|
+
name: 'claude',
|
|
81
|
+
healthCheckUrl: 'https://api.anthropic.com/v1/messages',
|
|
82
|
+
maxRetries: 3,
|
|
83
|
+
retryDelay: 1000,
|
|
84
|
+
timeout: 30000,
|
|
85
|
+
enabled: true,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'groq',
|
|
89
|
+
healthCheckUrl: 'https://api.groq.com/openai/v1/models',
|
|
90
|
+
maxRetries: 2,
|
|
91
|
+
retryDelay: 500,
|
|
92
|
+
timeout: 20000,
|
|
93
|
+
enabled: true,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'ollama',
|
|
97
|
+
apiEndpoint: 'http://localhost:11434',
|
|
98
|
+
healthCheckUrl: 'http://localhost:11434/api/tags',
|
|
99
|
+
maxRetries: 1,
|
|
100
|
+
retryDelay: 100,
|
|
101
|
+
timeout: 10000,
|
|
102
|
+
enabled: true,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'copilot',
|
|
106
|
+
maxRetries: 2,
|
|
107
|
+
retryDelay: 500,
|
|
108
|
+
timeout: 15000,
|
|
109
|
+
enabled: true,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'openai',
|
|
113
|
+
healthCheckUrl: 'https://api.openai.com/v1/models',
|
|
114
|
+
maxRetries: 3,
|
|
115
|
+
retryDelay: 1000,
|
|
116
|
+
timeout: 30000,
|
|
117
|
+
enabled: true,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'anthropic',
|
|
121
|
+
healthCheckUrl: 'https://api.anthropic.com/v1/messages',
|
|
122
|
+
maxRetries: 3,
|
|
123
|
+
retryDelay: 1000,
|
|
124
|
+
timeout: 30000,
|
|
125
|
+
enabled: true,
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
defaultConfigs.forEach(config => {
|
|
129
|
+
this.providerConfigs.set(config.name, config);
|
|
130
|
+
this.healthStatus.set(config.name, {
|
|
131
|
+
provider: config.name,
|
|
132
|
+
available: true,
|
|
133
|
+
lastChecked: new Date(),
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check provider health status
|
|
139
|
+
*/
|
|
140
|
+
async checkProviderHealth(provider) {
|
|
141
|
+
const config = this.providerConfigs.get(provider);
|
|
142
|
+
if (!config) {
|
|
143
|
+
return {
|
|
144
|
+
provider,
|
|
145
|
+
available: false,
|
|
146
|
+
lastChecked: new Date(),
|
|
147
|
+
error: 'Provider configuration not found',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
if (!config.enabled) {
|
|
151
|
+
return {
|
|
152
|
+
provider,
|
|
153
|
+
available: false,
|
|
154
|
+
lastChecked: new Date(),
|
|
155
|
+
error: 'Provider disabled',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const startTime = Date.now();
|
|
159
|
+
try {
|
|
160
|
+
if (!config.healthCheckUrl) {
|
|
161
|
+
// For providers without health check URL, assume available
|
|
162
|
+
return {
|
|
163
|
+
provider,
|
|
164
|
+
available: true,
|
|
165
|
+
responseTime: 0,
|
|
166
|
+
lastChecked: new Date(),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// Simple HEAD request to check availability
|
|
170
|
+
const response = await fetch(config.healthCheckUrl, {
|
|
171
|
+
method: 'HEAD',
|
|
172
|
+
signal: AbortSignal.timeout(config.timeout),
|
|
173
|
+
});
|
|
174
|
+
const responseTime = Date.now() - startTime;
|
|
175
|
+
// Extract rate limit info from headers (if available)
|
|
176
|
+
const rateLimitRemaining = response.headers.get('x-ratelimit-remaining')
|
|
177
|
+
? parseInt(response.headers.get('x-ratelimit-remaining'), 10)
|
|
178
|
+
: undefined;
|
|
179
|
+
const rateLimitReset = response.headers.get('x-ratelimit-reset')
|
|
180
|
+
? new Date(parseInt(response.headers.get('x-ratelimit-reset'), 10) * 1000)
|
|
181
|
+
: undefined;
|
|
182
|
+
return {
|
|
183
|
+
provider,
|
|
184
|
+
available: response.ok,
|
|
185
|
+
responseTime,
|
|
186
|
+
lastChecked: new Date(),
|
|
187
|
+
rateLimitRemaining,
|
|
188
|
+
rateLimitReset,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
return {
|
|
193
|
+
provider,
|
|
194
|
+
available: false,
|
|
195
|
+
responseTime: Date.now() - startTime,
|
|
196
|
+
lastChecked: new Date(),
|
|
197
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Start periodic health monitoring
|
|
203
|
+
*/
|
|
204
|
+
startHealthMonitoring() {
|
|
205
|
+
this.healthCheckTimer = setInterval(async () => {
|
|
206
|
+
// Check primary provider health
|
|
207
|
+
const primaryHealth = await this.checkProviderHealth(this.config.primaryProvider);
|
|
208
|
+
this.healthStatus.set(this.config.primaryProvider, primaryHealth);
|
|
209
|
+
// If current provider is fallback and primary is healthy, switch back
|
|
210
|
+
if (this.currentProvider !== this.config.primaryProvider && primaryHealth.available) {
|
|
211
|
+
console.warn(`✅ Primary provider ${this.config.primaryProvider} available again, switching back...`);
|
|
212
|
+
await this.switchProvider(this.config.primaryProvider);
|
|
213
|
+
}
|
|
214
|
+
}, this.config.healthCheckInterval);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Switch to a different provider
|
|
218
|
+
*/
|
|
219
|
+
async switchProvider(targetProvider) {
|
|
220
|
+
if (this.currentProvider === targetProvider) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
console.warn(`🔄 Switching provider: ${this.currentProvider} → ${targetProvider}`);
|
|
224
|
+
// Update current provider
|
|
225
|
+
const previousProvider = this.currentProvider;
|
|
226
|
+
this.currentProvider = targetProvider;
|
|
227
|
+
console.warn(`✅ Provider switched to ${targetProvider}`);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Execute task with a specific provider
|
|
231
|
+
*/
|
|
232
|
+
async executeWithProvider(provider, task, executor) {
|
|
233
|
+
const config = this.providerConfigs.get(provider);
|
|
234
|
+
if (!config) {
|
|
235
|
+
throw new Error(`Provider configuration not found: ${provider}`);
|
|
236
|
+
}
|
|
237
|
+
const startTime = Date.now();
|
|
238
|
+
let lastError;
|
|
239
|
+
// Retry logic
|
|
240
|
+
for (let attempt = 1; attempt <= config.maxRetries; attempt++) {
|
|
241
|
+
try {
|
|
242
|
+
console.warn(`🔄 Executing with ${provider} (attempt ${attempt}/${config.maxRetries})`);
|
|
243
|
+
const data = await executor(provider);
|
|
244
|
+
const executionTime = Date.now() - startTime;
|
|
245
|
+
return {
|
|
246
|
+
success: true,
|
|
247
|
+
data,
|
|
248
|
+
provider,
|
|
249
|
+
fallbackUsed: provider !== this.config.primaryProvider,
|
|
250
|
+
executionTime,
|
|
251
|
+
validationsPassed: [],
|
|
252
|
+
validationsFailed: [],
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
lastError = error;
|
|
257
|
+
// Check if rate limit error
|
|
258
|
+
if (error instanceof Error &&
|
|
259
|
+
(error.message.includes('rate limit') || error.message.includes('429'))) {
|
|
260
|
+
throw new RateLimitError(`Rate limit exceeded for ${provider}`, provider);
|
|
261
|
+
}
|
|
262
|
+
// Retry with delay if not last attempt
|
|
263
|
+
if (attempt < config.maxRetries) {
|
|
264
|
+
console.warn(`⏳ Retrying in ${config.retryDelay}ms (attempt ${attempt}/${config.maxRetries})...`);
|
|
265
|
+
await new Promise(resolve => setTimeout(resolve, config.retryDelay));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// All retries failed
|
|
270
|
+
throw new ProviderUnavailableError(`Provider ${provider} unavailable after ${config.maxRetries} attempts: ${lastError?.message}`, provider);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Execute a task with automatic fallback on failure
|
|
274
|
+
*/
|
|
275
|
+
async executeWithFallback(task, executor) {
|
|
276
|
+
const providers = [this.currentProvider, ...this.config.fallbackChain];
|
|
277
|
+
let lastError;
|
|
278
|
+
for (const provider of providers) {
|
|
279
|
+
try {
|
|
280
|
+
// Check provider health first
|
|
281
|
+
const health = await this.checkProviderHealth(provider);
|
|
282
|
+
this.healthStatus.set(provider, health);
|
|
283
|
+
if (!health.available) {
|
|
284
|
+
console.warn(`⚠️ Provider ${provider} not available, skipping...`);
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
// Attempt execution
|
|
288
|
+
const result = await this.executeWithProvider(provider, task, executor);
|
|
289
|
+
// Update current provider if fallback was used
|
|
290
|
+
if (result.fallbackUsed && provider !== this.currentProvider) {
|
|
291
|
+
await this.switchProvider(provider);
|
|
292
|
+
}
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
lastError = error;
|
|
297
|
+
if (error instanceof RateLimitError) {
|
|
298
|
+
console.warn(`⏱️ Rate limit hit on ${provider}, trying next provider...`);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (error instanceof ProviderUnavailableError) {
|
|
302
|
+
console.warn(`❌ Provider ${provider} unavailable, trying next provider...`);
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
// Unknown error, try next provider
|
|
306
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
307
|
+
console.warn(`⚠️ Error with ${provider}: ${errorMessage}, trying next provider...`);
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// All providers failed
|
|
312
|
+
throw new Error(`All providers exhausted. Last error: ${lastError?.message || 'Unknown'}`);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Get current provider health status
|
|
316
|
+
*/
|
|
317
|
+
getHealthStatus() {
|
|
318
|
+
return new Map(this.healthStatus);
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get current active provider
|
|
322
|
+
*/
|
|
323
|
+
getCurrentProvider() {
|
|
324
|
+
return this.currentProvider;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Manually trigger fallback to next provider
|
|
328
|
+
*/
|
|
329
|
+
async fallbackToNext() {
|
|
330
|
+
const currentIndex = this.config.fallbackChain.indexOf(this.currentProvider);
|
|
331
|
+
const nextProvider = this.config.fallbackChain[currentIndex + 1] || this.config.fallbackChain[0];
|
|
332
|
+
await this.switchProvider(nextProvider);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Manually return to primary provider
|
|
336
|
+
*/
|
|
337
|
+
async returnToPrimary() {
|
|
338
|
+
await this.switchProvider(this.config.primaryProvider);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Update provider configuration
|
|
342
|
+
*/
|
|
343
|
+
updateProviderConfig(provider, config) {
|
|
344
|
+
const existing = this.providerConfigs.get(provider);
|
|
345
|
+
if (!existing) {
|
|
346
|
+
throw new Error(`Provider not found: ${provider}`);
|
|
347
|
+
}
|
|
348
|
+
this.providerConfigs.set(provider, { ...existing, ...config });
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Stop health monitoring and cleanup
|
|
352
|
+
*/
|
|
353
|
+
destroy() {
|
|
354
|
+
if (this.healthCheckTimer) {
|
|
355
|
+
clearInterval(this.healthCheckTimer);
|
|
356
|
+
this.healthCheckTimer = undefined;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=provider-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../../packages/ai/core/provider-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Engine
|
|
3
|
+
*
|
|
4
|
+
* Tracks agent usage, quality metrics, costs, and performance across all AI providers.
|
|
5
|
+
* Provides data-driven insights for optimizing agent allocation and cost management.
|
|
6
|
+
*
|
|
7
|
+
* @module @dcyfr/ai/core/telemetry-engine
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { TelemetryEngine } from '@dcyfr/ai/core/telemetry-engine';
|
|
11
|
+
*
|
|
12
|
+
* const telemetry = new TelemetryEngine({ storage: 'memory' });
|
|
13
|
+
*
|
|
14
|
+
* // Start tracking a task
|
|
15
|
+
* const session = telemetry.startSession('claude', {
|
|
16
|
+
* taskType: 'feature',
|
|
17
|
+
* description: 'Implement dark mode',
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // Record metrics
|
|
21
|
+
* session.recordMetric('tokenCompliance', 0.98);
|
|
22
|
+
* session.recordValidation('typescript', 'pass');
|
|
23
|
+
*
|
|
24
|
+
* // End session
|
|
25
|
+
* const result = session.end('success');
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
import type { AgentType, TaskType, TaskOutcome, ValidationStatus, StorageAdapter, StorageType } from '../types';
|
|
29
|
+
import type { TelemetrySession, TelemetryMetrics, ViolationRecord, HandoffRecord, AgentStats, ComparisonStats, HandoffPatterns } from '../types/telemetry';
|
|
30
|
+
/**
|
|
31
|
+
* Telemetry Session Manager - handles individual sessions
|
|
32
|
+
*/
|
|
33
|
+
export declare class TelemetrySessionManager {
|
|
34
|
+
private session;
|
|
35
|
+
private startTime;
|
|
36
|
+
private storage;
|
|
37
|
+
constructor(sessionId: string, agent: AgentType, taskType: TaskType, taskDescription: string, storage: StorageAdapter);
|
|
38
|
+
/**
|
|
39
|
+
* Record a metric value
|
|
40
|
+
*/
|
|
41
|
+
recordMetric(metric: keyof Omit<TelemetryMetrics, 'validations'>, value: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* Record validation status
|
|
44
|
+
*/
|
|
45
|
+
recordValidation(validation: string, status: ValidationStatus): void;
|
|
46
|
+
/**
|
|
47
|
+
* Record a violation
|
|
48
|
+
*/
|
|
49
|
+
recordViolation(violation: Omit<ViolationRecord, 'timestamp'>): void;
|
|
50
|
+
/**
|
|
51
|
+
* Record a handoff to another agent
|
|
52
|
+
*/
|
|
53
|
+
recordHandoff(handoff: Omit<HandoffRecord, 'timestamp' | 'fromAgent'>): void;
|
|
54
|
+
/**
|
|
55
|
+
* Update cost estimate
|
|
56
|
+
*/
|
|
57
|
+
updateCost(inputTokens: number, outputTokens: number): void;
|
|
58
|
+
private getCostPerMillionTokens;
|
|
59
|
+
/**
|
|
60
|
+
* End the session and return final metrics
|
|
61
|
+
*/
|
|
62
|
+
end(outcome: TaskOutcome): Promise<TelemetrySession>;
|
|
63
|
+
/**
|
|
64
|
+
* Get current session data
|
|
65
|
+
*/
|
|
66
|
+
getSession(): TelemetrySession;
|
|
67
|
+
private saveToStorage;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Main Telemetry Engine
|
|
71
|
+
*/
|
|
72
|
+
export declare class TelemetryEngine {
|
|
73
|
+
private activeSessions;
|
|
74
|
+
private storage;
|
|
75
|
+
constructor(options?: {
|
|
76
|
+
storage?: StorageType | StorageAdapter;
|
|
77
|
+
basePath?: string;
|
|
78
|
+
});
|
|
79
|
+
/**
|
|
80
|
+
* Start a new telemetry session
|
|
81
|
+
*/
|
|
82
|
+
startSession(agent: AgentType, options: {
|
|
83
|
+
taskType: TaskType;
|
|
84
|
+
description: string;
|
|
85
|
+
}): TelemetrySessionManager;
|
|
86
|
+
/**
|
|
87
|
+
* Get an active session
|
|
88
|
+
*/
|
|
89
|
+
getSession(sessionId: string): TelemetrySessionManager | undefined;
|
|
90
|
+
/**
|
|
91
|
+
* End a session
|
|
92
|
+
*/
|
|
93
|
+
endSession(sessionId: string, outcome: TaskOutcome): Promise<TelemetrySession | null>;
|
|
94
|
+
/**
|
|
95
|
+
* Get statistics for a specific agent
|
|
96
|
+
*/
|
|
97
|
+
getAgentStats(agent: AgentType, period?: string): Promise<AgentStats>;
|
|
98
|
+
/**
|
|
99
|
+
* Compare stats across all agents
|
|
100
|
+
*/
|
|
101
|
+
compareAgents(period?: string): Promise<ComparisonStats>;
|
|
102
|
+
/**
|
|
103
|
+
* Get handoff patterns
|
|
104
|
+
*/
|
|
105
|
+
getHandoffPatterns(period?: string): Promise<HandoffPatterns>;
|
|
106
|
+
private generateSessionId;
|
|
107
|
+
private getSessionsForPeriod;
|
|
108
|
+
private getAllSessionsForPeriod;
|
|
109
|
+
private getPeriodCutoffDate;
|
|
110
|
+
private calculateCostByTaskType;
|
|
111
|
+
private generateRecommendations;
|
|
112
|
+
private getEmptyStats;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=telemetry-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-engine.d.ts","sourceRoot":"","sources":["../../../packages/ai/core/telemetry-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,WAAW,EACZ,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,UAAU,EACV,eAAe,EACf,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAiB;gBAG9B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,cAAc;IAuCzB;;OAEG;IACH,YAAY,CACV,MAAM,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,EACnD,KAAK,EAAE,MAAM,GACZ,IAAI;IAIP;;OAEG;IACH,gBAAgB,CACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,GACvB,IAAI;IAIP;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,IAAI;IAcpE;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,IAAI;IAQ5E;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAa3D,OAAO,CAAC,uBAAuB;IAU/B;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAW1D;;OAEG;IACH,UAAU,IAAI,gBAAgB;YAIhB,aAAa;CAc5B;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAenF;;OAEG;IACH,YAAY,CACV,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,GACA,uBAAuB;IAc1B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;IAIlE;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAS3F;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,SAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAkE1E;;OAEG;IACG,aAAa,CAAC,MAAM,SAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;IAiB7D;;OAEG;IACG,kBAAkB,CAAC,MAAM,SAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;IAoClE,OAAO,CAAC,iBAAiB;YAKX,oBAAoB;YAYpB,uBAAuB;IAOrC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,uBAAuB;IAiC/B,OAAO,CAAC,aAAa;CA2BtB"}
|