@vorionsys/atsf-core 0.2.0 → 0.2.2

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 (215) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +190 -0
  3. package/README.md +305 -181
  4. package/dist/api/server.d.ts.map +1 -1
  5. package/dist/api/server.js +86 -4
  6. package/dist/api/server.js.map +1 -1
  7. package/dist/basis/parser.d.ts +210 -210
  8. package/dist/basis/parser.js.map +1 -1
  9. package/dist/chain/index.d.ts +147 -0
  10. package/dist/chain/index.d.ts.map +1 -0
  11. package/dist/chain/index.js +219 -0
  12. package/dist/chain/index.js.map +1 -0
  13. package/dist/common/adapters.d.ts +9 -9
  14. package/dist/common/adapters.d.ts.map +1 -1
  15. package/dist/common/adapters.js +6 -6
  16. package/dist/common/config.d.ts +152 -152
  17. package/dist/common/types.d.ts +35 -15
  18. package/dist/common/types.d.ts.map +1 -1
  19. package/dist/common/types.js.map +1 -1
  20. package/dist/enforce/index.d.ts +226 -16
  21. package/dist/enforce/index.d.ts.map +1 -1
  22. package/dist/enforce/index.js +196 -49
  23. package/dist/enforce/index.js.map +1 -1
  24. package/dist/governance/index.d.ts +2 -0
  25. package/dist/governance/index.d.ts.map +1 -1
  26. package/dist/governance/index.js +1 -0
  27. package/dist/governance/index.js.map +1 -1
  28. package/dist/governance/proof-bridge.d.ts +86 -0
  29. package/dist/governance/proof-bridge.d.ts.map +1 -0
  30. package/dist/governance/proof-bridge.js +139 -0
  31. package/dist/governance/proof-bridge.js.map +1 -0
  32. package/dist/index.d.ts +11 -4
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +17 -4
  35. package/dist/index.js.map +1 -1
  36. package/dist/intent/index.d.ts +127 -10
  37. package/dist/intent/index.d.ts.map +1 -1
  38. package/dist/intent/index.js +121 -16
  39. package/dist/intent/index.js.map +1 -1
  40. package/dist/langchain/executor.d.ts +19 -5
  41. package/dist/langchain/executor.d.ts.map +1 -1
  42. package/dist/langchain/executor.js +287 -36
  43. package/dist/langchain/executor.js.map +1 -1
  44. package/dist/langchain/index.d.ts +2 -1
  45. package/dist/langchain/index.d.ts.map +1 -1
  46. package/dist/langchain/index.js +3 -1
  47. package/dist/langchain/index.js.map +1 -1
  48. package/dist/langchain/tools.d.ts.map +1 -1
  49. package/dist/langchain/tools.js +2 -1
  50. package/dist/langchain/tools.js.map +1 -1
  51. package/dist/langchain/types.d.ts +41 -0
  52. package/dist/langchain/types.d.ts.map +1 -1
  53. package/dist/layers/index.d.ts +1 -1
  54. package/dist/layers/index.d.ts.map +1 -1
  55. package/dist/persistence/file.d.ts +35 -3
  56. package/dist/persistence/file.d.ts.map +1 -1
  57. package/dist/persistence/file.js +138 -11
  58. package/dist/persistence/file.js.map +1 -1
  59. package/dist/persistence/index.d.ts +10 -1
  60. package/dist/persistence/index.d.ts.map +1 -1
  61. package/dist/persistence/index.js +15 -1
  62. package/dist/persistence/index.js.map +1 -1
  63. package/dist/persistence/sqlite.d.ts +135 -0
  64. package/dist/persistence/sqlite.d.ts.map +1 -0
  65. package/dist/persistence/sqlite.js +372 -0
  66. package/dist/persistence/sqlite.js.map +1 -0
  67. package/dist/phase6/ceiling.d.ts +177 -0
  68. package/dist/phase6/ceiling.d.ts.map +1 -0
  69. package/dist/phase6/ceiling.js +463 -0
  70. package/dist/phase6/ceiling.js.map +1 -0
  71. package/dist/phase6/context.d.ts +207 -0
  72. package/dist/phase6/context.d.ts.map +1 -0
  73. package/dist/phase6/context.js +603 -0
  74. package/dist/phase6/context.js.map +1 -0
  75. package/dist/phase6/index.d.ts +79 -0
  76. package/dist/phase6/index.d.ts.map +1 -0
  77. package/dist/phase6/index.js +152 -0
  78. package/dist/phase6/index.js.map +1 -0
  79. package/dist/phase6/presets.d.ts +148 -0
  80. package/dist/phase6/presets.d.ts.map +1 -0
  81. package/dist/phase6/presets.js +467 -0
  82. package/dist/phase6/presets.js.map +1 -0
  83. package/dist/phase6/provenance.d.ts +148 -0
  84. package/dist/phase6/provenance.d.ts.map +1 -0
  85. package/dist/phase6/provenance.js +545 -0
  86. package/dist/phase6/provenance.js.map +1 -0
  87. package/dist/phase6/role-gates/index.d.ts +7 -0
  88. package/dist/phase6/role-gates/index.d.ts.map +1 -0
  89. package/dist/phase6/role-gates/index.js +7 -0
  90. package/dist/phase6/role-gates/index.js.map +1 -0
  91. package/dist/phase6/role-gates/kernel.d.ts +84 -0
  92. package/dist/phase6/role-gates/kernel.d.ts.map +1 -0
  93. package/dist/phase6/role-gates/kernel.js +258 -0
  94. package/dist/phase6/role-gates/kernel.js.map +1 -0
  95. package/dist/phase6/role-gates/policy.d.ts +110 -0
  96. package/dist/phase6/role-gates/policy.d.ts.map +1 -0
  97. package/dist/phase6/role-gates/policy.js +157 -0
  98. package/dist/phase6/role-gates/policy.js.map +1 -0
  99. package/dist/phase6/role-gates.d.ts +164 -0
  100. package/dist/phase6/role-gates.d.ts.map +1 -0
  101. package/dist/phase6/role-gates.js +536 -0
  102. package/dist/phase6/role-gates.js.map +1 -0
  103. package/dist/phase6/types.d.ts +1829 -0
  104. package/dist/phase6/types.d.ts.map +1 -0
  105. package/dist/phase6/types.js +452 -0
  106. package/dist/phase6/types.js.map +1 -0
  107. package/dist/phase6/weight-presets/canonical.d.ts +93 -0
  108. package/dist/phase6/weight-presets/canonical.d.ts.map +1 -0
  109. package/dist/phase6/weight-presets/canonical.js +122 -0
  110. package/dist/phase6/weight-presets/canonical.js.map +1 -0
  111. package/dist/phase6/weight-presets/deltas.d.ts +144 -0
  112. package/dist/phase6/weight-presets/deltas.d.ts.map +1 -0
  113. package/dist/phase6/weight-presets/deltas.js +184 -0
  114. package/dist/phase6/weight-presets/deltas.js.map +1 -0
  115. package/dist/phase6/weight-presets/index.d.ts +8 -0
  116. package/dist/phase6/weight-presets/index.d.ts.map +1 -0
  117. package/dist/phase6/weight-presets/index.js +8 -0
  118. package/dist/phase6/weight-presets/index.js.map +1 -0
  119. package/dist/phase6/weight-presets/merger.d.ts +79 -0
  120. package/dist/phase6/weight-presets/merger.d.ts.map +1 -0
  121. package/dist/phase6/weight-presets/merger.js +161 -0
  122. package/dist/phase6/weight-presets/merger.js.map +1 -0
  123. package/dist/proof/index.d.ts +6 -0
  124. package/dist/proof/index.d.ts.map +1 -1
  125. package/dist/proof/index.js +56 -6
  126. package/dist/proof/index.js.map +1 -1
  127. package/dist/proof/merkle.d.ts +195 -0
  128. package/dist/proof/merkle.d.ts.map +1 -0
  129. package/dist/proof/merkle.js +412 -0
  130. package/dist/proof/merkle.js.map +1 -0
  131. package/dist/proof/zk-proofs.d.ts +218 -0
  132. package/dist/proof/zk-proofs.d.ts.map +1 -0
  133. package/dist/proof/zk-proofs.js +531 -0
  134. package/dist/proof/zk-proofs.js.map +1 -0
  135. package/dist/sandbox-training/challenges.d.ts +16 -0
  136. package/dist/sandbox-training/challenges.d.ts.map +1 -0
  137. package/dist/sandbox-training/challenges.js +561 -0
  138. package/dist/sandbox-training/challenges.js.map +1 -0
  139. package/dist/sandbox-training/graduation.d.ts +25 -0
  140. package/dist/sandbox-training/graduation.d.ts.map +1 -0
  141. package/dist/sandbox-training/graduation.js +143 -0
  142. package/dist/sandbox-training/graduation.js.map +1 -0
  143. package/dist/sandbox-training/index.d.ts +19 -0
  144. package/dist/sandbox-training/index.d.ts.map +1 -0
  145. package/dist/sandbox-training/index.js +22 -0
  146. package/dist/sandbox-training/index.js.map +1 -0
  147. package/dist/sandbox-training/promotion-service.d.ts +76 -0
  148. package/dist/sandbox-training/promotion-service.d.ts.map +1 -0
  149. package/dist/sandbox-training/promotion-service.js +117 -0
  150. package/dist/sandbox-training/promotion-service.js.map +1 -0
  151. package/dist/sandbox-training/runner.d.ts +58 -0
  152. package/dist/sandbox-training/runner.d.ts.map +1 -0
  153. package/dist/sandbox-training/runner.js +388 -0
  154. package/dist/sandbox-training/runner.js.map +1 -0
  155. package/dist/sandbox-training/scorer.d.ts +40 -0
  156. package/dist/sandbox-training/scorer.d.ts.map +1 -0
  157. package/dist/sandbox-training/scorer.js +79 -0
  158. package/dist/sandbox-training/scorer.js.map +1 -0
  159. package/dist/sandbox-training/types.d.ts +162 -0
  160. package/dist/sandbox-training/types.d.ts.map +1 -0
  161. package/dist/sandbox-training/types.js +32 -0
  162. package/dist/sandbox-training/types.js.map +1 -0
  163. package/dist/trust-engine/ceiling-enforcement/audit.d.ts +98 -0
  164. package/dist/trust-engine/ceiling-enforcement/audit.d.ts.map +1 -0
  165. package/dist/trust-engine/ceiling-enforcement/audit.js +160 -0
  166. package/dist/trust-engine/ceiling-enforcement/audit.js.map +1 -0
  167. package/dist/trust-engine/ceiling-enforcement/index.d.ts +6 -0
  168. package/dist/trust-engine/ceiling-enforcement/index.d.ts.map +1 -0
  169. package/dist/trust-engine/ceiling-enforcement/index.js +6 -0
  170. package/dist/trust-engine/ceiling-enforcement/index.js.map +1 -0
  171. package/dist/trust-engine/ceiling-enforcement/kernel.d.ts +112 -0
  172. package/dist/trust-engine/ceiling-enforcement/kernel.d.ts.map +1 -0
  173. package/dist/trust-engine/ceiling-enforcement/kernel.js +158 -0
  174. package/dist/trust-engine/ceiling-enforcement/kernel.js.map +1 -0
  175. package/dist/trust-engine/context-policy/enforcement.d.ts +62 -0
  176. package/dist/trust-engine/context-policy/enforcement.d.ts.map +1 -0
  177. package/dist/trust-engine/context-policy/enforcement.js +104 -0
  178. package/dist/trust-engine/context-policy/enforcement.js.map +1 -0
  179. package/dist/trust-engine/context-policy/factory.d.ts +75 -0
  180. package/dist/trust-engine/context-policy/factory.d.ts.map +1 -0
  181. package/dist/trust-engine/context-policy/factory.js +130 -0
  182. package/dist/trust-engine/context-policy/factory.js.map +1 -0
  183. package/dist/trust-engine/context-policy/index.d.ts +6 -0
  184. package/dist/trust-engine/context-policy/index.d.ts.map +1 -0
  185. package/dist/trust-engine/context-policy/index.js +6 -0
  186. package/dist/trust-engine/context-policy/index.js.map +1 -0
  187. package/dist/trust-engine/creation-modifiers/index.d.ts +5 -0
  188. package/dist/trust-engine/creation-modifiers/index.d.ts.map +1 -0
  189. package/dist/trust-engine/creation-modifiers/index.js +5 -0
  190. package/dist/trust-engine/creation-modifiers/index.js.map +1 -0
  191. package/dist/trust-engine/creation-modifiers/types.d.ts +112 -0
  192. package/dist/trust-engine/creation-modifiers/types.d.ts.map +1 -0
  193. package/dist/trust-engine/creation-modifiers/types.js +166 -0
  194. package/dist/trust-engine/creation-modifiers/types.js.map +1 -0
  195. package/dist/trust-engine/index.d.ts +54 -1
  196. package/dist/trust-engine/index.d.ts.map +1 -1
  197. package/dist/trust-engine/index.js +118 -1
  198. package/dist/trust-engine/index.js.map +1 -1
  199. package/dist/trust-engine/phase6-types.d.ts +123 -0
  200. package/dist/trust-engine/phase6-types.d.ts.map +1 -0
  201. package/dist/trust-engine/phase6-types.js +88 -0
  202. package/dist/trust-engine/phase6-types.js.map +1 -0
  203. package/package.json +42 -12
  204. package/dist/audit/key-manager.d.ts +0 -118
  205. package/dist/audit/key-manager.d.ts.map +0 -1
  206. package/dist/audit/key-manager.js +0 -565
  207. package/dist/audit/key-manager.js.map +0 -1
  208. package/dist/carbon-aware/carbon-metrics.d.ts +0 -151
  209. package/dist/carbon-aware/carbon-metrics.d.ts.map +0 -1
  210. package/dist/carbon-aware/carbon-metrics.js +0 -370
  211. package/dist/carbon-aware/carbon-metrics.js.map +0 -1
  212. package/dist/carbon-aware/carbon-router.d.ts +0 -101
  213. package/dist/carbon-aware/carbon-router.d.ts.map +0 -1
  214. package/dist/carbon-aware/carbon-router.js +0 -400
  215. package/dist/carbon-aware/carbon-router.js.map +0 -1
