@aeye/ai 0.1.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 (54) hide show
  1. package/README.md +1324 -0
  2. package/dist/ai.d.ts +204 -0
  3. package/dist/ai.d.ts.map +1 -0
  4. package/dist/ai.js +837 -0
  5. package/dist/ai.js.map +1 -0
  6. package/dist/apis/base.d.ts +181 -0
  7. package/dist/apis/base.d.ts.map +1 -0
  8. package/dist/apis/base.js +359 -0
  9. package/dist/apis/base.js.map +1 -0
  10. package/dist/apis/chat.d.ts +82 -0
  11. package/dist/apis/chat.d.ts.map +1 -0
  12. package/dist/apis/chat.js +214 -0
  13. package/dist/apis/chat.js.map +1 -0
  14. package/dist/apis/embed.d.ts +27 -0
  15. package/dist/apis/embed.d.ts.map +1 -0
  16. package/dist/apis/embed.js +70 -0
  17. package/dist/apis/embed.js.map +1 -0
  18. package/dist/apis/image.d.ts +77 -0
  19. package/dist/apis/image.d.ts.map +1 -0
  20. package/dist/apis/image.js +313 -0
  21. package/dist/apis/image.js.map +1 -0
  22. package/dist/apis/models.d.ts +108 -0
  23. package/dist/apis/models.d.ts.map +1 -0
  24. package/dist/apis/models.js +118 -0
  25. package/dist/apis/models.js.map +1 -0
  26. package/dist/apis/speech.d.ts +27 -0
  27. package/dist/apis/speech.d.ts.map +1 -0
  28. package/dist/apis/speech.js +79 -0
  29. package/dist/apis/speech.js.map +1 -0
  30. package/dist/apis/transcribe.d.ts +26 -0
  31. package/dist/apis/transcribe.d.ts.map +1 -0
  32. package/dist/apis/transcribe.js +103 -0
  33. package/dist/apis/transcribe.js.map +1 -0
  34. package/dist/common.d.ts +10 -0
  35. package/dist/common.d.ts.map +1 -0
  36. package/dist/common.js +17 -0
  37. package/dist/common.js.map +1 -0
  38. package/dist/index.d.ts +17 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +17 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/modelDetection.d.ts +31 -0
  43. package/dist/modelDetection.d.ts.map +1 -0
  44. package/dist/modelDetection.js +78 -0
  45. package/dist/modelDetection.js.map +1 -0
  46. package/dist/registry.d.ts +150 -0
  47. package/dist/registry.d.ts.map +1 -0
  48. package/dist/registry.js +639 -0
  49. package/dist/registry.js.map +1 -0
  50. package/dist/types.d.ts +767 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +8 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +53 -0
