@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.
Files changed (49) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/LICENSE +21 -0
  3. package/README.md +210 -0
  4. package/bin/cli.js +249 -0
  5. package/bin/dcyfr-ai.js +376 -0
  6. package/config/default.json +123 -0
  7. package/config/default.yaml +161 -0
  8. package/config/minimal.yaml +16 -0
  9. package/dist/ai/config/loader.d.ts +91 -0
  10. package/dist/ai/config/loader.d.ts.map +1 -0
  11. package/dist/ai/config/loader.js +259 -0
  12. package/dist/ai/config/loader.js.map +1 -0
  13. package/dist/ai/config/schema.d.ts +854 -0
  14. package/dist/ai/config/schema.d.ts.map +1 -0
  15. package/dist/ai/config/schema.js +260 -0
  16. package/dist/ai/config/schema.js.map +1 -0
  17. package/dist/ai/core/provider-registry.d.ts +115 -0
  18. package/dist/ai/core/provider-registry.d.ts.map +1 -0
  19. package/dist/ai/core/provider-registry.js +360 -0
  20. package/dist/ai/core/provider-registry.js.map +1 -0
  21. package/dist/ai/core/telemetry-engine.d.ts +114 -0
  22. package/dist/ai/core/telemetry-engine.d.ts.map +1 -0
  23. package/dist/ai/core/telemetry-engine.js +390 -0
  24. package/dist/ai/core/telemetry-engine.js.map +1 -0
  25. package/dist/ai/index.d.ts +17 -0
  26. package/dist/ai/index.d.ts.map +1 -0
  27. package/dist/ai/index.js +21 -0
  28. package/dist/ai/index.js.map +1 -0
  29. package/dist/ai/plugins/plugin-loader.d.ts +132 -0
  30. package/dist/ai/plugins/plugin-loader.d.ts.map +1 -0
  31. package/dist/ai/plugins/plugin-loader.js +316 -0
  32. package/dist/ai/plugins/plugin-loader.js.map +1 -0
  33. package/dist/ai/types/index.d.ts +179 -0
  34. package/dist/ai/types/index.d.ts.map +1 -0
  35. package/dist/ai/types/index.js +11 -0
  36. package/dist/ai/types/index.js.map +1 -0
  37. package/dist/ai/types/telemetry.d.ts +117 -0
  38. package/dist/ai/types/telemetry.d.ts.map +1 -0
  39. package/dist/ai/types/telemetry.js +6 -0
  40. package/dist/ai/types/telemetry.js.map +1 -0
  41. package/dist/ai/utils/storage.d.ts +37 -0
  42. package/dist/ai/utils/storage.d.ts.map +1 -0
  43. package/dist/ai/utils/storage.js +129 -0
  44. package/dist/ai/utils/storage.js.map +1 -0
  45. package/dist/ai/validation/validation-framework.d.ts +112 -0
  46. package/dist/ai/validation/validation-framework.d.ts.map +1 -0
  47. package/dist/ai/validation/validation-framework.js +221 -0
  48. package/dist/ai/validation/validation-framework.js.map +1 -0
  49. 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAUH;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IAHT,YACE,OAAe,EACR,QAAsB,EACtB,UAAmB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,aAAQ,GAAR,QAAQ,CAAc;QACtB,eAAU,GAAV,UAAU,CAAS;QAG1B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACb;IAApC,YAAY,OAAe,EAAS,QAAsB;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,aAAQ,GAAR,QAAQ,CAAc;QAExD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAcD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAyB;IAC/B,eAAe,CAAoC;IACnD,YAAY,CAAoC;IAChD,eAAe,CAAe;IAC9B,gBAAgB,CAAkB;IAE1C,YAAY,MAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAE9B,6CAA6C;QAC7C,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAEjC,iDAAiD;QACjD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,yBAAyB;QAC/B,MAAM,cAAc,GAAqB;YACvC;gBACE,IAAI,EAAE,QAAQ;gBACd,cAAc,EAAE,uCAAuC;gBACvD,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;aACd;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,cAAc,EAAE,uCAAuC;gBACvD,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;aACd;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wBAAwB;gBACrC,cAAc,EAAE,iCAAiC;gBACjD,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;aACd;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;aACd;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,cAAc,EAAE,kCAAkC;gBAClD,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;aACd;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,cAAc,EAAE,uCAAuC;gBACvD,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;aACd;SACF,CAAC;QAEF,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC9B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;gBACjC,QAAQ,EAAE,MAAM,CAAC,IAAI;gBACrB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI,IAAI,EAAE;aACxB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,QAAsB;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,QAAQ;gBACR,SAAS,EAAE,KAAK;gBAChB,WAAW,EAAE,IAAI,IAAI,EAAE;gBACvB,KAAK,EAAE,kCAAkC;aAC1C,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACL,QAAQ;gBACR,SAAS,EAAE,KAAK;gBAChB,WAAW,EAAE,IAAI,IAAI,EAAE;gBACvB,KAAK,EAAE,mBAAmB;aAC3B,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC3B,2DAA2D;gBAC3D,OAAO;oBACL,QAAQ;oBACR,SAAS,EAAE,IAAI;oBACf,YAAY,EAAE,CAAC;oBACf,WAAW,EAAE,IAAI,IAAI,EAAE;iBACxB,CAAC;YACJ,CAAC;YAED,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;aAC5C,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE5C,sDAAsD;YACtD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;gBACtE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAE,EAAE,EAAE,CAAC;gBAC9D,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBAC9D,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;gBAC3E,CAAC,CAAC,SAAS,CAAC;YAEd,OAAO;gBACL,QAAQ;gBACR,SAAS,EAAE,QAAQ,CAAC,EAAE;gBACtB,YAAY;gBACZ,WAAW,EAAE,IAAI,IAAI,EAAE;gBACvB,kBAAkB;gBAClB,cAAc;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,QAAQ;gBACR,SAAS,EAAE,KAAK;gBAChB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACpC,WAAW,EAAE,IAAI,IAAI,EAAE;gBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAC7C,gCAAgC;YAChC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAClF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;YAElE,sEAAsE;YACtE,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;gBACpF,OAAO,CAAC,IAAI,CACV,sBAAsB,IAAI,CAAC,MAAM,CAAC,eAAe,qCAAqC,CACvF,CAAC;gBACF,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,cAA4B;QACvD,IAAI,IAAI,CAAC,eAAe,KAAK,cAAc,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,eAAe,MAAM,cAAc,EAAE,CAAC,CAAC;QAEnF,0BAA0B;QAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QAEtC,OAAO,CAAC,IAAI,CAAC,0BAA0B,cAAc,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,QAAsB,EACtB,IAAiB,EACjB,QAAgD;QAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,SAA4B,CAAC;QAEjC,cAAc;QACd,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9D,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,qBAAqB,QAAQ,aAAa,OAAO,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;gBAExF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAE7C,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,IAAI;oBACJ,QAAQ;oBACR,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,eAAe;oBACtD,aAAa;oBACb,iBAAiB,EAAE,EAAE;oBACrB,iBAAiB,EAAE,EAAE;iBACtB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAE3B,4BAA4B;gBAC5B,IACE,KAAK,YAAY,KAAK;oBACtB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EACvE,CAAC;oBACD,MAAM,IAAI,cAAc,CAAC,2BAA2B,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;gBAC5E,CAAC;gBAED,uCAAuC;gBACvC,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,CACV,iBAAiB,MAAM,CAAC,UAAU,eAAe,OAAO,IAAI,MAAM,CAAC,UAAU,MAAM,CACpF,CAAC;oBACF,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,IAAI,wBAAwB,CAChC,YAAY,QAAQ,sBAAsB,MAAM,CAAC,UAAU,cAAc,SAAS,EAAE,OAAO,EAAE,EAC7F,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,mBAAmB,CAC9B,IAAiB,EACjB,QAAgD;QAEhD,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACvE,IAAI,SAA4B,CAAC;QAEjC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBACxD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAExC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,gBAAgB,QAAQ,6BAA6B,CAAC,CAAC;oBACpE,SAAS;gBACX,CAAC;gBAED,oBAAoB;gBACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAExE,+CAA+C;gBAC/C,IAAI,MAAM,CAAC,YAAY,IAAI,QAAQ,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC7D,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBACtC,CAAC;gBAED,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAE3B,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;oBACpC,OAAO,CAAC,IAAI,CAAC,yBAAyB,QAAQ,2BAA2B,CAAC,CAAC;oBAC3E,SAAS;gBACX,CAAC;gBAED,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;oBAC9C,OAAO,CAAC,IAAI,CAAC,cAAc,QAAQ,uCAAuC,CAAC,CAAC;oBAC5E,SAAS;gBACX,CAAC;gBAED,mCAAmC;gBACnC,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,OAAO,CAAC,IAAI,CAAC,kBAAkB,QAAQ,KAAK,YAAY,2BAA2B,CAAC,CAAC;gBACrF,SAAS;YACX,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,MAAM,IAAI,KAAK,CACb,wCAAwC,SAAS,EAAE,OAAO,IAAI,SAAS,EAAE,CAC1E,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,kBAAkB;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7E,MAAM,YAAY,GAChB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAE9E,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe;QAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,oBAAoB,CAAC,QAAsB,EAAE,MAA+B;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACpC,CAAC;IACH,CAAC;CACF"}
@@ -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"}