@@ -1,400 +0,0 @@
1
- /**
2
- * Carbon-Aware Router
3
- *
4
- * Routes AI requests to lower-carbon regions when possible, considering
5
- * provider availability, latency requirements, and cost constraints.
6
- *
7
- * @packageDocumentation
8
- */
9
- import { EventEmitter } from 'events';
10
- import { createLogger } from '../common/logger.js';
11
- import { createCarbonIntensityClient } from './carbon-intensity-client.js';
12
- import { createCarbonMetrics } from './carbon-metrics.js';
13
- import { DEFAULT_PROVIDER_AVAILABILITY, DEFAULT_REGION_LATENCIES, DEFAULT_COST_MULTIPLIERS, ENERGY_PER_1000_TOKENS_KWH, } from './types.js';
14
- const logger = createLogger({ component: 'carbon-router' });
15
- /**
16
- * Default routing constraints
17
- */
18
- const DEFAULT_CONSTRAINTS = {
19
- maxLatencyMs: 500,
20
- maxCostMultiplier: 1.5,
21
- preferGreen: true,
22
- };
23
- /**
24
- * Carbon-Aware Router
25
- *
26
- * Intelligently routes AI requests to minimize carbon footprint while
27
- * respecting performance and cost constraints.
28
- */
29
- export class CarbonRouter extends EventEmitter {
30
- _client;
31
- _metrics;
32
- _defaultConstraints;
33
- _providerAvailability;
34
- _regionLatencies;
35
- _costMultipliers;
36
- _enableMetrics;
37
- constructor(config = {}) {
38
- super();
39
- this._client = config.clientConfig
40
- ? createCarbonIntensityClient(config.clientConfig)
41
- : createCarbonIntensityClient({ useMockData: true });
42
- this._metrics = createCarbonMetrics();
43
- this._defaultConstraints = { ...DEFAULT_CONSTRAINTS, ...config.defaultConstraints };
44
- this._enableMetrics = config.enableMetrics ?? true;
45
- // Initialize provider configuration
46
- this._providerAvailability = config.providerConfig?.availability ?? this.createDefaultAvailability();
47
- this._regionLatencies = config.providerConfig?.defaultLatencies ?? new Map(Object.entries(DEFAULT_REGION_LATENCIES));
48
- this._costMultipliers = config.providerConfig?.costMultipliers ?? new Map(Object.entries(DEFAULT_COST_MULTIPLIERS));
49
- // Forward client events to metrics
50
- if (this._enableMetrics) {
51
- this._client.on('carbon:*', (event) => this._metrics.emit(event.type, event));
52
- }
53
- }
54
- /**
55
- * Get the carbon intensity client
56
- */
57
- get client() {
58
- return this._client;
59
- }
60
- /**
61
- * Get the metrics collector
62
- */
63
- get metrics() {
64
- return this._metrics;
65
- }
66
- /**
67
- * Route a request to the optimal region based on carbon intensity
68
- */
69
- async route(request) {
70
- const constraints = { ...this._defaultConstraints, ...request.constraints };
71
- const startTime = Date.now();
72
- logger.debug({ requestId: request.requestId, constraints }, 'Routing request');
73
- // If required region is specified, use it directly
74
- if (constraints.requiredRegion) {
75
- return this.routeToRequired(request, constraints);
76
- }
77
- // Get carbon intensities for all regions
78
- const intensities = await this._client.getAllIntensities();
79
- // Get eligible routes (filtered by constraints)
80
- const eligibleRoutes = this.getEligibleRoutes(intensities, constraints);
81
- if (eligibleRoutes.length === 0) {
82
- logger.warn({ requestId: request.requestId }, 'No eligible routes found, using fallback');
83
- return this.routeFallback(request, intensities);
84
- }
85
- // Sort by carbon intensity (lowest first)
86
- eligibleRoutes.sort((a, b) => a.carbonIntensity - b.carbonIntensity);
87
- // Select the best route
88
- const bestRoute = eligibleRoutes[0];
89
- const alternatives = eligibleRoutes.slice(1, 4).map(r => this.toAlternativeRoute(r));
90
- // Calculate CO2 savings
91
- const highestIntensity = Math.max(...Array.from(intensities.values()).map(i => i.intensity));
92
- const estimatedCO2Grams = this.calculateCO2(bestRoute.carbonIntensity, request.estimatedTokens ?? 1000);
93
- const baselineCO2Grams = this.calculateCO2(highestIntensity, request.estimatedTokens ?? 1000);
94
- const savingsGrams = baselineCO2Grams - estimatedCO2Grams;
95
- const decision = {
96
- id: `route-${Date.now()}-${Math.random().toString(36).substring(7)}`,
97
- provider: bestRoute.provider,
98
- region: bestRoute.region,
99
- carbonIntensity: intensities.get(bestRoute.region),
100
- estimatedLatencyMs: bestRoute.latencyMs,
101
- costMultiplier: bestRoute.costMultiplier,
102
- reason: this.determineReason(bestRoute, constraints),
103
- alternatives,
104
- estimatedCO2SavingsGrams: Math.max(0, savingsGrams),
105
- decidedAt: new Date().toISOString(),
106
- };
107
- // Record metrics
108
- if (this._enableMetrics) {
109
- this.emitRoutedEvent(request, decision);
110
- this._metrics.recordRouting(decision, request.estimatedTokens ?? 1000);
111
- }
112
- const routingTimeMs = Date.now() - startTime;
113
- logger.info({
114
- requestId: request.requestId,
115
- region: decision.region,
116
- provider: decision.provider,
117
- carbonIntensity: decision.carbonIntensity.intensity,
118
- savingsGrams: decision.estimatedCO2SavingsGrams,
119
- routingTimeMs,
120
- }, 'Request routed');
121
- return decision;
122
- }
123
- /**
124
- * Get the best provider for a specific region
125
- */
126
- async getProviderForRegion(region, preferredProviders) {
127
- const availability = this._providerAvailability.get(region);
128
- if (!availability || availability.length === 0) {
129
- return undefined;
130
- }
131
- // Filter to available providers
132
- const available = availability.filter(a => a.available);
133
- if (available.length === 0) {
134
- return undefined;
135
- }
136
- // If preferred providers specified, try them first
137
- if (preferredProviders && preferredProviders.length > 0) {
138
- for (const preferred of preferredProviders) {
139
- const match = available.find(a => a.provider === preferred);
140
- if (match) {
141
- return match.provider;
142
- }
143
- }
144
- }
145
- // Return first available
146
- return available[0].provider;
147
- }
148
- /**
149
- * Get carbon intensity for all regions
150
- */
151
- async getRegionIntensities() {
152
- return this._client.getAllIntensities();
153
- }
154
- /**
155
- * Get the lowest carbon regions
156
- */
157
- async getGreenRegions(count = 3) {
158
- return this._client.getLowestCarbonRegions(count);
159
- }
160
- /**
161
- * Check if a region meets carbon constraints
162
- */
163
- async isGreenRegion(region, maxIntensity) {
164
- const intensity = await this._client.getIntensity(region);
165
- const threshold = maxIntensity ?? 150; // Default to "low" carbon threshold
166
- return intensity.intensity <= threshold;
167
- }
168
- /**
169
- * Update provider availability
170
- */
171
- updateProviderAvailability(region, provider, available) {
172
- const existing = this._providerAvailability.get(region);
173
- if (existing) {
174
- const providerEntry = existing.find(p => p.provider === provider);
175
- if (providerEntry) {
176
- providerEntry.available = available;
177
- logger.info({ region, provider, available }, 'Provider availability updated');
178
- }
179
- }
180
- }
181
- /**
182
- * Calculate estimated CO2 for a request
183
- */
184
- calculateCO2(intensityGCO2, tokens) {
185
- // Energy (kWh) = tokens / 1000 * ENERGY_PER_1000_TOKENS_KWH
186
- // CO2 (grams) = Energy * intensity (gCO2/kWh)
187
- const energyKWh = (tokens / 1000) * ENERGY_PER_1000_TOKENS_KWH;
188
- return energyKWh * intensityGCO2;
189
- }
190
- /**
191
- * Close the router and release resources
192
- */
193
- async close() {
194
- this._client.removeAllListeners();
195
- this._metrics.removeAllListeners();
196
- this.removeAllListeners();
197
- logger.info('Carbon router closed');
198
- }
199
- /**
200
- * Route to a required region
201
- */
202
- async routeToRequired(request, constraints) {
203
- const region = constraints.requiredRegion;
204
- const intensity = await this._client.getIntensity(region);
205
- const provider = await this.getProviderForRegion(region, constraints.preferredProviders);
206
- if (!provider) {
207
- throw new Error(`No provider available in required region: ${region}`);
208
- }
209
- const decision = {
210
- id: `route-${Date.now()}-${Math.random().toString(36).substring(7)}`,
211
- provider,
212
- region,
213
- carbonIntensity: intensity,
214
- estimatedLatencyMs: this._regionLatencies.get(region) ?? 100,
215
- costMultiplier: this._costMultipliers.get(region) ?? 1.0,
216
- reason: 'required_region',
217
- alternatives: [],
218
- estimatedCO2SavingsGrams: 0,
219
- decidedAt: new Date().toISOString(),
220
- };
221
- if (this._enableMetrics) {
222
- this.emitRoutedEvent(request, decision);
223
- this._metrics.recordRouting(decision, request.estimatedTokens ?? 1000);
224
- }
225
- return decision;
226
- }
227
- /**
228
- * Route using fallback when no eligible routes found
229
- */
230
- async routeFallback(request, intensities) {
231
- // Find any available region/provider combination
232
- const providerEntries = Array.from(this._providerAvailability.entries());
233
- for (const [region, availability] of providerEntries) {
234
- const available = availability.find(a => a.available);
235
- if (available) {
236
- const intensity = intensities.get(region) ?? await this._client.getIntensity(region);
237
- const decision = {
238
- id: `route-${Date.now()}-${Math.random().toString(36).substring(7)}`,
239
- provider: available.provider,
240
- region,
241
- carbonIntensity: intensity,
242
- estimatedLatencyMs: this._regionLatencies.get(region) ?? 100,
243
- costMultiplier: this._costMultipliers.get(region) ?? 1.0,
244
- reason: 'fallback',
245
- alternatives: [],
246
- estimatedCO2SavingsGrams: 0,
247
- decidedAt: new Date().toISOString(),
248
- };
249
- if (this._enableMetrics) {
250
- this.emitRoutedEvent(request, decision);
251
- this._metrics.recordRouting(decision, request.estimatedTokens ?? 1000);
252
- }
253
- return decision;
254
- }
255
- }
256
- throw new Error('No providers available in any region');
257
- }
258
- /**
259
- * Get eligible routes based on constraints
260
- */
261
- getEligibleRoutes(intensities, constraints) {
262
- const routes = [];
263
- const intensityEntries = Array.from(intensities.entries());
264
- for (const [region, intensity] of intensityEntries) {
265
- // Check carbon intensity constraint
266
- if (constraints.maxCarbonIntensity && intensity.intensity > constraints.maxCarbonIntensity) {
267
- continue;
268
- }
269
- // Check renewable percentage constraint
270
- if (constraints.minRenewablePercentage && intensity.renewablePercentage !== undefined) {
271
- if (intensity.renewablePercentage < constraints.minRenewablePercentage) {
272
- continue;
273
- }
274
- }
275
- // Check latency constraint
276
- const latency = this._regionLatencies.get(region) ?? 200;
277
- if (constraints.maxLatencyMs && latency > constraints.maxLatencyMs) {
278
- continue;
279
- }
280
- // Check cost constraint
281
- const cost = this._costMultipliers.get(region) ?? 1.0;
282
- if (constraints.maxCostMultiplier && cost > constraints.maxCostMultiplier) {
283
- continue;
284
- }
285
- // Get available providers
286
- const availability = this._providerAvailability.get(region);
287
- if (!availability)
288
- continue;
289
- const availableProviders = availability.filter(a => a.available);
290
- if (availableProviders.length === 0)
291
- continue;
292
- // Filter by preferred providers if specified
293
- let selectedProvider;
294
- if (constraints.preferredProviders && constraints.preferredProviders.length > 0) {
295
- for (const preferred of constraints.preferredProviders) {
296
- selectedProvider = availableProviders.find(a => a.provider === preferred);
297
- if (selectedProvider)
298
- break;
299
- }
300
- // Skip this region if no preferred provider is available
301
- if (!selectedProvider) {
302
- continue;
303
- }
304
- }
305
- else {
306
- // Use first available if no preferred providers specified
307
- selectedProvider = availableProviders[0];
308
- }
309
- if (selectedProvider) {
310
- routes.push({
311
- region,
312
- provider: selectedProvider.provider,
313
- carbonIntensity: intensity.intensity,
314
- latencyMs: selectedProvider.latencyMs ?? latency,
315
- costMultiplier: selectedProvider.costMultiplier ?? cost,
316
- renewablePercentage: intensity.renewablePercentage,
317
- });
318
- }
319
- }
320
- return routes;
321
- }
322
- /**
323
- * Determine routing reason
324
- */
325
- determineReason(route, constraints) {
326
- // Check if this is the lowest carbon option
327
- if (route.carbonIntensity <= 50) {
328
- return 'lowest_carbon';
329
- }
330
- // Check if renewable preference was a factor
331
- if (constraints.minRenewablePercentage && route.renewablePercentage) {
332
- if (route.renewablePercentage >= constraints.minRenewablePercentage) {
333
- return 'renewable_preference';
334
- }
335
- }
336
- // Check if latency was the primary factor
337
- if (constraints.maxLatencyMs && route.latencyMs <= constraints.maxLatencyMs * 0.5) {
338
- return 'latency_constraint';
339
- }
340
- // Check if cost was the primary factor
341
- if (constraints.maxCostMultiplier && route.costMultiplier <= 1.0) {
342
- return 'cost_constraint';
343
- }
344
- return 'lowest_carbon';
345
- }
346
- /**
347
- * Convert eligible route to alternative route format
348
- */
349
- toAlternativeRoute(route) {
350
- return {
351
- provider: route.provider,
352
- region: route.region,
353
- carbonIntensity: route.carbonIntensity,
354
- estimatedLatencyMs: route.latencyMs,
355
- costMultiplier: route.costMultiplier,
356
- };
357
- }
358
- /**
359
- * Create default provider availability map
360
- */
361
- createDefaultAvailability() {
362
- const map = new Map();
363
- for (const [region, providers] of Object.entries(DEFAULT_PROVIDER_AVAILABILITY)) {
364
- const availability = providers.map(provider => ({
365
- provider,
366
- region,
367
- available: true,
368
- latencyMs: DEFAULT_REGION_LATENCIES[region] ?? 100,
369
- costMultiplier: DEFAULT_COST_MULTIPLIERS[region] ?? 1.0,
370
- }));
371
- map.set(region, availability);
372
- }
373
- return map;
374
- }
375
- /**
376
- * Emit request routed event
377
- */
378
- emitRoutedEvent(request, decision) {
379
- const event = {
380
- type: 'carbon:request_routed',
381
- timestamp: new Date().toISOString(),
382
- requestId: request.requestId,
383
- selectedRegion: decision.region,
384
- selectedProvider: decision.provider,
385
- carbonIntensity: decision.carbonIntensity.intensity,
386
- estimatedCO2Grams: this.calculateCO2(decision.carbonIntensity.intensity, request.estimatedTokens ?? 1000),
387
- routingReason: decision.reason,
388
- latencyMs: decision.estimatedLatencyMs,
389
- };
390
- this.emit(event.type, event);
391
- this.emit('carbon:*', event);
392
- }
393
- }
394
- /**
395
- * Create a carbon-aware router
396
- */
397
- export function createCarbonRouter(config) {
398
- return new CarbonRouter(config);
399
- }
400
- //# sourceMappingURL=carbon-router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"carbon-router.js","sourceRoot":"","sources":["../../src/carbon-aware/carbon-router.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAyB,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAClG,OAAO,EAAiB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAczE,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;AAE5D;;GAEG;AACH,MAAM,mBAAmB,GAAuB;IAC9C,YAAY,EAAE,GAAG;IACjB,iBAAiB,EAAE,GAAG;IACtB,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,YAAY;IACpC,OAAO,CAAwB;IAC/B,QAAQ,CAAgB;IACxB,mBAAmB,CAAqB;IACxC,qBAAqB,CAA2C;IAChE,gBAAgB,CAA2B;IAC3C,gBAAgB,CAA2B;IAC3C,cAAc,CAAU;IAEhC,YAAY,SAA6B,EAAE;QACzC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY;YAChC,CAAC,CAAC,2BAA2B,CAAC,MAAM,CAAC,YAAY,CAAC;YAClD,CAAC,CAAC,2BAA2B,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,GAAG,mBAAmB,EAAE,CAAC;QACtC,IAAI,CAAC,mBAAmB,GAAG,EAAE,GAAG,mBAAmB,EAAE,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACpF,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC;QAEnD,oCAAoC;QACpC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACrG,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,cAAc,EAAE,gBAAgB,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAA4B,CAAC,CAAC;QAChJ,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,cAAc,EAAE,eAAe,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAA4B,CAAC,CAAC;QAE/I,mCAAmC;QACnC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAAuB;QACjC,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAE/E,mDAAmD;QACnD,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpD,CAAC;QAED,yCAAyC;QACzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAE3D,gDAAgD;QAChD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAExE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,0CAA0C,CAAC,CAAC;YAC1F,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAClD,CAAC;QAED,0CAA0C;QAC1C,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;QAErE,wBAAwB;QACxB,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAE,CAAC;QACrC,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QAErF,wBAAwB;QACxB,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7F,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;QACxG,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;QAC9F,MAAM,YAAY,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;QAE1D,MAAM,QAAQ,GAAoB;YAChC,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YACpE,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,eAAe,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAE;YACnD,kBAAkB,EAAE,SAAS,CAAC,SAAS;YACvC,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC;YACpD,YAAY;YACZ,wBAAwB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC;YACnD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,iBAAiB;QACjB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC7C,MAAM,CAAC,IAAI,CACT;YACE,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,SAAS;YACnD,YAAY,EAAE,QAAQ,CAAC,wBAAwB;YAC/C,aAAa;SACd,EACD,gBAAgB,CACjB,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CACxB,MAAmB,EACnB,kBAAiC;QAEjC,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,mDAAmD;QACnD,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;gBAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;gBAC5D,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,KAAK,CAAC,QAAQ,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,OAAO,SAAS,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,MAAmB,EAAE,YAAqB;QAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,YAAY,IAAI,GAAG,CAAC,CAAC,oCAAoC;QAC3E,OAAO,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,MAAmB,EAAE,QAAoB,EAAE,SAAkB;QACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAClE,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC;gBACpC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,+BAA+B,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,aAAqB,EAAE,MAAc;QAChD,4DAA4D;QAC5D,8CAA8C;QAC9C,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,0BAA0B,CAAC;QAC/D,OAAO,SAAS,GAAG,aAAa,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAC3B,OAAuB,EACvB,WAA+B;QAE/B,MAAM,MAAM,GAAG,WAAW,CAAC,cAAe,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAEzF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,QAAQ,GAAoB;YAChC,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YACpE,QAAQ;YACR,MAAM;YACN,eAAe,EAAE,SAAS;YAC1B,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG;YAC5D,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG;YACxD,MAAM,EAAE,iBAAiB;YACzB,YAAY,EAAE,EAAE;YAChB,wBAAwB,EAAE,CAAC;YAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CACzB,OAAuB,EACvB,WAA8C;QAE9C,iDAAiD;QACjD,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,KAAK,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,eAAe,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAErF,MAAM,QAAQ,GAAoB;oBAChC,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;oBACpE,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,MAAM;oBACN,eAAe,EAAE,SAAS;oBAC1B,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG;oBAC5D,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG;oBACxD,MAAM,EAAE,UAAU;oBAClB,YAAY,EAAE,EAAE;oBAChB,wBAAwB,EAAE,CAAC;oBAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC;gBAEF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oBACxC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;gBACzE,CAAC;gBAED,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,WAA8C,EAC9C,WAA+B;QAE/B,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAE3D,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACnD,oCAAoC;YACpC,IAAI,WAAW,CAAC,kBAAkB,IAAI,SAAS,CAAC,SAAS,GAAG,WAAW,CAAC,kBAAkB,EAAE,CAAC;gBAC3F,SAAS;YACX,CAAC;YAED,wCAAwC;YACxC,IAAI,WAAW,CAAC,sBAAsB,IAAI,SAAS,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;gBACtF,IAAI,SAAS,CAAC,mBAAmB,GAAG,WAAW,CAAC,sBAAsB,EAAE,CAAC;oBACvE,SAAS;gBACX,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;YACzD,IAAI,WAAW,CAAC,YAAY,IAAI,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC;gBACnE,SAAS;YACX,CAAC;YAED,wBAAwB;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;YACtD,IAAI,WAAW,CAAC,iBAAiB,IAAI,IAAI,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;gBAC1E,SAAS;YACX,CAAC;YAED,0BAA0B;YAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC,YAAY;gBAAE,SAAS;YAE5B,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACjE,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE9C,6CAA6C;YAC7C,IAAI,gBAAkD,CAAC;YACvD,IAAI,WAAW,CAAC,kBAAkB,IAAI,WAAW,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChF,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,kBAAkB,EAAE,CAAC;oBACvD,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;oBAC1E,IAAI,gBAAgB;wBAAE,MAAM;gBAC9B,CAAC;gBACD,yDAAyD;gBACzD,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,SAAS;gBACX,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,0DAA0D;gBAC1D,gBAAgB,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM;oBACN,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;oBACnC,eAAe,EAAE,SAAS,CAAC,SAAS;oBACpC,SAAS,EAAE,gBAAgB,CAAC,SAAS,IAAI,OAAO;oBAChD,cAAc,EAAE,gBAAgB,CAAC,cAAc,IAAI,IAAI;oBACvD,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;iBACnD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,KAAoB,EAAE,WAA+B;QAC3E,4CAA4C;QAC5C,IAAI,KAAK,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;YAChC,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,6CAA6C;QAC7C,IAAI,WAAW,CAAC,sBAAsB,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACpE,IAAI,KAAK,CAAC,mBAAmB,IAAI,WAAW,CAAC,sBAAsB,EAAE,CAAC;gBACpE,OAAO,sBAAsB,CAAC;YAChC,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,IAAI,WAAW,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,IAAI,WAAW,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC;YAClF,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QAED,uCAAuC;QACvC,IAAI,WAAW,CAAC,iBAAiB,IAAI,KAAK,CAAC,cAAc,IAAI,GAAG,EAAE,CAAC;YACjE,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,KAAoB;QAC7C,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,kBAAkB,EAAE,KAAK,CAAC,SAAS;YACnC,cAAc,EAAE,KAAK,CAAC,cAAc;SACrC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,yBAAyB;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAuC,CAAC;QAE3D,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAkC,EAAE,CAAC;YACjH,MAAM,YAAY,GAA2B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtE,QAAQ;gBACR,MAAM;gBACN,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,wBAAwB,CAAC,MAAM,CAAC,IAAI,GAAG;gBAClD,cAAc,EAAE,wBAAwB,CAAC,MAAM,CAAC,IAAI,GAAG;aACxD,CAAC,CAAC,CAAC;YACJ,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAuB,EAAE,QAAyB;QACxE,MAAM,KAAK,GAAuB;YAChC,IAAI,EAAE,uBAAuB;YAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,cAAc,EAAE,QAAQ,CAAC,MAAM;YAC/B,gBAAgB,EAAE,QAAQ,CAAC,QAAQ;YACnC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,SAAS;YACnD,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;YACzG,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,SAAS,EAAE,QAAQ,CAAC,kBAAkB;SACvC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF;AAcD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}