@@ -0,0 +1,639 @@
1
+ /**
2
+ * Model Registry
3
+ *
4
+ * Centralized model management with provider ordering and adapter registration.
5
+ * Provider order ensures deterministic model resolution: first provider to return a model ID wins.
6
+ */
7
+ import { getModel } from '@aeye/core';
8
+ import { detectTier } from './modelDetection';
9
+ // ============================================================================
10
+ // Provider Capability Detection
11
+ // ============================================================================
12
+ /**
13
+ * Determines which capabilities a provider supports based on its defined methods.
14
+ * Treats streaming and non-streaming methods as equivalent for capability detection.
15
+ *
16
+ * This is useful for:
17
+ * - Filtering providers during model selection
18
+ * - Validating provider compatibility before requests
19
+ * - Displaying provider capabilities in UI
20
+ *
21
+ * @param provider - The provider to inspect
22
+ * @returns Set of capabilities the provider supports
23
+ *
24
+ * @example Basic usage
25
+ * ```typescript
26
+ * import { OpenAIProvider } from '@aeye/openai';
27
+ * import { getProviderCapabilities } from '@aeye/ai';
28
+ *
29
+ * const openai = new OpenAIProvider({ apiKey: '...' });
30
+ * const caps = getProviderCapabilities(openai);
31
+ * console.log(caps);
32
+ * // Set(['chat', 'streaming', 'image', 'audio', 'hearing', 'embedding'])
33
+ * ```
34
+ *
35
+ * @example Checking specific capability
36
+ * ```typescript
37
+ * const openrouter = new OpenRouterProvider({ apiKey: '...' });
38
+ * const caps = getProviderCapabilities(openrouter);
39
+ *
40
+ * if (caps.has('image')) {
41
+ * console.log('Provider supports image generation');
42
+ * } else {
43
+ * console.log('Provider does not support image generation');
44
+ * }
45
+ * // Output: "Provider does not support image generation"
46
+ * ```
47
+ *
48
+ * @example Filtering providers by capability
49
+ * ```typescript
50
+ * const providers = { openai, openrouter, anthropic };
51
+ * const imageProviders = Object.entries(providers)
52
+ * .filter(([name, provider]) => getProviderCapabilities(provider).has('image'))
53
+ * .map(([name]) => name);
54
+ * console.log(imageProviders); // ['openai']
55
+ * ```
56
+ */
57
+ export function getProviderCapabilities(provider) {
58
+ const capabilities = new Set();
59
+ // chat - Basic text completion
60
+ if (provider.createExecutor !== undefined || provider.createStreamer !== undefined) {
61
+ capabilities.add('chat');
62
+ }
63
+ // streaming - Real-time response streaming
64
+ if (provider.createStreamer !== undefined) {
65
+ capabilities.add('streaming');
66
+ }
67
+ // image - Image generation (DALL-E, Stable Diffusion, etc.)
68
+ // Either method counts as supporting the capability
69
+ if (provider.generateImage !== undefined || provider.generateImageStream !== undefined) {
70
+ capabilities.add('image');
71
+ }
72
+ if (provider.editImage !== undefined || provider.editImageStream !== undefined) {
73
+ capabilities.add('image');
74
+ }
75
+ // vision - Image understanding/analysis
76
+ // Note: vision is a model capability, not a provider method
77
+ // Vision is handled through chat messages with image content
78
+ // It cannot be detected from provider methods alone
79
+ capabilities.add('vision');
80
+ // audio - Text-to-speech synthesis
81
+ if (provider.speech !== undefined) {
82
+ capabilities.add('audio');
83
+ }
84
+ // hearing - Speech-to-text transcription
85
+ if (provider.transcribe !== undefined || provider.transcribeStream !== undefined) {
86
+ capabilities.add('hearing');
87
+ }
88
+ // embedding - Text embeddings for semantic search
89
+ if (provider.embed !== undefined) {
90
+ capabilities.add('embedding');
91
+ }
92
+ // tools - Function/tool calling
93
+ // Note: This is typically a model capability, not detected from provider methods
94
+ // Function calling is handled through createExecutor with tools parameter
95
+ capabilities.add('tools');
96
+ // json - JSON output mode
97
+ // Note: This is a model capability, not a provider method
98
+ capabilities.add('json');
99
+ // structured - Structured output with schemas
100
+ // Note: This is a model capability, not a provider method
101
+ capabilities.add('structured');
102
+ // reasoning - Extended reasoning (like OpenAI o1)
103
+ // Note: This is a model capability, not a provider method
104
+ capabilities.add('reasoning');
105
+ // zdr - Zero data retention
106
+ // Note: This is a privacy/compliance feature, not detected from provider methods
107
+ capabilities.add('zdr');
108
+ return capabilities;
109
+ }
110
+ // ============================================================================
111
+ // Model Registry
112
+ // ============================================================================
113
+ export class ModelRegistry {
114
+ models = new Map(); // key: "provider/model"
115
+ modelHandlers = new Map();
116
+ providers = new Map();
117
+ providerCapabilities = new Map();
118
+ modelSources = [];
119
+ modelOverrides;
120
+ defaultCostPerMillionTokens;
121
+ defaultWeights;
122
+ weightProfiles;
123
+ constructor(providers, modelOverrides = [], defaultCostPerMillionTokens = 5.0, modelSources = [], defaultWeights, weightProfiles = {}) {
124
+ // Store providers
125
+ this.providers = new Map(Object.entries(providers));
126
+ // Pre-compute provider capabilities for efficient lookup during selection
127
+ for (const [providerName, provider] of this.providers.entries()) {
128
+ const capabilities = getProviderCapabilities(provider);
129
+ this.providerCapabilities.set(providerName, capabilities);
130
+ }
131
+ // Set provider order (determines which provider "wins" for duplicate model IDs)
132
+ this.modelOverrides = modelOverrides;
133
+ this.defaultCostPerMillionTokens = defaultCostPerMillionTokens;
134
+ this.modelSources = modelSources;
135
+ this.defaultWeights = defaultWeights;
136
+ this.weightProfiles = weightProfiles;
137
+ }
138
+ /**
139
+ * Add model sources to the registry
140
+ */
141
+ addModelSources(sources) {
142
+ this.modelSources.push(...sources);
143
+ }
144
+ /**
145
+ * Register a model in the registry
146
+ *
147
+ * Always registers under two keys:
148
+ * - model.id (e.g., "gpt-4" or "openai/gpt-4")
149
+ * - provider/model.id (e.g., "openai/gpt-4" or "openrouter/openai/gpt-4")
150
+ *
151
+ * On collision, models are merged
152
+ */
153
+ registerModel(model) {
154
+ const processedModel = this.applyOverrides(model);
155
+ // Register under both keys
156
+ const keys = [
157
+ model.id, // "gpt-4" or "openai/gpt-4"
158
+ `${model.provider}/${model.id}`, // "openai/gpt-4" or "openrouter/openai/gpt-4"
159
+ ];
160
+ for (const key of keys) {
161
+ if (this.models.has(key)) {
162
+ // Merge with existing
163
+ const existing = this.models.get(key);
164
+ const merged = this.mergeModelInfo(existing, processedModel);
165
+ this.models.set(key, merged);
166
+ }
167
+ else {
168
+ this.models.set(key, processedModel);
169
+ }
170
+ }
171
+ }
172
+ /**
173
+ * Register multiple models
174
+ */
175
+ registerModels(models) {
176
+ for (const model of models) {
177
+ this.registerModel(model);
178
+ }
179
+ }
180
+ /**
181
+ * Get a model by ID (checks all providers in order)
182
+ */
183
+ getModel(id) {
184
+ // Try with provider prefix first
185
+ if (id.includes('/')) {
186
+ return this.models.get(id);
187
+ }
188
+ let priorityProvider = 10;
189
+ let priorityModel = undefined;
190
+ // Try each provider in order
191
+ for (const [providerName, provider] of this.providers.entries()) {
192
+ const key = `${providerName}/${id}`;
193
+ const priority = provider.priority ?? 10;
194
+ const model = this.models.get(key);
195
+ if (model && (!priorityModel || priority < priorityProvider)) {
196
+ priorityModel = model;
197
+ priorityProvider = priority;
198
+ }
199
+ }
200
+ return priorityModel;
201
+ }
202
+ /**
203
+ * Gets the provider to use for a given model ID
204
+ *
205
+ * @param id
206
+ * @returns
207
+ */
208
+ getProviderFor(id) {
209
+ let priorityProvider = undefined;
210
+ let priorityKey = undefined;
211
+ for (const [providerKey, provider] of this.providers.entries()) {
212
+ const providerName = provider.name;
213
+ if (id.startsWith(`${providerName}/`) || id.startsWith(`${providerKey}/`)) {
214
+ return [providerKey, provider];
215
+ }
216
+ const priority = provider.priority ?? 10;
217
+ if (!priorityProvider || priority < (priorityProvider.priority ?? 10)) {
218
+ priorityProvider = provider;
219
+ priorityKey = providerKey;
220
+ }
221
+ }
222
+ return priorityKey && priorityProvider ? [priorityKey, priorityProvider] : [];
223
+ }
224
+ /**
225
+ * List all models
226
+ */
227
+ listModels() {
228
+ return Array.from(this.models.values());
229
+ }
230
+ /**
231
+ * List models for which we have providers
232
+ */
233
+ providedModels() {
234
+ return this.listModels().filter(model => this.providers.has(model.provider));
235
+ }
236
+ /**
237
+ * Search and score models based on criteria
238
+ */
239
+ searchModels(metadata) {
240
+ const scored = [];
241
+ // Filter list by models we have providers for
242
+ const providedModels = this.providedModels();
243
+ for (const model of providedModels) {
244
+ const score = this.scoreModel(model, metadata);
245
+ if (score.score > 0) {
246
+ scored.push(score);
247
+ }
248
+ }
249
+ // Sort by score descending
250
+ scored.sort((a, b) => b.score - a.score);
251
+ return scored;
252
+ }
253
+ /**
254
+ * Select best model based on criteria
255
+ */
256
+ selectModel(criteria) {
257
+ // If model explicitly specified, use it
258
+ const model = getModel(criteria.model);
259
+ const modelId = model?.id;
260
+ if (modelId) {
261
+ const model = this.getModel(modelId);
262
+ if (!model) {
263
+ return undefined;
264
+ }
265
+ const provider = this.providers.get(model.provider);
266
+ if (!provider) {
267
+ return undefined;
268
+ }
269
+ // Validate that provider supports required capabilities
270
+ if (criteria.required) {
271
+ const providerCaps = this.providerCapabilities.get(model.provider);
272
+ for (const cap of criteria.required) {
273
+ // Check if provider supports this capability
274
+ const providerSupportsCap = !providerCaps || providerCaps.has(cap);
275
+ if (!providerSupportsCap) {
276
+ // Provider doesn't support this capability, cannot use this model
277
+ return undefined;
278
+ }
279
+ }
280
+ }
281
+ // Validate that model supports required parameters
282
+ if (criteria.requiredParameters && criteria.requiredParameters.length > 0) {
283
+ const optionalParams = criteria.optionalParameters || [];
284
+ for (const param of criteria.requiredParameters) {
285
+ // If this param is marked as optional, skip the requirement check
286
+ if (optionalParams.includes(param)) {
287
+ continue;
288
+ }
289
+ // Check if model supports this parameter
290
+ const modelSupportsParam = model.supportedParameters?.has(param) ?? false;
291
+ if (!modelSupportsParam) {
292
+ // Required parameter not supported by model
293
+ return undefined;
294
+ }
295
+ }
296
+ }
297
+ return {
298
+ model,
299
+ provider,
300
+ providerConfig: provider.config,
301
+ score: 1.0,
302
+ };
303
+ }
304
+ // Search and score all compatible models
305
+ const scored = this.searchModels(criteria);
306
+ if (scored.length === 0) {
307
+ return undefined;
308
+ }
309
+ const best = scored[0];
310
+ const provider = this.providers.get(best.model.provider);
311
+ if (!provider) {
312
+ return undefined;
313
+ }
314
+ return {
315
+ model: best.model,
316
+ provider,
317
+ providerConfig: provider.config,
318
+ score: best.score,
319
+ };
320
+ }
321
+ /**
322
+ * Register a model handler
323
+ */
324
+ registerHandler(handler) {
325
+ handler.models.forEach(model => this.modelHandlers.set(model, handler));
326
+ }
327
+ /**
328
+ * Get handler for a model
329
+ */
330
+ getHandler(provider, model) {
331
+ return this.modelHandlers.get(model) ?? this.modelHandlers.get(`${provider}/${model}`);
332
+ }
333
+ /**
334
+ * Get provider info
335
+ */
336
+ getProvider(name) {
337
+ return this.providers.get(name);
338
+ }
339
+ /**
340
+ * Get pre-computed capabilities for a provider
341
+ * @param name - Provider name
342
+ * @returns Set of capabilities the provider supports, or undefined if provider not found
343
+ */
344
+ getProviderCapabilities(name) {
345
+ return this.providerCapabilities.get(name);
346
+ }
347
+ /**
348
+ * Score a model against criteria
349
+ */
350
+ scoreModel(model, criteria) {
351
+ const result = {
352
+ model,
353
+ score: 0,
354
+ matchedRequired: [],
355
+ matchedOptional: [],
356
+ missingRequired: [],
357
+ };
358
+ // Check provider allowlist/blocklist
359
+ if (criteria.providers) {
360
+ if (criteria.providers.deny?.includes(model.provider)) {
361
+ return result; // score = 0
362
+ }
363
+ if (criteria.providers.allow && !criteria.providers.allow.includes(model.provider)) {
364
+ return result; // score = 0
365
+ }
366
+ }
367
+ // Check required capabilities against both model AND provider
368
+ if (criteria.required) {
369
+ const providerCaps = this.providerCapabilities.get(model.provider);
370
+ for (const cap of criteria.required) {
371
+ // Check if model has the capability
372
+ const modelHasCap = model.capabilities.has(cap);
373
+ // Check if provider supports the capability
374
+ // If provider capabilities are not cached, assume it's supported (backward compatibility)
375
+ const providerSupportsCap = !providerCaps || providerCaps.has(cap);
376
+ // Both model AND provider must support the capability
377
+ if (modelHasCap && providerSupportsCap) {
378
+ result.matchedRequired.push(cap);
379
+ }
380
+ else {
381
+ result.missingRequired.push(cap);
382
+ }
383
+ }
384
+ // If any required capabilities are missing, score = 0
385
+ if (result.missingRequired.length > 0) {
386
+ return result;
387
+ }
388
+ }
389
+ // Check optional capabilities
390
+ if (criteria.optional) {
391
+ for (const cap of criteria.optional) {
392
+ if (model.capabilities.has(cap)) {
393
+ result.matchedOptional.push(cap);
394
+ }
395
+ }
396
+ }
397
+ // Check required parameters
398
+ if (criteria.requiredParameters && criteria.requiredParameters.length > 0) {
399
+ const optionalParams = criteria.optionalParameters || [];
400
+ for (const param of criteria.requiredParameters) {
401
+ // If this param is marked as optional, skip the requirement check
402
+ if (optionalParams.includes(param)) {
403
+ continue;
404
+ }
405
+ // Check if model supports this parameter
406
+ const modelSupportsParam = model.supportedParameters?.has(param) ?? false;
407
+ if (!modelSupportsParam) {
408
+ // Required parameter not supported by model
409
+ return result; // score = 0
410
+ }
411
+ }
412
+ }
413
+ // Check minimum context window
414
+ if (criteria.minContextWindow && model.contextWindow && model.contextWindow < criteria.minContextWindow) {
415
+ return result; // score = 0
416
+ }
417
+ if (criteria.tier && model.tier !== criteria.tier) {
418
+ return result; // score = 0
419
+ }
420
+ // Determine weights with priority: metadata.weights > weightProfile > defaultWeights
421
+ let weights;
422
+ if (criteria.weights) {
423
+ weights = criteria.weights;
424
+ }
425
+ else if (criteria.weightProfile && this.weightProfiles[criteria.weightProfile]) {
426
+ weights = this.weightProfiles[criteria.weightProfile];
427
+ }
428
+ else if (this.defaultWeights) {
429
+ weights = this.defaultWeights;
430
+ }
431
+ else {
432
+ weights = { cost: 0.5, speed: 0.3, accuracy: 0.2 };
433
+ }
434
+ result.score = this.calculateWeightedScore(model, weights, criteria);
435
+ return result;
436
+ }
437
+ /**
438
+ * Calculate weighted score for a model
439
+ */
440
+ calculateWeightedScore(model, weights, metadata) {
441
+ let score = 0;
442
+ let weighted = 0;
443
+ // Cost score (lower is better, invert)
444
+ if (weights.cost) {
445
+ // TODO more sophisticated cost modeling
446
+ const avgCost = ((model.pricing.text?.input ?? 0) + (model.pricing.text?.output ?? 0)) / 2;
447
+ const costScore = 1 / (1 + avgCost / 10); // Normalize
448
+ score += weights.cost * costScore;
449
+ if (avgCost > 0) {
450
+ weighted++;
451
+ }
452
+ }
453
+ // Speed score
454
+ if (weights.speed && model.metrics?.tokensPerSecond) {
455
+ const speedScore = Math.min(model.metrics.tokensPerSecond / 100, 1); // Normalize to 0-1
456
+ score += weights.speed * speedScore;
457
+ if (speedScore > 0) {
458
+ weighted++;
459
+ }
460
+ }
461
+ // Accuracy score - use metrics if available, otherwise tier-based
462
+ if (weights.accuracy) {
463
+ if (model.metrics?.accuracyScore) {
464
+ score += weights.accuracy * model.metrics.accuracyScore;
465
+ }
466
+ else if (model.tier) {
467
+ // Fallback to tier-based accuracy when metrics not available
468
+ const tierScore = model.tier === 'flagship' ? 1.0 : model.tier === 'efficient' ? 0.7 : 0.5;
469
+ score += weights.accuracy * tierScore;
470
+ }
471
+ if (model.metrics?.accuracyScore || model.tier) {
472
+ weighted++;
473
+ }
474
+ }
475
+ // Context window score
476
+ if (weights.contextWindow) {
477
+ const contextScore = Math.min(model.contextWindow / 100000, 1); // Normalize
478
+ score += weights.contextWindow * contextScore;
479
+ if (model.contextWindow > 0) {
480
+ weighted++;
481
+ }
482
+ }
483
+ // Optional capabilities multiplier - models matching more optional caps get a score multiplier
484
+ // This ensures optional capabilities are strongly preferred
485
+ if (metadata.optional && metadata.optional.length > 0) {
486
+ const optionalMatches = metadata.optional.filter(cap => model.capabilities.has(cap)).length;
487
+ const matchRatio = optionalMatches / metadata.optional.length;
488
+ // Apply 1.0x to 2.0x multiplier based on optional capability match rate
489
+ // This allows optional caps to overcome significant cost differences
490
+ const multiplier = 1.0 + matchRatio;
491
+ score *= multiplier;
492
+ }
493
+ // Optional parameters bonus - models supporting optional parameters get a score boost
494
+ if (metadata.optionalParameters && metadata.optionalParameters.length > 0) {
495
+ let supportedOptionalParams = 0;
496
+ for (const param of metadata.optionalParameters) {
497
+ if (model.supportedParameters?.has(param)) {
498
+ supportedOptionalParams++;
499
+ }
500
+ }
501
+ const matchRatio = supportedOptionalParams / metadata.optionalParameters.length;
502
+ // Apply 1.0x to 1.5x multiplier based on optional parameter match rate
503
+ const multiplier = 1.0 + (matchRatio * 0.5);
504
+ score *= multiplier;
505
+ }
506
+ return weighted === 0 ? Math.max(0.0000001, score) : score;
507
+ }
508
+ /**
509
+ * Apply overrides to a model
510
+ */
511
+ applyOverrides(model) {
512
+ let result = { ...model };
513
+ for (const override of this.modelOverrides) {
514
+ // Check if override matches
515
+ if (override.provider && override.provider !== model.provider) {
516
+ continue;
517
+ }
518
+ if (override.modelId && override.modelId !== model.id) {
519
+ continue;
520
+ }
521
+ if (override.modelPattern && !override.modelPattern.test(model.id)) {
522
+ continue;
523
+ }
524
+ // Apply overrides
525
+ result = {
526
+ ...result,
527
+ ...override.overrides,
528
+ // Merge nested objects
529
+ pricing: { ...result.pricing, ...override.overrides.pricing },
530
+ metrics: { ...result.metrics, ...override.overrides.metrics },
531
+ metadata: { ...result.metadata, ...override.overrides.metadata },
532
+ };
533
+ }
534
+ return result;
535
+ }
536
+ /**
537
+ * Merge two ModelInfo objects intelligently
538
+ * Prefers non-default values and combines capabilities
539
+ */
540
+ mergeModelInfo(base, source) {
541
+ // Merge capabilities
542
+ const mergedCapabilities = new Set([...base.capabilities, ...source.capabilities]);
543
+ // Merge pricing (prefer source if it has non-zero values)
544
+ const mergedPricing = { ...base.pricing, ...source.pricing };
545
+ // Merge metrics (prefer source if available)
546
+ const mergedMetrics = source.metrics ?? base.metrics;
547
+ // Merge metadata (combine, source takes priority for conflicts)
548
+ const mergedMetadata = {
549
+ ...base.metadata,
550
+ ...source.metadata,
551
+ };
552
+ return {
553
+ id: base.id,
554
+ provider: base.provider,
555
+ name: source.name || base.name,
556
+ capabilities: mergedCapabilities,
557
+ tier: source.tier !== 'experimental' ? source.tier : base.tier,
558
+ pricing: mergedPricing,
559
+ contextWindow: source.contextWindow > 0 ? source.contextWindow : base.contextWindow,
560
+ maxOutputTokens: source.maxOutputTokens ?? base.maxOutputTokens,
561
+ metrics: mergedMetrics,
562
+ metadata: mergedMetadata,
563
+ };
564
+ }
565
+ /**
566
+ * Refresh models from all providers and model sources
567
+ */
568
+ async refresh() {
569
+ this.models.clear();
570
+ // Step 1: Fetch from model sources (e.g., OpenRouter)
571
+ const sourceModels = new Map();
572
+ for (const source of this.modelSources) {
573
+ try {
574
+ const models = await source.fetchModels();
575
+ for (const model of models) {
576
+ const key = `${model.provider}/${model.id}`;
577
+ sourceModels.set(key, model);
578
+ }
579
+ }
580
+ catch (error) {
581
+ console.error(`Failed to fetch models from source ${source.name}:`, error);
582
+ }
583
+ }
584
+ const providers = Array.from(this.providers.entries());
585
+ providers.sort((a, b) => {
586
+ const priorityA = a[1].priority ?? 10;
587
+ const priorityB = b[1].priority ?? 10;
588
+ return priorityA - priorityB;
589
+ });
590
+ // Step 2: Fetch from each provider and merge with source models
591
+ for (const [providerName, provider] of providers) {
592
+ try {
593
+ // Skip if provider doesn't implement listModels
594
+ if (!provider.listModels) {
595
+ continue;
596
+ }
597
+ const modelInfos = await provider.listModels();
598
+ // For each model from provider
599
+ for (const modelInfo of modelInfos) {
600
+ // Create key for looking up source info
601
+ const key = `${providerName}/${modelInfo.id}`;
602
+ // Create base model with defaults
603
+ let fullModel = {
604
+ id: modelInfo.id,
605
+ provider: providerName,
606
+ name: modelInfo.name || modelInfo.id,
607
+ capabilities: modelInfo.capabilities || new Set(['chat', 'streaming']),
608
+ tier: modelInfo.tier || detectTier(modelInfo.name || modelInfo.id),
609
+ pricing: modelInfo.pricing || {
610
+ inputTokensPer1M: this.defaultCostPerMillionTokens,
611
+ outputTokensPer1M: this.defaultCostPerMillionTokens * 2,
612
+ },
613
+ contextWindow: modelInfo.contextWindow || 8192,
614
+ maxOutputTokens: modelInfo.maxOutputTokens,
615
+ metrics: modelInfo.metrics,
616
+ metadata: modelInfo.metadata || {},
617
+ };
618
+ // Merge with source model info if available
619
+ const sourceModel = sourceModels.get(key);
620
+ if (sourceModel) {
621
+ fullModel = this.mergeModelInfo(fullModel, sourceModel);
622
+ }
623
+ this.registerModel(fullModel);
624
+ }
625
+ }
626
+ catch (error) {
627
+ // Continue with other providers if one fails
628
+ console.error(`Failed to fetch models from ${providerName}:`, error);
629
+ }
630
+ }
631
+ // Step 3: Register any source models that weren't in providers
632
+ for (const [key, sourceModel] of sourceModels.entries()) {
633
+ if (!this.models.has(key)) {
634
+ this.registerModel(sourceModel);
635
+ }
636
+ }
637
+ }
638
+ }
639
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAe9C,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACxD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEhD,+BAA+B;IAC/B,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACnF,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAC3C,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC1C,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,4DAA4D;IAC5D,oDAAoD;IACpD,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS,IAAI,QAAQ,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACvF,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC/E,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,wCAAwC;IACxC,4DAA4D;IAC5D,6DAA6D;IAC7D,oDAAoD;IACpD,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE3B,mCAAmC;IACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,yCAAyC;IACzC,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,QAAQ,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACjF,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,gCAAgC;IAChC,iFAAiF;IACjF,0EAA0E;IAC1E,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE1B,0BAA0B;IAC1B,0DAA0D;IAC1D,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEzB,8CAA8C;IAC9C,0DAA0D;IAC1D,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAE/B,kDAAkD;IAClD,0DAA0D;IAC1D,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE9B,4BAA4B;IAC5B,iFAAiF;IACjF,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAExB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,OAAO,aAAa;IAMhB,MAAM,GAAyC,IAAI,GAAG,EAAE,CAAC,CAAC,wBAAwB;IAClF,aAAa,GAA8B,IAAI,GAAG,EAAE,CAAC;IACrD,SAAS,GAAiC,IAAI,GAAG,EAAE,CAAC;IACpD,oBAAoB,GAA4C,IAAI,GAAG,EAAE,CAAC;IAC1E,YAAY,GAAkB,EAAE,CAAC;IACjC,cAAc,CAAkB;IAChC,2BAA2B,CAAS;IACpC,cAAc,CAAyB;IACvC,cAAc,CAAwC;IAE9D,YACE,SAAqB,EACrB,iBAAkC,EAAE,EACpC,8BAAsC,GAAG,EACzC,eAA8B,EAAE,EAChC,cAAsC,EACtC,iBAAwD,EAAE;QAE1D,kBAAkB;QAClB,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAiC,CAAC;QAEpF,0EAA0E;QAC1E,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAChE,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC5D,CAAC;QAED,gFAAgF;QAChF,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,2BAA2B,GAAG,2BAA2B,CAAC;QAC/D,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAsB;QACpC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;OAQG;IACH,aAAa,CAAC,KAA8B;QAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAElD,2BAA2B;QAC3B,MAAM,IAAI,GAAG;YACX,KAAK,CAAC,EAAE,EAA+B,4BAA4B;YACnE,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,EAAQ,8CAA8C;SACtF,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,sBAAsB;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAC7D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAiC;QAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,EAAU;QACjB,iCAAiC;QACjC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAI,aAAa,GAAwC,SAAS,CAAC;QAEnE,6BAA6B;QAC7B,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,GAAG,YAAsB,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,IAAI,CAAC,CAAC,aAAa,IAAI,QAAQ,GAAG,gBAAgB,CAAC,EAAE,CAAC;gBAC7D,aAAa,GAAG,KAAK,CAAC;gBACtB,gBAAgB,GAAG,QAAQ,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,EAAU;QACvB,IAAI,gBAAgB,GAA0B,SAAS,CAAC;QACxD,IAAI,WAAW,GAA6B,SAAS,CAAC;QAEtD,KAAK,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;YACnC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC1E,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACjC,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,IAAI,QAAQ,GAAG,CAAC,gBAAgB,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;gBACtE,gBAAgB,GAAG,QAAQ,CAAC;gBAC5B,WAAW,GAAG,WAAW,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,WAAW,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAwB,CAAC,CAAC,CAAC;IAC/F,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAoC;QAC/C,MAAM,MAAM,GAAgC,EAAE,CAAC;QAE/C,8CAA8C;QAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAE7C,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAEzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAoC;QAC9C,wCAAwC;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC;QAE1B,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,wDAAwD;YACxD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAEnE,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACpC,6CAA6C;oBAC7C,MAAM,mBAAmB,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAEnE,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBACzB,kEAAkE;wBAClE,OAAO,SAAS,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,mDAAmD;YACnD,IAAI,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1E,MAAM,cAAc,GAAG,QAAQ,CAAC,kBAAkB,IAAI,EAAE,CAAC;gBAEzD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;oBAChD,kEAAkE;oBAClE,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnC,SAAS;oBACX,CAAC;oBAED,yCAAyC;oBACzC,MAAM,kBAAkB,GAAG,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;oBAE1E,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACxB,4CAA4C;wBAC5C,OAAO,SAAS,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,KAAK;gBACL,QAAQ;gBACR,cAAc,EAAE,QAAQ,CAAC,MAAM;gBAC/B,KAAK,EAAE,GAAG;aACX,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ;YACR,cAAc,EAAE,QAAQ,CAAC,MAAM;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAA0B;QACxC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB,EAAE,KAAa;QACxC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAkB;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,IAAkB;QACxC,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,KAA8B,EAAE,QAAoC;QACrF,MAAM,MAAM,GAA8B;YACxC,KAAK;YACL,KAAK,EAAE,CAAC;YACR,eAAe,EAAE,EAAE;YACnB,eAAe,EAAE,EAAE;YACnB,eAAe,EAAE,EAAE;SACpB,CAAC;QAEF,qCAAqC;QACrC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtD,OAAO,MAAM,CAAC,CAAC,YAAY;YAC7B,CAAC;YACD,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnF,OAAO,MAAM,CAAC,CAAC,YAAY;YAC7B,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEnE,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACpC,oCAAoC;gBACpC,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEhD,4CAA4C;gBAC5C,0FAA0F;gBAC1F,MAAM,mBAAmB,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEnE,sDAAsD;gBACtD,IAAI,WAAW,IAAI,mBAAmB,EAAE,CAAC;oBACvC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,sDAAsD;YACtD,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1E,MAAM,cAAc,GAAG,QAAQ,CAAC,kBAAkB,IAAI,EAAE,CAAC;YAEzD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;gBAChD,kEAAkE;gBAClE,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnC,SAAS;gBACX,CAAC;gBAED,yCAAyC;gBACzC,MAAM,kBAAkB,GAAG,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;gBAE1E,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACxB,4CAA4C;oBAC5C,OAAO,MAAM,CAAC,CAAC,YAAY;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,QAAQ,CAAC,gBAAgB,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACxG,OAAO,MAAM,CAAC,CAAC,YAAY;QAC7B,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClD,OAAO,MAAM,CAAC,CAAC,YAAY;QAC7B,CAAC;QAED,qFAAqF;QACrF,IAAI,OAA8B,CAAC;QACnC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC7B,CAAC;aAAM,IAAI,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACjF,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAErE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,sBAAsB,CAC5B,KAAgB,EAChB,OAA8B,EAC9B,QAAoC;QAEpC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,uCAAuC;QACvC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,wCAAwC;YACxC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3F,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY;YACtD,KAAK,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;YAClC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,cAAc;QACd,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB;YACxF,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC;YACpC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;gBACjC,KAAK,IAAI,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC1D,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACtB,6DAA6D;gBAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC3F,KAAK,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;YACxC,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,EAAE,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC/C,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY;YAC5E,KAAK,IAAI,OAAO,CAAC,aAAa,GAAG,YAAY,CAAC;YAC9C,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBAC5B,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,+FAA+F;QAC/F,4DAA4D;QAC5D,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5F,MAAM,UAAU,GAAG,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC9D,wEAAwE;YACxE,qEAAqE;YACrE,MAAM,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC;YACpC,KAAK,IAAI,UAAU,CAAC;QACtB,CAAC;QAED,sFAAsF;QACtF,IAAI,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1E,IAAI,uBAAuB,GAAG,CAAC,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;gBAChD,IAAI,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1C,uBAAuB,EAAE,CAAC;gBAC5B,CAAC;YACH,CAAC;YACD,MAAM,UAAU,GAAG,uBAAuB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAChF,uEAAuE;YACvE,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;YAC5C,KAAK,IAAI,UAAU,CAAC;QACtB,CAAC;QAED,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAA8B;QACnD,IAAI,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAE1B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,4BAA4B;YAC5B,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC9D,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;gBACtD,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnE,SAAS;YACX,CAAC;YAED,kBAAkB;YAClB,MAAM,GAAG;gBACP,GAAG,MAAM;gBACT,GAAG,QAAQ,CAAC,SAAS;gBACrB,uBAAuB;gBACvB,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE;gBAC7D,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE;gBAC7D,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE;aACjE,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,IAA6B,EAAE,MAA+B;QACnF,qBAAqB;QACrB,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QAEnF,0DAA0D;QAC1D,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAE7D,6CAA6C;QAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAErD,gEAAgE;QAChE,MAAM,cAAc,GAAG;YACrB,GAAG,IAAI,CAAC,QAAQ;YAChB,GAAG,MAAM,CAAC,QAAQ;SACnB,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;YAC9B,YAAY,EAAE,kBAAkB;YAChC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;YAC9D,OAAO,EAAE,aAAa;YACtB,aAAa,EAAE,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa;YACnF,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe;YAC/D,OAAO,EAAE,aAAa;YACtB,QAAQ,EAAE,cAAc;SACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,sDAAsD;QACtD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmC,CAAC;QAChE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,EAA+B,CAAC;gBACvE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;oBAC5C,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,MAAM,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;YACtC,OAAO,SAAS,GAAG,SAAS,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,gEAAgE;QAChE,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YAEjD,IAAI,CAAC;gBACH,gDAAgD;gBAChD,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACzB,SAAS;gBACX,CAAC;gBAED,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAE/C,+BAA+B;gBAC/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;oBACnC,wCAAwC;oBACxC,MAAM,GAAG,GAAG,GAAG,YAAsB,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;oBAExD,kCAAkC;oBAClC,IAAI,SAAS,GAA4B;wBACvC,EAAE,EAAE,SAAS,CAAC,EAAE;wBAChB,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE;wBACpC,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAsB,CAAC;wBAC3F,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;wBAClE,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI;4BAC5B,gBAAgB,EAAE,IAAI,CAAC,2BAA2B;4BAClD,iBAAiB,EAAE,IAAI,CAAC,2BAA2B,GAAG,CAAC;yBACxD;wBACD,aAAa,EAAE,SAAS,CAAC,aAAa,IAAI,IAAI;wBAC9C,eAAe,EAAE,SAAS,CAAC,eAAe;wBAC1C,OAAO,EAAE,SAAS,CAAC,OAAO;wBAC1B,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,EAAE;qBACnC,CAAC;oBAEF,4CAA4C;oBAC5C,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC1C,IAAI,WAAW,EAAE,CAAC;wBAChB,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;oBAC1D,CAAC;oBAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,6CAA6C;gBAC7C,OAAO,CAAC,KAAK,CAAC,+BAA+B,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;CAEF"}