@ai-orchestration/core 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +129 -5
- package/dist/core/interfaces.d.ts +80 -1
- package/dist/core/interfaces.d.ts.map +1 -1
- package/dist/core/metrics.d.ts +161 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +276 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/orchestrator.d.ts +45 -3
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +271 -11
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/types.d.ts +39 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/factory/index.d.ts.map +1 -1
- package/dist/factory/index.js +27 -7
- package/dist/factory/index.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/cerebras.d.ts.map +1 -1
- package/dist/providers/cerebras.js +22 -4
- package/dist/providers/cerebras.js.map +1 -1
- package/dist/providers/groq.d.ts.map +1 -1
- package/dist/providers/groq.js +22 -4
- package/dist/providers/groq.js.map +1 -1
- package/dist/providers/local.d.ts.map +1 -1
- package/dist/providers/local.js +9 -1
- package/dist/providers/local.js.map +1 -1
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +18 -2
- package/dist/providers/openrouter.js.map +1 -1
- package/docs/CHANGELOG.md +36 -0
- package/examples/README.md +205 -0
- package/examples/basic.ts +51 -17
- package/examples/chat-app/config.json +20 -1
- package/examples/chat-app/index.ts +41 -2
- package/examples/config.example.json +26 -4
- package/examples/language.ts +160 -0
- package/examples/metrics.ts +150 -0
- package/examples/strategies.ts +4 -2
- package/examples/test-local.ts +6 -6
- package/package.json +6 -2
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics and analytics system for the AI Orchestration Framework
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Metrics collector for tracking orchestrator usage
|
|
6
|
+
*/
|
|
7
|
+
export class MetricsCollector {
|
|
8
|
+
providerMetrics = new Map();
|
|
9
|
+
strategyMetrics = {
|
|
10
|
+
totalSelections: 0,
|
|
11
|
+
selectionsByProvider: new Map(),
|
|
12
|
+
selectionsByStrategy: new Map(),
|
|
13
|
+
averageSelectionTime: 0,
|
|
14
|
+
};
|
|
15
|
+
requestHistory = [];
|
|
16
|
+
callbacks = new Set();
|
|
17
|
+
selectionTimes = [];
|
|
18
|
+
/**
|
|
19
|
+
* Register a callback for metrics events
|
|
20
|
+
*/
|
|
21
|
+
onEvent(callback) {
|
|
22
|
+
this.callbacks.add(callback);
|
|
23
|
+
return () => this.callbacks.delete(callback);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Emit a metrics event
|
|
27
|
+
*/
|
|
28
|
+
emit(event) {
|
|
29
|
+
for (const callback of this.callbacks) {
|
|
30
|
+
try {
|
|
31
|
+
callback(event);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error('Error in metrics callback:', error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Record provider selection
|
|
40
|
+
*/
|
|
41
|
+
recordSelection(provider, strategy, selectionTime) {
|
|
42
|
+
this.getOrCreateProviderMetrics(provider);
|
|
43
|
+
this.strategyMetrics.totalSelections++;
|
|
44
|
+
this.strategyMetrics.selectionsByProvider.set(provider.id, (this.strategyMetrics.selectionsByProvider.get(provider.id) || 0) + 1);
|
|
45
|
+
this.strategyMetrics.selectionsByStrategy.set(strategy, (this.strategyMetrics.selectionsByStrategy.get(strategy) || 0) + 1);
|
|
46
|
+
if (selectionTime !== undefined) {
|
|
47
|
+
this.selectionTimes.push(selectionTime);
|
|
48
|
+
const total = this.selectionTimes.reduce((a, b) => a + b, 0);
|
|
49
|
+
this.strategyMetrics.averageSelectionTime =
|
|
50
|
+
total / this.selectionTimes.length;
|
|
51
|
+
}
|
|
52
|
+
this.emit({
|
|
53
|
+
type: 'provider_selected',
|
|
54
|
+
providerId: provider.id,
|
|
55
|
+
strategy,
|
|
56
|
+
timestamp: new Date(),
|
|
57
|
+
selectionTime,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Record request start
|
|
62
|
+
*/
|
|
63
|
+
recordRequestStart(provider) {
|
|
64
|
+
const metrics = this.getOrCreateProviderMetrics(provider);
|
|
65
|
+
metrics.totalRequests++;
|
|
66
|
+
metrics.lastUsed = new Date();
|
|
67
|
+
this.emit({
|
|
68
|
+
type: 'request_started',
|
|
69
|
+
providerId: provider.id,
|
|
70
|
+
timestamp: new Date(),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Record successful request
|
|
75
|
+
*/
|
|
76
|
+
recordSuccess(provider, response, latency) {
|
|
77
|
+
const metrics = this.getOrCreateProviderMetrics(provider);
|
|
78
|
+
metrics.successfulRequests++;
|
|
79
|
+
metrics.lastSuccess = new Date();
|
|
80
|
+
// Update latency (moving average)
|
|
81
|
+
if (metrics.averageLatency === 0) {
|
|
82
|
+
metrics.averageLatency = latency;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
metrics.averageLatency =
|
|
86
|
+
metrics.averageLatency * 0.9 + latency * 0.1; // Exponential moving average
|
|
87
|
+
}
|
|
88
|
+
// Update token counts
|
|
89
|
+
if (response.usage) {
|
|
90
|
+
metrics.totalTokens.prompt += response.usage.promptTokens;
|
|
91
|
+
metrics.totalTokens.completion += response.usage.completionTokens;
|
|
92
|
+
metrics.totalTokens.total += response.usage.totalTokens;
|
|
93
|
+
// Calculate cost if costPerToken is available
|
|
94
|
+
if (provider.metadata.costPerToken) {
|
|
95
|
+
const cost = response.usage.promptTokens *
|
|
96
|
+
provider.metadata.costPerToken.prompt +
|
|
97
|
+
response.usage.completionTokens *
|
|
98
|
+
provider.metadata.costPerToken.completion;
|
|
99
|
+
metrics.totalCost += cost;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Record in history
|
|
103
|
+
this.requestHistory.push({
|
|
104
|
+
timestamp: new Date(),
|
|
105
|
+
providerId: provider.id,
|
|
106
|
+
success: true,
|
|
107
|
+
latency,
|
|
108
|
+
tokens: response.usage
|
|
109
|
+
? {
|
|
110
|
+
prompt: response.usage.promptTokens,
|
|
111
|
+
completion: response.usage.completionTokens,
|
|
112
|
+
total: response.usage.totalTokens,
|
|
113
|
+
}
|
|
114
|
+
: undefined,
|
|
115
|
+
cost: provider.metadata.costPerToken && response.usage
|
|
116
|
+
? response.usage.promptTokens *
|
|
117
|
+
provider.metadata.costPerToken.prompt +
|
|
118
|
+
response.usage.completionTokens *
|
|
119
|
+
provider.metadata.costPerToken.completion
|
|
120
|
+
: undefined,
|
|
121
|
+
});
|
|
122
|
+
this.emit({
|
|
123
|
+
type: 'request_success',
|
|
124
|
+
providerId: provider.id,
|
|
125
|
+
response,
|
|
126
|
+
latency,
|
|
127
|
+
timestamp: new Date(),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Record failed request
|
|
132
|
+
*/
|
|
133
|
+
recordFailure(provider, error, latency) {
|
|
134
|
+
const metrics = this.getOrCreateProviderMetrics(provider);
|
|
135
|
+
metrics.failedRequests++;
|
|
136
|
+
metrics.lastFailure = new Date();
|
|
137
|
+
// Record in history
|
|
138
|
+
this.requestHistory.push({
|
|
139
|
+
timestamp: new Date(),
|
|
140
|
+
providerId: provider.id,
|
|
141
|
+
success: false,
|
|
142
|
+
latency: latency || 0,
|
|
143
|
+
});
|
|
144
|
+
this.emit({
|
|
145
|
+
type: 'request_failure',
|
|
146
|
+
providerId: provider.id,
|
|
147
|
+
error,
|
|
148
|
+
latency,
|
|
149
|
+
timestamp: new Date(),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Record health check
|
|
154
|
+
*/
|
|
155
|
+
recordHealthCheck(provider, health) {
|
|
156
|
+
const providerMetrics = this.getOrCreateProviderMetrics(provider);
|
|
157
|
+
providerMetrics.healthHistory.push({
|
|
158
|
+
timestamp: new Date(),
|
|
159
|
+
healthy: health.healthy,
|
|
160
|
+
latency: health.latency,
|
|
161
|
+
});
|
|
162
|
+
// Keep only last 100 health checks
|
|
163
|
+
if (providerMetrics.healthHistory.length > 100) {
|
|
164
|
+
providerMetrics.healthHistory.shift();
|
|
165
|
+
}
|
|
166
|
+
this.emit({
|
|
167
|
+
type: 'health_check',
|
|
168
|
+
providerId: provider.id,
|
|
169
|
+
health,
|
|
170
|
+
timestamp: new Date(),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get or create provider metrics
|
|
175
|
+
*/
|
|
176
|
+
getOrCreateProviderMetrics(provider) {
|
|
177
|
+
let metrics = this.providerMetrics.get(provider.id);
|
|
178
|
+
if (!metrics) {
|
|
179
|
+
metrics = {
|
|
180
|
+
providerId: provider.id,
|
|
181
|
+
providerName: provider.metadata.name,
|
|
182
|
+
model: provider.metadata.model,
|
|
183
|
+
totalRequests: 0,
|
|
184
|
+
successfulRequests: 0,
|
|
185
|
+
failedRequests: 0,
|
|
186
|
+
totalTokens: {
|
|
187
|
+
prompt: 0,
|
|
188
|
+
completion: 0,
|
|
189
|
+
total: 0,
|
|
190
|
+
},
|
|
191
|
+
totalCost: 0,
|
|
192
|
+
averageLatency: 0,
|
|
193
|
+
healthHistory: [],
|
|
194
|
+
};
|
|
195
|
+
this.providerMetrics.set(provider.id, metrics);
|
|
196
|
+
}
|
|
197
|
+
return metrics;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get metrics for a specific provider
|
|
201
|
+
*/
|
|
202
|
+
getProviderMetrics(providerId) {
|
|
203
|
+
return this.providerMetrics.get(providerId);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get all provider metrics
|
|
207
|
+
*/
|
|
208
|
+
getAllProviderMetrics() {
|
|
209
|
+
return new Map(this.providerMetrics);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get strategy metrics
|
|
213
|
+
*/
|
|
214
|
+
getStrategyMetrics() {
|
|
215
|
+
return { ...this.strategyMetrics };
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get overall orchestrator metrics
|
|
219
|
+
*/
|
|
220
|
+
getOrchestratorMetrics() {
|
|
221
|
+
const now = Date.now();
|
|
222
|
+
const oneMinuteAgo = now - 60000;
|
|
223
|
+
const recentRequests = this.requestHistory.filter((r) => r.timestamp.getTime() > oneMinuteAgo);
|
|
224
|
+
const totalRequests = this.requestHistory.length;
|
|
225
|
+
const successfulRequests = this.requestHistory.filter((r) => r.success).length;
|
|
226
|
+
const failedRequests = totalRequests - successfulRequests;
|
|
227
|
+
const totalCost = Array.from(this.providerMetrics.values()).reduce((sum, m) => sum + m.totalCost, 0);
|
|
228
|
+
const totalLatency = this.requestHistory.reduce((sum, r) => sum + r.latency, 0);
|
|
229
|
+
const averageRequestLatency = totalRequests > 0 ? totalLatency / totalRequests : 0;
|
|
230
|
+
return {
|
|
231
|
+
totalRequests,
|
|
232
|
+
successfulRequests,
|
|
233
|
+
failedRequests,
|
|
234
|
+
totalCost,
|
|
235
|
+
providerMetrics: new Map(this.providerMetrics),
|
|
236
|
+
strategyMetrics: { ...this.strategyMetrics },
|
|
237
|
+
averageRequestLatency,
|
|
238
|
+
requestsPerMinute: recentRequests.length,
|
|
239
|
+
errorRate: totalRequests > 0 ? failedRequests / totalRequests : 0,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Reset all metrics
|
|
244
|
+
*/
|
|
245
|
+
reset() {
|
|
246
|
+
this.providerMetrics.clear();
|
|
247
|
+
this.strategyMetrics = {
|
|
248
|
+
totalSelections: 0,
|
|
249
|
+
selectionsByProvider: new Map(),
|
|
250
|
+
selectionsByStrategy: new Map(),
|
|
251
|
+
averageSelectionTime: 0,
|
|
252
|
+
};
|
|
253
|
+
this.requestHistory = [];
|
|
254
|
+
this.selectionTimes = [];
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get request history (optionally filtered)
|
|
258
|
+
*/
|
|
259
|
+
getRequestHistory(options) {
|
|
260
|
+
let filtered = [...this.requestHistory];
|
|
261
|
+
if (options?.providerId) {
|
|
262
|
+
filtered = filtered.filter((r) => r.providerId === options.providerId);
|
|
263
|
+
}
|
|
264
|
+
if (options?.startTime) {
|
|
265
|
+
filtered = filtered.filter((r) => r.timestamp >= options.startTime);
|
|
266
|
+
}
|
|
267
|
+
if (options?.endTime) {
|
|
268
|
+
filtered = filtered.filter((r) => r.timestamp <= options.endTime);
|
|
269
|
+
}
|
|
270
|
+
if (options?.limit) {
|
|
271
|
+
filtered = filtered.slice(-options.limit);
|
|
272
|
+
}
|
|
273
|
+
return filtered;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core orchestrator that manages providers and strategies
|
|
3
3
|
*/
|
|
4
|
-
import type { AIService, SelectionStrategy, SelectionContext, ChatMessage, ChatOptions, ChatResponse, ChatChunk } from './interfaces.js';
|
|
4
|
+
import type { AIService, SelectionStrategy, SelectionContext, ChatMessage, ChatOptions, ChatResponse, ChatChunk, CircuitBreakerConfig, HealthCheckConfig } from './interfaces.js';
|
|
5
|
+
import { MetricsCollector, type MetricsCallback } from './metrics.js';
|
|
5
6
|
export declare class Orchestrator {
|
|
6
7
|
private providers;
|
|
7
8
|
private strategy;
|
|
8
9
|
private healthCheckInterval?;
|
|
9
|
-
|
|
10
|
+
private maxRetries;
|
|
11
|
+
private requestTimeout;
|
|
12
|
+
private retryDelay;
|
|
13
|
+
private circuitBreaker?;
|
|
14
|
+
private circuitBreakerStates;
|
|
15
|
+
private healthCheckConfig?;
|
|
16
|
+
private providerFailureCounts;
|
|
17
|
+
private metrics;
|
|
18
|
+
private strategyName;
|
|
19
|
+
constructor(strategy: SelectionStrategy, options?: {
|
|
20
|
+
maxRetries?: number;
|
|
21
|
+
requestTimeout?: number;
|
|
22
|
+
retryDelay?: number | 'exponential';
|
|
23
|
+
circuitBreaker?: CircuitBreakerConfig;
|
|
24
|
+
healthCheck?: HealthCheckConfig;
|
|
25
|
+
enableMetrics?: boolean;
|
|
26
|
+
onMetricsEvent?: MetricsCallback;
|
|
27
|
+
});
|
|
10
28
|
/**
|
|
11
29
|
* Register a provider
|
|
12
30
|
*/
|
|
@@ -23,6 +41,18 @@ export declare class Orchestrator {
|
|
|
23
41
|
* Get all registered providers
|
|
24
42
|
*/
|
|
25
43
|
getAllProviders(): AIService[];
|
|
44
|
+
/**
|
|
45
|
+
* Check if a provider's circuit breaker is open
|
|
46
|
+
*/
|
|
47
|
+
private isCircuitBreakerOpen;
|
|
48
|
+
/**
|
|
49
|
+
* Record a provider failure for circuit breaker
|
|
50
|
+
*/
|
|
51
|
+
private recordFailure;
|
|
52
|
+
/**
|
|
53
|
+
* Record a provider success (reset circuit breaker)
|
|
54
|
+
*/
|
|
55
|
+
private recordSuccess;
|
|
26
56
|
/**
|
|
27
57
|
* Get enabled providers (those that pass basic checks)
|
|
28
58
|
*/
|
|
@@ -31,6 +61,10 @@ export declare class Orchestrator {
|
|
|
31
61
|
* Select a provider using the configured strategy
|
|
32
62
|
*/
|
|
33
63
|
selectProvider(context?: SelectionContext): Promise<AIService | null>;
|
|
64
|
+
/**
|
|
65
|
+
* Calculate retry delay based on attempt number
|
|
66
|
+
*/
|
|
67
|
+
private getRetryDelay;
|
|
34
68
|
/**
|
|
35
69
|
* Perform a chat completion with automatic provider selection and fallback
|
|
36
70
|
*/
|
|
@@ -42,11 +76,19 @@ export declare class Orchestrator {
|
|
|
42
76
|
/**
|
|
43
77
|
* Start periodic health checks
|
|
44
78
|
*/
|
|
45
|
-
startHealthChecks(intervalMs
|
|
79
|
+
startHealthChecks(intervalMs?: number): void;
|
|
46
80
|
/**
|
|
47
81
|
* Stop periodic health checks
|
|
48
82
|
*/
|
|
49
83
|
stopHealthChecks(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Get metrics collector instance
|
|
86
|
+
*/
|
|
87
|
+
getMetrics(): MetricsCollector;
|
|
88
|
+
/**
|
|
89
|
+
* Register a callback for metrics events
|
|
90
|
+
*/
|
|
91
|
+
onMetricsEvent(callback: MetricsCallback): () => void;
|
|
50
92
|
/**
|
|
51
93
|
* Cleanup resources
|
|
52
94
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AA+FtE,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,mBAAmB,CAAC,CAAiC;IAC7D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,cAAc,CAAC,CAAuB;IAC9C,OAAO,CAAC,oBAAoB,CAA+C;IAC3E,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,qBAAqB,CAAkC;IAC/D,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,YAAY,CAAS;gBAG3B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;QACpC,cAAc,CAAC,EAAE,oBAAoB,CAAC;QACtC,WAAW,CAAC,EAAE,iBAAiB,CAAC;QAChC,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,cAAc,CAAC,EAAE,eAAe,CAAC;KAClC;IAoBH;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAI3C;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI9C;;OAEG;IACH,eAAe,IAAI,SAAS,EAAE;IAI9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAwDnD;;OAEG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAc3E;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACG,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,CAAC;IAqExB;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IA+CrC;;OAEG;IACH,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAqC5C;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAOxB;;OAEG;IACH,UAAU,IAAI,gBAAgB;IAI9B;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI;IAIrD;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|